25 cir::GlobalOp globalOp,
30 if (
cgm.getCodeGenOpts().ForbidGuardVariables)
31 cgm.error(
varDecl.getLocation(),
"guard variables are forbidden");
39 llvm::raw_svector_ostream
out(guardName);
40 cgm.getCXXABI().getMangleContext().mangleStaticGuardVariable(&
varDecl,
out);
45 auto guardAttr = mlir::StringAttr::get(&
cgm.getMLIRContext(), guardName);
49 "Static local guard attr only valid on static local variables");
50 globalOp.setStaticLocalGuardAttr(
51 cir::StaticLocalGuardAttr::get(&
cgm.getMLIRContext(), guardAttr));
59 cgm.emitCXXStaticLocalVarDeclInit(&
varDecl, globalOp, performInit);
63 cir::GlobalOp globalOp) {
80 llvm::raw_svector_ostream wrapperOut(wrapperFuncName);
81 llvm::raw_svector_ostream initOut(initFuncName);
82 llvm::raw_svector_ostream guardStream(guardName);
85 mc.mangleItaniumThreadLocalWrapper(&vd, wrapperOut);
86 mc.mangleItaniumThreadLocalInit(&vd, initOut);
87 if (globalOp.hasWeakLinkage() || globalOp.hasLinkOnceLinkage() ||
95 "setGlobalTlsReferences: non-itanium mangler");
98 globalOp.setTlsRefsAttr(cir::ThreadLocalGlobalWrapperInitAttr::get(
static Decl::Kind getKind(const Decl *D)
Defines the clang::LangOptions interface.
clang::MangleContext & getMangleContext()
Gets the mangle context.
void emitCXXGuardedInit(const VarDecl &varDecl, cir::GlobalOp globalOp, bool performInit)
Emit a guarded initializer for a static local variable.
void emitCXXGlobalVarDeclInit(const VarDecl *varDecl, cir::GlobalOp addr, bool performInit)
Emit the function that initializes the specified global.
DiagnosticBuilder errorNYI(SourceLocation, llvm::StringRef)
Helpers to emit "not yet implemented" error diagnostics.
void setGlobalTlsReferences(const VarDecl &vd, cir::GlobalOp globalOp)
const clang::LangOptions & getLangOpts() const
void emitCXXGlobalVarDeclInitFunc(const VarDecl *vd, cir::GlobalOp addr, bool performInit)
mlir::MLIRContext & getMLIRContext()
CIRGenCXXABI & getCXXABI() const
virtual void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &)=0
Represents a variable declaration or definition.
TLSKind getTLSKind() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
@ TLS_Dynamic
TLS with a dynamic initializer.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const internal::VariadicDynCastAllOfMatcher< Decl, VarDecl > varDecl
Matches variable declarations.
Top level wrappers for InstallAPI frontend operations.
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
U cast(CodeGen::Address addr)
static bool deferredCXXGlobalInit()
static bool cudaSupport()