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;
436 Opts.IsMachO =
T.isOSBinFormatMachO();
437 Opts.IsAndroidOrOHOS =
T.isAndroid() ||
T.isOHOSFamily();
438 Opts.IsWindowsArm64EC =
T.isWindowsArm64EC();
444 TheLLVMABITargetInfo = llvm::abi::createAArch64TargetInfo(TB, Opts);
445 return *TheLLVMABITargetInfo;
448 case llvm::Triple::bpfeb:
449 case llvm::Triple::bpfel:
451 TheLLVMABITargetInfo = llvm::abi::createBPFTargetInfo(TB);
452 return *TheLLVMABITargetInfo;
454 case llvm::Triple::x86_64: {
456 llvm::abi::X86AVXABILevel AVXLevel =
457 ABI ==
"avx512" ? llvm::abi::X86AVXABILevel::AVX512
458 : ABI ==
"avx" ? llvm::abi::X86AVXABILevel::AVX
459 : llvm::abi::X86AVXABILevel::None;
461 llvm::abi::X86ABICompatInfo CompatInfo;
467 TheLLVMABITargetInfo = llvm::abi::createX86_64TargetInfo(
468 TB, AVXLevel, Has64BitPointers, CompatInfo);
469 return *TheLLVMABITargetInfo;
475 llvm::LLVMContext &Context,
479 if (Opts.AlignDouble || Opts.OpenCL)
482 llvm::Triple Triple =
Target.getTriple();
483 llvm::DataLayout DL(
Target.getDataLayoutString());
484 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
485 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
486 llvm::Align ClangAlign(Alignment / 8);
487 if (DLAlign != ClangAlign) {
488 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
489 <<
" mapping to " << *Ty <<
" has data layout alignment "
490 << DLAlign.value() <<
" while clang specifies "
491 << ClangAlign.value() <<
"\n";
496 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
498 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
500 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
502 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
505 if (Triple.getArch() != llvm::Triple::m68k)
506 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
509 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
510 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
511 Triple.getArch() != llvm::Triple::ve)
512 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
514 if (
Target.hasFloat16Type())
515 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
517 if (
Target.hasBFloat16Type())
518 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
519 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
521 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
524 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
526 if (
Target.hasFloat128Type())
527 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
528 if (
Target.hasIbm128Type())
529 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
531 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
533 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
534 llvm::errs() <<
"Datalayout for target " << Triple.str()
535 <<
" sets element-aligned vectors to '"
536 <<
Target.vectorsAreElementAligned()
537 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
551 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
552 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
554 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
558 AbiMapper = std::make_unique<QualTypeMapper>(
C, M.getDataLayout(), AbiAlloc);
559 AbiReverseMapper = std::make_unique<llvm::abi::IRTypeMapper>(
560 M.getContext(), M.getDataLayout());
564 llvm::LLVMContext &LLVMContext = M.getContext();
565 VoidTy = llvm::Type::getVoidTy(LLVMContext);
566 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
567 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
568 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
569 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
570 HalfTy = llvm::Type::getHalfTy(LLVMContext);
571 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
572 FloatTy = llvm::Type::getFloatTy(LLVMContext);
573 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
579 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
581 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
583 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
584 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
585 IntPtrTy = llvm::IntegerType::get(LLVMContext,
586 C.getTargetInfo().getMaxPointerWidth());
587 Int8PtrTy = llvm::PointerType::get(LLVMContext,
589 const llvm::DataLayout &DL = M.getDataLayout();
591 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
593 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
595 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
611 createOpenCLRuntime();
613 createOpenMPRuntime();
620 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
621 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
627 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
628 CodeGenOpts.CoverageNotesFile.size() ||
629 CodeGenOpts.CoverageDataFile.size())
637 Block.GlobalUniqueCount = 0;
639 if (
C.getLangOpts().ObjC)
642 if (CodeGenOpts.hasProfileClangUse()) {
643 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
644 CodeGenOpts.ProfileInstrumentUsePath, *FS,
645 CodeGenOpts.ProfileRemappingFile);
646 if (
auto E = ReaderOrErr.takeError()) {
647 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
648 Diags.Report(diag::err_reading_profile)
649 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
653 PGOReader = std::move(ReaderOrErr.get());
658 if (CodeGenOpts.CoverageMapping)
662 if (CodeGenOpts.UniqueInternalLinkageNames &&
663 !
getModule().getSourceFileName().empty()) {
667 Context.getTargetInfo());
668 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
672 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
673 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
674 CodeGenOpts.NumRegisterParameters);
683 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
684 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
686 this->MSHotPatchFunctions.push_back(std::string{*I});
688 auto &DE = Context.getDiagnostics();
689 DE.Report(diag::err_open_hotpatch_file_failed)
691 << BufOrErr.getError().message();
696 this->MSHotPatchFunctions.push_back(FuncName);
698 llvm::sort(this->MSHotPatchFunctions);
701 if (!Context.getAuxTargetInfo())
707void CodeGenModule::createObjCRuntime() {
724 llvm_unreachable(
"bad runtime kind");
727void CodeGenModule::createOpenCLRuntime() {
731void CodeGenModule::createOpenMPRuntime() {
732 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
733 Diags.Report(diag::err_omp_host_ir_file_not_found)
734 << LangOpts.OMPHostIRFile;
739 case llvm::Triple::nvptx:
740 case llvm::Triple::nvptx64:
741 case llvm::Triple::amdgpu:
742 case llvm::Triple::spirv64:
745 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
746 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
749 if (LangOpts.OpenMPSimd)
750 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
752 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
757void CodeGenModule::createCUDARuntime() {
761void CodeGenModule::createHLSLRuntime() {
762 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
766 Replacements[Name] =
C;
769void CodeGenModule::applyReplacements() {
770 for (
auto &I : Replacements) {
771 StringRef MangledName = I.first;
772 llvm::Constant *Replacement = I.second;
777 auto *NewF = dyn_cast<llvm::Function>(Replacement);
779 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
780 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
783 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
784 CE->getOpcode() == llvm::Instruction::GetElementPtr);
785 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
790 OldF->replaceAllUsesWith(Replacement);
792 NewF->removeFromParent();
793 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
796 OldF->eraseFromParent();
801 GlobalValReplacements.push_back(std::make_pair(GV,
C));
804void CodeGenModule::applyGlobalValReplacements() {
805 for (
auto &I : GlobalValReplacements) {
806 llvm::GlobalValue *GV = I.first;
807 llvm::Constant *
C = I.second;
809 GV->replaceAllUsesWith(
C);
810 GV->eraseFromParent();
817 const llvm::Constant *
C;
818 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
819 C = GA->getAliasee();
820 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
821 C = GI->getResolver();
825 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
829 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
838 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
839 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
843 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
847 if (GV->hasCommonLinkage()) {
848 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
849 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
850 Diags.
Report(Location, diag::err_alias_to_common);
855 if (GV->isDeclaration()) {
856 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
857 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
858 << IsIFunc << IsIFunc;
861 for (
const auto &[
Decl, Name] : MangledDeclNames) {
862 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
864 if (II && II->
getName() == GV->getName()) {
865 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
869 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
879 const auto *F = dyn_cast<llvm::Function>(GV);
881 Diags.
Report(Location, diag::err_alias_to_undefined)
882 << IsIFunc << IsIFunc;
886 llvm::FunctionType *FTy = F->getFunctionType();
887 if (!FTy->getReturnType()->isPointerTy()) {
888 Diags.
Report(Location, diag::err_ifunc_resolver_return);
902 if (GVar->hasAttribute(
"toc-data")) {
903 auto GVId = GVar->getName();
906 Diags.
Report(Location, diag::warn_toc_unsupported_type)
907 << GVId <<
"the variable has an alias";
909 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
910 llvm::AttributeSet NewAttributes =
911 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
912 GVar->setAttributes(NewAttributes);
916void CodeGenModule::checkAliases() {
921 DiagnosticsEngine &Diags =
getDiags();
922 for (
const GlobalDecl &GD : Aliases) {
924 SourceLocation Location;
926 bool IsIFunc = D->hasAttr<IFuncAttr>();
927 if (
const Attr *A = D->getDefiningAttr()) {
928 Location = A->getLocation();
929 Range = A->getRange();
931 llvm_unreachable(
"Not an alias or ifunc?");
935 const llvm::GlobalValue *GV =
nullptr;
937 MangledDeclNames, Range)) {
943 GlobalDecl AliaseeGD;
946 Diags.Report(Location, diag::err_alias_to_undefined)
947 << IsIFunc << IsIFunc;
956 if (AliasIsFuncDecl != AliaseeIsFunc) {
957 Diags.Report(Location, diag::err_alias_between_function_and_variable)
960 diag::note_aliasee_declaration);
967 if (AliasIsFuncDecl && AliaseeIsFunc) {
968 QualType AliasTy = D->getType();
970 auto shouldReportTypeMismatch = [&]() {
971 const auto *AliasFTy =
973 const auto *AliaseeFTy =
975 assert(AliasFTy && AliaseeFTy);
976 if (!Context.typesAreCompatible(AliasFTy->getReturnType(),
979 const auto *AliasFPTy = dyn_cast<FunctionProtoType>(AliasFTy);
980 const auto *AliaseeFPTy = dyn_cast<FunctionProtoType>(AliaseeFTy);
982 if ((AliasFPTy && AliasFPTy->isVariadic() && !AliaseeFPTy) ||
983 (AliaseeFPTy && AliaseeFPTy->isVariadic() && !AliasFPTy))
986 if (!AliasFPTy || !AliaseeFPTy)
990 if (AliasFPTy->getNumParams() != AliaseeFPTy->getNumParams() ||
991 AliasFPTy->isVariadic() != AliaseeFPTy->isVariadic())
993 for (
unsigned i = 0; i < AliasFPTy->getNumParams(); ++i)
994 if (!Context.typesAreCompatible(AliasFPTy->getParamType(i),
995 AliaseeFPTy->getParamType(i)))
999 if (shouldReportTypeMismatch()) {
1000 Diags.Report(Location, diag::warn_alias_type_mismatch)
1001 << AliasTy << AliaseeTy;
1003 diag::note_aliasee_declaration);
1009 if (
const llvm::GlobalVariable *GVar =
1010 dyn_cast<const llvm::GlobalVariable>(GV))
1014 llvm::Constant *Aliasee =
1018 llvm::GlobalValue *AliaseeGV;
1019 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
1024 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
1025 StringRef AliasSection = SA->getName();
1026 if (AliasSection != AliaseeGV->getSection())
1027 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
1028 << AliasSection << IsIFunc << IsIFunc;
1036 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
1037 if (GA->isInterposable()) {
1038 Diags.Report(Location, diag::warn_alias_to_weak_alias)
1039 << GV->getName() << GA->getName() << IsIFunc;
1040 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1041 GA->getAliasee(), Alias->getType());
1053 llvm::Attribute::DisableSanitizerInstrumentation);
1058 for (
const GlobalDecl &GD : Aliases) {
1061 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
1062 Alias->eraseFromParent();
1067 DeferredDeclsToEmit.clear();
1068 EmittedDeferredDecls.clear();
1069 DeferredAnnotations.clear();
1071 OpenMPRuntime->clear();
1075 StringRef MainFile) {
1078 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
1079 if (MainFile.empty())
1080 MainFile =
"<stdin>";
1081 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
1084 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
1087 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
1091static std::optional<llvm::GlobalValue::VisibilityTypes>
1096 return std::nullopt;
1098 return llvm::GlobalValue::DefaultVisibility;
1100 return llvm::GlobalValue::HiddenVisibility;
1102 return llvm::GlobalValue::ProtectedVisibility;
1104 llvm_unreachable(
"unknown option value!");
1109 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
1118 GV.setDSOLocal(
false);
1119 GV.setVisibility(*
V);
1124 if (!LO.VisibilityFromDLLStorageClass)
1127 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
1130 std::optional<llvm::GlobalValue::VisibilityTypes>
1131 NoDLLStorageClassVisibility =
1134 std::optional<llvm::GlobalValue::VisibilityTypes>
1135 ExternDeclDLLImportVisibility =
1138 std::optional<llvm::GlobalValue::VisibilityTypes>
1139 ExternDeclNoDLLStorageClassVisibility =
1142 for (llvm::GlobalValue &GV : M.global_values()) {
1143 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
1146 if (GV.isDeclarationForLinker())
1148 llvm::GlobalValue::DLLImportStorageClass
1149 ? ExternDeclDLLImportVisibility
1150 : ExternDeclNoDLLStorageClassVisibility);
1153 llvm::GlobalValue::DLLExportStorageClass
1154 ? DLLExportVisibility
1155 : NoDLLStorageClassVisibility);
1157 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
1162 const llvm::Triple &Triple,
1166 return LangOpts.getStackProtector() == Mode;
1169std::optional<llvm::Attribute::AttrKind>
1171 if (D && D->
hasAttr<NoStackProtectorAttr>())
1173 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
1175 return llvm::Attribute::StackProtectStrong;
1177 return llvm::Attribute::StackProtect;
1179 return llvm::Attribute::StackProtectStrong;
1181 return llvm::Attribute::StackProtectReq;
1182 return std::nullopt;
1188 EmitModuleInitializers(Primary);
1190 DeferredDecls.insert_range(EmittedDeferredDecls);
1191 EmittedDeferredDecls.clear();
1192 EmitVTablesOpportunistically();
1193 applyGlobalValReplacements();
1194 applyReplacements();
1195 emitMultiVersionFunctions();
1196 emitPFPFieldsWithEvaluatedOffset();
1199 if (Context.getLangOpts().IncrementalExtensions &&
1200 GlobalTopLevelStmtBlockInFlight.first) {
1202 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1203 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1209 EmitCXXModuleInitFunc(Primary);
1211 EmitCXXGlobalInitFunc();
1212 EmitCXXGlobalCleanUpFunc();
1213 registerGlobalDtorsWithAtExit();
1214 EmitCXXThreadLocalInitFunc();
1216 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1218 if (Context.getLangOpts().CUDA && CUDARuntime) {
1219 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1222 if (LangOpts.SYCLIsHost && !CodeGenOpts.OffloadBinaryToEmbedFile.empty()) {
1223 if (llvm::Function *SYCLCtorFunction = embedSYCLDeviceBinary())
1228 if (OpenMPRuntime) {
1229 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1230 OpenMPRuntime->clear();
1234 PGOReader->getSummary(
false).getMD(VMContext),
1235 llvm::ProfileSummary::PSK_Instr);
1236 if (PGOStats.hasDiagnostics())
1242 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1243 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1245 EmitStaticExternCAliases();
1250 if (CoverageMapping)
1251 CoverageMapping->emit();
1252 if (CodeGenOpts.SanitizeCfiCrossDso) {
1256 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1258 emitAtAvailableLinkGuard();
1259 if (Context.getTargetInfo().getTriple().isWasm())
1266 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1267 llvm::CodeObjectVersionKind::COV_None) {
1268 getModule().addModuleFlag(llvm::Module::Error,
1269 "amdhsa_code_object_version",
1270 getTarget().getTargetOpts().CodeObjectVersion);
1275 auto *MDStr = llvm::MDString::get(
1280 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1290 llvm::Module::Error,
"amdgpu.xnack",
1291 llvm::ConstantInt::get(
1299 llvm::Module::Error,
"amdgpu.sramecc",
1300 llvm::ConstantInt::get(
1310 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1312 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1314 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1318 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1322 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1324 auto *GV =
new llvm::GlobalVariable(
1325 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1326 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1333 if (LangOpts.HIP && !LangOpts.IncrementalExtensions) {
1336 auto *GV =
new llvm::GlobalVariable(
1338 llvm::Constant::getNullValue(
Int8Ty),
1347 if (CodeGenOpts.Autolink &&
1348 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1349 EmitModuleLinkOptions();
1364 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1365 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1366 for (
auto *MD : ELFDependentLibraries)
1367 NMD->addOperand(MD);
1370 if (CodeGenOpts.DwarfVersion) {
1371 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1372 CodeGenOpts.DwarfVersion);
1375 if (CodeGenOpts.Dwarf64)
1376 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1378 if (Context.getLangOpts().SemanticInterposition)
1380 getModule().setSemanticInterposition(
true);
1382 if (CodeGenOpts.EmitCodeView) {
1384 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1386 if (CodeGenOpts.CodeViewGHash) {
1387 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1389 if (CodeGenOpts.ControlFlowGuard) {
1392 llvm::Module::Warning,
"cfguard",
1393 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1394 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1397 llvm::Module::Warning,
"cfguard",
1398 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1400 if (CodeGenOpts.getWinControlFlowGuardMechanism() !=
1401 llvm::ControlFlowGuardMechanism::Automatic) {
1404 llvm::Module::Warning,
"cfguard-mechanism",
1405 static_cast<unsigned>(CodeGenOpts.getWinControlFlowGuardMechanism()));
1407 if (CodeGenOpts.EHContGuard) {
1409 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1411 if (Context.getLangOpts().Kernel) {
1413 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1415 if (CodeGenOpts.HotPatch) {
1418 getModule().addModuleFlag(llvm::Module::Min,
"ms-hotpatch", 1);
1420 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1425 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1427 llvm::Metadata *Ops[2] = {
1428 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1429 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1430 llvm::Type::getInt32Ty(VMContext), 1))};
1432 getModule().addModuleFlag(llvm::Module::Require,
1433 "StrictVTablePointersRequirement",
1434 llvm::MDNode::get(VMContext, Ops));
1440 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1441 llvm::DEBUG_METADATA_VERSION);
1446 uint64_t WCharWidth =
1447 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1448 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1449 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size",
1450 static_cast<uint32_t
>(WCharWidth));
1454 llvm::FloatABI::ABIType FloatABI =
1455 llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.FloatABI)
1456 .Cases({
"soft",
"softfp"}, llvm::FloatABI::Soft)
1457 .Case(
"hard", llvm::FloatABI::Hard)
1458 .Default(llvm::FloatABI::Default);
1459 if (FloatABI != llvm::FloatABI::Default &&
1460 FloatABI !=
getTriple().getDefaultFloatABI()) {
1462 llvm::Module::Error,
"float-abi",
1464 llvm::FloatABI::getABITypeName(FloatABI)));
1469 llvm::ThreadModel ThreadModel =
1471 ? llvm::ThreadModel::Single
1472 : llvm::ThreadModel::POSIX;
1473 if (ThreadModel !=
getTriple().getDefaultThreadModel())
1474 getModule().setThreadModel(ThreadModel);
1476 if (
getTypes().isLongDoubleReferenced()) {
1479 std::optional<llvm::LongDoubleFormat> Format;
1480 if (flt == &llvm::APFloat::IEEEquad())
1481 Format = llvm::LongDoubleFormat::IEEEquad;
1482 else if (flt == &llvm::APFloat::IEEEdouble())
1483 Format = llvm::LongDoubleFormat::IEEEdouble;
1484 else if (flt == &llvm::APFloat::PPCDoubleDouble())
1485 Format = llvm::LongDoubleFormat::PPCDoubleDouble;
1486 else if (flt == &llvm::APFloat::x87DoubleExtended())
1487 Format = llvm::LongDoubleFormat::X87DoubleExtended;
1488 else if (flt == &llvm::APFloat::IEEEsingle())
1489 Format = llvm::LongDoubleFormat::IEEEsingle;
1492 getModule().setLongDoubleFormat(*Format);
1499 llvm::ExceptionHandling ExceptionModel =
1501 if (ExceptionModel != llvm::ExceptionHandling::Default) {
1503 llvm::Module::Error,
"exception-model",
1505 llvm::getExceptionModelName(ExceptionModel)));
1509 getModule().addModuleFlag(llvm::Module::Warning,
1510 "zos_product_major_version",
1512 getModule().addModuleFlag(llvm::Module::Warning,
1513 "zos_product_minor_version",
1515 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1516 uint32_t(CLANG_VERSION_PATCHLEVEL));
1518 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1519 llvm::MDString::get(VMContext, ProductId));
1524 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1525 llvm::MDString::get(VMContext, lang_str));
1527 time_t TT = PreprocessorOpts.SourceDateEpoch
1528 ? *PreprocessorOpts.SourceDateEpoch
1529 : std::time(
nullptr);
1530 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1531 static_cast<uint64_t
>(TT));
1534 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1535 llvm::MDString::get(VMContext,
"ascii"));
1538 llvm::Triple
T = Context.getTargetInfo().getTriple();
1543 if (StringRef ABIStr = Target.getABI();
1544 !ABIStr.empty() && (
T.isARM() ||
T.isThumb() ||
T.isRISCV() ||
1545 T.isPPC() ||
T.isLoongArch() ||
T.isWasm())) {
1546 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1547 llvm::MDString::get(VMContext, ABIStr));
1550 if (
T.isARM() ||
T.isThumb()) {
1552 uint32_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1553 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1557 llvm::LLVMContext &Ctx = TheModule.getContext();
1562 const std::vector<std::string> &Features =
1565 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1566 if (!errorToBool(ParseResult.takeError()))
1568 llvm::Module::AppendUnique,
"riscv-isa",
1570 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1573 if (CodeGenOpts.SanitizeCfiCrossDso) {
1575 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1578 if (CodeGenOpts.WholeProgramVTables) {
1582 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1583 CodeGenOpts.VirtualFunctionElimination);
1586 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1587 getModule().addModuleFlag(llvm::Module::Override,
1588 "CFI Canonical Jump Tables",
1589 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1592 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1593 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1597 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1599 llvm::Module::Append,
"Unique Source File Identifier",
1601 TheModule.getContext(),
1602 llvm::MDString::get(TheModule.getContext(),
1603 CodeGenOpts.UniqueSourceFileIdentifier)));
1606 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1607 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1610 if (CodeGenOpts.PatchableFunctionEntryOffset)
1611 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1612 CodeGenOpts.PatchableFunctionEntryOffset);
1613 if (CodeGenOpts.SanitizeKcfiArity)
1614 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1617 llvm::Module::Override,
"kcfi-hash",
1618 llvm::MDString::get(
1620 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1623 if (CodeGenOpts.CFProtectionReturn &&
1624 Target.checkCFProtectionReturnSupported(
getDiags())) {
1626 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1630 if (CodeGenOpts.CFProtectionBranch &&
1631 Target.checkCFProtectionBranchSupported(
getDiags())) {
1633 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1636 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1637 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1639 Scheme = Target.getDefaultCFBranchLabelScheme();
1641 llvm::Module::Error,
"cf-branch-label-scheme",
1647 if (CodeGenOpts.FunctionReturnThunks)
1648 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1650 if (CodeGenOpts.IndirectBranchCSPrefix)
1651 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1653 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1661 if (LangOpts.BranchTargetEnforcement)
1662 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1664 if (LangOpts.BranchProtectionPAuthLR)
1665 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1667 if (LangOpts.GuardedControlStack)
1668 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1669 if (LangOpts.hasSignReturnAddress())
1670 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1671 if (LangOpts.isSignReturnAddressScopeAll())
1672 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1674 if (!LangOpts.isSignReturnAddressWithAKey())
1675 getModule().addModuleFlag(llvm::Module::Min,
1676 "sign-return-address-with-bkey", 2);
1678 if (
T.isAArch64()) {
1690 if (LangOpts.PointerAuthReturns)
1691 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-returns", 1);
1692 if (LangOpts.PointerAuthAuthTraps)
1693 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-auth-traps", 1);
1694 if (LangOpts.PointerAuthIndirectGotos)
1695 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-indirect-gotos", 1);
1696 if (LangOpts.AArch64JumpTableHardening)
1697 getModule().addModuleFlag(llvm::Module::Max,
1698 "aarch64-jump-table-hardening", 1);
1706 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-elf-got",
1707 LangOpts.PointerAuthELFGOT);
1709 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-init-fini",
1710 LangOpts.PointerAuthCalls &&
1711 LangOpts.PointerAuthInitFini);
1713 llvm::Module::Error,
"ptrauth-init-fini-address-discrimination",
1714 LangOpts.PointerAuthCalls && LangOpts.PointerAuthInitFini &&
1715 LangOpts.PointerAuthInitFiniAddressDiscrimination);
1718 if (LangOpts.hasSignReturnAddressHardening()) {
1721 llvm::Module::Error,
"sign-return-address-harden",
1727 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-sign-personality",
1728 LangOpts.PointerAuthCalls);
1731 using namespace llvm::ELF;
1732 assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST < 32);
1733 uint32_t PAuthABIVersion =
1734 (LangOpts.PointerAuthIntrinsics
1735 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1736 (LangOpts.PointerAuthCalls
1737 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1738 (LangOpts.PointerAuthReturns
1739 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1740 (LangOpts.PointerAuthAuthTraps
1741 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1742 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1743 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1744 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1745 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1746 (LangOpts.PointerAuthInitFini
1747 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1748 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1749 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1750 (LangOpts.PointerAuthELFGOT
1751 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1752 (LangOpts.PointerAuthIndirectGotos
1753 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1754 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1755 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1756 (LangOpts.PointerAuthFunctionTypeDiscrimination
1757 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1758 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1759 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1760 "Update when new enum items are defined");
1765 getModule().addModuleFlag(llvm::Module::Error,
1766 "aarch64-elf-pauthabi-platform",
1767 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1769 llvm::Module::Error,
"aarch64-elf-pauthabi-version", PAuthABIVersion);
1772 if ((
T.isARM() ||
T.isThumb()) &&
getTriple().isTargetAEABI() &&
1774 uint32_t TagVal = 0;
1775 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1777 llvm::DenormalMode::getPositiveZero()) {
1778 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1780 llvm::DenormalMode::getIEEE()) {
1781 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1782 DenormalTagBehavior = llvm::Module::Override;
1784 llvm::DenormalMode::getPreserveSign()) {
1785 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1787 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1792 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1793 llvm::ARMBuildAttrs::Allowed);
1796 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1798 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1799 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1803 if (CodeGenOpts.StackClashProtector)
1805 llvm::Module::Override,
"probe-stack",
1806 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1808 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1809 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1810 CodeGenOpts.StackProbeSize);
1812 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1813 llvm::LLVMContext &Ctx = TheModule.getContext();
1815 llvm::Module::Error,
"MemProfProfileFilename",
1816 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1819 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1823 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1824 CodeGenOpts.FP32DenormalMode.Output !=
1825 llvm::DenormalMode::IEEE);
1828 if (LangOpts.EHAsynch)
1829 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1832 if (CodeGenOpts.ImportCallOptimization)
1833 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1843 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
1844 if (UnwindMode == llvm::WinX64EHUnwindMode::Default) {
1845 if (
T.isOSWindows() &&
T.isX86_64() &&
1846 Context.getTargetInfo().hasFeature(
"egpr"))
1847 UnwindMode = llvm::WinX64EHUnwindMode::V3;
1849 UnwindMode = llvm::WinX64EHUnwindMode::V1;
1851 if (UnwindMode != llvm::WinX64EHUnwindMode::V1)
1852 getModule().addModuleFlag(llvm::Module::Warning,
"winx64-eh-unwind",
1853 static_cast<unsigned>(UnwindMode));
1857 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1859 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1863 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1864 EmitOpenCLMetadata();
1871 auto Version = LangOpts.getOpenCLCompatibleVersion();
1872 llvm::Metadata *SPIRVerElts[] = {
1873 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1875 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1876 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1877 llvm::NamedMDNode *SPIRVerMD =
1878 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1879 llvm::LLVMContext &Ctx = TheModule.getContext();
1880 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1888 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1889 assert(PLevel < 3 &&
"Invalid PIC Level");
1890 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1891 if (Context.getLangOpts().PIE)
1892 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1896 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1897 .Case(
"tiny", llvm::CodeModel::Tiny)
1898 .Case(
"small", llvm::CodeModel::Small)
1899 .Case(
"kernel", llvm::CodeModel::Kernel)
1900 .Case(
"medium", llvm::CodeModel::Medium)
1901 .Case(
"large", llvm::CodeModel::Large)
1904 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1907 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1908 Context.getTargetInfo().getTriple().getArch() ==
1909 llvm::Triple::x86_64) {
1915 if (CodeGenOpts.NoPLT)
1918 CodeGenOpts.DirectAccessExternalData !=
1919 getModule().getDirectAccessExternalData()) {
1920 getModule().setDirectAccessExternalData(
1921 CodeGenOpts.DirectAccessExternalData);
1923 if (CodeGenOpts.UnwindTables)
1924 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1926 switch (CodeGenOpts.getFramePointer()) {
1931 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1934 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1937 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1940 getModule().setFramePointer(llvm::FramePointerKind::All);
1944 SimplifyPersonality();
1957 EmitVersionIdentMetadata();
1960 EmitCommandLineMetadata();
1968 getModule().setStackProtectorGuardSymbol(
1971 getModule().setStackProtectorGuardOffset(
1974 getModule().setStackProtectorGuardValueWidth(
1977 if (
getModule().getStackProtectorGuard() !=
"global") {
1978 Diags.Report(diag::err_opt_not_valid_without_opt)
1979 <<
"-mstack-protector-guard-record"
1980 <<
"-mstack-protector-guard=global";
1982 getModule().setStackProtectorGuardRecord(
true);
1987 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1989 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1991 if (
getContext().getTargetInfo().getMaxTLSAlign())
1992 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1993 getContext().getTargetInfo().getMaxTLSAlign());
2011 if (!MustTailCallUndefinedGlobals.empty()) {
2013 for (
auto &I : MustTailCallUndefinedGlobals) {
2014 if (!I.first->isDefined())
2015 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
2019 if (!Entry || Entry->isWeakForLinker() ||
2020 Entry->isDeclarationForLinker())
2021 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
2025 for (
auto &I : MustTailCallUndefinedGlobals) {
2034 if (Entry->isDeclarationForLinker()) {
2037 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
2039 CalleeIsLocal = Entry->isDSOLocal();
2043 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
2056 llvm::MDBuilder MDB(TheModule.getContext());
2057 uint64_t Size = Context.getTypeSizeInChars(Context.IntTy).getQuantity();
2058 llvm::MDNode *StructNode =
2059 CodeGenOpts.NewStructPathTBAA
2060 ? MDB.createTBAATypeNode(TBAA->getChar(), Size,
2061 MDB.createString(
"__libc_errno"),
2062 {{0, Size, IntegerNode}})
2063 : MDB.createTBAAStructTypeNode(
"__libc_errno",
2064 {{IntegerNode, 0}});
2067 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
2068 ErrnoTBAAMD->addOperand(StructTagNode);
2073void CodeGenModule::EmitOpenCLMetadata() {
2078 unsigned CLVersion =
2081 auto EmitVersion = [
this](StringRef MDName,
int Version) {
2082 llvm::Metadata *OCLVerElts[] = {
2083 llvm::ConstantAsMetadata::get(
2084 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
2085 llvm::ConstantAsMetadata::get(
2086 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
2087 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
2088 llvm::LLVMContext &Ctx = TheModule.getContext();
2089 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
2092 EmitVersion(
"opencl.ocl.version", CLVersion);
2093 if (LangOpts.OpenCLCPlusPlus) {
2095 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
2099void CodeGenModule::EmitBackendOptionsMetadata(
2100 const CodeGenOptions &CodeGenOpts) {
2102 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
2103 CodeGenOpts.SmallDataLimit);
2107 if (LangOpts.AllocTokenMode) {
2108 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
2109 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
2110 llvm::MDString::get(VMContext, S));
2112 if (LangOpts.AllocTokenMax)
2114 llvm::Module::Error,
"alloc-token-max",
2115 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
2116 *LangOpts.AllocTokenMax));
2117 if (CodeGenOpts.SanitizeAllocTokenFastABI)
2118 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
2119 if (CodeGenOpts.SanitizeAllocTokenExtended)
2120 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
2136 return TBAA->getTypeInfo(QTy);
2155 return TBAA->getAccessInfo(AccessType);
2162 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
2168 return TBAA->getTBAAStructInfo(QTy);
2174 return TBAA->getBaseTypeInfo(QTy);
2180 return TBAA->getAccessTagInfo(Info);
2187 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
2195 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
2203 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
2209 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
2214 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
2226 std::string Msg =
Type;
2228 diag::err_codegen_unsupported)
2234 diag::err_codegen_unsupported)
2241 std::string Msg =
Type;
2243 diag::err_codegen_unsupported)
2248 llvm::function_ref<
void()> Fn) {
2249 StackHandler.runWithSufficientStackSpace(Loc, Fn);
2259 if (GV->hasLocalLinkage()) {
2260 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2273 if (Context.getLangOpts().OpenMP &&
2274 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
2275 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
2276 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
2277 OMPDeclareTargetDeclAttr::DT_NoHost &&
2279 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2286 if (Context.getLangOpts().CUDAIsDevice &&
2288 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
2289 bool NeedsProtected =
false;
2293 else if (
const auto *VD = dyn_cast<VarDecl>(D))
2294 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
2295 VD->hasAttr<CUDAConstantAttr>() ||
2296 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
2297 VD->getType()->isCUDADeviceBuiltinTextureType();
2298 if (NeedsProtected) {
2299 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2305 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2309 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
2313 if (GV->hasDLLExportStorageClass()) {
2316 diag::err_hidden_visibility_dllexport);
2319 diag::err_non_default_visibility_dllimport);
2325 !GV->isDeclarationForLinker())
2330 llvm::GlobalValue *GV) {
2331 if (GV->hasLocalLinkage())
2334 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
2338 if (GV->hasDLLImportStorageClass())
2341 const llvm::Triple &TT = CGM.
getTriple();
2343 if (TT.isOSCygMing()) {
2361 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
2369 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
2373 if (!TT.isOSBinFormatELF())
2379 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2387 return !(CGM.
getLangOpts().SemanticInterposition ||
2392 if (!GV->isDeclarationForLinker())
2398 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2405 if (CGOpts.DirectAccessExternalData) {
2411 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2412 if (!Var->isThreadLocal())
2437 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2439 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2449 if (D->
hasAttr<DLLImportAttr>())
2450 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2451 else if ((D->
hasAttr<DLLExportAttr>() ||
2453 !GV->isDeclarationForLinker())
2454 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2474 GV->setPartition(CodeGenOpts.SymbolPartition);
2478 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2479 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2480 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2481 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2482 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2485llvm::GlobalVariable::ThreadLocalMode
2487 switch (CodeGenOpts.getDefaultTLSModel()) {
2489 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2491 return llvm::GlobalVariable::LocalDynamicTLSModel;
2493 return llvm::GlobalVariable::InitialExecTLSModel;
2495 return llvm::GlobalVariable::LocalExecTLSModel;
2497 llvm_unreachable(
"Invalid TLS model!");
2501 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2503 llvm::GlobalValue::ThreadLocalMode TLM;
2507 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2511 GV->setThreadLocalMode(TLM);
2517 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2521 const CPUSpecificAttr *
Attr,
2538 !D->
hasAttr<AsmLabelAttr>() &&
2544 bool OmitMultiVersionMangling =
false,
2545 bool IgnoreAsmLabel =
false) {
2547 llvm::raw_svector_ostream Out(Buffer);
2551 bool ShouldMangle = !IgnoreAsmLabel
2555 if (!IgnoreAsmLabel)
2561 assert(II &&
"Attempt to mangle unnamed decl.");
2562 const auto *FD = dyn_cast<FunctionDecl>(ND);
2567 Out <<
"__regcall4__" << II->
getName();
2569 Out <<
"__regcall3__" << II->
getName();
2570 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2572 Out <<
"__device_stub__" << II->
getName();
2574 DeviceKernelAttr::isOpenCLSpelling(
2575 FD->getAttr<DeviceKernelAttr>()) &&
2577 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2593 "Hash computed when not explicitly requested");
2597 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2598 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2599 switch (FD->getMultiVersionKind()) {
2603 FD->getAttr<CPUSpecificAttr>(),
2607 auto *
Attr = FD->getAttr<TargetAttr>();
2608 assert(
Attr &&
"Expected TargetAttr to be present "
2609 "for attribute mangling");
2615 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2616 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2617 "for attribute mangling");
2623 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2624 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2625 "for attribute mangling");
2632 llvm_unreachable(
"None multiversion type isn't valid here");
2642 return std::string(Out.str());
2645void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2646 const FunctionDecl *FD,
2647 StringRef &CurName) {
2654 std::string NonTargetName =
2662 "Other GD should now be a multiversioned function");
2672 if (OtherName != NonTargetName) {
2675 const auto ExistingRecord = Manglings.find(NonTargetName);
2676 if (ExistingRecord != std::end(Manglings))
2677 Manglings.remove(&(*ExistingRecord));
2678 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2683 CurName = OtherNameRef;
2685 Entry->setName(OtherName);
2695 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2709 auto FoundName = MangledDeclNames.find(CanonicalGD);
2710 if (FoundName != MangledDeclNames.end())
2711 return FoundName->second;
2748 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2749 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2754 std::string MangledName =
2766 llvm::raw_svector_ostream Out(Buffer);
2769 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2770 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2772 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2777 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2778 return Result.first->first();
2782 auto it = MangledDeclNames.begin();
2783 while (it != MangledDeclNames.end()) {
2784 if (it->second == Name)
2799 llvm::Constant *AssociatedData) {
2801 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2807 bool IsDtorAttrFunc) {
2808 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2810 DtorsUsingAtExit[Priority].push_back(Dtor);
2815 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2818void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2819 if (Fns.empty())
return;
2822 llvm::PointerType *PtrTy = llvm::PointerType::get(
2823 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2826 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2830 auto Ctors = Builder.beginArray(CtorStructTy);
2831 for (
const auto &I : Fns) {
2832 auto Ctor = Ctors.beginStruct(CtorStructTy);
2833 Ctor.addInt(
Int32Ty, I.Priority);
2834 Ctor.add(I.Initializer);
2835 if (I.AssociatedData)
2836 Ctor.add(I.AssociatedData);
2838 Ctor.addNullPointer(PtrTy);
2839 Ctor.finishAndAddTo(Ctors);
2842 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2844 llvm::GlobalValue::AppendingLinkage);
2848 List->setAlignment(std::nullopt);
2853llvm::GlobalValue::LinkageTypes
2859 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2866 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2867 if (!MDS)
return nullptr;
2869 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2877 if (!UD->
hasAttr<TransparentUnionAttr>())
2879 if (!UD->
fields().empty())
2880 return UD->
fields().begin()->getType();
2889 bool GeneralizePointers) {
2902 bool GeneralizePointers) {
2905 for (
auto &Param : FnType->param_types())
2906 GeneralizedParams.push_back(
2910 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2911 GeneralizedParams, FnType->getExtProtoInfo());
2916 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2918 llvm_unreachable(
"Encountered unknown FunctionType");
2926 FnType->getReturnType(), FnType->getParamTypes(),
2927 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2929 std::string OutName;
2930 llvm::raw_string_ostream Out(OutName);
2938 Out <<
".normalized";
2940 Out <<
".generalized";
2942 return llvm::ConstantInt::get(
2948 llvm::Function *F,
bool IsThunk) {
2950 llvm::AttributeList PAL;
2953 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2957 Loc = D->getLocation();
2959 Error(Loc,
"__vectorcall calling convention is not currently supported");
2961 F->setAttributes(PAL);
2962 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2966 std::string ReadOnlyQual(
"__read_only");
2967 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2968 if (ReadOnlyPos != std::string::npos)
2970 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2972 std::string WriteOnlyQual(
"__write_only");
2973 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2974 if (WriteOnlyPos != std::string::npos)
2975 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2977 std::string ReadWriteQual(
"__read_write");
2978 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2979 if (ReadWritePos != std::string::npos)
2980 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
3013 assert(((FD && CGF) || (!FD && !CGF)) &&
3014 "Incorrect use - FD and CGF should either be both null or not!");
3040 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
3043 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
3048 std::string typeQuals;
3052 const Decl *PDecl = parm;
3054 PDecl = TD->getDecl();
3055 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
3056 if (A && A->isWriteOnly())
3057 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
3058 else if (A && A->isReadWrite())
3059 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
3061 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
3063 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
3065 auto getTypeSpelling = [&](
QualType Ty) {
3066 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
3068 if (Ty.isCanonical()) {
3069 StringRef typeNameRef = typeName;
3071 if (typeNameRef.consume_front(
"unsigned "))
3072 return std::string(
"u") + typeNameRef.str();
3073 if (typeNameRef.consume_front(
"signed "))
3074 return typeNameRef.str();
3084 addressQuals.push_back(
3085 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
3089 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
3090 std::string baseTypeName =
3092 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
3093 argBaseTypeNames.push_back(
3094 llvm::MDString::get(VMContext, baseTypeName));
3098 typeQuals =
"restrict";
3101 typeQuals += typeQuals.empty() ?
"const" :
" const";
3103 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
3105 uint32_t AddrSpc = 0;
3110 addressQuals.push_back(
3111 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
3115 std::string typeName = getTypeSpelling(ty);
3127 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
3128 argBaseTypeNames.push_back(
3129 llvm::MDString::get(VMContext, baseTypeName));
3134 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
3138 Fn->setMetadata(
"kernel_arg_addr_space",
3139 llvm::MDNode::get(VMContext, addressQuals));
3140 Fn->setMetadata(
"kernel_arg_access_qual",
3141 llvm::MDNode::get(VMContext, accessQuals));
3142 Fn->setMetadata(
"kernel_arg_type",
3143 llvm::MDNode::get(VMContext, argTypeNames));
3144 Fn->setMetadata(
"kernel_arg_base_type",
3145 llvm::MDNode::get(VMContext, argBaseTypeNames));
3146 Fn->setMetadata(
"kernel_arg_type_qual",
3147 llvm::MDNode::get(VMContext, argTypeQuals));
3151 Fn->setMetadata(
"kernel_arg_name",
3152 llvm::MDNode::get(VMContext, argNames));
3168SmallVector<const CXXRecordDecl *, 0>
3170 llvm::SetVector<const CXXRecordDecl *> MostBases;
3175 MostBases.insert(RD);
3177 CollectMostBases(B.getType()->getAsCXXRecordDecl());
3179 CollectMostBases(RD);
3180 return MostBases.takeVector();
3184 llvm::Function *F) {
3185 llvm::AttrBuilder B(F->getContext());
3187 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
3188 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
3190 if (CodeGenOpts.StackClashProtector)
3191 B.addAttribute(
"probe-stack",
"inline-asm");
3193 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
3194 B.addAttribute(
"stack-probe-size",
3195 std::to_string(CodeGenOpts.StackProbeSize));
3198 B.addAttribute(llvm::Attribute::NoUnwind);
3200 if (std::optional<llvm::Attribute::AttrKind>
Attr =
3202 B.addAttribute(*
Attr);
3207 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
3208 B.addAttribute(llvm::Attribute::AlwaysInline);
3212 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
3214 B.addAttribute(llvm::Attribute::NoInline);
3222 if (D->
hasAttr<ArmLocallyStreamingAttr>())
3223 B.addAttribute(
"aarch64_pstate_sm_body");
3226 if (
Attr->isNewZA())
3227 B.addAttribute(
"aarch64_new_za");
3228 if (
Attr->isNewZT0())
3229 B.addAttribute(
"aarch64_new_zt0");
3234 bool ShouldAddOptNone =
3235 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
3237 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
3238 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
3241 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
3242 !D->
hasAttr<NoInlineAttr>()) {
3243 B.addAttribute(llvm::Attribute::AlwaysInline);
3244 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
3245 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3247 B.addAttribute(llvm::Attribute::OptimizeNone);
3250 B.addAttribute(llvm::Attribute::NoInline);
3255 B.addAttribute(llvm::Attribute::Naked);
3258 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
3259 F->removeFnAttr(llvm::Attribute::MinSize);
3260 }
else if (D->
hasAttr<NakedAttr>()) {
3262 B.addAttribute(llvm::Attribute::Naked);
3263 B.addAttribute(llvm::Attribute::NoInline);
3264 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
3265 B.addAttribute(llvm::Attribute::NoDuplicate);
3266 }
else if (D->
hasAttr<NoInlineAttr>() &&
3267 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3269 B.addAttribute(llvm::Attribute::NoInline);
3270 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
3271 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
3273 B.addAttribute(llvm::Attribute::AlwaysInline);
3277 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
3278 B.addAttribute(llvm::Attribute::NoInline);
3282 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3285 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
3286 return Redecl->isInlineSpecified();
3288 if (any_of(FD->
redecls(), CheckRedeclForInline))
3293 return any_of(Pattern->
redecls(), CheckRedeclForInline);
3295 if (CheckForInline(FD)) {
3296 B.addAttribute(llvm::Attribute::InlineHint);
3297 }
else if (CodeGenOpts.getInlining() ==
3300 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3301 B.addAttribute(llvm::Attribute::NoInline);
3308 if (!D->
hasAttr<OptimizeNoneAttr>()) {
3310 if (!ShouldAddOptNone)
3311 B.addAttribute(llvm::Attribute::OptimizeForSize);
3312 B.addAttribute(llvm::Attribute::Cold);
3315 B.addAttribute(llvm::Attribute::Hot);
3316 if (D->
hasAttr<MinSizeAttr>())
3317 B.addAttribute(llvm::Attribute::MinSize);
3322 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
3323 B.addAttribute(llvm::Attribute::NoOutline);
3327 llvm::MaybeAlign ExplicitAlignment;
3328 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
3329 ExplicitAlignment = llvm::Align(alignment);
3330 else if (LangOpts.FunctionAlignment)
3331 ExplicitAlignment = llvm::Align::fromLog2(LangOpts.FunctionAlignment);
3333 if (ExplicitAlignment) {
3334 F->setAlignment(ExplicitAlignment);
3335 F->setPreferredAlignment(ExplicitAlignment);
3336 }
else if (LangOpts.PreferredFunctionAlignment) {
3337 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
3346 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
3351 if (CodeGenOpts.SanitizeCfiCrossDso &&
3352 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
3353 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3361 if (CodeGenOpts.CallGraphSection) {
3362 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3369 auto *MD = dyn_cast<CXXMethodDecl>(D);
3372 llvm::Metadata *Id =
3374 MD->getType(), std::nullopt,
Base));
3375 F->addTypeMetadata(0, Id);
3382 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
3383 if (FD->
hasAttr<SYCLExternalAttr>())
3384 addSYCLModuleIdAttr(F);
3388void CodeGenModule::addSYCLModuleIdAttr(llvm::Function *Fn) {
3390 Fn->addFnAttr(
"sycl-module-id",
getModule().getModuleIdentifier());
3398 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FD))
3400 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FD))
3414 Linkage != llvm::GlobalValue::AvailableExternallyLinkage;
3419 if (isa_and_nonnull<NamedDecl>(D))
3422 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3424 if (D && D->
hasAttr<UsedAttr>())
3427 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3429 ((CodeGenOpts.KeepPersistentStorageVariables &&
3430 (VD->getStorageDuration() ==
SD_Static ||
3431 VD->getStorageDuration() ==
SD_Thread)) ||
3432 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3433 VD->getType().isConstQualified())))
3436 if (CodeGenOpts.KeepInlineFunctions)
3437 if (
const auto *FD = dyn_cast_if_present<FunctionDecl>(D))
3443static std::vector<std::string>
3445 llvm::StringMap<bool> &FeatureMap) {
3446 llvm::StringMap<bool> DefaultFeatureMap;
3450 std::vector<std::string> Delta;
3451 for (
const auto &[K,
V] : FeatureMap) {
3452 auto DefaultIt = DefaultFeatureMap.find(K);
3453 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3454 Delta.push_back((
V ?
"+" :
"-") + K.str());
3460bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3461 llvm::AttrBuilder &Attrs,
3462 bool SetTargetFeatures) {
3468 std::vector<std::string> Features;
3469 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3472 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3473 assert((!TD || !TV) &&
"both target_version and target specified");
3476 bool AddedAttr =
false;
3477 if (TD || TV || SD || TC) {
3478 llvm::StringMap<bool> FeatureMap;
3485 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3488 if (!FeatureStr.empty()) {
3489 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3490 if (!ParsedAttr.
CPU.empty() &&
3492 TargetCPU = ParsedAttr.
CPU;
3495 if (!ParsedAttr.
Tune.empty() &&
3497 TuneCPU = ParsedAttr.
Tune;
3513 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3514 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3515 Entry.getKey().str());
3521 llvm::StringMap<bool> FeatureMap;
3540 if (!TargetCPU.empty()) {
3541 Attrs.addAttribute(
"target-cpu", TargetCPU);
3544 if (!TuneCPU.empty()) {
3545 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3548 if (!Features.empty() && SetTargetFeatures) {
3549 llvm::erase_if(Features, [&](
const std::string& F) {
3552 if (!Features.empty()) {
3553 llvm::sort(Features);
3554 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3560 llvm::SmallVector<StringRef, 8> Feats;
3561 bool IsDefault =
false;
3563 IsDefault = TV->isDefaultVersion();
3564 TV->getFeatures(Feats);
3570 Attrs.addAttribute(
"fmv-features");
3572 }
else if (!Feats.empty()) {
3574 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3575 std::string FMVFeatures;
3576 for (StringRef F : OrderedFeats)
3577 FMVFeatures.append(
"," + F.str());
3578 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3585void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3586 llvm::GlobalObject *GO) {
3591 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3594 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3595 GV->addAttribute(
"bss-section", SA->getName());
3596 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3597 GV->addAttribute(
"data-section", SA->getName());
3598 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3599 GV->addAttribute(
"rodata-section", SA->getName());
3600 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3601 GV->addAttribute(
"relro-section", SA->getName());
3604 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3607 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3608 if (!D->
getAttr<SectionAttr>())
3609 F->setSection(SA->getName());
3611 llvm::AttrBuilder Attrs(F->getContext());
3612 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3616 llvm::AttributeMask RemoveAttrs;
3617 RemoveAttrs.addAttribute(
"target-cpu");
3618 RemoveAttrs.addAttribute(
"target-features");
3619 RemoveAttrs.addAttribute(
"fmv-features");
3620 RemoveAttrs.addAttribute(
"tune-cpu");
3621 F->removeFnAttrs(RemoveAttrs);
3622 F->addFnAttrs(Attrs);
3626 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3627 GO->setSection(CSA->getName());
3628 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3629 GO->setSection(SA->getName());
3642 F->setLinkage(llvm::Function::InternalLinkage);
3644 setNonAliasAttributes(GD, F);
3655 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3659 llvm::Function *F) {
3662 if (!F->hasLocalLinkage() ||
3663 F->getFunction().hasAddressTaken(
nullptr,
true,
3667 bool HasBody = FD->
hasBody(Def);
3668 if (!HasBody || !Def)
3685 ParamTypes.push_back(P->getType());
3690 llvm::LLVMContext::MD_callgraph,
3697 llvm::Function *F) {
3699 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3710 F->addTypeMetadata(0, MD);
3717 if (CodeGenOpts.SanitizeCfiCrossDso)
3719 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3723 llvm::CallBase *CB) {
3725 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall())
3729 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
getLLVMContext(), {TypeIdMD});
3730 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3731 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3735 llvm::LLVMContext &Ctx = F->getContext();
3736 llvm::MDBuilder MDB(Ctx);
3737 llvm::StringRef Salt;
3740 if (
const auto &Info = FP->getExtraAttributeInfo())
3741 Salt = Info.CFISalt;
3743 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3752 return llvm::all_of(Name, [](
const char &
C) {
3753 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3759 for (
auto &F : M.functions()) {
3761 bool AddressTaken = F.hasAddressTaken();
3762 if (!AddressTaken && F.hasLocalLinkage())
3763 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3768 if (!AddressTaken || !F.isDeclaration())
3771 const llvm::ConstantInt *
Type;
3772 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3773 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3777 StringRef Name = F.getName();
3781 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3782 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3783 Twine(
Type->getSExtValue()) +
" */\n")
3785 M.appendModuleInlineAsm(
Asm);
3789void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3790 bool IsIncompleteFunction,
3793 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3801 if (!IsIncompleteFunction)
3808 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3810 assert(!F->arg_empty() &&
3811 F->arg_begin()->getType()
3812 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3813 "unexpected this return");
3814 F->addParamAttr(0, llvm::Attribute::Returned);
3824 if (!IsIncompleteFunction && F->isDeclaration())
3827 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3828 F->setSection(CSA->getName());
3829 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3830 F->setSection(SA->getName());
3832 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3834 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3835 else if (EA->isWarning())
3836 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3841 const FunctionDecl *FDBody;
3842 bool HasBody = FD->
hasBody(FDBody);
3844 assert(HasBody &&
"Inline builtin declarations should always have an "
3846 if (shouldEmitFunction(FDBody))
3847 F->addFnAttr(llvm::Attribute::NoBuiltin);
3853 F->addFnAttr(llvm::Attribute::NoBuiltin);
3857 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3858 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3859 if (MD->isVirtual())
3860 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3866 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3867 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3870 if (CodeGenOpts.CallGraphSection)
3873 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3879 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3880 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3882 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3886 llvm::LLVMContext &Ctx = F->getContext();
3887 llvm::MDBuilder MDB(Ctx);
3891 int CalleeIdx = *CB->encoding_begin();
3892 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3893 F->addMetadata(llvm::LLVMContext::MD_callback,
3894 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3895 CalleeIdx, PayloadIndices,
3902 "Only globals with definition can force usage.");
3903 LLVMUsed.emplace_back(GV);
3907 assert(!GV->isDeclaration() &&
3908 "Only globals with definition can force usage.");
3909 LLVMCompilerUsed.emplace_back(GV);
3914 "Only globals with definition can force usage.");
3916 LLVMCompilerUsed.emplace_back(GV);
3918 LLVMUsed.emplace_back(GV);
3922 std::vector<llvm::WeakTrackingVH> &List) {
3932 UsedArray.reserve(List.size());
3933 for (
const llvm::WeakTrackingVH &VH : List) {
3934 if (llvm::Value *
V = VH)
3935 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3939 if (UsedArray.empty())
3941 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3943 auto *GV =
new llvm::GlobalVariable(
3944 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3945 llvm::ConstantArray::get(ATy, UsedArray), Name);
3947 GV->setSection(
"llvm.metadata");
3950void CodeGenModule::emitLLVMUsed() {
3951 emitUsed(*
this,
"llvm.used", LLVMUsed);
3952 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3957 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3966 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3972 ELFDependentLibraries.push_back(
3973 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3980 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3987void CodeGenModule::ProcessPragmaCommentCopyright(StringRef Comment,
3988 bool isFromASTFile) {
3990 "pragma comment copyright is supported only when targeting AIX");
4003 assert(!LoadTimeCommentGlobal &&
4004 "Only one copyright pragma allowed per translation unit.");
4009 uint64_t Hash = xxh3_64bits(Comment);
4010 std::string GlobalName =
4011 (
"__loadtime_comment_str_" + Twine::utohexstr(Hash)).str();
4014 llvm::Constant *StrInit =
4015 llvm::ConstantDataArray::getString(
C, Comment,
true);
4018 auto *GV =
new llvm::GlobalVariable(
getModule(), StrInit->getType(),
4020 llvm::GlobalValue::WeakODRLinkage,
4021 StrInit, GlobalName);
4023 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
4024 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4025 GV->setAlignment(llvm::Align(1));
4031 GV->setSection(
"__loadtime_comment");
4034 GV->setMetadata(
"loadtime_comment", llvm::MDNode::get(
C, {}));
4037 llvm::appendToCompilerUsed(
getModule(), {GV});
4039 LoadTimeCommentGlobal = GV;
4048 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
4054 if (Visited.insert(Import).second)
4071 if (LL.IsFramework) {
4072 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
4073 llvm::MDString::get(Context, LL.Library)};
4075 Metadata.push_back(llvm::MDNode::get(Context, Args));
4081 llvm::Metadata *Args[2] = {
4082 llvm::MDString::get(Context,
"lib"),
4083 llvm::MDString::get(Context, LL.Library),
4085 Metadata.push_back(llvm::MDNode::get(Context, Args));
4089 auto *OptString = llvm::MDString::get(Context, Opt);
4090 Metadata.push_back(llvm::MDNode::get(Context, OptString));
4095void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
4097 "We should only emit module initializers for named modules.");
4105 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
4122 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
4128void CodeGenModule::EmitModuleLinkOptions() {
4132 llvm::SetVector<clang::Module *> LinkModules;
4133 llvm::SmallPtrSet<clang::Module *, 16> Visited;
4134 SmallVector<clang::Module *, 16> Stack;
4137 for (
Module *M : ImportedModules) {
4140 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
4143 if (Visited.insert(M).second)
4149 while (!Stack.empty()) {
4152 bool AnyChildren =
false;
4161 if (Visited.insert(SM).second) {
4162 Stack.push_back(SM);
4170 LinkModules.insert(Mod);
4177 SmallVector<llvm::MDNode *, 16> MetadataArgs;
4179 for (
Module *M : LinkModules)
4180 if (Visited.insert(M).second)
4182 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
4183 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
4186 if (!LinkerOptionsMetadata.empty()) {
4187 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
4188 for (
auto *MD : LinkerOptionsMetadata)
4189 NMD->addOperand(MD);
4193void CodeGenModule::EmitDeferred() {
4202 if (!DeferredVTables.empty()) {
4203 EmitDeferredVTables();
4208 assert(DeferredVTables.empty());
4215 llvm::append_range(DeferredDeclsToEmit,
4219 if (DeferredDeclsToEmit.empty())
4224 std::vector<GlobalDecl> CurDeclsToEmit;
4225 CurDeclsToEmit.swap(DeferredDeclsToEmit);
4227 for (GlobalDecl &D : CurDeclsToEmit) {
4233 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
4237 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
4258 if (GV && !GV->isDeclaration()) {
4259 GlobalDecl ExistingGD;
4282 if (!GV->isDeclaration())
4286 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
4290 EmitGlobalDefinition(D, GV);
4295 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
4297 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
4302void CodeGenModule::EmitVTablesOpportunistically() {
4308 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
4309 &&
"Only emit opportunistic vtables with optimizations");
4311 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
4313 "This queue should only contain external vtables");
4314 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
4315 VTables.GenerateClassData(RD);
4317 OpportunisticVTables.clear();
4321 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
4326 DeferredAnnotations.clear();
4328 if (Annotations.empty())
4332 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
4333 Annotations[0]->
getType(), Annotations.size()), Annotations);
4334 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
4335 llvm::GlobalValue::AppendingLinkage,
4336 Array,
"llvm.global.annotations");
4341 llvm::Constant *&AStr = AnnotationStrings[Str];
4346 llvm::Constant *s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
4347 auto *gv =
new llvm::GlobalVariable(
4348 getModule(), s->getType(),
true, llvm::GlobalValue::PrivateLinkage, s,
4349 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
4352 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4370 return llvm::ConstantInt::get(
Int32Ty, LineNo);
4378 llvm::FoldingSetNodeID ID;
4379 for (
Expr *E : Exprs) {
4382 llvm::Constant *&Lookup = AnnotationArgs[ID.computeHash()];
4387 LLVMArgs.reserve(Exprs.size());
4389 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
4391 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
4394 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
4395 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
4396 llvm::GlobalValue::PrivateLinkage,
Struct,
4399 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4406 const AnnotateAttr *AA,
4414 llvm::Constant *GVInGlobalsAS = GV;
4415 if (GV->getAddressSpace() !=
4417 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
4419 llvm::PointerType::get(
4420 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
4424 llvm::Constant *Fields[] = {
4425 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
4427 return llvm::ConstantStruct::getAnon(Fields);
4431 llvm::GlobalValue *GV) {
4432 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
4442 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
4445 auto &SM = Context.getSourceManager();
4446 FileEntryRef MainFile = *SM.getFileEntryRefForID(SM.getMainFileID());
4447 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
4452 return NoSanitizeL.containsLocation(Kind, Loc);
4455 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
4459 llvm::GlobalVariable *GV,
4461 StringRef Category)
const {
4463 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
4465 auto &SM = Context.getSourceManager();
4466 if (NoSanitizeL.containsMainFile(
4467 Kind, SM.getFileEntryRefForID(SM.getMainFileID())->getName(),
4470 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
4477 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
4478 Ty = AT->getElementType();
4483 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4491 StringRef Category)
const {
4494 auto Attr = ImbueAttr::NONE;
4496 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4497 if (
Attr == ImbueAttr::NONE)
4498 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4500 case ImbueAttr::NONE:
4502 case ImbueAttr::ALWAYS:
4503 Fn->addFnAttr(
"function-instrument",
"xray-always");
4505 case ImbueAttr::ALWAYS_ARG1:
4506 Fn->addFnAttr(
"function-instrument",
"xray-always");
4507 Fn->addFnAttr(
"xray-log-args",
"1");
4509 case ImbueAttr::NEVER:
4510 Fn->addFnAttr(
"function-instrument",
"xray-never");
4523 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4533 auto &SM = Context.getSourceManager();
4534 if (
auto MainFile = SM.getFileEntryRefForID(SM.getMainFileID()))
4548 if (NumGroups > 1) {
4549 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4558 if (LangOpts.EmitAllDecls)
4561 const auto *VD = dyn_cast<VarDecl>(
Global);
4563 ((CodeGenOpts.KeepPersistentStorageVariables &&
4564 (VD->getStorageDuration() ==
SD_Static ||
4565 VD->getStorageDuration() ==
SD_Thread)) ||
4566 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4567 VD->getType().isConstQualified())))
4570 if (CodeGenOpts.KeepInlineFunctions)
4571 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global))
4586 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4587 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4588 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4589 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4593 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4603 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4610 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4611 if (Context.getInlineVariableDefinitionKind(VD) ==
4616 if (CXX20ModuleInits && VD->getOwningModule() &&
4617 !VD->getOwningModule()->isModuleMapModule()) {
4626 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4629 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4642 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4646 llvm::Constant *
Init;
4649 if (!
V.isAbsent()) {
4660 llvm::Constant *Fields[4] = {
4664 llvm::ConstantDataArray::getRaw(
4665 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4667 Init = llvm::ConstantStruct::getAnon(Fields);
4670 auto *GV =
new llvm::GlobalVariable(
4672 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4674 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4677 if (!
V.isAbsent()) {
4690 llvm::GlobalVariable **Entry =
nullptr;
4691 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4696 llvm::Constant *
Init;
4700 assert(!
V.isAbsent());
4704 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4706 llvm::GlobalValue::PrivateLinkage,
Init,
4708 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4723 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4727 llvm::Constant *
Init =
Emitter.emitForInitializer(
4735 llvm::GlobalValue::LinkageTypes
Linkage =
4737 ? llvm::GlobalValue::LinkOnceODRLinkage
4738 : llvm::GlobalValue::InternalLinkage;
4739 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4743 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4750 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4751 assert(AA &&
"No alias?");
4761 llvm::Constant *Aliasee;
4763 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4771 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4772 WeakRefReferences.insert(F);
4780 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4783 const auto *AA =
Global->getAttr<AliasAttr>();
4791 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4792 if (LangOpts.OpenMPIsTargetDevice)
4793 return !AliaseeDecl ||
4794 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4797 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4798 const bool AliaseeHasDeviceAttr =
4799 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4801 if (LangOpts.CUDAIsDevice)
4802 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4813 if (
Global->hasAttr<WeakRefAttr>())
4818 if (
Global->hasAttr<AliasAttr>()) {
4821 return EmitAliasDefinition(GD);
4825 if (
Global->hasAttr<IFuncAttr>())
4826 return emitIFuncDefinition(GD);
4829 if (
Global->hasAttr<CPUDispatchAttr>())
4830 return emitCPUDispatchDefinition(GD);
4836 if (LangOpts.OpenMP) {
4838 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4840 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4841 if (MustBeEmitted(
Global))
4845 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4846 if (MustBeEmitted(
Global))
4853 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4854 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4860 if (FD->
hasAttr<AnnotateAttr>()) {
4863 DeferredAnnotations[MangledName.str()] = FD;
4878 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4884 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4886 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4887 if (LangOpts.OpenMP) {
4889 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4890 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4894 if (VD->hasExternalStorage() &&
4895 Res != OMPDeclareTargetDeclAttr::MT_Link)
4898 bool UnifiedMemoryEnabled =
4900 if (*Res == OMPDeclareTargetDeclAttr::MT_Local ||
4901 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4902 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4903 !UnifiedMemoryEnabled)) {
4906 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4907 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4908 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4909 UnifiedMemoryEnabled)) &&
4910 "Link clause or to clause with unified memory expected.");
4920 if (LangOpts.HLSL) {
4921 if (VD->getStorageClass() ==
SC_Extern) {
4930 if (Context.getInlineVariableDefinitionKind(VD) ==
4940 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4942 EmitGlobalDefinition(GD);
4943 addEmittedDeferredDecl(GD);
4951 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4952 CXXGlobalInits.push_back(
nullptr);
4958 addDeferredDeclToEmit(GD);
4959 }
else if (MustBeEmitted(
Global)) {
4961 assert(!MayBeEmittedEagerly(
Global));
4962 addDeferredDeclToEmit(GD);
4967 DeferredDecls[MangledName] = GD;
4973 if (
const auto *RT =
4974 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4975 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4976 RD = RD->getDefinitionOrSelf();
4977 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4986struct DLLImportFunctionVisitor
4987 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4988 bool SafeToInline =
true;
4990 bool shouldVisitImplicitCode()
const {
return true; }
4992 bool VisitVarDecl(VarDecl *VD) {
4995 SafeToInline =
false;
4996 return SafeToInline;
5003 return SafeToInline;
5006 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
5008 SafeToInline = D->
hasAttr<DLLImportAttr>();
5009 return SafeToInline;
5012 bool VisitDeclRefExpr(DeclRefExpr *E) {
5015 SafeToInline = VD->
hasAttr<DLLImportAttr>();
5016 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
5017 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
5018 return SafeToInline;
5021 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
5023 return SafeToInline;
5026 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
5030 SafeToInline =
true;
5032 SafeToInline = M->
hasAttr<DLLImportAttr>();
5034 return SafeToInline;
5037 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
5039 return SafeToInline;
5042 bool VisitCXXNewExpr(CXXNewExpr *E) {
5044 return SafeToInline;
5049bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
5056 if (F->isInlineBuiltinDeclaration())
5059 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
5064 if (
const Module *M = F->getOwningModule();
5065 M && M->getTopLevelModule()->isNamedModule() &&
5066 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
5076 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
5081 if (F->hasAttr<NoInlineAttr>())
5084 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
5086 DLLImportFunctionVisitor Visitor;
5087 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
5088 if (!Visitor.SafeToInline)
5091 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
5098 for (
const CXXBaseSpecifier &B :
Dtor->getParent()->bases())
5112bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
5113 return CodeGenOpts.OptimizationLevel > 0;
5116void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
5117 llvm::GlobalValue *GV) {
5121 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
5122 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
5124 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
5125 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
5126 if (TC->isFirstOfVersion(I))
5129 EmitGlobalFunctionDefinition(GD, GV);
5135 AddDeferredMultiVersionResolverToEmit(GD);
5137 GetOrCreateMultiVersionResolver(GD);
5141void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
5144 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
5145 Context.getSourceManager(),
5146 "Generating code for declaration");
5148 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
5151 if (!shouldEmitFunction(GD))
5154 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
5156 llvm::raw_string_ostream
OS(Name);
5162 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
5166 ABI->emitCXXStructor(GD);
5168 EmitMultiVersionFunctionDefinition(GD, GV);
5170 EmitGlobalFunctionDefinition(GD, GV);
5179 return EmitMultiVersionFunctionDefinition(GD, GV);
5180 return EmitGlobalFunctionDefinition(GD, GV);
5183 if (
const auto *VD = dyn_cast<VarDecl>(D))
5184 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
5186 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
5190 llvm::Function *NewFn);
5206static llvm::GlobalValue::LinkageTypes
5210 return llvm::GlobalValue::InternalLinkage;
5211 return llvm::GlobalValue::WeakODRLinkage;
5214void CodeGenModule::emitMultiVersionFunctions() {
5215 std::vector<GlobalDecl> MVFuncsToEmit;
5216 MultiVersionFuncs.swap(MVFuncsToEmit);
5217 for (GlobalDecl GD : MVFuncsToEmit) {
5219 assert(FD &&
"Expected a FunctionDecl");
5221 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
5222 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
5226 if (
Decl->isDefined()) {
5227 EmitGlobalFunctionDefinition(CurGD,
nullptr);
5235 assert(
Func &&
"This should have just been created");
5243 bool ShouldEmitResolver = !
getTriple().isAArch64();
5244 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5245 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
5248 FD, [&](
const FunctionDecl *CurFD) {
5249 llvm::SmallVector<StringRef, 8> Feats;
5252 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
5254 TA->getX86AddedFeatures(Feats);
5255 llvm::Function *
Func = createFunction(CurFD);
5256 DeclMap.insert({
Func, CurFD});
5257 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
5258 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
5259 if (TVA->isDefaultVersion() && IsDefined)
5260 ShouldEmitResolver =
true;
5261 llvm::Function *
Func = createFunction(CurFD);
5262 DeclMap.insert({
Func, CurFD});
5264 TVA->getFeatures(Feats, Delim);
5265 Options.emplace_back(
Func, Feats);
5266 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
5267 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
5268 if (!TC->isFirstOfVersion(I))
5270 if (TC->isDefaultVersion(I) && IsDefined)
5271 ShouldEmitResolver =
true;
5272 llvm::Function *
Func = createFunction(CurFD, I);
5273 DeclMap.insert({
Func, CurFD});
5276 TC->getX86Feature(Feats, I);
5277 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
5280 TC->getFeatures(Feats, I, Delim);
5281 Options.emplace_back(
Func, Feats);
5285 llvm_unreachable(
"unexpected MultiVersionKind");
5288 if (!ShouldEmitResolver)
5291 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
5292 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
5293 ResolverConstant = IFunc->getResolver();
5298 *
this, GD, FD,
true);
5305 auto *Alias = llvm::GlobalAlias::create(
5307 MangledName +
".ifunc", IFunc, &
getModule());
5316 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
5317 const CodeGenFunction::FMVResolverOption &RHS) {
5323 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
5324 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
5325 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
5326 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
5327 return LHS.isSubsetOf(RHS);
5329 Diags.Report(DeclMap[I->Function]->getLocation(),
5330 diag::warn_unreachable_version)
5331 << I->Function->getName();
5332 assert(I->Function->user_empty() &&
"unexpected users");
5333 I->Function->eraseFromParent();
5334 I->Function =
nullptr;
5338 CodeGenFunction CGF(*
this);
5339 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5341 setMultiVersionResolverAttributes(ResolverFunc, GD);
5343 ResolverFunc->setComdat(
5344 getModule().getOrInsertComdat(ResolverFunc->getName()));
5350 if (!MVFuncsToEmit.empty())
5355 if (!MultiVersionFuncs.empty())
5356 emitMultiVersionFunctions();
5366 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
5368 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
5369 llvm::GlobalVariable::ExternalWeakLinkage,
5371 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5376void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
5377 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
5379 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
5381 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
5382 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
5383 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
5384 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5386 DS->takeName(OldDS);
5387 OldDS->replaceAllUsesWith(DS);
5388 OldDS->eraseFromParent();
5394 llvm::Constant *
New) {
5397 Old->replaceAllUsesWith(
New);
5398 Old->eraseFromParent();
5401void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5403 assert(FD &&
"Not a FunctionDecl?");
5405 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5406 assert(DD &&
"Not a cpu_dispatch Function?");
5412 UpdateMultiVersionNames(GD, FD, ResolverName);
5414 llvm::Type *ResolverType;
5415 GlobalDecl ResolverGD;
5417 ResolverType = llvm::FunctionType::get(
5423 ResolverType = DeclTy;
5428 ResolverName, ResolverType, ResolverGD,
false));
5431 ResolverFunc->setComdat(
5432 getModule().getOrInsertComdat(ResolverFunc->getName()));
5434 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5437 for (
const IdentifierInfo *II : DD->cpus()) {
5445 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5448 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5454 Func = GetOrCreateLLVMFunction(
5455 MangledName, DeclTy, ExistingDecl,
5461 llvm::SmallVector<StringRef, 32> Features;
5462 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5463 llvm::transform(Features, Features.begin(),
5464 [](StringRef Str) { return Str.substr(1); });
5465 llvm::erase_if(Features, [&Target](StringRef Feat) {
5466 return !Target.validateCpuSupports(Feat);
5472 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5473 const CodeGenFunction::FMVResolverOption &RHS) {
5474 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5475 llvm::X86::getCpuSupportsMask(RHS.
Features);
5482 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5483 (Options.end() - 2)->Features),
5484 [](
auto X) { return X == 0; })) {
5485 StringRef LHSName = (Options.end() - 2)->Function->getName();
5486 StringRef RHSName = (Options.end() - 1)->Function->getName();
5487 if (LHSName.compare(RHSName) < 0)
5488 Options.erase(Options.end() - 2);
5490 Options.erase(Options.end() - 1);
5493 CodeGenFunction CGF(*
this);
5494 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5495 setMultiVersionResolverAttributes(ResolverFunc, GD);
5500 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5505 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5511 std::string AliasName =
5515 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5523void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5525 assert(FD &&
"Not a FunctionDecl?");
5528 std::string MangledName =
5530 if (!DeferredResolversToEmit.insert(MangledName).second)
5533 MultiVersionFuncs.push_back(GD);
5539llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5541 assert(FD &&
"Not a FunctionDecl?");
5543 std::string MangledName =
5548 std::string ResolverName = MangledName;
5552 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5556 ResolverName +=
".ifunc";
5563 ResolverName +=
".resolver";
5566 bool ShouldReturnIFunc =
5585 AddDeferredMultiVersionResolverToEmit(GD);
5589 if (ShouldReturnIFunc) {
5591 llvm::Type *ResolverType = llvm::FunctionType::get(
5593 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5594 MangledName +
".resolver", ResolverType, GlobalDecl{},
5602 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5604 GIF->setName(ResolverName);
5611 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5612 ResolverName, DeclTy, GlobalDecl{},
false);
5614 "Resolver should be created for the first time");
5619void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5621 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5634 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5645bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5646 const llvm::GlobalValue *GV)
const {
5647 auto SC = GV->getDLLStorageClass();
5648 if (SC == llvm::GlobalValue::DefaultStorageClass)
5651 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5652 !MRD->
hasAttr<DLLImportAttr>()) ||
5653 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5654 !MRD->
hasAttr<DLLExportAttr>())) &&
5665llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5666 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5667 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5671 std::string NameWithoutMultiVersionMangling;
5672 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5674 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5675 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5676 !DontDefer && !IsForDefinition) {
5679 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5681 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5684 GDDef = GlobalDecl(FDDef);
5692 UpdateMultiVersionNames(GD, FD, MangledName);
5693 if (!IsForDefinition) {
5699 AddDeferredMultiVersionResolverToEmit(GD);
5701 *
this, GD, FD,
true);
5710 *
this, GD, FD,
true);
5712 return GetOrCreateMultiVersionResolver(GD);
5717 if (!NameWithoutMultiVersionMangling.empty())
5718 MangledName = NameWithoutMultiVersionMangling;
5723 if (WeakRefReferences.erase(Entry)) {
5724 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5725 if (FD && !FD->
hasAttr<WeakAttr>())
5726 Entry->setLinkage(llvm::Function::ExternalLinkage);
5730 if (D && shouldDropDLLAttribute(D, Entry)) {
5731 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5737 if (IsForDefinition && !Entry->isDeclaration()) {
5744 DiagnosedConflictingDefinitions.insert(GD).second) {
5748 diag::note_previous_definition);
5753 (Entry->getValueType() == Ty)) {
5760 if (!IsForDefinition)
5767 bool IsIncompleteFunction =
false;
5769 llvm::FunctionType *FTy;
5773 FTy = llvm::FunctionType::get(
VoidTy,
false);
5774 IsIncompleteFunction =
true;
5778 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5779 Entry ? StringRef() : MangledName, &
getModule());
5783 if (D && D->
hasAttr<AnnotateAttr>())
5801 if (!Entry->use_empty()) {
5803 Entry->removeDeadConstantUsers();
5809 assert(F->getName() == MangledName &&
"name was uniqued!");
5811 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5812 if (ExtraAttrs.hasFnAttrs()) {
5813 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5821 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5824 addDeferredDeclToEmit(GD);
5829 auto DDI = DeferredDecls.find(MangledName);
5830 if (DDI != DeferredDecls.end()) {
5834 addDeferredDeclToEmit(DDI->second);
5835 DeferredDecls.erase(DDI);
5863 if (!IsIncompleteFunction) {
5864 assert(F->getFunctionType() == Ty);
5882 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5892 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5895 DD->getParent()->getNumVBases() == 0)
5900 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5901 false, llvm::AttributeList(),
5904 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5908 if (IsForDefinition)
5916 llvm::GlobalValue *F =
5919 return llvm::NoCFIValue::get(F);
5929 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5932 if (!
C.getLangOpts().CPlusPlus)
5937 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5938 ?
C.Idents.get(
"terminate")
5939 :
C.Idents.get(Name);
5941 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5945 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
5946 for (
const auto *
Result : LSD->lookup(&NS))
5947 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
5952 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5961 llvm::Function *F, StringRef Name) {
5970 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5971 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5972 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5979 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5980 if (AssumeConvergent) {
5982 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5985 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5990 llvm::Constant *
C = GetOrCreateLLVMFunction(
5992 false,
false, ExtraAttrs);
5994 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
6010 llvm::AttributeList ExtraAttrs,
bool Local,
6011 bool AssumeConvergent) {
6012 if (AssumeConvergent) {
6014 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
6018 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
6022 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
6031 markRegisterParameterAttributes(F);
6057 if (WeakRefReferences.erase(Entry)) {
6058 if (D && !D->
hasAttr<WeakAttr>())
6059 Entry->setLinkage(llvm::Function::ExternalLinkage);
6063 if (D && shouldDropDLLAttribute(D, Entry))
6064 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
6066 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
6069 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
6074 if (IsForDefinition && !Entry->isDeclaration()) {
6082 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
6084 DiagnosedConflictingDefinitions.insert(D).second) {
6088 diag::note_previous_definition);
6093 if (Entry->getType()->getAddressSpace() != TargetAS)
6094 return llvm::ConstantExpr::getAddrSpaceCast(
6095 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
6099 if (!IsForDefinition)
6105 auto *GV =
new llvm::GlobalVariable(
6106 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
6107 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
6108 getContext().getTargetAddressSpace(DAddrSpace));
6113 GV->takeName(Entry);
6115 if (!Entry->use_empty()) {
6116 Entry->replaceAllUsesWith(GV);
6119 Entry->eraseFromParent();
6125 auto DDI = DeferredDecls.find(MangledName);
6126 if (DDI != DeferredDecls.end()) {
6129 addDeferredDeclToEmit(DDI->second);
6130 DeferredDecls.erase(DDI);
6135 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
6142 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
6148 CXXThreadLocals.push_back(D);
6156 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
6157 EmitGlobalVarDefinition(D);
6162 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
6163 GV->setSection(SA->getName());
6167 if (
getTriple().getArch() == llvm::Triple::xcore &&
6171 GV->setSection(
".cp.rodata");
6174 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
6175 GV->setCodeModel(CMA->getModel());
6180 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
6184 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
6185 bool HasMutableFields =
Record &&
Record->hasMutableFields();
6186 if (!HasMutableFields) {
6193 auto *InitType =
Init->getType();
6194 if (GV->getValueType() != InitType) {
6199 GV->setName(StringRef());
6204 ->stripPointerCasts());
6207 GV->eraseFromParent();
6210 GV->setInitializer(
Init);
6211 GV->setConstant(
true);
6212 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
6232 SanitizerMD->reportGlobal(GV, *D);
6237 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
6238 if (DAddrSpace != ExpectedAS)
6251 false, IsForDefinition);
6272 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
6273 llvm::Align Alignment) {
6274 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
6275 llvm::GlobalVariable *OldGV =
nullptr;
6279 if (GV->getValueType() == Ty)
6284 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
6289 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
6294 GV->takeName(OldGV);
6296 if (!OldGV->use_empty()) {
6297 OldGV->replaceAllUsesWith(GV);
6300 OldGV->eraseFromParent();
6304 !GV->hasAvailableExternallyLinkage())
6305 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6307 GV->setAlignment(Alignment);
6344 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
6352 if (GV && !GV->isDeclaration())
6357 if (!MustBeEmitted(D) && !GV) {
6358 DeferredDecls[MangledName] = D;
6363 EmitGlobalVarDefinition(D);
6368 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
6370 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
6385 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(
Addr)) {
6389 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
6392 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6394 if (!Fn->getSubprogram())
6400 return Context.toCharUnitsFromBits(
6405 if (LangOpts.OpenCL) {
6416 if (LangOpts.SYCLIsDevice &&
6420 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6425 if (D->
hasAttr<CUDAConstantAttr>())
6427 if (D->
hasAttr<CUDASharedAttr>())
6429 if (D->
hasAttr<CUDADeviceAttr>())
6437 if (LangOpts.OpenMP) {
6439 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6457static llvm::Constant *
6459 llvm::GlobalVariable *GV) {
6460 llvm::Constant *Cast = GV;
6465 GV, llvm::PointerType::get(
6472template<
typename SomeDecl>
6474 llvm::GlobalValue *GV) {
6489 const SomeDecl *
First = D->getFirstDecl();
6490 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6496 std::pair<StaticExternCMap::iterator, bool> R =
6497 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6502 R.first->second =
nullptr;
6510 llvm::GlobalObject &GO) {
6513 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6521void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6538 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6539 OpenMPRuntime->emitTargetGlobalVariable(D))
6542 llvm::TrackingVH<llvm::Constant>
Init;
6543 bool NeedsGlobalCtor =
false;
6547 bool IsDefinitionAvailableExternally =
6549 bool NeedsGlobalDtor =
6550 !IsDefinitionAvailableExternally &&
6557 if (IsDefinitionAvailableExternally &&
6568 std::optional<ConstantEmitter> emitter;
6573 bool IsCUDASharedVar =
6578 bool IsCUDAShadowVar =
6580 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6581 D->
hasAttr<CUDASharedAttr>());
6582 bool IsCUDADeviceShadowVar =
6587 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6588 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6592 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6595 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6596 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6597 }
else if (!InitExpr) {
6610 initializedGlobalDecl = GlobalDecl(D);
6611 emitter.emplace(*
this);
6612 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6620 if (!IsDefinitionAvailableExternally)
6621 NeedsGlobalCtor =
true;
6625 NeedsGlobalCtor =
false;
6637 DelayedCXXInitPosition.erase(D);
6644 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6649 llvm::Type* InitType =
Init->getType();
6650 llvm::Constant *Entry =
6654 Entry = Entry->stripPointerCasts();
6657 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6668 if (!GV || GV->getValueType() != InitType ||
6669 GV->getType()->getAddressSpace() !=
6673 Entry->setName(StringRef());
6678 ->stripPointerCasts());
6681 llvm::Constant *NewPtrForOldDecl =
6682 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6684 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6692 if (D->
hasAttr<AnnotateAttr>())
6705 if (LangOpts.CUDA) {
6706 if (LangOpts.CUDAIsDevice) {
6709 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6712 GV->setExternallyInitialized(
true);
6719 if (LangOpts.HLSL &&
6724 GV->setExternallyInitialized(
true);
6726 GV->setInitializer(
Init);
6733 emitter->finalize(GV);
6736 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6737 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6741 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6742 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6744 GV->setConstant(
true);
6749 if (std::optional<CharUnits> AlignValFromAllocate =
6751 AlignVal = *AlignValFromAllocate;
6769 Linkage == llvm::GlobalValue::ExternalLinkage &&
6770 Context.getTargetInfo().getTriple().isOSDarwin() &&
6772 Linkage = llvm::GlobalValue::InternalLinkage;
6777 if (LangOpts.HLSL &&
6779 Linkage = llvm::GlobalValue::ExternalLinkage;
6782 if (D->
hasAttr<DLLImportAttr>())
6783 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6784 else if (D->
hasAttr<DLLExportAttr>())
6785 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6787 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6789 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6791 GV->setConstant(
false);
6796 if (!GV->getInitializer()->isNullValue())
6797 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6800 setNonAliasAttributes(D, GV);
6802 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6804 CXXThreadLocals.push_back(D);
6811 if (NeedsGlobalCtor || NeedsGlobalDtor)
6812 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6814 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6819 DI->EmitGlobalVariable(GV, D);
6822llvm::GlobalValue::LinkageTypes
6826 return llvm::Function::InternalLinkage;
6829 return llvm::GlobalVariable::WeakAnyLinkage;
6833 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6838 return llvm::GlobalValue::AvailableExternallyLinkage;
6852 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6853 : llvm::Function::InternalLinkage;
6867 return llvm::Function::ExternalLinkage;
6870 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6871 : llvm::Function::InternalLinkage;
6872 return llvm::Function::WeakODRLinkage;
6879 CodeGenOpts.NoCommon))
6880 return llvm::GlobalVariable::CommonLinkage;
6886 if (D->
hasAttr<SelectAnyAttr>())
6887 return llvm::GlobalVariable::WeakODRLinkage;
6891 return llvm::GlobalVariable::ExternalLinkage;
6894llvm::GlobalValue::LinkageTypes
6903 llvm::Function *newFn) {
6905 if (old->use_empty())
6908 llvm::Type *newRetTy = newFn->getReturnType();
6913 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6915 llvm::User *user = ui->getUser();
6919 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6920 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6926 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6929 if (!callSite->isCallee(&*ui))
6934 if (callSite->getType() != newRetTy && !callSite->use_empty())
6939 llvm::AttributeList oldAttrs = callSite->getAttributes();
6942 unsigned newNumArgs = newFn->arg_size();
6943 if (callSite->arg_size() < newNumArgs)
6949 bool dontTransform =
false;
6950 for (llvm::Argument &A : newFn->args()) {
6951 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6952 dontTransform =
true;
6957 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6965 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6969 callSite->getOperandBundlesAsDefs(newBundles);
6971 llvm::CallBase *newCall;
6973 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6974 callSite->getIterator());
6977 newCall = llvm::InvokeInst::Create(
6978 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6979 newArgs, newBundles,
"", callSite->getIterator());
6983 if (!newCall->getType()->isVoidTy())
6984 newCall->takeName(callSite);
6985 newCall->setAttributes(
6986 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6987 oldAttrs.getRetAttrs(), newArgAttrs));
6988 newCall->setCallingConv(callSite->getCallingConv());
6991 if (!callSite->use_empty())
6992 callSite->replaceAllUsesWith(newCall);
6995 if (callSite->getDebugLoc())
6996 newCall->setDebugLoc(callSite->getDebugLoc());
6998 callSitesToBeRemovedFromParent.push_back(callSite);
7001 for (
auto *callSite : callSitesToBeRemovedFromParent) {
7002 callSite->eraseFromParent();
7016 llvm::Function *NewFn) {
7026 (LangOpts.CUDA && !
getContext().shouldEmitCUDADecl(VD)))
7038void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
7039 llvm::GlobalValue *GV) {
7047 if (!GV || (GV->getValueType() != Ty))
7053 if (!GV->isDeclaration())
7063 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
7064 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
7076 setNonAliasAttributes(GD, Fn);
7078 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
7079 (CodeGenOpts.OptimizationLevel == 0) &&
7082 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
7084 !D->
hasAttr<NoInlineAttr>() &&
7085 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
7086 !D->
hasAttr<OptimizeNoneAttr>() &&
7087 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
7088 !ShouldAddOptNone) {
7089 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
7099 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
7100 if (UnwindMode != llvm::WinX64EHUnwindMode::Default &&
7101 UnwindMode != llvm::WinX64EHUnwindMode::V3 &&
7102 Fn->needsUnwindTableEntry()) {
7103 bool HasEGPR =
false;
7104 if (Fn->hasFnAttribute(
"target-features")) {
7106 Fn->getFnAttribute(
"target-features").getValueAsString();
7108 Feats.split(Tokens,
',', -1,
false);
7109 for (StringRef
Tok : Tokens) {
7112 else if (
Tok ==
"-egpr")
7116 HasEGPR = Context.getTargetInfo().hasFeature(
"egpr");
7119 unsigned DiagID = Diags.getCustomDiagID(
7121 "EGPR target feature requires unwind version 3");
7127 auto GetPriority = [
this](
const auto *Attr) ->
int {
7128 Expr *E = Attr->getPriority();
7132 return Attr->DefaultPriority;
7135 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
7137 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
7143void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
7145 const AliasAttr *AA = D->
getAttr<AliasAttr>();
7146 assert(AA &&
"Not an alias?");
7150 if (AA->getAliasee() == MangledName) {
7151 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7158 if (Entry && !Entry->isDeclaration())
7161 Aliases.push_back(GD);
7167 llvm::Constant *Aliasee;
7168 llvm::GlobalValue::LinkageTypes
LT;
7170 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
7176 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
7183 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
7185 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
7188 if (GA->getAliasee() == Entry) {
7189 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7193 assert(Entry->isDeclaration());
7202 GA->takeName(Entry);
7204 Entry->replaceAllUsesWith(GA);
7205 Entry->eraseFromParent();
7207 GA->setName(MangledName);
7215 GA->setLinkage(llvm::Function::WeakAnyLinkage);
7218 if (
const auto *VD = dyn_cast<VarDecl>(D))
7219 if (VD->getTLSKind())
7230void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
7232 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
7233 assert(IFA &&
"Not an ifunc?");
7237 if (IFA->getResolver() == MangledName) {
7238 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7244 if (Entry && !Entry->isDeclaration()) {
7247 DiagnosedConflictingDefinitions.insert(GD).second) {
7248 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
7251 diag::note_previous_definition);
7256 Aliases.push_back(GD);
7262 llvm::Constant *Resolver =
7263 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
7267 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
7268 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
7270 if (GIF->getResolver() == Entry) {
7271 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7274 assert(Entry->isDeclaration());
7283 GIF->takeName(Entry);
7285 Entry->replaceAllUsesWith(GIF);
7286 Entry->eraseFromParent();
7288 GIF->setName(MangledName);
7294 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
7295 (llvm::Intrinsic::ID)IID, Tys);
7298static llvm::StringMapEntry<llvm::GlobalVariable *> &
7301 bool &IsUTF16,
unsigned &StringLength) {
7302 StringRef String = Literal->getString();
7303 unsigned NumBytes = String.size();
7306 if (!Literal->containsNonAsciiOrNull()) {
7307 StringLength = NumBytes;
7308 return *Map.insert(std::make_pair(String,
nullptr)).first;
7315 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
7316 llvm::UTF16 *ToPtr = &ToBuf[0];
7318 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
7319 ToPtr + NumBytes, llvm::strictConversion);
7322 StringLength = ToPtr - &ToBuf[0];
7326 return *Map.insert(std::make_pair(
7327 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7328 (StringLength + 1) * 2),
7334 unsigned StringLength = 0;
7335 bool isUTF16 =
false;
7336 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7341 if (
auto *
C = Entry.second)
7346 const llvm::Triple &Triple =
getTriple();
7349 const bool IsSwiftABI =
7350 static_cast<unsigned>(CFRuntime) >=
7355 if (!CFConstantStringClassRef) {
7356 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7358 Ty = llvm::ArrayType::get(Ty, 0);
7360 switch (CFRuntime) {
7364 CFConstantStringClassName =
7365 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7366 :
"$s10Foundation19_NSCFConstantStringCN";
7370 CFConstantStringClassName =
7371 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7372 :
"$S10Foundation19_NSCFConstantStringCN";
7376 CFConstantStringClassName =
7377 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7378 :
"__T010Foundation19_NSCFConstantStringCN";
7385 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7386 llvm::GlobalValue *GV =
nullptr;
7388 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7395 if ((VD = dyn_cast<VarDecl>(
Result)))
7398 if (Triple.isOSBinFormatELF()) {
7400 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7402 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7403 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7404 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7406 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7414 CFConstantStringClassRef =
7415 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7418 QualType CFTy = Context.getCFConstantStringType();
7423 auto Fields = Builder.beginStruct(STy);
7432 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7433 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7435 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7439 llvm::Constant *
C =
nullptr;
7442 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7443 Entry.first().size() / 2);
7444 C = llvm::ConstantDataArray::get(VMContext, Arr);
7446 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7452 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7453 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7454 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7457 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7458 : Context.getTypeAlignInChars(Context.CharTy);
7464 if (Triple.isOSBinFormatMachO())
7465 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7466 :
"__TEXT,__cstring,cstring_literals");
7469 else if (Triple.isOSBinFormatELF())
7470 GV->setSection(
".rodata");
7476 llvm::IntegerType *LengthTy =
7486 Fields.addInt(LengthTy, StringLength);
7494 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7496 llvm::GlobalVariable::PrivateLinkage);
7497 GV->addAttribute(
"objc_arc_inert");
7498 switch (Triple.getObjectFormat()) {
7499 case llvm::Triple::UnknownObjectFormat:
7500 llvm_unreachable(
"unknown file format");
7501 case llvm::Triple::DXContainer:
7502 case llvm::Triple::GOFF:
7503 case llvm::Triple::SPIRV:
7504 case llvm::Triple::XCOFF:
7505 llvm_unreachable(
"unimplemented");
7506 case llvm::Triple::COFF:
7507 case llvm::Triple::ELF:
7508 case llvm::Triple::Wasm:
7509 GV->setSection(
"cfstring");
7511 case llvm::Triple::MachO:
7512 GV->setSection(
"__DATA,__cfstring");
7521 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7525 if (ObjCFastEnumerationStateType.isNull()) {
7526 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7530 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7531 Context.getPointerType(Context.UnsignedLongTy),
7532 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7535 for (
size_t i = 0; i < 4; ++i) {
7540 FieldTypes[i],
nullptr,
7549 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7552 return ObjCFastEnumerationStateType;
7566 assert(CAT &&
"String literal not of constant array type!");
7568 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7572 llvm::Type *ElemTy = AType->getElementType();
7573 unsigned NumElements = AType->getNumElements();
7576 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7578 Elements.reserve(NumElements);
7580 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7582 Elements.resize(NumElements);
7583 return llvm::ConstantDataArray::get(VMContext, Elements);
7586 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7588 Elements.reserve(NumElements);
7590 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7592 Elements.resize(NumElements);
7593 return llvm::ConstantDataArray::get(VMContext, Elements);
7596static llvm::GlobalVariable *
7605 auto *GV =
new llvm::GlobalVariable(
7606 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7607 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7609 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7610 if (GV->isWeakForLinker()) {
7611 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7612 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7628 llvm::GlobalVariable **Entry =
nullptr;
7629 if (!LangOpts.WritableStrings) {
7630 Entry = &ConstantStringMap[
C];
7631 if (
auto GV = *Entry) {
7632 if (Alignment.
getAsAlign() > GV->getAlign().valueOrOne())
7635 GV->getValueType(), Alignment);
7640 StringRef GlobalVariableName;
7641 llvm::GlobalValue::LinkageTypes LT;
7646 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7647 !LangOpts.WritableStrings) {
7648 llvm::raw_svector_ostream Out(MangledNameBuffer);
7650 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7651 GlobalVariableName = MangledNameBuffer;
7653 LT = llvm::GlobalValue::PrivateLinkage;
7654 GlobalVariableName = Name;
7666 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7669 GV->getValueType(), Alignment);
7686 StringRef GlobalName) {
7687 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7692 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7695 llvm::GlobalVariable **Entry =
nullptr;
7696 if (!LangOpts.WritableStrings) {
7697 Entry = &ConstantStringMap[
C];
7698 if (
auto GV = *Entry) {
7699 if (Alignment.
getAsAlign() > GV->getAlign().valueOrOne())
7702 GV->getValueType(), Alignment);
7708 GlobalName, Alignment);
7713 GV->getValueType(), Alignment);
7731 MaterializedType = E->
getType();
7735 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7736 if (!InsertResult.second) {
7739 if (!InsertResult.first->second) {
7744 InsertResult.first->second =
new llvm::GlobalVariable(
7745 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7749 llvm::cast<llvm::GlobalVariable>(
7750 InsertResult.first->second->stripPointerCasts())
7759 llvm::raw_svector_ostream Out(Name);
7781 std::optional<ConstantEmitter> emitter;
7782 llvm::Constant *InitialValue =
nullptr;
7787 emitter.emplace(*
this);
7788 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7793 Type = InitialValue->getType();
7802 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7804 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7808 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7812 Linkage = llvm::GlobalVariable::InternalLinkage;
7816 auto *GV =
new llvm::GlobalVariable(
7818 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7819 if (emitter) emitter->finalize(GV);
7821 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7823 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7825 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7829 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7830 if (VD->getTLSKind())
7832 llvm::Constant *CV = GV;
7835 GV, llvm::PointerType::get(
7841 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7843 Entry->replaceAllUsesWith(CV);
7844 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7853void CodeGenModule::EmitObjCPropertyImplementations(
const
7866 if (!Getter || Getter->isSynthesizedAccessorStub())
7869 auto *Setter = PID->getSetterMethodDecl();
7870 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7881 if (ivar->getType().isDestructedType())
7902void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7915 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7930 getContext().getObjCIdType(),
nullptr, D,
true,
7936 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7941void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7948 EmitDeclContext(LSD);
7951void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7953 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7956 std::unique_ptr<CodeGenFunction> &CurCGF =
7957 GlobalTopLevelStmtBlockInFlight.first;
7961 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7969 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7970 FunctionArgList Args;
7972 const CGFunctionInfo &FnInfo =
7975 llvm::Function *
Fn = llvm::Function::Create(
7976 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7978 CurCGF.reset(
new CodeGenFunction(*
this));
7979 GlobalTopLevelStmtBlockInFlight.second = D;
7980 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7982 CXXGlobalInits.push_back(Fn);
7985 CurCGF->EmitStmt(D->
getStmt());
7988void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7989 for (
auto *I : DC->
decls()) {
7995 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7996 for (
auto *M : OID->methods())
8015 case Decl::CXXConversion:
8016 case Decl::CXXMethod:
8017 case Decl::Function:
8024 case Decl::CXXDeductionGuide:
8029 case Decl::Decomposition:
8030 case Decl::VarTemplateSpecialization:
8032 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
8033 for (
auto *B : DD->flat_bindings())
8034 if (
auto *HD = B->getHoldingVar())
8041 case Decl::IndirectField:
8045 case Decl::Namespace:
8048 case Decl::ClassTemplateSpecialization: {
8051 if (Spec->getSpecializationKind() ==
8053 Spec->hasDefinition())
8054 DI->completeTemplateDefinition(*Spec);
8056 case Decl::CXXRecord: {
8060 DI->EmitAndRetainType(
8064 DI->completeUnusedClass(*CRD);
8067 for (
auto *I : CRD->
decls())
8073 case Decl::UsingShadow:
8074 case Decl::ClassTemplate:
8075 case Decl::VarTemplate:
8077 case Decl::VarTemplatePartialSpecialization:
8078 case Decl::FunctionTemplate:
8079 case Decl::TypeAliasTemplate:
8088 case Decl::UsingEnum:
8092 case Decl::NamespaceAlias:
8096 case Decl::UsingDirective:
8100 case Decl::CXXConstructor:
8103 case Decl::CXXDestructor:
8107 case Decl::StaticAssert:
8108 case Decl::ExplicitInstantiation:
8115 case Decl::ObjCInterface:
8116 case Decl::ObjCCategory:
8119 case Decl::ObjCProtocol: {
8121 if (Proto->isThisDeclarationADefinition())
8122 ObjCRuntime->GenerateProtocol(Proto);
8126 case Decl::ObjCCategoryImpl:
8132 case Decl::ObjCImplementation: {
8134 EmitObjCPropertyImplementations(OMD);
8135 EmitObjCIvarInitializations(OMD);
8136 ObjCRuntime->GenerateClass(OMD);
8140 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
8141 OMD->getClassInterface()), OMD->getLocation());
8144 case Decl::ObjCMethod: {
8151 case Decl::ObjCCompatibleAlias:
8155 case Decl::PragmaComment: {
8157 switch (PCD->getCommentKind()) {
8159 llvm_unreachable(
"unexpected pragma comment kind");
8167 ProcessPragmaCommentCopyright(PCD->getArg(), PCD->isFromASTFile());
8177 case Decl::PragmaDetectMismatch: {
8183 case Decl::LinkageSpec:
8187 case Decl::FileScopeAsm: {
8189 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
8192 if (LangOpts.OpenMPIsTargetDevice)
8195 if (LangOpts.SYCLIsDevice)
8200 llvm::Module::GlobalAsmProperties Props;
8201 Props.TargetFeatures = llvm::join(TargetOpts.
Features,
",");
8202 Props.TargetCPU = TargetOpts.
CPU;
8204 llvm::Module::GlobalAsmFragment(AD->getAsmString(), Props));
8208 case Decl::TopLevelStmt:
8212 case Decl::Import: {
8216 if (!ImportedModules.insert(Import->getImportedModule()))
8220 if (!Import->getImportedOwningModule()) {
8222 DI->EmitImportDecl(*Import);
8228 if (CXX20ModuleInits && Import->getImportedModule() &&
8229 Import->getImportedModule()->isNamedModule())
8238 Visited.insert(Import->getImportedModule());
8239 Stack.push_back(Import->getImportedModule());
8241 while (!Stack.empty()) {
8243 if (!EmittedModuleInitializers.insert(Mod).second)
8246 for (
auto *D : Context.getModuleInitializers(Mod))
8253 if (Submodule->IsExplicit)
8256 if (Visited.insert(Submodule).second)
8257 Stack.push_back(Submodule);
8267 case Decl::OMPThreadPrivate:
8271 case Decl::OMPAllocate:
8275 case Decl::OMPDeclareReduction:
8279 case Decl::OMPDeclareMapper:
8283 case Decl::OMPRequires:
8288 case Decl::TypeAlias:
8290 DI->EmitAndRetainType(
getContext().getTypedefType(
8298 DI->EmitAndRetainType(
8305 DI->EmitAndRetainType(
8309 case Decl::HLSLRootSignature:
8312 case Decl::HLSLBuffer:
8316 case Decl::OpenACCDeclare:
8319 case Decl::OpenACCRoutine:
8334 if (!CodeGenOpts.CoverageMapping)
8337 case Decl::CXXConversion:
8338 case Decl::CXXMethod:
8339 case Decl::Function:
8340 case Decl::ObjCMethod:
8341 case Decl::CXXConstructor:
8342 case Decl::CXXDestructor: {
8351 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8361 if (!CodeGenOpts.CoverageMapping)
8363 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8364 if (Fn->isTemplateInstantiation())
8367 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8375 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8378 const Decl *D = Entry.first;
8380 case Decl::CXXConversion:
8381 case Decl::CXXMethod:
8382 case Decl::Function:
8383 case Decl::ObjCMethod: {
8390 case Decl::CXXConstructor: {
8397 case Decl::CXXDestructor: {
8414 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8415 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8416 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8417 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8418 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8427 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8428 return llvm::ConstantInt::get(i64, PtrInt);
8432 llvm::NamedMDNode *&GlobalMetadata,
8434 llvm::GlobalValue *
Addr) {
8435 if (!GlobalMetadata)
8437 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8440 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8443 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8446bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8447 llvm::GlobalValue *CppFunc) {
8449 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8452 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8455 if (Elem == CppFunc)
8461 for (llvm::User *User : Elem->users()) {
8465 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8466 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8469 for (llvm::User *CEUser : ConstExpr->users()) {
8470 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8471 IFuncs.push_back(IFunc);
8476 CEs.push_back(ConstExpr);
8477 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8478 IFuncs.push_back(IFunc);
8490 for (llvm::GlobalIFunc *IFunc : IFuncs)
8491 IFunc->setResolver(
nullptr);
8492 for (llvm::ConstantExpr *ConstExpr : CEs)
8493 ConstExpr->destroyConstant();
8497 Elem->eraseFromParent();
8499 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8504 llvm::FunctionType::get(IFunc->getType(),
false);
8505 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8506 CppFunc->getName(), ResolverTy, {},
false);
8507 IFunc->setResolver(Resolver);
8517void CodeGenModule::EmitStaticExternCAliases() {
8520 for (
auto &I : StaticExternCValues) {
8521 const IdentifierInfo *Name = I.first;
8522 llvm::GlobalValue *Val = I.second;
8530 llvm::GlobalValue *ExistingElem =
8535 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8542 auto Res = Manglings.find(MangledName);
8543 if (Res == Manglings.end())
8545 Result = Res->getValue();
8556void CodeGenModule::EmitDeclMetadata() {
8557 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8559 for (
auto &I : MangledDeclNames) {
8560 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8570void CodeGenFunction::EmitDeclMetadata() {
8571 if (LocalDeclMap.empty())
return;
8576 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8578 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8580 for (
auto &I : LocalDeclMap) {
8581 const Decl *D = I.first;
8582 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8583 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8585 Alloca->setMetadata(
8586 DeclPtrKind, llvm::MDNode::get(
8587 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8588 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8595void CodeGenModule::EmitVersionIdentMetadata() {
8596 llvm::NamedMDNode *IdentMetadata =
8597 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8599 llvm::LLVMContext &Ctx = TheModule.getContext();
8601 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8602 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8605void CodeGenModule::EmitCommandLineMetadata() {
8606 llvm::NamedMDNode *CommandLineMetadata =
8607 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8609 llvm::LLVMContext &Ctx = TheModule.getContext();
8611 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8612 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8615void CodeGenModule::EmitCoverageFile() {
8616 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8620 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8621 llvm::LLVMContext &Ctx = TheModule.getContext();
8622 auto *CoverageDataFile =
8624 auto *CoverageNotesFile =
8626 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8627 llvm::MDNode *CU = CUNode->getOperand(i);
8628 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8629 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8642 LangOpts.ObjCRuntime.isGNUFamily())
8643 return ObjCRuntime->GetEHType(Ty);
8650 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8652 for (
auto RefExpr : D->
varlist()) {
8655 VD->getAnyInitializer() &&
8656 !VD->getAnyInitializer()->isConstantInitializer(
getContext());
8662 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8663 CXXGlobalInits.push_back(InitFunction);
8667llvm::Metadata *CodeGenModule::CreateMetadataIdentifierImpl(
8668 QualType T, MetadataTypeMap &Map, StringRef Suffix,
bool ForceString) {
8671 FnType->getReturnType(), FnType->getParamTypes(),
8672 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8674 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
8679 std::string OutName;
8680 llvm::raw_string_ostream Out(OutName);
8685 Out <<
".normalized";
8708 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
8713 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
8717 return CreateMetadataIdentifierImpl(
T, GeneralizedMetadataIdMap,
8718 ".generalized",
false);
8731 if (Context.isPromotableIntegerType(Ty))
8732 return Context.getPromotedIntegerType(Ty);
8734 if (BT->getKind() == BuiltinType::Float ||
8735 BT->getKind() == BuiltinType::Half)
8736 return Context.DoubleTy;
8744 PromotedParamTypes.reserve(ParamTypes.size());
8748 return Context.getFunctionType(FNPT->
getReturnType(), PromotedParamTypes,
8756 return CreateMetadataIdentifierImpl(
T, CallGraphMetadataIdMap,
"",
8764 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8765 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8766 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8767 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8768 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8769 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8770 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8771 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8779 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8781 if (CodeGenOpts.SanitizeCfiCrossDso)
8783 VTable->addTypeMetadata(Offset.getQuantity(),
8784 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8787 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8788 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8794 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8804 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8819 bool forPointeeType) {
8830 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8837 bool AlignForArray =
T->isArrayType();
8843 if (
T->isIncompleteType()) {
8860 if (
T.getQualifiers().hasUnaligned()) {
8862 }
else if (forPointeeType && !AlignForArray &&
8863 (RD =
T->getAsCXXRecordDecl())) {
8874 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8887 if (NumAutoVarInit >= StopAfter) {
8890 if (!NumAutoVarInit) {
8904 const Decl *D)
const {
8908 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8910 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8916 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8920 llvm::MD5::MD5Result
Result;
8921 for (
const auto &Arg : PreprocessorOpts.Macros)
8922 Hash.update(Arg.first);
8926 llvm::sys::fs::UniqueID ID;
8930 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8935 << PLoc.
getFilename() << Status.getError().message();
8937 ID = Status->getUniqueID();
8939 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8940 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8947 assert(DeferredDeclsToEmit.empty() &&
8948 "Should have emitted all decls deferred to emit.");
8949 assert(NewBuilder->DeferredDecls.empty() &&
8950 "Newly created module should not have deferred decls");
8951 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8952 assert(EmittedDeferredDecls.empty() &&
8953 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8955 assert(NewBuilder->DeferredVTables.empty() &&
8956 "Newly created module should not have deferred vtables");
8957 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8959 assert(NewBuilder->EmittedVTables.empty() &&
8960 "Newly created module should not have defined vtables");
8961 NewBuilder->EmittedVTables = std::move(EmittedVTables);
8963 assert(NewBuilder->MangledDeclNames.empty() &&
8964 "Newly created module should not have mangled decl names");
8965 assert(NewBuilder->Manglings.empty() &&
8966 "Newly created module should not have manglings");
8967 NewBuilder->Manglings = std::move(Manglings);
8969 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8971 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
8975 std::string OutName;
8976 llvm::raw_string_ostream Out(OutName);
8984 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8990 if (Dtor && Dtor->isVirtual() && Dtor->hasAttr<DLLExportAttr>())
8993 return RequireVectorDeletingDtor.count(RD);
8997 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8999 RequireVectorDeletingDtor.insert(RD);
9013 if (Entry && !Entry->isDeclaration()) {
9018 auto *NewFn = llvm::Function::Create(
9020 llvm::Function::ExternalLinkage, VDName, &
getModule());
9021 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
9023 NewFn->takeName(VDEntry);
9024 VDEntry->replaceAllUsesWith(NewFn);
9025 VDEntry->eraseFromParent();
9026 Entry->replaceAllUsesWith(NewFn);
9027 Entry->eraseFromParent();
9032 addDeferredDeclToEmit(VectorDtorGD);
9036 llvm::GlobalAlias *GlobalDeleteAlias,
9040 PendingMSVCGlobalDeletes.insert({GlobalDeleteAlias, OperatorDeleteFD});
9062 "__global_delete wrapper is only used with the Microsoft ABI");
9064 llvm::LLVMContext &LLVMCtx = M.getContext();
9068 llvm::FunctionType *FnTy = GlobDeleteFn->getFunctionType();
9078 StringRef GlobDeleteMangledName = GlobDeleteFn->getName();
9079 StringRef Signature;
9080 const char *WrapperBase;
9081 if (GlobDeleteMangledName.starts_with(
"??3@")) {
9082 Signature = GlobDeleteMangledName.substr(4);
9083 WrapperBase =
"?__global_delete@@";
9084 }
else if (GlobDeleteMangledName.starts_with(
"??_V@")) {
9085 Signature = GlobDeleteMangledName.substr(5);
9086 WrapperBase =
"?__global_array_delete@@";
9088 llvm_unreachable(
"unexpected global operator delete mangling");
9091 std::string GlobalDeleteName = (WrapperBase + Signature).str();
9092 std::string EmptyGlobalDeleteName =
9093 (
"?__empty_global_delete@@" + Signature).str();
9097 if (llvm::GlobalValue *Existing = M.getNamedValue(GlobalDeleteName))
9106 llvm::Function *EmptyFn = M.getFunction(EmptyGlobalDeleteName);
9108 EmptyFn = llvm::Function::Create(
9109 FnTy, llvm::GlobalValue::LinkOnceODRLinkage, EmptyGlobalDeleteName, &M);
9110 EmptyFn->setComdat(M.getOrInsertComdat(EmptyGlobalDeleteName));
9111 EmptyFn->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
9118 auto *BB = llvm::BasicBlock::Create(LLVMCtx,
"", EmptyFn);
9119 llvm::Function *TrapFn =
9120 llvm::Intrinsic::getOrInsertDeclaration(&M, llvm::Intrinsic::trap);
9121 auto *TrapCall = llvm::CallInst::Create(TrapFn, {},
"", BB);
9122 TrapCall->setDoesNotReturn();
9123 TrapCall->setDoesNotThrow();
9124 new llvm::UnreachableInst(LLVMCtx, BB);
9138 auto *GlobalDeleteAlias = llvm::GlobalAlias::create(
9139 FnTy, GlobDeleteFn->getAddressSpace(), llvm::GlobalValue::WeakAnyLinkage,
9140 GlobalDeleteName, EmptyFn, &M);
9147 return GlobalDeleteAlias;
9159 if (!HasDirectGlobalDelete)
9162 for (
const auto &Entry : PendingMSVCGlobalDeletes) {
9163 llvm::GlobalAlias *Alias = Entry.first;
9171 llvm::Function::Create(FnTy, llvm::GlobalValue::LinkOnceODRLinkage,
9172 Alias->getAddressSpace(),
"", &
getModule());
9178 for (
auto &Arg : GlobDelFn->args())
9179 Args.push_back(&Arg);
9180 llvm::CallInst::Create(FnTy, RealDeleteFn, Args,
"", BB);
9185 Alias->replaceAllUsesWith(GlobDelFn);
9186 GlobDelFn->takeName(Alias);
9187 Alias->eraseFromParent();
9189 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 void setWindowsItaniumDLLImport(CIRGenModule &cgm, bool isLocal, cir::FuncOp funcOp, StringRef name)
static std::string getMangledNameImpl(CIRGenModule &cgm, GlobalDecl gd, const NamedDecl *nd)
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 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
This is an opaque type for sizes expressed in character units.
llvm::Align getAsAlign() const
Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit bytes.
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
static CharUnits One()
Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
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...
std::string getMangledNameIgnoringAsmLabel(GlobalDecl GD, const NamedDecl *ND)
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 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).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Represents a ValueDecl that came out of a declarator.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
This represents one expression.
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.
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
void mangleNameIgnoringAsmLabel(GlobalDecl GD, raw_ostream &)
ManglerKind getKind() const
virtual void needsUniqueInternalLinkageNames()
virtual void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, raw_ostream &)=0
bool shouldMangleDeclNameIgnoringAsmLabel(const NamedDecl *D)
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?
const char * getSignReturnAddressHardeningStr() const
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.
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.
LangAS getGlobalConstantAddressSpace(const LangOptions &LangOpts, const TargetInfo &Target)
Determines whether the language options require us to model unwind exceptions.
bool isVarDeclStrongDefinition(const ASTContext &Ctx, const VarDecl *D, bool NoCommon)
Check whether D is a strong definition, and thus must not be given common linkage.
bool hasUnwindExceptions(const LangOptions &LangOpts)
bool shouldBeInCOMDAT(const ASTContext &Ctx, const Decl &D)
Check whether D should be emitted into a COMDAT group.
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.
@ 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...
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.