================
@@ -99,6 +104,77 @@ struct LoweringPreparePass
cir::GlobalLinkageKind linkage = cir::GlobalLinkageKind::ExternalLinkage,
cir::VisibilityKind visibility = cir::VisibilityKind::Default);
+ /// Handle static local variable initialization with guard variables.
+ void handleStaticLocal(cir::GlobalOp globalOp, cir::GetGlobalOp getGlobalOp);
+
+ /// Get or create __cxa_guard_acquire function.
+ cir::FuncOp getGuardAcquireFn(cir::PointerType guardPtrTy);
+
+ /// Get or create __cxa_guard_release function.
+ cir::FuncOp getGuardReleaseFn(cir::PointerType guardPtrTy);
+
+ /// Create a guard global variable for a static local.
+ cir::GlobalOp createGuardGlobalOp(CIRBaseBuilderTy &builder,
+ mlir::Location loc, llvm::StringRef name,
+ cir::IntType guardTy,
+ cir::GlobalLinkageKind linkage);
+
+ /// Get the guard variable for a static local declaration.
+ cir::GlobalOp
+ getStaticLocalDeclGuardAddress(cir::ASTVarDeclInterface varDecl) {
+ auto it = staticLocalDeclGuardMap.find(varDecl.getVarDecl());
+ if (it != staticLocalDeclGuardMap.end())
+ return it->second;
+ return nullptr;
+ }
+
+ /// Set the guard variable for a static local declaration.
+ void setStaticLocalDeclGuardAddress(cir::ASTVarDeclInterface varDecl,
+ cir::GlobalOp guard) {
+ staticLocalDeclGuardMap[varDecl.getVarDecl()] = guard;
+ }
+
+ /// Get or create the guard variable for a static local declaration.
+ cir::GlobalOp getOrCreateStaticLocalDeclGuardAddress(
+ CIRBaseBuilderTy &builder, cir::GlobalOp globalOp,
+ cir::ASTVarDeclInterface varDecl, cir::IntType guardTy,
+ clang::CharUnits guardAlignment) {
+ cir::GlobalOp guard = getStaticLocalDeclGuardAddress(varDecl);
+ if (!guard) {
+ // Mangle the name for the guard.
+ llvm::SmallString<256> guardName;
+ {
+ llvm::raw_svector_ostream out(guardName);
+ varDecl.mangleStaticGuardVariable(out);
----------------
erichkeane wrote:
I would presume this is a mangling we need basically all of the time, right? I
guess the only exception would be on platforms where we don't actually need the
guard variable, but any time we emit the function we'd need to do this.
https://github.com/llvm/llvm-project/pull/179828
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits