50#include "llvm/ADT/STLExtras.h"
51#include "llvm/ADT/StringExtras.h"
52#include "llvm/ADT/StringSwitch.h"
53#include "llvm/Analysis/TargetLibraryInfo.h"
54#include "llvm/BinaryFormat/ELF.h"
55#include "llvm/IR/AttributeMask.h"
56#include "llvm/IR/CallingConv.h"
57#include "llvm/IR/DataLayout.h"
58#include "llvm/IR/Intrinsics.h"
59#include "llvm/IR/LLVMContext.h"
60#include "llvm/IR/Module.h"
61#include "llvm/IR/ProfileSummary.h"
62#include "llvm/ProfileData/InstrProfReader.h"
63#include "llvm/ProfileData/SampleProf.h"
64#include "llvm/Support/ARMBuildAttributes.h"
65#include "llvm/Support/CRC.h"
66#include "llvm/Support/CodeGen.h"
67#include "llvm/Support/CommandLine.h"
68#include "llvm/Support/ConvertUTF.h"
69#include "llvm/Support/ErrorHandling.h"
70#include "llvm/Support/Hash.h"
71#include "llvm/Support/TimeProfiler.h"
72#include "llvm/TargetParser/AArch64TargetParser.h"
73#include "llvm/TargetParser/RISCVISAInfo.h"
74#include "llvm/TargetParser/Triple.h"
75#include "llvm/TargetParser/X86TargetParser.h"
76#include "llvm/Transforms/Instrumentation/KCFI.h"
77#include "llvm/Transforms/Utils/BuildLibCalls.h"
85 "limited-coverage-experimental", llvm::cl::Hidden,
86 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
93 case TargetCXXABI::AppleARM64:
94 case TargetCXXABI::Fuchsia:
95 case TargetCXXABI::GenericAArch64:
96 case TargetCXXABI::GenericARM:
97 case TargetCXXABI::iOS:
98 case TargetCXXABI::WatchOS:
99 case TargetCXXABI::GenericMIPS:
100 case TargetCXXABI::GenericItanium:
101 case TargetCXXABI::WebAssembly:
102 case TargetCXXABI::XL:
104 case TargetCXXABI::Microsoft:
108 llvm_unreachable(
"invalid C++ ABI kind");
111static std::unique_ptr<TargetCodeGenInfo>
114 const llvm::Triple &Triple =
Target.getTriple();
117 switch (Triple.getArch()) {
121 case llvm::Triple::m68k:
123 case llvm::Triple::mips:
124 case llvm::Triple::mipsel:
125 if (Triple.getOS() == llvm::Triple::Win32)
129 case llvm::Triple::mips64:
130 case llvm::Triple::mips64el:
133 case llvm::Triple::avr: {
137 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
138 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
142 case llvm::Triple::aarch64:
143 case llvm::Triple::aarch64_32:
144 case llvm::Triple::aarch64_be: {
146 if (
Target.getABI() ==
"darwinpcs")
147 Kind = AArch64ABIKind::DarwinPCS;
148 else if (Triple.isOSWindows())
150 else if (
Target.getABI() ==
"aapcs-soft")
151 Kind = AArch64ABIKind::AAPCSSoft;
156 case llvm::Triple::wasm32:
157 case llvm::Triple::wasm64: {
159 if (
Target.getABI() ==
"experimental-mv")
160 Kind = WebAssemblyABIKind::ExperimentalMV;
164 case llvm::Triple::arm:
165 case llvm::Triple::armeb:
166 case llvm::Triple::thumb:
167 case llvm::Triple::thumbeb: {
168 if (Triple.getOS() == llvm::Triple::Win32)
172 StringRef ABIStr =
Target.getABI();
173 if (ABIStr ==
"apcs-gnu")
174 Kind = ARMABIKind::APCS;
175 else if (ABIStr ==
"aapcs16")
176 Kind = ARMABIKind::AAPCS16_VFP;
177 else if (CodeGenOpts.
FloatABI ==
"hard" ||
178 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
179 Kind = ARMABIKind::AAPCS_VFP;
184 case llvm::Triple::ppc: {
185 if (Triple.isOSAIX())
192 case llvm::Triple::ppcle: {
197 case llvm::Triple::ppc64:
198 if (Triple.isOSAIX())
201 if (Triple.isOSBinFormatELF()) {
203 if (
Target.getABI() ==
"elfv2")
204 Kind = PPC64_SVR4_ABIKind::ELFv2;
205 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
210 case llvm::Triple::ppc64le: {
211 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
213 if (
Target.getABI() ==
"elfv1")
214 Kind = PPC64_SVR4_ABIKind::ELFv1;
215 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
220 case llvm::Triple::nvptx:
221 case llvm::Triple::nvptx64:
224 case llvm::Triple::msp430:
227 case llvm::Triple::riscv32:
228 case llvm::Triple::riscv64:
229 case llvm::Triple::riscv32be:
230 case llvm::Triple::riscv64be: {
231 StringRef ABIStr =
Target.getABI();
233 unsigned ABIFLen = 0;
234 if (ABIStr.ends_with(
"f"))
236 else if (ABIStr.ends_with(
"d"))
238 bool EABI = ABIStr.ends_with(
"e");
242 case llvm::Triple::systemz: {
243 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
244 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
248 case llvm::Triple::tce:
249 case llvm::Triple::tcele:
250 case llvm::Triple::tcele64:
253 case llvm::Triple::x86: {
254 bool IsDarwinVectorABI = Triple.isOSDarwin();
255 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
257 if (Triple.getOS() == llvm::Triple::Win32) {
259 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
260 CodeGenOpts.NumRegisterParameters);
263 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
264 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
267 case llvm::Triple::x86_64: {
268 StringRef ABI =
Target.getABI();
269 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
270 : ABI ==
"avx" ? X86AVXABILevel::AVX
271 : X86AVXABILevel::None);
273 switch (Triple.getOS()) {
274 case llvm::Triple::UEFI:
275 case llvm::Triple::Win32:
281 case llvm::Triple::hexagon:
283 case llvm::Triple::lanai:
285 case llvm::Triple::r600:
287 case llvm::Triple::amdgcn:
289 case llvm::Triple::sparc:
291 case llvm::Triple::sparcv9:
293 case llvm::Triple::xcore:
295 case llvm::Triple::arc:
297 case llvm::Triple::spir:
298 case llvm::Triple::spir64:
300 case llvm::Triple::spirv32:
301 case llvm::Triple::spirv64:
302 case llvm::Triple::spirv:
304 case llvm::Triple::dxil:
306 case llvm::Triple::ve:
308 case llvm::Triple::csky: {
309 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
311 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
316 case llvm::Triple::bpfeb:
317 case llvm::Triple::bpfel:
319 case llvm::Triple::loongarch32:
320 case llvm::Triple::loongarch64: {
321 StringRef ABIStr =
Target.getABI();
322 unsigned ABIFRLen = 0;
323 if (ABIStr.ends_with(
"f"))
325 else if (ABIStr.ends_with(
"d"))
334 if (!TheTargetCodeGenInfo)
336 return *TheTargetCodeGenInfo;
340 llvm::LLVMContext &Context,
344 if (Opts.AlignDouble || Opts.OpenCL)
347 llvm::Triple Triple =
Target.getTriple();
348 llvm::DataLayout DL(
Target.getDataLayoutString());
349 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
350 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
351 llvm::Align ClangAlign(Alignment / 8);
352 if (DLAlign != ClangAlign) {
353 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
354 <<
" mapping to " << *Ty <<
" has data layout alignment "
355 << DLAlign.value() <<
" while clang specifies "
356 << ClangAlign.value() <<
"\n";
361 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
363 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
365 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
367 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
370 if (Triple.getArch() != llvm::Triple::m68k)
371 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
374 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
375 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
376 Triple.getArch() != llvm::Triple::ve)
377 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
379 if (
Target.hasFloat16Type())
380 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
382 if (
Target.hasBFloat16Type())
383 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
384 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
386 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
389 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
391 if (
Target.hasFloat128Type())
392 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
393 if (
Target.hasIbm128Type())
394 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
396 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
398 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
399 llvm::errs() <<
"Datalayout for target " << Triple.str()
400 <<
" sets element-aligned vectors to '"
401 <<
Target.vectorsAreElementAligned()
402 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
416 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
417 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
419 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
425 llvm::LLVMContext &LLVMContext = M.getContext();
426 VoidTy = llvm::Type::getVoidTy(LLVMContext);
427 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
428 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
429 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
430 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
431 HalfTy = llvm::Type::getHalfTy(LLVMContext);
432 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
433 FloatTy = llvm::Type::getFloatTy(LLVMContext);
434 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
440 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
442 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
444 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
445 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
446 IntPtrTy = llvm::IntegerType::get(LLVMContext,
447 C.getTargetInfo().getMaxPointerWidth());
448 Int8PtrTy = llvm::PointerType::get(LLVMContext,
450 const llvm::DataLayout &DL = M.getDataLayout();
452 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
454 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
456 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
473 createOpenCLRuntime();
475 createOpenMPRuntime();
482 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
483 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
489 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
490 CodeGenOpts.CoverageNotesFile.size() ||
491 CodeGenOpts.CoverageDataFile.size())
499 Block.GlobalUniqueCount = 0;
501 if (
C.getLangOpts().ObjC)
504 if (CodeGenOpts.hasProfileClangUse()) {
505 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
506 CodeGenOpts.ProfileInstrumentUsePath, *FS,
507 CodeGenOpts.ProfileRemappingFile);
508 if (
auto E = ReaderOrErr.takeError()) {
509 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
510 Diags.Report(diag::err_reading_profile)
511 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
515 PGOReader = std::move(ReaderOrErr.get());
520 if (CodeGenOpts.CoverageMapping)
524 if (CodeGenOpts.UniqueInternalLinkageNames &&
525 !
getModule().getSourceFileName().empty()) {
526 std::string Path =
getModule().getSourceFileName();
528 for (
const auto &Entry : LangOpts.MacroPrefixMap)
529 if (Path.rfind(Entry.first, 0) != std::string::npos) {
530 Path = Entry.second + Path.substr(Entry.first.size());
533 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
537 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
538 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
539 CodeGenOpts.NumRegisterParameters);
548 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
549 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
551 this->MSHotPatchFunctions.push_back(std::string{*I});
553 auto &DE = Context.getDiagnostics();
554 DE.Report(diag::err_open_hotpatch_file_failed)
556 << BufOrErr.getError().message();
561 this->MSHotPatchFunctions.push_back(FuncName);
563 llvm::sort(this->MSHotPatchFunctions);
566 if (!Context.getAuxTargetInfo())
572void CodeGenModule::createObjCRuntime() {
589 llvm_unreachable(
"bad runtime kind");
592void CodeGenModule::createOpenCLRuntime() {
596void CodeGenModule::createOpenMPRuntime() {
597 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
598 Diags.Report(diag::err_omp_host_ir_file_not_found)
599 << LangOpts.OMPHostIRFile;
604 case llvm::Triple::nvptx:
605 case llvm::Triple::nvptx64:
606 case llvm::Triple::amdgcn:
607 case llvm::Triple::spirv64:
610 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
611 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
614 if (LangOpts.OpenMPSimd)
615 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
617 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
622void CodeGenModule::createCUDARuntime() {
626void CodeGenModule::createHLSLRuntime() {
627 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
631 Replacements[Name] =
C;
634void CodeGenModule::applyReplacements() {
635 for (
auto &I : Replacements) {
636 StringRef MangledName = I.first;
637 llvm::Constant *Replacement = I.second;
642 auto *NewF = dyn_cast<llvm::Function>(Replacement);
644 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
645 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
648 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
649 CE->getOpcode() == llvm::Instruction::GetElementPtr);
650 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
655 OldF->replaceAllUsesWith(Replacement);
657 NewF->removeFromParent();
658 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
661 OldF->eraseFromParent();
666 GlobalValReplacements.push_back(std::make_pair(GV,
C));
669void CodeGenModule::applyGlobalValReplacements() {
670 for (
auto &I : GlobalValReplacements) {
671 llvm::GlobalValue *GV = I.first;
672 llvm::Constant *
C = I.second;
674 GV->replaceAllUsesWith(
C);
675 GV->eraseFromParent();
682 const llvm::Constant *
C;
683 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
684 C = GA->getAliasee();
685 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
686 C = GI->getResolver();
690 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
694 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
703 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
704 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
708 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
712 if (GV->hasCommonLinkage()) {
713 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
714 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
715 Diags.
Report(Location, diag::err_alias_to_common);
720 if (GV->isDeclaration()) {
721 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
722 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
723 << IsIFunc << IsIFunc;
726 for (
const auto &[
Decl, Name] : MangledDeclNames) {
727 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
729 if (II && II->
getName() == GV->getName()) {
730 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
734 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
744 const auto *F = dyn_cast<llvm::Function>(GV);
746 Diags.
Report(Location, diag::err_alias_to_undefined)
747 << IsIFunc << IsIFunc;
751 llvm::FunctionType *FTy = F->getFunctionType();
752 if (!FTy->getReturnType()->isPointerTy()) {
753 Diags.
Report(Location, diag::err_ifunc_resolver_return);
767 if (GVar->hasAttribute(
"toc-data")) {
768 auto GVId = GVar->getName();
771 Diags.
Report(Location, diag::warn_toc_unsupported_type)
772 << GVId <<
"the variable has an alias";
774 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
775 llvm::AttributeSet NewAttributes =
776 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
777 GVar->setAttributes(NewAttributes);
781void CodeGenModule::checkAliases() {
786 DiagnosticsEngine &Diags =
getDiags();
787 for (
const GlobalDecl &GD : Aliases) {
789 SourceLocation Location;
791 bool IsIFunc = D->hasAttr<IFuncAttr>();
792 if (
const Attr *A = D->getDefiningAttr()) {
793 Location = A->getLocation();
794 Range = A->getRange();
796 llvm_unreachable(
"Not an alias or ifunc?");
800 const llvm::GlobalValue *GV =
nullptr;
802 MangledDeclNames, Range)) {
808 if (
const llvm::GlobalVariable *GVar =
809 dyn_cast<const llvm::GlobalVariable>(GV))
813 llvm::Constant *Aliasee =
817 llvm::GlobalValue *AliaseeGV;
818 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
823 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
824 StringRef AliasSection = SA->getName();
825 if (AliasSection != AliaseeGV->getSection())
826 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
827 << AliasSection << IsIFunc << IsIFunc;
835 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
836 if (GA->isInterposable()) {
837 Diags.Report(Location, diag::warn_alias_to_weak_alias)
838 << GV->getName() << GA->getName() << IsIFunc;
839 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
840 GA->getAliasee(), Alias->getType());
852 llvm::Attribute::DisableSanitizerInstrumentation);
857 for (
const GlobalDecl &GD : Aliases) {
860 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
861 Alias->eraseFromParent();
866 DeferredDeclsToEmit.clear();
867 EmittedDeferredDecls.clear();
868 DeferredAnnotations.clear();
870 OpenMPRuntime->clear();
874 StringRef MainFile) {
877 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
878 if (MainFile.empty())
879 MainFile =
"<stdin>";
880 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
883 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
886 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
890static std::optional<llvm::GlobalValue::VisibilityTypes>
897 return llvm::GlobalValue::DefaultVisibility;
899 return llvm::GlobalValue::HiddenVisibility;
901 return llvm::GlobalValue::ProtectedVisibility;
903 llvm_unreachable(
"unknown option value!");
908 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
917 GV.setDSOLocal(
false);
918 GV.setVisibility(*
V);
923 if (!LO.VisibilityFromDLLStorageClass)
926 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
929 std::optional<llvm::GlobalValue::VisibilityTypes>
930 NoDLLStorageClassVisibility =
933 std::optional<llvm::GlobalValue::VisibilityTypes>
934 ExternDeclDLLImportVisibility =
937 std::optional<llvm::GlobalValue::VisibilityTypes>
938 ExternDeclNoDLLStorageClassVisibility =
941 for (llvm::GlobalValue &GV : M.global_values()) {
942 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
945 if (GV.isDeclarationForLinker())
947 llvm::GlobalValue::DLLImportStorageClass
948 ? ExternDeclDLLImportVisibility
949 : ExternDeclNoDLLStorageClassVisibility);
952 llvm::GlobalValue::DLLExportStorageClass
953 ? DLLExportVisibility
954 : NoDLLStorageClassVisibility);
956 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
961 const llvm::Triple &Triple,
965 return LangOpts.getStackProtector() == Mode;
968std::optional<llvm::Attribute::AttrKind>
970 if (D && D->
hasAttr<NoStackProtectorAttr>())
972 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
974 return llvm::Attribute::StackProtectStrong;
976 return llvm::Attribute::StackProtect;
978 return llvm::Attribute::StackProtectStrong;
980 return llvm::Attribute::StackProtectReq;
987 EmitModuleInitializers(Primary);
989 DeferredDecls.insert_range(EmittedDeferredDecls);
990 EmittedDeferredDecls.clear();
991 EmitVTablesOpportunistically();
992 applyGlobalValReplacements();
994 emitMultiVersionFunctions();
995 emitPFPFieldsWithEvaluatedOffset();
997 if (Context.getLangOpts().IncrementalExtensions &&
998 GlobalTopLevelStmtBlockInFlight.first) {
1000 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1001 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1007 EmitCXXModuleInitFunc(Primary);
1009 EmitCXXGlobalInitFunc();
1010 EmitCXXGlobalCleanUpFunc();
1011 registerGlobalDtorsWithAtExit();
1012 EmitCXXThreadLocalInitFunc();
1014 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1016 if (Context.getLangOpts().CUDA && CUDARuntime) {
1017 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1020 if (OpenMPRuntime) {
1021 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1022 OpenMPRuntime->clear();
1026 PGOReader->getSummary(
false).getMD(VMContext),
1027 llvm::ProfileSummary::PSK_Instr);
1028 if (PGOStats.hasDiagnostics())
1034 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1035 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1037 EmitStaticExternCAliases();
1042 if (CoverageMapping)
1043 CoverageMapping->emit();
1044 if (CodeGenOpts.SanitizeCfiCrossDso) {
1048 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1050 emitAtAvailableLinkGuard();
1051 if (Context.getTargetInfo().getTriple().isWasm())
1058 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1059 llvm::CodeObjectVersionKind::COV_None) {
1060 getModule().addModuleFlag(llvm::Module::Error,
1061 "amdhsa_code_object_version",
1062 getTarget().getTargetOpts().CodeObjectVersion);
1067 auto *MDStr = llvm::MDString::get(
1072 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1081 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1083 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1085 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1089 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1093 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1095 auto *GV =
new llvm::GlobalVariable(
1096 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1097 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1103 auto *GV =
new llvm::GlobalVariable(
1105 llvm::Constant::getNullValue(
Int8Ty),
1114 if (CodeGenOpts.Autolink &&
1115 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1116 EmitModuleLinkOptions();
1131 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1132 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1133 for (
auto *MD : ELFDependentLibraries)
1134 NMD->addOperand(MD);
1137 if (CodeGenOpts.DwarfVersion) {
1138 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1139 CodeGenOpts.DwarfVersion);
1142 if (CodeGenOpts.Dwarf64)
1143 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1145 if (Context.getLangOpts().SemanticInterposition)
1147 getModule().setSemanticInterposition(
true);
1149 if (CodeGenOpts.EmitCodeView) {
1151 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1153 if (CodeGenOpts.CodeViewGHash) {
1154 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1156 if (CodeGenOpts.ControlFlowGuard) {
1159 llvm::Module::Warning,
"cfguard",
1160 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1161 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1164 llvm::Module::Warning,
"cfguard",
1165 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1167 if (CodeGenOpts.getWinControlFlowGuardMechanism() !=
1168 llvm::ControlFlowGuardMechanism::Automatic) {
1171 llvm::Module::Warning,
"cfguard-mechanism",
1172 static_cast<unsigned>(CodeGenOpts.getWinControlFlowGuardMechanism()));
1174 if (CodeGenOpts.EHContGuard) {
1176 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1178 if (Context.getLangOpts().Kernel) {
1180 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1182 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1187 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1189 llvm::Metadata *Ops[2] = {
1190 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1191 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1192 llvm::Type::getInt32Ty(VMContext), 1))};
1194 getModule().addModuleFlag(llvm::Module::Require,
1195 "StrictVTablePointersRequirement",
1196 llvm::MDNode::get(VMContext, Ops));
1202 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1203 llvm::DEBUG_METADATA_VERSION);
1208 uint64_t WCharWidth =
1209 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1210 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1211 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1214 getModule().addModuleFlag(llvm::Module::Warning,
1215 "zos_product_major_version",
1216 uint32_t(CLANG_VERSION_MAJOR));
1217 getModule().addModuleFlag(llvm::Module::Warning,
1218 "zos_product_minor_version",
1219 uint32_t(CLANG_VERSION_MINOR));
1220 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1221 uint32_t(CLANG_VERSION_PATCHLEVEL));
1223 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1224 llvm::MDString::get(VMContext, ProductId));
1229 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1230 llvm::MDString::get(VMContext, lang_str));
1232 time_t TT = PreprocessorOpts.SourceDateEpoch
1233 ? *PreprocessorOpts.SourceDateEpoch
1234 : std::time(
nullptr);
1235 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1236 static_cast<uint64_t
>(TT));
1239 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1240 llvm::MDString::get(VMContext,
"ascii"));
1243 llvm::Triple T = Context.getTargetInfo().getTriple();
1244 if (T.isARM() || T.isThumb()) {
1246 uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1247 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1251 StringRef ABIStr = Target.getABI();
1252 llvm::LLVMContext &Ctx = TheModule.getContext();
1253 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1254 llvm::MDString::get(Ctx, ABIStr));
1259 const std::vector<std::string> &Features =
1262 llvm::RISCVISAInfo::parseFeatures(T.isRISCV64() ? 64 : 32, Features);
1263 if (!errorToBool(ParseResult.takeError()))
1265 llvm::Module::AppendUnique,
"riscv-isa",
1267 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1270 if (CodeGenOpts.SanitizeCfiCrossDso) {
1272 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1275 if (CodeGenOpts.WholeProgramVTables) {
1279 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1280 CodeGenOpts.VirtualFunctionElimination);
1283 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1284 getModule().addModuleFlag(llvm::Module::Override,
1285 "CFI Canonical Jump Tables",
1286 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1289 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1290 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1294 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1296 llvm::Module::Append,
"Unique Source File Identifier",
1298 TheModule.getContext(),
1299 llvm::MDString::get(TheModule.getContext(),
1300 CodeGenOpts.UniqueSourceFileIdentifier)));
1303 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1304 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1307 if (CodeGenOpts.PatchableFunctionEntryOffset)
1308 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1309 CodeGenOpts.PatchableFunctionEntryOffset);
1310 if (CodeGenOpts.SanitizeKcfiArity)
1311 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1314 llvm::Module::Override,
"kcfi-hash",
1315 llvm::MDString::get(
1317 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1320 if (CodeGenOpts.CFProtectionReturn &&
1321 Target.checkCFProtectionReturnSupported(
getDiags())) {
1323 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1327 if (CodeGenOpts.CFProtectionBranch &&
1328 Target.checkCFProtectionBranchSupported(
getDiags())) {
1330 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1333 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1334 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1336 Scheme = Target.getDefaultCFBranchLabelScheme();
1338 llvm::Module::Error,
"cf-branch-label-scheme",
1344 if (CodeGenOpts.FunctionReturnThunks)
1345 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1347 if (CodeGenOpts.IndirectBranchCSPrefix)
1348 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1359 if (Context.getTargetInfo().hasFeature(
"ptrauth") &&
1360 LangOpts.getSignReturnAddressScope() !=
1362 getModule().addModuleFlag(llvm::Module::Override,
1363 "sign-return-address-buildattr", 1);
1364 if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
1365 getModule().addModuleFlag(llvm::Module::Override,
1366 "tag-stack-memory-buildattr", 1);
1368 if (T.isARM() || T.isThumb() || T.isAArch64()) {
1376 if (LangOpts.BranchTargetEnforcement)
1377 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1379 if (LangOpts.BranchProtectionPAuthLR)
1380 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1382 if (LangOpts.GuardedControlStack)
1383 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1384 if (LangOpts.hasSignReturnAddress())
1385 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1386 if (LangOpts.isSignReturnAddressScopeAll())
1387 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1389 if (!LangOpts.isSignReturnAddressWithAKey())
1390 getModule().addModuleFlag(llvm::Module::Min,
1391 "sign-return-address-with-bkey", 2);
1393 if (LangOpts.PointerAuthELFGOT)
1394 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-elf-got", 1);
1397 if (LangOpts.PointerAuthCalls)
1398 getModule().addModuleFlag(llvm::Module::Error,
1399 "ptrauth-sign-personality", 1);
1401 using namespace llvm::ELF;
1402 uint64_t PAuthABIVersion =
1403 (LangOpts.PointerAuthIntrinsics
1404 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1405 (LangOpts.PointerAuthCalls
1406 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1407 (LangOpts.PointerAuthReturns
1408 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1409 (LangOpts.PointerAuthAuthTraps
1410 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1411 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1412 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1413 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1414 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1415 (LangOpts.PointerAuthInitFini
1416 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1417 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1418 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1419 (LangOpts.PointerAuthELFGOT
1420 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1421 (LangOpts.PointerAuthIndirectGotos
1422 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1423 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1424 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1425 (LangOpts.PointerAuthFunctionTypeDiscrimination
1426 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1427 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1428 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1429 "Update when new enum items are defined");
1430 if (PAuthABIVersion != 0) {
1431 getModule().addModuleFlag(llvm::Module::Error,
1432 "aarch64-elf-pauthabi-platform",
1433 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1434 getModule().addModuleFlag(llvm::Module::Error,
1435 "aarch64-elf-pauthabi-version",
1440 if ((T.isARM() || T.isThumb()) &&
getTriple().isTargetAEABI() &&
1442 uint32_t TagVal = 0;
1443 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1445 llvm::DenormalMode::getPositiveZero()) {
1446 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1448 llvm::DenormalMode::getIEEE()) {
1449 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1450 DenormalTagBehavior = llvm::Module::Override;
1452 llvm::DenormalMode::getPreserveSign()) {
1453 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1455 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1460 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1461 llvm::ARMBuildAttrs::Allowed);
1464 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1466 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1467 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1471 if (CodeGenOpts.StackClashProtector)
1473 llvm::Module::Override,
"probe-stack",
1474 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1476 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1477 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1478 CodeGenOpts.StackProbeSize);
1480 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1481 llvm::LLVMContext &Ctx = TheModule.getContext();
1483 llvm::Module::Error,
"MemProfProfileFilename",
1484 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1487 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1491 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1492 CodeGenOpts.FP32DenormalMode.Output !=
1493 llvm::DenormalMode::IEEE);
1496 if (LangOpts.EHAsynch)
1497 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1500 if (CodeGenOpts.ImportCallOptimization)
1501 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1505 if (CodeGenOpts.getWinX64EHUnwindV2() != llvm::WinX64EHUnwindV2Mode::Disabled)
1507 llvm::Module::Warning,
"winx64-eh-unwindv2",
1508 static_cast<unsigned>(CodeGenOpts.getWinX64EHUnwindV2()));
1512 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1514 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1518 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1519 EmitOpenCLMetadata();
1526 auto Version = LangOpts.getOpenCLCompatibleVersion();
1527 llvm::Metadata *SPIRVerElts[] = {
1528 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1530 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1531 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1532 llvm::NamedMDNode *SPIRVerMD =
1533 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1534 llvm::LLVMContext &Ctx = TheModule.getContext();
1535 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1543 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1544 assert(PLevel < 3 &&
"Invalid PIC Level");
1545 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1546 if (Context.getLangOpts().PIE)
1547 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1551 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1552 .Case(
"tiny", llvm::CodeModel::Tiny)
1553 .Case(
"small", llvm::CodeModel::Small)
1554 .Case(
"kernel", llvm::CodeModel::Kernel)
1555 .Case(
"medium", llvm::CodeModel::Medium)
1556 .Case(
"large", llvm::CodeModel::Large)
1559 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1562 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1563 Context.getTargetInfo().getTriple().getArch() ==
1564 llvm::Triple::x86_64) {
1570 if (CodeGenOpts.NoPLT)
1573 CodeGenOpts.DirectAccessExternalData !=
1574 getModule().getDirectAccessExternalData()) {
1575 getModule().setDirectAccessExternalData(
1576 CodeGenOpts.DirectAccessExternalData);
1578 if (CodeGenOpts.UnwindTables)
1579 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1581 switch (CodeGenOpts.getFramePointer()) {
1586 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1589 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1592 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1595 getModule().setFramePointer(llvm::FramePointerKind::All);
1599 SimplifyPersonality();
1612 EmitVersionIdentMetadata();
1615 EmitCommandLineMetadata();
1623 getModule().setStackProtectorGuardSymbol(
1626 getModule().setStackProtectorGuardOffset(
1631 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1633 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1635 if (
getContext().getTargetInfo().getMaxTLSAlign())
1636 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1637 getContext().getTargetInfo().getMaxTLSAlign());
1655 if (!MustTailCallUndefinedGlobals.empty()) {
1657 for (
auto &I : MustTailCallUndefinedGlobals) {
1658 if (!I.first->isDefined())
1659 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1663 if (!Entry || Entry->isWeakForLinker() ||
1664 Entry->isDeclarationForLinker())
1665 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1669 for (
auto &I : MustTailCallUndefinedGlobals) {
1678 if (Entry->isDeclarationForLinker()) {
1681 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
1683 CalleeIsLocal = Entry->isDSOLocal();
1687 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
1698 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
1699 ErrnoTBAAMD->addOperand(IntegerNode);
1704void CodeGenModule::EmitOpenCLMetadata() {
1710 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1711 llvm::Metadata *OCLVerElts[] = {
1712 llvm::ConstantAsMetadata::get(
1713 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1714 llvm::ConstantAsMetadata::get(
1715 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1716 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1717 llvm::LLVMContext &Ctx = TheModule.getContext();
1718 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1721 EmitVersion(
"opencl.ocl.version", CLVersion);
1722 if (LangOpts.OpenCLCPlusPlus) {
1724 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1728void CodeGenModule::EmitBackendOptionsMetadata(
1729 const CodeGenOptions &CodeGenOpts) {
1731 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1732 CodeGenOpts.SmallDataLimit);
1736 if (LangOpts.AllocTokenMode) {
1737 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
1738 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
1739 llvm::MDString::get(VMContext, S));
1741 if (LangOpts.AllocTokenMax)
1743 llvm::Module::Error,
"alloc-token-max",
1744 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1745 *LangOpts.AllocTokenMax));
1746 if (CodeGenOpts.SanitizeAllocTokenFastABI)
1747 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
1748 if (CodeGenOpts.SanitizeAllocTokenExtended)
1749 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
1765 return TBAA->getTypeInfo(QTy);
1784 return TBAA->getAccessInfo(AccessType);
1791 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1797 return TBAA->getTBAAStructInfo(QTy);
1803 return TBAA->getBaseTypeInfo(QTy);
1809 return TBAA->getAccessTagInfo(Info);
1816 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1824 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1832 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1838 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1843 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1855 std::string Msg =
Type;
1857 diag::err_codegen_unsupported)
1863 diag::err_codegen_unsupported)
1870 std::string Msg =
Type;
1872 diag::err_codegen_unsupported)
1877 llvm::function_ref<
void()> Fn) {
1878 StackHandler.runWithSufficientStackSpace(Loc, Fn);
1888 if (GV->hasLocalLinkage()) {
1889 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1902 if (Context.getLangOpts().OpenMP &&
1903 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
1904 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
1905 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
1906 OMPDeclareTargetDeclAttr::DT_NoHost &&
1908 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1915 if (Context.getLangOpts().CUDAIsDevice &&
1917 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
1918 bool NeedsProtected =
false;
1922 else if (
const auto *VD = dyn_cast<VarDecl>(D))
1923 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
1924 VD->hasAttr<CUDAConstantAttr>() ||
1925 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
1926 VD->getType()->isCUDADeviceBuiltinTextureType();
1927 if (NeedsProtected) {
1928 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1934 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
1938 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
1942 if (GV->hasDLLExportStorageClass()) {
1945 diag::err_hidden_visibility_dllexport);
1948 diag::err_non_default_visibility_dllimport);
1954 !GV->isDeclarationForLinker())
1959 llvm::GlobalValue *GV) {
1960 if (GV->hasLocalLinkage())
1963 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
1967 if (GV->hasDLLImportStorageClass())
1970 const llvm::Triple &TT = CGM.
getTriple();
1972 if (TT.isOSCygMing()) {
1990 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
1998 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
2002 if (!TT.isOSBinFormatELF())
2008 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2016 return !(CGM.
getLangOpts().SemanticInterposition ||
2021 if (!GV->isDeclarationForLinker())
2027 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2034 if (CGOpts.DirectAccessExternalData) {
2040 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2041 if (!Var->isThreadLocal())
2066 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2068 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2078 if (D->
hasAttr<DLLImportAttr>())
2079 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2080 else if ((D->
hasAttr<DLLExportAttr>() ||
2082 !GV->isDeclarationForLinker())
2083 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2103 GV->setPartition(CodeGenOpts.SymbolPartition);
2107 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2108 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2109 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2110 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2111 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2114llvm::GlobalVariable::ThreadLocalMode
2116 switch (CodeGenOpts.getDefaultTLSModel()) {
2118 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2120 return llvm::GlobalVariable::LocalDynamicTLSModel;
2122 return llvm::GlobalVariable::InitialExecTLSModel;
2124 return llvm::GlobalVariable::LocalExecTLSModel;
2126 llvm_unreachable(
"Invalid TLS model!");
2130 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2132 llvm::GlobalValue::ThreadLocalMode TLM;
2136 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2140 GV->setThreadLocalMode(TLM);
2146 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2150 const CPUSpecificAttr *
Attr,
2172 bool OmitMultiVersionMangling =
false) {
2174 llvm::raw_svector_ostream Out(Buffer);
2183 assert(II &&
"Attempt to mangle unnamed decl.");
2184 const auto *FD = dyn_cast<FunctionDecl>(ND);
2189 Out <<
"__regcall4__" << II->
getName();
2191 Out <<
"__regcall3__" << II->
getName();
2192 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2194 Out <<
"__device_stub__" << II->
getName();
2196 DeviceKernelAttr::isOpenCLSpelling(
2197 FD->getAttr<DeviceKernelAttr>()) &&
2199 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2215 "Hash computed when not explicitly requested");
2219 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2220 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2221 switch (FD->getMultiVersionKind()) {
2225 FD->getAttr<CPUSpecificAttr>(),
2229 auto *
Attr = FD->getAttr<TargetAttr>();
2230 assert(
Attr &&
"Expected TargetAttr to be present "
2231 "for attribute mangling");
2237 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2238 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2239 "for attribute mangling");
2245 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2246 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2247 "for attribute mangling");
2254 llvm_unreachable(
"None multiversion type isn't valid here");
2264 return std::string(Out.str());
2267void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2268 const FunctionDecl *FD,
2269 StringRef &CurName) {
2276 std::string NonTargetName =
2284 "Other GD should now be a multiversioned function");
2294 if (OtherName != NonTargetName) {
2297 const auto ExistingRecord = Manglings.find(NonTargetName);
2298 if (ExistingRecord != std::end(Manglings))
2299 Manglings.remove(&(*ExistingRecord));
2300 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2305 CurName = OtherNameRef;
2307 Entry->setName(OtherName);
2317 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2331 auto FoundName = MangledDeclNames.find(CanonicalGD);
2332 if (FoundName != MangledDeclNames.end())
2333 return FoundName->second;
2370 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2371 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2380 llvm::raw_svector_ostream Out(Buffer);
2383 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2384 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2386 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2391 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2392 return Result.first->first();
2396 auto it = MangledDeclNames.begin();
2397 while (it != MangledDeclNames.end()) {
2398 if (it->second == Name)
2413 llvm::Constant *AssociatedData) {
2415 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2421 bool IsDtorAttrFunc) {
2422 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2424 DtorsUsingAtExit[Priority].push_back(Dtor);
2429 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2432void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2433 if (Fns.empty())
return;
2439 llvm::PointerType *PtrTy = llvm::PointerType::get(
2440 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2443 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2447 auto Ctors = Builder.beginArray(CtorStructTy);
2448 for (
const auto &I : Fns) {
2449 auto Ctor = Ctors.beginStruct(CtorStructTy);
2450 Ctor.addInt(
Int32Ty, I.Priority);
2451 if (InitFiniAuthSchema) {
2452 llvm::Constant *StorageAddress =
2454 ? llvm::ConstantExpr::getIntToPtr(
2455 llvm::ConstantInt::get(
2457 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2461 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2462 llvm::ConstantInt::get(
2464 Ctor.add(SignedCtorPtr);
2466 Ctor.add(I.Initializer);
2468 if (I.AssociatedData)
2469 Ctor.add(I.AssociatedData);
2471 Ctor.addNullPointer(PtrTy);
2472 Ctor.finishAndAddTo(Ctors);
2475 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2477 llvm::GlobalValue::AppendingLinkage);
2481 List->setAlignment(std::nullopt);
2486llvm::GlobalValue::LinkageTypes
2492 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2499 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2500 if (!MDS)
return nullptr;
2502 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2509 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2510 if (!UD->
hasAttr<TransparentUnionAttr>())
2512 if (!UD->
fields().empty())
2513 return UD->
fields().begin()->getType();
2522 bool GeneralizePointers) {
2535 bool GeneralizePointers) {
2538 for (
auto &Param : FnType->param_types())
2539 GeneralizedParams.push_back(
2543 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2544 GeneralizedParams, FnType->getExtProtoInfo());
2549 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2551 llvm_unreachable(
"Encountered unknown FunctionType");
2559 FnType->getReturnType(), FnType->getParamTypes(),
2560 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2562 std::string OutName;
2563 llvm::raw_string_ostream Out(OutName);
2571 Out <<
".normalized";
2573 Out <<
".generalized";
2575 return llvm::ConstantInt::get(
2581 llvm::Function *F,
bool IsThunk) {
2583 llvm::AttributeList PAL;
2586 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2590 Loc = D->getLocation();
2592 Error(Loc,
"__vectorcall calling convention is not currently supported");
2594 F->setAttributes(PAL);
2595 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2599 std::string ReadOnlyQual(
"__read_only");
2600 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2601 if (ReadOnlyPos != std::string::npos)
2603 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2605 std::string WriteOnlyQual(
"__write_only");
2606 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2607 if (WriteOnlyPos != std::string::npos)
2608 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2610 std::string ReadWriteQual(
"__read_write");
2611 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2612 if (ReadWritePos != std::string::npos)
2613 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2646 assert(((FD && CGF) || (!FD && !CGF)) &&
2647 "Incorrect use - FD and CGF should either be both null or not!");
2673 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2676 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2681 std::string typeQuals;
2685 const Decl *PDecl = parm;
2687 PDecl = TD->getDecl();
2688 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2689 if (A && A->isWriteOnly())
2690 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2691 else if (A && A->isReadWrite())
2692 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2694 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2696 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2698 auto getTypeSpelling = [&](
QualType Ty) {
2699 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2701 if (Ty.isCanonical()) {
2702 StringRef typeNameRef = typeName;
2704 if (typeNameRef.consume_front(
"unsigned "))
2705 return std::string(
"u") + typeNameRef.str();
2706 if (typeNameRef.consume_front(
"signed "))
2707 return typeNameRef.str();
2717 addressQuals.push_back(
2718 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2722 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2723 std::string baseTypeName =
2725 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2726 argBaseTypeNames.push_back(
2727 llvm::MDString::get(VMContext, baseTypeName));
2731 typeQuals =
"restrict";
2734 typeQuals += typeQuals.empty() ?
"const" :
" const";
2736 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2738 uint32_t AddrSpc = 0;
2743 addressQuals.push_back(
2744 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2748 std::string typeName = getTypeSpelling(ty);
2760 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2761 argBaseTypeNames.push_back(
2762 llvm::MDString::get(VMContext, baseTypeName));
2767 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2771 Fn->setMetadata(
"kernel_arg_addr_space",
2772 llvm::MDNode::get(VMContext, addressQuals));
2773 Fn->setMetadata(
"kernel_arg_access_qual",
2774 llvm::MDNode::get(VMContext, accessQuals));
2775 Fn->setMetadata(
"kernel_arg_type",
2776 llvm::MDNode::get(VMContext, argTypeNames));
2777 Fn->setMetadata(
"kernel_arg_base_type",
2778 llvm::MDNode::get(VMContext, argBaseTypeNames));
2779 Fn->setMetadata(
"kernel_arg_type_qual",
2780 llvm::MDNode::get(VMContext, argTypeQuals));
2784 Fn->setMetadata(
"kernel_arg_name",
2785 llvm::MDNode::get(VMContext, argNames));
2795 if (!LangOpts.Exceptions)
return false;
2798 if (LangOpts.CXXExceptions)
return true;
2801 if (LangOpts.ObjCExceptions) {
2821SmallVector<const CXXRecordDecl *, 0>
2823 llvm::SetVector<const CXXRecordDecl *> MostBases;
2828 MostBases.insert(RD);
2830 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2832 CollectMostBases(RD);
2833 return MostBases.takeVector();
2837 llvm::Function *F) {
2838 llvm::AttrBuilder B(F->getContext());
2840 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2841 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2843 if (CodeGenOpts.StackClashProtector)
2844 B.addAttribute(
"probe-stack",
"inline-asm");
2846 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2847 B.addAttribute(
"stack-probe-size",
2848 std::to_string(CodeGenOpts.StackProbeSize));
2851 B.addAttribute(llvm::Attribute::NoUnwind);
2853 if (std::optional<llvm::Attribute::AttrKind>
Attr =
2855 B.addAttribute(*
Attr);
2860 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2861 B.addAttribute(llvm::Attribute::AlwaysInline);
2865 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2867 B.addAttribute(llvm::Attribute::NoInline);
2875 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2876 B.addAttribute(
"aarch64_pstate_sm_body");
2879 if (
Attr->isNewZA())
2880 B.addAttribute(
"aarch64_new_za");
2881 if (
Attr->isNewZT0())
2882 B.addAttribute(
"aarch64_new_zt0");
2887 bool ShouldAddOptNone =
2888 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2890 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
2891 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
2894 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
2895 !D->
hasAttr<NoInlineAttr>()) {
2896 B.addAttribute(llvm::Attribute::AlwaysInline);
2897 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
2898 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2900 B.addAttribute(llvm::Attribute::OptimizeNone);
2903 B.addAttribute(llvm::Attribute::NoInline);
2908 B.addAttribute(llvm::Attribute::Naked);
2911 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
2912 F->removeFnAttr(llvm::Attribute::MinSize);
2913 }
else if (D->
hasAttr<NakedAttr>()) {
2915 B.addAttribute(llvm::Attribute::Naked);
2916 B.addAttribute(llvm::Attribute::NoInline);
2917 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
2918 B.addAttribute(llvm::Attribute::NoDuplicate);
2919 }
else if (D->
hasAttr<NoInlineAttr>() &&
2920 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2922 B.addAttribute(llvm::Attribute::NoInline);
2923 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
2924 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
2926 B.addAttribute(llvm::Attribute::AlwaysInline);
2930 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
2931 B.addAttribute(llvm::Attribute::NoInline);
2935 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2938 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
2939 return Redecl->isInlineSpecified();
2941 if (any_of(FD->
redecls(), CheckRedeclForInline))
2946 return any_of(Pattern->
redecls(), CheckRedeclForInline);
2948 if (CheckForInline(FD)) {
2949 B.addAttribute(llvm::Attribute::InlineHint);
2950 }
else if (CodeGenOpts.getInlining() ==
2953 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2954 B.addAttribute(llvm::Attribute::NoInline);
2961 if (!D->
hasAttr<OptimizeNoneAttr>()) {
2963 if (!ShouldAddOptNone)
2964 B.addAttribute(llvm::Attribute::OptimizeForSize);
2965 B.addAttribute(llvm::Attribute::Cold);
2968 B.addAttribute(llvm::Attribute::Hot);
2969 if (D->
hasAttr<MinSizeAttr>())
2970 B.addAttribute(llvm::Attribute::MinSize);
2975 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
2976 B.addAttribute(llvm::Attribute::NoOutline);
2980 llvm::MaybeAlign ExplicitAlignment;
2981 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
2982 ExplicitAlignment = llvm::Align(alignment);
2983 else if (LangOpts.FunctionAlignment)
2984 ExplicitAlignment = llvm::Align(1ull << LangOpts.FunctionAlignment);
2986 if (ExplicitAlignment) {
2987 F->setAlignment(ExplicitAlignment);
2988 F->setPreferredAlignment(ExplicitAlignment);
2989 }
else if (LangOpts.PreferredFunctionAlignment) {
2990 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
2999 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
3004 if (CodeGenOpts.SanitizeCfiCrossDso &&
3005 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
3006 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3014 if (CodeGenOpts.CallGraphSection) {
3015 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3022 auto *MD = dyn_cast<CXXMethodDecl>(D);
3025 llvm::Metadata *Id =
3027 MD->getType(), std::nullopt,
Base));
3028 F->addTypeMetadata(0, Id);
3035 if (isa_and_nonnull<NamedDecl>(D))
3038 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3040 if (D && D->
hasAttr<UsedAttr>())
3043 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3045 ((CodeGenOpts.KeepPersistentStorageVariables &&
3046 (VD->getStorageDuration() ==
SD_Static ||
3047 VD->getStorageDuration() ==
SD_Thread)) ||
3048 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3049 VD->getType().isConstQualified())))
3054static std::vector<std::string>
3056 llvm::StringMap<bool> &FeatureMap) {
3057 llvm::StringMap<bool> DefaultFeatureMap;
3061 std::vector<std::string> Delta;
3062 for (
const auto &[K,
V] : FeatureMap) {
3063 auto DefaultIt = DefaultFeatureMap.find(K);
3064 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3065 Delta.push_back((
V ?
"+" :
"-") + K.str());
3071bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3072 llvm::AttrBuilder &Attrs,
3073 bool SetTargetFeatures) {
3079 std::vector<std::string> Features;
3080 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3083 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3084 assert((!TD || !TV) &&
"both target_version and target specified");
3087 bool AddedAttr =
false;
3088 if (TD || TV || SD || TC) {
3089 llvm::StringMap<bool> FeatureMap;
3096 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3099 if (!FeatureStr.empty()) {
3100 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3101 if (!ParsedAttr.
CPU.empty() &&
3103 TargetCPU = ParsedAttr.
CPU;
3106 if (!ParsedAttr.
Tune.empty() &&
3108 TuneCPU = ParsedAttr.
Tune;
3124 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3125 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3126 Entry.getKey().str());
3132 llvm::StringMap<bool> FeatureMap;
3146 if (!TargetCPU.empty()) {
3147 Attrs.addAttribute(
"target-cpu", TargetCPU);
3150 if (!TuneCPU.empty()) {
3151 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3154 if (!Features.empty() && SetTargetFeatures) {
3155 llvm::erase_if(Features, [&](
const std::string& F) {
3158 llvm::sort(Features);
3159 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3164 llvm::SmallVector<StringRef, 8> Feats;
3165 bool IsDefault =
false;
3167 IsDefault = TV->isDefaultVersion();
3168 TV->getFeatures(Feats);
3174 Attrs.addAttribute(
"fmv-features");
3176 }
else if (!Feats.empty()) {
3178 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3179 std::string FMVFeatures;
3180 for (StringRef F : OrderedFeats)
3181 FMVFeatures.append(
"," + F.str());
3182 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3189void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3190 llvm::GlobalObject *GO) {
3195 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3198 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3199 GV->addAttribute(
"bss-section", SA->getName());
3200 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3201 GV->addAttribute(
"data-section", SA->getName());
3202 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3203 GV->addAttribute(
"rodata-section", SA->getName());
3204 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3205 GV->addAttribute(
"relro-section", SA->getName());
3208 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3211 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3212 if (!D->
getAttr<SectionAttr>())
3213 F->setSection(SA->getName());
3215 llvm::AttrBuilder Attrs(F->getContext());
3216 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3220 llvm::AttributeMask RemoveAttrs;
3221 RemoveAttrs.addAttribute(
"target-cpu");
3222 RemoveAttrs.addAttribute(
"target-features");
3223 RemoveAttrs.addAttribute(
"fmv-features");
3224 RemoveAttrs.addAttribute(
"tune-cpu");
3225 F->removeFnAttrs(RemoveAttrs);
3226 F->addFnAttrs(Attrs);
3230 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3231 GO->setSection(CSA->getName());
3232 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3233 GO->setSection(SA->getName());
3246 F->setLinkage(llvm::Function::InternalLinkage);
3248 setNonAliasAttributes(GD, F);
3259 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3263 llvm::MDNode *MD = F->getMetadata(llvm::LLVMContext::MD_type);
3264 return MD && MD->hasGeneralizedMDString();
3268 llvm::Function *F) {
3275 if (!F->hasLocalLinkage() ||
3276 F->getFunction().hasAddressTaken(
nullptr,
true,
3283 llvm::Function *F) {
3285 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3296 F->addTypeMetadata(0, MD);
3305 if (CodeGenOpts.SanitizeCfiCrossDso)
3307 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3311 llvm::CallBase *CB) {
3316 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall() ||
3321 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
3322 getLLVMContext(), {llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
3325 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3326 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3330 llvm::LLVMContext &Ctx = F->getContext();
3331 llvm::MDBuilder MDB(Ctx);
3332 llvm::StringRef Salt;
3335 if (
const auto &Info = FP->getExtraAttributeInfo())
3336 Salt = Info.CFISalt;
3338 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3347 return llvm::all_of(Name, [](
const char &
C) {
3348 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3354 for (
auto &F : M.functions()) {
3356 bool AddressTaken = F.hasAddressTaken();
3357 if (!AddressTaken && F.hasLocalLinkage())
3358 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3363 if (!AddressTaken || !F.isDeclaration())
3366 const llvm::ConstantInt *
Type;
3367 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3368 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3372 StringRef Name = F.getName();
3376 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3377 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3378 Twine(
Type->getSExtValue()) +
" */\n")
3380 M.appendModuleInlineAsm(
Asm);
3384void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3385 bool IsIncompleteFunction,
3388 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3396 if (!IsIncompleteFunction)
3403 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3405 assert(!F->arg_empty() &&
3406 F->arg_begin()->getType()
3407 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3408 "unexpected this return");
3409 F->addParamAttr(0, llvm::Attribute::Returned);
3419 if (!IsIncompleteFunction && F->isDeclaration())
3422 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3423 F->setSection(CSA->getName());
3424 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3425 F->setSection(SA->getName());
3427 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3429 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3430 else if (EA->isWarning())
3431 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3436 const FunctionDecl *FDBody;
3437 bool HasBody = FD->
hasBody(FDBody);
3439 assert(HasBody &&
"Inline builtin declarations should always have an "
3441 if (shouldEmitFunction(FDBody))
3442 F->addFnAttr(llvm::Attribute::NoBuiltin);
3448 F->addFnAttr(llvm::Attribute::NoBuiltin);
3452 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3453 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3454 if (MD->isVirtual())
3455 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3461 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3462 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3465 if (CodeGenOpts.CallGraphSection)
3468 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3474 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3475 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3477 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3481 llvm::LLVMContext &Ctx = F->getContext();
3482 llvm::MDBuilder MDB(Ctx);
3486 int CalleeIdx = *CB->encoding_begin();
3487 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3488 F->addMetadata(llvm::LLVMContext::MD_callback,
3489 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3490 CalleeIdx, PayloadIndices,
3497 "Only globals with definition can force usage.");
3498 LLVMUsed.emplace_back(GV);
3502 assert(!GV->isDeclaration() &&
3503 "Only globals with definition can force usage.");
3504 LLVMCompilerUsed.emplace_back(GV);
3509 "Only globals with definition can force usage.");
3511 LLVMCompilerUsed.emplace_back(GV);
3513 LLVMUsed.emplace_back(GV);
3517 std::vector<llvm::WeakTrackingVH> &List) {
3524 UsedArray.resize(List.size());
3525 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3527 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3531 if (UsedArray.empty())
3533 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3535 auto *GV =
new llvm::GlobalVariable(
3536 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3537 llvm::ConstantArray::get(ATy, UsedArray), Name);
3539 GV->setSection(
"llvm.metadata");
3542void CodeGenModule::emitLLVMUsed() {
3543 emitUsed(*
this,
"llvm.used", LLVMUsed);
3544 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3549 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3558 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3564 ELFDependentLibraries.push_back(
3565 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3572 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3581 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3587 if (Visited.insert(Import).second)
3604 if (LL.IsFramework) {
3605 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3606 llvm::MDString::get(Context, LL.Library)};
3608 Metadata.push_back(llvm::MDNode::get(Context, Args));
3614 llvm::Metadata *Args[2] = {
3615 llvm::MDString::get(Context,
"lib"),
3616 llvm::MDString::get(Context, LL.Library),
3618 Metadata.push_back(llvm::MDNode::get(Context, Args));
3622 auto *OptString = llvm::MDString::get(Context, Opt);
3623 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3628void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3630 "We should only emit module initializers for named modules.");
3638 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3655 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
3661void CodeGenModule::EmitModuleLinkOptions() {
3665 llvm::SetVector<clang::Module *> LinkModules;
3666 llvm::SmallPtrSet<clang::Module *, 16> Visited;
3667 SmallVector<clang::Module *, 16> Stack;
3670 for (
Module *M : ImportedModules) {
3673 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3676 if (Visited.insert(M).second)
3682 while (!Stack.empty()) {
3685 bool AnyChildren =
false;
3694 if (Visited.insert(
SM).second) {
3695 Stack.push_back(
SM);
3703 LinkModules.insert(Mod);
3710 SmallVector<llvm::MDNode *, 16> MetadataArgs;
3712 for (
Module *M : LinkModules)
3713 if (Visited.insert(M).second)
3715 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3716 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3719 if (!LinkerOptionsMetadata.empty()) {
3720 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3721 for (
auto *MD : LinkerOptionsMetadata)
3722 NMD->addOperand(MD);
3726void CodeGenModule::EmitDeferred() {
3735 if (!DeferredVTables.empty()) {
3736 EmitDeferredVTables();
3741 assert(DeferredVTables.empty());
3748 llvm::append_range(DeferredDeclsToEmit,
3752 if (DeferredDeclsToEmit.empty())
3757 std::vector<GlobalDecl> CurDeclsToEmit;
3758 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3760 for (GlobalDecl &D : CurDeclsToEmit) {
3766 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
3770 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
3786 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3804 if (!GV->isDeclaration())
3808 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3812 EmitGlobalDefinition(D, GV);
3817 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3819 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3824void CodeGenModule::EmitVTablesOpportunistically() {
3830 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3831 &&
"Only emit opportunistic vtables with optimizations");
3833 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
3835 "This queue should only contain external vtables");
3836 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3837 VTables.GenerateClassData(RD);
3839 OpportunisticVTables.clear();
3843 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3848 DeferredAnnotations.clear();
3850 if (Annotations.empty())
3854 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3855 Annotations[0]->
getType(), Annotations.size()), Annotations);
3856 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3857 llvm::GlobalValue::AppendingLinkage,
3858 Array,
"llvm.global.annotations");
3863 llvm::Constant *&AStr = AnnotationStrings[Str];
3868 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3869 auto *gv =
new llvm::GlobalVariable(
3870 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3871 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3874 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3891 SM.getExpansionLineNumber(L);
3892 return llvm::ConstantInt::get(
Int32Ty, LineNo);
3900 llvm::FoldingSetNodeID ID;
3901 for (
Expr *E : Exprs) {
3904 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
3909 LLVMArgs.reserve(Exprs.size());
3911 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
3913 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
3916 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
3917 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
3918 llvm::GlobalValue::PrivateLinkage,
Struct,
3921 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3928 const AnnotateAttr *AA,
3936 llvm::Constant *GVInGlobalsAS = GV;
3937 if (GV->getAddressSpace() !=
3939 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
3941 llvm::PointerType::get(
3942 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
3946 llvm::Constant *Fields[] = {
3947 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
3949 return llvm::ConstantStruct::getAnon(Fields);
3953 llvm::GlobalValue *GV) {
3954 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
3964 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
3967 auto &
SM = Context.getSourceManager();
3969 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
3974 return NoSanitizeL.containsLocation(Kind, Loc);
3977 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
3981 llvm::GlobalVariable *GV,
3983 StringRef Category)
const {
3985 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
3987 auto &
SM = Context.getSourceManager();
3988 if (NoSanitizeL.containsMainFile(
3989 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
3992 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
3999 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
4000 Ty = AT->getElementType();
4005 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4013 StringRef Category)
const {
4016 auto Attr = ImbueAttr::NONE;
4018 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4019 if (
Attr == ImbueAttr::NONE)
4020 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4022 case ImbueAttr::NONE:
4024 case ImbueAttr::ALWAYS:
4025 Fn->addFnAttr(
"function-instrument",
"xray-always");
4027 case ImbueAttr::ALWAYS_ARG1:
4028 Fn->addFnAttr(
"function-instrument",
"xray-always");
4029 Fn->addFnAttr(
"xray-log-args",
"1");
4031 case ImbueAttr::NEVER:
4032 Fn->addFnAttr(
"function-instrument",
"xray-never");
4045 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4055 auto &
SM = Context.getSourceManager();
4056 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
4070 if (NumGroups > 1) {
4071 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4080 if (LangOpts.EmitAllDecls)
4083 const auto *VD = dyn_cast<VarDecl>(
Global);
4085 ((CodeGenOpts.KeepPersistentStorageVariables &&
4086 (VD->getStorageDuration() ==
SD_Static ||
4087 VD->getStorageDuration() ==
SD_Thread)) ||
4088 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4089 VD->getType().isConstQualified())))
4102 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4103 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4104 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4105 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4109 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4119 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4122 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4123 if (Context.getInlineVariableDefinitionKind(VD) ==
4128 if (CXX20ModuleInits && VD->getOwningModule() &&
4129 !VD->getOwningModule()->isModuleMapModule()) {
4138 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4141 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4154 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4158 llvm::Constant *
Init;
4161 if (!
V.isAbsent()) {
4172 llvm::Constant *Fields[4] = {
4176 llvm::ConstantDataArray::getRaw(
4177 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4179 Init = llvm::ConstantStruct::getAnon(Fields);
4182 auto *GV =
new llvm::GlobalVariable(
4184 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4186 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4189 if (!
V.isAbsent()) {
4202 llvm::GlobalVariable **Entry =
nullptr;
4203 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4208 llvm::Constant *
Init;
4212 assert(!
V.isAbsent());
4216 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4218 llvm::GlobalValue::PrivateLinkage,
Init,
4220 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4234 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4238 llvm::Constant *
Init =
Emitter.emitForInitializer(
4246 llvm::GlobalValue::LinkageTypes
Linkage =
4248 ? llvm::GlobalValue::LinkOnceODRLinkage
4249 : llvm::GlobalValue::InternalLinkage;
4250 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4254 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4261 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4262 assert(AA &&
"No alias?");
4272 llvm::Constant *Aliasee;
4274 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4282 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4283 WeakRefReferences.insert(F);
4291 if (
auto *A = D->
getAttr<AttrT>())
4292 return A->isImplicit();
4299 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4302 const auto *AA =
Global->getAttr<AliasAttr>();
4310 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4311 if (LangOpts.OpenMPIsTargetDevice)
4312 return !AliaseeDecl ||
4313 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4316 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4317 const bool AliaseeHasDeviceAttr =
4318 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4320 if (LangOpts.CUDAIsDevice)
4321 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4328bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4329 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4334 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4335 Global->hasAttr<CUDAConstantAttr>() ||
4336 Global->hasAttr<CUDASharedAttr>() ||
4337 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4338 Global->getType()->isCUDADeviceBuiltinTextureType();
4345 if (
Global->hasAttr<WeakRefAttr>())
4350 if (
Global->hasAttr<AliasAttr>()) {
4353 return EmitAliasDefinition(GD);
4357 if (
Global->hasAttr<IFuncAttr>())
4358 return emitIFuncDefinition(GD);
4361 if (
Global->hasAttr<CPUDispatchAttr>())
4362 return emitCPUDispatchDefinition(GD);
4367 if (LangOpts.CUDA) {
4369 "Expected Variable or Function");
4370 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4371 if (!shouldEmitCUDAGlobalVar(VD))
4373 }
else if (LangOpts.CUDAIsDevice) {
4374 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4375 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4376 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4380 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4381 !
Global->hasAttr<CUDAGlobalAttr>() &&
4383 !
Global->hasAttr<CUDAHostAttr>()))
4386 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4387 Global->hasAttr<CUDADeviceAttr>())
4391 if (LangOpts.OpenMP) {
4393 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4395 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4396 if (MustBeEmitted(
Global))
4400 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4401 if (MustBeEmitted(
Global))
4408 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4409 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4415 if (FD->
hasAttr<AnnotateAttr>()) {
4418 DeferredAnnotations[MangledName] = FD;
4433 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4439 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4441 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4442 if (LangOpts.OpenMP) {
4444 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4445 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4449 if (VD->hasExternalStorage() &&
4450 Res != OMPDeclareTargetDeclAttr::MT_Link)
4453 bool UnifiedMemoryEnabled =
4455 if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4456 *Res == OMPDeclareTargetDeclAttr::MT_Enter ||
4457 *Res == OMPDeclareTargetDeclAttr::MT_Local) &&
4458 !UnifiedMemoryEnabled) {
4461 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4462 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4463 *Res == OMPDeclareTargetDeclAttr::MT_Enter ||
4464 *Res == OMPDeclareTargetDeclAttr::MT_Local) &&
4465 UnifiedMemoryEnabled)) &&
4466 "Link clause or to clause with unified memory expected.");
4476 if (LangOpts.HLSL) {
4477 if (VD->getStorageClass() ==
SC_Extern) {
4486 if (Context.getInlineVariableDefinitionKind(VD) ==
4496 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4498 EmitGlobalDefinition(GD);
4499 addEmittedDeferredDecl(GD);
4507 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4508 CXXGlobalInits.push_back(
nullptr);
4514 addDeferredDeclToEmit(GD);
4515 }
else if (MustBeEmitted(
Global)) {
4517 assert(!MayBeEmittedEagerly(
Global));
4518 addDeferredDeclToEmit(GD);
4523 DeferredDecls[MangledName] = GD;
4529 if (
const auto *RT =
4530 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4531 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4532 RD = RD->getDefinitionOrSelf();
4533 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4541 struct FunctionIsDirectlyRecursive
4542 :
public ConstStmtVisitor<FunctionIsDirectlyRecursive, bool> {
4543 const StringRef Name;
4544 const Builtin::Context &BI;
4545 FunctionIsDirectlyRecursive(StringRef N,
const Builtin::Context &
C)
4548 bool VisitCallExpr(
const CallExpr *E) {
4552 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4553 if (Attr && Name == Attr->getLabel())
4558 std::string BuiltinNameStr = BI.
getName(BuiltinID);
4559 StringRef BuiltinName = BuiltinNameStr;
4560 return BuiltinName.consume_front(
"__builtin_") && Name == BuiltinName;
4563 bool VisitStmt(
const Stmt *S) {
4564 for (
const Stmt *Child : S->
children())
4565 if (Child && this->Visit(Child))
4572 struct DLLImportFunctionVisitor
4573 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4574 bool SafeToInline =
true;
4576 bool shouldVisitImplicitCode()
const {
return true; }
4578 bool VisitVarDecl(VarDecl *VD) {
4581 SafeToInline =
false;
4582 return SafeToInline;
4589 return SafeToInline;
4592 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4594 SafeToInline = D->
hasAttr<DLLImportAttr>();
4595 return SafeToInline;
4598 bool VisitDeclRefExpr(DeclRefExpr *E) {
4601 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4602 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4603 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4604 return SafeToInline;
4607 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4609 return SafeToInline;
4612 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4616 SafeToInline =
true;
4618 SafeToInline = M->
hasAttr<DLLImportAttr>();
4620 return SafeToInline;
4623 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4625 return SafeToInline;
4628 bool VisitCXXNewExpr(CXXNewExpr *E) {
4630 return SafeToInline;
4639CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4641 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4643 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4646 Name = Attr->getLabel();
4651 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
4652 const Stmt *Body = FD->
getBody();
4653 return Body ? Walker.Visit(Body) :
false;
4656bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4663 if (F->isInlineBuiltinDeclaration())
4666 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4671 if (
const Module *M = F->getOwningModule();
4672 M && M->getTopLevelModule()->isNamedModule() &&
4673 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4683 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4688 if (F->hasAttr<NoInlineAttr>())
4691 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4693 DLLImportFunctionVisitor Visitor;
4694 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4695 if (!Visitor.SafeToInline)
4698 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4701 for (
const Decl *
Member : Dtor->getParent()->decls())
4705 for (
const CXXBaseSpecifier &B : Dtor->getParent()->bases())
4716 return !isTriviallyRecursive(F);
4719bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4720 return CodeGenOpts.OptimizationLevel > 0;
4723void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
4724 llvm::GlobalValue *GV) {
4728 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4729 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4731 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4732 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4733 if (TC->isFirstOfVersion(I))
4736 EmitGlobalFunctionDefinition(GD, GV);
4742 AddDeferredMultiVersionResolverToEmit(GD);
4744 GetOrCreateMultiVersionResolver(GD);
4748void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
4751 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
4752 Context.getSourceManager(),
4753 "Generating code for declaration");
4755 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4758 if (!shouldEmitFunction(GD))
4761 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4763 llvm::raw_string_ostream
OS(Name);
4769 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4773 ABI->emitCXXStructor(GD);
4775 EmitMultiVersionFunctionDefinition(GD, GV);
4777 EmitGlobalFunctionDefinition(GD, GV);
4786 return EmitMultiVersionFunctionDefinition(GD, GV);
4787 return EmitGlobalFunctionDefinition(GD, GV);
4790 if (
const auto *VD = dyn_cast<VarDecl>(D))
4791 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4793 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4797 llvm::Function *NewFn);
4813static llvm::GlobalValue::LinkageTypes
4817 return llvm::GlobalValue::InternalLinkage;
4818 return llvm::GlobalValue::WeakODRLinkage;
4821void CodeGenModule::emitMultiVersionFunctions() {
4822 std::vector<GlobalDecl> MVFuncsToEmit;
4823 MultiVersionFuncs.swap(MVFuncsToEmit);
4824 for (GlobalDecl GD : MVFuncsToEmit) {
4826 assert(FD &&
"Expected a FunctionDecl");
4828 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
4829 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
4833 if (
Decl->isDefined()) {
4834 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4842 assert(
Func &&
"This should have just been created");
4850 bool ShouldEmitResolver = !
getTriple().isAArch64();
4851 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4852 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
4855 FD, [&](
const FunctionDecl *CurFD) {
4856 llvm::SmallVector<StringRef, 8> Feats;
4859 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4861 TA->getX86AddedFeatures(Feats);
4862 llvm::Function *
Func = createFunction(CurFD);
4863 DeclMap.insert({
Func, CurFD});
4864 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
4865 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4866 if (TVA->isDefaultVersion() && IsDefined)
4867 ShouldEmitResolver =
true;
4868 llvm::Function *
Func = createFunction(CurFD);
4869 DeclMap.insert({
Func, CurFD});
4871 TVA->getFeatures(Feats, Delim);
4872 Options.emplace_back(
Func, Feats);
4873 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4874 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4875 if (!TC->isFirstOfVersion(I))
4877 if (TC->isDefaultVersion(I) && IsDefined)
4878 ShouldEmitResolver =
true;
4879 llvm::Function *
Func = createFunction(CurFD, I);
4880 DeclMap.insert({
Func, CurFD});
4883 TC->getX86Feature(Feats, I);
4884 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
4887 TC->getFeatures(Feats, I, Delim);
4888 Options.emplace_back(
Func, Feats);
4892 llvm_unreachable(
"unexpected MultiVersionKind");
4895 if (!ShouldEmitResolver)
4898 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
4899 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
4900 ResolverConstant = IFunc->getResolver();
4905 *
this, GD, FD,
true);
4912 auto *Alias = llvm::GlobalAlias::create(
4914 MangledName +
".ifunc", IFunc, &
getModule());
4923 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
4924 const CodeGenFunction::FMVResolverOption &RHS) {
4930 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
4931 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
4932 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
4933 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
4934 return LHS.isSubsetOf(RHS);
4936 Diags.Report(DeclMap[I->Function]->getLocation(),
4937 diag::warn_unreachable_version)
4938 << I->Function->getName();
4939 assert(I->Function->user_empty() &&
"unexpected users");
4940 I->Function->eraseFromParent();
4941 I->Function =
nullptr;
4945 CodeGenFunction CGF(*
this);
4946 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4948 setMultiVersionResolverAttributes(ResolverFunc, GD);
4950 ResolverFunc->setComdat(
4951 getModule().getOrInsertComdat(ResolverFunc->getName()));
4957 if (!MVFuncsToEmit.empty())
4962 if (!MultiVersionFuncs.empty())
4963 emitMultiVersionFunctions();
4973 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
4975 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
4976 llvm::GlobalVariable::ExternalWeakLinkage,
4978 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
4983void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
4984 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
4986 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
4988 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
4989 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
4990 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
4991 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
4993 DS->takeName(OldDS);
4994 OldDS->replaceAllUsesWith(DS);
4995 OldDS->eraseFromParent();
5001 llvm::Constant *
New) {
5004 Old->replaceAllUsesWith(
New);
5005 Old->eraseFromParent();
5008void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5010 assert(FD &&
"Not a FunctionDecl?");
5012 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5013 assert(DD &&
"Not a cpu_dispatch Function?");
5019 UpdateMultiVersionNames(GD, FD, ResolverName);
5021 llvm::Type *ResolverType;
5022 GlobalDecl ResolverGD;
5024 ResolverType = llvm::FunctionType::get(
5035 ResolverName, ResolverType, ResolverGD,
false));
5038 ResolverFunc->setComdat(
5039 getModule().getOrInsertComdat(ResolverFunc->getName()));
5041 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5044 for (
const IdentifierInfo *II : DD->cpus()) {
5052 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5055 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5061 Func = GetOrCreateLLVMFunction(
5062 MangledName, DeclTy, ExistingDecl,
5068 llvm::SmallVector<StringRef, 32> Features;
5069 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5070 llvm::transform(Features, Features.begin(),
5071 [](StringRef Str) { return Str.substr(1); });
5072 llvm::erase_if(Features, [&Target](StringRef Feat) {
5073 return !Target.validateCpuSupports(Feat);
5079 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5080 const CodeGenFunction::FMVResolverOption &RHS) {
5081 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5082 llvm::X86::getCpuSupportsMask(RHS.
Features);
5089 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5090 (Options.end() - 2)->Features),
5091 [](
auto X) { return X == 0; })) {
5092 StringRef LHSName = (Options.end() - 2)->Function->getName();
5093 StringRef RHSName = (Options.end() - 1)->Function->getName();
5094 if (LHSName.compare(RHSName) < 0)
5095 Options.erase(Options.end() - 2);
5097 Options.erase(Options.end() - 1);
5100 CodeGenFunction CGF(*
this);
5101 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5102 setMultiVersionResolverAttributes(ResolverFunc, GD);
5107 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5112 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5119 *
this, GD, FD,
true);
5122 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5130void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5132 assert(FD &&
"Not a FunctionDecl?");
5135 std::string MangledName =
5137 if (!DeferredResolversToEmit.insert(MangledName).second)
5140 MultiVersionFuncs.push_back(GD);
5146llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5148 assert(FD &&
"Not a FunctionDecl?");
5150 std::string MangledName =
5155 std::string ResolverName = MangledName;
5159 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5163 ResolverName +=
".ifunc";
5170 ResolverName +=
".resolver";
5173 bool ShouldReturnIFunc =
5192 AddDeferredMultiVersionResolverToEmit(GD);
5196 if (ShouldReturnIFunc) {
5198 llvm::Type *ResolverType = llvm::FunctionType::get(
5200 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5201 MangledName +
".resolver", ResolverType, GlobalDecl{},
5209 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5211 GIF->setName(ResolverName);
5218 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5219 ResolverName, DeclTy, GlobalDecl{},
false);
5221 "Resolver should be created for the first time");
5226void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5228 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5241 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5252bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5253 const llvm::GlobalValue *GV)
const {
5254 auto SC = GV->getDLLStorageClass();
5255 if (SC == llvm::GlobalValue::DefaultStorageClass)
5258 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5259 !MRD->
hasAttr<DLLImportAttr>()) ||
5260 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5261 !MRD->
hasAttr<DLLExportAttr>())) &&
5272llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5273 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5274 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5278 std::string NameWithoutMultiVersionMangling;
5279 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5281 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5282 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5283 !DontDefer && !IsForDefinition) {
5286 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5288 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5291 GDDef = GlobalDecl(FDDef);
5299 UpdateMultiVersionNames(GD, FD, MangledName);
5300 if (!IsForDefinition) {
5306 AddDeferredMultiVersionResolverToEmit(GD);
5308 *
this, GD, FD,
true);
5317 *
this, GD, FD,
true);
5319 return GetOrCreateMultiVersionResolver(GD);
5324 if (!NameWithoutMultiVersionMangling.empty())
5325 MangledName = NameWithoutMultiVersionMangling;
5330 if (WeakRefReferences.erase(Entry)) {
5331 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5332 if (FD && !FD->
hasAttr<WeakAttr>())
5333 Entry->setLinkage(llvm::Function::ExternalLinkage);
5337 if (D && shouldDropDLLAttribute(D, Entry)) {
5338 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5344 if (IsForDefinition && !Entry->isDeclaration()) {
5351 DiagnosedConflictingDefinitions.insert(GD).second) {
5355 diag::note_previous_definition);
5360 (Entry->getValueType() == Ty)) {
5367 if (!IsForDefinition)
5374 bool IsIncompleteFunction =
false;
5376 llvm::FunctionType *FTy;
5380 FTy = llvm::FunctionType::get(
VoidTy,
false);
5381 IsIncompleteFunction =
true;
5385 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5386 Entry ? StringRef() : MangledName, &
getModule());
5390 if (D && D->
hasAttr<AnnotateAttr>())
5408 if (!Entry->use_empty()) {
5410 Entry->removeDeadConstantUsers();
5416 assert(F->getName() == MangledName &&
"name was uniqued!");
5418 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5419 if (ExtraAttrs.hasFnAttrs()) {
5420 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5428 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5431 addDeferredDeclToEmit(GD);
5436 auto DDI = DeferredDecls.find(MangledName);
5437 if (DDI != DeferredDecls.end()) {
5441 addDeferredDeclToEmit(DDI->second);
5442 DeferredDecls.erase(DDI);
5470 if (!IsIncompleteFunction) {
5471 assert(F->getFunctionType() == Ty);
5489 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5499 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5502 DD->getParent()->getNumVBases() == 0)
5507 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5508 false, llvm::AttributeList(),
5511 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5515 if (IsForDefinition)
5523 llvm::GlobalValue *F =
5526 return llvm::NoCFIValue::get(F);
5535 for (
const auto *Result : DC->
lookup(&CII))
5536 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5539 if (!
C.getLangOpts().CPlusPlus)
5544 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5545 ?
C.Idents.get(
"terminate")
5546 :
C.Idents.get(Name);
5548 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5550 for (
const auto *Result : DC->
lookup(&NS)) {
5552 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(Result))
5553 for (
const auto *Result : LSD->lookup(&NS))
5554 if ((ND = dyn_cast<NamespaceDecl>(Result)))
5558 for (
const auto *Result : ND->
lookup(&CXXII))
5559 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5568 llvm::Function *F, StringRef Name) {
5574 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5577 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5578 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5579 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5586 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5587 if (AssumeConvergent) {
5589 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5592 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5597 llvm::Constant *
C = GetOrCreateLLVMFunction(
5599 false,
false, ExtraAttrs);
5601 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5617 llvm::AttributeList ExtraAttrs,
bool Local,
5618 bool AssumeConvergent) {
5619 if (AssumeConvergent) {
5621 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5625 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5629 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5638 markRegisterParameterAttributes(F);
5664 if (WeakRefReferences.erase(Entry)) {
5665 if (D && !D->
hasAttr<WeakAttr>())
5666 Entry->setLinkage(llvm::Function::ExternalLinkage);
5670 if (D && shouldDropDLLAttribute(D, Entry))
5671 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5673 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5676 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5681 if (IsForDefinition && !Entry->isDeclaration()) {
5689 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5691 DiagnosedConflictingDefinitions.insert(D).second) {
5695 diag::note_previous_definition);
5700 if (Entry->getType()->getAddressSpace() != TargetAS)
5701 return llvm::ConstantExpr::getAddrSpaceCast(
5702 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5706 if (!IsForDefinition)
5712 auto *GV =
new llvm::GlobalVariable(
5713 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5714 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5715 getContext().getTargetAddressSpace(DAddrSpace));
5720 GV->takeName(Entry);
5722 if (!Entry->use_empty()) {
5723 Entry->replaceAllUsesWith(GV);
5726 Entry->eraseFromParent();
5732 auto DDI = DeferredDecls.find(MangledName);
5733 if (DDI != DeferredDecls.end()) {
5736 addDeferredDeclToEmit(DDI->second);
5737 DeferredDecls.erase(DDI);
5742 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5749 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
5755 CXXThreadLocals.push_back(D);
5763 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
5764 EmitGlobalVarDefinition(D);
5769 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
5770 GV->setSection(SA->getName());
5774 if (
getTriple().getArch() == llvm::Triple::xcore &&
5778 GV->setSection(
".cp.rodata");
5781 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
5782 GV->setCodeModel(CMA->getModel());
5787 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5791 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
5792 bool HasMutableFields =
Record &&
Record->hasMutableFields();
5793 if (!HasMutableFields) {
5800 auto *InitType =
Init->getType();
5801 if (GV->getValueType() != InitType) {
5806 GV->setName(StringRef());
5811 ->stripPointerCasts());
5814 GV->eraseFromParent();
5817 GV->setInitializer(
Init);
5818 GV->setConstant(
true);
5819 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5839 SanitizerMD->reportGlobal(GV, *D);
5844 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5845 if (DAddrSpace != ExpectedAS)
5858 false, IsForDefinition);
5879 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5880 llvm::Align Alignment) {
5881 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5882 llvm::GlobalVariable *OldGV =
nullptr;
5886 if (GV->getValueType() == Ty)
5891 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
5896 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
5901 GV->takeName(OldGV);
5903 if (!OldGV->use_empty()) {
5904 OldGV->replaceAllUsesWith(GV);
5907 OldGV->eraseFromParent();
5911 !GV->hasAvailableExternallyLinkage())
5912 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
5914 GV->setAlignment(Alignment);
5951 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
5959 if (GV && !GV->isDeclaration())
5964 if (!MustBeEmitted(D) && !GV) {
5965 DeferredDecls[MangledName] = D;
5970 EmitGlobalVarDefinition(D);
5975 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
5977 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
5992 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(
Addr)) {
5996 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5999 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6001 if (!Fn->getSubprogram())
6007 return Context.toCharUnitsFromBits(
6012 if (LangOpts.OpenCL) {
6023 if (LangOpts.SYCLIsDevice &&
6027 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6029 if (D->
hasAttr<CUDAConstantAttr>())
6031 if (D->
hasAttr<CUDASharedAttr>())
6033 if (D->
hasAttr<CUDADeviceAttr>())
6041 if (LangOpts.OpenMP) {
6043 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6051 if (LangOpts.OpenCL)
6053 if (LangOpts.SYCLIsDevice)
6055 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
6063 if (
auto AS =
getTarget().getConstantAddressSpace())
6076static llvm::Constant *
6078 llvm::GlobalVariable *GV) {
6079 llvm::Constant *Cast = GV;
6084 GV, llvm::PointerType::get(
6091template<
typename SomeDecl>
6093 llvm::GlobalValue *GV) {
6108 const SomeDecl *
First = D->getFirstDecl();
6109 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6115 std::pair<StaticExternCMap::iterator, bool> R =
6116 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6121 R.first->second =
nullptr;
6128 if (D.
hasAttr<SelectAnyAttr>())
6132 if (
auto *VD = dyn_cast<VarDecl>(&D))
6146 llvm_unreachable(
"No such linkage");
6154 llvm::GlobalObject &GO) {
6157 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6165void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6180 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6181 OpenMPRuntime->emitTargetGlobalVariable(D))
6184 llvm::TrackingVH<llvm::Constant>
Init;
6185 bool NeedsGlobalCtor =
false;
6189 bool IsDefinitionAvailableExternally =
6191 bool NeedsGlobalDtor =
6192 !IsDefinitionAvailableExternally &&
6199 if (IsDefinitionAvailableExternally &&
6210 std::optional<ConstantEmitter> emitter;
6215 bool IsCUDASharedVar =
6220 bool IsCUDAShadowVar =
6222 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6223 D->
hasAttr<CUDASharedAttr>());
6224 bool IsCUDADeviceShadowVar =
6229 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6230 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6234 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6237 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6238 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6239 }
else if (!InitExpr) {
6252 initializedGlobalDecl = GlobalDecl(D);
6253 emitter.emplace(*
this);
6254 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6256 QualType T = InitExpr->
getType();
6262 if (!IsDefinitionAvailableExternally)
6263 NeedsGlobalCtor =
true;
6267 NeedsGlobalCtor =
false;
6271 Init = llvm::PoisonValue::get(
getTypes().ConvertType(T));
6279 DelayedCXXInitPosition.erase(D);
6286 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6291 llvm::Type* InitType =
Init->getType();
6292 llvm::Constant *Entry =
6296 Entry = Entry->stripPointerCasts();
6299 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6310 if (!GV || GV->getValueType() != InitType ||
6311 GV->getType()->getAddressSpace() !=
6315 Entry->setName(StringRef());
6320 ->stripPointerCasts());
6323 llvm::Constant *NewPtrForOldDecl =
6324 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6326 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6334 if (D->
hasAttr<AnnotateAttr>())
6347 if (LangOpts.CUDA) {
6348 if (LangOpts.CUDAIsDevice) {
6351 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6354 GV->setExternallyInitialized(
true);
6361 if (LangOpts.HLSL &&
6366 GV->setExternallyInitialized(
true);
6368 GV->setInitializer(
Init);
6375 emitter->finalize(GV);
6378 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6379 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6383 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6384 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6386 GV->setConstant(
true);
6391 if (std::optional<CharUnits> AlignValFromAllocate =
6393 AlignVal = *AlignValFromAllocate;
6411 Linkage == llvm::GlobalValue::ExternalLinkage &&
6412 Context.getTargetInfo().getTriple().isOSDarwin() &&
6414 Linkage = llvm::GlobalValue::InternalLinkage;
6419 if (LangOpts.HLSL &&
6421 Linkage = llvm::GlobalValue::ExternalLinkage;
6424 if (D->
hasAttr<DLLImportAttr>())
6425 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6426 else if (D->
hasAttr<DLLExportAttr>())
6427 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6429 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6431 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6433 GV->setConstant(
false);
6438 if (!GV->getInitializer()->isNullValue())
6439 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6442 setNonAliasAttributes(D, GV);
6444 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6446 CXXThreadLocals.push_back(D);
6453 if (NeedsGlobalCtor || NeedsGlobalDtor)
6454 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6456 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6461 DI->EmitGlobalVariable(GV, D);
6469 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6480 if (D->
hasAttr<SectionAttr>())
6486 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6487 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6488 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6489 D->
hasAttr<PragmaClangRodataSectionAttr>())
6497 if (D->
hasAttr<WeakImportAttr>())
6506 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6507 if (D->
hasAttr<AlignedAttr>())
6510 if (Context.isAlignmentRequired(VarType))
6514 for (
const FieldDecl *FD : RD->fields()) {
6515 if (FD->isBitField())
6517 if (FD->
hasAttr<AlignedAttr>())
6519 if (Context.isAlignmentRequired(FD->
getType()))
6531 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6532 Context.getTypeAlignIfKnown(D->
getType()) >
6539llvm::GlobalValue::LinkageTypes
6543 return llvm::Function::InternalLinkage;
6546 return llvm::GlobalVariable::WeakAnyLinkage;
6550 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6555 return llvm::GlobalValue::AvailableExternallyLinkage;
6569 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6570 : llvm::Function::InternalLinkage;
6584 return llvm::Function::ExternalLinkage;
6587 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6588 : llvm::Function::InternalLinkage;
6589 return llvm::Function::WeakODRLinkage;
6596 CodeGenOpts.NoCommon))
6597 return llvm::GlobalVariable::CommonLinkage;
6603 if (D->
hasAttr<SelectAnyAttr>())
6604 return llvm::GlobalVariable::WeakODRLinkage;
6608 return llvm::GlobalVariable::ExternalLinkage;
6611llvm::GlobalValue::LinkageTypes
6620 llvm::Function *newFn) {
6622 if (old->use_empty())
6625 llvm::Type *newRetTy = newFn->getReturnType();
6630 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6632 llvm::User *user = ui->getUser();
6636 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6637 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6643 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6646 if (!callSite->isCallee(&*ui))
6651 if (callSite->getType() != newRetTy && !callSite->use_empty())
6656 llvm::AttributeList oldAttrs = callSite->getAttributes();
6659 unsigned newNumArgs = newFn->arg_size();
6660 if (callSite->arg_size() < newNumArgs)
6666 bool dontTransform =
false;
6667 for (llvm::Argument &A : newFn->args()) {
6668 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6669 dontTransform =
true;
6674 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6682 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6686 callSite->getOperandBundlesAsDefs(newBundles);
6688 llvm::CallBase *newCall;
6690 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6691 callSite->getIterator());
6694 newCall = llvm::InvokeInst::Create(
6695 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6696 newArgs, newBundles,
"", callSite->getIterator());
6700 if (!newCall->getType()->isVoidTy())
6701 newCall->takeName(callSite);
6702 newCall->setAttributes(
6703 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6704 oldAttrs.getRetAttrs(), newArgAttrs));
6705 newCall->setCallingConv(callSite->getCallingConv());
6708 if (!callSite->use_empty())
6709 callSite->replaceAllUsesWith(newCall);
6712 if (callSite->getDebugLoc())
6713 newCall->setDebugLoc(callSite->getDebugLoc());
6715 callSitesToBeRemovedFromParent.push_back(callSite);
6718 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6719 callSite->eraseFromParent();
6733 llvm::Function *NewFn) {
6743 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6755void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6756 llvm::GlobalValue *GV) {
6764 if (!GV || (GV->getValueType() != Ty))
6770 if (!GV->isDeclaration())
6780 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
6781 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
6792 setNonAliasAttributes(GD, Fn);
6794 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
6795 (CodeGenOpts.OptimizationLevel == 0) &&
6798 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
6800 !D->
hasAttr<NoInlineAttr>() &&
6801 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
6802 !D->
hasAttr<OptimizeNoneAttr>() &&
6803 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
6804 !ShouldAddOptNone) {
6805 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
6811 auto GetPriority = [
this](
const auto *
Attr) ->
int {
6816 return Attr->DefaultPriority;
6819 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
6821 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
6827void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
6829 const AliasAttr *AA = D->
getAttr<AliasAttr>();
6830 assert(AA &&
"Not an alias?");
6834 if (AA->getAliasee() == MangledName) {
6835 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6842 if (Entry && !Entry->isDeclaration())
6845 Aliases.push_back(GD);
6851 llvm::Constant *Aliasee;
6852 llvm::GlobalValue::LinkageTypes
LT;
6854 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6860 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6867 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6869 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
6872 if (GA->getAliasee() == Entry) {
6873 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6877 assert(Entry->isDeclaration());
6886 GA->takeName(Entry);
6888 Entry->replaceAllUsesWith(GA);
6889 Entry->eraseFromParent();
6891 GA->setName(MangledName);
6899 GA->setLinkage(llvm::Function::WeakAnyLinkage);
6902 if (
const auto *VD = dyn_cast<VarDecl>(D))
6903 if (VD->getTLSKind())
6914void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
6916 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
6917 assert(IFA &&
"Not an ifunc?");
6921 if (IFA->getResolver() == MangledName) {
6922 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6928 if (Entry && !Entry->isDeclaration()) {
6931 DiagnosedConflictingDefinitions.insert(GD).second) {
6932 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
6935 diag::note_previous_definition);
6940 Aliases.push_back(GD);
6946 llvm::Constant *Resolver =
6947 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
6951 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
6952 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
6954 if (GIF->getResolver() == Entry) {
6955 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6958 assert(Entry->isDeclaration());
6967 GIF->takeName(Entry);
6969 Entry->replaceAllUsesWith(GIF);
6970 Entry->eraseFromParent();
6972 GIF->setName(MangledName);
6978 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
6979 (llvm::Intrinsic::ID)IID, Tys);
6982static llvm::StringMapEntry<llvm::GlobalVariable *> &
6985 bool &IsUTF16,
unsigned &StringLength) {
6986 StringRef String = Literal->getString();
6987 unsigned NumBytes = String.size();
6990 if (!Literal->containsNonAsciiOrNull()) {
6991 StringLength = NumBytes;
6992 return *Map.insert(std::make_pair(String,
nullptr)).first;
6999 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
7000 llvm::UTF16 *ToPtr = &ToBuf[0];
7002 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
7003 ToPtr + NumBytes, llvm::strictConversion);
7006 StringLength = ToPtr - &ToBuf[0];
7010 return *Map.insert(std::make_pair(
7011 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7012 (StringLength + 1) * 2),
7018 unsigned StringLength = 0;
7019 bool isUTF16 =
false;
7020 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7025 if (
auto *
C = Entry.second)
7030 const llvm::Triple &Triple =
getTriple();
7033 const bool IsSwiftABI =
7034 static_cast<unsigned>(CFRuntime) >=
7039 if (!CFConstantStringClassRef) {
7040 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7042 Ty = llvm::ArrayType::get(Ty, 0);
7044 switch (CFRuntime) {
7048 CFConstantStringClassName =
7049 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7050 :
"$s10Foundation19_NSCFConstantStringCN";
7054 CFConstantStringClassName =
7055 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7056 :
"$S10Foundation19_NSCFConstantStringCN";
7060 CFConstantStringClassName =
7061 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7062 :
"__T010Foundation19_NSCFConstantStringCN";
7069 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7070 llvm::GlobalValue *GV =
nullptr;
7072 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7079 if ((VD = dyn_cast<VarDecl>(
Result)))
7082 if (Triple.isOSBinFormatELF()) {
7084 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7086 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7087 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7088 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7090 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7098 CFConstantStringClassRef =
7099 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7102 QualType CFTy = Context.getCFConstantStringType();
7107 auto Fields = Builder.beginStruct(STy);
7116 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7117 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7119 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7123 llvm::Constant *
C =
nullptr;
7126 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7127 Entry.first().size() / 2);
7128 C = llvm::ConstantDataArray::get(VMContext, Arr);
7130 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7136 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7137 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7138 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7141 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7142 : Context.getTypeAlignInChars(Context.CharTy);
7148 if (Triple.isOSBinFormatMachO())
7149 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7150 :
"__TEXT,__cstring,cstring_literals");
7153 else if (Triple.isOSBinFormatELF())
7154 GV->setSection(
".rodata");
7160 llvm::IntegerType *LengthTy =
7170 Fields.addInt(LengthTy, StringLength);
7178 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7180 llvm::GlobalVariable::PrivateLinkage);
7181 GV->addAttribute(
"objc_arc_inert");
7182 switch (Triple.getObjectFormat()) {
7183 case llvm::Triple::UnknownObjectFormat:
7184 llvm_unreachable(
"unknown file format");
7185 case llvm::Triple::DXContainer:
7186 case llvm::Triple::GOFF:
7187 case llvm::Triple::SPIRV:
7188 case llvm::Triple::XCOFF:
7189 llvm_unreachable(
"unimplemented");
7190 case llvm::Triple::COFF:
7191 case llvm::Triple::ELF:
7192 case llvm::Triple::Wasm:
7193 GV->setSection(
"cfstring");
7195 case llvm::Triple::MachO:
7196 GV->setSection(
"__DATA,__cfstring");
7205 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7209 if (ObjCFastEnumerationStateType.isNull()) {
7210 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7214 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7215 Context.getPointerType(Context.UnsignedLongTy),
7216 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7219 for (
size_t i = 0; i < 4; ++i) {
7224 FieldTypes[i],
nullptr,
7233 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7236 return ObjCFastEnumerationStateType;
7250 assert(CAT &&
"String literal not of constant array type!");
7252 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7256 llvm::Type *ElemTy = AType->getElementType();
7257 unsigned NumElements = AType->getNumElements();
7260 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7262 Elements.reserve(NumElements);
7264 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7266 Elements.resize(NumElements);
7267 return llvm::ConstantDataArray::get(VMContext, Elements);
7270 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7272 Elements.reserve(NumElements);
7274 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7276 Elements.resize(NumElements);
7277 return llvm::ConstantDataArray::get(VMContext, Elements);
7280static llvm::GlobalVariable *
7289 auto *GV =
new llvm::GlobalVariable(
7290 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7291 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7293 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7294 if (GV->isWeakForLinker()) {
7295 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7296 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7312 llvm::GlobalVariable **Entry =
nullptr;
7313 if (!LangOpts.WritableStrings) {
7314 Entry = &ConstantStringMap[
C];
7315 if (
auto GV = *Entry) {
7316 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7319 GV->getValueType(), Alignment);
7324 StringRef GlobalVariableName;
7325 llvm::GlobalValue::LinkageTypes LT;
7330 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7331 !LangOpts.WritableStrings) {
7332 llvm::raw_svector_ostream Out(MangledNameBuffer);
7334 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7335 GlobalVariableName = MangledNameBuffer;
7337 LT = llvm::GlobalValue::PrivateLinkage;
7338 GlobalVariableName = Name;
7350 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7353 GV->getValueType(), Alignment);
7370 StringRef GlobalName) {
7371 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7376 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7379 llvm::GlobalVariable **Entry =
nullptr;
7380 if (!LangOpts.WritableStrings) {
7381 Entry = &ConstantStringMap[
C];
7382 if (
auto GV = *Entry) {
7383 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7386 GV->getValueType(), Alignment);
7392 GlobalName, Alignment);
7397 GV->getValueType(), Alignment);
7415 MaterializedType = E->
getType();
7419 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7420 if (!InsertResult.second) {
7423 if (!InsertResult.first->second) {
7428 InsertResult.first->second =
new llvm::GlobalVariable(
7429 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7433 llvm::cast<llvm::GlobalVariable>(
7434 InsertResult.first->second->stripPointerCasts())
7443 llvm::raw_svector_ostream Out(Name);
7465 std::optional<ConstantEmitter> emitter;
7466 llvm::Constant *InitialValue =
nullptr;
7467 bool Constant =
false;
7471 emitter.emplace(*
this);
7472 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7477 Type = InitialValue->getType();
7486 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7488 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7492 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7496 Linkage = llvm::GlobalVariable::InternalLinkage;
7500 auto *GV =
new llvm::GlobalVariable(
7502 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7503 if (emitter) emitter->finalize(GV);
7505 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7507 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7509 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7513 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7514 if (VD->getTLSKind())
7516 llvm::Constant *CV = GV;
7519 GV, llvm::PointerType::get(
7525 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7527 Entry->replaceAllUsesWith(CV);
7528 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7537void CodeGenModule::EmitObjCPropertyImplementations(
const
7550 if (!Getter || Getter->isSynthesizedAccessorStub())
7553 auto *Setter = PID->getSetterMethodDecl();
7554 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7565 if (ivar->getType().isDestructedType())
7586void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7599 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7614 getContext().getObjCIdType(),
nullptr, D,
true,
7620 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7625void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7632 EmitDeclContext(LSD);
7635void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7637 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7640 std::unique_ptr<CodeGenFunction> &CurCGF =
7641 GlobalTopLevelStmtBlockInFlight.first;
7645 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7653 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7654 FunctionArgList Args;
7656 const CGFunctionInfo &FnInfo =
7659 llvm::Function *
Fn = llvm::Function::Create(
7660 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7662 CurCGF.reset(
new CodeGenFunction(*
this));
7663 GlobalTopLevelStmtBlockInFlight.second = D;
7664 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7666 CXXGlobalInits.push_back(Fn);
7669 CurCGF->EmitStmt(D->
getStmt());
7672void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7673 for (
auto *I : DC->
decls()) {
7679 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7680 for (
auto *M : OID->methods())
7699 case Decl::CXXConversion:
7700 case Decl::CXXMethod:
7701 case Decl::Function:
7708 case Decl::CXXDeductionGuide:
7713 case Decl::Decomposition:
7714 case Decl::VarTemplateSpecialization:
7716 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
7717 for (
auto *B : DD->flat_bindings())
7718 if (
auto *HD = B->getHoldingVar())
7725 case Decl::IndirectField:
7729 case Decl::Namespace:
7732 case Decl::ClassTemplateSpecialization: {
7735 if (Spec->getSpecializationKind() ==
7737 Spec->hasDefinition())
7738 DI->completeTemplateDefinition(*Spec);
7740 case Decl::CXXRecord: {
7744 DI->EmitAndRetainType(
7748 DI->completeUnusedClass(*CRD);
7751 for (
auto *I : CRD->
decls())
7757 case Decl::UsingShadow:
7758 case Decl::ClassTemplate:
7759 case Decl::VarTemplate:
7761 case Decl::VarTemplatePartialSpecialization:
7762 case Decl::FunctionTemplate:
7763 case Decl::TypeAliasTemplate:
7772 case Decl::UsingEnum:
7776 case Decl::NamespaceAlias:
7780 case Decl::UsingDirective:
7784 case Decl::CXXConstructor:
7787 case Decl::CXXDestructor:
7791 case Decl::StaticAssert:
7798 case Decl::ObjCInterface:
7799 case Decl::ObjCCategory:
7802 case Decl::ObjCProtocol: {
7804 if (Proto->isThisDeclarationADefinition())
7805 ObjCRuntime->GenerateProtocol(Proto);
7809 case Decl::ObjCCategoryImpl:
7815 case Decl::ObjCImplementation: {
7817 EmitObjCPropertyImplementations(OMD);
7818 EmitObjCIvarInitializations(OMD);
7819 ObjCRuntime->GenerateClass(OMD);
7823 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7824 OMD->getClassInterface()), OMD->getLocation());
7827 case Decl::ObjCMethod: {
7834 case Decl::ObjCCompatibleAlias:
7838 case Decl::PragmaComment: {
7840 switch (PCD->getCommentKind()) {
7842 llvm_unreachable(
"unexpected pragma comment kind");
7857 case Decl::PragmaDetectMismatch: {
7863 case Decl::LinkageSpec:
7867 case Decl::FileScopeAsm: {
7869 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7872 if (LangOpts.OpenMPIsTargetDevice)
7875 if (LangOpts.SYCLIsDevice)
7878 getModule().appendModuleInlineAsm(AD->getAsmString());
7882 case Decl::TopLevelStmt:
7886 case Decl::Import: {
7890 if (!ImportedModules.insert(Import->getImportedModule()))
7894 if (!Import->getImportedOwningModule()) {
7896 DI->EmitImportDecl(*Import);
7902 if (CXX20ModuleInits && Import->getImportedModule() &&
7903 Import->getImportedModule()->isNamedModule())
7912 Visited.insert(Import->getImportedModule());
7913 Stack.push_back(Import->getImportedModule());
7915 while (!Stack.empty()) {
7917 if (!EmittedModuleInitializers.insert(Mod).second)
7920 for (
auto *D : Context.getModuleInitializers(Mod))
7927 if (Submodule->IsExplicit)
7930 if (Visited.insert(Submodule).second)
7931 Stack.push_back(Submodule);
7941 case Decl::OMPThreadPrivate:
7945 case Decl::OMPAllocate:
7949 case Decl::OMPDeclareReduction:
7953 case Decl::OMPDeclareMapper:
7957 case Decl::OMPRequires:
7962 case Decl::TypeAlias:
7964 DI->EmitAndRetainType(
getContext().getTypedefType(
7972 DI->EmitAndRetainType(
7979 DI->EmitAndRetainType(
7983 case Decl::HLSLRootSignature:
7986 case Decl::HLSLBuffer:
7990 case Decl::OpenACCDeclare:
7993 case Decl::OpenACCRoutine:
8008 if (!CodeGenOpts.CoverageMapping)
8011 case Decl::CXXConversion:
8012 case Decl::CXXMethod:
8013 case Decl::Function:
8014 case Decl::ObjCMethod:
8015 case Decl::CXXConstructor:
8016 case Decl::CXXDestructor: {
8025 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8035 if (!CodeGenOpts.CoverageMapping)
8037 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8038 if (Fn->isTemplateInstantiation())
8041 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8049 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8052 const Decl *D = Entry.first;
8054 case Decl::CXXConversion:
8055 case Decl::CXXMethod:
8056 case Decl::Function:
8057 case Decl::ObjCMethod: {
8064 case Decl::CXXConstructor: {
8071 case Decl::CXXDestructor: {
8088 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8089 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8090 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8091 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8092 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8101 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8102 return llvm::ConstantInt::get(i64, PtrInt);
8106 llvm::NamedMDNode *&GlobalMetadata,
8108 llvm::GlobalValue *
Addr) {
8109 if (!GlobalMetadata)
8111 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8114 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8117 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8120bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8121 llvm::GlobalValue *CppFunc) {
8123 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8126 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8129 if (Elem == CppFunc)
8135 for (llvm::User *User : Elem->users()) {
8139 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8140 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8143 for (llvm::User *CEUser : ConstExpr->users()) {
8144 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8145 IFuncs.push_back(IFunc);
8150 CEs.push_back(ConstExpr);
8151 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8152 IFuncs.push_back(IFunc);
8164 for (llvm::GlobalIFunc *IFunc : IFuncs)
8165 IFunc->setResolver(
nullptr);
8166 for (llvm::ConstantExpr *ConstExpr : CEs)
8167 ConstExpr->destroyConstant();
8171 Elem->eraseFromParent();
8173 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8178 llvm::FunctionType::get(IFunc->getType(),
false);
8179 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8180 CppFunc->getName(), ResolverTy, {},
false);
8181 IFunc->setResolver(Resolver);
8191void CodeGenModule::EmitStaticExternCAliases() {
8194 for (
auto &I : StaticExternCValues) {
8195 const IdentifierInfo *Name = I.first;
8196 llvm::GlobalValue *Val = I.second;
8204 llvm::GlobalValue *ExistingElem =
8209 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8216 auto Res = Manglings.find(MangledName);
8217 if (Res == Manglings.end())
8219 Result = Res->getValue();
8230void CodeGenModule::EmitDeclMetadata() {
8231 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8233 for (
auto &I : MangledDeclNames) {
8234 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8244void CodeGenFunction::EmitDeclMetadata() {
8245 if (LocalDeclMap.empty())
return;
8250 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8252 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8254 for (
auto &I : LocalDeclMap) {
8255 const Decl *D = I.first;
8256 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8257 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8259 Alloca->setMetadata(
8260 DeclPtrKind, llvm::MDNode::get(
8261 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8262 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8269void CodeGenModule::EmitVersionIdentMetadata() {
8270 llvm::NamedMDNode *IdentMetadata =
8271 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8273 llvm::LLVMContext &Ctx = TheModule.getContext();
8275 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8276 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8279void CodeGenModule::EmitCommandLineMetadata() {
8280 llvm::NamedMDNode *CommandLineMetadata =
8281 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8283 llvm::LLVMContext &Ctx = TheModule.getContext();
8285 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8286 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8289void CodeGenModule::EmitCoverageFile() {
8290 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8294 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8295 llvm::LLVMContext &Ctx = TheModule.getContext();
8296 auto *CoverageDataFile =
8298 auto *CoverageNotesFile =
8300 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8301 llvm::MDNode *CU = CUNode->getOperand(i);
8302 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8303 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8316 LangOpts.ObjCRuntime.isGNUFamily())
8317 return ObjCRuntime->GetEHType(Ty);
8324 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8326 for (
auto RefExpr : D->
varlist()) {
8329 VD->getAnyInitializer() &&
8330 !VD->getAnyInitializer()->isConstantInitializer(
getContext());
8336 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8337 CXXGlobalInits.push_back(InitFunction);
8342CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
8346 FnType->getReturnType(), FnType->getParamTypes(),
8347 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8349 llvm::Metadata *&InternalId = Map[T.getCanonicalType()];
8354 std::string OutName;
8355 llvm::raw_string_ostream Out(OutName);
8360 Out <<
".normalized";
8383 return CreateMetadataIdentifierImpl(T, MetadataIdMap,
"");
8388 return CreateMetadataIdentifierImpl(T, VirtualMetadataIdMap,
".virtual");
8392 return CreateMetadataIdentifierImpl(T, GeneralizedMetadataIdMap,
8400 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8401 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8402 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8403 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8404 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8405 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8406 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8407 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8415 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8417 if (CodeGenOpts.SanitizeCfiCrossDso)
8419 VTable->addTypeMetadata(Offset.getQuantity(),
8420 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8423 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8424 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8430 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8440 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8455 bool forPointeeType) {
8466 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8473 bool AlignForArray = T->isArrayType();
8479 if (T->isIncompleteType()) {
8496 if (T.getQualifiers().hasUnaligned()) {
8498 }
else if (forPointeeType && !AlignForArray &&
8499 (RD = T->getAsCXXRecordDecl())) {
8510 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8523 if (NumAutoVarInit >= StopAfter) {
8526 if (!NumAutoVarInit) {
8540 const Decl *D)
const {
8544 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8546 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8552 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8556 llvm::MD5::MD5Result
Result;
8557 for (
const auto &Arg : PreprocessorOpts.Macros)
8558 Hash.update(Arg.first);
8562 llvm::sys::fs::UniqueID ID;
8566 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8570 SM.getDiagnostics().Report(diag::err_cannot_open_file)
8571 << PLoc.
getFilename() << Status.getError().message();
8573 ID = Status->getUniqueID();
8575 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8576 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8583 assert(DeferredDeclsToEmit.empty() &&
8584 "Should have emitted all decls deferred to emit.");
8585 assert(NewBuilder->DeferredDecls.empty() &&
8586 "Newly created module should not have deferred decls");
8587 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8588 assert(EmittedDeferredDecls.empty() &&
8589 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8591 assert(NewBuilder->DeferredVTables.empty() &&
8592 "Newly created module should not have deferred vtables");
8593 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8595 assert(NewBuilder->MangledDeclNames.empty() &&
8596 "Newly created module should not have mangled decl names");
8597 assert(NewBuilder->Manglings.empty() &&
8598 "Newly created module should not have manglings");
8599 NewBuilder->Manglings = std::move(Manglings);
8601 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8603 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
8607 std::string OutName;
8608 llvm::raw_string_ostream Out(OutName);
8616 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8625 return RequireVectorDeletingDtor.count(RD);
8629 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8631 RequireVectorDeletingDtor.insert(RD);
8645 if (Entry && !Entry->isDeclaration()) {
8650 auto *NewFn = llvm::Function::Create(
8652 llvm::Function::ExternalLinkage, VDName, &
getModule());
8653 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
8655 NewFn->takeName(VDEntry);
8656 VDEntry->replaceAllUsesWith(NewFn);
8657 VDEntry->eraseFromParent();
8658 Entry->replaceAllUsesWith(NewFn);
8659 Entry->eraseFromParent();
8664 addDeferredDeclToEmit(VectorDtorGD);
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the Diagnostic-related interfaces.
Defines enum values for all the target-independent builtin functions.
static bool shouldAssumeDSOLocal(const CIRGenModule &cgm, cir::CIRGlobalValueInterface gv)
static bool shouldBeInCOMDAT(CIRGenModule &cgm, const Decl &d)
static bool hasUnwindExceptions(const LangOptions &langOpts)
Determines whether the language options require us to model unwind exceptions.
static void setWindowsItaniumDLLImport(CIRGenModule &cgm, bool isLocal, cir::FuncOp funcOp, StringRef name)
static std::string getMangledNameImpl(CIRGenModule &cgm, GlobalDecl gd, const NamedDecl *nd)
static bool hasImplicitAttr(const ValueDecl *decl)
static CIRGenCXXABI * createCXXABI(CIRGenModule &cgm)
static bool isVarDeclStrongDefinition(const ASTContext &astContext, CIRGenModule &cgm, const VarDecl *vd, bool noCommon)
static void setLinkageForGV(cir::GlobalOp &gv, const NamedDecl *nd)
static void emitUsed(CIRGenModule &cgm, StringRef name, std::vector< cir::CIRGlobalValueInterface > &list)
static bool hasExistingGeneralizedTypeMD(llvm::Function *F)
static void AppendCPUSpecificCPUDispatchMangling(const CodeGenModule &CGM, const CPUSpecificAttr *Attr, unsigned CPUIndex, raw_ostream &Out)
static bool AllTrivialInitializers(CodeGenModule &CGM, ObjCImplementationDecl *D)
static const FunctionDecl * GetRuntimeFunctionDecl(ASTContext &C, StringRef Name)
static GlobalDecl getBaseVariantGlobalDecl(const NamedDecl *D)
static void checkAliasForTocData(llvm::GlobalVariable *GVar, const CodeGenOptions &CodeGenOpts, DiagnosticsEngine &Diags, SourceLocation Location)
static const char PFPDeactivationSymbolPrefix[]
static bool HasNonDllImportDtor(QualType T)
static llvm::Constant * GetPointerConstant(llvm::LLVMContext &Context, const void *Ptr)
Turns the given pointer into a constant.
static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S)
static llvm::GlobalValue::LinkageTypes getMultiversionLinkage(CodeGenModule &CGM, GlobalDecl GD)
static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO, llvm::Module &M)
static QualType GeneralizeTransparentUnion(QualType Ty)
static std::string getCPUSpecificMangling(const CodeGenModule &CGM, StringRef Name)
static const char AnnotationSection[]
static bool isUniqueInternalLinkageDecl(GlobalDecl GD, CodeGenModule &CGM)
static bool allowKCFIIdentifier(StringRef Name)
static void replaceUsesOfNonProtoConstant(llvm::Constant *old, llvm::Function *newFn)
Replace the uses of a function that was declared with a non-proto type.
static llvm::Constant * castStringLiteralToDefaultAddressSpace(CodeGenModule &CGM, llvm::GlobalVariable *GV)
static void checkDataLayoutConsistency(const TargetInfo &Target, llvm::LLVMContext &Context, const LangOptions &Opts)
static std::vector< std::string > getFeatureDeltaFromDefault(const CodeGenModule &CGM, StringRef TargetCPU, llvm::StringMap< bool > &FeatureMap)
Get the feature delta from the default feature map for the given target CPU.
static QualType GeneralizeFunctionType(ASTContext &Ctx, QualType Ty, bool GeneralizePointers)
static bool needsDestructMethod(ObjCImplementationDecl *impl)
static bool isStackProtectorOn(const LangOptions &LangOpts, const llvm::Triple &Triple, clang::LangOptions::StackProtectorMode Mode)
static void removeImageAccessQualifier(std::string &TyName)
static llvm::StringMapEntry< llvm::GlobalVariable * > & GetConstantCFStringEntry(llvm::StringMap< llvm::GlobalVariable * > &Map, const StringLiteral *Literal, bool TargetIsLSB, bool &IsUTF16, unsigned &StringLength)
static void setLLVMVisibility(llvm::GlobalValue &GV, std::optional< llvm::GlobalValue::VisibilityTypes > V)
static llvm::GlobalVariable * GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT, CodeGenModule &CGM, StringRef GlobalName, CharUnits Alignment)
static llvm::APInt getFMVPriority(const TargetInfo &TI, const CodeGenFunction::FMVResolverOption &RO)
static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod, SmallVectorImpl< llvm::MDNode * > &Metadata, llvm::SmallPtrSet< Module *, 16 > &Visited)
Add link options implied by the given module, including modules it depends on, using a postorder walk...
static llvm::cl::opt< bool > LimitedCoverage("limited-coverage-experimental", llvm::cl::Hidden, llvm::cl::desc("Emit limited coverage mapping information (experimental)"))
static CGCXXABI * createCXXABI(CodeGenModule &CGM)
static std::unique_ptr< TargetCodeGenInfo > createTargetCodeGenInfo(CodeGenModule &CGM)
static const llvm::GlobalValue * getAliasedGlobal(const llvm::GlobalValue *GV)
static QualType GeneralizeType(ASTContext &Ctx, QualType Ty, bool GeneralizePointers)
static bool shouldSkipAliasEmission(const CodeGenModule &CGM, const ValueDecl *Global)
static constexpr auto ErrnoTBAAMDName
static unsigned ArgInfoAddressSpace(LangAS AS)
static void replaceDeclarationWith(llvm::GlobalValue *Old, llvm::Constant *New)
static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, llvm::Function *NewFn)
ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we implement a function with...
static std::optional< llvm::GlobalValue::VisibilityTypes > getLLVMVisibility(clang::LangOptions::VisibilityFromDLLStorageClassKinds K)
static bool requiresMemberFunctionPointerTypeMetadata(CodeGenModule &CGM, const CXXMethodDecl *MD)
static bool checkAliasedGlobal(const ASTContext &Context, DiagnosticsEngine &Diags, SourceLocation Location, bool IsIFunc, const llvm::GlobalValue *Alias, const llvm::GlobalValue *&GV, const llvm::MapVector< GlobalDecl, StringRef > &MangledDeclNames, SourceRange AliasRange)
static void EmitGlobalDeclMetadata(CodeGenModule &CGM, llvm::NamedMDNode *&GlobalMetadata, GlobalDecl D, llvm::GlobalValue *Addr)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static const NamedDecl * getDefinition(const Decl *D)
Defines the SourceManager interface.
static CharUnits getTypeAllocSize(CodeGenModule &CGM, llvm::Type *type)
Defines version macros and version-related utility functions for Clang.
__device__ __2f16 float __ockl_bool s
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
const ProfileList & getProfileList() const
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
const XRayFunctionFilter & getXRayFilter() const
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
StringRef getCUIDHash() const
const LangOptions & getLangOpts() const
SelectorTable & Selectors
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
const NoSanitizeList & getNoSanitizeList() const
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const
Return the alignment in characters that should be given to a global variable with type T.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) 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.
DiagnosticsEngine & getDiagnostics() const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
CanQualType getCanonicalTagType(const TagDecl *TD) const
unsigned getTargetAddressSpace(LangAS AS) const
Module * getCurrentNamedModule() const
Get module under construction, nullptr if this is not a C++20 module.
Attr - This represents one attribute.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
bool isLibFunction(unsigned ID) const
Return true if this is a builtin for a libc/libm function, with a "__builtin_" prefix (e....
std::string getName(unsigned ID) const
Return the identifier name for the specified builtin, e.g.
Represents a base class of a C++ class.
CXXTemporary * getTemporary()
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ base or member initializer.
Expr * getInit() const
Get the initializer.
FunctionDecl * getOperatorDelete() const
Represents a C++ destructor within a class.
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Represents a static or instance method of a struct/union/class.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
FunctionDecl * getOperatorNew() const
Represents a C++ struct/union/class.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool hasDefinition() const
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
const CXXDestructorDecl * getDestructor() const
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
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...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
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.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
std::string MSSecureHotPatchFunctionsFile
The name of a file that contains functions which will be compiled for hotpatching.
std::string RecordCommandLine
The string containing the commandline for the llvm.commandline metadata, if non-empty.
std::string FloatABI
The ABI to use for passing floating point arguments.
llvm::Reloc::Model RelocationModel
The name of the relocation model to use.
std::vector< std::string > TocDataVarsUserSpecified
List of global variables explicitly specified by the user as toc-data.
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
std::vector< std::string > MSSecureHotPatchFunctionsList
A list of functions which will be compiled for hotpatching.
ABIInfo - Target specific hooks for defining how a type should be passed or returned from functions.
virtual void appendAttributeMangling(TargetAttr *Attr, raw_ostream &Out) const
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
virtual void handleVarRegistration(const VarDecl *VD, llvm::GlobalVariable &Var)=0
Check whether a variable is a device variable and register it if true.
virtual llvm::GlobalValue * getKernelHandle(llvm::Function *Stub, GlobalDecl GD)=0
Get kernel handle by stub function.
virtual void internalizeDeviceSideVar(const VarDecl *D, llvm::GlobalValue::LinkageTypes &Linkage)=0
Adjust linkage of shadow variables in host compilation.
Implements C++ ABI-specific code generation functions.
virtual void EmitCXXConstructors(const CXXConstructorDecl *D)=0
Emit constructor variants required by this ABI.
virtual llvm::Constant * getAddrOfRTTIDescriptor(QualType Ty)=0
virtual void EmitCXXDestructors(const CXXDestructorDecl *D)=0
Emit destructor variants required by this ABI.
virtual void setCXXDestructorDLLStorage(llvm::GlobalValue *GV, const CXXDestructorDecl *Dtor, CXXDtorType DT) const
virtual llvm::GlobalValue::LinkageTypes getCXXDestructorLinkage(GVALinkage Linkage, const CXXDestructorDecl *Dtor, CXXDtorType DT) const
MangleContext & getMangleContext()
Gets the mangle context.
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
void EmitGlobalAlias(const llvm::GlobalValue *GV, const GlobalDecl Decl)
Emit information about global variable alias.
void EmitExternalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl)
Emit information about an external variable.
void EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc, QualType FnType, llvm::Function *Fn=nullptr)
Emit debug info for a function declaration.
void AddStringLiteralDebugInfo(llvm::GlobalVariable *GV, const StringLiteral *S)
DebugInfo isn't attached to string literals by default.
CGFunctionInfo - Class to encapsulate the information about a function definition.
void handleGlobalVarDefinition(const VarDecl *VD, llvm::GlobalVariable *Var)
void addRootSignature(const HLSLRootSignatureDecl *D)
void addBuffer(const HLSLBufferDecl *D)
llvm::Type * getSamplerType(const Type *T)
void emitDeferredTargetDecls() const
Emit deferred declare target variables marked for deferred emission.
virtual void emitDeclareTargetFunction(const FunctionDecl *FD, llvm::GlobalValue *GV)
Emit code for handling declare target functions in the runtime.
virtual ConstantAddress getAddrOfDeclareTargetVar(const VarDecl *VD)
Returns the address of the variable marked as declare target with link clause OR as declare target wi...
bool hasRequiresUnifiedSharedMemory() const
Return whether the unified_shared_memory has been specified.
virtual void emitDeclareSimdFunction(const FunctionDecl *FD, llvm::Function *Fn)
Marks function Fn with properly mangled versions of vector functions.
virtual void registerTargetGlobalVariable(const VarDecl *VD, llvm::Constant *Addr)
Checks if the provided global decl GD is a declare target variable and registers it when emitting cod...
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)
void EmitCfiCheckFail()
Emit a cross-DSO CFI failure handling function.
void GenerateObjCGetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCGetter - Synthesize an Objective-C property getter function.
void EmitCfiCheckStub()
Emit a stub for the cross-DSO CFI check function.
void GenerateObjCMethod(const ObjCMethodDecl *OMD)
Generate an Objective-C method.
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
void GenerateObjCSetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCSetter - Synthesize an Objective-C property setter function for the given property.
llvm::LLVMContext & getLLVMContext()
bool isTrivialInitializer(const Expr *Init)
Determine whether the given initializer is trivial in the sense that it requires no code to be genera...
This class organizes the cross-function state that is used while generating LLVM code.
StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD)
ConstantAddress GetAddrOfMSGuidDecl(const MSGuidDecl *GD)
Get the address of a GUID.
void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const
Set visibility, dllimport/dllexport and dso_local.
void AddVTableTypeMetadata(llvm::GlobalVariable *VTable, CharUnits Offset, const CXXRecordDecl *RD)
Create and attach type metadata for the given vtable.
void UpdateCompletedType(const TagDecl *TD)
llvm::MDNode * getTBAAAccessTagInfo(TBAAAccessInfo Info)
getTBAAAccessTagInfo - Get TBAA tag for a given memory access.
llvm::GlobalVariable::ThreadLocalMode GetDefaultLLVMTLSModel() const
Get LLVM TLS mode from CodeGenOptions.
void SetInternalFunctionAttributes(GlobalDecl GD, llvm::Function *F, const CGFunctionInfo &FI)
Set the attributes on the LLVM function for the given decl and function info.
void setDSOLocal(llvm::GlobalValue *GV) const
llvm::MDNode * getTBAAStructInfo(QualType QTy)
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
llvm::Constant * EmitAnnotationArgs(const AnnotateAttr *Attr)
Emit additional args of the annotation.
llvm::Module & getModule() const
std::optional< llvm::Attribute::AttrKind > StackProtectorAttribute(const Decl *D) const
llvm::GlobalValue * getPFPDeactivationSymbol(const FieldDecl *FD)
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::ConstantInt * CreateKCFITypeId(QualType T, StringRef Salt)
Generate a KCFI type identifier for T.
CGDebugInfo * getModuleDebugInfo()
llvm::Constant * performAddrSpaceCast(llvm::Constant *Src, llvm::Type *DestTy)
bool NeedAllVtablesTypeId() const
Returns whether this module needs the "all-vtables" type identifier.
void addCompilerUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.compiler.used metadata.
CodeGenVTables & getVTables()
llvm::ConstantInt * CreateCrossDsoCfiTypeId(llvm::Metadata *MD)
Generate a cross-DSO type identifier for MD.
CharUnits GetTargetTypeStoreSize(llvm::Type *Ty) const
Return the store size, in character units, of the given LLVM type.
void createFunctionTypeMetadataForIcall(const FunctionDecl *FD, llvm::Function *F)
Create and attach type metadata to the given function.
bool getExpressionLocationsEnabled() const
Return true if we should emit location information for expressions.
void addGlobalValReplacement(llvm::GlobalValue *GV, llvm::Constant *C)
bool classNeedsVectorDestructor(const CXXRecordDecl *RD)
Check that class need vector deleting destructor body.
llvm::Constant * GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH=false)
Get the address of the RTTI descriptor for the given type.
llvm::Constant * GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty=nullptr, bool ForVTable=false, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the given function.
void setGVPropertiesAux(llvm::GlobalValue *GV, const NamedDecl *D) const
const IntrusiveRefCntPtr< llvm::vfs::FileSystem > & getFileSystem() const
const ABIInfo & getABIInfo()
void EmitMainVoidAlias()
Emit an alias for "main" if it has no arguments (needed for wasm).
void DecorateInstructionWithInvariantGroup(llvm::Instruction *I, const CXXRecordDecl *RD)
Adds !invariant.barrier !tag to instruction.
DiagnosticsEngine & getDiags() const
bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn, SourceLocation Loc) const
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
llvm::Constant * getAddrOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the constructor/destructor of the given type.
void ErrorUnsupported(const Stmt *S, const char *Type)
Print out an error that codegen doesn't support the specified stmt yet.
llvm::Constant * EmitAnnotateAttr(llvm::GlobalValue *GV, const AnnotateAttr *AA, SourceLocation L)
Generate the llvm::ConstantStruct which contains the annotation information for a given GlobalValue.
void EmitOpenACCDeclare(const OpenACCDeclareDecl *D, CodeGenFunction *CGF=nullptr)
llvm::GlobalValue::LinkageTypes getLLVMLinkageForDeclarator(const DeclaratorDecl *D, GVALinkage Linkage)
Returns LLVM linkage for a declarator.
TBAAAccessInfo mergeTBAAInfoForMemoryTransfer(TBAAAccessInfo DestInfo, TBAAAccessInfo SrcInfo)
mergeTBAAInfoForMemoryTransfer - Get merged TBAA information for the purposes of memory transfer call...
const LangOptions & getLangOpts() const
CGCUDARuntime & getCUDARuntime()
Return a reference to the configured CUDA runtime.
llvm::Constant * EmitAnnotationLineNo(SourceLocation L)
Emit the annotation line number.
QualType getObjCFastEnumerationStateType()
Retrieve the record type that describes the state of an Objective-C fast enumeration loop (for....
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CodeGenTypes & getTypes()
bool shouldMapVisibilityToDLLExport(const NamedDecl *D) const
CGOpenCLRuntime & getOpenCLRuntime()
Return a reference to the configured OpenCL runtime.
const std::string & getModuleNameHash() const
const TargetInfo & getTarget() const
bool shouldEmitRTTI(bool ForEH=false)
void EmitGlobal(GlobalDecl D)
Emit code for a single global function or var decl.
llvm::Metadata * CreateMetadataIdentifierForType(QualType T)
Create a metadata identifier for the given type.
void addUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.used metadata.
void createIndirectFunctionTypeMD(const FunctionDecl *FD, llvm::Function *F)
Create and attach type metadata if the function is a potential indirect call target to support call g...
void AppendLinkerOptions(StringRef Opts)
Appends Opts to the "llvm.linker.options" metadata value.
void createCalleeTypeMetadataForIcall(const QualType &QT, llvm::CallBase *CB)
Create and attach type metadata to the given call.
void EmitExternalDeclaration(const DeclaratorDecl *D)
void AddDependentLib(StringRef Lib)
Appends a dependent lib to the appropriate metadata value.
void Release()
Finalize LLVM code generation.
ProfileList::ExclusionType isFunctionBlockedByProfileList(llvm::Function *Fn, SourceLocation Loc) const
llvm::MDNode * getTBAABaseTypeInfo(QualType QTy)
getTBAABaseTypeInfo - Get metadata that describes the given base access type.
bool lookupRepresentativeDecl(StringRef MangledName, GlobalDecl &Result) const
void EmitOMPAllocateDecl(const OMPAllocateDecl *D)
Emit a code for the allocate directive.
void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const
Set the visibility for the given LLVM GlobalValue.
llvm::GlobalValue::LinkageTypes getLLVMLinkageVarDefinition(const VarDecl *VD)
Returns LLVM linkage for a declarator.
bool HasHiddenLTOVisibility(const CXXRecordDecl *RD)
Returns whether the given record has hidden LTO visibility and therefore may participate in (single-m...
const llvm::DataLayout & getDataLayout() const
void Error(SourceLocation loc, StringRef error)
Emit a general error that something can't be done.
void requireVectorDestructorDefinition(const CXXRecordDecl *RD)
Record that new[] was called for the class, transform vector deleting destructor definition in a form...
TBAAAccessInfo getTBAAVTablePtrAccessInfo(llvm::Type *VTablePtrType)
getTBAAVTablePtrAccessInfo - Get the TBAA information that describes an access to a virtual table poi...
CGCXXABI & getCXXABI() const
ConstantAddress GetWeakRefReference(const ValueDecl *VD)
Get a reference to the target of VD.
std::string getPFPFieldName(const FieldDecl *FD)
llvm::Constant * GetFunctionStart(const ValueDecl *Decl)
static llvm::GlobalValue::VisibilityTypes GetLLVMVisibility(Visibility V)
void EmitTentativeDefinition(const VarDecl *D)
void EmitDeferredUnusedCoverageMappings()
Emit all the deferred coverage mappings for the uninstrumented functions.
void addUsedOrCompilerUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.compiler.used metadata.
CGOpenMPRuntime & getOpenMPRuntime()
Return a reference to the configured OpenMP runtime.
bool imbueXRayAttrs(llvm::Function *Fn, SourceLocation Loc, StringRef Category=StringRef()) const
Imbue XRay attributes to a function, applying the always/never attribute lists in the process.
SanitizerMetadata * getSanitizerMetadata()
llvm::Metadata * CreateMetadataIdentifierGeneralized(QualType T)
Create a metadata identifier for the generalization of the given type.
void EmitGlobalAnnotations()
Emit all the global annotations.
CharUnits getClassPointerAlignment(const CXXRecordDecl *CD)
Returns the assumed alignment of an opaque pointer to the given class.
const llvm::Triple & getTriple() const
SmallVector< const CXXRecordDecl *, 0 > getMostBaseClasses(const CXXRecordDecl *RD)
Return a vector of most-base classes for RD.
void AddDeferredUnusedCoverageMapping(Decl *D)
Stored a deferred empty coverage mapping for an unused and thus uninstrumented top level declaration.
void MaybeHandleStaticInExternC(const SomeDecl *D, llvm::GlobalValue *GV)
If the declaration has internal linkage but is inside an extern "C" linkage specification,...
void DecorateInstructionWithTBAA(llvm::Instruction *Inst, TBAAAccessInfo TBAAInfo)
DecorateInstructionWithTBAA - Decorate the instruction with a TBAA tag.
llvm::GlobalVariable::LinkageTypes getFunctionLinkage(GlobalDecl GD)
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.
llvm::Constant * CreateRuntimeVariable(llvm::Type *Ty, StringRef Name)
Create a new runtime global variable with the specified type and name.
void ConstructAttributeList(StringRef Name, const CGFunctionInfo &Info, CGCalleeInfo CalleeInfo, llvm::AttributeList &Attrs, unsigned &CallingConv, bool AttrOnCallSite, bool IsThunk)
Get the LLVM attributes and calling convention to use for a particular function type.
llvm::Constant * GetOrCreateLLVMGlobal(StringRef MangledName, llvm::Type *Ty, LangAS AddrSpace, const VarDecl *D, ForDefinition_t IsForDefinition=NotForDefinition)
GetOrCreateLLVMGlobal - If the specified mangled name is not in the module, create and return an llvm...
TBAAAccessInfo getTBAAAccessInfo(QualType AccessType)
getTBAAAccessInfo - Get TBAA information that describes an access to an object of the given type.
void setFunctionLinkage(GlobalDecl GD, llvm::Function *F)
llvm::Constant * GetAddrOfGlobal(GlobalDecl GD, ForDefinition_t IsForDefinition=NotForDefinition)
AtomicOptions getAtomicOpts()
Get the current Atomic options.
ConstantAddress GetAddrOfConstantCFString(const StringLiteral *Literal)
Return a pointer to a constant CFString object for the given string.
ProfileList::ExclusionType isFunctionBlockedFromProfileInstr(llvm::Function *Fn, SourceLocation Loc) const
void AddGlobalAnnotations(const ValueDecl *D, llvm::GlobalValue *GV)
Add global annotations that are set on D, for the global GV.
void setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const
Set the TLS mode for the given LLVM GlobalValue for the thread-local variable declaration D.
ConstantAddress GetAddrOfConstantStringFromLiteral(const StringLiteral *S, StringRef Name=".str")
Return a pointer to a constant array for the given string literal.
ASTContext & getContext() const
ConstantAddress GetAddrOfTemplateParamObject(const TemplateParamObjectDecl *TPO)
Get the address of a template parameter object.
void EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D)
Emit a code for threadprivate directive.
ConstantAddress GetAddrOfUnnamedGlobalConstantDecl(const UnnamedGlobalConstantDecl *GCD)
Get the address of a UnnamedGlobalConstant.
TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, TBAAAccessInfo TargetInfo)
mergeTBAAInfoForCast - Get merged TBAA information for the purposes of type casts.
llvm::Constant * GetAddrOfGlobalVar(const VarDecl *D, llvm::Type *Ty=nullptr, ForDefinition_t IsForDefinition=NotForDefinition)
Return the llvm::Constant for the address of the given global variable.
llvm::SanitizerStatReport & getSanStats()
llvm::Constant * EmitAnnotationString(StringRef Str)
Emit an annotation string.
void EmitOMPDeclareMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare mapper construct.
bool supportsCOMDAT() const
void RefreshTypeCacheForClass(const CXXRecordDecl *Class)
llvm::MDNode * getTBAATypeInfo(QualType QTy)
getTBAATypeInfo - Get metadata used to describe accesses to objects of the given type.
void EmitOMPRequiresDecl(const OMPRequiresDecl *D)
Emit a code for requires directive.
void HandleCXXStaticMemberVarInstantiation(VarDecl *VD)
Tell the consumer that this variable has been instantiated.
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
llvm::Constant * GetConstantArrayFromStringLiteral(const StringLiteral *E)
Return a constant array for the given string.
void SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV)
Set attributes which are common to any form of a global definition (alias, Objective-C method,...
std::optional< CharUnits > getOMPAllocateAlignment(const VarDecl *VD)
Return the alignment specified in an allocate directive, if present.
llvm::GlobalVariable * CreateOrReplaceCXXRuntimeVariable(StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes Linkage, llvm::Align Alignment)
Will return a global variable of the given type.
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
TBAAAccessInfo mergeTBAAInfoForConditionalOperator(TBAAAccessInfo InfoA, TBAAAccessInfo InfoB)
mergeTBAAInfoForConditionalOperator - Get merged TBAA information for the purposes of conditional ope...
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...
void setKCFIType(const FunctionDecl *FD, llvm::Function *F)
Set type metadata to the given function.
void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO)
void EmitOMPDeclareReduction(const OMPDeclareReductionDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare reduction construct.
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
void AddDetectMismatch(StringRef Name, StringRef Value)
Appends a detect mismatch command to the linker options.
void setDLLImportDLLExport(llvm::GlobalValue *GV, GlobalDecl D) const
llvm::Value * createOpenCLIntToSamplerConversion(const Expr *E, CodeGenFunction &CGF)
ConstantAddress GetAddrOfGlobalTemporary(const MaterializeTemporaryExpr *E, const Expr *Inner)
Returns a pointer to a global variable representing a temporary with static or thread storage duratio...
llvm::Constant * EmitNullConstant(QualType T)
Return the result of value-initializing the given type, i.e.
LangAS GetGlobalConstantAddressSpace() const
Return the AST address space of constant literal, which is used to emit the constant literal as globa...
LangAS GetGlobalVarAddressSpace(const VarDecl *D)
Return the AST address space of the underlying global variable for D, as determined by its declaratio...
void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, llvm::Function *F, bool IsThunk)
Set the LLVM function attributes (sext, zext, etc).
void EmitOpenACCRoutine(const OpenACCRoutineDecl *D, CodeGenFunction *CGF=nullptr)
void addReplacement(StringRef Name, llvm::Constant *C)
llvm::Constant * getConstantSignedPointer(llvm::Constant *Pointer, const PointerAuthSchema &Schema, llvm::Constant *StorageAddress, GlobalDecl SchemaDecl, QualType SchemaType)
Sign a constant pointer using the given scheme, producing a constant with the same IR type.
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::Metadata * CreateMetadataIdentifierForFnType(QualType T)
Create a metadata identifier for the given function type.
void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F)
Set the LLVM function attributes which only apply to a function definition.
llvm::Metadata * CreateMetadataIdentifierForVirtualMemPtrType(QualType T)
Create a metadata identifier that is intended to be used to check virtual calls via a member function...
ConstantAddress GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *)
Return a pointer to a constant array for the given ObjCEncodeExpr node.
const GlobalDecl getMangledNameDecl(StringRef)
void ClearUnusedCoverageMapping(const Decl *D)
Remove the deferred empty coverage mapping as this declaration is actually instrumented.
void EmitTopLevelDecl(Decl *D)
Emit code for a single top level declaration.
llvm::Constant * EmitAnnotationUnit(SourceLocation Loc)
Emit the annotation's translation unit.
ConstantAddress GetAddrOfConstantCString(const std::string &Str, StringRef GlobalName=".str")
Returns a pointer to a character array containing the literal and a terminating '\0' character.
void printPostfixForExternalizedDecl(llvm::raw_ostream &OS, const Decl *D) const
Print the postfix for externalized static variable or kernels for single source offloading languages ...
void moveLazyEmissionStates(CodeGenModule *NewBuilder)
Move some lazily-emitted states to the NewBuilder.
llvm::ConstantInt * getSize(CharUnits numChars)
Emit the given number of characters as a value of type size_t.
void finalizeKCFITypes()
Emit KCFI type identifier constants and remove unused identifiers.
void setValueProfilingFlag(llvm::Module &M)
void setProfileVersion(llvm::Module &M)
void emitEmptyCounterMapping(const Decl *D, StringRef FuncName, llvm::GlobalValue::LinkageTypes Linkage)
Emit a coverage mapping range with a counter zero for an unused declaration.
CodeGenTBAA - This class organizes the cross-module state that is used while lowering AST types to LL...
This class organizes the cross-module state that is used while lowering AST types to LLVM types.
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
const CGFunctionInfo & arrangeCXXMethodDeclaration(const CXXMethodDecl *MD)
C++ methods have some special rules and also have implicit parameters.
const CGFunctionInfo & arrangeFreeFunctionType(CanQual< FunctionProtoType > Ty)
Arrange the argument and result information for a value of the given freestanding function type.
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
void RefreshTypeCacheForClass(const CXXRecordDecl *RD)
Remove stale types from the type cache when an inheritance model gets assigned to a class.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
void UpdateCompletedType(const TagDecl *TD)
UpdateCompletedType - When we find the full definition for a TagDecl, replace the 'opaque' type we pr...
const CGFunctionInfo & arrangeGlobalDeclaration(GlobalDecl GD)
void EmitThunks(GlobalDecl GD)
EmitThunks - Emit the associated thunks for the given global decl.
A specialization of Address that requires the address to be an LLVM Constant.
static ConstantAddress invalid()
llvm::Constant * tryEmitForInitializer(const VarDecl &D)
Try to emit the initiaizer of the given declaration as an abstract constant.
void finalize(llvm::GlobalVariable *global)
llvm::Constant * emitAbstract(const Expr *E, QualType T)
Emit the result of the given expression as an abstract constant, asserting that it succeeded.
The standard implementation of ConstantInitBuilder used in Clang.
Organizes the cross-function state that is used while generating code coverage mapping data.
bool hasDiagnostics()
Whether or not the stats we've gathered indicate any potential problems.
void reportDiagnostics(DiagnosticsEngine &Diags, StringRef MainFile)
Report potential problems we've found to Diags.
TargetCodeGenInfo - This class organizes various target-specific codegeneration issues,...
virtual void getDependentLibraryOption(llvm::StringRef Lib, llvm::SmallString< 24 > &Opt) const
Gets the linker options necessary to link a dependent library on this platform.
const T & getABIInfo() const
virtual LangAS getGlobalVarAddressSpace(CodeGenModule &CGM, const VarDecl *D) const
Get target favored AST address space of a global variable for languages other than OpenCL and CUDA.
virtual void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const
setTargetAttributes - Provides a convenient hook to handle extra target-specific attributes for the g...
virtual LangAS getASTAllocaAddressSpace() const
Get the AST address space for alloca.
virtual void emitTargetMetadata(CodeGen::CodeGenModule &CGM, const llvm::MapVector< GlobalDecl, StringRef > &MangledDeclNames) const
emitTargetMetadata - Provides a convenient hook to handle extra target-specific metadata for the give...
virtual void emitTargetGlobals(CodeGen::CodeGenModule &CGM) const
Provides a convenient hook to handle extra target-specific globals.
virtual void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value, llvm::SmallString< 32 > &Opt) const
Gets the linker options necessary to detect object file mismatches on this platform.
Represents the canonical version of C arrays with a specified constant size.
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Stores additional source code information like skipped ranges which is required by the coverage mappi...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
void addDecl(Decl *D)
Add the declaration D into this context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Decl - This represents one declaration (or definition), e.g.
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
SourceLocation getEndLoc() const LLVM_READONLY
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
SourceLocation getBeginLoc() const LLVM_READONLY
TranslationUnitDecl * getTranslationUnitDecl()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Represents a ValueDecl that came out of a declarator.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
This represents one expression.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Represents a member of a struct/union/class.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
StringRef getName() const
The name of this FileEntry.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Represents a function declaration or definition.
bool isTargetClonesMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-clones functional...
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
bool isImmediateFunction() const
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isTargetVersionMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-version functiona...
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool doesDeclarationForceExternallyVisibleDefinition() const
For a function declaration in C or C++, determine whether this declaration causes the definition to b...
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
GlobalDecl - represents a global declaration.
GlobalDecl getWithMultiVersionIndex(unsigned Index)
CXXCtorType getCtorType() const
GlobalDecl getWithKernelReferenceKind(KernelReferenceKind Kind)
GlobalDecl getCanonicalDecl() const
KernelReferenceKind getKernelReferenceKind() const
GlobalDecl getWithDecl(const Decl *D)
unsigned getMultiVersionIndex() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
@ None
No signing for any function.
@ Swift5_0
Interoperability with the Swift 5.0 runtime.
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
VisibilityFromDLLStorageClassKinds
@ Keep
Keep the IR-gen assigned visibility.
@ Protected
Override the IR-gen assigned visibility with protected visibility.
@ Default
Override the IR-gen assigned visibility with default visibility.
@ Hidden
Override the IR-gen assigned visibility with hidden visibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
std::string CUID
The user provided compilation unit ID, if non-empty.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
Visibility getVisibility() const
void setLinkage(Linkage L)
Linkage getLinkage() const
bool isVisibilityExplicit() const
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
Parts getParts() const
Get the decomposed parts of this declaration.
APValue & getAsAPValue() const
Get the value of this MSGuidDecl as an APValue.
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
void mangleBlock(const DeclContext *DC, const BlockDecl *BD, raw_ostream &Out)
void mangleCtorBlock(const CXXConstructorDecl *CD, CXXCtorType CT, const BlockDecl *BD, raw_ostream &Out)
void mangleGlobalBlock(const BlockDecl *BD, const NamedDecl *ID, raw_ostream &Out)
bool shouldMangleDeclName(const NamedDecl *D)
void mangleName(GlobalDecl GD, raw_ostream &)
virtual void mangleCanonicalTypeName(QualType T, raw_ostream &, bool NormalizeIntegers=false)=0
Generates a unique string for an externally visible type for use with TBAA or type uniquing.
virtual void mangleStringLiteral(const StringLiteral *SL, raw_ostream &)=0
ManglerKind getKind() const
virtual void needsUniqueInternalLinkageNames()
virtual void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, raw_ostream &)=0
void mangleDtorBlock(const CXXDestructorDecl *CD, CXXDtorType DT, const BlockDecl *BD, raw_ostream &Out)
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
APValue * getOrCreateValue(bool MayCreate) const
Get the storage for the constant value of a materialized temporary of static storage duration.
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
unsigned getManglingNumber() const
Describes a module or submodule.
bool isInterfaceOrPartition() const
bool isNamedModuleUnit() const
Is this a C++20 named module unit.
Module * Parent
The parent of this module.
Module * getPrivateModuleFragment() const
Get the Private Module Fragment (sub-module) for this module, it there is one.
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Module * getGlobalModuleFragment() const
Get the Global Module Fragment (sub-module) for this module, it there is one.
llvm::iterator_range< submodule_iterator > submodules()
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
bool UseExportAsModuleLinkName
Autolinking uses the framework name for linking purposes when this is false and the export_as name ot...
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
bool isExternallyVisible() const
Represent a C++ namespace.
This represents 'pragma omp threadprivate ...' directive.
ObjCEncodeExpr, used for @encode in Objective-C.
QualType getEncodedType() const
propimpl_range property_impls() const
const ObjCInterfaceDecl * getClassInterface() const
void addInstanceMethod(ObjCMethodDecl *method)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
init_iterator init_end()
init_end() - Retrieve an iterator past the last initializer.
CXXCtorInitializer ** init_iterator
init_iterator - Iterates through the ivar initializer list.
init_iterator init_begin()
init_begin() - Retrieve an iterator to the first initializer.
unsigned getNumIvarInitializers() const
getNumArgs - Number of ivars which must be initialized.
void setHasDestructors(bool val)
void setHasNonZeroConstructors(bool val)
Represents an ObjC class declaration.
ObjCIvarDecl * all_declared_ivar_begin()
all_declared_ivar_begin - return first ivar declared in this class, its extensions and its implementa...
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarDecl * getNextIvar()
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
Represents one property declaration in an Objective-C interface.
ObjCMethodDecl * getGetterMethodDecl() const
bool isReadOnly() const
isReadOnly - Return true iff the property has a setter.
The basic abstraction for the target Objective-C runtime.
bool hasUnwindExceptions() const
Does this runtime use zero-cost exceptions?
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ GNUstep
'gnustep' is the modern non-fragile GNUstep runtime.
@ ObjFW
'objfw' is the Objective-C runtime included in ObjFW
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ GCC
'gcc' is the Objective-C runtime shipped with GCC, implementing a fragile Objective-C ABI
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
Represents a parameter to a function.
bool isAddressDiscriminated() const
uint16_t getConstantDiscrimination() const
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
Represents an unpacked "presumed" location which can be presented to the user.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
ExclusionType getDefault(llvm::driver::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFunctionExcluded(StringRef FunctionName, llvm::driver::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFileExcluded(StringRef FileName, llvm::driver::ProfileInstrKind Kind) const
ExclusionType
Represents if an how something should be excluded from profiling.
@ Skip
Profiling is skipped using the skipprofile attribute.
@ Allow
Profiling is allowed.
std::optional< ExclusionType > isLocationExcluded(SourceLocation Loc, llvm::driver::ProfileInstrKind Kind) const
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool isConstant(const ASTContext &Ctx) const
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType withCVRQualifiers(unsigned CVR) const
bool isConstQualified() const
Determine whether this type is const-qualified.
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Represents a struct/union/class.
field_range fields() const
virtual void completeDefinition()
Note that the definition of this type is now complete.
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
unsigned getLength() const
uint32_t getCodeUnit(size_t i) const
StringRef getString() const
unsigned getCharByteWidth() const
Represents the declaration of a struct/union/class/enum.
void startDefinition()
Starts the definition of this tag declaration.
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
bool isReadOnlyFeature(StringRef Feature) const
Determine whether the given target feature is read only.
virtual llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const
bool supportsIFunc() const
Identify whether this target supports IFuncs.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
@ Hostcall
printf lowering scheme involving hostcalls, currently used by HIP programs by default
A template parameter object.
const APValue & getValue() const
A declaration that models statements at global scope.
The top declaration context.
static DeclContext * castToDeclContext(const TranslationUnitDecl *D)
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool isHLSLResourceRecord() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isObjCObjectPointerType() const
Linkage getLinkage() const
Determine the linkage of this type.
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
bool isHLSLResourceRecordArray() const
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
const APValue & getValue() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Defines the clang::TargetInfo interface.
std::unique_ptr< TargetCodeGenInfo > createARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createM68kTargetCodeGenInfo(CodeGenModule &CGM)
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
std::unique_ptr< TargetCodeGenInfo > createBPFTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createMSP430TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createWebAssemblyTargetCodeGenInfo(CodeGenModule &CGM, WebAssemblyABIKind K)
std::unique_ptr< TargetCodeGenInfo > createPPC64_SVR4_TargetCodeGenInfo(CodeGenModule &CGM, PPC64_SVR4_ABIKind Kind, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createHexagonTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createNVPTXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createSystemZTargetCodeGenInfo(CodeGenModule &CGM, bool HasVector, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createWinX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters)
std::unique_ptr< TargetCodeGenInfo > createAIXTargetCodeGenInfo(CodeGenModule &CGM, bool Is64Bit)
std::unique_ptr< TargetCodeGenInfo > createAMDGPUTargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateMacObjCRuntime(CodeGenModule &CGM)
X86AVXABILevel
The AVX ABI level for X86 targets.
std::unique_ptr< TargetCodeGenInfo > createTCETargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateGNUObjCRuntime(CodeGenModule &CGM)
Creates an instance of an Objective-C runtime class.
std::unique_ptr< TargetCodeGenInfo > createWindowsARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind K)
std::unique_ptr< TargetCodeGenInfo > createAVRTargetCodeGenInfo(CodeGenModule &CGM, unsigned NPR, unsigned NRR)
std::unique_ptr< TargetCodeGenInfo > createDirectXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createARCTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createDefaultTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createSPIRVTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createSparcV8TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createVETargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCommonSPIRTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createRISCVTargetCodeGenInfo(CodeGenModule &CGM, unsigned XLen, unsigned FLen, bool EABI)
std::unique_ptr< TargetCodeGenInfo > createWindowsAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind K)
std::unique_ptr< TargetCodeGenInfo > createSparcV9TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createLanaiTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createPPC32TargetCodeGenInfo(CodeGenModule &CGM, bool SoftFloatABI)
CGCUDARuntime * CreateNVCUDARuntime(CodeGenModule &CGM)
Creates an instance of a CUDA runtime class.
std::unique_ptr< TargetCodeGenInfo > createLoongArchTargetCodeGenInfo(CodeGenModule &CGM, unsigned GRLen, unsigned FLen)
std::unique_ptr< TargetCodeGenInfo > createPPC64TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWinX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createXCoreTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCSKYTargetCodeGenInfo(CodeGenModule &CGM, unsigned FLen)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
constexpr bool isInitializedByPipeline(LangAS AS)
bool LT(InterpState &S, CodePtr OpPC)
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
@ Ctor_Base
Base object ctor.
@ Ctor_Complete
Complete object ctor.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
std::string getClangVendor()
Retrieves the Clang vendor tag.
@ ICIS_NoInit
No in-class initializer.
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
StringRef languageToString(Language L)
@ Dtor_VectorDeleting
Vector deleting dtor.
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object dtor.
@ Dtor_Deleting
Deleting dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, llvm::vfs::FileSystem &VFS, DiagnosticsEngine &Diags)
static const char * getCFBranchLabelSchemeFlagVal(const CFBranchLabelSchemeKind Scheme)
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
bool isExternallyVisible(Linkage L)
@ EST_None
no exception specification
std::string getClangFullVersion()
Retrieves a string representing the complete clang version, which includes the clang version number,...
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
cl::opt< bool > SystemHeadersCoverage
int const char * function
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
std::optional< StringRef > Architecture
llvm::SmallVector< StringRef, 8 > Features
llvm::CallingConv::ID RuntimeCC
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::PointerType * ConstGlobalsPtrTy
void* in the address space for constant globals
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * CharTy
char
LangAS ASTAllocaAddressSpace
unsigned char PointerWidthInBits
The width of a pointer into the generic address space.
unsigned char IntAlignInBytes
llvm::Type * HalfTy
half, bfloat, float, double
unsigned char SizeSizeInBytes
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * SizeTy
llvm::PointerType * GlobalsInt8PtrTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::IntegerType * IntTy
int
llvm::IntegerType * Int16Ty
llvm::PointerType * ProgramPtrTy
Pointer in program address space.
unsigned char PointerAlignInBytes
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
llvm::PointerType * AllocaInt8PtrTy
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool hasSideEffects() const
Return true if the evaluated expression has side effects.
Extra information about a function prototype.
static const LangStandard & getLangStandardForKind(Kind K)
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
A library or framework to link against when an entity from this module is used.
PointerAuthSchema InitFiniPointers
The ABI for function addresses in .init_array and .fini_array.
Describes how types, statements, expressions, and declarations should be printed.