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:
Jon Ross-Perkins
2023-11-22 21:43:17 +00:00
committed by GitHub
parent 9154c6410e
commit 5522e4f613
5 changed files with 27 additions and 16 deletions
+3 -3
View File
@@ -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
+4
View File
@@ -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();
+8 -7
View File
@@ -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;
}
+8 -6
View File
@@ -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_;
+4
View File
@@ -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;