Author: Morris Hafner Date: 2025-08-14T22:53:09+02:00 New Revision: e56ae9651b2e51cbf18e33627165c76b31ccc86b
URL: https://github.com/llvm/llvm-project/commit/e56ae9651b2e51cbf18e33627165c76b31ccc86b DIFF: https://github.com/llvm/llvm-project/commit/e56ae9651b2e51cbf18e33627165c76b31ccc86b.diff LOG: [CIR][NFC] Add Symbol Table to CIRGenFunction (#153625) This patchs adds a symbol table to CIRGenFunction plus scopes and insertions to the table where we were missing them previously. Added: Modified: clang/include/clang/CIR/MissingFeatures.h clang/lib/CIR/CodeGen/CIRGenExpr.cpp clang/lib/CIR/CodeGen/CIRGenFunction.cpp clang/lib/CIR/CodeGen/CIRGenFunction.h clang/lib/CIR/CodeGen/CIRGenStmt.cpp Removed: ################################################################################ diff --git a/clang/include/clang/CIR/MissingFeatures.h b/clang/include/clang/CIR/MissingFeatures.h index 805c43e6d5054..baab62f572b98 100644 --- a/clang/include/clang/CIR/MissingFeatures.h +++ b/clang/include/clang/CIR/MissingFeatures.h @@ -27,9 +27,6 @@ struct MissingFeatures { // Address space related static bool addressSpace() { return false; } - // CIRGenFunction implementation details - static bool cgfSymbolTable() { return false; } - // Unhandled global/linkage information. static bool opGlobalThreadLocal() { return false; } static bool opGlobalConstant() { return false; } diff --git a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp index cc1fd81433b53..8bcca6f5d1803 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp @@ -591,6 +591,12 @@ LValue CIRGenFunction::emitDeclRefLValue(const DeclRefExpr *e) { ? emitLoadOfReferenceLValue(addr, getLoc(e->getSourceRange()), vd->getType(), AlignmentSource::Decl) : makeAddrLValue(addr, ty, AlignmentSource::Decl); + + // Statics are defined as globals, so they are not include in the function's + // symbol table. + assert((vd->isStaticLocal() || symbolTable.count(vd)) && + "non-static locals should be already mapped"); + return lv; } diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp index 8a3f5ab78ab59..d6a0792292604 100644 --- a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp @@ -215,7 +215,7 @@ void CIRGenFunction::declare(mlir::Value addrVal, const Decl *var, QualType ty, mlir::Location loc, CharUnits alignment, bool isParam) { assert(isa<NamedDecl>(var) && "Needs a named decl"); - assert(!cir::MissingFeatures::cgfSymbolTable()); + assert(!symbolTable.count(var) && "not supposed to be available just yet"); auto allocaOp = addrVal.getDefiningOp<cir::AllocaOp>(); assert(allocaOp && "expected cir::AllocaOp"); @@ -224,6 +224,8 @@ void CIRGenFunction::declare(mlir::Value addrVal, const Decl *var, QualType ty, allocaOp.setInitAttr(mlir::UnitAttr::get(&getMLIRContext())); if (ty->isReferenceType() || ty.isConstQualified()) allocaOp.setConstantAttr(mlir::UnitAttr::get(&getMLIRContext())); + + symbolTable.insert(var, allocaOp); } void CIRGenFunction::LexicalScope::cleanup() { @@ -485,6 +487,9 @@ void CIRGenFunction::finishFunction(SourceLocation endLoc) { } mlir::LogicalResult CIRGenFunction::emitFunctionBody(const clang::Stmt *body) { + // We start with function level scope for variables. + SymTableScopeTy varScope(symbolTable); + auto result = mlir::LogicalResult::success(); if (const CompoundStmt *block = dyn_cast<CompoundStmt>(body)) emitCompoundStmtWithoutScope(*block); @@ -531,6 +536,8 @@ cir::FuncOp CIRGenFunction::generateCode(clang::GlobalDecl gd, cir::FuncOp fn, FunctionArgList args; QualType retTy = buildFunctionArgList(gd, args); + // Create a scope in the symbol table to hold variable declarations. + SymTableScopeTy varScope(symbolTable); { LexicalScope lexScope(*this, fusedLoc, entryBB); diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.h b/clang/lib/CIR/CodeGen/CIRGenFunction.h index ddc1edd77010c..c3e77c99cca35 100644 --- a/clang/lib/CIR/CodeGen/CIRGenFunction.h +++ b/clang/lib/CIR/CodeGen/CIRGenFunction.h @@ -31,6 +31,7 @@ #include "clang/CIR/Dialect/IR/CIRDialect.h" #include "clang/CIR/MissingFeatures.h" #include "clang/CIR/TypeEvaluationKind.h" +#include "llvm/ADT/ScopedHashTable.h" namespace { class ScalarExprEmitter; @@ -103,6 +104,14 @@ class CIRGenFunction : public CIRGenTypeCache { /// Sanitizers enabled for this function. clang::SanitizerSet sanOpts; + /// The symbol table maps a variable name to a value in the current scope. + /// Entering a function creates a new scope, and the function arguments are + /// added to the mapping. When the processing of a function is terminated, + /// the scope is destroyed and the mappings created in this scope are + /// dropped. + using SymTableTy = llvm::ScopedHashTable<const clang::Decl *, mlir::Value>; + SymTableTy symbolTable; + /// Whether or not a Microsoft-style asm block has been processed within /// this fuction. These can potentially set the return value. bool sawAsmBlock = false; @@ -325,6 +334,9 @@ class CIRGenFunction : public CIRGenTypeCache { ~SourceLocRAIIObject() { restore(); } }; + using SymTableScopeTy = + llvm::ScopedHashTableScope<const clang::Decl *, mlir::Value>; + /// Hold counters for incrementally naming temporaries unsigned counterRefTmp = 0; unsigned counterAggTmp = 0; @@ -499,7 +511,11 @@ class CIRGenFunction : public CIRGenTypeCache { void setAddrOfLocalVar(const clang::VarDecl *vd, Address addr) { assert(!localDeclMap.count(vd) && "Decl already exists in LocalDeclMap!"); localDeclMap.insert({vd, addr}); - // TODO: Add symbol table support + + // Add to the symbol table if not there already. + if (symbolTable.count(vd)) + return; + symbolTable.insert(vd, addr.getPointer()); } bool shouldNullCheckClassCastValue(const CastExpr *ce); diff --git a/clang/lib/CIR/CodeGen/CIRGenStmt.cpp b/clang/lib/CIR/CodeGen/CIRGenStmt.cpp index dffe8b408b6da..d1e4a14824011 100644 --- a/clang/lib/CIR/CodeGen/CIRGenStmt.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenStmt.cpp @@ -33,6 +33,8 @@ void CIRGenFunction::emitCompoundStmtWithoutScope(const CompoundStmt &s) { } void CIRGenFunction::emitCompoundStmt(const CompoundStmt &s) { + // Add local scope to track new declared variables. + SymTableScopeTy varScope(symbolTable); mlir::Location scopeLoc = getLoc(s.getSourceRange()); mlir::OpBuilder::InsertPoint scopeInsPt; builder.create<cir::ScopeOp>( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits