52#include "llvm/ADT/STLExtras.h"
53#include "llvm/ADT/StringExtras.h"
54#include "llvm/ADT/StringSwitch.h"
55#include "llvm/Analysis/TargetLibraryInfo.h"
56#include "llvm/BinaryFormat/ELF.h"
57#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
58#include "llvm/IR/AttributeMask.h"
59#include "llvm/IR/CallingConv.h"
60#include "llvm/IR/DataLayout.h"
61#include "llvm/IR/Intrinsics.h"
62#include "llvm/IR/LLVMContext.h"
63#include "llvm/IR/Module.h"
64#include "llvm/IR/ProfileSummary.h"
65#include "llvm/ProfileData/InstrProfReader.h"
66#include "llvm/ProfileData/SampleProf.h"
67#include "llvm/Support/CRC.h"
68#include "llvm/Support/CodeGen.h"
69#include "llvm/Support/CommandLine.h"
70#include "llvm/Support/ConvertUTF.h"
71#include "llvm/Support/ErrorHandling.h"
72#include "llvm/Support/TimeProfiler.h"
73#include "llvm/Support/xxhash.h"
74#include "llvm/TargetParser/RISCVISAInfo.h"
75#include "llvm/TargetParser/Triple.h"
76#include "llvm/TargetParser/X86TargetParser.h"
77#include "llvm/Transforms/Utils/BuildLibCalls.h"
81using namespace CodeGen;
84 "limited-coverage-experimental", llvm::cl::Hidden,
85 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
91 case TargetCXXABI::AppleARM64:
92 case TargetCXXABI::Fuchsia:
93 case TargetCXXABI::GenericAArch64:
94 case TargetCXXABI::GenericARM:
95 case TargetCXXABI::iOS:
96 case TargetCXXABI::WatchOS:
97 case TargetCXXABI::GenericMIPS:
98 case TargetCXXABI::GenericItanium:
99 case TargetCXXABI::WebAssembly:
100 case TargetCXXABI::XL:
102 case TargetCXXABI::Microsoft:
106 llvm_unreachable(
"invalid C++ ABI kind");
109static std::unique_ptr<TargetCodeGenInfo>
115 switch (Triple.getArch()) {
119 case llvm::Triple::m68k:
121 case llvm::Triple::mips:
122 case llvm::Triple::mipsel:
123 if (Triple.getOS() == llvm::Triple::NaCl)
127 case llvm::Triple::mips64:
128 case llvm::Triple::mips64el:
131 case llvm::Triple::avr: {
135 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
136 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
140 case llvm::Triple::aarch64:
141 case llvm::Triple::aarch64_32:
142 case llvm::Triple::aarch64_be: {
144 if (
Target.getABI() ==
"darwinpcs")
145 Kind = AArch64ABIKind::DarwinPCS;
146 else if (Triple.isOSWindows())
148 else if (
Target.getABI() ==
"aapcs-soft")
149 Kind = AArch64ABIKind::AAPCSSoft;
150 else if (
Target.getABI() ==
"pauthtest")
151 Kind = AArch64ABIKind::PAuthTest;
156 case llvm::Triple::wasm32:
157 case llvm::Triple::wasm64: {
159 if (
Target.getABI() ==
"experimental-mv")
160 Kind = WebAssemblyABIKind::ExperimentalMV;
164 case llvm::Triple::arm:
165 case llvm::Triple::armeb:
166 case llvm::Triple::thumb:
167 case llvm::Triple::thumbeb: {
168 if (Triple.getOS() == llvm::Triple::Win32)
172 StringRef ABIStr =
Target.getABI();
173 if (ABIStr ==
"apcs-gnu")
174 Kind = ARMABIKind::APCS;
175 else if (ABIStr ==
"aapcs16")
176 Kind = ARMABIKind::AAPCS16_VFP;
177 else if (CodeGenOpts.
FloatABI ==
"hard" ||
179 (Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
180 Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
181 Triple.getEnvironment() == llvm::Triple::EABIHF)))
182 Kind = ARMABIKind::AAPCS_VFP;
187 case llvm::Triple::ppc: {
188 if (Triple.isOSAIX())
195 case llvm::Triple::ppcle: {
196 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
199 case llvm::Triple::ppc64:
200 if (Triple.isOSAIX())
203 if (Triple.isOSBinFormatELF()) {
205 if (
Target.getABI() ==
"elfv2")
206 Kind = PPC64_SVR4_ABIKind::ELFv2;
207 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
212 case llvm::Triple::ppc64le: {
213 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
215 if (
Target.getABI() ==
"elfv1")
216 Kind = PPC64_SVR4_ABIKind::ELFv1;
217 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
222 case llvm::Triple::nvptx:
223 case llvm::Triple::nvptx64:
226 case llvm::Triple::msp430:
229 case llvm::Triple::riscv32:
230 case llvm::Triple::riscv64: {
231 StringRef ABIStr =
Target.getABI();
232 unsigned XLen =
Target.getPointerWidth(LangAS::Default);
233 unsigned ABIFLen = 0;
234 if (ABIStr.ends_with(
"f"))
236 else if (ABIStr.ends_with(
"d"))
238 bool EABI = ABIStr.ends_with(
"e");
242 case llvm::Triple::systemz: {
243 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
244 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
248 case llvm::Triple::tce:
249 case llvm::Triple::tcele:
252 case llvm::Triple::x86: {
253 bool IsDarwinVectorABI = Triple.isOSDarwin();
254 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
256 if (Triple.getOS() == llvm::Triple::Win32) {
258 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
259 CodeGenOpts.NumRegisterParameters);
262 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
263 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
266 case llvm::Triple::x86_64: {
267 StringRef ABI =
Target.getABI();
268 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
269 : ABI ==
"avx" ? X86AVXABILevel::AVX
270 : X86AVXABILevel::None);
272 switch (Triple.getOS()) {
273 case llvm::Triple::Win32:
279 case llvm::Triple::hexagon:
281 case llvm::Triple::lanai:
283 case llvm::Triple::r600:
285 case llvm::Triple::amdgcn:
287 case llvm::Triple::sparc:
289 case llvm::Triple::sparcv9:
291 case llvm::Triple::xcore:
293 case llvm::Triple::arc:
295 case llvm::Triple::spir:
296 case llvm::Triple::spir64:
298 case llvm::Triple::spirv32:
299 case llvm::Triple::spirv64:
301 case llvm::Triple::ve:
303 case llvm::Triple::csky: {
304 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
306 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
311 case llvm::Triple::bpfeb:
312 case llvm::Triple::bpfel:
314 case llvm::Triple::loongarch32:
315 case llvm::Triple::loongarch64: {
316 StringRef ABIStr =
Target.getABI();
317 unsigned ABIFRLen = 0;
318 if (ABIStr.ends_with(
"f"))
320 else if (ABIStr.ends_with(
"d"))
323 CGM,
Target.getPointerWidth(LangAS::Default), ABIFRLen);
329 if (!TheTargetCodeGenInfo)
331 return *TheTargetCodeGenInfo;
341 : Context(
C), LangOpts(
C.getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
342 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
344 VMContext(M.getContext()), VTables(*this),
349 llvm::LLVMContext &LLVMContext = M.getContext();
350 VoidTy = llvm::Type::getVoidTy(LLVMContext);
351 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
352 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
353 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
354 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
355 HalfTy = llvm::Type::getHalfTy(LLVMContext);
356 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
357 FloatTy = llvm::Type::getFloatTy(LLVMContext);
358 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
364 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
366 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
368 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
369 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
370 IntPtrTy = llvm::IntegerType::get(LLVMContext,
371 C.getTargetInfo().getMaxPointerWidth());
372 Int8PtrTy = llvm::PointerType::get(LLVMContext,
374 const llvm::DataLayout &DL = M.getDataLayout();
376 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
378 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
395 createOpenCLRuntime();
397 createOpenMPRuntime();
404 if (LangOpts.
Sanitize.
has(SanitizerKind::Thread) ||
405 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
411 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
416 Block.GlobalUniqueCount = 0;
418 if (
C.getLangOpts().ObjC)
422 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
429 PGOReader = std::move(ReaderOrErr.get());
434 if (CodeGenOpts.CoverageMapping)
438 if (CodeGenOpts.UniqueInternalLinkageNames &&
439 !
getModule().getSourceFileName().empty()) {
443 if (
Path.rfind(Entry.first, 0) != std::string::npos) {
444 Path = Entry.second +
Path.substr(Entry.first.size());
447 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(
Path);
452 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
453 CodeGenOpts.NumRegisterParameters);
458void CodeGenModule::createObjCRuntime() {
475 llvm_unreachable(
"bad runtime kind");
478void CodeGenModule::createOpenCLRuntime() {
482void CodeGenModule::createOpenMPRuntime() {
486 case llvm::Triple::nvptx:
487 case llvm::Triple::nvptx64:
488 case llvm::Triple::amdgcn:
490 "OpenMP AMDGPU/NVPTX is only prepared to deal with device code.");
494 if (LangOpts.OpenMPSimd)
502void CodeGenModule::createCUDARuntime() {
506void CodeGenModule::createHLSLRuntime() {
511 Replacements[Name] =
C;
514void CodeGenModule::applyReplacements() {
515 for (
auto &I : Replacements) {
516 StringRef MangledName = I.first;
517 llvm::Constant *Replacement = I.second;
521 auto *OldF = cast<llvm::Function>(Entry);
522 auto *NewF = dyn_cast<llvm::Function>(Replacement);
524 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
525 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
527 auto *CE = cast<llvm::ConstantExpr>(Replacement);
528 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
529 CE->getOpcode() == llvm::Instruction::GetElementPtr);
530 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
535 OldF->replaceAllUsesWith(Replacement);
537 NewF->removeFromParent();
538 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
541 OldF->eraseFromParent();
546 GlobalValReplacements.push_back(std::make_pair(GV,
C));
549void CodeGenModule::applyGlobalValReplacements() {
550 for (
auto &I : GlobalValReplacements) {
551 llvm::GlobalValue *GV = I.first;
552 llvm::Constant *
C = I.second;
554 GV->replaceAllUsesWith(
C);
555 GV->eraseFromParent();
562 const llvm::Constant *
C;
563 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
564 C = GA->getAliasee();
565 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
566 C = GI->getResolver();
570 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
574 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
583 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
584 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
588 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
592 if (GV->hasCommonLinkage()) {
594 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
595 Diags.
Report(Location, diag::err_alias_to_common);
600 if (GV->isDeclaration()) {
601 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
602 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
603 << IsIFunc << IsIFunc;
606 for (
const auto &[
Decl, Name] : MangledDeclNames) {
607 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
608 if (ND->getName() == GV->getName()) {
609 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
613 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
623 const auto *F = dyn_cast<llvm::Function>(GV);
625 Diags.
Report(Location, diag::err_alias_to_undefined)
626 << IsIFunc << IsIFunc;
630 llvm::FunctionType *FTy = F->getFunctionType();
631 if (!FTy->getReturnType()->isPointerTy()) {
632 Diags.
Report(Location, diag::err_ifunc_resolver_return);
646 if (GVar->hasAttribute(
"toc-data")) {
647 auto GVId = GVar->getName();
650 Diags.
Report(Location, diag::warn_toc_unsupported_type)
651 << GVId <<
"the variable has an alias";
653 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
654 llvm::AttributeSet NewAttributes =
655 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
656 GVar->setAttributes(NewAttributes);
660void CodeGenModule::checkAliases() {
667 const auto *
D = cast<ValueDecl>(GD.getDecl());
670 bool IsIFunc =
D->
hasAttr<IFuncAttr>();
672 Location = A->getLocation();
673 Range = A->getRange();
675 llvm_unreachable(
"Not an alias or ifunc?");
679 const llvm::GlobalValue *GV =
nullptr;
681 MangledDeclNames,
Range)) {
687 if (
const llvm::GlobalVariable *GVar =
688 dyn_cast<const llvm::GlobalVariable>(GV))
692 llvm::Constant *Aliasee =
693 IsIFunc ? cast<llvm::GlobalIFunc>(Alias)->getResolver()
694 : cast<llvm::GlobalAlias>(Alias)->getAliasee();
696 llvm::GlobalValue *AliaseeGV;
697 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
698 AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0));
700 AliaseeGV = cast<llvm::GlobalValue>(Aliasee);
702 if (
const SectionAttr *SA =
D->
getAttr<SectionAttr>()) {
703 StringRef AliasSection = SA->getName();
704 if (AliasSection != AliaseeGV->getSection())
705 Diags.
Report(SA->getLocation(), diag::warn_alias_with_section)
706 << AliasSection << IsIFunc << IsIFunc;
714 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
715 if (GA->isInterposable()) {
716 Diags.
Report(Location, diag::warn_alias_to_weak_alias)
717 << GV->getName() << GA->getName() << IsIFunc;
718 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
719 GA->getAliasee(), Alias->getType());
722 cast<llvm::GlobalIFunc>(Alias)->setResolver(Aliasee);
724 cast<llvm::GlobalAlias>(Alias)->setAliasee(Aliasee);
730 cast<llvm::Function>(Aliasee)->addFnAttr(
731 llvm::Attribute::DisableSanitizerInstrumentation);
739 Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType()));
740 Alias->eraseFromParent();
745 DeferredDeclsToEmit.clear();
746 EmittedDeferredDecls.clear();
747 DeferredAnnotations.clear();
749 OpenMPRuntime->clear();
753 StringRef MainFile) {
756 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
757 if (MainFile.empty())
758 MainFile =
"<stdin>";
759 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
762 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
765 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
769static std::optional<llvm::GlobalValue::VisibilityTypes>
776 return llvm::GlobalValue::DefaultVisibility;
778 return llvm::GlobalValue::HiddenVisibility;
780 return llvm::GlobalValue::ProtectedVisibility;
782 llvm_unreachable(
"unknown option value!");
786 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
795 GV.setDSOLocal(
false);
796 GV.setVisibility(*
V);
801 if (!LO.VisibilityFromDLLStorageClass)
804 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
807 std::optional<llvm::GlobalValue::VisibilityTypes>
808 NoDLLStorageClassVisibility =
811 std::optional<llvm::GlobalValue::VisibilityTypes>
812 ExternDeclDLLImportVisibility =
815 std::optional<llvm::GlobalValue::VisibilityTypes>
816 ExternDeclNoDLLStorageClassVisibility =
819 for (llvm::GlobalValue &GV : M.global_values()) {
820 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
823 if (GV.isDeclarationForLinker())
825 llvm::GlobalValue::DLLImportStorageClass
826 ? ExternDeclDLLImportVisibility
827 : ExternDeclNoDLLStorageClassVisibility);
830 llvm::GlobalValue::DLLExportStorageClass
831 ? DLLExportVisibility
832 : NoDLLStorageClassVisibility);
834 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
839 const llvm::Triple &Triple,
841 if (Triple.isAMDGPU() || Triple.isNVPTX())
843 return LangOpts.getStackProtector() == Mode;
849 EmitModuleInitializers(Primary);
851 DeferredDecls.insert(EmittedDeferredDecls.begin(),
852 EmittedDeferredDecls.end());
853 EmittedDeferredDecls.clear();
854 EmitVTablesOpportunistically();
855 applyGlobalValReplacements();
857 emitMultiVersionFunctions();
860 GlobalTopLevelStmtBlockInFlight.first) {
862 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
863 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
869 EmitCXXModuleInitFunc(Primary);
871 EmitCXXGlobalInitFunc();
872 EmitCXXGlobalCleanUpFunc();
873 registerGlobalDtorsWithAtExit();
874 EmitCXXThreadLocalInitFunc();
876 if (llvm::Function *ObjCInitFunction =
ObjCRuntime->ModuleInitFunction())
879 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
883 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
884 OpenMPRuntime->clear();
888 PGOReader->getSummary(
false).getMD(VMContext),
889 llvm::ProfileSummary::PSK_Instr);
896 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
897 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
899 EmitStaticExternCAliases();
905 CoverageMapping->emit();
906 if (CodeGenOpts.SanitizeCfiCrossDso) {
912 emitAtAvailableLinkGuard();
920 if (
getTarget().getTargetOpts().CodeObjectVersion !=
921 llvm::CodeObjectVersionKind::COV_None) {
922 getModule().addModuleFlag(llvm::Module::Error,
923 "amdhsa_code_object_version",
924 getTarget().getTargetOpts().CodeObjectVersion);
929 auto *MDStr = llvm::MDString::get(
934 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
947 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
951 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
955 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
957 auto *GV =
new llvm::GlobalVariable(
958 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
959 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
962 if (LangOpts.HIP && !
getLangOpts().OffloadingNewDriver) {
965 auto *GV =
new llvm::GlobalVariable(
967 llvm::Constant::getNullValue(
Int8Ty),
975 if (CodeGenOpts.Autolink &&
976 (Context.
getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
977 EmitModuleLinkOptions();
992 if (!ELFDependentLibraries.empty() && !Context.
getLangOpts().CUDAIsDevice) {
993 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
994 for (
auto *MD : ELFDependentLibraries)
998 if (CodeGenOpts.DwarfVersion) {
999 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1000 CodeGenOpts.DwarfVersion);
1003 if (CodeGenOpts.Dwarf64)
1004 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1008 getModule().setSemanticInterposition(
true);
1010 if (CodeGenOpts.EmitCodeView) {
1012 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1014 if (CodeGenOpts.CodeViewGHash) {
1015 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1017 if (CodeGenOpts.ControlFlowGuard) {
1019 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 2);
1020 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1022 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 1);
1024 if (CodeGenOpts.EHContGuard) {
1026 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1030 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1032 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1037 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1039 llvm::Metadata *Ops[2] = {
1040 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1041 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1042 llvm::Type::getInt32Ty(VMContext), 1))};
1044 getModule().addModuleFlag(llvm::Module::Require,
1045 "StrictVTablePointersRequirement",
1046 llvm::MDNode::get(VMContext, Ops));
1052 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1053 llvm::DEBUG_METADATA_VERSION);
1058 uint64_t WCharWidth =
1060 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1063 getModule().addModuleFlag(llvm::Module::Warning,
1064 "zos_product_major_version",
1065 uint32_t(CLANG_VERSION_MAJOR));
1066 getModule().addModuleFlag(llvm::Module::Warning,
1067 "zos_product_minor_version",
1068 uint32_t(CLANG_VERSION_MINOR));
1069 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1070 uint32_t(CLANG_VERSION_PATCHLEVEL));
1072 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1073 llvm::MDString::get(VMContext, ProductId));
1078 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1079 llvm::MDString::get(VMContext, lang_str));
1083 : std::time(
nullptr);
1084 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1085 static_cast<uint64_t
>(TT));
1088 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1089 llvm::MDString::get(VMContext,
"ascii"));
1093 if (
T.isARM() ||
T.isThumb()) {
1095 uint64_t EnumWidth = Context.
getLangOpts().ShortEnums ? 1 : 4;
1096 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1100 StringRef ABIStr =
Target.getABI();
1101 llvm::LLVMContext &Ctx = TheModule.getContext();
1102 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1103 llvm::MDString::get(Ctx, ABIStr));
1108 const std::vector<std::string> &Features =
1111 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1112 if (!errorToBool(ParseResult.takeError()))
1114 llvm::Module::AppendUnique,
"riscv-isa",
1116 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1119 if (CodeGenOpts.SanitizeCfiCrossDso) {
1121 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1124 if (CodeGenOpts.WholeProgramVTables) {
1128 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1129 CodeGenOpts.VirtualFunctionElimination);
1132 if (LangOpts.
Sanitize.
has(SanitizerKind::CFIICall)) {
1133 getModule().addModuleFlag(llvm::Module::Override,
1134 "CFI Canonical Jump Tables",
1135 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1138 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1139 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1144 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1147 if (CodeGenOpts.PatchableFunctionEntryOffset)
1148 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1149 CodeGenOpts.PatchableFunctionEntryOffset);
1152 if (CodeGenOpts.CFProtectionReturn &&
1155 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1159 if (CodeGenOpts.CFProtectionBranch &&
1162 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1166 if (CodeGenOpts.FunctionReturnThunks)
1167 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1169 if (CodeGenOpts.IndirectBranchCSPrefix)
1170 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1182 LangOpts.getSignReturnAddressScope() !=
1184 getModule().addModuleFlag(llvm::Module::Override,
1185 "sign-return-address-buildattr", 1);
1186 if (LangOpts.
Sanitize.
has(SanitizerKind::MemtagStack))
1187 getModule().addModuleFlag(llvm::Module::Override,
1188 "tag-stack-memory-buildattr", 1);
1190 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1191 if (LangOpts.BranchTargetEnforcement)
1192 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1194 if (LangOpts.BranchProtectionPAuthLR)
1195 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1197 if (LangOpts.GuardedControlStack)
1198 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 1);
1200 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 1);
1202 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1205 getModule().addModuleFlag(llvm::Module::Min,
1206 "sign-return-address-with-bkey", 1);
1210 using namespace llvm::ELF;
1211 uint64_t PAuthABIVersion =
1212 (LangOpts.PointerAuthIntrinsics
1213 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1214 (LangOpts.PointerAuthCalls
1215 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1216 (LangOpts.PointerAuthReturns
1217 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1218 (LangOpts.PointerAuthAuthTraps
1219 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1220 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1221 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1222 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1223 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1224 (LangOpts.PointerAuthInitFini
1225 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1226 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1227 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1228 (LangOpts.PointerAuthELFGOT
1229 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1230 (LangOpts.PointerAuthIndirectGotos
1231 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1232 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1233 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1234 (LangOpts.PointerAuthFunctionTypeDiscrimination
1235 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1236 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1237 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1238 "Update when new enum items are defined");
1239 if (PAuthABIVersion != 0) {
1240 getModule().addModuleFlag(llvm::Module::Error,
1241 "aarch64-elf-pauthabi-platform",
1242 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1243 getModule().addModuleFlag(llvm::Module::Error,
1244 "aarch64-elf-pauthabi-version",
1250 if (CodeGenOpts.StackClashProtector)
1252 llvm::Module::Override,
"probe-stack",
1253 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1255 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1256 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1257 CodeGenOpts.StackProbeSize);
1260 llvm::LLVMContext &Ctx = TheModule.getContext();
1262 llvm::Module::Error,
"MemProfProfileFilename",
1266 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1270 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1272 llvm::DenormalMode::IEEE);
1275 if (LangOpts.EHAsynch)
1276 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1280 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1282 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1286 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1287 EmitOpenCLMetadata();
1295 llvm::Metadata *SPIRVerElts[] = {
1296 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1298 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1299 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1300 llvm::NamedMDNode *SPIRVerMD =
1301 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1302 llvm::LLVMContext &Ctx = TheModule.getContext();
1303 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1311 if (uint32_t PLevel = Context.
getLangOpts().PICLevel) {
1312 assert(PLevel < 3 &&
"Invalid PIC Level");
1313 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1315 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1319 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1320 .Case(
"tiny", llvm::CodeModel::Tiny)
1321 .Case(
"small", llvm::CodeModel::Small)
1322 .Case(
"kernel", llvm::CodeModel::Kernel)
1323 .Case(
"medium", llvm::CodeModel::Medium)
1324 .Case(
"large", llvm::CodeModel::Large)
1327 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1330 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1332 llvm::Triple::x86_64) {
1338 if (CodeGenOpts.NoPLT)
1341 CodeGenOpts.DirectAccessExternalData !=
1342 getModule().getDirectAccessExternalData()) {
1343 getModule().setDirectAccessExternalData(
1344 CodeGenOpts.DirectAccessExternalData);
1346 if (CodeGenOpts.UnwindTables)
1347 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1349 switch (CodeGenOpts.getFramePointer()) {
1354 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1357 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1360 getModule().setFramePointer(llvm::FramePointerKind::All);
1364 SimplifyPersonality();
1377 EmitVersionIdentMetadata();
1380 EmitCommandLineMetadata();
1388 getModule().setStackProtectorGuardSymbol(
1391 getModule().setStackProtectorGuardOffset(
1396 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1398 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1400 if (
getContext().getTargetInfo().getMaxTLSAlign())
1401 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1402 getContext().getTargetInfo().getMaxTLSAlign());
1420 if (
getTriple().isPPC() && !MustTailCallUndefinedGlobals.empty()) {
1421 for (
auto &I : MustTailCallUndefinedGlobals) {
1422 if (!I.first->isDefined())
1423 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1427 if (!Entry || Entry->isWeakForLinker() ||
1428 Entry->isDeclarationForLinker())
1429 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1435void CodeGenModule::EmitOpenCLMetadata() {
1441 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1442 llvm::Metadata *OCLVerElts[] = {
1443 llvm::ConstantAsMetadata::get(
1444 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1445 llvm::ConstantAsMetadata::get(
1446 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1447 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1448 llvm::LLVMContext &Ctx = TheModule.getContext();
1449 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1452 EmitVersion(
"opencl.ocl.version", CLVersion);
1453 if (LangOpts.OpenCLCPlusPlus) {
1455 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1459void CodeGenModule::EmitBackendOptionsMetadata(
1462 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1463 CodeGenOpts.SmallDataLimit);
1480 return TBAA->getTypeInfo(QTy);
1499 return TBAA->getAccessInfo(AccessType);
1506 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1512 return TBAA->getTBAAStructInfo(QTy);
1518 return TBAA->getBaseTypeInfo(QTy);
1524 return TBAA->getAccessTagInfo(Info);
1531 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1539 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1547 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1553 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1558 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1571 "cannot compile this %0 yet");
1572 std::string Msg =
Type;
1574 << Msg << S->getSourceRange();
1581 "cannot compile this %0 yet");
1582 std::string Msg =
Type;
1593 if (GV->hasLocalLinkage()) {
1594 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1608 Context.
getLangOpts().OpenMPIsTargetDevice && isa<VarDecl>(
D) &&
1609 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
1610 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
1611 OMPDeclareTargetDeclAttr::DT_NoHost &&
1613 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1617 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
1621 if (GV->hasDLLExportStorageClass()) {
1624 diag::err_hidden_visibility_dllexport);
1627 diag::err_non_default_visibility_dllimport);
1633 !GV->isDeclarationForLinker())
1638 llvm::GlobalValue *GV) {
1639 if (GV->hasLocalLinkage())
1642 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
1646 if (GV->hasDLLImportStorageClass())
1649 const llvm::Triple &TT = CGM.
getTriple();
1651 if (TT.isWindowsGNUEnvironment()) {
1660 if (GV->isDeclarationForLinker() && isa<llvm::GlobalVariable>(GV) &&
1669 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
1677 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
1681 if (!TT.isOSBinFormatELF())
1687 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
1693 if (!(isa<llvm::Function>(GV) && GV->canBenefitFromLocalAlias()))
1695 return !(CGM.
getLangOpts().SemanticInterposition ||
1700 if (!GV->isDeclarationForLinker())
1706 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
1713 if (CGOpts.DirectAccessExternalData) {
1719 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
1720 if (!Var->isThreadLocal())
1729 if (isa<llvm::Function>(GV) && !CGOpts.NoPLT && RM == llvm::Reloc::Static)
1745 const auto *
D = dyn_cast<NamedDecl>(GD.
getDecl());
1747 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(
D)) {
1756 if (
D &&
D->isExternallyVisible()) {
1758 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
1759 else if ((
D->
hasAttr<DLLExportAttr>() ||
1761 !GV->isDeclarationForLinker())
1762 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
1786 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
1787 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
1788 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
1789 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
1790 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
1793llvm::GlobalVariable::ThreadLocalMode
1795 switch (CodeGenOpts.getDefaultTLSModel()) {
1797 return llvm::GlobalVariable::GeneralDynamicTLSModel;
1799 return llvm::GlobalVariable::LocalDynamicTLSModel;
1801 return llvm::GlobalVariable::InitialExecTLSModel;
1803 return llvm::GlobalVariable::LocalExecTLSModel;
1805 llvm_unreachable(
"Invalid TLS model!");
1809 assert(
D.getTLSKind() &&
"setting TLS mode on non-TLS var!");
1811 llvm::GlobalValue::ThreadLocalMode TLM;
1815 if (
const TLSModelAttr *
Attr =
D.
getAttr<TLSModelAttr>()) {
1819 GV->setThreadLocalMode(TLM);
1825 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
1829 const CPUSpecificAttr *
Attr,
1851 bool OmitMultiVersionMangling =
false) {
1853 llvm::raw_svector_ostream Out(Buffer);
1862 assert(II &&
"Attempt to mangle unnamed decl.");
1863 const auto *FD = dyn_cast<FunctionDecl>(ND);
1868 Out <<
"__regcall4__" << II->
getName();
1870 Out <<
"__regcall3__" << II->
getName();
1871 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
1873 Out <<
"__device_stub__" << II->
getName();
1889 "Hash computed when not explicitly requested");
1893 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
1894 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
1895 switch (FD->getMultiVersionKind()) {
1899 FD->getAttr<CPUSpecificAttr>(),
1903 auto *
Attr = FD->getAttr<TargetAttr>();
1904 assert(
Attr &&
"Expected TargetAttr to be present "
1905 "for attribute mangling");
1911 auto *
Attr = FD->getAttr<TargetVersionAttr>();
1912 assert(
Attr &&
"Expected TargetVersionAttr to be present "
1913 "for attribute mangling");
1919 auto *
Attr = FD->getAttr<TargetClonesAttr>();
1920 assert(
Attr &&
"Expected TargetClonesAttr to be present "
1921 "for attribute mangling");
1928 llvm_unreachable(
"None multiversion type isn't valid here");
1938 return std::string(Out.str());
1941void CodeGenModule::UpdateMultiVersionNames(
GlobalDecl GD,
1943 StringRef &CurName) {
1950 std::string NonTargetName =
1958 "Other GD should now be a multiversioned function");
1968 if (OtherName != NonTargetName) {
1971 const auto ExistingRecord = Manglings.find(NonTargetName);
1972 if (ExistingRecord != std::end(Manglings))
1973 Manglings.remove(&(*ExistingRecord));
1974 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
1979 CurName = OtherNameRef;
1981 Entry->setName(OtherName);
1991 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2005 auto FoundName = MangledDeclNames.find(CanonicalGD);
2006 if (FoundName != MangledDeclNames.end())
2007 return FoundName->second;
2011 const auto *ND = cast<NamedDecl>(GD.
getDecl());
2023 assert(!isa<FunctionDecl>(ND) || !ND->hasAttr<CUDAGlobalAttr>() ||
2034 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2035 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2044 llvm::raw_svector_ostream Out(Buffer);
2047 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.
getDecl()), Out);
2048 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(
D))
2050 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(
D))
2055 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2056 return Result.first->first();
2060 auto it = MangledDeclNames.begin();
2061 while (it != MangledDeclNames.end()) {
2062 if (it->second == Name)
2077 llvm::Constant *AssociatedData) {
2085 bool IsDtorAttrFunc) {
2086 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2088 DtorsUsingAtExit[
Priority].push_back(Dtor);
2096void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2097 if (Fns.empty())
return;
2103 llvm::PointerType *PtrTy = llvm::PointerType::get(
2104 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2107 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2111 auto Ctors = Builder.beginArray(CtorStructTy);
2112 for (
const auto &I : Fns) {
2113 auto Ctor = Ctors.beginStruct(CtorStructTy);
2114 Ctor.addInt(
Int32Ty, I.Priority);
2115 if (InitFiniAuthSchema) {
2116 llvm::Constant *StorageAddress =
2118 ? llvm::ConstantExpr::getIntToPtr(
2119 llvm::ConstantInt::get(
2121 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2125 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2126 llvm::ConstantInt::get(
2128 Ctor.add(SignedCtorPtr);
2130 Ctor.add(I.Initializer);
2132 if (I.AssociatedData)
2133 Ctor.add(I.AssociatedData);
2135 Ctor.addNullPointer(PtrTy);
2136 Ctor.finishAndAddTo(Ctors);
2139 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2141 llvm::GlobalValue::AppendingLinkage);
2145 List->setAlignment(std::nullopt);
2150llvm::GlobalValue::LinkageTypes
2152 const auto *
D = cast<FunctionDecl>(GD.
getDecl());
2156 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(
D))
2163 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2164 if (!MDS)
return nullptr;
2166 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2172 FnType->getReturnType(), FnType->getParamTypes(),
2173 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2175 std::string OutName;
2176 llvm::raw_string_ostream Out(OutName);
2181 Out <<
".normalized";
2183 return llvm::ConstantInt::get(
Int32Ty,
2184 static_cast<uint32_t
>(llvm::xxHash64(OutName)));
2189 llvm::Function *F,
bool IsThunk) {
2191 llvm::AttributeList PAL;
2194 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2200 Error(
Loc,
"__vectorcall calling convention is not currently supported");
2202 F->setAttributes(PAL);
2203 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2207 std::string ReadOnlyQual(
"__read_only");
2208 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2209 if (ReadOnlyPos != std::string::npos)
2211 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2213 std::string WriteOnlyQual(
"__write_only");
2214 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2215 if (WriteOnlyPos != std::string::npos)
2216 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2218 std::string ReadWriteQual(
"__read_write");
2219 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2220 if (ReadWritePos != std::string::npos)
2221 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2254 assert(((FD && CGF) || (!FD && !CGF)) &&
2255 "Incorrect use - FD and CGF should either be both null or not!");
2281 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2284 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2289 std::string typeQuals;
2293 const Decl *PDecl = parm;
2295 PDecl = TD->getDecl();
2296 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2297 if (A && A->isWriteOnly())
2298 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2299 else if (A && A->isReadWrite())
2300 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2302 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2304 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2306 auto getTypeSpelling = [&](
QualType Ty) {
2307 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2309 if (Ty.isCanonical()) {
2310 StringRef typeNameRef = typeName;
2312 if (typeNameRef.consume_front(
"unsigned "))
2313 return std::string(
"u") + typeNameRef.str();
2314 if (typeNameRef.consume_front(
"signed "))
2315 return typeNameRef.str();
2325 addressQuals.push_back(
2326 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2330 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2331 std::string baseTypeName =
2333 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2334 argBaseTypeNames.push_back(
2335 llvm::MDString::get(VMContext, baseTypeName));
2339 typeQuals =
"restrict";
2342 typeQuals += typeQuals.empty() ?
"const" :
" const";
2344 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2346 uint32_t AddrSpc = 0;
2351 addressQuals.push_back(
2352 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2356 std::string typeName = getTypeSpelling(ty);
2368 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2369 argBaseTypeNames.push_back(
2370 llvm::MDString::get(VMContext, baseTypeName));
2375 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2379 Fn->setMetadata(
"kernel_arg_addr_space",
2380 llvm::MDNode::get(VMContext, addressQuals));
2381 Fn->setMetadata(
"kernel_arg_access_qual",
2382 llvm::MDNode::get(VMContext, accessQuals));
2383 Fn->setMetadata(
"kernel_arg_type",
2384 llvm::MDNode::get(VMContext, argTypeNames));
2385 Fn->setMetadata(
"kernel_arg_base_type",
2386 llvm::MDNode::get(VMContext, argBaseTypeNames));
2387 Fn->setMetadata(
"kernel_arg_type_qual",
2388 llvm::MDNode::get(VMContext, argTypeQuals));
2392 Fn->setMetadata(
"kernel_arg_name",
2393 llvm::MDNode::get(VMContext, argNames));
2403 if (!LangOpts.Exceptions)
return false;
2406 if (LangOpts.CXXExceptions)
return true;
2409 if (LangOpts.ObjCExceptions) {
2426 !isa<CXXConstructorDecl, CXXDestructorDecl>(MD);
2431 llvm::SetVector<const CXXRecordDecl *> MostBases;
2433 std::function<void (
const CXXRecordDecl *)> CollectMostBases;
2436 MostBases.insert(RD);
2438 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2440 CollectMostBases(RD);
2441 return MostBases.takeVector();
2445 llvm::Function *F) {
2446 llvm::AttrBuilder B(F->getContext());
2448 if ((!
D || !
D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2449 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2451 if (CodeGenOpts.StackClashProtector)
2452 B.addAttribute(
"probe-stack",
"inline-asm");
2454 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2455 B.addAttribute(
"stack-probe-size",
2456 std::to_string(CodeGenOpts.StackProbeSize));
2459 B.addAttribute(llvm::Attribute::NoUnwind);
2461 if (
D &&
D->
hasAttr<NoStackProtectorAttr>())
2463 else if (
D &&
D->
hasAttr<StrictGuardStackCheckAttr>() &&
2465 B.addAttribute(llvm::Attribute::StackProtectStrong);
2467 B.addAttribute(llvm::Attribute::StackProtect);
2469 B.addAttribute(llvm::Attribute::StackProtectStrong);
2471 B.addAttribute(llvm::Attribute::StackProtectReq);
2477 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2479 B.addAttribute(llvm::Attribute::NoInline);
2487 if (
D->
hasAttr<ArmLocallyStreamingAttr>())
2488 B.addAttribute(
"aarch64_pstate_sm_body");
2491 if (
Attr->isNewZA())
2492 B.addAttribute(
"aarch64_new_za");
2493 if (
Attr->isNewZT0())
2494 B.addAttribute(
"aarch64_new_zt0");
2499 bool ShouldAddOptNone =
2500 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2502 ShouldAddOptNone &= !
D->
hasAttr<MinSizeAttr>();
2503 ShouldAddOptNone &= !
D->
hasAttr<AlwaysInlineAttr>();
2506 if ((ShouldAddOptNone ||
D->
hasAttr<OptimizeNoneAttr>()) &&
2507 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2508 B.addAttribute(llvm::Attribute::OptimizeNone);
2511 B.addAttribute(llvm::Attribute::NoInline);
2516 B.addAttribute(llvm::Attribute::Naked);
2519 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
2520 F->removeFnAttr(llvm::Attribute::MinSize);
2521 }
else if (
D->
hasAttr<NakedAttr>()) {
2523 B.addAttribute(llvm::Attribute::Naked);
2524 B.addAttribute(llvm::Attribute::NoInline);
2525 }
else if (
D->
hasAttr<NoDuplicateAttr>()) {
2526 B.addAttribute(llvm::Attribute::NoDuplicate);
2527 }
else if (
D->
hasAttr<NoInlineAttr>() && !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2529 B.addAttribute(llvm::Attribute::NoInline);
2530 }
else if (
D->
hasAttr<AlwaysInlineAttr>() &&
2531 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
2533 B.addAttribute(llvm::Attribute::AlwaysInline);
2537 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
2538 B.addAttribute(llvm::Attribute::NoInline);
2542 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
2545 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
2546 return Redecl->isInlineSpecified();
2548 if (any_of(FD->
redecls(), CheckRedeclForInline))
2553 return any_of(Pattern->
redecls(), CheckRedeclForInline);
2555 if (CheckForInline(FD)) {
2556 B.addAttribute(llvm::Attribute::InlineHint);
2557 }
else if (CodeGenOpts.getInlining() ==
2560 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2561 B.addAttribute(llvm::Attribute::NoInline);
2568 if (!
D->
hasAttr<OptimizeNoneAttr>()) {
2570 if (!ShouldAddOptNone)
2571 B.addAttribute(llvm::Attribute::OptimizeForSize);
2572 B.addAttribute(llvm::Attribute::Cold);
2575 B.addAttribute(llvm::Attribute::Hot);
2577 B.addAttribute(llvm::Attribute::MinSize);
2584 F->setAlignment(llvm::Align(alignment));
2587 if (LangOpts.FunctionAlignment)
2588 F->setAlignment(llvm::Align(1ull << LangOpts.FunctionAlignment));
2595 if (isa<CXXMethodDecl>(
D) && F->getPointerAlignment(
getDataLayout()) < 2)
2596 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
2601 if (CodeGenOpts.SanitizeCfiCrossDso &&
2602 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
2603 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
2614 auto *MD = dyn_cast<CXXMethodDecl>(
D);
2617 llvm::Metadata *
Id =
2620 F->addTypeMetadata(0,
Id);
2627 if (isa_and_nonnull<NamedDecl>(
D))
2630 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2635 if (
const auto *VD = dyn_cast_if_present<VarDecl>(
D);
2637 ((CodeGenOpts.KeepPersistentStorageVariables &&
2638 (VD->getStorageDuration() ==
SD_Static ||
2639 VD->getStorageDuration() ==
SD_Thread)) ||
2640 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
2641 VD->getType().isConstQualified())))
2645bool CodeGenModule::GetCPUAndFeaturesAttributes(
GlobalDecl GD,
2646 llvm::AttrBuilder &Attrs,
2647 bool SetTargetFeatures) {
2653 std::vector<std::string> Features;
2654 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
2656 const auto *TD = FD ? FD->
getAttr<TargetAttr>() :
nullptr;
2657 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
2658 assert((!TD || !TV) &&
"both target_version and target specified");
2659 const auto *SD = FD ? FD->
getAttr<CPUSpecificAttr>() :
nullptr;
2660 const auto *TC = FD ? FD->
getAttr<TargetClonesAttr>() :
nullptr;
2661 bool AddedAttr =
false;
2662 if (TD || TV || SD || TC) {
2663 llvm::StringMap<bool> FeatureMap;
2667 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
2668 Features.push_back((Entry.getValue() ?
"+" :
"-") + Entry.getKey().str());
2676 Target.parseTargetAttr(TD->getFeaturesStr());
2698 if (!TargetCPU.empty()) {
2699 Attrs.addAttribute(
"target-cpu", TargetCPU);
2702 if (!TuneCPU.empty()) {
2703 Attrs.addAttribute(
"tune-cpu", TuneCPU);
2706 if (!Features.empty() && SetTargetFeatures) {
2707 llvm::erase_if(Features, [&](
const std::string& F) {
2710 llvm::sort(Features);
2711 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
2718void CodeGenModule::setNonAliasAttributes(
GlobalDecl GD,
2719 llvm::GlobalObject *GO) {
2724 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
2727 if (
auto *SA =
D->
getAttr<PragmaClangBSSSectionAttr>())
2728 GV->addAttribute(
"bss-section", SA->getName());
2729 if (
auto *SA =
D->
getAttr<PragmaClangDataSectionAttr>())
2730 GV->addAttribute(
"data-section", SA->getName());
2731 if (
auto *SA =
D->
getAttr<PragmaClangRodataSectionAttr>())
2732 GV->addAttribute(
"rodata-section", SA->getName());
2733 if (
auto *SA =
D->
getAttr<PragmaClangRelroSectionAttr>())
2734 GV->addAttribute(
"relro-section", SA->getName());
2737 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
2740 if (
auto *SA =
D->
getAttr<PragmaClangTextSectionAttr>())
2742 F->setSection(SA->getName());
2744 llvm::AttrBuilder Attrs(F->getContext());
2745 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
2749 llvm::AttributeMask RemoveAttrs;
2750 RemoveAttrs.addAttribute(
"target-cpu");
2751 RemoveAttrs.addAttribute(
"target-features");
2752 RemoveAttrs.addAttribute(
"tune-cpu");
2753 F->removeFnAttrs(RemoveAttrs);
2754 F->addFnAttrs(Attrs);
2758 if (
const auto *CSA =
D->
getAttr<CodeSegAttr>())
2759 GO->setSection(CSA->getName());
2760 else if (
const auto *SA =
D->
getAttr<SectionAttr>())
2761 GO->setSection(SA->getName());
2774 F->setLinkage(llvm::Function::InternalLinkage);
2776 setNonAliasAttributes(GD, F);
2787 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
2791 llvm::Function *F) {
2793 if (!LangOpts.
Sanitize.
has(SanitizerKind::CFIICall))
2798 if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic())
2802 F->addTypeMetadata(0, MD);
2806 if (CodeGenOpts.SanitizeCfiCrossDso)
2808 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
2812 llvm::LLVMContext &Ctx = F->getContext();
2813 llvm::MDBuilder MDB(Ctx);
2814 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
2823 return llvm::all_of(Name, [](
const char &
C) {
2824 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
2830 for (
auto &F : M.functions()) {
2832 bool AddressTaken = F.hasAddressTaken();
2833 if (!AddressTaken && F.hasLocalLinkage())
2834 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
2839 if (!AddressTaken || !F.isDeclaration())
2842 const llvm::ConstantInt *
Type;
2843 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
2844 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
2848 StringRef Name = F.getName();
2852 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
2853 Name +
", " + Twine(
Type->getZExtValue()) +
"\n")
2855 M.appendModuleInlineAsm(
Asm);
2859void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
2860 bool IsIncompleteFunction,
2863 if (llvm::Intrinsic::ID IID = F->getIntrinsicID()) {
2866 F->setAttributes(llvm::Intrinsic::getAttributes(
getLLVMContext(), IID));
2870 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
2872 if (!IsIncompleteFunction)
2879 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
2881 assert(!F->arg_empty() &&
2882 F->arg_begin()->getType()
2883 ->canLosslesslyBitCastTo(F->getReturnType()) &&
2884 "unexpected this return");
2885 F->addParamAttr(0, llvm::Attribute::Returned);
2895 if (!IsIncompleteFunction && F->isDeclaration())
2898 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
2899 F->setSection(CSA->getName());
2900 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
2901 F->setSection(SA->getName());
2903 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
2905 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
2906 else if (EA->isWarning())
2907 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
2913 bool HasBody = FD->
hasBody(FDBody);
2915 assert(HasBody &&
"Inline builtin declarations should always have an "
2917 if (shouldEmitFunction(FDBody))
2918 F->addFnAttr(llvm::Attribute::NoBuiltin);
2924 F->addFnAttr(llvm::Attribute::NoBuiltin);
2927 if (isa<CXXConstructorDecl>(FD) || isa<CXXDestructorDecl>(FD))
2928 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2929 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
2930 if (MD->isVirtual())
2931 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2937 if (!CodeGenOpts.SanitizeCfiCrossDso ||
2938 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
2947 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
2948 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
2950 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
2954 llvm::LLVMContext &Ctx = F->getContext();
2955 llvm::MDBuilder MDB(Ctx);
2959 int CalleeIdx = *CB->encoding_begin();
2960 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
2961 F->addMetadata(llvm::LLVMContext::MD_callback,
2962 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
2963 CalleeIdx, PayloadIndices,
2969 assert((isa<llvm::Function>(GV) || !GV->isDeclaration()) &&
2970 "Only globals with definition can force usage.");
2971 LLVMUsed.emplace_back(GV);
2975 assert(!GV->isDeclaration() &&
2976 "Only globals with definition can force usage.");
2977 LLVMCompilerUsed.emplace_back(GV);
2981 assert((isa<llvm::Function>(GV) || !GV->isDeclaration()) &&
2982 "Only globals with definition can force usage.");
2984 LLVMCompilerUsed.emplace_back(GV);
2986 LLVMUsed.emplace_back(GV);
2990 std::vector<llvm::WeakTrackingVH> &List) {
2997 UsedArray.resize(List.size());
2998 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3000 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3001 cast<llvm::Constant>(&*List[i]), CGM.
Int8PtrTy);
3004 if (UsedArray.empty())
3006 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3008 auto *GV =
new llvm::GlobalVariable(
3009 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3010 llvm::ConstantArray::get(ATy, UsedArray), Name);
3012 GV->setSection(
"llvm.metadata");
3015void CodeGenModule::emitLLVMUsed() {
3016 emitUsed(*
this,
"llvm.used", LLVMUsed);
3017 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3022 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3031 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3037 ELFDependentLibraries.push_back(
3038 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3045 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3060 if (
Visited.insert(Import).second)
3077 if (LL.IsFramework) {
3078 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3079 llvm::MDString::get(Context, LL.Library)};
3081 Metadata.push_back(llvm::MDNode::get(Context, Args));
3087 llvm::Metadata *Args[2] = {
3088 llvm::MDString::get(Context,
"lib"),
3089 llvm::MDString::get(Context, LL.Library),
3091 Metadata.push_back(llvm::MDNode::get(Context, Args));
3095 auto *OptString = llvm::MDString::get(Context, Opt);
3096 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3101void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3103 "We should only emit module initializers for named modules.");
3109 if (isa<ImportDecl>(
D))
3111 assert(isa<VarDecl>(
D) &&
"GMF initializer decl is not a var?");
3118 if (isa<ImportDecl>(
D))
3126 if (isa<ImportDecl>(
D))
3128 assert(isa<VarDecl>(
D) &&
"PMF initializer decl is not a var?");
3134void CodeGenModule::EmitModuleLinkOptions() {
3138 llvm::SetVector<clang::Module *> LinkModules;
3143 for (
Module *M : ImportedModules) {
3146 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3155 while (!Stack.empty()) {
3158 bool AnyChildren =
false;
3168 Stack.push_back(
SM);
3176 LinkModules.insert(Mod);
3185 for (
Module *M : LinkModules)
3188 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3189 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3192 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3193 for (
auto *MD : LinkerOptionsMetadata)
3194 NMD->addOperand(MD);
3197void CodeGenModule::EmitDeferred() {
3206 if (!DeferredVTables.empty()) {
3207 EmitDeferredVTables();
3212 assert(DeferredVTables.empty());
3219 llvm::append_range(DeferredDeclsToEmit,
3223 if (DeferredDeclsToEmit.empty())
3228 std::vector<GlobalDecl> CurDeclsToEmit;
3229 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3236 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3254 if (!GV->isDeclaration())
3258 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(
D))
3262 EmitGlobalDefinition(
D, GV);
3267 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3269 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3274void CodeGenModule::EmitVTablesOpportunistically() {
3280 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3281 &&
"Only emit opportunistic vtables with optimizations");
3285 "This queue should only contain external vtables");
3286 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3289 OpportunisticVTables.clear();
3293 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3298 DeferredAnnotations.clear();
3300 if (Annotations.empty())
3304 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3305 Annotations[0]->getType(), Annotations.size()), Annotations);
3306 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3307 llvm::GlobalValue::AppendingLinkage,
3308 Array,
"llvm.global.annotations");
3313 llvm::Constant *&AStr = AnnotationStrings[Str];
3318 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3319 auto *gv =
new llvm::GlobalVariable(
3320 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3321 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3324 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3341 SM.getExpansionLineNumber(L);
3342 return llvm::ConstantInt::get(
Int32Ty, LineNo);
3350 llvm::FoldingSetNodeID ID;
3351 for (
Expr *
E : Exprs) {
3352 ID.Add(cast<clang::ConstantExpr>(
E)->getAPValueResult());
3354 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
3359 LLVMArgs.reserve(Exprs.size());
3361 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *
E) {
3362 const auto *CE = cast<clang::ConstantExpr>(
E);
3363 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
3366 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
3367 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
3368 llvm::GlobalValue::PrivateLinkage,
Struct,
3371 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3378 const AnnotateAttr *AA,
3386 llvm::Constant *GVInGlobalsAS = GV;
3387 if (GV->getAddressSpace() !=
3389 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
3391 llvm::PointerType::get(
3392 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
3396 llvm::Constant *Fields[] = {
3397 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
3399 return llvm::ConstantStruct::getAnon(Fields);
3403 llvm::GlobalValue *GV) {
3404 assert(
D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
3414 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
3419 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
3424 return NoSanitizeL.containsLocation(Kind,
Loc);
3427 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
3431 llvm::GlobalVariable *GV,
3435 if (NoSanitizeL.containsGlobal(Kind, GV->getName(),
Category))
3438 if (NoSanitizeL.containsMainFile(
3439 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
3442 if (NoSanitizeL.containsLocation(Kind,
Loc,
Category))
3449 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
3450 Ty = AT->getElementType();
3455 if (NoSanitizeL.containsType(Kind, TypeStr,
Category))
3466 auto Attr = ImbueAttr::NONE;
3469 if (
Attr == ImbueAttr::NONE)
3470 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
3472 case ImbueAttr::NONE:
3474 case ImbueAttr::ALWAYS:
3475 Fn->addFnAttr(
"function-instrument",
"xray-always");
3477 case ImbueAttr::ALWAYS_ARG1:
3478 Fn->addFnAttr(
"function-instrument",
"xray-always");
3479 Fn->addFnAttr(
"xray-log-args",
"1");
3481 case ImbueAttr::NEVER:
3482 Fn->addFnAttr(
"function-instrument",
"xray-never");
3506 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
3520 if (NumGroups > 1) {
3521 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
3530 if (LangOpts.EmitAllDecls)
3533 const auto *VD = dyn_cast<VarDecl>(
Global);
3535 ((CodeGenOpts.KeepPersistentStorageVariables &&
3536 (VD->getStorageDuration() ==
SD_Static ||
3537 VD->getStorageDuration() ==
SD_Thread)) ||
3538 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3539 VD->getType().isConstQualified())))
3552 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
3553 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
3554 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
3555 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
3559 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
3568 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
3574 if (CXX20ModuleInits && VD->getOwningModule() &&
3575 !VD->getOwningModule()->isModuleMapModule()) {
3584 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
3587 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
3600 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3604 llvm::Constant *
Init;
3607 if (!
V.isAbsent()) {
3618 llvm::Constant *Fields[4] = {
3622 llvm::ConstantDataArray::getRaw(
3623 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
3625 Init = llvm::ConstantStruct::getAnon(Fields);
3628 auto *GV =
new llvm::GlobalVariable(
3630 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
3632 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
3635 if (!
V.isAbsent()) {
3648 llvm::GlobalVariable **Entry =
nullptr;
3649 Entry = &UnnamedGlobalConstantDeclMap[GCD];
3654 llvm::Constant *
Init;
3658 assert(!
V.isAbsent());
3662 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
3664 llvm::GlobalValue::PrivateLinkage,
Init,
3666 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3680 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3684 llvm::Constant *
Init =
Emitter.emitForInitializer(
3692 llvm::GlobalValue::LinkageTypes
Linkage =
3694 ? llvm::GlobalValue::LinkOnceODRLinkage
3695 : llvm::GlobalValue::InternalLinkage;
3696 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
3700 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
3707 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
3708 assert(AA &&
"No alias?");
3718 llvm::Constant *Aliasee;
3719 if (isa<llvm::FunctionType>(DeclTy))
3720 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
3727 auto *F = cast<llvm::GlobalValue>(Aliasee);
3728 F->setLinkage(llvm::Function::ExternalWeakLinkage);
3729 WeakRefReferences.insert(F);
3738 return A->isImplicit();
3742bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
3743 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
3748 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
3749 Global->hasAttr<CUDAConstantAttr>() ||
3750 Global->hasAttr<CUDASharedAttr>() ||
3751 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
3752 Global->getType()->isCUDADeviceBuiltinTextureType();
3759 if (
Global->hasAttr<WeakRefAttr>())
3764 if (
Global->hasAttr<AliasAttr>())
3765 return EmitAliasDefinition(GD);
3768 if (
Global->hasAttr<IFuncAttr>())
3769 return emitIFuncDefinition(GD);
3772 if (
Global->hasAttr<CPUDispatchAttr>())
3773 return emitCPUDispatchDefinition(GD);
3778 if (LangOpts.CUDA) {
3779 assert((isa<FunctionDecl>(
Global) || isa<VarDecl>(
Global)) &&
3780 "Expected Variable or Function");
3781 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
3782 if (!shouldEmitCUDAGlobalVar(VD))
3784 }
else if (LangOpts.CUDAIsDevice) {
3785 const auto *FD = dyn_cast<FunctionDecl>(
Global);
3786 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
3787 (LangOpts.OffloadImplicitHostDeviceTemplates &&
3788 hasImplicitAttr<CUDAHostAttr>(FD) &&
3789 hasImplicitAttr<CUDADeviceAttr>(FD) && !FD->
isConstexpr() &&
3791 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
3792 !
Global->hasAttr<CUDAGlobalAttr>() &&
3793 !(LangOpts.HIPStdPar && isa<FunctionDecl>(
Global) &&
3794 !
Global->hasAttr<CUDAHostAttr>()))
3797 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
3798 Global->hasAttr<CUDADeviceAttr>())
3802 if (LangOpts.OpenMP) {
3804 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
3806 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
3807 if (MustBeEmitted(
Global))
3811 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
3812 if (MustBeEmitted(
Global))
3819 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
3822 if (FD->
hasAttr<AnnotateAttr>()) {
3825 DeferredAnnotations[MangledName] = FD;
3840 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
3845 const auto *VD = cast<VarDecl>(
Global);
3846 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
3849 if (LangOpts.OpenMP) {
3851 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
3852 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
3856 if (VD->hasExternalStorage() &&
3857 Res != OMPDeclareTargetDeclAttr::MT_Link)
3860 bool UnifiedMemoryEnabled =
3862 if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3863 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3864 !UnifiedMemoryEnabled) {
3867 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
3868 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3869 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3870 UnifiedMemoryEnabled)) &&
3871 "Link clause or to clause with unified memory expected.");
3890 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
3892 EmitGlobalDefinition(GD);
3893 addEmittedDeferredDecl(GD);
3900 cast<VarDecl>(
Global)->hasInit()) {
3901 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
3902 CXXGlobalInits.push_back(
nullptr);
3908 addDeferredDeclToEmit(GD);
3909 }
else if (MustBeEmitted(
Global)) {
3911 assert(!MayBeEmittedEagerly(
Global));
3912 addDeferredDeclToEmit(GD);
3917 DeferredDecls[MangledName] = GD;
3924 if (
CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
3925 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
3932 struct FunctionIsDirectlyRecursive
3934 const StringRef Name;
3944 if (
Attr && Name ==
Attr->getLabel())
3949 StringRef BuiltinName = BI.
getName(BuiltinID);
3950 if (BuiltinName.starts_with(
"__builtin_") &&
3951 Name == BuiltinName.slice(strlen(
"__builtin_"), StringRef::npos)) {
3957 bool VisitStmt(
const Stmt *S) {
3958 for (
const Stmt *Child : S->children())
3959 if (Child && this->Visit(Child))
3966 struct DLLImportFunctionVisitor
3968 bool SafeToInline =
true;
3970 bool shouldVisitImplicitCode()
const {
return true; }
3972 bool VisitVarDecl(
VarDecl *VD) {
3975 SafeToInline =
false;
3976 return SafeToInline;
3983 return SafeToInline;
3987 if (
const auto *
D =
E->getTemporary()->getDestructor())
3988 SafeToInline =
D->
hasAttr<DLLImportAttr>();
3989 return SafeToInline;
3994 if (isa<FunctionDecl>(VD))
3995 SafeToInline = VD->
hasAttr<DLLImportAttr>();
3996 else if (
VarDecl *
V = dyn_cast<VarDecl>(VD))
3997 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
3998 return SafeToInline;
4002 SafeToInline =
E->getConstructor()->hasAttr<DLLImportAttr>();
4003 return SafeToInline;
4010 SafeToInline =
true;
4012 SafeToInline = M->
hasAttr<DLLImportAttr>();
4014 return SafeToInline;
4018 SafeToInline =
E->getOperatorDelete()->hasAttr<DLLImportAttr>();
4019 return SafeToInline;
4023 SafeToInline =
E->getOperatorNew()->hasAttr<DLLImportAttr>();
4024 return SafeToInline;
4033CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4035 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4040 Name =
Attr->getLabel();
4045 FunctionIsDirectlyRecursive Walker(Name, Context.
BuiltinInfo);
4047 return Body ? Walker.Visit(Body) :
false;
4050bool CodeGenModule::shouldEmitFunction(
GlobalDecl GD) {
4054 const auto *F = cast<FunctionDecl>(GD.
getDecl());
4057 if (F->isInlineBuiltinDeclaration())
4060 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4065 if (
const Module *M = F->getOwningModule();
4066 M && M->getTopLevelModule()->isNamedModule() &&
4067 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4077 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4082 if (F->hasAttr<NoInlineAttr>())
4085 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4087 DLLImportFunctionVisitor Visitor;
4088 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4089 if (!Visitor.SafeToInline)
4095 for (
const Decl *
Member : Dtor->getParent()->decls())
4096 if (isa<FieldDecl>(
Member))
4110 return !isTriviallyRecursive(F);
4113bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4114 return CodeGenOpts.OptimizationLevel > 0;
4117void CodeGenModule::EmitMultiVersionFunctionDefinition(
GlobalDecl GD,
4118 llvm::GlobalValue *GV) {
4119 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4122 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4123 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4125 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4126 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4129 TC->isFirstOfVersion(I))
4132 GetOrCreateMultiVersionResolver(GD);
4134 EmitGlobalFunctionDefinition(GD, GV);
4139 AddDeferredMultiVersionResolverToEmit(GD);
4142void CodeGenModule::EmitGlobalDefinition(
GlobalDecl GD, llvm::GlobalValue *GV) {
4143 const auto *
D = cast<ValueDecl>(GD.
getDecl());
4147 "Generating code for declaration");
4149 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
4152 if (!shouldEmitFunction(GD))
4155 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4157 llvm::raw_string_ostream OS(Name);
4163 if (
const auto *Method = dyn_cast<CXXMethodDecl>(
D)) {
4166 if (isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method))
4167 ABI->emitCXXStructor(GD);
4169 EmitMultiVersionFunctionDefinition(GD, GV);
4171 EmitGlobalFunctionDefinition(GD, GV);
4173 if (Method->isVirtual())
4180 return EmitMultiVersionFunctionDefinition(GD, GV);
4181 return EmitGlobalFunctionDefinition(GD, GV);
4184 if (
const auto *VD = dyn_cast<VarDecl>(
D))
4185 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4187 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4191 llvm::Function *NewFn);
4195 const CodeGenFunction::MultiVersionResolverOption &RO) {
4197 unsigned NumFeatures = 0;
4198 for (StringRef Feat : RO.Conditions.Features) {
4203 if (!RO.Conditions.Architecture.empty())
4221 return llvm::GlobalValue::InternalLinkage;
4222 return llvm::GlobalValue::WeakODRLinkage;
4225void CodeGenModule::emitMultiVersionFunctions() {
4226 std::vector<GlobalDecl> MVFuncsToEmit;
4227 MultiVersionFuncs.swap(MVFuncsToEmit);
4229 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4230 assert(FD &&
"Expected a FunctionDecl");
4237 if (
Decl->isDefined()) {
4238 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4246 assert(
Func &&
"This should have just been created");
4248 return cast<llvm::Function>(
Func);
4262 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4263 TA->getAddedFeatures(Feats);
4264 llvm::Function *Func = createFunction(CurFD);
4265 Options.emplace_back(Func, TA->getArchitecture(), Feats);
4266 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4267 if (TVA->isDefaultVersion() && IsDefined)
4268 ShouldEmitResolver = true;
4269 TVA->getFeatures(Feats);
4270 llvm::Function *Func = createFunction(CurFD);
4271 Options.emplace_back(Func,
"", Feats);
4272 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4274 ShouldEmitResolver = true;
4275 for (unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4276 if (!TC->isFirstOfVersion(I))
4279 llvm::Function *Func = createFunction(CurFD, I);
4280 StringRef Architecture;
4282 if (getTarget().getTriple().isAArch64())
4283 TC->getFeatures(Feats, I);
4285 StringRef Version = TC->getFeatureStr(I);
4286 if (Version.starts_with(
"arch="))
4287 Architecture = Version.drop_front(sizeof(
"arch=") - 1);
4288 else if (Version !=
"default")
4289 Feats.push_back(Version);
4291 Options.emplace_back(Func, Architecture, Feats);
4294 llvm_unreachable(
"unexpected MultiVersionKind");
4297 if (!ShouldEmitResolver)
4300 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
4301 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
4302 ResolverConstant = IFunc->getResolver();
4306 *
this, GD, FD,
true);
4313 auto *Alias = llvm::GlobalAlias::create(
4315 MangledName +
".ifunc", IFunc, &
getModule());
4320 llvm::Function *ResolverFunc = cast<llvm::Function>(ResolverConstant);
4325 ResolverFunc->setComdat(
4326 getModule().getOrInsertComdat(ResolverFunc->getName()));
4330 Options, [&TI](
const CodeGenFunction::MultiVersionResolverOption &LHS,
4331 const CodeGenFunction::MultiVersionResolverOption &RHS) {
4335 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4341 if (!MVFuncsToEmit.empty())
4346 if (!MultiVersionFuncs.empty())
4347 emitMultiVersionFunctions();
4351 llvm::Constant *New) {
4352 assert(cast<llvm::Function>(Old)->isDeclaration() &&
"Not a declaration");
4354 Old->replaceAllUsesWith(New);
4355 Old->eraseFromParent();
4358void CodeGenModule::emitCPUDispatchDefinition(
GlobalDecl GD) {
4359 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4360 assert(FD &&
"Not a FunctionDecl?");
4362 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
4363 assert(DD &&
"Not a cpu_dispatch Function?");
4369 UpdateMultiVersionNames(GD, FD, ResolverName);
4371 llvm::Type *ResolverType;
4374 ResolverType = llvm::FunctionType::get(
4375 llvm::PointerType::get(DeclTy,
4384 auto *ResolverFunc = cast<llvm::Function>(GetOrCreateLLVMFunction(
4385 ResolverName, ResolverType, ResolverGD,
false));
4388 ResolverFunc->setComdat(
4389 getModule().getOrInsertComdat(ResolverFunc->getName()));
4402 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
4405 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
4411 Func = GetOrCreateLLVMFunction(
4412 MangledName, DeclTy, ExistingDecl,
4419 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
4420 llvm::transform(Features, Features.begin(),
4421 [](StringRef Str) { return Str.substr(1); });
4422 llvm::erase_if(Features, [&
Target](StringRef Feat) {
4423 return !
Target.validateCpuSupports(Feat);
4425 Options.emplace_back(cast<llvm::Function>(
Func), StringRef{}, Features);
4430 Options, [](
const CodeGenFunction::MultiVersionResolverOption &LHS,
4431 const CodeGenFunction::MultiVersionResolverOption &RHS) {
4432 return llvm::X86::getCpuSupportsMask(LHS.Conditions.Features) >
4433 llvm::X86::getCpuSupportsMask(RHS.Conditions.Features);
4440 while (Options.size() > 1 &&
4441 llvm::all_of(llvm::X86::getCpuSupportsMask(
4442 (Options.end() - 2)->Conditions.Features),
4443 [](
auto X) { return X == 0; })) {
4444 StringRef LHSName = (Options.end() - 2)->
Function->getName();
4445 StringRef RHSName = (Options.end() - 1)->
Function->getName();
4446 if (LHSName.compare(RHSName) < 0)
4447 Options.erase(Options.end() - 2);
4449 Options.erase(Options.end() - 1);
4453 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4457 auto *IFunc = cast<llvm::GlobalValue>(GetOrCreateMultiVersionResolver(GD));
4461 if (!isa<llvm::GlobalIFunc>(IFunc)) {
4462 auto *GI = llvm::GlobalIFunc::create(DeclTy, 0,
Linkage,
"", ResolverFunc,
4469 *
this, GD, FD,
true);
4472 auto *GA = llvm::GlobalAlias::create(DeclTy, 0,
Linkage, AliasName, IFunc,
4480void CodeGenModule::AddDeferredMultiVersionResolverToEmit(
GlobalDecl GD) {
4481 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4482 assert(FD &&
"Not a FunctionDecl?");
4485 std::string MangledName =
4487 if (!DeferredResolversToEmit.insert(MangledName).second)
4490 MultiVersionFuncs.push_back(GD);
4496llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(
GlobalDecl GD) {
4497 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4498 assert(FD &&
"Not a FunctionDecl?");
4500 std::string MangledName =
4505 std::string ResolverName = MangledName;
4509 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
4513 ResolverName +=
".ifunc";
4520 ResolverName +=
".resolver";
4531 (isa<llvm::GlobalIFunc>(ResolverGV) || !
getTarget().supportsIFunc()))
4540 AddDeferredMultiVersionResolverToEmit(GD);
4545 llvm::Type *ResolverType = llvm::FunctionType::get(
4546 llvm::PointerType::get(DeclTy,
4549 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4550 MangledName +
".resolver", ResolverType,
GlobalDecl{},
4552 llvm::GlobalIFunc *GIF =
4555 GIF->setName(ResolverName);
4562 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4564 assert(isa<llvm::GlobalValue>(Resolver) &&
4565 "Resolver should be created for the first time");
4572bool CodeGenModule::shouldDropDLLAttribute(
const Decl *
D,
4573 const llvm::GlobalValue *GV)
const {
4574 auto SC = GV->getDLLStorageClass();
4575 if (SC == llvm::GlobalValue::DefaultStorageClass)
4578 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
4579 !MRD->
hasAttr<DLLImportAttr>()) ||
4580 (SC == llvm::GlobalValue::DLLExportStorageClass &&
4581 !MRD->
hasAttr<DLLExportAttr>())) &&
4592llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
4593 StringRef MangledName, llvm::Type *Ty,
GlobalDecl GD,
bool ForVTable,
4594 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
4598 std::string NameWithoutMultiVersionMangling;
4601 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(
D)) {
4603 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
4604 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
4605 !DontDefer && !IsForDefinition) {
4608 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
4610 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
4619 UpdateMultiVersionNames(GD, FD, MangledName);
4620 if (!IsForDefinition) {
4626 AddDeferredMultiVersionResolverToEmit(GD);
4628 *
this, GD, FD,
true);
4630 return GetOrCreateMultiVersionResolver(GD);
4635 if (!NameWithoutMultiVersionMangling.empty())
4636 MangledName = NameWithoutMultiVersionMangling;
4641 if (WeakRefReferences.erase(Entry)) {
4643 if (FD && !FD->
hasAttr<WeakAttr>())
4644 Entry->setLinkage(llvm::Function::ExternalLinkage);
4648 if (
D && shouldDropDLLAttribute(
D, Entry)) {
4649 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
4655 if (IsForDefinition && !Entry->isDeclaration()) {
4662 DiagnosedConflictingDefinitions.insert(GD).second) {
4666 diag::note_previous_definition);
4670 if ((isa<llvm::Function>(Entry) || isa<llvm::GlobalAlias>(Entry)) &&
4671 (Entry->getValueType() == Ty)) {
4678 if (!IsForDefinition)
4685 bool IsIncompleteFunction =
false;
4687 llvm::FunctionType *FTy;
4688 if (isa<llvm::FunctionType>(Ty)) {
4689 FTy = cast<llvm::FunctionType>(Ty);
4691 FTy = llvm::FunctionType::get(
VoidTy,
false);
4692 IsIncompleteFunction =
true;
4696 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
4697 Entry ? StringRef() : MangledName, &
getModule());
4702 DeferredAnnotations[MangledName] = cast<ValueDecl>(
D);
4719 if (!Entry->use_empty()) {
4721 Entry->removeDeadConstantUsers();
4727 assert(F->getName() == MangledName &&
"name was uniqued!");
4729 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
4730 if (ExtraAttrs.hasFnAttrs()) {
4731 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
4739 if (isa_and_nonnull<CXXDestructorDecl>(
D) &&
4740 getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(
D),
4742 addDeferredDeclToEmit(GD);
4747 auto DDI = DeferredDecls.find(MangledName);
4748 if (DDI != DeferredDecls.end()) {
4752 addDeferredDeclToEmit(DDI->second);
4753 DeferredDecls.erase(DDI);
4768 for (
const auto *FD = cast<FunctionDecl>(
D)->getMostRecentDecl(); FD;
4781 if (!IsIncompleteFunction) {
4782 assert(F->getFunctionType() == Ty);
4798 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4805 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
4808 DD->getParent()->getNumVBases() == 0)
4813 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
4814 false, llvm::AttributeList(),
4817 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
4818 cast<FunctionDecl>(GD.
getDecl())->hasAttr<CUDAGlobalAttr>()) {
4820 cast<llvm::Function>(F->stripPointerCasts()), GD);
4821 if (IsForDefinition)
4829 llvm::GlobalValue *F =
4832 return llvm::NoCFIValue::get(F);
4842 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
4845 if (!
C.getLangOpts().CPlusPlus)
4850 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
4851 ?
C.Idents.get(
"terminate")
4852 :
C.Idents.get(Name);
4854 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
4858 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
4859 for (
const auto *
Result : LSD->lookup(&NS))
4860 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
4865 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
4877 llvm::AttributeList ExtraAttrs,
bool Local,
4878 bool AssumeConvergent) {
4879 if (AssumeConvergent) {
4881 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
4885 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
4889 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
4898 if (!Local &&
getTriple().isWindowsItaniumEnvironment() &&
4901 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
4902 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
4903 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
4910 markRegisterParameterAttributes(F);
4936 if (WeakRefReferences.erase(Entry)) {
4938 Entry->setLinkage(llvm::Function::ExternalLinkage);
4942 if (
D && shouldDropDLLAttribute(
D, Entry))
4943 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
4945 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd &&
D)
4948 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
4953 if (IsForDefinition && !Entry->isDeclaration()) {
4961 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
4963 DiagnosedConflictingDefinitions.insert(
D).second) {
4967 diag::note_previous_definition);
4972 if (Entry->getType()->getAddressSpace() != TargetAS)
4973 return llvm::ConstantExpr::getAddrSpaceCast(
4974 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
4978 if (!IsForDefinition)
4984 auto *GV =
new llvm::GlobalVariable(
4985 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
4986 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
4987 getContext().getTargetAddressSpace(DAddrSpace));
4992 GV->takeName(Entry);
4994 if (!Entry->use_empty()) {
4995 Entry->replaceAllUsesWith(GV);
4998 Entry->eraseFromParent();
5004 auto DDI = DeferredDecls.find(MangledName);
5005 if (DDI != DeferredDecls.end()) {
5008 addDeferredDeclToEmit(DDI->second);
5009 DeferredDecls.erase(DDI);
5014 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5019 GV->setConstant(
D->getType().isConstantStorage(
getContext(),
false,
false));
5021 GV->setAlignment(
getContext().getDeclAlign(
D).getAsAlign());
5025 if (
D->getTLSKind()) {
5027 CXXThreadLocals.push_back(
D);
5035 if (
getContext().isMSStaticDataMemberInlineDefinition(
D)) {
5036 EmitGlobalVarDefinition(
D);
5040 if (
D->hasExternalStorage()) {
5041 if (
const SectionAttr *SA =
D->
getAttr<SectionAttr>())
5042 GV->setSection(SA->getName());
5046 if (
getTriple().getArch() == llvm::Triple::xcore &&
5048 D->getType().isConstant(Context) &&
5050 GV->setSection(
".cp.rodata");
5053 if (
const auto *CMA =
D->
getAttr<CodeModelAttr>())
5054 GV->setCodeModel(CMA->getModel());
5059 if (Context.
getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5060 D->getType().isConstQualified() && !GV->hasInitializer() &&
5061 !
D->hasDefinition() &&
D->hasInit() && !
D->
hasAttr<DLLImportAttr>()) {
5065 if (!HasMutableFields) {
5067 const Expr *InitExpr =
D->getAnyInitializer(InitDecl);
5072 auto *InitType =
Init->getType();
5073 if (GV->getValueType() != InitType) {
5078 GV->setName(StringRef());
5081 auto *NewGV = cast<llvm::GlobalVariable>(
5083 ->stripPointerCasts());
5086 GV->eraseFromParent();
5089 GV->setInitializer(
Init);
5090 GV->setConstant(
true);
5091 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5106 D->hasExternalStorage())
5111 SanitizerMD->reportGlobal(GV, *
D);
5114 D ?
D->getType().getAddressSpace()
5116 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5117 if (DAddrSpace != ExpectedAS) {
5119 *
this, GV, DAddrSpace, ExpectedAS,
5130 if (isa<CXXConstructorDecl>(
D) || isa<CXXDestructorDecl>(
D))
5132 false, IsForDefinition);
5134 if (isa<CXXMethodDecl>(
D)) {
5142 if (isa<FunctionDecl>(
D)) {
5153 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5154 llvm::Align Alignment) {
5155 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5156 llvm::GlobalVariable *OldGV =
nullptr;
5160 if (GV->getValueType() == Ty)
5165 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
5170 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
5175 GV->takeName(OldGV);
5177 if (!OldGV->use_empty()) {
5178 OldGV->replaceAllUsesWith(GV);
5181 OldGV->eraseFromParent();
5185 !GV->hasAvailableExternallyLinkage())
5186 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
5188 GV->setAlignment(Alignment);
5202 assert(
D->hasGlobalStorage() &&
"Not a global variable");
5220 setDSOLocal(cast<llvm::GlobalValue>(Ret->stripPointerCasts()));
5225 assert(!
D->getInit() &&
"Cannot emit definite definitions here!");
5233 if (GV && !GV->isDeclaration())
5238 if (!MustBeEmitted(
D) && !GV) {
5239 DeferredDecls[MangledName] =
D;
5244 EmitGlobalVarDefinition(
D);
5248 if (
auto const *
V = dyn_cast<const VarDecl>(
D))
5249 EmitExternalVarDeclaration(
V);
5250 if (
auto const *FD = dyn_cast<const FunctionDecl>(
D))
5251 EmitExternalFunctionDeclaration(FD);
5260 if (LangOpts.OpenCL) {
5271 if (LangOpts.SYCLIsDevice &&
5275 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
5277 if (
D->
hasAttr<CUDAConstantAttr>())
5283 if (
D->getType().isConstQualified())
5289 if (LangOpts.OpenMP) {
5291 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(
D, AS))
5299 if (LangOpts.OpenCL)
5301 if (LangOpts.SYCLIsDevice)
5303 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
5311 if (
auto AS =
getTarget().getConstantAddressSpace())
5324static llvm::Constant *
5326 llvm::GlobalVariable *GV) {
5327 llvm::Constant *Cast = GV;
5333 llvm::PointerType::get(
5340template<
typename SomeDecl>
5342 llvm::GlobalValue *GV) {
5348 if (!
D->template hasAttr<UsedAttr>())
5357 const SomeDecl *
First =
D->getFirstDecl();
5358 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
5364 std::pair<StaticExternCMap::iterator, bool> R =
5365 StaticExternCValues.insert(std::make_pair(
D->getIdentifier(), GV));
5370 R.first->second =
nullptr;
5381 if (
auto *VD = dyn_cast<VarDecl>(&
D))
5395 llvm_unreachable(
"No such linkage");
5403 llvm::GlobalObject &GO) {
5406 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
5414void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *
D,
5424 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
5425 OpenMPRuntime->emitTargetGlobalVariable(
D))
5428 llvm::TrackingVH<llvm::Constant>
Init;
5429 bool NeedsGlobalCtor =
false;
5433 bool IsDefinitionAvailableExternally =
5435 bool NeedsGlobalDtor =
5436 !IsDefinitionAvailableExternally &&
5443 if (IsDefinitionAvailableExternally &&
5444 (!
D->hasConstantInitialization() ||
5448 !
D->getType().isConstantStorage(
getContext(),
true,
true)))
5452 const Expr *InitExpr =
D->getAnyInitializer(InitDecl);
5454 std::optional<ConstantEmitter> emitter;
5459 bool IsCUDASharedVar =
5464 bool IsCUDAShadowVar =
5468 bool IsCUDADeviceShadowVar =
5470 (
D->getType()->isCUDADeviceBuiltinSurfaceType() ||
5471 D->getType()->isCUDADeviceBuiltinTextureType());
5473 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar))
5474 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5475 else if (
D->
hasAttr<LoaderUninitializedAttr>())
5476 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5477 else if (!InitExpr) {
5491 emitter.emplace(*
this);
5492 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
5495 if (
D->getType()->isReferenceType())
5503 if (!IsDefinitionAvailableExternally)
5504 NeedsGlobalCtor =
true;
5515 DelayedCXXInitPosition.erase(
D);
5522 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
5527 llvm::Type* InitType =
Init->getType();
5528 llvm::Constant *Entry =
5532 Entry = Entry->stripPointerCasts();
5535 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
5546 if (!GV || GV->getValueType() != InitType ||
5547 GV->getType()->getAddressSpace() !=
5551 Entry->setName(StringRef());
5554 GV = cast<llvm::GlobalVariable>(
5556 ->stripPointerCasts());
5559 llvm::Constant *NewPtrForOldDecl =
5560 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
5562 Entry->replaceAllUsesWith(NewPtrForOldDecl);
5565 cast<llvm::GlobalValue>(Entry)->eraseFromParent();
5583 if (LangOpts.CUDA) {
5584 if (LangOpts.CUDAIsDevice) {
5585 if (
Linkage != llvm::GlobalValue::InternalLinkage &&
5587 D->getType()->isCUDADeviceBuiltinSurfaceType() ||
5588 D->getType()->isCUDADeviceBuiltinTextureType()))
5589 GV->setExternallyInitialized(
true);
5596 GV->setInitializer(
Init);
5598 emitter->finalize(GV);
5601 GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
5602 D->getType().isConstantStorage(
getContext(),
true,
true));
5605 if (
const SectionAttr *SA =
D->
getAttr<SectionAttr>()) {
5608 GV->setConstant(
true);
5613 if (std::optional<CharUnits> AlignValFromAllocate =
5615 AlignVal = *AlignValFromAllocate;
5633 Linkage == llvm::GlobalValue::ExternalLinkage &&
5636 Linkage = llvm::GlobalValue::InternalLinkage;
5640 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
5641 else if (
D->
hasAttr<DLLExportAttr>())
5642 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
5644 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
5646 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
5648 GV->setConstant(
false);
5653 if (!GV->getInitializer()->isNullValue())
5654 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
5657 setNonAliasAttributes(
D, GV);
5659 if (
D->getTLSKind() && !GV->isThreadLocal()) {
5661 CXXThreadLocals.push_back(
D);
5668 if (NeedsGlobalCtor || NeedsGlobalDtor)
5669 EmitCXXGlobalVarDeclInitFunc(
D, GV, NeedsGlobalCtor);
5671 SanitizerMD->reportGlobal(GV, *
D, NeedsGlobalCtor);
5676 DI->EmitGlobalVariable(GV,
D);
5679void CodeGenModule::EmitExternalVarDeclaration(
const VarDecl *
D) {
5684 llvm::Constant *GV =
5686 DI->EmitExternalVariable(
5687 cast<llvm::GlobalVariable>(GV->stripPointerCasts()),
D);
5691void CodeGenModule::EmitExternalFunctionDeclaration(
const FunctionDecl *FD) {
5696 auto *
Fn = cast<llvm::Function>(
5697 GetOrCreateLLVMFunction(MangledName, Ty, FD,
false));
5698 if (!
Fn->getSubprogram())
5715 if (
D->getInit() ||
D->hasExternalStorage())
5725 if (
D->
hasAttr<PragmaClangBSSSectionAttr>() ||
5726 D->
hasAttr<PragmaClangDataSectionAttr>() ||
5727 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
5728 D->
hasAttr<PragmaClangRodataSectionAttr>())
5732 if (
D->getTLSKind())
5755 if (FD->isBitField())
5757 if (FD->
hasAttr<AlignedAttr>())
5779llvm::GlobalValue::LinkageTypes
5783 return llvm::Function::InternalLinkage;
5786 return llvm::GlobalVariable::WeakAnyLinkage;
5790 return llvm::GlobalVariable::LinkOnceAnyLinkage;
5795 return llvm::GlobalValue::AvailableExternallyLinkage;
5809 return !Context.
getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
5810 : llvm::Function::InternalLinkage;
5824 return llvm::Function::ExternalLinkage;
5827 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
5828 : llvm::Function::InternalLinkage;
5829 return llvm::Function::WeakODRLinkage;
5836 CodeGenOpts.NoCommon))
5837 return llvm::GlobalVariable::CommonLinkage;
5844 return llvm::GlobalVariable::WeakODRLinkage;
5848 return llvm::GlobalVariable::ExternalLinkage;
5851llvm::GlobalValue::LinkageTypes
5860 llvm::Function *newFn) {
5862 if (old->use_empty())
5865 llvm::Type *newRetTy = newFn->getReturnType();
5870 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
5872 llvm::User *user = ui->getUser();
5876 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
5877 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
5883 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
5886 if (!callSite->isCallee(&*ui))
5891 if (callSite->getType() != newRetTy && !callSite->use_empty())
5896 llvm::AttributeList oldAttrs = callSite->getAttributes();
5899 unsigned newNumArgs = newFn->arg_size();
5900 if (callSite->arg_size() < newNumArgs)
5906 bool dontTransform =
false;
5907 for (llvm::Argument &A : newFn->args()) {
5908 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
5909 dontTransform =
true;
5914 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
5922 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
5926 callSite->getOperandBundlesAsDefs(newBundles);
5928 llvm::CallBase *newCall;
5929 if (isa<llvm::CallInst>(callSite)) {
5930 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
5931 callSite->getIterator());
5933 auto *oldInvoke = cast<llvm::InvokeInst>(callSite);
5934 newCall = llvm::InvokeInst::Create(
5935 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
5936 newArgs, newBundles,
"", callSite->getIterator());
5940 if (!newCall->getType()->isVoidTy())
5941 newCall->takeName(callSite);
5942 newCall->setAttributes(
5943 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
5944 oldAttrs.getRetAttrs(), newArgAttrs));
5945 newCall->setCallingConv(callSite->getCallingConv());
5948 if (!callSite->use_empty())
5949 callSite->replaceAllUsesWith(newCall);
5952 if (callSite->getDebugLoc())
5953 newCall->setDebugLoc(callSite->getDebugLoc());
5955 callSitesToBeRemovedFromParent.push_back(callSite);
5958 for (
auto *callSite : callSitesToBeRemovedFromParent) {
5959 callSite->eraseFromParent();
5973 llvm::Function *NewFn) {
5975 if (!isa<llvm::Function>(Old))
return;
5983 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
5995void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
5996 llvm::GlobalValue *GV) {
5997 const auto *
D = cast<FunctionDecl>(GD.
getDecl());
6004 if (!GV || (GV->getValueType() != Ty))
6010 if (!GV->isDeclaration())
6017 auto *Fn = cast<llvm::Function>(GV);
6029 setNonAliasAttributes(GD, Fn);
6032 if (
const ConstructorAttr *CA =
D->
getAttr<ConstructorAttr>())
6034 if (
const DestructorAttr *DA =
D->
getAttr<DestructorAttr>())
6040void CodeGenModule::EmitAliasDefinition(
GlobalDecl GD) {
6041 const auto *
D = cast<ValueDecl>(GD.
getDecl());
6042 const AliasAttr *AA =
D->
getAttr<AliasAttr>();
6043 assert(AA &&
"Not an alias?");
6047 if (AA->getAliasee() == MangledName) {
6048 Diags.
Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6055 if (Entry && !Entry->isDeclaration())
6058 Aliases.push_back(GD);
6064 llvm::Constant *Aliasee;
6065 llvm::GlobalValue::LinkageTypes
LT;
6066 if (isa<llvm::FunctionType>(DeclTy)) {
6067 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6073 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6080 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6082 llvm::GlobalAlias::create(DeclTy, AS,
LT,
"", Aliasee, &
getModule());
6085 if (GA->getAliasee() == Entry) {
6086 Diags.
Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6090 assert(Entry->isDeclaration());
6099 GA->takeName(Entry);
6101 Entry->replaceAllUsesWith(GA);
6102 Entry->eraseFromParent();
6104 GA->setName(MangledName);
6112 GA->setLinkage(llvm::Function::WeakAnyLinkage);
6115 if (
const auto *VD = dyn_cast<VarDecl>(
D))
6116 if (VD->getTLSKind())
6122 if (isa<VarDecl>(
D))
6124 DI->EmitGlobalAlias(cast<llvm::GlobalValue>(GA->getAliasee()->stripPointerCasts()), GD);
6127void CodeGenModule::emitIFuncDefinition(
GlobalDecl GD) {
6128 const auto *
D = cast<ValueDecl>(GD.
getDecl());
6129 const IFuncAttr *IFA =
D->
getAttr<IFuncAttr>();
6130 assert(IFA &&
"Not an ifunc?");
6134 if (IFA->getResolver() == MangledName) {
6135 Diags.
Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6141 if (Entry && !Entry->isDeclaration()) {
6144 DiagnosedConflictingDefinitions.insert(GD).second) {
6148 diag::note_previous_definition);
6153 Aliases.push_back(GD);
6159 llvm::Constant *Resolver =
6160 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
6163 llvm::GlobalIFunc *GIF =
6164 llvm::GlobalIFunc::create(DeclTy, 0, llvm::Function::ExternalLinkage,
6167 if (GIF->getResolver() == Entry) {
6168 Diags.
Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6171 assert(Entry->isDeclaration());
6180 GIF->takeName(Entry);
6182 Entry->replaceAllUsesWith(GIF);
6183 Entry->eraseFromParent();
6185 GIF->setName(MangledName);
6191 return llvm::Intrinsic::getDeclaration(&
getModule(), (llvm::Intrinsic::ID)IID,
6195static llvm::StringMapEntry<llvm::GlobalVariable *> &
6198 bool &IsUTF16,
unsigned &StringLength) {
6199 StringRef String = Literal->getString();
6200 unsigned NumBytes = String.size();
6203 if (!Literal->containsNonAsciiOrNull()) {
6204 StringLength = NumBytes;
6205 return *Map.insert(std::make_pair(String,
nullptr)).first;
6212 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
6213 llvm::UTF16 *ToPtr = &ToBuf[0];
6215 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
6216 ToPtr + NumBytes, llvm::strictConversion);
6219 StringLength = ToPtr - &ToBuf[0];
6223 return *Map.insert(std::make_pair(
6224 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
6225 (StringLength + 1) * 2),
6231 unsigned StringLength = 0;
6232 bool isUTF16 =
false;
6233 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
6238 if (
auto *
C = Entry.second)
6243 const llvm::Triple &Triple =
getTriple();
6246 const bool IsSwiftABI =
6247 static_cast<unsigned>(CFRuntime) >=
6252 if (!CFConstantStringClassRef) {
6253 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
6255 Ty = llvm::ArrayType::get(Ty, 0);
6257 switch (CFRuntime) {
6261 CFConstantStringClassName =
6262 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
6263 :
"$s10Foundation19_NSCFConstantStringCN";
6267 CFConstantStringClassName =
6268 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
6269 :
"$S10Foundation19_NSCFConstantStringCN";
6273 CFConstantStringClassName =
6274 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
6275 :
"__T010Foundation19_NSCFConstantStringCN";
6282 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
6283 llvm::GlobalValue *GV =
nullptr;
6285 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
6292 if ((VD = dyn_cast<VarDecl>(
Result)))
6295 if (Triple.isOSBinFormatELF()) {
6297 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6299 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6300 if (!VD || !VD->
hasAttr<DLLExportAttr>())
6301 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6303 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6311 CFConstantStringClassRef =
6312 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
6317 auto *STy = cast<llvm::StructType>(
getTypes().ConvertType(CFTy));
6320 auto Fields = Builder.beginStruct(STy);
6323 Fields.add(cast<llvm::Constant>(CFConstantStringClassRef));
6327 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
6328 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
6330 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
6334 llvm::Constant *
C =
nullptr;
6337 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
6338 Entry.first().size() / 2);
6339 C = llvm::ConstantDataArray::get(VMContext, Arr);
6341 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
6347 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
6348 llvm::GlobalValue::PrivateLinkage,
C,
".str");
6349 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
6359 if (Triple.isOSBinFormatMachO())
6360 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
6361 :
"__TEXT,__cstring,cstring_literals");
6364 else if (Triple.isOSBinFormatELF())
6365 GV->setSection(
".rodata");
6371 llvm::IntegerType *LengthTy =
6381 Fields.addInt(LengthTy, StringLength);
6389 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
6391 llvm::GlobalVariable::PrivateLinkage);
6392 GV->addAttribute(
"objc_arc_inert");
6393 switch (Triple.getObjectFormat()) {
6394 case llvm::Triple::UnknownObjectFormat:
6395 llvm_unreachable(
"unknown file format");
6396 case llvm::Triple::DXContainer:
6397 case llvm::Triple::GOFF:
6398 case llvm::Triple::SPIRV:
6399 case llvm::Triple::XCOFF:
6400 llvm_unreachable(
"unimplemented");
6401 case llvm::Triple::COFF:
6402 case llvm::Triple::ELF:
6403 case llvm::Triple::Wasm:
6404 GV->setSection(
"cfstring");
6406 case llvm::Triple::MachO:
6407 GV->setSection(
"__DATA,__cfstring");
6416 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
6420 if (ObjCFastEnumerationStateType.
isNull()) {
6422 D->startDefinition();
6430 for (
size_t i = 0; i < 4; ++i) {
6435 FieldTypes[i],
nullptr,
6443 D->completeDefinition();
6447 return ObjCFastEnumerationStateType;
6456 if (
E->getCharByteWidth() == 1) {
6461 assert(CAT &&
"String literal not of constant array type!");
6463 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
6467 llvm::Type *ElemTy = AType->getElementType();
6468 unsigned NumElements = AType->getNumElements();
6471 if (ElemTy->getPrimitiveSizeInBits() == 16) {
6473 Elements.reserve(NumElements);
6475 for(
unsigned i = 0, e =
E->getLength(); i != e; ++i)
6476 Elements.push_back(
E->getCodeUnit(i));
6477 Elements.resize(NumElements);
6478 return llvm::ConstantDataArray::get(VMContext, Elements);
6481 assert(ElemTy->getPrimitiveSizeInBits() == 32);
6483 Elements.reserve(NumElements);
6485 for(
unsigned i = 0, e =
E->getLength(); i != e; ++i)
6486 Elements.push_back(
E->getCodeUnit(i));
6487 Elements.resize(NumElements);
6488 return llvm::ConstantDataArray::get(VMContext, Elements);
6491static llvm::GlobalVariable *
6500 auto *GV =
new llvm::GlobalVariable(
6501 M,
C->getType(), !CGM.
getLangOpts().WritableStrings,
LT,
C, GlobalName,
6502 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
6504 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
6505 if (GV->isWeakForLinker()) {
6506 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
6507 GV->setComdat(M.getOrInsertComdat(GV->getName()));
6523 llvm::GlobalVariable **Entry =
nullptr;
6524 if (!LangOpts.WritableStrings) {
6525 Entry = &ConstantStringMap[
C];
6526 if (
auto GV = *Entry) {
6527 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
6530 GV->getValueType(), Alignment);
6535 StringRef GlobalVariableName;
6536 llvm::GlobalValue::LinkageTypes
LT;
6541 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
6542 !LangOpts.WritableStrings) {
6543 llvm::raw_svector_ostream Out(MangledNameBuffer);
6545 LT = llvm::GlobalValue::LinkOnceODRLinkage;
6546 GlobalVariableName = MangledNameBuffer;
6548 LT = llvm::GlobalValue::PrivateLinkage;
6549 GlobalVariableName = Name;
6561 SanitizerMD->reportGlobal(GV, S->getStrTokenLoc(0),
"<string literal>");
6564 GV->getValueType(), Alignment);
6581 const std::string &Str,
const char *GlobalName) {
6582 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
6587 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
6590 llvm::GlobalVariable **Entry =
nullptr;
6591 if (!LangOpts.WritableStrings) {
6592 Entry = &ConstantStringMap[
C];
6593 if (
auto GV = *Entry) {
6594 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
6597 GV->getValueType(), Alignment);
6603 GlobalName =
".str";
6606 GlobalName, Alignment);
6611 GV->getValueType(), Alignment);
6616 assert((
E->getStorageDuration() ==
SD_Static ||
6617 E->getStorageDuration() ==
SD_Thread) &&
"not a global temporary");
6618 const auto *VD = cast<VarDecl>(
E->getExtendingDecl());
6623 if (
Init ==
E->getSubExpr())
6628 auto InsertResult = MaterializedGlobalTemporaryMap.insert({
E,
nullptr});
6629 if (!InsertResult.second) {
6632 if (!InsertResult.first->second) {
6637 InsertResult.first->second =
new llvm::GlobalVariable(
6638 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
6642 llvm::cast<llvm::GlobalVariable>(
6643 InsertResult.first->second->stripPointerCasts())
6652 llvm::raw_svector_ostream Out(Name);
6654 VD,
E->getManglingNumber(), Out);
6657 if (
E->getStorageDuration() ==
SD_Static && VD->evaluateValue()) {
6663 Value =
E->getOrCreateValue(
false);
6674 std::optional<ConstantEmitter> emitter;
6675 llvm::Constant *InitialValue =
nullptr;
6676 bool Constant =
false;
6680 emitter.emplace(*
this);
6681 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
6686 Type = InitialValue->getType();
6695 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
6697 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
6701 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
6705 Linkage = llvm::GlobalVariable::InternalLinkage;
6709 auto *GV =
new llvm::GlobalVariable(
6711 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
6712 if (emitter) emitter->finalize(GV);
6714 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
6716 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
6718 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6722 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6723 if (VD->getTLSKind())
6725 llvm::Constant *CV = GV;
6729 llvm::PointerType::get(
6735 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[
E];
6737 Entry->replaceAllUsesWith(CV);
6738 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
6747void CodeGenModule::EmitObjCPropertyImplementations(
const
6749 for (
const auto *PID :
D->property_impls()) {
6760 if (!Getter || Getter->isSynthesizedAccessorStub())
6763 auto *Setter = PID->getSetterMethodDecl();
6764 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
6775 if (ivar->getType().isDestructedType())
6785 E =
D->init_end(); B !=
E; ++B) {
6808 D->addInstanceMethod(DTORMethod);
6810 D->setHasDestructors(
true);
6815 if (
D->getNumIvarInitializers() == 0 ||
6829 D->addInstanceMethod(CTORMethod);
6831 D->setHasNonZeroConstructors(
true);
6842 EmitDeclContext(LSD);
6847 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
6850 std::unique_ptr<CodeGenFunction> &CurCGF =
6851 GlobalTopLevelStmtBlockInFlight.first;
6855 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
6863 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
6869 llvm::Function *
Fn = llvm::Function::Create(
6870 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
6873 GlobalTopLevelStmtBlockInFlight.second =
D;
6874 CurCGF->StartFunction(
GlobalDecl(), RetTy, Fn, FnInfo, Args,
6876 CXXGlobalInits.push_back(Fn);
6879 CurCGF->EmitStmt(
D->getStmt());
6882void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
6883 for (
auto *I : DC->
decls()) {
6889 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
6890 for (
auto *M : OID->methods())
6909 case Decl::CXXConversion:
6910 case Decl::CXXMethod:
6911 case Decl::Function:
6918 case Decl::CXXDeductionGuide:
6923 case Decl::Decomposition:
6924 case Decl::VarTemplateSpecialization:
6926 if (
auto *DD = dyn_cast<DecompositionDecl>(
D))
6927 for (
auto *B : DD->bindings())
6928 if (
auto *HD = B->getHoldingVar())
6934 case Decl::IndirectField:
6938 case Decl::Namespace:
6939 EmitDeclContext(cast<NamespaceDecl>(
D));
6941 case Decl::ClassTemplateSpecialization: {
6942 const auto *Spec = cast<ClassTemplateSpecializationDecl>(
D);
6944 if (Spec->getSpecializationKind() ==
6946 Spec->hasDefinition())
6947 DI->completeTemplateDefinition(*Spec);
6949 case Decl::CXXRecord: {
6956 DI->completeUnusedClass(*CRD);
6959 for (
auto *I : CRD->
decls())
6960 if (isa<VarDecl>(I) || isa<CXXRecordDecl>(I))
6965 case Decl::UsingShadow:
6966 case Decl::ClassTemplate:
6967 case Decl::VarTemplate:
6969 case Decl::VarTemplatePartialSpecialization:
6970 case Decl::FunctionTemplate:
6971 case Decl::TypeAliasTemplate:
6978 DI->EmitUsingDecl(cast<UsingDecl>(*
D));
6980 case Decl::UsingEnum:
6982 DI->EmitUsingEnumDecl(cast<UsingEnumDecl>(*
D));
6984 case Decl::NamespaceAlias:
6986 DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*
D));
6988 case Decl::UsingDirective:
6990 DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*
D));
6992 case Decl::CXXConstructor:
6995 case Decl::CXXDestructor:
6999 case Decl::StaticAssert:
7006 case Decl::ObjCInterface:
7007 case Decl::ObjCCategory:
7010 case Decl::ObjCProtocol: {
7011 auto *Proto = cast<ObjCProtocolDecl>(
D);
7012 if (Proto->isThisDeclarationADefinition())
7017 case Decl::ObjCCategoryImpl:
7020 ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(
D));
7023 case Decl::ObjCImplementation: {
7024 auto *OMD = cast<ObjCImplementationDecl>(
D);
7025 EmitObjCPropertyImplementations(OMD);
7026 EmitObjCIvarInitializations(OMD);
7031 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7032 OMD->getClassInterface()), OMD->getLocation());
7035 case Decl::ObjCMethod: {
7036 auto *OMD = cast<ObjCMethodDecl>(
D);
7042 case Decl::ObjCCompatibleAlias:
7043 ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(
D));
7046 case Decl::PragmaComment: {
7047 const auto *PCD = cast<PragmaCommentDecl>(
D);
7048 switch (PCD->getCommentKind()) {
7050 llvm_unreachable(
"unexpected pragma comment kind");
7065 case Decl::PragmaDetectMismatch: {
7066 const auto *PDMD = cast<PragmaDetectMismatchDecl>(
D);
7071 case Decl::LinkageSpec:
7072 EmitLinkageSpec(cast<LinkageSpecDecl>(
D));
7075 case Decl::FileScopeAsm: {
7077 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7080 if (LangOpts.OpenMPIsTargetDevice)
7083 if (LangOpts.SYCLIsDevice)
7085 auto *AD = cast<FileScopeAsmDecl>(
D);
7086 getModule().appendModuleInlineAsm(AD->getAsmString()->getString());
7090 case Decl::TopLevelStmt:
7091 EmitTopLevelStmt(cast<TopLevelStmtDecl>(
D));
7094 case Decl::Import: {
7095 auto *Import = cast<ImportDecl>(
D);
7098 if (!ImportedModules.insert(Import->getImportedModule()))
7102 if (!Import->getImportedOwningModule()) {
7104 DI->EmitImportDecl(*Import);
7110 if (CXX20ModuleInits && Import->getImportedOwningModule() &&
7111 !Import->getImportedOwningModule()->isModuleMapModule())
7120 Visited.insert(Import->getImportedModule());
7121 Stack.push_back(Import->getImportedModule());
7123 while (!Stack.empty()) {
7125 if (!EmittedModuleInitializers.insert(Mod).second)
7135 if (Submodule->IsExplicit)
7138 if (
Visited.insert(Submodule).second)
7139 Stack.push_back(Submodule);
7146 EmitDeclContext(cast<ExportDecl>(
D));
7149 case Decl::OMPThreadPrivate:
7153 case Decl::OMPAllocate:
7157 case Decl::OMPDeclareReduction:
7161 case Decl::OMPDeclareMapper:
7165 case Decl::OMPRequires:
7170 case Decl::TypeAlias:
7172 DI->EmitAndRetainType(
7173 getContext().getTypedefType(cast<TypedefNameDecl>(
D)));
7185 DI->EmitAndRetainType(
getContext().getEnumType(cast<EnumDecl>(
D)));
7188 case Decl::HLSLBuffer:
7196 assert(isa<TypeDecl>(
D) &&
"Unsupported decl kind");
7203 if (!CodeGenOpts.CoverageMapping)
7206 case Decl::CXXConversion:
7207 case Decl::CXXMethod:
7208 case Decl::Function:
7209 case Decl::ObjCMethod:
7210 case Decl::CXXConstructor:
7211 case Decl::CXXDestructor: {
7212 if (!cast<FunctionDecl>(
D)->doesThisDeclarationHaveABody())
7220 DeferredEmptyCoverageMappingDecls.try_emplace(
D,
true);
7230 if (!CodeGenOpts.CoverageMapping)
7232 if (
const auto *Fn = dyn_cast<FunctionDecl>(
D)) {
7233 if (Fn->isTemplateInstantiation())
7236 DeferredEmptyCoverageMappingDecls.insert_or_assign(
D,
false);
7244 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
7247 const Decl *
D = Entry.first;
7249 case Decl::CXXConversion:
7250 case Decl::CXXMethod:
7251 case Decl::Function:
7252 case Decl::ObjCMethod: {
7259 case Decl::CXXConstructor: {
7266 case Decl::CXXDestructor: {
7283 if (llvm::Function *F =
getModule().getFunction(
"main")) {
7284 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
7286 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
7287 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
7296 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
7297 return llvm::ConstantInt::get(i64, PtrInt);
7301 llvm::NamedMDNode *&GlobalMetadata,
7303 llvm::GlobalValue *Addr) {
7304 if (!GlobalMetadata)
7306 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
7309 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(Addr),
7312 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
7315bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
7316 llvm::GlobalValue *CppFunc) {
7324 if (Elem == CppFunc)
7330 for (llvm::User *User : Elem->users()) {
7334 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
7335 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
7338 for (llvm::User *CEUser : ConstExpr->users()) {
7339 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
7340 IFuncs.push_back(IFunc);
7345 CEs.push_back(ConstExpr);
7346 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
7347 IFuncs.push_back(IFunc);
7359 for (llvm::GlobalIFunc *IFunc : IFuncs)
7360 IFunc->setResolver(
nullptr);
7361 for (llvm::ConstantExpr *ConstExpr : CEs)
7362 ConstExpr->destroyConstant();
7366 Elem->eraseFromParent();
7368 for (llvm::GlobalIFunc *IFunc : IFuncs) {
7373 llvm::FunctionType::get(IFunc->getType(),
false);
7374 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
7375 CppFunc->getName(), ResolverTy, {},
false);
7376 IFunc->setResolver(Resolver);
7386void CodeGenModule::EmitStaticExternCAliases() {
7389 for (
auto &I : StaticExternCValues) {
7391 llvm::GlobalValue *Val = I.second;
7399 llvm::GlobalValue *ExistingElem =
7400 getModule().getNamedValue(Name->getName());
7404 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
7411 auto Res = Manglings.find(MangledName);
7412 if (Res == Manglings.end())
7414 Result = Res->getValue();
7425void CodeGenModule::EmitDeclMetadata() {
7426 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7428 for (
auto &I : MangledDeclNames) {
7429 llvm::GlobalValue *Addr =
getModule().getNamedValue(I.second);
7439void CodeGenFunction::EmitDeclMetadata() {
7440 if (LocalDeclMap.empty())
return;
7445 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
7447 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7449 for (
auto &I : LocalDeclMap) {
7450 const Decl *
D = I.first;
7451 llvm::Value *Addr = I.second.emitRawPointer(*
this);
7452 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {
7454 Alloca->setMetadata(
7455 DeclPtrKind, llvm::MDNode::get(
7456 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
7457 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) {
7464void CodeGenModule::EmitVersionIdentMetadata() {
7465 llvm::NamedMDNode *IdentMetadata =
7466 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
7468 llvm::LLVMContext &Ctx = TheModule.getContext();
7470 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
7471 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
7474void CodeGenModule::EmitCommandLineMetadata() {
7475 llvm::NamedMDNode *CommandLineMetadata =
7476 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
7478 llvm::LLVMContext &Ctx = TheModule.getContext();
7480 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
7481 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
7484void CodeGenModule::EmitCoverageFile() {
7485 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
7489 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
7490 llvm::LLVMContext &Ctx = TheModule.getContext();
7491 auto *CoverageDataFile =
7493 auto *CoverageNotesFile =
7495 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
7496 llvm::MDNode *CU = CUNode->getOperand(i);
7497 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
7498 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
7519 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
7521 for (
auto RefExpr :
D->varlist()) {
7522 auto *VD = cast<VarDecl>(cast<DeclRefExpr>(RefExpr)->getDecl());
7524 VD->getAnyInitializer() &&
7525 !VD->getAnyInitializer()->isConstantInitializer(
getContext(),
7532 VD, Addr, RefExpr->getBeginLoc(), PerformInit))
7533 CXXGlobalInits.push_back(InitFunction);
7538CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
7542 FnType->getReturnType(), FnType->getParamTypes(),
7543 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
7545 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
7550 std::string OutName;
7551 llvm::raw_string_ostream Out(OutName);
7556 Out <<
".normalized";
7570 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
7575 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
7595 for (
auto &Param : FnType->param_types())
7600 GeneralizedParams, FnType->getExtProtoInfo());
7607 llvm_unreachable(
"Encountered unknown FunctionType");
7612 GeneralizedMetadataIdMap,
".generalized");
7619 return ((LangOpts.
Sanitize.
has(SanitizerKind::CFIVCall) &&
7621 (LangOpts.
Sanitize.
has(SanitizerKind::CFINVCall) &&
7623 (LangOpts.
Sanitize.
has(SanitizerKind::CFIDerivedCast) &&
7625 (LangOpts.
Sanitize.
has(SanitizerKind::CFIUnrelatedCast) &&
7632 llvm::Metadata *MD =
7634 VTable->addTypeMetadata(Offset.getQuantity(), MD);
7636 if (CodeGenOpts.SanitizeCfiCrossDso)
7638 VTable->addTypeMetadata(Offset.getQuantity(),
7639 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
7642 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
7643 VTable->addTypeMetadata(Offset.getQuantity(), MD);
7649 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
7659 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
7674 bool forPointeeType) {
7685 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
7715 if (
T.getQualifiers().hasUnaligned()) {
7717 }
else if (forPointeeType && !AlignForArray &&
7729 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
7742 if (NumAutoVarInit >= StopAfter) {
7745 if (!NumAutoVarInit) {
7748 "-ftrivial-auto-var-init-stop-after=%0 has been enabled to limit the "
7749 "number of times ftrivial-auto-var-init=%1 gets applied.");
7763 const Decl *
D)
const {
7767 OS << (isa<VarDecl>(
D) ?
".static." :
".intern.");
7769 OS << (isa<VarDecl>(
D) ?
"__static__" :
"__intern__");
7775 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
7779 llvm::MD5::MD5Result
Result;
7780 for (
const auto &Arg : PreprocessorOpts.
Macros)
7781 Hash.update(Arg.first);
7785 llvm::sys::fs::UniqueID ID;
7786 if (llvm::sys::fs::getUniqueID(PLoc.
getFilename(), ID)) {
7788 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
7789 if (
auto EC = llvm::sys::fs::getUniqueID(PLoc.
getFilename(), ID))
7790 SM.getDiagnostics().Report(diag::err_cannot_open_file)
7793 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
7794 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
7801 assert(DeferredDeclsToEmit.empty() &&
7802 "Should have emitted all decls deferred to emit.");
7803 assert(NewBuilder->DeferredDecls.empty() &&
7804 "Newly created module should not have deferred decls");
7805 NewBuilder->DeferredDecls = std::move(DeferredDecls);
7806 assert(EmittedDeferredDecls.empty() &&
7807 "Still have (unmerged) EmittedDeferredDecls deferred decls");
7809 assert(NewBuilder->DeferredVTables.empty() &&
7810 "Newly created module should not have deferred vtables");
7811 NewBuilder->DeferredVTables = std::move(DeferredVTables);
7813 assert(NewBuilder->MangledDeclNames.empty() &&
7814 "Newly created module should not have mangled decl names");
7815 assert(NewBuilder->Manglings.empty() &&
7816 "Newly created module should not have manglings");
7817 NewBuilder->Manglings = std::move(Manglings);
7819 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
7821 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 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)
llvm::GlobalValue::LinkageTypes getMultiversionLinkage(CodeGenModule &CGM, GlobalDecl GD)
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 unsigned TargetMVPriority(const TargetInfo &TI, const CodeGenFunction::MultiVersionResolverOption &RO)
static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO, llvm::Module &M)
static std::string getCPUSpecificMangling(const CodeGenModule &CGM, 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 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)
void setLLVMVisibility(llvm::GlobalValue &GV, std::optional< llvm::GlobalValue::VisibilityTypes > V)
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.
Defines the clang::FileManager interface and associated types.
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()'.
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]).
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 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
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.
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...
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys=std::nullopt)
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.
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.
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.
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.
virtual unsigned multiVersionSortPriority(StringRef Name) const
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
virtual unsigned multiVersionFeatureCost() 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 > 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
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
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.