mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-11-15 06:28:31 +00:00
Handle references to global lets and enclosing locals. (#8061)
When building an expression referencing the result of name lookup, if the lookup result is non-constant then check we can access it from the current scope. * If it is a global, then use a new `GlobalRef` instruction to get the value of that global. In lowering, create global variables to hold the values of global `let` bindings so that `GlobalRef` can access those values. * If it is a local, walk the lexical scopes between it and the point of use and ensure it is usable through from all of them. Error if there's an intervening declarative scope such as a class, add a TODO to handle captures for intervening functions, and allow `typeof(...)` to name things it can't read the value of since it's unevaluated. Global `let`s (which includes `let`s at class scope) now also have their initializers collected into the global inits block. If the initializer is non-constant, the wrapper binding also lives in the global inits block; otherwise it continues to live in the file block and the variable emitted for it is a global constant. Assisted-by: Gemini and Claude via Antigravity
This commit is contained in:
1 parent
bb6486b553
commit
d50576ca16
94 files changed
+3394
-1293
No files matched your search
@@ -410,18 +410,23 @@ auto FunctionContext::CopyValue(TypeInFile type, SemIR::InstId source_id,
|
||||
}
|
||||
}
|
||||
|
||||
auto FunctionContext::CopyObject(TypeInFile type, SemIR::InstId source_id,
|
||||
SemIR::InstId dest_id) -> void {
|
||||
auto FunctionContext::CopyObject(TypeInFile type, llvm::Value* source,
|
||||
llvm::Value* dest) -> void {
|
||||
const auto& layout = llvm_module().getDataLayout();
|
||||
auto* llvm_type = GetType(type);
|
||||
auto align = GetAlignment(type);
|
||||
|
||||
// TODO: Attach !tbaa.struct metadata indicating which portions of the
|
||||
// type we actually need to copy and which are padding.
|
||||
builder().CreateMemCpy(GetValue(dest_id), align, GetValue(source_id), align,
|
||||
builder().CreateMemCpy(dest, align, source, align,
|
||||
layout.getTypeAllocSize(llvm_type));
|
||||
}
|
||||
|
||||
auto FunctionContext::CopyObject(TypeInFile type, SemIR::InstId source_id,
|
||||
SemIR::InstId dest_id) -> void {
|
||||
CopyObject(type, GetValue(source_id), GetValue(dest_id));
|
||||
}
|
||||
|
||||
auto FunctionContext::Inserter::InsertHelper(
|
||||
llvm::Instruction* inst, const llvm::Twine& name,
|
||||
llvm::BasicBlock::iterator insert_pt) const -> void {
|
||||
|
||||
Reference in new issue
Block a user