52#include "llvm/ABI/IRTypeMapper.h"
53#include "llvm/ABI/TargetInfo.h"
54#include "llvm/ADT/APFloat.h"
55#include "llvm/ADT/STLExtras.h"
56#include "llvm/ADT/StringExtras.h"
57#include "llvm/ADT/StringSwitch.h"
58#include "llvm/Analysis/TargetLibraryInfo.h"
59#include "llvm/BinaryFormat/ELF.h"
60#include "llvm/IR/AttributeMask.h"
61#include "llvm/IR/CallingConv.h"
62#include "llvm/IR/DataLayout.h"
63#include "llvm/IR/Intrinsics.h"
64#include "llvm/IR/LLVMContext.h"
65#include "llvm/IR/Module.h"
66#include "llvm/IR/ProfileSummary.h"
67#include "llvm/ProfileData/InstrProfReader.h"
68#include "llvm/ProfileData/SampleProf.h"
69#include "llvm/Support/ARMBuildAttributes.h"
70#include "llvm/Support/CRC.h"
71#include "llvm/Support/CodeGen.h"
72#include "llvm/Support/CommandLine.h"
73#include "llvm/Support/ConvertUTF.h"
74#include "llvm/Support/ErrorHandling.h"
75#include "llvm/Support/TimeProfiler.h"
76#include "llvm/TargetParser/AArch64TargetParser.h"
77#include "llvm/TargetParser/RISCVISAInfo.h"
78#include "llvm/TargetParser/Triple.h"
79#include "llvm/TargetParser/X86TargetParser.h"
80#include "llvm/Transforms/Instrumentation/KCFI.h"
81#include "llvm/Transforms/Utils/BuildLibCalls.h"
82#include "llvm/Transforms/Utils/KCFIHash.h"
83#include "llvm/Transforms/Utils/ModuleUtils.h"
91 "limited-coverage-experimental", llvm::cl::Hidden,
92 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
99 case TargetCXXABI::AppleARM64:
100 case TargetCXXABI::Fuchsia:
101 case TargetCXXABI::GenericAArch64:
102 case TargetCXXABI::GenericARM:
103 case TargetCXXABI::iOS:
104 case TargetCXXABI::WatchOS:
105 case TargetCXXABI::GenericMIPS:
106 case TargetCXXABI::GenericItanium:
107 case TargetCXXABI::WebAssembly:
108 case TargetCXXABI::XL:
110 case TargetCXXABI::Microsoft:
114 llvm_unreachable(
"invalid C++ ABI kind");
117static std::unique_ptr<TargetCodeGenInfo>
120 const llvm::Triple &Triple =
Target.getTriple();
123 switch (Triple.getArch()) {
127 case llvm::Triple::m68k:
129 case llvm::Triple::mips:
130 case llvm::Triple::mipsel:
131 if (Triple.getOS() == llvm::Triple::Win32)
135 case llvm::Triple::mips64:
136 case llvm::Triple::mips64el:
139 case llvm::Triple::avr: {
143 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
144 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
148 case llvm::Triple::aarch64:
149 case llvm::Triple::aarch64_32:
150 case llvm::Triple::aarch64_be: {
152 if (
Target.getABI() ==
"darwinpcs")
153 Kind = AArch64ABIKind::DarwinPCS;
154 else if (Triple.isOSWindows())
156 else if (
Target.getABI() ==
"aapcs-soft")
157 Kind = AArch64ABIKind::AAPCSSoft;
162 case llvm::Triple::wasm32:
163 case llvm::Triple::wasm64: {
165 if (
Target.getABI() ==
"experimental-mv")
166 Kind = WebAssemblyABIKind::ExperimentalMV;
170 case llvm::Triple::arm:
171 case llvm::Triple::armeb:
172 case llvm::Triple::thumb:
173 case llvm::Triple::thumbeb: {
174 if (Triple.getOS() == llvm::Triple::Win32)
178 StringRef ABIStr =
Target.getABI();
179 if (ABIStr ==
"apcs-gnu")
180 Kind = ARMABIKind::APCS;
181 else if (ABIStr ==
"aapcs16")
182 Kind = ARMABIKind::AAPCS16_VFP;
183 else if (CodeGenOpts.
FloatABI ==
"hard" ||
184 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
185 Kind = ARMABIKind::AAPCS_VFP;
190 case llvm::Triple::ppc: {
191 if (Triple.isOSAIX())
198 case llvm::Triple::ppcle: {
203 case llvm::Triple::ppc64:
204 if (Triple.isOSAIX())
207 if (Triple.isOSBinFormatELF()) {
209 if (
Target.getABI() ==
"elfv2")
210 Kind = PPC64_SVR4_ABIKind::ELFv2;
211 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
216 case llvm::Triple::ppc64le: {
217 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
219 if (
Target.getABI() ==
"elfv1")
220 Kind = PPC64_SVR4_ABIKind::ELFv1;
221 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
226 case llvm::Triple::nvptx:
227 case llvm::Triple::nvptx64:
230 case llvm::Triple::msp430:
233 case llvm::Triple::riscv32:
234 case llvm::Triple::riscv64:
235 case llvm::Triple::riscv32be:
236 case llvm::Triple::riscv64be: {
237 StringRef ABIStr =
Target.getABI();
239 unsigned ABIFLen = 0;
240 if (ABIStr.ends_with(
"f"))
242 else if (ABIStr.ends_with(
"d"))
244 bool EABI = ABIStr.ends_with(
"e");
248 case llvm::Triple::systemz: {
249 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
250 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
251 if (Triple.getOS() == llvm::Triple::ZOS)
256 case llvm::Triple::tce:
257 case llvm::Triple::tcele:
258 case llvm::Triple::tcele64:
261 case llvm::Triple::x86: {
262 bool IsDarwinVectorABI = Triple.isOSDarwin();
263 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
265 if (Triple.getOS() == llvm::Triple::Win32) {
267 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
268 CodeGenOpts.NumRegisterParameters);
271 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
272 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
275 case llvm::Triple::x86_64: {
276 StringRef ABI =
Target.getABI();
277 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
278 : ABI ==
"avx" ? X86AVXABILevel::AVX
279 : X86AVXABILevel::None);
281 switch (Triple.getOS()) {
282 case llvm::Triple::UEFI:
283 case llvm::Triple::Win32:
289 case llvm::Triple::hexagon:
291 case llvm::Triple::lanai:
293 case llvm::Triple::r600:
295 case llvm::Triple::amdgpu:
297 case llvm::Triple::sparc:
299 case llvm::Triple::sparcv9:
301 case llvm::Triple::xcore:
303 case llvm::Triple::arc:
305 case llvm::Triple::spir:
306 case llvm::Triple::spir64:
308 case llvm::Triple::spirv32:
309 case llvm::Triple::spirv64:
310 case llvm::Triple::spirv:
312 case llvm::Triple::dxil:
314 case llvm::Triple::ve:
316 case llvm::Triple::csky: {
317 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
319 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
324 case llvm::Triple::bpfeb:
325 case llvm::Triple::bpfel:
327 case llvm::Triple::loongarch32:
328 case llvm::Triple::loongarch64: {
329 StringRef ABIStr =
Target.getABI();
330 unsigned ABIFRLen = 0;
331 if (ABIStr.ends_with(
"f"))
333 else if (ABIStr.ends_with(
"d"))
342 if (!TheTargetCodeGenInfo)
344 return *TheTargetCodeGenInfo;
348 if (!CodeGenOpts.ExperimentalABILowering)
355 if (
T.getArch() == llvm::Triple::aarch64 ||
356 T.getArch() == llvm::Triple::aarch64_32 ||
357 T.getArch() == llvm::Triple::aarch64_be)
360 if (
T.getArch() == llvm::Triple::x86_64 && !
T.isOSWindows() && !
T.isUEFI() &&
361 !
T.isOSDarwin() && !
T.isOSCygMing()) {
363 case llvm::CallingConv::Win64:
364 case llvm::CallingConv::X86_RegCall:
365 case llvm::CallingConv::X86_FastCall:
366 case llvm::CallingConv::X86_VectorCall:
367 case llvm::CallingConv::X86_StdCall:
368 case llvm::CallingConv::X86_ThisCall:
372 case llvm::CallingConv::Intel_OCL_BI:
373 case llvm::CallingConv::PreserveMost:
374 case llvm::CallingConv::PreserveAll:
375 case llvm::CallingConv::PreserveNone:
384const llvm::abi::TargetInfo &
386 if (TheLLVMABITargetInfo)
387 return *TheLLVMABITargetInfo;
391 switch (
T.getArch()) {
393 llvm_unreachable(
"LLVMABI lowering requested for an unsupported target");
395 case llvm::Triple::aarch64:
396 case llvm::Triple::aarch64_32:
397 case llvm::Triple::aarch64_be: {
399 llvm::abi::AArch64ABIKind Kind = llvm::abi::AArch64ABIKind::AAPCS;
400 if (ABI ==
"darwinpcs")
401 Kind = llvm::abi::AArch64ABIKind::DarwinPCS;
402 else if (
T.isOSWindows())
403 Kind = llvm::abi::AArch64ABIKind::Win64;
404 else if (ABI ==
"aapcs-soft")
405 Kind = llvm::abi::AArch64ABIKind::AAPCSSoft;
406 TheLLVMABITargetInfo = llvm::abi::createAArch64TargetInfo(TB, Kind);
407 return *TheLLVMABITargetInfo;
410 case llvm::Triple::bpfeb:
411 case llvm::Triple::bpfel:
412 TheLLVMABITargetInfo = llvm::abi::createBPFTargetInfo(TB);
413 return *TheLLVMABITargetInfo;
415 case llvm::Triple::x86_64: {
417 llvm::abi::X86AVXABILevel AVXLevel =
418 ABI ==
"avx512" ? llvm::abi::X86AVXABILevel::AVX512
419 : ABI ==
"avx" ? llvm::abi::X86AVXABILevel::AVX
420 : llvm::abi::X86AVXABILevel::None;
422 llvm::abi::ABICompatInfo CompatInfo;
424 CompatInfo.ClassifyIntegerMMXAsSSE =
425 Compat > LangOptions::ClangABI::Ver3_8 && !
T.isOSDarwin() &&
426 !
T.isPS() && !
T.isOSFreeBSD();
427 CompatInfo.HonorsRevision98 = !
T.isOSDarwin();
428 CompatInfo.PassInt128VectorsInMem = Compat > LangOptions::ClangABI::Ver9 &&
429 (
T.isOSLinux() ||
T.isOSNetBSD());
431 CompatInfo.ReturnCXXRecordGreaterThan128InMem =
432 Compat > LangOptions::ClangABI::Ver20 && !
T.isPS();
433 CompatInfo.Clang11Compat =
434 Compat <= LangOptions::ClangABI::Ver11 ||
T.isPS();
438 TheLLVMABITargetInfo = llvm::abi::createX86_64TargetInfo(
439 TB, AVXLevel, Has64BitPointers, CompatInfo);
440 return *TheLLVMABITargetInfo;
446 llvm::LLVMContext &Context,
450 if (Opts.AlignDouble || Opts.OpenCL)
453 llvm::Triple Triple =
Target.getTriple();
454 llvm::DataLayout DL(
Target.getDataLayoutString());
455 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
456 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
457 llvm::Align ClangAlign(Alignment / 8);
458 if (DLAlign != ClangAlign) {
459 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
460 <<
" mapping to " << *Ty <<
" has data layout alignment "
461 << DLAlign.value() <<
" while clang specifies "
462 << ClangAlign.value() <<
"\n";
467 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
469 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
471 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
473 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
476 if (Triple.getArch() != llvm::Triple::m68k)
477 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
480 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
481 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
482 Triple.getArch() != llvm::Triple::ve)
483 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
485 if (
Target.hasFloat16Type())
486 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
488 if (
Target.hasBFloat16Type())
489 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
490 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
492 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
495 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
497 if (
Target.hasFloat128Type())
498 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
499 if (
Target.hasIbm128Type())
500 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
502 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
504 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
505 llvm::errs() <<
"Datalayout for target " << Triple.str()
506 <<
" sets element-aligned vectors to '"
507 <<
Target.vectorsAreElementAligned()
508 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
522 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
523 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
525 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
529 AbiMapper = std::make_unique<QualTypeMapper>(
C, M.getDataLayout(), AbiAlloc);
530 AbiReverseMapper = std::make_unique<llvm::abi::IRTypeMapper>(
531 M.getContext(), M.getDataLayout());
535 llvm::LLVMContext &LLVMContext = M.getContext();
536 VoidTy = llvm::Type::getVoidTy(LLVMContext);
537 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
538 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
539 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
540 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
541 HalfTy = llvm::Type::getHalfTy(LLVMContext);
542 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
543 FloatTy = llvm::Type::getFloatTy(LLVMContext);
544 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
550 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
552 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
554 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
555 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
556 IntPtrTy = llvm::IntegerType::get(LLVMContext,
557 C.getTargetInfo().getMaxPointerWidth());
558 Int8PtrTy = llvm::PointerType::get(LLVMContext,
560 const llvm::DataLayout &DL = M.getDataLayout();
562 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
564 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
566 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
582 createOpenCLRuntime();
584 createOpenMPRuntime();
591 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
592 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
598 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
599 CodeGenOpts.CoverageNotesFile.size() ||
600 CodeGenOpts.CoverageDataFile.size())
608 Block.GlobalUniqueCount = 0;
610 if (
C.getLangOpts().ObjC)
613 if (CodeGenOpts.hasProfileClangUse()) {
614 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
615 CodeGenOpts.ProfileInstrumentUsePath, *FS,
616 CodeGenOpts.ProfileRemappingFile);
617 if (
auto E = ReaderOrErr.takeError()) {
618 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
619 Diags.Report(diag::err_reading_profile)
620 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
624 PGOReader = std::move(ReaderOrErr.get());
629 if (CodeGenOpts.CoverageMapping)
633 if (CodeGenOpts.UniqueInternalLinkageNames &&
634 !
getModule().getSourceFileName().empty()) {
638 Context.getTargetInfo());
639 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
643 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
644 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
645 CodeGenOpts.NumRegisterParameters);
654 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
655 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
657 this->MSHotPatchFunctions.push_back(std::string{*I});
659 auto &DE = Context.getDiagnostics();
660 DE.Report(diag::err_open_hotpatch_file_failed)
662 << BufOrErr.getError().message();
667 this->MSHotPatchFunctions.push_back(FuncName);
669 llvm::sort(this->MSHotPatchFunctions);
672 if (!Context.getAuxTargetInfo())
678void CodeGenModule::createObjCRuntime() {
695 llvm_unreachable(
"bad runtime kind");
698void CodeGenModule::createOpenCLRuntime() {
702void CodeGenModule::createOpenMPRuntime() {
703 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
704 Diags.Report(diag::err_omp_host_ir_file_not_found)
705 << LangOpts.OMPHostIRFile;
710 case llvm::Triple::nvptx:
711 case llvm::Triple::nvptx64:
712 case llvm::Triple::amdgpu:
713 case llvm::Triple::spirv64:
716 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
717 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
720 if (LangOpts.OpenMPSimd)
721 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
723 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
728void CodeGenModule::createCUDARuntime() {
732void CodeGenModule::createHLSLRuntime() {
733 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
737 Replacements[Name] =
C;
740void CodeGenModule::applyReplacements() {
741 for (
auto &I : Replacements) {
742 StringRef MangledName = I.first;
743 llvm::Constant *Replacement = I.second;
748 auto *NewF = dyn_cast<llvm::Function>(Replacement);
750 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
751 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
754 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
755 CE->getOpcode() == llvm::Instruction::GetElementPtr);
756 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
761 OldF->replaceAllUsesWith(Replacement);
763 NewF->removeFromParent();
764 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
767 OldF->eraseFromParent();
772 GlobalValReplacements.push_back(std::make_pair(GV,
C));
775void CodeGenModule::applyGlobalValReplacements() {
776 for (
auto &I : GlobalValReplacements) {
777 llvm::GlobalValue *GV = I.first;
778 llvm::Constant *
C = I.second;
780 GV->replaceAllUsesWith(
C);
781 GV->eraseFromParent();
788 const llvm::Constant *
C;
789 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
790 C = GA->getAliasee();
791 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
792 C = GI->getResolver();
796 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
800 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
809 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
810 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
814 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
818 if (GV->hasCommonLinkage()) {
819 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
820 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
821 Diags.
Report(Location, diag::err_alias_to_common);
826 if (GV->isDeclaration()) {
827 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
828 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
829 << IsIFunc << IsIFunc;
832 for (
const auto &[
Decl, Name] : MangledDeclNames) {
833 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
835 if (II && II->
getName() == GV->getName()) {
836 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
840 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
850 const auto *F = dyn_cast<llvm::Function>(GV);
852 Diags.
Report(Location, diag::err_alias_to_undefined)
853 << IsIFunc << IsIFunc;
857 llvm::FunctionType *FTy = F->getFunctionType();
858 if (!FTy->getReturnType()->isPointerTy()) {
859 Diags.
Report(Location, diag::err_ifunc_resolver_return);
873 if (GVar->hasAttribute(
"toc-data")) {
874 auto GVId = GVar->getName();
877 Diags.
Report(Location, diag::warn_toc_unsupported_type)
878 << GVId <<
"the variable has an alias";
880 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
881 llvm::AttributeSet NewAttributes =
882 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
883 GVar->setAttributes(NewAttributes);
887void CodeGenModule::checkAliases() {
892 DiagnosticsEngine &Diags =
getDiags();
893 for (
const GlobalDecl &GD : Aliases) {
895 SourceLocation Location;
897 bool IsIFunc = D->hasAttr<IFuncAttr>();
898 if (
const Attr *A = D->getDefiningAttr()) {
899 Location = A->getLocation();
900 Range = A->getRange();
902 llvm_unreachable(
"Not an alias or ifunc?");
906 const llvm::GlobalValue *GV =
nullptr;
908 MangledDeclNames, Range)) {
914 GlobalDecl AliaseeGD;
917 Diags.Report(Location, diag::err_alias_to_undefined)
918 << IsIFunc << IsIFunc;
927 if (AliasIsFuncDecl != AliaseeIsFunc) {
928 Diags.Report(Location, diag::err_alias_between_function_and_variable)
931 diag::note_aliasee_declaration);
938 if (AliasIsFuncDecl && AliaseeIsFunc) {
939 QualType AliasTy = D->getType();
941 auto shouldReportTypeMismatch = [&]() {
942 const auto *AliasFTy =
944 const auto *AliaseeFTy =
946 assert(AliasFTy && AliaseeFTy);
947 if (!Context.typesAreCompatible(AliasFTy->getReturnType(),
950 const auto *AliasFPTy = dyn_cast<FunctionProtoType>(AliasFTy);
951 const auto *AliaseeFPTy = dyn_cast<FunctionProtoType>(AliaseeFTy);
953 if ((AliasFPTy && AliasFPTy->isVariadic() && !AliaseeFPTy) ||
954 (AliaseeFPTy && AliaseeFPTy->isVariadic() && !AliasFPTy))
957 if (!AliasFPTy || !AliaseeFPTy)
961 if (AliasFPTy->getNumParams() != AliaseeFPTy->getNumParams() ||
962 AliasFPTy->isVariadic() != AliaseeFPTy->isVariadic())
964 for (
unsigned i = 0; i < AliasFPTy->getNumParams(); ++i)
965 if (!Context.typesAreCompatible(AliasFPTy->getParamType(i),
966 AliaseeFPTy->getParamType(i)))
970 if (shouldReportTypeMismatch()) {
971 Diags.Report(Location, diag::warn_alias_type_mismatch)
972 << AliasTy << AliaseeTy;
974 diag::note_aliasee_declaration);
980 if (
const llvm::GlobalVariable *GVar =
981 dyn_cast<const llvm::GlobalVariable>(GV))
985 llvm::Constant *Aliasee =
989 llvm::GlobalValue *AliaseeGV;
990 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
995 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
996 StringRef AliasSection = SA->getName();
997 if (AliasSection != AliaseeGV->getSection())
998 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
999 << AliasSection << IsIFunc << IsIFunc;
1007 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
1008 if (GA->isInterposable()) {
1009 Diags.Report(Location, diag::warn_alias_to_weak_alias)
1010 << GV->getName() << GA->getName() << IsIFunc;
1011 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1012 GA->getAliasee(), Alias->getType());
1024 llvm::Attribute::DisableSanitizerInstrumentation);
1029 for (
const GlobalDecl &GD : Aliases) {
1032 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
1033 Alias->eraseFromParent();
1038 DeferredDeclsToEmit.clear();
1039 EmittedDeferredDecls.clear();
1040 DeferredAnnotations.clear();
1042 OpenMPRuntime->clear();
1046 StringRef MainFile) {
1049 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
1050 if (MainFile.empty())
1051 MainFile =
"<stdin>";
1052 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
1055 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
1058 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
1062static std::optional<llvm::GlobalValue::VisibilityTypes>
1067 return std::nullopt;
1069 return llvm::GlobalValue::DefaultVisibility;
1071 return llvm::GlobalValue::HiddenVisibility;
1073 return llvm::GlobalValue::ProtectedVisibility;
1075 llvm_unreachable(
"unknown option value!");
1080 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
1089 GV.setDSOLocal(
false);
1090 GV.setVisibility(*
V);
1095 if (!LO.VisibilityFromDLLStorageClass)
1098 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
1101 std::optional<llvm::GlobalValue::VisibilityTypes>
1102 NoDLLStorageClassVisibility =
1105 std::optional<llvm::GlobalValue::VisibilityTypes>
1106 ExternDeclDLLImportVisibility =
1109 std::optional<llvm::GlobalValue::VisibilityTypes>
1110 ExternDeclNoDLLStorageClassVisibility =
1113 for (llvm::GlobalValue &GV : M.global_values()) {
1114 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
1117 if (GV.isDeclarationForLinker())
1119 llvm::GlobalValue::DLLImportStorageClass
1120 ? ExternDeclDLLImportVisibility
1121 : ExternDeclNoDLLStorageClassVisibility);
1124 llvm::GlobalValue::DLLExportStorageClass
1125 ? DLLExportVisibility
1126 : NoDLLStorageClassVisibility);
1128 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
1133 const llvm::Triple &Triple,
1137 return LangOpts.getStackProtector() == Mode;
1140std::optional<llvm::Attribute::AttrKind>
1142 if (D && D->
hasAttr<NoStackProtectorAttr>())
1144 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
1146 return llvm::Attribute::StackProtectStrong;
1148 return llvm::Attribute::StackProtect;
1150 return llvm::Attribute::StackProtectStrong;
1152 return llvm::Attribute::StackProtectReq;
1153 return std::nullopt;
1159 EmitModuleInitializers(Primary);
1161 DeferredDecls.insert_range(EmittedDeferredDecls);
1162 EmittedDeferredDecls.clear();
1163 EmitVTablesOpportunistically();
1164 applyGlobalValReplacements();
1165 applyReplacements();
1166 emitMultiVersionFunctions();
1167 emitPFPFieldsWithEvaluatedOffset();
1170 if (Context.getLangOpts().IncrementalExtensions &&
1171 GlobalTopLevelStmtBlockInFlight.first) {
1173 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1174 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1180 EmitCXXModuleInitFunc(Primary);
1182 EmitCXXGlobalInitFunc();
1183 EmitCXXGlobalCleanUpFunc();
1184 registerGlobalDtorsWithAtExit();
1185 EmitCXXThreadLocalInitFunc();
1187 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1189 if (Context.getLangOpts().CUDA && CUDARuntime) {
1190 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1193 if (LangOpts.SYCLIsHost && !CodeGenOpts.OffloadBinaryToEmbedFile.empty()) {
1194 if (llvm::Function *SYCLCtorFunction = embedSYCLDeviceBinary())
1199 if (OpenMPRuntime) {
1200 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1201 OpenMPRuntime->clear();
1205 PGOReader->getSummary(
false).getMD(VMContext),
1206 llvm::ProfileSummary::PSK_Instr);
1207 if (PGOStats.hasDiagnostics())
1213 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1214 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1216 EmitStaticExternCAliases();
1221 if (CoverageMapping)
1222 CoverageMapping->emit();
1223 if (CodeGenOpts.SanitizeCfiCrossDso) {
1227 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1229 emitAtAvailableLinkGuard();
1230 if (Context.getTargetInfo().getTriple().isWasm())
1237 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1238 llvm::CodeObjectVersionKind::COV_None) {
1239 getModule().addModuleFlag(llvm::Module::Error,
1240 "amdhsa_code_object_version",
1241 getTarget().getTargetOpts().CodeObjectVersion);
1246 auto *MDStr = llvm::MDString::get(
1251 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1261 llvm::Module::Error,
"amdgpu.xnack",
1262 llvm::ConstantInt::get(
1270 llvm::Module::Error,
"amdgpu.sramecc",
1271 llvm::ConstantInt::get(
1281 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1283 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1285 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1289 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1293 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1295 auto *GV =
new llvm::GlobalVariable(
1296 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1297 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1303 auto *GV =
new llvm::GlobalVariable(
1305 llvm::Constant::getNullValue(
Int8Ty),
1314 if (CodeGenOpts.Autolink &&
1315 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1316 EmitModuleLinkOptions();
1331 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1332 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1333 for (
auto *MD : ELFDependentLibraries)
1334 NMD->addOperand(MD);
1337 if (CodeGenOpts.DwarfVersion) {
1338 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1339 CodeGenOpts.DwarfVersion);
1342 if (CodeGenOpts.Dwarf64)
1343 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1345 if (Context.getLangOpts().SemanticInterposition)
1347 getModule().setSemanticInterposition(
true);
1349 if (CodeGenOpts.EmitCodeView) {
1351 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1353 if (CodeGenOpts.CodeViewGHash) {
1354 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1356 if (CodeGenOpts.ControlFlowGuard) {
1359 llvm::Module::Warning,
"cfguard",
1360 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1361 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1364 llvm::Module::Warning,
"cfguard",
1365 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1367 if (CodeGenOpts.getWinControlFlowGuardMechanism() !=
1368 llvm::ControlFlowGuardMechanism::Automatic) {
1371 llvm::Module::Warning,
"cfguard-mechanism",
1372 static_cast<unsigned>(CodeGenOpts.getWinControlFlowGuardMechanism()));
1374 if (CodeGenOpts.EHContGuard) {
1376 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1378 if (Context.getLangOpts().Kernel) {
1380 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1382 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1387 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1389 llvm::Metadata *Ops[2] = {
1390 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1391 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1392 llvm::Type::getInt32Ty(VMContext), 1))};
1394 getModule().addModuleFlag(llvm::Module::Require,
1395 "StrictVTablePointersRequirement",
1396 llvm::MDNode::get(VMContext, Ops));
1402 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1403 llvm::DEBUG_METADATA_VERSION);
1408 uint64_t WCharWidth =
1409 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1410 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1411 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size",
1412 static_cast<uint32_t
>(WCharWidth));
1416 llvm::FloatABI::ABIType FloatABI =
1417 llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.FloatABI)
1418 .Cases({
"soft",
"softfp"}, llvm::FloatABI::Soft)
1419 .Case(
"hard", llvm::FloatABI::Hard)
1420 .Default(llvm::FloatABI::Default);
1421 if (FloatABI != llvm::FloatABI::Default &&
1422 FloatABI !=
getTriple().getDefaultFloatABI()) {
1424 llvm::Module::Error,
"float-abi",
1426 llvm::FloatABI::getABITypeName(FloatABI)));
1429 if (
getTypes().isLongDoubleReferenced()) {
1432 std::optional<llvm::LongDoubleFormat> Format;
1433 if (flt == &llvm::APFloat::IEEEquad())
1434 Format = llvm::LongDoubleFormat::IEEEquad;
1435 else if (flt == &llvm::APFloat::IEEEdouble())
1436 Format = llvm::LongDoubleFormat::IEEEdouble;
1437 else if (flt == &llvm::APFloat::PPCDoubleDouble())
1438 Format = llvm::LongDoubleFormat::PPCDoubleDouble;
1439 else if (flt == &llvm::APFloat::x87DoubleExtended())
1440 Format = llvm::LongDoubleFormat::X87DoubleExtended;
1441 else if (flt == &llvm::APFloat::IEEEsingle())
1442 Format = llvm::LongDoubleFormat::IEEEsingle;
1445 getModule().setLongDoubleFormat(*Format);
1449 getModule().addModuleFlag(llvm::Module::Warning,
1450 "zos_product_major_version",
1452 getModule().addModuleFlag(llvm::Module::Warning,
1453 "zos_product_minor_version",
1455 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1456 uint32_t(CLANG_VERSION_PATCHLEVEL));
1458 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1459 llvm::MDString::get(VMContext, ProductId));
1464 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1465 llvm::MDString::get(VMContext, lang_str));
1467 time_t TT = PreprocessorOpts.SourceDateEpoch
1468 ? *PreprocessorOpts.SourceDateEpoch
1469 : std::time(
nullptr);
1470 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1471 static_cast<uint64_t
>(TT));
1474 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1475 llvm::MDString::get(VMContext,
"ascii"));
1478 llvm::Triple
T = Context.getTargetInfo().getTriple();
1484 if (StringRef ABIStr = Target.getABI();
1485 !ABIStr.empty() && (
T.isARM() ||
T.isThumb() ||
T.isRISCV())) {
1486 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1487 llvm::MDString::get(VMContext, ABIStr));
1490 if (
T.isARM() ||
T.isThumb()) {
1492 uint32_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1493 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1497 llvm::LLVMContext &Ctx = TheModule.getContext();
1502 const std::vector<std::string> &Features =
1505 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1506 if (!errorToBool(ParseResult.takeError()))
1508 llvm::Module::AppendUnique,
"riscv-isa",
1510 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1513 if (CodeGenOpts.SanitizeCfiCrossDso) {
1515 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1518 if (CodeGenOpts.WholeProgramVTables) {
1522 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1523 CodeGenOpts.VirtualFunctionElimination);
1526 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1527 getModule().addModuleFlag(llvm::Module::Override,
1528 "CFI Canonical Jump Tables",
1529 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1532 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1533 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1537 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1539 llvm::Module::Append,
"Unique Source File Identifier",
1541 TheModule.getContext(),
1542 llvm::MDString::get(TheModule.getContext(),
1543 CodeGenOpts.UniqueSourceFileIdentifier)));
1546 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1547 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1550 if (CodeGenOpts.PatchableFunctionEntryOffset)
1551 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1552 CodeGenOpts.PatchableFunctionEntryOffset);
1553 if (CodeGenOpts.SanitizeKcfiArity)
1554 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1557 llvm::Module::Override,
"kcfi-hash",
1558 llvm::MDString::get(
1560 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1563 if (CodeGenOpts.CFProtectionReturn &&
1564 Target.checkCFProtectionReturnSupported(
getDiags())) {
1566 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1570 if (CodeGenOpts.CFProtectionBranch &&
1571 Target.checkCFProtectionBranchSupported(
getDiags())) {
1573 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1576 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1577 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1579 Scheme = Target.getDefaultCFBranchLabelScheme();
1581 llvm::Module::Error,
"cf-branch-label-scheme",
1587 if (CodeGenOpts.FunctionReturnThunks)
1588 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1590 if (CodeGenOpts.IndirectBranchCSPrefix)
1591 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1593 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1601 if (LangOpts.BranchTargetEnforcement)
1602 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1604 if (LangOpts.BranchProtectionPAuthLR)
1605 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1607 if (LangOpts.GuardedControlStack)
1608 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1609 if (LangOpts.hasSignReturnAddress())
1610 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1611 if (LangOpts.isSignReturnAddressScopeAll())
1612 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1614 if (!LangOpts.isSignReturnAddressWithAKey())
1615 getModule().addModuleFlag(llvm::Module::Min,
1616 "sign-return-address-with-bkey", 2);
1618 if (
T.isAArch64()) {
1630 if (LangOpts.PointerAuthReturns)
1631 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-returns", 1);
1632 if (LangOpts.PointerAuthAuthTraps)
1633 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-auth-traps", 1);
1634 if (LangOpts.PointerAuthIndirectGotos)
1635 getModule().addModuleFlag(llvm::Module::Max,
"ptrauth-indirect-gotos", 1);
1636 if (LangOpts.AArch64JumpTableHardening)
1637 getModule().addModuleFlag(llvm::Module::Max,
1638 "aarch64-jump-table-hardening", 1);
1646 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-elf-got",
1647 LangOpts.PointerAuthELFGOT);
1649 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-init-fini",
1650 LangOpts.PointerAuthCalls &&
1651 LangOpts.PointerAuthInitFini);
1653 llvm::Module::Error,
"ptrauth-init-fini-address-discrimination",
1654 LangOpts.PointerAuthCalls && LangOpts.PointerAuthInitFini &&
1655 LangOpts.PointerAuthInitFiniAddressDiscrimination);
1659 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-sign-personality",
1660 LangOpts.PointerAuthCalls);
1663 using namespace llvm::ELF;
1664 assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST < 32);
1665 uint32_t PAuthABIVersion =
1666 (LangOpts.PointerAuthIntrinsics
1667 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1668 (LangOpts.PointerAuthCalls
1669 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1670 (LangOpts.PointerAuthReturns
1671 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1672 (LangOpts.PointerAuthAuthTraps
1673 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1674 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1675 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1676 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1677 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1678 (LangOpts.PointerAuthInitFini
1679 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1680 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1681 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1682 (LangOpts.PointerAuthELFGOT
1683 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1684 (LangOpts.PointerAuthIndirectGotos
1685 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1686 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1687 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1688 (LangOpts.PointerAuthFunctionTypeDiscrimination
1689 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1690 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1691 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1692 "Update when new enum items are defined");
1697 getModule().addModuleFlag(llvm::Module::Error,
1698 "aarch64-elf-pauthabi-platform",
1699 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1701 llvm::Module::Error,
"aarch64-elf-pauthabi-version", PAuthABIVersion);
1704 if ((
T.isARM() ||
T.isThumb()) &&
getTriple().isTargetAEABI() &&
1706 uint32_t TagVal = 0;
1707 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1709 llvm::DenormalMode::getPositiveZero()) {
1710 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1712 llvm::DenormalMode::getIEEE()) {
1713 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1714 DenormalTagBehavior = llvm::Module::Override;
1716 llvm::DenormalMode::getPreserveSign()) {
1717 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1719 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1724 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1725 llvm::ARMBuildAttrs::Allowed);
1728 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1730 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1731 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1735 if (CodeGenOpts.StackClashProtector)
1737 llvm::Module::Override,
"probe-stack",
1738 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1740 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1741 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1742 CodeGenOpts.StackProbeSize);
1744 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1745 llvm::LLVMContext &Ctx = TheModule.getContext();
1747 llvm::Module::Error,
"MemProfProfileFilename",
1748 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1751 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1755 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1756 CodeGenOpts.FP32DenormalMode.Output !=
1757 llvm::DenormalMode::IEEE);
1760 if (LangOpts.EHAsynch)
1761 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1764 if (CodeGenOpts.ImportCallOptimization)
1765 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1775 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
1776 if (UnwindMode == llvm::WinX64EHUnwindMode::Default) {
1777 if (
T.isOSWindows() &&
T.isX86_64() &&
1778 Context.getTargetInfo().hasFeature(
"egpr"))
1779 UnwindMode = llvm::WinX64EHUnwindMode::V3;
1781 UnwindMode = llvm::WinX64EHUnwindMode::V1;
1783 if (UnwindMode != llvm::WinX64EHUnwindMode::V1)
1784 getModule().addModuleFlag(llvm::Module::Warning,
"winx64-eh-unwind",
1785 static_cast<unsigned>(UnwindMode));
1789 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1791 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1795 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1796 EmitOpenCLMetadata();
1803 auto Version = LangOpts.getOpenCLCompatibleVersion();
1804 llvm::Metadata *SPIRVerElts[] = {
1805 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1807 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1808 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1809 llvm::NamedMDNode *SPIRVerMD =
1810 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1811 llvm::LLVMContext &Ctx = TheModule.getContext();
1812 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1820 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1821 assert(PLevel < 3 &&
"Invalid PIC Level");
1822 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1823 if (Context.getLangOpts().PIE)
1824 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1828 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1829 .Case(
"tiny", llvm::CodeModel::Tiny)
1830 .Case(
"small", llvm::CodeModel::Small)
1831 .Case(
"kernel", llvm::CodeModel::Kernel)
1832 .Case(
"medium", llvm::CodeModel::Medium)
1833 .Case(
"large", llvm::CodeModel::Large)
1836 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1839 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1840 Context.getTargetInfo().getTriple().getArch() ==
1841 llvm::Triple::x86_64) {
1847 if (CodeGenOpts.NoPLT)
1850 CodeGenOpts.DirectAccessExternalData !=
1851 getModule().getDirectAccessExternalData()) {
1852 getModule().setDirectAccessExternalData(
1853 CodeGenOpts.DirectAccessExternalData);
1855 if (CodeGenOpts.UnwindTables)
1856 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1858 switch (CodeGenOpts.getFramePointer()) {
1863 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1866 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1869 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1872 getModule().setFramePointer(llvm::FramePointerKind::All);
1876 SimplifyPersonality();
1889 EmitVersionIdentMetadata();
1892 EmitCommandLineMetadata();
1900 getModule().setStackProtectorGuardSymbol(
1903 getModule().setStackProtectorGuardOffset(
1906 getModule().setStackProtectorGuardValueWidth(
1909 if (
getModule().getStackProtectorGuard() !=
"global") {
1910 Diags.Report(diag::err_opt_not_valid_without_opt)
1911 <<
"-mstack-protector-guard-record"
1912 <<
"-mstack-protector-guard=global";
1914 getModule().setStackProtectorGuardRecord(
true);
1919 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1921 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1923 if (
getContext().getTargetInfo().getMaxTLSAlign())
1924 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1925 getContext().getTargetInfo().getMaxTLSAlign());
1943 if (!MustTailCallUndefinedGlobals.empty()) {
1945 for (
auto &I : MustTailCallUndefinedGlobals) {
1946 if (!I.first->isDefined())
1947 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1951 if (!Entry || Entry->isWeakForLinker() ||
1952 Entry->isDeclarationForLinker())
1953 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1957 for (
auto &I : MustTailCallUndefinedGlobals) {
1966 if (Entry->isDeclarationForLinker()) {
1969 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
1971 CalleeIsLocal = Entry->isDSOLocal();
1975 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
1988 llvm::MDBuilder MDB(TheModule.getContext());
1989 uint64_t Size = Context.getTypeSizeInChars(Context.IntTy).getQuantity();
1990 llvm::MDNode *StructNode =
1991 CodeGenOpts.NewStructPathTBAA
1992 ? MDB.createTBAATypeNode(TBAA->getChar(), Size,
1993 MDB.createString(
"__libc_errno"),
1994 {{0, Size, IntegerNode}})
1995 : MDB.createTBAAStructTypeNode(
"__libc_errno",
1996 {{IntegerNode, 0}});
1999 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
2000 ErrnoTBAAMD->addOperand(StructTagNode);
2005void CodeGenModule::EmitOpenCLMetadata() {
2011 auto EmitVersion = [
this](StringRef MDName,
int Version) {
2012 llvm::Metadata *OCLVerElts[] = {
2013 llvm::ConstantAsMetadata::get(
2014 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
2015 llvm::ConstantAsMetadata::get(
2016 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
2017 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
2018 llvm::LLVMContext &Ctx = TheModule.getContext();
2019 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
2022 EmitVersion(
"opencl.ocl.version", CLVersion);
2023 if (LangOpts.OpenCLCPlusPlus) {
2025 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
2029void CodeGenModule::EmitBackendOptionsMetadata(
2030 const CodeGenOptions &CodeGenOpts) {
2032 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
2033 CodeGenOpts.SmallDataLimit);
2037 if (LangOpts.AllocTokenMode) {
2038 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
2039 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
2040 llvm::MDString::get(VMContext, S));
2042 if (LangOpts.AllocTokenMax)
2044 llvm::Module::Error,
"alloc-token-max",
2045 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
2046 *LangOpts.AllocTokenMax));
2047 if (CodeGenOpts.SanitizeAllocTokenFastABI)
2048 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
2049 if (CodeGenOpts.SanitizeAllocTokenExtended)
2050 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
2066 return TBAA->getTypeInfo(QTy);
2085 return TBAA->getAccessInfo(AccessType);
2092 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
2098 return TBAA->getTBAAStructInfo(QTy);
2104 return TBAA->getBaseTypeInfo(QTy);
2110 return TBAA->getAccessTagInfo(Info);
2117 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
2125 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
2133 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
2139 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
2144 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
2156 std::string Msg =
Type;
2158 diag::err_codegen_unsupported)
2164 diag::err_codegen_unsupported)
2171 std::string Msg =
Type;
2173 diag::err_codegen_unsupported)
2178 llvm::function_ref<
void()> Fn) {
2179 StackHandler.runWithSufficientStackSpace(Loc, Fn);
2189 if (GV->hasLocalLinkage()) {
2190 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2203 if (Context.getLangOpts().OpenMP &&
2204 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
2205 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
2206 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
2207 OMPDeclareTargetDeclAttr::DT_NoHost &&
2209 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2216 if (Context.getLangOpts().CUDAIsDevice &&
2218 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
2219 bool NeedsProtected =
false;
2223 else if (
const auto *VD = dyn_cast<VarDecl>(D))
2224 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
2225 VD->hasAttr<CUDAConstantAttr>() ||
2226 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
2227 VD->getType()->isCUDADeviceBuiltinTextureType();
2228 if (NeedsProtected) {
2229 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2235 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2239 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
2243 if (GV->hasDLLExportStorageClass()) {
2246 diag::err_hidden_visibility_dllexport);
2249 diag::err_non_default_visibility_dllimport);
2255 !GV->isDeclarationForLinker())
2260 llvm::GlobalValue *GV) {
2261 if (GV->hasLocalLinkage())
2264 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
2268 if (GV->hasDLLImportStorageClass())
2271 const llvm::Triple &TT = CGM.
getTriple();
2273 if (TT.isOSCygMing()) {
2291 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
2299 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
2303 if (!TT.isOSBinFormatELF())
2309 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2317 return !(CGM.
getLangOpts().SemanticInterposition ||
2322 if (!GV->isDeclarationForLinker())
2328 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2335 if (CGOpts.DirectAccessExternalData) {
2341 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2342 if (!Var->isThreadLocal())
2367 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2369 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2379 if (D->
hasAttr<DLLImportAttr>())
2380 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2381 else if ((D->
hasAttr<DLLExportAttr>() ||
2383 !GV->isDeclarationForLinker())
2384 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2404 GV->setPartition(CodeGenOpts.SymbolPartition);
2408 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2409 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2410 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2411 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2412 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2415llvm::GlobalVariable::ThreadLocalMode
2417 switch (CodeGenOpts.getDefaultTLSModel()) {
2419 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2421 return llvm::GlobalVariable::LocalDynamicTLSModel;
2423 return llvm::GlobalVariable::InitialExecTLSModel;
2425 return llvm::GlobalVariable::LocalExecTLSModel;
2427 llvm_unreachable(
"Invalid TLS model!");
2431 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2433 llvm::GlobalValue::ThreadLocalMode TLM;
2437 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2441 GV->setThreadLocalMode(TLM);
2447 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2451 const CPUSpecificAttr *
Attr,
2468 !D->
hasAttr<AsmLabelAttr>() &&
2474 bool OmitMultiVersionMangling =
false) {
2476 llvm::raw_svector_ostream Out(Buffer);
2485 assert(II &&
"Attempt to mangle unnamed decl.");
2486 const auto *FD = dyn_cast<FunctionDecl>(ND);
2491 Out <<
"__regcall4__" << II->
getName();
2493 Out <<
"__regcall3__" << II->
getName();
2494 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2496 Out <<
"__device_stub__" << II->
getName();
2498 DeviceKernelAttr::isOpenCLSpelling(
2499 FD->getAttr<DeviceKernelAttr>()) &&
2501 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2517 "Hash computed when not explicitly requested");
2521 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2522 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2523 switch (FD->getMultiVersionKind()) {
2527 FD->getAttr<CPUSpecificAttr>(),
2531 auto *
Attr = FD->getAttr<TargetAttr>();
2532 assert(
Attr &&
"Expected TargetAttr to be present "
2533 "for attribute mangling");
2539 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2540 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2541 "for attribute mangling");
2547 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2548 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2549 "for attribute mangling");
2556 llvm_unreachable(
"None multiversion type isn't valid here");
2566 return std::string(Out.str());
2569void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2570 const FunctionDecl *FD,
2571 StringRef &CurName) {
2578 std::string NonTargetName =
2586 "Other GD should now be a multiversioned function");
2596 if (OtherName != NonTargetName) {
2599 const auto ExistingRecord = Manglings.find(NonTargetName);
2600 if (ExistingRecord != std::end(Manglings))
2601 Manglings.remove(&(*ExistingRecord));
2602 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2607 CurName = OtherNameRef;
2609 Entry->setName(OtherName);
2619 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2633 auto FoundName = MangledDeclNames.find(CanonicalGD);
2634 if (FoundName != MangledDeclNames.end())
2635 return FoundName->second;
2672 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2673 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2682 llvm::raw_svector_ostream Out(Buffer);
2685 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2686 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2688 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2693 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2694 return Result.first->first();
2698 auto it = MangledDeclNames.begin();
2699 while (it != MangledDeclNames.end()) {
2700 if (it->second == Name)
2715 llvm::Constant *AssociatedData) {
2717 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2723 bool IsDtorAttrFunc) {
2724 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2726 DtorsUsingAtExit[Priority].push_back(Dtor);
2731 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2734void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2735 if (Fns.empty())
return;
2738 llvm::PointerType *PtrTy = llvm::PointerType::get(
2739 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2742 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2746 auto Ctors = Builder.beginArray(CtorStructTy);
2747 for (
const auto &I : Fns) {
2748 auto Ctor = Ctors.beginStruct(CtorStructTy);
2749 Ctor.addInt(
Int32Ty, I.Priority);
2750 Ctor.add(I.Initializer);
2751 if (I.AssociatedData)
2752 Ctor.add(I.AssociatedData);
2754 Ctor.addNullPointer(PtrTy);
2755 Ctor.finishAndAddTo(Ctors);
2758 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2760 llvm::GlobalValue::AppendingLinkage);
2764 List->setAlignment(std::nullopt);
2769llvm::GlobalValue::LinkageTypes
2775 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2782 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2783 if (!MDS)
return nullptr;
2785 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2793 if (!UD->
hasAttr<TransparentUnionAttr>())
2795 if (!UD->
fields().empty())
2796 return UD->
fields().begin()->getType();
2805 bool GeneralizePointers) {
2818 bool GeneralizePointers) {
2821 for (
auto &Param : FnType->param_types())
2822 GeneralizedParams.push_back(
2826 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2827 GeneralizedParams, FnType->getExtProtoInfo());
2832 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2834 llvm_unreachable(
"Encountered unknown FunctionType");
2842 FnType->getReturnType(), FnType->getParamTypes(),
2843 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2845 std::string OutName;
2846 llvm::raw_string_ostream Out(OutName);
2854 Out <<
".normalized";
2856 Out <<
".generalized";
2858 return llvm::ConstantInt::get(
2864 llvm::Function *F,
bool IsThunk) {
2866 llvm::AttributeList PAL;
2869 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2873 Loc = D->getLocation();
2875 Error(Loc,
"__vectorcall calling convention is not currently supported");
2877 F->setAttributes(PAL);
2878 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2882 std::string ReadOnlyQual(
"__read_only");
2883 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2884 if (ReadOnlyPos != std::string::npos)
2886 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2888 std::string WriteOnlyQual(
"__write_only");
2889 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2890 if (WriteOnlyPos != std::string::npos)
2891 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2893 std::string ReadWriteQual(
"__read_write");
2894 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2895 if (ReadWritePos != std::string::npos)
2896 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2929 assert(((FD && CGF) || (!FD && !CGF)) &&
2930 "Incorrect use - FD and CGF should either be both null or not!");
2956 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2959 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2964 std::string typeQuals;
2968 const Decl *PDecl = parm;
2970 PDecl = TD->getDecl();
2971 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2972 if (A && A->isWriteOnly())
2973 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2974 else if (A && A->isReadWrite())
2975 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2977 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2979 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2981 auto getTypeSpelling = [&](
QualType Ty) {
2982 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2984 if (Ty.isCanonical()) {
2985 StringRef typeNameRef = typeName;
2987 if (typeNameRef.consume_front(
"unsigned "))
2988 return std::string(
"u") + typeNameRef.str();
2989 if (typeNameRef.consume_front(
"signed "))
2990 return typeNameRef.str();
3000 addressQuals.push_back(
3001 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
3005 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
3006 std::string baseTypeName =
3008 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
3009 argBaseTypeNames.push_back(
3010 llvm::MDString::get(VMContext, baseTypeName));
3014 typeQuals =
"restrict";
3017 typeQuals += typeQuals.empty() ?
"const" :
" const";
3019 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
3021 uint32_t AddrSpc = 0;
3026 addressQuals.push_back(
3027 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
3031 std::string typeName = getTypeSpelling(ty);
3043 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
3044 argBaseTypeNames.push_back(
3045 llvm::MDString::get(VMContext, baseTypeName));
3050 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
3054 Fn->setMetadata(
"kernel_arg_addr_space",
3055 llvm::MDNode::get(VMContext, addressQuals));
3056 Fn->setMetadata(
"kernel_arg_access_qual",
3057 llvm::MDNode::get(VMContext, accessQuals));
3058 Fn->setMetadata(
"kernel_arg_type",
3059 llvm::MDNode::get(VMContext, argTypeNames));
3060 Fn->setMetadata(
"kernel_arg_base_type",
3061 llvm::MDNode::get(VMContext, argBaseTypeNames));
3062 Fn->setMetadata(
"kernel_arg_type_qual",
3063 llvm::MDNode::get(VMContext, argTypeQuals));
3067 Fn->setMetadata(
"kernel_arg_name",
3068 llvm::MDNode::get(VMContext, argNames));
3078 if (!LangOpts.Exceptions)
return false;
3081 if (LangOpts.CXXExceptions)
return true;
3084 if (LangOpts.ObjCExceptions) {
3104SmallVector<const CXXRecordDecl *, 0>
3106 llvm::SetVector<const CXXRecordDecl *> MostBases;
3111 MostBases.insert(RD);
3113 CollectMostBases(B.getType()->getAsCXXRecordDecl());
3115 CollectMostBases(RD);
3116 return MostBases.takeVector();
3120 llvm::Function *F) {
3121 llvm::AttrBuilder B(F->getContext());
3123 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
3124 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
3126 if (CodeGenOpts.StackClashProtector)
3127 B.addAttribute(
"probe-stack",
"inline-asm");
3129 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
3130 B.addAttribute(
"stack-probe-size",
3131 std::to_string(CodeGenOpts.StackProbeSize));
3134 B.addAttribute(llvm::Attribute::NoUnwind);
3136 if (std::optional<llvm::Attribute::AttrKind>
Attr =
3138 B.addAttribute(*
Attr);
3143 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
3144 B.addAttribute(llvm::Attribute::AlwaysInline);
3148 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
3150 B.addAttribute(llvm::Attribute::NoInline);
3158 if (D->
hasAttr<ArmLocallyStreamingAttr>())
3159 B.addAttribute(
"aarch64_pstate_sm_body");
3162 if (
Attr->isNewZA())
3163 B.addAttribute(
"aarch64_new_za");
3164 if (
Attr->isNewZT0())
3165 B.addAttribute(
"aarch64_new_zt0");
3170 bool ShouldAddOptNone =
3171 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
3173 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
3174 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
3177 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
3178 !D->
hasAttr<NoInlineAttr>()) {
3179 B.addAttribute(llvm::Attribute::AlwaysInline);
3180 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
3181 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3183 B.addAttribute(llvm::Attribute::OptimizeNone);
3186 B.addAttribute(llvm::Attribute::NoInline);
3191 B.addAttribute(llvm::Attribute::Naked);
3194 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
3195 F->removeFnAttr(llvm::Attribute::MinSize);
3196 }
else if (D->
hasAttr<NakedAttr>()) {
3198 B.addAttribute(llvm::Attribute::Naked);
3199 B.addAttribute(llvm::Attribute::NoInline);
3200 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
3201 B.addAttribute(llvm::Attribute::NoDuplicate);
3202 }
else if (D->
hasAttr<NoInlineAttr>() &&
3203 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3205 B.addAttribute(llvm::Attribute::NoInline);
3206 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
3207 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
3209 B.addAttribute(llvm::Attribute::AlwaysInline);
3213 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
3214 B.addAttribute(llvm::Attribute::NoInline);
3218 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3221 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
3222 return Redecl->isInlineSpecified();
3224 if (any_of(FD->
redecls(), CheckRedeclForInline))
3229 return any_of(Pattern->
redecls(), CheckRedeclForInline);
3231 if (CheckForInline(FD)) {
3232 B.addAttribute(llvm::Attribute::InlineHint);
3233 }
else if (CodeGenOpts.getInlining() ==
3236 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3237 B.addAttribute(llvm::Attribute::NoInline);
3244 if (!D->
hasAttr<OptimizeNoneAttr>()) {
3246 if (!ShouldAddOptNone)
3247 B.addAttribute(llvm::Attribute::OptimizeForSize);
3248 B.addAttribute(llvm::Attribute::Cold);
3251 B.addAttribute(llvm::Attribute::Hot);
3252 if (D->
hasAttr<MinSizeAttr>())
3253 B.addAttribute(llvm::Attribute::MinSize);
3258 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
3259 B.addAttribute(llvm::Attribute::NoOutline);
3263 llvm::MaybeAlign ExplicitAlignment;
3264 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
3265 ExplicitAlignment = llvm::Align(alignment);
3266 else if (LangOpts.FunctionAlignment)
3267 ExplicitAlignment = llvm::Align(1ull << LangOpts.FunctionAlignment);
3269 if (ExplicitAlignment) {
3270 F->setAlignment(ExplicitAlignment);
3271 F->setPreferredAlignment(ExplicitAlignment);
3272 }
else if (LangOpts.PreferredFunctionAlignment) {
3273 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
3282 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
3287 if (CodeGenOpts.SanitizeCfiCrossDso &&
3288 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
3289 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3297 if (CodeGenOpts.CallGraphSection) {
3298 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3305 auto *MD = dyn_cast<CXXMethodDecl>(D);
3308 llvm::Metadata *Id =
3310 MD->getType(), std::nullopt,
Base));
3311 F->addTypeMetadata(0, Id);
3318 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
3319 if (FD->
hasAttr<SYCLExternalAttr>())
3320 addSYCLModuleIdAttr(F);
3324void CodeGenModule::addSYCLModuleIdAttr(llvm::Function *Fn) {
3326 Fn->addFnAttr(
"sycl-module-id",
getModule().getModuleIdentifier());
3331 if (isa_and_nonnull<NamedDecl>(D))
3334 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3336 if (D && D->
hasAttr<UsedAttr>())
3339 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3341 ((CodeGenOpts.KeepPersistentStorageVariables &&
3342 (VD->getStorageDuration() ==
SD_Static ||
3343 VD->getStorageDuration() ==
SD_Thread)) ||
3344 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3345 VD->getType().isConstQualified())))
3350static std::vector<std::string>
3352 llvm::StringMap<bool> &FeatureMap) {
3353 llvm::StringMap<bool> DefaultFeatureMap;
3357 std::vector<std::string> Delta;
3358 for (
const auto &[K,
V] : FeatureMap) {
3359 auto DefaultIt = DefaultFeatureMap.find(K);
3360 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3361 Delta.push_back((
V ?
"+" :
"-") + K.str());
3367bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3368 llvm::AttrBuilder &Attrs,
3369 bool SetTargetFeatures) {
3375 std::vector<std::string> Features;
3376 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3379 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3380 assert((!TD || !TV) &&
"both target_version and target specified");
3383 bool AddedAttr =
false;
3384 if (TD || TV || SD || TC) {
3385 llvm::StringMap<bool> FeatureMap;
3392 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3395 if (!FeatureStr.empty()) {
3396 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3397 if (!ParsedAttr.
CPU.empty() &&
3399 TargetCPU = ParsedAttr.
CPU;
3402 if (!ParsedAttr.
Tune.empty() &&
3404 TuneCPU = ParsedAttr.
Tune;
3420 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3421 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3422 Entry.getKey().str());
3428 llvm::StringMap<bool> FeatureMap;
3447 if (!TargetCPU.empty()) {
3448 Attrs.addAttribute(
"target-cpu", TargetCPU);
3451 if (!TuneCPU.empty()) {
3452 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3455 if (!Features.empty() && SetTargetFeatures) {
3456 llvm::erase_if(Features, [&](
const std::string& F) {
3459 if (!Features.empty()) {
3460 llvm::sort(Features);
3461 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3467 llvm::SmallVector<StringRef, 8> Feats;
3468 bool IsDefault =
false;
3470 IsDefault = TV->isDefaultVersion();
3471 TV->getFeatures(Feats);
3477 Attrs.addAttribute(
"fmv-features");
3479 }
else if (!Feats.empty()) {
3481 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3482 std::string FMVFeatures;
3483 for (StringRef F : OrderedFeats)
3484 FMVFeatures.append(
"," + F.str());
3485 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3492void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3493 llvm::GlobalObject *GO) {
3498 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3501 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3502 GV->addAttribute(
"bss-section", SA->getName());
3503 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3504 GV->addAttribute(
"data-section", SA->getName());
3505 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3506 GV->addAttribute(
"rodata-section", SA->getName());
3507 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3508 GV->addAttribute(
"relro-section", SA->getName());
3511 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3514 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3515 if (!D->
getAttr<SectionAttr>())
3516 F->setSection(SA->getName());
3518 llvm::AttrBuilder Attrs(F->getContext());
3519 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3523 llvm::AttributeMask RemoveAttrs;
3524 RemoveAttrs.addAttribute(
"target-cpu");
3525 RemoveAttrs.addAttribute(
"target-features");
3526 RemoveAttrs.addAttribute(
"fmv-features");
3527 RemoveAttrs.addAttribute(
"tune-cpu");
3528 F->removeFnAttrs(RemoveAttrs);
3529 F->addFnAttrs(Attrs);
3533 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3534 GO->setSection(CSA->getName());
3535 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3536 GO->setSection(SA->getName());
3549 F->setLinkage(llvm::Function::InternalLinkage);
3551 setNonAliasAttributes(GD, F);
3562 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3566 llvm::Function *F) {
3569 if (!F->hasLocalLinkage() ||
3570 F->getFunction().hasAddressTaken(
nullptr,
true,
3574 llvm::LLVMContext::MD_callgraph,
3575 *llvm::MDTuple::get(
3582 llvm::Function *F) {
3584 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3595 F->addTypeMetadata(0, MD);
3602 if (CodeGenOpts.SanitizeCfiCrossDso)
3604 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3608 llvm::CallBase *CB) {
3610 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall())
3614 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
getLLVMContext(), {TypeIdMD});
3615 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3616 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3620 llvm::LLVMContext &Ctx = F->getContext();
3621 llvm::MDBuilder MDB(Ctx);
3622 llvm::StringRef Salt;
3625 if (
const auto &Info = FP->getExtraAttributeInfo())
3626 Salt = Info.CFISalt;
3628 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3637 return llvm::all_of(Name, [](
const char &
C) {
3638 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3644 for (
auto &F : M.functions()) {
3646 bool AddressTaken = F.hasAddressTaken();
3647 if (!AddressTaken && F.hasLocalLinkage())
3648 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3653 if (!AddressTaken || !F.isDeclaration())
3656 const llvm::ConstantInt *
Type;
3657 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3658 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3662 StringRef Name = F.getName();
3666 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3667 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3668 Twine(
Type->getSExtValue()) +
" */\n")
3670 M.appendModuleInlineAsm(
Asm);
3674void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3675 bool IsIncompleteFunction,
3678 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3686 if (!IsIncompleteFunction)
3693 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3695 assert(!F->arg_empty() &&
3696 F->arg_begin()->getType()
3697 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3698 "unexpected this return");
3699 F->addParamAttr(0, llvm::Attribute::Returned);
3709 if (!IsIncompleteFunction && F->isDeclaration())
3712 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3713 F->setSection(CSA->getName());
3714 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3715 F->setSection(SA->getName());
3717 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3719 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3720 else if (EA->isWarning())
3721 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3726 const FunctionDecl *FDBody;
3727 bool HasBody = FD->
hasBody(FDBody);
3729 assert(HasBody &&
"Inline builtin declarations should always have an "
3731 if (shouldEmitFunction(FDBody))
3732 F->addFnAttr(llvm::Attribute::NoBuiltin);
3738 F->addFnAttr(llvm::Attribute::NoBuiltin);
3742 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3743 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3744 if (MD->isVirtual())
3745 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3751 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3752 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3755 if (CodeGenOpts.CallGraphSection)
3758 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3764 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3765 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3767 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3771 llvm::LLVMContext &Ctx = F->getContext();
3772 llvm::MDBuilder MDB(Ctx);
3776 int CalleeIdx = *CB->encoding_begin();
3777 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3778 F->addMetadata(llvm::LLVMContext::MD_callback,
3779 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3780 CalleeIdx, PayloadIndices,
3787 "Only globals with definition can force usage.");
3788 LLVMUsed.emplace_back(GV);
3792 assert(!GV->isDeclaration() &&
3793 "Only globals with definition can force usage.");
3794 LLVMCompilerUsed.emplace_back(GV);
3799 "Only globals with definition can force usage.");
3801 LLVMCompilerUsed.emplace_back(GV);
3803 LLVMUsed.emplace_back(GV);
3807 std::vector<llvm::WeakTrackingVH> &List) {
3817 UsedArray.reserve(List.size());
3818 for (
const llvm::WeakTrackingVH &VH : List) {
3819 if (llvm::Value *
V = VH)
3820 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3824 if (UsedArray.empty())
3826 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3828 auto *GV =
new llvm::GlobalVariable(
3829 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3830 llvm::ConstantArray::get(ATy, UsedArray), Name);
3832 GV->setSection(
"llvm.metadata");
3835void CodeGenModule::emitLLVMUsed() {
3836 emitUsed(*
this,
"llvm.used", LLVMUsed);
3837 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3842 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3851 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3857 ELFDependentLibraries.push_back(
3858 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3865 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3872void CodeGenModule::ProcessPragmaCommentCopyright(StringRef Comment,
3873 bool isFromASTFile) {
3875 "pragma comment copyright is supported only when targeting AIX");
3888 assert(!LoadTimeCommentGlobal &&
3889 "Only one copyright pragma allowed per translation unit.");
3894 uint64_t Hash = xxh3_64bits(Comment);
3895 std::string GlobalName =
3896 (
"__loadtime_comment_str_" + Twine::utohexstr(Hash)).str();
3899 llvm::Constant *StrInit =
3900 llvm::ConstantDataArray::getString(
C, Comment,
true);
3903 auto *GV =
new llvm::GlobalVariable(
getModule(), StrInit->getType(),
3905 llvm::GlobalValue::WeakODRLinkage,
3906 StrInit, GlobalName);
3908 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
3909 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3910 GV->setAlignment(llvm::Align(1));
3916 GV->setSection(
"__loadtime_comment");
3919 GV->setMetadata(
"loadtime_comment", llvm::MDNode::get(
C, {}));
3922 llvm::appendToCompilerUsed(
getModule(), {GV});
3924 LoadTimeCommentGlobal = GV;
3933 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3939 if (Visited.insert(Import).second)
3956 if (LL.IsFramework) {
3957 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3958 llvm::MDString::get(Context, LL.Library)};
3960 Metadata.push_back(llvm::MDNode::get(Context, Args));
3966 llvm::Metadata *Args[2] = {
3967 llvm::MDString::get(Context,
"lib"),
3968 llvm::MDString::get(Context, LL.Library),
3970 Metadata.push_back(llvm::MDNode::get(Context, Args));
3974 auto *OptString = llvm::MDString::get(Context, Opt);
3975 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3980void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3982 "We should only emit module initializers for named modules.");
3990 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
4007 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
4013void CodeGenModule::EmitModuleLinkOptions() {
4017 llvm::SetVector<clang::Module *> LinkModules;
4018 llvm::SmallPtrSet<clang::Module *, 16> Visited;
4019 SmallVector<clang::Module *, 16> Stack;
4022 for (
Module *M : ImportedModules) {
4025 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
4028 if (Visited.insert(M).second)
4034 while (!Stack.empty()) {
4037 bool AnyChildren =
false;
4046 if (Visited.insert(SM).second) {
4047 Stack.push_back(SM);
4055 LinkModules.insert(Mod);
4062 SmallVector<llvm::MDNode *, 16> MetadataArgs;
4064 for (
Module *M : LinkModules)
4065 if (Visited.insert(M).second)
4067 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
4068 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
4071 if (!LinkerOptionsMetadata.empty()) {
4072 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
4073 for (
auto *MD : LinkerOptionsMetadata)
4074 NMD->addOperand(MD);
4078void CodeGenModule::EmitDeferred() {
4087 if (!DeferredVTables.empty()) {
4088 EmitDeferredVTables();
4093 assert(DeferredVTables.empty());
4100 llvm::append_range(DeferredDeclsToEmit,
4104 if (DeferredDeclsToEmit.empty())
4109 std::vector<GlobalDecl> CurDeclsToEmit;
4110 CurDeclsToEmit.swap(DeferredDeclsToEmit);
4112 for (GlobalDecl &D : CurDeclsToEmit) {
4118 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
4122 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
4138 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
4156 if (!GV->isDeclaration())
4160 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
4164 EmitGlobalDefinition(D, GV);
4169 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
4171 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
4176void CodeGenModule::EmitVTablesOpportunistically() {
4182 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
4183 &&
"Only emit opportunistic vtables with optimizations");
4185 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
4187 "This queue should only contain external vtables");
4188 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
4189 VTables.GenerateClassData(RD);
4191 OpportunisticVTables.clear();
4195 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
4200 DeferredAnnotations.clear();
4202 if (Annotations.empty())
4206 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
4207 Annotations[0]->
getType(), Annotations.size()), Annotations);
4208 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
4209 llvm::GlobalValue::AppendingLinkage,
4210 Array,
"llvm.global.annotations");
4215 llvm::Constant *&AStr = AnnotationStrings[Str];
4220 llvm::Constant *s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
4221 auto *gv =
new llvm::GlobalVariable(
4222 getModule(), s->getType(),
true, llvm::GlobalValue::PrivateLinkage, s,
4223 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
4226 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4244 return llvm::ConstantInt::get(
Int32Ty, LineNo);
4252 llvm::FoldingSetNodeID ID;
4253 for (
Expr *E : Exprs) {
4256 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
4261 LLVMArgs.reserve(Exprs.size());
4263 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
4265 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
4268 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
4269 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
4270 llvm::GlobalValue::PrivateLinkage,
Struct,
4273 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4280 const AnnotateAttr *AA,
4288 llvm::Constant *GVInGlobalsAS = GV;
4289 if (GV->getAddressSpace() !=
4291 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
4293 llvm::PointerType::get(
4294 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
4298 llvm::Constant *Fields[] = {
4299 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
4301 return llvm::ConstantStruct::getAnon(Fields);
4305 llvm::GlobalValue *GV) {
4306 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
4316 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
4319 auto &SM = Context.getSourceManager();
4320 FileEntryRef MainFile = *SM.getFileEntryRefForID(SM.getMainFileID());
4321 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
4326 return NoSanitizeL.containsLocation(Kind, Loc);
4329 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
4333 llvm::GlobalVariable *GV,
4335 StringRef Category)
const {
4337 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
4339 auto &SM = Context.getSourceManager();
4340 if (NoSanitizeL.containsMainFile(
4341 Kind, SM.getFileEntryRefForID(SM.getMainFileID())->getName(),
4344 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
4351 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
4352 Ty = AT->getElementType();
4357 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4365 StringRef Category)
const {
4368 auto Attr = ImbueAttr::NONE;
4370 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4371 if (
Attr == ImbueAttr::NONE)
4372 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4374 case ImbueAttr::NONE:
4376 case ImbueAttr::ALWAYS:
4377 Fn->addFnAttr(
"function-instrument",
"xray-always");
4379 case ImbueAttr::ALWAYS_ARG1:
4380 Fn->addFnAttr(
"function-instrument",
"xray-always");
4381 Fn->addFnAttr(
"xray-log-args",
"1");
4383 case ImbueAttr::NEVER:
4384 Fn->addFnAttr(
"function-instrument",
"xray-never");
4397 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4407 auto &SM = Context.getSourceManager();
4408 if (
auto MainFile = SM.getFileEntryRefForID(SM.getMainFileID()))
4422 if (NumGroups > 1) {
4423 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4432 if (LangOpts.EmitAllDecls)
4435 const auto *VD = dyn_cast<VarDecl>(
Global);
4437 ((CodeGenOpts.KeepPersistentStorageVariables &&
4438 (VD->getStorageDuration() ==
SD_Static ||
4439 VD->getStorageDuration() ==
SD_Thread)) ||
4440 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4441 VD->getType().isConstQualified())))
4454 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4455 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4456 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4457 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4461 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4471 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4478 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4479 if (Context.getInlineVariableDefinitionKind(VD) ==
4484 if (CXX20ModuleInits && VD->getOwningModule() &&
4485 !VD->getOwningModule()->isModuleMapModule()) {
4494 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4497 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4510 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4514 llvm::Constant *
Init;
4517 if (!
V.isAbsent()) {
4528 llvm::Constant *Fields[4] = {
4532 llvm::ConstantDataArray::getRaw(
4533 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4535 Init = llvm::ConstantStruct::getAnon(Fields);
4538 auto *GV =
new llvm::GlobalVariable(
4540 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4542 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4545 if (!
V.isAbsent()) {
4558 llvm::GlobalVariable **Entry =
nullptr;
4559 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4564 llvm::Constant *
Init;
4568 assert(!
V.isAbsent());
4572 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4574 llvm::GlobalValue::PrivateLinkage,
Init,
4576 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4591 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4595 llvm::Constant *
Init =
Emitter.emitForInitializer(
4603 llvm::GlobalValue::LinkageTypes
Linkage =
4605 ? llvm::GlobalValue::LinkOnceODRLinkage
4606 : llvm::GlobalValue::InternalLinkage;
4607 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4611 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4618 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4619 assert(AA &&
"No alias?");
4629 llvm::Constant *Aliasee;
4631 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4639 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4640 WeakRefReferences.insert(F);
4648 if (
auto *A = D->
getAttr<AttrT>())
4649 return A->isImplicit();
4656 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4659 const auto *AA =
Global->getAttr<AliasAttr>();
4667 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4668 if (LangOpts.OpenMPIsTargetDevice)
4669 return !AliaseeDecl ||
4670 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4673 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4674 const bool AliaseeHasDeviceAttr =
4675 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4677 if (LangOpts.CUDAIsDevice)
4678 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4685bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4686 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4691 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4692 Global->hasAttr<CUDAConstantAttr>() ||
4693 Global->hasAttr<CUDASharedAttr>() ||
4694 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4695 Global->getType()->isCUDADeviceBuiltinTextureType();
4702 if (
Global->hasAttr<WeakRefAttr>())
4707 if (
Global->hasAttr<AliasAttr>()) {
4710 return EmitAliasDefinition(GD);
4714 if (
Global->hasAttr<IFuncAttr>())
4715 return emitIFuncDefinition(GD);
4718 if (
Global->hasAttr<CPUDispatchAttr>())
4719 return emitCPUDispatchDefinition(GD);
4724 if (LangOpts.CUDA) {
4726 "Expected Variable or Function");
4727 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4728 if (!shouldEmitCUDAGlobalVar(VD))
4730 }
else if (LangOpts.CUDAIsDevice) {
4731 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4732 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4733 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4737 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4738 !
Global->hasAttr<CUDAGlobalAttr>() &&
4740 !
Global->hasAttr<CUDAHostAttr>()))
4743 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4744 Global->hasAttr<CUDADeviceAttr>())
4748 if (LangOpts.OpenMP) {
4750 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4752 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4753 if (MustBeEmitted(
Global))
4757 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4758 if (MustBeEmitted(
Global))
4765 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4766 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4772 if (FD->
hasAttr<AnnotateAttr>()) {
4775 DeferredAnnotations[MangledName] = FD;
4790 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4796 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4798 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4799 if (LangOpts.OpenMP) {
4801 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4802 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4806 if (VD->hasExternalStorage() &&
4807 Res != OMPDeclareTargetDeclAttr::MT_Link)
4810 bool UnifiedMemoryEnabled =
4812 if (*Res == OMPDeclareTargetDeclAttr::MT_Local ||
4813 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4814 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4815 !UnifiedMemoryEnabled)) {
4818 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4819 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4820 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4821 UnifiedMemoryEnabled)) &&
4822 "Link clause or to clause with unified memory expected.");
4832 if (LangOpts.HLSL) {
4833 if (VD->getStorageClass() ==
SC_Extern) {
4842 if (Context.getInlineVariableDefinitionKind(VD) ==
4852 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4854 EmitGlobalDefinition(GD);
4855 addEmittedDeferredDecl(GD);
4863 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4864 CXXGlobalInits.push_back(
nullptr);
4870 addDeferredDeclToEmit(GD);
4871 }
else if (MustBeEmitted(
Global)) {
4873 assert(!MayBeEmittedEagerly(
Global));
4874 addDeferredDeclToEmit(GD);
4879 DeferredDecls[MangledName] = GD;
4885 if (
const auto *RT =
4886 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4887 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4888 RD = RD->getDefinitionOrSelf();
4889 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4898struct DLLImportFunctionVisitor
4899 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4900 bool SafeToInline =
true;
4902 bool shouldVisitImplicitCode()
const {
return true; }
4904 bool VisitVarDecl(VarDecl *VD) {
4907 SafeToInline =
false;
4908 return SafeToInline;
4915 return SafeToInline;
4918 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4920 SafeToInline = D->
hasAttr<DLLImportAttr>();
4921 return SafeToInline;
4924 bool VisitDeclRefExpr(DeclRefExpr *E) {
4927 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4928 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4929 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4930 return SafeToInline;
4933 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4935 return SafeToInline;
4938 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4942 SafeToInline =
true;
4944 SafeToInline = M->
hasAttr<DLLImportAttr>();
4946 return SafeToInline;
4949 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4951 return SafeToInline;
4954 bool VisitCXXNewExpr(CXXNewExpr *E) {
4956 return SafeToInline;
4961bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4968 if (F->isInlineBuiltinDeclaration())
4971 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4976 if (
const Module *M = F->getOwningModule();
4977 M && M->getTopLevelModule()->isNamedModule() &&
4978 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4988 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4993 if (F->hasAttr<NoInlineAttr>())
4996 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4998 DLLImportFunctionVisitor Visitor;
4999 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
5000 if (!Visitor.SafeToInline)
5003 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
5010 for (
const CXXBaseSpecifier &B :
Dtor->getParent()->bases())
5024bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
5025 return CodeGenOpts.OptimizationLevel > 0;
5028void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
5029 llvm::GlobalValue *GV) {
5033 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
5034 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
5036 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
5037 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
5038 if (TC->isFirstOfVersion(I))
5041 EmitGlobalFunctionDefinition(GD, GV);
5047 AddDeferredMultiVersionResolverToEmit(GD);
5049 GetOrCreateMultiVersionResolver(GD);
5053void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
5056 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
5057 Context.getSourceManager(),
5058 "Generating code for declaration");
5060 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
5063 if (!shouldEmitFunction(GD))
5066 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
5068 llvm::raw_string_ostream
OS(Name);
5074 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
5078 ABI->emitCXXStructor(GD);
5080 EmitMultiVersionFunctionDefinition(GD, GV);
5082 EmitGlobalFunctionDefinition(GD, GV);
5091 return EmitMultiVersionFunctionDefinition(GD, GV);
5092 return EmitGlobalFunctionDefinition(GD, GV);
5095 if (
const auto *VD = dyn_cast<VarDecl>(D))
5096 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
5098 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
5102 llvm::Function *NewFn);
5118static llvm::GlobalValue::LinkageTypes
5122 return llvm::GlobalValue::InternalLinkage;
5123 return llvm::GlobalValue::WeakODRLinkage;
5126void CodeGenModule::emitMultiVersionFunctions() {
5127 std::vector<GlobalDecl> MVFuncsToEmit;
5128 MultiVersionFuncs.swap(MVFuncsToEmit);
5129 for (GlobalDecl GD : MVFuncsToEmit) {
5131 assert(FD &&
"Expected a FunctionDecl");
5133 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
5134 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
5138 if (
Decl->isDefined()) {
5139 EmitGlobalFunctionDefinition(CurGD,
nullptr);
5147 assert(
Func &&
"This should have just been created");
5155 bool ShouldEmitResolver = !
getTriple().isAArch64();
5156 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5157 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
5160 FD, [&](
const FunctionDecl *CurFD) {
5161 llvm::SmallVector<StringRef, 8> Feats;
5164 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
5166 TA->getX86AddedFeatures(Feats);
5167 llvm::Function *
Func = createFunction(CurFD);
5168 DeclMap.insert({
Func, CurFD});
5169 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
5170 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
5171 if (TVA->isDefaultVersion() && IsDefined)
5172 ShouldEmitResolver =
true;
5173 llvm::Function *
Func = createFunction(CurFD);
5174 DeclMap.insert({
Func, CurFD});
5176 TVA->getFeatures(Feats, Delim);
5177 Options.emplace_back(
Func, Feats);
5178 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
5179 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
5180 if (!TC->isFirstOfVersion(I))
5182 if (TC->isDefaultVersion(I) && IsDefined)
5183 ShouldEmitResolver =
true;
5184 llvm::Function *
Func = createFunction(CurFD, I);
5185 DeclMap.insert({
Func, CurFD});
5188 TC->getX86Feature(Feats, I);
5189 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
5192 TC->getFeatures(Feats, I, Delim);
5193 Options.emplace_back(
Func, Feats);
5197 llvm_unreachable(
"unexpected MultiVersionKind");
5200 if (!ShouldEmitResolver)
5203 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
5204 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
5205 ResolverConstant = IFunc->getResolver();
5210 *
this, GD, FD,
true);
5217 auto *Alias = llvm::GlobalAlias::create(
5219 MangledName +
".ifunc", IFunc, &
getModule());
5228 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
5229 const CodeGenFunction::FMVResolverOption &RHS) {
5235 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
5236 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
5237 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
5238 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
5239 return LHS.isSubsetOf(RHS);
5241 Diags.Report(DeclMap[I->Function]->getLocation(),
5242 diag::warn_unreachable_version)
5243 << I->Function->getName();
5244 assert(I->Function->user_empty() &&
"unexpected users");
5245 I->Function->eraseFromParent();
5246 I->Function =
nullptr;
5250 CodeGenFunction CGF(*
this);
5251 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5253 setMultiVersionResolverAttributes(ResolverFunc, GD);
5255 ResolverFunc->setComdat(
5256 getModule().getOrInsertComdat(ResolverFunc->getName()));
5262 if (!MVFuncsToEmit.empty())
5267 if (!MultiVersionFuncs.empty())
5268 emitMultiVersionFunctions();
5278 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
5280 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
5281 llvm::GlobalVariable::ExternalWeakLinkage,
5283 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5288void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
5289 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
5291 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
5293 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
5294 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
5295 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
5296 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5298 DS->takeName(OldDS);
5299 OldDS->replaceAllUsesWith(DS);
5300 OldDS->eraseFromParent();
5306 llvm::Constant *
New) {
5309 Old->replaceAllUsesWith(
New);
5310 Old->eraseFromParent();
5313void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5315 assert(FD &&
"Not a FunctionDecl?");
5317 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5318 assert(DD &&
"Not a cpu_dispatch Function?");
5324 UpdateMultiVersionNames(GD, FD, ResolverName);
5326 llvm::Type *ResolverType;
5327 GlobalDecl ResolverGD;
5329 ResolverType = llvm::FunctionType::get(
5335 ResolverType = DeclTy;
5340 ResolverName, ResolverType, ResolverGD,
false));
5343 ResolverFunc->setComdat(
5344 getModule().getOrInsertComdat(ResolverFunc->getName()));
5346 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5349 for (
const IdentifierInfo *II : DD->cpus()) {
5357 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5360 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5366 Func = GetOrCreateLLVMFunction(
5367 MangledName, DeclTy, ExistingDecl,
5373 llvm::SmallVector<StringRef, 32> Features;
5374 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5375 llvm::transform(Features, Features.begin(),
5376 [](StringRef Str) { return Str.substr(1); });
5377 llvm::erase_if(Features, [&Target](StringRef Feat) {
5378 return !Target.validateCpuSupports(Feat);
5384 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5385 const CodeGenFunction::FMVResolverOption &RHS) {
5386 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5387 llvm::X86::getCpuSupportsMask(RHS.
Features);
5394 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5395 (Options.end() - 2)->Features),
5396 [](
auto X) { return X == 0; })) {
5397 StringRef LHSName = (Options.end() - 2)->Function->getName();
5398 StringRef RHSName = (Options.end() - 1)->Function->getName();
5399 if (LHSName.compare(RHSName) < 0)
5400 Options.erase(Options.end() - 2);
5402 Options.erase(Options.end() - 1);
5405 CodeGenFunction CGF(*
this);
5406 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5407 setMultiVersionResolverAttributes(ResolverFunc, GD);
5412 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5417 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5424 *
this, GD, FD,
true);
5427 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5435void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5437 assert(FD &&
"Not a FunctionDecl?");
5440 std::string MangledName =
5442 if (!DeferredResolversToEmit.insert(MangledName).second)
5445 MultiVersionFuncs.push_back(GD);
5451llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5453 assert(FD &&
"Not a FunctionDecl?");
5455 std::string MangledName =
5460 std::string ResolverName = MangledName;
5464 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5468 ResolverName +=
".ifunc";
5475 ResolverName +=
".resolver";
5478 bool ShouldReturnIFunc =
5497 AddDeferredMultiVersionResolverToEmit(GD);
5501 if (ShouldReturnIFunc) {
5503 llvm::Type *ResolverType = llvm::FunctionType::get(
5505 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5506 MangledName +
".resolver", ResolverType, GlobalDecl{},
5514 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5516 GIF->setName(ResolverName);
5523 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5524 ResolverName, DeclTy, GlobalDecl{},
false);
5526 "Resolver should be created for the first time");
5531void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5533 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5546 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5557bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5558 const llvm::GlobalValue *GV)
const {
5559 auto SC = GV->getDLLStorageClass();
5560 if (SC == llvm::GlobalValue::DefaultStorageClass)
5563 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5564 !MRD->
hasAttr<DLLImportAttr>()) ||
5565 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5566 !MRD->
hasAttr<DLLExportAttr>())) &&
5577llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5578 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5579 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5583 std::string NameWithoutMultiVersionMangling;
5584 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5586 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5587 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5588 !DontDefer && !IsForDefinition) {
5591 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5593 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5596 GDDef = GlobalDecl(FDDef);
5604 UpdateMultiVersionNames(GD, FD, MangledName);
5605 if (!IsForDefinition) {
5611 AddDeferredMultiVersionResolverToEmit(GD);
5613 *
this, GD, FD,
true);
5622 *
this, GD, FD,
true);
5624 return GetOrCreateMultiVersionResolver(GD);
5629 if (!NameWithoutMultiVersionMangling.empty())
5630 MangledName = NameWithoutMultiVersionMangling;
5635 if (WeakRefReferences.erase(Entry)) {
5636 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5637 if (FD && !FD->
hasAttr<WeakAttr>())
5638 Entry->setLinkage(llvm::Function::ExternalLinkage);
5642 if (D && shouldDropDLLAttribute(D, Entry)) {
5643 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5649 if (IsForDefinition && !Entry->isDeclaration()) {
5656 DiagnosedConflictingDefinitions.insert(GD).second) {
5660 diag::note_previous_definition);
5665 (Entry->getValueType() == Ty)) {
5672 if (!IsForDefinition)
5679 bool IsIncompleteFunction =
false;
5681 llvm::FunctionType *FTy;
5685 FTy = llvm::FunctionType::get(
VoidTy,
false);
5686 IsIncompleteFunction =
true;
5690 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5691 Entry ? StringRef() : MangledName, &
getModule());
5695 if (D && D->
hasAttr<AnnotateAttr>())
5713 if (!Entry->use_empty()) {
5715 Entry->removeDeadConstantUsers();
5721 assert(F->getName() == MangledName &&
"name was uniqued!");
5723 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5724 if (ExtraAttrs.hasFnAttrs()) {
5725 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5733 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5736 addDeferredDeclToEmit(GD);
5741 auto DDI = DeferredDecls.find(MangledName);
5742 if (DDI != DeferredDecls.end()) {
5746 addDeferredDeclToEmit(DDI->second);
5747 DeferredDecls.erase(DDI);
5775 if (!IsIncompleteFunction) {
5776 assert(F->getFunctionType() == Ty);
5794 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5804 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5807 DD->getParent()->getNumVBases() == 0)
5812 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5813 false, llvm::AttributeList(),
5816 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5820 if (IsForDefinition)
5828 llvm::GlobalValue *F =
5831 return llvm::NoCFIValue::get(F);
5841 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5844 if (!
C.getLangOpts().CPlusPlus)
5849 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5850 ?
C.Idents.get(
"terminate")
5851 :
C.Idents.get(Name);
5853 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5857 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
5858 for (
const auto *
Result : LSD->lookup(&NS))
5859 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
5864 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5873 llvm::Function *F, StringRef Name) {
5879 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5882 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5883 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5884 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5891 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5892 if (AssumeConvergent) {
5894 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5897 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5902 llvm::Constant *
C = GetOrCreateLLVMFunction(
5904 false,
false, ExtraAttrs);
5906 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5922 llvm::AttributeList ExtraAttrs,
bool Local,
5923 bool AssumeConvergent) {
5924 if (AssumeConvergent) {
5926 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5930 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5934 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5943 markRegisterParameterAttributes(F);
5969 if (WeakRefReferences.erase(Entry)) {
5970 if (D && !D->
hasAttr<WeakAttr>())
5971 Entry->setLinkage(llvm::Function::ExternalLinkage);
5975 if (D && shouldDropDLLAttribute(D, Entry))
5976 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5978 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5981 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5986 if (IsForDefinition && !Entry->isDeclaration()) {
5994 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5996 DiagnosedConflictingDefinitions.insert(D).second) {
6000 diag::note_previous_definition);
6005 if (Entry->getType()->getAddressSpace() != TargetAS)
6006 return llvm::ConstantExpr::getAddrSpaceCast(
6007 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
6011 if (!IsForDefinition)
6017 auto *GV =
new llvm::GlobalVariable(
6018 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
6019 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
6020 getContext().getTargetAddressSpace(DAddrSpace));
6025 GV->takeName(Entry);
6027 if (!Entry->use_empty()) {
6028 Entry->replaceAllUsesWith(GV);
6031 Entry->eraseFromParent();
6037 auto DDI = DeferredDecls.find(MangledName);
6038 if (DDI != DeferredDecls.end()) {
6041 addDeferredDeclToEmit(DDI->second);
6042 DeferredDecls.erase(DDI);
6047 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
6054 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
6060 CXXThreadLocals.push_back(D);
6068 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
6069 EmitGlobalVarDefinition(D);
6074 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
6075 GV->setSection(SA->getName());
6079 if (
getTriple().getArch() == llvm::Triple::xcore &&
6083 GV->setSection(
".cp.rodata");
6086 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
6087 GV->setCodeModel(CMA->getModel());
6092 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
6096 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
6097 bool HasMutableFields =
Record &&
Record->hasMutableFields();
6098 if (!HasMutableFields) {
6105 auto *InitType =
Init->getType();
6106 if (GV->getValueType() != InitType) {
6111 GV->setName(StringRef());
6116 ->stripPointerCasts());
6119 GV->eraseFromParent();
6122 GV->setInitializer(
Init);
6123 GV->setConstant(
true);
6124 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
6144 SanitizerMD->reportGlobal(GV, *D);
6149 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
6150 if (DAddrSpace != ExpectedAS)
6163 false, IsForDefinition);
6184 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
6185 llvm::Align Alignment) {
6186 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
6187 llvm::GlobalVariable *OldGV =
nullptr;
6191 if (GV->getValueType() == Ty)
6196 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
6201 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
6206 GV->takeName(OldGV);
6208 if (!OldGV->use_empty()) {
6209 OldGV->replaceAllUsesWith(GV);
6212 OldGV->eraseFromParent();
6216 !GV->hasAvailableExternallyLinkage())
6217 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6219 GV->setAlignment(Alignment);
6256 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
6264 if (GV && !GV->isDeclaration())
6269 if (!MustBeEmitted(D) && !GV) {
6270 DeferredDecls[MangledName] = D;
6275 EmitGlobalVarDefinition(D);
6280 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
6282 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
6297 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(
Addr)) {
6301 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
6304 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6306 if (!Fn->getSubprogram())
6312 return Context.toCharUnitsFromBits(
6317 if (LangOpts.OpenCL) {
6328 if (LangOpts.SYCLIsDevice &&
6332 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6337 if (D->
hasAttr<CUDAConstantAttr>())
6339 if (D->
hasAttr<CUDASharedAttr>())
6341 if (D->
hasAttr<CUDADeviceAttr>())
6349 if (LangOpts.OpenMP) {
6351 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6359 if (LangOpts.OpenCL)
6361 if (LangOpts.SYCLIsDevice)
6363 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
6371 if (
auto AS =
getTarget().getConstantAddressSpace())
6384static llvm::Constant *
6386 llvm::GlobalVariable *GV) {
6387 llvm::Constant *Cast = GV;
6392 GV, llvm::PointerType::get(
6399template<
typename SomeDecl>
6401 llvm::GlobalValue *GV) {
6416 const SomeDecl *
First = D->getFirstDecl();
6417 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6423 std::pair<StaticExternCMap::iterator, bool> R =
6424 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6429 R.first->second =
nullptr;
6436 if (D.
hasAttr<SelectAnyAttr>())
6440 if (
auto *VD = dyn_cast<VarDecl>(&D))
6454 llvm_unreachable(
"No such linkage");
6462 llvm::GlobalObject &GO) {
6465 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6473void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6488 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6489 OpenMPRuntime->emitTargetGlobalVariable(D))
6492 llvm::TrackingVH<llvm::Constant>
Init;
6493 bool NeedsGlobalCtor =
false;
6497 bool IsDefinitionAvailableExternally =
6499 bool NeedsGlobalDtor =
6500 !IsDefinitionAvailableExternally &&
6507 if (IsDefinitionAvailableExternally &&
6518 std::optional<ConstantEmitter> emitter;
6523 bool IsCUDASharedVar =
6528 bool IsCUDAShadowVar =
6530 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6531 D->
hasAttr<CUDASharedAttr>());
6532 bool IsCUDADeviceShadowVar =
6537 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6538 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6542 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6545 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6546 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6547 }
else if (!InitExpr) {
6560 initializedGlobalDecl = GlobalDecl(D);
6561 emitter.emplace(*
this);
6562 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6570 if (!IsDefinitionAvailableExternally)
6571 NeedsGlobalCtor =
true;
6575 NeedsGlobalCtor =
false;
6587 DelayedCXXInitPosition.erase(D);
6594 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6599 llvm::Type* InitType =
Init->getType();
6600 llvm::Constant *Entry =
6604 Entry = Entry->stripPointerCasts();
6607 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6618 if (!GV || GV->getValueType() != InitType ||
6619 GV->getType()->getAddressSpace() !=
6623 Entry->setName(StringRef());
6628 ->stripPointerCasts());
6631 llvm::Constant *NewPtrForOldDecl =
6632 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6634 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6642 if (D->
hasAttr<AnnotateAttr>())
6655 if (LangOpts.CUDA) {
6656 if (LangOpts.CUDAIsDevice) {
6659 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6662 GV->setExternallyInitialized(
true);
6669 if (LangOpts.HLSL &&
6674 GV->setExternallyInitialized(
true);
6676 GV->setInitializer(
Init);
6683 emitter->finalize(GV);
6686 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6687 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6691 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6692 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6694 GV->setConstant(
true);
6699 if (std::optional<CharUnits> AlignValFromAllocate =
6701 AlignVal = *AlignValFromAllocate;
6719 Linkage == llvm::GlobalValue::ExternalLinkage &&
6720 Context.getTargetInfo().getTriple().isOSDarwin() &&
6722 Linkage = llvm::GlobalValue::InternalLinkage;
6727 if (LangOpts.HLSL &&
6729 Linkage = llvm::GlobalValue::ExternalLinkage;
6732 if (D->
hasAttr<DLLImportAttr>())
6733 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6734 else if (D->
hasAttr<DLLExportAttr>())
6735 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6737 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6739 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6741 GV->setConstant(
false);
6746 if (!GV->getInitializer()->isNullValue())
6747 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6750 setNonAliasAttributes(D, GV);
6752 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6754 CXXThreadLocals.push_back(D);
6761 if (NeedsGlobalCtor || NeedsGlobalDtor)
6762 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6764 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6769 DI->EmitGlobalVariable(GV, D);
6777 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6788 if (D->
hasAttr<SectionAttr>())
6794 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6795 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6796 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6797 D->
hasAttr<PragmaClangRodataSectionAttr>())
6805 if (D->
hasAttr<WeakImportAttr>())
6814 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6815 if (D->
hasAttr<AlignedAttr>())
6818 if (Context.isAlignmentRequired(VarType))
6822 for (
const FieldDecl *FD : RD->fields()) {
6823 if (FD->isBitField())
6825 if (FD->
hasAttr<AlignedAttr>())
6827 if (Context.isAlignmentRequired(FD->
getType()))
6839 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6840 Context.getTypeAlignIfKnown(D->
getType()) >
6847llvm::GlobalValue::LinkageTypes
6851 return llvm::Function::InternalLinkage;
6854 return llvm::GlobalVariable::WeakAnyLinkage;
6858 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6863 return llvm::GlobalValue::AvailableExternallyLinkage;
6877 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6878 : llvm::Function::InternalLinkage;
6892 return llvm::Function::ExternalLinkage;
6895 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6896 : llvm::Function::InternalLinkage;
6897 return llvm::Function::WeakODRLinkage;
6904 CodeGenOpts.NoCommon))
6905 return llvm::GlobalVariable::CommonLinkage;
6911 if (D->
hasAttr<SelectAnyAttr>())
6912 return llvm::GlobalVariable::WeakODRLinkage;
6916 return llvm::GlobalVariable::ExternalLinkage;
6919llvm::GlobalValue::LinkageTypes
6928 llvm::Function *newFn) {
6930 if (old->use_empty())
6933 llvm::Type *newRetTy = newFn->getReturnType();
6938 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6940 llvm::User *user = ui->getUser();
6944 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6945 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6951 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6954 if (!callSite->isCallee(&*ui))
6959 if (callSite->getType() != newRetTy && !callSite->use_empty())
6964 llvm::AttributeList oldAttrs = callSite->getAttributes();
6967 unsigned newNumArgs = newFn->arg_size();
6968 if (callSite->arg_size() < newNumArgs)
6974 bool dontTransform =
false;
6975 for (llvm::Argument &A : newFn->args()) {
6976 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6977 dontTransform =
true;
6982 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6990 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6994 callSite->getOperandBundlesAsDefs(newBundles);
6996 llvm::CallBase *newCall;
6998 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6999 callSite->getIterator());
7002 newCall = llvm::InvokeInst::Create(
7003 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
7004 newArgs, newBundles,
"", callSite->getIterator());
7008 if (!newCall->getType()->isVoidTy())
7009 newCall->takeName(callSite);
7010 newCall->setAttributes(
7011 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
7012 oldAttrs.getRetAttrs(), newArgAttrs));
7013 newCall->setCallingConv(callSite->getCallingConv());
7016 if (!callSite->use_empty())
7017 callSite->replaceAllUsesWith(newCall);
7020 if (callSite->getDebugLoc())
7021 newCall->setDebugLoc(callSite->getDebugLoc());
7023 callSitesToBeRemovedFromParent.push_back(callSite);
7026 for (
auto *callSite : callSitesToBeRemovedFromParent) {
7027 callSite->eraseFromParent();
7041 llvm::Function *NewFn) {
7051 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
7063void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
7064 llvm::GlobalValue *GV) {
7072 if (!GV || (GV->getValueType() != Ty))
7078 if (!GV->isDeclaration())
7088 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
7089 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
7101 setNonAliasAttributes(GD, Fn);
7103 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
7104 (CodeGenOpts.OptimizationLevel == 0) &&
7107 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
7109 !D->
hasAttr<NoInlineAttr>() &&
7110 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
7111 !D->
hasAttr<OptimizeNoneAttr>() &&
7112 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
7113 !ShouldAddOptNone) {
7114 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
7124 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
7125 if (UnwindMode != llvm::WinX64EHUnwindMode::Default &&
7126 UnwindMode != llvm::WinX64EHUnwindMode::V3 &&
7127 Fn->needsUnwindTableEntry()) {
7128 bool HasEGPR =
false;
7129 if (Fn->hasFnAttribute(
"target-features")) {
7131 Fn->getFnAttribute(
"target-features").getValueAsString();
7133 Feats.split(Tokens,
',', -1,
false);
7134 for (StringRef
Tok : Tokens) {
7137 else if (
Tok ==
"-egpr")
7141 HasEGPR = Context.getTargetInfo().hasFeature(
"egpr");
7144 unsigned DiagID = Diags.getCustomDiagID(
7146 "EGPR target feature requires unwind version 3");
7152 auto GetPriority = [
this](
const auto *Attr) ->
int {
7153 Expr *E = Attr->getPriority();
7157 return Attr->DefaultPriority;
7160 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
7162 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
7168void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
7170 const AliasAttr *AA = D->
getAttr<AliasAttr>();
7171 assert(AA &&
"Not an alias?");
7175 if (AA->getAliasee() == MangledName) {
7176 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7183 if (Entry && !Entry->isDeclaration())
7186 Aliases.push_back(GD);
7192 llvm::Constant *Aliasee;
7193 llvm::GlobalValue::LinkageTypes
LT;
7195 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
7201 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
7208 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
7210 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
7213 if (GA->getAliasee() == Entry) {
7214 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7218 assert(Entry->isDeclaration());
7227 GA->takeName(Entry);
7229 Entry->replaceAllUsesWith(GA);
7230 Entry->eraseFromParent();
7232 GA->setName(MangledName);
7240 GA->setLinkage(llvm::Function::WeakAnyLinkage);
7243 if (
const auto *VD = dyn_cast<VarDecl>(D))
7244 if (VD->getTLSKind())
7255void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
7257 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
7258 assert(IFA &&
"Not an ifunc?");
7262 if (IFA->getResolver() == MangledName) {
7263 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7269 if (Entry && !Entry->isDeclaration()) {
7272 DiagnosedConflictingDefinitions.insert(GD).second) {
7273 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
7276 diag::note_previous_definition);
7281 Aliases.push_back(GD);
7287 llvm::Constant *Resolver =
7288 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
7292 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
7293 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
7295 if (GIF->getResolver() == Entry) {
7296 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7299 assert(Entry->isDeclaration());
7308 GIF->takeName(Entry);
7310 Entry->replaceAllUsesWith(GIF);
7311 Entry->eraseFromParent();
7313 GIF->setName(MangledName);
7319 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
7320 (llvm::Intrinsic::ID)IID, Tys);
7323static llvm::StringMapEntry<llvm::GlobalVariable *> &
7326 bool &IsUTF16,
unsigned &StringLength) {
7327 StringRef String = Literal->getString();
7328 unsigned NumBytes = String.size();
7331 if (!Literal->containsNonAsciiOrNull()) {
7332 StringLength = NumBytes;
7333 return *Map.insert(std::make_pair(String,
nullptr)).first;
7340 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
7341 llvm::UTF16 *ToPtr = &ToBuf[0];
7343 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
7344 ToPtr + NumBytes, llvm::strictConversion);
7347 StringLength = ToPtr - &ToBuf[0];
7351 return *Map.insert(std::make_pair(
7352 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7353 (StringLength + 1) * 2),
7359 unsigned StringLength = 0;
7360 bool isUTF16 =
false;
7361 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7366 if (
auto *
C = Entry.second)
7371 const llvm::Triple &Triple =
getTriple();
7374 const bool IsSwiftABI =
7375 static_cast<unsigned>(CFRuntime) >=
7380 if (!CFConstantStringClassRef) {
7381 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7383 Ty = llvm::ArrayType::get(Ty, 0);
7385 switch (CFRuntime) {
7389 CFConstantStringClassName =
7390 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7391 :
"$s10Foundation19_NSCFConstantStringCN";
7395 CFConstantStringClassName =
7396 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7397 :
"$S10Foundation19_NSCFConstantStringCN";
7401 CFConstantStringClassName =
7402 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7403 :
"__T010Foundation19_NSCFConstantStringCN";
7410 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7411 llvm::GlobalValue *GV =
nullptr;
7413 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7420 if ((VD = dyn_cast<VarDecl>(
Result)))
7423 if (Triple.isOSBinFormatELF()) {
7425 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7427 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7428 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7429 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7431 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7439 CFConstantStringClassRef =
7440 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7443 QualType CFTy = Context.getCFConstantStringType();
7448 auto Fields = Builder.beginStruct(STy);
7457 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7458 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7460 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7464 llvm::Constant *
C =
nullptr;
7467 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7468 Entry.first().size() / 2);
7469 C = llvm::ConstantDataArray::get(VMContext, Arr);
7471 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7477 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7478 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7479 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7482 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7483 : Context.getTypeAlignInChars(Context.CharTy);
7489 if (Triple.isOSBinFormatMachO())
7490 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7491 :
"__TEXT,__cstring,cstring_literals");
7494 else if (Triple.isOSBinFormatELF())
7495 GV->setSection(
".rodata");
7501 llvm::IntegerType *LengthTy =
7511 Fields.addInt(LengthTy, StringLength);
7519 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7521 llvm::GlobalVariable::PrivateLinkage);
7522 GV->addAttribute(
"objc_arc_inert");
7523 switch (Triple.getObjectFormat()) {
7524 case llvm::Triple::UnknownObjectFormat:
7525 llvm_unreachable(
"unknown file format");
7526 case llvm::Triple::DXContainer:
7527 case llvm::Triple::GOFF:
7528 case llvm::Triple::SPIRV:
7529 case llvm::Triple::XCOFF:
7530 llvm_unreachable(
"unimplemented");
7531 case llvm::Triple::COFF:
7532 case llvm::Triple::ELF:
7533 case llvm::Triple::Wasm:
7534 GV->setSection(
"cfstring");
7536 case llvm::Triple::MachO:
7537 GV->setSection(
"__DATA,__cfstring");
7546 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7550 if (ObjCFastEnumerationStateType.isNull()) {
7551 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7555 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7556 Context.getPointerType(Context.UnsignedLongTy),
7557 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7560 for (
size_t i = 0; i < 4; ++i) {
7565 FieldTypes[i],
nullptr,
7574 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7577 return ObjCFastEnumerationStateType;
7591 assert(CAT &&
"String literal not of constant array type!");
7593 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7597 llvm::Type *ElemTy = AType->getElementType();
7598 unsigned NumElements = AType->getNumElements();
7601 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7603 Elements.reserve(NumElements);
7605 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7607 Elements.resize(NumElements);
7608 return llvm::ConstantDataArray::get(VMContext, Elements);
7611 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7613 Elements.reserve(NumElements);
7615 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7617 Elements.resize(NumElements);
7618 return llvm::ConstantDataArray::get(VMContext, Elements);
7621static llvm::GlobalVariable *
7630 auto *GV =
new llvm::GlobalVariable(
7631 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7632 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7634 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7635 if (GV->isWeakForLinker()) {
7636 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7637 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7653 llvm::GlobalVariable **Entry =
nullptr;
7654 if (!LangOpts.WritableStrings) {
7655 Entry = &ConstantStringMap[
C];
7656 if (
auto GV = *Entry) {
7657 if (Alignment.
getAsAlign() > GV->getAlign().valueOrOne())
7660 GV->getValueType(), Alignment);
7665 StringRef GlobalVariableName;
7666 llvm::GlobalValue::LinkageTypes LT;
7671 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7672 !LangOpts.WritableStrings) {
7673 llvm::raw_svector_ostream Out(MangledNameBuffer);
7675 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7676 GlobalVariableName = MangledNameBuffer;
7678 LT = llvm::GlobalValue::PrivateLinkage;
7679 GlobalVariableName = Name;
7691 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7694 GV->getValueType(), Alignment);
7711 StringRef GlobalName) {
7712 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7717 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7720 llvm::GlobalVariable **Entry =
nullptr;
7721 if (!LangOpts.WritableStrings) {
7722 Entry = &ConstantStringMap[
C];
7723 if (
auto GV = *Entry) {
7724 if (Alignment.
getAsAlign() > GV->getAlign().valueOrOne())
7727 GV->getValueType(), Alignment);
7733 GlobalName, Alignment);
7738 GV->getValueType(), Alignment);
7756 MaterializedType = E->
getType();
7760 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7761 if (!InsertResult.second) {
7764 if (!InsertResult.first->second) {
7769 InsertResult.first->second =
new llvm::GlobalVariable(
7770 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7774 llvm::cast<llvm::GlobalVariable>(
7775 InsertResult.first->second->stripPointerCasts())
7784 llvm::raw_svector_ostream Out(Name);
7806 std::optional<ConstantEmitter> emitter;
7807 llvm::Constant *InitialValue =
nullptr;
7812 emitter.emplace(*
this);
7813 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7818 Type = InitialValue->getType();
7827 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7829 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7833 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7837 Linkage = llvm::GlobalVariable::InternalLinkage;
7841 auto *GV =
new llvm::GlobalVariable(
7843 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7844 if (emitter) emitter->finalize(GV);
7846 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7848 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7850 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7854 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7855 if (VD->getTLSKind())
7857 llvm::Constant *CV = GV;
7860 GV, llvm::PointerType::get(
7866 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7868 Entry->replaceAllUsesWith(CV);
7869 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7878void CodeGenModule::EmitObjCPropertyImplementations(
const
7891 if (!Getter || Getter->isSynthesizedAccessorStub())
7894 auto *Setter = PID->getSetterMethodDecl();
7895 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7906 if (ivar->getType().isDestructedType())
7927void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7940 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7955 getContext().getObjCIdType(),
nullptr, D,
true,
7961 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7966void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7973 EmitDeclContext(LSD);
7976void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7978 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7981 std::unique_ptr<CodeGenFunction> &CurCGF =
7982 GlobalTopLevelStmtBlockInFlight.first;
7986 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7994 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7995 FunctionArgList Args;
7997 const CGFunctionInfo &FnInfo =
8000 llvm::Function *
Fn = llvm::Function::Create(
8001 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
8003 CurCGF.reset(
new CodeGenFunction(*
this));
8004 GlobalTopLevelStmtBlockInFlight.second = D;
8005 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
8007 CXXGlobalInits.push_back(Fn);
8010 CurCGF->EmitStmt(D->
getStmt());
8013void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
8014 for (
auto *I : DC->
decls()) {
8020 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
8021 for (
auto *M : OID->methods())
8040 case Decl::CXXConversion:
8041 case Decl::CXXMethod:
8042 case Decl::Function:
8049 case Decl::CXXDeductionGuide:
8054 case Decl::Decomposition:
8055 case Decl::VarTemplateSpecialization:
8057 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
8058 for (
auto *B : DD->flat_bindings())
8059 if (
auto *HD = B->getHoldingVar())
8066 case Decl::IndirectField:
8070 case Decl::Namespace:
8073 case Decl::ClassTemplateSpecialization: {
8076 if (Spec->getSpecializationKind() ==
8078 Spec->hasDefinition())
8079 DI->completeTemplateDefinition(*Spec);
8081 case Decl::CXXRecord: {
8085 DI->EmitAndRetainType(
8089 DI->completeUnusedClass(*CRD);
8092 for (
auto *I : CRD->
decls())
8098 case Decl::UsingShadow:
8099 case Decl::ClassTemplate:
8100 case Decl::VarTemplate:
8102 case Decl::VarTemplatePartialSpecialization:
8103 case Decl::FunctionTemplate:
8104 case Decl::TypeAliasTemplate:
8113 case Decl::UsingEnum:
8117 case Decl::NamespaceAlias:
8121 case Decl::UsingDirective:
8125 case Decl::CXXConstructor:
8128 case Decl::CXXDestructor:
8132 case Decl::StaticAssert:
8133 case Decl::ExplicitInstantiation:
8140 case Decl::ObjCInterface:
8141 case Decl::ObjCCategory:
8144 case Decl::ObjCProtocol: {
8146 if (Proto->isThisDeclarationADefinition())
8147 ObjCRuntime->GenerateProtocol(Proto);
8151 case Decl::ObjCCategoryImpl:
8157 case Decl::ObjCImplementation: {
8159 EmitObjCPropertyImplementations(OMD);
8160 EmitObjCIvarInitializations(OMD);
8161 ObjCRuntime->GenerateClass(OMD);
8165 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
8166 OMD->getClassInterface()), OMD->getLocation());
8169 case Decl::ObjCMethod: {
8176 case Decl::ObjCCompatibleAlias:
8180 case Decl::PragmaComment: {
8182 switch (PCD->getCommentKind()) {
8184 llvm_unreachable(
"unexpected pragma comment kind");
8192 ProcessPragmaCommentCopyright(PCD->getArg(), PCD->isFromASTFile());
8202 case Decl::PragmaDetectMismatch: {
8208 case Decl::LinkageSpec:
8212 case Decl::FileScopeAsm: {
8214 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
8217 if (LangOpts.OpenMPIsTargetDevice)
8220 if (LangOpts.SYCLIsDevice)
8225 llvm::Module::GlobalAsmProperties Props;
8226 Props.TargetFeatures = llvm::join(TargetOpts.
Features,
",");
8227 Props.TargetCPU = TargetOpts.
CPU;
8229 llvm::Module::GlobalAsmFragment(AD->getAsmString(), Props));
8233 case Decl::TopLevelStmt:
8237 case Decl::Import: {
8241 if (!ImportedModules.insert(Import->getImportedModule()))
8245 if (!Import->getImportedOwningModule()) {
8247 DI->EmitImportDecl(*Import);
8253 if (CXX20ModuleInits && Import->getImportedModule() &&
8254 Import->getImportedModule()->isNamedModule())
8263 Visited.insert(Import->getImportedModule());
8264 Stack.push_back(Import->getImportedModule());
8266 while (!Stack.empty()) {
8268 if (!EmittedModuleInitializers.insert(Mod).second)
8271 for (
auto *D : Context.getModuleInitializers(Mod))
8278 if (Submodule->IsExplicit)
8281 if (Visited.insert(Submodule).second)
8282 Stack.push_back(Submodule);
8292 case Decl::OMPThreadPrivate:
8296 case Decl::OMPAllocate:
8300 case Decl::OMPDeclareReduction:
8304 case Decl::OMPDeclareMapper:
8308 case Decl::OMPRequires:
8313 case Decl::TypeAlias:
8315 DI->EmitAndRetainType(
getContext().getTypedefType(
8323 DI->EmitAndRetainType(
8330 DI->EmitAndRetainType(
8334 case Decl::HLSLRootSignature:
8337 case Decl::HLSLBuffer:
8341 case Decl::OpenACCDeclare:
8344 case Decl::OpenACCRoutine:
8359 if (!CodeGenOpts.CoverageMapping)
8362 case Decl::CXXConversion:
8363 case Decl::CXXMethod:
8364 case Decl::Function:
8365 case Decl::ObjCMethod:
8366 case Decl::CXXConstructor:
8367 case Decl::CXXDestructor: {
8376 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8386 if (!CodeGenOpts.CoverageMapping)
8388 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8389 if (Fn->isTemplateInstantiation())
8392 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8400 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8403 const Decl *D = Entry.first;
8405 case Decl::CXXConversion:
8406 case Decl::CXXMethod:
8407 case Decl::Function:
8408 case Decl::ObjCMethod: {
8415 case Decl::CXXConstructor: {
8422 case Decl::CXXDestructor: {
8439 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8440 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8441 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8442 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8443 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8452 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8453 return llvm::ConstantInt::get(i64, PtrInt);
8457 llvm::NamedMDNode *&GlobalMetadata,
8459 llvm::GlobalValue *
Addr) {
8460 if (!GlobalMetadata)
8462 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8465 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8468 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8471bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8472 llvm::GlobalValue *CppFunc) {
8474 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8477 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8480 if (Elem == CppFunc)
8486 for (llvm::User *User : Elem->users()) {
8490 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8491 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8494 for (llvm::User *CEUser : ConstExpr->users()) {
8495 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8496 IFuncs.push_back(IFunc);
8501 CEs.push_back(ConstExpr);
8502 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8503 IFuncs.push_back(IFunc);
8515 for (llvm::GlobalIFunc *IFunc : IFuncs)
8516 IFunc->setResolver(
nullptr);
8517 for (llvm::ConstantExpr *ConstExpr : CEs)
8518 ConstExpr->destroyConstant();
8522 Elem->eraseFromParent();
8524 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8529 llvm::FunctionType::get(IFunc->getType(),
false);
8530 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8531 CppFunc->getName(), ResolverTy, {},
false);
8532 IFunc->setResolver(Resolver);
8542void CodeGenModule::EmitStaticExternCAliases() {
8545 for (
auto &I : StaticExternCValues) {
8546 const IdentifierInfo *Name = I.first;
8547 llvm::GlobalValue *Val = I.second;
8555 llvm::GlobalValue *ExistingElem =
8560 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8567 auto Res = Manglings.find(MangledName);
8568 if (Res == Manglings.end())
8570 Result = Res->getValue();
8581void CodeGenModule::EmitDeclMetadata() {
8582 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8584 for (
auto &I : MangledDeclNames) {
8585 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8595void CodeGenFunction::EmitDeclMetadata() {
8596 if (LocalDeclMap.empty())
return;
8601 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8603 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8605 for (
auto &I : LocalDeclMap) {
8606 const Decl *D = I.first;
8607 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8608 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8610 Alloca->setMetadata(
8611 DeclPtrKind, llvm::MDNode::get(
8612 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8613 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8620void CodeGenModule::EmitVersionIdentMetadata() {
8621 llvm::NamedMDNode *IdentMetadata =
8622 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8624 llvm::LLVMContext &Ctx = TheModule.getContext();
8626 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8627 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8630void CodeGenModule::EmitCommandLineMetadata() {
8631 llvm::NamedMDNode *CommandLineMetadata =
8632 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8634 llvm::LLVMContext &Ctx = TheModule.getContext();
8636 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8637 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8640void CodeGenModule::EmitCoverageFile() {
8641 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8645 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8646 llvm::LLVMContext &Ctx = TheModule.getContext();
8647 auto *CoverageDataFile =
8649 auto *CoverageNotesFile =
8651 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8652 llvm::MDNode *CU = CUNode->getOperand(i);
8653 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8654 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8667 LangOpts.ObjCRuntime.isGNUFamily())
8668 return ObjCRuntime->GetEHType(Ty);
8675 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8677 for (
auto RefExpr : D->
varlist()) {
8680 VD->getAnyInitializer() &&
8681 !VD->getAnyInitializer()->isConstantInitializer(
getContext());
8687 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8688 CXXGlobalInits.push_back(InitFunction);
8692llvm::Metadata *CodeGenModule::CreateMetadataIdentifierImpl(
8693 QualType T, MetadataTypeMap &Map, StringRef Suffix,
bool ForceString) {
8696 FnType->getReturnType(), FnType->getParamTypes(),
8697 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8699 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
8704 std::string OutName;
8705 llvm::raw_string_ostream Out(OutName);
8710 Out <<
".normalized";
8733 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
8738 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
8742 return CreateMetadataIdentifierImpl(
T, GeneralizedMetadataIdMap,
8743 ".generalized",
false);
8748 return CreateMetadataIdentifierImpl(
T, CallGraphMetadataIdMap,
"",
8756 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8757 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8758 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8759 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8760 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8761 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8762 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8763 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8771 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8773 if (CodeGenOpts.SanitizeCfiCrossDso)
8775 VTable->addTypeMetadata(Offset.getQuantity(),
8776 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8779 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8780 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8786 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8796 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8811 bool forPointeeType) {
8822 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8829 bool AlignForArray =
T->isArrayType();
8835 if (
T->isIncompleteType()) {
8852 if (
T.getQualifiers().hasUnaligned()) {
8854 }
else if (forPointeeType && !AlignForArray &&
8855 (RD =
T->getAsCXXRecordDecl())) {
8866 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8879 if (NumAutoVarInit >= StopAfter) {
8882 if (!NumAutoVarInit) {
8896 const Decl *D)
const {
8900 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8902 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8908 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8912 llvm::MD5::MD5Result
Result;
8913 for (
const auto &Arg : PreprocessorOpts.Macros)
8914 Hash.update(Arg.first);
8918 llvm::sys::fs::UniqueID ID;
8922 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8927 << PLoc.
getFilename() << Status.getError().message();
8929 ID = Status->getUniqueID();
8931 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8932 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8939 assert(DeferredDeclsToEmit.empty() &&
8940 "Should have emitted all decls deferred to emit.");
8941 assert(NewBuilder->DeferredDecls.empty() &&
8942 "Newly created module should not have deferred decls");
8943 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8944 assert(EmittedDeferredDecls.empty() &&
8945 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8947 assert(NewBuilder->DeferredVTables.empty() &&
8948 "Newly created module should not have deferred vtables");
8949 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8951 assert(NewBuilder->EmittedVTables.empty() &&
8952 "Newly created module should not have defined vtables");
8953 NewBuilder->EmittedVTables = std::move(EmittedVTables);
8955 assert(NewBuilder->MangledDeclNames.empty() &&
8956 "Newly created module should not have mangled decl names");
8957 assert(NewBuilder->Manglings.empty() &&
8958 "Newly created module should not have manglings");
8959 NewBuilder->Manglings = std::move(Manglings);
8961 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8963 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
8967 std::string OutName;
8968 llvm::raw_string_ostream Out(OutName);
8976 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8982 if (Dtor && Dtor->isVirtual() && Dtor->hasAttr<DLLExportAttr>())
8985 return RequireVectorDeletingDtor.count(RD);
8989 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8991 RequireVectorDeletingDtor.insert(RD);
9005 if (Entry && !Entry->isDeclaration()) {
9010 auto *NewFn = llvm::Function::Create(
9012 llvm::Function::ExternalLinkage, VDName, &
getModule());
9013 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
9015 NewFn->takeName(VDEntry);
9016 VDEntry->replaceAllUsesWith(NewFn);
9017 VDEntry->eraseFromParent();
9018 Entry->replaceAllUsesWith(NewFn);
9019 Entry->eraseFromParent();
9024 addDeferredDeclToEmit(VectorDtorGD);
9028 llvm::GlobalAlias *GlobalDeleteAlias,
9032 PendingMSVCGlobalDeletes.insert({GlobalDeleteAlias, OperatorDeleteFD});
9054 "__global_delete wrapper is only used with the Microsoft ABI");
9056 llvm::LLVMContext &LLVMCtx = M.getContext();
9060 llvm::FunctionType *FnTy = GlobDeleteFn->getFunctionType();
9070 StringRef GlobDeleteMangledName = GlobDeleteFn->getName();
9071 StringRef Signature;
9072 const char *WrapperBase;
9073 if (GlobDeleteMangledName.starts_with(
"??3@")) {
9074 Signature = GlobDeleteMangledName.substr(4);
9075 WrapperBase =
"?__global_delete@@";
9076 }
else if (GlobDeleteMangledName.starts_with(
"??_V@")) {
9077 Signature = GlobDeleteMangledName.substr(5);
9078 WrapperBase =
"?__global_array_delete@@";
9080 llvm_unreachable(
"unexpected global operator delete mangling");
9083 std::string GlobalDeleteName = (WrapperBase + Signature).str();
9084 std::string EmptyGlobalDeleteName =
9085 (
"?__empty_global_delete@@" + Signature).str();
9089 if (llvm::GlobalValue *Existing = M.getNamedValue(GlobalDeleteName))
9098 llvm::Function *EmptyFn = M.getFunction(EmptyGlobalDeleteName);
9100 EmptyFn = llvm::Function::Create(
9101 FnTy, llvm::GlobalValue::LinkOnceODRLinkage, EmptyGlobalDeleteName, &M);
9102 EmptyFn->setComdat(M.getOrInsertComdat(EmptyGlobalDeleteName));
9103 EmptyFn->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
9110 auto *BB = llvm::BasicBlock::Create(LLVMCtx,
"", EmptyFn);
9111 llvm::Function *TrapFn =
9112 llvm::Intrinsic::getOrInsertDeclaration(&M, llvm::Intrinsic::trap);
9113 auto *TrapCall = llvm::CallInst::Create(TrapFn, {},
"", BB);
9114 TrapCall->setDoesNotReturn();
9115 TrapCall->setDoesNotThrow();
9116 new llvm::UnreachableInst(LLVMCtx, BB);
9130 auto *GlobalDeleteAlias = llvm::GlobalAlias::create(
9131 FnTy, GlobDeleteFn->getAddressSpace(), llvm::GlobalValue::WeakAnyLinkage,
9132 GlobalDeleteName, EmptyFn, &M);
9139 return GlobalDeleteAlias;
9151 if (!HasDirectGlobalDelete)
9154 for (
const auto &Entry : PendingMSVCGlobalDeletes) {
9155 llvm::GlobalAlias *Alias = Entry.first;
9163 llvm::Function::Create(FnTy, llvm::GlobalValue::LinkOnceODRLinkage,
9164 Alias->getAddressSpace(),
"", &
getModule());
9170 for (
auto &Arg : GlobDelFn->args())
9171 Args.push_back(&Arg);
9172 llvm::CallInst::Create(FnTy, RealDeleteFn, Args,
"", BB);
9177 Alias->replaceAllUsesWith(GlobDelFn);
9178 GlobDelFn->takeName(Alias);
9179 Alias->eraseFromParent();
9181 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 bool hasUnwindExceptions(const LangOptions &langOpts)
Determines whether the language options require us to model unwind exceptions.
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.
bool hasUnwindExceptions() const
Does this runtime use zero-cost exceptions?
@ 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
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.
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.