mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 21:30:12 +01:00
The IdTag knows the type of the Id its tagging and the type of the Id being used as the tag. This prevents mixing up tagged and untagged ids, and avoids having to work with untyped integers. Adds an Untagged marker struct that's used as the tag type in IdTag when no tag is desired. The complexity of ConstantIds and TypeIds became a bit visible: TypeIds are concrete ConstantIds. And ConstantIds have two different tagging schemes, one for concrete and one for symbolic ids. And ConstantIds are actually re-cast InstIds with the same index. The LoweredTypeStore needs to work with tagged TypeIds, but the tags actually come from an InstId store in ConstantValueStore. Now this is expressed in the type system by getting the tags for TypeIds from the ConstantValueStore. ValueStores without an TagId type parameter are now visibly untagged. IdTag is now only default constructible when it does not have a tag, which means ValueStore is only default constructible when the TagId is untagged. This forces tagged value stores to be constructed correctly with a tag at compile time, and untagged ones to be constructed without. FixedSizeValueStore has overloads for dealing with tagged and untagged Ids, since it can't default-construct ValueStore for tagged ids, and no longer requires passing in default-constructed tags when there is no tag in the ids.
58 lines
2.0 KiB
C++
58 lines
2.0 KiB
C++
// 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
|
|
|
|
#ifndef CARBON_TOOLCHAIN_SEM_IR_CPP_GLOBAL_VAR_H_
|
|
#define CARBON_TOOLCHAIN_SEM_IR_CPP_GLOBAL_VAR_H_
|
|
|
|
#include "common/hashing.h"
|
|
#include "common/ostream.h"
|
|
#include "toolchain/sem_ir/clang_decl.h"
|
|
#include "toolchain/sem_ir/ids.h"
|
|
|
|
namespace Carbon::SemIR {
|
|
|
|
// A key describing a C++ global variable imported into Carbon, identified by
|
|
// its entity name.
|
|
struct CppGlobalVarKey : public Printable<CppGlobalVarKey> {
|
|
auto Print(llvm::raw_ostream& out) const -> void {
|
|
out << "{entity_name_id: " << entity_name_id << "}";
|
|
}
|
|
|
|
// TODO: Use default when `Printable` supports it.
|
|
friend auto operator==(const CppGlobalVarKey& lhs, const CppGlobalVarKey& rhs)
|
|
-> bool {
|
|
return lhs.entity_name_id == rhs.entity_name_id;
|
|
}
|
|
|
|
// The name of the variable.
|
|
EntityNameId entity_name_id;
|
|
};
|
|
|
|
// A C++ global variable imported into Carbon. This is used to map the entity
|
|
// name to the Clang declaration so we can use Clang mangling.
|
|
struct CppGlobalVar : public Printable<CppGlobalVar> {
|
|
auto Print(llvm::raw_ostream& out) const -> void {
|
|
out << "{key: " << key << ", clang_decl_id: " << clang_decl_id << "}";
|
|
}
|
|
|
|
// The key by which this variable can be looked up.
|
|
CppGlobalVarKey key;
|
|
|
|
// The Clang declaration for this variable, if any.
|
|
// This is ignored for equality and hashing, since it's always unique for a
|
|
// given key, in order to store it in `CanonicalValueStore` and allow lookup
|
|
// by `CppGlobalVarKey`.
|
|
ClangDeclId clang_decl_id;
|
|
|
|
auto GetAsKey() const -> CppGlobalVarKey { return key; }
|
|
};
|
|
|
|
// Use the name of a C++ global variable when doing `Lookup` to find an ID.
|
|
using CppGlobalVarStore = CanonicalValueStore<CppGlobalVarId, CppGlobalVarKey,
|
|
Tag<CheckIRId>, CppGlobalVar>;
|
|
|
|
} // namespace Carbon::SemIR
|
|
|
|
#endif // CARBON_TOOLCHAIN_SEM_IR_CPP_GLOBAL_VAR_H_
|