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);
46 auto guardAttr = mlir::StringAttr::get(&
cgm.getMLIRContext(), guardName);
48 globalOp.setDynamicInitGuardAttr(
49 cir::DynamicInitGuardAttr::get(&
cgm.getMLIRContext(), guardAttr));
52 cgm.emitCXXStaticLocalVarDeclInit(&
varDecl, globalOp, performInit);
54 cgm.emitCXXGlobalVarDeclInit(&
varDecl, globalOp, performInit);
58 cir::GlobalOp globalOp) {
75 llvm::raw_svector_ostream wrapperOut(wrapperFuncName);
76 llvm::raw_svector_ostream initOut(initFuncName);
77 llvm::raw_svector_ostream guardStream(guardName);
80 mc.mangleItaniumThreadLocalWrapper(&vd, wrapperOut);
81 mc.mangleItaniumThreadLocalInit(&vd, initOut);
82 if (globalOp.hasWeakLinkage() || globalOp.hasLinkOnceLinkage() ||
90 "setGlobalTlsReferences: non-itanium mangler");
93 globalOp.setTlsRefsAttr(cir::ThreadLocalGlobalWrapperInitAttr::get(
103 (vd->
hasAttr<CUDADeviceAttr>() || vd->
hasAttr<CUDAConstantAttr>() ||
104 vd->
hasAttr<CUDASharedAttr>()))
114 if (addr.hasWeakLinkage() || addr.hasLinkOnceLinkage() ||
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)