50#include "llvm/ADT/STLExtras.h"
51#include "llvm/ADT/StringExtras.h"
52#include "llvm/ADT/StringSwitch.h"
53#include "llvm/Analysis/TargetLibraryInfo.h"
54#include "llvm/BinaryFormat/ELF.h"
55#include "llvm/IR/AttributeMask.h"
56#include "llvm/IR/CallingConv.h"
57#include "llvm/IR/DataLayout.h"
58#include "llvm/IR/Intrinsics.h"
59#include "llvm/IR/LLVMContext.h"
60#include "llvm/IR/Module.h"
61#include "llvm/IR/ProfileSummary.h"
62#include "llvm/ProfileData/InstrProfReader.h"
63#include "llvm/ProfileData/SampleProf.h"
64#include "llvm/Support/CRC.h"
65#include "llvm/Support/CodeGen.h"
66#include "llvm/Support/CommandLine.h"
67#include "llvm/Support/ConvertUTF.h"
68#include "llvm/Support/ErrorHandling.h"
69#include "llvm/Support/TimeProfiler.h"
70#include "llvm/Support/xxhash.h"
71#include "llvm/TargetParser/RISCVISAInfo.h"
72#include "llvm/TargetParser/Triple.h"
73#include "llvm/TargetParser/X86TargetParser.h"
74#include "llvm/Transforms/Utils/BuildLibCalls.h"
78using namespace CodeGen;
81 "limited-coverage-experimental", llvm::cl::Hidden,
82 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
88 case TargetCXXABI::AppleARM64:
89 case TargetCXXABI::Fuchsia:
90 case TargetCXXABI::GenericAArch64:
91 case TargetCXXABI::GenericARM:
92 case TargetCXXABI::iOS:
93 case TargetCXXABI::WatchOS:
94 case TargetCXXABI::GenericMIPS:
95 case TargetCXXABI::GenericItanium:
96 case TargetCXXABI::WebAssembly:
97 case TargetCXXABI::XL:
99 case TargetCXXABI::Microsoft:
103 llvm_unreachable(
"invalid C++ ABI kind");
106static std::unique_ptr<TargetCodeGenInfo>
112 switch (Triple.getArch()) {
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())
145 else if (
Target.getABI() ==
"aapcs-soft")
146 Kind = AArch64ABIKind::AAPCSSoft;
147 else if (
Target.getABI() ==
"pauthtest")
148 Kind = AArch64ABIKind::PAuthTest;
153 case llvm::Triple::wasm32:
154 case llvm::Triple::wasm64: {
156 if (
Target.getABI() ==
"experimental-mv")
157 Kind = WebAssemblyABIKind::ExperimentalMV;
161 case llvm::Triple::arm:
162 case llvm::Triple::armeb:
163 case llvm::Triple::thumb:
164 case llvm::Triple::thumbeb: {
165 if (Triple.getOS() == llvm::Triple::Win32)
169 StringRef ABIStr =
Target.getABI();
170 if (ABIStr ==
"apcs-gnu")
171 Kind = ARMABIKind::APCS;
172 else if (ABIStr ==
"aapcs16")
173 Kind = ARMABIKind::AAPCS16_VFP;
174 else if (CodeGenOpts.
FloatABI ==
"hard" ||
175 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
176 Kind = ARMABIKind::AAPCS_VFP;
181 case llvm::Triple::ppc: {
182 if (Triple.isOSAIX())
189 case llvm::Triple::ppcle: {
190 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
193 case llvm::Triple::ppc64:
194 if (Triple.isOSAIX())
197 if (Triple.isOSBinFormatELF()) {
199 if (
Target.getABI() ==
"elfv2")
200 Kind = PPC64_SVR4_ABIKind::ELFv2;
201 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
206 case llvm::Triple::ppc64le: {
207 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
209 if (
Target.getABI() ==
"elfv1")
210 Kind = PPC64_SVR4_ABIKind::ELFv1;
211 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
216 case llvm::Triple::nvptx:
217 case llvm::Triple::nvptx64:
220 case llvm::Triple::msp430:
223 case llvm::Triple::riscv32:
224 case llvm::Triple::riscv64: {
225 StringRef ABIStr =
Target.getABI();
226 unsigned XLen =
Target.getPointerWidth(LangAS::Default);
227 unsigned ABIFLen = 0;
228 if (ABIStr.ends_with(
"f"))
230 else if (ABIStr.ends_with(
"d"))
232 bool EABI = ABIStr.ends_with(
"e");
236 case llvm::Triple::systemz: {
237 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
238 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
242 case llvm::Triple::tce:
243 case llvm::Triple::tcele:
246 case llvm::Triple::x86: {
247 bool IsDarwinVectorABI = Triple.isOSDarwin();
248 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
250 if (Triple.getOS() == llvm::Triple::Win32) {
252 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
253 CodeGenOpts.NumRegisterParameters);
256 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
257 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
260 case llvm::Triple::x86_64: {
261 StringRef ABI =
Target.getABI();
262 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
263 : ABI ==
"avx" ? X86AVXABILevel::AVX
264 : X86AVXABILevel::None);
266 switch (Triple.getOS()) {
267 case llvm::Triple::Win32:
273 case llvm::Triple::hexagon:
275 case llvm::Triple::lanai:
277 case llvm::Triple::r600:
279 case llvm::Triple::amdgcn:
281 case llvm::Triple::sparc:
283 case llvm::Triple::sparcv9:
285 case llvm::Triple::xcore:
287 case llvm::Triple::arc:
289 case llvm::Triple::spir:
290 case llvm::Triple::spir64:
292 case llvm::Triple::spirv32:
293 case llvm::Triple::spirv64:
294 case llvm::Triple::spirv:
296 case llvm::Triple::dxil:
298 case llvm::Triple::ve:
300 case llvm::Triple::csky: {
301 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
303 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
308 case llvm::Triple::bpfeb:
309 case llvm::Triple::bpfel:
311 case llvm::Triple::loongarch32:
312 case llvm::Triple::loongarch64: {
313 StringRef ABIStr =
Target.getABI();
314 unsigned ABIFRLen = 0;
315 if (ABIStr.ends_with(
"f"))
317 else if (ABIStr.ends_with(
"d"))
320 CGM,
Target.getPointerWidth(LangAS::Default), ABIFRLen);
326 if (!TheTargetCodeGenInfo)
328 return *TheTargetCodeGenInfo;
338 : Context(
C), LangOpts(
C.getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
339 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
341 VMContext(M.getContext()), VTables(*this), StackHandler(diags),
346 llvm::LLVMContext &LLVMContext = M.getContext();
347 VoidTy = llvm::Type::getVoidTy(LLVMContext);
348 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
349 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
350 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
351 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
352 HalfTy = llvm::Type::getHalfTy(LLVMContext);
353 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
354 FloatTy = llvm::Type::getFloatTy(LLVMContext);
355 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
361 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
363 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
365 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
366 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
367 IntPtrTy = llvm::IntegerType::get(LLVMContext,
368 C.getTargetInfo().getMaxPointerWidth());
369 Int8PtrTy = llvm::PointerType::get(LLVMContext,
371 const llvm::DataLayout &DL = M.getDataLayout();
373 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
375 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
392 createOpenCLRuntime();
394 createOpenMPRuntime();
401 if (LangOpts.
Sanitize.
hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
402 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
408 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
413 Block.GlobalUniqueCount = 0;
415 if (
C.getLangOpts().ObjC)
419 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
426 PGOReader = std::move(ReaderOrErr.get());
431 if (CodeGenOpts.CoverageMapping)
435 if (CodeGenOpts.UniqueInternalLinkageNames &&
436 !
getModule().getSourceFileName().empty()) {
440 if (
Path.rfind(Entry.first, 0) != std::string::npos) {
441 Path = Entry.second +
Path.substr(Entry.first.size());
444 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(
Path);
449 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
450 CodeGenOpts.NumRegisterParameters);
455void CodeGenModule::createObjCRuntime() {
472 llvm_unreachable(
"bad runtime kind");
475void CodeGenModule::createOpenCLRuntime() {
479void CodeGenModule::createOpenMPRuntime() {
483 case llvm::Triple::nvptx:
484 case llvm::Triple::nvptx64:
485 case llvm::Triple::amdgcn:
487 "OpenMP AMDGPU/NVPTX is only prepared to deal with device code.");
491 if (LangOpts.OpenMPSimd)
499void CodeGenModule::createCUDARuntime() {
503void CodeGenModule::createHLSLRuntime() {
508 Replacements[Name] =
C;
511void CodeGenModule::applyReplacements() {
512 for (
auto &I : Replacements) {
513 StringRef MangledName = I.first;
514 llvm::Constant *Replacement = I.second;
518 auto *OldF = cast<llvm::Function>(Entry);
519 auto *NewF = dyn_cast<llvm::Function>(Replacement);
521 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
522 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
524 auto *CE = cast<llvm::ConstantExpr>(Replacement);
525 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
526 CE->getOpcode() == llvm::Instruction::GetElementPtr);
527 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
532 OldF->replaceAllUsesWith(Replacement);
534 NewF->removeFromParent();
535 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
538 OldF->eraseFromParent();
543 GlobalValReplacements.push_back(std::make_pair(GV,
C));
546void CodeGenModule::applyGlobalValReplacements() {
547 for (
auto &I : GlobalValReplacements) {
548 llvm::GlobalValue *GV = I.first;
549 llvm::Constant *
C = I.second;
551 GV->replaceAllUsesWith(
C);
552 GV->eraseFromParent();
559 const llvm::Constant *
C;
560 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
561 C = GA->getAliasee();
562 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
563 C = GI->getResolver();
567 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
571 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
580 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
581 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
585 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
589 if (GV->hasCommonLinkage()) {
591 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
592 Diags.
Report(Location, diag::err_alias_to_common);
597 if (GV->isDeclaration()) {
598 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
599 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
600 << IsIFunc << IsIFunc;
603 for (
const auto &[
Decl, Name] : MangledDeclNames) {
604 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
606 if (II && II->
getName() == GV->getName()) {
607 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
611 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
621 const auto *F = dyn_cast<llvm::Function>(GV);
623 Diags.
Report(Location, diag::err_alias_to_undefined)
624 << IsIFunc << IsIFunc;
628 llvm::FunctionType *FTy = F->getFunctionType();
629 if (!FTy->getReturnType()->isPointerTy()) {
630 Diags.
Report(Location, diag::err_ifunc_resolver_return);
644 if (GVar->hasAttribute(
"toc-data")) {
645 auto GVId = GVar->getName();
648 Diags.
Report(Location, diag::warn_toc_unsupported_type)
649 << GVId <<
"the variable has an alias";
651 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
652 llvm::AttributeSet NewAttributes =
653 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
654 GVar->setAttributes(NewAttributes);
658void CodeGenModule::checkAliases() {
665 const auto *
D = cast<ValueDecl>(GD.getDecl());
668 bool IsIFunc =
D->
hasAttr<IFuncAttr>();
670 Location = A->getLocation();
671 Range = A->getRange();
673 llvm_unreachable(
"Not an alias or ifunc?");
677 const llvm::GlobalValue *GV =
nullptr;
679 MangledDeclNames,
Range)) {
685 if (
const llvm::GlobalVariable *GVar =
686 dyn_cast<const llvm::GlobalVariable>(GV))
690 llvm::Constant *Aliasee =
691 IsIFunc ? cast<llvm::GlobalIFunc>(Alias)->getResolver()
692 : cast<llvm::GlobalAlias>(Alias)->getAliasee();
694 llvm::GlobalValue *AliaseeGV;
695 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
696 AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0));
698 AliaseeGV = cast<llvm::GlobalValue>(Aliasee);
700 if (
const SectionAttr *SA =
D->
getAttr<SectionAttr>()) {
701 StringRef AliasSection = SA->getName();
702 if (AliasSection != AliaseeGV->getSection())
703 Diags.
Report(SA->getLocation(), diag::warn_alias_with_section)
704 << AliasSection << IsIFunc << IsIFunc;
712 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
713 if (GA->isInterposable()) {
714 Diags.
Report(Location, diag::warn_alias_to_weak_alias)
715 << GV->getName() << GA->getName() << IsIFunc;
716 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
717 GA->getAliasee(), Alias->getType());
720 cast<llvm::GlobalIFunc>(Alias)->setResolver(Aliasee);
722 cast<llvm::GlobalAlias>(Alias)->setAliasee(Aliasee);
728 cast<llvm::Function>(Aliasee)->addFnAttr(
729 llvm::Attribute::DisableSanitizerInstrumentation);
737 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
738 Alias->eraseFromParent();
743 DeferredDeclsToEmit.clear();
744 EmittedDeferredDecls.clear();
745 DeferredAnnotations.clear();
747 OpenMPRuntime->clear();
751 StringRef MainFile) {
754 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
755 if (MainFile.empty())
756 MainFile =
"<stdin>";
757 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
760 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
763 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
767static std::optional<llvm::GlobalValue::VisibilityTypes>
774 return llvm::GlobalValue::DefaultVisibility;
776 return llvm::GlobalValue::HiddenVisibility;
778 return llvm::GlobalValue::ProtectedVisibility;
780 llvm_unreachable(
"unknown option value!");
785 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
794 GV.setDSOLocal(
false);
795 GV.setVisibility(*
V);
800 if (!LO.VisibilityFromDLLStorageClass)
803 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
806 std::optional<llvm::GlobalValue::VisibilityTypes>
807 NoDLLStorageClassVisibility =
810 std::optional<llvm::GlobalValue::VisibilityTypes>
811 ExternDeclDLLImportVisibility =
814 std::optional<llvm::GlobalValue::VisibilityTypes>
815 ExternDeclNoDLLStorageClassVisibility =
818 for (llvm::GlobalValue &GV : M.global_values()) {
819 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
822 if (GV.isDeclarationForLinker())
824 llvm::GlobalValue::DLLImportStorageClass
825 ? ExternDeclDLLImportVisibility
826 : ExternDeclNoDLLStorageClassVisibility);
829 llvm::GlobalValue::DLLExportStorageClass
830 ? DLLExportVisibility
831 : NoDLLStorageClassVisibility);
833 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
838 const llvm::Triple &Triple,
840 if (Triple.isAMDGPU() || Triple.isNVPTX())
842 return LangOpts.getStackProtector() == Mode;
848 EmitModuleInitializers(Primary);
850 DeferredDecls.insert(EmittedDeferredDecls.begin(),
851 EmittedDeferredDecls.end());
852 EmittedDeferredDecls.clear();
853 EmitVTablesOpportunistically();
854 applyGlobalValReplacements();
856 emitMultiVersionFunctions();
859 GlobalTopLevelStmtBlockInFlight.first) {
861 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
862 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
868 EmitCXXModuleInitFunc(Primary);
870 EmitCXXGlobalInitFunc();
871 EmitCXXGlobalCleanUpFunc();
872 registerGlobalDtorsWithAtExit();
873 EmitCXXThreadLocalInitFunc();
875 if (llvm::Function *ObjCInitFunction =
ObjCRuntime->ModuleInitFunction())
878 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
882 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
883 OpenMPRuntime->clear();
887 PGOReader->getSummary(
false).getMD(VMContext),
888 llvm::ProfileSummary::PSK_Instr);
895 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
896 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
898 EmitStaticExternCAliases();
904 CoverageMapping->emit();
905 if (CodeGenOpts.SanitizeCfiCrossDso) {
911 emitAtAvailableLinkGuard();
919 if (
getTarget().getTargetOpts().CodeObjectVersion !=
920 llvm::CodeObjectVersionKind::COV_None) {
921 getModule().addModuleFlag(llvm::Module::Error,
922 "amdhsa_code_object_version",
923 getTarget().getTargetOpts().CodeObjectVersion);
928 auto *MDStr = llvm::MDString::get(
933 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
946 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
950 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
954 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
956 auto *GV =
new llvm::GlobalVariable(
957 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
958 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
961 if (LangOpts.HIP && !
getLangOpts().OffloadingNewDriver) {
964 auto *GV =
new llvm::GlobalVariable(
966 llvm::Constant::getNullValue(
Int8Ty),
974 if (CodeGenOpts.Autolink &&
975 (Context.
getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
976 EmitModuleLinkOptions();
991 if (!ELFDependentLibraries.empty() && !Context.
getLangOpts().CUDAIsDevice) {
992 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
993 for (
auto *MD : ELFDependentLibraries)
997 if (CodeGenOpts.DwarfVersion) {
998 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
999 CodeGenOpts.DwarfVersion);
1002 if (CodeGenOpts.Dwarf64)
1003 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1007 getModule().setSemanticInterposition(
true);
1009 if (CodeGenOpts.EmitCodeView) {
1011 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1013 if (CodeGenOpts.CodeViewGHash) {
1014 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1016 if (CodeGenOpts.ControlFlowGuard) {
1018 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 2);
1019 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1021 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 1);
1023 if (CodeGenOpts.EHContGuard) {
1025 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1029 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1031 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1036 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1038 llvm::Metadata *Ops[2] = {
1039 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1040 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1041 llvm::Type::getInt32Ty(VMContext), 1))};
1043 getModule().addModuleFlag(llvm::Module::Require,
1044 "StrictVTablePointersRequirement",
1045 llvm::MDNode::get(VMContext, Ops));
1051 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1052 llvm::DEBUG_METADATA_VERSION);
1057 uint64_t WCharWidth =
1059 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1062 getModule().addModuleFlag(llvm::Module::Warning,
1063 "zos_product_major_version",
1064 uint32_t(CLANG_VERSION_MAJOR));
1065 getModule().addModuleFlag(llvm::Module::Warning,
1066 "zos_product_minor_version",
1067 uint32_t(CLANG_VERSION_MINOR));
1068 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1069 uint32_t(CLANG_VERSION_PATCHLEVEL));
1071 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1072 llvm::MDString::get(VMContext, ProductId));
1077 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1078 llvm::MDString::get(VMContext, lang_str));
1082 : std::time(
nullptr);
1083 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1084 static_cast<uint64_t
>(TT));
1087 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1088 llvm::MDString::get(VMContext,
"ascii"));
1092 if (
T.isARM() ||
T.isThumb()) {
1094 uint64_t EnumWidth = Context.
getLangOpts().ShortEnums ? 1 : 4;
1095 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1099 StringRef ABIStr =
Target.getABI();
1100 llvm::LLVMContext &Ctx = TheModule.getContext();
1101 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1102 llvm::MDString::get(Ctx, ABIStr));
1107 const std::vector<std::string> &Features =
1110 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1111 if (!errorToBool(ParseResult.takeError()))
1113 llvm::Module::AppendUnique,
"riscv-isa",
1115 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1118 if (CodeGenOpts.SanitizeCfiCrossDso) {
1120 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1123 if (CodeGenOpts.WholeProgramVTables) {
1127 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1128 CodeGenOpts.VirtualFunctionElimination);
1131 if (LangOpts.
Sanitize.
has(SanitizerKind::CFIICall)) {
1132 getModule().addModuleFlag(llvm::Module::Override,
1133 "CFI Canonical Jump Tables",
1134 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1137 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1138 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1143 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1146 if (CodeGenOpts.PatchableFunctionEntryOffset)
1147 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1148 CodeGenOpts.PatchableFunctionEntryOffset);
1151 if (CodeGenOpts.CFProtectionReturn &&
1154 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1158 if (CodeGenOpts.CFProtectionBranch &&
1161 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1164 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1165 if (
Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1167 Scheme =
Target.getDefaultCFBranchLabelScheme();
1169 llvm::Module::Error,
"cf-branch-label-scheme",
1175 if (CodeGenOpts.FunctionReturnThunks)
1176 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1178 if (CodeGenOpts.IndirectBranchCSPrefix)
1179 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1191 LangOpts.getSignReturnAddressScope() !=
1193 getModule().addModuleFlag(llvm::Module::Override,
1194 "sign-return-address-buildattr", 1);
1195 if (LangOpts.
Sanitize.
has(SanitizerKind::MemtagStack))
1196 getModule().addModuleFlag(llvm::Module::Override,
1197 "tag-stack-memory-buildattr", 1);
1199 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1200 if (LangOpts.BranchTargetEnforcement)
1201 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1203 if (LangOpts.BranchProtectionPAuthLR)
1204 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1206 if (LangOpts.GuardedControlStack)
1207 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 1);
1209 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 1);
1211 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1214 getModule().addModuleFlag(llvm::Module::Min,
1215 "sign-return-address-with-bkey", 1);
1217 if (LangOpts.PointerAuthELFGOT)
1218 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-elf-got", 1);
1221 if (LangOpts.PointerAuthCalls)
1222 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-sign-personality",
1225 using namespace llvm::ELF;
1226 uint64_t PAuthABIVersion =
1227 (LangOpts.PointerAuthIntrinsics
1228 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1229 (LangOpts.PointerAuthCalls
1230 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1231 (LangOpts.PointerAuthReturns
1232 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1233 (LangOpts.PointerAuthAuthTraps
1234 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1235 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1236 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1237 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1238 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1239 (LangOpts.PointerAuthInitFini
1240 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1241 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1242 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1243 (LangOpts.PointerAuthELFGOT
1244 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1245 (LangOpts.PointerAuthIndirectGotos
1246 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1247 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1248 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1249 (LangOpts.PointerAuthFunctionTypeDiscrimination
1250 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1251 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1252 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1253 "Update when new enum items are defined");
1254 if (PAuthABIVersion != 0) {
1255 getModule().addModuleFlag(llvm::Module::Error,
1256 "aarch64-elf-pauthabi-platform",
1257 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1258 getModule().addModuleFlag(llvm::Module::Error,
1259 "aarch64-elf-pauthabi-version",
1265 if (CodeGenOpts.StackClashProtector)
1267 llvm::Module::Override,
"probe-stack",
1268 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1270 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1271 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1272 CodeGenOpts.StackProbeSize);
1275 llvm::LLVMContext &Ctx = TheModule.getContext();
1277 llvm::Module::Error,
"MemProfProfileFilename",
1281 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1285 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1287 llvm::DenormalMode::IEEE);
1290 if (LangOpts.EHAsynch)
1291 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1295 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1297 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1301 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1302 EmitOpenCLMetadata();
1310 llvm::Metadata *SPIRVerElts[] = {
1311 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1313 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1314 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1315 llvm::NamedMDNode *SPIRVerMD =
1316 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1317 llvm::LLVMContext &Ctx = TheModule.getContext();
1318 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1326 if (uint32_t PLevel = Context.
getLangOpts().PICLevel) {
1327 assert(PLevel < 3 &&
"Invalid PIC Level");
1328 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1330 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1334 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1335 .Case(
"tiny", llvm::CodeModel::Tiny)
1336 .Case(
"small", llvm::CodeModel::Small)
1337 .Case(
"kernel", llvm::CodeModel::Kernel)
1338 .Case(
"medium", llvm::CodeModel::Medium)
1339 .Case(
"large", llvm::CodeModel::Large)
1342 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1345 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1347 llvm::Triple::x86_64) {
1353 if (CodeGenOpts.NoPLT)
1356 CodeGenOpts.DirectAccessExternalData !=
1357 getModule().getDirectAccessExternalData()) {
1358 getModule().setDirectAccessExternalData(
1359 CodeGenOpts.DirectAccessExternalData);
1361 if (CodeGenOpts.UnwindTables)
1362 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1364 switch (CodeGenOpts.getFramePointer()) {
1369 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1372 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1375 getModule().setFramePointer(llvm::FramePointerKind::All);
1379 SimplifyPersonality();
1392 EmitVersionIdentMetadata();
1395 EmitCommandLineMetadata();
1403 getModule().setStackProtectorGuardSymbol(
1406 getModule().setStackProtectorGuardOffset(
1411 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1413 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1415 if (
getContext().getTargetInfo().getMaxTLSAlign())
1416 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1417 getContext().getTargetInfo().getMaxTLSAlign());
1435 if (
getTriple().isPPC() && !MustTailCallUndefinedGlobals.empty()) {
1436 for (
auto &I : MustTailCallUndefinedGlobals) {
1437 if (!I.first->isDefined())
1438 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1442 if (!Entry || Entry->isWeakForLinker() ||
1443 Entry->isDeclarationForLinker())
1444 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1450void CodeGenModule::EmitOpenCLMetadata() {
1456 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1457 llvm::Metadata *OCLVerElts[] = {
1458 llvm::ConstantAsMetadata::get(
1459 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1460 llvm::ConstantAsMetadata::get(
1461 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1462 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1463 llvm::LLVMContext &Ctx = TheModule.getContext();
1464 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1467 EmitVersion(
"opencl.ocl.version", CLVersion);
1468 if (LangOpts.OpenCLCPlusPlus) {
1470 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1474void CodeGenModule::EmitBackendOptionsMetadata(
1477 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1478 CodeGenOpts.SmallDataLimit);
1495 return TBAA->getTypeInfo(QTy);
1514 return TBAA->getAccessInfo(AccessType);
1521 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1527 return TBAA->getTBAAStructInfo(QTy);
1533 return TBAA->getBaseTypeInfo(QTy);
1539 return TBAA->getAccessTagInfo(Info);
1546 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1554 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1562 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1568 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1573 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1586 "cannot compile this %0 yet");
1587 std::string Msg =
Type;
1589 << Msg << S->getSourceRange();
1596 "cannot compile this %0 yet");
1597 std::string Msg =
Type;
1602 llvm::function_ref<
void()> Fn) {
1613 if (GV->hasLocalLinkage()) {
1614 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1628 Context.
getLangOpts().OpenMPIsTargetDevice && isa<VarDecl>(
D) &&
1629 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
1630 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
1631 OMPDeclareTargetDeclAttr::DT_NoHost &&
1633 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1637 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
1641 if (GV->hasDLLExportStorageClass()) {
1644 diag::err_hidden_visibility_dllexport);
1647 diag::err_non_default_visibility_dllimport);
1653 !GV->isDeclarationForLinker())
1658 llvm::GlobalValue *GV) {
1659 if (GV->hasLocalLinkage())
1662 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
1666 if (GV->hasDLLImportStorageClass())
1669 const llvm::Triple &TT = CGM.
getTriple();
1671 if (TT.isWindowsGNUEnvironment()) {
1680 if (GV->isDeclarationForLinker() && isa<llvm::GlobalVariable>(GV) &&
1689 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
1697 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
1701 if (!TT.isOSBinFormatELF())
1707 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
1713 if (!(isa<llvm::Function>(GV) && GV->canBenefitFromLocalAlias()))
1715 return !(CGM.
getLangOpts().SemanticInterposition ||
1720 if (!GV->isDeclarationForLinker())
1726 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
1733 if (CGOpts.DirectAccessExternalData) {
1739 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
1740 if (!Var->isThreadLocal())
1749 if (isa<llvm::Function>(GV) && !CGOpts.NoPLT && RM == llvm::Reloc::Static)
1765 const auto *
D = dyn_cast<NamedDecl>(GD.
getDecl());
1767 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(
D)) {
1776 if (
D &&
D->isExternallyVisible()) {
1778 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
1779 else if ((
D->
hasAttr<DLLExportAttr>() ||
1781 !GV->isDeclarationForLinker())
1782 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
1806 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
1807 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
1808 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
1809 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
1810 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
1813llvm::GlobalVariable::ThreadLocalMode
1815 switch (CodeGenOpts.getDefaultTLSModel()) {
1817 return llvm::GlobalVariable::GeneralDynamicTLSModel;
1819 return llvm::GlobalVariable::LocalDynamicTLSModel;
1821 return llvm::GlobalVariable::InitialExecTLSModel;
1823 return llvm::GlobalVariable::LocalExecTLSModel;
1825 llvm_unreachable(
"Invalid TLS model!");
1829 assert(
D.getTLSKind() &&
"setting TLS mode on non-TLS var!");
1831 llvm::GlobalValue::ThreadLocalMode TLM;
1835 if (
const TLSModelAttr *
Attr =
D.
getAttr<TLSModelAttr>()) {
1839 GV->setThreadLocalMode(TLM);
1845 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
1849 const CPUSpecificAttr *
Attr,
1871 bool OmitMultiVersionMangling =
false) {
1873 llvm::raw_svector_ostream Out(Buffer);
1882 assert(II &&
"Attempt to mangle unnamed decl.");
1883 const auto *FD = dyn_cast<FunctionDecl>(ND);
1888 Out <<
"__regcall4__" << II->
getName();
1890 Out <<
"__regcall3__" << II->
getName();
1891 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
1893 Out <<
"__device_stub__" << II->
getName();
1909 "Hash computed when not explicitly requested");
1913 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
1914 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
1915 switch (FD->getMultiVersionKind()) {
1919 FD->getAttr<CPUSpecificAttr>(),
1923 auto *
Attr = FD->getAttr<TargetAttr>();
1924 assert(
Attr &&
"Expected TargetAttr to be present "
1925 "for attribute mangling");
1931 auto *
Attr = FD->getAttr<TargetVersionAttr>();
1932 assert(
Attr &&
"Expected TargetVersionAttr to be present "
1933 "for attribute mangling");
1939 auto *
Attr = FD->getAttr<TargetClonesAttr>();
1940 assert(
Attr &&
"Expected TargetClonesAttr to be present "
1941 "for attribute mangling");
1948 llvm_unreachable(
"None multiversion type isn't valid here");
1958 return std::string(Out.str());
1961void CodeGenModule::UpdateMultiVersionNames(
GlobalDecl GD,
1963 StringRef &CurName) {
1970 std::string NonTargetName =
1978 "Other GD should now be a multiversioned function");
1988 if (OtherName != NonTargetName) {
1991 const auto ExistingRecord = Manglings.find(NonTargetName);
1992 if (ExistingRecord != std::end(Manglings))
1993 Manglings.remove(&(*ExistingRecord));
1994 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
1999 CurName = OtherNameRef;
2001 Entry->setName(OtherName);
2011 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2025 auto FoundName = MangledDeclNames.find(CanonicalGD);
2026 if (FoundName != MangledDeclNames.end())
2027 return FoundName->second;
2031 const auto *ND = cast<NamedDecl>(GD.
getDecl());
2043 assert(!isa<FunctionDecl>(ND) || !ND->hasAttr<CUDAGlobalAttr>() ||
2063 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2064 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2073 llvm::raw_svector_ostream Out(Buffer);
2076 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.
getDecl()), Out);
2077 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(
D))
2079 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(
D))
2084 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2085 return Result.first->first();
2089 auto it = MangledDeclNames.begin();
2090 while (it != MangledDeclNames.end()) {
2091 if (it->second == Name)
2106 llvm::Constant *AssociatedData) {
2114 bool IsDtorAttrFunc) {
2115 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2117 DtorsUsingAtExit[
Priority].push_back(Dtor);
2125void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2126 if (Fns.empty())
return;
2132 llvm::PointerType *PtrTy = llvm::PointerType::get(
2133 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2136 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2140 auto Ctors = Builder.beginArray(CtorStructTy);
2141 for (
const auto &I : Fns) {
2142 auto Ctor = Ctors.beginStruct(CtorStructTy);
2143 Ctor.addInt(
Int32Ty, I.Priority);
2144 if (InitFiniAuthSchema) {
2145 llvm::Constant *StorageAddress =
2147 ? llvm::ConstantExpr::getIntToPtr(
2148 llvm::ConstantInt::get(
2150 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2154 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2155 llvm::ConstantInt::get(
2157 Ctor.add(SignedCtorPtr);
2159 Ctor.add(I.Initializer);
2161 if (I.AssociatedData)
2162 Ctor.add(I.AssociatedData);
2164 Ctor.addNullPointer(PtrTy);
2165 Ctor.finishAndAddTo(Ctors);
2168 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2170 llvm::GlobalValue::AppendingLinkage);
2174 List->setAlignment(std::nullopt);
2179llvm::GlobalValue::LinkageTypes
2181 const auto *
D = cast<FunctionDecl>(GD.
getDecl());
2185 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(
D))
2192 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2193 if (!MDS)
return nullptr;
2195 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2201 FnType->getReturnType(), FnType->getParamTypes(),
2202 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2204 std::string OutName;
2205 llvm::raw_string_ostream Out(OutName);
2210 Out <<
".normalized";
2212 return llvm::ConstantInt::get(
Int32Ty,
2213 static_cast<uint32_t
>(llvm::xxHash64(OutName)));
2218 llvm::Function *F,
bool IsThunk) {
2220 llvm::AttributeList PAL;
2223 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2229 Error(
Loc,
"__vectorcall calling convention is not currently supported");
2231 F->setAttributes(PAL);
2232 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2236 std::string ReadOnlyQual(
"__read_only");
2237 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2238 if (ReadOnlyPos != std::string::npos)
2240 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2242 std::string WriteOnlyQual(
"__write_only");
2243 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2244 if (WriteOnlyPos != std::string::npos)
2245 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2247 std::string ReadWriteQual(
"__read_write");
2248 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2249 if (ReadWritePos != std::string::npos)
2250 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2283 assert(((FD && CGF) || (!FD && !CGF)) &&
2284 "Incorrect use - FD and CGF should either be both null or not!");
2310 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2313 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2318 std::string typeQuals;
2322 const Decl *PDecl = parm;
2324 PDecl = TD->getDecl();
2325 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2326 if (A && A->isWriteOnly())
2327 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2328 else if (A && A->isReadWrite())
2329 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2331 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2333 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2335 auto getTypeSpelling = [&](
QualType Ty) {
2336 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2338 if (Ty.isCanonical()) {
2339 StringRef typeNameRef = typeName;
2341 if (typeNameRef.consume_front(
"unsigned "))
2342 return std::string(
"u") + typeNameRef.str();
2343 if (typeNameRef.consume_front(
"signed "))
2344 return typeNameRef.str();
2354 addressQuals.push_back(
2355 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2359 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2360 std::string baseTypeName =
2362 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2363 argBaseTypeNames.push_back(
2364 llvm::MDString::get(VMContext, baseTypeName));
2368 typeQuals =
"restrict";
2371 typeQuals += typeQuals.empty() ?
"const" :
" const";
2373 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2375 uint32_t AddrSpc = 0;
2380 addressQuals.push_back(
2381 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2385 std::string typeName = getTypeSpelling(ty);
2397 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2398 argBaseTypeNames.push_back(
2399 llvm::MDString::get(VMContext, baseTypeName));
2404 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2408 Fn->setMetadata(
"kernel_arg_addr_space",
2409 llvm::MDNode::get(VMContext, addressQuals));
2410 Fn->setMetadata(
"kernel_arg_access_qual",
2411 llvm::MDNode::get(VMContext, accessQuals));
2412 Fn->setMetadata(
"kernel_arg_type",
2413 llvm::MDNode::get(VMContext, argTypeNames));
2414 Fn->setMetadata(
"kernel_arg_base_type",
2415 llvm::MDNode::get(VMContext, argBaseTypeNames));
2416 Fn->setMetadata(
"kernel_arg_type_qual",
2417 llvm::MDNode::get(VMContext, argTypeQuals));
2421 Fn->setMetadata(
"kernel_arg_name",
2422 llvm::MDNode::get(VMContext, argNames));
2432 if (!LangOpts.Exceptions)
return false;
2435 if (LangOpts.CXXExceptions)
return true;
2438 if (LangOpts.ObjCExceptions) {
2455 !isa<CXXConstructorDecl, CXXDestructorDecl>(MD);
2460 llvm::SetVector<const CXXRecordDecl *> MostBases;
2462 std::function<void (
const CXXRecordDecl *)> CollectMostBases;
2465 MostBases.insert(RD);
2467 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2469 CollectMostBases(RD);
2470 return MostBases.takeVector();
2474 llvm::Function *F) {
2475 llvm::AttrBuilder B(F->getContext());
2477 if ((!
D || !
D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2478 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2480 if (CodeGenOpts.StackClashProtector)
2481 B.addAttribute(
"probe-stack",
"inline-asm");
2483 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2484 B.addAttribute(
"stack-probe-size",
2485 std::to_string(CodeGenOpts.StackProbeSize));
2488 B.addAttribute(llvm::Attribute::NoUnwind);
2490 if (
D &&
D->
hasAttr<NoStackProtectorAttr>())
2492 else if (
D &&
D->
hasAttr<StrictGuardStackCheckAttr>() &&
2494 B.addAttribute(llvm::Attribute::StackProtectStrong);
2496 B.addAttribute(llvm::Attribute::StackProtect);
2498 B.addAttribute(llvm::Attribute::StackProtectStrong);
2500 B.addAttribute(llvm::Attribute::StackProtectReq);
2504 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2505 B.addAttribute(llvm::Attribute::AlwaysInline);
2509 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2511 B.addAttribute(llvm::Attribute::NoInline);
2519 if (
D->
hasAttr<ArmLocallyStreamingAttr>())
2520 B.addAttribute(
"aarch64_pstate_sm_body");
2523 if (
Attr->isNewZA())
2524 B.addAttribute(
"aarch64_new_za");
2525 if (
Attr->isNewZT0())
2526 B.addAttribute(
"aarch64_new_zt0");
2531 bool ShouldAddOptNone =
2532 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2534 ShouldAddOptNone &= !
D->
hasAttr<MinSizeAttr>();
2535 ShouldAddOptNone &= !
D->
hasAttr<AlwaysInlineAttr>();
2538 if (
getLangOpts().HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
2540 B.addAttribute(llvm::Attribute::AlwaysInline);
2541 }
else if ((ShouldAddOptNone ||
D->
hasAttr<OptimizeNoneAttr>()) &&
2542 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2544 B.addAttribute(llvm::Attribute::OptimizeNone);
2547 B.addAttribute(llvm::Attribute::NoInline);
2552 B.addAttribute(llvm::Attribute::Naked);
2555 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
2556 F->removeFnAttr(llvm::Attribute::MinSize);
2557 }
else if (
D->
hasAttr<NakedAttr>()) {
2559 B.addAttribute(llvm::Attribute::Naked);
2560 B.addAttribute(llvm::Attribute::NoInline);
2561 }
else if (
D->
hasAttr<NoDuplicateAttr>()) {
2562 B.addAttribute(llvm::Attribute::NoDuplicate);
2563 }
else if (
D->
hasAttr<NoInlineAttr>() &&
2564 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2566 B.addAttribute(llvm::Attribute::NoInline);
2567 }
else if (
D->
hasAttr<AlwaysInlineAttr>() &&
2568 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
2570 B.addAttribute(llvm::Attribute::AlwaysInline);
2574 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
2575 B.addAttribute(llvm::Attribute::NoInline);
2579 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
2582 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
2583 return Redecl->isInlineSpecified();
2585 if (any_of(FD->
redecls(), CheckRedeclForInline))
2590 return any_of(Pattern->
redecls(), CheckRedeclForInline);
2592 if (CheckForInline(FD)) {
2593 B.addAttribute(llvm::Attribute::InlineHint);
2594 }
else if (CodeGenOpts.getInlining() ==
2597 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2598 B.addAttribute(llvm::Attribute::NoInline);
2605 if (!
D->
hasAttr<OptimizeNoneAttr>()) {
2607 if (!ShouldAddOptNone)
2608 B.addAttribute(llvm::Attribute::OptimizeForSize);
2609 B.addAttribute(llvm::Attribute::Cold);
2612 B.addAttribute(llvm::Attribute::Hot);
2614 B.addAttribute(llvm::Attribute::MinSize);
2621 F->setAlignment(llvm::Align(alignment));
2624 if (LangOpts.FunctionAlignment)
2625 F->setAlignment(llvm::Align(1ull << LangOpts.FunctionAlignment));
2632 if (isa<CXXMethodDecl>(
D) && F->getPointerAlignment(
getDataLayout()) < 2)
2633 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
2638 if (CodeGenOpts.SanitizeCfiCrossDso &&
2639 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
2640 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
2651 auto *MD = dyn_cast<CXXMethodDecl>(
D);
2654 llvm::Metadata *
Id =
2657 F->addTypeMetadata(0,
Id);
2664 if (isa_and_nonnull<NamedDecl>(
D))
2667 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2672 if (
const auto *VD = dyn_cast_if_present<VarDecl>(
D);
2674 ((CodeGenOpts.KeepPersistentStorageVariables &&
2675 (VD->getStorageDuration() ==
SD_Static ||
2676 VD->getStorageDuration() ==
SD_Thread)) ||
2677 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
2678 VD->getType().isConstQualified())))
2682bool CodeGenModule::GetCPUAndFeaturesAttributes(
GlobalDecl GD,
2683 llvm::AttrBuilder &Attrs,
2684 bool SetTargetFeatures) {
2690 std::vector<std::string> Features;
2691 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
2693 const auto *TD = FD ? FD->
getAttr<TargetAttr>() :
nullptr;
2694 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
2695 assert((!TD || !TV) &&
"both target_version and target specified");
2696 const auto *SD = FD ? FD->
getAttr<CPUSpecificAttr>() :
nullptr;
2697 const auto *TC = FD ? FD->
getAttr<TargetClonesAttr>() :
nullptr;
2698 bool AddedAttr =
false;
2699 if (TD || TV || SD || TC) {
2700 llvm::StringMap<bool> FeatureMap;
2704 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
2705 Features.push_back((Entry.getValue() ?
"+" :
"-") + Entry.getKey().str());
2713 Target.parseTargetAttr(TD->getFeaturesStr());
2735 if (!TargetCPU.empty()) {
2736 Attrs.addAttribute(
"target-cpu", TargetCPU);
2739 if (!TuneCPU.empty()) {
2740 Attrs.addAttribute(
"tune-cpu", TuneCPU);
2743 if (!Features.empty() && SetTargetFeatures) {
2744 llvm::erase_if(Features, [&](
const std::string& F) {
2747 llvm::sort(Features);
2748 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
2755void CodeGenModule::setNonAliasAttributes(
GlobalDecl GD,
2756 llvm::GlobalObject *GO) {
2761 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
2764 if (
auto *SA =
D->
getAttr<PragmaClangBSSSectionAttr>())
2765 GV->addAttribute(
"bss-section", SA->getName());
2766 if (
auto *SA =
D->
getAttr<PragmaClangDataSectionAttr>())
2767 GV->addAttribute(
"data-section", SA->getName());
2768 if (
auto *SA =
D->
getAttr<PragmaClangRodataSectionAttr>())
2769 GV->addAttribute(
"rodata-section", SA->getName());
2770 if (
auto *SA =
D->
getAttr<PragmaClangRelroSectionAttr>())
2771 GV->addAttribute(
"relro-section", SA->getName());
2774 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
2777 if (
auto *SA =
D->
getAttr<PragmaClangTextSectionAttr>())
2779 F->setSection(SA->getName());
2781 llvm::AttrBuilder Attrs(F->getContext());
2782 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
2786 llvm::AttributeMask RemoveAttrs;
2787 RemoveAttrs.addAttribute(
"target-cpu");
2788 RemoveAttrs.addAttribute(
"target-features");
2789 RemoveAttrs.addAttribute(
"tune-cpu");
2790 F->removeFnAttrs(RemoveAttrs);
2791 F->addFnAttrs(Attrs);
2795 if (
const auto *CSA =
D->
getAttr<CodeSegAttr>())
2796 GO->setSection(CSA->getName());
2797 else if (
const auto *SA =
D->
getAttr<SectionAttr>())
2798 GO->setSection(SA->getName());
2811 F->setLinkage(llvm::Function::InternalLinkage);
2813 setNonAliasAttributes(GD, F);
2824 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
2828 llvm::Function *F) {
2830 if (!LangOpts.
Sanitize.
has(SanitizerKind::CFIICall))
2835 if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic())
2839 F->addTypeMetadata(0, MD);
2843 if (CodeGenOpts.SanitizeCfiCrossDso)
2845 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
2849 llvm::LLVMContext &Ctx = F->getContext();
2850 llvm::MDBuilder MDB(Ctx);
2851 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
2860 return llvm::all_of(Name, [](
const char &
C) {
2861 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
2867 for (
auto &F : M.functions()) {
2869 bool AddressTaken = F.hasAddressTaken();
2870 if (!AddressTaken && F.hasLocalLinkage())
2871 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
2876 if (!AddressTaken || !F.isDeclaration())
2879 const llvm::ConstantInt *
Type;
2880 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
2881 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
2885 StringRef Name = F.getName();
2889 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
2890 Name +
", " + Twine(
Type->getZExtValue()) +
"\n")
2892 M.appendModuleInlineAsm(
Asm);
2896void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
2897 bool IsIncompleteFunction,
2900 if (llvm::Intrinsic::ID IID = F->getIntrinsicID()) {
2903 F->setAttributes(llvm::Intrinsic::getAttributes(
getLLVMContext(), IID));
2907 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
2909 if (!IsIncompleteFunction)
2916 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
2918 assert(!F->arg_empty() &&
2919 F->arg_begin()->getType()
2920 ->canLosslesslyBitCastTo(F->getReturnType()) &&
2921 "unexpected this return");
2922 F->addParamAttr(0, llvm::Attribute::Returned);
2932 if (!IsIncompleteFunction && F->isDeclaration())
2935 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
2936 F->setSection(CSA->getName());
2937 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
2938 F->setSection(SA->getName());
2940 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
2942 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
2943 else if (EA->isWarning())
2944 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
2950 bool HasBody = FD->
hasBody(FDBody);
2952 assert(HasBody &&
"Inline builtin declarations should always have an "
2954 if (shouldEmitFunction(FDBody))
2955 F->addFnAttr(llvm::Attribute::NoBuiltin);
2961 F->addFnAttr(llvm::Attribute::NoBuiltin);
2964 if (isa<CXXConstructorDecl>(FD) || isa<CXXDestructorDecl>(FD))
2965 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2966 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
2967 if (MD->isVirtual())
2968 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2974 if (!CodeGenOpts.SanitizeCfiCrossDso ||
2975 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
2984 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
2985 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
2987 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
2991 llvm::LLVMContext &Ctx = F->getContext();
2992 llvm::MDBuilder MDB(Ctx);
2996 int CalleeIdx = *CB->encoding_begin();
2997 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
2998 F->addMetadata(llvm::LLVMContext::MD_callback,
2999 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3000 CalleeIdx, PayloadIndices,
3006 assert((isa<llvm::Function>(GV) || !GV->isDeclaration()) &&
3007 "Only globals with definition can force usage.");
3008 LLVMUsed.emplace_back(GV);
3012 assert(!GV->isDeclaration() &&
3013 "Only globals with definition can force usage.");
3014 LLVMCompilerUsed.emplace_back(GV);
3018 assert((isa<llvm::Function>(GV) || !GV->isDeclaration()) &&
3019 "Only globals with definition can force usage.");
3021 LLVMCompilerUsed.emplace_back(GV);
3023 LLVMUsed.emplace_back(GV);
3027 std::vector<llvm::WeakTrackingVH> &List) {
3034 UsedArray.resize(List.size());
3035 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3037 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3038 cast<llvm::Constant>(&*List[i]), CGM.
Int8PtrTy);
3041 if (UsedArray.empty())
3043 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3045 auto *GV =
new llvm::GlobalVariable(
3046 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3047 llvm::ConstantArray::get(ATy, UsedArray), Name);
3049 GV->setSection(
"llvm.metadata");
3052void CodeGenModule::emitLLVMUsed() {
3053 emitUsed(*
this,
"llvm.used", LLVMUsed);
3054 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3059 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3068 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3074 ELFDependentLibraries.push_back(
3075 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3082 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3097 if (
Visited.insert(Import).second)
3114 if (LL.IsFramework) {
3115 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3116 llvm::MDString::get(Context, LL.Library)};
3118 Metadata.push_back(llvm::MDNode::get(Context, Args));
3124 llvm::Metadata *Args[2] = {
3125 llvm::MDString::get(Context,
"lib"),
3126 llvm::MDString::get(Context, LL.Library),
3128 Metadata.push_back(llvm::MDNode::get(Context, Args));
3132 auto *OptString = llvm::MDString::get(Context, Opt);
3133 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3138void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3140 "We should only emit module initializers for named modules.");
3146 if (isa<ImportDecl>(
D))
3148 assert(isa<VarDecl>(
D) &&
"GMF initializer decl is not a var?");
3155 if (isa<ImportDecl>(
D))
3163 if (isa<ImportDecl>(
D))
3165 assert(isa<VarDecl>(
D) &&
"PMF initializer decl is not a var?");
3171void CodeGenModule::EmitModuleLinkOptions() {
3175 llvm::SetVector<clang::Module *> LinkModules;
3180 for (
Module *M : ImportedModules) {
3183 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3192 while (!Stack.empty()) {
3195 bool AnyChildren =
false;
3205 Stack.push_back(
SM);
3213 LinkModules.insert(Mod);
3222 for (
Module *M : LinkModules)
3225 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3226 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3229 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3230 for (
auto *MD : LinkerOptionsMetadata)
3231 NMD->addOperand(MD);
3234void CodeGenModule::EmitDeferred() {
3243 if (!DeferredVTables.empty()) {
3244 EmitDeferredVTables();
3249 assert(DeferredVTables.empty());
3256 llvm::append_range(DeferredDeclsToEmit,
3260 if (DeferredDeclsToEmit.empty())
3265 std::vector<GlobalDecl> CurDeclsToEmit;
3266 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3273 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3291 if (!GV->isDeclaration())
3295 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(
D))
3299 EmitGlobalDefinition(
D, GV);
3304 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3306 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3311void CodeGenModule::EmitVTablesOpportunistically() {
3317 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3318 &&
"Only emit opportunistic vtables with optimizations");
3322 "This queue should only contain external vtables");
3323 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3326 OpportunisticVTables.clear();
3330 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3335 DeferredAnnotations.clear();
3337 if (Annotations.empty())
3341 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3342 Annotations[0]->getType(), Annotations.size()), Annotations);
3343 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3344 llvm::GlobalValue::AppendingLinkage,
3345 Array,
"llvm.global.annotations");
3350 llvm::Constant *&AStr = AnnotationStrings[Str];
3355 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3356 auto *gv =
new llvm::GlobalVariable(
3357 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3358 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3361 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3378 SM.getExpansionLineNumber(L);
3379 return llvm::ConstantInt::get(
Int32Ty, LineNo);
3387 llvm::FoldingSetNodeID ID;
3388 for (
Expr *
E : Exprs) {
3389 ID.Add(cast<clang::ConstantExpr>(
E)->getAPValueResult());
3391 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
3396 LLVMArgs.reserve(Exprs.size());
3398 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *
E) {
3399 const auto *CE = cast<clang::ConstantExpr>(
E);
3400 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
3403 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
3404 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
3405 llvm::GlobalValue::PrivateLinkage,
Struct,
3408 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3415 const AnnotateAttr *AA,
3423 llvm::Constant *GVInGlobalsAS = GV;
3424 if (GV->getAddressSpace() !=
3426 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
3428 llvm::PointerType::get(
3429 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
3433 llvm::Constant *Fields[] = {
3434 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
3436 return llvm::ConstantStruct::getAnon(Fields);
3440 llvm::GlobalValue *GV) {
3441 assert(
D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
3451 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
3456 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
3461 return NoSanitizeL.containsLocation(Kind,
Loc);
3464 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
3468 llvm::GlobalVariable *GV,
3472 if (NoSanitizeL.containsGlobal(Kind, GV->getName(),
Category))
3475 if (NoSanitizeL.containsMainFile(
3476 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
3479 if (NoSanitizeL.containsLocation(Kind,
Loc,
Category))
3486 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
3487 Ty = AT->getElementType();
3492 if (NoSanitizeL.containsType(Kind, TypeStr,
Category))
3503 auto Attr = ImbueAttr::NONE;
3506 if (
Attr == ImbueAttr::NONE)
3507 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
3509 case ImbueAttr::NONE:
3511 case ImbueAttr::ALWAYS:
3512 Fn->addFnAttr(
"function-instrument",
"xray-always");
3514 case ImbueAttr::ALWAYS_ARG1:
3515 Fn->addFnAttr(
"function-instrument",
"xray-always");
3516 Fn->addFnAttr(
"xray-log-args",
"1");
3518 case ImbueAttr::NEVER:
3519 Fn->addFnAttr(
"function-instrument",
"xray-never");
3543 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
3557 if (NumGroups > 1) {
3558 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
3567 if (LangOpts.EmitAllDecls)
3570 const auto *VD = dyn_cast<VarDecl>(
Global);
3572 ((CodeGenOpts.KeepPersistentStorageVariables &&
3573 (VD->getStorageDuration() ==
SD_Static ||
3574 VD->getStorageDuration() ==
SD_Thread)) ||
3575 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3576 VD->getType().isConstQualified())))
3589 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
3590 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
3591 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
3592 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
3596 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
3605 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
3611 if (CXX20ModuleInits && VD->getOwningModule() &&
3612 !VD->getOwningModule()->isModuleMapModule()) {
3621 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
3624 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
3637 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3641 llvm::Constant *
Init;
3644 if (!
V.isAbsent()) {
3655 llvm::Constant *Fields[4] = {
3659 llvm::ConstantDataArray::getRaw(
3660 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
3662 Init = llvm::ConstantStruct::getAnon(Fields);
3665 auto *GV =
new llvm::GlobalVariable(
3667 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
3669 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
3672 if (!
V.isAbsent()) {
3685 llvm::GlobalVariable **Entry =
nullptr;
3686 Entry = &UnnamedGlobalConstantDeclMap[GCD];
3691 llvm::Constant *
Init;
3695 assert(!
V.isAbsent());
3699 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
3701 llvm::GlobalValue::PrivateLinkage,
Init,
3703 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3717 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3721 llvm::Constant *
Init =
Emitter.emitForInitializer(
3729 llvm::GlobalValue::LinkageTypes
Linkage =
3731 ? llvm::GlobalValue::LinkOnceODRLinkage
3732 : llvm::GlobalValue::InternalLinkage;
3733 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
3737 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
3744 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
3745 assert(AA &&
"No alias?");
3755 llvm::Constant *Aliasee;
3756 if (isa<llvm::FunctionType>(DeclTy))
3757 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
3764 auto *F = cast<llvm::GlobalValue>(Aliasee);
3765 F->setLinkage(llvm::Function::ExternalWeakLinkage);
3766 WeakRefReferences.insert(F);
3775 return A->isImplicit();
3779bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
3780 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
3785 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
3786 Global->hasAttr<CUDAConstantAttr>() ||
3787 Global->hasAttr<CUDASharedAttr>() ||
3788 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
3789 Global->getType()->isCUDADeviceBuiltinTextureType();
3796 if (
Global->hasAttr<WeakRefAttr>())
3801 if (
Global->hasAttr<AliasAttr>())
3802 return EmitAliasDefinition(GD);
3805 if (
Global->hasAttr<IFuncAttr>())
3806 return emitIFuncDefinition(GD);
3809 if (
Global->hasAttr<CPUDispatchAttr>())
3810 return emitCPUDispatchDefinition(GD);
3815 if (LangOpts.CUDA) {
3816 assert((isa<FunctionDecl>(
Global) || isa<VarDecl>(
Global)) &&
3817 "Expected Variable or Function");
3818 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
3819 if (!shouldEmitCUDAGlobalVar(VD))
3821 }
else if (LangOpts.CUDAIsDevice) {
3822 const auto *FD = dyn_cast<FunctionDecl>(
Global);
3823 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
3824 (LangOpts.OffloadImplicitHostDeviceTemplates &&
3825 hasImplicitAttr<CUDAHostAttr>(FD) &&
3826 hasImplicitAttr<CUDADeviceAttr>(FD) && !FD->
isConstexpr() &&
3828 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
3829 !
Global->hasAttr<CUDAGlobalAttr>() &&
3830 !(LangOpts.HIPStdPar && isa<FunctionDecl>(
Global) &&
3831 !
Global->hasAttr<CUDAHostAttr>()))
3834 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
3835 Global->hasAttr<CUDADeviceAttr>())
3839 if (LangOpts.OpenMP) {
3841 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
3843 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
3844 if (MustBeEmitted(
Global))
3848 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
3849 if (MustBeEmitted(
Global))
3856 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
3859 if (FD->
hasAttr<AnnotateAttr>()) {
3862 DeferredAnnotations[MangledName] = FD;
3877 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
3882 const auto *VD = cast<VarDecl>(
Global);
3883 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
3886 if (LangOpts.OpenMP) {
3888 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
3889 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
3893 if (VD->hasExternalStorage() &&
3894 Res != OMPDeclareTargetDeclAttr::MT_Link)
3897 bool UnifiedMemoryEnabled =
3899 if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3900 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3901 !UnifiedMemoryEnabled) {
3904 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
3905 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3906 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3907 UnifiedMemoryEnabled)) &&
3908 "Link clause or to clause with unified memory expected.");
3927 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
3929 EmitGlobalDefinition(GD);
3930 addEmittedDeferredDecl(GD);
3937 cast<VarDecl>(
Global)->hasInit()) {
3938 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
3939 CXXGlobalInits.push_back(
nullptr);
3945 addDeferredDeclToEmit(GD);
3946 }
else if (MustBeEmitted(
Global)) {
3948 assert(!MayBeEmittedEagerly(
Global));
3949 addDeferredDeclToEmit(GD);
3954 DeferredDecls[MangledName] = GD;
3961 if (
CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
3962 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
3969 struct FunctionIsDirectlyRecursive
3971 const StringRef Name;
3981 if (
Attr && Name ==
Attr->getLabel())
3986 StringRef BuiltinName = BI.
getName(BuiltinID);
3987 if (BuiltinName.starts_with(
"__builtin_") &&
3988 Name == BuiltinName.slice(strlen(
"__builtin_"), StringRef::npos)) {
3994 bool VisitStmt(
const Stmt *S) {
3995 for (
const Stmt *Child : S->children())
3996 if (Child && this->Visit(Child))
4003 struct DLLImportFunctionVisitor
4005 bool SafeToInline =
true;
4007 bool shouldVisitImplicitCode()
const {
return true; }
4009 bool VisitVarDecl(
VarDecl *VD) {
4012 SafeToInline =
false;
4013 return SafeToInline;
4020 return SafeToInline;
4024 if (
const auto *
D =
E->getTemporary()->getDestructor())
4025 SafeToInline =
D->
hasAttr<DLLImportAttr>();
4026 return SafeToInline;
4031 if (isa<FunctionDecl>(VD))
4032 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4033 else if (
VarDecl *
V = dyn_cast<VarDecl>(VD))
4034 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4035 return SafeToInline;
4039 SafeToInline =
E->getConstructor()->hasAttr<DLLImportAttr>();
4040 return SafeToInline;
4047 SafeToInline =
true;
4049 SafeToInline = M->
hasAttr<DLLImportAttr>();
4051 return SafeToInline;
4055 SafeToInline =
E->getOperatorDelete()->hasAttr<DLLImportAttr>();
4056 return SafeToInline;
4060 SafeToInline =
E->getOperatorNew()->hasAttr<DLLImportAttr>();
4061 return SafeToInline;
4070CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4072 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4077 Name =
Attr->getLabel();
4082 FunctionIsDirectlyRecursive Walker(Name, Context.
BuiltinInfo);
4084 return Body ? Walker.Visit(Body) :
false;
4087bool CodeGenModule::shouldEmitFunction(
GlobalDecl GD) {
4091 const auto *F = cast<FunctionDecl>(GD.
getDecl());
4094 if (F->isInlineBuiltinDeclaration())
4097 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4102 if (
const Module *M = F->getOwningModule();
4103 M && M->getTopLevelModule()->isNamedModule() &&
4104 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4114 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4119 if (F->hasAttr<NoInlineAttr>())
4122 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4124 DLLImportFunctionVisitor Visitor;
4125 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4126 if (!Visitor.SafeToInline)
4132 for (
const Decl *
Member : Dtor->getParent()->decls())
4133 if (isa<FieldDecl>(
Member))
4147 return !isTriviallyRecursive(F);
4150bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4151 return CodeGenOpts.OptimizationLevel > 0;
4154void CodeGenModule::EmitMultiVersionFunctionDefinition(
GlobalDecl GD,
4155 llvm::GlobalValue *GV) {
4156 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4159 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4160 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4162 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4163 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4166 TC->isFirstOfVersion(I))
4169 GetOrCreateMultiVersionResolver(GD);
4171 EmitGlobalFunctionDefinition(GD, GV);
4176 AddDeferredMultiVersionResolverToEmit(GD);
4179void CodeGenModule::EmitGlobalDefinition(
GlobalDecl GD, llvm::GlobalValue *GV) {
4180 const auto *
D = cast<ValueDecl>(GD.
getDecl());
4184 "Generating code for declaration");
4186 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
4189 if (!shouldEmitFunction(GD))
4192 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4194 llvm::raw_string_ostream OS(Name);
4200 if (
const auto *Method = dyn_cast<CXXMethodDecl>(
D)) {
4203 if (isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method))
4204 ABI->emitCXXStructor(GD);
4206 EmitMultiVersionFunctionDefinition(GD, GV);
4208 EmitGlobalFunctionDefinition(GD, GV);
4210 if (Method->isVirtual())
4217 return EmitMultiVersionFunctionDefinition(GD, GV);
4218 return EmitGlobalFunctionDefinition(GD, GV);
4221 if (
const auto *VD = dyn_cast<VarDecl>(
D))
4222 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4224 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4228 llvm::Function *NewFn);
4231 const CodeGenFunction::FMVResolverOption &RO) {
4233 if (RO.Architecture)
4234 Features.push_back(*RO.Architecture);
4243static llvm::GlobalValue::LinkageTypes
4247 return llvm::GlobalValue::InternalLinkage;
4248 return llvm::GlobalValue::WeakODRLinkage;
4251void CodeGenModule::emitMultiVersionFunctions() {
4252 std::vector<GlobalDecl> MVFuncsToEmit;
4253 MultiVersionFuncs.swap(MVFuncsToEmit);
4255 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4256 assert(FD &&
"Expected a FunctionDecl");
4263 if (
Decl->isDefined()) {
4264 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4272 assert(
Func &&
"This should have just been created");
4274 return cast<llvm::Function>(
Func);
4288 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4289 assert(getTarget().getTriple().isX86() &&
"Unsupported target");
4290 TA->getX86AddedFeatures(Feats);
4291 llvm::Function *Func = createFunction(CurFD);
4292 Options.emplace_back(Func, Feats, TA->getX86Architecture());
4293 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4294 if (TVA->isDefaultVersion() && IsDefined)
4295 ShouldEmitResolver = true;
4296 llvm::Function *Func = createFunction(CurFD);
4297 char Delim = getTarget().getTriple().isAArch64() ?
'+' :
',';
4298 TVA->getFeatures(Feats, Delim);
4299 Options.emplace_back(Func, Feats);
4300 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4302 ShouldEmitResolver = true;
4303 for (unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4304 if (!TC->isFirstOfVersion(I))
4307 llvm::Function *Func = createFunction(CurFD, I);
4309 if (getTarget().getTriple().isX86()) {
4310 TC->getX86Feature(Feats, I);
4311 Options.emplace_back(Func, Feats, TC->getX86Architecture(I));
4313 char Delim = getTarget().getTriple().isAArch64() ?
'+' :
',';
4314 TC->getFeatures(Feats, I, Delim);
4315 Options.emplace_back(Func, Feats);
4319 llvm_unreachable(
"unexpected MultiVersionKind");
4322 if (!ShouldEmitResolver)
4325 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
4326 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
4327 ResolverConstant = IFunc->getResolver();
4331 *
this, GD, FD,
true);
4338 auto *Alias = llvm::GlobalAlias::create(
4340 MangledName +
".ifunc", IFunc, &
getModule());
4345 llvm::Function *ResolverFunc = cast<llvm::Function>(ResolverConstant);
4350 ResolverFunc->setComdat(
4351 getModule().getOrInsertComdat(ResolverFunc->getName()));
4355 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
4356 const CodeGenFunction::FMVResolverOption &RHS) {
4360 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4366 if (!MVFuncsToEmit.empty())
4371 if (!MultiVersionFuncs.empty())
4372 emitMultiVersionFunctions();
4376 llvm::Constant *New) {
4377 assert(cast<llvm::Function>(Old)->isDeclaration() &&
"Not a declaration");
4379 Old->replaceAllUsesWith(New);
4380 Old->eraseFromParent();
4383void CodeGenModule::emitCPUDispatchDefinition(
GlobalDecl GD) {
4384 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4385 assert(FD &&
"Not a FunctionDecl?");
4387 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
4388 assert(DD &&
"Not a cpu_dispatch Function?");
4394 UpdateMultiVersionNames(GD, FD, ResolverName);
4396 llvm::Type *ResolverType;
4399 ResolverType = llvm::FunctionType::get(
4400 llvm::PointerType::get(DeclTy,
4409 auto *ResolverFunc = cast<llvm::Function>(GetOrCreateLLVMFunction(
4410 ResolverName, ResolverType, ResolverGD,
false));
4413 ResolverFunc->setComdat(
4414 getModule().getOrInsertComdat(ResolverFunc->getName()));
4427 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
4430 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
4436 Func = GetOrCreateLLVMFunction(
4437 MangledName, DeclTy, ExistingDecl,
4444 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
4445 llvm::transform(Features, Features.begin(),
4446 [](StringRef Str) { return Str.substr(1); });
4447 llvm::erase_if(Features, [&
Target](StringRef Feat) {
4448 return !
Target.validateCpuSupports(Feat);
4450 Options.emplace_back(cast<llvm::Function>(
Func), Features);
4454 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
4455 const CodeGenFunction::FMVResolverOption &RHS) {
4456 return llvm::X86::getCpuSupportsMask(LHS.Features) >
4457 llvm::X86::getCpuSupportsMask(RHS.Features);
4464 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
4465 (Options.end() - 2)->Features),
4466 [](
auto X) { return X == 0; })) {
4467 StringRef LHSName = (Options.end() - 2)->
Function->getName();
4468 StringRef RHSName = (Options.end() - 1)->
Function->getName();
4469 if (LHSName.compare(RHSName) < 0)
4470 Options.erase(Options.end() - 2);
4472 Options.erase(Options.end() - 1);
4476 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4480 auto *IFunc = cast<llvm::GlobalValue>(GetOrCreateMultiVersionResolver(GD));
4481 unsigned AS = IFunc->getType()->getPointerAddressSpace();
4485 if (!isa<llvm::GlobalIFunc>(IFunc)) {
4486 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
4493 *
this, GD, FD,
true);
4496 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
4504void CodeGenModule::AddDeferredMultiVersionResolverToEmit(
GlobalDecl GD) {
4505 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4506 assert(FD &&
"Not a FunctionDecl?");
4509 std::string MangledName =
4511 if (!DeferredResolversToEmit.insert(MangledName).second)
4514 MultiVersionFuncs.push_back(GD);
4520llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(
GlobalDecl GD) {
4521 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4522 assert(FD &&
"Not a FunctionDecl?");
4524 std::string MangledName =
4529 std::string ResolverName = MangledName;
4533 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
4537 ResolverName +=
".ifunc";
4544 ResolverName +=
".resolver";
4547 bool ShouldReturnIFunc =
4557 if (ResolverGV && (isa<llvm::GlobalIFunc>(ResolverGV) || !ShouldReturnIFunc))
4566 AddDeferredMultiVersionResolverToEmit(GD);
4570 if (ShouldReturnIFunc) {
4572 llvm::Type *ResolverType =
4573 llvm::FunctionType::get(llvm::PointerType::get(DeclTy, AS),
false);
4574 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4575 MangledName +
".resolver", ResolverType,
GlobalDecl{},
4577 llvm::GlobalIFunc *GIF =
4580 GIF->setName(ResolverName);
4587 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4589 assert(isa<llvm::GlobalValue>(Resolver) && !ResolverGV &&
4590 "Resolver should be created for the first time");
4595bool CodeGenModule::shouldDropDLLAttribute(
const Decl *
D,
4596 const llvm::GlobalValue *GV)
const {
4597 auto SC = GV->getDLLStorageClass();
4598 if (SC == llvm::GlobalValue::DefaultStorageClass)
4601 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
4602 !MRD->
hasAttr<DLLImportAttr>()) ||
4603 (SC == llvm::GlobalValue::DLLExportStorageClass &&
4604 !MRD->
hasAttr<DLLExportAttr>())) &&
4615llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
4616 StringRef MangledName, llvm::Type *Ty,
GlobalDecl GD,
bool ForVTable,
4617 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
4621 std::string NameWithoutMultiVersionMangling;
4624 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(
D)) {
4626 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
4627 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
4628 !DontDefer && !IsForDefinition) {
4631 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
4633 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
4642 UpdateMultiVersionNames(GD, FD, MangledName);
4643 if (!IsForDefinition) {
4649 AddDeferredMultiVersionResolverToEmit(GD);
4651 *
this, GD, FD,
true);
4653 return GetOrCreateMultiVersionResolver(GD);
4658 if (!NameWithoutMultiVersionMangling.empty())
4659 MangledName = NameWithoutMultiVersionMangling;
4664 if (WeakRefReferences.erase(Entry)) {
4666 if (FD && !FD->
hasAttr<WeakAttr>())
4667 Entry->setLinkage(llvm::Function::ExternalLinkage);
4671 if (
D && shouldDropDLLAttribute(
D, Entry)) {
4672 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
4678 if (IsForDefinition && !Entry->isDeclaration()) {
4685 DiagnosedConflictingDefinitions.insert(GD).second) {
4689 diag::note_previous_definition);
4693 if ((isa<llvm::Function>(Entry) || isa<llvm::GlobalAlias>(Entry)) &&
4694 (Entry->getValueType() == Ty)) {
4701 if (!IsForDefinition)
4708 bool IsIncompleteFunction =
false;
4710 llvm::FunctionType *FTy;
4711 if (isa<llvm::FunctionType>(Ty)) {
4712 FTy = cast<llvm::FunctionType>(Ty);
4714 FTy = llvm::FunctionType::get(
VoidTy,
false);
4715 IsIncompleteFunction =
true;
4719 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
4720 Entry ? StringRef() : MangledName, &
getModule());
4725 DeferredAnnotations[MangledName] = cast<ValueDecl>(
D);
4742 if (!Entry->use_empty()) {
4744 Entry->removeDeadConstantUsers();
4750 assert(F->getName() == MangledName &&
"name was uniqued!");
4752 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
4753 if (ExtraAttrs.hasFnAttrs()) {
4754 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
4762 if (isa_and_nonnull<CXXDestructorDecl>(
D) &&
4763 getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(
D),
4765 addDeferredDeclToEmit(GD);
4770 auto DDI = DeferredDecls.find(MangledName);
4771 if (DDI != DeferredDecls.end()) {
4775 addDeferredDeclToEmit(DDI->second);
4776 DeferredDecls.erase(DDI);
4791 for (
const auto *FD = cast<FunctionDecl>(
D)->getMostRecentDecl(); FD;
4804 if (!IsIncompleteFunction) {
4805 assert(F->getFunctionType() == Ty);
4821 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4828 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
4831 DD->getParent()->getNumVBases() == 0)
4836 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
4837 false, llvm::AttributeList(),
4840 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
4841 cast<FunctionDecl>(GD.
getDecl())->hasAttr<CUDAGlobalAttr>()) {
4843 cast<llvm::Function>(F->stripPointerCasts()), GD);
4844 if (IsForDefinition)
4852 llvm::GlobalValue *F =
4855 return llvm::NoCFIValue::get(F);
4865 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
4868 if (!
C.getLangOpts().CPlusPlus)
4873 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
4874 ?
C.Idents.get(
"terminate")
4875 :
C.Idents.get(Name);
4877 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
4881 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
4882 for (
const auto *
Result : LSD->lookup(&NS))
4883 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
4888 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
4897 llvm::Function *F, StringRef Name) {
4903 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
4906 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
4907 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
4908 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
4915 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
4916 if (AssumeConvergent) {
4918 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
4926 llvm::Constant *
C = GetOrCreateLLVMFunction(
4928 false,
false, ExtraAttrs);
4930 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
4946 llvm::AttributeList ExtraAttrs,
bool Local,
4947 bool AssumeConvergent) {
4948 if (AssumeConvergent) {
4950 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
4954 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
4958 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
4967 markRegisterParameterAttributes(F);
4993 if (WeakRefReferences.erase(Entry)) {
4995 Entry->setLinkage(llvm::Function::ExternalLinkage);
4999 if (
D && shouldDropDLLAttribute(
D, Entry))
5000 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5002 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd &&
D)
5005 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5010 if (IsForDefinition && !Entry->isDeclaration()) {
5018 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5020 DiagnosedConflictingDefinitions.insert(
D).second) {
5024 diag::note_previous_definition);
5029 if (Entry->getType()->getAddressSpace() != TargetAS)
5030 return llvm::ConstantExpr::getAddrSpaceCast(
5031 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5035 if (!IsForDefinition)
5041 auto *GV =
new llvm::GlobalVariable(
5042 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5043 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5044 getContext().getTargetAddressSpace(DAddrSpace));
5049 GV->takeName(Entry);
5051 if (!Entry->use_empty()) {
5052 Entry->replaceAllUsesWith(GV);
5055 Entry->eraseFromParent();
5061 auto DDI = DeferredDecls.find(MangledName);
5062 if (DDI != DeferredDecls.end()) {
5065 addDeferredDeclToEmit(DDI->second);
5066 DeferredDecls.erase(DDI);
5071 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5076 GV->setConstant(
D->getType().isConstantStorage(
getContext(),
false,
false));
5078 GV->setAlignment(
getContext().getDeclAlign(
D).getAsAlign());
5082 if (
D->getTLSKind()) {
5084 CXXThreadLocals.push_back(
D);
5092 if (
getContext().isMSStaticDataMemberInlineDefinition(
D)) {
5093 EmitGlobalVarDefinition(
D);
5097 if (
D->hasExternalStorage()) {
5098 if (
const SectionAttr *SA =
D->
getAttr<SectionAttr>())
5099 GV->setSection(SA->getName());
5103 if (
getTriple().getArch() == llvm::Triple::xcore &&
5105 D->getType().isConstant(Context) &&
5107 GV->setSection(
".cp.rodata");
5110 if (
const auto *CMA =
D->
getAttr<CodeModelAttr>())
5111 GV->setCodeModel(CMA->getModel());
5116 if (Context.
getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5117 D->getType().isConstQualified() && !GV->hasInitializer() &&
5118 !
D->hasDefinition() &&
D->hasInit() && !
D->
hasAttr<DLLImportAttr>()) {
5122 if (!HasMutableFields) {
5124 const Expr *InitExpr =
D->getAnyInitializer(InitDecl);
5129 auto *InitType =
Init->getType();
5130 if (GV->getValueType() != InitType) {
5135 GV->setName(StringRef());
5138 auto *NewGV = cast<llvm::GlobalVariable>(
5140 ->stripPointerCasts());
5143 GV->eraseFromParent();
5146 GV->setInitializer(
Init);
5147 GV->setConstant(
true);
5148 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5163 D->hasExternalStorage())
5168 SanitizerMD->reportGlobal(GV, *
D);
5171 D ?
D->getType().getAddressSpace()
5173 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5174 if (DAddrSpace != ExpectedAS) {
5176 *
this, GV, DAddrSpace, ExpectedAS,
5187 if (isa<CXXConstructorDecl>(
D) || isa<CXXDestructorDecl>(
D))
5189 false, IsForDefinition);
5191 if (isa<CXXMethodDecl>(
D)) {
5199 if (isa<FunctionDecl>(
D)) {
5210 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5211 llvm::Align Alignment) {
5212 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5213 llvm::GlobalVariable *OldGV =
nullptr;
5217 if (GV->getValueType() == Ty)
5222 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
5227 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
5232 GV->takeName(OldGV);
5234 if (!OldGV->use_empty()) {
5235 OldGV->replaceAllUsesWith(GV);
5238 OldGV->eraseFromParent();
5242 !GV->hasAvailableExternallyLinkage())
5243 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
5245 GV->setAlignment(Alignment);
5259 assert(
D->hasGlobalStorage() &&
"Not a global variable");
5277 setDSOLocal(cast<llvm::GlobalValue>(Ret->stripPointerCasts()));
5282 assert(!
D->getInit() &&
"Cannot emit definite definitions here!");
5290 if (GV && !GV->isDeclaration())
5295 if (!MustBeEmitted(
D) && !GV) {
5296 DeferredDecls[MangledName] =
D;
5301 EmitGlobalVarDefinition(
D);
5305 if (
auto const *
V = dyn_cast<const VarDecl>(
D))
5306 EmitExternalVarDeclaration(
V);
5307 if (
auto const *FD = dyn_cast<const FunctionDecl>(
D))
5308 EmitExternalFunctionDeclaration(FD);
5317 if (LangOpts.OpenCL) {
5328 if (LangOpts.SYCLIsDevice &&
5332 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
5334 if (
D->
hasAttr<CUDAConstantAttr>())
5340 if (
D->getType().isConstQualified())
5346 if (LangOpts.OpenMP) {
5348 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(
D, AS))
5356 if (LangOpts.OpenCL)
5358 if (LangOpts.SYCLIsDevice)
5360 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
5368 if (
auto AS =
getTarget().getConstantAddressSpace())
5381static llvm::Constant *
5383 llvm::GlobalVariable *GV) {
5384 llvm::Constant *Cast = GV;
5390 llvm::PointerType::get(
5397template<
typename SomeDecl>
5399 llvm::GlobalValue *GV) {
5405 if (!
D->template hasAttr<UsedAttr>())
5414 const SomeDecl *
First =
D->getFirstDecl();
5415 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
5421 std::pair<StaticExternCMap::iterator, bool> R =
5422 StaticExternCValues.insert(std::make_pair(
D->getIdentifier(), GV));
5427 R.first->second =
nullptr;
5438 if (
auto *VD = dyn_cast<VarDecl>(&
D))
5452 llvm_unreachable(
"No such linkage");
5460 llvm::GlobalObject &GO) {
5463 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
5471void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *
D,
5481 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
5482 OpenMPRuntime->emitTargetGlobalVariable(
D))
5485 llvm::TrackingVH<llvm::Constant>
Init;
5486 bool NeedsGlobalCtor =
false;
5490 bool IsDefinitionAvailableExternally =
5492 bool NeedsGlobalDtor =
5493 !IsDefinitionAvailableExternally &&
5500 if (IsDefinitionAvailableExternally &&
5501 (!
D->hasConstantInitialization() ||
5505 !
D->getType().isConstantStorage(
getContext(),
true,
true)))
5509 const Expr *InitExpr =
D->getAnyInitializer(InitDecl);
5511 std::optional<ConstantEmitter> emitter;
5516 bool IsCUDASharedVar =
5521 bool IsCUDAShadowVar =
5525 bool IsCUDADeviceShadowVar =
5527 (
D->getType()->isCUDADeviceBuiltinSurfaceType() ||
5528 D->getType()->isCUDADeviceBuiltinTextureType());
5530 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar))
5531 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5532 else if (
D->
hasAttr<LoaderUninitializedAttr>())
5533 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5534 else if (!InitExpr) {
5548 emitter.emplace(*
this);
5549 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
5552 if (
D->getType()->isReferenceType())
5557 if (!IsDefinitionAvailableExternally)
5558 NeedsGlobalCtor =
true;
5562 NeedsGlobalCtor =
false;
5574 DelayedCXXInitPosition.erase(
D);
5581 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
5586 llvm::Type* InitType =
Init->getType();
5587 llvm::Constant *Entry =
5591 Entry = Entry->stripPointerCasts();
5594 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
5605 if (!GV || GV->getValueType() != InitType ||
5606 GV->getType()->getAddressSpace() !=
5610 Entry->setName(StringRef());
5613 GV = cast<llvm::GlobalVariable>(
5615 ->stripPointerCasts());
5618 llvm::Constant *NewPtrForOldDecl =
5619 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
5621 Entry->replaceAllUsesWith(NewPtrForOldDecl);
5624 cast<llvm::GlobalValue>(Entry)->eraseFromParent();
5642 if (LangOpts.CUDA) {
5643 if (LangOpts.CUDAIsDevice) {
5644 if (
Linkage != llvm::GlobalValue::InternalLinkage &&
5646 D->getType()->isCUDADeviceBuiltinSurfaceType() ||
5647 D->getType()->isCUDADeviceBuiltinTextureType()))
5648 GV->setExternallyInitialized(
true);
5658 GV->setInitializer(
Init);
5660 emitter->finalize(GV);
5663 GV->setConstant((
D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
5664 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
5665 D->getType().isConstantStorage(
getContext(),
true,
true)));
5668 if (
const SectionAttr *SA =
D->
getAttr<SectionAttr>()) {
5671 GV->setConstant(
true);
5676 if (std::optional<CharUnits> AlignValFromAllocate =
5678 AlignVal = *AlignValFromAllocate;
5696 Linkage == llvm::GlobalValue::ExternalLinkage &&
5699 Linkage = llvm::GlobalValue::InternalLinkage;
5703 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
5704 else if (
D->
hasAttr<DLLExportAttr>())
5705 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
5707 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
5709 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
5711 GV->setConstant(
false);
5716 if (!GV->getInitializer()->isNullValue())
5717 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
5720 setNonAliasAttributes(
D, GV);
5722 if (
D->getTLSKind() && !GV->isThreadLocal()) {
5724 CXXThreadLocals.push_back(
D);
5731 if (NeedsGlobalCtor || NeedsGlobalDtor)
5732 EmitCXXGlobalVarDeclInitFunc(
D, GV, NeedsGlobalCtor);
5734 SanitizerMD->reportGlobal(GV, *
D, NeedsGlobalCtor);
5739 DI->EmitGlobalVariable(GV,
D);
5742void CodeGenModule::EmitExternalVarDeclaration(
const VarDecl *
D) {
5747 llvm::Constant *GV =
5749 DI->EmitExternalVariable(
5750 cast<llvm::GlobalVariable>(GV->stripPointerCasts()),
D);
5754void CodeGenModule::EmitExternalFunctionDeclaration(
const FunctionDecl *FD) {
5759 auto *
Fn = cast<llvm::Function>(
5760 GetOrCreateLLVMFunction(MangledName, Ty, FD,
false));
5761 if (!
Fn->getSubprogram())
5778 if (
D->getInit() ||
D->hasExternalStorage())
5788 if (
D->
hasAttr<PragmaClangBSSSectionAttr>() ||
5789 D->
hasAttr<PragmaClangDataSectionAttr>() ||
5790 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
5791 D->
hasAttr<PragmaClangRodataSectionAttr>())
5795 if (
D->getTLSKind())
5818 if (FD->isBitField())
5820 if (FD->
hasAttr<AlignedAttr>())
5842llvm::GlobalValue::LinkageTypes
5846 return llvm::Function::InternalLinkage;
5849 return llvm::GlobalVariable::WeakAnyLinkage;
5853 return llvm::GlobalVariable::LinkOnceAnyLinkage;
5858 return llvm::GlobalValue::AvailableExternallyLinkage;
5872 return !Context.
getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
5873 : llvm::Function::InternalLinkage;
5887 return llvm::Function::ExternalLinkage;
5890 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
5891 : llvm::Function::InternalLinkage;
5892 return llvm::Function::WeakODRLinkage;
5899 CodeGenOpts.NoCommon))
5900 return llvm::GlobalVariable::CommonLinkage;
5907 return llvm::GlobalVariable::WeakODRLinkage;
5911 return llvm::GlobalVariable::ExternalLinkage;
5914llvm::GlobalValue::LinkageTypes
5923 llvm::Function *newFn) {
5925 if (old->use_empty())
5928 llvm::Type *newRetTy = newFn->getReturnType();
5933 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
5935 llvm::User *user = ui->getUser();
5939 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
5940 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
5946 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
5949 if (!callSite->isCallee(&*ui))
5954 if (callSite->getType() != newRetTy && !callSite->use_empty())
5959 llvm::AttributeList oldAttrs = callSite->getAttributes();
5962 unsigned newNumArgs = newFn->arg_size();
5963 if (callSite->arg_size() < newNumArgs)
5969 bool dontTransform =
false;
5970 for (llvm::Argument &A : newFn->args()) {
5971 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
5972 dontTransform =
true;
5977 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
5985 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
5989 callSite->getOperandBundlesAsDefs(newBundles);
5991 llvm::CallBase *newCall;
5992 if (isa<llvm::CallInst>(callSite)) {
5993 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
5994 callSite->getIterator());
5996 auto *oldInvoke = cast<llvm::InvokeInst>(callSite);
5997 newCall = llvm::InvokeInst::Create(
5998 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
5999 newArgs, newBundles,
"", callSite->getIterator());
6003 if (!newCall->getType()->isVoidTy())
6004 newCall->takeName(callSite);
6005 newCall->setAttributes(
6006 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6007 oldAttrs.getRetAttrs(), newArgAttrs));
6008 newCall->setCallingConv(callSite->getCallingConv());
6011 if (!callSite->use_empty())
6012 callSite->replaceAllUsesWith(newCall);
6015 if (callSite->getDebugLoc())
6016 newCall->setDebugLoc(callSite->getDebugLoc());
6018 callSitesToBeRemovedFromParent.push_back(callSite);
6021 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6022 callSite->eraseFromParent();
6036 llvm::Function *NewFn) {
6038 if (!isa<llvm::Function>(Old))
return;
6046 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6058void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6059 llvm::GlobalValue *GV) {
6060 const auto *
D = cast<FunctionDecl>(GD.
getDecl());
6067 if (!GV || (GV->getValueType() != Ty))
6073 if (!GV->isDeclaration())
6080 auto *Fn = cast<llvm::Function>(GV);
6092 setNonAliasAttributes(GD, Fn);
6095 if (
const ConstructorAttr *CA =
D->
getAttr<ConstructorAttr>())
6097 if (
const DestructorAttr *DA =
D->
getAttr<DestructorAttr>())
6103void CodeGenModule::EmitAliasDefinition(
GlobalDecl GD) {
6104 const auto *
D = cast<ValueDecl>(GD.
getDecl());
6105 const AliasAttr *AA =
D->
getAttr<AliasAttr>();
6106 assert(AA &&
"Not an alias?");
6110 if (AA->getAliasee() == MangledName) {
6111 Diags.
Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6118 if (Entry && !Entry->isDeclaration())
6121 Aliases.push_back(GD);
6127 llvm::Constant *Aliasee;
6128 llvm::GlobalValue::LinkageTypes
LT;
6129 if (isa<llvm::FunctionType>(DeclTy)) {
6130 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6136 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6143 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6145 llvm::GlobalAlias::create(DeclTy, AS,
LT,
"", Aliasee, &
getModule());
6148 if (GA->getAliasee() == Entry) {
6149 Diags.
Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6153 assert(Entry->isDeclaration());
6162 GA->takeName(Entry);
6164 Entry->replaceAllUsesWith(GA);
6165 Entry->eraseFromParent();
6167 GA->setName(MangledName);
6175 GA->setLinkage(llvm::Function::WeakAnyLinkage);
6178 if (
const auto *VD = dyn_cast<VarDecl>(
D))
6179 if (VD->getTLSKind())
6185 if (isa<VarDecl>(
D))
6187 DI->EmitGlobalAlias(cast<llvm::GlobalValue>(GA->getAliasee()->stripPointerCasts()), GD);
6190void CodeGenModule::emitIFuncDefinition(
GlobalDecl GD) {
6191 const auto *
D = cast<ValueDecl>(GD.
getDecl());
6192 const IFuncAttr *IFA =
D->
getAttr<IFuncAttr>();
6193 assert(IFA &&
"Not an ifunc?");
6197 if (IFA->getResolver() == MangledName) {
6198 Diags.
Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6204 if (Entry && !Entry->isDeclaration()) {
6207 DiagnosedConflictingDefinitions.insert(GD).second) {
6211 diag::note_previous_definition);
6216 Aliases.push_back(GD);
6222 llvm::Constant *Resolver =
6223 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
6227 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
6228 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
6230 if (GIF->getResolver() == Entry) {
6231 Diags.
Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6234 assert(Entry->isDeclaration());
6243 GIF->takeName(Entry);
6245 Entry->replaceAllUsesWith(GIF);
6246 Entry->eraseFromParent();
6248 GIF->setName(MangledName);
6254 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
6255 (llvm::Intrinsic::ID)IID, Tys);
6258static llvm::StringMapEntry<llvm::GlobalVariable *> &
6261 bool &IsUTF16,
unsigned &StringLength) {
6262 StringRef String = Literal->getString();
6263 unsigned NumBytes = String.size();
6266 if (!Literal->containsNonAsciiOrNull()) {
6267 StringLength = NumBytes;
6268 return *Map.insert(std::make_pair(String,
nullptr)).first;
6275 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
6276 llvm::UTF16 *ToPtr = &ToBuf[0];
6278 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
6279 ToPtr + NumBytes, llvm::strictConversion);
6282 StringLength = ToPtr - &ToBuf[0];
6286 return *Map.insert(std::make_pair(
6287 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
6288 (StringLength + 1) * 2),
6294 unsigned StringLength = 0;
6295 bool isUTF16 =
false;
6296 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
6301 if (
auto *
C = Entry.second)
6306 const llvm::Triple &Triple =
getTriple();
6309 const bool IsSwiftABI =
6310 static_cast<unsigned>(CFRuntime) >=
6315 if (!CFConstantStringClassRef) {
6316 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
6318 Ty = llvm::ArrayType::get(Ty, 0);
6320 switch (CFRuntime) {
6324 CFConstantStringClassName =
6325 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
6326 :
"$s10Foundation19_NSCFConstantStringCN";
6330 CFConstantStringClassName =
6331 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
6332 :
"$S10Foundation19_NSCFConstantStringCN";
6336 CFConstantStringClassName =
6337 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
6338 :
"__T010Foundation19_NSCFConstantStringCN";
6345 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
6346 llvm::GlobalValue *GV =
nullptr;
6348 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
6355 if ((VD = dyn_cast<VarDecl>(
Result)))
6358 if (Triple.isOSBinFormatELF()) {
6360 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6362 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6363 if (!VD || !VD->
hasAttr<DLLExportAttr>())
6364 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6366 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6374 CFConstantStringClassRef =
6375 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
6380 auto *STy = cast<llvm::StructType>(
getTypes().ConvertType(CFTy));
6383 auto Fields = Builder.beginStruct(STy);
6386 Fields.add(cast<llvm::Constant>(CFConstantStringClassRef));
6390 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
6391 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
6393 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
6397 llvm::Constant *
C =
nullptr;
6400 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
6401 Entry.first().size() / 2);
6402 C = llvm::ConstantDataArray::get(VMContext, Arr);
6404 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
6410 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
6411 llvm::GlobalValue::PrivateLinkage,
C,
".str");
6412 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
6422 if (Triple.isOSBinFormatMachO())
6423 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
6424 :
"__TEXT,__cstring,cstring_literals");
6427 else if (Triple.isOSBinFormatELF())
6428 GV->setSection(
".rodata");
6434 llvm::IntegerType *LengthTy =
6444 Fields.addInt(LengthTy, StringLength);
6452 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
6454 llvm::GlobalVariable::PrivateLinkage);
6455 GV->addAttribute(
"objc_arc_inert");
6456 switch (Triple.getObjectFormat()) {
6457 case llvm::Triple::UnknownObjectFormat:
6458 llvm_unreachable(
"unknown file format");
6459 case llvm::Triple::DXContainer:
6460 case llvm::Triple::GOFF:
6461 case llvm::Triple::SPIRV:
6462 case llvm::Triple::XCOFF:
6463 llvm_unreachable(
"unimplemented");
6464 case llvm::Triple::COFF:
6465 case llvm::Triple::ELF:
6466 case llvm::Triple::Wasm:
6467 GV->setSection(
"cfstring");
6469 case llvm::Triple::MachO:
6470 GV->setSection(
"__DATA,__cfstring");
6479 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
6483 if (ObjCFastEnumerationStateType.
isNull()) {
6485 D->startDefinition();
6493 for (
size_t i = 0; i < 4; ++i) {
6498 FieldTypes[i],
nullptr,
6506 D->completeDefinition();
6510 return ObjCFastEnumerationStateType;
6519 if (
E->getCharByteWidth() == 1) {
6524 assert(CAT &&
"String literal not of constant array type!");
6526 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
6530 llvm::Type *ElemTy = AType->getElementType();
6531 unsigned NumElements = AType->getNumElements();
6534 if (ElemTy->getPrimitiveSizeInBits() == 16) {
6536 Elements.reserve(NumElements);
6538 for(
unsigned i = 0, e =
E->getLength(); i != e; ++i)
6539 Elements.push_back(
E->getCodeUnit(i));
6540 Elements.resize(NumElements);
6541 return llvm::ConstantDataArray::get(VMContext, Elements);
6544 assert(ElemTy->getPrimitiveSizeInBits() == 32);
6546 Elements.reserve(NumElements);
6548 for(
unsigned i = 0, e =
E->getLength(); i != e; ++i)
6549 Elements.push_back(
E->getCodeUnit(i));
6550 Elements.resize(NumElements);
6551 return llvm::ConstantDataArray::get(VMContext, Elements);
6554static llvm::GlobalVariable *
6563 auto *GV =
new llvm::GlobalVariable(
6564 M,
C->getType(), !CGM.
getLangOpts().WritableStrings,
LT,
C, GlobalName,
6565 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
6567 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
6568 if (GV->isWeakForLinker()) {
6569 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
6570 GV->setComdat(M.getOrInsertComdat(GV->getName()));
6586 llvm::GlobalVariable **Entry =
nullptr;
6587 if (!LangOpts.WritableStrings) {
6588 Entry = &ConstantStringMap[
C];
6589 if (
auto GV = *Entry) {
6590 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
6593 GV->getValueType(), Alignment);
6598 StringRef GlobalVariableName;
6599 llvm::GlobalValue::LinkageTypes
LT;
6604 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
6605 !LangOpts.WritableStrings) {
6606 llvm::raw_svector_ostream Out(MangledNameBuffer);
6608 LT = llvm::GlobalValue::LinkOnceODRLinkage;
6609 GlobalVariableName = MangledNameBuffer;
6611 LT = llvm::GlobalValue::PrivateLinkage;
6612 GlobalVariableName = Name;
6624 SanitizerMD->reportGlobal(GV, S->getStrTokenLoc(0),
"<string literal>");
6627 GV->getValueType(), Alignment);
6644 const std::string &Str,
const char *GlobalName) {
6645 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
6650 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
6653 llvm::GlobalVariable **Entry =
nullptr;
6654 if (!LangOpts.WritableStrings) {
6655 Entry = &ConstantStringMap[
C];
6656 if (
auto GV = *Entry) {
6657 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
6660 GV->getValueType(), Alignment);
6666 GlobalName =
".str";
6669 GlobalName, Alignment);
6674 GV->getValueType(), Alignment);
6679 assert((
E->getStorageDuration() ==
SD_Static ||
6680 E->getStorageDuration() ==
SD_Thread) &&
"not a global temporary");
6681 const auto *VD = cast<VarDecl>(
E->getExtendingDecl());
6686 if (
Init ==
E->getSubExpr())
6691 auto InsertResult = MaterializedGlobalTemporaryMap.insert({
E,
nullptr});
6692 if (!InsertResult.second) {
6695 if (!InsertResult.first->second) {
6700 InsertResult.first->second =
new llvm::GlobalVariable(
6701 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
6705 llvm::cast<llvm::GlobalVariable>(
6706 InsertResult.first->second->stripPointerCasts())
6715 llvm::raw_svector_ostream Out(Name);
6717 VD,
E->getManglingNumber(), Out);
6720 if (
E->getStorageDuration() ==
SD_Static && VD->evaluateValue()) {
6726 Value =
E->getOrCreateValue(
false);
6737 std::optional<ConstantEmitter> emitter;
6738 llvm::Constant *InitialValue =
nullptr;
6739 bool Constant =
false;
6743 emitter.emplace(*
this);
6744 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
6749 Type = InitialValue->getType();
6758 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
6760 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
6764 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
6768 Linkage = llvm::GlobalVariable::InternalLinkage;
6772 auto *GV =
new llvm::GlobalVariable(
6774 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
6775 if (emitter) emitter->finalize(GV);
6777 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
6779 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
6781 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6785 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6786 if (VD->getTLSKind())
6788 llvm::Constant *CV = GV;
6792 llvm::PointerType::get(
6798 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[
E];
6800 Entry->replaceAllUsesWith(CV);
6801 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
6810void CodeGenModule::EmitObjCPropertyImplementations(
const
6812 for (
const auto *PID :
D->property_impls()) {
6823 if (!Getter || Getter->isSynthesizedAccessorStub())
6826 auto *Setter = PID->getSetterMethodDecl();
6827 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
6838 if (ivar->getType().isDestructedType())
6848 E =
D->init_end(); B !=
E; ++B) {
6871 D->addInstanceMethod(DTORMethod);
6873 D->setHasDestructors(
true);
6878 if (
D->getNumIvarInitializers() == 0 ||
6892 D->addInstanceMethod(CTORMethod);
6894 D->setHasNonZeroConstructors(
true);
6905 EmitDeclContext(LSD);
6910 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
6913 std::unique_ptr<CodeGenFunction> &CurCGF =
6914 GlobalTopLevelStmtBlockInFlight.first;
6918 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
6926 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
6932 llvm::Function *
Fn = llvm::Function::Create(
6933 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
6936 GlobalTopLevelStmtBlockInFlight.second =
D;
6937 CurCGF->StartFunction(
GlobalDecl(), RetTy, Fn, FnInfo, Args,
6939 CXXGlobalInits.push_back(Fn);
6942 CurCGF->EmitStmt(
D->getStmt());
6945void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
6946 for (
auto *I : DC->
decls()) {
6952 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
6953 for (
auto *M : OID->methods())
6972 case Decl::CXXConversion:
6973 case Decl::CXXMethod:
6974 case Decl::Function:
6981 case Decl::CXXDeductionGuide:
6986 case Decl::Decomposition:
6987 case Decl::VarTemplateSpecialization:
6989 if (
auto *DD = dyn_cast<DecompositionDecl>(
D))
6990 for (
auto *B : DD->bindings())
6991 if (
auto *HD = B->getHoldingVar())
6997 case Decl::IndirectField:
7001 case Decl::Namespace:
7002 EmitDeclContext(cast<NamespaceDecl>(
D));
7004 case Decl::ClassTemplateSpecialization: {
7005 const auto *Spec = cast<ClassTemplateSpecializationDecl>(
D);
7007 if (Spec->getSpecializationKind() ==
7009 Spec->hasDefinition())
7010 DI->completeTemplateDefinition(*Spec);
7012 case Decl::CXXRecord: {
7019 DI->completeUnusedClass(*CRD);
7022 for (
auto *I : CRD->
decls())
7023 if (isa<VarDecl>(I) || isa<CXXRecordDecl>(I))
7028 case Decl::UsingShadow:
7029 case Decl::ClassTemplate:
7030 case Decl::VarTemplate:
7032 case Decl::VarTemplatePartialSpecialization:
7033 case Decl::FunctionTemplate:
7034 case Decl::TypeAliasTemplate:
7041 DI->EmitUsingDecl(cast<UsingDecl>(*
D));
7043 case Decl::UsingEnum:
7045 DI->EmitUsingEnumDecl(cast<UsingEnumDecl>(*
D));
7047 case Decl::NamespaceAlias:
7049 DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*
D));
7051 case Decl::UsingDirective:
7053 DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*
D));
7055 case Decl::CXXConstructor:
7058 case Decl::CXXDestructor:
7062 case Decl::StaticAssert:
7069 case Decl::ObjCInterface:
7070 case Decl::ObjCCategory:
7073 case Decl::ObjCProtocol: {
7074 auto *Proto = cast<ObjCProtocolDecl>(
D);
7075 if (Proto->isThisDeclarationADefinition())
7080 case Decl::ObjCCategoryImpl:
7083 ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(
D));
7086 case Decl::ObjCImplementation: {
7087 auto *OMD = cast<ObjCImplementationDecl>(
D);
7088 EmitObjCPropertyImplementations(OMD);
7089 EmitObjCIvarInitializations(OMD);
7094 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7095 OMD->getClassInterface()), OMD->getLocation());
7098 case Decl::ObjCMethod: {
7099 auto *OMD = cast<ObjCMethodDecl>(
D);
7105 case Decl::ObjCCompatibleAlias:
7106 ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(
D));
7109 case Decl::PragmaComment: {
7110 const auto *PCD = cast<PragmaCommentDecl>(
D);
7111 switch (PCD->getCommentKind()) {
7113 llvm_unreachable(
"unexpected pragma comment kind");
7128 case Decl::PragmaDetectMismatch: {
7129 const auto *PDMD = cast<PragmaDetectMismatchDecl>(
D);
7134 case Decl::LinkageSpec:
7135 EmitLinkageSpec(cast<LinkageSpecDecl>(
D));
7138 case Decl::FileScopeAsm: {
7140 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7143 if (LangOpts.OpenMPIsTargetDevice)
7146 if (LangOpts.SYCLIsDevice)
7148 auto *AD = cast<FileScopeAsmDecl>(
D);
7149 getModule().appendModuleInlineAsm(AD->getAsmString()->getString());
7153 case Decl::TopLevelStmt:
7154 EmitTopLevelStmt(cast<TopLevelStmtDecl>(
D));
7157 case Decl::Import: {
7158 auto *Import = cast<ImportDecl>(
D);
7161 if (!ImportedModules.insert(Import->getImportedModule()))
7165 if (!Import->getImportedOwningModule()) {
7167 DI->EmitImportDecl(*Import);
7173 if (CXX20ModuleInits && Import->getImportedModule() &&
7174 Import->getImportedModule()->isNamedModule())
7183 Visited.insert(Import->getImportedModule());
7184 Stack.push_back(Import->getImportedModule());
7186 while (!Stack.empty()) {
7188 if (!EmittedModuleInitializers.insert(Mod).second)
7198 if (Submodule->IsExplicit)
7201 if (
Visited.insert(Submodule).second)
7202 Stack.push_back(Submodule);
7209 EmitDeclContext(cast<ExportDecl>(
D));
7212 case Decl::OMPThreadPrivate:
7216 case Decl::OMPAllocate:
7220 case Decl::OMPDeclareReduction:
7224 case Decl::OMPDeclareMapper:
7228 case Decl::OMPRequires:
7233 case Decl::TypeAlias:
7235 DI->EmitAndRetainType(
7236 getContext().getTypedefType(cast<TypedefNameDecl>(
D)));
7248 DI->EmitAndRetainType(
getContext().getEnumType(cast<EnumDecl>(
D)));
7251 case Decl::HLSLBuffer:
7259 assert(isa<TypeDecl>(
D) &&
"Unsupported decl kind");
7266 if (!CodeGenOpts.CoverageMapping)
7269 case Decl::CXXConversion:
7270 case Decl::CXXMethod:
7271 case Decl::Function:
7272 case Decl::ObjCMethod:
7273 case Decl::CXXConstructor:
7274 case Decl::CXXDestructor: {
7275 if (!cast<FunctionDecl>(
D)->doesThisDeclarationHaveABody())
7283 DeferredEmptyCoverageMappingDecls.try_emplace(
D,
true);
7293 if (!CodeGenOpts.CoverageMapping)
7295 if (
const auto *Fn = dyn_cast<FunctionDecl>(
D)) {
7296 if (Fn->isTemplateInstantiation())
7299 DeferredEmptyCoverageMappingDecls.insert_or_assign(
D,
false);
7307 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
7310 const Decl *
D = Entry.first;
7312 case Decl::CXXConversion:
7313 case Decl::CXXMethod:
7314 case Decl::Function:
7315 case Decl::ObjCMethod: {
7322 case Decl::CXXConstructor: {
7329 case Decl::CXXDestructor: {
7346 if (llvm::Function *F =
getModule().getFunction(
"main")) {
7347 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
7349 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
7350 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
7359 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
7360 return llvm::ConstantInt::get(i64, PtrInt);
7364 llvm::NamedMDNode *&GlobalMetadata,
7366 llvm::GlobalValue *Addr) {
7367 if (!GlobalMetadata)
7369 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
7372 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(Addr),
7375 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
7378bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
7379 llvm::GlobalValue *CppFunc) {
7387 if (Elem == CppFunc)
7393 for (llvm::User *User : Elem->users()) {
7397 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
7398 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
7401 for (llvm::User *CEUser : ConstExpr->users()) {
7402 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
7403 IFuncs.push_back(IFunc);
7408 CEs.push_back(ConstExpr);
7409 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
7410 IFuncs.push_back(IFunc);
7422 for (llvm::GlobalIFunc *IFunc : IFuncs)
7423 IFunc->setResolver(
nullptr);
7424 for (llvm::ConstantExpr *ConstExpr : CEs)
7425 ConstExpr->destroyConstant();
7429 Elem->eraseFromParent();
7431 for (llvm::GlobalIFunc *IFunc : IFuncs) {
7436 llvm::FunctionType::get(IFunc->getType(),
false);
7437 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
7438 CppFunc->getName(), ResolverTy, {},
false);
7439 IFunc->setResolver(Resolver);
7449void CodeGenModule::EmitStaticExternCAliases() {
7452 for (
auto &I : StaticExternCValues) {
7454 llvm::GlobalValue *Val = I.second;
7462 llvm::GlobalValue *ExistingElem =
7463 getModule().getNamedValue(Name->getName());
7467 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
7474 auto Res = Manglings.find(MangledName);
7475 if (Res == Manglings.end())
7477 Result = Res->getValue();
7488void CodeGenModule::EmitDeclMetadata() {
7489 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7491 for (
auto &I : MangledDeclNames) {
7492 llvm::GlobalValue *Addr =
getModule().getNamedValue(I.second);
7502void CodeGenFunction::EmitDeclMetadata() {
7503 if (LocalDeclMap.empty())
return;
7508 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
7510 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7512 for (
auto &I : LocalDeclMap) {
7513 const Decl *
D = I.first;
7514 llvm::Value *Addr = I.second.emitRawPointer(*
this);
7515 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {
7517 Alloca->setMetadata(
7518 DeclPtrKind, llvm::MDNode::get(
7519 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
7520 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) {
7527void CodeGenModule::EmitVersionIdentMetadata() {
7528 llvm::NamedMDNode *IdentMetadata =
7529 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
7531 llvm::LLVMContext &Ctx = TheModule.getContext();
7533 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
7534 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
7537void CodeGenModule::EmitCommandLineMetadata() {
7538 llvm::NamedMDNode *CommandLineMetadata =
7539 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
7541 llvm::LLVMContext &Ctx = TheModule.getContext();
7543 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
7544 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
7547void CodeGenModule::EmitCoverageFile() {
7548 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
7552 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
7553 llvm::LLVMContext &Ctx = TheModule.getContext();
7554 auto *CoverageDataFile =
7556 auto *CoverageNotesFile =
7558 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
7559 llvm::MDNode *CU = CUNode->getOperand(i);
7560 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
7561 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
7582 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
7584 for (
auto RefExpr :
D->varlist()) {
7585 auto *VD = cast<VarDecl>(cast<DeclRefExpr>(RefExpr)->getDecl());
7587 VD->getAnyInitializer() &&
7588 !VD->getAnyInitializer()->isConstantInitializer(
getContext(),
7595 VD, Addr, RefExpr->getBeginLoc(), PerformInit))
7596 CXXGlobalInits.push_back(InitFunction);
7601CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
7605 FnType->getReturnType(), FnType->getParamTypes(),
7606 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
7608 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
7613 std::string OutName;
7614 llvm::raw_string_ostream Out(OutName);
7619 Out <<
".normalized";
7633 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
7638 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
7658 for (
auto &Param : FnType->param_types())
7663 GeneralizedParams, FnType->getExtProtoInfo());
7670 llvm_unreachable(
"Encountered unknown FunctionType");
7675 GeneralizedMetadataIdMap,
".generalized");
7682 return ((LangOpts.
Sanitize.
has(SanitizerKind::CFIVCall) &&
7684 (LangOpts.
Sanitize.
has(SanitizerKind::CFINVCall) &&
7686 (LangOpts.
Sanitize.
has(SanitizerKind::CFIDerivedCast) &&
7688 (LangOpts.
Sanitize.
has(SanitizerKind::CFIUnrelatedCast) &&
7695 llvm::Metadata *MD =
7697 VTable->addTypeMetadata(Offset.getQuantity(), MD);
7699 if (CodeGenOpts.SanitizeCfiCrossDso)
7701 VTable->addTypeMetadata(Offset.getQuantity(),
7702 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
7705 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
7706 VTable->addTypeMetadata(Offset.getQuantity(), MD);
7712 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
7722 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
7737 bool forPointeeType) {
7748 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
7778 if (
T.getQualifiers().hasUnaligned()) {
7780 }
else if (forPointeeType && !AlignForArray &&
7792 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
7805 if (NumAutoVarInit >= StopAfter) {
7808 if (!NumAutoVarInit) {
7811 "-ftrivial-auto-var-init-stop-after=%0 has been enabled to limit the "
7812 "number of times ftrivial-auto-var-init=%1 gets applied.");
7826 const Decl *
D)
const {
7830 OS << (isa<VarDecl>(
D) ?
".static." :
".intern.");
7832 OS << (isa<VarDecl>(
D) ?
"__static__" :
"__intern__");
7838 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
7842 llvm::MD5::MD5Result
Result;
7843 for (
const auto &Arg : PreprocessorOpts.
Macros)
7844 Hash.update(Arg.first);
7848 llvm::sys::fs::UniqueID ID;
7849 if (llvm::sys::fs::getUniqueID(PLoc.
getFilename(), ID)) {
7851 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
7852 if (
auto EC = llvm::sys::fs::getUniqueID(PLoc.
getFilename(), ID))
7853 SM.getDiagnostics().Report(diag::err_cannot_open_file)
7856 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
7857 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
7864 assert(DeferredDeclsToEmit.empty() &&
7865 "Should have emitted all decls deferred to emit.");
7866 assert(NewBuilder->DeferredDecls.empty() &&
7867 "Newly created module should not have deferred decls");
7868 NewBuilder->DeferredDecls = std::move(DeferredDecls);
7869 assert(EmittedDeferredDecls.empty() &&
7870 "Still have (unmerged) EmittedDeferredDecls deferred decls");
7872 assert(NewBuilder->DeferredVTables.empty() &&
7873 "Newly created module should not have deferred vtables");
7874 NewBuilder->DeferredVTables = std::move(DeferredVTables);
7876 assert(NewBuilder->MangledDeclNames.empty() &&
7877 "Newly created module should not have mangled decl names");
7878 assert(NewBuilder->Manglings.empty() &&
7879 "Newly created module should not have manglings");
7880 NewBuilder->Manglings = std::move(Manglings);
7882 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
7884 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
Defines the clang::ASTContext interface.
ASTImporterLookupTable & LT
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 void AppendCPUSpecificCPUDispatchMangling(const CodeGenModule &CGM, const CPUSpecificAttr *Attr, unsigned CPUIndex, raw_ostream &Out)
static unsigned getFMVPriority(const TargetInfo &TI, const CodeGenFunction::FMVResolverOption &RO)
static bool AllTrivialInitializers(CodeGenModule &CGM, ObjCImplementationDecl *D)
static const FunctionDecl * GetRuntimeFunctionDecl(ASTContext &C, StringRef Name)
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 std::string getCPUSpecificMangling(const CodeGenModule &CGM, StringRef Name)
static void setWindowsItaniumDLLImport(CodeGenModule &CGM, bool Local, llvm::Function *F, StringRef Name)
static const char AnnotationSection[]
static bool isUniqueInternalLinkageDecl(GlobalDecl GD, CodeGenModule &CGM)
static QualType GeneralizeFunctionType(ASTContext &Ctx, QualType Ty)
static bool allowKCFIIdentifier(StringRef Name)
static bool shouldAssumeDSOLocal(const CodeGenModule &CGM, llvm::GlobalValue *GV)
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 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 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 bool shouldBeInCOMDAT(CodeGenModule &CGM, const Decl &D)
static std::string getMangledNameImpl(CodeGenModule &CGM, GlobalDecl GD, const NamedDecl *ND, bool OmitMultiVersionMangling=false)
static void setLinkageForGV(llvm::GlobalValue *GV, const NamedDecl *ND)
static unsigned ArgInfoAddressSpace(LangAS AS)
static void replaceDeclarationWith(llvm::GlobalValue *Old, llvm::Constant *New)
static QualType GeneralizeType(ASTContext &Ctx, QualType Ty)
static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, llvm::Function *NewFn)
ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we implement a function with...
static bool isVarDeclStrongDefinition(const ASTContext &Context, CodeGenModule &CGM, const VarDecl *D, bool NoCommon)
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::DenseSet< const void * > Visited
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
static const RecordType * getRecordType(QualType QT)
Checks that the passed in QualType either is of RecordType or points to RecordType.
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()
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
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
llvm::StringMap< SectionInfo > SectionInfos
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
QualType getMemberPointerType(QualType T, const Type *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
QualType getRecordType(const RecordDecl *Decl) 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()'.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
FullSourceLoc getFullLoc(SourceLocation Loc) const
const XRayFunctionFilter & getXRayFilter() const
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
RecordDecl * buildImplicitRecord(StringRef Name, RecordDecl::TagKind TK=RecordDecl::TagKind::Struct) const
Create a new implicit TU-level CXXRecordDecl or RecordDecl declaration.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
StringRef getCUIDHash() const
bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const
Returns true if this is an inline-initialized static data member which is treated as a definition for...
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
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.
llvm::SetVector< const ValueDecl * > CUDAExternalDeviceDeclODRUsedByHost
Keep track of CUDA/HIP external kernels or device variables ODR-used by host code.
QualType getCFConstantStringType() const
Return the C structure type used to represent constant CFStrings.
const NoSanitizeList & getNoSanitizeList() const
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
CanQualType UnsignedLongTy
bool isAlignmentRequired(const Type *T) const
Determine if the alignment the type has was required using an alignment attribute.
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
const clang::PrintingPolicy & getPrintingPolicy() const
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
QualType getObjCIdType() const
Represents the Objective-CC id type.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const
Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...
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.
unsigned getTargetAddressSpace(LangAS AS) const
QualType getWideCharType() const
Return the type of wide characters.
InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const
Determine whether a definition of this inline variable should be treated as a weak or strong definiti...
Module * getCurrentNamedModule() const
Get module under construction, nullptr if this is not a C++20 module.
uint64_t getCharWidth() const
Return the size of the character type, in bits.
Attr - This represents one attribute.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
bool isLibFunction(unsigned ID) const
Return true if this is a builtin for a libc/libm function, with a "__builtin_" prefix (e....
llvm::StringRef getName(unsigned ID) const
Return the identifier name for the specified builtin, e.g.
Represents a base class of a C++ class.
Represents binding an expression to a temporary.
Represents a call to a C++ constructor.
Represents a C++ base or member initializer.
Expr * getInit() const
Get the initializer.
Represents a delete expression for memory deallocation and destructor calls, e.g.
Represents a C++ destructor within a class.
Represents a call to a member function that may be written either with member call syntax (e....
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.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Represents a C++ struct/union/class.
bool hasMutableFields() const
Determine whether this class, or any of its class subobjects, contains a mutable field.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool hasDefinition() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
CanProxy< U > castAs() const
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 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::string CoverageNotesFile
The filename with path we use for coverage notes files.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string MemoryProfileOutput
Name of the profile file to use as output for with -fmemory-profile.
std::vector< std::string > TocDataVarsUserSpecified
List of global variables explicitly specified by the user as toc-data.
std::string CoverageDataFile
The filename with path we use for coverage data files.
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
llvm::DenormalMode FP32DenormalMode
The floating-point denormal mode to use, for float.
SanitizerSet SanitizeTrap
Set of sanitizer checks that trap rather than diagnose.
std::string ProfileRemappingFile
Name of the profile remapping file to apply to the profile data supplied by -fprofile-sample-use or -...
bool hasProfileClangUse() const
Check if Clang profile use is on.
std::string SymbolPartition
The name of the partition that symbols are assigned to, specified with -fsymbol-partition (see https:...
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 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 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...
Class supports emissionof SIMD-only code.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP, ObjCMethodDecl *MD, bool ctor)
void GenerateObjCMethod(const ObjCMethodDecl *OMD)
void EmitCfiCheckStub()
Emit a stub for the cross-DSO CFI check function.
void EmitCfiCheckFail()
Emit a cross-DSO CFI failure handling function.
bool isTrivialInitializer(const Expr *Init)
Determine whether the given initializer is trivial in the sense that it requires no code to be genera...
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.
void GenerateObjCGetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCGetter - Synthesize an Objective-C property getter function.
llvm::LLVMContext & getLLVMContext()
void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)
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.
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.
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 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.
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 AppendLinkerOptions(StringRef Opts)
Appends Opts to the "llvm.linker.options" metadata value.
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.
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)
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 CreateFunctionTypeMetadataForIcall(const FunctionDecl *FD, llvm::Function *F)
Create and attach type metadata to the given function.
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 addReplacement(StringRef Name, llvm::Constant *C)
llvm::ConstantInt * CreateKCFITypeId(QualType T)
Generate a KCFI type identifier for T.
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.
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, const char *GlobalName=nullptr)
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 GenerateClassData(const CXXRecordDecl *RD)
GenerateClassData - Generate all the class data required to be generated upon definition of a KeyFunc...
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.
FunctionArgList - Type for representing both the decl and type of parameters to a function.
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, LangAS DestAddr, 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.
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
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.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
A reference to a declared variable, function, enum, etc.
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.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
const Attr * getDefiningAttr() const
Return this declaration's defining attribute if it has one.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
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.
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 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 * 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 isReplaceableGlobalAllocationFunction(std::optional< unsigned > *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
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.
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...
bool isSignReturnAddressWithAKey() const
Check if return address signing uses AKey.
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
bool hasSignReturnAddress() const
Check if return address signing is enabled.
std::map< std::string, std::string, std::greater< std::string > > MacroPrefixMap
A prefix map for FILE, BASE_FILE and __builtin_FILE().
LangStandard::Kind LangStd
The used language standard.
bool isSignReturnAddressScopeAll() const
Check if leaf functions are also signed.
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
Represents a linkage specification.
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.
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.
Represent a C++ namespace.
This represents '#pragma omp threadprivate ...' directive.
ObjCEncodeExpr, used for @encode in Objective-C.
const ObjCInterfaceDecl * getClassInterface() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
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()
ObjCMethodDecl - Represents an instance or class method declaration.
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?
bool isGNUFamily() const
Is this runtime basically of the GNU family of runtimes?
@ 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...
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
std::vector< std::pair< std::string, bool > > Macros
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.
PrettyStackTraceDecl - If a crash occurs, indicate that it happened when doing something to a specifi...
std::optional< ExclusionType > isFunctionExcluded(StringRef FunctionName, CodeGenOptions::ProfileInstrKind Kind) const
std::optional< ExclusionType > isLocationExcluded(SourceLocation Loc, CodeGenOptions::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.
ExclusionType getDefault(CodeGenOptions::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFileExcluded(StringRef FileName, CodeGenOptions::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.
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
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
decl_type * 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.
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Smart pointer class that efficiently represents Objective-C method names.
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.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Stmt - This represents one statement.
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
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.
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
virtual unsigned getFMVPriority(ArrayRef< StringRef > Features) const
bool supportsIFunc() const
Identify whether this target supports IFuncs.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
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 Type * getTypeForDecl() const
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
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.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isObjCObjectPointerType() const
Linkage getLinkage() const
Determine the linkage of this type.
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
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.
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
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 > 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 > createPNaClTargetCodeGenInfo(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)
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
The JSON file list parser is used to communicate input to InstallAPI.
CXXCtorType
C++ constructor types.
@ Ctor_Base
Base object ctor.
@ Ctor_Complete
Complete object ctor.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, DiagnosticsEngine &Diags)
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)
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...
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
StringRef languageToString(Language L)
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
static const char * getCFBranchLabelSchemeFlagVal(const CFBranchLabelSchemeKind Scheme)
const FunctionProtoType * T
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.
@ 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
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
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
Extra information about a function prototype.
static const LangStandard & getLangStandardForKind(Kind K)
Parts of a decomposed MSGuidDecl.
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.
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.