mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
In generate_ast.cpp, an `CarbonExternalASTSource` is installed that has a `Check::Context` pointer. During lowering, this `ExternalASTSource` is still installed, and using it can cause a crash if the now-invalid pointer is dereferenced. Fix by adding a new `ReadOnlyASTSource` in sem_ir, and using that during lowering. `CarbonExternalASTSource` now inherits from `ReadOnlyASTSource` to avoid some code duplication. In generate_ast.cpp, we now always install a multiplex source, even if there's only one child source. Clang internally keeps pointers to the top-level `ExternalASTSource` installed via `setExternalSource`, and those pointers aren't updated if `setExternalSource` is called again. By using `MultiplexExternalSemaSource`, we can keep the top-level `ExternalASTSource` pointer the same, and only update its children. Using `MultiplexExternalSemaSource` this way requires a new constructor and a method to modify its child sources; added a new LLVM patch adding those. Originally landed in #7335, reverted in #7353 due to ASAN errors. Changes since original: * Use LLVM RTTI to make `Lower::Context::Finalize` less brittle. Add LLVM RTTI to `ReadOnlyASTSource` (and `CarbonExternalASTSource`). Change Finalize so that instead of just deleting the last multiplex child source, it erases any multiplex child sources that match `ReadOnlyASTSource`; this includes `CarbonExternalASTSource` since it's a subclass. * Fix ASAN error by updating the `MultiplexExternalSemaSource` earlier in lowering. It is sometimes accessed during PrepareToLower, so update it in `Context::GetFileContext` rather than `Context::Finalize`. Fixes https://github.com/carbon-language/carbon-lang/issues/7142
395 lines
9.4 KiB
Python
395 lines
9.4 KiB
Python
# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
# Exceptions. See /LICENSE for license information.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
load("//bazel/cc_rules:defs.bzl", "cc_library", "cc_test")
|
|
|
|
package(default_visibility = ["//visibility:public"])
|
|
|
|
cc_library(
|
|
name = "typed_insts",
|
|
srcs = [
|
|
"ids.cpp",
|
|
"inst_kind.cpp",
|
|
],
|
|
hdrs = [
|
|
"id_kind.h",
|
|
"ids.h",
|
|
"inst_categories.h",
|
|
"inst_kind.h",
|
|
"singleton_insts.h",
|
|
"specific_interface.h",
|
|
"specific_named_constraint.h",
|
|
"typed_insts.h",
|
|
],
|
|
textual_hdrs = ["inst_kind.def"],
|
|
deps = [
|
|
"//common:check",
|
|
"//common:enum_base",
|
|
"//common:ostream",
|
|
"//common:template_string",
|
|
"//common:type_enum",
|
|
"//toolchain/base:canonical_value_store",
|
|
"//toolchain/base:index_base",
|
|
"//toolchain/base:int",
|
|
"//toolchain/base:value_ids",
|
|
"//toolchain/diagnostics:emitter",
|
|
"//toolchain/parse:node_kind",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "ids_test",
|
|
srcs = ["ids_test.cpp"],
|
|
deps = [
|
|
":typed_insts",
|
|
"//testing/base:gtest_main",
|
|
"@googletest//:gtest",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "clang_decl",
|
|
srcs = ["clang_decl.cpp"],
|
|
hdrs = ["clang_decl.h"],
|
|
deps = [
|
|
":typed_insts",
|
|
"//common:hashtable_key_context",
|
|
"//common:ostream",
|
|
"//common:raw_string_ostream",
|
|
"//toolchain/base:canonical_value_store",
|
|
"//toolchain/base:value_store",
|
|
"@llvm-project//clang:ast",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "cpp_file",
|
|
hdrs = ["cpp_file.h"],
|
|
deps = [
|
|
"//common:check",
|
|
"@llvm-project//clang:ast",
|
|
"@llvm-project//clang:basic",
|
|
"@llvm-project//clang:codegen",
|
|
"@llvm-project//clang:frontend",
|
|
"@llvm-project//clang:lex",
|
|
"@llvm-project//clang:sema",
|
|
"@llvm-project//llvm:Core",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "file",
|
|
srcs = [
|
|
"associated_constant.cpp",
|
|
"builtin_function_kind.cpp",
|
|
"bundle.cpp",
|
|
"class.cpp",
|
|
"constant.cpp",
|
|
"core_interface.cpp",
|
|
"cpp_file.cpp",
|
|
"cpp_initializer_list.cpp",
|
|
"cpp_overload_set.cpp",
|
|
"facet_type_info.cpp",
|
|
"field.cpp",
|
|
"file.cpp",
|
|
"function.cpp",
|
|
"generic.cpp",
|
|
"impl.cpp",
|
|
"import_ir.cpp",
|
|
"inst.cpp",
|
|
"interface.cpp",
|
|
"name.cpp",
|
|
"name_scope.cpp",
|
|
"named_constraint.cpp",
|
|
"pattern.cpp",
|
|
"require_impls.cpp",
|
|
"specific_interface.cpp",
|
|
"struct_type_field.cpp",
|
|
"type.cpp",
|
|
"type_info.cpp",
|
|
"type_iterator.cpp",
|
|
"vtable.cpp",
|
|
],
|
|
hdrs = [
|
|
"associated_constant.h",
|
|
"builtin_function_kind.h",
|
|
"bundle.h",
|
|
"class.h",
|
|
"constant.h",
|
|
"copy_on_write_block.h",
|
|
"core_interface.h",
|
|
"cpp_initializer_list.h",
|
|
"cpp_overload_set.h",
|
|
"entity_name.h",
|
|
"entity_with_params_base.h",
|
|
"facet_type_info.h",
|
|
"field.h",
|
|
"file.h",
|
|
"function.h",
|
|
"generic.h",
|
|
"impl.h",
|
|
"import_cpp.h",
|
|
"import_ir.h",
|
|
"inst.h",
|
|
"interface.h",
|
|
"name.h",
|
|
"name_scope.h",
|
|
"named_constraint.h",
|
|
"pattern.h",
|
|
"require_impls.h",
|
|
"struct_type_field.h",
|
|
"thunk.h",
|
|
"type.h",
|
|
"type_info.h",
|
|
"type_iterator.h",
|
|
"vtable.h",
|
|
],
|
|
textual_hdrs = [
|
|
"builtin_function_kind.def",
|
|
"core_interface_kind.def",
|
|
],
|
|
deps = [
|
|
":clang_decl",
|
|
":cpp_file",
|
|
":typed_insts",
|
|
"//common:check",
|
|
"//common:enum_base",
|
|
"//common:enum_mask_base",
|
|
"//common:error",
|
|
"//common:hashing",
|
|
"//common:map",
|
|
"//common:ostream",
|
|
"//common:raw_string_ostream",
|
|
"//common:set",
|
|
"//common:struct_reflection",
|
|
"//toolchain/base:block_value_store",
|
|
"//toolchain/base:canonical_value_store",
|
|
"//toolchain/base:id_tag",
|
|
"//toolchain/base:index_base",
|
|
"//toolchain/base:int",
|
|
"//toolchain/base:kind_switch",
|
|
"//toolchain/base:relational_value_store",
|
|
"//toolchain/base:shared_value_stores",
|
|
"//toolchain/base:value_ids",
|
|
"//toolchain/base:value_store",
|
|
"//toolchain/base:yaml",
|
|
"//toolchain/lex:token_kind",
|
|
"//toolchain/parse:node_kind",
|
|
"//toolchain/parse:tree",
|
|
"@llvm-project//clang:ast",
|
|
"@llvm-project//clang:basic",
|
|
"@llvm-project//clang:frontend",
|
|
"@llvm-project//clang:sema",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "stringify",
|
|
srcs = ["stringify.cpp"],
|
|
hdrs = ["stringify.h"],
|
|
deps = [
|
|
":file",
|
|
":typed_insts",
|
|
"//common:check",
|
|
"//common:concepts",
|
|
"//common:raw_string_ostream",
|
|
"//toolchain/base:kind_switch",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "inst_namer",
|
|
srcs = [
|
|
"inst_fingerprinter.cpp",
|
|
"inst_namer.cpp",
|
|
],
|
|
hdrs = [
|
|
"inst_fingerprinter.h",
|
|
"inst_namer.h",
|
|
],
|
|
deps = [
|
|
":file",
|
|
":typed_insts",
|
|
"//common:concepts",
|
|
"//common:ostream",
|
|
"//common:raw_string_ostream",
|
|
"//common:type_enum",
|
|
"//toolchain/base:fixed_size_value_store",
|
|
"//toolchain/base:kind_switch",
|
|
"//toolchain/base:shared_value_stores",
|
|
"//toolchain/base:value_ids",
|
|
"//toolchain/lex:tokenized_buffer",
|
|
"//toolchain/parse:tree",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "formatter_chunks",
|
|
srcs = ["formatter_chunks.cpp"],
|
|
hdrs = ["formatter_chunks.h"],
|
|
deps = [
|
|
"//common:check",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "formatter",
|
|
srcs = ["formatter.cpp"],
|
|
hdrs = ["formatter.h"],
|
|
deps = [
|
|
":expr_info",
|
|
":file",
|
|
":formatter_chunks",
|
|
":inst_namer",
|
|
":typed_insts",
|
|
"//common:concepts",
|
|
"//common:ostream",
|
|
"//toolchain/base:fixed_size_value_store",
|
|
"//toolchain/base:kind_switch",
|
|
"//toolchain/base:shared_value_stores",
|
|
"//toolchain/lex:tokenized_buffer",
|
|
"//toolchain/parse:tree",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "entry_point",
|
|
srcs = ["entry_point.cpp"],
|
|
hdrs = ["entry_point.h"],
|
|
deps = [
|
|
":file",
|
|
":typed_insts",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "absolute_node_ref",
|
|
srcs = ["absolute_node_ref.cpp"],
|
|
hdrs = ["absolute_node_ref.h"],
|
|
deps = [
|
|
":file",
|
|
":typed_insts",
|
|
"//toolchain/parse:tree",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "expr_info",
|
|
srcs = ["expr_info.cpp"],
|
|
hdrs = ["expr_info.h"],
|
|
deps = [
|
|
":file",
|
|
":typed_insts",
|
|
"//common:check",
|
|
"//toolchain/base:kind_switch",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "diagnostic_loc_converter",
|
|
srcs = ["diagnostic_loc_converter.cpp"],
|
|
hdrs = ["diagnostic_loc_converter.h"],
|
|
deps = [
|
|
":absolute_node_ref",
|
|
":file",
|
|
":typed_insts",
|
|
"//toolchain/diagnostics:emitter",
|
|
"//toolchain/parse:tree",
|
|
"@llvm-project//clang:basic",
|
|
"@llvm-project//clang:frontend",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "dump",
|
|
srcs = ["dump.cpp"],
|
|
hdrs = ["dump.h"],
|
|
deps = [
|
|
":file",
|
|
":stringify",
|
|
":typed_insts",
|
|
"//common:ostream",
|
|
"//common:raw_string_ostream",
|
|
],
|
|
# Always link dump methods so they are callable from a debugger
|
|
# even though they are never called.
|
|
alwayslink = 1,
|
|
)
|
|
|
|
cc_test(
|
|
name = "name_scope_test",
|
|
size = "small",
|
|
srcs = ["name_scope_test.cpp"],
|
|
deps = [
|
|
":file",
|
|
"//testing/base:gtest_main",
|
|
"@googletest//:gtest",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "typed_insts_test",
|
|
size = "small",
|
|
srcs = ["typed_insts_test.cpp"],
|
|
deps = [
|
|
":file",
|
|
":typed_insts",
|
|
"//testing/base:gtest_main",
|
|
"@googletest//:gtest",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "yaml_test",
|
|
size = "small",
|
|
srcs = ["yaml_test.cpp"],
|
|
deps = [
|
|
"//common:all_llvm_targets",
|
|
"//common:ostream",
|
|
"//common:raw_string_ostream",
|
|
"//testing/base:global_exe_path",
|
|
"//testing/base:gtest_main",
|
|
"//toolchain/driver",
|
|
"//toolchain/testing:yaml_test_helpers",
|
|
"@googletest//:gtest",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "mangler",
|
|
srcs = ["mangler.cpp"],
|
|
hdrs = ["mangler.h"],
|
|
deps = [
|
|
":entry_point",
|
|
":file",
|
|
":inst_namer",
|
|
":typed_insts",
|
|
"//common:raw_string_ostream",
|
|
"//toolchain/base:kind_switch",
|
|
"@llvm-project//clang:ast",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "read_only_ast_source",
|
|
srcs = ["read_only_ast_source.cpp"],
|
|
hdrs = ["read_only_ast_source.h"],
|
|
deps = [
|
|
"//toolchain/sem_ir:file",
|
|
"@llvm-project//clang:sema",
|
|
],
|
|
)
|