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:
386const llvm::abi::TargetInfo &
388 if (TheLLVMABITargetInfo)
389 return *TheLLVMABITargetInfo;
393 switch (
T.getArch()) {
395 llvm_unreachable(
"LLVMABI lowering requested for an unsupported target");
397 case llvm::Triple::aarch64:
398 case llvm::Triple::aarch64_32:
399 case llvm::Triple::aarch64_be: {
401 llvm::abi::AArch64ABIKind Kind = llvm::abi::AArch64ABIKind::AAPCS;
402 if (ABI ==
"darwinpcs")
403 Kind = llvm::abi::AArch64ABIKind::DarwinPCS;
404 else if (
T.isOSWindows())
405 Kind = llvm::abi::AArch64ABIKind::Win64;
406 else if (ABI ==
"aapcs-soft")
407 Kind = llvm::abi::AArch64ABIKind::AAPCSSoft;
408 TheLLVMABITargetInfo = llvm::abi::createAArch64TargetInfo(TB, Kind);
409 return *TheLLVMABITargetInfo;
412 case llvm::Triple::bpfeb:
413 case llvm::Triple::bpfel:
414 TheLLVMABITargetInfo = llvm::abi::createBPFTargetInfo(TB);
415 return *TheLLVMABITargetInfo;
417 case llvm::Triple::x86_64: {
419 llvm::abi::X86AVXABILevel AVXLevel =
420 ABI ==
"avx512" ? llvm::abi::X86AVXABILevel::AVX512
421 : ABI ==
"avx" ? llvm::abi::X86AVXABILevel::AVX
422 : llvm::abi::X86AVXABILevel::None;
424 llvm::abi::ABICompatInfo CompatInfo;
426 CompatInfo.ClassifyIntegerMMXAsSSE =
427 Compat > LangOptions::ClangABI::Ver3_8 && !
T.isOSDarwin() &&
428 !
T.isPS() && !
T.isOSFreeBSD();
429 CompatInfo.HonorsRevision98 = !
T.isOSDarwin();
430 CompatInfo.PassInt128VectorsInMem = Compat > LangOptions::ClangABI::Ver9 &&
431 (
T.isOSLinux() ||
T.isOSNetBSD());
433 CompatInfo.ReturnCXXRecordGreaterThan128InMem =
434 Compat > LangOptions::ClangABI::Ver20 && !
T.isPS();
435 CompatInfo.Clang11Compat =
436 Compat <= LangOptions::ClangABI::Ver11 ||
T.isPS();
440 TheLLVMABITargetInfo = llvm::abi::createX86_64TargetInfo(
441 TB, AVXLevel, Has64BitPointers, CompatInfo);
442 return *TheLLVMABITargetInfo;
448 llvm::LLVMContext &Context,
452 if (Opts.AlignDouble || Opts.OpenCL)
455 llvm::Triple Triple =
Target.getTriple();
456 llvm::DataLayout DL(
Target.getDataLayoutString());
457 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
458 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
459 llvm::Align ClangAlign(Alignment / 8);
460 if (DLAlign != ClangAlign) {
461 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
462 <<
" mapping to " << *Ty <<
" has data layout alignment "
463 << DLAlign.value() <<
" while clang specifies "
464 << ClangAlign.value() <<
"\n";
469 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
471 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
473 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
475 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
478 if (Triple.getArch() != llvm::Triple::m68k)
479 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
482 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
483 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
484 Triple.getArch() != llvm::Triple::ve)
485 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
487 if (
Target.hasFloat16Type())
488 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
490 if (
Target.hasBFloat16Type())
491 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
492 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
494 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
497 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
499 if (
Target.hasFloat128Type())
500 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
501 if (
Target.hasIbm128Type())
502 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
504 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
506 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
507 llvm::errs() <<
"Datalayout for target " << Triple.str()
508 <<
" sets element-aligned vectors to '"
509 <<
Target.vectorsAreElementAligned()
510 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
524 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
525 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
527 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
531 AbiMapper = std::make_unique<QualTypeMapper>(
C, M.getDataLayout(), AbiAlloc);
532 AbiReverseMapper = std::make_unique<llvm::abi::IRTypeMapper>(
533 M.getContext(), M.getDataLayout());
537 llvm::LLVMContext &LLVMContext = M.getContext();
538 VoidTy = llvm::Type::getVoidTy(LLVMContext);
539 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
540 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
541 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
542 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
543 HalfTy = llvm::Type::getHalfTy(LLVMContext);
544 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
545 FloatTy = llvm::Type::getFloatTy(LLVMContext);
546 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
552 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
554 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
556 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
557 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
558 IntPtrTy = llvm::IntegerType::get(LLVMContext,
559 C.getTargetInfo().getMaxPointerWidth());
560 Int8PtrTy = llvm::PointerType::get(LLVMContext,
562 const llvm::DataLayout &DL = M.getDataLayout();
564 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
566 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
568 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
584 createOpenCLRuntime();
586 createOpenMPRuntime();
593 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
594 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
600 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
601 CodeGenOpts.CoverageNotesFile.size() ||
602 CodeGenOpts.CoverageDataFile.size())
610 Block.GlobalUniqueCount = 0;
612 if (
C.getLangOpts().ObjC)
615 if (CodeGenOpts.hasProfileClangUse()) {
616 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
617 CodeGenOpts.ProfileInstrumentUsePath, *FS,
618 CodeGenOpts.ProfileRemappingFile);
619 if (
auto E = ReaderOrErr.takeError()) {
620 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
621 Diags.Report(diag::err_reading_profile)
622 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
626 PGOReader = std::move(ReaderOrErr.get());
631 if (CodeGenOpts.CoverageMapping)
635 if (CodeGenOpts.UniqueInternalLinkageNames &&
636 !
getModule().getSourceFileName().empty()) {
640 Context.getTargetInfo());
641 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
645 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
646 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
647 CodeGenOpts.NumRegisterParameters);
656 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
657 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
659 this->MSHotPatchFunctions.push_back(std::string{*I});
661 auto &DE = Context.getDiagnostics();
662 DE.Report(diag::err_open_hotpatch_file_failed)
664 << BufOrErr.getError().message();
669 this->MSHotPatchFunctions.push_back(FuncName);
671 llvm::sort(this->MSHotPatchFunctions);
674 if (!Context.getAuxTargetInfo())
680void CodeGenModule::createObjCRuntime() {
697 llvm_unreachable(
"bad runtime kind");
700void CodeGenModule::createOpenCLRuntime() {
704void CodeGenModule::createOpenMPRuntime() {
705 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
706 Diags.Report(diag::err_omp_host_ir_file_not_found)
707 << LangOpts.OMPHostIRFile;
712 case llvm::Triple::nvptx:
713 case llvm::Triple::nvptx64:
714 case llvm::Triple::amdgpu:
715 case llvm::Triple::spirv64:
718 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
719 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
722 if (LangOpts.OpenMPSimd)
723 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
725 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
730void CodeGenModule::createCUDARuntime() {
734void CodeGenModule::createHLSLRuntime() {
735 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
739 Replacements[Name] =
C;
742void CodeGenModule::applyReplacements() {
743 for (
auto &I : Replacements) {
744 StringRef MangledName = I.first;
745 llvm::Constant *Replacement = I.second;
750 auto *NewF = dyn_cast<llvm::Function>(Replacement);
752 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
753 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
756 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
757 CE->getOpcode() == llvm::Instruction::GetElementPtr);
758 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
763 OldF->replaceAllUsesWith(Replacement);
765 NewF->removeFromParent();
766 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
769 OldF->eraseFromParent();
774 GlobalValReplacements.push_back(std::make_pair(GV,
C));
777void CodeGenModule::applyGlobalValReplacements() {
778 for (
auto &I : GlobalValReplacements) {
779 llvm::GlobalValue *GV = I.first;
780 llvm::Constant *
C = I.second;
782 GV->replaceAllUsesWith(
C);
783 GV->eraseFromParent();
790 const llvm::Constant *
C;
791 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
792 C = GA->getAliasee();
793 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
794 C = GI->getResolver();
798 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
802 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
811 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
812 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
816 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
820 if (GV->hasCommonLinkage()) {
821 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
822 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
823 Diags.
Report(Location, diag::err_alias_to_common);
828 if (GV->isDeclaration()) {
829 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
830 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
831 << IsIFunc << IsIFunc;
834 for (
const auto &[
Decl, Name] : MangledDeclNames) {
835 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
837 if (II && II->
getName() == GV->getName()) {
838 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
842 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
852 const auto *F = dyn_cast<llvm::Function>(GV);
854 Diags.
Report(Location, diag::err_alias_to_undefined)
855 << IsIFunc << IsIFunc;
859 llvm::FunctionType *FTy = F->getFunctionType();
860 if (!FTy->getReturnType()->isPointerTy()) {
861 Diags.
Report(Location, diag::err_ifunc_resolver_return);
875 if (GVar->hasAttribute(
"toc-data")) {
876 auto GVId = GVar->getName();
879 Diags.
Report(Location, diag::warn_toc_unsupported_type)
880 << GVId <<
"the variable has an alias";
882 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
883 llvm::AttributeSet NewAttributes =
884 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
885 GVar->setAttributes(NewAttributes);
889void CodeGenModule::checkAliases() {
894 DiagnosticsEngine &Diags =
getDiags();
895 for (
const GlobalDecl &GD : Aliases) {
897 SourceLocation Location;
899 bool IsIFunc = D->hasAttr<IFuncAttr>();
900 if (
const Attr *A = D->getDefiningAttr()) {
901 Location = A->getLocation();
902 Range = A->getRange();
904 llvm_unreachable(
"Not an alias or ifunc?");
908 const llvm::GlobalValue *GV =
nullptr;
910 MangledDeclNames, Range)) {
916 GlobalDecl AliaseeGD;
919 Diags.Report(Location, diag::err_alias_to_undefined)
920 << IsIFunc << IsIFunc;
929 if (AliasIsFuncDecl != AliaseeIsFunc) {
930 Diags.Report(Location, diag::err_alias_between_function_and_variable)
933 diag::note_aliasee_declaration);
940 if (AliasIsFuncDecl && AliaseeIsFunc) {
941 QualType AliasTy = D->getType();
943 auto shouldReportTypeMismatch = [&]() {
944 const auto *AliasFTy =
946 const auto *AliaseeFTy =
948 assert(AliasFTy && AliaseeFTy);
949 if (!Context.typesAreCompatible(AliasFTy->getReturnType(),
952 const auto *AliasFPTy = dyn_cast<FunctionProtoType>(AliasFTy);
953 const auto *AliaseeFPTy = dyn_cast<FunctionProtoType>(AliaseeFTy);
955 if ((AliasFPTy && AliasFPTy->isVariadic() && !AliaseeFPTy) ||
956 (AliaseeFPTy && AliaseeFPTy->isVariadic() && !AliasFPTy))
959 if (!AliasFPTy || !AliaseeFPTy)
963 if (AliasFPTy->getNumParams() != AliaseeFPTy->getNumParams() ||
964 AliasFPTy->isVariadic() != AliaseeFPTy->isVariadic())
966 for (
unsigned i = 0; i < AliasFPTy->getNumParams(); ++i)
967 if (!Context.typesAreCompatible(AliasFPTy->getParamType(i),
968 AliaseeFPTy->getParamType(i)))
972 if (shouldReportTypeMismatch()) {
973 Diags.Report(Location, diag::warn_alias_type_mismatch)
974 << AliasTy << AliaseeTy;
976 diag::note_aliasee_declaration);
982 if (
const llvm::GlobalVariable *GVar =
983 dyn_cast<const llvm::GlobalVariable>(GV))
987 llvm::Constant *Aliasee =
991 llvm::GlobalValue *AliaseeGV;
992 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
997 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
998 StringRef AliasSection = SA->getName();
999 if (AliasSection != AliaseeGV->getSection())
1000 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
1001 << AliasSection << IsIFunc << IsIFunc;
1009 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
1010 if (GA->isInterposable()) {
1011 Diags.Report(Location, diag::warn_alias_to_weak_alias)
1012 << GV->getName() << GA->getName() << IsIFunc;
1013 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1014 GA->getAliasee(), Alias->getType());
1026 llvm::Attribute::DisableSanitizerInstrumentation);
1031 for (
const GlobalDecl &GD : Aliases) {
1034 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
1035 Alias->eraseFromParent();
1040 DeferredDeclsToEmit.clear();
1041 EmittedDeferredDecls.clear();
1042 DeferredAnnotations.clear();
1044 OpenMPRuntime->clear();
1048 StringRef MainFile) {
1051 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
1052 if (MainFile.empty())
1053 MainFile =
"<stdin>";
1054 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
1057 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
1060 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
1064static std::optional<llvm::GlobalValue::VisibilityTypes>
1069 return std::nullopt;
1071 return llvm::GlobalValue::DefaultVisibility;
1073 return llvm::GlobalValue::HiddenVisibility;
1075 return llvm::GlobalValue::ProtectedVisibility;
1077 llvm_unreachable(
"unknown option value!");
1082 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
1091 GV.setDSOLocal(
false);
1092 GV.setVisibility(*
V);
1097 if (!LO.VisibilityFromDLLStorageClass)
1100 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
1103 std::optional<llvm::GlobalValue::VisibilityTypes>
1104 NoDLLStorageClassVisibility =
1107 std::optional<llvm::GlobalValue::VisibilityTypes>
1108 ExternDeclDLLImportVisibility =
1111 std::optional<llvm::GlobalValue::VisibilityTypes>
1112 ExternDeclNoDLLStorageClassVisibility =
1115 for (llvm::GlobalValue &GV : M.global_values()) {
1116 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
1119 if (GV.isDeclarationForLinker())
1121 llvm::GlobalValue::DLLImportStorageClass
1122 ? ExternDeclDLLImportVisibility
1123 : ExternDeclNoDLLStorageClassVisibility);
1126 llvm::GlobalValue::DLLExportStorageClass
1127 ? DLLExportVisibility
1128 : NoDLLStorageClassVisibility);
1130 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
1135 const llvm::Triple &Triple,
1139 return LangOpts.getStackProtector() == Mode;
1142std::optional<llvm::Attribute::AttrKind>
1144 if (D && D->
hasAttr<NoStackProtectorAttr>())
1146 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
1148 return llvm::Attribute::StackProtectStrong;
1150 return llvm::Attribute::StackProtect;
1152 return llvm::Attribute::StackProtectStrong;
1154 return llvm::Attribute::StackProtectReq;
1155 return std::nullopt;
1161 EmitModuleInitializers(Primary);
1163 DeferredDecls.insert_range(EmittedDeferredDecls);
1164 EmittedDeferredDecls.clear();
1165 EmitVTablesOpportunistically();
1166 applyGlobalValReplacements();
1167 applyReplacements();
1168 emitMultiVersionFunctions();
1169 emitPFPFieldsWithEvaluatedOffset();
1172 if (Context.getLangOpts().IncrementalExtensions &&
1173 GlobalTopLevelStmtBlockInFlight.first) {
1175 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1176 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1182 EmitCXXModuleInitFunc(Primary);
1184 EmitCXXGlobalInitFunc();
1185 EmitCXXGlobalCleanUpFunc();
1186 registerGlobalDtorsWithAtExit();
1187 EmitCXXThreadLocalInitFunc();
1189 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1191 if (Context.getLangOpts().CUDA && CUDARuntime) {
1192 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1195 if (LangOpts.SYCLIsHost && !CodeGenOpts.OffloadBinaryToEmbedFile.empty()) {
1196 if (llvm::Function *SYCLCtorFunction = embedSYCLDeviceBinary())
1201 if (OpenMPRuntime) {
1202 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1203 OpenMPRuntime->clear();
1207 PGOReader->getSummary(
false).getMD(VMContext),
1208 llvm::ProfileSummary::PSK_Instr);
1209 if (PGOStats.hasDiagnostics())
1215 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1216 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1218 EmitStaticExternCAliases();
1223 if (CoverageMapping)
1224 CoverageMapping->emit();
1225 if (CodeGenOpts.SanitizeCfiCrossDso) {
1229 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1231 emitAtAvailableLinkGuard();
1232 if (Context.getTargetInfo().getTriple().isWasm())
1239 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1240 llvm::CodeObjectVersionKind::COV_None) {
1241 getModule().addModuleFlag(llvm::Module::Error,
1242 "amdhsa_code_object_version",
1243 getTarget().getTargetOpts().CodeObjectVersion);
1248 auto *MDStr = llvm::MDString::get(
1253 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1263 llvm::Module::Error,
"amdgpu.xnack",
1264 llvm::ConstantInt::get(
1272 llvm::Module::Error,
"amdgpu.sramecc",
1273 llvm::ConstantInt::get(
1283 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1285 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1287 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1291 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1295 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1297 auto *GV =
new llvm::GlobalVariable(
1298 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1299 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1306 if (LangOpts.HIP && !LangOpts.IncrementalExtensions) {
1309 auto *GV =
new llvm::GlobalVariable(
1311 llvm::Constant::getNullValue(
Int8Ty),
1320 if (CodeGenOpts.Autolink &&
1321 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1322 EmitModuleLinkOptions();
1337 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1338 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1339 for (
auto *MD : ELFDependentLibraries)
1340 NMD->addOperand(MD);
1343 if (CodeGenOpts.DwarfVersion) {
1344 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1345 CodeGenOpts.DwarfVersion);
1348 if (CodeGenOpts.Dwarf64)
1349 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1351 if (Context.getLangOpts().SemanticInterposition)
1353 getModule().setSemanticInterposition(
true);
1355 if (CodeGenOpts.EmitCodeView) {
1357 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1359 if (CodeGenOpts.CodeViewGHash) {
1360 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1362 if (CodeGenOpts.ControlFlowGuard) {
1365 llvm::Module::Warning,
"cfguard",
1366 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1367 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1370 llvm::Module::Warning,
"cfguard",
1371 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1373 if (CodeGenOpts.getWinControlFlowGuardMechanism() !=
1374 llvm::ControlFlowGuardMechanism::Automatic) {
1377 llvm::Module::Warning,
"cfguard-mechanism",
1378 static_cast<unsigned>(CodeGenOpts.getWinControlFlowGuardMechanism()));
1380 if (CodeGenOpts.EHContGuard) {
1382 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1384 if (Context.getLangOpts().Kernel) {
1386 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1388 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1393 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1395 llvm::Metadata *Ops[2] = {
1396 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1397 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1398 llvm::Type::getInt32Ty(VMContext), 1))};
1400 getModule().addModuleFlag(llvm::Module::Require,
1401 "StrictVTablePointersRequirement",
1402 llvm::MDNode::get(VMContext, Ops));
1408 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1409 llvm::DEBUG_METADATA_VERSION);
1414 uint64_t WCharWidth =
1415 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1416 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1417 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size",
1418 static_cast<uint32_t
>(WCharWidth));
1422 llvm::FloatABI::ABIType FloatABI =
1423 llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.FloatABI)
1424 .Cases({
"soft",
"softfp"}, llvm::FloatABI::Soft)
1425 .Case(
"hard", llvm::FloatABI::Hard)
1426 .Default(llvm::FloatABI::Default);
1427 if (FloatABI != llvm::FloatABI::Default &&
1428 FloatABI !=
getTriple().getDefaultFloatABI()) {
1430 llvm::Module::Error,
"float-abi",
1432 llvm::FloatABI::getABITypeName(FloatABI)));
1435 if (
getTypes().isLongDoubleReferenced()) {
1438 std::optional<llvm::LongDoubleFormat> Format;
1439 if (flt == &llvm::APFloat::IEEEquad())
1440 Format = llvm::LongDoubleFormat::IEEEquad;
1441 else if (flt == &llvm::APFloat::IEEEdouble())
1442 Format = llvm::LongDoubleFormat::IEEEdouble;
1443 else if (flt == &llvm::APFloat::PPCDoubleDouble())
1444 Format = llvm::LongDoubleFormat::PPCDoubleDouble;
1445 else if (flt == &llvm::APFloat::x87DoubleExtended())
1446 Format = llvm::LongDoubleFormat::X87DoubleExtended;
1447 else if (flt == &llvm::APFloat::IEEEsingle())
1448 Format = llvm::LongDoubleFormat::IEEEsingle;
1451 getModule().setLongDoubleFormat(*Format);
1455 getModule().addModuleFlag(llvm::Module::Warning,
1456 "zos_product_major_version",
1458 getModule().addModuleFlag(llvm::Module::Warning,
1459 "zos_product_minor_version",
1461 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1462 uint32_t(CLANG_VERSION_PATCHLEVEL));
1464 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1465 llvm::MDString::get(VMContext, ProductId));
1470 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1471 llvm::MDString::get(VMContext, lang_str));
1473 time_t TT = PreprocessorOpts.SourceDateEpoch
1474 ? *PreprocessorOpts.SourceDateEpoch
1475 : std::time(
nullptr);
1476 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1477 static_cast<uint64_t
>(TT));
1480 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1481 llvm::MDString::get(VMContext,
"ascii"));
1484 llvm::Triple
T = Context.getTargetInfo().getTriple();
1490 if (StringRef ABIStr = Target.getABI();
1491 !ABIStr.empty() && (
T.isARM() ||
T.isThumb() ||
T.isRISCV())) {
1492 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1493 llvm::MDString::get(VMContext, ABIStr));
1496 if (
T.isARM() ||
T.isThumb()) {
1498 uint32_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1499 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1503 llvm::LLVMContext &Ctx = TheModule.getContext();
1508 const std::vector<std::string> &Features =
1511 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1512 if (!errorToBool(ParseResult.takeError()))
1514 llvm::Module::AppendUnique,
"riscv-isa",
1516 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1519 if (CodeGenOpts.SanitizeCfiCrossDso) {
1521 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1524 if (CodeGenOpts.WholeProgramVTables) {
1528 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1529 CodeGenOpts.VirtualFunctionElimination);
1532 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1533 getModule().addModuleFlag(llvm::Module::Override,
1534 "CFI Canonical Jump Tables",
1535 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1538 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1539 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1543 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1545 llvm::Module::Append,
"Unique Source File Identifier",
1547 TheModule.getContext(),
1548 llvm::MDString::get(TheModule.getContext(),
1549 CodeGenOpts.UniqueSourceFileIdentifier)));
1552 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1553 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1556 if (CodeGenOpts.PatchableFunctionEntryOffset)
1557 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1558 CodeGenOpts.PatchableFunctionEntryOffset);
1559 if (CodeGenOpts.SanitizeKcfiArity)
1560 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1563 llvm::Module::Override,
"kcfi-hash",
1564 llvm::MDString::get(
1566 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1569 if (CodeGenOpts.CFProtectionReturn &&
1570 Target.checkCFProtectionReturnSupported(
getDiags())) {
1572 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1576 if (CodeGenOpts.CFProtectionBranch &&
1577 Target.checkCFProtectionBranchSupported(
getDiags())) {
1579 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1582 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1583 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1585 Scheme = Target.getDefaultCFBranchLabelScheme();
1587 llvm::Module::Error,
"cf-branch-label-scheme",
1593 if (CodeGenOpts.FunctionReturnThunks)
1594 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1596 if (CodeGenOpts.IndirectBranchCSPrefix)
1597 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1599 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1607 if (LangOpts.BranchTargetEnforcement)
1608 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1610 if (LangOpts.BranchProtectionPAuthLR)
1611 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1613 if (LangOpts.GuardedControlStack)
1614 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1615 if (LangOpts.hasSignReturnAddress())
1616 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1617 if (LangOpts.isSignReturnAddressScopeAll())
1618 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1620 if (!LangOpts.isSignReturnAddressWithAKey())
1621 getModule().addModuleFlag(llvm::Module::Min,
1622 "sign-return-address-with-bkey", 2);
1624 if (
T.isAArch64()) {
1636 if (LangOpts.PointerAuthReturns)
1637 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-returns", 1);
1638 if (LangOpts.PointerAuthAuthTraps)
1639 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-auth-traps", 1);
1640 if (LangOpts.PointerAuthIndirectGotos)
1641 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-indirect-gotos", 1);
1642 if (LangOpts.AArch64JumpTableHardening)
1643 getModule().addModuleFlag(llvm::Module::Max,
1644 "aarch64-jump-table-hardening", 1);
1652 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-elf-got",
1653 LangOpts.PointerAuthELFGOT);
1655 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-init-fini",
1656 LangOpts.PointerAuthCalls &&
1657 LangOpts.PointerAuthInitFini);
1659 llvm::Module::Error,
"ptrauth-init-fini-address-discrimination",
1660 LangOpts.PointerAuthCalls && LangOpts.PointerAuthInitFini &&
1661 LangOpts.PointerAuthInitFiniAddressDiscrimination);
1665 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-sign-personality",
1666 LangOpts.PointerAuthCalls);
1669 using namespace llvm::ELF;
1670 assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST < 32);
1671 uint32_t PAuthABIVersion =
1672 (LangOpts.PointerAuthIntrinsics
1673 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1674 (LangOpts.PointerAuthCalls
1675 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1676 (LangOpts.PointerAuthReturns
1677 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1678 (LangOpts.PointerAuthAuthTraps
1679 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1680 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1681 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1682 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1683 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1684 (LangOpts.PointerAuthInitFini
1685 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1686 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1687 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1688 (LangOpts.PointerAuthELFGOT
1689 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1690 (LangOpts.PointerAuthIndirectGotos
1691 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1692 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1693 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1694 (LangOpts.PointerAuthFunctionTypeDiscrimination
1695 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1696 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1697 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1698 "Update when new enum items are defined");
1703 getModule().addModuleFlag(llvm::Module::Error,
1704 "aarch64-elf-pauthabi-platform",
1705 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1707 llvm::Module::Error,
"aarch64-elf-pauthabi-version", PAuthABIVersion);
1710 if ((
T.isARM() ||
T.isThumb()) &&
getTriple().isTargetAEABI() &&
1712 uint32_t TagVal = 0;
1713 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1715 llvm::DenormalMode::getPositiveZero()) {
1716 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1718 llvm::DenormalMode::getIEEE()) {
1719 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1720 DenormalTagBehavior = llvm::Module::Override;
1722 llvm::DenormalMode::getPreserveSign()) {
1723 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1725 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1730 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1731 llvm::ARMBuildAttrs::Allowed);
1734 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1736 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1737 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1741 if (CodeGenOpts.StackClashProtector)
1743 llvm::Module::Override,
"probe-stack",
1744 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1746 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1747 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1748 CodeGenOpts.StackProbeSize);
1750 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1751 llvm::LLVMContext &Ctx = TheModule.getContext();
1753 llvm::Module::Error,
"MemProfProfileFilename",
1754 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1757 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1761 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1762 CodeGenOpts.FP32DenormalMode.Output !=
1763 llvm::DenormalMode::IEEE);
1766 if (LangOpts.EHAsynch)
1767 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1770 if (CodeGenOpts.ImportCallOptimization)
1771 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1781 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
1782 if (UnwindMode == llvm::WinX64EHUnwindMode::Default) {
1783 if (
T.isOSWindows() &&
T.isX86_64() &&
1784 Context.getTargetInfo().hasFeature(
"egpr"))
1785 UnwindMode = llvm::WinX64EHUnwindMode::V3;
1787 UnwindMode = llvm::WinX64EHUnwindMode::V1;
1789 if (UnwindMode != llvm::WinX64EHUnwindMode::V1)
1790 getModule().addModuleFlag(llvm::Module::Warning,
"winx64-eh-unwind",
1791 static_cast<unsigned>(UnwindMode));
1795 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1797 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1801 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1802 EmitOpenCLMetadata();
1809 auto Version = LangOpts.getOpenCLCompatibleVersion();
1810 llvm::Metadata *SPIRVerElts[] = {
1811 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1813 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1814 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1815 llvm::NamedMDNode *SPIRVerMD =
1816 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1817 llvm::LLVMContext &Ctx = TheModule.getContext();
1818 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1826 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1827 assert(PLevel < 3 &&
"Invalid PIC Level");
1828 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1829 if (Context.getLangOpts().PIE)
1830 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1834 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1835 .Case(
"tiny", llvm::CodeModel::Tiny)
1836 .Case(
"small", llvm::CodeModel::Small)
1837 .Case(
"kernel", llvm::CodeModel::Kernel)
1838 .Case(
"medium", llvm::CodeModel::Medium)
1839 .Case(
"large", llvm::CodeModel::Large)
1842 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1845 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1846 Context.getTargetInfo().getTriple().getArch() ==
1847 llvm::Triple::x86_64) {
1853 if (CodeGenOpts.NoPLT)
1856 CodeGenOpts.DirectAccessExternalData !=
1857 getModule().getDirectAccessExternalData()) {
1858 getModule().setDirectAccessExternalData(
1859 CodeGenOpts.DirectAccessExternalData);
1861 if (CodeGenOpts.UnwindTables)
1862 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1864 switch (CodeGenOpts.getFramePointer()) {
1869 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1872 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1875 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1878 getModule().setFramePointer(llvm::FramePointerKind::All);
1882 SimplifyPersonality();
1895 EmitVersionIdentMetadata();
1898 EmitCommandLineMetadata();
1906 getModule().setStackProtectorGuardSymbol(
1909 getModule().setStackProtectorGuardOffset(
1912 getModule().setStackProtectorGuardValueWidth(
1915 if (
getModule().getStackProtectorGuard() !=
"global") {
1916 Diags.Report(diag::err_opt_not_valid_without_opt)
1917 <<
"-mstack-protector-guard-record"
1918 <<
"-mstack-protector-guard=global";
1920 getModule().setStackProtectorGuardRecord(
true);
1925 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1927 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1929 if (
getContext().getTargetInfo().getMaxTLSAlign())
1930 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1931 getContext().getTargetInfo().getMaxTLSAlign());
1949 if (!MustTailCallUndefinedGlobals.empty()) {
1951 for (
auto &I : MustTailCallUndefinedGlobals) {
1952 if (!I.first->isDefined())
1953 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1957 if (!Entry || Entry->isWeakForLinker() ||
1958 Entry->isDeclarationForLinker())
1959 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1963 for (
auto &I : MustTailCallUndefinedGlobals) {
1972 if (Entry->isDeclarationForLinker()) {
1975 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
1977 CalleeIsLocal = Entry->isDSOLocal();
1981 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
1994 llvm::MDBuilder MDB(TheModule.getContext());
1995 uint64_t Size = Context.getTypeSizeInChars(Context.IntTy).getQuantity();
1996 llvm::MDNode *StructNode =
1997 CodeGenOpts.NewStructPathTBAA
1998 ? MDB.createTBAATypeNode(TBAA->getChar(), Size,
1999 MDB.createString(
"__libc_errno"),
2000 {{0, Size, IntegerNode}})
2001 : MDB.createTBAAStructTypeNode(
"__libc_errno",
2002 {{IntegerNode, 0}});
2005 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
2006 ErrnoTBAAMD->addOperand(StructTagNode);
2011void CodeGenModule::EmitOpenCLMetadata() {
2017 auto EmitVersion = [
this](StringRef MDName,
int Version) {
2018 llvm::Metadata *OCLVerElts[] = {
2019 llvm::ConstantAsMetadata::get(
2020 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
2021 llvm::ConstantAsMetadata::get(
2022 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
2023 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
2024 llvm::LLVMContext &Ctx = TheModule.getContext();
2025 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
2028 EmitVersion(
"opencl.ocl.version", CLVersion);
2029 if (LangOpts.OpenCLCPlusPlus) {
2031 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
2035void CodeGenModule::EmitBackendOptionsMetadata(
2036 const CodeGenOptions &CodeGenOpts) {
2038 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
2039 CodeGenOpts.SmallDataLimit);
2043 if (LangOpts.AllocTokenMode) {
2044 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
2045 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
2046 llvm::MDString::get(VMContext, S));
2048 if (LangOpts.AllocTokenMax)
2050 llvm::Module::Error,
"alloc-token-max",
2051 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
2052 *LangOpts.AllocTokenMax));
2053 if (CodeGenOpts.SanitizeAllocTokenFastABI)
2054 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
2055 if (CodeGenOpts.SanitizeAllocTokenExtended)
2056 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
2072 return TBAA->getTypeInfo(QTy);
2091 return TBAA->getAccessInfo(AccessType);
2098 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
2104 return TBAA->getTBAAStructInfo(QTy);
2110 return TBAA->getBaseTypeInfo(QTy);
2116 return TBAA->getAccessTagInfo(Info);
2123 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
2131 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
2139 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
2145 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
2150 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
2162 std::string Msg =
Type;
2164 diag::err_codegen_unsupported)
2170 diag::err_codegen_unsupported)
2177 std::string Msg =
Type;
2179 diag::err_codegen_unsupported)
2184 llvm::function_ref<
void()> Fn) {
2185 StackHandler.runWithSufficientStackSpace(Loc, Fn);
2195 if (GV->hasLocalLinkage()) {
2196 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2209 if (Context.getLangOpts().OpenMP &&
2210 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
2211 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
2212 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
2213 OMPDeclareTargetDeclAttr::DT_NoHost &&
2215 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2222 if (Context.getLangOpts().CUDAIsDevice &&
2224 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
2225 bool NeedsProtected =
false;
2229 else if (
const auto *VD = dyn_cast<VarDecl>(D))
2230 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
2231 VD->hasAttr<CUDAConstantAttr>() ||
2232 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
2233 VD->getType()->isCUDADeviceBuiltinTextureType();
2234 if (NeedsProtected) {
2235 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2241 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2245 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
2249 if (GV->hasDLLExportStorageClass()) {
2252 diag::err_hidden_visibility_dllexport);
2255 diag::err_non_default_visibility_dllimport);
2261 !GV->isDeclarationForLinker())
2266 llvm::GlobalValue *GV) {
2267 if (GV->hasLocalLinkage())
2270 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
2274 if (GV->hasDLLImportStorageClass())
2277 const llvm::Triple &TT = CGM.
getTriple();
2279 if (TT.isOSCygMing()) {
2297 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
2305 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
2309 if (!TT.isOSBinFormatELF())
2315 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2323 return !(CGM.
getLangOpts().SemanticInterposition ||
2328 if (!GV->isDeclarationForLinker())
2334 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2341 if (CGOpts.DirectAccessExternalData) {
2347 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2348 if (!Var->isThreadLocal())
2373 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2375 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2385 if (D->
hasAttr<DLLImportAttr>())
2386 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2387 else if ((D->
hasAttr<DLLExportAttr>() ||
2389 !GV->isDeclarationForLinker())
2390 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2410 GV->setPartition(CodeGenOpts.SymbolPartition);
2414 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2415 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2416 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2417 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2418 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2421llvm::GlobalVariable::ThreadLocalMode
2423 switch (CodeGenOpts.getDefaultTLSModel()) {
2425 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2427 return llvm::GlobalVariable::LocalDynamicTLSModel;
2429 return llvm::GlobalVariable::InitialExecTLSModel;
2431 return llvm::GlobalVariable::LocalExecTLSModel;
2433 llvm_unreachable(
"Invalid TLS model!");
2437 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2439 llvm::GlobalValue::ThreadLocalMode TLM;
2443 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2447 GV->setThreadLocalMode(TLM);
2453 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2457 const CPUSpecificAttr *
Attr,
2483 bool OmitMultiVersionMangling =
false) {
2485 llvm::raw_svector_ostream Out(Buffer);
2494 assert(II &&
"Attempt to mangle unnamed decl.");
2495 const auto *FD = dyn_cast<FunctionDecl>(ND);
2500 Out <<
"__regcall4__" << II->
getName();
2502 Out <<
"__regcall3__" << II->
getName();
2503 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2505 Out <<
"__device_stub__" << II->
getName();
2507 DeviceKernelAttr::isOpenCLSpelling(
2508 FD->getAttr<DeviceKernelAttr>()) &&
2510 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2526 "Hash computed when not explicitly requested");
2530 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2531 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2532 switch (FD->getMultiVersionKind()) {
2536 FD->getAttr<CPUSpecificAttr>(),
2540 auto *
Attr = FD->getAttr<TargetAttr>();
2541 assert(
Attr &&
"Expected TargetAttr to be present "
2542 "for attribute mangling");
2548 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2549 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2550 "for attribute mangling");
2556 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2557 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2558 "for attribute mangling");
2565 llvm_unreachable(
"None multiversion type isn't valid here");
2575 return std::string(Out.str());
2578void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2579 const FunctionDecl *FD,
2580 StringRef &CurName) {
2587 std::string NonTargetName =
2595 "Other GD should now be a multiversioned function");
2605 if (OtherName != NonTargetName) {
2608 const auto ExistingRecord = Manglings.find(NonTargetName);
2609 if (ExistingRecord != std::end(Manglings))
2610 Manglings.remove(&(*ExistingRecord));
2611 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2616 CurName = OtherNameRef;
2618 Entry->setName(OtherName);
2628 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2642 auto FoundName = MangledDeclNames.find(CanonicalGD);
2643 if (FoundName != MangledDeclNames.end())
2644 return FoundName->second;
2681 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2682 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2691 llvm::raw_svector_ostream Out(Buffer);
2694 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2695 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2697 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2702 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2703 return Result.first->first();
2707 auto it = MangledDeclNames.begin();
2708 while (it != MangledDeclNames.end()) {
2709 if (it->second == Name)
2724 llvm::Constant *AssociatedData) {
2726 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2732 bool IsDtorAttrFunc) {
2733 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2735 DtorsUsingAtExit[Priority].push_back(Dtor);
2740 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2743void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2744 if (Fns.empty())
return;
2747 llvm::PointerType *PtrTy = llvm::PointerType::get(
2748 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2751 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2755 auto Ctors = Builder.beginArray(CtorStructTy);
2756 for (
const auto &I : Fns) {
2757 auto Ctor = Ctors.beginStruct(CtorStructTy);
2758 Ctor.addInt(
Int32Ty, I.Priority);
2759 Ctor.add(I.Initializer);
2760 if (I.AssociatedData)
2761 Ctor.add(I.AssociatedData);
2763 Ctor.addNullPointer(PtrTy);
2764 Ctor.finishAndAddTo(Ctors);
2767 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2769 llvm::GlobalValue::AppendingLinkage);
2773 List->setAlignment(std::nullopt);
2778llvm::GlobalValue::LinkageTypes
2784 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2791 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2792 if (!MDS)
return nullptr;
2794 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2802 if (!UD->
hasAttr<TransparentUnionAttr>())
2804 if (!UD->
fields().empty())
2805 return UD->
fields().begin()->getType();
2814 bool GeneralizePointers) {
2827 bool GeneralizePointers) {
2830 for (
auto &Param : FnType->param_types())
2831 GeneralizedParams.push_back(
2835 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2836 GeneralizedParams, FnType->getExtProtoInfo());
2841 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2843 llvm_unreachable(
"Encountered unknown FunctionType");
2851 FnType->getReturnType(), FnType->getParamTypes(),
2852 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2854 std::string OutName;
2855 llvm::raw_string_ostream Out(OutName);
2863 Out <<
".normalized";
2865 Out <<
".generalized";
2867 return llvm::ConstantInt::get(
2873 llvm::Function *F,
bool IsThunk) {
2875 llvm::AttributeList PAL;
2878 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2882 Loc = D->getLocation();
2884 Error(Loc,
"__vectorcall calling convention is not currently supported");
2886 F->setAttributes(PAL);
2887 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2891 std::string ReadOnlyQual(
"__read_only");
2892 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2893 if (ReadOnlyPos != std::string::npos)
2895 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2897 std::string WriteOnlyQual(
"__write_only");
2898 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2899 if (WriteOnlyPos != std::string::npos)
2900 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2902 std::string ReadWriteQual(
"__read_write");
2903 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2904 if (ReadWritePos != std::string::npos)
2905 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2938 assert(((FD && CGF) || (!FD && !CGF)) &&
2939 "Incorrect use - FD and CGF should either be both null or not!");
2965 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2968 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2973 std::string typeQuals;
2977 const Decl *PDecl = parm;
2979 PDecl = TD->getDecl();
2980 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2981 if (A && A->isWriteOnly())
2982 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2983 else if (A && A->isReadWrite())
2984 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2986 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2988 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2990 auto getTypeSpelling = [&](
QualType Ty) {
2991 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2993 if (Ty.isCanonical()) {
2994 StringRef typeNameRef = typeName;
2996 if (typeNameRef.consume_front(
"unsigned "))
2997 return std::string(
"u") + typeNameRef.str();
2998 if (typeNameRef.consume_front(
"signed "))
2999 return typeNameRef.str();
3009 addressQuals.push_back(
3010 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
3014 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
3015 std::string baseTypeName =
3017 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
3018 argBaseTypeNames.push_back(
3019 llvm::MDString::get(VMContext, baseTypeName));
3023 typeQuals =
"restrict";
3026 typeQuals += typeQuals.empty() ?
"const" :
" const";
3028 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
3030 uint32_t AddrSpc = 0;
3035 addressQuals.push_back(
3036 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
3040 std::string typeName = getTypeSpelling(ty);
3052 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
3053 argBaseTypeNames.push_back(
3054 llvm::MDString::get(VMContext, baseTypeName));
3059 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
3063 Fn->setMetadata(
"kernel_arg_addr_space",
3064 llvm::MDNode::get(VMContext, addressQuals));
3065 Fn->setMetadata(
"kernel_arg_access_qual",
3066 llvm::MDNode::get(VMContext, accessQuals));
3067 Fn->setMetadata(
"kernel_arg_type",
3068 llvm::MDNode::get(VMContext, argTypeNames));
3069 Fn->setMetadata(
"kernel_arg_base_type",
3070 llvm::MDNode::get(VMContext, argBaseTypeNames));
3071 Fn->setMetadata(
"kernel_arg_type_qual",
3072 llvm::MDNode::get(VMContext, argTypeQuals));
3076 Fn->setMetadata(
"kernel_arg_name",
3077 llvm::MDNode::get(VMContext, argNames));
3093SmallVector<const CXXRecordDecl *, 0>
3095 llvm::SetVector<const CXXRecordDecl *> MostBases;
3100 MostBases.insert(RD);
3102 CollectMostBases(B.getType()->getAsCXXRecordDecl());
3104 CollectMostBases(RD);
3105 return MostBases.takeVector();
3109 llvm::Function *F) {
3110 llvm::AttrBuilder B(F->getContext());
3112 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
3113 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
3115 if (CodeGenOpts.StackClashProtector)
3116 B.addAttribute(
"probe-stack",
"inline-asm");
3118 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
3119 B.addAttribute(
"stack-probe-size",
3120 std::to_string(CodeGenOpts.StackProbeSize));
3123 B.addAttribute(llvm::Attribute::NoUnwind);
3125 if (std::optional<llvm::Attribute::AttrKind>
Attr =
3127 B.addAttribute(*
Attr);
3132 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
3133 B.addAttribute(llvm::Attribute::AlwaysInline);
3137 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
3139 B.addAttribute(llvm::Attribute::NoInline);
3147 if (D->
hasAttr<ArmLocallyStreamingAttr>())
3148 B.addAttribute(
"aarch64_pstate_sm_body");
3151 if (
Attr->isNewZA())
3152 B.addAttribute(
"aarch64_new_za");
3153 if (
Attr->isNewZT0())
3154 B.addAttribute(
"aarch64_new_zt0");
3159 bool ShouldAddOptNone =
3160 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
3162 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
3163 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
3166 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
3167 !D->
hasAttr<NoInlineAttr>()) {
3168 B.addAttribute(llvm::Attribute::AlwaysInline);
3169 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
3170 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3172 B.addAttribute(llvm::Attribute::OptimizeNone);
3175 B.addAttribute(llvm::Attribute::NoInline);
3180 B.addAttribute(llvm::Attribute::Naked);
3183 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
3184 F->removeFnAttr(llvm::Attribute::MinSize);
3185 }
else if (D->
hasAttr<NakedAttr>()) {
3187 B.addAttribute(llvm::Attribute::Naked);
3188 B.addAttribute(llvm::Attribute::NoInline);
3189 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
3190 B.addAttribute(llvm::Attribute::NoDuplicate);
3191 }
else if (D->
hasAttr<NoInlineAttr>() &&
3192 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3194 B.addAttribute(llvm::Attribute::NoInline);
3195 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
3196 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
3198 B.addAttribute(llvm::Attribute::AlwaysInline);
3202 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
3203 B.addAttribute(llvm::Attribute::NoInline);
3207 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3210 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
3211 return Redecl->isInlineSpecified();
3213 if (any_of(FD->
redecls(), CheckRedeclForInline))
3218 return any_of(Pattern->
redecls(), CheckRedeclForInline);
3220 if (CheckForInline(FD)) {
3221 B.addAttribute(llvm::Attribute::InlineHint);
3222 }
else if (CodeGenOpts.getInlining() ==
3225 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3226 B.addAttribute(llvm::Attribute::NoInline);
3233 if (!D->
hasAttr<OptimizeNoneAttr>()) {
3235 if (!ShouldAddOptNone)
3236 B.addAttribute(llvm::Attribute::OptimizeForSize);
3237 B.addAttribute(llvm::Attribute::Cold);
3240 B.addAttribute(llvm::Attribute::Hot);
3241 if (D->
hasAttr<MinSizeAttr>())
3242 B.addAttribute(llvm::Attribute::MinSize);
3247 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
3248 B.addAttribute(llvm::Attribute::NoOutline);
3252 llvm::MaybeAlign ExplicitAlignment;
3253 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
3254 ExplicitAlignment = llvm::Align(alignment);
3255 else if (LangOpts.FunctionAlignment)
3256 ExplicitAlignment = llvm::Align(1ull << LangOpts.FunctionAlignment);
3258 if (ExplicitAlignment) {
3259 F->setAlignment(ExplicitAlignment);
3260 F->setPreferredAlignment(ExplicitAlignment);
3261 }
else if (LangOpts.PreferredFunctionAlignment) {
3262 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
3271 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
3276 if (CodeGenOpts.SanitizeCfiCrossDso &&
3277 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
3278 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3286 if (CodeGenOpts.CallGraphSection) {
3287 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3294 auto *MD = dyn_cast<CXXMethodDecl>(D);
3297 llvm::Metadata *Id =
3299 MD->getType(), std::nullopt,
Base));
3300 F->addTypeMetadata(0, Id);
3307 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
3308 if (FD->
hasAttr<SYCLExternalAttr>())
3309 addSYCLModuleIdAttr(F);
3313void CodeGenModule::addSYCLModuleIdAttr(llvm::Function *Fn) {
3315 Fn->addFnAttr(
"sycl-module-id",
getModule().getModuleIdentifier());
3320 if (isa_and_nonnull<NamedDecl>(D))
3323 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3325 if (D && D->
hasAttr<UsedAttr>())
3328 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3330 ((CodeGenOpts.KeepPersistentStorageVariables &&
3331 (VD->getStorageDuration() ==
SD_Static ||
3332 VD->getStorageDuration() ==
SD_Thread)) ||
3333 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3334 VD->getType().isConstQualified())))
3339static std::vector<std::string>
3341 llvm::StringMap<bool> &FeatureMap) {
3342 llvm::StringMap<bool> DefaultFeatureMap;
3346 std::vector<std::string> Delta;
3347 for (
const auto &[K,
V] : FeatureMap) {
3348 auto DefaultIt = DefaultFeatureMap.find(K);
3349 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3350 Delta.push_back((
V ?
"+" :
"-") + K.str());
3356bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3357 llvm::AttrBuilder &Attrs,
3358 bool SetTargetFeatures) {
3364 std::vector<std::string> Features;
3365 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3368 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3369 assert((!TD || !TV) &&
"both target_version and target specified");
3372 bool AddedAttr =
false;
3373 if (TD || TV || SD || TC) {
3374 llvm::StringMap<bool> FeatureMap;
3381 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3384 if (!FeatureStr.empty()) {
3385 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3386 if (!ParsedAttr.
CPU.empty() &&
3388 TargetCPU = ParsedAttr.
CPU;
3391 if (!ParsedAttr.
Tune.empty() &&
3393 TuneCPU = ParsedAttr.
Tune;
3409 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3410 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3411 Entry.getKey().str());
3417 llvm::StringMap<bool> FeatureMap;
3436 if (!TargetCPU.empty()) {
3437 Attrs.addAttribute(
"target-cpu", TargetCPU);
3440 if (!TuneCPU.empty()) {
3441 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3444 if (!Features.empty() && SetTargetFeatures) {
3445 llvm::erase_if(Features, [&](
const std::string& F) {
3448 if (!Features.empty()) {
3449 llvm::sort(Features);
3450 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3456 llvm::SmallVector<StringRef, 8> Feats;
3457 bool IsDefault =
false;
3459 IsDefault = TV->isDefaultVersion();
3460 TV->getFeatures(Feats);
3466 Attrs.addAttribute(
"fmv-features");
3468 }
else if (!Feats.empty()) {
3470 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3471 std::string FMVFeatures;
3472 for (StringRef F : OrderedFeats)
3473 FMVFeatures.append(
"," + F.str());
3474 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3481void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3482 llvm::GlobalObject *GO) {
3487 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3490 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3491 GV->addAttribute(
"bss-section", SA->getName());
3492 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3493 GV->addAttribute(
"data-section", SA->getName());
3494 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3495 GV->addAttribute(
"rodata-section", SA->getName());
3496 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3497 GV->addAttribute(
"relro-section", SA->getName());
3500 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3503 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3504 if (!D->
getAttr<SectionAttr>())
3505 F->setSection(SA->getName());
3507 llvm::AttrBuilder Attrs(F->getContext());
3508 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3512 llvm::AttributeMask RemoveAttrs;
3513 RemoveAttrs.addAttribute(
"target-cpu");
3514 RemoveAttrs.addAttribute(
"target-features");
3515 RemoveAttrs.addAttribute(
"fmv-features");
3516 RemoveAttrs.addAttribute(
"tune-cpu");
3517 F->removeFnAttrs(RemoveAttrs);
3518 F->addFnAttrs(Attrs);
3522 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3523 GO->setSection(CSA->getName());
3524 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3525 GO->setSection(SA->getName());
3538 F->setLinkage(llvm::Function::InternalLinkage);
3540 setNonAliasAttributes(GD, F);
3551 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3555 llvm::Function *F) {
3558 if (!F->hasLocalLinkage() ||
3559 F->getFunction().hasAddressTaken(
nullptr,
true,
3563 llvm::LLVMContext::MD_callgraph,
3564 *llvm::MDTuple::get(
3571 llvm::Function *F) {
3573 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3584 F->addTypeMetadata(0, MD);
3591 if (CodeGenOpts.SanitizeCfiCrossDso)
3593 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3597 llvm::CallBase *CB) {
3599 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall())
3603 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
getLLVMContext(), {TypeIdMD});
3604 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3605 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3609 llvm::LLVMContext &Ctx = F->getContext();
3610 llvm::MDBuilder MDB(Ctx);
3611 llvm::StringRef Salt;
3614 if (
const auto &Info = FP->getExtraAttributeInfo())
3615 Salt = Info.CFISalt;
3617 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3626 return llvm::all_of(Name, [](
const char &
C) {
3627 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3633 for (
auto &F : M.functions()) {
3635 bool AddressTaken = F.hasAddressTaken();
3636 if (!AddressTaken && F.hasLocalLinkage())
3637 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3642 if (!AddressTaken || !F.isDeclaration())
3645 const llvm::ConstantInt *
Type;
3646 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3647 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3651 StringRef Name = F.getName();
3655 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3656 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3657 Twine(
Type->getSExtValue()) +
" */\n")
3659 M.appendModuleInlineAsm(
Asm);
3663void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3664 bool IsIncompleteFunction,
3667 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3675 if (!IsIncompleteFunction)
3682 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3684 assert(!F->arg_empty() &&
3685 F->arg_begin()->getType()
3686 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3687 "unexpected this return");
3688 F->addParamAttr(0, llvm::Attribute::Returned);
3698 if (!IsIncompleteFunction && F->isDeclaration())
3701 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3702 F->setSection(CSA->getName());
3703 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3704 F->setSection(SA->getName());
3706 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3708 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3709 else if (EA->isWarning())
3710 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3715 const FunctionDecl *FDBody;
3716 bool HasBody = FD->
hasBody(FDBody);
3718 assert(HasBody &&
"Inline builtin declarations should always have an "
3720 if (shouldEmitFunction(FDBody))
3721 F->addFnAttr(llvm::Attribute::NoBuiltin);
3727 F->addFnAttr(llvm::Attribute::NoBuiltin);
3731 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3732 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3733 if (MD->isVirtual())
3734 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3740 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3741 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3744 if (CodeGenOpts.CallGraphSection)
3747 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3753 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3754 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3756 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3760 llvm::LLVMContext &Ctx = F->getContext();
3761 llvm::MDBuilder MDB(Ctx);
3765 int CalleeIdx = *CB->encoding_begin();
3766 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3767 F->addMetadata(llvm::LLVMContext::MD_callback,
3768 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3769 CalleeIdx, PayloadIndices,
3776 "Only globals with definition can force usage.");
3777 LLVMUsed.emplace_back(GV);
3781 assert(!GV->isDeclaration() &&
3782 "Only globals with definition can force usage.");
3783 LLVMCompilerUsed.emplace_back(GV);
3788 "Only globals with definition can force usage.");
3790 LLVMCompilerUsed.emplace_back(GV);
3792 LLVMUsed.emplace_back(GV);
3796 std::vector<llvm::WeakTrackingVH> &List) {
3806 UsedArray.reserve(List.size());
3807 for (
const llvm::WeakTrackingVH &VH : List) {
3808 if (llvm::Value *
V = VH)
3809 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3813 if (UsedArray.empty())
3815 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3817 auto *GV =
new llvm::GlobalVariable(
3818 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3819 llvm::ConstantArray::get(ATy, UsedArray), Name);
3821 GV->setSection(
"llvm.metadata");
3824void CodeGenModule::emitLLVMUsed() {
3825 emitUsed(*
this,
"llvm.used", LLVMUsed);
3826 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3831 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3840 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3846 ELFDependentLibraries.push_back(
3847 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3854 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3861void CodeGenModule::ProcessPragmaCommentCopyright(StringRef Comment,
3862 bool isFromASTFile) {
3864 "pragma comment copyright is supported only when targeting AIX");
3877 assert(!LoadTimeCommentGlobal &&
3878 "Only one copyright pragma allowed per translation unit.");
3883 uint64_t Hash = xxh3_64bits(Comment);
3884 std::string GlobalName =
3885 (
"__loadtime_comment_str_" + Twine::utohexstr(Hash)).str();
3888 llvm::Constant *StrInit =
3889 llvm::ConstantDataArray::getString(
C, Comment,
true);
3892 auto *GV =
new llvm::GlobalVariable(
getModule(), StrInit->getType(),
3894 llvm::GlobalValue::WeakODRLinkage,
3895 StrInit, GlobalName);
3897 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
3898 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3899 GV->setAlignment(llvm::Align(1));
3905 GV->setSection(
"__loadtime_comment");
3908 GV->setMetadata(
"loadtime_comment", llvm::MDNode::get(
C, {}));
3911 llvm::appendToCompilerUsed(
getModule(), {GV});
3913 LoadTimeCommentGlobal = GV;
3922 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3928 if (Visited.insert(Import).second)
3945 if (LL.IsFramework) {
3946 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3947 llvm::MDString::get(Context, LL.Library)};
3949 Metadata.push_back(llvm::MDNode::get(Context, Args));
3955 llvm::Metadata *Args[2] = {
3956 llvm::MDString::get(Context,
"lib"),
3957 llvm::MDString::get(Context, LL.Library),
3959 Metadata.push_back(llvm::MDNode::get(Context, Args));
3963 auto *OptString = llvm::MDString::get(Context, Opt);
3964 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3969void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3971 "We should only emit module initializers for named modules.");
3979 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3996 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
4002void CodeGenModule::EmitModuleLinkOptions() {
4006 llvm::SetVector<clang::Module *> LinkModules;
4007 llvm::SmallPtrSet<clang::Module *, 16> Visited;
4008 SmallVector<clang::Module *, 16> Stack;
4011 for (
Module *M : ImportedModules) {
4014 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
4017 if (Visited.insert(M).second)
4023 while (!Stack.empty()) {
4026 bool AnyChildren =
false;
4035 if (Visited.insert(SM).second) {
4036 Stack.push_back(SM);
4044 LinkModules.insert(Mod);
4051 SmallVector<llvm::MDNode *, 16> MetadataArgs;
4053 for (
Module *M : LinkModules)
4054 if (Visited.insert(M).second)
4056 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
4057 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
4060 if (!LinkerOptionsMetadata.empty()) {
4061 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
4062 for (
auto *MD : LinkerOptionsMetadata)
4063 NMD->addOperand(MD);
4067void CodeGenModule::EmitDeferred() {
4076 if (!DeferredVTables.empty()) {
4077 EmitDeferredVTables();
4082 assert(DeferredVTables.empty());
4089 llvm::append_range(DeferredDeclsToEmit,
4093 if (DeferredDeclsToEmit.empty())
4098 std::vector<GlobalDecl> CurDeclsToEmit;
4099 CurDeclsToEmit.swap(DeferredDeclsToEmit);
4101 for (GlobalDecl &D : CurDeclsToEmit) {
4107 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
4111 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
4127 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
4145 if (!GV->isDeclaration())
4149 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
4153 EmitGlobalDefinition(D, GV);
4158 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
4160 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
4165void CodeGenModule::EmitVTablesOpportunistically() {
4171 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
4172 &&
"Only emit opportunistic vtables with optimizations");
4174 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
4176 "This queue should only contain external vtables");
4177 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
4178 VTables.GenerateClassData(RD);
4180 OpportunisticVTables.clear();
4184 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
4189 DeferredAnnotations.clear();
4191 if (Annotations.empty())
4195 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
4196 Annotations[0]->
getType(), Annotations.size()), Annotations);
4197 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
4198 llvm::GlobalValue::AppendingLinkage,
4199 Array,
"llvm.global.annotations");
4204 llvm::Constant *&AStr = AnnotationStrings[Str];
4209 llvm::Constant *s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
4210 auto *gv =
new llvm::GlobalVariable(
4211 getModule(), s->getType(),
true, llvm::GlobalValue::PrivateLinkage, s,
4212 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
4215 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4233 return llvm::ConstantInt::get(
Int32Ty, LineNo);
4241 llvm::FoldingSetNodeID ID;
4242 for (
Expr *E : Exprs) {
4245 llvm::Constant *&Lookup = AnnotationArgs[ID.computeHash()];
4250 LLVMArgs.reserve(Exprs.size());
4252 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
4254 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
4257 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
4258 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
4259 llvm::GlobalValue::PrivateLinkage,
Struct,
4262 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4269 const AnnotateAttr *AA,
4277 llvm::Constant *GVInGlobalsAS = GV;
4278 if (GV->getAddressSpace() !=
4280 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
4282 llvm::PointerType::get(
4283 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
4287 llvm::Constant *Fields[] = {
4288 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
4290 return llvm::ConstantStruct::getAnon(Fields);
4294 llvm::GlobalValue *GV) {
4295 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
4305 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
4308 auto &SM = Context.getSourceManager();
4309 FileEntryRef MainFile = *SM.getFileEntryRefForID(SM.getMainFileID());
4310 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
4315 return NoSanitizeL.containsLocation(Kind, Loc);
4318 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
4322 llvm::GlobalVariable *GV,
4324 StringRef Category)
const {
4326 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
4328 auto &SM = Context.getSourceManager();
4329 if (NoSanitizeL.containsMainFile(
4330 Kind, SM.getFileEntryRefForID(SM.getMainFileID())->getName(),
4333 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
4340 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
4341 Ty = AT->getElementType();
4346 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4354 StringRef Category)
const {
4357 auto Attr = ImbueAttr::NONE;
4359 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4360 if (
Attr == ImbueAttr::NONE)
4361 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4363 case ImbueAttr::NONE:
4365 case ImbueAttr::ALWAYS:
4366 Fn->addFnAttr(
"function-instrument",
"xray-always");
4368 case ImbueAttr::ALWAYS_ARG1:
4369 Fn->addFnAttr(
"function-instrument",
"xray-always");
4370 Fn->addFnAttr(
"xray-log-args",
"1");
4372 case ImbueAttr::NEVER:
4373 Fn->addFnAttr(
"function-instrument",
"xray-never");
4386 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4396 auto &SM = Context.getSourceManager();
4397 if (
auto MainFile = SM.getFileEntryRefForID(SM.getMainFileID()))
4411 if (NumGroups > 1) {
4412 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4421 if (LangOpts.EmitAllDecls)
4424 const auto *VD = dyn_cast<VarDecl>(
Global);
4426 ((CodeGenOpts.KeepPersistentStorageVariables &&
4427 (VD->getStorageDuration() ==
SD_Static ||
4428 VD->getStorageDuration() ==
SD_Thread)) ||
4429 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4430 VD->getType().isConstQualified())))
4443 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4444 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4445 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4446 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4450 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4460 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4467 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4468 if (Context.getInlineVariableDefinitionKind(VD) ==
4473 if (CXX20ModuleInits && VD->getOwningModule() &&
4474 !VD->getOwningModule()->isModuleMapModule()) {
4483 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4486 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4499 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4503 llvm::Constant *
Init;
4506 if (!
V.isAbsent()) {
4517 llvm::Constant *Fields[4] = {
4521 llvm::ConstantDataArray::getRaw(
4522 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4524 Init = llvm::ConstantStruct::getAnon(Fields);
4527 auto *GV =
new llvm::GlobalVariable(
4529 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4531 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4534 if (!
V.isAbsent()) {
4547 llvm::GlobalVariable **Entry =
nullptr;
4548 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4553 llvm::Constant *
Init;
4557 assert(!
V.isAbsent());
4561 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4563 llvm::GlobalValue::PrivateLinkage,
Init,
4565 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4580 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4584 llvm::Constant *
Init =
Emitter.emitForInitializer(
4592 llvm::GlobalValue::LinkageTypes
Linkage =
4594 ? llvm::GlobalValue::LinkOnceODRLinkage
4595 : llvm::GlobalValue::InternalLinkage;
4596 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4600 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4607 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4608 assert(AA &&
"No alias?");
4618 llvm::Constant *Aliasee;
4620 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4628 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4629 WeakRefReferences.insert(F);
4637 if (
auto *A = D->
getAttr<AttrT>())
4638 return A->isImplicit();
4645 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4648 const auto *AA =
Global->getAttr<AliasAttr>();
4656 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4657 if (LangOpts.OpenMPIsTargetDevice)
4658 return !AliaseeDecl ||
4659 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4662 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4663 const bool AliaseeHasDeviceAttr =
4664 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4666 if (LangOpts.CUDAIsDevice)
4667 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4674bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4675 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4680 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4681 Global->hasAttr<CUDAConstantAttr>() ||
4682 Global->hasAttr<CUDASharedAttr>() ||
4683 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4684 Global->getType()->isCUDADeviceBuiltinTextureType();
4691 if (
Global->hasAttr<WeakRefAttr>())
4696 if (
Global->hasAttr<AliasAttr>()) {
4699 return EmitAliasDefinition(GD);
4703 if (
Global->hasAttr<IFuncAttr>())
4704 return emitIFuncDefinition(GD);
4707 if (
Global->hasAttr<CPUDispatchAttr>())
4708 return emitCPUDispatchDefinition(GD);
4713 if (LangOpts.CUDA) {
4715 "Expected Variable or Function");
4716 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4717 if (!shouldEmitCUDAGlobalVar(VD))
4719 }
else if (LangOpts.CUDAIsDevice) {
4720 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4721 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4722 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4726 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4727 !
Global->hasAttr<CUDAGlobalAttr>() &&
4729 !
Global->hasAttr<CUDAHostAttr>()))
4732 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4733 Global->hasAttr<CUDADeviceAttr>())
4737 if (LangOpts.OpenMP) {
4739 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4741 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4742 if (MustBeEmitted(
Global))
4746 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4747 if (MustBeEmitted(
Global))
4754 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4755 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4761 if (FD->
hasAttr<AnnotateAttr>()) {
4764 DeferredAnnotations[MangledName] = FD;
4779 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4785 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4787 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4788 if (LangOpts.OpenMP) {
4790 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4791 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4795 if (VD->hasExternalStorage() &&
4796 Res != OMPDeclareTargetDeclAttr::MT_Link)
4799 bool UnifiedMemoryEnabled =
4801 if (*Res == OMPDeclareTargetDeclAttr::MT_Local ||
4802 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4803 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4804 !UnifiedMemoryEnabled)) {
4807 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4808 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4809 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4810 UnifiedMemoryEnabled)) &&
4811 "Link clause or to clause with unified memory expected.");
4821 if (LangOpts.HLSL) {
4822 if (VD->getStorageClass() ==
SC_Extern) {
4831 if (Context.getInlineVariableDefinitionKind(VD) ==
4841 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4843 EmitGlobalDefinition(GD);
4844 addEmittedDeferredDecl(GD);
4852 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4853 CXXGlobalInits.push_back(
nullptr);
4859 addDeferredDeclToEmit(GD);
4860 }
else if (MustBeEmitted(
Global)) {
4862 assert(!MayBeEmittedEagerly(
Global));
4863 addDeferredDeclToEmit(GD);
4868 DeferredDecls[MangledName] = GD;
4874 if (
const auto *RT =
4875 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4876 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4877 RD = RD->getDefinitionOrSelf();
4878 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4887struct DLLImportFunctionVisitor
4888 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4889 bool SafeToInline =
true;
4891 bool shouldVisitImplicitCode()
const {
return true; }
4893 bool VisitVarDecl(VarDecl *VD) {
4896 SafeToInline =
false;
4897 return SafeToInline;
4904 return SafeToInline;
4907 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4909 SafeToInline = D->
hasAttr<DLLImportAttr>();
4910 return SafeToInline;
4913 bool VisitDeclRefExpr(DeclRefExpr *E) {
4916 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4917 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4918 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4919 return SafeToInline;
4922 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4924 return SafeToInline;
4927 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4931 SafeToInline =
true;
4933 SafeToInline = M->
hasAttr<DLLImportAttr>();
4935 return SafeToInline;
4938 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4940 return SafeToInline;
4943 bool VisitCXXNewExpr(CXXNewExpr *E) {
4945 return SafeToInline;
4950bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4957 if (F->isInlineBuiltinDeclaration())
4960 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4965 if (
const Module *M = F->getOwningModule();
4966 M && M->getTopLevelModule()->isNamedModule() &&
4967 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4977 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4982 if (F->hasAttr<NoInlineAttr>())
4985 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4987 DLLImportFunctionVisitor Visitor;
4988 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4989 if (!Visitor.SafeToInline)
4992 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4999 for (
const CXXBaseSpecifier &B :
Dtor->getParent()->bases())
5013bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
5014 return CodeGenOpts.OptimizationLevel > 0;
5017void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
5018 llvm::GlobalValue *GV) {
5022 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
5023 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
5025 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
5026 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
5027 if (TC->isFirstOfVersion(I))
5030 EmitGlobalFunctionDefinition(GD, GV);
5036 AddDeferredMultiVersionResolverToEmit(GD);
5038 GetOrCreateMultiVersionResolver(GD);
5042void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
5045 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
5046 Context.getSourceManager(),
5047 "Generating code for declaration");
5049 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
5052 if (!shouldEmitFunction(GD))
5055 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
5057 llvm::raw_string_ostream
OS(Name);
5063 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
5067 ABI->emitCXXStructor(GD);
5069 EmitMultiVersionFunctionDefinition(GD, GV);
5071 EmitGlobalFunctionDefinition(GD, GV);
5080 return EmitMultiVersionFunctionDefinition(GD, GV);
5081 return EmitGlobalFunctionDefinition(GD, GV);
5084 if (
const auto *VD = dyn_cast<VarDecl>(D))
5085 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
5087 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
5091 llvm::Function *NewFn);
5107static llvm::GlobalValue::LinkageTypes
5111 return llvm::GlobalValue::InternalLinkage;
5112 return llvm::GlobalValue::WeakODRLinkage;
5115void CodeGenModule::emitMultiVersionFunctions() {
5116 std::vector<GlobalDecl> MVFuncsToEmit;
5117 MultiVersionFuncs.swap(MVFuncsToEmit);
5118 for (GlobalDecl GD : MVFuncsToEmit) {
5120 assert(FD &&
"Expected a FunctionDecl");
5122 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
5123 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
5127 if (
Decl->isDefined()) {
5128 EmitGlobalFunctionDefinition(CurGD,
nullptr);
5136 assert(
Func &&
"This should have just been created");
5144 bool ShouldEmitResolver = !
getTriple().isAArch64();
5145 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5146 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
5149 FD, [&](
const FunctionDecl *CurFD) {
5150 llvm::SmallVector<StringRef, 8> Feats;
5153 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
5155 TA->getX86AddedFeatures(Feats);
5156 llvm::Function *
Func = createFunction(CurFD);
5157 DeclMap.insert({
Func, CurFD});
5158 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
5159 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
5160 if (TVA->isDefaultVersion() && IsDefined)
5161 ShouldEmitResolver =
true;
5162 llvm::Function *
Func = createFunction(CurFD);
5163 DeclMap.insert({
Func, CurFD});
5165 TVA->getFeatures(Feats, Delim);
5166 Options.emplace_back(
Func, Feats);
5167 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
5168 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
5169 if (!TC->isFirstOfVersion(I))
5171 if (TC->isDefaultVersion(I) && IsDefined)
5172 ShouldEmitResolver =
true;
5173 llvm::Function *
Func = createFunction(CurFD, I);
5174 DeclMap.insert({
Func, CurFD});
5177 TC->getX86Feature(Feats, I);
5178 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
5181 TC->getFeatures(Feats, I, Delim);
5182 Options.emplace_back(
Func, Feats);
5186 llvm_unreachable(
"unexpected MultiVersionKind");
5189 if (!ShouldEmitResolver)
5192 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
5193 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
5194 ResolverConstant = IFunc->getResolver();
5199 *
this, GD, FD,
true);
5206 auto *Alias = llvm::GlobalAlias::create(
5208 MangledName +
".ifunc", IFunc, &
getModule());
5217 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
5218 const CodeGenFunction::FMVResolverOption &RHS) {
5224 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
5225 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
5226 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
5227 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
5228 return LHS.isSubsetOf(RHS);
5230 Diags.Report(DeclMap[I->Function]->getLocation(),
5231 diag::warn_unreachable_version)
5232 << I->Function->getName();
5233 assert(I->Function->user_empty() &&
"unexpected users");
5234 I->Function->eraseFromParent();
5235 I->Function =
nullptr;
5239 CodeGenFunction CGF(*
this);
5240 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5242 setMultiVersionResolverAttributes(ResolverFunc, GD);
5244 ResolverFunc->setComdat(
5245 getModule().getOrInsertComdat(ResolverFunc->getName()));
5251 if (!MVFuncsToEmit.empty())
5256 if (!MultiVersionFuncs.empty())
5257 emitMultiVersionFunctions();
5267 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
5269 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
5270 llvm::GlobalVariable::ExternalWeakLinkage,
5272 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5277void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
5278 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
5280 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
5282 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
5283 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
5284 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
5285 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5287 DS->takeName(OldDS);
5288 OldDS->replaceAllUsesWith(DS);
5289 OldDS->eraseFromParent();
5295 llvm::Constant *
New) {
5298 Old->replaceAllUsesWith(
New);
5299 Old->eraseFromParent();
5302void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5304 assert(FD &&
"Not a FunctionDecl?");
5306 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5307 assert(DD &&
"Not a cpu_dispatch Function?");
5313 UpdateMultiVersionNames(GD, FD, ResolverName);
5315 llvm::Type *ResolverType;
5316 GlobalDecl ResolverGD;
5318 ResolverType = llvm::FunctionType::get(
5324 ResolverType = DeclTy;
5329 ResolverName, ResolverType, ResolverGD,
false));
5332 ResolverFunc->setComdat(
5333 getModule().getOrInsertComdat(ResolverFunc->getName()));
5335 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5338 for (
const IdentifierInfo *II : DD->cpus()) {
5346 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5349 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5355 Func = GetOrCreateLLVMFunction(
5356 MangledName, DeclTy, ExistingDecl,
5362 llvm::SmallVector<StringRef, 32> Features;
5363 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5364 llvm::transform(Features, Features.begin(),
5365 [](StringRef Str) { return Str.substr(1); });
5366 llvm::erase_if(Features, [&Target](StringRef Feat) {
5367 return !Target.validateCpuSupports(Feat);
5373 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5374 const CodeGenFunction::FMVResolverOption &RHS) {
5375 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5376 llvm::X86::getCpuSupportsMask(RHS.
Features);
5383 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5384 (Options.end() - 2)->Features),
5385 [](
auto X) { return X == 0; })) {
5386 StringRef LHSName = (Options.end() - 2)->Function->getName();
5387 StringRef RHSName = (Options.end() - 1)->Function->getName();
5388 if (LHSName.compare(RHSName) < 0)
5389 Options.erase(Options.end() - 2);
5391 Options.erase(Options.end() - 1);
5394 CodeGenFunction CGF(*
this);
5395 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5396 setMultiVersionResolverAttributes(ResolverFunc, GD);
5401 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5406 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5413 *
this, GD, FD,
true);
5416 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5424void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5426 assert(FD &&
"Not a FunctionDecl?");
5429 std::string MangledName =
5431 if (!DeferredResolversToEmit.insert(MangledName).second)
5434 MultiVersionFuncs.push_back(GD);
5440llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5442 assert(FD &&
"Not a FunctionDecl?");
5444 std::string MangledName =
5449 std::string ResolverName = MangledName;
5453 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5457 ResolverName +=
".ifunc";
5464 ResolverName +=
".resolver";
5467 bool ShouldReturnIFunc =
5486 AddDeferredMultiVersionResolverToEmit(GD);
5490 if (ShouldReturnIFunc) {
5492 llvm::Type *ResolverType = llvm::FunctionType::get(
5494 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5495 MangledName +
".resolver", ResolverType, GlobalDecl{},
5503 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5505 GIF->setName(ResolverName);
5512 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5513 ResolverName, DeclTy, GlobalDecl{},
false);
5515 "Resolver should be created for the first time");
5520void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5522 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5535 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5546bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5547 const llvm::GlobalValue *GV)
const {
5548 auto SC = GV->getDLLStorageClass();
5549 if (SC == llvm::GlobalValue::DefaultStorageClass)
5552 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5553 !MRD->
hasAttr<DLLImportAttr>()) ||
5554 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5555 !MRD->
hasAttr<DLLExportAttr>())) &&
5566llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5567 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5568 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5572 std::string NameWithoutMultiVersionMangling;
5573 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5575 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5576 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5577 !DontDefer && !IsForDefinition) {
5580 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5582 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5585 GDDef = GlobalDecl(FDDef);
5593 UpdateMultiVersionNames(GD, FD, MangledName);
5594 if (!IsForDefinition) {
5600 AddDeferredMultiVersionResolverToEmit(GD);
5602 *
this, GD, FD,
true);
5611 *
this, GD, FD,
true);
5613 return GetOrCreateMultiVersionResolver(GD);
5618 if (!NameWithoutMultiVersionMangling.empty())
5619 MangledName = NameWithoutMultiVersionMangling;
5624 if (WeakRefReferences.erase(Entry)) {
5625 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5626 if (FD && !FD->
hasAttr<WeakAttr>())
5627 Entry->setLinkage(llvm::Function::ExternalLinkage);
5631 if (D && shouldDropDLLAttribute(D, Entry)) {
5632 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5638 if (IsForDefinition && !Entry->isDeclaration()) {
5645 DiagnosedConflictingDefinitions.insert(GD).second) {
5649 diag::note_previous_definition);
5654 (Entry->getValueType() == Ty)) {
5661 if (!IsForDefinition)
5668 bool IsIncompleteFunction =
false;
5670 llvm::FunctionType *FTy;
5674 FTy = llvm::FunctionType::get(
VoidTy,
false);
5675 IsIncompleteFunction =
true;
5679 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5680 Entry ? StringRef() : MangledName, &
getModule());
5684 if (D && D->
hasAttr<AnnotateAttr>())
5702 if (!Entry->use_empty()) {
5704 Entry->removeDeadConstantUsers();
5710 assert(F->getName() == MangledName &&
"name was uniqued!");
5712 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5713 if (ExtraAttrs.hasFnAttrs()) {
5714 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5722 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5725 addDeferredDeclToEmit(GD);
5730 auto DDI = DeferredDecls.find(MangledName);
5731 if (DDI != DeferredDecls.end()) {
5735 addDeferredDeclToEmit(DDI->second);
5736 DeferredDecls.erase(DDI);
5764 if (!IsIncompleteFunction) {
5765 assert(F->getFunctionType() == Ty);
5783 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5793 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5796 DD->getParent()->getNumVBases() == 0)
5801 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5802 false, llvm::AttributeList(),
5805 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5809 if (IsForDefinition)
5817 llvm::GlobalValue *F =
5820 return llvm::NoCFIValue::get(F);
5830 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5833 if (!
C.getLangOpts().CPlusPlus)
5838 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5839 ?
C.Idents.get(
"terminate")
5840 :
C.Idents.get(Name);
5842 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5846 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
5847 for (
const auto *
Result : LSD->lookup(&NS))
5848 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
5853 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5862 llvm::Function *F, StringRef Name) {
5868 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5871 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5872 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5873 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5880 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5881 if (AssumeConvergent) {
5883 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5886 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5891 llvm::Constant *
C = GetOrCreateLLVMFunction(
5893 false,
false, ExtraAttrs);
5895 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5911 llvm::AttributeList ExtraAttrs,
bool Local,
5912 bool AssumeConvergent) {
5913 if (AssumeConvergent) {
5915 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5919 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5923 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5932 markRegisterParameterAttributes(F);
5958 if (WeakRefReferences.erase(Entry)) {
5959 if (D && !D->
hasAttr<WeakAttr>())
5960 Entry->setLinkage(llvm::Function::ExternalLinkage);
5964 if (D && shouldDropDLLAttribute(D, Entry))
5965 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5967 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5970 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5975 if (IsForDefinition && !Entry->isDeclaration()) {
5983 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5985 DiagnosedConflictingDefinitions.insert(D).second) {
5989 diag::note_previous_definition);
5994 if (Entry->getType()->getAddressSpace() != TargetAS)
5995 return llvm::ConstantExpr::getAddrSpaceCast(
5996 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
6000 if (!IsForDefinition)
6006 auto *GV =
new llvm::GlobalVariable(
6007 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
6008 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
6009 getContext().getTargetAddressSpace(DAddrSpace));
6014 GV->takeName(Entry);
6016 if (!Entry->use_empty()) {
6017 Entry->replaceAllUsesWith(GV);
6020 Entry->eraseFromParent();
6026 auto DDI = DeferredDecls.find(MangledName);
6027 if (DDI != DeferredDecls.end()) {
6030 addDeferredDeclToEmit(DDI->second);
6031 DeferredDecls.erase(DDI);
6036 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
6043 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
6049 CXXThreadLocals.push_back(D);
6057 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
6058 EmitGlobalVarDefinition(D);
6063 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
6064 GV->setSection(SA->getName());
6068 if (
getTriple().getArch() == llvm::Triple::xcore &&
6072 GV->setSection(
".cp.rodata");
6075 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
6076 GV->setCodeModel(CMA->getModel());
6081 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
6085 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
6086 bool HasMutableFields =
Record &&
Record->hasMutableFields();
6087 if (!HasMutableFields) {
6094 auto *InitType =
Init->getType();
6095 if (GV->getValueType() != InitType) {
6100 GV->setName(StringRef());
6105 ->stripPointerCasts());
6108 GV->eraseFromParent();
6111 GV->setInitializer(
Init);
6112 GV->setConstant(
true);
6113 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
6133 SanitizerMD->reportGlobal(GV, *D);
6138 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
6139 if (DAddrSpace != ExpectedAS)
6152 false, IsForDefinition);
6173 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
6174 llvm::Align Alignment) {
6175 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
6176 llvm::GlobalVariable *OldGV =
nullptr;
6180 if (GV->getValueType() == Ty)
6185 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
6190 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
6195 GV->takeName(OldGV);
6197 if (!OldGV->use_empty()) {
6198 OldGV->replaceAllUsesWith(GV);
6201 OldGV->eraseFromParent();
6205 !GV->hasAvailableExternallyLinkage())
6206 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6208 GV->setAlignment(Alignment);
6245 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
6253 if (GV && !GV->isDeclaration())
6258 if (!MustBeEmitted(D) && !GV) {
6259 DeferredDecls[MangledName] = D;
6264 EmitGlobalVarDefinition(D);
6269 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
6271 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
6286 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(
Addr)) {
6290 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
6293 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6295 if (!Fn->getSubprogram())
6301 return Context.toCharUnitsFromBits(
6306 if (LangOpts.OpenCL) {
6317 if (LangOpts.SYCLIsDevice &&
6321 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6326 if (D->
hasAttr<CUDAConstantAttr>())
6328 if (D->
hasAttr<CUDASharedAttr>())
6330 if (D->
hasAttr<CUDADeviceAttr>())
6338 if (LangOpts.OpenMP) {
6340 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6348 if (LangOpts.OpenCL)
6350 if (LangOpts.SYCLIsDevice)
6352 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
6360 if (
auto AS =
getTarget().getConstantAddressSpace())
6373static llvm::Constant *
6375 llvm::GlobalVariable *GV) {
6376 llvm::Constant *Cast = GV;
6381 GV, llvm::PointerType::get(
6388template<
typename SomeDecl>
6390 llvm::GlobalValue *GV) {
6405 const SomeDecl *
First = D->getFirstDecl();
6406 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6412 std::pair<StaticExternCMap::iterator, bool> R =
6413 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6418 R.first->second =
nullptr;
6425 if (D.
hasAttr<SelectAnyAttr>())
6429 if (
auto *VD = dyn_cast<VarDecl>(&D))
6443 llvm_unreachable(
"No such linkage");
6451 llvm::GlobalObject &GO) {
6454 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6462void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6477 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6478 OpenMPRuntime->emitTargetGlobalVariable(D))
6481 llvm::TrackingVH<llvm::Constant>
Init;
6482 bool NeedsGlobalCtor =
false;
6486 bool IsDefinitionAvailableExternally =
6488 bool NeedsGlobalDtor =
6489 !IsDefinitionAvailableExternally &&
6496 if (IsDefinitionAvailableExternally &&
6507 std::optional<ConstantEmitter> emitter;
6512 bool IsCUDASharedVar =
6517 bool IsCUDAShadowVar =
6519 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6520 D->
hasAttr<CUDASharedAttr>());
6521 bool IsCUDADeviceShadowVar =
6526 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6527 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6531 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6534 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6535 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6536 }
else if (!InitExpr) {
6549 initializedGlobalDecl = GlobalDecl(D);
6550 emitter.emplace(*
this);
6551 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6559 if (!IsDefinitionAvailableExternally)
6560 NeedsGlobalCtor =
true;
6564 NeedsGlobalCtor =
false;
6576 DelayedCXXInitPosition.erase(D);
6583 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6588 llvm::Type* InitType =
Init->getType();
6589 llvm::Constant *Entry =
6593 Entry = Entry->stripPointerCasts();
6596 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6607 if (!GV || GV->getValueType() != InitType ||
6608 GV->getType()->getAddressSpace() !=
6612 Entry->setName(StringRef());
6617 ->stripPointerCasts());
6620 llvm::Constant *NewPtrForOldDecl =
6621 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6623 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6631 if (D->
hasAttr<AnnotateAttr>())
6644 if (LangOpts.CUDA) {
6645 if (LangOpts.CUDAIsDevice) {
6648 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6651 GV->setExternallyInitialized(
true);
6658 if (LangOpts.HLSL &&
6663 GV->setExternallyInitialized(
true);
6665 GV->setInitializer(
Init);
6672 emitter->finalize(GV);
6675 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6676 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6680 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6681 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6683 GV->setConstant(
true);
6688 if (std::optional<CharUnits> AlignValFromAllocate =
6690 AlignVal = *AlignValFromAllocate;
6708 Linkage == llvm::GlobalValue::ExternalLinkage &&
6709 Context.getTargetInfo().getTriple().isOSDarwin() &&
6711 Linkage = llvm::GlobalValue::InternalLinkage;
6716 if (LangOpts.HLSL &&
6718 Linkage = llvm::GlobalValue::ExternalLinkage;
6721 if (D->
hasAttr<DLLImportAttr>())
6722 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6723 else if (D->
hasAttr<DLLExportAttr>())
6724 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6726 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6728 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6730 GV->setConstant(
false);
6735 if (!GV->getInitializer()->isNullValue())
6736 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6739 setNonAliasAttributes(D, GV);
6741 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6743 CXXThreadLocals.push_back(D);
6750 if (NeedsGlobalCtor || NeedsGlobalDtor)
6751 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6753 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6758 DI->EmitGlobalVariable(GV, D);
6766 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6777 if (D->
hasAttr<SectionAttr>())
6783 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6784 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6785 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6786 D->
hasAttr<PragmaClangRodataSectionAttr>())
6794 if (D->
hasAttr<WeakImportAttr>())
6803 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6804 if (D->
hasAttr<AlignedAttr>())
6807 if (Context.isAlignmentRequired(VarType))
6811 for (
const FieldDecl *FD : RD->fields()) {
6812 if (FD->isBitField())
6814 if (FD->
hasAttr<AlignedAttr>())
6816 if (Context.isAlignmentRequired(FD->
getType()))
6828 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6829 Context.getTypeAlignIfKnown(D->
getType()) >
6836llvm::GlobalValue::LinkageTypes
6840 return llvm::Function::InternalLinkage;
6843 return llvm::GlobalVariable::WeakAnyLinkage;
6847 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6852 return llvm::GlobalValue::AvailableExternallyLinkage;
6866 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6867 : llvm::Function::InternalLinkage;
6881 return llvm::Function::ExternalLinkage;
6884 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6885 : llvm::Function::InternalLinkage;
6886 return llvm::Function::WeakODRLinkage;
6893 CodeGenOpts.NoCommon))
6894 return llvm::GlobalVariable::CommonLinkage;
6900 if (D->
hasAttr<SelectAnyAttr>())
6901 return llvm::GlobalVariable::WeakODRLinkage;
6905 return llvm::GlobalVariable::ExternalLinkage;
6908llvm::GlobalValue::LinkageTypes
6917 llvm::Function *newFn) {
6919 if (old->use_empty())
6922 llvm::Type *newRetTy = newFn->getReturnType();
6927 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6929 llvm::User *user = ui->getUser();
6933 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6934 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6940 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6943 if (!callSite->isCallee(&*ui))
6948 if (callSite->getType() != newRetTy && !callSite->use_empty())
6953 llvm::AttributeList oldAttrs = callSite->getAttributes();
6956 unsigned newNumArgs = newFn->arg_size();
6957 if (callSite->arg_size() < newNumArgs)
6963 bool dontTransform =
false;
6964 for (llvm::Argument &A : newFn->args()) {
6965 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6966 dontTransform =
true;
6971 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6979 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6983 callSite->getOperandBundlesAsDefs(newBundles);
6985 llvm::CallBase *newCall;
6987 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6988 callSite->getIterator());
6991 newCall = llvm::InvokeInst::Create(
6992 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6993 newArgs, newBundles,
"", callSite->getIterator());
6997 if (!newCall->getType()->isVoidTy())
6998 newCall->takeName(callSite);
6999 newCall->setAttributes(
7000 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
7001 oldAttrs.getRetAttrs(), newArgAttrs));
7002 newCall->setCallingConv(callSite->getCallingConv());
7005 if (!callSite->use_empty())
7006 callSite->replaceAllUsesWith(newCall);
7009 if (callSite->getDebugLoc())
7010 newCall->setDebugLoc(callSite->getDebugLoc());
7012 callSitesToBeRemovedFromParent.push_back(callSite);
7015 for (
auto *callSite : callSitesToBeRemovedFromParent) {
7016 callSite->eraseFromParent();
7030 llvm::Function *NewFn) {
7040 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
7052void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
7053 llvm::GlobalValue *GV) {
7061 if (!GV || (GV->getValueType() != Ty))
7067 if (!GV->isDeclaration())
7077 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
7078 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
7090 setNonAliasAttributes(GD, Fn);
7092 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
7093 (CodeGenOpts.OptimizationLevel == 0) &&
7096 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
7098 !D->
hasAttr<NoInlineAttr>() &&
7099 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
7100 !D->
hasAttr<OptimizeNoneAttr>() &&
7101 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
7102 !ShouldAddOptNone) {
7103 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
7113 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
7114 if (UnwindMode != llvm::WinX64EHUnwindMode::Default &&
7115 UnwindMode != llvm::WinX64EHUnwindMode::V3 &&
7116 Fn->needsUnwindTableEntry()) {
7117 bool HasEGPR =
false;
7118 if (Fn->hasFnAttribute(
"target-features")) {
7120 Fn->getFnAttribute(
"target-features").getValueAsString();
7122 Feats.split(Tokens,
',', -1,
false);
7123 for (StringRef
Tok : Tokens) {
7126 else if (
Tok ==
"-egpr")
7130 HasEGPR = Context.getTargetInfo().hasFeature(
"egpr");
7133 unsigned DiagID = Diags.getCustomDiagID(
7135 "EGPR target feature requires unwind version 3");
7141 auto GetPriority = [
this](
const auto *Attr) ->
int {
7142 Expr *E = Attr->getPriority();
7146 return Attr->DefaultPriority;
7149 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
7151 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
7157void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
7159 const AliasAttr *AA = D->
getAttr<AliasAttr>();
7160 assert(AA &&
"Not an alias?");
7164 if (AA->getAliasee() == MangledName) {
7165 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7172 if (Entry && !Entry->isDeclaration())
7175 Aliases.push_back(GD);
7181 llvm::Constant *Aliasee;
7182 llvm::GlobalValue::LinkageTypes
LT;
7184 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
7190 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
7197 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
7199 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
7202 if (GA->getAliasee() == Entry) {
7203 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7207 assert(Entry->isDeclaration());
7216 GA->takeName(Entry);
7218 Entry->replaceAllUsesWith(GA);
7219 Entry->eraseFromParent();
7221 GA->setName(MangledName);
7229 GA->setLinkage(llvm::Function::WeakAnyLinkage);
7232 if (
const auto *VD = dyn_cast<VarDecl>(D))
7233 if (VD->getTLSKind())
7244void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
7246 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
7247 assert(IFA &&
"Not an ifunc?");
7251 if (IFA->getResolver() == MangledName) {
7252 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7258 if (Entry && !Entry->isDeclaration()) {
7261 DiagnosedConflictingDefinitions.insert(GD).second) {
7262 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
7265 diag::note_previous_definition);
7270 Aliases.push_back(GD);
7276 llvm::Constant *Resolver =
7277 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
7281 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
7282 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
7284 if (GIF->getResolver() == Entry) {
7285 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7288 assert(Entry->isDeclaration());
7297 GIF->takeName(Entry);
7299 Entry->replaceAllUsesWith(GIF);
7300 Entry->eraseFromParent();
7302 GIF->setName(MangledName);
7308 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
7309 (llvm::Intrinsic::ID)IID, Tys);
7312static llvm::StringMapEntry<llvm::GlobalVariable *> &
7315 bool &IsUTF16,
unsigned &StringLength) {
7316 StringRef String = Literal->getString();
7317 unsigned NumBytes = String.size();
7320 if (!Literal->containsNonAsciiOrNull()) {
7321 StringLength = NumBytes;
7322 return *Map.insert(std::make_pair(String,
nullptr)).first;
7329 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
7330 llvm::UTF16 *ToPtr = &ToBuf[0];
7332 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
7333 ToPtr + NumBytes, llvm::strictConversion);
7336 StringLength = ToPtr - &ToBuf[0];
7340 return *Map.insert(std::make_pair(
7341 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7342 (StringLength + 1) * 2),
7348 unsigned StringLength = 0;
7349 bool isUTF16 =
false;
7350 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7355 if (
auto *
C = Entry.second)
7360 const llvm::Triple &Triple =
getTriple();
7363 const bool IsSwiftABI =
7364 static_cast<unsigned>(CFRuntime) >=
7369 if (!CFConstantStringClassRef) {
7370 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7372 Ty = llvm::ArrayType::get(Ty, 0);
7374 switch (CFRuntime) {
7378 CFConstantStringClassName =
7379 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7380 :
"$s10Foundation19_NSCFConstantStringCN";
7384 CFConstantStringClassName =
7385 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7386 :
"$S10Foundation19_NSCFConstantStringCN";
7390 CFConstantStringClassName =
7391 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7392 :
"__T010Foundation19_NSCFConstantStringCN";
7399 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7400 llvm::GlobalValue *GV =
nullptr;
7402 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7409 if ((VD = dyn_cast<VarDecl>(
Result)))
7412 if (Triple.isOSBinFormatELF()) {
7414 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7416 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7417 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7418 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7420 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7428 CFConstantStringClassRef =
7429 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7432 QualType CFTy = Context.getCFConstantStringType();
7437 auto Fields = Builder.beginStruct(STy);
7446 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7447 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7449 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7453 llvm::Constant *
C =
nullptr;
7456 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7457 Entry.first().size() / 2);
7458 C = llvm::ConstantDataArray::get(VMContext, Arr);
7460 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7466 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7467 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7468 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7471 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7472 : Context.getTypeAlignInChars(Context.CharTy);
7478 if (Triple.isOSBinFormatMachO())
7479 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7480 :
"__TEXT,__cstring,cstring_literals");
7483 else if (Triple.isOSBinFormatELF())
7484 GV->setSection(
".rodata");
7490 llvm::IntegerType *LengthTy =
7500 Fields.addInt(LengthTy, StringLength);
7508 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7510 llvm::GlobalVariable::PrivateLinkage);
7511 GV->addAttribute(
"objc_arc_inert");
7512 switch (Triple.getObjectFormat()) {
7513 case llvm::Triple::UnknownObjectFormat:
7514 llvm_unreachable(
"unknown file format");
7515 case llvm::Triple::DXContainer:
7516 case llvm::Triple::GOFF:
7517 case llvm::Triple::SPIRV:
7518 case llvm::Triple::XCOFF:
7519 llvm_unreachable(
"unimplemented");
7520 case llvm::Triple::COFF:
7521 case llvm::Triple::ELF:
7522 case llvm::Triple::Wasm:
7523 GV->setSection(
"cfstring");
7525 case llvm::Triple::MachO:
7526 GV->setSection(
"__DATA,__cfstring");
7535 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7539 if (ObjCFastEnumerationStateType.isNull()) {
7540 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7544 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7545 Context.getPointerType(Context.UnsignedLongTy),
7546 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7549 for (
size_t i = 0; i < 4; ++i) {
7554 FieldTypes[i],
nullptr,
7563 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7566 return ObjCFastEnumerationStateType;
7580 assert(CAT &&
"String literal not of constant array type!");
7582 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7586 llvm::Type *ElemTy = AType->getElementType();
7587 unsigned NumElements = AType->getNumElements();
7590 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7592 Elements.reserve(NumElements);
7594 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7596 Elements.resize(NumElements);
7597 return llvm::ConstantDataArray::get(VMContext, Elements);
7600 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7602 Elements.reserve(NumElements);
7604 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7606 Elements.resize(NumElements);
7607 return llvm::ConstantDataArray::get(VMContext, Elements);
7610static llvm::GlobalVariable *
7619 auto *GV =
new llvm::GlobalVariable(
7620 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7621 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7623 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7624 if (GV->isWeakForLinker()) {
7625 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7626 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7642 llvm::GlobalVariable **Entry =
nullptr;
7643 if (!LangOpts.WritableStrings) {
7644 Entry = &ConstantStringMap[
C];
7645 if (
auto GV = *Entry) {
7646 if (Alignment.
getAsAlign() > GV->getAlign().valueOrOne())
7649 GV->getValueType(), Alignment);
7654 StringRef GlobalVariableName;
7655 llvm::GlobalValue::LinkageTypes LT;
7660 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7661 !LangOpts.WritableStrings) {
7662 llvm::raw_svector_ostream Out(MangledNameBuffer);
7664 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7665 GlobalVariableName = MangledNameBuffer;
7667 LT = llvm::GlobalValue::PrivateLinkage;
7668 GlobalVariableName = Name;
7680 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7683 GV->getValueType(), Alignment);
7700 StringRef GlobalName) {
7701 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7706 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7709 llvm::GlobalVariable **Entry =
nullptr;
7710 if (!LangOpts.WritableStrings) {
7711 Entry = &ConstantStringMap[
C];
7712 if (
auto GV = *Entry) {
7713 if (Alignment.
getAsAlign() > GV->getAlign().valueOrOne())
7716 GV->getValueType(), Alignment);
7722 GlobalName, Alignment);
7727 GV->getValueType(), Alignment);
7745 MaterializedType = E->
getType();
7749 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7750 if (!InsertResult.second) {
7753 if (!InsertResult.first->second) {
7758 InsertResult.first->second =
new llvm::GlobalVariable(
7759 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7763 llvm::cast<llvm::GlobalVariable>(
7764 InsertResult.first->second->stripPointerCasts())
7773 llvm::raw_svector_ostream Out(Name);
7795 std::optional<ConstantEmitter> emitter;
7796 llvm::Constant *InitialValue =
nullptr;
7801 emitter.emplace(*
this);
7802 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7807 Type = InitialValue->getType();
7816 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7818 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7822 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7826 Linkage = llvm::GlobalVariable::InternalLinkage;
7830 auto *GV =
new llvm::GlobalVariable(
7832 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7833 if (emitter) emitter->finalize(GV);
7835 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7837 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7839 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7843 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7844 if (VD->getTLSKind())
7846 llvm::Constant *CV = GV;
7849 GV, llvm::PointerType::get(
7855 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7857 Entry->replaceAllUsesWith(CV);
7858 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7867void CodeGenModule::EmitObjCPropertyImplementations(
const
7880 if (!Getter || Getter->isSynthesizedAccessorStub())
7883 auto *Setter = PID->getSetterMethodDecl();
7884 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7895 if (ivar->getType().isDestructedType())
7916void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7929 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7944 getContext().getObjCIdType(),
nullptr, D,
true,
7950 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7955void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7962 EmitDeclContext(LSD);
7965void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7967 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7970 std::unique_ptr<CodeGenFunction> &CurCGF =
7971 GlobalTopLevelStmtBlockInFlight.first;
7975 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7983 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7984 FunctionArgList Args;
7986 const CGFunctionInfo &FnInfo =
7989 llvm::Function *
Fn = llvm::Function::Create(
7990 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7992 CurCGF.reset(
new CodeGenFunction(*
this));
7993 GlobalTopLevelStmtBlockInFlight.second = D;
7994 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7996 CXXGlobalInits.push_back(Fn);
7999 CurCGF->EmitStmt(D->
getStmt());
8002void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
8003 for (
auto *I : DC->
decls()) {
8009 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
8010 for (
auto *M : OID->methods())
8029 case Decl::CXXConversion:
8030 case Decl::CXXMethod:
8031 case Decl::Function:
8038 case Decl::CXXDeductionGuide:
8043 case Decl::Decomposition:
8044 case Decl::VarTemplateSpecialization:
8046 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
8047 for (
auto *B : DD->flat_bindings())
8048 if (
auto *HD = B->getHoldingVar())
8055 case Decl::IndirectField:
8059 case Decl::Namespace:
8062 case Decl::ClassTemplateSpecialization: {
8065 if (Spec->getSpecializationKind() ==
8067 Spec->hasDefinition())
8068 DI->completeTemplateDefinition(*Spec);
8070 case Decl::CXXRecord: {
8074 DI->EmitAndRetainType(
8078 DI->completeUnusedClass(*CRD);
8081 for (
auto *I : CRD->
decls())
8087 case Decl::UsingShadow:
8088 case Decl::ClassTemplate:
8089 case Decl::VarTemplate:
8091 case Decl::VarTemplatePartialSpecialization:
8092 case Decl::FunctionTemplate:
8093 case Decl::TypeAliasTemplate:
8102 case Decl::UsingEnum:
8106 case Decl::NamespaceAlias:
8110 case Decl::UsingDirective:
8114 case Decl::CXXConstructor:
8117 case Decl::CXXDestructor:
8121 case Decl::StaticAssert:
8122 case Decl::ExplicitInstantiation:
8129 case Decl::ObjCInterface:
8130 case Decl::ObjCCategory:
8133 case Decl::ObjCProtocol: {
8135 if (Proto->isThisDeclarationADefinition())
8136 ObjCRuntime->GenerateProtocol(Proto);
8140 case Decl::ObjCCategoryImpl:
8146 case Decl::ObjCImplementation: {
8148 EmitObjCPropertyImplementations(OMD);
8149 EmitObjCIvarInitializations(OMD);
8150 ObjCRuntime->GenerateClass(OMD);
8154 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
8155 OMD->getClassInterface()), OMD->getLocation());
8158 case Decl::ObjCMethod: {
8165 case Decl::ObjCCompatibleAlias:
8169 case Decl::PragmaComment: {
8171 switch (PCD->getCommentKind()) {
8173 llvm_unreachable(
"unexpected pragma comment kind");
8181 ProcessPragmaCommentCopyright(PCD->getArg(), PCD->isFromASTFile());
8191 case Decl::PragmaDetectMismatch: {
8197 case Decl::LinkageSpec:
8201 case Decl::FileScopeAsm: {
8203 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
8206 if (LangOpts.OpenMPIsTargetDevice)
8209 if (LangOpts.SYCLIsDevice)
8214 llvm::Module::GlobalAsmProperties Props;
8215 Props.TargetFeatures = llvm::join(TargetOpts.
Features,
",");
8216 Props.TargetCPU = TargetOpts.
CPU;
8218 llvm::Module::GlobalAsmFragment(AD->getAsmString(), Props));
8222 case Decl::TopLevelStmt:
8226 case Decl::Import: {
8230 if (!ImportedModules.insert(Import->getImportedModule()))
8234 if (!Import->getImportedOwningModule()) {
8236 DI->EmitImportDecl(*Import);
8242 if (CXX20ModuleInits && Import->getImportedModule() &&
8243 Import->getImportedModule()->isNamedModule())
8252 Visited.insert(Import->getImportedModule());
8253 Stack.push_back(Import->getImportedModule());
8255 while (!Stack.empty()) {
8257 if (!EmittedModuleInitializers.insert(Mod).second)
8260 for (
auto *D : Context.getModuleInitializers(Mod))
8267 if (Submodule->IsExplicit)
8270 if (Visited.insert(Submodule).second)
8271 Stack.push_back(Submodule);
8281 case Decl::OMPThreadPrivate:
8285 case Decl::OMPAllocate:
8289 case Decl::OMPDeclareReduction:
8293 case Decl::OMPDeclareMapper:
8297 case Decl::OMPRequires:
8302 case Decl::TypeAlias:
8304 DI->EmitAndRetainType(
getContext().getTypedefType(
8312 DI->EmitAndRetainType(
8319 DI->EmitAndRetainType(
8323 case Decl::HLSLRootSignature:
8326 case Decl::HLSLBuffer:
8330 case Decl::OpenACCDeclare:
8333 case Decl::OpenACCRoutine:
8348 if (!CodeGenOpts.CoverageMapping)
8351 case Decl::CXXConversion:
8352 case Decl::CXXMethod:
8353 case Decl::Function:
8354 case Decl::ObjCMethod:
8355 case Decl::CXXConstructor:
8356 case Decl::CXXDestructor: {
8365 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8375 if (!CodeGenOpts.CoverageMapping)
8377 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8378 if (Fn->isTemplateInstantiation())
8381 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8389 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8392 const Decl *D = Entry.first;
8394 case Decl::CXXConversion:
8395 case Decl::CXXMethod:
8396 case Decl::Function:
8397 case Decl::ObjCMethod: {
8404 case Decl::CXXConstructor: {
8411 case Decl::CXXDestructor: {
8428 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8429 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8430 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8431 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8432 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8441 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8442 return llvm::ConstantInt::get(i64, PtrInt);
8446 llvm::NamedMDNode *&GlobalMetadata,
8448 llvm::GlobalValue *
Addr) {
8449 if (!GlobalMetadata)
8451 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8454 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8457 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8460bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8461 llvm::GlobalValue *CppFunc) {
8463 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8466 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8469 if (Elem == CppFunc)
8475 for (llvm::User *User : Elem->users()) {
8479 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8480 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8483 for (llvm::User *CEUser : ConstExpr->users()) {
8484 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8485 IFuncs.push_back(IFunc);
8490 CEs.push_back(ConstExpr);
8491 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8492 IFuncs.push_back(IFunc);
8504 for (llvm::GlobalIFunc *IFunc : IFuncs)
8505 IFunc->setResolver(
nullptr);
8506 for (llvm::ConstantExpr *ConstExpr : CEs)
8507 ConstExpr->destroyConstant();
8511 Elem->eraseFromParent();
8513 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8518 llvm::FunctionType::get(IFunc->getType(),
false);
8519 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8520 CppFunc->getName(), ResolverTy, {},
false);
8521 IFunc->setResolver(Resolver);
8531void CodeGenModule::EmitStaticExternCAliases() {
8534 for (
auto &I : StaticExternCValues) {
8535 const IdentifierInfo *Name = I.first;
8536 llvm::GlobalValue *Val = I.second;
8544 llvm::GlobalValue *ExistingElem =
8549 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8556 auto Res = Manglings.find(MangledName);
8557 if (Res == Manglings.end())
8559 Result = Res->getValue();
8570void CodeGenModule::EmitDeclMetadata() {
8571 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8573 for (
auto &I : MangledDeclNames) {
8574 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8584void CodeGenFunction::EmitDeclMetadata() {
8585 if (LocalDeclMap.empty())
return;
8590 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8592 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8594 for (
auto &I : LocalDeclMap) {
8595 const Decl *D = I.first;
8596 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8597 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8599 Alloca->setMetadata(
8600 DeclPtrKind, llvm::MDNode::get(
8601 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8602 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8609void CodeGenModule::EmitVersionIdentMetadata() {
8610 llvm::NamedMDNode *IdentMetadata =
8611 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8613 llvm::LLVMContext &Ctx = TheModule.getContext();
8615 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8616 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8619void CodeGenModule::EmitCommandLineMetadata() {
8620 llvm::NamedMDNode *CommandLineMetadata =
8621 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8623 llvm::LLVMContext &Ctx = TheModule.getContext();
8625 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8626 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8629void CodeGenModule::EmitCoverageFile() {
8630 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8634 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8635 llvm::LLVMContext &Ctx = TheModule.getContext();
8636 auto *CoverageDataFile =
8638 auto *CoverageNotesFile =
8640 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8641 llvm::MDNode *CU = CUNode->getOperand(i);
8642 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8643 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8656 LangOpts.ObjCRuntime.isGNUFamily())
8657 return ObjCRuntime->GetEHType(Ty);
8664 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8666 for (
auto RefExpr : D->
varlist()) {
8669 VD->getAnyInitializer() &&
8670 !VD->getAnyInitializer()->isConstantInitializer(
getContext());
8676 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8677 CXXGlobalInits.push_back(InitFunction);
8681llvm::Metadata *CodeGenModule::CreateMetadataIdentifierImpl(
8682 QualType T, MetadataTypeMap &Map, StringRef Suffix,
bool ForceString) {
8685 FnType->getReturnType(), FnType->getParamTypes(),
8686 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8688 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
8693 std::string OutName;
8694 llvm::raw_string_ostream Out(OutName);
8699 Out <<
".normalized";
8722 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
8727 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
8731 return CreateMetadataIdentifierImpl(
T, GeneralizedMetadataIdMap,
8732 ".generalized",
false);
8737 return CreateMetadataIdentifierImpl(
T, CallGraphMetadataIdMap,
"",
8745 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8746 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8747 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8748 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8749 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8750 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8751 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8752 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8760 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8762 if (CodeGenOpts.SanitizeCfiCrossDso)
8764 VTable->addTypeMetadata(Offset.getQuantity(),
8765 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8768 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8769 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8775 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8785 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8800 bool forPointeeType) {
8811 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8818 bool AlignForArray =
T->isArrayType();
8824 if (
T->isIncompleteType()) {
8841 if (
T.getQualifiers().hasUnaligned()) {
8843 }
else if (forPointeeType && !AlignForArray &&
8844 (RD =
T->getAsCXXRecordDecl())) {
8855 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8868 if (NumAutoVarInit >= StopAfter) {
8871 if (!NumAutoVarInit) {
8885 const Decl *D)
const {
8889 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8891 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8897 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8901 llvm::MD5::MD5Result
Result;
8902 for (
const auto &Arg : PreprocessorOpts.Macros)
8903 Hash.update(Arg.first);
8907 llvm::sys::fs::UniqueID ID;
8911 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8916 << PLoc.
getFilename() << Status.getError().message();
8918 ID = Status->getUniqueID();
8920 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8921 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8928 assert(DeferredDeclsToEmit.empty() &&
8929 "Should have emitted all decls deferred to emit.");
8930 assert(NewBuilder->DeferredDecls.empty() &&
8931 "Newly created module should not have deferred decls");
8932 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8933 assert(EmittedDeferredDecls.empty() &&
8934 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8936 assert(NewBuilder->DeferredVTables.empty() &&
8937 "Newly created module should not have deferred vtables");
8938 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8940 assert(NewBuilder->EmittedVTables.empty() &&
8941 "Newly created module should not have defined vtables");
8942 NewBuilder->EmittedVTables = std::move(EmittedVTables);
8944 assert(NewBuilder->MangledDeclNames.empty() &&
8945 "Newly created module should not have mangled decl names");
8946 assert(NewBuilder->Manglings.empty() &&
8947 "Newly created module should not have manglings");
8948 NewBuilder->Manglings = std::move(Manglings);
8950 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8952 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
8956 std::string OutName;
8957 llvm::raw_string_ostream Out(OutName);
8965 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8971 if (Dtor && Dtor->isVirtual() && Dtor->hasAttr<DLLExportAttr>())
8974 return RequireVectorDeletingDtor.count(RD);
8978 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8980 RequireVectorDeletingDtor.insert(RD);
8994 if (Entry && !Entry->isDeclaration()) {
8999 auto *NewFn = llvm::Function::Create(
9001 llvm::Function::ExternalLinkage, VDName, &
getModule());
9002 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
9004 NewFn->takeName(VDEntry);
9005 VDEntry->replaceAllUsesWith(NewFn);
9006 VDEntry->eraseFromParent();
9007 Entry->replaceAllUsesWith(NewFn);
9008 Entry->eraseFromParent();
9013 addDeferredDeclToEmit(VectorDtorGD);
9017 llvm::GlobalAlias *GlobalDeleteAlias,
9021 PendingMSVCGlobalDeletes.insert({GlobalDeleteAlias, OperatorDeleteFD});
9043 "__global_delete wrapper is only used with the Microsoft ABI");
9045 llvm::LLVMContext &LLVMCtx = M.getContext();
9049 llvm::FunctionType *FnTy = GlobDeleteFn->getFunctionType();
9059 StringRef GlobDeleteMangledName = GlobDeleteFn->getName();
9060 StringRef Signature;
9061 const char *WrapperBase;
9062 if (GlobDeleteMangledName.starts_with(
"??3@")) {
9063 Signature = GlobDeleteMangledName.substr(4);
9064 WrapperBase =
"?__global_delete@@";
9065 }
else if (GlobDeleteMangledName.starts_with(
"??_V@")) {
9066 Signature = GlobDeleteMangledName.substr(5);
9067 WrapperBase =
"?__global_array_delete@@";
9069 llvm_unreachable(
"unexpected global operator delete mangling");
9072 std::string GlobalDeleteName = (WrapperBase + Signature).str();
9073 std::string EmptyGlobalDeleteName =
9074 (
"?__empty_global_delete@@" + Signature).str();
9078 if (llvm::GlobalValue *Existing = M.getNamedValue(GlobalDeleteName))
9087 llvm::Function *EmptyFn = M.getFunction(EmptyGlobalDeleteName);
9089 EmptyFn = llvm::Function::Create(
9090 FnTy, llvm::GlobalValue::LinkOnceODRLinkage, EmptyGlobalDeleteName, &M);
9091 EmptyFn->setComdat(M.getOrInsertComdat(EmptyGlobalDeleteName));
9092 EmptyFn->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
9099 auto *BB = llvm::BasicBlock::Create(LLVMCtx,
"", EmptyFn);
9100 llvm::Function *TrapFn =
9101 llvm::Intrinsic::getOrInsertDeclaration(&M, llvm::Intrinsic::trap);
9102 auto *TrapCall = llvm::CallInst::Create(TrapFn, {},
"", BB);
9103 TrapCall->setDoesNotReturn();
9104 TrapCall->setDoesNotThrow();
9105 new llvm::UnreachableInst(LLVMCtx, BB);
9119 auto *GlobalDeleteAlias = llvm::GlobalAlias::create(
9120 FnTy, GlobDeleteFn->getAddressSpace(), llvm::GlobalValue::WeakAnyLinkage,
9121 GlobalDeleteName, EmptyFn, &M);
9128 return GlobalDeleteAlias;
9140 if (!HasDirectGlobalDelete)
9143 for (
const auto &Entry : PendingMSVCGlobalDeletes) {
9144 llvm::GlobalAlias *Alias = Entry.first;
9152 llvm::Function::Create(FnTy, llvm::GlobalValue::LinkOnceODRLinkage,
9153 Alias->getAddressSpace(),
"", &
getModule());
9159 for (
auto &Arg : GlobDelFn->args())
9160 Args.push_back(&Arg);
9161 llvm::CallInst::Create(FnTy, RealDeleteFn, Args,
"", BB);
9166 Alias->replaceAllUsesWith(GlobDelFn);
9167 GlobDelFn->takeName(Alias);
9168 Alias->eraseFromParent();
9170 GlobDelFn->setComdat(
getModule().getOrInsertComdat(GlobDelFn->getName()));
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the Diagnostic-related interfaces.
Defines enum values for all the target-independent builtin functions.
static bool shouldAssumeDSOLocal(const CIRGenModule &cgm, cir::CIRGlobalValueInterface gv)
static bool shouldBeInCOMDAT(CIRGenModule &cgm, const Decl &d)
static void setWindowsItaniumDLLImport(CIRGenModule &cgm, bool isLocal, cir::FuncOp funcOp, StringRef name)
static std::string getMangledNameImpl(CIRGenModule &cgm, GlobalDecl gd, const NamedDecl *nd)
static bool hasImplicitAttr(const ValueDecl *decl)
static std::vector< std::string > getFeatureDeltaFromDefault(const CIRGenModule &cgm, llvm::StringRef targetCPU, llvm::StringMap< bool > &featureMap)
Get the feature delta from the default feature map for the given target CPU.
static CIRGenCXXABI * createCXXABI(CIRGenModule &cgm)
static bool isVarDeclStrongDefinition(const ASTContext &astContext, CIRGenModule &cgm, const VarDecl *vd, bool noCommon)
static void setLinkageForGV(cir::GlobalOp &gv, const NamedDecl *nd)
static void emitUsed(CIRGenModule &cgm, StringRef name, std::vector< cir::CIRGlobalValueInterface > &list)
static void AppendCPUSpecificCPUDispatchMangling(const CodeGenModule &CGM, const CPUSpecificAttr *Attr, unsigned CPUIndex, raw_ostream &Out)
static bool AllTrivialInitializers(CodeGenModule &CGM, ObjCImplementationDecl *D)
static const FunctionDecl * GetRuntimeFunctionDecl(ASTContext &C, StringRef Name)
static GlobalDecl getBaseVariantGlobalDecl(const NamedDecl *D)
static void checkAliasForTocData(llvm::GlobalVariable *GVar, const CodeGenOptions &CodeGenOpts, DiagnosticsEngine &Diags, SourceLocation Location)
static const char PFPDeactivationSymbolPrefix[]
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 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.
Represents a base class of a C++ class.
CXXTemporary * getTemporary()
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ base or member initializer.
Expr * getInit() const
Get the initializer.
FunctionDecl * getOperatorDelete() const
Represents a C++ destructor within a class.
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Represents a static or instance method of a struct/union/class.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
FunctionDecl * getOperatorNew() const
Represents a C++ struct/union/class.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool hasDefinition() const
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
const CXXDestructorDecl * getDestructor() const
CharUnits - This is an opaque type for sizes expressed in character units.
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits One()
One - Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
std::string MSSecureHotPatchFunctionsFile
The name of a file that contains functions which will be compiled for hotpatching.
std::string RecordCommandLine
The string containing the commandline for the llvm.commandline metadata, if non-empty.
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
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.
llvm::SanitizerStatReport & getSanStats()
llvm::Constant * EmitAnnotationString(StringRef Str)
Emit an annotation string.
void EmitOMPDeclareMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare mapper construct.
bool supportsCOMDAT() const
void RefreshTypeCacheForClass(const CXXRecordDecl *Class)
llvm::MDNode * getTBAATypeInfo(QualType QTy)
getTBAATypeInfo - Get metadata used to describe accesses to objects of the given type.
void EmitOMPRequiresDecl(const OMPRequiresDecl *D)
Emit a code for requires directive.
void HandleCXXStaticMemberVarInstantiation(VarDecl *VD)
Tell the consumer that this variable has been instantiated.
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
llvm::Constant * GetConstantArrayFromStringLiteral(const StringLiteral *E)
Return a constant array for the given string.
void SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV)
Set attributes which are common to any form of a global definition (alias, Objective-C method,...
std::optional< CharUnits > getOMPAllocateAlignment(const VarDecl *VD)
Return the alignment specified in an allocate directive, if present.
llvm::GlobalVariable * CreateOrReplaceCXXRuntimeVariable(StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes Linkage, llvm::Align Alignment)
Will return a global variable of the given type.
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
TBAAAccessInfo mergeTBAAInfoForConditionalOperator(TBAAAccessInfo InfoA, TBAAAccessInfo InfoB)
mergeTBAAInfoForConditionalOperator - Get merged TBAA information for the purposes of conditional ope...
llvm::LLVMContext & getLLVMContext()
llvm::GlobalValue * GetGlobalValue(StringRef Ref)
void GenKernelArgMetadata(llvm::Function *FN, const FunctionDecl *FD=nullptr, CodeGenFunction *CGF=nullptr)
OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument information in the program executab...
void setKCFIType(const FunctionDecl *FD, llvm::Function *F)
Set type metadata to the given function.
void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO)
void EmitOMPDeclareReduction(const OMPDeclareReductionDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare reduction construct.
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
void AddDetectMismatch(StringRef Name, StringRef Value)
Appends a detect mismatch command to the linker options.
void setDLLImportDLLExport(llvm::GlobalValue *GV, GlobalDecl D) const
llvm::Value * createOpenCLIntToSamplerConversion(const Expr *E, CodeGenFunction &CGF)
ConstantAddress GetAddrOfGlobalTemporary(const MaterializeTemporaryExpr *E, const Expr *Inner)
Returns a pointer to a global variable representing a temporary with static or thread storage duratio...
llvm::Constant * EmitNullConstant(QualType T)
Return the result of value-initializing the given type, i.e.
LangAS GetGlobalConstantAddressSpace() const
Return the AST address space of constant literal, which is used to emit the constant literal as globa...
LangAS GetGlobalVarAddressSpace(const VarDecl *D)
Return the AST address space of the underlying global variable for D, as determined by its declaratio...
void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, llvm::Function *F, bool IsThunk)
Set the LLVM function attributes (sext, zext, etc).
void EmitOpenACCRoutine(const OpenACCRoutineDecl *D, CodeGenFunction *CGF=nullptr)
void emitGlobalDeleteForwardingBodies()
Emit __global_delete forwarding bodies for any pending variants, if this TU directly uses global oper...
void addReplacement(StringRef Name, llvm::Constant *C)
void AddGlobalCtor(llvm::Function *Ctor, int Priority=65535, unsigned LexOrder=~0U, llvm::Constant *AssociatedData=nullptr)
AddGlobalCtor - Add a function to the list that will be called before main() runs.
llvm::Metadata * CreateMetadataIdentifierForFnType(QualType T)
Create a metadata identifier for the given function type.
void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F)
Set the LLVM function attributes which only apply to a function definition.
llvm::Metadata * CreateMetadataIdentifierForVirtualMemPtrType(QualType T)
Create a metadata identifier that is intended to be used to check virtual calls via a member function...
bool shouldUseLLVMABILowering(unsigned CallingConv) const
True when -fexperimental-abi-lowering is in effect AND the active target has an LLVMABI implementatio...
ConstantAddress GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *)
Return a pointer to a constant array for the given ObjCEncodeExpr node.
const GlobalDecl getMangledNameDecl(StringRef)
void ClearUnusedCoverageMapping(const Decl *D)
Remove the deferred empty coverage mapping as this declaration is actually instrumented.
void EmitTopLevelDecl(Decl *D)
Emit code for a single top level declaration.
llvm::Constant * EmitAnnotationUnit(SourceLocation Loc)
Emit the annotation's translation unit.
ConstantAddress GetAddrOfConstantCString(const std::string &Str, StringRef GlobalName=".str")
Returns a pointer to a character array containing the literal and a terminating '\0' character.
void printPostfixForExternalizedDecl(llvm::raw_ostream &OS, const Decl *D) const
Print the postfix for externalized static variable or kernels for single source offloading languages ...
void moveLazyEmissionStates(CodeGenModule *NewBuilder)
Move some lazily-emitted states to the NewBuilder.
llvm::ConstantInt * getSize(CharUnits numChars)
Emit the given number of characters as a value of type size_t.
void finalizeKCFITypes()
Emit KCFI type identifier constants and remove unused identifiers.
void setValueProfilingFlag(llvm::Module &M)
void setProfileVersion(llvm::Module &M)
void emitEmptyCounterMapping(const Decl *D, StringRef FuncName, llvm::GlobalValue::LinkageTypes Linkage)
Emit a coverage mapping range with a counter zero for an unused declaration.
CodeGenTBAA - This class organizes the cross-module state that is used while lowering AST types to LL...
This class organizes the cross-module state that is used while lowering AST types to LLVM types.
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
const CGFunctionInfo & arrangeCXXMethodDeclaration(const CXXMethodDecl *MD)
C++ methods have some special rules and also have implicit parameters.
const CGFunctionInfo & arrangeFreeFunctionType(CanQual< FunctionProtoType > Ty)
Arrange the argument and result information for a value of the given freestanding function type.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
const CGFunctionInfo & arrangeBuiltinFunctionDeclaration(QualType resultType, const FunctionArgList &args)
A builtin function is a freestanding function using the default C conventions.
unsigned getTargetAddressSpace(QualType T) const
void RefreshTypeCacheForClass(const CXXRecordDecl *RD)
Remove stale types from the type cache when an inheritance model gets assigned to a class.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
void UpdateCompletedType(const TagDecl *TD)
UpdateCompletedType - When we find the full definition for a TagDecl, replace the 'opaque' type we pr...
const CGFunctionInfo & arrangeGlobalDeclaration(GlobalDecl GD)
void EmitThunks(GlobalDecl GD)
EmitThunks - Emit the associated thunks for the given global decl.
A specialization of Address that requires the address to be an LLVM Constant.
static ConstantAddress invalid()
llvm::Constant * tryEmitForInitializer(const VarDecl &D)
Try to emit the initiaizer of the given declaration as an abstract constant.
void finalize(llvm::GlobalVariable *global)
llvm::Constant * emitAbstract(const Expr *E, QualType T)
Emit the result of the given expression as an abstract constant, asserting that it succeeded.
The standard implementation of ConstantInitBuilder used in Clang.
Organizes the cross-function state that is used while generating code coverage mapping data.
bool hasDiagnostics()
Whether or not the stats we've gathered indicate any potential problems.
void reportDiagnostics(DiagnosticsEngine &Diags, StringRef MainFile)
Report potential problems we've found to Diags.
TargetCodeGenInfo - This class organizes various target-specific codegeneration issues,...
virtual void getDependentLibraryOption(llvm::StringRef Lib, llvm::SmallString< 24 > &Opt) const
Gets the linker options necessary to link a dependent library on this platform.
const T & getABIInfo() const
virtual LangAS getGlobalVarAddressSpace(CodeGenModule &CGM, const VarDecl *D) const
Get target favored AST address space of a global variable for languages other than OpenCL and CUDA.
virtual void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const
setTargetAttributes - Provides a convenient hook to handle extra target-specific attributes for the g...
virtual void emitTargetMetadata(CodeGen::CodeGenModule &CGM, const llvm::MapVector< GlobalDecl, StringRef > &MangledDeclNames) const
emitTargetMetadata - Provides a convenient hook to handle extra target-specific metadata for the give...
virtual void emitTargetGlobals(CodeGen::CodeGenModule &CGM) const
Provides a convenient hook to handle extra target-specific globals.
virtual void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value, llvm::SmallString< 32 > &Opt) const
Gets the linker options necessary to detect object file mismatches on this platform.
Represents the canonical version of C arrays with a specified constant size.
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Stores additional source code information like skipped ranges which is required by the coverage mappi...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
void addDecl(Decl *D)
Add the declaration D into this context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Decl - This represents one declaration (or definition), e.g.
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
SourceLocation getEndLoc() const LLVM_READONLY
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
SourceLocation getBeginLoc() const LLVM_READONLY
TranslationUnitDecl * getTranslationUnitDecl()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Represents a ValueDecl that came out of a declarator.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
This represents one expression.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Represents a member of a struct/union/class.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
StringRef getName() const
The name of this FileEntry.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Represents a function declaration or definition.
bool isTargetClonesMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-clones functional...
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
bool isImmediateFunction() const
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions:
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isTargetVersionMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-version functiona...
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool doesDeclarationForceExternallyVisibleDefinition() const
For a function declaration in C or C++, determine whether this declaration causes the definition to b...
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
bool isImplicitHDExplicitInstantiation() const
True if both host and device are implicit attributes and this is (or is a member of) an explicit temp...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
GlobalDecl - represents a global declaration.
GlobalDecl getWithMultiVersionIndex(unsigned Index)
CXXCtorType getCtorType() const
GlobalDecl getWithKernelReferenceKind(KernelReferenceKind Kind)
GlobalDecl getCanonicalDecl() const
KernelReferenceKind getKernelReferenceKind() const
GlobalDecl getWithDecl(const Decl *D)
unsigned getMultiVersionIndex() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
@ Swift5_0
Interoperability with the Swift 5.0 runtime.
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
VisibilityFromDLLStorageClassKinds
@ Keep
Keep the IR-gen assigned visibility.
@ Protected
Override the IR-gen assigned visibility with protected visibility.
@ Default
Override the IR-gen assigned visibility with default visibility.
@ Hidden
Override the IR-gen assigned visibility with hidden visibility.
ClangABI
Clang versions with different platform ABI conformance.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
std::string CUID
The user provided compilation unit ID, if non-empty.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
Visibility getVisibility() const
void setLinkage(Linkage L)
Linkage getLinkage() const
bool isVisibilityExplicit() const
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
Parts getParts() const
Get the decomposed parts of this declaration.
APValue & getAsAPValue() const
Get the value of this MSGuidDecl as an APValue.
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
void mangleBlock(const DeclContext *DC, const BlockDecl *BD, raw_ostream &Out)
void mangleCtorBlock(const CXXConstructorDecl *CD, CXXCtorType CT, const BlockDecl *BD, raw_ostream &Out)
void mangleGlobalBlock(const BlockDecl *BD, const NamedDecl *ID, raw_ostream &Out)
bool isTriviallyRecursive(const FunctionDecl *FD)
Return true if FD's body contains a direct call back to the symbol it links as, through an asm label ...
bool shouldMangleDeclName(const NamedDecl *D)
void mangleName(GlobalDecl GD, raw_ostream &)
virtual void mangleCanonicalTypeName(QualType T, raw_ostream &, bool NormalizeIntegers=false)=0
Generates a unique string for an externally visible type for use with TBAA or type uniquing.
virtual void mangleStringLiteral(const StringLiteral *SL, raw_ostream &)=0
ManglerKind getKind() const
virtual void needsUniqueInternalLinkageNames()
virtual void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, raw_ostream &)=0
void mangleDtorBlock(const CXXDestructorDecl *CD, CXXDtorType DT, const BlockDecl *BD, raw_ostream &Out)
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
APValue * getOrCreateValue(bool MayCreate) const
Get the storage for the constant value of a materialized temporary of static storage duration.
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
unsigned getManglingNumber() const
Describes a module or submodule.
bool isInterfaceOrPartition() const
bool isNamedModuleUnit() const
Is this a C++20 named module unit.
Module * Parent
The parent of this module.
Module * getPrivateModuleFragment() const
Get the Private Module Fragment (sub-module) for this module, it there is one.
Module * getGlobalModuleFragment() const
Get the Global Module Fragment (sub-module) for this module, it there is one.
llvm::iterator_range< submodule_iterator > submodules()
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
bool UseExportAsModuleLinkName
Autolinking uses the framework name for linking purposes when this is false and the export_as name ot...
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
bool isExternallyVisible() const
Represent a C++ namespace.
This represents 'pragma omp threadprivate ...' directive.
ObjCEncodeExpr, used for @encode in Objective-C.
QualType getEncodedType() const
propimpl_range property_impls() const
const ObjCInterfaceDecl * getClassInterface() const
void addInstanceMethod(ObjCMethodDecl *method)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
init_iterator init_end()
init_end() - Retrieve an iterator past the last initializer.
CXXCtorInitializer ** init_iterator
init_iterator - Iterates through the ivar initializer list.
init_iterator init_begin()
init_begin() - Retrieve an iterator to the first initializer.
unsigned getNumIvarInitializers() const
getNumArgs - Number of ivars which must be initialized.
void setHasDestructors(bool val)
void setHasNonZeroConstructors(bool val)
Represents an ObjC class declaration.
ObjCIvarDecl * all_declared_ivar_begin()
all_declared_ivar_begin - return first ivar declared in this class, its extensions and its implementa...
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarDecl * getNextIvar()
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
Represents one property declaration in an Objective-C interface.
ObjCMethodDecl * getGetterMethodDecl() const
bool isReadOnly() const
isReadOnly - Return true iff the property has a setter.
The basic abstraction for the target Objective-C runtime.
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ GNUstep
'gnustep' is the modern non-fragile GNUstep runtime.
@ ObjFW
'objfw' is the Objective-C runtime included in ObjFW
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ GCC
'gcc' is the Objective-C runtime shipped with GCC, implementing a fragile Objective-C ABI
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
Represents a parameter to a function.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
static void processPathForFileMacro(SmallVectorImpl< char > &Path, const LangOptions &LangOpts, const TargetInfo &TI)
Represents an unpacked "presumed" location which can be presented to the user.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
ExclusionType getDefault(llvm::driver::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFunctionExcluded(StringRef FunctionName, llvm::driver::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFileExcluded(StringRef FileName, llvm::driver::ProfileInstrKind Kind) const
ExclusionType
Represents if an how something should be excluded from profiling.
@ Skip
Profiling is skipped using the skipprofile attribute.
@ Allow
Profiling is allowed.
std::optional< ExclusionType > isLocationExcluded(SourceLocation Loc, llvm::driver::ProfileInstrKind Kind) const
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool isConstant(const ASTContext &Ctx) const
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType withCVRQualifiers(unsigned CVR) const
bool isConstQualified() const
Determine whether this type is const-qualified.
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Represents a struct/union/class.
field_range fields() const
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinitionOrSelf() const
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
DiagnosticsEngine & getDiagnostics() const
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
unsigned getExpansionLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
StringRef getBufferName(SourceLocation Loc, bool *Invalid=nullptr) const
Return the filename or buffer identifier of the buffer the location is in.
FileID getMainFileID() const
Returns the FileID of the main source file.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
unsigned getLength() const
uint32_t getCodeUnit(size_t I) const
Return the code unit at the given position.
StringRef getString() const
unsigned getCharByteWidth() const
Represents the declaration of a struct/union/class/enum.
void startDefinition()
Starts the definition of this tag declaration.
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
virtual StringRef getABI() const
Get the ABI currently in use.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
Options for controlling the target.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
AMDGPUFeatureState AMDGPUSramEccState
AMDGPU sramecc setting from -msramecc/-mno-sramecc.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
AMDGPUFeatureState AMDGPUXnackState
AMDGPU xnack setting from -mxnack/-mno-xnack.
@ Enabled
Feature explicitly enabled.
@ Any
Feature state not specified and should generate most compatible code.
@ Hostcall
printf lowering scheme involving hostcalls, currently used by HIP programs by default
A template parameter object.
const APValue & getValue() const
A declaration that models statements at global scope.
The top declaration context.
static DeclContext * castToDeclContext(const TranslationUnitDecl *D)
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isAMDGPUNamedBarrierTypeOrWrapper() const
Check if the type is the AMDGPU named barrier type/a RecordType of a named barrier wrapper,...
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool isHLSLResourceRecord() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isObjCObjectPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
bool isHLSLResourceRecordArray() const
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
const APValue & getValue() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Defines the clang::TargetInfo interface.
bool hasUnwindExceptions(const LangOptions &LangOpts)
Determines whether the language options require us to model unwind exceptions.
std::unique_ptr< TargetCodeGenInfo > createARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createM68kTargetCodeGenInfo(CodeGenModule &CGM)
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
std::unique_ptr< TargetCodeGenInfo > createBPFTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createMSP430TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createWebAssemblyTargetCodeGenInfo(CodeGenModule &CGM, WebAssemblyABIKind K)
std::unique_ptr< TargetCodeGenInfo > createPPC64_SVR4_TargetCodeGenInfo(CodeGenModule &CGM, PPC64_SVR4_ABIKind Kind, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createHexagonTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createNVPTXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createSystemZTargetCodeGenInfo(CodeGenModule &CGM, bool HasVector, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createWinX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters)
std::unique_ptr< TargetCodeGenInfo > createAIXTargetCodeGenInfo(CodeGenModule &CGM, bool Is64Bit)
std::unique_ptr< TargetCodeGenInfo > createAMDGPUTargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateMacObjCRuntime(CodeGenModule &CGM)
X86AVXABILevel
The AVX ABI level for X86 targets.
std::unique_ptr< TargetCodeGenInfo > createTCETargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateGNUObjCRuntime(CodeGenModule &CGM)
Creates an instance of an Objective-C runtime class.
std::unique_ptr< TargetCodeGenInfo > createWindowsARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind K)
std::unique_ptr< TargetCodeGenInfo > createAVRTargetCodeGenInfo(CodeGenModule &CGM, unsigned NPR, unsigned NRR)
std::unique_ptr< TargetCodeGenInfo > createDirectXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createARCTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createDefaultTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createSPIRVTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createSparcV8TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createVETargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCommonSPIRTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createRISCVTargetCodeGenInfo(CodeGenModule &CGM, unsigned XLen, unsigned FLen, bool EABI)
std::unique_ptr< TargetCodeGenInfo > createWindowsAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind K)
std::unique_ptr< TargetCodeGenInfo > createSparcV9TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createLanaiTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createPPC32TargetCodeGenInfo(CodeGenModule &CGM, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createSystemZ_ZOS_TargetCodeGenInfo(CodeGenModule &CGM, bool HasVector, bool SoftFloatABI)
CGCUDARuntime * CreateNVCUDARuntime(CodeGenModule &CGM)
Creates an instance of a CUDA runtime class.
std::unique_ptr< TargetCodeGenInfo > createLoongArchTargetCodeGenInfo(CodeGenModule &CGM, unsigned GRLen, unsigned FLen)
std::unique_ptr< TargetCodeGenInfo > createPPC64TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWinX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createXCoreTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCSKYTargetCodeGenInfo(CodeGenModule &CGM, unsigned FLen)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
constexpr bool isInitializedByPipeline(LangAS AS)
bool LT(InterpState &S, CodePtr OpPC)
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
@ Ctor_Base
Base object ctor.
@ Ctor_Complete
Complete object ctor.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
std::string getClangVendor()
Retrieves the Clang vendor tag.
@ ICIS_NoInit
No in-class initializer.
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
const FunctionProtoType * T
StringRef languageToString(Language L)
@ Dtor_VectorDeleting
Vector deleting dtor.
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object dtor.
@ Dtor_Deleting
Deleting dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, llvm::vfs::FileSystem &VFS, DiagnosticsEngine &Diags)
static const char * getCFBranchLabelSchemeFlagVal(const CFBranchLabelSchemeKind Scheme)
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
bool isExternallyVisible(Linkage L)
@ EST_None
no exception specification
std::string getClangFullVersion()
Retrieves a string representing the complete clang version, which includes the clang version number,...
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
cl::opt< bool > SystemHeadersCoverage
int const char * function
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
std::optional< StringRef > Architecture
llvm::SmallVector< StringRef, 8 > Features
llvm::CallingConv::ID RuntimeCC
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::PointerType * ConstGlobalsPtrTy
void* in the address space for constant globals
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * CharTy
char
unsigned char PointerWidthInBits
The width of a pointer into the generic address space.
unsigned char IntAlignInBytes
llvm::Type * HalfTy
half, bfloat, float, double
unsigned char SizeSizeInBytes
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * SizeTy
llvm::PointerType * GlobalsInt8PtrTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::IntegerType * IntTy
int
llvm::IntegerType * Int16Ty
llvm::PointerType * ProgramPtrTy
Pointer in program address space.
unsigned char PointerAlignInBytes
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
llvm::PointerType * AllocaInt8PtrTy
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool hasSideEffects() const
Return true if the evaluated expression has side effects.
Extra information about a function prototype.
static const LangStandard & getLangStandardForKind(Kind K)
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
A library or framework to link against when an entity from this module is used.
Describes how types, statements, expressions, and declarations should be printed.