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/Hash.h"
70#include "llvm/Support/TimeProfiler.h"
71#include "llvm/TargetParser/AArch64TargetParser.h"
72#include "llvm/TargetParser/RISCVISAInfo.h"
73#include "llvm/TargetParser/Triple.h"
74#include "llvm/TargetParser/X86TargetParser.h"
75#include "llvm/Transforms/Instrumentation/KCFI.h"
76#include "llvm/Transforms/Utils/BuildLibCalls.h"
84 "limited-coverage-experimental", llvm::cl::Hidden,
85 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
92 case TargetCXXABI::AppleARM64:
93 case TargetCXXABI::Fuchsia:
94 case TargetCXXABI::GenericAArch64:
95 case TargetCXXABI::GenericARM:
96 case TargetCXXABI::iOS:
97 case TargetCXXABI::WatchOS:
98 case TargetCXXABI::GenericMIPS:
99 case TargetCXXABI::GenericItanium:
100 case TargetCXXABI::WebAssembly:
101 case TargetCXXABI::XL:
103 case TargetCXXABI::Microsoft:
107 llvm_unreachable(
"invalid C++ ABI kind");
110static std::unique_ptr<TargetCodeGenInfo>
113 const llvm::Triple &Triple =
Target.getTriple();
116 switch (Triple.getArch()) {
120 case llvm::Triple::m68k:
122 case llvm::Triple::mips:
123 case llvm::Triple::mipsel:
124 if (Triple.getOS() == llvm::Triple::Win32)
128 case llvm::Triple::mips64:
129 case llvm::Triple::mips64el:
132 case llvm::Triple::avr: {
136 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
137 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
141 case llvm::Triple::aarch64:
142 case llvm::Triple::aarch64_32:
143 case llvm::Triple::aarch64_be: {
145 if (
Target.getABI() ==
"darwinpcs")
146 Kind = AArch64ABIKind::DarwinPCS;
147 else if (Triple.isOSWindows())
149 else if (
Target.getABI() ==
"aapcs-soft")
150 Kind = AArch64ABIKind::AAPCSSoft;
155 case llvm::Triple::wasm32:
156 case llvm::Triple::wasm64: {
158 if (
Target.getABI() ==
"experimental-mv")
159 Kind = WebAssemblyABIKind::ExperimentalMV;
163 case llvm::Triple::arm:
164 case llvm::Triple::armeb:
165 case llvm::Triple::thumb:
166 case llvm::Triple::thumbeb: {
167 if (Triple.getOS() == llvm::Triple::Win32)
171 StringRef ABIStr =
Target.getABI();
172 if (ABIStr ==
"apcs-gnu")
173 Kind = ARMABIKind::APCS;
174 else if (ABIStr ==
"aapcs16")
175 Kind = ARMABIKind::AAPCS16_VFP;
176 else if (CodeGenOpts.
FloatABI ==
"hard" ||
177 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
178 Kind = ARMABIKind::AAPCS_VFP;
183 case llvm::Triple::ppc: {
184 if (Triple.isOSAIX())
191 case llvm::Triple::ppcle: {
196 case llvm::Triple::ppc64:
197 if (Triple.isOSAIX())
200 if (Triple.isOSBinFormatELF()) {
202 if (
Target.getABI() ==
"elfv2")
203 Kind = PPC64_SVR4_ABIKind::ELFv2;
204 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
209 case llvm::Triple::ppc64le: {
210 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
212 if (
Target.getABI() ==
"elfv1")
213 Kind = PPC64_SVR4_ABIKind::ELFv1;
214 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
219 case llvm::Triple::nvptx:
220 case llvm::Triple::nvptx64:
223 case llvm::Triple::msp430:
226 case llvm::Triple::riscv32:
227 case llvm::Triple::riscv64: {
228 StringRef ABIStr =
Target.getABI();
230 unsigned ABIFLen = 0;
231 if (ABIStr.ends_with(
"f"))
233 else if (ABIStr.ends_with(
"d"))
235 bool EABI = ABIStr.ends_with(
"e");
239 case llvm::Triple::systemz: {
240 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
241 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
245 case llvm::Triple::tce:
246 case llvm::Triple::tcele:
249 case llvm::Triple::x86: {
250 bool IsDarwinVectorABI = Triple.isOSDarwin();
251 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
253 if (Triple.getOS() == llvm::Triple::Win32) {
255 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
256 CodeGenOpts.NumRegisterParameters);
259 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
260 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
263 case llvm::Triple::x86_64: {
264 StringRef ABI =
Target.getABI();
265 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
266 : ABI ==
"avx" ? X86AVXABILevel::AVX
267 : X86AVXABILevel::None);
269 switch (Triple.getOS()) {
270 case llvm::Triple::UEFI:
271 case llvm::Triple::Win32:
277 case llvm::Triple::hexagon:
279 case llvm::Triple::lanai:
281 case llvm::Triple::r600:
283 case llvm::Triple::amdgcn:
285 case llvm::Triple::sparc:
287 case llvm::Triple::sparcv9:
289 case llvm::Triple::xcore:
291 case llvm::Triple::arc:
293 case llvm::Triple::spir:
294 case llvm::Triple::spir64:
296 case llvm::Triple::spirv32:
297 case llvm::Triple::spirv64:
298 case llvm::Triple::spirv:
300 case llvm::Triple::dxil:
302 case llvm::Triple::ve:
304 case llvm::Triple::csky: {
305 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
307 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
312 case llvm::Triple::bpfeb:
313 case llvm::Triple::bpfel:
315 case llvm::Triple::loongarch32:
316 case llvm::Triple::loongarch64: {
317 StringRef ABIStr =
Target.getABI();
318 unsigned ABIFRLen = 0;
319 if (ABIStr.ends_with(
"f"))
321 else if (ABIStr.ends_with(
"d"))
330 if (!TheTargetCodeGenInfo)
332 return *TheTargetCodeGenInfo;
336 llvm::LLVMContext &Context,
340 if (Opts.AlignDouble || Opts.OpenCL || Opts.HLSL)
343 llvm::Triple Triple =
Target.getTriple();
344 llvm::DataLayout DL(
Target.getDataLayoutString());
345 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
346 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
347 llvm::Align ClangAlign(Alignment / 8);
348 if (DLAlign != ClangAlign) {
349 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
350 <<
" mapping to " << *Ty <<
" has data layout alignment "
351 << DLAlign.value() <<
" while clang specifies "
352 << ClangAlign.value() <<
"\n";
357 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
359 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
361 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
363 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
366 if (Triple.getArch() != llvm::Triple::m68k)
367 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
370 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
371 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
372 Triple.getArch() != llvm::Triple::ve)
373 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
375 if (
Target.hasFloat16Type())
376 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
378 if (
Target.hasBFloat16Type())
379 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
380 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
382 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
385 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
387 if (
Target.hasFloat128Type())
388 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
389 if (
Target.hasIbm128Type())
390 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
392 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
403 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
404 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
406 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
412 llvm::LLVMContext &LLVMContext = M.getContext();
413 VoidTy = llvm::Type::getVoidTy(LLVMContext);
414 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
415 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
416 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
417 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
418 HalfTy = llvm::Type::getHalfTy(LLVMContext);
419 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
420 FloatTy = llvm::Type::getFloatTy(LLVMContext);
421 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
427 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
429 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
431 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
432 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
433 IntPtrTy = llvm::IntegerType::get(LLVMContext,
434 C.getTargetInfo().getMaxPointerWidth());
435 Int8PtrTy = llvm::PointerType::get(LLVMContext,
437 const llvm::DataLayout &DL = M.getDataLayout();
439 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
441 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
458 createOpenCLRuntime();
460 createOpenMPRuntime();
467 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
468 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
474 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
475 CodeGenOpts.CoverageNotesFile.size() ||
476 CodeGenOpts.CoverageDataFile.size())
484 Block.GlobalUniqueCount = 0;
486 if (
C.getLangOpts().ObjC)
489 if (CodeGenOpts.hasProfileClangUse()) {
490 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
491 CodeGenOpts.ProfileInstrumentUsePath, *FS,
492 CodeGenOpts.ProfileRemappingFile);
493 if (
auto E = ReaderOrErr.takeError()) {
494 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
495 Diags.Report(diag::err_reading_profile)
496 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
500 PGOReader = std::move(ReaderOrErr.get());
505 if (CodeGenOpts.CoverageMapping)
509 if (CodeGenOpts.UniqueInternalLinkageNames &&
510 !
getModule().getSourceFileName().empty()) {
511 std::string Path =
getModule().getSourceFileName();
513 for (
const auto &Entry : LangOpts.MacroPrefixMap)
514 if (Path.rfind(Entry.first, 0) != std::string::npos) {
515 Path = Entry.second + Path.substr(Entry.first.size());
518 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
522 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
523 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
524 CodeGenOpts.NumRegisterParameters);
533 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
534 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
536 this->MSHotPatchFunctions.push_back(std::string{*I});
538 auto &DE = Context.getDiagnostics();
539 DE.Report(diag::err_open_hotpatch_file_failed)
541 << BufOrErr.getError().message();
546 this->MSHotPatchFunctions.push_back(FuncName);
548 llvm::sort(this->MSHotPatchFunctions);
551 if (!Context.getAuxTargetInfo())
557void CodeGenModule::createObjCRuntime() {
574 llvm_unreachable(
"bad runtime kind");
577void CodeGenModule::createOpenCLRuntime() {
581void CodeGenModule::createOpenMPRuntime() {
582 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
583 Diags.Report(diag::err_omp_host_ir_file_not_found)
584 << LangOpts.OMPHostIRFile;
589 case llvm::Triple::nvptx:
590 case llvm::Triple::nvptx64:
591 case llvm::Triple::amdgcn:
592 case llvm::Triple::spirv64:
595 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
596 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
599 if (LangOpts.OpenMPSimd)
600 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
602 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
607void CodeGenModule::createCUDARuntime() {
611void CodeGenModule::createHLSLRuntime() {
612 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
616 Replacements[Name] =
C;
619void CodeGenModule::applyReplacements() {
620 for (
auto &I : Replacements) {
621 StringRef MangledName = I.first;
622 llvm::Constant *Replacement = I.second;
627 auto *NewF = dyn_cast<llvm::Function>(Replacement);
629 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
630 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
633 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
634 CE->getOpcode() == llvm::Instruction::GetElementPtr);
635 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
640 OldF->replaceAllUsesWith(Replacement);
642 NewF->removeFromParent();
643 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
646 OldF->eraseFromParent();
651 GlobalValReplacements.push_back(std::make_pair(GV,
C));
654void CodeGenModule::applyGlobalValReplacements() {
655 for (
auto &I : GlobalValReplacements) {
656 llvm::GlobalValue *GV = I.first;
657 llvm::Constant *
C = I.second;
659 GV->replaceAllUsesWith(
C);
660 GV->eraseFromParent();
667 const llvm::Constant *
C;
668 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
669 C = GA->getAliasee();
670 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
671 C = GI->getResolver();
675 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
679 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
688 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
689 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
693 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
697 if (GV->hasCommonLinkage()) {
698 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
699 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
700 Diags.
Report(Location, diag::err_alias_to_common);
705 if (GV->isDeclaration()) {
706 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
707 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
708 << IsIFunc << IsIFunc;
711 for (
const auto &[
Decl, Name] : MangledDeclNames) {
712 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
714 if (II && II->
getName() == GV->getName()) {
715 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
719 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
729 const auto *F = dyn_cast<llvm::Function>(GV);
731 Diags.
Report(Location, diag::err_alias_to_undefined)
732 << IsIFunc << IsIFunc;
736 llvm::FunctionType *FTy = F->getFunctionType();
737 if (!FTy->getReturnType()->isPointerTy()) {
738 Diags.
Report(Location, diag::err_ifunc_resolver_return);
752 if (GVar->hasAttribute(
"toc-data")) {
753 auto GVId = GVar->getName();
756 Diags.
Report(Location, diag::warn_toc_unsupported_type)
757 << GVId <<
"the variable has an alias";
759 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
760 llvm::AttributeSet NewAttributes =
761 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
762 GVar->setAttributes(NewAttributes);
766void CodeGenModule::checkAliases() {
771 DiagnosticsEngine &Diags =
getDiags();
772 for (
const GlobalDecl &GD : Aliases) {
774 SourceLocation Location;
776 bool IsIFunc = D->hasAttr<IFuncAttr>();
777 if (
const Attr *A = D->getDefiningAttr()) {
778 Location = A->getLocation();
779 Range = A->getRange();
781 llvm_unreachable(
"Not an alias or ifunc?");
785 const llvm::GlobalValue *GV =
nullptr;
787 MangledDeclNames, Range)) {
793 if (
const llvm::GlobalVariable *GVar =
794 dyn_cast<const llvm::GlobalVariable>(GV))
798 llvm::Constant *Aliasee =
802 llvm::GlobalValue *AliaseeGV;
803 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
808 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
809 StringRef AliasSection = SA->getName();
810 if (AliasSection != AliaseeGV->getSection())
811 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
812 << AliasSection << IsIFunc << IsIFunc;
820 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
821 if (GA->isInterposable()) {
822 Diags.Report(Location, diag::warn_alias_to_weak_alias)
823 << GV->getName() << GA->getName() << IsIFunc;
824 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
825 GA->getAliasee(), Alias->getType());
837 llvm::Attribute::DisableSanitizerInstrumentation);
842 for (
const GlobalDecl &GD : Aliases) {
845 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
846 Alias->eraseFromParent();
851 DeferredDeclsToEmit.clear();
852 EmittedDeferredDecls.clear();
853 DeferredAnnotations.clear();
855 OpenMPRuntime->clear();
859 StringRef MainFile) {
862 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
863 if (MainFile.empty())
864 MainFile =
"<stdin>";
865 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
868 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
871 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
875static std::optional<llvm::GlobalValue::VisibilityTypes>
882 return llvm::GlobalValue::DefaultVisibility;
884 return llvm::GlobalValue::HiddenVisibility;
886 return llvm::GlobalValue::ProtectedVisibility;
888 llvm_unreachable(
"unknown option value!");
893 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
902 GV.setDSOLocal(
false);
903 GV.setVisibility(*
V);
908 if (!LO.VisibilityFromDLLStorageClass)
911 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
914 std::optional<llvm::GlobalValue::VisibilityTypes>
915 NoDLLStorageClassVisibility =
918 std::optional<llvm::GlobalValue::VisibilityTypes>
919 ExternDeclDLLImportVisibility =
922 std::optional<llvm::GlobalValue::VisibilityTypes>
923 ExternDeclNoDLLStorageClassVisibility =
926 for (llvm::GlobalValue &GV : M.global_values()) {
927 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
930 if (GV.isDeclarationForLinker())
932 llvm::GlobalValue::DLLImportStorageClass
933 ? ExternDeclDLLImportVisibility
934 : ExternDeclNoDLLStorageClassVisibility);
937 llvm::GlobalValue::DLLExportStorageClass
938 ? DLLExportVisibility
939 : NoDLLStorageClassVisibility);
941 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
946 const llvm::Triple &Triple,
950 return LangOpts.getStackProtector() == Mode;
956 EmitModuleInitializers(Primary);
958 DeferredDecls.insert_range(EmittedDeferredDecls);
959 EmittedDeferredDecls.clear();
960 EmitVTablesOpportunistically();
961 applyGlobalValReplacements();
963 emitMultiVersionFunctions();
965 if (Context.getLangOpts().IncrementalExtensions &&
966 GlobalTopLevelStmtBlockInFlight.first) {
968 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
969 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
975 EmitCXXModuleInitFunc(Primary);
977 EmitCXXGlobalInitFunc();
978 EmitCXXGlobalCleanUpFunc();
979 registerGlobalDtorsWithAtExit();
980 EmitCXXThreadLocalInitFunc();
982 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
984 if (Context.getLangOpts().CUDA && CUDARuntime) {
985 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
989 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
990 OpenMPRuntime->clear();
994 PGOReader->getSummary(
false).getMD(VMContext),
995 llvm::ProfileSummary::PSK_Instr);
996 if (PGOStats.hasDiagnostics())
1002 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1003 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1005 EmitStaticExternCAliases();
1010 if (CoverageMapping)
1011 CoverageMapping->emit();
1012 if (CodeGenOpts.SanitizeCfiCrossDso) {
1016 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1018 emitAtAvailableLinkGuard();
1019 if (Context.getTargetInfo().getTriple().isWasm())
1026 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1027 llvm::CodeObjectVersionKind::COV_None) {
1028 getModule().addModuleFlag(llvm::Module::Error,
1029 "amdhsa_code_object_version",
1030 getTarget().getTargetOpts().CodeObjectVersion);
1035 auto *MDStr = llvm::MDString::get(
1040 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1049 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1051 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1053 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1057 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1061 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1063 auto *GV =
new llvm::GlobalVariable(
1064 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1065 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1071 auto *GV =
new llvm::GlobalVariable(
1073 llvm::Constant::getNullValue(
Int8Ty),
1082 if (CodeGenOpts.Autolink &&
1083 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1084 EmitModuleLinkOptions();
1099 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1100 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1101 for (
auto *MD : ELFDependentLibraries)
1102 NMD->addOperand(MD);
1105 if (CodeGenOpts.DwarfVersion) {
1106 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1107 CodeGenOpts.DwarfVersion);
1110 if (CodeGenOpts.Dwarf64)
1111 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1113 if (Context.getLangOpts().SemanticInterposition)
1115 getModule().setSemanticInterposition(
true);
1117 if (CodeGenOpts.EmitCodeView) {
1119 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1121 if (CodeGenOpts.CodeViewGHash) {
1122 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1124 if (CodeGenOpts.ControlFlowGuard) {
1126 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 2);
1127 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1129 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 1);
1131 if (CodeGenOpts.EHContGuard) {
1133 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1135 if (Context.getLangOpts().Kernel) {
1137 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1139 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1144 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1146 llvm::Metadata *Ops[2] = {
1147 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1148 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1149 llvm::Type::getInt32Ty(VMContext), 1))};
1151 getModule().addModuleFlag(llvm::Module::Require,
1152 "StrictVTablePointersRequirement",
1153 llvm::MDNode::get(VMContext, Ops));
1159 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1160 llvm::DEBUG_METADATA_VERSION);
1165 uint64_t WCharWidth =
1166 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1167 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1170 getModule().addModuleFlag(llvm::Module::Warning,
1171 "zos_product_major_version",
1172 uint32_t(CLANG_VERSION_MAJOR));
1173 getModule().addModuleFlag(llvm::Module::Warning,
1174 "zos_product_minor_version",
1175 uint32_t(CLANG_VERSION_MINOR));
1176 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1177 uint32_t(CLANG_VERSION_PATCHLEVEL));
1179 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1180 llvm::MDString::get(VMContext, ProductId));
1185 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1186 llvm::MDString::get(VMContext, lang_str));
1188 time_t TT = PreprocessorOpts.SourceDateEpoch
1189 ? *PreprocessorOpts.SourceDateEpoch
1190 : std::time(
nullptr);
1191 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1192 static_cast<uint64_t
>(TT));
1195 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1196 llvm::MDString::get(VMContext,
"ascii"));
1199 llvm::Triple
T = Context.getTargetInfo().getTriple();
1200 if (
T.isARM() ||
T.isThumb()) {
1202 uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1203 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1207 StringRef ABIStr = Target.getABI();
1208 llvm::LLVMContext &Ctx = TheModule.getContext();
1209 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1210 llvm::MDString::get(Ctx, ABIStr));
1215 const std::vector<std::string> &Features =
1218 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1219 if (!errorToBool(ParseResult.takeError()))
1221 llvm::Module::AppendUnique,
"riscv-isa",
1223 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1226 if (CodeGenOpts.SanitizeCfiCrossDso) {
1228 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1231 if (CodeGenOpts.WholeProgramVTables) {
1235 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1236 CodeGenOpts.VirtualFunctionElimination);
1239 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1240 getModule().addModuleFlag(llvm::Module::Override,
1241 "CFI Canonical Jump Tables",
1242 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1245 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1246 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1250 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1252 llvm::Module::Append,
"Unique Source File Identifier",
1254 TheModule.getContext(),
1255 llvm::MDString::get(TheModule.getContext(),
1256 CodeGenOpts.UniqueSourceFileIdentifier)));
1259 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1260 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1263 if (CodeGenOpts.PatchableFunctionEntryOffset)
1264 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1265 CodeGenOpts.PatchableFunctionEntryOffset);
1266 if (CodeGenOpts.SanitizeKcfiArity)
1267 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1270 llvm::Module::Override,
"kcfi-hash",
1271 llvm::MDString::get(
1273 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1276 if (CodeGenOpts.CFProtectionReturn &&
1277 Target.checkCFProtectionReturnSupported(
getDiags())) {
1279 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1283 if (CodeGenOpts.CFProtectionBranch &&
1284 Target.checkCFProtectionBranchSupported(
getDiags())) {
1286 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1289 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1290 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1292 Scheme = Target.getDefaultCFBranchLabelScheme();
1294 llvm::Module::Error,
"cf-branch-label-scheme",
1300 if (CodeGenOpts.FunctionReturnThunks)
1301 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1303 if (CodeGenOpts.IndirectBranchCSPrefix)
1304 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1315 if (Context.getTargetInfo().hasFeature(
"ptrauth") &&
1316 LangOpts.getSignReturnAddressScope() !=
1318 getModule().addModuleFlag(llvm::Module::Override,
1319 "sign-return-address-buildattr", 1);
1320 if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
1321 getModule().addModuleFlag(llvm::Module::Override,
1322 "tag-stack-memory-buildattr", 1);
1324 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1332 if (LangOpts.BranchTargetEnforcement)
1333 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1335 if (LangOpts.BranchProtectionPAuthLR)
1336 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1338 if (LangOpts.GuardedControlStack)
1339 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1340 if (LangOpts.hasSignReturnAddress())
1341 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1342 if (LangOpts.isSignReturnAddressScopeAll())
1343 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1345 if (!LangOpts.isSignReturnAddressWithAKey())
1346 getModule().addModuleFlag(llvm::Module::Min,
1347 "sign-return-address-with-bkey", 2);
1349 if (LangOpts.PointerAuthELFGOT)
1350 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-elf-got", 1);
1353 if (LangOpts.PointerAuthCalls)
1354 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-sign-personality",
1357 using namespace llvm::ELF;
1358 uint64_t PAuthABIVersion =
1359 (LangOpts.PointerAuthIntrinsics
1360 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1361 (LangOpts.PointerAuthCalls
1362 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1363 (LangOpts.PointerAuthReturns
1364 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1365 (LangOpts.PointerAuthAuthTraps
1366 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1367 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1368 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1369 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1370 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1371 (LangOpts.PointerAuthInitFini
1372 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1373 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1374 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1375 (LangOpts.PointerAuthELFGOT
1376 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1377 (LangOpts.PointerAuthIndirectGotos
1378 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1379 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1380 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1381 (LangOpts.PointerAuthFunctionTypeDiscrimination
1382 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1383 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1384 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1385 "Update when new enum items are defined");
1386 if (PAuthABIVersion != 0) {
1387 getModule().addModuleFlag(llvm::Module::Error,
1388 "aarch64-elf-pauthabi-platform",
1389 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1390 getModule().addModuleFlag(llvm::Module::Error,
1391 "aarch64-elf-pauthabi-version",
1397 if (CodeGenOpts.StackClashProtector)
1399 llvm::Module::Override,
"probe-stack",
1400 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1402 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1403 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1404 CodeGenOpts.StackProbeSize);
1406 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1407 llvm::LLVMContext &Ctx = TheModule.getContext();
1409 llvm::Module::Error,
"MemProfProfileFilename",
1410 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1413 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1417 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1418 CodeGenOpts.FP32DenormalMode.Output !=
1419 llvm::DenormalMode::IEEE);
1422 if (LangOpts.EHAsynch)
1423 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1426 if (CodeGenOpts.ImportCallOptimization)
1427 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1431 if (CodeGenOpts.getWinX64EHUnwindV2() != llvm::WinX64EHUnwindV2Mode::Disabled)
1433 llvm::Module::Warning,
"winx64-eh-unwindv2",
1434 static_cast<unsigned>(CodeGenOpts.getWinX64EHUnwindV2()));
1438 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1440 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1444 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1445 EmitOpenCLMetadata();
1452 auto Version = LangOpts.getOpenCLCompatibleVersion();
1453 llvm::Metadata *SPIRVerElts[] = {
1454 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1456 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1457 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1458 llvm::NamedMDNode *SPIRVerMD =
1459 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1460 llvm::LLVMContext &Ctx = TheModule.getContext();
1461 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1469 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1470 assert(PLevel < 3 &&
"Invalid PIC Level");
1471 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1472 if (Context.getLangOpts().PIE)
1473 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1477 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1478 .Case(
"tiny", llvm::CodeModel::Tiny)
1479 .Case(
"small", llvm::CodeModel::Small)
1480 .Case(
"kernel", llvm::CodeModel::Kernel)
1481 .Case(
"medium", llvm::CodeModel::Medium)
1482 .Case(
"large", llvm::CodeModel::Large)
1485 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1488 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1489 Context.getTargetInfo().getTriple().getArch() ==
1490 llvm::Triple::x86_64) {
1496 if (CodeGenOpts.NoPLT)
1499 CodeGenOpts.DirectAccessExternalData !=
1500 getModule().getDirectAccessExternalData()) {
1501 getModule().setDirectAccessExternalData(
1502 CodeGenOpts.DirectAccessExternalData);
1504 if (CodeGenOpts.UnwindTables)
1505 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1507 switch (CodeGenOpts.getFramePointer()) {
1512 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1515 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1518 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1521 getModule().setFramePointer(llvm::FramePointerKind::All);
1525 SimplifyPersonality();
1538 EmitVersionIdentMetadata();
1541 EmitCommandLineMetadata();
1549 getModule().setStackProtectorGuardSymbol(
1552 getModule().setStackProtectorGuardOffset(
1557 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1559 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1561 if (
getContext().getTargetInfo().getMaxTLSAlign())
1562 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1563 getContext().getTargetInfo().getMaxTLSAlign());
1581 if (
getTriple().isPPC() && !MustTailCallUndefinedGlobals.empty()) {
1582 for (
auto &I : MustTailCallUndefinedGlobals) {
1583 if (!I.first->isDefined())
1584 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1588 if (!Entry || Entry->isWeakForLinker() ||
1589 Entry->isDeclarationForLinker())
1590 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1601 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
1602 ErrnoTBAAMD->addOperand(IntegerNode);
1607void CodeGenModule::EmitOpenCLMetadata() {
1613 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1614 llvm::Metadata *OCLVerElts[] = {
1615 llvm::ConstantAsMetadata::get(
1616 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1617 llvm::ConstantAsMetadata::get(
1618 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1619 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1620 llvm::LLVMContext &Ctx = TheModule.getContext();
1621 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1624 EmitVersion(
"opencl.ocl.version", CLVersion);
1625 if (LangOpts.OpenCLCPlusPlus) {
1627 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1631void CodeGenModule::EmitBackendOptionsMetadata(
1632 const CodeGenOptions &CodeGenOpts) {
1634 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1635 CodeGenOpts.SmallDataLimit);
1639 if (LangOpts.AllocTokenMode) {
1640 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
1641 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
1642 llvm::MDString::get(VMContext, S));
1644 if (LangOpts.AllocTokenMax)
1646 llvm::Module::Error,
"alloc-token-max",
1647 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1648 *LangOpts.AllocTokenMax));
1649 if (CodeGenOpts.SanitizeAllocTokenFastABI)
1650 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
1651 if (CodeGenOpts.SanitizeAllocTokenExtended)
1652 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
1668 return TBAA->getTypeInfo(QTy);
1687 return TBAA->getAccessInfo(AccessType);
1694 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1700 return TBAA->getTBAAStructInfo(QTy);
1706 return TBAA->getBaseTypeInfo(QTy);
1712 return TBAA->getAccessTagInfo(Info);
1719 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1727 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1735 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1741 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1746 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1758 std::string Msg =
Type;
1760 diag::err_codegen_unsupported)
1767 std::string Msg =
Type;
1769 diag::err_codegen_unsupported)
1774 llvm::function_ref<
void()> Fn) {
1775 StackHandler.runWithSufficientStackSpace(Loc, Fn);
1785 if (GV->hasLocalLinkage()) {
1786 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1799 if (Context.getLangOpts().OpenMP &&
1800 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
1801 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
1802 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
1803 OMPDeclareTargetDeclAttr::DT_NoHost &&
1805 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1810 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
1814 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
1818 if (GV->hasDLLExportStorageClass()) {
1821 diag::err_hidden_visibility_dllexport);
1824 diag::err_non_default_visibility_dllimport);
1830 !GV->isDeclarationForLinker())
1835 llvm::GlobalValue *GV) {
1836 if (GV->hasLocalLinkage())
1839 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
1843 if (GV->hasDLLImportStorageClass())
1846 const llvm::Triple &TT = CGM.
getTriple();
1848 if (TT.isOSCygMing()) {
1866 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
1874 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
1878 if (!TT.isOSBinFormatELF())
1884 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
1892 return !(CGM.
getLangOpts().SemanticInterposition ||
1897 if (!GV->isDeclarationForLinker())
1903 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
1910 if (CGOpts.DirectAccessExternalData) {
1916 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
1917 if (!Var->isThreadLocal())
1942 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
1944 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
1954 if (D->
hasAttr<DLLImportAttr>())
1955 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
1956 else if ((D->
hasAttr<DLLExportAttr>() ||
1958 !GV->isDeclarationForLinker())
1959 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
1979 GV->setPartition(CodeGenOpts.SymbolPartition);
1983 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
1984 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
1985 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
1986 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
1987 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
1990llvm::GlobalVariable::ThreadLocalMode
1992 switch (CodeGenOpts.getDefaultTLSModel()) {
1994 return llvm::GlobalVariable::GeneralDynamicTLSModel;
1996 return llvm::GlobalVariable::LocalDynamicTLSModel;
1998 return llvm::GlobalVariable::InitialExecTLSModel;
2000 return llvm::GlobalVariable::LocalExecTLSModel;
2002 llvm_unreachable(
"Invalid TLS model!");
2006 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2008 llvm::GlobalValue::ThreadLocalMode TLM;
2012 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2016 GV->setThreadLocalMode(TLM);
2022 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2026 const CPUSpecificAttr *
Attr,
2048 bool OmitMultiVersionMangling =
false) {
2050 llvm::raw_svector_ostream Out(Buffer);
2059 assert(II &&
"Attempt to mangle unnamed decl.");
2060 const auto *FD = dyn_cast<FunctionDecl>(ND);
2065 Out <<
"__regcall4__" << II->
getName();
2067 Out <<
"__regcall3__" << II->
getName();
2068 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2070 Out <<
"__device_stub__" << II->
getName();
2072 DeviceKernelAttr::isOpenCLSpelling(
2073 FD->getAttr<DeviceKernelAttr>()) &&
2075 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2091 "Hash computed when not explicitly requested");
2095 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2096 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2097 switch (FD->getMultiVersionKind()) {
2101 FD->getAttr<CPUSpecificAttr>(),
2105 auto *
Attr = FD->getAttr<TargetAttr>();
2106 assert(
Attr &&
"Expected TargetAttr to be present "
2107 "for attribute mangling");
2113 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2114 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2115 "for attribute mangling");
2121 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2122 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2123 "for attribute mangling");
2130 llvm_unreachable(
"None multiversion type isn't valid here");
2140 return std::string(Out.str());
2143void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2144 const FunctionDecl *FD,
2145 StringRef &CurName) {
2152 std::string NonTargetName =
2160 "Other GD should now be a multiversioned function");
2170 if (OtherName != NonTargetName) {
2173 const auto ExistingRecord = Manglings.find(NonTargetName);
2174 if (ExistingRecord != std::end(Manglings))
2175 Manglings.remove(&(*ExistingRecord));
2176 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2181 CurName = OtherNameRef;
2183 Entry->setName(OtherName);
2193 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2207 auto FoundName = MangledDeclNames.find(CanonicalGD);
2208 if (FoundName != MangledDeclNames.end())
2209 return FoundName->second;
2246 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2247 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2256 llvm::raw_svector_ostream Out(Buffer);
2259 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2260 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2262 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2267 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2268 return Result.first->first();
2272 auto it = MangledDeclNames.begin();
2273 while (it != MangledDeclNames.end()) {
2274 if (it->second == Name)
2289 llvm::Constant *AssociatedData) {
2291 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2297 bool IsDtorAttrFunc) {
2298 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2300 DtorsUsingAtExit[Priority].push_back(Dtor);
2305 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2308void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2309 if (Fns.empty())
return;
2315 llvm::PointerType *PtrTy = llvm::PointerType::get(
2316 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2319 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2323 auto Ctors = Builder.beginArray(CtorStructTy);
2324 for (
const auto &I : Fns) {
2325 auto Ctor = Ctors.beginStruct(CtorStructTy);
2326 Ctor.addInt(
Int32Ty, I.Priority);
2327 if (InitFiniAuthSchema) {
2328 llvm::Constant *StorageAddress =
2330 ? llvm::ConstantExpr::getIntToPtr(
2331 llvm::ConstantInt::get(
2333 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2337 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2338 llvm::ConstantInt::get(
2340 Ctor.add(SignedCtorPtr);
2342 Ctor.add(I.Initializer);
2344 if (I.AssociatedData)
2345 Ctor.add(I.AssociatedData);
2347 Ctor.addNullPointer(PtrTy);
2348 Ctor.finishAndAddTo(Ctors);
2351 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2353 llvm::GlobalValue::AppendingLinkage);
2357 List->setAlignment(std::nullopt);
2362llvm::GlobalValue::LinkageTypes
2368 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2375 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2376 if (!MDS)
return nullptr;
2378 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2385 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2386 if (!UD->
hasAttr<TransparentUnionAttr>())
2388 if (!UD->
fields().empty())
2389 return UD->
fields().begin()->getType();
2398 bool GeneralizePointers) {
2411 bool GeneralizePointers) {
2414 for (
auto &Param : FnType->param_types())
2415 GeneralizedParams.push_back(
2419 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2420 GeneralizedParams, FnType->getExtProtoInfo());
2425 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2427 llvm_unreachable(
"Encountered unknown FunctionType");
2435 FnType->getReturnType(), FnType->getParamTypes(),
2436 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2438 std::string OutName;
2439 llvm::raw_string_ostream Out(OutName);
2447 Out <<
".normalized";
2449 Out <<
".generalized";
2451 return llvm::ConstantInt::get(
2457 llvm::Function *F,
bool IsThunk) {
2459 llvm::AttributeList PAL;
2462 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2466 Loc = D->getLocation();
2468 Error(Loc,
"__vectorcall calling convention is not currently supported");
2470 F->setAttributes(PAL);
2471 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2475 std::string ReadOnlyQual(
"__read_only");
2476 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2477 if (ReadOnlyPos != std::string::npos)
2479 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2481 std::string WriteOnlyQual(
"__write_only");
2482 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2483 if (WriteOnlyPos != std::string::npos)
2484 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2486 std::string ReadWriteQual(
"__read_write");
2487 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2488 if (ReadWritePos != std::string::npos)
2489 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2522 assert(((FD && CGF) || (!FD && !CGF)) &&
2523 "Incorrect use - FD and CGF should either be both null or not!");
2549 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2552 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2557 std::string typeQuals;
2561 const Decl *PDecl = parm;
2563 PDecl = TD->getDecl();
2564 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2565 if (A && A->isWriteOnly())
2566 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2567 else if (A && A->isReadWrite())
2568 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2570 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2572 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2574 auto getTypeSpelling = [&](
QualType Ty) {
2575 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2577 if (Ty.isCanonical()) {
2578 StringRef typeNameRef = typeName;
2580 if (typeNameRef.consume_front(
"unsigned "))
2581 return std::string(
"u") + typeNameRef.str();
2582 if (typeNameRef.consume_front(
"signed "))
2583 return typeNameRef.str();
2593 addressQuals.push_back(
2594 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2598 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2599 std::string baseTypeName =
2601 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2602 argBaseTypeNames.push_back(
2603 llvm::MDString::get(VMContext, baseTypeName));
2607 typeQuals =
"restrict";
2610 typeQuals += typeQuals.empty() ?
"const" :
" const";
2612 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2614 uint32_t AddrSpc = 0;
2619 addressQuals.push_back(
2620 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2624 std::string typeName = getTypeSpelling(ty);
2636 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2637 argBaseTypeNames.push_back(
2638 llvm::MDString::get(VMContext, baseTypeName));
2643 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2647 Fn->setMetadata(
"kernel_arg_addr_space",
2648 llvm::MDNode::get(VMContext, addressQuals));
2649 Fn->setMetadata(
"kernel_arg_access_qual",
2650 llvm::MDNode::get(VMContext, accessQuals));
2651 Fn->setMetadata(
"kernel_arg_type",
2652 llvm::MDNode::get(VMContext, argTypeNames));
2653 Fn->setMetadata(
"kernel_arg_base_type",
2654 llvm::MDNode::get(VMContext, argBaseTypeNames));
2655 Fn->setMetadata(
"kernel_arg_type_qual",
2656 llvm::MDNode::get(VMContext, argTypeQuals));
2660 Fn->setMetadata(
"kernel_arg_name",
2661 llvm::MDNode::get(VMContext, argNames));
2671 if (!LangOpts.Exceptions)
return false;
2674 if (LangOpts.CXXExceptions)
return true;
2677 if (LangOpts.ObjCExceptions) {
2697SmallVector<const CXXRecordDecl *, 0>
2699 llvm::SetVector<const CXXRecordDecl *> MostBases;
2704 MostBases.insert(RD);
2706 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2708 CollectMostBases(RD);
2709 return MostBases.takeVector();
2713 llvm::Function *F) {
2714 llvm::AttrBuilder B(F->getContext());
2716 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2717 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2719 if (CodeGenOpts.StackClashProtector)
2720 B.addAttribute(
"probe-stack",
"inline-asm");
2722 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2723 B.addAttribute(
"stack-probe-size",
2724 std::to_string(CodeGenOpts.StackProbeSize));
2727 B.addAttribute(llvm::Attribute::NoUnwind);
2729 if (D && D->
hasAttr<NoStackProtectorAttr>())
2731 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
2733 B.addAttribute(llvm::Attribute::StackProtectStrong);
2735 B.addAttribute(llvm::Attribute::StackProtect);
2737 B.addAttribute(llvm::Attribute::StackProtectStrong);
2739 B.addAttribute(llvm::Attribute::StackProtectReq);
2743 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2744 B.addAttribute(llvm::Attribute::AlwaysInline);
2748 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2750 B.addAttribute(llvm::Attribute::NoInline);
2758 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2759 B.addAttribute(
"aarch64_pstate_sm_body");
2762 if (
Attr->isNewZA())
2763 B.addAttribute(
"aarch64_new_za");
2764 if (
Attr->isNewZT0())
2765 B.addAttribute(
"aarch64_new_zt0");
2770 bool ShouldAddOptNone =
2771 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2773 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
2774 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
2777 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
2778 !D->
hasAttr<NoInlineAttr>()) {
2779 B.addAttribute(llvm::Attribute::AlwaysInline);
2780 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
2781 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2783 B.addAttribute(llvm::Attribute::OptimizeNone);
2786 B.addAttribute(llvm::Attribute::NoInline);
2791 B.addAttribute(llvm::Attribute::Naked);
2794 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
2795 F->removeFnAttr(llvm::Attribute::MinSize);
2796 }
else if (D->
hasAttr<NakedAttr>()) {
2798 B.addAttribute(llvm::Attribute::Naked);
2799 B.addAttribute(llvm::Attribute::NoInline);
2800 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
2801 B.addAttribute(llvm::Attribute::NoDuplicate);
2802 }
else if (D->
hasAttr<NoInlineAttr>() &&
2803 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2805 B.addAttribute(llvm::Attribute::NoInline);
2806 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
2807 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
2809 B.addAttribute(llvm::Attribute::AlwaysInline);
2813 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
2814 B.addAttribute(llvm::Attribute::NoInline);
2818 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2821 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
2822 return Redecl->isInlineSpecified();
2824 if (any_of(FD->
redecls(), CheckRedeclForInline))
2829 return any_of(Pattern->
redecls(), CheckRedeclForInline);
2831 if (CheckForInline(FD)) {
2832 B.addAttribute(llvm::Attribute::InlineHint);
2833 }
else if (CodeGenOpts.getInlining() ==
2836 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2837 B.addAttribute(llvm::Attribute::NoInline);
2844 if (!D->
hasAttr<OptimizeNoneAttr>()) {
2846 if (!ShouldAddOptNone)
2847 B.addAttribute(llvm::Attribute::OptimizeForSize);
2848 B.addAttribute(llvm::Attribute::Cold);
2851 B.addAttribute(llvm::Attribute::Hot);
2852 if (D->
hasAttr<MinSizeAttr>())
2853 B.addAttribute(llvm::Attribute::MinSize);
2860 F->setAlignment(llvm::Align(alignment));
2862 if (!D->
hasAttr<AlignedAttr>())
2863 if (LangOpts.FunctionAlignment)
2864 F->setAlignment(llvm::Align(1ull << LangOpts.FunctionAlignment));
2872 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
2877 if (CodeGenOpts.SanitizeCfiCrossDso &&
2878 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
2879 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2887 if (CodeGenOpts.CallGraphSection) {
2888 if (
auto *FD = dyn_cast<FunctionDecl>(D))
2895 auto *MD = dyn_cast<CXXMethodDecl>(D);
2898 llvm::Metadata *Id =
2900 MD->getType(), std::nullopt,
Base));
2901 F->addTypeMetadata(0, Id);
2908 if (isa_and_nonnull<NamedDecl>(D))
2911 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2913 if (D && D->
hasAttr<UsedAttr>())
2916 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
2918 ((CodeGenOpts.KeepPersistentStorageVariables &&
2919 (VD->getStorageDuration() ==
SD_Static ||
2920 VD->getStorageDuration() ==
SD_Thread)) ||
2921 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
2922 VD->getType().isConstQualified())))
2926bool CodeGenModule::GetCPUAndFeaturesAttributes(
GlobalDecl GD,
2927 llvm::AttrBuilder &Attrs,
2928 bool SetTargetFeatures) {
2934 std::vector<std::string> Features;
2935 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
2938 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
2939 assert((!TD || !TV) &&
"both target_version and target specified");
2942 bool AddedAttr =
false;
2943 if (TD || TV || SD || TC) {
2944 llvm::StringMap<bool> FeatureMap;
2948 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
2949 Features.push_back((Entry.getValue() ?
"+" :
"-") + Entry.getKey().str());
2957 Target.parseTargetAttr(TD->getFeaturesStr());
2979 if (!TargetCPU.empty()) {
2980 Attrs.addAttribute(
"target-cpu", TargetCPU);
2983 if (!TuneCPU.empty()) {
2984 Attrs.addAttribute(
"tune-cpu", TuneCPU);
2987 if (!Features.empty() && SetTargetFeatures) {
2988 llvm::erase_if(Features, [&](
const std::string& F) {
2991 llvm::sort(Features);
2992 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
2997 llvm::SmallVector<StringRef, 8> Feats;
2998 bool IsDefault =
false;
3000 IsDefault = TV->isDefaultVersion();
3001 TV->getFeatures(Feats);
3007 Attrs.addAttribute(
"fmv-features");
3009 }
else if (!Feats.empty()) {
3011 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3012 std::string FMVFeatures;
3013 for (StringRef F : OrderedFeats)
3014 FMVFeatures.append(
"," + F.str());
3015 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3022void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3023 llvm::GlobalObject *GO) {
3028 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3031 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3032 GV->addAttribute(
"bss-section", SA->getName());
3033 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3034 GV->addAttribute(
"data-section", SA->getName());
3035 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3036 GV->addAttribute(
"rodata-section", SA->getName());
3037 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3038 GV->addAttribute(
"relro-section", SA->getName());
3041 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3044 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3045 if (!D->
getAttr<SectionAttr>())
3046 F->setSection(SA->getName());
3048 llvm::AttrBuilder Attrs(F->getContext());
3049 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3053 llvm::AttributeMask RemoveAttrs;
3054 RemoveAttrs.addAttribute(
"target-cpu");
3055 RemoveAttrs.addAttribute(
"target-features");
3056 RemoveAttrs.addAttribute(
"fmv-features");
3057 RemoveAttrs.addAttribute(
"tune-cpu");
3058 F->removeFnAttrs(RemoveAttrs);
3059 F->addFnAttrs(Attrs);
3063 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3064 GO->setSection(CSA->getName());
3065 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3066 GO->setSection(SA->getName());
3079 F->setLinkage(llvm::Function::InternalLinkage);
3081 setNonAliasAttributes(GD, F);
3092 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3096 llvm::MDNode *MD = F->getMetadata(llvm::LLVMContext::MD_type);
3097 return MD && MD->hasGeneralizedMDString();
3101 llvm::Function *F) {
3108 if (!F->hasLocalLinkage() ||
3109 F->getFunction().hasAddressTaken(
nullptr,
true,
3116 llvm::Function *F) {
3118 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3129 F->addTypeMetadata(0, MD);
3138 if (CodeGenOpts.SanitizeCfiCrossDso)
3140 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3144 llvm::CallBase *CB) {
3146 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall())
3150 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
3151 getLLVMContext(), {llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
3154 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3155 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3159 llvm::LLVMContext &Ctx = F->getContext();
3160 llvm::MDBuilder MDB(Ctx);
3161 llvm::StringRef Salt;
3164 if (
const auto &Info = FP->getExtraAttributeInfo())
3165 Salt = Info.CFISalt;
3167 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3176 return llvm::all_of(Name, [](
const char &
C) {
3177 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3183 for (
auto &F : M.functions()) {
3185 bool AddressTaken = F.hasAddressTaken();
3186 if (!AddressTaken && F.hasLocalLinkage())
3187 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3192 if (!AddressTaken || !F.isDeclaration())
3195 const llvm::ConstantInt *
Type;
3196 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3197 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3201 StringRef Name = F.getName();
3205 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3206 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3207 Twine(
Type->getSExtValue()) +
" */\n")
3209 M.appendModuleInlineAsm(
Asm);
3213void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3214 bool IsIncompleteFunction,
3217 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3225 if (!IsIncompleteFunction)
3232 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3234 assert(!F->arg_empty() &&
3235 F->arg_begin()->getType()
3236 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3237 "unexpected this return");
3238 F->addParamAttr(0, llvm::Attribute::Returned);
3248 if (!IsIncompleteFunction && F->isDeclaration())
3251 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3252 F->setSection(CSA->getName());
3253 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3254 F->setSection(SA->getName());
3256 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3258 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3259 else if (EA->isWarning())
3260 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3265 const FunctionDecl *FDBody;
3266 bool HasBody = FD->
hasBody(FDBody);
3268 assert(HasBody &&
"Inline builtin declarations should always have an "
3270 if (shouldEmitFunction(FDBody))
3271 F->addFnAttr(llvm::Attribute::NoBuiltin);
3277 F->addFnAttr(llvm::Attribute::NoBuiltin);
3281 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3282 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3283 if (MD->isVirtual())
3284 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3290 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3291 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3294 if (CodeGenOpts.CallGraphSection)
3297 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3303 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3304 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3306 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3310 llvm::LLVMContext &Ctx = F->getContext();
3311 llvm::MDBuilder MDB(Ctx);
3315 int CalleeIdx = *CB->encoding_begin();
3316 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3317 F->addMetadata(llvm::LLVMContext::MD_callback,
3318 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3319 CalleeIdx, PayloadIndices,
3326 "Only globals with definition can force usage.");
3327 LLVMUsed.emplace_back(GV);
3331 assert(!GV->isDeclaration() &&
3332 "Only globals with definition can force usage.");
3333 LLVMCompilerUsed.emplace_back(GV);
3338 "Only globals with definition can force usage.");
3340 LLVMCompilerUsed.emplace_back(GV);
3342 LLVMUsed.emplace_back(GV);
3346 std::vector<llvm::WeakTrackingVH> &List) {
3353 UsedArray.resize(List.size());
3354 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3356 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3360 if (UsedArray.empty())
3362 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3364 auto *GV =
new llvm::GlobalVariable(
3365 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3366 llvm::ConstantArray::get(ATy, UsedArray), Name);
3368 GV->setSection(
"llvm.metadata");
3371void CodeGenModule::emitLLVMUsed() {
3372 emitUsed(*
this,
"llvm.used", LLVMUsed);
3373 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3378 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3387 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3393 ELFDependentLibraries.push_back(
3394 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3401 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3410 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3416 if (Visited.insert(Import).second)
3433 if (LL.IsFramework) {
3434 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3435 llvm::MDString::get(Context, LL.Library)};
3437 Metadata.push_back(llvm::MDNode::get(Context, Args));
3443 llvm::Metadata *Args[2] = {
3444 llvm::MDString::get(Context,
"lib"),
3445 llvm::MDString::get(Context, LL.Library),
3447 Metadata.push_back(llvm::MDNode::get(Context, Args));
3451 auto *OptString = llvm::MDString::get(Context, Opt);
3452 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3457void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3459 "We should only emit module initializers for named modules.");
3467 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3484 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
3490void CodeGenModule::EmitModuleLinkOptions() {
3494 llvm::SetVector<clang::Module *> LinkModules;
3495 llvm::SmallPtrSet<clang::Module *, 16> Visited;
3496 SmallVector<clang::Module *, 16> Stack;
3499 for (
Module *M : ImportedModules) {
3502 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3505 if (Visited.insert(M).second)
3511 while (!Stack.empty()) {
3514 bool AnyChildren =
false;
3523 if (Visited.insert(
SM).second) {
3524 Stack.push_back(
SM);
3532 LinkModules.insert(Mod);
3539 SmallVector<llvm::MDNode *, 16> MetadataArgs;
3541 for (
Module *M : LinkModules)
3542 if (Visited.insert(M).second)
3544 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3545 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3548 if (!LinkerOptionsMetadata.empty()) {
3549 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3550 for (
auto *MD : LinkerOptionsMetadata)
3551 NMD->addOperand(MD);
3555void CodeGenModule::EmitDeferred() {
3564 if (!DeferredVTables.empty()) {
3565 EmitDeferredVTables();
3570 assert(DeferredVTables.empty());
3577 llvm::append_range(DeferredDeclsToEmit,
3581 if (DeferredDeclsToEmit.empty())
3586 std::vector<GlobalDecl> CurDeclsToEmit;
3587 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3589 for (GlobalDecl &D : CurDeclsToEmit) {
3595 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
3599 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
3615 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3633 if (!GV->isDeclaration())
3637 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3641 EmitGlobalDefinition(D, GV);
3646 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3648 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3653void CodeGenModule::EmitVTablesOpportunistically() {
3659 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3660 &&
"Only emit opportunistic vtables with optimizations");
3662 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
3664 "This queue should only contain external vtables");
3665 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3666 VTables.GenerateClassData(RD);
3668 OpportunisticVTables.clear();
3672 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3677 DeferredAnnotations.clear();
3679 if (Annotations.empty())
3683 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3684 Annotations[0]->
getType(), Annotations.size()), Annotations);
3685 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3686 llvm::GlobalValue::AppendingLinkage,
3687 Array,
"llvm.global.annotations");
3692 llvm::Constant *&AStr = AnnotationStrings[Str];
3697 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3698 auto *gv =
new llvm::GlobalVariable(
3699 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3700 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3703 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3720 SM.getExpansionLineNumber(L);
3721 return llvm::ConstantInt::get(
Int32Ty, LineNo);
3729 llvm::FoldingSetNodeID ID;
3730 for (
Expr *E : Exprs) {
3733 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
3738 LLVMArgs.reserve(Exprs.size());
3740 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
3742 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
3745 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
3746 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
3747 llvm::GlobalValue::PrivateLinkage,
Struct,
3750 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3757 const AnnotateAttr *AA,
3765 llvm::Constant *GVInGlobalsAS = GV;
3766 if (GV->getAddressSpace() !=
3768 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
3770 llvm::PointerType::get(
3771 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
3775 llvm::Constant *Fields[] = {
3776 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
3778 return llvm::ConstantStruct::getAnon(Fields);
3782 llvm::GlobalValue *GV) {
3783 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
3793 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
3796 auto &
SM = Context.getSourceManager();
3798 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
3803 return NoSanitizeL.containsLocation(Kind, Loc);
3806 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
3810 llvm::GlobalVariable *GV,
3812 StringRef Category)
const {
3814 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
3816 auto &
SM = Context.getSourceManager();
3817 if (NoSanitizeL.containsMainFile(
3818 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
3821 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
3828 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
3829 Ty = AT->getElementType();
3834 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
3842 StringRef Category)
const {
3845 auto Attr = ImbueAttr::NONE;
3847 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
3848 if (
Attr == ImbueAttr::NONE)
3849 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
3851 case ImbueAttr::NONE:
3853 case ImbueAttr::ALWAYS:
3854 Fn->addFnAttr(
"function-instrument",
"xray-always");
3856 case ImbueAttr::ALWAYS_ARG1:
3857 Fn->addFnAttr(
"function-instrument",
"xray-always");
3858 Fn->addFnAttr(
"xray-log-args",
"1");
3860 case ImbueAttr::NEVER:
3861 Fn->addFnAttr(
"function-instrument",
"xray-never");
3874 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
3884 auto &
SM = Context.getSourceManager();
3885 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
3899 if (NumGroups > 1) {
3900 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
3909 if (LangOpts.EmitAllDecls)
3912 const auto *VD = dyn_cast<VarDecl>(
Global);
3914 ((CodeGenOpts.KeepPersistentStorageVariables &&
3915 (VD->getStorageDuration() ==
SD_Static ||
3916 VD->getStorageDuration() ==
SD_Thread)) ||
3917 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3918 VD->getType().isConstQualified())))
3931 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
3932 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
3933 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
3934 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
3938 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
3948 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
3951 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
3952 if (Context.getInlineVariableDefinitionKind(VD) ==
3957 if (CXX20ModuleInits && VD->getOwningModule() &&
3958 !VD->getOwningModule()->isModuleMapModule()) {
3967 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
3970 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
3983 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3987 llvm::Constant *
Init;
3990 if (!
V.isAbsent()) {
4001 llvm::Constant *Fields[4] = {
4005 llvm::ConstantDataArray::getRaw(
4006 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4008 Init = llvm::ConstantStruct::getAnon(Fields);
4011 auto *GV =
new llvm::GlobalVariable(
4013 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4015 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4018 if (!
V.isAbsent()) {
4031 llvm::GlobalVariable **Entry =
nullptr;
4032 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4037 llvm::Constant *
Init;
4041 assert(!
V.isAbsent());
4045 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4047 llvm::GlobalValue::PrivateLinkage,
Init,
4049 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4063 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4067 llvm::Constant *
Init =
Emitter.emitForInitializer(
4075 llvm::GlobalValue::LinkageTypes
Linkage =
4077 ? llvm::GlobalValue::LinkOnceODRLinkage
4078 : llvm::GlobalValue::InternalLinkage;
4079 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4083 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4090 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4091 assert(AA &&
"No alias?");
4101 llvm::Constant *Aliasee;
4103 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4111 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4112 WeakRefReferences.insert(F);
4120 if (
auto *A = D->
getAttr<AttrT>())
4121 return A->isImplicit();
4128 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4131 const auto *AA =
Global->getAttr<AliasAttr>();
4139 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4140 if (LangOpts.OpenMPIsTargetDevice)
4141 return !AliaseeDecl ||
4142 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4145 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4146 const bool AliaseeHasDeviceAttr =
4147 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4149 if (LangOpts.CUDAIsDevice)
4150 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4157bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4158 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4163 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4164 Global->hasAttr<CUDAConstantAttr>() ||
4165 Global->hasAttr<CUDASharedAttr>() ||
4166 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4167 Global->getType()->isCUDADeviceBuiltinTextureType();
4174 if (
Global->hasAttr<WeakRefAttr>())
4179 if (
Global->hasAttr<AliasAttr>()) {
4182 return EmitAliasDefinition(GD);
4186 if (
Global->hasAttr<IFuncAttr>())
4187 return emitIFuncDefinition(GD);
4190 if (
Global->hasAttr<CPUDispatchAttr>())
4191 return emitCPUDispatchDefinition(GD);
4196 if (LangOpts.CUDA) {
4198 "Expected Variable or Function");
4199 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4200 if (!shouldEmitCUDAGlobalVar(VD))
4202 }
else if (LangOpts.CUDAIsDevice) {
4203 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4204 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4205 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4209 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4210 !
Global->hasAttr<CUDAGlobalAttr>() &&
4212 !
Global->hasAttr<CUDAHostAttr>()))
4215 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4216 Global->hasAttr<CUDADeviceAttr>())
4220 if (LangOpts.OpenMP) {
4222 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4224 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4225 if (MustBeEmitted(
Global))
4229 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4230 if (MustBeEmitted(
Global))
4237 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4238 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4244 if (FD->
hasAttr<AnnotateAttr>()) {
4247 DeferredAnnotations[MangledName] = FD;
4262 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4268 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4270 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4271 if (LangOpts.OpenMP) {
4273 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4274 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4278 if (VD->hasExternalStorage() &&
4279 Res != OMPDeclareTargetDeclAttr::MT_Link)
4282 bool UnifiedMemoryEnabled =
4284 if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4285 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4286 !UnifiedMemoryEnabled) {
4289 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4290 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4291 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4292 UnifiedMemoryEnabled)) &&
4293 "Link clause or to clause with unified memory expected.");
4302 if (Context.getInlineVariableDefinitionKind(VD) ==
4312 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4314 EmitGlobalDefinition(GD);
4315 addEmittedDeferredDecl(GD);
4323 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4324 CXXGlobalInits.push_back(
nullptr);
4330 addDeferredDeclToEmit(GD);
4331 }
else if (MustBeEmitted(
Global)) {
4333 assert(!MayBeEmittedEagerly(
Global));
4334 addDeferredDeclToEmit(GD);
4339 DeferredDecls[MangledName] = GD;
4345 if (
const auto *RT =
4346 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4347 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4348 RD = RD->getDefinitionOrSelf();
4349 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4357 struct FunctionIsDirectlyRecursive
4358 :
public ConstStmtVisitor<FunctionIsDirectlyRecursive, bool> {
4359 const StringRef Name;
4360 const Builtin::Context &BI;
4361 FunctionIsDirectlyRecursive(StringRef N,
const Builtin::Context &
C)
4364 bool VisitCallExpr(
const CallExpr *E) {
4368 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4369 if (Attr && Name == Attr->getLabel())
4374 std::string BuiltinNameStr = BI.
getName(BuiltinID);
4375 StringRef BuiltinName = BuiltinNameStr;
4376 return BuiltinName.consume_front(
"__builtin_") && Name == BuiltinName;
4379 bool VisitStmt(
const Stmt *S) {
4380 for (
const Stmt *Child : S->
children())
4381 if (Child && this->Visit(Child))
4388 struct DLLImportFunctionVisitor
4389 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4390 bool SafeToInline =
true;
4392 bool shouldVisitImplicitCode()
const {
return true; }
4394 bool VisitVarDecl(VarDecl *VD) {
4397 SafeToInline =
false;
4398 return SafeToInline;
4405 return SafeToInline;
4408 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4410 SafeToInline = D->
hasAttr<DLLImportAttr>();
4411 return SafeToInline;
4414 bool VisitDeclRefExpr(DeclRefExpr *E) {
4417 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4418 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4419 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4420 return SafeToInline;
4423 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4425 return SafeToInline;
4428 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4432 SafeToInline =
true;
4434 SafeToInline = M->
hasAttr<DLLImportAttr>();
4436 return SafeToInline;
4439 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4441 return SafeToInline;
4444 bool VisitCXXNewExpr(CXXNewExpr *E) {
4446 return SafeToInline;
4455CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4457 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4459 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4462 Name = Attr->getLabel();
4467 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
4468 const Stmt *Body = FD->
getBody();
4469 return Body ? Walker.Visit(Body) :
false;
4472bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4479 if (F->isInlineBuiltinDeclaration())
4482 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4487 if (
const Module *M = F->getOwningModule();
4488 M && M->getTopLevelModule()->isNamedModule() &&
4489 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4499 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4504 if (F->hasAttr<NoInlineAttr>())
4507 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4509 DLLImportFunctionVisitor Visitor;
4510 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4511 if (!Visitor.SafeToInline)
4514 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4517 for (
const Decl *
Member : Dtor->getParent()->decls())
4521 for (
const CXXBaseSpecifier &B : Dtor->getParent()->bases())
4532 return !isTriviallyRecursive(F);
4535bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4536 return CodeGenOpts.OptimizationLevel > 0;
4539void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
4540 llvm::GlobalValue *GV) {
4544 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4545 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4547 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4548 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4549 if (TC->isFirstOfVersion(I))
4552 EmitGlobalFunctionDefinition(GD, GV);
4558 AddDeferredMultiVersionResolverToEmit(GD);
4560 GetOrCreateMultiVersionResolver(GD);
4564void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
4567 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
4568 Context.getSourceManager(),
4569 "Generating code for declaration");
4571 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4574 if (!shouldEmitFunction(GD))
4577 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4579 llvm::raw_string_ostream
OS(Name);
4585 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4589 ABI->emitCXXStructor(GD);
4591 EmitMultiVersionFunctionDefinition(GD, GV);
4593 EmitGlobalFunctionDefinition(GD, GV);
4602 return EmitMultiVersionFunctionDefinition(GD, GV);
4603 return EmitGlobalFunctionDefinition(GD, GV);
4606 if (
const auto *VD = dyn_cast<VarDecl>(D))
4607 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4609 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4613 llvm::Function *NewFn);
4629static llvm::GlobalValue::LinkageTypes
4633 return llvm::GlobalValue::InternalLinkage;
4634 return llvm::GlobalValue::WeakODRLinkage;
4637void CodeGenModule::emitMultiVersionFunctions() {
4638 std::vector<GlobalDecl> MVFuncsToEmit;
4639 MultiVersionFuncs.swap(MVFuncsToEmit);
4640 for (GlobalDecl GD : MVFuncsToEmit) {
4642 assert(FD &&
"Expected a FunctionDecl");
4644 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
4645 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
4649 if (
Decl->isDefined()) {
4650 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4658 assert(
Func &&
"This should have just been created");
4667 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4668 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
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 DeclMap.insert({
Func, CurFD});
4680 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
4681 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4682 if (TVA->isDefaultVersion() && IsDefined)
4683 ShouldEmitResolver =
true;
4684 llvm::Function *
Func = createFunction(CurFD);
4685 DeclMap.insert({
Func, CurFD});
4687 TVA->getFeatures(Feats, Delim);
4688 Options.emplace_back(
Func, Feats);
4689 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4690 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4691 if (!TC->isFirstOfVersion(I))
4693 if (TC->isDefaultVersion(I) && IsDefined)
4694 ShouldEmitResolver =
true;
4695 llvm::Function *
Func = createFunction(CurFD, I);
4696 DeclMap.insert({
Func, CurFD});
4699 TC->getX86Feature(Feats, I);
4700 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
4703 TC->getFeatures(Feats, I, Delim);
4704 Options.emplace_back(
Func, Feats);
4708 llvm_unreachable(
"unexpected MultiVersionKind");
4711 if (!ShouldEmitResolver)
4714 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
4715 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
4716 ResolverConstant = IFunc->getResolver();
4720 *
this, GD, FD,
true);
4727 auto *Alias = llvm::GlobalAlias::create(
4729 MangledName +
".ifunc", IFunc, &
getModule());
4738 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
4739 const CodeGenFunction::FMVResolverOption &RHS) {
4745 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
4746 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
4747 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
4748 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
4749 return LHS.isSubsetOf(RHS);
4751 Diags.Report(DeclMap[I->Function]->getLocation(),
4752 diag::warn_unreachable_version)
4753 << I->Function->getName();
4754 assert(I->Function->user_empty() &&
"unexpected users");
4755 I->Function->eraseFromParent();
4756 I->Function =
nullptr;
4760 CodeGenFunction CGF(*
this);
4761 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4763 setMultiVersionResolverAttributes(ResolverFunc, GD);
4765 ResolverFunc->setComdat(
4766 getModule().getOrInsertComdat(ResolverFunc->getName()));
4772 if (!MVFuncsToEmit.empty())
4777 if (!MultiVersionFuncs.empty())
4778 emitMultiVersionFunctions();
4782 llvm::Constant *
New) {
4785 Old->replaceAllUsesWith(
New);
4786 Old->eraseFromParent();
4789void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
4791 assert(FD &&
"Not a FunctionDecl?");
4793 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
4794 assert(DD &&
"Not a cpu_dispatch Function?");
4800 UpdateMultiVersionNames(GD, FD, ResolverName);
4802 llvm::Type *ResolverType;
4803 GlobalDecl ResolverGD;
4805 ResolverType = llvm::FunctionType::get(
4816 ResolverName, ResolverType, ResolverGD,
false));
4819 ResolverFunc->setComdat(
4820 getModule().getOrInsertComdat(ResolverFunc->getName()));
4822 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4825 for (
const IdentifierInfo *II : DD->cpus()) {
4833 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
4836 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
4842 Func = GetOrCreateLLVMFunction(
4843 MangledName, DeclTy, ExistingDecl,
4849 llvm::SmallVector<StringRef, 32> Features;
4850 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
4851 llvm::transform(Features, Features.begin(),
4852 [](StringRef Str) { return Str.substr(1); });
4853 llvm::erase_if(Features, [&Target](StringRef Feat) {
4854 return !Target.validateCpuSupports(Feat);
4860 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
4861 const CodeGenFunction::FMVResolverOption &RHS) {
4862 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
4863 llvm::X86::getCpuSupportsMask(RHS.
Features);
4870 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
4871 (Options.end() - 2)->Features),
4872 [](
auto X) { return X == 0; })) {
4873 StringRef LHSName = (Options.end() - 2)->Function->getName();
4874 StringRef RHSName = (Options.end() - 1)->Function->getName();
4875 if (LHSName.compare(RHSName) < 0)
4876 Options.erase(Options.end() - 2);
4878 Options.erase(Options.end() - 1);
4881 CodeGenFunction CGF(*
this);
4882 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4883 setMultiVersionResolverAttributes(ResolverFunc, GD);
4888 unsigned AS = IFunc->getType()->getPointerAddressSpace();
4893 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
4900 *
this, GD, FD,
true);
4903 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
4911void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
4913 assert(FD &&
"Not a FunctionDecl?");
4916 std::string MangledName =
4918 if (!DeferredResolversToEmit.insert(MangledName).second)
4921 MultiVersionFuncs.push_back(GD);
4927llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
4929 assert(FD &&
"Not a FunctionDecl?");
4931 std::string MangledName =
4936 std::string ResolverName = MangledName;
4940 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
4944 ResolverName +=
".ifunc";
4951 ResolverName +=
".resolver";
4954 bool ShouldReturnIFunc =
4973 AddDeferredMultiVersionResolverToEmit(GD);
4977 if (ShouldReturnIFunc) {
4979 llvm::Type *ResolverType = llvm::FunctionType::get(
4981 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4982 MangledName +
".resolver", ResolverType, GlobalDecl{},
4984 llvm::GlobalIFunc *GIF =
4987 GIF->setName(ResolverName);
4994 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4995 ResolverName, DeclTy, GlobalDecl{},
false);
4997 "Resolver should be created for the first time");
5002void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5004 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5016 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5027bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5028 const llvm::GlobalValue *GV)
const {
5029 auto SC = GV->getDLLStorageClass();
5030 if (SC == llvm::GlobalValue::DefaultStorageClass)
5033 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5034 !MRD->
hasAttr<DLLImportAttr>()) ||
5035 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5036 !MRD->
hasAttr<DLLExportAttr>())) &&
5047llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5048 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5049 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5053 std::string NameWithoutMultiVersionMangling;
5054 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5056 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5057 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5058 !DontDefer && !IsForDefinition) {
5061 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5063 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5066 GDDef = GlobalDecl(FDDef);
5074 UpdateMultiVersionNames(GD, FD, MangledName);
5075 if (!IsForDefinition) {
5081 AddDeferredMultiVersionResolverToEmit(GD);
5083 *
this, GD, FD,
true);
5085 return GetOrCreateMultiVersionResolver(GD);
5090 if (!NameWithoutMultiVersionMangling.empty())
5091 MangledName = NameWithoutMultiVersionMangling;
5096 if (WeakRefReferences.erase(Entry)) {
5097 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5098 if (FD && !FD->
hasAttr<WeakAttr>())
5099 Entry->setLinkage(llvm::Function::ExternalLinkage);
5103 if (D && shouldDropDLLAttribute(D, Entry)) {
5104 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5110 if (IsForDefinition && !Entry->isDeclaration()) {
5117 DiagnosedConflictingDefinitions.insert(GD).second) {
5121 diag::note_previous_definition);
5126 (Entry->getValueType() == Ty)) {
5133 if (!IsForDefinition)
5140 bool IsIncompleteFunction =
false;
5142 llvm::FunctionType *FTy;
5146 FTy = llvm::FunctionType::get(
VoidTy,
false);
5147 IsIncompleteFunction =
true;
5151 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5152 Entry ? StringRef() : MangledName, &
getModule());
5156 if (D && D->
hasAttr<AnnotateAttr>())
5174 if (!Entry->use_empty()) {
5176 Entry->removeDeadConstantUsers();
5182 assert(F->getName() == MangledName &&
"name was uniqued!");
5184 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5185 if (ExtraAttrs.hasFnAttrs()) {
5186 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5194 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5197 addDeferredDeclToEmit(GD);
5202 auto DDI = DeferredDecls.find(MangledName);
5203 if (DDI != DeferredDecls.end()) {
5207 addDeferredDeclToEmit(DDI->second);
5208 DeferredDecls.erase(DDI);
5236 if (!IsIncompleteFunction) {
5237 assert(F->getFunctionType() == Ty);
5255 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5265 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5268 DD->getParent()->getNumVBases() == 0)
5273 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5274 false, llvm::AttributeList(),
5277 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5281 if (IsForDefinition)
5289 llvm::GlobalValue *F =
5292 return llvm::NoCFIValue::get(F);
5301 for (
const auto *Result : DC->
lookup(&CII))
5302 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5305 if (!
C.getLangOpts().CPlusPlus)
5310 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5311 ?
C.Idents.get(
"terminate")
5312 :
C.Idents.get(Name);
5314 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5316 for (
const auto *Result : DC->
lookup(&NS)) {
5318 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(Result))
5319 for (
const auto *Result : LSD->lookup(&NS))
5320 if ((ND = dyn_cast<NamespaceDecl>(Result)))
5324 for (
const auto *Result : ND->
lookup(&CXXII))
5325 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5334 llvm::Function *F, StringRef Name) {
5340 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5343 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5344 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5345 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5352 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5353 if (AssumeConvergent) {
5355 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5358 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5363 llvm::Constant *
C = GetOrCreateLLVMFunction(
5365 false,
false, ExtraAttrs);
5367 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5383 llvm::AttributeList ExtraAttrs,
bool Local,
5384 bool AssumeConvergent) {
5385 if (AssumeConvergent) {
5387 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5391 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5395 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5404 markRegisterParameterAttributes(F);
5430 if (WeakRefReferences.erase(Entry)) {
5431 if (D && !D->
hasAttr<WeakAttr>())
5432 Entry->setLinkage(llvm::Function::ExternalLinkage);
5436 if (D && shouldDropDLLAttribute(D, Entry))
5437 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5439 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5442 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5447 if (IsForDefinition && !Entry->isDeclaration()) {
5455 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5457 DiagnosedConflictingDefinitions.insert(D).second) {
5461 diag::note_previous_definition);
5466 if (Entry->getType()->getAddressSpace() != TargetAS)
5467 return llvm::ConstantExpr::getAddrSpaceCast(
5468 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5472 if (!IsForDefinition)
5478 auto *GV =
new llvm::GlobalVariable(
5479 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5480 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5481 getContext().getTargetAddressSpace(DAddrSpace));
5486 GV->takeName(Entry);
5488 if (!Entry->use_empty()) {
5489 Entry->replaceAllUsesWith(GV);
5492 Entry->eraseFromParent();
5498 auto DDI = DeferredDecls.find(MangledName);
5499 if (DDI != DeferredDecls.end()) {
5502 addDeferredDeclToEmit(DDI->second);
5503 DeferredDecls.erase(DDI);
5508 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5515 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
5521 CXXThreadLocals.push_back(D);
5529 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
5530 EmitGlobalVarDefinition(D);
5535 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
5536 GV->setSection(SA->getName());
5540 if (
getTriple().getArch() == llvm::Triple::xcore &&
5544 GV->setSection(
".cp.rodata");
5547 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
5548 GV->setCodeModel(CMA->getModel());
5553 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5557 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
5558 bool HasMutableFields =
Record &&
Record->hasMutableFields();
5559 if (!HasMutableFields) {
5566 auto *InitType =
Init->getType();
5567 if (GV->getValueType() != InitType) {
5572 GV->setName(StringRef());
5577 ->stripPointerCasts());
5580 GV->eraseFromParent();
5583 GV->setInitializer(
Init);
5584 GV->setConstant(
true);
5585 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5605 SanitizerMD->reportGlobal(GV, *D);
5610 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5611 if (DAddrSpace != ExpectedAS) {
5613 *
this, GV, DAddrSpace,
5626 false, IsForDefinition);
5647 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5648 llvm::Align Alignment) {
5649 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5650 llvm::GlobalVariable *OldGV =
nullptr;
5654 if (GV->getValueType() == Ty)
5659 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
5664 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
5669 GV->takeName(OldGV);
5671 if (!OldGV->use_empty()) {
5672 OldGV->replaceAllUsesWith(GV);
5675 OldGV->eraseFromParent();
5679 !GV->hasAvailableExternallyLinkage())
5680 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
5682 GV->setAlignment(Alignment);
5719 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
5727 if (GV && !GV->isDeclaration())
5732 if (!MustBeEmitted(D) && !GV) {
5733 DeferredDecls[MangledName] = D;
5738 EmitGlobalVarDefinition(D);
5743 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
5745 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
5760 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5763 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
5765 if (!Fn->getSubprogram())
5771 return Context.toCharUnitsFromBits(
5776 if (LangOpts.OpenCL) {
5787 if (LangOpts.SYCLIsDevice &&
5791 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
5793 if (D->
hasAttr<CUDAConstantAttr>())
5795 if (D->
hasAttr<CUDASharedAttr>())
5797 if (D->
hasAttr<CUDADeviceAttr>())
5805 if (LangOpts.OpenMP) {
5807 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
5815 if (LangOpts.OpenCL)
5817 if (LangOpts.SYCLIsDevice)
5819 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
5827 if (
auto AS =
getTarget().getConstantAddressSpace())
5840static llvm::Constant *
5842 llvm::GlobalVariable *GV) {
5843 llvm::Constant *Cast = GV;
5849 llvm::PointerType::get(
5856template<
typename SomeDecl>
5858 llvm::GlobalValue *GV) {
5873 const SomeDecl *
First = D->getFirstDecl();
5874 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
5880 std::pair<StaticExternCMap::iterator, bool> R =
5881 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
5886 R.first->second =
nullptr;
5893 if (D.
hasAttr<SelectAnyAttr>())
5897 if (
auto *VD = dyn_cast<VarDecl>(&D))
5911 llvm_unreachable(
"No such linkage");
5919 llvm::GlobalObject &GO) {
5922 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
5930void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
5945 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
5946 OpenMPRuntime->emitTargetGlobalVariable(D))
5949 llvm::TrackingVH<llvm::Constant>
Init;
5950 bool NeedsGlobalCtor =
false;
5954 bool IsDefinitionAvailableExternally =
5956 bool NeedsGlobalDtor =
5957 !IsDefinitionAvailableExternally &&
5964 if (IsDefinitionAvailableExternally &&
5975 std::optional<ConstantEmitter> emitter;
5980 bool IsCUDASharedVar =
5985 bool IsCUDAShadowVar =
5987 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
5988 D->
hasAttr<CUDASharedAttr>());
5989 bool IsCUDADeviceShadowVar =
5994 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
5995 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5999 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6002 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6003 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6004 }
else if (!InitExpr) {
6017 initializedGlobalDecl = GlobalDecl(D);
6018 emitter.emplace(*
this);
6019 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6027 if (!IsDefinitionAvailableExternally)
6028 NeedsGlobalCtor =
true;
6032 NeedsGlobalCtor =
false;
6044 DelayedCXXInitPosition.erase(D);
6051 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6056 llvm::Type* InitType =
Init->getType();
6057 llvm::Constant *Entry =
6061 Entry = Entry->stripPointerCasts();
6064 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6075 if (!GV || GV->getValueType() != InitType ||
6076 GV->getType()->getAddressSpace() !=
6080 Entry->setName(StringRef());
6085 ->stripPointerCasts());
6088 llvm::Constant *NewPtrForOldDecl =
6089 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6091 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6099 if (D->
hasAttr<AnnotateAttr>())
6112 if (LangOpts.CUDA) {
6113 if (LangOpts.CUDAIsDevice) {
6114 if (
Linkage != llvm::GlobalValue::InternalLinkage &&
6115 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6118 GV->setExternallyInitialized(
true);
6125 if (LangOpts.HLSL &&
6130 GV->setExternallyInitialized(
true);
6132 GV->setInitializer(
Init);
6139 emitter->finalize(GV);
6142 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6143 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6147 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6148 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6150 GV->setConstant(
true);
6155 if (std::optional<CharUnits> AlignValFromAllocate =
6157 AlignVal = *AlignValFromAllocate;
6175 Linkage == llvm::GlobalValue::ExternalLinkage &&
6176 Context.getTargetInfo().getTriple().isOSDarwin() &&
6178 Linkage = llvm::GlobalValue::InternalLinkage;
6183 if (LangOpts.HLSL &&
6185 Linkage = llvm::GlobalValue::ExternalLinkage;
6188 if (D->
hasAttr<DLLImportAttr>())
6189 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6190 else if (D->
hasAttr<DLLExportAttr>())
6191 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6193 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6195 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6197 GV->setConstant(
false);
6202 if (!GV->getInitializer()->isNullValue())
6203 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6206 setNonAliasAttributes(D, GV);
6208 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6210 CXXThreadLocals.push_back(D);
6217 if (NeedsGlobalCtor || NeedsGlobalDtor)
6218 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6220 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6225 DI->EmitGlobalVariable(GV, D);
6233 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6244 if (D->
hasAttr<SectionAttr>())
6250 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6251 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6252 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6253 D->
hasAttr<PragmaClangRodataSectionAttr>())
6261 if (D->
hasAttr<WeakImportAttr>())
6270 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6271 if (D->
hasAttr<AlignedAttr>())
6274 if (Context.isAlignmentRequired(VarType))
6278 for (
const FieldDecl *FD : RD->fields()) {
6279 if (FD->isBitField())
6281 if (FD->
hasAttr<AlignedAttr>())
6283 if (Context.isAlignmentRequired(FD->
getType()))
6295 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6296 Context.getTypeAlignIfKnown(D->
getType()) >
6303llvm::GlobalValue::LinkageTypes
6307 return llvm::Function::InternalLinkage;
6310 return llvm::GlobalVariable::WeakAnyLinkage;
6314 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6319 return llvm::GlobalValue::AvailableExternallyLinkage;
6333 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6334 : llvm::Function::InternalLinkage;
6348 return llvm::Function::ExternalLinkage;
6351 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6352 : llvm::Function::InternalLinkage;
6353 return llvm::Function::WeakODRLinkage;
6360 CodeGenOpts.NoCommon))
6361 return llvm::GlobalVariable::CommonLinkage;
6367 if (D->
hasAttr<SelectAnyAttr>())
6368 return llvm::GlobalVariable::WeakODRLinkage;
6372 return llvm::GlobalVariable::ExternalLinkage;
6375llvm::GlobalValue::LinkageTypes
6384 llvm::Function *newFn) {
6386 if (old->use_empty())
6389 llvm::Type *newRetTy = newFn->getReturnType();
6394 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6396 llvm::User *user = ui->getUser();
6400 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6401 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6407 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6410 if (!callSite->isCallee(&*ui))
6415 if (callSite->getType() != newRetTy && !callSite->use_empty())
6420 llvm::AttributeList oldAttrs = callSite->getAttributes();
6423 unsigned newNumArgs = newFn->arg_size();
6424 if (callSite->arg_size() < newNumArgs)
6430 bool dontTransform =
false;
6431 for (llvm::Argument &A : newFn->args()) {
6432 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6433 dontTransform =
true;
6438 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6446 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6450 callSite->getOperandBundlesAsDefs(newBundles);
6452 llvm::CallBase *newCall;
6454 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6455 callSite->getIterator());
6458 newCall = llvm::InvokeInst::Create(
6459 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6460 newArgs, newBundles,
"", callSite->getIterator());
6464 if (!newCall->getType()->isVoidTy())
6465 newCall->takeName(callSite);
6466 newCall->setAttributes(
6467 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6468 oldAttrs.getRetAttrs(), newArgAttrs));
6469 newCall->setCallingConv(callSite->getCallingConv());
6472 if (!callSite->use_empty())
6473 callSite->replaceAllUsesWith(newCall);
6476 if (callSite->getDebugLoc())
6477 newCall->setDebugLoc(callSite->getDebugLoc());
6479 callSitesToBeRemovedFromParent.push_back(callSite);
6482 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6483 callSite->eraseFromParent();
6497 llvm::Function *NewFn) {
6507 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6519void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6520 llvm::GlobalValue *GV) {
6528 if (!GV || (GV->getValueType() != Ty))
6534 if (!GV->isDeclaration())
6553 setNonAliasAttributes(GD, Fn);
6555 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
6556 (CodeGenOpts.OptimizationLevel == 0) &&
6559 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
6561 !D->
hasAttr<NoInlineAttr>() &&
6562 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
6563 !D->
hasAttr<OptimizeNoneAttr>() &&
6564 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
6565 !ShouldAddOptNone) {
6566 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
6572 auto GetPriority = [
this](
const auto *
Attr) ->
int {
6577 return Attr->DefaultPriority;
6580 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
6582 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
6588void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
6590 const AliasAttr *AA = D->
getAttr<AliasAttr>();
6591 assert(AA &&
"Not an alias?");
6595 if (AA->getAliasee() == MangledName) {
6596 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6603 if (Entry && !Entry->isDeclaration())
6606 Aliases.push_back(GD);
6612 llvm::Constant *Aliasee;
6613 llvm::GlobalValue::LinkageTypes
LT;
6615 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6621 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6628 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6630 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
6633 if (GA->getAliasee() == Entry) {
6634 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6638 assert(Entry->isDeclaration());
6647 GA->takeName(Entry);
6649 Entry->replaceAllUsesWith(GA);
6650 Entry->eraseFromParent();
6652 GA->setName(MangledName);
6660 GA->setLinkage(llvm::Function::WeakAnyLinkage);
6663 if (
const auto *VD = dyn_cast<VarDecl>(D))
6664 if (VD->getTLSKind())
6675void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
6677 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
6678 assert(IFA &&
"Not an ifunc?");
6682 if (IFA->getResolver() == MangledName) {
6683 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6689 if (Entry && !Entry->isDeclaration()) {
6692 DiagnosedConflictingDefinitions.insert(GD).second) {
6693 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
6696 diag::note_previous_definition);
6701 Aliases.push_back(GD);
6707 llvm::Constant *Resolver =
6708 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
6712 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
6713 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
6715 if (GIF->getResolver() == Entry) {
6716 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6719 assert(Entry->isDeclaration());
6728 GIF->takeName(Entry);
6730 Entry->replaceAllUsesWith(GIF);
6731 Entry->eraseFromParent();
6733 GIF->setName(MangledName);
6739 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
6740 (llvm::Intrinsic::ID)IID, Tys);
6743static llvm::StringMapEntry<llvm::GlobalVariable *> &
6746 bool &IsUTF16,
unsigned &StringLength) {
6747 StringRef String = Literal->getString();
6748 unsigned NumBytes = String.size();
6751 if (!Literal->containsNonAsciiOrNull()) {
6752 StringLength = NumBytes;
6753 return *Map.insert(std::make_pair(String,
nullptr)).first;
6760 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
6761 llvm::UTF16 *ToPtr = &ToBuf[0];
6763 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
6764 ToPtr + NumBytes, llvm::strictConversion);
6767 StringLength = ToPtr - &ToBuf[0];
6771 return *Map.insert(std::make_pair(
6772 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
6773 (StringLength + 1) * 2),
6779 unsigned StringLength = 0;
6780 bool isUTF16 =
false;
6781 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
6786 if (
auto *
C = Entry.second)
6791 const llvm::Triple &Triple =
getTriple();
6794 const bool IsSwiftABI =
6795 static_cast<unsigned>(CFRuntime) >=
6800 if (!CFConstantStringClassRef) {
6801 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
6803 Ty = llvm::ArrayType::get(Ty, 0);
6805 switch (CFRuntime) {
6809 CFConstantStringClassName =
6810 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
6811 :
"$s10Foundation19_NSCFConstantStringCN";
6815 CFConstantStringClassName =
6816 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
6817 :
"$S10Foundation19_NSCFConstantStringCN";
6821 CFConstantStringClassName =
6822 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
6823 :
"__T010Foundation19_NSCFConstantStringCN";
6830 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
6831 llvm::GlobalValue *GV =
nullptr;
6833 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
6840 if ((VD = dyn_cast<VarDecl>(
Result)))
6843 if (Triple.isOSBinFormatELF()) {
6845 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6847 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6848 if (!VD || !VD->
hasAttr<DLLExportAttr>())
6849 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6851 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6859 CFConstantStringClassRef =
6860 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
6863 QualType CFTy = Context.getCFConstantStringType();
6868 auto Fields = Builder.beginStruct(STy);
6877 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
6878 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
6880 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
6884 llvm::Constant *
C =
nullptr;
6887 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
6888 Entry.first().size() / 2);
6889 C = llvm::ConstantDataArray::get(VMContext, Arr);
6891 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
6897 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
6898 llvm::GlobalValue::PrivateLinkage,
C,
".str");
6899 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
6902 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
6903 : Context.getTypeAlignInChars(Context.CharTy);
6909 if (Triple.isOSBinFormatMachO())
6910 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
6911 :
"__TEXT,__cstring,cstring_literals");
6914 else if (Triple.isOSBinFormatELF())
6915 GV->setSection(
".rodata");
6921 llvm::IntegerType *LengthTy =
6931 Fields.addInt(LengthTy, StringLength);
6939 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
6941 llvm::GlobalVariable::PrivateLinkage);
6942 GV->addAttribute(
"objc_arc_inert");
6943 switch (Triple.getObjectFormat()) {
6944 case llvm::Triple::UnknownObjectFormat:
6945 llvm_unreachable(
"unknown file format");
6946 case llvm::Triple::DXContainer:
6947 case llvm::Triple::GOFF:
6948 case llvm::Triple::SPIRV:
6949 case llvm::Triple::XCOFF:
6950 llvm_unreachable(
"unimplemented");
6951 case llvm::Triple::COFF:
6952 case llvm::Triple::ELF:
6953 case llvm::Triple::Wasm:
6954 GV->setSection(
"cfstring");
6956 case llvm::Triple::MachO:
6957 GV->setSection(
"__DATA,__cfstring");
6966 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
6970 if (ObjCFastEnumerationStateType.isNull()) {
6971 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
6975 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
6976 Context.getPointerType(Context.UnsignedLongTy),
6977 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
6980 for (
size_t i = 0; i < 4; ++i) {
6985 FieldTypes[i],
nullptr,
6994 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
6997 return ObjCFastEnumerationStateType;
7011 assert(CAT &&
"String literal not of constant array type!");
7013 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7017 llvm::Type *ElemTy = AType->getElementType();
7018 unsigned NumElements = AType->getNumElements();
7021 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7023 Elements.reserve(NumElements);
7025 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7027 Elements.resize(NumElements);
7028 return llvm::ConstantDataArray::get(VMContext, Elements);
7031 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7033 Elements.reserve(NumElements);
7035 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7037 Elements.resize(NumElements);
7038 return llvm::ConstantDataArray::get(VMContext, Elements);
7041static llvm::GlobalVariable *
7050 auto *GV =
new llvm::GlobalVariable(
7051 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7052 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7054 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7055 if (GV->isWeakForLinker()) {
7056 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7057 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7073 llvm::GlobalVariable **Entry =
nullptr;
7074 if (!LangOpts.WritableStrings) {
7075 Entry = &ConstantStringMap[
C];
7076 if (
auto GV = *Entry) {
7077 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7080 GV->getValueType(), Alignment);
7085 StringRef GlobalVariableName;
7086 llvm::GlobalValue::LinkageTypes LT;
7091 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7092 !LangOpts.WritableStrings) {
7093 llvm::raw_svector_ostream Out(MangledNameBuffer);
7095 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7096 GlobalVariableName = MangledNameBuffer;
7098 LT = llvm::GlobalValue::PrivateLinkage;
7099 GlobalVariableName = Name;
7111 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7114 GV->getValueType(), Alignment);
7131 StringRef GlobalName) {
7132 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7137 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7140 llvm::GlobalVariable **Entry =
nullptr;
7141 if (!LangOpts.WritableStrings) {
7142 Entry = &ConstantStringMap[
C];
7143 if (
auto GV = *Entry) {
7144 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7147 GV->getValueType(), Alignment);
7153 GlobalName, Alignment);
7158 GV->getValueType(), Alignment);
7171 MaterializedType = E->
getType();
7175 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7176 if (!InsertResult.second) {
7179 if (!InsertResult.first->second) {
7184 InsertResult.first->second =
new llvm::GlobalVariable(
7185 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7189 llvm::cast<llvm::GlobalVariable>(
7190 InsertResult.first->second->stripPointerCasts())
7199 llvm::raw_svector_ostream Out(Name);
7221 std::optional<ConstantEmitter> emitter;
7222 llvm::Constant *InitialValue =
nullptr;
7223 bool Constant =
false;
7227 emitter.emplace(*
this);
7228 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7233 Type = InitialValue->getType();
7242 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7244 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7248 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7252 Linkage = llvm::GlobalVariable::InternalLinkage;
7256 auto *GV =
new llvm::GlobalVariable(
7258 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7259 if (emitter) emitter->finalize(GV);
7261 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7263 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7265 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7269 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7270 if (VD->getTLSKind())
7272 llvm::Constant *CV = GV;
7275 *
this, GV, AddrSpace,
7276 llvm::PointerType::get(
7282 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7284 Entry->replaceAllUsesWith(CV);
7285 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7294void CodeGenModule::EmitObjCPropertyImplementations(
const
7307 if (!Getter || Getter->isSynthesizedAccessorStub())
7310 auto *Setter = PID->getSetterMethodDecl();
7311 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7322 if (ivar->getType().isDestructedType())
7343void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7356 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7371 getContext().getObjCIdType(),
nullptr, D,
true,
7377 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7382void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7389 EmitDeclContext(LSD);
7392void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7394 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7397 std::unique_ptr<CodeGenFunction> &CurCGF =
7398 GlobalTopLevelStmtBlockInFlight.first;
7402 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7410 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7411 FunctionArgList Args;
7413 const CGFunctionInfo &FnInfo =
7416 llvm::Function *
Fn = llvm::Function::Create(
7417 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7419 CurCGF.reset(
new CodeGenFunction(*
this));
7420 GlobalTopLevelStmtBlockInFlight.second = D;
7421 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7423 CXXGlobalInits.push_back(Fn);
7426 CurCGF->EmitStmt(D->
getStmt());
7429void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7430 for (
auto *I : DC->
decls()) {
7436 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7437 for (
auto *M : OID->methods())
7456 case Decl::CXXConversion:
7457 case Decl::CXXMethod:
7458 case Decl::Function:
7465 case Decl::CXXDeductionGuide:
7470 case Decl::Decomposition:
7471 case Decl::VarTemplateSpecialization:
7473 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
7474 for (
auto *B : DD->flat_bindings())
7475 if (
auto *HD = B->getHoldingVar())
7482 case Decl::IndirectField:
7486 case Decl::Namespace:
7489 case Decl::ClassTemplateSpecialization: {
7492 if (Spec->getSpecializationKind() ==
7494 Spec->hasDefinition())
7495 DI->completeTemplateDefinition(*Spec);
7497 case Decl::CXXRecord: {
7501 DI->EmitAndRetainType(
7505 DI->completeUnusedClass(*CRD);
7508 for (
auto *I : CRD->
decls())
7514 case Decl::UsingShadow:
7515 case Decl::ClassTemplate:
7516 case Decl::VarTemplate:
7518 case Decl::VarTemplatePartialSpecialization:
7519 case Decl::FunctionTemplate:
7520 case Decl::TypeAliasTemplate:
7529 case Decl::UsingEnum:
7533 case Decl::NamespaceAlias:
7537 case Decl::UsingDirective:
7541 case Decl::CXXConstructor:
7544 case Decl::CXXDestructor:
7548 case Decl::StaticAssert:
7555 case Decl::ObjCInterface:
7556 case Decl::ObjCCategory:
7559 case Decl::ObjCProtocol: {
7561 if (Proto->isThisDeclarationADefinition())
7562 ObjCRuntime->GenerateProtocol(Proto);
7566 case Decl::ObjCCategoryImpl:
7572 case Decl::ObjCImplementation: {
7574 EmitObjCPropertyImplementations(OMD);
7575 EmitObjCIvarInitializations(OMD);
7576 ObjCRuntime->GenerateClass(OMD);
7580 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7581 OMD->getClassInterface()), OMD->getLocation());
7584 case Decl::ObjCMethod: {
7591 case Decl::ObjCCompatibleAlias:
7595 case Decl::PragmaComment: {
7597 switch (PCD->getCommentKind()) {
7599 llvm_unreachable(
"unexpected pragma comment kind");
7614 case Decl::PragmaDetectMismatch: {
7620 case Decl::LinkageSpec:
7624 case Decl::FileScopeAsm: {
7626 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7629 if (LangOpts.OpenMPIsTargetDevice)
7632 if (LangOpts.SYCLIsDevice)
7635 getModule().appendModuleInlineAsm(AD->getAsmString());
7639 case Decl::TopLevelStmt:
7643 case Decl::Import: {
7647 if (!ImportedModules.insert(Import->getImportedModule()))
7651 if (!Import->getImportedOwningModule()) {
7653 DI->EmitImportDecl(*Import);
7659 if (CXX20ModuleInits && Import->getImportedModule() &&
7660 Import->getImportedModule()->isNamedModule())
7669 Visited.insert(Import->getImportedModule());
7670 Stack.push_back(Import->getImportedModule());
7672 while (!Stack.empty()) {
7674 if (!EmittedModuleInitializers.insert(Mod).second)
7677 for (
auto *D : Context.getModuleInitializers(Mod))
7684 if (Submodule->IsExplicit)
7687 if (Visited.insert(Submodule).second)
7688 Stack.push_back(Submodule);
7698 case Decl::OMPThreadPrivate:
7702 case Decl::OMPAllocate:
7706 case Decl::OMPDeclareReduction:
7710 case Decl::OMPDeclareMapper:
7714 case Decl::OMPRequires:
7719 case Decl::TypeAlias:
7721 DI->EmitAndRetainType(
getContext().getTypedefType(
7729 DI->EmitAndRetainType(
7736 DI->EmitAndRetainType(
7740 case Decl::HLSLRootSignature:
7743 case Decl::HLSLBuffer:
7747 case Decl::OpenACCDeclare:
7750 case Decl::OpenACCRoutine:
7765 if (!CodeGenOpts.CoverageMapping)
7768 case Decl::CXXConversion:
7769 case Decl::CXXMethod:
7770 case Decl::Function:
7771 case Decl::ObjCMethod:
7772 case Decl::CXXConstructor:
7773 case Decl::CXXDestructor: {
7782 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
7792 if (!CodeGenOpts.CoverageMapping)
7794 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
7795 if (Fn->isTemplateInstantiation())
7798 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
7806 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
7809 const Decl *D = Entry.first;
7811 case Decl::CXXConversion:
7812 case Decl::CXXMethod:
7813 case Decl::Function:
7814 case Decl::ObjCMethod: {
7821 case Decl::CXXConstructor: {
7828 case Decl::CXXDestructor: {
7845 if (llvm::Function *F =
getModule().getFunction(
"main")) {
7846 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
7847 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
7848 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
7849 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
7858 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
7859 return llvm::ConstantInt::get(i64, PtrInt);
7863 llvm::NamedMDNode *&GlobalMetadata,
7865 llvm::GlobalValue *
Addr) {
7866 if (!GlobalMetadata)
7868 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
7871 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
7874 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
7877bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
7878 llvm::GlobalValue *CppFunc) {
7880 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
7883 llvm::SmallVector<llvm::ConstantExpr *> CEs;
7886 if (Elem == CppFunc)
7892 for (llvm::User *User : Elem->users()) {
7896 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
7897 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
7900 for (llvm::User *CEUser : ConstExpr->users()) {
7901 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
7902 IFuncs.push_back(IFunc);
7907 CEs.push_back(ConstExpr);
7908 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
7909 IFuncs.push_back(IFunc);
7921 for (llvm::GlobalIFunc *IFunc : IFuncs)
7922 IFunc->setResolver(
nullptr);
7923 for (llvm::ConstantExpr *ConstExpr : CEs)
7924 ConstExpr->destroyConstant();
7928 Elem->eraseFromParent();
7930 for (llvm::GlobalIFunc *IFunc : IFuncs) {
7935 llvm::FunctionType::get(IFunc->getType(),
false);
7936 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
7937 CppFunc->getName(), ResolverTy, {},
false);
7938 IFunc->setResolver(Resolver);
7948void CodeGenModule::EmitStaticExternCAliases() {
7951 for (
auto &I : StaticExternCValues) {
7952 const IdentifierInfo *Name = I.first;
7953 llvm::GlobalValue *Val = I.second;
7961 llvm::GlobalValue *ExistingElem =
7966 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
7973 auto Res = Manglings.find(MangledName);
7974 if (Res == Manglings.end())
7976 Result = Res->getValue();
7987void CodeGenModule::EmitDeclMetadata() {
7988 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7990 for (
auto &I : MangledDeclNames) {
7991 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8001void CodeGenFunction::EmitDeclMetadata() {
8002 if (LocalDeclMap.empty())
return;
8007 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8009 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8011 for (
auto &I : LocalDeclMap) {
8012 const Decl *D = I.first;
8013 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8014 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8016 Alloca->setMetadata(
8017 DeclPtrKind, llvm::MDNode::get(
8018 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8019 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8026void CodeGenModule::EmitVersionIdentMetadata() {
8027 llvm::NamedMDNode *IdentMetadata =
8028 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8030 llvm::LLVMContext &Ctx = TheModule.getContext();
8032 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8033 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8036void CodeGenModule::EmitCommandLineMetadata() {
8037 llvm::NamedMDNode *CommandLineMetadata =
8038 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8040 llvm::LLVMContext &Ctx = TheModule.getContext();
8042 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8043 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8046void CodeGenModule::EmitCoverageFile() {
8047 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8051 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8052 llvm::LLVMContext &Ctx = TheModule.getContext();
8053 auto *CoverageDataFile =
8055 auto *CoverageNotesFile =
8057 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8058 llvm::MDNode *CU = CUNode->getOperand(i);
8059 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8060 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8073 LangOpts.ObjCRuntime.isGNUFamily())
8074 return ObjCRuntime->GetEHType(Ty);
8081 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8083 for (
auto RefExpr : D->
varlist()) {
8086 VD->getAnyInitializer() &&
8087 !VD->getAnyInitializer()->isConstantInitializer(
getContext(),
8094 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8095 CXXGlobalInits.push_back(InitFunction);
8100CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
8104 FnType->getReturnType(), FnType->getParamTypes(),
8105 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8107 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
8112 std::string OutName;
8113 llvm::raw_string_ostream Out(OutName);
8118 Out <<
".normalized";
8141 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
8146 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
8150 return CreateMetadataIdentifierImpl(
T, GeneralizedMetadataIdMap,
8158 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8159 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8160 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8161 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8162 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8163 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8164 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8165 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8173 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8175 if (CodeGenOpts.SanitizeCfiCrossDso)
8177 VTable->addTypeMetadata(Offset.getQuantity(),
8178 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8181 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8182 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8188 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8198 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8213 bool forPointeeType) {
8224 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8231 bool AlignForArray =
T->isArrayType();
8237 if (
T->isIncompleteType()) {
8254 if (
T.getQualifiers().hasUnaligned()) {
8256 }
else if (forPointeeType && !AlignForArray &&
8257 (RD =
T->getAsCXXRecordDecl())) {
8268 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8281 if (NumAutoVarInit >= StopAfter) {
8284 if (!NumAutoVarInit) {
8298 const Decl *D)
const {
8302 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8304 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8310 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8314 llvm::MD5::MD5Result
Result;
8315 for (
const auto &Arg : PreprocessorOpts.Macros)
8316 Hash.update(Arg.first);
8320 llvm::sys::fs::UniqueID ID;
8324 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8328 SM.getDiagnostics().Report(diag::err_cannot_open_file)
8329 << PLoc.
getFilename() << Status.getError().message();
8331 ID = Status->getUniqueID();
8333 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8334 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8341 assert(DeferredDeclsToEmit.empty() &&
8342 "Should have emitted all decls deferred to emit.");
8343 assert(NewBuilder->DeferredDecls.empty() &&
8344 "Newly created module should not have deferred decls");
8345 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8346 assert(EmittedDeferredDecls.empty() &&
8347 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8349 assert(NewBuilder->DeferredVTables.empty() &&
8350 "Newly created module should not have deferred vtables");
8351 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8353 assert(NewBuilder->MangledDeclNames.empty() &&
8354 "Newly created module should not have mangled decl names");
8355 assert(NewBuilder->Manglings.empty() &&
8356 "Newly created module should not have manglings");
8357 NewBuilder->Manglings = std::move(Manglings);
8359 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8361 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 void setWindowsItaniumDLLImport(CIRGenModule &cgm, bool isLocal, cir::FuncOp funcOp, StringRef name)
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 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.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Defines the clang::TargetInfo interface.
std::unique_ptr< TargetCodeGenInfo > createARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createM68kTargetCodeGenInfo(CodeGenModule &CGM)
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
std::unique_ptr< TargetCodeGenInfo > createBPFTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createMSP430TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createWebAssemblyTargetCodeGenInfo(CodeGenModule &CGM, WebAssemblyABIKind K)
std::unique_ptr< TargetCodeGenInfo > createPPC64_SVR4_TargetCodeGenInfo(CodeGenModule &CGM, PPC64_SVR4_ABIKind Kind, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createHexagonTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createNVPTXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createSystemZTargetCodeGenInfo(CodeGenModule &CGM, bool HasVector, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createWinX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters)
std::unique_ptr< TargetCodeGenInfo > createAIXTargetCodeGenInfo(CodeGenModule &CGM, bool Is64Bit)
std::unique_ptr< TargetCodeGenInfo > createAMDGPUTargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateMacObjCRuntime(CodeGenModule &CGM)
X86AVXABILevel
The AVX ABI level for X86 targets.
std::unique_ptr< TargetCodeGenInfo > createTCETargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateGNUObjCRuntime(CodeGenModule &CGM)
Creates an instance of an Objective-C runtime class.
std::unique_ptr< TargetCodeGenInfo > createWindowsARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind K)
std::unique_ptr< TargetCodeGenInfo > createAVRTargetCodeGenInfo(CodeGenModule &CGM, unsigned NPR, unsigned NRR)
std::unique_ptr< TargetCodeGenInfo > createDirectXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createARCTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createDefaultTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createSPIRVTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createSparcV8TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createVETargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCommonSPIRTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createRISCVTargetCodeGenInfo(CodeGenModule &CGM, unsigned XLen, unsigned FLen, bool EABI)
std::unique_ptr< TargetCodeGenInfo > createWindowsAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind K)
std::unique_ptr< TargetCodeGenInfo > createSparcV9TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createLanaiTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createPPC32TargetCodeGenInfo(CodeGenModule &CGM, bool SoftFloatABI)
CGCUDARuntime * CreateNVCUDARuntime(CodeGenModule &CGM)
Creates an instance of a CUDA runtime class.
std::unique_ptr< TargetCodeGenInfo > createLoongArchTargetCodeGenInfo(CodeGenModule &CGM, unsigned GRLen, unsigned FLen)
std::unique_ptr< TargetCodeGenInfo > createPPC64TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWinX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createXCoreTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCSKYTargetCodeGenInfo(CodeGenModule &CGM, unsigned FLen)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
constexpr bool isInitializedByPipeline(LangAS AS)
bool LT(InterpState &S, CodePtr OpPC)
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
@ Ctor_Base
Base object ctor.
@ Ctor_Complete
Complete object ctor.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
std::string getClangVendor()
Retrieves the Clang vendor tag.
@ ICIS_NoInit
No in-class initializer.
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
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.