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) {
71 if (globalOp.getTlsModel() != cir::TLS_Model::GeneralDynamic)
79 llvm::raw_svector_ostream wrapperOut(wrapperFuncName);
80 llvm::raw_svector_ostream initOut(initFuncName);
81 llvm::raw_svector_ostream guardStream(guardName);
84 mc.mangleItaniumThreadLocalWrapper(&vd, wrapperOut);
85 mc.mangleItaniumThreadLocalInit(&vd, initOut);
86 if (globalOp.hasWeakLinkage() || globalOp.hasLinkOnceLinkage() ||
94 "setGlobalTlsReferences: non-itanium mangler");
97 globalOp.setDynTlsRefsAttr(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.
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.
The JSON file list parser is used to communicate input to InstallAPI.
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()