mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Switch cross references to a ValueStore. (#3414)
As I get ready to add imports, I need an API to add values and this offers a consistent way of doing so.
This commit is contained in:
@@ -658,9 +658,9 @@ class TypeCompleter {
|
||||
auto BuildCrossReferenceValueRepresentation(SemIR::TypeId type_id,
|
||||
SemIR::CrossReference xref) const
|
||||
-> SemIR::ValueRepresentation {
|
||||
auto xref_inst = context_.sem_ir()
|
||||
.GetCrossReferenceIR(xref.ir_id)
|
||||
.insts()
|
||||
auto xref_inst = context_.cross_reference_irs()
|
||||
.Get(xref.ir_id)
|
||||
->insts()
|
||||
.Get(xref.inst_id);
|
||||
|
||||
// The canonical description of a type should only have cross-references
|
||||
|
||||
@@ -300,6 +300,10 @@ class Context {
|
||||
auto classes() -> ValueStore<SemIR::ClassId, SemIR::Class>& {
|
||||
return sem_ir().classes();
|
||||
}
|
||||
auto cross_reference_irs()
|
||||
-> ValueStore<SemIR::CrossReferenceIRId, const SemIR::File*>& {
|
||||
return sem_ir().cross_reference_irs();
|
||||
}
|
||||
auto names() -> SemIR::NameStoreWrapper { return sem_ir().names(); }
|
||||
auto name_scopes() -> SemIR::NameScopeStore& {
|
||||
return sem_ir().name_scopes();
|
||||
|
||||
@@ -44,10 +44,12 @@ auto TypeInfo::Print(llvm::raw_ostream& out) const -> void {
|
||||
File::File(SharedValueStores& value_stores)
|
||||
: value_stores_(&value_stores),
|
||||
filename_("<builtins>"),
|
||||
// Builtins are always the first IR, even when self-referential.
|
||||
cross_reference_irs_({this}),
|
||||
type_blocks_(allocator_),
|
||||
inst_blocks_(allocator_) {
|
||||
auto builtins_id = cross_reference_irs_.Add(this);
|
||||
CARBON_CHECK(builtins_id == CrossReferenceIRId::Builtins)
|
||||
<< "Builtins must be the first IR, even if self-referential";
|
||||
|
||||
// Default entry for InstBlockId::Empty.
|
||||
inst_blocks_.AddDefaultValue();
|
||||
|
||||
@@ -72,13 +74,12 @@ File::File(SharedValueStores& value_stores, std::string filename,
|
||||
const File* builtins)
|
||||
: value_stores_(&value_stores),
|
||||
filename_(std::move(filename)),
|
||||
// Builtins are always the first IR.
|
||||
cross_reference_irs_({builtins}),
|
||||
type_blocks_(allocator_),
|
||||
inst_blocks_(allocator_) {
|
||||
CARBON_CHECK(builtins != nullptr);
|
||||
CARBON_CHECK(builtins->cross_reference_irs_[0] == builtins)
|
||||
<< "Not called with builtins!";
|
||||
auto builtins_id = cross_reference_irs_.Add(builtins);
|
||||
CARBON_CHECK(builtins_id == CrossReferenceIRId::Builtins)
|
||||
<< "Builtins must be the first IR";
|
||||
|
||||
// Default entry for InstBlockId::Empty.
|
||||
inst_blocks_.AddDefaultValue();
|
||||
@@ -482,7 +483,7 @@ auto GetExprCategory(const File& file, InstId inst_id) -> ExprCategory {
|
||||
|
||||
case CrossReference::Kind: {
|
||||
auto xref = inst.As<CrossReference>();
|
||||
ir = &ir->GetCrossReferenceIR(xref.ir_id);
|
||||
ir = ir->cross_reference_irs().Get(xref.ir_id);
|
||||
inst_id = xref.inst_id;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -204,11 +204,6 @@ class File : public Printable<File> {
|
||||
.getZExtValue();
|
||||
}
|
||||
|
||||
// Returns the requested IR.
|
||||
auto GetCrossReferenceIR(CrossReferenceIRId xref_id) const -> const File& {
|
||||
return *cross_reference_irs_[xref_id.index];
|
||||
}
|
||||
|
||||
// Marks a type as complete, and sets its value representation.
|
||||
auto CompleteType(TypeId object_type_id,
|
||||
ValueRepresentation value_representation) -> void {
|
||||
@@ -300,6 +295,13 @@ class File : public Printable<File> {
|
||||
}
|
||||
auto classes() -> ValueStore<ClassId, Class>& { return classes_; }
|
||||
auto classes() const -> const ValueStore<ClassId, Class>& { return classes_; }
|
||||
auto cross_reference_irs() -> ValueStore<CrossReferenceIRId, const File*>& {
|
||||
return cross_reference_irs_;
|
||||
}
|
||||
auto cross_reference_irs() const
|
||||
-> const ValueStore<CrossReferenceIRId, const File*>& {
|
||||
return cross_reference_irs_;
|
||||
}
|
||||
auto names() const -> NameStoreWrapper {
|
||||
return NameStoreWrapper(&identifiers());
|
||||
}
|
||||
@@ -360,7 +362,7 @@ class File : public Printable<File> {
|
||||
// Related IRs. There will always be at least 2 entries, the builtin IR (used
|
||||
// for references of builtins) followed by the current IR (used for references
|
||||
// crossing instruction blocks).
|
||||
llvm::SmallVector<const File*> cross_reference_irs_;
|
||||
ValueStore<CrossReferenceIRId, const File*> cross_reference_irs_;
|
||||
|
||||
// Storage for name scopes.
|
||||
NameScopeStore name_scopes_;
|
||||
|
||||
@@ -83,6 +83,7 @@ constexpr ClassId ClassId::Invalid = ClassId(ClassId::InvalidIndex);
|
||||
// The ID of a cross-referenced IR.
|
||||
struct CrossReferenceIRId : public IndexBase,
|
||||
public Printable<CrossReferenceIRId> {
|
||||
static const CrossReferenceIRId Builtins;
|
||||
using IndexBase::IndexBase;
|
||||
auto Print(llvm::raw_ostream& out) const -> void {
|
||||
out << "ir";
|
||||
@@ -90,6 +91,9 @@ struct CrossReferenceIRId : public IndexBase,
|
||||
}
|
||||
};
|
||||
|
||||
constexpr CrossReferenceIRId CrossReferenceIRId::Builtins =
|
||||
CrossReferenceIRId(0);
|
||||
|
||||
// A boolean value.
|
||||
struct BoolValue : public IndexBase, public Printable<BoolValue> {
|
||||
static const BoolValue False;
|
||||
|
||||
Reference in New Issue
Block a user