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:
252 case llvm::Triple::x86: {
253 bool IsDarwinVectorABI = Triple.isOSDarwin();
254 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
256 if (Triple.getOS() == llvm::Triple::Win32) {
258 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
259 CodeGenOpts.NumRegisterParameters);
262 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
263 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
266 case llvm::Triple::x86_64: {
267 StringRef ABI =
Target.getABI();
268 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
269 : ABI ==
"avx" ? X86AVXABILevel::AVX
270 : X86AVXABILevel::None);
272 switch (Triple.getOS()) {
273 case llvm::Triple::UEFI:
274 case llvm::Triple::Win32:
280 case llvm::Triple::hexagon:
282 case llvm::Triple::lanai:
284 case llvm::Triple::r600:
286 case llvm::Triple::amdgcn:
288 case llvm::Triple::sparc:
290 case llvm::Triple::sparcv9:
292 case llvm::Triple::xcore:
294 case llvm::Triple::arc:
296 case llvm::Triple::spir:
297 case llvm::Triple::spir64:
299 case llvm::Triple::spirv32:
300 case llvm::Triple::spirv64:
301 case llvm::Triple::spirv:
303 case llvm::Triple::dxil:
305 case llvm::Triple::ve:
307 case llvm::Triple::csky: {
308 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
310 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
315 case llvm::Triple::bpfeb:
316 case llvm::Triple::bpfel:
318 case llvm::Triple::loongarch32:
319 case llvm::Triple::loongarch64: {
320 StringRef ABIStr =
Target.getABI();
321 unsigned ABIFRLen = 0;
322 if (ABIStr.ends_with(
"f"))
324 else if (ABIStr.ends_with(
"d"))
333 if (!TheTargetCodeGenInfo)
335 return *TheTargetCodeGenInfo;
339 llvm::LLVMContext &Context,
343 if (Opts.AlignDouble || Opts.OpenCL)
346 llvm::Triple Triple =
Target.getTriple();
347 llvm::DataLayout DL(
Target.getDataLayoutString());
348 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
349 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
350 llvm::Align ClangAlign(Alignment / 8);
351 if (DLAlign != ClangAlign) {
352 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
353 <<
" mapping to " << *Ty <<
" has data layout alignment "
354 << DLAlign.value() <<
" while clang specifies "
355 << ClangAlign.value() <<
"\n";
360 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
362 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
364 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
366 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
369 if (Triple.getArch() != llvm::Triple::m68k)
370 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
373 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
374 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
375 Triple.getArch() != llvm::Triple::ve)
376 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
378 if (
Target.hasFloat16Type())
379 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
381 if (
Target.hasBFloat16Type())
382 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
383 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
385 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
388 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
390 if (
Target.hasFloat128Type())
391 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
392 if (
Target.hasIbm128Type())
393 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
395 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
397 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
398 llvm::errs() <<
"Datalayout for target " << Triple.str()
399 <<
" sets element-aligned vectors to '"
400 <<
Target.vectorsAreElementAligned()
401 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
415 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
416 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
418 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
424 llvm::LLVMContext &LLVMContext = M.getContext();
425 VoidTy = llvm::Type::getVoidTy(LLVMContext);
426 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
427 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
428 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
429 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
430 HalfTy = llvm::Type::getHalfTy(LLVMContext);
431 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
432 FloatTy = llvm::Type::getFloatTy(LLVMContext);
433 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
439 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
441 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
443 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
444 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
445 IntPtrTy = llvm::IntegerType::get(LLVMContext,
446 C.getTargetInfo().getMaxPointerWidth());
447 Int8PtrTy = llvm::PointerType::get(LLVMContext,
449 const llvm::DataLayout &DL = M.getDataLayout();
451 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
453 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
455 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
472 createOpenCLRuntime();
474 createOpenMPRuntime();
481 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
482 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
488 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
489 CodeGenOpts.CoverageNotesFile.size() ||
490 CodeGenOpts.CoverageDataFile.size())
498 Block.GlobalUniqueCount = 0;
500 if (
C.getLangOpts().ObjC)
503 if (CodeGenOpts.hasProfileClangUse()) {
504 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
505 CodeGenOpts.ProfileInstrumentUsePath, *FS,
506 CodeGenOpts.ProfileRemappingFile);
507 if (
auto E = ReaderOrErr.takeError()) {
508 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
509 Diags.Report(diag::err_reading_profile)
510 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
514 PGOReader = std::move(ReaderOrErr.get());
519 if (CodeGenOpts.CoverageMapping)
523 if (CodeGenOpts.UniqueInternalLinkageNames &&
524 !
getModule().getSourceFileName().empty()) {
525 std::string Path =
getModule().getSourceFileName();
527 for (
const auto &Entry : LangOpts.MacroPrefixMap)
528 if (Path.rfind(Entry.first, 0) != std::string::npos) {
529 Path = Entry.second + Path.substr(Entry.first.size());
532 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
536 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
537 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
538 CodeGenOpts.NumRegisterParameters);
547 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
548 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
550 this->MSHotPatchFunctions.push_back(std::string{*I});
552 auto &DE = Context.getDiagnostics();
553 DE.Report(diag::err_open_hotpatch_file_failed)
555 << BufOrErr.getError().message();
560 this->MSHotPatchFunctions.push_back(FuncName);
562 llvm::sort(this->MSHotPatchFunctions);
565 if (!Context.getAuxTargetInfo())
571void CodeGenModule::createObjCRuntime() {
588 llvm_unreachable(
"bad runtime kind");
591void CodeGenModule::createOpenCLRuntime() {
595void CodeGenModule::createOpenMPRuntime() {
596 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
597 Diags.Report(diag::err_omp_host_ir_file_not_found)
598 << LangOpts.OMPHostIRFile;
603 case llvm::Triple::nvptx:
604 case llvm::Triple::nvptx64:
605 case llvm::Triple::amdgcn:
606 case llvm::Triple::spirv64:
609 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
610 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
613 if (LangOpts.OpenMPSimd)
614 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
616 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
621void CodeGenModule::createCUDARuntime() {
625void CodeGenModule::createHLSLRuntime() {
626 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
630 Replacements[Name] =
C;
633void CodeGenModule::applyReplacements() {
634 for (
auto &I : Replacements) {
635 StringRef MangledName = I.first;
636 llvm::Constant *Replacement = I.second;
641 auto *NewF = dyn_cast<llvm::Function>(Replacement);
643 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
644 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
647 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
648 CE->getOpcode() == llvm::Instruction::GetElementPtr);
649 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
654 OldF->replaceAllUsesWith(Replacement);
656 NewF->removeFromParent();
657 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
660 OldF->eraseFromParent();
665 GlobalValReplacements.push_back(std::make_pair(GV,
C));
668void CodeGenModule::applyGlobalValReplacements() {
669 for (
auto &I : GlobalValReplacements) {
670 llvm::GlobalValue *GV = I.first;
671 llvm::Constant *
C = I.second;
673 GV->replaceAllUsesWith(
C);
674 GV->eraseFromParent();
681 const llvm::Constant *
C;
682 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
683 C = GA->getAliasee();
684 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
685 C = GI->getResolver();
689 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
693 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
702 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
703 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
707 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
711 if (GV->hasCommonLinkage()) {
712 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
713 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
714 Diags.
Report(Location, diag::err_alias_to_common);
719 if (GV->isDeclaration()) {
720 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
721 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
722 << IsIFunc << IsIFunc;
725 for (
const auto &[
Decl, Name] : MangledDeclNames) {
726 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
728 if (II && II->
getName() == GV->getName()) {
729 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
733 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
743 const auto *F = dyn_cast<llvm::Function>(GV);
745 Diags.
Report(Location, diag::err_alias_to_undefined)
746 << IsIFunc << IsIFunc;
750 llvm::FunctionType *FTy = F->getFunctionType();
751 if (!FTy->getReturnType()->isPointerTy()) {
752 Diags.
Report(Location, diag::err_ifunc_resolver_return);
766 if (GVar->hasAttribute(
"toc-data")) {
767 auto GVId = GVar->getName();
770 Diags.
Report(Location, diag::warn_toc_unsupported_type)
771 << GVId <<
"the variable has an alias";
773 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
774 llvm::AttributeSet NewAttributes =
775 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
776 GVar->setAttributes(NewAttributes);
780void CodeGenModule::checkAliases() {
785 DiagnosticsEngine &Diags =
getDiags();
786 for (
const GlobalDecl &GD : Aliases) {
788 SourceLocation Location;
790 bool IsIFunc = D->hasAttr<IFuncAttr>();
791 if (
const Attr *A = D->getDefiningAttr()) {
792 Location = A->getLocation();
793 Range = A->getRange();
795 llvm_unreachable(
"Not an alias or ifunc?");
799 const llvm::GlobalValue *GV =
nullptr;
801 MangledDeclNames, Range)) {
807 if (
const llvm::GlobalVariable *GVar =
808 dyn_cast<const llvm::GlobalVariable>(GV))
812 llvm::Constant *Aliasee =
816 llvm::GlobalValue *AliaseeGV;
817 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
822 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
823 StringRef AliasSection = SA->getName();
824 if (AliasSection != AliaseeGV->getSection())
825 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
826 << AliasSection << IsIFunc << IsIFunc;
834 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
835 if (GA->isInterposable()) {
836 Diags.Report(Location, diag::warn_alias_to_weak_alias)
837 << GV->getName() << GA->getName() << IsIFunc;
838 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
839 GA->getAliasee(), Alias->getType());
851 llvm::Attribute::DisableSanitizerInstrumentation);
856 for (
const GlobalDecl &GD : Aliases) {
859 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
860 Alias->eraseFromParent();
865 DeferredDeclsToEmit.clear();
866 EmittedDeferredDecls.clear();
867 DeferredAnnotations.clear();
869 OpenMPRuntime->clear();
873 StringRef MainFile) {
876 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
877 if (MainFile.empty())
878 MainFile =
"<stdin>";
879 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
882 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
885 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
889static std::optional<llvm::GlobalValue::VisibilityTypes>
896 return llvm::GlobalValue::DefaultVisibility;
898 return llvm::GlobalValue::HiddenVisibility;
900 return llvm::GlobalValue::ProtectedVisibility;
902 llvm_unreachable(
"unknown option value!");
907 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
916 GV.setDSOLocal(
false);
917 GV.setVisibility(*
V);
922 if (!LO.VisibilityFromDLLStorageClass)
925 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
928 std::optional<llvm::GlobalValue::VisibilityTypes>
929 NoDLLStorageClassVisibility =
932 std::optional<llvm::GlobalValue::VisibilityTypes>
933 ExternDeclDLLImportVisibility =
936 std::optional<llvm::GlobalValue::VisibilityTypes>
937 ExternDeclNoDLLStorageClassVisibility =
940 for (llvm::GlobalValue &GV : M.global_values()) {
941 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
944 if (GV.isDeclarationForLinker())
946 llvm::GlobalValue::DLLImportStorageClass
947 ? ExternDeclDLLImportVisibility
948 : ExternDeclNoDLLStorageClassVisibility);
951 llvm::GlobalValue::DLLExportStorageClass
952 ? DLLExportVisibility
953 : NoDLLStorageClassVisibility);
955 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
960 const llvm::Triple &Triple,
964 return LangOpts.getStackProtector() == Mode;
967std::optional<llvm::Attribute::AttrKind>
969 if (D && D->
hasAttr<NoStackProtectorAttr>())
971 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
973 return llvm::Attribute::StackProtectStrong;
975 return llvm::Attribute::StackProtect;
977 return llvm::Attribute::StackProtectStrong;
979 return llvm::Attribute::StackProtectReq;
986 EmitModuleInitializers(Primary);
988 DeferredDecls.insert_range(EmittedDeferredDecls);
989 EmittedDeferredDecls.clear();
990 EmitVTablesOpportunistically();
991 applyGlobalValReplacements();
993 emitMultiVersionFunctions();
994 emitPFPFieldsWithEvaluatedOffset();
996 if (Context.getLangOpts().IncrementalExtensions &&
997 GlobalTopLevelStmtBlockInFlight.first) {
999 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1000 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1006 EmitCXXModuleInitFunc(Primary);
1008 EmitCXXGlobalInitFunc();
1009 EmitCXXGlobalCleanUpFunc();
1010 registerGlobalDtorsWithAtExit();
1011 EmitCXXThreadLocalInitFunc();
1013 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1015 if (Context.getLangOpts().CUDA && CUDARuntime) {
1016 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1019 if (OpenMPRuntime) {
1020 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1021 OpenMPRuntime->clear();
1025 PGOReader->getSummary(
false).getMD(VMContext),
1026 llvm::ProfileSummary::PSK_Instr);
1027 if (PGOStats.hasDiagnostics())
1033 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1034 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1036 EmitStaticExternCAliases();
1041 if (CoverageMapping)
1042 CoverageMapping->emit();
1043 if (CodeGenOpts.SanitizeCfiCrossDso) {
1047 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1049 emitAtAvailableLinkGuard();
1050 if (Context.getTargetInfo().getTriple().isWasm())
1057 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1058 llvm::CodeObjectVersionKind::COV_None) {
1059 getModule().addModuleFlag(llvm::Module::Error,
1060 "amdhsa_code_object_version",
1061 getTarget().getTargetOpts().CodeObjectVersion);
1066 auto *MDStr = llvm::MDString::get(
1071 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1080 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1082 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1084 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1088 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1092 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1094 auto *GV =
new llvm::GlobalVariable(
1095 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1096 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1102 auto *GV =
new llvm::GlobalVariable(
1104 llvm::Constant::getNullValue(
Int8Ty),
1113 if (CodeGenOpts.Autolink &&
1114 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1115 EmitModuleLinkOptions();
1130 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1131 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1132 for (
auto *MD : ELFDependentLibraries)
1133 NMD->addOperand(MD);
1136 if (CodeGenOpts.DwarfVersion) {
1137 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1138 CodeGenOpts.DwarfVersion);
1141 if (CodeGenOpts.Dwarf64)
1142 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1144 if (Context.getLangOpts().SemanticInterposition)
1146 getModule().setSemanticInterposition(
true);
1148 if (CodeGenOpts.EmitCodeView) {
1150 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1152 if (CodeGenOpts.CodeViewGHash) {
1153 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1155 if (CodeGenOpts.ControlFlowGuard) {
1158 llvm::Module::Warning,
"cfguard",
1159 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1160 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1163 llvm::Module::Warning,
"cfguard",
1164 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1166 if (CodeGenOpts.EHContGuard) {
1168 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1170 if (Context.getLangOpts().Kernel) {
1172 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1174 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1179 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1181 llvm::Metadata *Ops[2] = {
1182 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1183 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1184 llvm::Type::getInt32Ty(VMContext), 1))};
1186 getModule().addModuleFlag(llvm::Module::Require,
1187 "StrictVTablePointersRequirement",
1188 llvm::MDNode::get(VMContext, Ops));
1194 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1195 llvm::DEBUG_METADATA_VERSION);
1200 uint64_t WCharWidth =
1201 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1202 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1203 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1206 getModule().addModuleFlag(llvm::Module::Warning,
1207 "zos_product_major_version",
1208 uint32_t(CLANG_VERSION_MAJOR));
1209 getModule().addModuleFlag(llvm::Module::Warning,
1210 "zos_product_minor_version",
1211 uint32_t(CLANG_VERSION_MINOR));
1212 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1213 uint32_t(CLANG_VERSION_PATCHLEVEL));
1215 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1216 llvm::MDString::get(VMContext, ProductId));
1221 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1222 llvm::MDString::get(VMContext, lang_str));
1224 time_t TT = PreprocessorOpts.SourceDateEpoch
1225 ? *PreprocessorOpts.SourceDateEpoch
1226 : std::time(
nullptr);
1227 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1228 static_cast<uint64_t
>(TT));
1231 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1232 llvm::MDString::get(VMContext,
"ascii"));
1235 llvm::Triple T = Context.getTargetInfo().getTriple();
1236 if (T.isARM() || T.isThumb()) {
1238 uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1239 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1243 StringRef ABIStr = Target.getABI();
1244 llvm::LLVMContext &Ctx = TheModule.getContext();
1245 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1246 llvm::MDString::get(Ctx, ABIStr));
1251 const std::vector<std::string> &Features =
1254 llvm::RISCVISAInfo::parseFeatures(T.isRISCV64() ? 64 : 32, Features);
1255 if (!errorToBool(ParseResult.takeError()))
1257 llvm::Module::AppendUnique,
"riscv-isa",
1259 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1262 if (CodeGenOpts.SanitizeCfiCrossDso) {
1264 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1267 if (CodeGenOpts.WholeProgramVTables) {
1271 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1272 CodeGenOpts.VirtualFunctionElimination);
1275 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1276 getModule().addModuleFlag(llvm::Module::Override,
1277 "CFI Canonical Jump Tables",
1278 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1281 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1282 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1286 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1288 llvm::Module::Append,
"Unique Source File Identifier",
1290 TheModule.getContext(),
1291 llvm::MDString::get(TheModule.getContext(),
1292 CodeGenOpts.UniqueSourceFileIdentifier)));
1295 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1296 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1299 if (CodeGenOpts.PatchableFunctionEntryOffset)
1300 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1301 CodeGenOpts.PatchableFunctionEntryOffset);
1302 if (CodeGenOpts.SanitizeKcfiArity)
1303 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1306 llvm::Module::Override,
"kcfi-hash",
1307 llvm::MDString::get(
1309 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1312 if (CodeGenOpts.CFProtectionReturn &&
1313 Target.checkCFProtectionReturnSupported(
getDiags())) {
1315 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1319 if (CodeGenOpts.CFProtectionBranch &&
1320 Target.checkCFProtectionBranchSupported(
getDiags())) {
1322 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1325 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1326 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1328 Scheme = Target.getDefaultCFBranchLabelScheme();
1330 llvm::Module::Error,
"cf-branch-label-scheme",
1336 if (CodeGenOpts.FunctionReturnThunks)
1337 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1339 if (CodeGenOpts.IndirectBranchCSPrefix)
1340 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1351 if (Context.getTargetInfo().hasFeature(
"ptrauth") &&
1352 LangOpts.getSignReturnAddressScope() !=
1354 getModule().addModuleFlag(llvm::Module::Override,
1355 "sign-return-address-buildattr", 1);
1356 if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
1357 getModule().addModuleFlag(llvm::Module::Override,
1358 "tag-stack-memory-buildattr", 1);
1360 if (T.isARM() || T.isThumb() || T.isAArch64()) {
1368 if (LangOpts.BranchTargetEnforcement)
1369 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1371 if (LangOpts.BranchProtectionPAuthLR)
1372 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1374 if (LangOpts.GuardedControlStack)
1375 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1376 if (LangOpts.hasSignReturnAddress())
1377 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1378 if (LangOpts.isSignReturnAddressScopeAll())
1379 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1381 if (!LangOpts.isSignReturnAddressWithAKey())
1382 getModule().addModuleFlag(llvm::Module::Min,
1383 "sign-return-address-with-bkey", 2);
1385 if (LangOpts.PointerAuthELFGOT)
1386 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-elf-got", 1);
1389 if (LangOpts.PointerAuthCalls)
1390 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-sign-personality",
1393 using namespace llvm::ELF;
1394 uint64_t PAuthABIVersion =
1395 (LangOpts.PointerAuthIntrinsics
1396 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1397 (LangOpts.PointerAuthCalls
1398 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1399 (LangOpts.PointerAuthReturns
1400 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1401 (LangOpts.PointerAuthAuthTraps
1402 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1403 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1404 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1405 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1406 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1407 (LangOpts.PointerAuthInitFini
1408 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1409 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1410 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1411 (LangOpts.PointerAuthELFGOT
1412 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1413 (LangOpts.PointerAuthIndirectGotos
1414 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1415 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1416 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1417 (LangOpts.PointerAuthFunctionTypeDiscrimination
1418 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1419 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1420 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1421 "Update when new enum items are defined");
1422 if (PAuthABIVersion != 0) {
1423 getModule().addModuleFlag(llvm::Module::Error,
1424 "aarch64-elf-pauthabi-platform",
1425 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1426 getModule().addModuleFlag(llvm::Module::Error,
1427 "aarch64-elf-pauthabi-version",
1432 if ((T.isARM() || T.isThumb()) &&
getTriple().isTargetAEABI() &&
1434 uint32_t TagVal = 0;
1435 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1437 llvm::DenormalMode::getPositiveZero()) {
1438 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1440 llvm::DenormalMode::getIEEE()) {
1441 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1442 DenormalTagBehavior = llvm::Module::Override;
1444 llvm::DenormalMode::getPreserveSign()) {
1445 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1447 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1452 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1453 llvm::ARMBuildAttrs::Allowed);
1456 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1458 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1459 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1463 if (CodeGenOpts.StackClashProtector)
1465 llvm::Module::Override,
"probe-stack",
1466 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1468 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1469 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1470 CodeGenOpts.StackProbeSize);
1472 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1473 llvm::LLVMContext &Ctx = TheModule.getContext();
1475 llvm::Module::Error,
"MemProfProfileFilename",
1476 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1479 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1483 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1484 CodeGenOpts.FP32DenormalMode.Output !=
1485 llvm::DenormalMode::IEEE);
1488 if (LangOpts.EHAsynch)
1489 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1492 if (CodeGenOpts.ImportCallOptimization)
1493 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1497 if (CodeGenOpts.getWinX64EHUnwindV2() != llvm::WinX64EHUnwindV2Mode::Disabled)
1499 llvm::Module::Warning,
"winx64-eh-unwindv2",
1500 static_cast<unsigned>(CodeGenOpts.getWinX64EHUnwindV2()));
1504 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1506 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1510 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1511 EmitOpenCLMetadata();
1518 auto Version = LangOpts.getOpenCLCompatibleVersion();
1519 llvm::Metadata *SPIRVerElts[] = {
1520 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1522 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1523 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1524 llvm::NamedMDNode *SPIRVerMD =
1525 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1526 llvm::LLVMContext &Ctx = TheModule.getContext();
1527 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1535 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1536 assert(PLevel < 3 &&
"Invalid PIC Level");
1537 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1538 if (Context.getLangOpts().PIE)
1539 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1543 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1544 .Case(
"tiny", llvm::CodeModel::Tiny)
1545 .Case(
"small", llvm::CodeModel::Small)
1546 .Case(
"kernel", llvm::CodeModel::Kernel)
1547 .Case(
"medium", llvm::CodeModel::Medium)
1548 .Case(
"large", llvm::CodeModel::Large)
1551 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1554 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1555 Context.getTargetInfo().getTriple().getArch() ==
1556 llvm::Triple::x86_64) {
1562 if (CodeGenOpts.NoPLT)
1565 CodeGenOpts.DirectAccessExternalData !=
1566 getModule().getDirectAccessExternalData()) {
1567 getModule().setDirectAccessExternalData(
1568 CodeGenOpts.DirectAccessExternalData);
1570 if (CodeGenOpts.UnwindTables)
1571 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1573 switch (CodeGenOpts.getFramePointer()) {
1578 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1581 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1584 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1587 getModule().setFramePointer(llvm::FramePointerKind::All);
1591 SimplifyPersonality();
1604 EmitVersionIdentMetadata();
1607 EmitCommandLineMetadata();
1615 getModule().setStackProtectorGuardSymbol(
1618 getModule().setStackProtectorGuardOffset(
1623 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1625 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1627 if (
getContext().getTargetInfo().getMaxTLSAlign())
1628 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1629 getContext().getTargetInfo().getMaxTLSAlign());
1647 if (!MustTailCallUndefinedGlobals.empty()) {
1649 for (
auto &I : MustTailCallUndefinedGlobals) {
1650 if (!I.first->isDefined())
1651 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1655 if (!Entry || Entry->isWeakForLinker() ||
1656 Entry->isDeclarationForLinker())
1657 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1661 for (
auto &I : MustTailCallUndefinedGlobals) {
1670 if (Entry->isDeclarationForLinker()) {
1673 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
1675 CalleeIsLocal = Entry->isDSOLocal();
1679 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
1690 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
1691 ErrnoTBAAMD->addOperand(IntegerNode);
1696void CodeGenModule::EmitOpenCLMetadata() {
1702 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1703 llvm::Metadata *OCLVerElts[] = {
1704 llvm::ConstantAsMetadata::get(
1705 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1706 llvm::ConstantAsMetadata::get(
1707 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1708 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1709 llvm::LLVMContext &Ctx = TheModule.getContext();
1710 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1713 EmitVersion(
"opencl.ocl.version", CLVersion);
1714 if (LangOpts.OpenCLCPlusPlus) {
1716 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1720void CodeGenModule::EmitBackendOptionsMetadata(
1721 const CodeGenOptions &CodeGenOpts) {
1723 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1724 CodeGenOpts.SmallDataLimit);
1728 if (LangOpts.AllocTokenMode) {
1729 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
1730 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
1731 llvm::MDString::get(VMContext, S));
1733 if (LangOpts.AllocTokenMax)
1735 llvm::Module::Error,
"alloc-token-max",
1736 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1737 *LangOpts.AllocTokenMax));
1738 if (CodeGenOpts.SanitizeAllocTokenFastABI)
1739 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
1740 if (CodeGenOpts.SanitizeAllocTokenExtended)
1741 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
1757 return TBAA->getTypeInfo(QTy);
1776 return TBAA->getAccessInfo(AccessType);
1783 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1789 return TBAA->getTBAAStructInfo(QTy);
1795 return TBAA->getBaseTypeInfo(QTy);
1801 return TBAA->getAccessTagInfo(Info);
1808 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1816 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1824 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1830 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1835 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1847 std::string Msg =
Type;
1849 diag::err_codegen_unsupported)
1855 diag::err_codegen_unsupported)
1862 std::string Msg =
Type;
1864 diag::err_codegen_unsupported)
1869 llvm::function_ref<
void()> Fn) {
1870 StackHandler.runWithSufficientStackSpace(Loc, Fn);
1880 if (GV->hasLocalLinkage()) {
1881 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1894 if (Context.getLangOpts().OpenMP &&
1895 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
1896 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
1897 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
1898 OMPDeclareTargetDeclAttr::DT_NoHost &&
1900 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1907 if (Context.getLangOpts().CUDAIsDevice &&
1909 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
1910 bool NeedsProtected =
false;
1914 else if (
const auto *VD = dyn_cast<VarDecl>(D))
1915 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
1916 VD->hasAttr<CUDAConstantAttr>() ||
1917 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
1918 VD->getType()->isCUDADeviceBuiltinTextureType();
1919 if (NeedsProtected) {
1920 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1926 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
1930 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
1934 if (GV->hasDLLExportStorageClass()) {
1937 diag::err_hidden_visibility_dllexport);
1940 diag::err_non_default_visibility_dllimport);
1946 !GV->isDeclarationForLinker())
1951 llvm::GlobalValue *GV) {
1952 if (GV->hasLocalLinkage())
1955 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
1959 if (GV->hasDLLImportStorageClass())
1962 const llvm::Triple &TT = CGM.
getTriple();
1964 if (TT.isOSCygMing()) {
1982 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
1990 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
1994 if (!TT.isOSBinFormatELF())
2000 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2008 return !(CGM.
getLangOpts().SemanticInterposition ||
2013 if (!GV->isDeclarationForLinker())
2019 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2026 if (CGOpts.DirectAccessExternalData) {
2032 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2033 if (!Var->isThreadLocal())
2058 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2060 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2070 if (D->
hasAttr<DLLImportAttr>())
2071 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2072 else if ((D->
hasAttr<DLLExportAttr>() ||
2074 !GV->isDeclarationForLinker())
2075 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2095 GV->setPartition(CodeGenOpts.SymbolPartition);
2099 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2100 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2101 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2102 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2103 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2106llvm::GlobalVariable::ThreadLocalMode
2108 switch (CodeGenOpts.getDefaultTLSModel()) {
2110 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2112 return llvm::GlobalVariable::LocalDynamicTLSModel;
2114 return llvm::GlobalVariable::InitialExecTLSModel;
2116 return llvm::GlobalVariable::LocalExecTLSModel;
2118 llvm_unreachable(
"Invalid TLS model!");
2122 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2124 llvm::GlobalValue::ThreadLocalMode TLM;
2128 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2132 GV->setThreadLocalMode(TLM);
2138 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2142 const CPUSpecificAttr *
Attr,
2164 bool OmitMultiVersionMangling =
false) {
2166 llvm::raw_svector_ostream Out(Buffer);
2175 assert(II &&
"Attempt to mangle unnamed decl.");
2176 const auto *FD = dyn_cast<FunctionDecl>(ND);
2181 Out <<
"__regcall4__" << II->
getName();
2183 Out <<
"__regcall3__" << II->
getName();
2184 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2186 Out <<
"__device_stub__" << II->
getName();
2188 DeviceKernelAttr::isOpenCLSpelling(
2189 FD->getAttr<DeviceKernelAttr>()) &&
2191 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2207 "Hash computed when not explicitly requested");
2211 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2212 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2213 switch (FD->getMultiVersionKind()) {
2217 FD->getAttr<CPUSpecificAttr>(),
2221 auto *
Attr = FD->getAttr<TargetAttr>();
2222 assert(
Attr &&
"Expected TargetAttr to be present "
2223 "for attribute mangling");
2229 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2230 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2231 "for attribute mangling");
2237 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2238 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2239 "for attribute mangling");
2246 llvm_unreachable(
"None multiversion type isn't valid here");
2256 return std::string(Out.str());
2259void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2260 const FunctionDecl *FD,
2261 StringRef &CurName) {
2268 std::string NonTargetName =
2276 "Other GD should now be a multiversioned function");
2286 if (OtherName != NonTargetName) {
2289 const auto ExistingRecord = Manglings.find(NonTargetName);
2290 if (ExistingRecord != std::end(Manglings))
2291 Manglings.remove(&(*ExistingRecord));
2292 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2297 CurName = OtherNameRef;
2299 Entry->setName(OtherName);
2309 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2323 auto FoundName = MangledDeclNames.find(CanonicalGD);
2324 if (FoundName != MangledDeclNames.end())
2325 return FoundName->second;
2362 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2363 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2372 llvm::raw_svector_ostream Out(Buffer);
2375 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2376 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2378 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2383 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2384 return Result.first->first();
2388 auto it = MangledDeclNames.begin();
2389 while (it != MangledDeclNames.end()) {
2390 if (it->second == Name)
2405 llvm::Constant *AssociatedData) {
2407 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2413 bool IsDtorAttrFunc) {
2414 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2416 DtorsUsingAtExit[Priority].push_back(Dtor);
2421 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2424void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2425 if (Fns.empty())
return;
2431 llvm::PointerType *PtrTy = llvm::PointerType::get(
2432 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2435 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2439 auto Ctors = Builder.beginArray(CtorStructTy);
2440 for (
const auto &I : Fns) {
2441 auto Ctor = Ctors.beginStruct(CtorStructTy);
2442 Ctor.addInt(
Int32Ty, I.Priority);
2443 if (InitFiniAuthSchema) {
2444 llvm::Constant *StorageAddress =
2446 ? llvm::ConstantExpr::getIntToPtr(
2447 llvm::ConstantInt::get(
2449 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2453 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2454 llvm::ConstantInt::get(
2456 Ctor.add(SignedCtorPtr);
2458 Ctor.add(I.Initializer);
2460 if (I.AssociatedData)
2461 Ctor.add(I.AssociatedData);
2463 Ctor.addNullPointer(PtrTy);
2464 Ctor.finishAndAddTo(Ctors);
2467 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2469 llvm::GlobalValue::AppendingLinkage);
2473 List->setAlignment(std::nullopt);
2478llvm::GlobalValue::LinkageTypes
2484 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2491 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2492 if (!MDS)
return nullptr;
2494 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2501 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2502 if (!UD->
hasAttr<TransparentUnionAttr>())
2504 if (!UD->
fields().empty())
2505 return UD->
fields().begin()->getType();
2514 bool GeneralizePointers) {
2527 bool GeneralizePointers) {
2530 for (
auto &Param : FnType->param_types())
2531 GeneralizedParams.push_back(
2535 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2536 GeneralizedParams, FnType->getExtProtoInfo());
2541 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2543 llvm_unreachable(
"Encountered unknown FunctionType");
2551 FnType->getReturnType(), FnType->getParamTypes(),
2552 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2554 std::string OutName;
2555 llvm::raw_string_ostream Out(OutName);
2563 Out <<
".normalized";
2565 Out <<
".generalized";
2567 return llvm::ConstantInt::get(
2573 llvm::Function *F,
bool IsThunk) {
2575 llvm::AttributeList PAL;
2578 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2582 Loc = D->getLocation();
2584 Error(Loc,
"__vectorcall calling convention is not currently supported");
2586 F->setAttributes(PAL);
2587 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2591 std::string ReadOnlyQual(
"__read_only");
2592 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2593 if (ReadOnlyPos != std::string::npos)
2595 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2597 std::string WriteOnlyQual(
"__write_only");
2598 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2599 if (WriteOnlyPos != std::string::npos)
2600 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2602 std::string ReadWriteQual(
"__read_write");
2603 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2604 if (ReadWritePos != std::string::npos)
2605 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2638 assert(((FD && CGF) || (!FD && !CGF)) &&
2639 "Incorrect use - FD and CGF should either be both null or not!");
2665 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2668 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2673 std::string typeQuals;
2677 const Decl *PDecl = parm;
2679 PDecl = TD->getDecl();
2680 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2681 if (A && A->isWriteOnly())
2682 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2683 else if (A && A->isReadWrite())
2684 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2686 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2688 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2690 auto getTypeSpelling = [&](
QualType Ty) {
2691 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2693 if (Ty.isCanonical()) {
2694 StringRef typeNameRef = typeName;
2696 if (typeNameRef.consume_front(
"unsigned "))
2697 return std::string(
"u") + typeNameRef.str();
2698 if (typeNameRef.consume_front(
"signed "))
2699 return typeNameRef.str();
2709 addressQuals.push_back(
2710 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2714 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2715 std::string baseTypeName =
2717 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2718 argBaseTypeNames.push_back(
2719 llvm::MDString::get(VMContext, baseTypeName));
2723 typeQuals =
"restrict";
2726 typeQuals += typeQuals.empty() ?
"const" :
" const";
2728 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2730 uint32_t AddrSpc = 0;
2735 addressQuals.push_back(
2736 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2740 std::string typeName = getTypeSpelling(ty);
2752 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2753 argBaseTypeNames.push_back(
2754 llvm::MDString::get(VMContext, baseTypeName));
2759 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2763 Fn->setMetadata(
"kernel_arg_addr_space",
2764 llvm::MDNode::get(VMContext, addressQuals));
2765 Fn->setMetadata(
"kernel_arg_access_qual",
2766 llvm::MDNode::get(VMContext, accessQuals));
2767 Fn->setMetadata(
"kernel_arg_type",
2768 llvm::MDNode::get(VMContext, argTypeNames));
2769 Fn->setMetadata(
"kernel_arg_base_type",
2770 llvm::MDNode::get(VMContext, argBaseTypeNames));
2771 Fn->setMetadata(
"kernel_arg_type_qual",
2772 llvm::MDNode::get(VMContext, argTypeQuals));
2776 Fn->setMetadata(
"kernel_arg_name",
2777 llvm::MDNode::get(VMContext, argNames));
2787 if (!LangOpts.Exceptions)
return false;
2790 if (LangOpts.CXXExceptions)
return true;
2793 if (LangOpts.ObjCExceptions) {
2813SmallVector<const CXXRecordDecl *, 0>
2815 llvm::SetVector<const CXXRecordDecl *> MostBases;
2820 MostBases.insert(RD);
2822 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2824 CollectMostBases(RD);
2825 return MostBases.takeVector();
2829 llvm::Function *F) {
2830 llvm::AttrBuilder B(F->getContext());
2832 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2833 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2835 if (CodeGenOpts.StackClashProtector)
2836 B.addAttribute(
"probe-stack",
"inline-asm");
2838 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2839 B.addAttribute(
"stack-probe-size",
2840 std::to_string(CodeGenOpts.StackProbeSize));
2843 B.addAttribute(llvm::Attribute::NoUnwind);
2845 if (std::optional<llvm::Attribute::AttrKind>
Attr =
2847 B.addAttribute(*
Attr);
2852 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2853 B.addAttribute(llvm::Attribute::AlwaysInline);
2857 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2859 B.addAttribute(llvm::Attribute::NoInline);
2867 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2868 B.addAttribute(
"aarch64_pstate_sm_body");
2871 if (
Attr->isNewZA())
2872 B.addAttribute(
"aarch64_new_za");
2873 if (
Attr->isNewZT0())
2874 B.addAttribute(
"aarch64_new_zt0");
2879 bool ShouldAddOptNone =
2880 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2882 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
2883 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
2886 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
2887 !D->
hasAttr<NoInlineAttr>()) {
2888 B.addAttribute(llvm::Attribute::AlwaysInline);
2889 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
2890 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2892 B.addAttribute(llvm::Attribute::OptimizeNone);
2895 B.addAttribute(llvm::Attribute::NoInline);
2900 B.addAttribute(llvm::Attribute::Naked);
2903 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
2904 F->removeFnAttr(llvm::Attribute::MinSize);
2905 }
else if (D->
hasAttr<NakedAttr>()) {
2907 B.addAttribute(llvm::Attribute::Naked);
2908 B.addAttribute(llvm::Attribute::NoInline);
2909 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
2910 B.addAttribute(llvm::Attribute::NoDuplicate);
2911 }
else if (D->
hasAttr<NoInlineAttr>() &&
2912 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2914 B.addAttribute(llvm::Attribute::NoInline);
2915 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
2916 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
2918 B.addAttribute(llvm::Attribute::AlwaysInline);
2922 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
2923 B.addAttribute(llvm::Attribute::NoInline);
2927 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2930 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
2931 return Redecl->isInlineSpecified();
2933 if (any_of(FD->
redecls(), CheckRedeclForInline))
2938 return any_of(Pattern->
redecls(), CheckRedeclForInline);
2940 if (CheckForInline(FD)) {
2941 B.addAttribute(llvm::Attribute::InlineHint);
2942 }
else if (CodeGenOpts.getInlining() ==
2945 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2946 B.addAttribute(llvm::Attribute::NoInline);
2953 if (!D->
hasAttr<OptimizeNoneAttr>()) {
2955 if (!ShouldAddOptNone)
2956 B.addAttribute(llvm::Attribute::OptimizeForSize);
2957 B.addAttribute(llvm::Attribute::Cold);
2960 B.addAttribute(llvm::Attribute::Hot);
2961 if (D->
hasAttr<MinSizeAttr>())
2962 B.addAttribute(llvm::Attribute::MinSize);
2967 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
2968 B.addAttribute(llvm::Attribute::NoOutline);
2972 llvm::MaybeAlign ExplicitAlignment;
2973 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
2974 ExplicitAlignment = llvm::Align(alignment);
2975 else if (LangOpts.FunctionAlignment)
2976 ExplicitAlignment = llvm::Align(1ull << LangOpts.FunctionAlignment);
2978 if (ExplicitAlignment) {
2979 F->setAlignment(ExplicitAlignment);
2980 F->setPreferredAlignment(ExplicitAlignment);
2981 }
else if (LangOpts.PreferredFunctionAlignment) {
2982 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
2991 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
2996 if (CodeGenOpts.SanitizeCfiCrossDso &&
2997 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
2998 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3006 if (CodeGenOpts.CallGraphSection) {
3007 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3014 auto *MD = dyn_cast<CXXMethodDecl>(D);
3017 llvm::Metadata *Id =
3019 MD->getType(), std::nullopt,
Base));
3020 F->addTypeMetadata(0, Id);
3027 if (isa_and_nonnull<NamedDecl>(D))
3030 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3032 if (D && D->
hasAttr<UsedAttr>())
3035 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3037 ((CodeGenOpts.KeepPersistentStorageVariables &&
3038 (VD->getStorageDuration() ==
SD_Static ||
3039 VD->getStorageDuration() ==
SD_Thread)) ||
3040 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3041 VD->getType().isConstQualified())))
3046static std::vector<std::string>
3048 llvm::StringMap<bool> &FeatureMap) {
3049 llvm::StringMap<bool> DefaultFeatureMap;
3053 std::vector<std::string> Delta;
3054 for (
const auto &[K,
V] : FeatureMap) {
3055 auto DefaultIt = DefaultFeatureMap.find(K);
3056 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3057 Delta.push_back((
V ?
"+" :
"-") + K.str());
3063bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3064 llvm::AttrBuilder &Attrs,
3065 bool SetTargetFeatures) {
3071 std::vector<std::string> Features;
3072 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3075 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3076 assert((!TD || !TV) &&
"both target_version and target specified");
3079 bool AddedAttr =
false;
3080 if (TD || TV || SD || TC) {
3081 llvm::StringMap<bool> FeatureMap;
3088 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3091 if (!FeatureStr.empty()) {
3092 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3093 if (!ParsedAttr.
CPU.empty() &&
3095 TargetCPU = ParsedAttr.
CPU;
3098 if (!ParsedAttr.
Tune.empty() &&
3100 TuneCPU = ParsedAttr.
Tune;
3116 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3117 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3118 Entry.getKey().str());
3124 llvm::StringMap<bool> FeatureMap;
3138 if (!TargetCPU.empty()) {
3139 Attrs.addAttribute(
"target-cpu", TargetCPU);
3142 if (!TuneCPU.empty()) {
3143 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3146 if (!Features.empty() && SetTargetFeatures) {
3147 llvm::erase_if(Features, [&](
const std::string& F) {
3150 llvm::sort(Features);
3151 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3156 llvm::SmallVector<StringRef, 8> Feats;
3157 bool IsDefault =
false;
3159 IsDefault = TV->isDefaultVersion();
3160 TV->getFeatures(Feats);
3166 Attrs.addAttribute(
"fmv-features");
3168 }
else if (!Feats.empty()) {
3170 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3171 std::string FMVFeatures;
3172 for (StringRef F : OrderedFeats)
3173 FMVFeatures.append(
"," + F.str());
3174 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3181void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3182 llvm::GlobalObject *GO) {
3187 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3190 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3191 GV->addAttribute(
"bss-section", SA->getName());
3192 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3193 GV->addAttribute(
"data-section", SA->getName());
3194 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3195 GV->addAttribute(
"rodata-section", SA->getName());
3196 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3197 GV->addAttribute(
"relro-section", SA->getName());
3200 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3203 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3204 if (!D->
getAttr<SectionAttr>())
3205 F->setSection(SA->getName());
3207 llvm::AttrBuilder Attrs(F->getContext());
3208 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3212 llvm::AttributeMask RemoveAttrs;
3213 RemoveAttrs.addAttribute(
"target-cpu");
3214 RemoveAttrs.addAttribute(
"target-features");
3215 RemoveAttrs.addAttribute(
"fmv-features");
3216 RemoveAttrs.addAttribute(
"tune-cpu");
3217 F->removeFnAttrs(RemoveAttrs);
3218 F->addFnAttrs(Attrs);
3222 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3223 GO->setSection(CSA->getName());
3224 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3225 GO->setSection(SA->getName());
3238 F->setLinkage(llvm::Function::InternalLinkage);
3240 setNonAliasAttributes(GD, F);
3251 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3255 llvm::MDNode *MD = F->getMetadata(llvm::LLVMContext::MD_type);
3256 return MD && MD->hasGeneralizedMDString();
3260 llvm::Function *F) {
3267 if (!F->hasLocalLinkage() ||
3268 F->getFunction().hasAddressTaken(
nullptr,
true,
3275 llvm::Function *F) {
3277 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3288 F->addTypeMetadata(0, MD);
3297 if (CodeGenOpts.SanitizeCfiCrossDso)
3299 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3303 llvm::CallBase *CB) {
3308 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall() ||
3313 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
3314 getLLVMContext(), {llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
3317 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3318 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3322 llvm::LLVMContext &Ctx = F->getContext();
3323 llvm::MDBuilder MDB(Ctx);
3324 llvm::StringRef Salt;
3327 if (
const auto &Info = FP->getExtraAttributeInfo())
3328 Salt = Info.CFISalt;
3330 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3339 return llvm::all_of(Name, [](
const char &
C) {
3340 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3346 for (
auto &F : M.functions()) {
3348 bool AddressTaken = F.hasAddressTaken();
3349 if (!AddressTaken && F.hasLocalLinkage())
3350 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3355 if (!AddressTaken || !F.isDeclaration())
3358 const llvm::ConstantInt *
Type;
3359 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3360 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3364 StringRef Name = F.getName();
3368 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3369 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3370 Twine(
Type->getSExtValue()) +
" */\n")
3372 M.appendModuleInlineAsm(
Asm);
3376void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3377 bool IsIncompleteFunction,
3380 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3388 if (!IsIncompleteFunction)
3395 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3397 assert(!F->arg_empty() &&
3398 F->arg_begin()->getType()
3399 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3400 "unexpected this return");
3401 F->addParamAttr(0, llvm::Attribute::Returned);
3411 if (!IsIncompleteFunction && F->isDeclaration())
3414 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3415 F->setSection(CSA->getName());
3416 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3417 F->setSection(SA->getName());
3419 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3421 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3422 else if (EA->isWarning())
3423 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3428 const FunctionDecl *FDBody;
3429 bool HasBody = FD->
hasBody(FDBody);
3431 assert(HasBody &&
"Inline builtin declarations should always have an "
3433 if (shouldEmitFunction(FDBody))
3434 F->addFnAttr(llvm::Attribute::NoBuiltin);
3440 F->addFnAttr(llvm::Attribute::NoBuiltin);
3444 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3445 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3446 if (MD->isVirtual())
3447 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3453 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3454 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3457 if (CodeGenOpts.CallGraphSection)
3460 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3466 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3467 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3469 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3473 llvm::LLVMContext &Ctx = F->getContext();
3474 llvm::MDBuilder MDB(Ctx);
3478 int CalleeIdx = *CB->encoding_begin();
3479 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3480 F->addMetadata(llvm::LLVMContext::MD_callback,
3481 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3482 CalleeIdx, PayloadIndices,
3489 "Only globals with definition can force usage.");
3490 LLVMUsed.emplace_back(GV);
3494 assert(!GV->isDeclaration() &&
3495 "Only globals with definition can force usage.");
3496 LLVMCompilerUsed.emplace_back(GV);
3501 "Only globals with definition can force usage.");
3503 LLVMCompilerUsed.emplace_back(GV);
3505 LLVMUsed.emplace_back(GV);
3509 std::vector<llvm::WeakTrackingVH> &List) {
3516 UsedArray.resize(List.size());
3517 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3519 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3523 if (UsedArray.empty())
3525 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3527 auto *GV =
new llvm::GlobalVariable(
3528 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3529 llvm::ConstantArray::get(ATy, UsedArray), Name);
3531 GV->setSection(
"llvm.metadata");
3534void CodeGenModule::emitLLVMUsed() {
3535 emitUsed(*
this,
"llvm.used", LLVMUsed);
3536 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3541 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3550 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3556 ELFDependentLibraries.push_back(
3557 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3564 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3573 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3579 if (Visited.insert(Import).second)
3596 if (LL.IsFramework) {
3597 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3598 llvm::MDString::get(Context, LL.Library)};
3600 Metadata.push_back(llvm::MDNode::get(Context, Args));
3606 llvm::Metadata *Args[2] = {
3607 llvm::MDString::get(Context,
"lib"),
3608 llvm::MDString::get(Context, LL.Library),
3610 Metadata.push_back(llvm::MDNode::get(Context, Args));
3614 auto *OptString = llvm::MDString::get(Context, Opt);
3615 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3620void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3622 "We should only emit module initializers for named modules.");
3630 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3647 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
3653void CodeGenModule::EmitModuleLinkOptions() {
3657 llvm::SetVector<clang::Module *> LinkModules;
3658 llvm::SmallPtrSet<clang::Module *, 16> Visited;
3659 SmallVector<clang::Module *, 16> Stack;
3662 for (
Module *M : ImportedModules) {
3665 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3668 if (Visited.insert(M).second)
3674 while (!Stack.empty()) {
3677 bool AnyChildren =
false;
3686 if (Visited.insert(
SM).second) {
3687 Stack.push_back(
SM);
3695 LinkModules.insert(Mod);
3702 SmallVector<llvm::MDNode *, 16> MetadataArgs;
3704 for (
Module *M : LinkModules)
3705 if (Visited.insert(M).second)
3707 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3708 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3711 if (!LinkerOptionsMetadata.empty()) {
3712 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3713 for (
auto *MD : LinkerOptionsMetadata)
3714 NMD->addOperand(MD);
3718void CodeGenModule::EmitDeferred() {
3727 if (!DeferredVTables.empty()) {
3728 EmitDeferredVTables();
3733 assert(DeferredVTables.empty());
3740 llvm::append_range(DeferredDeclsToEmit,
3744 if (DeferredDeclsToEmit.empty())
3749 std::vector<GlobalDecl> CurDeclsToEmit;
3750 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3752 for (GlobalDecl &D : CurDeclsToEmit) {
3758 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
3762 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
3778 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3796 if (!GV->isDeclaration())
3800 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3804 EmitGlobalDefinition(D, GV);
3809 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3811 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3816void CodeGenModule::EmitVTablesOpportunistically() {
3822 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3823 &&
"Only emit opportunistic vtables with optimizations");
3825 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
3827 "This queue should only contain external vtables");
3828 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3829 VTables.GenerateClassData(RD);
3831 OpportunisticVTables.clear();
3835 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3840 DeferredAnnotations.clear();
3842 if (Annotations.empty())
3846 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3847 Annotations[0]->
getType(), Annotations.size()), Annotations);
3848 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3849 llvm::GlobalValue::AppendingLinkage,
3850 Array,
"llvm.global.annotations");
3855 llvm::Constant *&AStr = AnnotationStrings[Str];
3860 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3861 auto *gv =
new llvm::GlobalVariable(
3862 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3863 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3866 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3883 SM.getExpansionLineNumber(L);
3884 return llvm::ConstantInt::get(
Int32Ty, LineNo);
3892 llvm::FoldingSetNodeID ID;
3893 for (
Expr *E : Exprs) {
3896 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
3901 LLVMArgs.reserve(Exprs.size());
3903 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
3905 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
3908 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
3909 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
3910 llvm::GlobalValue::PrivateLinkage,
Struct,
3913 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3920 const AnnotateAttr *AA,
3928 llvm::Constant *GVInGlobalsAS = GV;
3929 if (GV->getAddressSpace() !=
3931 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
3933 llvm::PointerType::get(
3934 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
3938 llvm::Constant *Fields[] = {
3939 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
3941 return llvm::ConstantStruct::getAnon(Fields);
3945 llvm::GlobalValue *GV) {
3946 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
3956 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
3959 auto &
SM = Context.getSourceManager();
3961 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
3966 return NoSanitizeL.containsLocation(Kind, Loc);
3969 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
3973 llvm::GlobalVariable *GV,
3975 StringRef Category)
const {
3977 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
3979 auto &
SM = Context.getSourceManager();
3980 if (NoSanitizeL.containsMainFile(
3981 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
3984 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
3991 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
3992 Ty = AT->getElementType();
3997 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4005 StringRef Category)
const {
4008 auto Attr = ImbueAttr::NONE;
4010 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4011 if (
Attr == ImbueAttr::NONE)
4012 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4014 case ImbueAttr::NONE:
4016 case ImbueAttr::ALWAYS:
4017 Fn->addFnAttr(
"function-instrument",
"xray-always");
4019 case ImbueAttr::ALWAYS_ARG1:
4020 Fn->addFnAttr(
"function-instrument",
"xray-always");
4021 Fn->addFnAttr(
"xray-log-args",
"1");
4023 case ImbueAttr::NEVER:
4024 Fn->addFnAttr(
"function-instrument",
"xray-never");
4037 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4047 auto &
SM = Context.getSourceManager();
4048 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
4062 if (NumGroups > 1) {
4063 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4072 if (LangOpts.EmitAllDecls)
4075 const auto *VD = dyn_cast<VarDecl>(
Global);
4077 ((CodeGenOpts.KeepPersistentStorageVariables &&
4078 (VD->getStorageDuration() ==
SD_Static ||
4079 VD->getStorageDuration() ==
SD_Thread)) ||
4080 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4081 VD->getType().isConstQualified())))
4094 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4095 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4096 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4097 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4101 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4111 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4114 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4115 if (Context.getInlineVariableDefinitionKind(VD) ==
4120 if (CXX20ModuleInits && VD->getOwningModule() &&
4121 !VD->getOwningModule()->isModuleMapModule()) {
4130 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4133 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4146 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4150 llvm::Constant *
Init;
4153 if (!
V.isAbsent()) {
4164 llvm::Constant *Fields[4] = {
4168 llvm::ConstantDataArray::getRaw(
4169 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4171 Init = llvm::ConstantStruct::getAnon(Fields);
4174 auto *GV =
new llvm::GlobalVariable(
4176 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4178 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4181 if (!
V.isAbsent()) {
4194 llvm::GlobalVariable **Entry =
nullptr;
4195 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4200 llvm::Constant *
Init;
4204 assert(!
V.isAbsent());
4208 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4210 llvm::GlobalValue::PrivateLinkage,
Init,
4212 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4226 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4230 llvm::Constant *
Init =
Emitter.emitForInitializer(
4238 llvm::GlobalValue::LinkageTypes
Linkage =
4240 ? llvm::GlobalValue::LinkOnceODRLinkage
4241 : llvm::GlobalValue::InternalLinkage;
4242 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4246 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4253 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4254 assert(AA &&
"No alias?");
4264 llvm::Constant *Aliasee;
4266 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4274 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4275 WeakRefReferences.insert(F);
4283 if (
auto *A = D->
getAttr<AttrT>())
4284 return A->isImplicit();
4291 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4294 const auto *AA =
Global->getAttr<AliasAttr>();
4302 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4303 if (LangOpts.OpenMPIsTargetDevice)
4304 return !AliaseeDecl ||
4305 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4308 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4309 const bool AliaseeHasDeviceAttr =
4310 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4312 if (LangOpts.CUDAIsDevice)
4313 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4320bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4321 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4326 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4327 Global->hasAttr<CUDAConstantAttr>() ||
4328 Global->hasAttr<CUDASharedAttr>() ||
4329 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4330 Global->getType()->isCUDADeviceBuiltinTextureType();
4337 if (
Global->hasAttr<WeakRefAttr>())
4342 if (
Global->hasAttr<AliasAttr>()) {
4345 return EmitAliasDefinition(GD);
4349 if (
Global->hasAttr<IFuncAttr>())
4350 return emitIFuncDefinition(GD);
4353 if (
Global->hasAttr<CPUDispatchAttr>())
4354 return emitCPUDispatchDefinition(GD);
4359 if (LangOpts.CUDA) {
4361 "Expected Variable or Function");
4362 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4363 if (!shouldEmitCUDAGlobalVar(VD))
4365 }
else if (LangOpts.CUDAIsDevice) {
4366 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4367 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4368 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4372 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4373 !
Global->hasAttr<CUDAGlobalAttr>() &&
4375 !
Global->hasAttr<CUDAHostAttr>()))
4378 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4379 Global->hasAttr<CUDADeviceAttr>())
4383 if (LangOpts.OpenMP) {
4385 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4387 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4388 if (MustBeEmitted(
Global))
4392 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4393 if (MustBeEmitted(
Global))
4400 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4401 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4407 if (FD->
hasAttr<AnnotateAttr>()) {
4410 DeferredAnnotations[MangledName] = FD;
4425 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4431 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4433 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4434 if (LangOpts.OpenMP) {
4436 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4437 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4441 if (VD->hasExternalStorage() &&
4442 Res != OMPDeclareTargetDeclAttr::MT_Link)
4445 bool UnifiedMemoryEnabled =
4447 if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4448 *Res == OMPDeclareTargetDeclAttr::MT_Enter ||
4449 *Res == OMPDeclareTargetDeclAttr::MT_Local) &&
4450 !UnifiedMemoryEnabled) {
4453 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4454 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4455 *Res == OMPDeclareTargetDeclAttr::MT_Enter ||
4456 *Res == OMPDeclareTargetDeclAttr::MT_Local) &&
4457 UnifiedMemoryEnabled)) &&
4458 "Link clause or to clause with unified memory expected.");
4468 if (LangOpts.HLSL) {
4469 if (VD->getStorageClass() ==
SC_Extern) {
4478 if (Context.getInlineVariableDefinitionKind(VD) ==
4488 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4490 EmitGlobalDefinition(GD);
4491 addEmittedDeferredDecl(GD);
4499 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4500 CXXGlobalInits.push_back(
nullptr);
4506 addDeferredDeclToEmit(GD);
4507 }
else if (MustBeEmitted(
Global)) {
4509 assert(!MayBeEmittedEagerly(
Global));
4510 addDeferredDeclToEmit(GD);
4515 DeferredDecls[MangledName] = GD;
4521 if (
const auto *RT =
4522 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4523 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4524 RD = RD->getDefinitionOrSelf();
4525 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4533 struct FunctionIsDirectlyRecursive
4534 :
public ConstStmtVisitor<FunctionIsDirectlyRecursive, bool> {
4535 const StringRef Name;
4536 const Builtin::Context &BI;
4537 FunctionIsDirectlyRecursive(StringRef N,
const Builtin::Context &
C)
4540 bool VisitCallExpr(
const CallExpr *E) {
4544 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4545 if (Attr && Name == Attr->getLabel())
4550 std::string BuiltinNameStr = BI.
getName(BuiltinID);
4551 StringRef BuiltinName = BuiltinNameStr;
4552 return BuiltinName.consume_front(
"__builtin_") && Name == BuiltinName;
4555 bool VisitStmt(
const Stmt *S) {
4556 for (
const Stmt *Child : S->
children())
4557 if (Child && this->Visit(Child))
4564 struct DLLImportFunctionVisitor
4565 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4566 bool SafeToInline =
true;
4568 bool shouldVisitImplicitCode()
const {
return true; }
4570 bool VisitVarDecl(VarDecl *VD) {
4573 SafeToInline =
false;
4574 return SafeToInline;
4581 return SafeToInline;
4584 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4586 SafeToInline = D->
hasAttr<DLLImportAttr>();
4587 return SafeToInline;
4590 bool VisitDeclRefExpr(DeclRefExpr *E) {
4593 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4594 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4595 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4596 return SafeToInline;
4599 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4601 return SafeToInline;
4604 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4608 SafeToInline =
true;
4610 SafeToInline = M->
hasAttr<DLLImportAttr>();
4612 return SafeToInline;
4615 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4617 return SafeToInline;
4620 bool VisitCXXNewExpr(CXXNewExpr *E) {
4622 return SafeToInline;
4631CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4633 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4635 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4638 Name = Attr->getLabel();
4643 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
4644 const Stmt *Body = FD->
getBody();
4645 return Body ? Walker.Visit(Body) :
false;
4648bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4655 if (F->isInlineBuiltinDeclaration())
4658 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4663 if (
const Module *M = F->getOwningModule();
4664 M && M->getTopLevelModule()->isNamedModule() &&
4665 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4675 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4680 if (F->hasAttr<NoInlineAttr>())
4683 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4685 DLLImportFunctionVisitor Visitor;
4686 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4687 if (!Visitor.SafeToInline)
4690 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4693 for (
const Decl *
Member : Dtor->getParent()->decls())
4697 for (
const CXXBaseSpecifier &B : Dtor->getParent()->bases())
4708 return !isTriviallyRecursive(F);
4711bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4712 return CodeGenOpts.OptimizationLevel > 0;
4715void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
4716 llvm::GlobalValue *GV) {
4720 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4721 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4723 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4724 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4725 if (TC->isFirstOfVersion(I))
4728 EmitGlobalFunctionDefinition(GD, GV);
4734 AddDeferredMultiVersionResolverToEmit(GD);
4736 GetOrCreateMultiVersionResolver(GD);
4740void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
4743 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
4744 Context.getSourceManager(),
4745 "Generating code for declaration");
4747 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4750 if (!shouldEmitFunction(GD))
4753 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4755 llvm::raw_string_ostream
OS(Name);
4761 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4765 ABI->emitCXXStructor(GD);
4767 EmitMultiVersionFunctionDefinition(GD, GV);
4769 EmitGlobalFunctionDefinition(GD, GV);
4778 return EmitMultiVersionFunctionDefinition(GD, GV);
4779 return EmitGlobalFunctionDefinition(GD, GV);
4782 if (
const auto *VD = dyn_cast<VarDecl>(D))
4783 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4785 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4789 llvm::Function *NewFn);
4805static llvm::GlobalValue::LinkageTypes
4809 return llvm::GlobalValue::InternalLinkage;
4810 return llvm::GlobalValue::WeakODRLinkage;
4813void CodeGenModule::emitMultiVersionFunctions() {
4814 std::vector<GlobalDecl> MVFuncsToEmit;
4815 MultiVersionFuncs.swap(MVFuncsToEmit);
4816 for (GlobalDecl GD : MVFuncsToEmit) {
4818 assert(FD &&
"Expected a FunctionDecl");
4820 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
4821 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
4825 if (
Decl->isDefined()) {
4826 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4834 assert(
Func &&
"This should have just been created");
4842 bool ShouldEmitResolver = !
getTriple().isAArch64();
4843 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4844 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
4847 FD, [&](
const FunctionDecl *CurFD) {
4848 llvm::SmallVector<StringRef, 8> Feats;
4851 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4853 TA->getX86AddedFeatures(Feats);
4854 llvm::Function *
Func = createFunction(CurFD);
4855 DeclMap.insert({
Func, CurFD});
4856 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
4857 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4858 if (TVA->isDefaultVersion() && IsDefined)
4859 ShouldEmitResolver =
true;
4860 llvm::Function *
Func = createFunction(CurFD);
4861 DeclMap.insert({
Func, CurFD});
4863 TVA->getFeatures(Feats, Delim);
4864 Options.emplace_back(
Func, Feats);
4865 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4866 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4867 if (!TC->isFirstOfVersion(I))
4869 if (TC->isDefaultVersion(I) && IsDefined)
4870 ShouldEmitResolver =
true;
4871 llvm::Function *
Func = createFunction(CurFD, I);
4872 DeclMap.insert({
Func, CurFD});
4875 TC->getX86Feature(Feats, I);
4876 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
4879 TC->getFeatures(Feats, I, Delim);
4880 Options.emplace_back(
Func, Feats);
4884 llvm_unreachable(
"unexpected MultiVersionKind");
4887 if (!ShouldEmitResolver)
4890 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
4891 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
4892 ResolverConstant = IFunc->getResolver();
4897 *
this, GD, FD,
true);
4904 auto *Alias = llvm::GlobalAlias::create(
4906 MangledName +
".ifunc", IFunc, &
getModule());
4915 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
4916 const CodeGenFunction::FMVResolverOption &RHS) {
4922 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
4923 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
4924 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
4925 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
4926 return LHS.isSubsetOf(RHS);
4928 Diags.Report(DeclMap[I->Function]->getLocation(),
4929 diag::warn_unreachable_version)
4930 << I->Function->getName();
4931 assert(I->Function->user_empty() &&
"unexpected users");
4932 I->Function->eraseFromParent();
4933 I->Function =
nullptr;
4937 CodeGenFunction CGF(*
this);
4938 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4940 setMultiVersionResolverAttributes(ResolverFunc, GD);
4942 ResolverFunc->setComdat(
4943 getModule().getOrInsertComdat(ResolverFunc->getName()));
4949 if (!MVFuncsToEmit.empty())
4954 if (!MultiVersionFuncs.empty())
4955 emitMultiVersionFunctions();
4965 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
4967 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
4968 llvm::GlobalVariable::ExternalWeakLinkage,
4970 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
4975void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
4976 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
4978 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
4980 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
4981 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
4982 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
4983 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
4985 DS->takeName(OldDS);
4986 OldDS->replaceAllUsesWith(DS);
4987 OldDS->eraseFromParent();
4993 llvm::Constant *
New) {
4996 Old->replaceAllUsesWith(
New);
4997 Old->eraseFromParent();
5000void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5002 assert(FD &&
"Not a FunctionDecl?");
5004 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5005 assert(DD &&
"Not a cpu_dispatch Function?");
5011 UpdateMultiVersionNames(GD, FD, ResolverName);
5013 llvm::Type *ResolverType;
5014 GlobalDecl ResolverGD;
5016 ResolverType = llvm::FunctionType::get(
5027 ResolverName, ResolverType, ResolverGD,
false));
5030 ResolverFunc->setComdat(
5031 getModule().getOrInsertComdat(ResolverFunc->getName()));
5033 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5036 for (
const IdentifierInfo *II : DD->cpus()) {
5044 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5047 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5053 Func = GetOrCreateLLVMFunction(
5054 MangledName, DeclTy, ExistingDecl,
5060 llvm::SmallVector<StringRef, 32> Features;
5061 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5062 llvm::transform(Features, Features.begin(),
5063 [](StringRef Str) { return Str.substr(1); });
5064 llvm::erase_if(Features, [&Target](StringRef Feat) {
5065 return !Target.validateCpuSupports(Feat);
5071 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5072 const CodeGenFunction::FMVResolverOption &RHS) {
5073 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5074 llvm::X86::getCpuSupportsMask(RHS.
Features);
5081 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5082 (Options.end() - 2)->Features),
5083 [](
auto X) { return X == 0; })) {
5084 StringRef LHSName = (Options.end() - 2)->Function->getName();
5085 StringRef RHSName = (Options.end() - 1)->Function->getName();
5086 if (LHSName.compare(RHSName) < 0)
5087 Options.erase(Options.end() - 2);
5089 Options.erase(Options.end() - 1);
5092 CodeGenFunction CGF(*
this);
5093 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5094 setMultiVersionResolverAttributes(ResolverFunc, GD);
5099 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5104 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5111 *
this, GD, FD,
true);
5114 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5122void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5124 assert(FD &&
"Not a FunctionDecl?");
5127 std::string MangledName =
5129 if (!DeferredResolversToEmit.insert(MangledName).second)
5132 MultiVersionFuncs.push_back(GD);
5138llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5140 assert(FD &&
"Not a FunctionDecl?");
5142 std::string MangledName =
5147 std::string ResolverName = MangledName;
5151 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5155 ResolverName +=
".ifunc";
5162 ResolverName +=
".resolver";
5165 bool ShouldReturnIFunc =
5184 AddDeferredMultiVersionResolverToEmit(GD);
5188 if (ShouldReturnIFunc) {
5190 llvm::Type *ResolverType = llvm::FunctionType::get(
5192 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5193 MangledName +
".resolver", ResolverType, GlobalDecl{},
5201 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5203 GIF->setName(ResolverName);
5210 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5211 ResolverName, DeclTy, GlobalDecl{},
false);
5213 "Resolver should be created for the first time");
5218void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5220 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5233 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5244bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5245 const llvm::GlobalValue *GV)
const {
5246 auto SC = GV->getDLLStorageClass();
5247 if (SC == llvm::GlobalValue::DefaultStorageClass)
5250 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5251 !MRD->
hasAttr<DLLImportAttr>()) ||
5252 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5253 !MRD->
hasAttr<DLLExportAttr>())) &&
5264llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5265 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5266 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5270 std::string NameWithoutMultiVersionMangling;
5271 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5273 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5274 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5275 !DontDefer && !IsForDefinition) {
5278 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5280 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5283 GDDef = GlobalDecl(FDDef);
5291 UpdateMultiVersionNames(GD, FD, MangledName);
5292 if (!IsForDefinition) {
5298 AddDeferredMultiVersionResolverToEmit(GD);
5300 *
this, GD, FD,
true);
5309 *
this, GD, FD,
true);
5311 return GetOrCreateMultiVersionResolver(GD);
5316 if (!NameWithoutMultiVersionMangling.empty())
5317 MangledName = NameWithoutMultiVersionMangling;
5322 if (WeakRefReferences.erase(Entry)) {
5323 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5324 if (FD && !FD->
hasAttr<WeakAttr>())
5325 Entry->setLinkage(llvm::Function::ExternalLinkage);
5329 if (D && shouldDropDLLAttribute(D, Entry)) {
5330 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5336 if (IsForDefinition && !Entry->isDeclaration()) {
5343 DiagnosedConflictingDefinitions.insert(GD).second) {
5347 diag::note_previous_definition);
5352 (Entry->getValueType() == Ty)) {
5359 if (!IsForDefinition)
5366 bool IsIncompleteFunction =
false;
5368 llvm::FunctionType *FTy;
5372 FTy = llvm::FunctionType::get(
VoidTy,
false);
5373 IsIncompleteFunction =
true;
5377 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5378 Entry ? StringRef() : MangledName, &
getModule());
5382 if (D && D->
hasAttr<AnnotateAttr>())
5400 if (!Entry->use_empty()) {
5402 Entry->removeDeadConstantUsers();
5408 assert(F->getName() == MangledName &&
"name was uniqued!");
5410 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5411 if (ExtraAttrs.hasFnAttrs()) {
5412 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5420 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5423 addDeferredDeclToEmit(GD);
5428 auto DDI = DeferredDecls.find(MangledName);
5429 if (DDI != DeferredDecls.end()) {
5433 addDeferredDeclToEmit(DDI->second);
5434 DeferredDecls.erase(DDI);
5462 if (!IsIncompleteFunction) {
5463 assert(F->getFunctionType() == Ty);
5481 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5491 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5494 DD->getParent()->getNumVBases() == 0)
5499 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5500 false, llvm::AttributeList(),
5503 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5507 if (IsForDefinition)
5515 llvm::GlobalValue *F =
5518 return llvm::NoCFIValue::get(F);
5527 for (
const auto *Result : DC->
lookup(&CII))
5528 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5531 if (!
C.getLangOpts().CPlusPlus)
5536 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5537 ?
C.Idents.get(
"terminate")
5538 :
C.Idents.get(Name);
5540 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5542 for (
const auto *Result : DC->
lookup(&NS)) {
5544 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(Result))
5545 for (
const auto *Result : LSD->lookup(&NS))
5546 if ((ND = dyn_cast<NamespaceDecl>(Result)))
5550 for (
const auto *Result : ND->
lookup(&CXXII))
5551 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5560 llvm::Function *F, StringRef Name) {
5566 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5569 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5570 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5571 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5578 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5579 if (AssumeConvergent) {
5581 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5584 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5589 llvm::Constant *
C = GetOrCreateLLVMFunction(
5591 false,
false, ExtraAttrs);
5593 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5609 llvm::AttributeList ExtraAttrs,
bool Local,
5610 bool AssumeConvergent) {
5611 if (AssumeConvergent) {
5613 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5617 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5621 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5630 markRegisterParameterAttributes(F);
5656 if (WeakRefReferences.erase(Entry)) {
5657 if (D && !D->
hasAttr<WeakAttr>())
5658 Entry->setLinkage(llvm::Function::ExternalLinkage);
5662 if (D && shouldDropDLLAttribute(D, Entry))
5663 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5665 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5668 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5673 if (IsForDefinition && !Entry->isDeclaration()) {
5681 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5683 DiagnosedConflictingDefinitions.insert(D).second) {
5687 diag::note_previous_definition);
5692 if (Entry->getType()->getAddressSpace() != TargetAS)
5693 return llvm::ConstantExpr::getAddrSpaceCast(
5694 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5698 if (!IsForDefinition)
5704 auto *GV =
new llvm::GlobalVariable(
5705 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5706 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5707 getContext().getTargetAddressSpace(DAddrSpace));
5712 GV->takeName(Entry);
5714 if (!Entry->use_empty()) {
5715 Entry->replaceAllUsesWith(GV);
5718 Entry->eraseFromParent();
5724 auto DDI = DeferredDecls.find(MangledName);
5725 if (DDI != DeferredDecls.end()) {
5728 addDeferredDeclToEmit(DDI->second);
5729 DeferredDecls.erase(DDI);
5734 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5741 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
5747 CXXThreadLocals.push_back(D);
5755 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
5756 EmitGlobalVarDefinition(D);
5761 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
5762 GV->setSection(SA->getName());
5766 if (
getTriple().getArch() == llvm::Triple::xcore &&
5770 GV->setSection(
".cp.rodata");
5773 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
5774 GV->setCodeModel(CMA->getModel());
5779 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5783 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
5784 bool HasMutableFields =
Record &&
Record->hasMutableFields();
5785 if (!HasMutableFields) {
5792 auto *InitType =
Init->getType();
5793 if (GV->getValueType() != InitType) {
5798 GV->setName(StringRef());
5803 ->stripPointerCasts());
5806 GV->eraseFromParent();
5809 GV->setInitializer(
Init);
5810 GV->setConstant(
true);
5811 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5831 SanitizerMD->reportGlobal(GV, *D);
5836 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5837 if (DAddrSpace != ExpectedAS)
5850 false, IsForDefinition);
5871 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5872 llvm::Align Alignment) {
5873 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5874 llvm::GlobalVariable *OldGV =
nullptr;
5878 if (GV->getValueType() == Ty)
5883 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
5888 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
5893 GV->takeName(OldGV);
5895 if (!OldGV->use_empty()) {
5896 OldGV->replaceAllUsesWith(GV);
5899 OldGV->eraseFromParent();
5903 !GV->hasAvailableExternallyLinkage())
5904 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
5906 GV->setAlignment(Alignment);
5943 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
5951 if (GV && !GV->isDeclaration())
5956 if (!MustBeEmitted(D) && !GV) {
5957 DeferredDecls[MangledName] = D;
5962 EmitGlobalVarDefinition(D);
5967 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
5969 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
5984 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5987 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
5989 if (!Fn->getSubprogram())
5995 return Context.toCharUnitsFromBits(
6000 if (LangOpts.OpenCL) {
6011 if (LangOpts.SYCLIsDevice &&
6015 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6017 if (D->
hasAttr<CUDAConstantAttr>())
6019 if (D->
hasAttr<CUDASharedAttr>())
6021 if (D->
hasAttr<CUDADeviceAttr>())
6029 if (LangOpts.OpenMP) {
6031 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6039 if (LangOpts.OpenCL)
6041 if (LangOpts.SYCLIsDevice)
6043 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
6051 if (
auto AS =
getTarget().getConstantAddressSpace())
6064static llvm::Constant *
6066 llvm::GlobalVariable *GV) {
6067 llvm::Constant *Cast = GV;
6072 GV, llvm::PointerType::get(
6079template<
typename SomeDecl>
6081 llvm::GlobalValue *GV) {
6096 const SomeDecl *
First = D->getFirstDecl();
6097 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6103 std::pair<StaticExternCMap::iterator, bool> R =
6104 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6109 R.first->second =
nullptr;
6116 if (D.
hasAttr<SelectAnyAttr>())
6120 if (
auto *VD = dyn_cast<VarDecl>(&D))
6134 llvm_unreachable(
"No such linkage");
6142 llvm::GlobalObject &GO) {
6145 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6153void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6168 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6169 OpenMPRuntime->emitTargetGlobalVariable(D))
6172 llvm::TrackingVH<llvm::Constant>
Init;
6173 bool NeedsGlobalCtor =
false;
6177 bool IsDefinitionAvailableExternally =
6179 bool NeedsGlobalDtor =
6180 !IsDefinitionAvailableExternally &&
6187 if (IsDefinitionAvailableExternally &&
6198 std::optional<ConstantEmitter> emitter;
6203 bool IsCUDASharedVar =
6208 bool IsCUDAShadowVar =
6210 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6211 D->
hasAttr<CUDASharedAttr>());
6212 bool IsCUDADeviceShadowVar =
6217 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6218 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6222 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6225 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6226 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6227 }
else if (!InitExpr) {
6240 initializedGlobalDecl = GlobalDecl(D);
6241 emitter.emplace(*
this);
6242 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6244 QualType T = InitExpr->
getType();
6250 if (!IsDefinitionAvailableExternally)
6251 NeedsGlobalCtor =
true;
6255 NeedsGlobalCtor =
false;
6259 Init = llvm::PoisonValue::get(
getTypes().ConvertType(T));
6267 DelayedCXXInitPosition.erase(D);
6274 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6279 llvm::Type* InitType =
Init->getType();
6280 llvm::Constant *Entry =
6284 Entry = Entry->stripPointerCasts();
6287 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6298 if (!GV || GV->getValueType() != InitType ||
6299 GV->getType()->getAddressSpace() !=
6303 Entry->setName(StringRef());
6308 ->stripPointerCasts());
6311 llvm::Constant *NewPtrForOldDecl =
6312 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6314 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6322 if (D->
hasAttr<AnnotateAttr>())
6335 if (LangOpts.CUDA) {
6336 if (LangOpts.CUDAIsDevice) {
6339 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6342 GV->setExternallyInitialized(
true);
6349 if (LangOpts.HLSL &&
6354 GV->setExternallyInitialized(
true);
6356 GV->setInitializer(
Init);
6363 emitter->finalize(GV);
6366 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6367 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6371 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6372 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6374 GV->setConstant(
true);
6379 if (std::optional<CharUnits> AlignValFromAllocate =
6381 AlignVal = *AlignValFromAllocate;
6399 Linkage == llvm::GlobalValue::ExternalLinkage &&
6400 Context.getTargetInfo().getTriple().isOSDarwin() &&
6402 Linkage = llvm::GlobalValue::InternalLinkage;
6407 if (LangOpts.HLSL &&
6409 Linkage = llvm::GlobalValue::ExternalLinkage;
6412 if (D->
hasAttr<DLLImportAttr>())
6413 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6414 else if (D->
hasAttr<DLLExportAttr>())
6415 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6417 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6419 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6421 GV->setConstant(
false);
6426 if (!GV->getInitializer()->isNullValue())
6427 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6430 setNonAliasAttributes(D, GV);
6432 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6434 CXXThreadLocals.push_back(D);
6441 if (NeedsGlobalCtor || NeedsGlobalDtor)
6442 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6444 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6449 DI->EmitGlobalVariable(GV, D);
6457 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6468 if (D->
hasAttr<SectionAttr>())
6474 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6475 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6476 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6477 D->
hasAttr<PragmaClangRodataSectionAttr>())
6485 if (D->
hasAttr<WeakImportAttr>())
6494 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6495 if (D->
hasAttr<AlignedAttr>())
6498 if (Context.isAlignmentRequired(VarType))
6502 for (
const FieldDecl *FD : RD->fields()) {
6503 if (FD->isBitField())
6505 if (FD->
hasAttr<AlignedAttr>())
6507 if (Context.isAlignmentRequired(FD->
getType()))
6519 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6520 Context.getTypeAlignIfKnown(D->
getType()) >
6527llvm::GlobalValue::LinkageTypes
6531 return llvm::Function::InternalLinkage;
6534 return llvm::GlobalVariable::WeakAnyLinkage;
6538 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6543 return llvm::GlobalValue::AvailableExternallyLinkage;
6557 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6558 : llvm::Function::InternalLinkage;
6572 return llvm::Function::ExternalLinkage;
6575 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6576 : llvm::Function::InternalLinkage;
6577 return llvm::Function::WeakODRLinkage;
6584 CodeGenOpts.NoCommon))
6585 return llvm::GlobalVariable::CommonLinkage;
6591 if (D->
hasAttr<SelectAnyAttr>())
6592 return llvm::GlobalVariable::WeakODRLinkage;
6596 return llvm::GlobalVariable::ExternalLinkage;
6599llvm::GlobalValue::LinkageTypes
6608 llvm::Function *newFn) {
6610 if (old->use_empty())
6613 llvm::Type *newRetTy = newFn->getReturnType();
6618 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6620 llvm::User *user = ui->getUser();
6624 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6625 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6631 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6634 if (!callSite->isCallee(&*ui))
6639 if (callSite->getType() != newRetTy && !callSite->use_empty())
6644 llvm::AttributeList oldAttrs = callSite->getAttributes();
6647 unsigned newNumArgs = newFn->arg_size();
6648 if (callSite->arg_size() < newNumArgs)
6654 bool dontTransform =
false;
6655 for (llvm::Argument &A : newFn->args()) {
6656 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6657 dontTransform =
true;
6662 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6670 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6674 callSite->getOperandBundlesAsDefs(newBundles);
6676 llvm::CallBase *newCall;
6678 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6679 callSite->getIterator());
6682 newCall = llvm::InvokeInst::Create(
6683 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6684 newArgs, newBundles,
"", callSite->getIterator());
6688 if (!newCall->getType()->isVoidTy())
6689 newCall->takeName(callSite);
6690 newCall->setAttributes(
6691 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6692 oldAttrs.getRetAttrs(), newArgAttrs));
6693 newCall->setCallingConv(callSite->getCallingConv());
6696 if (!callSite->use_empty())
6697 callSite->replaceAllUsesWith(newCall);
6700 if (callSite->getDebugLoc())
6701 newCall->setDebugLoc(callSite->getDebugLoc());
6703 callSitesToBeRemovedFromParent.push_back(callSite);
6706 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6707 callSite->eraseFromParent();
6721 llvm::Function *NewFn) {
6731 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6743void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6744 llvm::GlobalValue *GV) {
6752 if (!GV || (GV->getValueType() != Ty))
6758 if (!GV->isDeclaration())
6768 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
6769 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
6780 setNonAliasAttributes(GD, Fn);
6782 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
6783 (CodeGenOpts.OptimizationLevel == 0) &&
6786 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
6788 !D->
hasAttr<NoInlineAttr>() &&
6789 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
6790 !D->
hasAttr<OptimizeNoneAttr>() &&
6791 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
6792 !ShouldAddOptNone) {
6793 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
6799 auto GetPriority = [
this](
const auto *
Attr) ->
int {
6804 return Attr->DefaultPriority;
6807 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
6809 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
6815void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
6817 const AliasAttr *AA = D->
getAttr<AliasAttr>();
6818 assert(AA &&
"Not an alias?");
6822 if (AA->getAliasee() == MangledName) {
6823 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6830 if (Entry && !Entry->isDeclaration())
6833 Aliases.push_back(GD);
6839 llvm::Constant *Aliasee;
6840 llvm::GlobalValue::LinkageTypes
LT;
6842 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6848 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6855 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6857 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
6860 if (GA->getAliasee() == Entry) {
6861 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6865 assert(Entry->isDeclaration());
6874 GA->takeName(Entry);
6876 Entry->replaceAllUsesWith(GA);
6877 Entry->eraseFromParent();
6879 GA->setName(MangledName);
6887 GA->setLinkage(llvm::Function::WeakAnyLinkage);
6890 if (
const auto *VD = dyn_cast<VarDecl>(D))
6891 if (VD->getTLSKind())
6902void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
6904 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
6905 assert(IFA &&
"Not an ifunc?");
6909 if (IFA->getResolver() == MangledName) {
6910 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6916 if (Entry && !Entry->isDeclaration()) {
6919 DiagnosedConflictingDefinitions.insert(GD).second) {
6920 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
6923 diag::note_previous_definition);
6928 Aliases.push_back(GD);
6934 llvm::Constant *Resolver =
6935 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
6939 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
6940 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
6942 if (GIF->getResolver() == Entry) {
6943 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6946 assert(Entry->isDeclaration());
6955 GIF->takeName(Entry);
6957 Entry->replaceAllUsesWith(GIF);
6958 Entry->eraseFromParent();
6960 GIF->setName(MangledName);
6966 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
6967 (llvm::Intrinsic::ID)IID, Tys);
6970static llvm::StringMapEntry<llvm::GlobalVariable *> &
6973 bool &IsUTF16,
unsigned &StringLength) {
6974 StringRef String = Literal->getString();
6975 unsigned NumBytes = String.size();
6978 if (!Literal->containsNonAsciiOrNull()) {
6979 StringLength = NumBytes;
6980 return *Map.insert(std::make_pair(String,
nullptr)).first;
6987 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
6988 llvm::UTF16 *ToPtr = &ToBuf[0];
6990 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
6991 ToPtr + NumBytes, llvm::strictConversion);
6994 StringLength = ToPtr - &ToBuf[0];
6998 return *Map.insert(std::make_pair(
6999 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7000 (StringLength + 1) * 2),
7006 unsigned StringLength = 0;
7007 bool isUTF16 =
false;
7008 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7013 if (
auto *
C = Entry.second)
7018 const llvm::Triple &Triple =
getTriple();
7021 const bool IsSwiftABI =
7022 static_cast<unsigned>(CFRuntime) >=
7027 if (!CFConstantStringClassRef) {
7028 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7030 Ty = llvm::ArrayType::get(Ty, 0);
7032 switch (CFRuntime) {
7036 CFConstantStringClassName =
7037 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7038 :
"$s10Foundation19_NSCFConstantStringCN";
7042 CFConstantStringClassName =
7043 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7044 :
"$S10Foundation19_NSCFConstantStringCN";
7048 CFConstantStringClassName =
7049 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7050 :
"__T010Foundation19_NSCFConstantStringCN";
7057 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7058 llvm::GlobalValue *GV =
nullptr;
7060 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7067 if ((VD = dyn_cast<VarDecl>(
Result)))
7070 if (Triple.isOSBinFormatELF()) {
7072 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7074 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7075 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7076 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7078 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7086 CFConstantStringClassRef =
7087 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7090 QualType CFTy = Context.getCFConstantStringType();
7095 auto Fields = Builder.beginStruct(STy);
7104 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7105 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7107 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7111 llvm::Constant *
C =
nullptr;
7114 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7115 Entry.first().size() / 2);
7116 C = llvm::ConstantDataArray::get(VMContext, Arr);
7118 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7124 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7125 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7126 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7129 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7130 : Context.getTypeAlignInChars(Context.CharTy);
7136 if (Triple.isOSBinFormatMachO())
7137 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7138 :
"__TEXT,__cstring,cstring_literals");
7141 else if (Triple.isOSBinFormatELF())
7142 GV->setSection(
".rodata");
7148 llvm::IntegerType *LengthTy =
7158 Fields.addInt(LengthTy, StringLength);
7166 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7168 llvm::GlobalVariable::PrivateLinkage);
7169 GV->addAttribute(
"objc_arc_inert");
7170 switch (Triple.getObjectFormat()) {
7171 case llvm::Triple::UnknownObjectFormat:
7172 llvm_unreachable(
"unknown file format");
7173 case llvm::Triple::DXContainer:
7174 case llvm::Triple::GOFF:
7175 case llvm::Triple::SPIRV:
7176 case llvm::Triple::XCOFF:
7177 llvm_unreachable(
"unimplemented");
7178 case llvm::Triple::COFF:
7179 case llvm::Triple::ELF:
7180 case llvm::Triple::Wasm:
7181 GV->setSection(
"cfstring");
7183 case llvm::Triple::MachO:
7184 GV->setSection(
"__DATA,__cfstring");
7193 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7197 if (ObjCFastEnumerationStateType.isNull()) {
7198 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7202 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7203 Context.getPointerType(Context.UnsignedLongTy),
7204 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7207 for (
size_t i = 0; i < 4; ++i) {
7212 FieldTypes[i],
nullptr,
7221 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7224 return ObjCFastEnumerationStateType;
7238 assert(CAT &&
"String literal not of constant array type!");
7240 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7244 llvm::Type *ElemTy = AType->getElementType();
7245 unsigned NumElements = AType->getNumElements();
7248 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7250 Elements.reserve(NumElements);
7252 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7254 Elements.resize(NumElements);
7255 return llvm::ConstantDataArray::get(VMContext, Elements);
7258 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7260 Elements.reserve(NumElements);
7262 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7264 Elements.resize(NumElements);
7265 return llvm::ConstantDataArray::get(VMContext, Elements);
7268static llvm::GlobalVariable *
7277 auto *GV =
new llvm::GlobalVariable(
7278 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7279 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7281 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7282 if (GV->isWeakForLinker()) {
7283 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7284 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7300 llvm::GlobalVariable **Entry =
nullptr;
7301 if (!LangOpts.WritableStrings) {
7302 Entry = &ConstantStringMap[
C];
7303 if (
auto GV = *Entry) {
7304 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7307 GV->getValueType(), Alignment);
7312 StringRef GlobalVariableName;
7313 llvm::GlobalValue::LinkageTypes LT;
7318 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7319 !LangOpts.WritableStrings) {
7320 llvm::raw_svector_ostream Out(MangledNameBuffer);
7322 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7323 GlobalVariableName = MangledNameBuffer;
7325 LT = llvm::GlobalValue::PrivateLinkage;
7326 GlobalVariableName = Name;
7338 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7341 GV->getValueType(), Alignment);
7358 StringRef GlobalName) {
7359 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7364 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7367 llvm::GlobalVariable **Entry =
nullptr;
7368 if (!LangOpts.WritableStrings) {
7369 Entry = &ConstantStringMap[
C];
7370 if (
auto GV = *Entry) {
7371 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7374 GV->getValueType(), Alignment);
7380 GlobalName, Alignment);
7385 GV->getValueType(), Alignment);
7403 MaterializedType = E->
getType();
7407 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7408 if (!InsertResult.second) {
7411 if (!InsertResult.first->second) {
7416 InsertResult.first->second =
new llvm::GlobalVariable(
7417 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7421 llvm::cast<llvm::GlobalVariable>(
7422 InsertResult.first->second->stripPointerCasts())
7431 llvm::raw_svector_ostream Out(Name);
7453 std::optional<ConstantEmitter> emitter;
7454 llvm::Constant *InitialValue =
nullptr;
7455 bool Constant =
false;
7459 emitter.emplace(*
this);
7460 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7465 Type = InitialValue->getType();
7474 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7476 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7480 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7484 Linkage = llvm::GlobalVariable::InternalLinkage;
7488 auto *GV =
new llvm::GlobalVariable(
7490 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7491 if (emitter) emitter->finalize(GV);
7493 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7495 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7497 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7501 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7502 if (VD->getTLSKind())
7504 llvm::Constant *CV = GV;
7507 GV, llvm::PointerType::get(
7513 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7515 Entry->replaceAllUsesWith(CV);
7516 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7525void CodeGenModule::EmitObjCPropertyImplementations(
const
7538 if (!Getter || Getter->isSynthesizedAccessorStub())
7541 auto *Setter = PID->getSetterMethodDecl();
7542 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7553 if (ivar->getType().isDestructedType())
7574void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7587 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7602 getContext().getObjCIdType(),
nullptr, D,
true,
7608 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7613void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7620 EmitDeclContext(LSD);
7623void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7625 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7628 std::unique_ptr<CodeGenFunction> &CurCGF =
7629 GlobalTopLevelStmtBlockInFlight.first;
7633 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7641 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7642 FunctionArgList Args;
7644 const CGFunctionInfo &FnInfo =
7647 llvm::Function *
Fn = llvm::Function::Create(
7648 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7650 CurCGF.reset(
new CodeGenFunction(*
this));
7651 GlobalTopLevelStmtBlockInFlight.second = D;
7652 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7654 CXXGlobalInits.push_back(Fn);
7657 CurCGF->EmitStmt(D->
getStmt());
7660void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7661 for (
auto *I : DC->
decls()) {
7667 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7668 for (
auto *M : OID->methods())
7687 case Decl::CXXConversion:
7688 case Decl::CXXMethod:
7689 case Decl::Function:
7696 case Decl::CXXDeductionGuide:
7701 case Decl::Decomposition:
7702 case Decl::VarTemplateSpecialization:
7704 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
7705 for (
auto *B : DD->flat_bindings())
7706 if (
auto *HD = B->getHoldingVar())
7713 case Decl::IndirectField:
7717 case Decl::Namespace:
7720 case Decl::ClassTemplateSpecialization: {
7723 if (Spec->getSpecializationKind() ==
7725 Spec->hasDefinition())
7726 DI->completeTemplateDefinition(*Spec);
7728 case Decl::CXXRecord: {
7732 DI->EmitAndRetainType(
7736 DI->completeUnusedClass(*CRD);
7739 for (
auto *I : CRD->
decls())
7745 case Decl::UsingShadow:
7746 case Decl::ClassTemplate:
7747 case Decl::VarTemplate:
7749 case Decl::VarTemplatePartialSpecialization:
7750 case Decl::FunctionTemplate:
7751 case Decl::TypeAliasTemplate:
7760 case Decl::UsingEnum:
7764 case Decl::NamespaceAlias:
7768 case Decl::UsingDirective:
7772 case Decl::CXXConstructor:
7775 case Decl::CXXDestructor:
7779 case Decl::StaticAssert:
7786 case Decl::ObjCInterface:
7787 case Decl::ObjCCategory:
7790 case Decl::ObjCProtocol: {
7792 if (Proto->isThisDeclarationADefinition())
7793 ObjCRuntime->GenerateProtocol(Proto);
7797 case Decl::ObjCCategoryImpl:
7803 case Decl::ObjCImplementation: {
7805 EmitObjCPropertyImplementations(OMD);
7806 EmitObjCIvarInitializations(OMD);
7807 ObjCRuntime->GenerateClass(OMD);
7811 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7812 OMD->getClassInterface()), OMD->getLocation());
7815 case Decl::ObjCMethod: {
7822 case Decl::ObjCCompatibleAlias:
7826 case Decl::PragmaComment: {
7828 switch (PCD->getCommentKind()) {
7830 llvm_unreachable(
"unexpected pragma comment kind");
7845 case Decl::PragmaDetectMismatch: {
7851 case Decl::LinkageSpec:
7855 case Decl::FileScopeAsm: {
7857 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7860 if (LangOpts.OpenMPIsTargetDevice)
7863 if (LangOpts.SYCLIsDevice)
7866 getModule().appendModuleInlineAsm(AD->getAsmString());
7870 case Decl::TopLevelStmt:
7874 case Decl::Import: {
7878 if (!ImportedModules.insert(Import->getImportedModule()))
7882 if (!Import->getImportedOwningModule()) {
7884 DI->EmitImportDecl(*Import);
7890 if (CXX20ModuleInits && Import->getImportedModule() &&
7891 Import->getImportedModule()->isNamedModule())
7900 Visited.insert(Import->getImportedModule());
7901 Stack.push_back(Import->getImportedModule());
7903 while (!Stack.empty()) {
7905 if (!EmittedModuleInitializers.insert(Mod).second)
7908 for (
auto *D : Context.getModuleInitializers(Mod))
7915 if (Submodule->IsExplicit)
7918 if (Visited.insert(Submodule).second)
7919 Stack.push_back(Submodule);
7929 case Decl::OMPThreadPrivate:
7933 case Decl::OMPAllocate:
7937 case Decl::OMPDeclareReduction:
7941 case Decl::OMPDeclareMapper:
7945 case Decl::OMPRequires:
7950 case Decl::TypeAlias:
7952 DI->EmitAndRetainType(
getContext().getTypedefType(
7960 DI->EmitAndRetainType(
7967 DI->EmitAndRetainType(
7971 case Decl::HLSLRootSignature:
7974 case Decl::HLSLBuffer:
7978 case Decl::OpenACCDeclare:
7981 case Decl::OpenACCRoutine:
7996 if (!CodeGenOpts.CoverageMapping)
7999 case Decl::CXXConversion:
8000 case Decl::CXXMethod:
8001 case Decl::Function:
8002 case Decl::ObjCMethod:
8003 case Decl::CXXConstructor:
8004 case Decl::CXXDestructor: {
8013 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8023 if (!CodeGenOpts.CoverageMapping)
8025 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8026 if (Fn->isTemplateInstantiation())
8029 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8037 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8040 const Decl *D = Entry.first;
8042 case Decl::CXXConversion:
8043 case Decl::CXXMethod:
8044 case Decl::Function:
8045 case Decl::ObjCMethod: {
8052 case Decl::CXXConstructor: {
8059 case Decl::CXXDestructor: {
8076 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8077 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8078 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8079 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8080 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8089 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8090 return llvm::ConstantInt::get(i64, PtrInt);
8094 llvm::NamedMDNode *&GlobalMetadata,
8096 llvm::GlobalValue *
Addr) {
8097 if (!GlobalMetadata)
8099 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8102 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8105 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8108bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8109 llvm::GlobalValue *CppFunc) {
8111 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8114 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8117 if (Elem == CppFunc)
8123 for (llvm::User *User : Elem->users()) {
8127 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8128 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8131 for (llvm::User *CEUser : ConstExpr->users()) {
8132 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8133 IFuncs.push_back(IFunc);
8138 CEs.push_back(ConstExpr);
8139 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8140 IFuncs.push_back(IFunc);
8152 for (llvm::GlobalIFunc *IFunc : IFuncs)
8153 IFunc->setResolver(
nullptr);
8154 for (llvm::ConstantExpr *ConstExpr : CEs)
8155 ConstExpr->destroyConstant();
8159 Elem->eraseFromParent();
8161 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8166 llvm::FunctionType::get(IFunc->getType(),
false);
8167 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8168 CppFunc->getName(), ResolverTy, {},
false);
8169 IFunc->setResolver(Resolver);
8179void CodeGenModule::EmitStaticExternCAliases() {
8182 for (
auto &I : StaticExternCValues) {
8183 const IdentifierInfo *Name = I.first;
8184 llvm::GlobalValue *Val = I.second;
8192 llvm::GlobalValue *ExistingElem =
8197 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8204 auto Res = Manglings.find(MangledName);
8205 if (Res == Manglings.end())
8207 Result = Res->getValue();
8218void CodeGenModule::EmitDeclMetadata() {
8219 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8221 for (
auto &I : MangledDeclNames) {
8222 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8232void CodeGenFunction::EmitDeclMetadata() {
8233 if (LocalDeclMap.empty())
return;
8238 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8240 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8242 for (
auto &I : LocalDeclMap) {
8243 const Decl *D = I.first;
8244 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8245 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8247 Alloca->setMetadata(
8248 DeclPtrKind, llvm::MDNode::get(
8249 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8250 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8257void CodeGenModule::EmitVersionIdentMetadata() {
8258 llvm::NamedMDNode *IdentMetadata =
8259 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8261 llvm::LLVMContext &Ctx = TheModule.getContext();
8263 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8264 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8267void CodeGenModule::EmitCommandLineMetadata() {
8268 llvm::NamedMDNode *CommandLineMetadata =
8269 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8271 llvm::LLVMContext &Ctx = TheModule.getContext();
8273 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8274 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8277void CodeGenModule::EmitCoverageFile() {
8278 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8282 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8283 llvm::LLVMContext &Ctx = TheModule.getContext();
8284 auto *CoverageDataFile =
8286 auto *CoverageNotesFile =
8288 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8289 llvm::MDNode *CU = CUNode->getOperand(i);
8290 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8291 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8304 LangOpts.ObjCRuntime.isGNUFamily())
8305 return ObjCRuntime->GetEHType(Ty);
8312 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8314 for (
auto RefExpr : D->
varlist()) {
8317 VD->getAnyInitializer() &&
8318 !VD->getAnyInitializer()->isConstantInitializer(
getContext(),
8325 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8326 CXXGlobalInits.push_back(InitFunction);
8331CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
8335 FnType->getReturnType(), FnType->getParamTypes(),
8336 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8338 llvm::Metadata *&InternalId = Map[T.getCanonicalType()];
8343 std::string OutName;
8344 llvm::raw_string_ostream Out(OutName);
8349 Out <<
".normalized";
8372 return CreateMetadataIdentifierImpl(T, MetadataIdMap,
"");
8377 return CreateMetadataIdentifierImpl(T, VirtualMetadataIdMap,
".virtual");
8381 return CreateMetadataIdentifierImpl(T, GeneralizedMetadataIdMap,
8389 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8390 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8391 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8392 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8393 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8394 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8395 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8396 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8404 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8406 if (CodeGenOpts.SanitizeCfiCrossDso)
8408 VTable->addTypeMetadata(Offset.getQuantity(),
8409 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8412 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8413 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8419 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8429 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8444 bool forPointeeType) {
8455 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8462 bool AlignForArray = T->isArrayType();
8468 if (T->isIncompleteType()) {
8485 if (T.getQualifiers().hasUnaligned()) {
8487 }
else if (forPointeeType && !AlignForArray &&
8488 (RD = T->getAsCXXRecordDecl())) {
8499 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8512 if (NumAutoVarInit >= StopAfter) {
8515 if (!NumAutoVarInit) {
8529 const Decl *D)
const {
8533 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8535 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8541 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8545 llvm::MD5::MD5Result
Result;
8546 for (
const auto &Arg : PreprocessorOpts.Macros)
8547 Hash.update(Arg.first);
8551 llvm::sys::fs::UniqueID ID;
8555 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8559 SM.getDiagnostics().Report(diag::err_cannot_open_file)
8560 << PLoc.
getFilename() << Status.getError().message();
8562 ID = Status->getUniqueID();
8564 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8565 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8572 assert(DeferredDeclsToEmit.empty() &&
8573 "Should have emitted all decls deferred to emit.");
8574 assert(NewBuilder->DeferredDecls.empty() &&
8575 "Newly created module should not have deferred decls");
8576 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8577 assert(EmittedDeferredDecls.empty() &&
8578 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8580 assert(NewBuilder->DeferredVTables.empty() &&
8581 "Newly created module should not have deferred vtables");
8582 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8584 assert(NewBuilder->MangledDeclNames.empty() &&
8585 "Newly created module should not have mangled decl names");
8586 assert(NewBuilder->Manglings.empty() &&
8587 "Newly created module should not have manglings");
8588 NewBuilder->Manglings = std::move(Manglings);
8590 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8592 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
8596 std::string OutName;
8597 llvm::raw_string_ostream Out(OutName);
8605 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8614 return RequireVectorDeletingDtor.count(RD);
8618 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8620 RequireVectorDeletingDtor.insert(RD);
8634 if (Entry && !Entry->isDeclaration()) {
8639 auto *NewFn = llvm::Function::Create(
8641 llvm::Function::ExternalLinkage, VDName, &
getModule());
8642 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
8644 NewFn->takeName(VDEntry);
8645 VDEntry->replaceAllUsesWith(NewFn);
8646 VDEntry->eraseFromParent();
8647 Entry->replaceAllUsesWith(NewFn);
8648 Entry->eraseFromParent();
8653 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 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 void emitUsed(CodeGenModule &CGM, StringRef Name, std::vector< llvm::WeakTrackingVH > &List)
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 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.