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/CRC.h"
65#include "llvm/Support/CodeGen.h"
66#include "llvm/Support/CommandLine.h"
67#include "llvm/Support/ConvertUTF.h"
68#include "llvm/Support/ErrorHandling.h"
69#include "llvm/Support/TimeProfiler.h"
70#include "llvm/Support/xxhash.h"
71#include "llvm/TargetParser/RISCVISAInfo.h"
72#include "llvm/TargetParser/Triple.h"
73#include "llvm/TargetParser/X86TargetParser.h"
74#include "llvm/Transforms/Utils/BuildLibCalls.h"
82 "limited-coverage-experimental", llvm::cl::Hidden,
83 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
90 case TargetCXXABI::AppleARM64:
91 case TargetCXXABI::Fuchsia:
92 case TargetCXXABI::GenericAArch64:
93 case TargetCXXABI::GenericARM:
94 case TargetCXXABI::iOS:
95 case TargetCXXABI::WatchOS:
96 case TargetCXXABI::GenericMIPS:
97 case TargetCXXABI::GenericItanium:
98 case TargetCXXABI::WebAssembly:
99 case TargetCXXABI::XL:
101 case TargetCXXABI::Microsoft:
105 llvm_unreachable(
"invalid C++ ABI kind");
108static std::unique_ptr<TargetCodeGenInfo>
111 const llvm::Triple &Triple =
Target.getTriple();
114 switch (Triple.getArch()) {
118 case llvm::Triple::m68k:
120 case llvm::Triple::mips:
121 case llvm::Triple::mipsel:
122 if (Triple.getOS() == llvm::Triple::Win32)
126 case llvm::Triple::mips64:
127 case llvm::Triple::mips64el:
130 case llvm::Triple::avr: {
134 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
135 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
139 case llvm::Triple::aarch64:
140 case llvm::Triple::aarch64_32:
141 case llvm::Triple::aarch64_be: {
143 if (
Target.getABI() ==
"darwinpcs")
144 Kind = AArch64ABIKind::DarwinPCS;
145 else if (Triple.isOSWindows())
147 else if (
Target.getABI() ==
"aapcs-soft")
148 Kind = AArch64ABIKind::AAPCSSoft;
153 case llvm::Triple::wasm32:
154 case llvm::Triple::wasm64: {
156 if (
Target.getABI() ==
"experimental-mv")
157 Kind = WebAssemblyABIKind::ExperimentalMV;
161 case llvm::Triple::arm:
162 case llvm::Triple::armeb:
163 case llvm::Triple::thumb:
164 case llvm::Triple::thumbeb: {
165 if (Triple.getOS() == llvm::Triple::Win32)
169 StringRef ABIStr =
Target.getABI();
170 if (ABIStr ==
"apcs-gnu")
171 Kind = ARMABIKind::APCS;
172 else if (ABIStr ==
"aapcs16")
173 Kind = ARMABIKind::AAPCS16_VFP;
174 else if (CodeGenOpts.
FloatABI ==
"hard" ||
175 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
176 Kind = ARMABIKind::AAPCS_VFP;
181 case llvm::Triple::ppc: {
182 if (Triple.isOSAIX())
189 case llvm::Triple::ppcle: {
194 case llvm::Triple::ppc64:
195 if (Triple.isOSAIX())
198 if (Triple.isOSBinFormatELF()) {
200 if (
Target.getABI() ==
"elfv2")
201 Kind = PPC64_SVR4_ABIKind::ELFv2;
202 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
207 case llvm::Triple::ppc64le: {
208 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
210 if (
Target.getABI() ==
"elfv1")
211 Kind = PPC64_SVR4_ABIKind::ELFv1;
212 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
217 case llvm::Triple::nvptx:
218 case llvm::Triple::nvptx64:
221 case llvm::Triple::msp430:
224 case llvm::Triple::riscv32:
225 case llvm::Triple::riscv64: {
226 StringRef ABIStr =
Target.getABI();
228 unsigned ABIFLen = 0;
229 if (ABIStr.ends_with(
"f"))
231 else if (ABIStr.ends_with(
"d"))
233 bool EABI = ABIStr.ends_with(
"e");
237 case llvm::Triple::systemz: {
238 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
239 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
243 case llvm::Triple::tce:
244 case llvm::Triple::tcele:
247 case llvm::Triple::x86: {
248 bool IsDarwinVectorABI = Triple.isOSDarwin();
249 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
251 if (Triple.getOS() == llvm::Triple::Win32) {
253 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
254 CodeGenOpts.NumRegisterParameters);
257 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
258 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
261 case llvm::Triple::x86_64: {
262 StringRef ABI =
Target.getABI();
263 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
264 : ABI ==
"avx" ? X86AVXABILevel::AVX
265 : X86AVXABILevel::None);
267 switch (Triple.getOS()) {
268 case llvm::Triple::UEFI:
269 case llvm::Triple::Win32:
275 case llvm::Triple::hexagon:
277 case llvm::Triple::lanai:
279 case llvm::Triple::r600:
281 case llvm::Triple::amdgcn:
283 case llvm::Triple::sparc:
285 case llvm::Triple::sparcv9:
287 case llvm::Triple::xcore:
289 case llvm::Triple::arc:
291 case llvm::Triple::spir:
292 case llvm::Triple::spir64:
294 case llvm::Triple::spirv32:
295 case llvm::Triple::spirv64:
296 case llvm::Triple::spirv:
298 case llvm::Triple::dxil:
300 case llvm::Triple::ve:
302 case llvm::Triple::csky: {
303 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
305 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
310 case llvm::Triple::bpfeb:
311 case llvm::Triple::bpfel:
313 case llvm::Triple::loongarch32:
314 case llvm::Triple::loongarch64: {
315 StringRef ABIStr =
Target.getABI();
316 unsigned ABIFRLen = 0;
317 if (ABIStr.ends_with(
"f"))
319 else if (ABIStr.ends_with(
"d"))
328 if (!TheTargetCodeGenInfo)
330 return *TheTargetCodeGenInfo;
334 llvm::LLVMContext &Context,
338 if (Opts.AlignDouble || Opts.OpenCL || Opts.HLSL)
341 llvm::Triple Triple =
Target.getTriple();
342 llvm::DataLayout DL(
Target.getDataLayoutString());
343 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
344 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
345 llvm::Align ClangAlign(Alignment / 8);
346 if (DLAlign != ClangAlign) {
347 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
348 <<
" mapping to " << *Ty <<
" has data layout alignment "
349 << DLAlign.value() <<
" while clang specifies "
350 << ClangAlign.value() <<
"\n";
355 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
357 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
359 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
361 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
364 if (Triple.getArch() != llvm::Triple::m68k)
365 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
368 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
369 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
370 Triple.getArch() != llvm::Triple::ve)
371 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
373 if (
Target.hasFloat16Type())
374 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
376 if (
Target.hasBFloat16Type())
377 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
378 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
381 if (!Triple.isOSAIX()) {
383 llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
386 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
389 if (
Target.hasFloat128Type())
390 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
391 if (
Target.hasIbm128Type())
392 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
394 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
405 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
406 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
408 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
414 llvm::LLVMContext &LLVMContext = M.getContext();
415 VoidTy = llvm::Type::getVoidTy(LLVMContext);
416 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
417 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
418 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
419 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
420 HalfTy = llvm::Type::getHalfTy(LLVMContext);
421 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
422 FloatTy = llvm::Type::getFloatTy(LLVMContext);
423 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
429 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
431 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
433 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
434 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
435 IntPtrTy = llvm::IntegerType::get(LLVMContext,
436 C.getTargetInfo().getMaxPointerWidth());
437 Int8PtrTy = llvm::PointerType::get(LLVMContext,
439 const llvm::DataLayout &DL = M.getDataLayout();
441 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
443 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
460 createOpenCLRuntime();
462 createOpenMPRuntime();
469 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
470 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
476 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
477 CodeGenOpts.CoverageNotesFile.size() ||
478 CodeGenOpts.CoverageDataFile.size())
486 Block.GlobalUniqueCount = 0;
488 if (
C.getLangOpts().ObjC)
491 if (CodeGenOpts.hasProfileClangUse()) {
492 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
493 CodeGenOpts.ProfileInstrumentUsePath, *FS,
494 CodeGenOpts.ProfileRemappingFile);
495 if (
auto E = ReaderOrErr.takeError()) {
496 unsigned DiagID = Diags.getCustomDiagID(
498 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
500 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
504 PGOReader = std::move(ReaderOrErr.get());
509 if (CodeGenOpts.CoverageMapping)
513 if (CodeGenOpts.UniqueInternalLinkageNames &&
514 !
getModule().getSourceFileName().empty()) {
515 std::string Path =
getModule().getSourceFileName();
517 for (
const auto &Entry : LangOpts.MacroPrefixMap)
518 if (Path.rfind(Entry.first, 0) != std::string::npos) {
519 Path = Entry.second + Path.substr(Entry.first.size());
522 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
526 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
527 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
528 CodeGenOpts.NumRegisterParameters);
537 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
538 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
540 this->MSHotPatchFunctions.push_back(std::string{*I});
542 auto &DE = Context.getDiagnostics();
545 "failed to open hotpatch functions file "
546 "(-fms-hotpatch-functions-file): %0 : %1");
548 << BufOrErr.getError().message();
553 this->MSHotPatchFunctions.push_back(FuncName);
555 llvm::sort(this->MSHotPatchFunctions);
558 if (!Context.getAuxTargetInfo())
564void CodeGenModule::createObjCRuntime() {
581 llvm_unreachable(
"bad runtime kind");
584void CodeGenModule::createOpenCLRuntime() {
588void CodeGenModule::createOpenMPRuntime() {
589 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
590 Diags.Report(diag::err_omp_host_ir_file_not_found)
591 << LangOpts.OMPHostIRFile;
596 case llvm::Triple::nvptx:
597 case llvm::Triple::nvptx64:
598 case llvm::Triple::amdgcn:
599 case llvm::Triple::spirv64:
602 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
603 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
606 if (LangOpts.OpenMPSimd)
607 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
609 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
614void CodeGenModule::createCUDARuntime() {
618void CodeGenModule::createHLSLRuntime() {
619 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
623 Replacements[Name] =
C;
626void CodeGenModule::applyReplacements() {
627 for (
auto &I : Replacements) {
628 StringRef MangledName = I.first;
629 llvm::Constant *Replacement = I.second;
634 auto *NewF = dyn_cast<llvm::Function>(Replacement);
636 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
637 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
640 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
641 CE->getOpcode() == llvm::Instruction::GetElementPtr);
642 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
647 OldF->replaceAllUsesWith(Replacement);
649 NewF->removeFromParent();
650 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
653 OldF->eraseFromParent();
658 GlobalValReplacements.push_back(std::make_pair(GV,
C));
661void CodeGenModule::applyGlobalValReplacements() {
662 for (
auto &I : GlobalValReplacements) {
663 llvm::GlobalValue *GV = I.first;
664 llvm::Constant *
C = I.second;
666 GV->replaceAllUsesWith(
C);
667 GV->eraseFromParent();
674 const llvm::Constant *
C;
675 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
676 C = GA->getAliasee();
677 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
678 C = GI->getResolver();
682 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
686 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
695 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
696 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
700 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
704 if (GV->hasCommonLinkage()) {
705 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
706 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
707 Diags.
Report(Location, diag::err_alias_to_common);
712 if (GV->isDeclaration()) {
713 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
714 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
715 << IsIFunc << IsIFunc;
718 for (
const auto &[
Decl, Name] : MangledDeclNames) {
719 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
721 if (II && II->
getName() == GV->getName()) {
722 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
726 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
736 const auto *F = dyn_cast<llvm::Function>(GV);
738 Diags.
Report(Location, diag::err_alias_to_undefined)
739 << IsIFunc << IsIFunc;
743 llvm::FunctionType *FTy = F->getFunctionType();
744 if (!FTy->getReturnType()->isPointerTy()) {
745 Diags.
Report(Location, diag::err_ifunc_resolver_return);
759 if (GVar->hasAttribute(
"toc-data")) {
760 auto GVId = GVar->getName();
763 Diags.
Report(Location, diag::warn_toc_unsupported_type)
764 << GVId <<
"the variable has an alias";
766 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
767 llvm::AttributeSet NewAttributes =
768 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
769 GVar->setAttributes(NewAttributes);
773void CodeGenModule::checkAliases() {
778 DiagnosticsEngine &Diags =
getDiags();
779 for (
const GlobalDecl &GD : Aliases) {
781 SourceLocation Location;
783 bool IsIFunc = D->hasAttr<IFuncAttr>();
784 if (
const Attr *A = D->getDefiningAttr()) {
785 Location = A->getLocation();
786 Range = A->getRange();
788 llvm_unreachable(
"Not an alias or ifunc?");
792 const llvm::GlobalValue *GV =
nullptr;
794 MangledDeclNames, Range)) {
800 if (
const llvm::GlobalVariable *GVar =
801 dyn_cast<const llvm::GlobalVariable>(GV))
805 llvm::Constant *Aliasee =
809 llvm::GlobalValue *AliaseeGV;
810 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
815 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
816 StringRef AliasSection = SA->getName();
817 if (AliasSection != AliaseeGV->getSection())
818 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
819 << AliasSection << IsIFunc << IsIFunc;
827 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
828 if (GA->isInterposable()) {
829 Diags.Report(Location, diag::warn_alias_to_weak_alias)
830 << GV->getName() << GA->getName() << IsIFunc;
831 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
832 GA->getAliasee(), Alias->getType());
844 llvm::Attribute::DisableSanitizerInstrumentation);
849 for (
const GlobalDecl &GD : Aliases) {
852 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
853 Alias->eraseFromParent();
858 DeferredDeclsToEmit.clear();
859 EmittedDeferredDecls.clear();
860 DeferredAnnotations.clear();
862 OpenMPRuntime->clear();
866 StringRef MainFile) {
869 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
870 if (MainFile.empty())
871 MainFile =
"<stdin>";
872 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
875 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
878 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
882static std::optional<llvm::GlobalValue::VisibilityTypes>
889 return llvm::GlobalValue::DefaultVisibility;
891 return llvm::GlobalValue::HiddenVisibility;
893 return llvm::GlobalValue::ProtectedVisibility;
895 llvm_unreachable(
"unknown option value!");
900 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
909 GV.setDSOLocal(
false);
910 GV.setVisibility(*
V);
915 if (!LO.VisibilityFromDLLStorageClass)
918 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
921 std::optional<llvm::GlobalValue::VisibilityTypes>
922 NoDLLStorageClassVisibility =
925 std::optional<llvm::GlobalValue::VisibilityTypes>
926 ExternDeclDLLImportVisibility =
929 std::optional<llvm::GlobalValue::VisibilityTypes>
930 ExternDeclNoDLLStorageClassVisibility =
933 for (llvm::GlobalValue &GV : M.global_values()) {
934 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
937 if (GV.isDeclarationForLinker())
939 llvm::GlobalValue::DLLImportStorageClass
940 ? ExternDeclDLLImportVisibility
941 : ExternDeclNoDLLStorageClassVisibility);
944 llvm::GlobalValue::DLLExportStorageClass
945 ? DLLExportVisibility
946 : NoDLLStorageClassVisibility);
948 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
953 const llvm::Triple &Triple,
957 return LangOpts.getStackProtector() == Mode;
963 EmitModuleInitializers(Primary);
965 DeferredDecls.insert_range(EmittedDeferredDecls);
966 EmittedDeferredDecls.clear();
967 EmitVTablesOpportunistically();
968 applyGlobalValReplacements();
970 emitMultiVersionFunctions();
972 if (Context.getLangOpts().IncrementalExtensions &&
973 GlobalTopLevelStmtBlockInFlight.first) {
975 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
976 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
982 EmitCXXModuleInitFunc(Primary);
984 EmitCXXGlobalInitFunc();
985 EmitCXXGlobalCleanUpFunc();
986 registerGlobalDtorsWithAtExit();
987 EmitCXXThreadLocalInitFunc();
989 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
991 if (Context.getLangOpts().CUDA && CUDARuntime) {
992 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
996 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
997 OpenMPRuntime->clear();
1001 PGOReader->getSummary(
false).getMD(VMContext),
1002 llvm::ProfileSummary::PSK_Instr);
1003 if (PGOStats.hasDiagnostics())
1009 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1010 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1012 EmitStaticExternCAliases();
1017 if (CoverageMapping)
1018 CoverageMapping->emit();
1019 if (CodeGenOpts.SanitizeCfiCrossDso) {
1023 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1025 emitAtAvailableLinkGuard();
1026 if (Context.getTargetInfo().getTriple().isWasm())
1033 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1034 llvm::CodeObjectVersionKind::COV_None) {
1035 getModule().addModuleFlag(llvm::Module::Error,
1036 "amdhsa_code_object_version",
1037 getTarget().getTargetOpts().CodeObjectVersion);
1042 auto *MDStr = llvm::MDString::get(
1047 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1056 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1058 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1060 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1064 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1068 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1070 auto *GV =
new llvm::GlobalVariable(
1071 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1072 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1078 auto *GV =
new llvm::GlobalVariable(
1080 llvm::Constant::getNullValue(
Int8Ty),
1089 if (CodeGenOpts.Autolink &&
1090 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1091 EmitModuleLinkOptions();
1106 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1107 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1108 for (
auto *MD : ELFDependentLibraries)
1109 NMD->addOperand(MD);
1112 if (CodeGenOpts.DwarfVersion) {
1113 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1114 CodeGenOpts.DwarfVersion);
1117 if (CodeGenOpts.Dwarf64)
1118 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1120 if (Context.getLangOpts().SemanticInterposition)
1122 getModule().setSemanticInterposition(
true);
1124 if (CodeGenOpts.EmitCodeView) {
1126 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1128 if (CodeGenOpts.CodeViewGHash) {
1129 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1131 if (CodeGenOpts.ControlFlowGuard) {
1133 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 2);
1134 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1136 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 1);
1138 if (CodeGenOpts.EHContGuard) {
1140 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1142 if (Context.getLangOpts().Kernel) {
1144 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1146 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1151 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1153 llvm::Metadata *Ops[2] = {
1154 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1155 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1156 llvm::Type::getInt32Ty(VMContext), 1))};
1158 getModule().addModuleFlag(llvm::Module::Require,
1159 "StrictVTablePointersRequirement",
1160 llvm::MDNode::get(VMContext, Ops));
1166 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1167 llvm::DEBUG_METADATA_VERSION);
1172 uint64_t WCharWidth =
1173 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1174 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1177 getModule().addModuleFlag(llvm::Module::Warning,
1178 "zos_product_major_version",
1179 uint32_t(CLANG_VERSION_MAJOR));
1180 getModule().addModuleFlag(llvm::Module::Warning,
1181 "zos_product_minor_version",
1182 uint32_t(CLANG_VERSION_MINOR));
1183 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1184 uint32_t(CLANG_VERSION_PATCHLEVEL));
1186 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1187 llvm::MDString::get(VMContext, ProductId));
1192 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1193 llvm::MDString::get(VMContext, lang_str));
1195 time_t TT = PreprocessorOpts.SourceDateEpoch
1196 ? *PreprocessorOpts.SourceDateEpoch
1197 : std::time(
nullptr);
1198 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1199 static_cast<uint64_t
>(TT));
1202 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1203 llvm::MDString::get(VMContext,
"ascii"));
1206 llvm::Triple
T = Context.getTargetInfo().getTriple();
1207 if (
T.isARM() ||
T.isThumb()) {
1209 uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1210 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1214 StringRef ABIStr = Target.getABI();
1215 llvm::LLVMContext &Ctx = TheModule.getContext();
1216 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1217 llvm::MDString::get(Ctx, ABIStr));
1222 const std::vector<std::string> &Features =
1225 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1226 if (!errorToBool(ParseResult.takeError()))
1228 llvm::Module::AppendUnique,
"riscv-isa",
1230 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1233 if (CodeGenOpts.SanitizeCfiCrossDso) {
1235 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1238 if (CodeGenOpts.WholeProgramVTables) {
1242 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1243 CodeGenOpts.VirtualFunctionElimination);
1246 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1247 getModule().addModuleFlag(llvm::Module::Override,
1248 "CFI Canonical Jump Tables",
1249 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1252 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1253 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1257 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1259 llvm::Module::Append,
"Unique Source File Identifier",
1261 TheModule.getContext(),
1262 llvm::MDString::get(TheModule.getContext(),
1263 CodeGenOpts.UniqueSourceFileIdentifier)));
1266 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1267 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1270 if (CodeGenOpts.PatchableFunctionEntryOffset)
1271 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1272 CodeGenOpts.PatchableFunctionEntryOffset);
1273 if (CodeGenOpts.SanitizeKcfiArity)
1274 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1277 if (CodeGenOpts.CFProtectionReturn &&
1278 Target.checkCFProtectionReturnSupported(
getDiags())) {
1280 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1284 if (CodeGenOpts.CFProtectionBranch &&
1285 Target.checkCFProtectionBranchSupported(
getDiags())) {
1287 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1290 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1291 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1293 Scheme = Target.getDefaultCFBranchLabelScheme();
1295 llvm::Module::Error,
"cf-branch-label-scheme",
1301 if (CodeGenOpts.FunctionReturnThunks)
1302 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1304 if (CodeGenOpts.IndirectBranchCSPrefix)
1305 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1316 if (Context.getTargetInfo().hasFeature(
"ptrauth") &&
1317 LangOpts.getSignReturnAddressScope() !=
1319 getModule().addModuleFlag(llvm::Module::Override,
1320 "sign-return-address-buildattr", 1);
1321 if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
1322 getModule().addModuleFlag(llvm::Module::Override,
1323 "tag-stack-memory-buildattr", 1);
1325 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1333 if (LangOpts.BranchTargetEnforcement)
1334 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1336 if (LangOpts.BranchProtectionPAuthLR)
1337 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1339 if (LangOpts.GuardedControlStack)
1340 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1341 if (LangOpts.hasSignReturnAddress())
1342 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1343 if (LangOpts.isSignReturnAddressScopeAll())
1344 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1346 if (!LangOpts.isSignReturnAddressWithAKey())
1347 getModule().addModuleFlag(llvm::Module::Min,
1348 "sign-return-address-with-bkey", 2);
1350 if (LangOpts.PointerAuthELFGOT)
1351 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-elf-got", 1);
1354 if (LangOpts.PointerAuthCalls)
1355 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-sign-personality",
1358 using namespace llvm::ELF;
1359 uint64_t PAuthABIVersion =
1360 (LangOpts.PointerAuthIntrinsics
1361 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1362 (LangOpts.PointerAuthCalls
1363 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1364 (LangOpts.PointerAuthReturns
1365 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1366 (LangOpts.PointerAuthAuthTraps
1367 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1368 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1369 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1370 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1371 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1372 (LangOpts.PointerAuthInitFini
1373 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1374 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1375 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1376 (LangOpts.PointerAuthELFGOT
1377 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1378 (LangOpts.PointerAuthIndirectGotos
1379 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1380 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1381 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1382 (LangOpts.PointerAuthFunctionTypeDiscrimination
1383 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1384 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1385 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1386 "Update when new enum items are defined");
1387 if (PAuthABIVersion != 0) {
1388 getModule().addModuleFlag(llvm::Module::Error,
1389 "aarch64-elf-pauthabi-platform",
1390 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1391 getModule().addModuleFlag(llvm::Module::Error,
1392 "aarch64-elf-pauthabi-version",
1398 if (CodeGenOpts.StackClashProtector)
1400 llvm::Module::Override,
"probe-stack",
1401 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1403 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1404 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1405 CodeGenOpts.StackProbeSize);
1407 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1408 llvm::LLVMContext &Ctx = TheModule.getContext();
1410 llvm::Module::Error,
"MemProfProfileFilename",
1411 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1414 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1418 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1419 CodeGenOpts.FP32DenormalMode.Output !=
1420 llvm::DenormalMode::IEEE);
1423 if (LangOpts.EHAsynch)
1424 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1427 if (CodeGenOpts.ImportCallOptimization)
1428 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1432 if (CodeGenOpts.getWinX64EHUnwindV2() != llvm::WinX64EHUnwindV2Mode::Disabled)
1434 llvm::Module::Warning,
"winx64-eh-unwindv2",
1435 static_cast<unsigned>(CodeGenOpts.getWinX64EHUnwindV2()));
1439 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1441 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1445 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1446 EmitOpenCLMetadata();
1453 auto Version = LangOpts.getOpenCLCompatibleVersion();
1454 llvm::Metadata *SPIRVerElts[] = {
1455 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1457 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1458 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1459 llvm::NamedMDNode *SPIRVerMD =
1460 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1461 llvm::LLVMContext &Ctx = TheModule.getContext();
1462 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1470 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1471 assert(PLevel < 3 &&
"Invalid PIC Level");
1472 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1473 if (Context.getLangOpts().PIE)
1474 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1478 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1479 .Case(
"tiny", llvm::CodeModel::Tiny)
1480 .Case(
"small", llvm::CodeModel::Small)
1481 .Case(
"kernel", llvm::CodeModel::Kernel)
1482 .Case(
"medium", llvm::CodeModel::Medium)
1483 .Case(
"large", llvm::CodeModel::Large)
1486 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1489 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1490 Context.getTargetInfo().getTriple().getArch() ==
1491 llvm::Triple::x86_64) {
1497 if (CodeGenOpts.NoPLT)
1500 CodeGenOpts.DirectAccessExternalData !=
1501 getModule().getDirectAccessExternalData()) {
1502 getModule().setDirectAccessExternalData(
1503 CodeGenOpts.DirectAccessExternalData);
1505 if (CodeGenOpts.UnwindTables)
1506 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1508 switch (CodeGenOpts.getFramePointer()) {
1513 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1516 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1519 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1522 getModule().setFramePointer(llvm::FramePointerKind::All);
1526 SimplifyPersonality();
1539 EmitVersionIdentMetadata();
1542 EmitCommandLineMetadata();
1550 getModule().setStackProtectorGuardSymbol(
1553 getModule().setStackProtectorGuardOffset(
1558 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1560 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1562 if (
getContext().getTargetInfo().getMaxTLSAlign())
1563 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1564 getContext().getTargetInfo().getMaxTLSAlign());
1582 if (
getTriple().isPPC() && !MustTailCallUndefinedGlobals.empty()) {
1583 for (
auto &I : MustTailCallUndefinedGlobals) {
1584 if (!I.first->isDefined())
1585 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1589 if (!Entry || Entry->isWeakForLinker() ||
1590 Entry->isDeclarationForLinker())
1591 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1602 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
1603 ErrnoTBAAMD->addOperand(IntegerNode);
1608void CodeGenModule::EmitOpenCLMetadata() {
1614 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1615 llvm::Metadata *OCLVerElts[] = {
1616 llvm::ConstantAsMetadata::get(
1617 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1618 llvm::ConstantAsMetadata::get(
1619 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1620 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1621 llvm::LLVMContext &Ctx = TheModule.getContext();
1622 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1625 EmitVersion(
"opencl.ocl.version", CLVersion);
1626 if (LangOpts.OpenCLCPlusPlus) {
1628 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1632void CodeGenModule::EmitBackendOptionsMetadata(
1633 const CodeGenOptions &CodeGenOpts) {
1635 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1636 CodeGenOpts.SmallDataLimit);
1640 if (LangOpts.AllocTokenMode) {
1641 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
1642 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
1643 llvm::MDString::get(VMContext, S));
1645 if (LangOpts.AllocTokenMax)
1647 llvm::Module::Error,
"alloc-token-max",
1648 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1649 *LangOpts.AllocTokenMax));
1650 if (CodeGenOpts.SanitizeAllocTokenFastABI)
1651 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
1652 if (CodeGenOpts.SanitizeAllocTokenExtended)
1653 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
1669 return TBAA->getTypeInfo(QTy);
1688 return TBAA->getAccessInfo(AccessType);
1695 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1701 return TBAA->getTBAAStructInfo(QTy);
1707 return TBAA->getBaseTypeInfo(QTy);
1713 return TBAA->getAccessTagInfo(Info);
1720 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1728 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1736 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1742 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1747 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1760 "cannot compile this %0 yet");
1761 std::string Msg =
Type;
1770 "cannot compile this %0 yet");
1771 std::string Msg =
Type;
1776 llvm::function_ref<
void()> Fn) {
1777 StackHandler.runWithSufficientStackSpace(Loc, Fn);
1787 if (GV->hasLocalLinkage()) {
1788 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1801 if (Context.getLangOpts().OpenMP &&
1802 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
1803 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
1804 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
1805 OMPDeclareTargetDeclAttr::DT_NoHost &&
1807 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1812 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
1816 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
1820 if (GV->hasDLLExportStorageClass()) {
1823 diag::err_hidden_visibility_dllexport);
1826 diag::err_non_default_visibility_dllimport);
1832 !GV->isDeclarationForLinker())
1837 llvm::GlobalValue *GV) {
1838 if (GV->hasLocalLinkage())
1841 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
1845 if (GV->hasDLLImportStorageClass())
1848 const llvm::Triple &TT = CGM.
getTriple();
1850 if (TT.isOSCygMing()) {
1868 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
1876 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
1880 if (!TT.isOSBinFormatELF())
1886 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
1894 return !(CGM.
getLangOpts().SemanticInterposition ||
1899 if (!GV->isDeclarationForLinker())
1905 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
1912 if (CGOpts.DirectAccessExternalData) {
1918 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
1919 if (!Var->isThreadLocal())
1944 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
1946 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
1956 if (D->
hasAttr<DLLImportAttr>())
1957 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
1958 else if ((D->
hasAttr<DLLExportAttr>() ||
1960 !GV->isDeclarationForLinker())
1961 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
1981 GV->setPartition(CodeGenOpts.SymbolPartition);
1985 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
1986 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
1987 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
1988 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
1989 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
1992llvm::GlobalVariable::ThreadLocalMode
1994 switch (CodeGenOpts.getDefaultTLSModel()) {
1996 return llvm::GlobalVariable::GeneralDynamicTLSModel;
1998 return llvm::GlobalVariable::LocalDynamicTLSModel;
2000 return llvm::GlobalVariable::InitialExecTLSModel;
2002 return llvm::GlobalVariable::LocalExecTLSModel;
2004 llvm_unreachable(
"Invalid TLS model!");
2008 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2010 llvm::GlobalValue::ThreadLocalMode TLM;
2014 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2018 GV->setThreadLocalMode(TLM);
2024 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2028 const CPUSpecificAttr *
Attr,
2050 bool OmitMultiVersionMangling =
false) {
2052 llvm::raw_svector_ostream Out(Buffer);
2061 assert(II &&
"Attempt to mangle unnamed decl.");
2062 const auto *FD = dyn_cast<FunctionDecl>(ND);
2067 Out <<
"__regcall4__" << II->
getName();
2069 Out <<
"__regcall3__" << II->
getName();
2070 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2072 Out <<
"__device_stub__" << II->
getName();
2074 DeviceKernelAttr::isOpenCLSpelling(
2075 FD->getAttr<DeviceKernelAttr>()) &&
2077 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2093 "Hash computed when not explicitly requested");
2097 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2098 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2099 switch (FD->getMultiVersionKind()) {
2103 FD->getAttr<CPUSpecificAttr>(),
2107 auto *
Attr = FD->getAttr<TargetAttr>();
2108 assert(
Attr &&
"Expected TargetAttr to be present "
2109 "for attribute mangling");
2115 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2116 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2117 "for attribute mangling");
2123 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2124 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2125 "for attribute mangling");
2132 llvm_unreachable(
"None multiversion type isn't valid here");
2142 return std::string(Out.str());
2145void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2146 const FunctionDecl *FD,
2147 StringRef &CurName) {
2154 std::string NonTargetName =
2162 "Other GD should now be a multiversioned function");
2172 if (OtherName != NonTargetName) {
2175 const auto ExistingRecord = Manglings.find(NonTargetName);
2176 if (ExistingRecord != std::end(Manglings))
2177 Manglings.remove(&(*ExistingRecord));
2178 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2183 CurName = OtherNameRef;
2185 Entry->setName(OtherName);
2195 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2209 auto FoundName = MangledDeclNames.find(CanonicalGD);
2210 if (FoundName != MangledDeclNames.end())
2211 return FoundName->second;
2248 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2249 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2258 llvm::raw_svector_ostream Out(Buffer);
2261 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2262 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2264 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2269 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2270 return Result.first->first();
2274 auto it = MangledDeclNames.begin();
2275 while (it != MangledDeclNames.end()) {
2276 if (it->second == Name)
2291 llvm::Constant *AssociatedData) {
2293 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2299 bool IsDtorAttrFunc) {
2300 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2302 DtorsUsingAtExit[Priority].push_back(Dtor);
2307 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2310void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2311 if (Fns.empty())
return;
2317 llvm::PointerType *PtrTy = llvm::PointerType::get(
2318 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2321 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2325 auto Ctors = Builder.beginArray(CtorStructTy);
2326 for (
const auto &I : Fns) {
2327 auto Ctor = Ctors.beginStruct(CtorStructTy);
2328 Ctor.addInt(
Int32Ty, I.Priority);
2329 if (InitFiniAuthSchema) {
2330 llvm::Constant *StorageAddress =
2332 ? llvm::ConstantExpr::getIntToPtr(
2333 llvm::ConstantInt::get(
2335 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2339 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2340 llvm::ConstantInt::get(
2342 Ctor.add(SignedCtorPtr);
2344 Ctor.add(I.Initializer);
2346 if (I.AssociatedData)
2347 Ctor.add(I.AssociatedData);
2349 Ctor.addNullPointer(PtrTy);
2350 Ctor.finishAndAddTo(Ctors);
2353 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2355 llvm::GlobalValue::AppendingLinkage);
2359 List->setAlignment(std::nullopt);
2364llvm::GlobalValue::LinkageTypes
2370 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2377 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2378 if (!MDS)
return nullptr;
2380 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2387 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2388 if (!UD->
hasAttr<TransparentUnionAttr>())
2390 if (!UD->
fields().empty())
2391 return UD->
fields().begin()->getType();
2400 bool GeneralizePointers) {
2413 bool GeneralizePointers) {
2416 for (
auto &Param : FnType->param_types())
2417 GeneralizedParams.push_back(
2421 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2422 GeneralizedParams, FnType->getExtProtoInfo());
2427 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2429 llvm_unreachable(
"Encountered unknown FunctionType");
2437 FnType->getReturnType(), FnType->getParamTypes(),
2438 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2440 std::string OutName;
2441 llvm::raw_string_ostream Out(OutName);
2449 Out <<
".normalized";
2451 Out <<
".generalized";
2453 return llvm::ConstantInt::get(
Int32Ty,
2454 static_cast<uint32_t
>(llvm::xxHash64(OutName)));
2459 llvm::Function *F,
bool IsThunk) {
2461 llvm::AttributeList PAL;
2464 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2468 Loc = D->getLocation();
2470 Error(Loc,
"__vectorcall calling convention is not currently supported");
2472 F->setAttributes(PAL);
2473 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2477 std::string ReadOnlyQual(
"__read_only");
2478 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2479 if (ReadOnlyPos != std::string::npos)
2481 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2483 std::string WriteOnlyQual(
"__write_only");
2484 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2485 if (WriteOnlyPos != std::string::npos)
2486 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2488 std::string ReadWriteQual(
"__read_write");
2489 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2490 if (ReadWritePos != std::string::npos)
2491 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2524 assert(((FD && CGF) || (!FD && !CGF)) &&
2525 "Incorrect use - FD and CGF should either be both null or not!");
2551 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2554 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2559 std::string typeQuals;
2563 const Decl *PDecl = parm;
2565 PDecl = TD->getDecl();
2566 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2567 if (A && A->isWriteOnly())
2568 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2569 else if (A && A->isReadWrite())
2570 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2572 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2574 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2576 auto getTypeSpelling = [&](
QualType Ty) {
2577 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2579 if (Ty.isCanonical()) {
2580 StringRef typeNameRef = typeName;
2582 if (typeNameRef.consume_front(
"unsigned "))
2583 return std::string(
"u") + typeNameRef.str();
2584 if (typeNameRef.consume_front(
"signed "))
2585 return typeNameRef.str();
2595 addressQuals.push_back(
2596 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2600 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2601 std::string baseTypeName =
2603 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2604 argBaseTypeNames.push_back(
2605 llvm::MDString::get(VMContext, baseTypeName));
2609 typeQuals =
"restrict";
2612 typeQuals += typeQuals.empty() ?
"const" :
" const";
2614 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2616 uint32_t AddrSpc = 0;
2621 addressQuals.push_back(
2622 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2626 std::string typeName = getTypeSpelling(ty);
2638 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2639 argBaseTypeNames.push_back(
2640 llvm::MDString::get(VMContext, baseTypeName));
2645 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2649 Fn->setMetadata(
"kernel_arg_addr_space",
2650 llvm::MDNode::get(VMContext, addressQuals));
2651 Fn->setMetadata(
"kernel_arg_access_qual",
2652 llvm::MDNode::get(VMContext, accessQuals));
2653 Fn->setMetadata(
"kernel_arg_type",
2654 llvm::MDNode::get(VMContext, argTypeNames));
2655 Fn->setMetadata(
"kernel_arg_base_type",
2656 llvm::MDNode::get(VMContext, argBaseTypeNames));
2657 Fn->setMetadata(
"kernel_arg_type_qual",
2658 llvm::MDNode::get(VMContext, argTypeQuals));
2662 Fn->setMetadata(
"kernel_arg_name",
2663 llvm::MDNode::get(VMContext, argNames));
2673 if (!LangOpts.Exceptions)
return false;
2676 if (LangOpts.CXXExceptions)
return true;
2679 if (LangOpts.ObjCExceptions) {
2699SmallVector<const CXXRecordDecl *, 0>
2701 llvm::SetVector<const CXXRecordDecl *> MostBases;
2706 MostBases.insert(RD);
2708 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2710 CollectMostBases(RD);
2711 return MostBases.takeVector();
2715 llvm::Function *F) {
2716 llvm::AttrBuilder B(F->getContext());
2718 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2719 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2721 if (CodeGenOpts.StackClashProtector)
2722 B.addAttribute(
"probe-stack",
"inline-asm");
2724 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2725 B.addAttribute(
"stack-probe-size",
2726 std::to_string(CodeGenOpts.StackProbeSize));
2729 B.addAttribute(llvm::Attribute::NoUnwind);
2731 if (D && D->
hasAttr<NoStackProtectorAttr>())
2733 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
2735 B.addAttribute(llvm::Attribute::StackProtectStrong);
2737 B.addAttribute(llvm::Attribute::StackProtect);
2739 B.addAttribute(llvm::Attribute::StackProtectStrong);
2741 B.addAttribute(llvm::Attribute::StackProtectReq);
2745 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2746 B.addAttribute(llvm::Attribute::AlwaysInline);
2750 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2752 B.addAttribute(llvm::Attribute::NoInline);
2760 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2761 B.addAttribute(
"aarch64_pstate_sm_body");
2764 if (
Attr->isNewZA())
2765 B.addAttribute(
"aarch64_new_za");
2766 if (
Attr->isNewZT0())
2767 B.addAttribute(
"aarch64_new_zt0");
2772 bool ShouldAddOptNone =
2773 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2775 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
2776 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
2779 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
2780 !D->
hasAttr<NoInlineAttr>()) {
2781 B.addAttribute(llvm::Attribute::AlwaysInline);
2782 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
2783 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2785 B.addAttribute(llvm::Attribute::OptimizeNone);
2788 B.addAttribute(llvm::Attribute::NoInline);
2793 B.addAttribute(llvm::Attribute::Naked);
2796 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
2797 F->removeFnAttr(llvm::Attribute::MinSize);
2798 }
else if (D->
hasAttr<NakedAttr>()) {
2800 B.addAttribute(llvm::Attribute::Naked);
2801 B.addAttribute(llvm::Attribute::NoInline);
2802 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
2803 B.addAttribute(llvm::Attribute::NoDuplicate);
2804 }
else if (D->
hasAttr<NoInlineAttr>() &&
2805 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2807 B.addAttribute(llvm::Attribute::NoInline);
2808 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
2809 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
2811 B.addAttribute(llvm::Attribute::AlwaysInline);
2815 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
2816 B.addAttribute(llvm::Attribute::NoInline);
2820 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2823 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
2824 return Redecl->isInlineSpecified();
2826 if (any_of(FD->
redecls(), CheckRedeclForInline))
2831 return any_of(Pattern->
redecls(), CheckRedeclForInline);
2833 if (CheckForInline(FD)) {
2834 B.addAttribute(llvm::Attribute::InlineHint);
2835 }
else if (CodeGenOpts.getInlining() ==
2838 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2839 B.addAttribute(llvm::Attribute::NoInline);
2846 if (!D->
hasAttr<OptimizeNoneAttr>()) {
2848 if (!ShouldAddOptNone)
2849 B.addAttribute(llvm::Attribute::OptimizeForSize);
2850 B.addAttribute(llvm::Attribute::Cold);
2853 B.addAttribute(llvm::Attribute::Hot);
2854 if (D->
hasAttr<MinSizeAttr>())
2855 B.addAttribute(llvm::Attribute::MinSize);
2862 F->setAlignment(llvm::Align(alignment));
2864 if (!D->
hasAttr<AlignedAttr>())
2865 if (LangOpts.FunctionAlignment)
2866 F->setAlignment(llvm::Align(1ull << LangOpts.FunctionAlignment));
2874 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
2879 if (CodeGenOpts.SanitizeCfiCrossDso &&
2880 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
2881 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2889 if (CodeGenOpts.CallGraphSection) {
2890 if (
auto *FD = dyn_cast<FunctionDecl>(D))
2897 auto *MD = dyn_cast<CXXMethodDecl>(D);
2900 llvm::Metadata *Id =
2902 MD->getType(), std::nullopt,
Base));
2903 F->addTypeMetadata(0, Id);
2910 if (isa_and_nonnull<NamedDecl>(D))
2913 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2915 if (D && D->
hasAttr<UsedAttr>())
2918 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
2920 ((CodeGenOpts.KeepPersistentStorageVariables &&
2921 (VD->getStorageDuration() ==
SD_Static ||
2922 VD->getStorageDuration() ==
SD_Thread)) ||
2923 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
2924 VD->getType().isConstQualified())))
2928bool CodeGenModule::GetCPUAndFeaturesAttributes(
GlobalDecl GD,
2929 llvm::AttrBuilder &Attrs,
2930 bool SetTargetFeatures) {
2936 std::vector<std::string> Features;
2937 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
2940 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
2941 assert((!TD || !TV) &&
"both target_version and target specified");
2944 bool AddedAttr =
false;
2945 if (TD || TV || SD || TC) {
2946 llvm::StringMap<bool> FeatureMap;
2950 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
2951 Features.push_back((Entry.getValue() ?
"+" :
"-") + Entry.getKey().str());
2959 Target.parseTargetAttr(TD->getFeaturesStr());
2981 if (!TargetCPU.empty()) {
2982 Attrs.addAttribute(
"target-cpu", TargetCPU);
2985 if (!TuneCPU.empty()) {
2986 Attrs.addAttribute(
"tune-cpu", TuneCPU);
2989 if (!Features.empty() && SetTargetFeatures) {
2990 llvm::erase_if(Features, [&](
const std::string& F) {
2993 llvm::sort(Features);
2994 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
2999 llvm::SmallVector<StringRef, 8> Feats;
3000 bool IsDefault =
false;
3002 IsDefault = TV->isDefaultVersion();
3003 TV->getFeatures(Feats);
3009 Attrs.addAttribute(
"fmv-features");
3011 }
else if (!Feats.empty()) {
3013 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3014 std::string FMVFeatures;
3015 for (StringRef F : OrderedFeats)
3016 FMVFeatures.append(
"," + F.str());
3017 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3024void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3025 llvm::GlobalObject *GO) {
3030 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3033 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3034 GV->addAttribute(
"bss-section", SA->getName());
3035 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3036 GV->addAttribute(
"data-section", SA->getName());
3037 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3038 GV->addAttribute(
"rodata-section", SA->getName());
3039 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3040 GV->addAttribute(
"relro-section", SA->getName());
3043 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3046 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3047 if (!D->
getAttr<SectionAttr>())
3048 F->setSection(SA->getName());
3050 llvm::AttrBuilder Attrs(F->getContext());
3051 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3055 llvm::AttributeMask RemoveAttrs;
3056 RemoveAttrs.addAttribute(
"target-cpu");
3057 RemoveAttrs.addAttribute(
"target-features");
3058 RemoveAttrs.addAttribute(
"fmv-features");
3059 RemoveAttrs.addAttribute(
"tune-cpu");
3060 F->removeFnAttrs(RemoveAttrs);
3061 F->addFnAttrs(Attrs);
3065 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3066 GO->setSection(CSA->getName());
3067 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3068 GO->setSection(SA->getName());
3081 F->setLinkage(llvm::Function::InternalLinkage);
3083 setNonAliasAttributes(GD, F);
3094 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3098 llvm::MDNode *MD = F->getMetadata(llvm::LLVMContext::MD_type);
3099 return MD && MD->hasGeneralizedMDString();
3103 llvm::Function *F) {
3110 if (!F->hasLocalLinkage() ||
3111 F->getFunction().hasAddressTaken(
nullptr,
true,
3118 llvm::Function *F) {
3120 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3131 F->addTypeMetadata(0, MD);
3140 if (CodeGenOpts.SanitizeCfiCrossDso)
3142 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3146 llvm::CallBase *CB) {
3148 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall())
3152 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
3153 getLLVMContext(), {llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
3156 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3157 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3161 llvm::LLVMContext &Ctx = F->getContext();
3162 llvm::MDBuilder MDB(Ctx);
3163 llvm::StringRef Salt;
3166 if (
const auto &Info = FP->getExtraAttributeInfo())
3167 Salt = Info.CFISalt;
3169 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3178 return llvm::all_of(Name, [](
const char &
C) {
3179 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3185 for (
auto &F : M.functions()) {
3187 bool AddressTaken = F.hasAddressTaken();
3188 if (!AddressTaken && F.hasLocalLinkage())
3189 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3194 if (!AddressTaken || !F.isDeclaration())
3197 const llvm::ConstantInt *
Type;
3198 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3199 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3203 StringRef Name = F.getName();
3207 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3208 Name +
", " + Twine(
Type->getZExtValue()) +
"\n")
3210 M.appendModuleInlineAsm(
Asm);
3214void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3215 bool IsIncompleteFunction,
3218 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3226 if (!IsIncompleteFunction)
3233 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3235 assert(!F->arg_empty() &&
3236 F->arg_begin()->getType()
3237 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3238 "unexpected this return");
3239 F->addParamAttr(0, llvm::Attribute::Returned);
3249 if (!IsIncompleteFunction && F->isDeclaration())
3252 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3253 F->setSection(CSA->getName());
3254 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3255 F->setSection(SA->getName());
3257 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3259 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3260 else if (EA->isWarning())
3261 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3266 const FunctionDecl *FDBody;
3267 bool HasBody = FD->
hasBody(FDBody);
3269 assert(HasBody &&
"Inline builtin declarations should always have an "
3271 if (shouldEmitFunction(FDBody))
3272 F->addFnAttr(llvm::Attribute::NoBuiltin);
3278 F->addFnAttr(llvm::Attribute::NoBuiltin);
3282 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3283 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3284 if (MD->isVirtual())
3285 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3291 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3292 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3295 if (CodeGenOpts.CallGraphSection)
3298 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3304 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3305 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3307 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3311 llvm::LLVMContext &Ctx = F->getContext();
3312 llvm::MDBuilder MDB(Ctx);
3316 int CalleeIdx = *CB->encoding_begin();
3317 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3318 F->addMetadata(llvm::LLVMContext::MD_callback,
3319 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3320 CalleeIdx, PayloadIndices,
3327 "Only globals with definition can force usage.");
3328 LLVMUsed.emplace_back(GV);
3332 assert(!GV->isDeclaration() &&
3333 "Only globals with definition can force usage.");
3334 LLVMCompilerUsed.emplace_back(GV);
3339 "Only globals with definition can force usage.");
3341 LLVMCompilerUsed.emplace_back(GV);
3343 LLVMUsed.emplace_back(GV);
3347 std::vector<llvm::WeakTrackingVH> &List) {
3354 UsedArray.resize(List.size());
3355 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3357 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3361 if (UsedArray.empty())
3363 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3365 auto *GV =
new llvm::GlobalVariable(
3366 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3367 llvm::ConstantArray::get(ATy, UsedArray), Name);
3369 GV->setSection(
"llvm.metadata");
3372void CodeGenModule::emitLLVMUsed() {
3373 emitUsed(*
this,
"llvm.used", LLVMUsed);
3374 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3379 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3388 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3394 ELFDependentLibraries.push_back(
3395 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3402 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3411 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3417 if (Visited.insert(Import).second)
3434 if (LL.IsFramework) {
3435 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3436 llvm::MDString::get(Context, LL.Library)};
3438 Metadata.push_back(llvm::MDNode::get(Context, Args));
3444 llvm::Metadata *Args[2] = {
3445 llvm::MDString::get(Context,
"lib"),
3446 llvm::MDString::get(Context, LL.Library),
3448 Metadata.push_back(llvm::MDNode::get(Context, Args));
3452 auto *OptString = llvm::MDString::get(Context, Opt);
3453 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3458void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3460 "We should only emit module initializers for named modules.");
3468 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3485 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
3491void CodeGenModule::EmitModuleLinkOptions() {
3495 llvm::SetVector<clang::Module *> LinkModules;
3496 llvm::SmallPtrSet<clang::Module *, 16> Visited;
3497 SmallVector<clang::Module *, 16> Stack;
3500 for (
Module *M : ImportedModules) {
3503 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3506 if (Visited.insert(M).second)
3512 while (!Stack.empty()) {
3515 bool AnyChildren =
false;
3524 if (Visited.insert(
SM).second) {
3525 Stack.push_back(
SM);
3533 LinkModules.insert(Mod);
3540 SmallVector<llvm::MDNode *, 16> MetadataArgs;
3542 for (
Module *M : LinkModules)
3543 if (Visited.insert(M).second)
3545 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3546 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3549 if (!LinkerOptionsMetadata.empty()) {
3550 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3551 for (
auto *MD : LinkerOptionsMetadata)
3552 NMD->addOperand(MD);
3556void CodeGenModule::EmitDeferred() {
3565 if (!DeferredVTables.empty()) {
3566 EmitDeferredVTables();
3571 assert(DeferredVTables.empty());
3578 llvm::append_range(DeferredDeclsToEmit,
3582 if (DeferredDeclsToEmit.empty())
3587 std::vector<GlobalDecl> CurDeclsToEmit;
3588 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3590 for (GlobalDecl &D : CurDeclsToEmit) {
3596 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
3600 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
3616 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3634 if (!GV->isDeclaration())
3638 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3642 EmitGlobalDefinition(D, GV);
3647 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3649 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3654void CodeGenModule::EmitVTablesOpportunistically() {
3660 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3661 &&
"Only emit opportunistic vtables with optimizations");
3663 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
3665 "This queue should only contain external vtables");
3666 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3667 VTables.GenerateClassData(RD);
3669 OpportunisticVTables.clear();
3673 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3678 DeferredAnnotations.clear();
3680 if (Annotations.empty())
3684 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3685 Annotations[0]->
getType(), Annotations.size()), Annotations);
3686 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3687 llvm::GlobalValue::AppendingLinkage,
3688 Array,
"llvm.global.annotations");
3693 llvm::Constant *&AStr = AnnotationStrings[Str];
3698 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3699 auto *gv =
new llvm::GlobalVariable(
3700 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3701 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3704 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3721 SM.getExpansionLineNumber(L);
3722 return llvm::ConstantInt::get(
Int32Ty, LineNo);
3730 llvm::FoldingSetNodeID ID;
3731 for (
Expr *E : Exprs) {
3734 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
3739 LLVMArgs.reserve(Exprs.size());
3741 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
3743 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
3746 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
3747 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
3748 llvm::GlobalValue::PrivateLinkage,
Struct,
3751 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3758 const AnnotateAttr *AA,
3766 llvm::Constant *GVInGlobalsAS = GV;
3767 if (GV->getAddressSpace() !=
3769 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
3771 llvm::PointerType::get(
3772 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
3776 llvm::Constant *Fields[] = {
3777 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
3779 return llvm::ConstantStruct::getAnon(Fields);
3783 llvm::GlobalValue *GV) {
3784 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
3794 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
3797 auto &
SM = Context.getSourceManager();
3799 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
3804 return NoSanitizeL.containsLocation(Kind, Loc);
3807 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
3811 llvm::GlobalVariable *GV,
3813 StringRef Category)
const {
3815 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
3817 auto &
SM = Context.getSourceManager();
3818 if (NoSanitizeL.containsMainFile(
3819 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
3822 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
3829 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
3830 Ty = AT->getElementType();
3835 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
3843 StringRef Category)
const {
3846 auto Attr = ImbueAttr::NONE;
3848 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
3849 if (
Attr == ImbueAttr::NONE)
3850 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
3852 case ImbueAttr::NONE:
3854 case ImbueAttr::ALWAYS:
3855 Fn->addFnAttr(
"function-instrument",
"xray-always");
3857 case ImbueAttr::ALWAYS_ARG1:
3858 Fn->addFnAttr(
"function-instrument",
"xray-always");
3859 Fn->addFnAttr(
"xray-log-args",
"1");
3861 case ImbueAttr::NEVER:
3862 Fn->addFnAttr(
"function-instrument",
"xray-never");
3875 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
3885 auto &
SM = Context.getSourceManager();
3886 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
3900 if (NumGroups > 1) {
3901 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
3910 if (LangOpts.EmitAllDecls)
3913 const auto *VD = dyn_cast<VarDecl>(
Global);
3915 ((CodeGenOpts.KeepPersistentStorageVariables &&
3916 (VD->getStorageDuration() ==
SD_Static ||
3917 VD->getStorageDuration() ==
SD_Thread)) ||
3918 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3919 VD->getType().isConstQualified())))
3932 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
3933 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
3934 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
3935 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
3939 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
3949 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
3952 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
3953 if (Context.getInlineVariableDefinitionKind(VD) ==
3958 if (CXX20ModuleInits && VD->getOwningModule() &&
3959 !VD->getOwningModule()->isModuleMapModule()) {
3968 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
3971 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
3984 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3988 llvm::Constant *
Init;
3991 if (!
V.isAbsent()) {
4002 llvm::Constant *Fields[4] = {
4006 llvm::ConstantDataArray::getRaw(
4007 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4009 Init = llvm::ConstantStruct::getAnon(Fields);
4012 auto *GV =
new llvm::GlobalVariable(
4014 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4016 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4019 if (!
V.isAbsent()) {
4032 llvm::GlobalVariable **Entry =
nullptr;
4033 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4038 llvm::Constant *
Init;
4042 assert(!
V.isAbsent());
4046 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4048 llvm::GlobalValue::PrivateLinkage,
Init,
4050 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4064 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4068 llvm::Constant *
Init =
Emitter.emitForInitializer(
4076 llvm::GlobalValue::LinkageTypes
Linkage =
4078 ? llvm::GlobalValue::LinkOnceODRLinkage
4079 : llvm::GlobalValue::InternalLinkage;
4080 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4084 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4091 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4092 assert(AA &&
"No alias?");
4102 llvm::Constant *Aliasee;
4104 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4112 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4113 WeakRefReferences.insert(F);
4121 if (
auto *A = D->
getAttr<AttrT>())
4122 return A->isImplicit();
4129 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4132 const auto *AA =
Global->getAttr<AliasAttr>();
4140 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4141 if (LangOpts.OpenMPIsTargetDevice)
4142 return !AliaseeDecl ||
4143 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4146 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4147 const bool AliaseeHasDeviceAttr =
4148 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4150 if (LangOpts.CUDAIsDevice)
4151 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4158bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4159 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4164 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4165 Global->hasAttr<CUDAConstantAttr>() ||
4166 Global->hasAttr<CUDASharedAttr>() ||
4167 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4168 Global->getType()->isCUDADeviceBuiltinTextureType();
4175 if (
Global->hasAttr<WeakRefAttr>())
4180 if (
Global->hasAttr<AliasAttr>()) {
4183 return EmitAliasDefinition(GD);
4187 if (
Global->hasAttr<IFuncAttr>())
4188 return emitIFuncDefinition(GD);
4191 if (
Global->hasAttr<CPUDispatchAttr>())
4192 return emitCPUDispatchDefinition(GD);
4197 if (LangOpts.CUDA) {
4199 "Expected Variable or Function");
4200 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4201 if (!shouldEmitCUDAGlobalVar(VD))
4203 }
else if (LangOpts.CUDAIsDevice) {
4204 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4205 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4206 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4210 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4211 !
Global->hasAttr<CUDAGlobalAttr>() &&
4213 !
Global->hasAttr<CUDAHostAttr>()))
4216 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4217 Global->hasAttr<CUDADeviceAttr>())
4221 if (LangOpts.OpenMP) {
4223 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4225 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4226 if (MustBeEmitted(
Global))
4230 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4231 if (MustBeEmitted(
Global))
4238 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4239 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4245 if (FD->
hasAttr<AnnotateAttr>()) {
4248 DeferredAnnotations[MangledName] = FD;
4263 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4269 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4271 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4272 if (LangOpts.OpenMP) {
4274 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4275 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4279 if (VD->hasExternalStorage() &&
4280 Res != OMPDeclareTargetDeclAttr::MT_Link)
4283 bool UnifiedMemoryEnabled =
4285 if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4286 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4287 !UnifiedMemoryEnabled) {
4290 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4291 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4292 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4293 UnifiedMemoryEnabled)) &&
4294 "Link clause or to clause with unified memory expected.");
4303 if (Context.getInlineVariableDefinitionKind(VD) ==
4313 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4315 EmitGlobalDefinition(GD);
4316 addEmittedDeferredDecl(GD);
4324 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4325 CXXGlobalInits.push_back(
nullptr);
4331 addDeferredDeclToEmit(GD);
4332 }
else if (MustBeEmitted(
Global)) {
4334 assert(!MayBeEmittedEagerly(
Global));
4335 addDeferredDeclToEmit(GD);
4340 DeferredDecls[MangledName] = GD;
4346 if (
const auto *RT =
4347 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4348 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4349 RD = RD->getDefinitionOrSelf();
4350 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4358 struct FunctionIsDirectlyRecursive
4359 :
public ConstStmtVisitor<FunctionIsDirectlyRecursive, bool> {
4360 const StringRef Name;
4361 const Builtin::Context &BI;
4362 FunctionIsDirectlyRecursive(StringRef N,
const Builtin::Context &
C)
4365 bool VisitCallExpr(
const CallExpr *E) {
4369 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4370 if (Attr && Name == Attr->getLabel())
4375 std::string BuiltinNameStr = BI.
getName(BuiltinID);
4376 StringRef BuiltinName = BuiltinNameStr;
4377 return BuiltinName.consume_front(
"__builtin_") && Name == BuiltinName;
4380 bool VisitStmt(
const Stmt *S) {
4381 for (
const Stmt *Child : S->
children())
4382 if (Child && this->Visit(Child))
4389 struct DLLImportFunctionVisitor
4390 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4391 bool SafeToInline =
true;
4393 bool shouldVisitImplicitCode()
const {
return true; }
4395 bool VisitVarDecl(VarDecl *VD) {
4398 SafeToInline =
false;
4399 return SafeToInline;
4406 return SafeToInline;
4409 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4411 SafeToInline = D->
hasAttr<DLLImportAttr>();
4412 return SafeToInline;
4415 bool VisitDeclRefExpr(DeclRefExpr *E) {
4418 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4419 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4420 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4421 return SafeToInline;
4424 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4426 return SafeToInline;
4429 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4433 SafeToInline =
true;
4435 SafeToInline = M->
hasAttr<DLLImportAttr>();
4437 return SafeToInline;
4440 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4442 return SafeToInline;
4445 bool VisitCXXNewExpr(CXXNewExpr *E) {
4447 return SafeToInline;
4456CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4458 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4460 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4463 Name = Attr->getLabel();
4468 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
4469 const Stmt *Body = FD->
getBody();
4470 return Body ? Walker.Visit(Body) :
false;
4473bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4480 if (F->isInlineBuiltinDeclaration())
4483 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4488 if (
const Module *M = F->getOwningModule();
4489 M && M->getTopLevelModule()->isNamedModule() &&
4490 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4500 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4505 if (F->hasAttr<NoInlineAttr>())
4508 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4510 DLLImportFunctionVisitor Visitor;
4511 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4512 if (!Visitor.SafeToInline)
4515 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4518 for (
const Decl *
Member : Dtor->getParent()->decls())
4522 for (
const CXXBaseSpecifier &B : Dtor->getParent()->bases())
4533 return !isTriviallyRecursive(F);
4536bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4537 return CodeGenOpts.OptimizationLevel > 0;
4540void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
4541 llvm::GlobalValue *GV) {
4545 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4546 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4548 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4549 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4550 if (TC->isFirstOfVersion(I))
4553 EmitGlobalFunctionDefinition(GD, GV);
4559 AddDeferredMultiVersionResolverToEmit(GD);
4561 GetOrCreateMultiVersionResolver(GD);
4565void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
4568 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
4569 Context.getSourceManager(),
4570 "Generating code for declaration");
4572 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4575 if (!shouldEmitFunction(GD))
4578 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4580 llvm::raw_string_ostream
OS(Name);
4586 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4590 ABI->emitCXXStructor(GD);
4592 EmitMultiVersionFunctionDefinition(GD, GV);
4594 EmitGlobalFunctionDefinition(GD, GV);
4603 return EmitMultiVersionFunctionDefinition(GD, GV);
4604 return EmitGlobalFunctionDefinition(GD, GV);
4607 if (
const auto *VD = dyn_cast<VarDecl>(D))
4608 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4610 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4614 llvm::Function *NewFn);
4630static llvm::GlobalValue::LinkageTypes
4634 return llvm::GlobalValue::InternalLinkage;
4635 return llvm::GlobalValue::WeakODRLinkage;
4638void CodeGenModule::emitMultiVersionFunctions() {
4639 std::vector<GlobalDecl> MVFuncsToEmit;
4640 MultiVersionFuncs.swap(MVFuncsToEmit);
4641 for (GlobalDecl GD : MVFuncsToEmit) {
4643 assert(FD &&
"Expected a FunctionDecl");
4645 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
4646 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
4650 if (
Decl->isDefined()) {
4651 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4659 assert(
Func &&
"This should have just been created");
4668 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4671 FD, [&](
const FunctionDecl *CurFD) {
4672 llvm::SmallVector<StringRef, 8> Feats;
4675 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4677 TA->getX86AddedFeatures(Feats);
4678 llvm::Function *
Func = createFunction(CurFD);
4679 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
4680 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4681 if (TVA->isDefaultVersion() && IsDefined)
4682 ShouldEmitResolver =
true;
4683 llvm::Function *
Func = createFunction(CurFD);
4685 TVA->getFeatures(Feats, Delim);
4686 Options.emplace_back(
Func, Feats);
4687 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4688 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4689 if (!TC->isFirstOfVersion(I))
4691 if (TC->isDefaultVersion(I) && IsDefined)
4692 ShouldEmitResolver =
true;
4693 llvm::Function *
Func = createFunction(CurFD, I);
4696 TC->getX86Feature(Feats, I);
4697 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
4700 TC->getFeatures(Feats, I, Delim);
4701 Options.emplace_back(
Func, Feats);
4705 llvm_unreachable(
"unexpected MultiVersionKind");
4708 if (!ShouldEmitResolver)
4711 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
4712 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
4713 ResolverConstant = IFunc->getResolver();
4717 *
this, GD, FD,
true);
4724 auto *Alias = llvm::GlobalAlias::create(
4726 MangledName +
".ifunc", IFunc, &
getModule());
4735 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
4736 const CodeGenFunction::FMVResolverOption &RHS) {
4739 CodeGenFunction CGF(*
this);
4740 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4742 setMultiVersionResolverAttributes(ResolverFunc, GD);
4744 ResolverFunc->setComdat(
4745 getModule().getOrInsertComdat(ResolverFunc->getName()));
4751 if (!MVFuncsToEmit.empty())
4756 if (!MultiVersionFuncs.empty())
4757 emitMultiVersionFunctions();
4761 llvm::Constant *
New) {
4764 Old->replaceAllUsesWith(
New);
4765 Old->eraseFromParent();
4768void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
4770 assert(FD &&
"Not a FunctionDecl?");
4772 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
4773 assert(DD &&
"Not a cpu_dispatch Function?");
4779 UpdateMultiVersionNames(GD, FD, ResolverName);
4781 llvm::Type *ResolverType;
4782 GlobalDecl ResolverGD;
4784 ResolverType = llvm::FunctionType::get(
4795 ResolverName, ResolverType, ResolverGD,
false));
4798 ResolverFunc->setComdat(
4799 getModule().getOrInsertComdat(ResolverFunc->getName()));
4801 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4804 for (
const IdentifierInfo *II : DD->cpus()) {
4812 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
4815 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
4821 Func = GetOrCreateLLVMFunction(
4822 MangledName, DeclTy, ExistingDecl,
4828 llvm::SmallVector<StringRef, 32> Features;
4829 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
4830 llvm::transform(Features, Features.begin(),
4831 [](StringRef Str) { return Str.substr(1); });
4832 llvm::erase_if(Features, [&Target](StringRef Feat) {
4833 return !Target.validateCpuSupports(Feat);
4839 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
4840 const CodeGenFunction::FMVResolverOption &RHS) {
4841 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
4842 llvm::X86::getCpuSupportsMask(RHS.
Features);
4849 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
4850 (Options.end() - 2)->Features),
4851 [](
auto X) { return X == 0; })) {
4852 StringRef LHSName = (Options.end() - 2)->Function->getName();
4853 StringRef RHSName = (Options.end() - 1)->Function->getName();
4854 if (LHSName.compare(RHSName) < 0)
4855 Options.erase(Options.end() - 2);
4857 Options.erase(Options.end() - 1);
4860 CodeGenFunction CGF(*
this);
4861 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4862 setMultiVersionResolverAttributes(ResolverFunc, GD);
4867 unsigned AS = IFunc->getType()->getPointerAddressSpace();
4872 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
4879 *
this, GD, FD,
true);
4882 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
4890void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
4892 assert(FD &&
"Not a FunctionDecl?");
4895 std::string MangledName =
4897 if (!DeferredResolversToEmit.insert(MangledName).second)
4900 MultiVersionFuncs.push_back(GD);
4906llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
4908 assert(FD &&
"Not a FunctionDecl?");
4910 std::string MangledName =
4915 std::string ResolverName = MangledName;
4919 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
4923 ResolverName +=
".ifunc";
4930 ResolverName +=
".resolver";
4933 bool ShouldReturnIFunc =
4952 AddDeferredMultiVersionResolverToEmit(GD);
4956 if (ShouldReturnIFunc) {
4958 llvm::Type *ResolverType = llvm::FunctionType::get(
4960 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4961 MangledName +
".resolver", ResolverType, GlobalDecl{},
4963 llvm::GlobalIFunc *GIF =
4966 GIF->setName(ResolverName);
4973 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4974 ResolverName, DeclTy, GlobalDecl{},
false);
4976 "Resolver should be created for the first time");
4981void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
4983 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
4995 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5006bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5007 const llvm::GlobalValue *GV)
const {
5008 auto SC = GV->getDLLStorageClass();
5009 if (SC == llvm::GlobalValue::DefaultStorageClass)
5012 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5013 !MRD->
hasAttr<DLLImportAttr>()) ||
5014 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5015 !MRD->
hasAttr<DLLExportAttr>())) &&
5026llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5027 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5028 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5032 std::string NameWithoutMultiVersionMangling;
5033 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5035 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5036 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5037 !DontDefer && !IsForDefinition) {
5040 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5042 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5045 GDDef = GlobalDecl(FDDef);
5053 UpdateMultiVersionNames(GD, FD, MangledName);
5054 if (!IsForDefinition) {
5060 AddDeferredMultiVersionResolverToEmit(GD);
5062 *
this, GD, FD,
true);
5064 return GetOrCreateMultiVersionResolver(GD);
5069 if (!NameWithoutMultiVersionMangling.empty())
5070 MangledName = NameWithoutMultiVersionMangling;
5075 if (WeakRefReferences.erase(Entry)) {
5076 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5077 if (FD && !FD->
hasAttr<WeakAttr>())
5078 Entry->setLinkage(llvm::Function::ExternalLinkage);
5082 if (D && shouldDropDLLAttribute(D, Entry)) {
5083 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5089 if (IsForDefinition && !Entry->isDeclaration()) {
5096 DiagnosedConflictingDefinitions.insert(GD).second) {
5100 diag::note_previous_definition);
5105 (Entry->getValueType() == Ty)) {
5112 if (!IsForDefinition)
5119 bool IsIncompleteFunction =
false;
5121 llvm::FunctionType *FTy;
5125 FTy = llvm::FunctionType::get(
VoidTy,
false);
5126 IsIncompleteFunction =
true;
5130 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5131 Entry ? StringRef() : MangledName, &
getModule());
5135 if (D && D->
hasAttr<AnnotateAttr>())
5153 if (!Entry->use_empty()) {
5155 Entry->removeDeadConstantUsers();
5161 assert(F->getName() == MangledName &&
"name was uniqued!");
5163 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5164 if (ExtraAttrs.hasFnAttrs()) {
5165 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5173 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5176 addDeferredDeclToEmit(GD);
5181 auto DDI = DeferredDecls.find(MangledName);
5182 if (DDI != DeferredDecls.end()) {
5186 addDeferredDeclToEmit(DDI->second);
5187 DeferredDecls.erase(DDI);
5215 if (!IsIncompleteFunction) {
5216 assert(F->getFunctionType() == Ty);
5234 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5244 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5247 DD->getParent()->getNumVBases() == 0)
5252 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5253 false, llvm::AttributeList(),
5256 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5260 if (IsForDefinition)
5268 llvm::GlobalValue *F =
5271 return llvm::NoCFIValue::get(F);
5280 for (
const auto *Result : DC->
lookup(&CII))
5281 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5284 if (!
C.getLangOpts().CPlusPlus)
5289 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5290 ?
C.Idents.get(
"terminate")
5291 :
C.Idents.get(Name);
5293 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5295 for (
const auto *Result : DC->
lookup(&NS)) {
5297 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(Result))
5298 for (
const auto *Result : LSD->lookup(&NS))
5299 if ((ND = dyn_cast<NamespaceDecl>(Result)))
5303 for (
const auto *Result : ND->
lookup(&CXXII))
5304 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5313 llvm::Function *F, StringRef Name) {
5319 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5322 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5323 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5324 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5331 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5332 if (AssumeConvergent) {
5334 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5337 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5342 llvm::Constant *
C = GetOrCreateLLVMFunction(
5344 false,
false, ExtraAttrs);
5346 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5362 llvm::AttributeList ExtraAttrs,
bool Local,
5363 bool AssumeConvergent) {
5364 if (AssumeConvergent) {
5366 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5370 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5374 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5383 markRegisterParameterAttributes(F);
5409 if (WeakRefReferences.erase(Entry)) {
5410 if (D && !D->
hasAttr<WeakAttr>())
5411 Entry->setLinkage(llvm::Function::ExternalLinkage);
5415 if (D && shouldDropDLLAttribute(D, Entry))
5416 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5418 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5421 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5426 if (IsForDefinition && !Entry->isDeclaration()) {
5434 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5436 DiagnosedConflictingDefinitions.insert(D).second) {
5440 diag::note_previous_definition);
5445 if (Entry->getType()->getAddressSpace() != TargetAS)
5446 return llvm::ConstantExpr::getAddrSpaceCast(
5447 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5451 if (!IsForDefinition)
5457 auto *GV =
new llvm::GlobalVariable(
5458 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5459 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5460 getContext().getTargetAddressSpace(DAddrSpace));
5465 GV->takeName(Entry);
5467 if (!Entry->use_empty()) {
5468 Entry->replaceAllUsesWith(GV);
5471 Entry->eraseFromParent();
5477 auto DDI = DeferredDecls.find(MangledName);
5478 if (DDI != DeferredDecls.end()) {
5481 addDeferredDeclToEmit(DDI->second);
5482 DeferredDecls.erase(DDI);
5487 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5494 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
5500 CXXThreadLocals.push_back(D);
5508 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
5509 EmitGlobalVarDefinition(D);
5514 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
5515 GV->setSection(SA->getName());
5519 if (
getTriple().getArch() == llvm::Triple::xcore &&
5523 GV->setSection(
".cp.rodata");
5526 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
5527 GV->setCodeModel(CMA->getModel());
5532 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5536 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
5537 bool HasMutableFields =
Record &&
Record->hasMutableFields();
5538 if (!HasMutableFields) {
5545 auto *InitType =
Init->getType();
5546 if (GV->getValueType() != InitType) {
5551 GV->setName(StringRef());
5556 ->stripPointerCasts());
5559 GV->eraseFromParent();
5562 GV->setInitializer(
Init);
5563 GV->setConstant(
true);
5564 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5584 SanitizerMD->reportGlobal(GV, *D);
5589 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5590 if (DAddrSpace != ExpectedAS) {
5592 *
this, GV, DAddrSpace,
5605 false, IsForDefinition);
5626 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5627 llvm::Align Alignment) {
5628 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5629 llvm::GlobalVariable *OldGV =
nullptr;
5633 if (GV->getValueType() == Ty)
5638 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
5643 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
5648 GV->takeName(OldGV);
5650 if (!OldGV->use_empty()) {
5651 OldGV->replaceAllUsesWith(GV);
5654 OldGV->eraseFromParent();
5658 !GV->hasAvailableExternallyLinkage())
5659 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
5661 GV->setAlignment(Alignment);
5698 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
5706 if (GV && !GV->isDeclaration())
5711 if (!MustBeEmitted(D) && !GV) {
5712 DeferredDecls[MangledName] = D;
5717 EmitGlobalVarDefinition(D);
5722 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
5724 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
5739 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5742 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
5744 if (!Fn->getSubprogram())
5750 return Context.toCharUnitsFromBits(
5755 if (LangOpts.OpenCL) {
5766 if (LangOpts.SYCLIsDevice &&
5770 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
5772 if (D->
hasAttr<CUDAConstantAttr>())
5774 if (D->
hasAttr<CUDASharedAttr>())
5776 if (D->
hasAttr<CUDADeviceAttr>())
5784 if (LangOpts.OpenMP) {
5786 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
5794 if (LangOpts.OpenCL)
5796 if (LangOpts.SYCLIsDevice)
5798 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
5806 if (
auto AS =
getTarget().getConstantAddressSpace())
5819static llvm::Constant *
5821 llvm::GlobalVariable *GV) {
5822 llvm::Constant *Cast = GV;
5828 llvm::PointerType::get(
5835template<
typename SomeDecl>
5837 llvm::GlobalValue *GV) {
5852 const SomeDecl *
First = D->getFirstDecl();
5853 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
5859 std::pair<StaticExternCMap::iterator, bool> R =
5860 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
5865 R.first->second =
nullptr;
5872 if (D.
hasAttr<SelectAnyAttr>())
5876 if (
auto *VD = dyn_cast<VarDecl>(&D))
5890 llvm_unreachable(
"No such linkage");
5898 llvm::GlobalObject &GO) {
5901 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
5909void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
5924 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
5925 OpenMPRuntime->emitTargetGlobalVariable(D))
5928 llvm::TrackingVH<llvm::Constant>
Init;
5929 bool NeedsGlobalCtor =
false;
5933 bool IsDefinitionAvailableExternally =
5935 bool NeedsGlobalDtor =
5936 !IsDefinitionAvailableExternally &&
5943 if (IsDefinitionAvailableExternally &&
5954 std::optional<ConstantEmitter> emitter;
5959 bool IsCUDASharedVar =
5964 bool IsCUDAShadowVar =
5966 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
5967 D->
hasAttr<CUDASharedAttr>());
5968 bool IsCUDADeviceShadowVar =
5973 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
5974 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5978 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
5980 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
5981 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5982 }
else if (!InitExpr) {
5995 initializedGlobalDecl = GlobalDecl(D);
5996 emitter.emplace(*
this);
5997 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6005 if (!IsDefinitionAvailableExternally)
6006 NeedsGlobalCtor =
true;
6010 NeedsGlobalCtor =
false;
6022 DelayedCXXInitPosition.erase(D);
6029 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6034 llvm::Type* InitType =
Init->getType();
6035 llvm::Constant *Entry =
6039 Entry = Entry->stripPointerCasts();
6042 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6053 if (!GV || GV->getValueType() != InitType ||
6054 GV->getType()->getAddressSpace() !=
6058 Entry->setName(StringRef());
6063 ->stripPointerCasts());
6066 llvm::Constant *NewPtrForOldDecl =
6067 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6069 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6077 if (D->
hasAttr<AnnotateAttr>())
6090 if (LangOpts.CUDA) {
6091 if (LangOpts.CUDAIsDevice) {
6092 if (
Linkage != llvm::GlobalValue::InternalLinkage &&
6093 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6096 GV->setExternallyInitialized(
true);
6106 GV->setExternallyInitialized(
true);
6108 GV->setInitializer(
Init);
6115 emitter->finalize(GV);
6118 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6119 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6123 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6124 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6126 GV->setConstant(
true);
6131 if (std::optional<CharUnits> AlignValFromAllocate =
6133 AlignVal = *AlignValFromAllocate;
6151 Linkage == llvm::GlobalValue::ExternalLinkage &&
6152 Context.getTargetInfo().getTriple().isOSDarwin() &&
6154 Linkage = llvm::GlobalValue::InternalLinkage;
6160 Linkage = llvm::GlobalValue::ExternalLinkage;
6163 if (D->
hasAttr<DLLImportAttr>())
6164 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6165 else if (D->
hasAttr<DLLExportAttr>())
6166 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6168 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6170 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6172 GV->setConstant(
false);
6177 if (!GV->getInitializer()->isNullValue())
6178 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6181 setNonAliasAttributes(D, GV);
6183 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6185 CXXThreadLocals.push_back(D);
6192 if (NeedsGlobalCtor || NeedsGlobalDtor)
6193 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6195 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6200 DI->EmitGlobalVariable(GV, D);
6208 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6219 if (D->
hasAttr<SectionAttr>())
6225 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6226 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6227 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6228 D->
hasAttr<PragmaClangRodataSectionAttr>())
6236 if (D->
hasAttr<WeakImportAttr>())
6245 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6246 if (D->
hasAttr<AlignedAttr>())
6249 if (Context.isAlignmentRequired(VarType))
6253 for (
const FieldDecl *FD : RD->fields()) {
6254 if (FD->isBitField())
6256 if (FD->
hasAttr<AlignedAttr>())
6258 if (Context.isAlignmentRequired(FD->
getType()))
6270 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6271 Context.getTypeAlignIfKnown(D->
getType()) >
6278llvm::GlobalValue::LinkageTypes
6282 return llvm::Function::InternalLinkage;
6285 return llvm::GlobalVariable::WeakAnyLinkage;
6289 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6294 return llvm::GlobalValue::AvailableExternallyLinkage;
6308 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6309 : llvm::Function::InternalLinkage;
6323 return llvm::Function::ExternalLinkage;
6326 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6327 : llvm::Function::InternalLinkage;
6328 return llvm::Function::WeakODRLinkage;
6335 CodeGenOpts.NoCommon))
6336 return llvm::GlobalVariable::CommonLinkage;
6342 if (D->
hasAttr<SelectAnyAttr>())
6343 return llvm::GlobalVariable::WeakODRLinkage;
6347 return llvm::GlobalVariable::ExternalLinkage;
6350llvm::GlobalValue::LinkageTypes
6359 llvm::Function *newFn) {
6361 if (old->use_empty())
6364 llvm::Type *newRetTy = newFn->getReturnType();
6369 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6371 llvm::User *user = ui->getUser();
6375 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6376 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6382 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6385 if (!callSite->isCallee(&*ui))
6390 if (callSite->getType() != newRetTy && !callSite->use_empty())
6395 llvm::AttributeList oldAttrs = callSite->getAttributes();
6398 unsigned newNumArgs = newFn->arg_size();
6399 if (callSite->arg_size() < newNumArgs)
6405 bool dontTransform =
false;
6406 for (llvm::Argument &A : newFn->args()) {
6407 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6408 dontTransform =
true;
6413 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6421 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6425 callSite->getOperandBundlesAsDefs(newBundles);
6427 llvm::CallBase *newCall;
6429 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6430 callSite->getIterator());
6433 newCall = llvm::InvokeInst::Create(
6434 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6435 newArgs, newBundles,
"", callSite->getIterator());
6439 if (!newCall->getType()->isVoidTy())
6440 newCall->takeName(callSite);
6441 newCall->setAttributes(
6442 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6443 oldAttrs.getRetAttrs(), newArgAttrs));
6444 newCall->setCallingConv(callSite->getCallingConv());
6447 if (!callSite->use_empty())
6448 callSite->replaceAllUsesWith(newCall);
6451 if (callSite->getDebugLoc())
6452 newCall->setDebugLoc(callSite->getDebugLoc());
6454 callSitesToBeRemovedFromParent.push_back(callSite);
6457 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6458 callSite->eraseFromParent();
6472 llvm::Function *NewFn) {
6482 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6494void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6495 llvm::GlobalValue *GV) {
6503 if (!GV || (GV->getValueType() != Ty))
6509 if (!GV->isDeclaration())
6528 setNonAliasAttributes(GD, Fn);
6530 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
6531 (CodeGenOpts.OptimizationLevel == 0) &&
6534 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
6536 !D->
hasAttr<NoInlineAttr>() &&
6537 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
6538 !D->
hasAttr<OptimizeNoneAttr>() &&
6539 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
6540 !ShouldAddOptNone) {
6541 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
6547 auto GetPriority = [
this](
const auto *
Attr) ->
int {
6552 return Attr->DefaultPriority;
6555 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
6557 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
6563void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
6565 const AliasAttr *AA = D->
getAttr<AliasAttr>();
6566 assert(AA &&
"Not an alias?");
6570 if (AA->getAliasee() == MangledName) {
6571 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6578 if (Entry && !Entry->isDeclaration())
6581 Aliases.push_back(GD);
6587 llvm::Constant *Aliasee;
6588 llvm::GlobalValue::LinkageTypes
LT;
6590 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6596 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6603 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6605 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
6608 if (GA->getAliasee() == Entry) {
6609 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6613 assert(Entry->isDeclaration());
6622 GA->takeName(Entry);
6624 Entry->replaceAllUsesWith(GA);
6625 Entry->eraseFromParent();
6627 GA->setName(MangledName);
6635 GA->setLinkage(llvm::Function::WeakAnyLinkage);
6638 if (
const auto *VD = dyn_cast<VarDecl>(D))
6639 if (VD->getTLSKind())
6650void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
6652 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
6653 assert(IFA &&
"Not an ifunc?");
6657 if (IFA->getResolver() == MangledName) {
6658 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6664 if (Entry && !Entry->isDeclaration()) {
6667 DiagnosedConflictingDefinitions.insert(GD).second) {
6668 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
6671 diag::note_previous_definition);
6676 Aliases.push_back(GD);
6682 llvm::Constant *Resolver =
6683 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
6687 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
6688 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
6690 if (GIF->getResolver() == Entry) {
6691 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6694 assert(Entry->isDeclaration());
6703 GIF->takeName(Entry);
6705 Entry->replaceAllUsesWith(GIF);
6706 Entry->eraseFromParent();
6708 GIF->setName(MangledName);
6714 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
6715 (llvm::Intrinsic::ID)IID, Tys);
6718static llvm::StringMapEntry<llvm::GlobalVariable *> &
6721 bool &IsUTF16,
unsigned &StringLength) {
6722 StringRef String = Literal->getString();
6723 unsigned NumBytes = String.size();
6726 if (!Literal->containsNonAsciiOrNull()) {
6727 StringLength = NumBytes;
6728 return *Map.insert(std::make_pair(String,
nullptr)).first;
6735 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
6736 llvm::UTF16 *ToPtr = &ToBuf[0];
6738 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
6739 ToPtr + NumBytes, llvm::strictConversion);
6742 StringLength = ToPtr - &ToBuf[0];
6746 return *Map.insert(std::make_pair(
6747 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
6748 (StringLength + 1) * 2),
6754 unsigned StringLength = 0;
6755 bool isUTF16 =
false;
6756 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
6761 if (
auto *
C = Entry.second)
6766 const llvm::Triple &Triple =
getTriple();
6769 const bool IsSwiftABI =
6770 static_cast<unsigned>(CFRuntime) >=
6775 if (!CFConstantStringClassRef) {
6776 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
6778 Ty = llvm::ArrayType::get(Ty, 0);
6780 switch (CFRuntime) {
6784 CFConstantStringClassName =
6785 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
6786 :
"$s10Foundation19_NSCFConstantStringCN";
6790 CFConstantStringClassName =
6791 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
6792 :
"$S10Foundation19_NSCFConstantStringCN";
6796 CFConstantStringClassName =
6797 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
6798 :
"__T010Foundation19_NSCFConstantStringCN";
6805 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
6806 llvm::GlobalValue *GV =
nullptr;
6808 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
6815 if ((VD = dyn_cast<VarDecl>(
Result)))
6818 if (Triple.isOSBinFormatELF()) {
6820 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6822 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6823 if (!VD || !VD->
hasAttr<DLLExportAttr>())
6824 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6826 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6834 CFConstantStringClassRef =
6835 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
6838 QualType CFTy = Context.getCFConstantStringType();
6843 auto Fields = Builder.beginStruct(STy);
6852 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
6853 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
6855 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
6859 llvm::Constant *
C =
nullptr;
6862 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
6863 Entry.first().size() / 2);
6864 C = llvm::ConstantDataArray::get(VMContext, Arr);
6866 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
6872 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
6873 llvm::GlobalValue::PrivateLinkage,
C,
".str");
6874 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
6877 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
6878 : Context.getTypeAlignInChars(Context.CharTy);
6884 if (Triple.isOSBinFormatMachO())
6885 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
6886 :
"__TEXT,__cstring,cstring_literals");
6889 else if (Triple.isOSBinFormatELF())
6890 GV->setSection(
".rodata");
6896 llvm::IntegerType *LengthTy =
6906 Fields.addInt(LengthTy, StringLength);
6914 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
6916 llvm::GlobalVariable::PrivateLinkage);
6917 GV->addAttribute(
"objc_arc_inert");
6918 switch (Triple.getObjectFormat()) {
6919 case llvm::Triple::UnknownObjectFormat:
6920 llvm_unreachable(
"unknown file format");
6921 case llvm::Triple::DXContainer:
6922 case llvm::Triple::GOFF:
6923 case llvm::Triple::SPIRV:
6924 case llvm::Triple::XCOFF:
6925 llvm_unreachable(
"unimplemented");
6926 case llvm::Triple::COFF:
6927 case llvm::Triple::ELF:
6928 case llvm::Triple::Wasm:
6929 GV->setSection(
"cfstring");
6931 case llvm::Triple::MachO:
6932 GV->setSection(
"__DATA,__cfstring");
6941 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
6945 if (ObjCFastEnumerationStateType.isNull()) {
6946 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
6950 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
6951 Context.getPointerType(Context.UnsignedLongTy),
6952 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
6955 for (
size_t i = 0; i < 4; ++i) {
6960 FieldTypes[i],
nullptr,
6969 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
6972 return ObjCFastEnumerationStateType;
6986 assert(CAT &&
"String literal not of constant array type!");
6988 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
6992 llvm::Type *ElemTy = AType->getElementType();
6993 unsigned NumElements = AType->getNumElements();
6996 if (ElemTy->getPrimitiveSizeInBits() == 16) {
6998 Elements.reserve(NumElements);
7000 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7002 Elements.resize(NumElements);
7003 return llvm::ConstantDataArray::get(VMContext, Elements);
7006 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7008 Elements.reserve(NumElements);
7010 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7012 Elements.resize(NumElements);
7013 return llvm::ConstantDataArray::get(VMContext, Elements);
7016static llvm::GlobalVariable *
7025 auto *GV =
new llvm::GlobalVariable(
7026 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7027 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7029 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7030 if (GV->isWeakForLinker()) {
7031 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7032 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7048 llvm::GlobalVariable **Entry =
nullptr;
7049 if (!LangOpts.WritableStrings) {
7050 Entry = &ConstantStringMap[
C];
7051 if (
auto GV = *Entry) {
7052 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7055 GV->getValueType(), Alignment);
7060 StringRef GlobalVariableName;
7061 llvm::GlobalValue::LinkageTypes LT;
7066 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7067 !LangOpts.WritableStrings) {
7068 llvm::raw_svector_ostream Out(MangledNameBuffer);
7070 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7071 GlobalVariableName = MangledNameBuffer;
7073 LT = llvm::GlobalValue::PrivateLinkage;
7074 GlobalVariableName = Name;
7086 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7089 GV->getValueType(), Alignment);
7106 StringRef GlobalName) {
7107 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7112 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7115 llvm::GlobalVariable **Entry =
nullptr;
7116 if (!LangOpts.WritableStrings) {
7117 Entry = &ConstantStringMap[
C];
7118 if (
auto GV = *Entry) {
7119 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7122 GV->getValueType(), Alignment);
7128 GlobalName, Alignment);
7133 GV->getValueType(), Alignment);
7146 MaterializedType = E->
getType();
7150 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7151 if (!InsertResult.second) {
7154 if (!InsertResult.first->second) {
7159 InsertResult.first->second =
new llvm::GlobalVariable(
7160 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7164 llvm::cast<llvm::GlobalVariable>(
7165 InsertResult.first->second->stripPointerCasts())
7174 llvm::raw_svector_ostream Out(Name);
7196 std::optional<ConstantEmitter> emitter;
7197 llvm::Constant *InitialValue =
nullptr;
7198 bool Constant =
false;
7202 emitter.emplace(*
this);
7203 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7208 Type = InitialValue->getType();
7217 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7219 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7223 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7227 Linkage = llvm::GlobalVariable::InternalLinkage;
7231 auto *GV =
new llvm::GlobalVariable(
7233 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7234 if (emitter) emitter->finalize(GV);
7236 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7238 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7240 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7244 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7245 if (VD->getTLSKind())
7247 llvm::Constant *CV = GV;
7250 *
this, GV, AddrSpace,
7251 llvm::PointerType::get(
7257 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7259 Entry->replaceAllUsesWith(CV);
7260 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7269void CodeGenModule::EmitObjCPropertyImplementations(
const
7282 if (!Getter || Getter->isSynthesizedAccessorStub())
7285 auto *Setter = PID->getSetterMethodDecl();
7286 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7297 if (ivar->getType().isDestructedType())
7318void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7331 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7346 getContext().getObjCIdType(),
nullptr, D,
true,
7352 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7357void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7364 EmitDeclContext(LSD);
7367void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7369 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7372 std::unique_ptr<CodeGenFunction> &CurCGF =
7373 GlobalTopLevelStmtBlockInFlight.first;
7377 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7385 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7386 FunctionArgList Args;
7388 const CGFunctionInfo &FnInfo =
7391 llvm::Function *
Fn = llvm::Function::Create(
7392 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7394 CurCGF.reset(
new CodeGenFunction(*
this));
7395 GlobalTopLevelStmtBlockInFlight.second = D;
7396 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7398 CXXGlobalInits.push_back(Fn);
7401 CurCGF->EmitStmt(D->
getStmt());
7404void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7405 for (
auto *I : DC->
decls()) {
7411 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7412 for (
auto *M : OID->methods())
7431 case Decl::CXXConversion:
7432 case Decl::CXXMethod:
7433 case Decl::Function:
7440 case Decl::CXXDeductionGuide:
7445 case Decl::Decomposition:
7446 case Decl::VarTemplateSpecialization:
7448 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
7449 for (
auto *B : DD->flat_bindings())
7450 if (
auto *HD = B->getHoldingVar())
7457 case Decl::IndirectField:
7461 case Decl::Namespace:
7464 case Decl::ClassTemplateSpecialization: {
7467 if (Spec->getSpecializationKind() ==
7469 Spec->hasDefinition())
7470 DI->completeTemplateDefinition(*Spec);
7472 case Decl::CXXRecord: {
7476 DI->EmitAndRetainType(
7480 DI->completeUnusedClass(*CRD);
7483 for (
auto *I : CRD->
decls())
7489 case Decl::UsingShadow:
7490 case Decl::ClassTemplate:
7491 case Decl::VarTemplate:
7493 case Decl::VarTemplatePartialSpecialization:
7494 case Decl::FunctionTemplate:
7495 case Decl::TypeAliasTemplate:
7504 case Decl::UsingEnum:
7508 case Decl::NamespaceAlias:
7512 case Decl::UsingDirective:
7516 case Decl::CXXConstructor:
7519 case Decl::CXXDestructor:
7523 case Decl::StaticAssert:
7530 case Decl::ObjCInterface:
7531 case Decl::ObjCCategory:
7534 case Decl::ObjCProtocol: {
7536 if (Proto->isThisDeclarationADefinition())
7537 ObjCRuntime->GenerateProtocol(Proto);
7541 case Decl::ObjCCategoryImpl:
7547 case Decl::ObjCImplementation: {
7549 EmitObjCPropertyImplementations(OMD);
7550 EmitObjCIvarInitializations(OMD);
7551 ObjCRuntime->GenerateClass(OMD);
7555 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7556 OMD->getClassInterface()), OMD->getLocation());
7559 case Decl::ObjCMethod: {
7566 case Decl::ObjCCompatibleAlias:
7570 case Decl::PragmaComment: {
7572 switch (PCD->getCommentKind()) {
7574 llvm_unreachable(
"unexpected pragma comment kind");
7589 case Decl::PragmaDetectMismatch: {
7595 case Decl::LinkageSpec:
7599 case Decl::FileScopeAsm: {
7601 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7604 if (LangOpts.OpenMPIsTargetDevice)
7607 if (LangOpts.SYCLIsDevice)
7610 getModule().appendModuleInlineAsm(AD->getAsmString());
7614 case Decl::TopLevelStmt:
7618 case Decl::Import: {
7622 if (!ImportedModules.insert(Import->getImportedModule()))
7626 if (!Import->getImportedOwningModule()) {
7628 DI->EmitImportDecl(*Import);
7634 if (CXX20ModuleInits && Import->getImportedModule() &&
7635 Import->getImportedModule()->isNamedModule())
7644 Visited.insert(Import->getImportedModule());
7645 Stack.push_back(Import->getImportedModule());
7647 while (!Stack.empty()) {
7649 if (!EmittedModuleInitializers.insert(Mod).second)
7652 for (
auto *D : Context.getModuleInitializers(Mod))
7659 if (Submodule->IsExplicit)
7662 if (Visited.insert(Submodule).second)
7663 Stack.push_back(Submodule);
7673 case Decl::OMPThreadPrivate:
7677 case Decl::OMPAllocate:
7681 case Decl::OMPDeclareReduction:
7685 case Decl::OMPDeclareMapper:
7689 case Decl::OMPRequires:
7694 case Decl::TypeAlias:
7696 DI->EmitAndRetainType(
getContext().getTypedefType(
7704 DI->EmitAndRetainType(
7711 DI->EmitAndRetainType(
7715 case Decl::HLSLRootSignature:
7718 case Decl::HLSLBuffer:
7722 case Decl::OpenACCDeclare:
7725 case Decl::OpenACCRoutine:
7740 if (!CodeGenOpts.CoverageMapping)
7743 case Decl::CXXConversion:
7744 case Decl::CXXMethod:
7745 case Decl::Function:
7746 case Decl::ObjCMethod:
7747 case Decl::CXXConstructor:
7748 case Decl::CXXDestructor: {
7757 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
7767 if (!CodeGenOpts.CoverageMapping)
7769 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
7770 if (Fn->isTemplateInstantiation())
7773 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
7781 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
7784 const Decl *D = Entry.first;
7786 case Decl::CXXConversion:
7787 case Decl::CXXMethod:
7788 case Decl::Function:
7789 case Decl::ObjCMethod: {
7796 case Decl::CXXConstructor: {
7803 case Decl::CXXDestructor: {
7820 if (llvm::Function *F =
getModule().getFunction(
"main")) {
7821 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
7822 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
7823 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
7824 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
7833 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
7834 return llvm::ConstantInt::get(i64, PtrInt);
7838 llvm::NamedMDNode *&GlobalMetadata,
7840 llvm::GlobalValue *
Addr) {
7841 if (!GlobalMetadata)
7843 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
7846 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
7849 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
7852bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
7853 llvm::GlobalValue *CppFunc) {
7855 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
7858 llvm::SmallVector<llvm::ConstantExpr *> CEs;
7861 if (Elem == CppFunc)
7867 for (llvm::User *User : Elem->users()) {
7871 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
7872 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
7875 for (llvm::User *CEUser : ConstExpr->users()) {
7876 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
7877 IFuncs.push_back(IFunc);
7882 CEs.push_back(ConstExpr);
7883 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
7884 IFuncs.push_back(IFunc);
7896 for (llvm::GlobalIFunc *IFunc : IFuncs)
7897 IFunc->setResolver(
nullptr);
7898 for (llvm::ConstantExpr *ConstExpr : CEs)
7899 ConstExpr->destroyConstant();
7903 Elem->eraseFromParent();
7905 for (llvm::GlobalIFunc *IFunc : IFuncs) {
7910 llvm::FunctionType::get(IFunc->getType(),
false);
7911 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
7912 CppFunc->getName(), ResolverTy, {},
false);
7913 IFunc->setResolver(Resolver);
7923void CodeGenModule::EmitStaticExternCAliases() {
7926 for (
auto &I : StaticExternCValues) {
7927 const IdentifierInfo *Name = I.first;
7928 llvm::GlobalValue *Val = I.second;
7936 llvm::GlobalValue *ExistingElem =
7941 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
7948 auto Res = Manglings.find(MangledName);
7949 if (Res == Manglings.end())
7951 Result = Res->getValue();
7962void CodeGenModule::EmitDeclMetadata() {
7963 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7965 for (
auto &I : MangledDeclNames) {
7966 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
7976void CodeGenFunction::EmitDeclMetadata() {
7977 if (LocalDeclMap.empty())
return;
7982 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
7984 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7986 for (
auto &I : LocalDeclMap) {
7987 const Decl *D = I.first;
7988 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
7989 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
7991 Alloca->setMetadata(
7992 DeclPtrKind, llvm::MDNode::get(
7993 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
7994 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8001void CodeGenModule::EmitVersionIdentMetadata() {
8002 llvm::NamedMDNode *IdentMetadata =
8003 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8005 llvm::LLVMContext &Ctx = TheModule.getContext();
8007 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8008 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8011void CodeGenModule::EmitCommandLineMetadata() {
8012 llvm::NamedMDNode *CommandLineMetadata =
8013 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8015 llvm::LLVMContext &Ctx = TheModule.getContext();
8017 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8018 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8021void CodeGenModule::EmitCoverageFile() {
8022 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8026 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8027 llvm::LLVMContext &Ctx = TheModule.getContext();
8028 auto *CoverageDataFile =
8030 auto *CoverageNotesFile =
8032 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8033 llvm::MDNode *CU = CUNode->getOperand(i);
8034 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8035 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8048 LangOpts.ObjCRuntime.isGNUFamily())
8049 return ObjCRuntime->GetEHType(Ty);
8056 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8058 for (
auto RefExpr : D->
varlist()) {
8061 VD->getAnyInitializer() &&
8062 !VD->getAnyInitializer()->isConstantInitializer(
getContext(),
8069 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8070 CXXGlobalInits.push_back(InitFunction);
8075CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
8079 FnType->getReturnType(), FnType->getParamTypes(),
8080 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8082 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
8087 std::string OutName;
8088 llvm::raw_string_ostream Out(OutName);
8093 Out <<
".normalized";
8116 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
8121 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
8125 return CreateMetadataIdentifierImpl(
T, GeneralizedMetadataIdMap,
8133 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8134 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8135 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8136 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8137 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8138 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8139 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8140 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8148 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8150 if (CodeGenOpts.SanitizeCfiCrossDso)
8152 VTable->addTypeMetadata(Offset.getQuantity(),
8153 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8156 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8157 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8163 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8173 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8188 bool forPointeeType) {
8199 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8206 bool AlignForArray =
T->isArrayType();
8212 if (
T->isIncompleteType()) {
8229 if (
T.getQualifiers().hasUnaligned()) {
8231 }
else if (forPointeeType && !AlignForArray &&
8232 (RD =
T->getAsCXXRecordDecl())) {
8243 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8256 if (NumAutoVarInit >= StopAfter) {
8259 if (!NumAutoVarInit) {
8262 "-ftrivial-auto-var-init-stop-after=%0 has been enabled to limit the "
8263 "number of times ftrivial-auto-var-init=%1 gets applied.");
8277 const Decl *D)
const {
8281 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8283 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8289 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8293 llvm::MD5::MD5Result
Result;
8294 for (
const auto &Arg : PreprocessorOpts.Macros)
8295 Hash.update(Arg.first);
8299 llvm::sys::fs::UniqueID ID;
8303 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8307 SM.getDiagnostics().Report(diag::err_cannot_open_file)
8308 << PLoc.
getFilename() << Status.getError().message();
8310 ID = Status->getUniqueID();
8312 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8313 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8320 assert(DeferredDeclsToEmit.empty() &&
8321 "Should have emitted all decls deferred to emit.");
8322 assert(NewBuilder->DeferredDecls.empty() &&
8323 "Newly created module should not have deferred decls");
8324 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8325 assert(EmittedDeferredDecls.empty() &&
8326 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8328 assert(NewBuilder->DeferredVTables.empty() &&
8329 "Newly created module should not have deferred vtables");
8330 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8332 assert(NewBuilder->MangledDeclNames.empty() &&
8333 "Newly created module should not have mangled decl names");
8334 assert(NewBuilder->Manglings.empty() &&
8335 "Newly created module should not have manglings");
8336 NewBuilder->Manglings = std::move(Manglings);
8338 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8340 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
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 std::string getMangledNameImpl(CIRGenModule &cgm, GlobalDecl gd, const NamedDecl *nd)
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 bool hasImplicitAttr(const ValueDecl *D)
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 void setWindowsItaniumDLLImport(CodeGenModule &CGM, bool Local, llvm::Function *F, 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 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 bool hasUnwindExceptions(const LangOptions &LangOpts)
Determines whether the language options require us to model unwind exceptions.
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.
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
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
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
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()
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)
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.
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.
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.
Address performAddrSpaceCast(CodeGen::CodeGenFunction &CGF, Address Addr, LangAS SrcAddr, llvm::Type *DestTy, bool IsNonNull=false) const
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.
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.
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.
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
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.
ParsedAttr - Represents a syntactic attribute.
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,...
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
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.
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.
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,...
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.
const FunctionProtoType * T
StringRef languageToString(Language L)
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object 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::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
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.
Contains information gathered from parsing the contents of TargetAttr.
PointerAuthSchema InitFiniPointers
The ABI for function addresses in .init_array and .fini_array.
Describes how types, statements, expressions, and declarations should be printed.