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/Frontend/OpenMP/OMPIRBuilder.h"
55#include "llvm/IR/AttributeMask.h"
56#include "llvm/IR/CallingConv.h"
57#include "llvm/IR/DataLayout.h"
58#include "llvm/IR/Intrinsics.h"
59#include "llvm/IR/LLVMContext.h"
60#include "llvm/IR/Module.h"
61#include "llvm/IR/ProfileSummary.h"
62#include "llvm/ProfileData/InstrProfReader.h"
63#include "llvm/ProfileData/SampleProf.h"
64#include "llvm/Support/CRC.h"
65#include "llvm/Support/CodeGen.h"
66#include "llvm/Support/CommandLine.h"
67#include "llvm/Support/ConvertUTF.h"
68#include "llvm/Support/ErrorHandling.h"
69#include "llvm/Support/TimeProfiler.h"
70#include "llvm/Support/xxhash.h"
71#include "llvm/TargetParser/Triple.h"
72#include "llvm/TargetParser/X86TargetParser.h"
76using namespace CodeGen;
79 "limited-coverage-experimental", llvm::cl::Hidden,
80 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
86 case TargetCXXABI::AppleARM64:
87 case TargetCXXABI::Fuchsia:
88 case TargetCXXABI::GenericAArch64:
89 case TargetCXXABI::GenericARM:
90 case TargetCXXABI::iOS:
91 case TargetCXXABI::WatchOS:
92 case TargetCXXABI::GenericMIPS:
93 case TargetCXXABI::GenericItanium:
94 case TargetCXXABI::WebAssembly:
95 case TargetCXXABI::XL:
97 case TargetCXXABI::Microsoft:
101 llvm_unreachable(
"invalid C++ ABI kind");
104static std::unique_ptr<TargetCodeGenInfo>
107 const llvm::Triple &Triple =
Target.getTriple();
110 switch (Triple.getArch()) {
114 case llvm::Triple::le32:
116 case llvm::Triple::m68k:
118 case llvm::Triple::mips:
119 case llvm::Triple::mipsel:
120 if (Triple.getOS() == llvm::Triple::NaCl)
124 case llvm::Triple::mips64:
125 case llvm::Triple::mips64el:
128 case llvm::Triple::avr: {
132 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
133 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
137 case llvm::Triple::aarch64:
138 case llvm::Triple::aarch64_32:
139 case llvm::Triple::aarch64_be: {
141 if (
Target.getABI() ==
"darwinpcs")
142 Kind = AArch64ABIKind::DarwinPCS;
143 else if (Triple.isOSWindows())
149 case llvm::Triple::wasm32:
150 case llvm::Triple::wasm64: {
152 if (
Target.getABI() ==
"experimental-mv")
153 Kind = WebAssemblyABIKind::ExperimentalMV;
157 case llvm::Triple::arm:
158 case llvm::Triple::armeb:
159 case llvm::Triple::thumb:
160 case llvm::Triple::thumbeb: {
161 if (Triple.getOS() == llvm::Triple::Win32)
165 StringRef ABIStr =
Target.getABI();
166 if (ABIStr ==
"apcs-gnu")
167 Kind = ARMABIKind::APCS;
168 else if (ABIStr ==
"aapcs16")
169 Kind = ARMABIKind::AAPCS16_VFP;
170 else if (CodeGenOpts.
FloatABI ==
"hard" ||
172 (Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
173 Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
174 Triple.getEnvironment() == llvm::Triple::EABIHF)))
175 Kind = ARMABIKind::AAPCS_VFP;
180 case llvm::Triple::ppc: {
181 if (Triple.isOSAIX())
188 case llvm::Triple::ppcle: {
189 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
192 case llvm::Triple::ppc64:
193 if (Triple.isOSAIX())
196 if (Triple.isOSBinFormatELF()) {
198 if (
Target.getABI() ==
"elfv2")
199 Kind = PPC64_SVR4_ABIKind::ELFv2;
200 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
205 case llvm::Triple::ppc64le: {
206 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
208 if (
Target.getABI() ==
"elfv1")
209 Kind = PPC64_SVR4_ABIKind::ELFv1;
210 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
215 case llvm::Triple::nvptx:
216 case llvm::Triple::nvptx64:
219 case llvm::Triple::msp430:
222 case llvm::Triple::riscv32:
223 case llvm::Triple::riscv64: {
224 StringRef ABIStr =
Target.getABI();
225 unsigned XLen =
Target.getPointerWidth(LangAS::Default);
226 unsigned ABIFLen = 0;
227 if (ABIStr.endswith(
"f"))
229 else if (ABIStr.endswith(
"d"))
234 case llvm::Triple::systemz: {
235 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
236 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
240 case llvm::Triple::tce:
241 case llvm::Triple::tcele:
244 case llvm::Triple::x86: {
245 bool IsDarwinVectorABI = Triple.isOSDarwin();
246 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
248 if (Triple.getOS() == llvm::Triple::Win32) {
250 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
251 CodeGenOpts.NumRegisterParameters);
254 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
255 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
258 case llvm::Triple::x86_64: {
259 StringRef ABI =
Target.getABI();
260 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
261 : ABI ==
"avx" ? X86AVXABILevel::AVX
262 : X86AVXABILevel::None);
264 switch (Triple.getOS()) {
265 case llvm::Triple::Win32:
271 case llvm::Triple::hexagon:
273 case llvm::Triple::lanai:
275 case llvm::Triple::r600:
277 case llvm::Triple::amdgcn:
279 case llvm::Triple::sparc:
281 case llvm::Triple::sparcv9:
283 case llvm::Triple::xcore:
285 case llvm::Triple::arc:
287 case llvm::Triple::spir:
288 case llvm::Triple::spir64:
290 case llvm::Triple::spirv32:
291 case llvm::Triple::spirv64:
293 case llvm::Triple::ve:
295 case llvm::Triple::csky: {
296 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
298 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
303 case llvm::Triple::bpfeb:
304 case llvm::Triple::bpfel:
306 case llvm::Triple::loongarch32:
307 case llvm::Triple::loongarch64: {
308 StringRef ABIStr =
Target.getABI();
309 unsigned ABIFRLen = 0;
310 if (ABIStr.endswith(
"f"))
312 else if (ABIStr.endswith(
"d"))
315 CGM,
Target.getPointerWidth(LangAS::Default), ABIFRLen);
321 if (!TheTargetCodeGenInfo)
323 return *TheTargetCodeGenInfo;
333 : Context(
C), LangOpts(
C.getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
334 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
336 VMContext(M.getContext()), Types(*this), VTables(*this),
340 llvm::LLVMContext &LLVMContext = M.getContext();
341 VoidTy = llvm::Type::getVoidTy(LLVMContext);
342 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
343 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
344 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
345 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
346 HalfTy = llvm::Type::getHalfTy(LLVMContext);
347 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
348 FloatTy = llvm::Type::getFloatTy(LLVMContext);
349 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
355 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
357 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
359 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
360 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
361 IntPtrTy = llvm::IntegerType::get(LLVMContext,
362 C.getTargetInfo().getMaxPointerWidth());
363 Int8PtrTy = llvm::PointerType::get(LLVMContext, 0);
364 const llvm::DataLayout &DL = M.getDataLayout();
366 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
368 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
385 createOpenCLRuntime();
387 createOpenMPRuntime();
394 if (LangOpts.
Sanitize.
has(SanitizerKind::Thread) ||
395 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
401 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
406 Block.GlobalUniqueCount = 0;
408 if (
C.getLangOpts().ObjC)
412 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
419 PGOReader = std::move(ReaderOrErr.get());
424 if (CodeGenOpts.CoverageMapping)
428 if (CodeGenOpts.UniqueInternalLinkageNames &&
429 !
getModule().getSourceFileName().empty()) {
430 std::string Path =
getModule().getSourceFileName();
433 if (Path.rfind(Entry.first, 0) != std::string::npos) {
434 Path = Entry.second + Path.substr(Entry.first.size());
437 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
443void CodeGenModule::createObjCRuntime() {
460 llvm_unreachable(
"bad runtime kind");
463void CodeGenModule::createOpenCLRuntime() {
467void CodeGenModule::createOpenMPRuntime() {
471 case llvm::Triple::nvptx:
472 case llvm::Triple::nvptx64:
473 case llvm::Triple::amdgcn:
475 "OpenMP AMDGPU/NVPTX is only prepared to deal with device code.");
479 if (LangOpts.OpenMPSimd)
487void CodeGenModule::createCUDARuntime() {
491void CodeGenModule::createHLSLRuntime() {
496 Replacements[Name] =
C;
499void CodeGenModule::applyReplacements() {
500 for (
auto &I : Replacements) {
501 StringRef MangledName = I.first;
502 llvm::Constant *Replacement = I.second;
506 auto *OldF = cast<llvm::Function>(Entry);
507 auto *NewF = dyn_cast<llvm::Function>(Replacement);
509 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
510 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
512 auto *CE = cast<llvm::ConstantExpr>(Replacement);
513 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
514 CE->getOpcode() == llvm::Instruction::GetElementPtr);
515 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
520 OldF->replaceAllUsesWith(Replacement);
522 NewF->removeFromParent();
523 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
526 OldF->eraseFromParent();
531 GlobalValReplacements.push_back(std::make_pair(GV,
C));
534void CodeGenModule::applyGlobalValReplacements() {
535 for (
auto &I : GlobalValReplacements) {
536 llvm::GlobalValue *GV = I.first;
537 llvm::Constant *
C = I.second;
539 GV->replaceAllUsesWith(
C);
540 GV->eraseFromParent();
547 const llvm::Constant *
C;
548 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
549 C = GA->getAliasee();
550 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
551 C = GI->getResolver();
555 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
559 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
568 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
569 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
573 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
577 if (GV->hasCommonLinkage()) {
579 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
580 Diags.
Report(Location, diag::err_alias_to_common);
585 if (GV->isDeclaration()) {
586 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
587 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
588 << IsIFunc << IsIFunc;
591 for (
const auto &[
Decl, Name] : MangledDeclNames) {
592 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
593 if (ND->getName() == GV->getName()) {
594 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
598 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
608 const auto *F = dyn_cast<llvm::Function>(GV);
610 Diags.
Report(Location, diag::err_alias_to_undefined)
611 << IsIFunc << IsIFunc;
615 llvm::FunctionType *FTy = F->getFunctionType();
616 if (!FTy->getReturnType()->isPointerTy()) {
617 Diags.
Report(Location, diag::err_ifunc_resolver_return);
625void CodeGenModule::checkAliases() {
632 const auto *D = cast<ValueDecl>(GD.getDecl());
635 bool IsIFunc = D->hasAttr<IFuncAttr>();
636 if (
const Attr *A = D->getDefiningAttr()) {
637 Location = A->getLocation();
638 Range = A->getRange();
640 llvm_unreachable(
"Not an alias or ifunc?");
644 const llvm::GlobalValue *GV =
nullptr;
646 MangledDeclNames, Range)) {
651 llvm::Constant *Aliasee =
652 IsIFunc ? cast<llvm::GlobalIFunc>(Alias)->getResolver()
653 : cast<llvm::GlobalAlias>(Alias)->getAliasee();
655 llvm::GlobalValue *AliaseeGV;
656 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
657 AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0));
659 AliaseeGV = cast<llvm::GlobalValue>(Aliasee);
661 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
662 StringRef AliasSection = SA->getName();
663 if (AliasSection != AliaseeGV->getSection())
664 Diags.
Report(SA->getLocation(), diag::warn_alias_with_section)
665 << AliasSection << IsIFunc << IsIFunc;
673 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
674 if (GA->isInterposable()) {
675 Diags.
Report(Location, diag::warn_alias_to_weak_alias)
676 << GV->getName() << GA->getName() << IsIFunc;
677 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
678 GA->getAliasee(), Alias->getType());
681 cast<llvm::GlobalIFunc>(Alias)->setResolver(Aliasee);
683 cast<llvm::GlobalAlias>(Alias)->setAliasee(Aliasee);
693 Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType()));
694 Alias->eraseFromParent();
699 DeferredDeclsToEmit.clear();
700 EmittedDeferredDecls.clear();
702 OpenMPRuntime->clear();
706 StringRef MainFile) {
709 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
710 if (MainFile.empty())
711 MainFile =
"<stdin>";
712 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
715 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
718 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
724 if (!LO.VisibilityFromDLLStorageClass)
727 llvm::GlobalValue::VisibilityTypes DLLExportVisibility =
729 llvm::GlobalValue::VisibilityTypes NoDLLStorageClassVisibility =
731 llvm::GlobalValue::VisibilityTypes ExternDeclDLLImportVisibility =
733 llvm::GlobalValue::VisibilityTypes ExternDeclNoDLLStorageClassVisibility =
735 LO.getExternDeclNoDLLStorageClassVisibility());
737 for (llvm::GlobalValue &GV : M.global_values()) {
738 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
746 GV.setDSOLocal(
false);
748 if (GV.isDeclarationForLinker()) {
749 GV.setVisibility(GV.getDLLStorageClass() ==
750 llvm::GlobalValue::DLLImportStorageClass
751 ? ExternDeclDLLImportVisibility
752 : ExternDeclNoDLLStorageClassVisibility);
754 GV.setVisibility(GV.getDLLStorageClass() ==
755 llvm::GlobalValue::DLLExportStorageClass
756 ? DLLExportVisibility
757 : NoDLLStorageClassVisibility);
760 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
767 EmitModuleInitializers(Primary);
769 DeferredDecls.insert(EmittedDeferredDecls.begin(),
770 EmittedDeferredDecls.end());
771 EmittedDeferredDecls.clear();
772 EmitVTablesOpportunistically();
773 applyGlobalValReplacements();
775 emitMultiVersionFunctions();
778 GlobalTopLevelStmtBlockInFlight.first) {
780 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
781 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
787 EmitCXXModuleInitFunc(Primary);
789 EmitCXXGlobalInitFunc();
790 EmitCXXGlobalCleanUpFunc();
791 registerGlobalDtorsWithAtExit();
792 EmitCXXThreadLocalInitFunc();
794 if (llvm::Function *ObjCInitFunction =
ObjCRuntime->ModuleInitFunction())
795 AddGlobalCtor(ObjCInitFunction);
797 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
798 AddGlobalCtor(CudaCtorFunction);
801 if (llvm::Function *OpenMPRequiresDirectiveRegFun =
802 OpenMPRuntime->emitRequiresDirectiveRegFun()) {
803 AddGlobalCtor(OpenMPRequiresDirectiveRegFun, 0);
805 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
806 OpenMPRuntime->clear();
810 PGOReader->getSummary(
false).getMD(VMContext),
811 llvm::ProfileSummary::PSK_Instr);
818 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
819 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
821 EmitStaticExternCAliases();
826 CoverageMapping->emit();
827 if (CodeGenOpts.SanitizeCfiCrossDso) {
833 emitAtAvailableLinkGuard();
840 if (
getTarget().getTargetOpts().CodeObjectVersion !=
842 getModule().addModuleFlag(llvm::Module::Error,
843 "amdgpu_code_object_version",
844 getTarget().getTargetOpts().CodeObjectVersion);
849 auto *MDStr = llvm::MDString::get(
854 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
867 if (
auto *FD = dyn_cast<FunctionDecl>(D))
871 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
875 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
877 auto *GV =
new llvm::GlobalVariable(
878 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
879 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
887 if (CodeGenOpts.Autolink &&
888 (Context.
getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
889 EmitModuleLinkOptions();
904 if (!ELFDependentLibraries.empty() && !Context.
getLangOpts().CUDAIsDevice) {
905 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
906 for (
auto *MD : ELFDependentLibraries)
912 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
913 CodeGenOpts.NumRegisterParameters);
915 if (CodeGenOpts.DwarfVersion) {
916 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
917 CodeGenOpts.DwarfVersion);
920 if (CodeGenOpts.Dwarf64)
921 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
925 getModule().setSemanticInterposition(
true);
927 if (CodeGenOpts.EmitCodeView) {
929 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
931 if (CodeGenOpts.CodeViewGHash) {
932 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
934 if (CodeGenOpts.ControlFlowGuard) {
936 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 2);
937 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
939 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 1);
941 if (CodeGenOpts.EHContGuard) {
943 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
947 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
949 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
954 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
956 llvm::Metadata *Ops[2] = {
957 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
958 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
959 llvm::Type::getInt32Ty(VMContext), 1))};
961 getModule().addModuleFlag(llvm::Module::Require,
962 "StrictVTablePointersRequirement",
963 llvm::MDNode::get(VMContext, Ops));
969 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
970 llvm::DEBUG_METADATA_VERSION);
975 uint64_t WCharWidth =
977 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
980 if ( Arch == llvm::Triple::arm
981 || Arch == llvm::Triple::armeb
982 || Arch == llvm::Triple::thumb
983 || Arch == llvm::Triple::thumbeb) {
985 uint64_t EnumWidth = Context.
getLangOpts().ShortEnums ? 1 : 4;
986 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
989 if (Arch == llvm::Triple::riscv32 || Arch == llvm::Triple::riscv64) {
990 StringRef ABIStr = Target.
getABI();
991 llvm::LLVMContext &Ctx = TheModule.getContext();
992 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
993 llvm::MDString::get(Ctx, ABIStr));
996 if (CodeGenOpts.SanitizeCfiCrossDso) {
998 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1001 if (CodeGenOpts.WholeProgramVTables) {
1005 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1006 CodeGenOpts.VirtualFunctionElimination);
1009 if (LangOpts.
Sanitize.
has(SanitizerKind::CFIICall)) {
1010 getModule().addModuleFlag(llvm::Module::Override,
1011 "CFI Canonical Jump Tables",
1012 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1016 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1019 if (CodeGenOpts.PatchableFunctionEntryOffset)
1020 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1021 CodeGenOpts.PatchableFunctionEntryOffset);
1024 if (CodeGenOpts.CFProtectionReturn &&
1027 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1031 if (CodeGenOpts.CFProtectionBranch &&
1034 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1038 if (CodeGenOpts.FunctionReturnThunks)
1039 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1041 if (CodeGenOpts.IndirectBranchCSPrefix)
1042 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1054 LangOpts.getSignReturnAddressScope() !=
1056 getModule().addModuleFlag(llvm::Module::Override,
1057 "sign-return-address-buildattr", 1);
1058 if (LangOpts.
Sanitize.
has(SanitizerKind::MemtagStack))
1059 getModule().addModuleFlag(llvm::Module::Override,
1060 "tag-stack-memory-buildattr", 1);
1062 if (Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
1063 Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
1064 Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_32 ||
1065 Arch == llvm::Triple::aarch64_be) {
1066 if (LangOpts.BranchTargetEnforcement)
1067 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1070 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 1);
1072 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1075 getModule().addModuleFlag(llvm::Module::Min,
1076 "sign-return-address-with-bkey", 1);
1080 llvm::LLVMContext &Ctx = TheModule.getContext();
1082 llvm::Module::Error,
"MemProfProfileFilename",
1086 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1090 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1092 llvm::DenormalMode::IEEE);
1095 if (LangOpts.EHAsynch)
1096 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1100 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1102 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1106 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1107 EmitOpenCLMetadata();
1115 llvm::Metadata *SPIRVerElts[] = {
1116 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1118 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1119 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1120 llvm::NamedMDNode *SPIRVerMD =
1121 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1122 llvm::LLVMContext &Ctx = TheModule.getContext();
1123 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1131 if (uint32_t PLevel = Context.
getLangOpts().PICLevel) {
1132 assert(PLevel < 3 &&
"Invalid PIC Level");
1133 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1135 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1139 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1140 .Case(
"tiny", llvm::CodeModel::Tiny)
1141 .Case(
"small", llvm::CodeModel::Small)
1142 .Case(
"kernel", llvm::CodeModel::Kernel)
1143 .Case(
"medium", llvm::CodeModel::Medium)
1144 .Case(
"large", llvm::CodeModel::Large)
1147 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1150 if (CM == llvm::CodeModel::Medium &&
1152 llvm::Triple::x86_64) {
1158 if (CodeGenOpts.NoPLT)
1161 CodeGenOpts.DirectAccessExternalData !=
1162 getModule().getDirectAccessExternalData()) {
1163 getModule().setDirectAccessExternalData(
1164 CodeGenOpts.DirectAccessExternalData);
1166 if (CodeGenOpts.UnwindTables)
1167 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1169 switch (CodeGenOpts.getFramePointer()) {
1174 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1177 getModule().setFramePointer(llvm::FramePointerKind::All);
1181 SimplifyPersonality();
1194 EmitVersionIdentMetadata();
1197 EmitCommandLineMetadata();
1205 getModule().setStackProtectorGuardSymbol(
1208 getModule().setStackProtectorGuardOffset(
1213 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1215 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1217 if (
getContext().getTargetInfo().getMaxTLSAlign())
1218 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1219 getContext().getTargetInfo().getMaxTLSAlign());
1237void CodeGenModule::EmitOpenCLMetadata() {
1242 llvm::Metadata *OCLVerElts[] = {
1243 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1245 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1246 Int32Ty, (Version % 100) / 10))};
1247 llvm::NamedMDNode *OCLVerMD =
1248 TheModule.getOrInsertNamedMetadata(
"opencl.ocl.version");
1249 llvm::LLVMContext &Ctx = TheModule.getContext();
1250 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1253void CodeGenModule::EmitBackendOptionsMetadata(
1256 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1257 CodeGenOpts.SmallDataLimit);
1274 return TBAA->getTypeInfo(QTy);
1293 return TBAA->getAccessInfo(AccessType);
1300 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1306 return TBAA->getTBAAStructInfo(QTy);
1312 return TBAA->getBaseTypeInfo(QTy);
1318 return TBAA->getAccessTagInfo(Info);
1325 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1333 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1341 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1347 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1352 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1365 "cannot compile this %0 yet");
1366 std::string Msg =
Type;
1368 << Msg << S->getSourceRange();
1375 "cannot compile this %0 yet");
1376 std::string Msg =
Type;
1387 if (GV->hasLocalLinkage()) {
1388 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1396 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
1400 if (GV->hasDLLExportStorageClass()) {
1403 diag::err_hidden_visibility_dllexport);
1406 diag::err_non_default_visibility_dllimport);
1412 !GV->isDeclarationForLinker())
1417 llvm::GlobalValue *GV) {
1418 if (GV->hasLocalLinkage())
1421 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
1425 if (GV->hasDLLImportStorageClass())
1428 const llvm::Triple &TT = CGM.
getTriple();
1430 if (TT.isWindowsGNUEnvironment()) {
1439 if (GV->isDeclarationForLinker() && isa<llvm::GlobalVariable>(GV) &&
1448 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
1456 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
1460 if (!TT.isOSBinFormatELF())
1466 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
1472 if (!(isa<llvm::Function>(GV) && GV->canBenefitFromLocalAlias()))
1474 return !(CGM.
getLangOpts().SemanticInterposition ||
1479 if (!GV->isDeclarationForLinker())
1485 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
1492 if (CGOpts.DirectAccessExternalData) {
1498 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
1499 if (!Var->isThreadLocal())
1508 if (isa<llvm::Function>(GV) && !CGOpts.NoPLT && RM == llvm::Reloc::Static)
1524 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
1526 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
1536 if (D->
hasAttr<DLLImportAttr>())
1537 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
1538 else if ((D->
hasAttr<DLLExportAttr>() ||
1540 !GV->isDeclarationForLinker())
1541 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
1565 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
1566 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
1567 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
1568 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
1569 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
1572llvm::GlobalVariable::ThreadLocalMode
1574 switch (CodeGenOpts.getDefaultTLSModel()) {
1576 return llvm::GlobalVariable::GeneralDynamicTLSModel;
1578 return llvm::GlobalVariable::LocalDynamicTLSModel;
1580 return llvm::GlobalVariable::InitialExecTLSModel;
1582 return llvm::GlobalVariable::LocalExecTLSModel;
1584 llvm_unreachable(
"Invalid TLS model!");
1588 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
1590 llvm::GlobalValue::ThreadLocalMode TLM;
1594 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
1598 GV->setThreadLocalMode(TLM);
1604 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
1608 const CPUSpecificAttr *
Attr,
1620 const TargetVersionAttr *
Attr,
1622 if (
Attr->isDefaultVersion())
1627 Attr->getFeatures(Feats);
1628 llvm::stable_sort(Feats, [&TI](
const StringRef FeatL,
const StringRef FeatR) {
1632 for (
const auto &Feat : Feats) {
1639 const TargetAttr *
Attr, raw_ostream &Out) {
1640 if (
Attr->isDefaultVersion())
1646 llvm::sort(Info.
Features, [&
Target](StringRef LHS, StringRef RHS) {
1649 assert(LHS.startswith(
"+") && RHS.startswith(
"+") &&
1650 "Features should always have a prefix.");
1651 return Target.multiVersionSortPriority(LHS.substr(1)) >
1652 Target.multiVersionSortPriority(RHS.substr(1));
1655 bool IsFirst =
true;
1657 if (!Info.
CPU.empty()) {
1659 Out <<
"arch_" << Info.
CPU;
1662 for (StringRef Feat : Info.
Features) {
1666 Out << Feat.substr(1);
1680 const TargetClonesAttr *
Attr,
1681 unsigned VersionIndex,
1685 StringRef FeatureStr =
Attr->getFeatureStr(VersionIndex);
1686 if (FeatureStr ==
"default")
1690 FeatureStr.split(Features,
"+");
1691 llvm::stable_sort(Features,
1692 [&TI](
const StringRef FeatL,
const StringRef FeatR) {
1696 for (
auto &Feat : Features) {
1702 StringRef FeatureStr =
Attr->getFeatureStr(VersionIndex);
1703 if (FeatureStr.startswith(
"arch="))
1704 Out <<
"arch_" << FeatureStr.substr(
sizeof(
"arch=") - 1);
1708 Out <<
'.' <<
Attr->getMangledIndex(VersionIndex);
1714 bool OmitMultiVersionMangling =
false) {
1716 llvm::raw_svector_ostream Out(Buffer);
1725 assert(II &&
"Attempt to mangle unnamed decl.");
1726 const auto *FD = dyn_cast<FunctionDecl>(ND);
1731 Out <<
"__regcall4__" << II->
getName();
1733 Out <<
"__regcall3__" << II->
getName();
1734 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
1736 Out <<
"__device_stub__" << II->
getName();
1752 "Hash computed when not explicitly requested");
1756 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
1757 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
1758 switch (FD->getMultiVersionKind()) {
1762 FD->getAttr<CPUSpecificAttr>(),
1776 llvm_unreachable(
"None multiversion type isn't valid here");
1786 return std::string(Out.str());
1789void CodeGenModule::UpdateMultiVersionNames(
GlobalDecl GD,
1791 StringRef &CurName) {
1798 std::string NonTargetName =
1806 "Other GD should now be a multiversioned function");
1816 if (OtherName != NonTargetName) {
1819 const auto ExistingRecord = Manglings.find(NonTargetName);
1820 if (ExistingRecord != std::end(Manglings))
1821 Manglings.remove(&(*ExistingRecord));
1822 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
1827 CurName = OtherNameRef;
1829 Entry->setName(OtherName);
1839 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
1853 auto FoundName = MangledDeclNames.find(CanonicalGD);
1854 if (FoundName != MangledDeclNames.end())
1855 return FoundName->second;
1859 const auto *ND = cast<NamedDecl>(GD.
getDecl());
1871 assert(!isa<FunctionDecl>(ND) || !ND->hasAttr<CUDAGlobalAttr>() ||
1882 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
1883 return MangledDeclNames[CanonicalGD] =
Result.first->first();
1892 llvm::raw_svector_ostream Out(Buffer);
1895 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.
getDecl()), Out);
1896 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
1898 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
1901 MangleCtx.
mangleBlock(cast<DeclContext>(D), BD, Out);
1903 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
1904 return Result.first->first();
1908 auto it = MangledDeclNames.begin();
1909 while (it != MangledDeclNames.end()) {
1910 if (it->second == Name)
1923void CodeGenModule::AddGlobalCtor(llvm::Function *Ctor,
int Priority,
1925 llvm::Constant *AssociatedData) {
1927 GlobalCtors.push_back(Structor(Priority, LexOrder, Ctor, AssociatedData));
1932void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor,
int Priority,
1933 bool IsDtorAttrFunc) {
1934 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
1936 DtorsUsingAtExit[
Priority].push_back(Dtor);
1941 GlobalDtors.push_back(Structor(Priority, ~0
U, Dtor,
nullptr));
1944void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
1945 if (Fns.empty())
return;
1948 llvm::FunctionType* CtorFTy = llvm::FunctionType::get(
VoidTy,
false);
1949 llvm::Type *CtorPFTy = llvm::PointerType::get(CtorFTy,
1950 TheModule.getDataLayout().getProgramAddressSpace());
1953 llvm::StructType *CtorStructTy = llvm::StructType::get(
1958 auto ctors = builder.beginArray(CtorStructTy);
1959 for (
const auto &I : Fns) {
1960 auto ctor = ctors.beginStruct(CtorStructTy);
1961 ctor.addInt(
Int32Ty, I.Priority);
1962 ctor.add(llvm::ConstantExpr::getBitCast(I.Initializer, CtorPFTy));
1963 if (I.AssociatedData)
1964 ctor.add(llvm::ConstantExpr::getBitCast(I.AssociatedData,
VoidPtrTy));
1967 ctor.finishAndAddTo(ctors);
1973 llvm::GlobalValue::AppendingLinkage);
1977 list->setAlignment(std::nullopt);
1982llvm::GlobalValue::LinkageTypes
1984 const auto *D = cast<FunctionDecl>(GD.
getDecl());
1988 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
1995 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
1996 if (!MDS)
return nullptr;
1998 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2004 FnType->getReturnType(), FnType->getParamTypes(),
2005 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2007 std::string OutName;
2008 llvm::raw_string_ostream Out(OutName);
2013 Out <<
".normalized";
2015 return llvm::ConstantInt::get(
Int32Ty,
2016 static_cast<uint32_t
>(llvm::xxHash64(OutName)));
2021 llvm::Function *F,
bool IsThunk) {
2023 llvm::AttributeList PAL;
2026 F->setAttributes(PAL);
2027 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2031 std::string ReadOnlyQual(
"__read_only");
2032 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2033 if (ReadOnlyPos != std::string::npos)
2035 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2037 std::string WriteOnlyQual(
"__write_only");
2038 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2039 if (WriteOnlyPos != std::string::npos)
2040 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2042 std::string ReadWriteQual(
"__read_write");
2043 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2044 if (ReadWritePos != std::string::npos)
2045 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2078 assert(((FD && CGF) || (!FD && !CGF)) &&
2079 "Incorrect use - FD and CGF should either be both null or not!");
2105 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2108 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2113 std::string typeQuals;
2117 const Decl *PDecl = parm;
2119 PDecl = TD->getDecl();
2120 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2121 if (A && A->isWriteOnly())
2122 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2123 else if (A && A->isReadWrite())
2124 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2126 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2128 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2130 auto getTypeSpelling = [&](
QualType Ty) {
2131 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2133 if (Ty.isCanonical()) {
2134 StringRef typeNameRef = typeName;
2136 if (typeNameRef.consume_front(
"unsigned "))
2137 return std::string(
"u") + typeNameRef.str();
2138 if (typeNameRef.consume_front(
"signed "))
2139 return typeNameRef.str();
2149 addressQuals.push_back(
2150 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2154 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2155 std::string baseTypeName =
2157 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2158 argBaseTypeNames.push_back(
2159 llvm::MDString::get(VMContext, baseTypeName));
2163 typeQuals =
"restrict";
2166 typeQuals += typeQuals.empty() ?
"const" :
" const";
2168 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2170 uint32_t AddrSpc = 0;
2175 addressQuals.push_back(
2176 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2180 std::string typeName = getTypeSpelling(ty);
2192 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2193 argBaseTypeNames.push_back(
2194 llvm::MDString::get(VMContext, baseTypeName));
2199 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2203 Fn->setMetadata(
"kernel_arg_addr_space",
2204 llvm::MDNode::get(VMContext, addressQuals));
2205 Fn->setMetadata(
"kernel_arg_access_qual",
2206 llvm::MDNode::get(VMContext, accessQuals));
2207 Fn->setMetadata(
"kernel_arg_type",
2208 llvm::MDNode::get(VMContext, argTypeNames));
2209 Fn->setMetadata(
"kernel_arg_base_type",
2210 llvm::MDNode::get(VMContext, argBaseTypeNames));
2211 Fn->setMetadata(
"kernel_arg_type_qual",
2212 llvm::MDNode::get(VMContext, argTypeQuals));
2216 Fn->setMetadata(
"kernel_arg_name",
2217 llvm::MDNode::get(VMContext, argNames));
2227 if (!LangOpts.Exceptions)
return false;
2230 if (LangOpts.CXXExceptions)
return true;
2233 if (LangOpts.ObjCExceptions) {
2250 !isa<CXXDestructorDecl>(MD);
2255 llvm::SetVector<const CXXRecordDecl *> MostBases;
2257 std::function<void (
const CXXRecordDecl *)> CollectMostBases;
2260 MostBases.insert(RD);
2262 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2264 CollectMostBases(RD);
2265 return MostBases.takeVector();
2269 llvm::Function *F) {
2270 llvm::AttrBuilder B(F->getContext());
2272 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2273 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2275 if (CodeGenOpts.StackClashProtector)
2276 B.addAttribute(
"probe-stack",
"inline-asm");
2279 B.addAttribute(llvm::Attribute::NoUnwind);
2281 if (D && D->
hasAttr<NoStackProtectorAttr>())
2283 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
2285 B.addAttribute(llvm::Attribute::StackProtectStrong);
2287 B.addAttribute(llvm::Attribute::StackProtect);
2289 B.addAttribute(llvm::Attribute::StackProtectStrong);
2291 B.addAttribute(llvm::Attribute::StackProtectReq);
2297 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2299 B.addAttribute(llvm::Attribute::NoInline);
2307 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2308 B.addAttribute(
"aarch64_pstate_sm_body");
2310 if (D->
hasAttr<ArmNewZAAttr>())
2311 B.addAttribute(
"aarch64_pstate_za_new");
2315 bool ShouldAddOptNone =
2316 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2318 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
2319 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
2322 if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
2323 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2324 B.addAttribute(llvm::Attribute::OptimizeNone);
2327 B.addAttribute(llvm::Attribute::NoInline);
2332 B.addAttribute(llvm::Attribute::Naked);
2335 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
2336 F->removeFnAttr(llvm::Attribute::MinSize);
2337 }
else if (D->
hasAttr<NakedAttr>()) {
2339 B.addAttribute(llvm::Attribute::Naked);
2340 B.addAttribute(llvm::Attribute::NoInline);
2341 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
2342 B.addAttribute(llvm::Attribute::NoDuplicate);
2343 }
else if (D->
hasAttr<NoInlineAttr>() && !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2345 B.addAttribute(llvm::Attribute::NoInline);
2346 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
2347 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
2349 B.addAttribute(llvm::Attribute::AlwaysInline);
2353 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
2354 B.addAttribute(llvm::Attribute::NoInline);
2358 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2361 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
2362 return Redecl->isInlineSpecified();
2364 if (any_of(FD->
redecls(), CheckRedeclForInline))
2369 return any_of(Pattern->
redecls(), CheckRedeclForInline);
2371 if (CheckForInline(FD)) {
2372 B.addAttribute(llvm::Attribute::InlineHint);
2373 }
else if (CodeGenOpts.getInlining() ==
2376 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2377 B.addAttribute(llvm::Attribute::NoInline);
2384 if (!D->
hasAttr<OptimizeNoneAttr>()) {
2386 if (!ShouldAddOptNone)
2387 B.addAttribute(llvm::Attribute::OptimizeForSize);
2388 B.addAttribute(llvm::Attribute::Cold);
2391 B.addAttribute(llvm::Attribute::Hot);
2392 if (D->
hasAttr<MinSizeAttr>())
2393 B.addAttribute(llvm::Attribute::MinSize);
2400 F->setAlignment(llvm::Align(alignment));
2402 if (!D->
hasAttr<AlignedAttr>())
2403 if (LangOpts.FunctionAlignment)
2404 F->setAlignment(llvm::Align(1ull << LangOpts.FunctionAlignment));
2411 if (isa<CXXMethodDecl>(D) && F->getPointerAlignment(
getDataLayout()) < 2)
2412 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
2417 if (CodeGenOpts.SanitizeCfiCrossDso &&
2418 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
2419 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2430 auto *MD = dyn_cast<CXXMethodDecl>(D);
2433 llvm::Metadata *
Id =
2436 F->addTypeMetadata(0,
Id);
2443 if (isa_and_nonnull<NamedDecl>(D))
2446 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2448 if (D && D->
hasAttr<UsedAttr>())
2451 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
2453 ((CodeGenOpts.KeepPersistentStorageVariables &&
2454 (VD->getStorageDuration() ==
SD_Static ||
2455 VD->getStorageDuration() ==
SD_Thread)) ||
2456 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
2457 VD->getType().isConstQualified())))
2461bool CodeGenModule::GetCPUAndFeaturesAttributes(
GlobalDecl GD,
2462 llvm::AttrBuilder &Attrs,
2463 bool SetTargetFeatures) {
2469 std::vector<std::string> Features;
2470 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
2472 const auto *TD = FD ? FD->
getAttr<TargetAttr>() :
nullptr;
2473 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
2474 assert((!TD || !TV) &&
"both target_version and target specified");
2475 const auto *SD = FD ? FD->
getAttr<CPUSpecificAttr>() :
nullptr;
2476 const auto *TC = FD ? FD->
getAttr<TargetClonesAttr>() :
nullptr;
2477 bool AddedAttr =
false;
2478 if (TD || TV || SD || TC) {
2479 llvm::StringMap<bool> FeatureMap;
2483 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
2484 Features.push_back((Entry.getValue() ?
"+" :
"-") + Entry.getKey().str());
2514 if (!TargetCPU.empty()) {
2515 Attrs.addAttribute(
"target-cpu", TargetCPU);
2518 if (!TuneCPU.empty()) {
2519 Attrs.addAttribute(
"tune-cpu", TuneCPU);
2522 if (!Features.empty() && SetTargetFeatures) {
2523 llvm::erase_if(Features, [&](
const std::string& F) {
2526 llvm::sort(Features);
2527 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
2534void CodeGenModule::setNonAliasAttributes(
GlobalDecl GD,
2535 llvm::GlobalObject *GO) {
2540 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
2543 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
2544 GV->addAttribute(
"bss-section", SA->getName());
2545 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
2546 GV->addAttribute(
"data-section", SA->getName());
2547 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
2548 GV->addAttribute(
"rodata-section", SA->getName());
2549 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
2550 GV->addAttribute(
"relro-section", SA->getName());
2553 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
2556 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
2557 if (!D->
getAttr<SectionAttr>())
2558 F->addFnAttr(
"implicit-section-name", SA->getName());
2560 llvm::AttrBuilder Attrs(F->getContext());
2561 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
2565 llvm::AttributeMask RemoveAttrs;
2566 RemoveAttrs.addAttribute(
"target-cpu");
2567 RemoveAttrs.addAttribute(
"target-features");
2568 RemoveAttrs.addAttribute(
"tune-cpu");
2569 F->removeFnAttrs(RemoveAttrs);
2570 F->addFnAttrs(Attrs);
2574 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
2575 GO->setSection(CSA->getName());
2576 else if (
const auto *SA = D->
getAttr<SectionAttr>())
2577 GO->setSection(SA->getName());
2590 F->setLinkage(llvm::Function::InternalLinkage);
2592 setNonAliasAttributes(GD, F);
2603 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
2607 llvm::Function *F) {
2609 if (!LangOpts.
Sanitize.
has(SanitizerKind::CFIICall))
2614 if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic())
2618 F->addTypeMetadata(0, MD);
2622 if (CodeGenOpts.SanitizeCfiCrossDso)
2624 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
2628 llvm::LLVMContext &Ctx = F->getContext();
2629 llvm::MDBuilder MDB(Ctx);
2630 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
2639 return llvm::all_of(Name, [](
const char &
C) {
2640 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
2646 for (
auto &F : M.functions()) {
2648 bool AddressTaken = F.hasAddressTaken();
2649 if (!AddressTaken && F.hasLocalLinkage())
2650 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
2655 if (!AddressTaken || !F.isDeclaration())
2658 const llvm::ConstantInt *
Type;
2659 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
2660 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
2664 StringRef Name = F.getName();
2668 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
2669 Name +
", " + Twine(
Type->getZExtValue()) +
"\n")
2671 M.appendModuleInlineAsm(
Asm);
2675void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
2676 bool IsIncompleteFunction,
2679 if (llvm::Intrinsic::ID IID = F->getIntrinsicID()) {
2682 F->setAttributes(llvm::Intrinsic::getAttributes(
getLLVMContext(), IID));
2686 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
2688 if (!IsIncompleteFunction)
2695 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
2697 assert(!F->arg_empty() &&
2698 F->arg_begin()->getType()
2699 ->canLosslesslyBitCastTo(F->getReturnType()) &&
2700 "unexpected this return");
2701 F->addParamAttr(0, llvm::Attribute::Returned);
2711 if (!IsIncompleteFunction && F->isDeclaration())
2714 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
2715 F->setSection(CSA->getName());
2716 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
2717 F->setSection(SA->getName());
2719 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
2721 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
2722 else if (EA->isWarning())
2723 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
2729 bool HasBody = FD->
hasBody(FDBody);
2731 assert(HasBody &&
"Inline builtin declarations should always have an "
2733 if (shouldEmitFunction(FDBody))
2734 F->addFnAttr(llvm::Attribute::NoBuiltin);
2740 F->addFnAttr(llvm::Attribute::NoBuiltin);
2743 if (isa<CXXConstructorDecl>(FD) || isa<CXXDestructorDecl>(FD))
2744 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2745 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
2746 if (MD->isVirtual())
2747 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2753 if (!CodeGenOpts.SanitizeCfiCrossDso ||
2754 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
2763 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
2764 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
2766 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
2770 llvm::LLVMContext &Ctx = F->getContext();
2771 llvm::MDBuilder MDB(Ctx);
2775 int CalleeIdx = *CB->encoding_begin();
2776 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
2777 F->addMetadata(llvm::LLVMContext::MD_callback,
2778 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
2779 CalleeIdx, PayloadIndices,
2785 assert((isa<llvm::Function>(GV) || !GV->isDeclaration()) &&
2786 "Only globals with definition can force usage.");
2787 LLVMUsed.emplace_back(GV);
2791 assert(!GV->isDeclaration() &&
2792 "Only globals with definition can force usage.");
2793 LLVMCompilerUsed.emplace_back(GV);
2797 assert((isa<llvm::Function>(GV) || !GV->isDeclaration()) &&
2798 "Only globals with definition can force usage.");
2800 LLVMCompilerUsed.emplace_back(GV);
2802 LLVMUsed.emplace_back(GV);
2806 std::vector<llvm::WeakTrackingVH> &List) {
2813 UsedArray.resize(List.size());
2814 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
2816 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
2817 cast<llvm::Constant>(&*List[i]), CGM.
Int8PtrTy);
2820 if (UsedArray.empty())
2822 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
2824 auto *GV =
new llvm::GlobalVariable(
2825 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
2826 llvm::ConstantArray::get(ATy, UsedArray), Name);
2828 GV->setSection(
"llvm.metadata");
2831void CodeGenModule::emitLLVMUsed() {
2832 emitUsed(*
this,
"llvm.used", LLVMUsed);
2833 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
2838 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
2847 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
2853 ELFDependentLibraries.push_back(
2854 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
2861 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
2876 if (
Visited.insert(Import).second)
2893 if (LL.IsFramework) {
2894 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
2895 llvm::MDString::get(Context, LL.Library)};
2897 Metadata.push_back(llvm::MDNode::get(Context, Args));
2903 llvm::Metadata *Args[2] = {
2904 llvm::MDString::get(Context,
"lib"),
2905 llvm::MDString::get(Context, LL.Library),
2907 Metadata.push_back(llvm::MDNode::get(Context, Args));
2911 auto *OptString = llvm::MDString::get(Context, Opt);
2912 Metadata.push_back(llvm::MDNode::get(Context, OptString));
2917void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
2919 "We should only emit module initializers for named modules.");
2925 if (isa<ImportDecl>(D))
2927 assert(isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
2934 if (isa<ImportDecl>(D))
2941 assert(isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
2947void CodeGenModule::EmitModuleLinkOptions() {
2951 llvm::SetVector<clang::Module *> LinkModules;
2956 for (
Module *M : ImportedModules) {
2959 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
2968 while (!Stack.empty()) {
2971 bool AnyChildren =
false;
2981 Stack.push_back(
SM);
2989 LinkModules.insert(Mod);
2998 for (
Module *M : LinkModules)
3001 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3002 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3005 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3006 for (
auto *MD : LinkerOptionsMetadata)
3007 NMD->addOperand(MD);
3010void CodeGenModule::EmitDeferred() {
3019 if (!DeferredVTables.empty()) {
3020 EmitDeferredVTables();
3025 assert(DeferredVTables.empty());
3032 llvm::append_range(DeferredDeclsToEmit,
3036 if (DeferredDeclsToEmit.empty())
3041 std::vector<GlobalDecl> CurDeclsToEmit;
3042 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3049 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3067 if (!GV->isDeclaration())
3071 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3075 EmitGlobalDefinition(D, GV);
3080 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3082 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3087void CodeGenModule::EmitVTablesOpportunistically() {
3093 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3094 &&
"Only emit opportunistic vtables with optimizations");
3098 "This queue should only contain external vtables");
3099 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3102 OpportunisticVTables.clear();
3106 if (Annotations.empty())
3110 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3111 Annotations[0]->getType(), Annotations.size()), Annotations);
3112 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3113 llvm::GlobalValue::AppendingLinkage,
3114 Array,
"llvm.global.annotations");
3119 llvm::Constant *&AStr = AnnotationStrings[Str];
3124 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3125 auto *gv =
new llvm::GlobalVariable(
3126 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3127 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3130 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3147 SM.getExpansionLineNumber(L);
3148 return llvm::ConstantInt::get(
Int32Ty, LineNo);
3156 llvm::FoldingSetNodeID ID;
3157 for (
Expr *E : Exprs) {
3158 ID.Add(cast<clang::ConstantExpr>(E)->getAPValueResult());
3160 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
3165 LLVMArgs.reserve(Exprs.size());
3167 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
3168 const auto *CE = cast<clang::ConstantExpr>(E);
3169 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
3172 auto *Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
3173 auto *GV =
new llvm::GlobalVariable(
getModule(), Struct->getType(),
true,
3174 llvm::GlobalValue::PrivateLinkage, Struct,
3177 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3185 const AnnotateAttr *AA,
3193 llvm::Constant *GVInGlobalsAS = GV;
3194 if (GV->getAddressSpace() !=
3196 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
3198 llvm::PointerType::get(
3199 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
3203 llvm::Constant *Fields[] = {
3210 return llvm::ConstantStruct::getAnon(Fields);
3214 llvm::GlobalValue *GV) {
3215 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
3225 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
3230 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
3235 return NoSanitizeL.containsLocation(Kind, Loc);
3238 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
3242 llvm::GlobalVariable *GV,
3246 if (NoSanitizeL.containsGlobal(Kind, GV->getName(),
Category))
3249 if (NoSanitizeL.containsMainFile(
3250 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
3253 if (NoSanitizeL.containsLocation(Kind, Loc,
Category))
3260 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
3261 Ty = AT->getElementType();
3266 if (NoSanitizeL.containsType(Kind, TypeStr,
Category))
3277 auto Attr = ImbueAttr::NONE;
3280 if (
Attr == ImbueAttr::NONE)
3281 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
3283 case ImbueAttr::NONE:
3285 case ImbueAttr::ALWAYS:
3286 Fn->addFnAttr(
"function-instrument",
"xray-always");
3288 case ImbueAttr::ALWAYS_ARG1:
3289 Fn->addFnAttr(
"function-instrument",
"xray-always");
3290 Fn->addFnAttr(
"xray-log-args",
"1");
3292 case ImbueAttr::NEVER:
3293 Fn->addFnAttr(
"function-instrument",
"xray-never");
3317 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
3331 if (NumGroups > 1) {
3332 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
3339bool CodeGenModule::MustBeEmitted(
const ValueDecl *Global) {
3341 if (LangOpts.EmitAllDecls)
3344 const auto *VD = dyn_cast<VarDecl>(Global);
3346 ((CodeGenOpts.KeepPersistentStorageVariables &&
3347 (VD->getStorageDuration() ==
SD_Static ||
3348 VD->getStorageDuration() ==
SD_Thread)) ||
3349 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3350 VD->getType().isConstQualified())))
3356bool CodeGenModule::MayBeEmittedEagerly(
const ValueDecl *Global) {
3363 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
3364 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
3365 OMPDeclareTargetDeclAttr::getActiveAttr(Global);
3366 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
3370 if (
const auto *FD = dyn_cast<FunctionDecl>(Global)) {
3376 if (
const auto *VD = dyn_cast<VarDecl>(Global)) {
3382 if (CXX20ModuleInits && VD->getOwningModule() &&
3383 !VD->getOwningModule()->isModuleMapModule()) {
3392 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
3393 getContext().getTargetInfo().isTLSSupported() && isa<VarDecl>(Global) &&
3395 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Global))
3408 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3412 llvm::Constant *Init;
3415 if (!
V.isAbsent()) {
3418 Init =
Emitter.emitForInitializer(
3426 llvm::Constant *Fields[4] = {
3430 llvm::ConstantDataArray::getRaw(
3431 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
3433 Init = llvm::ConstantStruct::getAnon(Fields);
3436 auto *GV =
new llvm::GlobalVariable(
3438 true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name);
3440 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
3443 if (!
V.isAbsent()) {
3456 llvm::GlobalVariable **Entry =
nullptr;
3457 Entry = &UnnamedGlobalConstantDeclMap[GCD];
3462 llvm::Constant *Init;
3466 assert(!
V.isAbsent());
3470 auto *GV =
new llvm::GlobalVariable(
getModule(), Init->getType(),
3472 llvm::GlobalValue::PrivateLinkage, Init,
3474 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3488 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3492 llvm::Constant *Init =
Emitter.emitForInitializer(
3500 llvm::GlobalValue::LinkageTypes
Linkage =
3502 ? llvm::GlobalValue::LinkOnceODRLinkage
3503 : llvm::GlobalValue::InternalLinkage;
3504 auto *GV =
new llvm::GlobalVariable(
getModule(), Init->getType(),
3508 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
3515 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
3516 assert(AA &&
"No alias?");
3526 llvm::Constant *Aliasee;
3527 if (isa<llvm::FunctionType>(DeclTy))
3528 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
3535 auto *F = cast<llvm::GlobalValue>(Aliasee);
3536 F->setLinkage(llvm::Function::ExternalWeakLinkage);
3537 WeakRefReferences.insert(F);
3543 const auto *Global = cast<ValueDecl>(GD.
getDecl());
3546 if (Global->
hasAttr<WeakRefAttr>())
3551 if (Global->
hasAttr<AliasAttr>())
3552 return EmitAliasDefinition(GD);
3555 if (Global->
hasAttr<IFuncAttr>())
3556 return emitIFuncDefinition(GD);
3559 if (Global->
hasAttr<CPUDispatchAttr>())
3560 return emitCPUDispatchDefinition(GD);
3563 if (LangOpts.CUDA) {
3564 if (LangOpts.CUDAIsDevice) {
3565 if (!Global->
hasAttr<CUDADeviceAttr>() &&
3566 !Global->
hasAttr<CUDAGlobalAttr>() &&
3567 !Global->
hasAttr<CUDAConstantAttr>() &&
3568 !Global->
hasAttr<CUDASharedAttr>() &&
3579 if (isa<FunctionDecl>(Global) && !Global->
hasAttr<CUDAHostAttr>() &&
3580 Global->
hasAttr<CUDADeviceAttr>())
3583 assert((isa<FunctionDecl>(Global) || isa<VarDecl>(Global)) &&
3584 "Expected Variable or Function");
3588 if (LangOpts.OpenMP) {
3590 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
3592 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(Global)) {
3593 if (MustBeEmitted(Global))
3597 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(Global)) {
3598 if (MustBeEmitted(Global))
3605 if (
const auto *FD = dyn_cast<FunctionDecl>(Global)) {
3617 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
3622 const auto *VD = cast<VarDecl>(Global);
3623 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
3626 if (LangOpts.OpenMP) {
3628 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
3629 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
3633 if (VD->hasExternalStorage() &&
3634 Res != OMPDeclareTargetDeclAttr::MT_Link)
3637 bool UnifiedMemoryEnabled =
3639 if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3640 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3641 !UnifiedMemoryEnabled) {
3644 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
3645 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3646 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3647 UnifiedMemoryEnabled)) &&
3648 "Link clause or to clause with unified memory expected.");
3667 if (MustBeEmitted(Global) && MayBeEmittedEagerly(Global)) {
3669 EmitGlobalDefinition(GD);
3670 addEmittedDeferredDecl(GD);
3677 cast<VarDecl>(Global)->hasInit()) {
3678 DelayedCXXInitPosition[Global] = CXXGlobalInits.size();
3679 CXXGlobalInits.push_back(
nullptr);
3685 addDeferredDeclToEmit(GD);
3686 }
else if (MustBeEmitted(Global)) {
3688 assert(!MayBeEmittedEagerly(Global));
3689 addDeferredDeclToEmit(GD);
3694 DeferredDecls[MangledName] = GD;
3701 if (
CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
3702 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
3709 struct FunctionIsDirectlyRecursive
3711 const StringRef Name;
3716 bool VisitCallExpr(
const CallExpr *E) {
3721 if (
Attr && Name ==
Attr->getLabel())
3726 StringRef BuiltinName = BI.
getName(BuiltinID);
3727 if (BuiltinName.startswith(
"__builtin_") &&
3728 Name == BuiltinName.slice(strlen(
"__builtin_"), StringRef::npos)) {
3734 bool VisitStmt(
const Stmt *S) {
3735 for (
const Stmt *Child : S->children())
3736 if (Child && this->Visit(Child))
3743 struct DLLImportFunctionVisitor
3745 bool SafeToInline =
true;
3747 bool shouldVisitImplicitCode()
const {
return true; }
3749 bool VisitVarDecl(
VarDecl *VD) {
3752 SafeToInline =
false;
3753 return SafeToInline;
3760 return SafeToInline;
3765 SafeToInline = D->
hasAttr<DLLImportAttr>();
3766 return SafeToInline;
3771 if (isa<FunctionDecl>(VD))
3772 SafeToInline = VD->
hasAttr<DLLImportAttr>();
3773 else if (
VarDecl *
V = dyn_cast<VarDecl>(VD))
3774 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
3775 return SafeToInline;
3780 return SafeToInline;
3787 SafeToInline =
true;
3789 SafeToInline = M->
hasAttr<DLLImportAttr>();
3791 return SafeToInline;
3796 return SafeToInline;
3801 return SafeToInline;
3810CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
3812 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
3817 Name =
Attr->getLabel();
3822 FunctionIsDirectlyRecursive Walker(Name, Context.
BuiltinInfo);
3824 return Body ? Walker.Visit(Body) :
false;
3827bool CodeGenModule::shouldEmitFunction(
GlobalDecl GD) {
3830 const auto *F = cast<FunctionDecl>(GD.
getDecl());
3831 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
3834 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
3836 DLLImportFunctionVisitor Visitor;
3837 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
3838 if (!Visitor.SafeToInline)
3844 for (
const Decl *
Member : Dtor->getParent()->decls())
3845 if (isa<FieldDecl>(
Member))
3856 if (F->isInlineBuiltinDeclaration())
3864 return !isTriviallyRecursive(F);
3867bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
3868 return CodeGenOpts.OptimizationLevel > 0;
3871void CodeGenModule::EmitMultiVersionFunctionDefinition(
GlobalDecl GD,
3872 llvm::GlobalValue *GV) {
3873 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
3876 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
3877 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
3880 auto *Clone = FD->
getAttr<TargetClonesAttr>();
3881 for (
unsigned I = 0; I < Clone->featuresStrs_size(); ++I)
3882 if (Clone->isFirstOfVersion(I))
3885 GetOrCreateMultiVersionResolver(GD);
3887 EmitGlobalFunctionDefinition(GD, GV);
3890void CodeGenModule::EmitGlobalDefinition(
GlobalDecl GD, llvm::GlobalValue *GV) {
3891 const auto *D = cast<ValueDecl>(GD.
getDecl());
3895 "Generating code for declaration");
3897 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3900 if (!shouldEmitFunction(GD))
3903 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
3905 llvm::raw_string_ostream OS(Name);
3911 if (
const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
3914 if (isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method))
3915 ABI->emitCXXStructor(GD);
3917 EmitMultiVersionFunctionDefinition(GD, GV);
3919 EmitGlobalFunctionDefinition(GD, GV);
3921 if (Method->isVirtual())
3928 return EmitMultiVersionFunctionDefinition(GD, GV);
3929 return EmitGlobalFunctionDefinition(GD, GV);
3932 if (
const auto *VD = dyn_cast<VarDecl>(D))
3933 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
3935 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
3939 llvm::Function *NewFn);
3943 const CodeGenFunction::MultiVersionResolverOption &RO) {
3945 unsigned NumFeatures = 0;
3946 for (StringRef Feat : RO.Conditions.Features) {
3951 if (!RO.Conditions.Architecture.empty())
3969 return llvm::GlobalValue::InternalLinkage;
3970 return llvm::GlobalValue::WeakODRLinkage;
3973void CodeGenModule::emitMultiVersionFunctions() {
3974 std::vector<GlobalDecl> MVFuncsToEmit;
3975 MultiVersionFuncs.swap(MVFuncsToEmit);
3977 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
3978 assert(FD &&
"Expected a FunctionDecl");
3990 EmitGlobalFunctionDefinition(CurGD,
nullptr);
3999 assert(Func &&
"This should have just been created");
4002 const auto *TA = CurFD->
getAttr<TargetAttr>();
4004 TA->getAddedFeatures(Feats);
4005 Options.emplace_back(cast<llvm::Function>(Func),
4006 TA->getArchitecture(), Feats);
4008 const auto *TVA = CurFD->
getAttr<TargetVersionAttr>();
4010 TVA->getFeatures(Feats);
4011 Options.emplace_back(cast<llvm::Function>(Func),
4016 const auto *TC = FD->
getAttr<TargetClonesAttr>();
4017 for (
unsigned VersionIndex = 0; VersionIndex < TC->featuresStrs_size();
4019 if (!TC->isFirstOfVersion(VersionIndex))
4023 StringRef Version = TC->getFeatureStr(VersionIndex);
4028 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4037 assert(Func &&
"This should have just been created");
4040 StringRef Architecture;
4044 if (Version !=
"default") {
4046 Version.split(VerFeats,
"+");
4047 for (
auto &CurFeat : VerFeats)
4048 Feature.push_back(CurFeat.trim());
4051 if (Version.startswith(
"arch="))
4052 Architecture = Version.drop_front(
sizeof(
"arch=") - 1);
4053 else if (Version !=
"default")
4054 Feature.push_back(Version);
4057 Options.emplace_back(cast<llvm::Function>(Func), Architecture, Feature);
4060 assert(0 &&
"Expected a target or target_clones multiversion function");
4064 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
4065 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant))
4066 ResolverConstant = IFunc->getResolver();
4067 llvm::Function *ResolverFunc = cast<llvm::Function>(ResolverConstant);
4072 ResolverFunc->setComdat(
4073 getModule().getOrInsertComdat(ResolverFunc->getName()));
4077 Options, [&TI](
const CodeGenFunction::MultiVersionResolverOption &LHS,
4078 const CodeGenFunction::MultiVersionResolverOption &RHS) {
4082 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4088 if (!MVFuncsToEmit.empty())
4093 if (!MultiVersionFuncs.empty())
4094 emitMultiVersionFunctions();
4097void CodeGenModule::emitCPUDispatchDefinition(
GlobalDecl GD) {
4098 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4099 assert(FD &&
"Not a FunctionDecl?");
4101 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
4102 assert(DD &&
"Not a cpu_dispatch Function?");
4108 UpdateMultiVersionNames(GD, FD, ResolverName);
4110 llvm::Type *ResolverType;
4113 ResolverType = llvm::FunctionType::get(
4114 llvm::PointerType::get(DeclTy,
4123 auto *ResolverFunc = cast<llvm::Function>(GetOrCreateLLVMFunction(
4124 ResolverName, ResolverType, ResolverGD,
false));
4127 ResolverFunc->setComdat(
4128 getModule().getOrInsertComdat(ResolverFunc->getName()));
4141 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
4144 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
4150 Func = GetOrCreateLLVMFunction(
4151 MangledName, DeclTy, ExistingDecl,
4158 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
4159 llvm::transform(Features, Features.begin(),
4160 [](StringRef Str) { return Str.substr(1); });
4161 llvm::erase_if(Features, [&Target](StringRef Feat) {
4162 return !
Target.validateCpuSupports(Feat);
4164 Options.emplace_back(cast<llvm::Function>(Func), StringRef{}, Features);
4169 Options, [](
const CodeGenFunction::MultiVersionResolverOption &LHS,
4170 const CodeGenFunction::MultiVersionResolverOption &RHS) {
4171 return llvm::X86::getCpuSupportsMask(LHS.Conditions.Features) >
4172 llvm::X86::getCpuSupportsMask(RHS.Conditions.Features);
4179 while (Options.size() > 1 &&
4180 llvm::all_of(llvm::X86::getCpuSupportsMask(
4181 (Options.end() - 2)->Conditions.Features),
4182 [](
auto X) { return X == 0; })) {
4183 StringRef LHSName = (Options.end() - 2)->
Function->getName();
4184 StringRef RHSName = (Options.end() - 1)->
Function->getName();
4185 if (LHSName.compare(RHSName) < 0)
4186 Options.erase(Options.end() - 2);
4188 Options.erase(Options.end() - 1);
4192 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4196 auto *IFunc = cast<llvm::GlobalValue>(GetOrCreateMultiVersionResolver(GD));
4200 if (!isa<llvm::GlobalIFunc>(IFunc)) {
4201 assert(cast<llvm::Function>(IFunc)->isDeclaration());
4202 auto *GI = llvm::GlobalIFunc::create(DeclTy, 0,
Linkage,
"", ResolverFunc,
4204 GI->takeName(IFunc);
4205 IFunc->replaceAllUsesWith(GI);
4206 IFunc->eraseFromParent();
4211 *
this, GD, FD,
true);
4214 auto *GA = llvm::GlobalAlias::create(DeclTy, 0,
Linkage, AliasName, IFunc,
4223llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(
GlobalDecl GD) {
4224 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4225 assert(FD &&
"Not a FunctionDecl?");
4227 std::string MangledName =
4232 std::string ResolverName = MangledName;
4234 ResolverName +=
".ifunc";
4236 ResolverName +=
".resolver";
4239 if (llvm::GlobalValue *ResolverGV =
GetGlobalValue(ResolverName))
4248 MultiVersionFuncs.push_back(GD);
4253 llvm::Type *ResolverType = llvm::FunctionType::get(
4254 llvm::PointerType::get(DeclTy,
4257 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4258 MangledName +
".resolver", ResolverType,
GlobalDecl{},
4260 llvm::GlobalIFunc *GIF =
4263 GIF->setName(ResolverName);
4269 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4271 assert(isa<llvm::GlobalValue>(Resolver) &&
4272 "Resolver should be created for the first time");
4284llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
4285 StringRef MangledName, llvm::Type *Ty,
GlobalDecl GD,
bool ForVTable,
4286 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
4292 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
4294 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
4295 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
4296 !DontDefer && !IsForDefinition) {
4299 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
4301 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
4310 UpdateMultiVersionNames(GD, FD, MangledName);
4311 if (!IsForDefinition)
4312 return GetOrCreateMultiVersionResolver(GD);
4319 if (WeakRefReferences.erase(Entry)) {
4320 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
4321 if (FD && !FD->
hasAttr<WeakAttr>())
4322 Entry->setLinkage(llvm::Function::ExternalLinkage);
4326 if (D && !D->
hasAttr<DLLImportAttr>() && !D->
hasAttr<DLLExportAttr>() &&
4328 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
4334 if (IsForDefinition && !Entry->isDeclaration()) {
4341 DiagnosedConflictingDefinitions.insert(GD).second) {
4345 diag::note_previous_definition);
4349 if ((isa<llvm::Function>(Entry) || isa<llvm::GlobalAlias>(Entry)) &&
4350 (Entry->getValueType() == Ty)) {
4357 if (!IsForDefinition)
4364 bool IsIncompleteFunction =
false;
4366 llvm::FunctionType *FTy;
4367 if (isa<llvm::FunctionType>(Ty)) {
4368 FTy = cast<llvm::FunctionType>(Ty);
4370 FTy = llvm::FunctionType::get(
VoidTy,
false);
4371 IsIncompleteFunction =
true;
4375 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
4376 Entry ? StringRef() : MangledName, &
getModule());
4393 if (!Entry->use_empty()) {
4395 Entry->removeDeadConstantUsers();
4401 assert(F->getName() == MangledName &&
"name was uniqued!");
4403 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
4404 if (ExtraAttrs.hasFnAttrs()) {
4405 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
4413 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
4414 getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
4416 addDeferredDeclToEmit(GD);
4421 auto DDI = DeferredDecls.find(MangledName);
4422 if (DDI != DeferredDecls.end()) {
4426 addDeferredDeclToEmit(DDI->second);
4427 DeferredDecls.erase(DDI);
4442 for (
const auto *FD = cast<FunctionDecl>(D)->getMostRecentDecl(); FD;
4455 if (!IsIncompleteFunction) {
4456 assert(F->getFunctionType() == Ty);
4472 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4479 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
4482 DD->getParent()->getNumVBases() == 0)
4487 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
4488 false, llvm::AttributeList(),
4491 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
4492 cast<FunctionDecl>(GD.
getDecl())->hasAttr<CUDAGlobalAttr>()) {
4494 cast<llvm::Function>(F->stripPointerCasts()), GD);
4495 if (IsForDefinition)
4503 llvm::GlobalValue *F =
4506 return llvm::ConstantExpr::getBitCast(
4507 llvm::NoCFIValue::get(F),
4508 llvm::PointerType::get(VMContext, F->getAddressSpace()));
4518 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
4521 if (!
C.getLangOpts().CPlusPlus)
4526 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
4527 ?
C.Idents.get(
"terminate")
4528 :
C.Idents.get(Name);
4530 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
4534 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
4535 for (
const auto *
Result : LSD->lookup(&NS))
4536 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
4541 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
4553 llvm::AttributeList ExtraAttrs,
bool Local,
4554 bool AssumeConvergent) {
4555 if (AssumeConvergent) {
4557 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
4561 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
4565 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
4574 if (!Local &&
getTriple().isWindowsItaniumEnvironment() &&
4577 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
4578 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
4579 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
4608 if (WeakRefReferences.erase(Entry)) {
4609 if (D && !D->
hasAttr<WeakAttr>())
4610 Entry->setLinkage(llvm::Function::ExternalLinkage);
4614 if (D && !D->
hasAttr<DLLImportAttr>() && !D->
hasAttr<DLLExportAttr>() &&
4616 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
4618 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
4621 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
4626 if (IsForDefinition && !Entry->isDeclaration()) {
4634 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
4636 DiagnosedConflictingDefinitions.insert(D).second) {
4640 diag::note_previous_definition);
4645 if (Entry->getType()->getAddressSpace() != TargetAS)
4646 return llvm::ConstantExpr::getAddrSpaceCast(
4647 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
4651 if (!IsForDefinition)
4657 auto *GV =
new llvm::GlobalVariable(
4658 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
4659 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
4660 getContext().getTargetAddressSpace(DAddrSpace));
4665 GV->takeName(Entry);
4667 if (!Entry->use_empty()) {
4668 llvm::Constant *NewPtrForOldDecl =
4669 llvm::ConstantExpr::getBitCast(GV, Entry->getType());
4670 Entry->replaceAllUsesWith(NewPtrForOldDecl);
4673 Entry->eraseFromParent();
4679 auto DDI = DeferredDecls.find(MangledName);
4680 if (DDI != DeferredDecls.end()) {
4683 addDeferredDeclToEmit(DDI->second);
4684 DeferredDecls.erase(DDI);
4689 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
4696 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
4702 CXXThreadLocals.push_back(D);
4710 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
4711 EmitGlobalVarDefinition(D);
4716 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
4717 GV->setSection(SA->getName());
4721 if (
getTriple().getArch() == llvm::Triple::xcore &&
4725 GV->setSection(
".cp.rodata");
4730 if (Context.
getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
4733 const auto *Record =
4735 bool HasMutableFields = Record && Record->hasMutableFields();
4736 if (!HasMutableFields) {
4743 auto *InitType = Init->getType();
4744 if (GV->getValueType() != InitType) {
4749 GV->setName(StringRef());
4752 auto *NewGV = cast<llvm::GlobalVariable>(
4754 ->stripPointerCasts());
4757 GV->eraseFromParent();
4760 GV->setInitializer(Init);
4761 GV->setConstant(
true);
4762 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
4782 SanitizerMD->reportGlobal(GV, *D);
4787 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
4788 if (DAddrSpace != ExpectedAS) {
4790 *
this, GV, DAddrSpace, ExpectedAS, Ty->getPointerTo(TargetAS));
4800 if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))
4802 false, IsForDefinition);
4804 if (isa<CXXMethodDecl>(D)) {
4812 if (isa<FunctionDecl>(D)) {
4823 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
4824 llvm::Align Alignment) {
4825 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
4826 llvm::GlobalVariable *OldGV =
nullptr;
4830 if (GV->getValueType() == Ty)
4835 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
4840 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
4845 GV->takeName(OldGV);
4847 if (!OldGV->use_empty()) {
4848 llvm::Constant *NewPtrForOldDecl =
4849 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
4850 OldGV->replaceAllUsesWith(NewPtrForOldDecl);
4853 OldGV->eraseFromParent();
4857 !GV->hasAvailableExternallyLinkage())
4858 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4860 GV->setAlignment(Alignment);
4892 setDSOLocal(cast<llvm::GlobalValue>(Ret->stripPointerCasts()));
4897 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
4905 if (GV && !GV->isDeclaration())
4910 if (!MustBeEmitted(D) && !GV) {
4911 DeferredDecls[MangledName] = D;
4916 EmitGlobalVarDefinition(D);
4920 EmitExternalVarDeclaration(D);
4929 if (LangOpts.OpenCL) {
4940 if (LangOpts.SYCLIsDevice &&
4944 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
4946 if (D->
hasAttr<CUDAConstantAttr>())
4948 if (D->
hasAttr<CUDASharedAttr>())
4950 if (D->
hasAttr<CUDADeviceAttr>())
4958 if (LangOpts.OpenMP) {
4960 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
4968 if (LangOpts.OpenCL)
4970 if (LangOpts.SYCLIsDevice)
4972 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
4980 if (
auto AS =
getTarget().getConstantAddressSpace())
4993static llvm::Constant *
4995 llvm::GlobalVariable *GV) {
4996 llvm::Constant *Cast = GV;
5002 GV->getValueType()->getPointerTo(
5008template<
typename SomeDecl>
5010 llvm::GlobalValue *GV) {
5016 if (!D->template hasAttr<UsedAttr>())
5025 const SomeDecl *
First = D->getFirstDecl();
5026 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
5032 std::pair<StaticExternCMap::iterator, bool> R =
5033 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
5038 R.first->second =
nullptr;
5045 if (D.
hasAttr<SelectAnyAttr>())
5049 if (
auto *VD = dyn_cast<VarDecl>(&D))
5063 llvm_unreachable(
"No such linkage");
5071 llvm::GlobalObject &GO) {
5074 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
5078void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
5088 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
5089 OpenMPRuntime->emitTargetGlobalVariable(D))
5092 llvm::TrackingVH<llvm::Constant> Init;
5093 bool NeedsGlobalCtor =
false;
5097 bool IsDefinitionAvailableExternally =
5099 bool NeedsGlobalDtor =
5100 !IsDefinitionAvailableExternally &&
5106 std::optional<ConstantEmitter> emitter;
5111 bool IsCUDASharedVar =
5116 bool IsCUDAShadowVar =
5118 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
5119 D->
hasAttr<CUDASharedAttr>());
5120 bool IsCUDADeviceShadowVar =
5125 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar))
5126 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5127 else if (D->
hasAttr<LoaderUninitializedAttr>())
5128 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5129 else if (!InitExpr) {
5143 emitter.emplace(*
this);
5144 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
5155 if (!IsDefinitionAvailableExternally)
5156 NeedsGlobalCtor =
true;
5159 Init = llvm::UndefValue::get(
getTypes().ConvertType(T));
5167 DelayedCXXInitPosition.erase(D);
5174 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
5179 llvm::Type* InitType = Init->getType();
5180 llvm::Constant *Entry =
5184 Entry = Entry->stripPointerCasts();
5187 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
5198 if (!GV || GV->getValueType() != InitType ||
5199 GV->getType()->getAddressSpace() !=
5203 Entry->setName(StringRef());
5206 GV = cast<llvm::GlobalVariable>(
5208 ->stripPointerCasts());
5211 llvm::Constant *NewPtrForOldDecl =
5212 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
5214 Entry->replaceAllUsesWith(NewPtrForOldDecl);
5217 cast<llvm::GlobalValue>(Entry)->eraseFromParent();
5222 if (D->
hasAttr<AnnotateAttr>())
5235 if (LangOpts.CUDA) {
5236 if (LangOpts.CUDAIsDevice) {
5237 if (
Linkage != llvm::GlobalValue::InternalLinkage &&
5238 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
5241 GV->setExternallyInitialized(
true);
5248 GV->setInitializer(Init);
5250 emitter->finalize(GV);
5253 GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
5257 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
5260 GV->setConstant(
true);
5265 if (std::optional<CharUnits> AlignValFromAllocate =
5267 AlignVal = *AlignValFromAllocate;
5285 Linkage == llvm::GlobalValue::ExternalLinkage &&
5288 Linkage = llvm::GlobalValue::InternalLinkage;
5291 if (D->
hasAttr<DLLImportAttr>())
5292 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
5293 else if (D->
hasAttr<DLLExportAttr>())
5294 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
5296 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
5298 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
5300 GV->setConstant(
false);