21#include "llvm/ADT/StringExtras.h"
22#include "llvm/IR/Intrinsics.h"
23#include "llvm/IR/MDBuilder.h"
24#include "llvm/Support/Path.h"
27using namespace CodeGen;
32 (
D.hasGlobalStorage() ||
34 "VarDecl must have global or local (in the case of OpenCL) storage!");
35 assert(!
D.getType()->isReferenceType() &&
36 "Should not call EmitDeclInit on a reference!");
47 DeclPtr,
D.getTLSKind());
66 llvm_unreachable(
"bad evaluation kind");
94 assert(!
D.getTLSKind() &&
"should have rejected this");
98 llvm::FunctionCallee
Func;
99 llvm::Constant *Argument;
109 bool CanRegisterDestructor =
117 if (
Record && (CanRegisterDestructor || UsingExternalHelper)) {
118 assert(!
Record->hasTrivialDestructor());
125 auto DestTy = llvm::PointerType::get(
127 auto SrcAS =
D.getType().getQualifiers().getAddressSpace();
133 Argument = llvm::ConstantPointerNull::get(DestTy);
143 Argument = llvm::Constant::getNullValue(CGF.
Int8PtrTy);
152 llvm::Constant *Addr) {
157void CodeGenFunction::EmitInvariantStart(llvm::Constant *Addr,
CharUnits Size) {
163 llvm::Intrinsic::ID InvStartID = llvm::Intrinsic::invariant_start;
165 assert(Addr->getType()->isPointerTy() &&
"Address must be a pointer");
166 llvm::Type *ObjectPtr[1] = {Addr->getType()};
167 llvm::Function *InvariantStart =
CGM.
getIntrinsic(InvStartID, ObjectPtr);
171 llvm::Value *Args[2] = {llvm::ConstantInt::getSigned(
Int64Ty, Width), Addr};
172 Builder.CreateCall(InvariantStart, Args);
176 llvm::GlobalVariable *GV,
198 unsigned ActualAddrSpace = GV->getAddressSpace();
199 llvm::Constant *DeclPtr = GV;
200 if (ActualAddrSpace != ExpectedAddrSpace) {
201 llvm::PointerType *PTy =
203 DeclPtr = llvm::ConstantExpr::getAddrSpaceCast(DeclPtr, PTy);
207 DeclPtr, GV->getValueType(),
getContext().getDeclAlign(&
D));
211 D.
hasAttr<OMPThreadPrivateDeclAttr>()) {
213 &
D, DeclAddr,
D.
getAttr<OMPThreadPrivateDeclAttr>()->getLocation(),
220 if (
D.getType().isConstantStorage(
getContext(),
true, !NeedsDtor))
227 assert(PerformInit &&
"cannot have constant initializer which needs "
228 "destruction for reference");
236 llvm::FunctionCallee dtor,
237 llvm::Constant *addr) {
239 llvm::FunctionType *ty = llvm::FunctionType::get(
CGM.
VoidTy,
false);
242 llvm::raw_svector_ostream Out(FnName);
258 llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr);
261 if (
auto *dtorFn = dyn_cast<llvm::Function>(
262 dtor.getCallee()->stripPointerCastsAndAliases()))
263 call->setCallingConv(dtorFn->getCallingConv());
265 CGF.FinishFunction();
278 const VarDecl &
D, llvm::FunctionCallee Dtor, llvm::Constant *Addr,
279 llvm::FunctionCallee &
AtExit) {
282 llvm::raw_svector_ostream Out(FnName);
291 llvm::FunctionType *StubTy =
292 llvm::FunctionType::get(
CGM.
IntTy, {CGM.IntTy},
true);
302 Args.push_back(&IPD);
311 llvm::CallInst *call = CGF.Builder.CreateCall(Dtor, Addr);
314 if (
auto *DtorFn = dyn_cast<llvm::Function>(
315 Dtor.getCallee()->stripPointerCastsAndAliases()))
316 call->setCallingConv(DtorFn->getCallingConv());
319 CGF.Builder.CreateStore(llvm::Constant::getNullValue(
CGM.
IntTy),
322 CGF.FinishFunction();
329 llvm::FunctionCallee dtor,
330 llvm::Constant *addr) {
338 llvm::FunctionCallee Dtor,
339 llvm::Constant *Addr) {
341 llvm::Function *dtorStub =
348 assert(dtorStub->getType() ==
349 llvm::PointerType::get(
350 llvm::FunctionType::get(
CGM.
VoidTy,
false),
351 dtorStub->getType()->getPointerAddressSpace()) &&
352 "Argument to atexit has a wrong type.");
354 llvm::FunctionType *atexitTy =
355 llvm::FunctionType::get(
IntTy, dtorStub->getType(),
false);
357 llvm::FunctionCallee atexit =
360 if (llvm::Function *atexitFn = dyn_cast<llvm::Function>(atexit.getCallee()))
361 atexitFn->setDoesNotThrow();
375 assert(dtorStub->getType() ==
376 llvm::PointerType::get(
377 llvm::FunctionType::get(
CGM.
VoidTy,
false),
378 dtorStub->getType()->getPointerAddressSpace()) &&
379 "Argument to unatexit has a wrong type.");
381 llvm::FunctionType *unatexitTy =
382 llvm::FunctionType::get(
IntTy, {dtorStub->getType()},
false);
384 llvm::FunctionCallee unatexit =
387 cast<llvm::Function>(unatexit.getCallee())->setDoesNotThrow();
393 llvm::GlobalVariable *DeclPtr,
400 "this initialization requires a guard variable, which "
401 "the kernel does not support");
407 llvm::BasicBlock *InitBlock,
408 llvm::BasicBlock *NoInitBlock,
415 static const uint64_t InitsPerTLSVar = 1024;
416 static const uint64_t InitsPerLocalVar = 1024 * 1024;
418 llvm::MDNode *Weights;
430 NumInits = InitsPerTLSVar;
432 NumInits = InitsPerLocalVar;
437 Weights = MDHelper.createBranchWeights(1, NumInits - 1);
440 Builder.CreateCondBr(NeedsInit, InitBlock, NoInitBlock, Weights);
444 llvm::FunctionType *FTy,
const Twine &Name,
const CGFunctionInfo &FI,
446 llvm::Function *Fn = llvm::Function::Create(FTy,
Linkage, Name, &
getModule());
450 if (
const char *Section =
getTarget().getStaticInitSectionSpecifier())
451 Fn->setSection(Section);
454 if (
Linkage == llvm::GlobalVariable::InternalLinkage)
460 Fn->setDoesNotThrow();
462 if (
getLangOpts().Sanitize.has(SanitizerKind::Address) &&
464 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
466 if (
getLangOpts().Sanitize.has(SanitizerKind::KernelAddress) &&
468 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
470 if (
getLangOpts().Sanitize.has(SanitizerKind::HWAddress) &&
472 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
474 if (
getLangOpts().Sanitize.has(SanitizerKind::KernelHWAddress) &&
476 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
478 if (
getLangOpts().Sanitize.has(SanitizerKind::MemtagStack) &&
480 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
482 if (
getLangOpts().Sanitize.has(SanitizerKind::Thread) &&
484 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
486 if (
getLangOpts().Sanitize.has(SanitizerKind::NumericalStability) &&
488 Fn->addFnAttr(llvm::Attribute::SanitizeNumericalStability);
490 if (
getLangOpts().Sanitize.has(SanitizerKind::Memory) &&
492 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
494 if (
getLangOpts().Sanitize.has(SanitizerKind::KernelMemory) &&
496 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
498 if (
getLangOpts().Sanitize.has(SanitizerKind::SafeStack) &&
500 Fn->addFnAttr(llvm::Attribute::SafeStack);
502 if (
getLangOpts().Sanitize.has(SanitizerKind::ShadowCallStack) &&
504 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
512void CodeGenModule::EmitPointerToInitFunc(
const VarDecl *
D,
513 llvm::GlobalVariable *GV,
514 llvm::Function *InitFunc,
516 llvm::GlobalVariable *PtrArray =
new llvm::GlobalVariable(
517 TheModule, InitFunc->getType(),
true,
518 llvm::GlobalValue::PrivateLinkage, InitFunc,
"__cxx_init_fn_ptr");
519 PtrArray->setSection(ISA->getSection());
523 if (llvm::Comdat *
C = GV->getComdat())
524 PtrArray->setComdat(
C);
528CodeGenModule::EmitCXXGlobalVarDeclInitFunc(
const VarDecl *
D,
529 llvm::GlobalVariable *Addr,
543 auto I = DelayedCXXInitPosition.find(
D);
544 if (I != DelayedCXXInitPosition.end() && I->second == ~0
U)
547 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
550 llvm::raw_svector_ostream Out(FnName);
558 auto *ISA =
D->
getAttr<InitSegAttr>();
562 llvm::GlobalVariable *COMDATKey =
565 if (
D->getTLSKind()) {
569 CXXThreadLocalInits.push_back(Fn);
570 CXXThreadLocalInitVars.push_back(
D);
571 }
else if (PerformInit && ISA) {
575 if (ISA->getSection() ==
".CRT$XCC")
577 else if (ISA->getSection() ==
".CRT$XCL")
583 EmitPointerToInitFunc(
D, Addr, Fn, ISA);
584 }
else if (
auto *IPA =
D->
getAttr<InitPriorityAttr>()) {
586 PrioritizedCXXGlobalInits.size());
587 PrioritizedCXXGlobalInits.push_back(std::make_pair(Key, Fn));
607 I = DelayedCXXInitPosition.find(
D);
615 I == DelayedCXXInitPosition.end() ? CXXGlobalInits.size() : I->second;
617 if (COMDATKey && (
getTriple().isOSBinFormatELF() ||
627 llvm::Comdat *
C = Addr->getComdat();
628 if (COMDATKey &&
C &&
634 I = DelayedCXXInitPosition.find(
D);
635 if (I == DelayedCXXInitPosition.end()) {
636 CXXGlobalInits.push_back(Fn);
637 }
else if (I->second != ~0
U) {
638 assert(I->second < CXXGlobalInits.size() &&
639 CXXGlobalInits[I->second] ==
nullptr);
640 CXXGlobalInits[I->second] =
Fn;
645 DelayedCXXInitPosition[
D] = ~0
U;
648void CodeGenModule::EmitCXXThreadLocalInitFunc() {
650 *
this, CXXThreadLocals, CXXThreadLocalInits, CXXThreadLocalInitVars);
652 CXXThreadLocalInits.clear();
653 CXXThreadLocalInitVars.clear();
654 CXXThreadLocals.clear();
672void CodeGenModule::EmitCXXModuleInitFunc(
Module *Primary) {
674 "The function should only be called for C++20 named module interface"
677 while (!CXXGlobalInits.empty() && !CXXGlobalInits.back())
678 CXXGlobalInits.pop_back();
686 for (
auto I : Primary->
Exports)
687 AllImports.insert(I.getPointer());
690 AllImports.insert(M);
694 assert((SubM->isGlobalModule() || SubM->isPrivateModule()) &&
695 "The sub modules of C++20 module unit should only be global module "
696 "fragments or private module framents.");
697 assert(SubM->Exports.empty() &&
698 "The global mdoule fragments and the private module fragments are "
699 "not allowed to export import modules.");
701 AllImports.insert(M);
705 for (
Module *M : AllImports) {
713 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
716 llvm::raw_svector_ostream Out(FnName);
717 cast<ItaniumMangleContext>(
getCXXABI().getMangleContext())
718 .mangleModuleInitializer(M, Out);
721 "We should only have one use of the initializer call");
722 llvm::Function *
Fn = llvm::Function::Create(
723 FTy, llvm::Function::ExternalLinkage, FnName.str(), &
getModule());
724 ModuleInits.push_back(Fn);
729 if (!PrioritizedCXXGlobalInits.empty()) {
731 llvm::array_pod_sort(PrioritizedCXXGlobalInits.begin(),
732 PrioritizedCXXGlobalInits.end());
734 I = PrioritizedCXXGlobalInits.begin(),
735 E = PrioritizedCXXGlobalInits.end();
738 std::upper_bound(I + 1,
E, *I, GlobalInitPriorityCmp());
740 for (; I < PrioE; ++I)
741 ModuleInits.push_back(I->second);
746 for (
auto *F : CXXGlobalInits)
747 ModuleInits.push_back(F);
749 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
759 llvm::raw_svector_ostream Out(InitFnName);
760 cast<ItaniumMangleContext>(
getCXXABI().getMangleContext())
761 .mangleModuleInitializer(Primary, Out);
764 llvm::GlobalVariable::ExternalLinkage);
769 if (!ModuleInits.empty()) {
771 llvm::GlobalVariable *Guard =
new llvm::GlobalVariable(
773 llvm::GlobalVariable::InternalLinkage,
774 llvm::ConstantInt::get(
Int8Ty, 0), InitFnName.str() +
"__in_chrg");
793 Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);
799 Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL);
800 Fn->addFnAttr(
"device-init");
805 PrioritizedCXXGlobalInits.clear();
806 CXXGlobalInits.clear();
816 for (
size_t i = 0; i <
FileName.size(); ++i) {
827 assert(
Priority <= 65535 &&
"Priority should always be <= 65535.");
831 std::string PrioritySuffix = llvm::utostr(
Priority);
832 PrioritySuffix = std::string(6 - PrioritySuffix.size(),
'0') + PrioritySuffix;
834 return PrioritySuffix;
838CodeGenModule::EmitCXXGlobalInitFunc() {
839 while (!CXXGlobalInits.empty() && !CXXGlobalInits.back())
840 CXXGlobalInits.pop_back();
844 if (CXX20ModuleInits)
845 for (
Module *M : ImportedModules) {
853 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
856 llvm::raw_svector_ostream Out(FnName);
857 cast<ItaniumMangleContext>(
getCXXABI().getMangleContext())
858 .mangleModuleInitializer(M, Out);
861 "We should only have one use of the initializer call");
862 llvm::Function *
Fn = llvm::Function::Create(
863 FTy, llvm::Function::ExternalLinkage, FnName.str(), &
getModule());
864 ModuleInits.push_back(Fn);
867 if (ModuleInits.empty() && CXXGlobalInits.empty() &&
868 PrioritizedCXXGlobalInits.empty())
871 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
875 if (!PrioritizedCXXGlobalInits.empty()) {
877 llvm::array_pod_sort(PrioritizedCXXGlobalInits.begin(),
878 PrioritizedCXXGlobalInits.end());
883 I = PrioritizedCXXGlobalInits.begin(),
884 E = PrioritizedCXXGlobalInits.end(); I !=
E; ) {
886 PrioE = std::upper_bound(I + 1,
E, *I, GlobalInitPriorityCmp());
888 LocalCXXGlobalInits.clear();
890 unsigned int Priority = I->first.priority;
895 if (!ModuleInits.empty()) {
896 for (
auto *F : ModuleInits)
897 LocalCXXGlobalInits.push_back(F);
901 for (; I < PrioE; ++I)
902 LocalCXXGlobalInits.push_back(I->second);
907 PrioritizedCXXGlobalInits.clear();
910 if (
getCXXABI().useSinitAndSterm() && ModuleInits.empty() &&
911 CXXGlobalInits.empty())
914 for (
auto *F : CXXGlobalInits)
915 ModuleInits.push_back(F);
916 CXXGlobalInits.clear();
923 if (CXX20ModuleInits &&
getContext().getCurrentNamedModule() &&
924 !
getContext().getCurrentNamedModule()->isModuleImplementation()) {
926 llvm::raw_svector_ostream Out(InitFnName);
927 cast<ItaniumMangleContext>(
getCXXABI().getMangleContext())
928 .mangleModuleInitializer(
getContext().getCurrentNamedModule(), Out);
931 llvm::GlobalVariable::ExternalLinkage);
951 Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);
957 Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL);
958 Fn->addFnAttr(
"device-init");
964void CodeGenModule::EmitCXXGlobalCleanUpFunc() {
965 if (CXXGlobalDtorsOrStermFinalizers.empty() &&
966 PrioritizedCXXStermFinalizers.empty())
969 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
973 if (!PrioritizedCXXStermFinalizers.empty()) {
975 llvm::array_pod_sort(PrioritizedCXXStermFinalizers.begin(),
976 PrioritizedCXXStermFinalizers.end());
981 I = PrioritizedCXXStermFinalizers.begin(),
982 E = PrioritizedCXXStermFinalizers.end();
985 std::upper_bound(I + 1,
E, *I, StermFinalizerPriorityCmp());
987 LocalCXXStermFinalizers.clear();
989 unsigned int Priority = I->first.priority;
993 for (; I < PrioE; ++I) {
994 llvm::FunctionCallee DtorFn = I->second;
995 LocalCXXStermFinalizers.emplace_back(DtorFn.getFunctionType(),
996 DtorFn.getCallee(),
nullptr);
1000 Fn, LocalCXXStermFinalizers);
1003 PrioritizedCXXStermFinalizers.clear();
1006 if (CXXGlobalDtorsOrStermFinalizers.empty())
1010 llvm::Function *
Fn =
1014 Fn, CXXGlobalDtorsOrStermFinalizers);
1016 CXXGlobalDtorsOrStermFinalizers.clear();
1022 llvm::GlobalVariable *Addr,
1026 DebugInfo =
nullptr;
1043 if (Addr->hasWeakLinkage() || Addr->hasLinkOnceLinkage() ||
1068 llvm::BasicBlock *ExitBlock =
nullptr;
1074 "guard.uninitialized");
1092 RunCleanupsScope
Scope(*
this);
1101 for (
unsigned i = 0, e = Decls.size(); i != e; ++i)
1105 Scope.ForceCleanup();
1118 ArrayRef<std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH,
1120 DtorsOrStermFinalizers) {
1129 for (
unsigned i = 0, e = DtorsOrStermFinalizers.size(); i != e; ++i) {
1130 llvm::FunctionType *CalleeTy;
1132 llvm::Constant *Arg;
1133 std::tie(CalleeTy, Callee, Arg) = DtorsOrStermFinalizers[e - i - 1];
1135 llvm::CallInst *CI =
nullptr;
1136 if (Arg ==
nullptr) {
1139 "Arg could not be nullptr unless using sinit and sterm functions.");
1140 CI =
Builder.CreateCall(CalleeTy, Callee);
1142 CI =
Builder.CreateCall(CalleeTy, Callee, Arg);
1145 if (llvm::Function *F = dyn_cast<llvm::Function>(Callee))
1146 CI->setCallingConv(F->getCallingConv());
1158 bool useEHCleanupForArray,
const VarDecl *VD) {
1162 args.push_back(&Dst);
1168 FTy,
"__cxx_global_array_dtor", FI, VD->
getLocation());
static std::string getPrioritySuffix(unsigned int Priority)
static void EmitDeclInit(CodeGenFunction &CGF, const VarDecl &D, ConstantAddress DeclPtr)
static SmallString< 128 > getTransformedFileName(llvm::Module &M)
static void EmitDeclDestroy(CodeGenFunction &CGF, const VarDecl &D, ConstantAddress Addr)
Emit code to cause the destruction of the given variable with static storage duration.
static void EmitDeclInvariant(CodeGenFunction &CGF, const VarDecl &D, llvm::Constant *Addr)
Emit code to cause the variable at the given address to be considered as constant from this point onw...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
const LangOptions & getLangOpts() const
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
unsigned getTargetAddressSpace(LangAS AS) const
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
CharUnits - This is an opaque type for sizes expressed in character units.
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
static CharUnits One()
One - Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
static AggValueSlot forLValue(const LValue &LV, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)
static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF)
Apply TemporaryLocation if it is valid.
static ApplyDebugLocation CreateEmpty(CodeGenFunction &CGF)
Set the IRBuilder to not attach debug locations.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
llvm::Value * CreateIsNull(Address Addr, const Twine &Name="")
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
virtual bool HasThisReturn(GlobalDecl GD) const
Returns true if the given constructor or destructor is one of the kinds that the ABI says returns 'th...
virtual bool useSinitAndSterm() const
virtual void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)=0
Emits the guarded initializer and destructor setup for the given variable, given that it couldn't be ...
virtual void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, llvm::FunctionCallee Dtor, llvm::Constant *Addr)=0
Emit code to force the execution of a destructor during global teardown.
virtual bool canCallMismatchedFunctionType() const
Returns true if the target allows calling a function through a pointer with a different signature tha...
virtual void EmitThreadLocalInitFuncs(CodeGenModule &CGM, ArrayRef< const VarDecl * > CXXThreadLocals, ArrayRef< llvm::Function * > CXXThreadLocalInits, ArrayRef< const VarDecl * > CXXThreadLocalInitVars)=0
Emits ABI-required functions necessary to initialize thread_local variables in this translation unit.
MangleContext & getMangleContext()
Gets the mangle context.
CGFunctionInfo - Class to encapsulate the information about a function definition.
void annotateHLSLResource(const VarDecl *D, llvm::GlobalVariable *GV)
virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, Address dest)=0
virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, Address dest, bool threadlocal=false)=0
virtual llvm::Function * emitThreadPrivateVarDefinition(const VarDecl *VD, Address VDAddr, SourceLocation Loc, bool PerformInit, CodeGenFunction *CGF=nullptr)
Emit a code for initialization of threadprivate variable.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void GenerateCXXGlobalInitFunc(llvm::Function *Fn, ArrayRef< llvm::Function * > CXXThreadLocals, ConstantAddress Guard=ConstantAddress::invalid())
GenerateCXXGlobalInitFunc - Generates code for initializing global variables.
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
llvm::Constant * createAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr)
llvm::Value * EmitObjCAutoreleasePoolPush()
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
const LangOptions & getLangOpts() const
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
llvm::Type * ConvertTypeForMem(QualType T)
llvm::Function * createTLSAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr, llvm::FunctionCallee &AtExit)
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
void registerGlobalDtorWithLLVM(const VarDecl &D, llvm::FunctionCallee fn, llvm::Constant *addr)
Registers the dtor using 'llvm.global_dtors' for platforms that do not support an 'atexit()' function...
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
void emitDestroy(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
llvm::Function * generateDestroyHelper(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray, const VarDecl *VD)
void GenerateCXXGlobalCleanUpFunc(llvm::Function *Fn, ArrayRef< std::tuple< llvm::FunctionType *, llvm::WeakTrackingVH, llvm::Constant * > > DtorsOrStermFinalizers)
GenerateCXXGlobalCleanUpFunc - Generates code for cleaning up global variables.
void EmitCXXGuardedInit(const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)
Emit code in this function to perform a guarded variable initialization.
void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::GlobalVariable *GV, bool PerformInit)
EmitCXXGlobalVarDeclInit - Create the initializer for a C++ variable with global storage.
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit)
EmitComplexExprIntoLValue - Emit the given expression of complex type and place its result into the s...
void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn, const CGFunctionInfo &FnInfo, const FunctionArgList &Args, SourceLocation Loc=SourceLocation(), SourceLocation StartLoc=SourceLocation())
Emit code for the start of a function.
void registerGlobalDtorWithAtExit(const VarDecl &D, llvm::FunctionCallee fn, llvm::Constant *addr)
Call atexit() with a function that passes the given argument to the given function.
llvm::Value * unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub)
Call unatexit() with function dtorStub.
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
ASTContext & getContext() const
bool needsEHCleanup(QualType::DestructionKind kind)
Determines whether an EH cleanup is required to destroy a type with the given destruction kind.
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
void EmitInvariantStart(llvm::Constant *Addr, CharUnits Size)
CodeGenTypes & getTypes() const
void GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn, const VarDecl *D, llvm::GlobalVariable *Addr, bool PerformInit)
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr)
llvm::LLVMContext & getLLVMContext()
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
void EmitCXXGuardedInitBranch(llvm::Value *NeedsInit, llvm::BasicBlock *InitBlock, llvm::BasicBlock *NoInitBlock, GuardKind Kind, const VarDecl *D)
Emit a branch to select whether or not to perform guarded initialization.
This class organizes the cross-function state that is used while generating LLVM code.
void SetInternalFunctionAttributes(GlobalDecl GD, llvm::Function *F, const CGFunctionInfo &FI)
Set the attributes on the LLVM function for the given decl and function info.
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
llvm::Module & getModule() const
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
llvm::FunctionCallee getAddrAndTypeOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
llvm::Constant * getFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return the ABI-correct function pointer value for a reference to the given function.
bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn, SourceLocation Loc) const
const LangOptions & getLangOpts() const
CodeGenTypes & getTypes()
const TargetInfo & getTarget() const
void addUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.used metadata.
const llvm::DataLayout & getDataLayout() const
void Error(SourceLocation loc, StringRef error)
Emit a general error that something can't be done.
CGCXXABI & getCXXABI() const
CGOpenMPRuntime & getOpenMPRuntime()
Return a reference to the configured OpenMP runtime.
const llvm::Triple & getTriple() const
void AddGlobalDtor(llvm::Function *Dtor, int Priority=65535, bool IsDtorAttrFunc=false)
AddGlobalDtor - Add a function to the list that will be called when the module is unloaded.
ASTContext & getContext() const
bool supportsCOMDAT() const
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
llvm::LLVMContext & getLLVMContext()
llvm::GlobalValue * GetGlobalValue(StringRef Ref)
void GenKernelArgMetadata(llvm::Function *FN, const FunctionDecl *FD=nullptr, CodeGenFunction *CGF=nullptr)
OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument information in the program executab...
CGObjCRuntime & getObjCRuntime()
Return a reference to the configured Objective-C runtime.
void AddGlobalCtor(llvm::Function *Ctor, int Priority=65535, unsigned LexOrder=~0U, llvm::Constant *AssociatedData=nullptr)
AddGlobalCtor - Add a function to the list that will be called before main() runs.
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys=std::nullopt)
llvm::Function * CreateGlobalInitOrCleanUpFunction(llvm::FunctionType *ty, const Twine &name, const CGFunctionInfo &FI, SourceLocation Loc=SourceLocation(), bool TLS=false, llvm::GlobalVariable::LinkageTypes Linkage=llvm::GlobalVariable::InternalLinkage)
const CGFunctionInfo & arrangeLLVMFunctionInfo(CanQualType returnType, FnInfoOpts opts, ArrayRef< CanQualType > argTypes, FunctionType::ExtInfo info, ArrayRef< FunctionProtoType::ExtParameterInfo > paramInfos, RequiredArgs args)
"Arrange" the LLVM information for a call or type with the given signature.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
const CGFunctionInfo & arrangeBuiltinFunctionDeclaration(QualType resultType, const FunctionArgList &args)
A builtin function is a freestanding function using the default C conventions.
unsigned getTargetAddressSpace(QualType T) const
const CGFunctionInfo & arrangeNullaryFunction()
A nullary function is a freestanding function of type 'void ()'.
A specialization of Address that requires the address to be an LLVM Constant.
ConstantAddress withElementType(llvm::Type *ElemTy) const
static ConstantAddress invalid()
llvm::Constant * getPointer() const
FunctionArgList - Type for representing both the decl and type of parameters to a function.
LValue - This represents an lvalue references.
bool isObjCStrong() const
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
virtual LangAS getAddrSpaceOfCxaAtexitPtrParam() const
Get address space of pointer parameter for __cxa_atexit.
SourceLocation getLocation() const
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
This represents one expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
A class which abstracts out some details necessary for making a call.
GlobalDecl - represents a global declaration.
virtual void mangleDynamicAtExitDestructor(const VarDecl *D, raw_ostream &)=0
virtual void mangleDynamicInitializer(const VarDecl *D, raw_ostream &)=0
Describes a module or submodule.
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
bool isNamedModuleInterfaceHasInit() const
bool isInterfaceOrPartition() const
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
llvm::iterator_range< submodule_iterator > submodules()
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
A (possibly-)qualified type.
@ DK_objc_strong_lifetime
Scope - A scope is a transient data structure that is used while parsing the program.
Encodes a location in the source.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isReferenceType() const
Represents a variable declaration or definition.
const Expr * getInit() const
@ TLS_Dynamic
TLS with a dynamic initializer.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
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...
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Dtor_Complete
Complete object dtor.
LLVM_READONLY bool isPreprocessingNumberBody(unsigned char c)
Return true if this is the body character of a C preprocessing number, which is [a-zA-Z0-9_.
const FunctionProtoType * T
@ Other
Other implicit parameter.
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * IntTy
int
llvm::PointerType * Int8PtrTy
Extra information about a function prototype.