53#include "llvm/ABI/IRTypeMapper.h"
54#include "llvm/ABI/TargetInfo.h"
55#include "llvm/ADT/APFloat.h"
56#include "llvm/ADT/STLExtras.h"
57#include "llvm/ADT/StringExtras.h"
58#include "llvm/ADT/StringSwitch.h"
59#include "llvm/Analysis/TargetLibraryInfo.h"
60#include "llvm/BinaryFormat/ELF.h"
61#include "llvm/IR/AttributeMask.h"
62#include "llvm/IR/CallingConv.h"
63#include "llvm/IR/DataLayout.h"
64#include "llvm/IR/Intrinsics.h"
65#include "llvm/IR/LLVMContext.h"
66#include "llvm/IR/Module.h"
67#include "llvm/IR/ProfileSummary.h"
68#include "llvm/ProfileData/InstrProfReader.h"
69#include "llvm/ProfileData/SampleProf.h"
70#include "llvm/Support/ARMBuildAttributes.h"
71#include "llvm/Support/CRC.h"
72#include "llvm/Support/CodeGen.h"
73#include "llvm/Support/CommandLine.h"
74#include "llvm/Support/ConvertUTF.h"
75#include "llvm/Support/ErrorHandling.h"
76#include "llvm/Support/TimeProfiler.h"
77#include "llvm/Support/VirtualFileSystem.h"
78#include "llvm/TargetParser/AArch64TargetParser.h"
79#include "llvm/TargetParser/RISCVISAInfo.h"
80#include "llvm/TargetParser/Triple.h"
81#include "llvm/TargetParser/X86TargetParser.h"
82#include "llvm/Transforms/Instrumentation/KCFI.h"
83#include "llvm/Transforms/Utils/BuildLibCalls.h"
84#include "llvm/Transforms/Utils/KCFIHash.h"
85#include "llvm/Transforms/Utils/ModuleUtils.h"
93 "limited-coverage-experimental", llvm::cl::Hidden,
94 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
101 case TargetCXXABI::AppleARM64:
102 case TargetCXXABI::Fuchsia:
103 case TargetCXXABI::GenericAArch64:
104 case TargetCXXABI::GenericARM:
105 case TargetCXXABI::iOS:
106 case TargetCXXABI::WatchOS:
107 case TargetCXXABI::GenericMIPS:
108 case TargetCXXABI::GenericItanium:
109 case TargetCXXABI::WebAssembly:
110 case TargetCXXABI::XL:
112 case TargetCXXABI::Microsoft:
116 llvm_unreachable(
"invalid C++ ABI kind");
119static std::unique_ptr<TargetCodeGenInfo>
122 const llvm::Triple &Triple =
Target.getTriple();
125 switch (Triple.getArch()) {
129 case llvm::Triple::m68k:
131 case llvm::Triple::mips:
132 case llvm::Triple::mipsel:
133 if (Triple.getOS() == llvm::Triple::Win32)
137 case llvm::Triple::mips64:
138 case llvm::Triple::mips64el:
141 case llvm::Triple::avr: {
145 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
146 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
150 case llvm::Triple::aarch64:
151 case llvm::Triple::aarch64_32:
152 case llvm::Triple::aarch64_be: {
154 if (
Target.getABI() ==
"darwinpcs")
155 Kind = AArch64ABIKind::DarwinPCS;
156 else if (Triple.isOSWindows())
158 else if (
Target.getABI() ==
"aapcs-soft")
159 Kind = AArch64ABIKind::AAPCSSoft;
164 case llvm::Triple::wasm32:
165 case llvm::Triple::wasm64: {
167 if (
Target.getABI() ==
"experimental-mv")
168 Kind = WebAssemblyABIKind::ExperimentalMV;
172 case llvm::Triple::arm:
173 case llvm::Triple::armeb:
174 case llvm::Triple::thumb:
175 case llvm::Triple::thumbeb: {
176 if (Triple.getOS() == llvm::Triple::Win32)
180 StringRef ABIStr =
Target.getABI();
181 if (ABIStr ==
"apcs-gnu")
182 Kind = ARMABIKind::APCS;
183 else if (ABIStr ==
"aapcs16")
184 Kind = ARMABIKind::AAPCS16_VFP;
185 else if (CodeGenOpts.
FloatABI ==
"hard" ||
186 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
187 Kind = ARMABIKind::AAPCS_VFP;
192 case llvm::Triple::ppc: {
193 if (Triple.isOSAIX())
200 case llvm::Triple::ppcle: {
205 case llvm::Triple::ppc64:
206 if (Triple.isOSAIX())
209 if (Triple.isOSBinFormatELF()) {
211 if (
Target.getABI() ==
"elfv2")
212 Kind = PPC64_SVR4_ABIKind::ELFv2;
213 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
218 case llvm::Triple::ppc64le: {
219 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
221 if (
Target.getABI() ==
"elfv1")
222 Kind = PPC64_SVR4_ABIKind::ELFv1;
223 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
228 case llvm::Triple::nvptx:
229 case llvm::Triple::nvptx64:
232 case llvm::Triple::msp430:
235 case llvm::Triple::riscv32:
236 case llvm::Triple::riscv64:
237 case llvm::Triple::riscv32be:
238 case llvm::Triple::riscv64be: {
239 StringRef ABIStr =
Target.getABI();
241 unsigned ABIFLen = 0;
242 if (ABIStr.ends_with(
"f"))
244 else if (ABIStr.ends_with(
"d"))
246 bool EABI = ABIStr.ends_with(
"e");
250 case llvm::Triple::systemz: {
251 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
252 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
253 if (Triple.getOS() == llvm::Triple::ZOS)
258 case llvm::Triple::tce:
259 case llvm::Triple::tcele:
260 case llvm::Triple::tcele64:
263 case llvm::Triple::x86: {
264 bool IsDarwinVectorABI = Triple.isOSDarwin();
265 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
267 if (Triple.getOS() == llvm::Triple::Win32) {
269 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
270 CodeGenOpts.NumRegisterParameters);
273 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
274 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
277 case llvm::Triple::x86_64: {
278 StringRef ABI =
Target.getABI();
279 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
280 : ABI ==
"avx" ? X86AVXABILevel::AVX
281 : X86AVXABILevel::None);
283 switch (Triple.getOS()) {
284 case llvm::Triple::UEFI:
285 case llvm::Triple::Win32:
291 case llvm::Triple::hexagon:
293 case llvm::Triple::lanai:
295 case llvm::Triple::r600:
297 case llvm::Triple::amdgpu:
299 case llvm::Triple::sparc:
301 case llvm::Triple::sparcv9:
303 case llvm::Triple::xcore:
305 case llvm::Triple::arc:
307 case llvm::Triple::spir:
308 case llvm::Triple::spir64:
310 case llvm::Triple::spirv32:
311 case llvm::Triple::spirv64:
312 case llvm::Triple::spirv:
314 case llvm::Triple::dxil:
316 case llvm::Triple::ve:
318 case llvm::Triple::csky: {
319 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
321 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
326 case llvm::Triple::bpfeb:
327 case llvm::Triple::bpfel:
329 case llvm::Triple::loongarch32:
330 case llvm::Triple::loongarch64: {
331 StringRef ABIStr =
Target.getABI();
332 unsigned ABIFRLen = 0;
333 if (ABIStr.ends_with(
"f"))
335 else if (ABIStr.ends_with(
"d"))
344 if (!TheTargetCodeGenInfo)
346 return *TheTargetCodeGenInfo;
350 if (!CodeGenOpts.ExperimentalABILowering)
357 if (
T.getArch() == llvm::Triple::aarch64 ||
358 T.getArch() == llvm::Triple::aarch64_32 ||
359 T.getArch() == llvm::Triple::aarch64_be)
362 if (
T.getArch() == llvm::Triple::x86_64 && !
T.isOSWindows() && !
T.isUEFI() &&
363 !
T.isOSDarwin() && !
T.isOSCygMing()) {
365 case llvm::CallingConv::Win64:
366 case llvm::CallingConv::X86_RegCall:
367 case llvm::CallingConv::X86_FastCall:
368 case llvm::CallingConv::X86_VectorCall:
369 case llvm::CallingConv::X86_StdCall:
370 case llvm::CallingConv::X86_ThisCall:
374 case llvm::CallingConv::Intel_OCL_BI:
375 case llvm::CallingConv::PreserveMost:
376 case llvm::CallingConv::PreserveAll:
377 case llvm::CallingConv::PreserveNone:
388 CompatInfo.IsMatrixHA = Compat > LangOptions::ClangABI::Ver23;
392 const llvm::Triple &
T,
395 CompatInfo.ClassifyIntegerMMXAsSSE = Compat > LangOptions::ClangABI::Ver3_8 &&
396 !
T.isOSDarwin() && !
T.isPS() &&
398 CompatInfo.HonorsRevision98 = !
T.isOSDarwin();
399 CompatInfo.PassInt128VectorsInMem =
400 Compat > LangOptions::ClangABI::Ver9 && (
T.isOSLinux() ||
T.isOSNetBSD());
402 CompatInfo.ReturnCXXRecordGreaterThan128InMem =
403 Compat > LangOptions::ClangABI::Ver20 && !
T.isPS();
404 CompatInfo.Clang11Compat = Compat <= LangOptions::ClangABI::Ver11 ||
T.isPS();
405 CompatInfo.ClassifyUnnamedBitFields =
406 Compat > LangOptions::ClangABI::Ver23 && !
T.isPS();
409const llvm::abi::TargetInfo &
411 if (TheLLVMABITargetInfo)
412 return *TheLLVMABITargetInfo;
416 switch (
T.getArch()) {
418 llvm_unreachable(
"LLVMABI lowering requested for an unsupported target");
420 case llvm::Triple::aarch64:
421 case llvm::Triple::aarch64_32:
422 case llvm::Triple::aarch64_be: {
423 llvm::abi::AArch64ABIOptions Opts;
425 if (ABI ==
"darwinpcs")
426 Opts.Kind = llvm::abi::AArch64ABIKind::DarwinPCS;
427 else if (
T.isOSWindows())
428 Opts.Kind = llvm::abi::AArch64ABIKind::Win64;
429 else if (ABI ==
"aapcs-soft")
430 Opts.Kind = llvm::abi::AArch64ABIKind::AAPCSSoft;
432 Opts.Kind = llvm::abi::AArch64ABIKind::AAPCS;
434 Opts.IsILP32 =
T.getArch() == llvm::Triple::aarch64_32;
441 TheLLVMABITargetInfo = llvm::abi::createAArch64TargetInfo(TB, Opts);
442 return *TheLLVMABITargetInfo;
445 case llvm::Triple::bpfeb:
446 case llvm::Triple::bpfel:
448 TheLLVMABITargetInfo = llvm::abi::createBPFTargetInfo(TB);
449 return *TheLLVMABITargetInfo;
451 case llvm::Triple::x86_64: {
453 llvm::abi::X86AVXABILevel AVXLevel =
454 ABI ==
"avx512" ? llvm::abi::X86AVXABILevel::AVX512
455 : ABI ==
"avx" ? llvm::abi::X86AVXABILevel::AVX
456 : llvm::abi::X86AVXABILevel::None;
458 llvm::abi::X86ABICompatInfo CompatInfo;
464 TheLLVMABITargetInfo = llvm::abi::createX86_64TargetInfo(
465 TB, AVXLevel, Has64BitPointers, CompatInfo);
466 return *TheLLVMABITargetInfo;
472 llvm::LLVMContext &Context,
476 if (Opts.AlignDouble || Opts.OpenCL)
479 llvm::Triple Triple =
Target.getTriple();
480 llvm::DataLayout DL(
Target.getDataLayoutString());
481 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
482 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
483 llvm::Align ClangAlign(Alignment / 8);
484 if (DLAlign != ClangAlign) {
485 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
486 <<
" mapping to " << *Ty <<
" has data layout alignment "
487 << DLAlign.value() <<
" while clang specifies "
488 << ClangAlign.value() <<
"\n";
493 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
495 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
497 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
499 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
502 if (Triple.getArch() != llvm::Triple::m68k)
503 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
506 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
507 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
508 Triple.getArch() != llvm::Triple::ve)
509 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
511 if (
Target.hasFloat16Type())
512 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
514 if (
Target.hasBFloat16Type())
515 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
516 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
518 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
521 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
523 if (
Target.hasFloat128Type())
524 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
525 if (
Target.hasIbm128Type())
526 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
528 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
530 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
531 llvm::errs() <<
"Datalayout for target " << Triple.str()
532 <<
" sets element-aligned vectors to '"
533 <<
Target.vectorsAreElementAligned()
534 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
548 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
549 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
551 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
555 AbiMapper = std::make_unique<QualTypeMapper>(
C, M.getDataLayout(), AbiAlloc);
556 AbiReverseMapper = std::make_unique<llvm::abi::IRTypeMapper>(
557 M.getContext(), M.getDataLayout());
561 llvm::LLVMContext &LLVMContext = M.getContext();
562 VoidTy = llvm::Type::getVoidTy(LLVMContext);
563 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
564 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
565 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
566 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
567 HalfTy = llvm::Type::getHalfTy(LLVMContext);
568 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
569 FloatTy = llvm::Type::getFloatTy(LLVMContext);
570 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
576 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
578 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
580 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
581 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
582 IntPtrTy = llvm::IntegerType::get(LLVMContext,
583 C.getTargetInfo().getMaxPointerWidth());
584 Int8PtrTy = llvm::PointerType::get(LLVMContext,
586 const llvm::DataLayout &DL = M.getDataLayout();
588 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
590 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
592 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
608 createOpenCLRuntime();
610 createOpenMPRuntime();
617 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
618 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
624 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
625 CodeGenOpts.CoverageNotesFile.size() ||
626 CodeGenOpts.CoverageDataFile.size())
634 Block.GlobalUniqueCount = 0;
636 if (
C.getLangOpts().ObjC)
639 if (CodeGenOpts.hasProfileClangUse()) {
640 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
641 CodeGenOpts.ProfileInstrumentUsePath, *FS,
642 CodeGenOpts.ProfileRemappingFile);
643 if (
auto E = ReaderOrErr.takeError()) {
644 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
645 Diags.Report(diag::err_reading_profile)
646 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
650 PGOReader = std::move(ReaderOrErr.get());
655 if (CodeGenOpts.CoverageMapping)
659 if (CodeGenOpts.UniqueInternalLinkageNames &&
660 !
getModule().getSourceFileName().empty()) {
664 Context.getTargetInfo());
665 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
669 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
670 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
671 CodeGenOpts.NumRegisterParameters);
680 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
681 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
683 this->MSHotPatchFunctions.push_back(std::string{*I});
685 auto &DE = Context.getDiagnostics();
686 DE.Report(diag::err_open_hotpatch_file_failed)
688 << BufOrErr.getError().message();
693 this->MSHotPatchFunctions.push_back(FuncName);
695 llvm::sort(this->MSHotPatchFunctions);
698 if (!Context.getAuxTargetInfo())
704void CodeGenModule::createObjCRuntime() {
721 llvm_unreachable(
"bad runtime kind");
724void CodeGenModule::createOpenCLRuntime() {
728void CodeGenModule::createOpenMPRuntime() {
729 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
730 Diags.Report(diag::err_omp_host_ir_file_not_found)
731 << LangOpts.OMPHostIRFile;
736 case llvm::Triple::nvptx:
737 case llvm::Triple::nvptx64:
738 case llvm::Triple::amdgpu:
739 case llvm::Triple::spirv64:
742 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
743 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
746 if (LangOpts.OpenMPSimd)
747 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
749 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
754void CodeGenModule::createCUDARuntime() {
758void CodeGenModule::createHLSLRuntime() {
759 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
763 Replacements[Name] =
C;
766void CodeGenModule::applyReplacements() {
767 for (
auto &I : Replacements) {
768 StringRef MangledName = I.first;
769 llvm::Constant *Replacement = I.second;
774 auto *NewF = dyn_cast<llvm::Function>(Replacement);
776 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
777 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
780 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
781 CE->getOpcode() == llvm::Instruction::GetElementPtr);
782 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
787 OldF->replaceAllUsesWith(Replacement);
789 NewF->removeFromParent();
790 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
793 OldF->eraseFromParent();
798 GlobalValReplacements.push_back(std::make_pair(GV,
C));
801void CodeGenModule::applyGlobalValReplacements() {
802 for (
auto &I : GlobalValReplacements) {
803 llvm::GlobalValue *GV = I.first;
804 llvm::Constant *
C = I.second;
806 GV->replaceAllUsesWith(
C);
807 GV->eraseFromParent();
814 const llvm::Constant *
C;
815 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
816 C = GA->getAliasee();
817 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
818 C = GI->getResolver();
822 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
826 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
835 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
836 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
840 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
844 if (GV->hasCommonLinkage()) {
845 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
846 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
847 Diags.
Report(Location, diag::err_alias_to_common);
852 if (GV->isDeclaration()) {
853 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
854 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
855 << IsIFunc << IsIFunc;
858 for (
const auto &[
Decl, Name] : MangledDeclNames) {
859 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
861 if (II && II->
getName() == GV->getName()) {
862 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
866 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
876 const auto *F = dyn_cast<llvm::Function>(GV);
878 Diags.
Report(Location, diag::err_alias_to_undefined)
879 << IsIFunc << IsIFunc;
883 llvm::FunctionType *FTy = F->getFunctionType();
884 if (!FTy->getReturnType()->isPointerTy()) {
885 Diags.
Report(Location, diag::err_ifunc_resolver_return);
899 if (GVar->hasAttribute(
"toc-data")) {
900 auto GVId = GVar->getName();
903 Diags.
Report(Location, diag::warn_toc_unsupported_type)
904 << GVId <<
"the variable has an alias";
906 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
907 llvm::AttributeSet NewAttributes =
908 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
909 GVar->setAttributes(NewAttributes);
913void CodeGenModule::checkAliases() {
918 DiagnosticsEngine &Diags =
getDiags();
919 for (
const GlobalDecl &GD : Aliases) {
921 SourceLocation Location;
923 bool IsIFunc = D->hasAttr<IFuncAttr>();
924 if (
const Attr *A = D->getDefiningAttr()) {
925 Location = A->getLocation();
926 Range = A->getRange();
928 llvm_unreachable(
"Not an alias or ifunc?");
932 const llvm::GlobalValue *GV =
nullptr;
934 MangledDeclNames, Range)) {
940 GlobalDecl AliaseeGD;
943 Diags.Report(Location, diag::err_alias_to_undefined)
944 << IsIFunc << IsIFunc;
953 if (AliasIsFuncDecl != AliaseeIsFunc) {
954 Diags.Report(Location, diag::err_alias_between_function_and_variable)
957 diag::note_aliasee_declaration);
964 if (AliasIsFuncDecl && AliaseeIsFunc) {
965 QualType AliasTy = D->getType();
967 auto shouldReportTypeMismatch = [&]() {
968 const auto *AliasFTy =
970 const auto *AliaseeFTy =
972 assert(AliasFTy && AliaseeFTy);
973 if (!Context.typesAreCompatible(AliasFTy->getReturnType(),
976 const auto *AliasFPTy = dyn_cast<FunctionProtoType>(AliasFTy);
977 const auto *AliaseeFPTy = dyn_cast<FunctionProtoType>(AliaseeFTy);
979 if ((AliasFPTy && AliasFPTy->isVariadic() && !AliaseeFPTy) ||
980 (AliaseeFPTy && AliaseeFPTy->isVariadic() && !AliasFPTy))
983 if (!AliasFPTy || !AliaseeFPTy)
987 if (AliasFPTy->getNumParams() != AliaseeFPTy->getNumParams() ||
988 AliasFPTy->isVariadic() != AliaseeFPTy->isVariadic())
990 for (
unsigned i = 0; i < AliasFPTy->getNumParams(); ++i)
991 if (!Context.typesAreCompatible(AliasFPTy->getParamType(i),
992 AliaseeFPTy->getParamType(i)))
996 if (shouldReportTypeMismatch()) {
997 Diags.Report(Location, diag::warn_alias_type_mismatch)
998 << AliasTy << AliaseeTy;
1000 diag::note_aliasee_declaration);
1006 if (
const llvm::GlobalVariable *GVar =
1007 dyn_cast<const llvm::GlobalVariable>(GV))
1011 llvm::Constant *Aliasee =
1015 llvm::GlobalValue *AliaseeGV;
1016 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
1021 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
1022 StringRef AliasSection = SA->getName();
1023 if (AliasSection != AliaseeGV->getSection())
1024 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
1025 << AliasSection << IsIFunc << IsIFunc;
1033 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
1034 if (GA->isInterposable()) {
1035 Diags.Report(Location, diag::warn_alias_to_weak_alias)
1036 << GV->getName() << GA->getName() << IsIFunc;
1037 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1038 GA->getAliasee(), Alias->getType());
1050 llvm::Attribute::DisableSanitizerInstrumentation);
1055 for (
const GlobalDecl &GD : Aliases) {
1058 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
1059 Alias->eraseFromParent();
1064 DeferredDeclsToEmit.clear();
1065 EmittedDeferredDecls.clear();
1066 DeferredAnnotations.clear();
1068 OpenMPRuntime->clear();
1072 StringRef MainFile) {
1075 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
1076 if (MainFile.empty())
1077 MainFile =
"<stdin>";
1078 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
1081 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
1084 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
1088static std::optional<llvm::GlobalValue::VisibilityTypes>
1093 return std::nullopt;
1095 return llvm::GlobalValue::DefaultVisibility;
1097 return llvm::GlobalValue::HiddenVisibility;
1099 return llvm::GlobalValue::ProtectedVisibility;
1101 llvm_unreachable(
"unknown option value!");
1106 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
1115 GV.setDSOLocal(
false);
1116 GV.setVisibility(*
V);
1121 if (!LO.VisibilityFromDLLStorageClass)
1124 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
1127 std::optional<llvm::GlobalValue::VisibilityTypes>
1128 NoDLLStorageClassVisibility =
1131 std::optional<llvm::GlobalValue::VisibilityTypes>
1132 ExternDeclDLLImportVisibility =
1135 std::optional<llvm::GlobalValue::VisibilityTypes>
1136 ExternDeclNoDLLStorageClassVisibility =
1139 for (llvm::GlobalValue &GV : M.global_values()) {
1140 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
1143 if (GV.isDeclarationForLinker())
1145 llvm::GlobalValue::DLLImportStorageClass
1146 ? ExternDeclDLLImportVisibility
1147 : ExternDeclNoDLLStorageClassVisibility);
1150 llvm::GlobalValue::DLLExportStorageClass
1151 ? DLLExportVisibility
1152 : NoDLLStorageClassVisibility);
1154 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
1159 const llvm::Triple &Triple,
1163 return LangOpts.getStackProtector() == Mode;
1166std::optional<llvm::Attribute::AttrKind>
1168 if (D && D->
hasAttr<NoStackProtectorAttr>())
1170 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
1172 return llvm::Attribute::StackProtectStrong;
1174 return llvm::Attribute::StackProtect;
1176 return llvm::Attribute::StackProtectStrong;
1178 return llvm::Attribute::StackProtectReq;
1179 return std::nullopt;
1185 EmitModuleInitializers(Primary);
1187 DeferredDecls.insert_range(EmittedDeferredDecls);
1188 EmittedDeferredDecls.clear();
1189 EmitVTablesOpportunistically();
1190 applyGlobalValReplacements();
1191 applyReplacements();
1192 emitMultiVersionFunctions();
1193 emitPFPFieldsWithEvaluatedOffset();
1196 if (Context.getLangOpts().IncrementalExtensions &&
1197 GlobalTopLevelStmtBlockInFlight.first) {
1199 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1200 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1206 EmitCXXModuleInitFunc(Primary);
1208 EmitCXXGlobalInitFunc();
1209 EmitCXXGlobalCleanUpFunc();
1210 registerGlobalDtorsWithAtExit();
1211 EmitCXXThreadLocalInitFunc();
1213 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1215 if (Context.getLangOpts().CUDA && CUDARuntime) {
1216 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1219 if (LangOpts.SYCLIsHost && !CodeGenOpts.OffloadBinaryToEmbedFile.empty()) {
1220 if (llvm::Function *SYCLCtorFunction = embedSYCLDeviceBinary())
1225 if (OpenMPRuntime) {
1226 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1227 OpenMPRuntime->clear();
1231 PGOReader->getSummary(
false).getMD(VMContext),
1232 llvm::ProfileSummary::PSK_Instr);
1233 if (PGOStats.hasDiagnostics())
1239 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1240 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1242 EmitStaticExternCAliases();
1247 if (CoverageMapping)
1248 CoverageMapping->emit();
1249 if (CodeGenOpts.SanitizeCfiCrossDso) {
1253 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1255 emitAtAvailableLinkGuard();
1256 if (Context.getTargetInfo().getTriple().isWasm())
1263 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1264 llvm::CodeObjectVersionKind::COV_None) {
1265 getModule().addModuleFlag(llvm::Module::Error,
1266 "amdhsa_code_object_version",
1267 getTarget().getTargetOpts().CodeObjectVersion);
1272 auto *MDStr = llvm::MDString::get(
1277 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1287 llvm::Module::Error,
"amdgpu.xnack",
1288 llvm::ConstantInt::get(
1296 llvm::Module::Error,
"amdgpu.sramecc",
1297 llvm::ConstantInt::get(
1307 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1309 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1311 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1315 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1319 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1321 auto *GV =
new llvm::GlobalVariable(
1322 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1323 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1330 if (LangOpts.HIP && !LangOpts.IncrementalExtensions) {
1333 auto *GV =
new llvm::GlobalVariable(
1335 llvm::Constant::getNullValue(
Int8Ty),
1344 if (CodeGenOpts.Autolink &&
1345 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1346 EmitModuleLinkOptions();
1361 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1362 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1363 for (
auto *MD : ELFDependentLibraries)
1364 NMD->addOperand(MD);
1367 if (CodeGenOpts.DwarfVersion) {
1368 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1369 CodeGenOpts.DwarfVersion);
1372 if (CodeGenOpts.Dwarf64)
1373 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1375 if (Context.getLangOpts().SemanticInterposition)
1377 getModule().setSemanticInterposition(
true);
1379 if (CodeGenOpts.EmitCodeView) {
1381 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1383 if (CodeGenOpts.CodeViewGHash) {
1384 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1386 if (CodeGenOpts.ControlFlowGuard) {
1389 llvm::Module::Warning,
"cfguard",
1390 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1391 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1394 llvm::Module::Warning,
"cfguard",
1395 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1397 if (CodeGenOpts.getWinControlFlowGuardMechanism() !=
1398 llvm::ControlFlowGuardMechanism::Automatic) {
1401 llvm::Module::Warning,
"cfguard-mechanism",
1402 static_cast<unsigned>(CodeGenOpts.getWinControlFlowGuardMechanism()));
1404 if (CodeGenOpts.EHContGuard) {
1406 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1408 if (Context.getLangOpts().Kernel) {
1410 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1412 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1417 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1419 llvm::Metadata *Ops[2] = {
1420 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1421 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1422 llvm::Type::getInt32Ty(VMContext), 1))};
1424 getModule().addModuleFlag(llvm::Module::Require,
1425 "StrictVTablePointersRequirement",
1426 llvm::MDNode::get(VMContext, Ops));
1432 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1433 llvm::DEBUG_METADATA_VERSION);
1438 uint64_t WCharWidth =
1439 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1440 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1441 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size",
1442 static_cast<uint32_t
>(WCharWidth));
1446 llvm::FloatABI::ABIType FloatABI =
1447 llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.FloatABI)
1448 .Cases({
"soft",
"softfp"}, llvm::FloatABI::Soft)
1449 .Case(
"hard", llvm::FloatABI::Hard)
1450 .Default(llvm::FloatABI::Default);
1451 if (FloatABI != llvm::FloatABI::Default &&
1452 FloatABI !=
getTriple().getDefaultFloatABI()) {
1454 llvm::Module::Error,
"float-abi",
1456 llvm::FloatABI::getABITypeName(FloatABI)));
1461 llvm::ThreadModel ThreadModel =
1463 ? llvm::ThreadModel::Single
1464 : llvm::ThreadModel::POSIX;
1465 if (ThreadModel !=
getTriple().getDefaultThreadModel())
1466 getModule().setThreadModel(ThreadModel);
1468 if (
getTypes().isLongDoubleReferenced()) {
1471 std::optional<llvm::LongDoubleFormat> Format;
1472 if (flt == &llvm::APFloat::IEEEquad())
1473 Format = llvm::LongDoubleFormat::IEEEquad;
1474 else if (flt == &llvm::APFloat::IEEEdouble())
1475 Format = llvm::LongDoubleFormat::IEEEdouble;
1476 else if (flt == &llvm::APFloat::PPCDoubleDouble())
1477 Format = llvm::LongDoubleFormat::PPCDoubleDouble;
1478 else if (flt == &llvm::APFloat::x87DoubleExtended())
1479 Format = llvm::LongDoubleFormat::X87DoubleExtended;
1480 else if (flt == &llvm::APFloat::IEEEsingle())
1481 Format = llvm::LongDoubleFormat::IEEEsingle;
1484 getModule().setLongDoubleFormat(*Format);
1491 llvm::ExceptionHandling ExceptionModel =
1493 if (ExceptionModel != llvm::ExceptionHandling::Default) {
1495 llvm::Module::Error,
"exception-model",
1497 llvm::getExceptionModelName(ExceptionModel)));
1501 getModule().addModuleFlag(llvm::Module::Warning,
1502 "zos_product_major_version",
1504 getModule().addModuleFlag(llvm::Module::Warning,
1505 "zos_product_minor_version",
1507 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1508 uint32_t(CLANG_VERSION_PATCHLEVEL));
1510 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1511 llvm::MDString::get(VMContext, ProductId));
1516 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1517 llvm::MDString::get(VMContext, lang_str));
1519 time_t TT = PreprocessorOpts.SourceDateEpoch
1520 ? *PreprocessorOpts.SourceDateEpoch
1521 : std::time(
nullptr);
1522 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1523 static_cast<uint64_t
>(TT));
1526 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1527 llvm::MDString::get(VMContext,
"ascii"));
1530 llvm::Triple
T = Context.getTargetInfo().getTriple();
1535 if (StringRef ABIStr = Target.getABI();
1536 !ABIStr.empty() && (
T.isARM() ||
T.isThumb() ||
T.isRISCV() ||
1537 T.isPPC() ||
T.isLoongArch() ||
T.isWasm())) {
1538 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1539 llvm::MDString::get(VMContext, ABIStr));
1542 if (
T.isARM() ||
T.isThumb()) {
1544 uint32_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1545 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1549 llvm::LLVMContext &Ctx = TheModule.getContext();
1554 const std::vector<std::string> &Features =
1557 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1558 if (!errorToBool(ParseResult.takeError()))
1560 llvm::Module::AppendUnique,
"riscv-isa",
1562 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1565 if (CodeGenOpts.SanitizeCfiCrossDso) {
1567 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1570 if (CodeGenOpts.WholeProgramVTables) {
1574 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1575 CodeGenOpts.VirtualFunctionElimination);
1578 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1579 getModule().addModuleFlag(llvm::Module::Override,
1580 "CFI Canonical Jump Tables",
1581 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1584 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1585 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1589 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1591 llvm::Module::Append,
"Unique Source File Identifier",
1593 TheModule.getContext(),
1594 llvm::MDString::get(TheModule.getContext(),
1595 CodeGenOpts.UniqueSourceFileIdentifier)));
1598 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1599 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1602 if (CodeGenOpts.PatchableFunctionEntryOffset)
1603 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1604 CodeGenOpts.PatchableFunctionEntryOffset);
1605 if (CodeGenOpts.SanitizeKcfiArity)
1606 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1609 llvm::Module::Override,
"kcfi-hash",
1610 llvm::MDString::get(
1612 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1615 if (CodeGenOpts.CFProtectionReturn &&
1616 Target.checkCFProtectionReturnSupported(
getDiags())) {
1618 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1622 if (CodeGenOpts.CFProtectionBranch &&
1623 Target.checkCFProtectionBranchSupported(
getDiags())) {
1625 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1628 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1629 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1631 Scheme = Target.getDefaultCFBranchLabelScheme();
1633 llvm::Module::Error,
"cf-branch-label-scheme",
1639 if (CodeGenOpts.FunctionReturnThunks)
1640 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1642 if (CodeGenOpts.IndirectBranchCSPrefix)
1643 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1645 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1653 if (LangOpts.BranchTargetEnforcement)
1654 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1656 if (LangOpts.BranchProtectionPAuthLR)
1657 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1659 if (LangOpts.GuardedControlStack)
1660 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1661 if (LangOpts.hasSignReturnAddress())
1662 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1663 if (LangOpts.isSignReturnAddressScopeAll())
1664 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1666 if (!LangOpts.isSignReturnAddressWithAKey())
1667 getModule().addModuleFlag(llvm::Module::Min,
1668 "sign-return-address-with-bkey", 2);
1670 if (
T.isAArch64()) {
1682 if (LangOpts.PointerAuthReturns)
1683 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-returns", 1);
1684 if (LangOpts.PointerAuthAuthTraps)
1685 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-auth-traps", 1);
1686 if (LangOpts.PointerAuthIndirectGotos)
1687 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-indirect-gotos", 1);
1688 if (LangOpts.AArch64JumpTableHardening)
1689 getModule().addModuleFlag(llvm::Module::Max,
1690 "aarch64-jump-table-hardening", 1);
1698 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-elf-got",
1699 LangOpts.PointerAuthELFGOT);
1701 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-init-fini",
1702 LangOpts.PointerAuthCalls &&
1703 LangOpts.PointerAuthInitFini);
1705 llvm::Module::Error,
"ptrauth-init-fini-address-discrimination",
1706 LangOpts.PointerAuthCalls && LangOpts.PointerAuthInitFini &&
1707 LangOpts.PointerAuthInitFiniAddressDiscrimination);
1711 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-sign-personality",
1712 LangOpts.PointerAuthCalls);
1715 using namespace llvm::ELF;
1716 assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST < 32);
1717 uint32_t PAuthABIVersion =
1718 (LangOpts.PointerAuthIntrinsics
1719 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1720 (LangOpts.PointerAuthCalls
1721 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1722 (LangOpts.PointerAuthReturns
1723 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1724 (LangOpts.PointerAuthAuthTraps
1725 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1726 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1727 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1728 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1729 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1730 (LangOpts.PointerAuthInitFini
1731 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1732 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1733 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1734 (LangOpts.PointerAuthELFGOT
1735 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1736 (LangOpts.PointerAuthIndirectGotos
1737 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1738 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1739 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1740 (LangOpts.PointerAuthFunctionTypeDiscrimination
1741 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1742 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1743 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1744 "Update when new enum items are defined");
1749 getModule().addModuleFlag(llvm::Module::Error,
1750 "aarch64-elf-pauthabi-platform",
1751 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1753 llvm::Module::Error,
"aarch64-elf-pauthabi-version", PAuthABIVersion);
1756 if ((
T.isARM() ||
T.isThumb()) &&
getTriple().isTargetAEABI() &&
1758 uint32_t TagVal = 0;
1759 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1761 llvm::DenormalMode::getPositiveZero()) {
1762 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1764 llvm::DenormalMode::getIEEE()) {
1765 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1766 DenormalTagBehavior = llvm::Module::Override;
1768 llvm::DenormalMode::getPreserveSign()) {
1769 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1771 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1776 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1777 llvm::ARMBuildAttrs::Allowed);
1780 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1782 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1783 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1787 if (CodeGenOpts.StackClashProtector)
1789 llvm::Module::Override,
"probe-stack",
1790 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1792 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1793 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1794 CodeGenOpts.StackProbeSize);
1796 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1797 llvm::LLVMContext &Ctx = TheModule.getContext();
1799 llvm::Module::Error,
"MemProfProfileFilename",
1800 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1803 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1807 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1808 CodeGenOpts.FP32DenormalMode.Output !=
1809 llvm::DenormalMode::IEEE);
1812 if (LangOpts.EHAsynch)
1813 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1816 if (CodeGenOpts.ImportCallOptimization)
1817 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1827 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
1828 if (UnwindMode == llvm::WinX64EHUnwindMode::Default) {
1829 if (
T.isOSWindows() &&
T.isX86_64() &&
1830 Context.getTargetInfo().hasFeature(
"egpr"))
1831 UnwindMode = llvm::WinX64EHUnwindMode::V3;
1833 UnwindMode = llvm::WinX64EHUnwindMode::V1;
1835 if (UnwindMode != llvm::WinX64EHUnwindMode::V1)
1836 getModule().addModuleFlag(llvm::Module::Warning,
"winx64-eh-unwind",
1837 static_cast<unsigned>(UnwindMode));
1841 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1843 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1847 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1848 EmitOpenCLMetadata();
1855 auto Version = LangOpts.getOpenCLCompatibleVersion();
1856 llvm::Metadata *SPIRVerElts[] = {
1857 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1859 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1860 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1861 llvm::NamedMDNode *SPIRVerMD =
1862 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1863 llvm::LLVMContext &Ctx = TheModule.getContext();
1864 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1872 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1873 assert(PLevel < 3 &&
"Invalid PIC Level");
1874 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1875 if (Context.getLangOpts().PIE)
1876 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1880 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1881 .Case(
"tiny", llvm::CodeModel::Tiny)
1882 .Case(
"small", llvm::CodeModel::Small)
1883 .Case(
"kernel", llvm::CodeModel::Kernel)
1884 .Case(
"medium", llvm::CodeModel::Medium)
1885 .Case(
"large", llvm::CodeModel::Large)
1888 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1891 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1892 Context.getTargetInfo().getTriple().getArch() ==
1893 llvm::Triple::x86_64) {
1899 if (CodeGenOpts.NoPLT)
1902 CodeGenOpts.DirectAccessExternalData !=
1903 getModule().getDirectAccessExternalData()) {
1904 getModule().setDirectAccessExternalData(
1905 CodeGenOpts.DirectAccessExternalData);
1907 if (CodeGenOpts.UnwindTables)
1908 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1910 switch (CodeGenOpts.getFramePointer()) {
1915 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1918 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1921 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1924 getModule().setFramePointer(llvm::FramePointerKind::All);
1928 SimplifyPersonality();
1941 EmitVersionIdentMetadata();
1944 EmitCommandLineMetadata();
1952 getModule().setStackProtectorGuardSymbol(
1955 getModule().setStackProtectorGuardOffset(
1958 getModule().setStackProtectorGuardValueWidth(
1961 if (
getModule().getStackProtectorGuard() !=
"global") {
1962 Diags.Report(diag::err_opt_not_valid_without_opt)
1963 <<
"-mstack-protector-guard-record"
1964 <<
"-mstack-protector-guard=global";
1966 getModule().setStackProtectorGuardRecord(
true);
1971 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1973 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1975 if (
getContext().getTargetInfo().getMaxTLSAlign())
1976 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1977 getContext().getTargetInfo().getMaxTLSAlign());
1995 if (!MustTailCallUndefinedGlobals.empty()) {
1997 for (
auto &I : MustTailCallUndefinedGlobals) {
1998 if (!I.first->isDefined())
1999 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
2003 if (!Entry || Entry->isWeakForLinker() ||
2004 Entry->isDeclarationForLinker())
2005 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
2009 for (
auto &I : MustTailCallUndefinedGlobals) {
2018 if (Entry->isDeclarationForLinker()) {
2021 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
2023 CalleeIsLocal = Entry->isDSOLocal();
2027 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
2040 llvm::MDBuilder MDB(TheModule.getContext());
2041 uint64_t Size = Context.getTypeSizeInChars(Context.IntTy).getQuantity();
2042 llvm::MDNode *StructNode =
2043 CodeGenOpts.NewStructPathTBAA
2044 ? MDB.createTBAATypeNode(TBAA->getChar(), Size,
2045 MDB.createString(
"__libc_errno"),
2046 {{0, Size, IntegerNode}})
2047 : MDB.createTBAAStructTypeNode(
"__libc_errno",
2048 {{IntegerNode, 0}});
2051 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
2052 ErrnoTBAAMD->addOperand(StructTagNode);
2057void CodeGenModule::EmitOpenCLMetadata() {
2062 unsigned CLVersion =
2065 auto EmitVersion = [
this](StringRef MDName,
int Version) {
2066 llvm::Metadata *OCLVerElts[] = {
2067 llvm::ConstantAsMetadata::get(
2068 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
2069 llvm::ConstantAsMetadata::get(
2070 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
2071 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
2072 llvm::LLVMContext &Ctx = TheModule.getContext();
2073 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
2076 EmitVersion(
"opencl.ocl.version", CLVersion);
2077 if (LangOpts.OpenCLCPlusPlus) {
2079 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
2083void CodeGenModule::EmitBackendOptionsMetadata(
2084 const CodeGenOptions &CodeGenOpts) {
2086 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
2087 CodeGenOpts.SmallDataLimit);
2091 if (LangOpts.AllocTokenMode) {
2092 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
2093 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
2094 llvm::MDString::get(VMContext, S));
2096 if (LangOpts.AllocTokenMax)
2098 llvm::Module::Error,
"alloc-token-max",
2099 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
2100 *LangOpts.AllocTokenMax));
2101 if (CodeGenOpts.SanitizeAllocTokenFastABI)
2102 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
2103 if (CodeGenOpts.SanitizeAllocTokenExtended)
2104 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
2120 return TBAA->getTypeInfo(QTy);
2139 return TBAA->getAccessInfo(AccessType);
2146 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
2152 return TBAA->getTBAAStructInfo(QTy);
2158 return TBAA->getBaseTypeInfo(QTy);
2164 return TBAA->getAccessTagInfo(Info);
2171 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
2179 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
2187 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
2193 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
2198 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
2210 std::string Msg =
Type;
2212 diag::err_codegen_unsupported)
2218 diag::err_codegen_unsupported)
2225 std::string Msg =
Type;
2227 diag::err_codegen_unsupported)
2232 llvm::function_ref<
void()> Fn) {
2233 StackHandler.runWithSufficientStackSpace(Loc, Fn);
2243 if (GV->hasLocalLinkage()) {
2244 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2257 if (Context.getLangOpts().OpenMP &&
2258 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
2259 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
2260 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
2261 OMPDeclareTargetDeclAttr::DT_NoHost &&
2263 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2270 if (Context.getLangOpts().CUDAIsDevice &&
2272 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
2273 bool NeedsProtected =
false;
2277 else if (
const auto *VD = dyn_cast<VarDecl>(D))
2278 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
2279 VD->hasAttr<CUDAConstantAttr>() ||
2280 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
2281 VD->getType()->isCUDADeviceBuiltinTextureType();
2282 if (NeedsProtected) {
2283 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2289 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2293 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
2297 if (GV->hasDLLExportStorageClass()) {
2300 diag::err_hidden_visibility_dllexport);
2303 diag::err_non_default_visibility_dllimport);
2309 !GV->isDeclarationForLinker())
2314 llvm::GlobalValue *GV) {
2315 if (GV->hasLocalLinkage())
2318 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
2322 if (GV->hasDLLImportStorageClass())
2325 const llvm::Triple &TT = CGM.
getTriple();
2327 if (TT.isOSCygMing()) {
2345 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
2353 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
2357 if (!TT.isOSBinFormatELF())
2363 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2371 return !(CGM.
getLangOpts().SemanticInterposition ||
2376 if (!GV->isDeclarationForLinker())
2382 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2389 if (CGOpts.DirectAccessExternalData) {
2395 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2396 if (!Var->isThreadLocal())
2421 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2423 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2433 if (D->
hasAttr<DLLImportAttr>())
2434 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2435 else if ((D->
hasAttr<DLLExportAttr>() ||
2437 !GV->isDeclarationForLinker())
2438 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2458 GV->setPartition(CodeGenOpts.SymbolPartition);
2462 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2463 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2464 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2465 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2466 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2469llvm::GlobalVariable::ThreadLocalMode
2471 switch (CodeGenOpts.getDefaultTLSModel()) {
2473 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2475 return llvm::GlobalVariable::LocalDynamicTLSModel;
2477 return llvm::GlobalVariable::InitialExecTLSModel;
2479 return llvm::GlobalVariable::LocalExecTLSModel;
2481 llvm_unreachable(
"Invalid TLS model!");
2485 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2487 llvm::GlobalValue::ThreadLocalMode TLM;
2491 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2495 GV->setThreadLocalMode(TLM);
2501 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2505 const CPUSpecificAttr *
Attr,
2522 !D->
hasAttr<AsmLabelAttr>() &&
2528 bool OmitMultiVersionMangling =
false) {
2530 llvm::raw_svector_ostream Out(Buffer);
2539 assert(II &&
"Attempt to mangle unnamed decl.");
2540 const auto *FD = dyn_cast<FunctionDecl>(ND);
2545 Out <<
"__regcall4__" << II->
getName();
2547 Out <<
"__regcall3__" << II->
getName();
2548 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2550 Out <<
"__device_stub__" << II->
getName();
2552 DeviceKernelAttr::isOpenCLSpelling(
2553 FD->getAttr<DeviceKernelAttr>()) &&
2555 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2571 "Hash computed when not explicitly requested");
2575 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2576 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2577 switch (FD->getMultiVersionKind()) {
2581 FD->getAttr<CPUSpecificAttr>(),
2585 auto *
Attr = FD->getAttr<TargetAttr>();
2586 assert(
Attr &&
"Expected TargetAttr to be present "
2587 "for attribute mangling");
2593 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2594 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2595 "for attribute mangling");
2601 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2602 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2603 "for attribute mangling");
2610 llvm_unreachable(
"None multiversion type isn't valid here");
2620 return std::string(Out.str());
2623void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2624 const FunctionDecl *FD,
2625 StringRef &CurName) {
2632 std::string NonTargetName =
2640 "Other GD should now be a multiversioned function");
2650 if (OtherName != NonTargetName) {
2653 const auto ExistingRecord = Manglings.find(NonTargetName);
2654 if (ExistingRecord != std::end(Manglings))
2655 Manglings.remove(&(*ExistingRecord));
2656 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2661 CurName = OtherNameRef;
2663 Entry->setName(OtherName);
2673 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2687 auto FoundName = MangledDeclNames.find(CanonicalGD);
2688 if (FoundName != MangledDeclNames.end())
2689 return FoundName->second;
2726 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2727 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2736 llvm::raw_svector_ostream Out(Buffer);
2739 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2740 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2742 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2747 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2748 return Result.first->first();
2752 auto it = MangledDeclNames.begin();
2753 while (it != MangledDeclNames.end()) {
2754 if (it->second == Name)
2769 llvm::Constant *AssociatedData) {
2771 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2777 bool IsDtorAttrFunc) {
2778 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2780 DtorsUsingAtExit[Priority].push_back(Dtor);
2785 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2788void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2789 if (Fns.empty())
return;
2792 llvm::PointerType *PtrTy = llvm::PointerType::get(
2793 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2796 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2800 auto Ctors = Builder.beginArray(CtorStructTy);
2801 for (
const auto &I : Fns) {
2802 auto Ctor = Ctors.beginStruct(CtorStructTy);
2803 Ctor.addInt(
Int32Ty, I.Priority);
2804 Ctor.add(I.Initializer);
2805 if (I.AssociatedData)
2806 Ctor.add(I.AssociatedData);
2808 Ctor.addNullPointer(PtrTy);
2809 Ctor.finishAndAddTo(Ctors);
2812 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2814 llvm::GlobalValue::AppendingLinkage);
2818 List->setAlignment(std::nullopt);
2823llvm::GlobalValue::LinkageTypes
2829 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2836 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2837 if (!MDS)
return nullptr;
2839 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2847 if (!UD->
hasAttr<TransparentUnionAttr>())
2849 if (!UD->
fields().empty())
2850 return UD->
fields().begin()->getType();
2859 bool GeneralizePointers) {
2872 bool GeneralizePointers) {
2875 for (
auto &Param : FnType->param_types())
2876 GeneralizedParams.push_back(
2880 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2881 GeneralizedParams, FnType->getExtProtoInfo());
2886 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2888 llvm_unreachable(
"Encountered unknown FunctionType");
2896 FnType->getReturnType(), FnType->getParamTypes(),
2897 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2899 std::string OutName;
2900 llvm::raw_string_ostream Out(OutName);
2908 Out <<
".normalized";
2910 Out <<
".generalized";
2912 return llvm::ConstantInt::get(
2918 llvm::Function *F,
bool IsThunk) {
2920 llvm::AttributeList PAL;
2923 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2927 Loc = D->getLocation();
2929 Error(Loc,
"__vectorcall calling convention is not currently supported");
2931 F->setAttributes(PAL);
2932 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2936 std::string ReadOnlyQual(
"__read_only");
2937 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2938 if (ReadOnlyPos != std::string::npos)
2940 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2942 std::string WriteOnlyQual(
"__write_only");
2943 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2944 if (WriteOnlyPos != std::string::npos)
2945 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2947 std::string ReadWriteQual(
"__read_write");
2948 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2949 if (ReadWritePos != std::string::npos)
2950 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2983 assert(((FD && CGF) || (!FD && !CGF)) &&
2984 "Incorrect use - FD and CGF should either be both null or not!");
3010 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
3013 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
3018 std::string typeQuals;
3022 const Decl *PDecl = parm;
3024 PDecl = TD->getDecl();
3025 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
3026 if (A && A->isWriteOnly())
3027 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
3028 else if (A && A->isReadWrite())
3029 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
3031 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
3033 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
3035 auto getTypeSpelling = [&](
QualType Ty) {
3036 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
3038 if (Ty.isCanonical()) {
3039 StringRef typeNameRef = typeName;
3041 if (typeNameRef.consume_front(
"unsigned "))
3042 return std::string(
"u") + typeNameRef.str();
3043 if (typeNameRef.consume_front(
"signed "))
3044 return typeNameRef.str();
3054 addressQuals.push_back(
3055 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
3059 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
3060 std::string baseTypeName =
3062 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
3063 argBaseTypeNames.push_back(
3064 llvm::MDString::get(VMContext, baseTypeName));
3068 typeQuals =
"restrict";
3071 typeQuals += typeQuals.empty() ?
"const" :
" const";
3073 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
3075 uint32_t AddrSpc = 0;
3080 addressQuals.push_back(
3081 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
3085 std::string typeName = getTypeSpelling(ty);
3097 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
3098 argBaseTypeNames.push_back(
3099 llvm::MDString::get(VMContext, baseTypeName));
3104 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
3108 Fn->setMetadata(
"kernel_arg_addr_space",
3109 llvm::MDNode::get(VMContext, addressQuals));
3110 Fn->setMetadata(
"kernel_arg_access_qual",
3111 llvm::MDNode::get(VMContext, accessQuals));
3112 Fn->setMetadata(
"kernel_arg_type",
3113 llvm::MDNode::get(VMContext, argTypeNames));
3114 Fn->setMetadata(
"kernel_arg_base_type",
3115 llvm::MDNode::get(VMContext, argBaseTypeNames));
3116 Fn->setMetadata(
"kernel_arg_type_qual",
3117 llvm::MDNode::get(VMContext, argTypeQuals));
3121 Fn->setMetadata(
"kernel_arg_name",
3122 llvm::MDNode::get(VMContext, argNames));
3138SmallVector<const CXXRecordDecl *, 0>
3140 llvm::SetVector<const CXXRecordDecl *> MostBases;
3145 MostBases.insert(RD);
3147 CollectMostBases(B.getType()->getAsCXXRecordDecl());
3149 CollectMostBases(RD);
3150 return MostBases.takeVector();
3154 llvm::Function *F) {
3155 llvm::AttrBuilder B(F->getContext());
3157 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
3158 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
3160 if (CodeGenOpts.StackClashProtector)
3161 B.addAttribute(
"probe-stack",
"inline-asm");
3163 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
3164 B.addAttribute(
"stack-probe-size",
3165 std::to_string(CodeGenOpts.StackProbeSize));
3168 B.addAttribute(llvm::Attribute::NoUnwind);
3170 if (std::optional<llvm::Attribute::AttrKind>
Attr =
3172 B.addAttribute(*
Attr);
3177 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
3178 B.addAttribute(llvm::Attribute::AlwaysInline);
3182 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
3184 B.addAttribute(llvm::Attribute::NoInline);
3192 if (D->
hasAttr<ArmLocallyStreamingAttr>())
3193 B.addAttribute(
"aarch64_pstate_sm_body");
3196 if (
Attr->isNewZA())
3197 B.addAttribute(
"aarch64_new_za");
3198 if (
Attr->isNewZT0())
3199 B.addAttribute(
"aarch64_new_zt0");
3204 bool ShouldAddOptNone =
3205 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
3207 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
3208 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
3211 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
3212 !D->
hasAttr<NoInlineAttr>()) {
3213 B.addAttribute(llvm::Attribute::AlwaysInline);
3214 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
3215 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3217 B.addAttribute(llvm::Attribute::OptimizeNone);
3220 B.addAttribute(llvm::Attribute::NoInline);
3225 B.addAttribute(llvm::Attribute::Naked);
3228 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
3229 F->removeFnAttr(llvm::Attribute::MinSize);
3230 }
else if (D->
hasAttr<NakedAttr>()) {
3232 B.addAttribute(llvm::Attribute::Naked);
3233 B.addAttribute(llvm::Attribute::NoInline);
3234 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
3235 B.addAttribute(llvm::Attribute::NoDuplicate);
3236 }
else if (D->
hasAttr<NoInlineAttr>() &&
3237 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3239 B.addAttribute(llvm::Attribute::NoInline);
3240 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
3241 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
3243 B.addAttribute(llvm::Attribute::AlwaysInline);
3247 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
3248 B.addAttribute(llvm::Attribute::NoInline);
3252 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3255 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
3256 return Redecl->isInlineSpecified();
3258 if (any_of(FD->
redecls(), CheckRedeclForInline))
3263 return any_of(Pattern->
redecls(), CheckRedeclForInline);
3265 if (CheckForInline(FD)) {
3266 B.addAttribute(llvm::Attribute::InlineHint);
3267 }
else if (CodeGenOpts.getInlining() ==
3270 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3271 B.addAttribute(llvm::Attribute::NoInline);
3278 if (!D->
hasAttr<OptimizeNoneAttr>()) {
3280 if (!ShouldAddOptNone)
3281 B.addAttribute(llvm::Attribute::OptimizeForSize);
3282 B.addAttribute(llvm::Attribute::Cold);
3285 B.addAttribute(llvm::Attribute::Hot);
3286 if (D->
hasAttr<MinSizeAttr>())
3287 B.addAttribute(llvm::Attribute::MinSize);
3292 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
3293 B.addAttribute(llvm::Attribute::NoOutline);
3297 llvm::MaybeAlign ExplicitAlignment;
3298 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
3299 ExplicitAlignment = llvm::Align(alignment);
3300 else if (LangOpts.FunctionAlignment)
3301 ExplicitAlignment = llvm::Align(1ull << LangOpts.FunctionAlignment);
3303 if (ExplicitAlignment) {
3304 F->setAlignment(ExplicitAlignment);
3305 F->setPreferredAlignment(ExplicitAlignment);
3306 }
else if (LangOpts.PreferredFunctionAlignment) {
3307 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
3316 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
3321 if (CodeGenOpts.SanitizeCfiCrossDso &&
3322 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
3323 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3331 if (CodeGenOpts.CallGraphSection) {
3332 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3339 auto *MD = dyn_cast<CXXMethodDecl>(D);
3342 llvm::Metadata *Id =
3344 MD->getType(), std::nullopt,
Base));
3345 F->addTypeMetadata(0, Id);
3352 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
3353 if (FD->
hasAttr<SYCLExternalAttr>())
3354 addSYCLModuleIdAttr(F);
3358void CodeGenModule::addSYCLModuleIdAttr(llvm::Function *Fn) {
3360 Fn->addFnAttr(
"sycl-module-id",
getModule().getModuleIdentifier());
3368 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FD))
3370 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FD))
3384 Linkage != llvm::GlobalValue::AvailableExternallyLinkage;
3389 if (isa_and_nonnull<NamedDecl>(D))
3392 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3394 if (D && D->
hasAttr<UsedAttr>())
3397 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3399 ((CodeGenOpts.KeepPersistentStorageVariables &&
3400 (VD->getStorageDuration() ==
SD_Static ||
3401 VD->getStorageDuration() ==
SD_Thread)) ||
3402 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3403 VD->getType().isConstQualified())))
3406 if (CodeGenOpts.KeepInlineFunctions)
3407 if (
const auto *FD = dyn_cast_if_present<FunctionDecl>(D))
3413static std::vector<std::string>
3415 llvm::StringMap<bool> &FeatureMap) {
3416 llvm::StringMap<bool> DefaultFeatureMap;
3420 std::vector<std::string> Delta;
3421 for (
const auto &[K,
V] : FeatureMap) {
3422 auto DefaultIt = DefaultFeatureMap.find(K);
3423 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3424 Delta.push_back((
V ?
"+" :
"-") + K.str());
3430bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3431 llvm::AttrBuilder &Attrs,
3432 bool SetTargetFeatures) {
3438 std::vector<std::string> Features;
3439 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3442 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3443 assert((!TD || !TV) &&
"both target_version and target specified");
3446 bool AddedAttr =
false;
3447 if (TD || TV || SD || TC) {
3448 llvm::StringMap<bool> FeatureMap;
3455 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3458 if (!FeatureStr.empty()) {
3459 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3460 if (!ParsedAttr.
CPU.empty() &&
3462 TargetCPU = ParsedAttr.
CPU;
3465 if (!ParsedAttr.
Tune.empty() &&
3467 TuneCPU = ParsedAttr.
Tune;
3483 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3484 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3485 Entry.getKey().str());
3491 llvm::StringMap<bool> FeatureMap;
3510 if (!TargetCPU.empty()) {
3511 Attrs.addAttribute(
"target-cpu", TargetCPU);
3514 if (!TuneCPU.empty()) {
3515 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3518 if (!Features.empty() && SetTargetFeatures) {
3519 llvm::erase_if(Features, [&](
const std::string& F) {
3522 if (!Features.empty()) {
3523 llvm::sort(Features);
3524 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3530 llvm::SmallVector<StringRef, 8> Feats;
3531 bool IsDefault =
false;
3533 IsDefault = TV->isDefaultVersion();
3534 TV->getFeatures(Feats);
3540 Attrs.addAttribute(
"fmv-features");
3542 }
else if (!Feats.empty()) {
3544 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3545 std::string FMVFeatures;
3546 for (StringRef F : OrderedFeats)
3547 FMVFeatures.append(
"," + F.str());
3548 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3555void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3556 llvm::GlobalObject *GO) {
3561 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3564 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3565 GV->addAttribute(
"bss-section", SA->getName());
3566 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3567 GV->addAttribute(
"data-section", SA->getName());
3568 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3569 GV->addAttribute(
"rodata-section", SA->getName());
3570 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3571 GV->addAttribute(
"relro-section", SA->getName());
3574 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3577 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3578 if (!D->
getAttr<SectionAttr>())
3579 F->setSection(SA->getName());
3581 llvm::AttrBuilder Attrs(F->getContext());
3582 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3586 llvm::AttributeMask RemoveAttrs;
3587 RemoveAttrs.addAttribute(
"target-cpu");
3588 RemoveAttrs.addAttribute(
"target-features");
3589 RemoveAttrs.addAttribute(
"fmv-features");
3590 RemoveAttrs.addAttribute(
"tune-cpu");
3591 F->removeFnAttrs(RemoveAttrs);
3592 F->addFnAttrs(Attrs);
3596 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3597 GO->setSection(CSA->getName());
3598 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3599 GO->setSection(SA->getName());
3612 F->setLinkage(llvm::Function::InternalLinkage);
3614 setNonAliasAttributes(GD, F);
3625 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3629 llvm::Function *F) {
3632 if (!F->hasLocalLinkage() ||
3633 F->getFunction().hasAddressTaken(
nullptr,
true,
3637 bool HasBody = FD->
hasBody(Def);
3638 if (!HasBody || !Def)
3655 ParamTypes.push_back(P->getType());
3660 llvm::LLVMContext::MD_callgraph,
3667 llvm::Function *F) {
3669 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3680 F->addTypeMetadata(0, MD);
3687 if (CodeGenOpts.SanitizeCfiCrossDso)
3689 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3693 llvm::CallBase *CB) {
3695 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall())
3699 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
getLLVMContext(), {TypeIdMD});
3700 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3701 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3705 llvm::LLVMContext &Ctx = F->getContext();
3706 llvm::MDBuilder MDB(Ctx);
3707 llvm::StringRef Salt;
3710 if (
const auto &Info = FP->getExtraAttributeInfo())
3711 Salt = Info.CFISalt;
3713 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3722 return llvm::all_of(Name, [](
const char &
C) {
3723 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3729 for (
auto &F : M.functions()) {
3731 bool AddressTaken = F.hasAddressTaken();
3732 if (!AddressTaken && F.hasLocalLinkage())
3733 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3738 if (!AddressTaken || !F.isDeclaration())
3741 const llvm::ConstantInt *
Type;
3742 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3743 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3747 StringRef Name = F.getName();
3751 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3752 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3753 Twine(
Type->getSExtValue()) +
" */\n")
3755 M.appendModuleInlineAsm(
Asm);
3759void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3760 bool IsIncompleteFunction,
3763 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3771 if (!IsIncompleteFunction)
3778 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3780 assert(!F->arg_empty() &&
3781 F->arg_begin()->getType()
3782 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3783 "unexpected this return");
3784 F->addParamAttr(0, llvm::Attribute::Returned);
3794 if (!IsIncompleteFunction && F->isDeclaration())
3797 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3798 F->setSection(CSA->getName());
3799 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3800 F->setSection(SA->getName());
3802 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3804 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3805 else if (EA->isWarning())
3806 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3811 const FunctionDecl *FDBody;
3812 bool HasBody = FD->
hasBody(FDBody);
3814 assert(HasBody &&
"Inline builtin declarations should always have an "
3816 if (shouldEmitFunction(FDBody))
3817 F->addFnAttr(llvm::Attribute::NoBuiltin);
3823 F->addFnAttr(llvm::Attribute::NoBuiltin);
3827 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3828 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3829 if (MD->isVirtual())
3830 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3836 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3837 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3840 if (CodeGenOpts.CallGraphSection)
3843 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3849 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3850 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3852 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3856 llvm::LLVMContext &Ctx = F->getContext();
3857 llvm::MDBuilder MDB(Ctx);
3861 int CalleeIdx = *CB->encoding_begin();
3862 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3863 F->addMetadata(llvm::LLVMContext::MD_callback,
3864 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3865 CalleeIdx, PayloadIndices,
3872 "Only globals with definition can force usage.");
3873 LLVMUsed.emplace_back(GV);
3877 assert(!GV->isDeclaration() &&
3878 "Only globals with definition can force usage.");
3879 LLVMCompilerUsed.emplace_back(GV);
3884 "Only globals with definition can force usage.");
3886 LLVMCompilerUsed.emplace_back(GV);
3888 LLVMUsed.emplace_back(GV);
3892 std::vector<llvm::WeakTrackingVH> &List) {
3902 UsedArray.reserve(List.size());
3903 for (
const llvm::WeakTrackingVH &VH : List) {
3904 if (llvm::Value *
V = VH)
3905 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3909 if (UsedArray.empty())
3911 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3913 auto *GV =
new llvm::GlobalVariable(
3914 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3915 llvm::ConstantArray::get(ATy, UsedArray), Name);
3917 GV->setSection(
"llvm.metadata");
3920void CodeGenModule::emitLLVMUsed() {
3921 emitUsed(*
this,
"llvm.used", LLVMUsed);
3922 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3927 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3936 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3942 ELFDependentLibraries.push_back(
3943 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3950 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3957void CodeGenModule::ProcessPragmaCommentCopyright(StringRef Comment,
3958 bool isFromASTFile) {
3960 "pragma comment copyright is supported only when targeting AIX");
3973 assert(!LoadTimeCommentGlobal &&
3974 "Only one copyright pragma allowed per translation unit.");
3979 uint64_t Hash = xxh3_64bits(Comment);
3980 std::string GlobalName =
3981 (
"__loadtime_comment_str_" + Twine::utohexstr(Hash)).str();
3984 llvm::Constant *StrInit =
3985 llvm::ConstantDataArray::getString(
C, Comment,
true);
3988 auto *GV =
new llvm::GlobalVariable(
getModule(), StrInit->getType(),
3990 llvm::GlobalValue::WeakODRLinkage,
3991 StrInit, GlobalName);
3993 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
3994 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3995 GV->setAlignment(llvm::Align(1));
4001 GV->setSection(
"__loadtime_comment");
4004 GV->setMetadata(
"loadtime_comment", llvm::MDNode::get(
C, {}));
4007 llvm::appendToCompilerUsed(
getModule(), {GV});
4009 LoadTimeCommentGlobal = GV;
4018 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
4024 if (Visited.insert(Import).second)
4041 if (LL.IsFramework) {
4042 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
4043 llvm::MDString::get(Context, LL.Library)};
4045 Metadata.push_back(llvm::MDNode::get(Context, Args));
4051 llvm::Metadata *Args[2] = {
4052 llvm::MDString::get(Context,
"lib"),
4053 llvm::MDString::get(Context, LL.Library),
4055 Metadata.push_back(llvm::MDNode::get(Context, Args));
4059 auto *OptString = llvm::MDString::get(Context, Opt);
4060 Metadata.push_back(llvm::MDNode::get(Context, OptString));
4065void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
4067 "We should only emit module initializers for named modules.");
4075 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
4092 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
4098void CodeGenModule::EmitModuleLinkOptions() {
4102 llvm::SetVector<clang::Module *> LinkModules;
4103 llvm::SmallPtrSet<clang::Module *, 16> Visited;
4104 SmallVector<clang::Module *, 16> Stack;
4107 for (
Module *M : ImportedModules) {
4110 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
4113 if (Visited.insert(M).second)
4119 while (!Stack.empty()) {
4122 bool AnyChildren =
false;
4131 if (Visited.insert(SM).second) {
4132 Stack.push_back(SM);
4140 LinkModules.insert(Mod);
4147 SmallVector<llvm::MDNode *, 16> MetadataArgs;
4149 for (
Module *M : LinkModules)
4150 if (Visited.insert(M).second)
4152 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
4153 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
4156 if (!LinkerOptionsMetadata.empty()) {
4157 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
4158 for (
auto *MD : LinkerOptionsMetadata)
4159 NMD->addOperand(MD);
4163void CodeGenModule::EmitDeferred() {
4172 if (!DeferredVTables.empty()) {
4173 EmitDeferredVTables();
4178 assert(DeferredVTables.empty());
4185 llvm::append_range(DeferredDeclsToEmit,
4189 if (DeferredDeclsToEmit.empty())
4194 std::vector<GlobalDecl> CurDeclsToEmit;
4195 CurDeclsToEmit.swap(DeferredDeclsToEmit);
4197 for (GlobalDecl &D : CurDeclsToEmit) {
4203 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
4207 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
4223 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
4241 if (!GV->isDeclaration())
4245 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
4249 EmitGlobalDefinition(D, GV);
4254 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
4256 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
4261void CodeGenModule::EmitVTablesOpportunistically() {
4267 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
4268 &&
"Only emit opportunistic vtables with optimizations");
4270 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
4272 "This queue should only contain external vtables");
4273 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
4274 VTables.GenerateClassData(RD);
4276 OpportunisticVTables.clear();
4280 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
4285 DeferredAnnotations.clear();
4287 if (Annotations.empty())
4291 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
4292 Annotations[0]->
getType(), Annotations.size()), Annotations);
4293 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
4294 llvm::GlobalValue::AppendingLinkage,
4295 Array,
"llvm.global.annotations");
4300 llvm::Constant *&AStr = AnnotationStrings[Str];
4305 llvm::Constant *s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
4306 auto *gv =
new llvm::GlobalVariable(
4307 getModule(), s->getType(),
true, llvm::GlobalValue::PrivateLinkage, s,
4308 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
4311 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4329 return llvm::ConstantInt::get(
Int32Ty, LineNo);
4337 llvm::FoldingSetNodeID ID;
4338 for (
Expr *E : Exprs) {
4341 llvm::Constant *&Lookup = AnnotationArgs[ID.computeHash()];
4346 LLVMArgs.reserve(Exprs.size());
4348 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
4350 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
4353 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
4354 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
4355 llvm::GlobalValue::PrivateLinkage,
Struct,
4358 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4365 const AnnotateAttr *AA,
4373 llvm::Constant *GVInGlobalsAS = GV;
4374 if (GV->getAddressSpace() !=
4376 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
4378 llvm::PointerType::get(
4379 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
4383 llvm::Constant *Fields[] = {
4384 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
4386 return llvm::ConstantStruct::getAnon(Fields);
4390 llvm::GlobalValue *GV) {
4391 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
4401 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
4404 auto &SM = Context.getSourceManager();
4405 FileEntryRef MainFile = *SM.getFileEntryRefForID(SM.getMainFileID());
4406 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
4411 return NoSanitizeL.containsLocation(Kind, Loc);
4414 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
4418 llvm::GlobalVariable *GV,
4420 StringRef Category)
const {
4422 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
4424 auto &SM = Context.getSourceManager();
4425 if (NoSanitizeL.containsMainFile(
4426 Kind, SM.getFileEntryRefForID(SM.getMainFileID())->getName(),
4429 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
4436 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
4437 Ty = AT->getElementType();
4442 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4450 StringRef Category)
const {
4453 auto Attr = ImbueAttr::NONE;
4455 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4456 if (
Attr == ImbueAttr::NONE)
4457 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4459 case ImbueAttr::NONE:
4461 case ImbueAttr::ALWAYS:
4462 Fn->addFnAttr(
"function-instrument",
"xray-always");
4464 case ImbueAttr::ALWAYS_ARG1:
4465 Fn->addFnAttr(
"function-instrument",
"xray-always");
4466 Fn->addFnAttr(
"xray-log-args",
"1");
4468 case ImbueAttr::NEVER:
4469 Fn->addFnAttr(
"function-instrument",
"xray-never");
4482 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4492 auto &SM = Context.getSourceManager();
4493 if (
auto MainFile = SM.getFileEntryRefForID(SM.getMainFileID()))
4507 if (NumGroups > 1) {
4508 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4517 if (LangOpts.EmitAllDecls)
4520 const auto *VD = dyn_cast<VarDecl>(
Global);
4522 ((CodeGenOpts.KeepPersistentStorageVariables &&
4523 (VD->getStorageDuration() ==
SD_Static ||
4524 VD->getStorageDuration() ==
SD_Thread)) ||
4525 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4526 VD->getType().isConstQualified())))
4529 if (CodeGenOpts.KeepInlineFunctions)
4530 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global))
4545 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4546 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4547 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4548 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4552 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4562 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4569 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4570 if (Context.getInlineVariableDefinitionKind(VD) ==
4575 if (CXX20ModuleInits && VD->getOwningModule() &&
4576 !VD->getOwningModule()->isModuleMapModule()) {
4585 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4588 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4601 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4605 llvm::Constant *
Init;
4608 if (!
V.isAbsent()) {
4619 llvm::Constant *Fields[4] = {
4623 llvm::ConstantDataArray::getRaw(
4624 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4626 Init = llvm::ConstantStruct::getAnon(Fields);
4629 auto *GV =
new llvm::GlobalVariable(
4631 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4633 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4636 if (!
V.isAbsent()) {
4649 llvm::GlobalVariable **Entry =
nullptr;
4650 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4655 llvm::Constant *
Init;
4659 assert(!
V.isAbsent());
4663 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4665 llvm::GlobalValue::PrivateLinkage,
Init,
4667 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4682 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4686 llvm::Constant *
Init =
Emitter.emitForInitializer(
4694 llvm::GlobalValue::LinkageTypes
Linkage =
4696 ? llvm::GlobalValue::LinkOnceODRLinkage
4697 : llvm::GlobalValue::InternalLinkage;
4698 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4702 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4709 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4710 assert(AA &&
"No alias?");
4720 llvm::Constant *Aliasee;
4722 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4730 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4731 WeakRefReferences.insert(F);
4739 if (
auto *A = D->
getAttr<AttrT>())
4740 return A->isImplicit();
4747 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4750 const auto *AA =
Global->getAttr<AliasAttr>();
4758 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4759 if (LangOpts.OpenMPIsTargetDevice)
4760 return !AliaseeDecl ||
4761 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4764 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4765 const bool AliaseeHasDeviceAttr =
4766 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4768 if (LangOpts.CUDAIsDevice)
4769 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4776bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4777 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4782 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4783 Global->hasAttr<CUDAConstantAttr>() ||
4784 Global->hasAttr<CUDASharedAttr>() ||
4785 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4786 Global->getType()->isCUDADeviceBuiltinTextureType();
4793 if (
Global->hasAttr<WeakRefAttr>())
4798 if (
Global->hasAttr<AliasAttr>()) {
4801 return EmitAliasDefinition(GD);
4805 if (
Global->hasAttr<IFuncAttr>())
4806 return emitIFuncDefinition(GD);
4809 if (
Global->hasAttr<CPUDispatchAttr>())
4810 return emitCPUDispatchDefinition(GD);
4815 if (LangOpts.CUDA) {
4817 "Expected Variable or Function");
4818 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4819 if (!shouldEmitCUDAGlobalVar(VD))
4821 }
else if (LangOpts.CUDAIsDevice) {
4822 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4823 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4824 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4828 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4829 !
Global->hasAttr<CUDAGlobalAttr>() &&
4831 !
Global->hasAttr<CUDAHostAttr>()))
4834 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4835 Global->hasAttr<CUDADeviceAttr>())
4839 if (LangOpts.OpenMP) {
4841 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4843 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4844 if (MustBeEmitted(
Global))
4848 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4849 if (MustBeEmitted(
Global))
4856 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4857 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4863 if (FD->
hasAttr<AnnotateAttr>()) {
4866 DeferredAnnotations[MangledName] = FD;
4881 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4887 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4889 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4890 if (LangOpts.OpenMP) {
4892 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4893 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4897 if (VD->hasExternalStorage() &&
4898 Res != OMPDeclareTargetDeclAttr::MT_Link)
4901 bool UnifiedMemoryEnabled =
4903 if (*Res == OMPDeclareTargetDeclAttr::MT_Local ||
4904 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4905 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4906 !UnifiedMemoryEnabled)) {
4909 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4910 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4911 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4912 UnifiedMemoryEnabled)) &&
4913 "Link clause or to clause with unified memory expected.");
4923 if (LangOpts.HLSL) {
4924 if (VD->getStorageClass() ==
SC_Extern) {
4933 if (Context.getInlineVariableDefinitionKind(VD) ==
4943 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4945 EmitGlobalDefinition(GD);
4946 addEmittedDeferredDecl(GD);
4954 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4955 CXXGlobalInits.push_back(
nullptr);
4961 addDeferredDeclToEmit(GD);
4962 }
else if (MustBeEmitted(
Global)) {
4964 assert(!MayBeEmittedEagerly(
Global));
4965 addDeferredDeclToEmit(GD);
4970 DeferredDecls[MangledName] = GD;
4976 if (
const auto *RT =
4977 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4978 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4979 RD = RD->getDefinitionOrSelf();
4980 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4989struct DLLImportFunctionVisitor
4990 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4991 bool SafeToInline =
true;
4993 bool shouldVisitImplicitCode()
const {
return true; }
4995 bool VisitVarDecl(VarDecl *VD) {
4998 SafeToInline =
false;
4999 return SafeToInline;
5006 return SafeToInline;
5009 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
5011 SafeToInline = D->
hasAttr<DLLImportAttr>();
5012 return SafeToInline;
5015 bool VisitDeclRefExpr(DeclRefExpr *E) {
5018 SafeToInline = VD->
hasAttr<DLLImportAttr>();
5019 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
5020 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
5021 return SafeToInline;
5024 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
5026 return SafeToInline;
5029 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
5033 SafeToInline =
true;
5035 SafeToInline = M->
hasAttr<DLLImportAttr>();
5037 return SafeToInline;
5040 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
5042 return SafeToInline;
5045 bool VisitCXXNewExpr(CXXNewExpr *E) {
5047 return SafeToInline;
5052bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
5059 if (F->isInlineBuiltinDeclaration())
5062 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
5067 if (
const Module *M = F->getOwningModule();
5068 M && M->getTopLevelModule()->isNamedModule() &&
5069 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
5079 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
5084 if (F->hasAttr<NoInlineAttr>())
5087 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
5089 DLLImportFunctionVisitor Visitor;
5090 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
5091 if (!Visitor.SafeToInline)
5094 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
5101 for (
const CXXBaseSpecifier &B :
Dtor->getParent()->bases())
5115bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
5116 return CodeGenOpts.OptimizationLevel > 0;
5119void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
5120 llvm::GlobalValue *GV) {
5124 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
5125 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
5127 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
5128 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
5129 if (TC->isFirstOfVersion(I))
5132 EmitGlobalFunctionDefinition(GD, GV);
5138 AddDeferredMultiVersionResolverToEmit(GD);
5140 GetOrCreateMultiVersionResolver(GD);
5144void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
5147 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
5148 Context.getSourceManager(),
5149 "Generating code for declaration");
5151 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
5154 if (!shouldEmitFunction(GD))
5157 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
5159 llvm::raw_string_ostream
OS(Name);
5165 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
5169 ABI->emitCXXStructor(GD);
5171 EmitMultiVersionFunctionDefinition(GD, GV);
5173 EmitGlobalFunctionDefinition(GD, GV);
5182 return EmitMultiVersionFunctionDefinition(GD, GV);
5183 return EmitGlobalFunctionDefinition(GD, GV);
5186 if (
const auto *VD = dyn_cast<VarDecl>(D))
5187 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
5189 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
5193 llvm::Function *NewFn);
5209static llvm::GlobalValue::LinkageTypes
5213 return llvm::GlobalValue::InternalLinkage;
5214 return llvm::GlobalValue::WeakODRLinkage;
5217void CodeGenModule::emitMultiVersionFunctions() {
5218 std::vector<GlobalDecl> MVFuncsToEmit;
5219 MultiVersionFuncs.swap(MVFuncsToEmit);
5220 for (GlobalDecl GD : MVFuncsToEmit) {
5222 assert(FD &&
"Expected a FunctionDecl");
5224 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
5225 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
5229 if (
Decl->isDefined()) {
5230 EmitGlobalFunctionDefinition(CurGD,
nullptr);
5238 assert(
Func &&
"This should have just been created");
5246 bool ShouldEmitResolver = !
getTriple().isAArch64();
5247 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5248 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
5251 FD, [&](
const FunctionDecl *CurFD) {
5252 llvm::SmallVector<StringRef, 8> Feats;
5255 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
5257 TA->getX86AddedFeatures(Feats);
5258 llvm::Function *
Func = createFunction(CurFD);
5259 DeclMap.insert({
Func, CurFD});
5260 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
5261 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
5262 if (TVA->isDefaultVersion() && IsDefined)
5263 ShouldEmitResolver =
true;
5264 llvm::Function *
Func = createFunction(CurFD);
5265 DeclMap.insert({
Func, CurFD});
5267 TVA->getFeatures(Feats, Delim);
5268 Options.emplace_back(
Func, Feats);
5269 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
5270 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
5271 if (!TC->isFirstOfVersion(I))
5273 if (TC->isDefaultVersion(I) && IsDefined)
5274 ShouldEmitResolver =
true;
5275 llvm::Function *
Func = createFunction(CurFD, I);
5276 DeclMap.insert({
Func, CurFD});
5279 TC->getX86Feature(Feats, I);
5280 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
5283 TC->getFeatures(Feats, I, Delim);
5284 Options.emplace_back(
Func, Feats);
5288 llvm_unreachable(
"unexpected MultiVersionKind");
5291 if (!ShouldEmitResolver)
5294 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
5295 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
5296 ResolverConstant = IFunc->getResolver();
5301 *
this, GD, FD,
true);
5308 auto *Alias = llvm::GlobalAlias::create(
5310 MangledName +
".ifunc", IFunc, &
getModule());
5319 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
5320 const CodeGenFunction::FMVResolverOption &RHS) {
5326 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
5327 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
5328 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
5329 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
5330 return LHS.isSubsetOf(RHS);
5332 Diags.Report(DeclMap[I->Function]->getLocation(),
5333 diag::warn_unreachable_version)
5334 << I->Function->getName();
5335 assert(I->Function->user_empty() &&
"unexpected users");
5336 I->Function->eraseFromParent();
5337 I->Function =
nullptr;
5341 CodeGenFunction CGF(*
this);
5342 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5344 setMultiVersionResolverAttributes(ResolverFunc, GD);
5346 ResolverFunc->setComdat(
5347 getModule().getOrInsertComdat(ResolverFunc->getName()));
5353 if (!MVFuncsToEmit.empty())
5358 if (!MultiVersionFuncs.empty())
5359 emitMultiVersionFunctions();
5369 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
5371 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
5372 llvm::GlobalVariable::ExternalWeakLinkage,
5374 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5379void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
5380 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
5382 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
5384 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
5385 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
5386 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
5387 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5389 DS->takeName(OldDS);
5390 OldDS->replaceAllUsesWith(DS);
5391 OldDS->eraseFromParent();
5397 llvm::Constant *
New) {
5400 Old->replaceAllUsesWith(
New);
5401 Old->eraseFromParent();
5404void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5406 assert(FD &&
"Not a FunctionDecl?");
5408 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5409 assert(DD &&
"Not a cpu_dispatch Function?");
5415 UpdateMultiVersionNames(GD, FD, ResolverName);
5417 llvm::Type *ResolverType;
5418 GlobalDecl ResolverGD;
5420 ResolverType = llvm::FunctionType::get(
5426 ResolverType = DeclTy;
5431 ResolverName, ResolverType, ResolverGD,
false));
5434 ResolverFunc->setComdat(
5435 getModule().getOrInsertComdat(ResolverFunc->getName()));
5437 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5440 for (
const IdentifierInfo *II : DD->cpus()) {
5448 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5451 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5457 Func = GetOrCreateLLVMFunction(
5458 MangledName, DeclTy, ExistingDecl,
5464 llvm::SmallVector<StringRef, 32> Features;
5465 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5466 llvm::transform(Features, Features.begin(),
5467 [](StringRef Str) { return Str.substr(1); });
5468 llvm::erase_if(Features, [&Target](StringRef Feat) {
5469 return !Target.validateCpuSupports(Feat);
5475 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5476 const CodeGenFunction::FMVResolverOption &RHS) {
5477 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5478 llvm::X86::getCpuSupportsMask(RHS.
Features);
5485 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5486 (Options.end() - 2)->Features),
5487 [](
auto X) { return X == 0; })) {
5488 StringRef LHSName = (Options.end() - 2)->Function->getName();
5489 StringRef RHSName = (Options.end() - 1)->Function->getName();
5490 if (LHSName.compare(RHSName) < 0)
5491 Options.erase(Options.end() - 2);
5493 Options.erase(Options.end() - 1);
5496 CodeGenFunction CGF(*
this);
5497 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5498 setMultiVersionResolverAttributes(ResolverFunc, GD);
5503 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5508 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5515 *
this, GD, FD,
true);
5518 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5526void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5528 assert(FD &&
"Not a FunctionDecl?");
5531 std::string MangledName =
5533 if (!DeferredResolversToEmit.insert(MangledName).second)
5536 MultiVersionFuncs.push_back(GD);
5542llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5544 assert(FD &&
"Not a FunctionDecl?");
5546 std::string MangledName =
5551 std::string ResolverName = MangledName;
5555 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5559 ResolverName +=
".ifunc";
5566 ResolverName +=
".resolver";
5569 bool ShouldReturnIFunc =
5588 AddDeferredMultiVersionResolverToEmit(GD);
5592 if (ShouldReturnIFunc) {
5594 llvm::Type *ResolverType = llvm::FunctionType::get(
5596 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5597 MangledName +
".resolver", ResolverType, GlobalDecl{},
5605 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5607 GIF->setName(ResolverName);
5614 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5615 ResolverName, DeclTy, GlobalDecl{},
false);
5617 "Resolver should be created for the first time");
5622void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5624 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5637 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5648bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5649 const llvm::GlobalValue *GV)
const {
5650 auto SC = GV->getDLLStorageClass();
5651 if (SC == llvm::GlobalValue::DefaultStorageClass)
5654 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5655 !MRD->
hasAttr<DLLImportAttr>()) ||
5656 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5657 !MRD->
hasAttr<DLLExportAttr>())) &&
5668llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5669 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5670 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5674 std::string NameWithoutMultiVersionMangling;
5675 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5677 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5678 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5679 !DontDefer && !IsForDefinition) {
5682 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5684 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5687 GDDef = GlobalDecl(FDDef);
5695 UpdateMultiVersionNames(GD, FD, MangledName);
5696 if (!IsForDefinition) {
5702 AddDeferredMultiVersionResolverToEmit(GD);
5704 *
this, GD, FD,
true);
5713 *
this, GD, FD,
true);
5715 return GetOrCreateMultiVersionResolver(GD);
5720 if (!NameWithoutMultiVersionMangling.empty())
5721 MangledName = NameWithoutMultiVersionMangling;
5726 if (WeakRefReferences.erase(Entry)) {
5727 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5728 if (FD && !FD->
hasAttr<WeakAttr>())
5729 Entry->setLinkage(llvm::Function::ExternalLinkage);
5733 if (D && shouldDropDLLAttribute(D, Entry)) {
5734 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5740 if (IsForDefinition && !Entry->isDeclaration()) {
5747 DiagnosedConflictingDefinitions.insert(GD).second) {
5751 diag::note_previous_definition);
5756 (Entry->getValueType() == Ty)) {
5763 if (!IsForDefinition)
5770 bool IsIncompleteFunction =
false;
5772 llvm::FunctionType *FTy;
5776 FTy = llvm::FunctionType::get(
VoidTy,
false);
5777 IsIncompleteFunction =
true;
5781 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5782 Entry ? StringRef() : MangledName, &
getModule());
5786 if (D && D->
hasAttr<AnnotateAttr>())
5804 if (!Entry->use_empty()) {
5806 Entry->removeDeadConstantUsers();
5812 assert(F->getName() == MangledName &&
"name was uniqued!");
5814 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5815 if (ExtraAttrs.hasFnAttrs()) {
5816 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5824 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5827 addDeferredDeclToEmit(GD);
5832 auto DDI = DeferredDecls.find(MangledName);
5833 if (DDI != DeferredDecls.end()) {
5837 addDeferredDeclToEmit(DDI->second);
5838 DeferredDecls.erase(DDI);
5866 if (!IsIncompleteFunction) {
5867 assert(F->getFunctionType() == Ty);
5885 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5895 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5898 DD->getParent()->getNumVBases() == 0)
5903 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5904 false, llvm::AttributeList(),
5907 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5911 if (IsForDefinition)
5919 llvm::GlobalValue *F =
5922 return llvm::NoCFIValue::get(F);
5932 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5935 if (!
C.getLangOpts().CPlusPlus)
5940 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5941 ?
C.Idents.get(
"terminate")
5942 :
C.Idents.get(Name);
5944 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5948 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
5949 for (
const auto *
Result : LSD->lookup(&NS))
5950 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
5955 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5964 llvm::Function *F, StringRef Name) {
5973 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5974 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5975 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5982 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5983 if (AssumeConvergent) {
5985 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5988 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5993 llvm::Constant *
C = GetOrCreateLLVMFunction(
5995 false,
false, ExtraAttrs);
5997 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
6013 llvm::AttributeList ExtraAttrs,
bool Local,
6014 bool AssumeConvergent) {
6015 if (AssumeConvergent) {
6017 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
6021 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
6025 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
6034 markRegisterParameterAttributes(F);
6060 if (WeakRefReferences.erase(Entry)) {
6061 if (D && !D->
hasAttr<WeakAttr>())
6062 Entry->setLinkage(llvm::Function::ExternalLinkage);
6066 if (D && shouldDropDLLAttribute(D, Entry))
6067 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
6069 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
6072 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
6077 if (IsForDefinition && !Entry->isDeclaration()) {
6085 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
6087 DiagnosedConflictingDefinitions.insert(D).second) {
6091 diag::note_previous_definition);
6096 if (Entry->getType()->getAddressSpace() != TargetAS)
6097 return llvm::ConstantExpr::getAddrSpaceCast(
6098 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
6102 if (!IsForDefinition)
6108 auto *GV =
new llvm::GlobalVariable(
6109 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
6110 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
6111 getContext().getTargetAddressSpace(DAddrSpace));
6116 GV->takeName(Entry);
6118 if (!Entry->use_empty()) {
6119 Entry->replaceAllUsesWith(GV);
6122 Entry->eraseFromParent();
6128 auto DDI = DeferredDecls.find(MangledName);
6129 if (DDI != DeferredDecls.end()) {
6132 addDeferredDeclToEmit(DDI->second);
6133 DeferredDecls.erase(DDI);
6138 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
6145 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
6151 CXXThreadLocals.push_back(D);
6159 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
6160 EmitGlobalVarDefinition(D);
6165 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
6166 GV->setSection(SA->getName());
6170 if (
getTriple().getArch() == llvm::Triple::xcore &&
6174 GV->setSection(
".cp.rodata");
6177 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
6178 GV->setCodeModel(CMA->getModel());
6183 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
6187 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
6188 bool HasMutableFields =
Record &&
Record->hasMutableFields();
6189 if (!HasMutableFields) {
6196 auto *InitType =
Init->getType();
6197 if (GV->getValueType() != InitType) {
6202 GV->setName(StringRef());
6207 ->stripPointerCasts());
6210 GV->eraseFromParent();
6213 GV->setInitializer(
Init);
6214 GV->setConstant(
true);
6215 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
6235 SanitizerMD->reportGlobal(GV, *D);
6240 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
6241 if (DAddrSpace != ExpectedAS)
6254 false, IsForDefinition);
6275 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
6276 llvm::Align Alignment) {
6277 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
6278 llvm::GlobalVariable *OldGV =
nullptr;
6282 if (GV->getValueType() == Ty)
6287 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
6292 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
6297 GV->takeName(OldGV);
6299 if (!OldGV->use_empty()) {
6300 OldGV->replaceAllUsesWith(GV);
6303 OldGV->eraseFromParent();
6307 !GV->hasAvailableExternallyLinkage())
6308 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6310 GV->setAlignment(Alignment);
6347 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
6355 if (GV && !GV->isDeclaration())
6360 if (!MustBeEmitted(D) && !GV) {
6361 DeferredDecls[MangledName] = D;
6366 EmitGlobalVarDefinition(D);
6371 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
6373 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
6388 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(
Addr)) {
6392 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
6395 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6397 if (!Fn->getSubprogram())
6403 return Context.toCharUnitsFromBits(
6408 if (LangOpts.OpenCL) {
6419 if (LangOpts.SYCLIsDevice &&
6423 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6428 if (D->
hasAttr<CUDAConstantAttr>())
6430 if (D->
hasAttr<CUDASharedAttr>())
6432 if (D->
hasAttr<CUDADeviceAttr>())
6440 if (LangOpts.OpenMP) {
6442 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6450 if (LangOpts.OpenCL)
6452 if (LangOpts.SYCLIsDevice)
6454 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
6462 if (
auto AS =
getTarget().getConstantAddressSpace())
6475static llvm::Constant *
6477 llvm::GlobalVariable *GV) {
6478 llvm::Constant *Cast = GV;
6483 GV, llvm::PointerType::get(
6490template<
typename SomeDecl>
6492 llvm::GlobalValue *GV) {
6507 const SomeDecl *
First = D->getFirstDecl();
6508 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6514 std::pair<StaticExternCMap::iterator, bool> R =
6515 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6520 R.first->second =
nullptr;
6527 if (D.
hasAttr<SelectAnyAttr>())
6531 if (
auto *VD = dyn_cast<VarDecl>(&D))
6545 llvm_unreachable(
"No such linkage");
6553 llvm::GlobalObject &GO) {
6556 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6564void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6579 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6580 OpenMPRuntime->emitTargetGlobalVariable(D))
6583 llvm::TrackingVH<llvm::Constant>
Init;
6584 bool NeedsGlobalCtor =
false;
6588 bool IsDefinitionAvailableExternally =
6590 bool NeedsGlobalDtor =
6591 !IsDefinitionAvailableExternally &&
6598 if (IsDefinitionAvailableExternally &&
6609 std::optional<ConstantEmitter> emitter;
6614 bool IsCUDASharedVar =
6619 bool IsCUDAShadowVar =
6621 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6622 D->
hasAttr<CUDASharedAttr>());
6623 bool IsCUDADeviceShadowVar =
6628 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6629 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6633 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6636 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6637 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6638 }
else if (!InitExpr) {
6651 initializedGlobalDecl = GlobalDecl(D);
6652 emitter.emplace(*
this);
6653 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6661 if (!IsDefinitionAvailableExternally)
6662 NeedsGlobalCtor =
true;
6666 NeedsGlobalCtor =
false;
6678 DelayedCXXInitPosition.erase(D);
6685 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6690 llvm::Type* InitType =
Init->getType();
6691 llvm::Constant *Entry =
6695 Entry = Entry->stripPointerCasts();
6698 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6709 if (!GV || GV->getValueType() != InitType ||
6710 GV->getType()->getAddressSpace() !=
6714 Entry->setName(StringRef());
6719 ->stripPointerCasts());
6722 llvm::Constant *NewPtrForOldDecl =
6723 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6725 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6733 if (D->
hasAttr<AnnotateAttr>())
6746 if (LangOpts.CUDA) {
6747 if (LangOpts.CUDAIsDevice) {
6750 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6753 GV->setExternallyInitialized(
true);
6760 if (LangOpts.HLSL &&
6765 GV->setExternallyInitialized(
true);
6767 GV->setInitializer(
Init);
6774 emitter->finalize(GV);
6777 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6778 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6782 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6783 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6785 GV->setConstant(
true);
6790 if (std::optional<CharUnits> AlignValFromAllocate =
6792 AlignVal = *AlignValFromAllocate;
6810 Linkage == llvm::GlobalValue::ExternalLinkage &&
6811 Context.getTargetInfo().getTriple().isOSDarwin() &&
6813 Linkage = llvm::GlobalValue::InternalLinkage;
6818 if (LangOpts.HLSL &&
6820 Linkage = llvm::GlobalValue::ExternalLinkage;
6823 if (D->
hasAttr<DLLImportAttr>())
6824 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6825 else if (D->
hasAttr<DLLExportAttr>())
6826 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6828 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6830 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6832 GV->setConstant(
false);
6837 if (!GV->getInitializer()->isNullValue())
6838 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6841 setNonAliasAttributes(D, GV);
6843 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6845 CXXThreadLocals.push_back(D);
6852 if (NeedsGlobalCtor || NeedsGlobalDtor)
6853 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6855 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6860 DI->EmitGlobalVariable(GV, D);
6868 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6879 if (D->
hasAttr<SectionAttr>())
6885 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6886 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6887 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6888 D->
hasAttr<PragmaClangRodataSectionAttr>())
6896 if (D->
hasAttr<WeakImportAttr>())
6905 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6906 if (D->
hasAttr<AlignedAttr>())
6909 if (Context.isAlignmentRequired(VarType))
6913 for (
const FieldDecl *FD : RD->fields()) {
6914 if (FD->isBitField())
6916 if (FD->
hasAttr<AlignedAttr>())
6918 if (Context.isAlignmentRequired(FD->
getType()))
6930 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6931 Context.getTypeAlignIfKnown(D->
getType()) >
6938llvm::GlobalValue::LinkageTypes
6942 return llvm::Function::InternalLinkage;
6945 return llvm::GlobalVariable::WeakAnyLinkage;
6949 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6954 return llvm::GlobalValue::AvailableExternallyLinkage;
6968 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6969 : llvm::Function::InternalLinkage;
6983 return llvm::Function::ExternalLinkage;
6986 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6987 : llvm::Function::InternalLinkage;
6988 return llvm::Function::WeakODRLinkage;
6995 CodeGenOpts.NoCommon))
6996 return llvm::GlobalVariable::CommonLinkage;
7002 if (D->
hasAttr<SelectAnyAttr>())
7003 return llvm::GlobalVariable::WeakODRLinkage;
7007 return llvm::GlobalVariable::ExternalLinkage;
7010llvm::GlobalValue::LinkageTypes
7019 llvm::Function *newFn) {
7021 if (old->use_empty())
7024 llvm::Type *newRetTy = newFn->getReturnType();
7029 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
7031 llvm::User *user = ui->getUser();
7035 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
7036 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
7042 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
7045 if (!callSite->isCallee(&*ui))
7050 if (callSite->getType() != newRetTy && !callSite->use_empty())
7055 llvm::AttributeList oldAttrs = callSite->getAttributes();
7058 unsigned newNumArgs = newFn->arg_size();
7059 if (callSite->arg_size() < newNumArgs)
7065 bool dontTransform =
false;
7066 for (llvm::Argument &A : newFn->args()) {
7067 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
7068 dontTransform =
true;
7073 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
7081 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
7085 callSite->getOperandBundlesAsDefs(newBundles);
7087 llvm::CallBase *newCall;
7089 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
7090 callSite->getIterator());
7093 newCall = llvm::InvokeInst::Create(
7094 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
7095 newArgs, newBundles,
"", callSite->getIterator());
7099 if (!newCall->getType()->isVoidTy())
7100 newCall->takeName(callSite);
7101 newCall->setAttributes(
7102 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
7103 oldAttrs.getRetAttrs(), newArgAttrs));
7104 newCall->setCallingConv(callSite->getCallingConv());
7107 if (!callSite->use_empty())
7108 callSite->replaceAllUsesWith(newCall);
7111 if (callSite->getDebugLoc())
7112 newCall->setDebugLoc(callSite->getDebugLoc());
7114 callSitesToBeRemovedFromParent.push_back(callSite);
7117 for (
auto *callSite : callSitesToBeRemovedFromParent) {
7118 callSite->eraseFromParent();
7132 llvm::Function *NewFn) {
7142 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
7154void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
7155 llvm::GlobalValue *GV) {
7163 if (!GV || (GV->getValueType() != Ty))
7169 if (!GV->isDeclaration())
7179 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
7180 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
7192 setNonAliasAttributes(GD, Fn);
7194 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
7195 (CodeGenOpts.OptimizationLevel == 0) &&
7198 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
7200 !D->
hasAttr<NoInlineAttr>() &&
7201 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
7202 !D->
hasAttr<OptimizeNoneAttr>() &&
7203 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
7204 !ShouldAddOptNone) {
7205 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
7215 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
7216 if (UnwindMode != llvm::WinX64EHUnwindMode::Default &&
7217 UnwindMode != llvm::WinX64EHUnwindMode::V3 &&
7218 Fn->needsUnwindTableEntry()) {
7219 bool HasEGPR =
false;
7220 if (Fn->hasFnAttribute(
"target-features")) {
7222 Fn->getFnAttribute(
"target-features").getValueAsString();
7224 Feats.split(Tokens,
',', -1,
false);
7225 for (StringRef
Tok : Tokens) {
7228 else if (
Tok ==
"-egpr")
7232 HasEGPR = Context.getTargetInfo().hasFeature(
"egpr");
7235 unsigned DiagID = Diags.getCustomDiagID(
7237 "EGPR target feature requires unwind version 3");
7243 auto GetPriority = [
this](
const auto *Attr) ->
int {
7244 Expr *E = Attr->getPriority();
7248 return Attr->DefaultPriority;
7251 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
7253 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
7259void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
7261 const AliasAttr *AA = D->
getAttr<AliasAttr>();
7262 assert(AA &&
"Not an alias?");
7266 if (AA->getAliasee() == MangledName) {
7267 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7274 if (Entry && !Entry->isDeclaration())
7277 Aliases.push_back(GD);
7283 llvm::Constant *Aliasee;
7284 llvm::GlobalValue::LinkageTypes
LT;
7286 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
7292 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
7299 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
7301 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
7304 if (GA->getAliasee() == Entry) {
7305 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7309 assert(Entry->isDeclaration());
7318 GA->takeName(Entry);
7320 Entry->replaceAllUsesWith(GA);
7321 Entry->eraseFromParent();
7323 GA->setName(MangledName);
7331 GA->setLinkage(llvm::Function::WeakAnyLinkage);
7334 if (
const auto *VD = dyn_cast<VarDecl>(D))
7335 if (VD->getTLSKind())
7346void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
7348 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
7349 assert(IFA &&
"Not an ifunc?");
7353 if (IFA->getResolver() == MangledName) {
7354 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7360 if (Entry && !Entry->isDeclaration()) {
7363 DiagnosedConflictingDefinitions.insert(GD).second) {
7364 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
7367 diag::note_previous_definition);
7372 Aliases.push_back(GD);
7378 llvm::Constant *Resolver =
7379 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
7383 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
7384 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
7386 if (GIF->getResolver() == Entry) {
7387 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7390 assert(Entry->isDeclaration());
7399 GIF->takeName(Entry);
7401 Entry->replaceAllUsesWith(GIF);
7402 Entry->eraseFromParent();
7404 GIF->setName(MangledName);
7410 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
7411 (llvm::Intrinsic::ID)IID, Tys);
7414static llvm::StringMapEntry<llvm::GlobalVariable *> &
7417 bool &IsUTF16,
unsigned &StringLength) {
7418 StringRef String = Literal->getString();
7419 unsigned NumBytes = String.size();
7422 if (!Literal->containsNonAsciiOrNull()) {
7423 StringLength = NumBytes;
7424 return *Map.insert(std::make_pair(String,
nullptr)).first;
7431 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
7432 llvm::UTF16 *ToPtr = &ToBuf[0];
7434 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
7435 ToPtr + NumBytes, llvm::strictConversion);
7438 StringLength = ToPtr - &ToBuf[0];
7442 return *Map.insert(std::make_pair(
7443 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7444 (StringLength + 1) * 2),
7450 unsigned StringLength = 0;
7451 bool isUTF16 =
false;
7452 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7457 if (
auto *
C = Entry.second)
7462 const llvm::Triple &Triple =
getTriple();
7465 const bool IsSwiftABI =
7466 static_cast<unsigned>(CFRuntime) >=
7471 if (!CFConstantStringClassRef) {
7472 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7474 Ty = llvm::ArrayType::get(Ty, 0);
7476 switch (CFRuntime) {
7480 CFConstantStringClassName =
7481 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7482 :
"$s10Foundation19_NSCFConstantStringCN";
7486 CFConstantStringClassName =
7487 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7488 :
"$S10Foundation19_NSCFConstantStringCN";
7492 CFConstantStringClassName =
7493 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7494 :
"__T010Foundation19_NSCFConstantStringCN";
7501 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7502 llvm::GlobalValue *GV =
nullptr;
7504 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7511 if ((VD = dyn_cast<VarDecl>(
Result)))
7514 if (Triple.isOSBinFormatELF()) {
7516 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7518 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7519 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7520 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7522 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7530 CFConstantStringClassRef =
7531 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7534 QualType CFTy = Context.getCFConstantStringType();
7539 auto Fields = Builder.beginStruct(STy);
7548 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7549 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7551 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7555 llvm::Constant *
C =
nullptr;
7558 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7559 Entry.first().size() / 2);
7560 C = llvm::ConstantDataArray::get(VMContext, Arr);
7562 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7568 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7569 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7570 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7573 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7574 : Context.getTypeAlignInChars(Context.CharTy);
7580 if (Triple.isOSBinFormatMachO())
7581 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7582 :
"__TEXT,__cstring,cstring_literals");
7585 else if (Triple.isOSBinFormatELF())
7586 GV->setSection(
".rodata");
7592 llvm::IntegerType *LengthTy =
7602 Fields.addInt(LengthTy, StringLength);
7610 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7612 llvm::GlobalVariable::PrivateLinkage);
7613 GV->addAttribute(
"objc_arc_inert");
7614 switch (Triple.getObjectFormat()) {
7615 case llvm::Triple::UnknownObjectFormat:
7616 llvm_unreachable(
"unknown file format");
7617 case llvm::Triple::DXContainer:
7618 case llvm::Triple::GOFF:
7619 case llvm::Triple::SPIRV:
7620 case llvm::Triple::XCOFF:
7621 llvm_unreachable(
"unimplemented");
7622 case llvm::Triple::COFF:
7623 case llvm::Triple::ELF:
7624 case llvm::Triple::Wasm:
7625 GV->setSection(
"cfstring");
7627 case llvm::Triple::MachO:
7628 GV->setSection(
"__DATA,__cfstring");
7637 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7641 if (ObjCFastEnumerationStateType.isNull()) {
7642 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7646 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7647 Context.getPointerType(Context.UnsignedLongTy),
7648 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7651 for (
size_t i = 0; i < 4; ++i) {
7656 FieldTypes[i],
nullptr,
7665 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7668 return ObjCFastEnumerationStateType;
7682 assert(CAT &&
"String literal not of constant array type!");
7684 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7688 llvm::Type *ElemTy = AType->getElementType();
7689 unsigned NumElements = AType->getNumElements();
7692 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7694 Elements.reserve(NumElements);
7696 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7698 Elements.resize(NumElements);
7699 return llvm::ConstantDataArray::get(VMContext, Elements);
7702 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7704 Elements.reserve(NumElements);
7706 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7708 Elements.resize(NumElements);
7709 return llvm::ConstantDataArray::get(VMContext, Elements);
7712static llvm::GlobalVariable *
7721 auto *GV =
new llvm::GlobalVariable(
7722 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7723 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7725 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7726 if (GV->isWeakForLinker()) {
7727 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7728 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7744 llvm::GlobalVariable **Entry =
nullptr;
7745 if (!LangOpts.WritableStrings) {
7746 Entry = &ConstantStringMap[
C];
7747 if (
auto GV = *Entry) {
7748 if (Alignment.
getAsAlign() > GV->getAlign().valueOrOne())
7751 GV->getValueType(), Alignment);
7756 StringRef GlobalVariableName;
7757 llvm::GlobalValue::LinkageTypes LT;
7762 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7763 !LangOpts.WritableStrings) {
7764 llvm::raw_svector_ostream Out(MangledNameBuffer);
7766 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7767 GlobalVariableName = MangledNameBuffer;
7769 LT = llvm::GlobalValue::PrivateLinkage;
7770 GlobalVariableName = Name;
7782 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7785 GV->getValueType(), Alignment);
7802 StringRef GlobalName) {
7803 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7808 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7811 llvm::GlobalVariable **Entry =
nullptr;
7812 if (!LangOpts.WritableStrings) {
7813 Entry = &ConstantStringMap[
C];
7814 if (
auto GV = *Entry) {
7815 if (Alignment.
getAsAlign() > GV->getAlign().valueOrOne())
7818 GV->getValueType(), Alignment);
7824 GlobalName, Alignment);
7829 GV->getValueType(), Alignment);
7847 MaterializedType = E->
getType();
7851 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7852 if (!InsertResult.second) {
7855 if (!InsertResult.first->second) {
7860 InsertResult.first->second =
new llvm::GlobalVariable(
7861 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7865 llvm::cast<llvm::GlobalVariable>(
7866 InsertResult.first->second->stripPointerCasts())
7875 llvm::raw_svector_ostream Out(Name);
7897 std::optional<ConstantEmitter> emitter;
7898 llvm::Constant *InitialValue =
nullptr;
7903 emitter.emplace(*
this);
7904 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7909 Type = InitialValue->getType();
7918 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7920 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7924 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7928 Linkage = llvm::GlobalVariable::InternalLinkage;
7932 auto *GV =
new llvm::GlobalVariable(
7934 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7935 if (emitter) emitter->finalize(GV);
7937 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7939 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7941 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7945 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7946 if (VD->getTLSKind())
7948 llvm::Constant *CV = GV;
7951 GV, llvm::PointerType::get(
7957 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7959 Entry->replaceAllUsesWith(CV);
7960 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7969void CodeGenModule::EmitObjCPropertyImplementations(
const
7982 if (!Getter || Getter->isSynthesizedAccessorStub())
7985 auto *Setter = PID->getSetterMethodDecl();
7986 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7997 if (ivar->getType().isDestructedType())
8018void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
8031 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
8046 getContext().getObjCIdType(),
nullptr, D,
true,
8052 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
8057void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
8064 EmitDeclContext(LSD);
8067void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
8069 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
8072 std::unique_ptr<CodeGenFunction> &CurCGF =
8073 GlobalTopLevelStmtBlockInFlight.first;
8077 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
8085 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
8086 FunctionArgList Args;
8088 const CGFunctionInfo &FnInfo =
8091 llvm::Function *
Fn = llvm::Function::Create(
8092 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
8094 CurCGF.reset(
new CodeGenFunction(*
this));
8095 GlobalTopLevelStmtBlockInFlight.second = D;
8096 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
8098 CXXGlobalInits.push_back(Fn);
8101 CurCGF->EmitStmt(D->
getStmt());
8104void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
8105 for (
auto *I : DC->
decls()) {
8111 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
8112 for (
auto *M : OID->methods())
8131 case Decl::CXXConversion:
8132 case Decl::CXXMethod:
8133 case Decl::Function:
8140 case Decl::CXXDeductionGuide:
8145 case Decl::Decomposition:
8146 case Decl::VarTemplateSpecialization:
8148 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
8149 for (
auto *B : DD->flat_bindings())
8150 if (
auto *HD = B->getHoldingVar())
8157 case Decl::IndirectField:
8161 case Decl::Namespace:
8164 case Decl::ClassTemplateSpecialization: {
8167 if (Spec->getSpecializationKind() ==
8169 Spec->hasDefinition())
8170 DI->completeTemplateDefinition(*Spec);
8172 case Decl::CXXRecord: {
8176 DI->EmitAndRetainType(
8180 DI->completeUnusedClass(*CRD);
8183 for (
auto *I : CRD->
decls())
8189 case Decl::UsingShadow:
8190 case Decl::ClassTemplate:
8191 case Decl::VarTemplate:
8193 case Decl::VarTemplatePartialSpecialization:
8194 case Decl::FunctionTemplate:
8195 case Decl::TypeAliasTemplate:
8204 case Decl::UsingEnum:
8208 case Decl::NamespaceAlias:
8212 case Decl::UsingDirective:
8216 case Decl::CXXConstructor:
8219 case Decl::CXXDestructor:
8223 case Decl::StaticAssert:
8224 case Decl::ExplicitInstantiation:
8231 case Decl::ObjCInterface:
8232 case Decl::ObjCCategory:
8235 case Decl::ObjCProtocol: {
8237 if (Proto->isThisDeclarationADefinition())
8238 ObjCRuntime->GenerateProtocol(Proto);
8242 case Decl::ObjCCategoryImpl:
8248 case Decl::ObjCImplementation: {
8250 EmitObjCPropertyImplementations(OMD);
8251 EmitObjCIvarInitializations(OMD);
8252 ObjCRuntime->GenerateClass(OMD);
8256 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
8257 OMD->getClassInterface()), OMD->getLocation());
8260 case Decl::ObjCMethod: {
8267 case Decl::ObjCCompatibleAlias:
8271 case Decl::PragmaComment: {
8273 switch (PCD->getCommentKind()) {
8275 llvm_unreachable(
"unexpected pragma comment kind");
8283 ProcessPragmaCommentCopyright(PCD->getArg(), PCD->isFromASTFile());
8293 case Decl::PragmaDetectMismatch: {
8299 case Decl::LinkageSpec:
8303 case Decl::FileScopeAsm: {
8305 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
8308 if (LangOpts.OpenMPIsTargetDevice)
8311 if (LangOpts.SYCLIsDevice)
8316 llvm::Module::GlobalAsmProperties Props;
8317 Props.TargetFeatures = llvm::join(TargetOpts.
Features,
",");
8318 Props.TargetCPU = TargetOpts.
CPU;
8320 llvm::Module::GlobalAsmFragment(AD->getAsmString(), Props));
8324 case Decl::TopLevelStmt:
8328 case Decl::Import: {
8332 if (!ImportedModules.insert(Import->getImportedModule()))
8336 if (!Import->getImportedOwningModule()) {
8338 DI->EmitImportDecl(*Import);
8344 if (CXX20ModuleInits && Import->getImportedModule() &&
8345 Import->getImportedModule()->isNamedModule())
8354 Visited.insert(Import->getImportedModule());
8355 Stack.push_back(Import->getImportedModule());
8357 while (!Stack.empty()) {
8359 if (!EmittedModuleInitializers.insert(Mod).second)
8362 for (
auto *D : Context.getModuleInitializers(Mod))
8369 if (Submodule->IsExplicit)
8372 if (Visited.insert(Submodule).second)
8373 Stack.push_back(Submodule);
8383 case Decl::OMPThreadPrivate:
8387 case Decl::OMPAllocate:
8391 case Decl::OMPDeclareReduction:
8395 case Decl::OMPDeclareMapper:
8399 case Decl::OMPRequires:
8404 case Decl::TypeAlias:
8406 DI->EmitAndRetainType(
getContext().getTypedefType(
8414 DI->EmitAndRetainType(
8421 DI->EmitAndRetainType(
8425 case Decl::HLSLRootSignature:
8428 case Decl::HLSLBuffer:
8432 case Decl::OpenACCDeclare:
8435 case Decl::OpenACCRoutine:
8450 if (!CodeGenOpts.CoverageMapping)
8453 case Decl::CXXConversion:
8454 case Decl::CXXMethod:
8455 case Decl::Function:
8456 case Decl::ObjCMethod:
8457 case Decl::CXXConstructor:
8458 case Decl::CXXDestructor: {
8467 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8477 if (!CodeGenOpts.CoverageMapping)
8479 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8480 if (Fn->isTemplateInstantiation())
8483 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8491 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8494 const Decl *D = Entry.first;
8496 case Decl::CXXConversion:
8497 case Decl::CXXMethod:
8498 case Decl::Function:
8499 case Decl::ObjCMethod: {
8506 case Decl::CXXConstructor: {
8513 case Decl::CXXDestructor: {
8530 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8531 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8532 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8533 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8534 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8543 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8544 return llvm::ConstantInt::get(i64, PtrInt);
8548 llvm::NamedMDNode *&GlobalMetadata,
8550 llvm::GlobalValue *
Addr) {
8551 if (!GlobalMetadata)
8553 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8556 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8559 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8562bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8563 llvm::GlobalValue *CppFunc) {
8565 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8568 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8571 if (Elem == CppFunc)
8577 for (llvm::User *User : Elem->users()) {
8581 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8582 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8585 for (llvm::User *CEUser : ConstExpr->users()) {
8586 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8587 IFuncs.push_back(IFunc);
8592 CEs.push_back(ConstExpr);
8593 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8594 IFuncs.push_back(IFunc);
8606 for (llvm::GlobalIFunc *IFunc : IFuncs)
8607 IFunc->setResolver(
nullptr);
8608 for (llvm::ConstantExpr *ConstExpr : CEs)
8609 ConstExpr->destroyConstant();
8613 Elem->eraseFromParent();
8615 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8620 llvm::FunctionType::get(IFunc->getType(),
false);
8621 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8622 CppFunc->getName(), ResolverTy, {},
false);
8623 IFunc->setResolver(Resolver);
8633void CodeGenModule::EmitStaticExternCAliases() {
8636 for (
auto &I : StaticExternCValues) {
8637 const IdentifierInfo *Name = I.first;
8638 llvm::GlobalValue *Val = I.second;
8646 llvm::GlobalValue *ExistingElem =
8651 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8658 auto Res = Manglings.find(MangledName);
8659 if (Res == Manglings.end())
8661 Result = Res->getValue();
8672void CodeGenModule::EmitDeclMetadata() {
8673 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8675 for (
auto &I : MangledDeclNames) {
8676 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8686void CodeGenFunction::EmitDeclMetadata() {
8687 if (LocalDeclMap.empty())
return;
8692 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8694 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8696 for (
auto &I : LocalDeclMap) {
8697 const Decl *D = I.first;
8698 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8699 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8701 Alloca->setMetadata(
8702 DeclPtrKind, llvm::MDNode::get(
8703 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8704 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8711void CodeGenModule::EmitVersionIdentMetadata() {
8712 llvm::NamedMDNode *IdentMetadata =
8713 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8715 llvm::LLVMContext &Ctx = TheModule.getContext();
8717 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8718 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8721void CodeGenModule::EmitCommandLineMetadata() {
8722 llvm::NamedMDNode *CommandLineMetadata =
8723 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8725 llvm::LLVMContext &Ctx = TheModule.getContext();
8727 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8728 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8731void CodeGenModule::EmitCoverageFile() {
8732 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8736 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8737 llvm::LLVMContext &Ctx = TheModule.getContext();
8738 auto *CoverageDataFile =
8740 auto *CoverageNotesFile =
8742 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8743 llvm::MDNode *CU = CUNode->getOperand(i);
8744 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8745 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8758 LangOpts.ObjCRuntime.isGNUFamily())
8759 return ObjCRuntime->GetEHType(Ty);
8766 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8768 for (
auto RefExpr : D->
varlist()) {
8771 VD->getAnyInitializer() &&
8772 !VD->getAnyInitializer()->isConstantInitializer(
getContext());
8778 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8779 CXXGlobalInits.push_back(InitFunction);
8783llvm::Metadata *CodeGenModule::CreateMetadataIdentifierImpl(
8784 QualType T, MetadataTypeMap &Map, StringRef Suffix,
bool ForceString) {
8787 FnType->getReturnType(), FnType->getParamTypes(),
8788 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8790 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
8795 std::string OutName;
8796 llvm::raw_string_ostream Out(OutName);
8801 Out <<
".normalized";
8824 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
8829 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
8833 return CreateMetadataIdentifierImpl(
T, GeneralizedMetadataIdMap,
8834 ".generalized",
false);
8847 if (Context.isPromotableIntegerType(Ty))
8848 return Context.getPromotedIntegerType(Ty);
8850 if (BT->getKind() == BuiltinType::Float ||
8851 BT->getKind() == BuiltinType::Half)
8852 return Context.DoubleTy;
8860 PromotedParamTypes.reserve(ParamTypes.size());
8864 return Context.getFunctionType(FNPT->
getReturnType(), PromotedParamTypes,
8872 return CreateMetadataIdentifierImpl(
T, CallGraphMetadataIdMap,
"",
8880 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8881 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8882 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8883 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8884 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8885 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8886 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8887 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8895 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8897 if (CodeGenOpts.SanitizeCfiCrossDso)
8899 VTable->addTypeMetadata(Offset.getQuantity(),
8900 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8903 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8904 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8910 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8920 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8935 bool forPointeeType) {
8946 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8953 bool AlignForArray =
T->isArrayType();
8959 if (
T->isIncompleteType()) {
8976 if (
T.getQualifiers().hasUnaligned()) {
8978 }
else if (forPointeeType && !AlignForArray &&
8979 (RD =
T->getAsCXXRecordDecl())) {
8990 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
9003 if (NumAutoVarInit >= StopAfter) {
9006 if (!NumAutoVarInit) {
9020 const Decl *D)
const {
9024 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
9026 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
9032 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
9036 llvm::MD5::MD5Result
Result;
9037 for (
const auto &Arg : PreprocessorOpts.Macros)
9038 Hash.update(Arg.first);
9042 llvm::sys::fs::UniqueID ID;
9046 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
9051 << PLoc.
getFilename() << Status.getError().message();
9053 ID = Status->getUniqueID();
9055 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
9056 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
9063 assert(DeferredDeclsToEmit.empty() &&
9064 "Should have emitted all decls deferred to emit.");
9065 assert(NewBuilder->DeferredDecls.empty() &&
9066 "Newly created module should not have deferred decls");
9067 NewBuilder->DeferredDecls = std::move(DeferredDecls);
9068 assert(EmittedDeferredDecls.empty() &&
9069 "Still have (unmerged) EmittedDeferredDecls deferred decls");
9071 assert(NewBuilder->DeferredVTables.empty() &&
9072 "Newly created module should not have deferred vtables");
9073 NewBuilder->DeferredVTables = std::move(DeferredVTables);
9075 assert(NewBuilder->EmittedVTables.empty() &&
9076 "Newly created module should not have defined vtables");
9077 NewBuilder->EmittedVTables = std::move(EmittedVTables);
9079 assert(NewBuilder->MangledDeclNames.empty() &&
9080 "Newly created module should not have mangled decl names");
9081 assert(NewBuilder->Manglings.empty() &&
9082 "Newly created module should not have manglings");
9083 NewBuilder->Manglings = std::move(Manglings);
9085 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
9087 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
9091 std::string OutName;
9092 llvm::raw_string_ostream Out(OutName);
9100 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
9106 if (Dtor && Dtor->isVirtual() && Dtor->hasAttr<DLLExportAttr>())
9109 return RequireVectorDeletingDtor.count(RD);
9113 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
9115 RequireVectorDeletingDtor.insert(RD);
9129 if (Entry && !Entry->isDeclaration()) {
9134 auto *NewFn = llvm::Function::Create(
9136 llvm::Function::ExternalLinkage, VDName, &
getModule());
9137 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
9139 NewFn->takeName(VDEntry);
9140 VDEntry->replaceAllUsesWith(NewFn);
9141 VDEntry->eraseFromParent();
9142 Entry->replaceAllUsesWith(NewFn);
9143 Entry->eraseFromParent();
9148 addDeferredDeclToEmit(VectorDtorGD);
9152 llvm::GlobalAlias *GlobalDeleteAlias,
9156 PendingMSVCGlobalDeletes.insert({GlobalDeleteAlias, OperatorDeleteFD});
9178 "__global_delete wrapper is only used with the Microsoft ABI");
9180 llvm::LLVMContext &LLVMCtx = M.getContext();
9184 llvm::FunctionType *FnTy = GlobDeleteFn->getFunctionType();
9194 StringRef GlobDeleteMangledName = GlobDeleteFn->getName();
9195 StringRef Signature;
9196 const char *WrapperBase;
9197 if (GlobDeleteMangledName.starts_with(
"??3@")) {
9198 Signature = GlobDeleteMangledName.substr(4);
9199 WrapperBase =
"?__global_delete@@";
9200 }
else if (GlobDeleteMangledName.starts_with(
"??_V@")) {
9201 Signature = GlobDeleteMangledName.substr(5);
9202 WrapperBase =
"?__global_array_delete@@";
9204 llvm_unreachable(
"unexpected global operator delete mangling");
9207 std::string GlobalDeleteName = (WrapperBase + Signature).str();
9208 std::string EmptyGlobalDeleteName =
9209 (
"?__empty_global_delete@@" + Signature).str();
9213 if (llvm::GlobalValue *Existing = M.getNamedValue(GlobalDeleteName))
9222 llvm::Function *EmptyFn = M.getFunction(EmptyGlobalDeleteName);
9224 EmptyFn = llvm::Function::Create(
9225 FnTy, llvm::GlobalValue::LinkOnceODRLinkage, EmptyGlobalDeleteName, &M);
9226 EmptyFn->setComdat(M.getOrInsertComdat(EmptyGlobalDeleteName));
9227 EmptyFn->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
9234 auto *BB = llvm::BasicBlock::Create(LLVMCtx,
"", EmptyFn);
9235 llvm::Function *TrapFn =
9236 llvm::Intrinsic::getOrInsertDeclaration(&M, llvm::Intrinsic::trap);
9237 auto *TrapCall = llvm::CallInst::Create(TrapFn, {},
"", BB);
9238 TrapCall->setDoesNotReturn();
9239 TrapCall->setDoesNotThrow();
9240 new llvm::UnreachableInst(LLVMCtx, BB);
9254 auto *GlobalDeleteAlias = llvm::GlobalAlias::create(
9255 FnTy, GlobDeleteFn->getAddressSpace(), llvm::GlobalValue::WeakAnyLinkage,
9256 GlobalDeleteName, EmptyFn, &M);
9263 return GlobalDeleteAlias;
9275 if (!HasDirectGlobalDelete)
9278 for (
const auto &Entry : PendingMSVCGlobalDeletes) {
9279 llvm::GlobalAlias *Alias = Entry.first;
9287 llvm::Function::Create(FnTy, llvm::GlobalValue::LinkOnceODRLinkage,
9288 Alias->getAddressSpace(),
"", &
getModule());
9294 for (
auto &Arg : GlobDelFn->args())
9295 Args.push_back(&Arg);
9296 llvm::CallInst::Create(FnTy, RealDeleteFn, Args,
"", BB);
9301 Alias->replaceAllUsesWith(GlobDelFn);
9302 GlobDelFn->takeName(Alias);
9303 Alias->eraseFromParent();
9305 GlobDelFn->setComdat(
getModule().getOrInsertComdat(GlobDelFn->getName()));
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the Diagnostic-related interfaces.
Defines enum values for all the target-independent builtin functions.
static bool shouldAssumeDSOLocal(const CIRGenModule &cgm, cir::CIRGlobalValueInterface gv)
static bool shouldBeInCOMDAT(CIRGenModule &cgm, const Decl &d)
static void setWindowsItaniumDLLImport(CIRGenModule &cgm, bool isLocal, cir::FuncOp funcOp, StringRef name)
static std::string getMangledNameImpl(CIRGenModule &cgm, GlobalDecl gd, const NamedDecl *nd)
static bool hasImplicitAttr(const ValueDecl *decl)
static std::vector< std::string > getFeatureDeltaFromDefault(const CIRGenModule &cgm, llvm::StringRef targetCPU, llvm::StringMap< bool > &featureMap)
Get the feature delta from the default feature map for the given target CPU.
static CIRGenCXXABI * createCXXABI(CIRGenModule &cgm)
static bool isVarDeclStrongDefinition(const ASTContext &astContext, CIRGenModule &cgm, const VarDecl *vd, bool noCommon)
static void setLinkageForGV(cir::GlobalOp &gv, const NamedDecl *nd)
static void emitUsed(CIRGenModule &cgm, StringRef name, std::vector< cir::CIRGlobalValueInterface > &list)
static void AppendCPUSpecificCPUDispatchMangling(const CodeGenModule &CGM, const CPUSpecificAttr *Attr, unsigned CPUIndex, raw_ostream &Out)
static void initializeCommonABICompatInfo(llvm::abi::ABICompatInfo &CompatInfo, const LangOptions::ClangABI Compat)
static bool AllTrivialInitializers(CodeGenModule &CGM, ObjCImplementationDecl *D)
static const FunctionDecl * GetRuntimeFunctionDecl(ASTContext &C, StringRef Name)
static bool shouldKeepInlineFunction(llvm::GlobalValue::LinkageTypes Linkage, const FunctionDecl *FD)
static GlobalDecl getBaseVariantGlobalDecl(const NamedDecl *D)
static void checkAliasForTocData(llvm::GlobalVariable *GVar, const CodeGenOptions &CodeGenOpts, DiagnosticsEngine &Diags, SourceLocation Location)
static const char PFPDeactivationSymbolPrefix[]
static GlobalDecl getGlobalDeclForLinkage(const FunctionDecl *FD)
static bool HasNonDllImportDtor(QualType T)
static llvm::Constant * GetPointerConstant(llvm::LLVMContext &Context, const void *Ptr)
Turns the given pointer into a constant.
static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S)
static llvm::GlobalValue::LinkageTypes getMultiversionLinkage(CodeGenModule &CGM, GlobalDecl GD)
static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO, llvm::Module &M)
static QualType GeneralizeTransparentUnion(QualType Ty)
static std::string getCPUSpecificMangling(const CodeGenModule &CGM, StringRef Name)
static const char AnnotationSection[]
static bool isUniqueInternalLinkageDecl(GlobalDecl GD, CodeGenModule &CGM)
static bool allowKCFIIdentifier(StringRef Name)
static void replaceUsesOfNonProtoConstant(llvm::Constant *old, llvm::Function *newFn)
Replace the uses of a function that was declared with a non-proto type.
static llvm::Constant * castStringLiteralToDefaultAddressSpace(CodeGenModule &CGM, llvm::GlobalVariable *GV)
static void checkDataLayoutConsistency(const TargetInfo &Target, llvm::LLVMContext &Context, const LangOptions &Opts)
static QualType GeneralizeFunctionType(ASTContext &Ctx, QualType Ty, bool GeneralizePointers)
static bool needsDestructMethod(ObjCImplementationDecl *impl)
static bool isStackProtectorOn(const LangOptions &LangOpts, const llvm::Triple &Triple, clang::LangOptions::StackProtectorMode Mode)
static void removeImageAccessQualifier(std::string &TyName)
static llvm::StringMapEntry< llvm::GlobalVariable * > & GetConstantCFStringEntry(llvm::StringMap< llvm::GlobalVariable * > &Map, const StringLiteral *Literal, bool TargetIsLSB, bool &IsUTF16, unsigned &StringLength)
static void setLLVMVisibility(llvm::GlobalValue &GV, std::optional< llvm::GlobalValue::VisibilityTypes > V)
static llvm::GlobalVariable * GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT, CodeGenModule &CGM, StringRef GlobalName, CharUnits Alignment)
static llvm::APInt getFMVPriority(const TargetInfo &TI, const CodeGenFunction::FMVResolverOption &RO)
static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod, SmallVectorImpl< llvm::MDNode * > &Metadata, llvm::SmallPtrSet< Module *, 16 > &Visited)
Add link options implied by the given module, including modules it depends on, using a postorder walk...
static llvm::cl::opt< bool > LimitedCoverage("limited-coverage-experimental", llvm::cl::Hidden, llvm::cl::desc("Emit limited coverage mapping information (experimental)"))
static CGCXXABI * createCXXABI(CodeGenModule &CGM)
static std::unique_ptr< TargetCodeGenInfo > createTargetCodeGenInfo(CodeGenModule &CGM)
static const llvm::GlobalValue * getAliasedGlobal(const llvm::GlobalValue *GV)
static QualType GeneralizeType(ASTContext &Ctx, QualType Ty, bool GeneralizePointers)
static void initializeX86ABICompatInfo(llvm::abi::X86ABICompatInfo &CompatInfo, const llvm::Triple &T, const LangOptions::ClangABI Compat)
static bool shouldSkipAliasEmission(const CodeGenModule &CGM, const ValueDecl *Global)
static constexpr auto ErrnoTBAAMDName
static unsigned ArgInfoAddressSpace(LangAS AS)
static void replaceDeclarationWith(llvm::GlobalValue *Old, llvm::Constant *New)
static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, llvm::Function *NewFn)
ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we implement a function with...
static std::optional< llvm::GlobalValue::VisibilityTypes > getLLVMVisibility(clang::LangOptions::VisibilityFromDLLStorageClassKinds K)
static bool requiresMemberFunctionPointerTypeMetadata(CodeGenModule &CGM, const CXXMethodDecl *MD)
static bool checkAliasedGlobal(const ASTContext &Context, DiagnosticsEngine &Diags, SourceLocation Location, bool IsIFunc, const llvm::GlobalValue *Alias, const llvm::GlobalValue *&GV, const llvm::MapVector< GlobalDecl, StringRef > &MangledDeclNames, SourceRange AliasRange)
static void EmitGlobalDeclMetadata(CodeGenModule &CGM, llvm::NamedMDNode *&GlobalMetadata, GlobalDecl D, llvm::GlobalValue *Addr)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Result
Implement __builtin_bit_cast and related operations.
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
Defines the clang::Preprocessor interface.
Maps Clang QualType instances to corresponding LLVM ABI type representations.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static const NamedDecl * getDefinition(const Decl *D)
Defines the SourceManager interface.
static CharUnits getTypeAllocSize(CodeGenModule &CGM, llvm::Type *type)
Defines version macros and version-related utility functions for Clang.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
const ProfileList & getProfileList() const
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
const XRayFunctionFilter & getXRayFilter() const
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
StringRef getCUIDHash() const
const LangOptions & getLangOpts() const
SelectorTable & Selectors
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
const NoSanitizeList & getNoSanitizeList() const
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const
Return the alignment in characters that should be given to a global variable with type T.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
DiagnosticsEngine & getDiagnostics() const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
CanQualType getCanonicalTagType(const TagDecl *TD) const
unsigned getTargetAddressSpace(LangAS AS) const
Module * getCurrentNamedModule() const
Get module under construction, nullptr if this is not a C++20 module.
Attr - This represents one attribute.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
This class is used for builtin types like 'int'.
Represents a base class of a C++ class.
CXXTemporary * getTemporary()
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ base or member initializer.
Expr * getInit() const
Get the initializer.
FunctionDecl * getOperatorDelete() const
Represents a C++ destructor within a class.
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Represents a static or instance method of a struct/union/class.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
FunctionDecl * getOperatorNew() const
Represents a C++ struct/union/class.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool hasDefinition() const
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
const CXXDestructorDecl * getDestructor() const
CharUnits - This is an opaque type for sizes expressed in character units.
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits One()
One - Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
std::string MSSecureHotPatchFunctionsFile
The name of a file that contains functions which will be compiled for hotpatching.
std::string RecordCommandLine
The string containing the commandline for the llvm.commandline metadata, if non-empty.
static llvm::ExceptionHandling toExceptionHandling(ExceptionHandlingKind Kind)
Translate a clang ExceptionHandlingKind into the corresponding LLVM ExceptionHandling model.
std::string FloatABI
The ABI to use for passing floating point arguments.
llvm::Reloc::Model RelocationModel
The name of the relocation model to use.
std::vector< std::string > TocDataVarsUserSpecified
List of global variables explicitly specified by the user as toc-data.
std::vector< std::string > MSSecureHotPatchFunctionsList
A list of functions which will be compiled for hotpatching.
ABIInfo - Target specific hooks for defining how a type should be passed or returned from functions.
virtual void appendAttributeMangling(TargetAttr *Attr, raw_ostream &Out) const
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
virtual void handleVarRegistration(const VarDecl *VD, llvm::GlobalVariable &Var)=0
Check whether a variable is a device variable and register it if true.
virtual llvm::GlobalValue * getKernelHandle(llvm::Function *Stub, GlobalDecl GD)=0
Get kernel handle by stub function.
virtual void internalizeDeviceSideVar(const VarDecl *D, llvm::GlobalValue::LinkageTypes &Linkage)=0
Adjust linkage of shadow variables in host compilation.
Implements C++ ABI-specific code generation functions.
virtual void EmitCXXConstructors(const CXXConstructorDecl *D)=0
Emit constructor variants required by this ABI.
virtual llvm::Constant * getAddrOfRTTIDescriptor(QualType Ty)=0
virtual void EmitCXXDestructors(const CXXDestructorDecl *D)=0
Emit destructor variants required by this ABI.
virtual void setCXXDestructorDLLStorage(llvm::GlobalValue *GV, const CXXDestructorDecl *Dtor, CXXDtorType DT) const
virtual llvm::GlobalValue::LinkageTypes getCXXDestructorLinkage(GVALinkage Linkage, const CXXDestructorDecl *Dtor, CXXDtorType DT) const
MangleContext & getMangleContext()
Gets the mangle context.
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
void EmitGlobalAlias(const llvm::GlobalValue *GV, const GlobalDecl Decl)
Emit information about global variable alias.
void EmitExternalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl)
Emit information about an external variable.
void EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc, QualType FnType, llvm::Function *Fn=nullptr)
Emit debug info for a function declaration.
void AddStringLiteralDebugInfo(llvm::GlobalVariable *GV, const StringLiteral *S)
DebugInfo isn't attached to string literals by default.
CGFunctionInfo - Class to encapsulate the information about a function definition.
void handleGlobalVarDefinition(const VarDecl *VD, llvm::GlobalVariable *Var)
void addRootSignature(const HLSLRootSignatureDecl *D)
void addBuffer(const HLSLBufferDecl *D)
llvm::Type * getSamplerType(const Type *T)
void emitDeferredTargetDecls() const
Emit deferred declare target variables marked for deferred emission.
virtual void emitDeclareTargetFunction(const FunctionDecl *FD, llvm::GlobalValue *GV)
Emit code for handling declare target functions in the runtime.
virtual ConstantAddress getAddrOfDeclareTargetVar(const VarDecl *VD)
Returns the address of the variable marked as declare target with link clause OR as declare target wi...
bool hasRequiresUnifiedSharedMemory() const
Return whether the unified_shared_memory has been specified.
virtual void emitDeclareSimdFunction(const FunctionDecl *FD, llvm::Function *Fn)
Marks function Fn with properly mangled versions of vector functions.
virtual void registerTargetGlobalVariable(const VarDecl *VD, llvm::Constant *Addr)
Checks if the provided global decl GD is a declare target variable and registers it when emitting cod...
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)
void EmitCfiCheckFail()
Emit a cross-DSO CFI failure handling function.
void GenerateObjCGetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCGetter - Synthesize an Objective-C property getter function.
void EmitCfiCheckStub()
Emit a stub for the cross-DSO CFI check function.
void GenerateObjCMethod(const ObjCMethodDecl *OMD)
Generate an Objective-C method.
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
void GenerateObjCSetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCSetter - Synthesize an Objective-C property setter function for the given property.
llvm::LLVMContext & getLLVMContext()
bool isTrivialInitializer(const Expr *Init)
Determine whether the given initializer is trivial in the sense that it requires no code to be genera...
This class organizes the cross-function state that is used while generating LLVM code.
StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD)
ConstantAddress GetAddrOfMSGuidDecl(const MSGuidDecl *GD)
Get the address of a GUID.
void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const
Set visibility, dllimport/dllexport and dso_local.
void AddVTableTypeMetadata(llvm::GlobalVariable *VTable, CharUnits Offset, const CXXRecordDecl *RD)
Create and attach type metadata for the given vtable.
void UpdateCompletedType(const TagDecl *TD)
llvm::MDNode * getTBAAAccessTagInfo(TBAAAccessInfo Info)
getTBAAAccessTagInfo - Get TBAA tag for a given memory access.
llvm::GlobalVariable::ThreadLocalMode GetDefaultLLVMTLSModel() const
Get LLVM TLS mode from CodeGenOptions.
void SetInternalFunctionAttributes(GlobalDecl GD, llvm::Function *F, const CGFunctionInfo &FI)
Set the attributes on the LLVM function for the given decl and function info.
void setDSOLocal(llvm::GlobalValue *GV) const
llvm::MDNode * getTBAAStructInfo(QualType QTy)
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
llvm::Constant * EmitAnnotationArgs(const AnnotateAttr *Attr)
Emit additional args of the annotation.
llvm::Module & getModule() const
std::optional< llvm::Attribute::AttrKind > StackProtectorAttribute(const Decl *D) const
llvm::GlobalValue * getPFPDeactivationSymbol(const FieldDecl *FD)
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
llvm::ConstantInt * CreateKCFITypeId(QualType T, StringRef Salt)
Generate a KCFI type identifier for T.
CGDebugInfo * getModuleDebugInfo()
llvm::Constant * performAddrSpaceCast(llvm::Constant *Src, llvm::Type *DestTy)
bool NeedAllVtablesTypeId() const
Returns whether this module needs the "all-vtables" type identifier.
void addCompilerUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.compiler.used metadata.
CodeGenVTables & getVTables()
llvm::ConstantInt * CreateCrossDsoCfiTypeId(llvm::Metadata *MD)
Generate a cross-DSO type identifier for MD.
CharUnits GetTargetTypeStoreSize(llvm::Type *Ty) const
Return the store size, in character units, of the given LLVM type.
void createFunctionTypeMetadataForIcall(const FunctionDecl *FD, llvm::Function *F)
Create and attach type metadata to the given function.
bool getExpressionLocationsEnabled() const
Return true if we should emit location information for expressions.
llvm::Metadata * CreateMetadataIdentifierForCallGraphType(QualType T)
Create a metadata identifier for the Call Graph Section.
void addGlobalValReplacement(llvm::GlobalValue *GV, llvm::Constant *C)
bool classNeedsVectorDestructor(const CXXRecordDecl *RD)
Check that class need vector deleting destructor body.
llvm::Constant * GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH=false)
Get the address of the RTTI descriptor for the given type.
llvm::Constant * GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty=nullptr, bool ForVTable=false, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the given function.
void setGVPropertiesAux(llvm::GlobalValue *GV, const NamedDecl *D) const
const IntrusiveRefCntPtr< llvm::vfs::FileSystem > & getFileSystem() const
const ABIInfo & getABIInfo()
void EmitMainVoidAlias()
Emit an alias for "main" if it has no arguments (needed for wasm).
void DecorateInstructionWithInvariantGroup(llvm::Instruction *I, const CXXRecordDecl *RD)
Adds !invariant.barrier !tag to instruction.
llvm::Constant * getOrCreateMSVCGlobalDeleteWrapper(const FunctionDecl *GlobOD)
Get or create the MSVC-compatible __global_delete wrapper for the given global operator delete,...
DiagnosticsEngine & getDiags() const
bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn, SourceLocation Loc) const
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
llvm::Constant * getAddrOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the constructor/destructor of the given type.
void ErrorUnsupported(const Stmt *S, const char *Type)
Print out an error that codegen doesn't support the specified stmt yet.
llvm::Constant * EmitAnnotateAttr(llvm::GlobalValue *GV, const AnnotateAttr *AA, SourceLocation L)
Generate the llvm::ConstantStruct which contains the annotation information for a given GlobalValue.
void EmitOpenACCDeclare(const OpenACCDeclareDecl *D, CodeGenFunction *CGF=nullptr)
llvm::GlobalValue::LinkageTypes getLLVMLinkageForDeclarator(const DeclaratorDecl *D, GVALinkage Linkage)
Returns LLVM linkage for a declarator.
TBAAAccessInfo mergeTBAAInfoForMemoryTransfer(TBAAAccessInfo DestInfo, TBAAAccessInfo SrcInfo)
mergeTBAAInfoForMemoryTransfer - Get merged TBAA information for the purposes of memory transfer call...
const LangOptions & getLangOpts() const
CGCUDARuntime & getCUDARuntime()
Return a reference to the configured CUDA runtime.
llvm::Constant * EmitAnnotationLineNo(SourceLocation L)
Emit the annotation line number.
QualType getObjCFastEnumerationStateType()
Retrieve the record type that describes the state of an Objective-C fast enumeration loop (for....
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CodeGenTypes & getTypes()
bool shouldMapVisibilityToDLLExport(const NamedDecl *D) const
CGOpenCLRuntime & getOpenCLRuntime()
Return a reference to the configured OpenCL runtime.
const std::string & getModuleNameHash() const
const TargetInfo & getTarget() const
bool shouldEmitRTTI(bool ForEH=false)
void EmitGlobal(GlobalDecl D)
Emit code for a single global function or var decl.
llvm::Metadata * CreateMetadataIdentifierForType(QualType T)
Create a metadata identifier for the given type.
void addUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.used metadata.
void createIndirectFunctionTypeMD(const FunctionDecl *FD, llvm::Function *F)
Create and attach callgraph metadata if the function is a potential indirect call target to support c...
void AppendLinkerOptions(StringRef Opts)
Appends Opts to the "llvm.linker.options" metadata value.
void createCalleeTypeMetadataForIcall(const QualType &QT, llvm::CallBase *CB)
Create and attach callee_type metadata to the given call.
bool tryEmitCUDADeviceInvalidFunctionBody(GlobalDecl GD, llvm::Function *Fn)
Emit a trap stub body for functions in ASTContext::CUDADeviceInvalidFuncs.
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
QualType GetCallGraphPromotedType(QualType Ty) const
Applies C default argument promotions to a parameter type for Call Graph Section type reconstruction.
void Error(SourceLocation loc, StringRef error)
Emit a general error that something can't be done.
void requireVectorDestructorDefinition(const CXXRecordDecl *RD)
Record that new[] was called for the class, transform vector deleting destructor definition in a form...
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.
std::string getPFPFieldName(const FieldDecl *FD)
llvm::Constant * GetFunctionStart(const ValueDecl *Decl)
void addPendingGlobalDelete(llvm::GlobalAlias *GlobalDeleteAlias, const FunctionDecl *OperatorDeleteFD)
Record a pending __global_delete variant that may need a forwarding body.
static llvm::GlobalValue::VisibilityTypes GetLLVMVisibility(Visibility V)
void EmitTentativeDefinition(const VarDecl *D)
void EmitDeferredUnusedCoverageMappings()
Emit all the deferred coverage mappings for the uninstrumented functions.
void addUsedOrCompilerUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.compiler.used metadata.
CGOpenMPRuntime & getOpenMPRuntime()
Return a reference to the configured OpenMP runtime.
bool imbueXRayAttrs(llvm::Function *Fn, SourceLocation Loc, StringRef Category=StringRef()) const
Imbue XRay attributes to a function, applying the always/never attribute lists in the process.
SanitizerMetadata * getSanitizerMetadata()
llvm::Metadata * CreateMetadataIdentifierGeneralized(QualType T)
Create a metadata identifier for the generalization of the given type.
void EmitGlobalAnnotations()
Emit all the global annotations.
CharUnits getClassPointerAlignment(const CXXRecordDecl *CD)
Returns the assumed alignment of an opaque pointer to the given class.
const llvm::Triple & getTriple() const
SmallVector< const CXXRecordDecl *, 0 > getMostBaseClasses(const CXXRecordDecl *RD)
Return a vector of most-base classes for RD.
void AddDeferredUnusedCoverageMapping(Decl *D)
Stored a deferred empty coverage mapping for an unused and thus uninstrumented top level declaration.
void MaybeHandleStaticInExternC(const SomeDecl *D, llvm::GlobalValue *GV)
If the declaration has internal linkage but is inside an extern "C" linkage specification,...
void DecorateInstructionWithTBAA(llvm::Instruction *Inst, TBAAAccessInfo TBAAInfo)
DecorateInstructionWithTBAA - Decorate the instruction with a TBAA tag.
llvm::GlobalVariable::LinkageTypes getFunctionLinkage(GlobalDecl GD)
void AddGlobalDtor(llvm::Function *Dtor, int Priority=65535, bool IsDtorAttrFunc=false)
AddGlobalDtor - Add a function to the list that will be called when the module is unloaded.
llvm::Constant * CreateRuntimeVariable(llvm::Type *Ty, StringRef Name)
Create a new runtime global variable with the specified type and name.
void ConstructAttributeList(StringRef Name, const CGFunctionInfo &Info, CGCalleeInfo CalleeInfo, llvm::AttributeList &Attrs, unsigned &CallingConv, bool AttrOnCallSite, bool IsThunk)
Get the LLVM attributes and calling convention to use for a particular function type.
llvm::Constant * GetOrCreateLLVMGlobal(StringRef MangledName, llvm::Type *Ty, LangAS AddrSpace, const VarDecl *D, ForDefinition_t IsForDefinition=NotForDefinition)
GetOrCreateLLVMGlobal - If the specified mangled name is not in the module, create and return an llvm...
const llvm::abi::TargetInfo & getLLVMABITargetInfo(llvm::abi::TypeBuilder &TB)
Lazily build and return the LLVMABI library's TargetInfo for the current target.
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)
void noteDirectGlobalDelete()
Note that global operator delete is directly used in this TU.
llvm::Constant * GetAddrOfGlobal(GlobalDecl GD, ForDefinition_t IsForDefinition=NotForDefinition)
AtomicOptions getAtomicOpts()
Get the current Atomic options.
ConstantAddress GetAddrOfConstantCFString(const StringLiteral *Literal)
Return a pointer to a constant CFString object for the given string.
ProfileList::ExclusionType isFunctionBlockedFromProfileInstr(llvm::Function *Fn, SourceLocation Loc) const
void AddGlobalAnnotations(const ValueDecl *D, llvm::GlobalValue *GV)
Add global annotations that are set on D, for the global GV.
void setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const
Set the TLS mode for the given LLVM GlobalValue for the thread-local variable declaration D.
ConstantAddress GetAddrOfConstantStringFromLiteral(const StringLiteral *S, StringRef Name=".str")
Return a pointer to a constant array for the given string literal.
ASTContext & getContext() const
ConstantAddress GetAddrOfTemplateParamObject(const TemplateParamObjectDecl *TPO)
Get the address of a template parameter object.
void EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D)
Emit a code for threadprivate directive.
ConstantAddress GetAddrOfUnnamedGlobalConstantDecl(const UnnamedGlobalConstantDecl *GCD)
Get the address of a UnnamedGlobalConstant.
TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, TBAAAccessInfo TargetInfo)
mergeTBAAInfoForCast - Get merged TBAA information for the purposes of type casts.
llvm::Constant * GetAddrOfGlobalVar(const VarDecl *D, llvm::Type *Ty=nullptr, ForDefinition_t IsForDefinition=NotForDefinition)
Return the llvm::Constant for the address of the given global variable.
QualType ReconstructCallGraphPrototype(const FunctionNoProtoType *FNPT, ArrayRef< QualType > ParamTypes) const
Reconstructs a FunctionProtoType for an unprototyped function type (FunctionNoProtoType) using the gi...
llvm::SanitizerStatReport & getSanStats()
llvm::Constant * EmitAnnotationString(StringRef Str)
Emit an annotation string.
void EmitOMPDeclareMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare mapper construct.
bool supportsCOMDAT() const
void RefreshTypeCacheForClass(const CXXRecordDecl *Class)
llvm::MDNode * getTBAATypeInfo(QualType QTy)
getTBAATypeInfo - Get metadata used to describe accesses to objects of the given type.
void EmitOMPRequiresDecl(const OMPRequiresDecl *D)
Emit a code for requires directive.
void HandleCXXStaticMemberVarInstantiation(VarDecl *VD)
Tell the consumer that this variable has been instantiated.
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
llvm::Constant * GetConstantArrayFromStringLiteral(const StringLiteral *E)
Return a constant array for the given string.
void SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV)
Set attributes which are common to any form of a global definition (alias, Objective-C method,...
std::optional< CharUnits > getOMPAllocateAlignment(const VarDecl *VD)
Return the alignment specified in an allocate directive, if present.
llvm::GlobalVariable * CreateOrReplaceCXXRuntimeVariable(StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes Linkage, llvm::Align Alignment)
Will return a global variable of the given type.
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
TBAAAccessInfo mergeTBAAInfoForConditionalOperator(TBAAAccessInfo InfoA, TBAAAccessInfo InfoB)
mergeTBAAInfoForConditionalOperator - Get merged TBAA information for the purposes of conditional ope...
llvm::LLVMContext & getLLVMContext()
llvm::GlobalValue * GetGlobalValue(StringRef Ref)
void GenKernelArgMetadata(llvm::Function *FN, const FunctionDecl *FD=nullptr, CodeGenFunction *CGF=nullptr)
OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument information in the program executab...
void setKCFIType(const FunctionDecl *FD, llvm::Function *F)
Set type metadata to the given function.
void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO)
void EmitOMPDeclareReduction(const OMPDeclareReductionDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare reduction construct.
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
void AddDetectMismatch(StringRef Name, StringRef Value)
Appends a detect mismatch command to the linker options.
void setDLLImportDLLExport(llvm::GlobalValue *GV, GlobalDecl D) const
llvm::Value * createOpenCLIntToSamplerConversion(const Expr *E, CodeGenFunction &CGF)
ConstantAddress GetAddrOfGlobalTemporary(const MaterializeTemporaryExpr *E, const Expr *Inner)
Returns a pointer to a global variable representing a temporary with static or thread storage duratio...
llvm::Constant * EmitNullConstant(QualType T)
Return the result of value-initializing the given type, i.e.
LangAS GetGlobalConstantAddressSpace() const
Return the AST address space of constant literal, which is used to emit the constant literal as globa...
LangAS GetGlobalVarAddressSpace(const VarDecl *D)
Return the AST address space of the underlying global variable for D, as determined by its declaratio...
void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, llvm::Function *F, bool IsThunk)
Set the LLVM function attributes (sext, zext, etc).
void EmitOpenACCRoutine(const OpenACCRoutineDecl *D, CodeGenFunction *CGF=nullptr)
void emitGlobalDeleteForwardingBodies()
Emit __global_delete forwarding bodies for any pending variants, if this TU directly uses global oper...
void addReplacement(StringRef Name, llvm::Constant *C)
void AddGlobalCtor(llvm::Function *Ctor, int Priority=65535, unsigned LexOrder=~0U, llvm::Constant *AssociatedData=nullptr)
AddGlobalCtor - Add a function to the list that will be called before main() runs.
llvm::Metadata * CreateMetadataIdentifierForFnType(QualType T)
Create a metadata identifier for the given function type.
void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F)
Set the LLVM function attributes which only apply to a function definition.
llvm::Metadata * CreateMetadataIdentifierForVirtualMemPtrType(QualType T)
Create a metadata identifier that is intended to be used to check virtual calls via a member function...
bool shouldUseLLVMABILowering(unsigned CallingConv) const
True when -fexperimental-abi-lowering is in effect AND the active target has an LLVMABI implementatio...
ConstantAddress GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *)
Return a pointer to a constant array for the given ObjCEncodeExpr node.
const GlobalDecl getMangledNameDecl(StringRef)
void ClearUnusedCoverageMapping(const Decl *D)
Remove the deferred empty coverage mapping as this declaration is actually instrumented.
void EmitTopLevelDecl(Decl *D)
Emit code for a single top level declaration.
llvm::Constant * EmitAnnotationUnit(SourceLocation Loc)
Emit the annotation's translation unit.
ConstantAddress GetAddrOfConstantCString(const std::string &Str, StringRef GlobalName=".str")
Returns a pointer to a character array containing the literal and a terminating '\0' character.
void printPostfixForExternalizedDecl(llvm::raw_ostream &OS, const Decl *D) const
Print the postfix for externalized static variable or kernels for single source offloading languages ...
void moveLazyEmissionStates(CodeGenModule *NewBuilder)
Move some lazily-emitted states to the NewBuilder.
llvm::ConstantInt * getSize(CharUnits numChars)
Emit the given number of characters as a value of type size_t.
void finalizeKCFITypes()
Emit KCFI type identifier constants and remove unused identifiers.
void setValueProfilingFlag(llvm::Module &M)
void setProfileVersion(llvm::Module &M)
void emitEmptyCounterMapping(const Decl *D, StringRef FuncName, llvm::GlobalValue::LinkageTypes Linkage)
Emit a coverage mapping range with a counter zero for an unused declaration.
CodeGenTBAA - This class organizes the cross-module state that is used while lowering AST types to LL...
This class organizes the cross-module state that is used while lowering AST types to LLVM types.
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
const CGFunctionInfo & arrangeCXXMethodDeclaration(const CXXMethodDecl *MD)
C++ methods have some special rules and also have implicit parameters.
const CGFunctionInfo & arrangeFreeFunctionType(CanQual< FunctionProtoType > Ty)
Arrange the argument and result information for a value of the given freestanding function type.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
const CGFunctionInfo & arrangeBuiltinFunctionDeclaration(QualType resultType, const FunctionArgList &args)
A builtin function is a freestanding function using the default C conventions.
unsigned getTargetAddressSpace(QualType T) const
void RefreshTypeCacheForClass(const CXXRecordDecl *RD)
Remove stale types from the type cache when an inheritance model gets assigned to a class.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
void UpdateCompletedType(const TagDecl *TD)
UpdateCompletedType - When we find the full definition for a TagDecl, replace the 'opaque' type we pr...
const CGFunctionInfo & arrangeGlobalDeclaration(GlobalDecl GD)
void EmitThunks(GlobalDecl GD)
EmitThunks - Emit the associated thunks for the given global decl.
A specialization of Address that requires the address to be an LLVM Constant.
static ConstantAddress invalid()
llvm::Constant * tryEmitForInitializer(const VarDecl &D)
Try to emit the initiaizer of the given declaration as an abstract constant.
void finalize(llvm::GlobalVariable *global)
llvm::Constant * emitAbstract(const Expr *E, QualType T)
Emit the result of the given expression as an abstract constant, asserting that it succeeded.
The standard implementation of ConstantInitBuilder used in Clang.
Organizes the cross-function state that is used while generating code coverage mapping data.
bool hasDiagnostics()
Whether or not the stats we've gathered indicate any potential problems.
void reportDiagnostics(DiagnosticsEngine &Diags, StringRef MainFile)
Report potential problems we've found to Diags.
TargetCodeGenInfo - This class organizes various target-specific codegeneration issues,...
virtual void getDependentLibraryOption(llvm::StringRef Lib, llvm::SmallString< 24 > &Opt) const
Gets the linker options necessary to link a dependent library on this platform.
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 void emitTargetMetadata(CodeGen::CodeGenModule &CGM, const llvm::MapVector< GlobalDecl, StringRef > &MangledDeclNames) const
emitTargetMetadata - Provides a convenient hook to handle extra target-specific metadata for the give...
virtual void emitTargetGlobals(CodeGen::CodeGenModule &CGM) const
Provides a convenient hook to handle extra target-specific globals.
virtual void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value, llvm::SmallString< 32 > &Opt) const
Gets the linker options necessary to detect object file mismatches on this platform.
Represents the canonical version of C arrays with a specified constant size.
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Stores additional source code information like skipped ranges which is required by the coverage mappi...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
void addDecl(Decl *D)
Add the declaration D into this context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Decl - This represents one declaration (or definition), e.g.
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
SourceLocation getEndLoc() const LLVM_READONLY
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
SourceLocation getBeginLoc() const LLVM_READONLY
TranslationUnitDecl * getTranslationUnitDecl()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Represents a ValueDecl that came out of a declarator.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
This represents one expression.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Represents a member of a struct/union/class.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
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
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
bool isImmediateFunction() const
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
ArrayRef< ParmVarDecl * > parameters() const
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions:
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isTargetVersionMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-version functiona...
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool doesDeclarationForceExternallyVisibleDefinition() const
For a function declaration in C or C++, determine whether this declaration causes the definition to b...
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
bool isImplicitHDExplicitInstantiation() const
True if both host and device are implicit attributes and this is (or is a member of) an explicit temp...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() 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.
@ 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.
@ Single
Single Threaded Environment.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
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.
ClangABI
Clang versions with different platform ABI conformance.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
std::string CUID
The user provided compilation unit ID, if non-empty.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
Visibility getVisibility() const
void setLinkage(Linkage L)
Linkage getLinkage() const
bool isVisibilityExplicit() const
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
Parts getParts() const
Get the decomposed parts of this declaration.
APValue & getAsAPValue() const
Get the value of this MSGuidDecl as an APValue.
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
void mangleBlock(const DeclContext *DC, const BlockDecl *BD, raw_ostream &Out)
void mangleCtorBlock(const CXXConstructorDecl *CD, CXXCtorType CT, const BlockDecl *BD, raw_ostream &Out)
void mangleGlobalBlock(const BlockDecl *BD, const NamedDecl *ID, raw_ostream &Out)
bool isTriviallyRecursive(const FunctionDecl *FD)
Return true if FD's body contains a direct call back to the symbol it links as, through an asm label ...
bool shouldMangleDeclName(const NamedDecl *D)
void mangleName(GlobalDecl GD, raw_ostream &)
virtual void mangleCanonicalTypeName(QualType T, raw_ostream &, bool NormalizeIntegers=false)=0
Generates a unique string for an externally visible type for use with TBAA or type uniquing.
virtual void mangleStringLiteral(const StringLiteral *SL, raw_ostream &)=0
ManglerKind getKind() const
virtual void needsUniqueInternalLinkageNames()
virtual void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, raw_ostream &)=0
void mangleDtorBlock(const CXXDestructorDecl *CD, CXXDtorType DT, const BlockDecl *BD, raw_ostream &Out)
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
APValue * getOrCreateValue(bool MayCreate) const
Get the storage for the constant value of a materialized temporary of static storage duration.
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
unsigned getManglingNumber() const
Describes a module or submodule.
bool isInterfaceOrPartition() const
bool isNamedModuleUnit() const
Is this a C++20 named module unit.
Module * Parent
The parent of this module.
Module * getPrivateModuleFragment() const
Get the Private Module Fragment (sub-module) for this module, it there is one.
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.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
bool UseExportAsModuleLinkName
Autolinking uses the framework name for linking purposes when this is false and the export_as name ot...
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
bool isExternallyVisible() const
Represent a C++ namespace.
This represents 'pragma omp threadprivate ...' directive.
ObjCEncodeExpr, used for @encode in Objective-C.
QualType getEncodedType() const
propimpl_range property_impls() const
const ObjCInterfaceDecl * getClassInterface() const
void addInstanceMethod(ObjCMethodDecl *method)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
init_iterator init_end()
init_end() - Retrieve an iterator past the last initializer.
CXXCtorInitializer ** init_iterator
init_iterator - Iterates through the ivar initializer list.
init_iterator init_begin()
init_begin() - Retrieve an iterator to the first initializer.
unsigned getNumIvarInitializers() const
getNumArgs - Number of ivars which must be initialized.
void setHasDestructors(bool val)
void setHasNonZeroConstructors(bool val)
Represents an ObjC class declaration.
ObjCIvarDecl * all_declared_ivar_begin()
all_declared_ivar_begin - return first ivar declared in this class, its extensions and its implementa...
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarDecl * getNextIvar()
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
Represents one property declaration in an Objective-C interface.
ObjCMethodDecl * getGetterMethodDecl() const
bool isReadOnly() const
isReadOnly - Return true iff the property has a setter.
The basic abstraction for the target Objective-C runtime.
@ 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.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
static void processPathForFileMacro(SmallVectorImpl< char > &Path, const LangOptions &LangOpts, const TargetInfo &TI)
Represents an unpacked "presumed" location which can be presented to the user.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
ExclusionType getDefault(llvm::driver::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFunctionExcluded(StringRef FunctionName, llvm::driver::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFileExcluded(StringRef FileName, llvm::driver::ProfileInstrKind Kind) const
ExclusionType
Represents if an how something should be excluded from profiling.
@ Skip
Profiling is skipped using the skipprofile attribute.
@ Allow
Profiling is allowed.
std::optional< ExclusionType > isLocationExcluded(SourceLocation Loc, llvm::driver::ProfileInstrKind Kind) const
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool isConstant(const ASTContext &Ctx) const
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType withCVRQualifiers(unsigned CVR) const
bool isConstQualified() const
Determine whether this type is const-qualified.
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Represents a struct/union/class.
field_range fields() const
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinitionOrSelf() const
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
DiagnosticsEngine & getDiagnostics() const
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
unsigned getExpansionLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
StringRef getBufferName(SourceLocation Loc, bool *Invalid=nullptr) const
Return the filename or buffer identifier of the buffer the location is in.
FileID getMainFileID() const
Returns the FileID of the main source file.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
unsigned getLength() const
uint32_t getCodeUnit(size_t I) const
Return the code unit at the given position.
StringRef getString() const
unsigned getCharByteWidth() const
Represents the declaration of a struct/union/class/enum.
void startDefinition()
Starts the definition of this tag declaration.
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.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
virtual llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const
bool supportsIFunc() const
Identify whether this target supports IFuncs.
const llvm::fltSemantics & getLongDoubleFormat() const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
virtual StringRef getABI() const
Get the ABI currently in use.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
Options for controlling the target.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
AMDGPUFeatureState AMDGPUSramEccState
AMDGPU sramecc setting from -msramecc/-mno-sramecc.
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.
AMDGPUFeatureState AMDGPUXnackState
AMDGPU xnack setting from -mxnack/-mno-xnack.
@ Enabled
Feature explicitly enabled.
@ Any
Feature state not specified and should generate most compatible code.
@ Hostcall
printf lowering scheme involving hostcalls, currently used by HIP programs by default
A template parameter object.
const APValue & getValue() const
A declaration that models statements at global scope.
The top declaration context.
static DeclContext * castToDeclContext(const TranslationUnitDecl *D)
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isAMDGPUNamedBarrierTypeOrWrapper() const
Check if the type is the AMDGPU named barrier type/a RecordType of a named barrier wrapper,...
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool isHLSLResourceRecord() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isObjCObjectPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
bool isHLSLResourceRecordArray() const
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
const APValue & getValue() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Defines the clang::TargetInfo interface.
bool hasUnwindExceptions(const LangOptions &LangOpts)
Determines whether the language options require us to model unwind exceptions.
std::unique_ptr< TargetCodeGenInfo > createARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createM68kTargetCodeGenInfo(CodeGenModule &CGM)
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
std::unique_ptr< TargetCodeGenInfo > createBPFTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createMSP430TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createWebAssemblyTargetCodeGenInfo(CodeGenModule &CGM, WebAssemblyABIKind K)
std::unique_ptr< TargetCodeGenInfo > createPPC64_SVR4_TargetCodeGenInfo(CodeGenModule &CGM, PPC64_SVR4_ABIKind Kind, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createHexagonTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createNVPTXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createSystemZTargetCodeGenInfo(CodeGenModule &CGM, bool HasVector, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createWinX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters)
std::unique_ptr< TargetCodeGenInfo > createAIXTargetCodeGenInfo(CodeGenModule &CGM, bool Is64Bit)
std::unique_ptr< TargetCodeGenInfo > createAMDGPUTargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateMacObjCRuntime(CodeGenModule &CGM)
X86AVXABILevel
The AVX ABI level for X86 targets.
std::unique_ptr< TargetCodeGenInfo > createTCETargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateGNUObjCRuntime(CodeGenModule &CGM)
Creates an instance of an Objective-C runtime class.
std::unique_ptr< TargetCodeGenInfo > createWindowsARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind K)
std::unique_ptr< TargetCodeGenInfo > createAVRTargetCodeGenInfo(CodeGenModule &CGM, unsigned NPR, unsigned NRR)
std::unique_ptr< TargetCodeGenInfo > createDirectXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createARCTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createDefaultTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createSPIRVTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createSparcV8TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createVETargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCommonSPIRTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createRISCVTargetCodeGenInfo(CodeGenModule &CGM, unsigned XLen, unsigned FLen, bool EABI)
std::unique_ptr< TargetCodeGenInfo > createWindowsAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind K)
std::unique_ptr< TargetCodeGenInfo > createSparcV9TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createLanaiTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createPPC32TargetCodeGenInfo(CodeGenModule &CGM, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createSystemZ_ZOS_TargetCodeGenInfo(CodeGenModule &CGM, bool HasVector, bool SoftFloatABI)
CGCUDARuntime * CreateNVCUDARuntime(CodeGenModule &CGM)
Creates an instance of a CUDA runtime class.
std::unique_ptr< TargetCodeGenInfo > createLoongArchTargetCodeGenInfo(CodeGenModule &CGM, unsigned GRLen, unsigned FLen)
std::unique_ptr< TargetCodeGenInfo > createPPC64TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWinX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createXCoreTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCSKYTargetCodeGenInfo(CodeGenModule &CGM, unsigned FLen)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
constexpr bool isInitializedByPipeline(LangAS AS)
bool LT(InterpState &S, CodePtr OpPC)
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
@ Ctor_Base
Base object ctor.
@ Ctor_Complete
Complete object ctor.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
std::string getClangVendor()
Retrieves the Clang vendor tag.
@ ICIS_NoInit
No in-class initializer.
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
const FunctionProtoType * T
StringRef languageToString(Language L)
@ Dtor_VectorDeleting
Vector deleting dtor.
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object dtor.
@ Dtor_Deleting
Deleting dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, llvm::vfs::FileSystem &VFS, DiagnosticsEngine &Diags)
static const char * getCFBranchLabelSchemeFlagVal(const CFBranchLabelSchemeKind Scheme)
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
bool isExternallyVisible(Linkage L)
@ EST_None
no exception specification
std::string getClangFullVersion()
Retrieves a string representing the complete clang version, which includes the clang version number,...
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
cl::opt< bool > SystemHeadersCoverage
int const char * function
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
std::optional< StringRef > Architecture
llvm::SmallVector< StringRef, 8 > Features
llvm::CallingConv::ID RuntimeCC
llvm::PointerType * VoidPtrTy
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
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
llvm::PointerType * ProgramPtrTy
Pointer in program address space.
unsigned char PointerAlignInBytes
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
llvm::PointerType * AllocaInt8PtrTy
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool hasSideEffects() const
Return true if the evaluated expression has side effects.
Extra information about a function prototype.
static const LangStandard & getLangStandardForKind(Kind K)
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
A library or framework to link against when an entity from this module is used.
Describes how types, statements, expressions, and declarations should be printed.