52#include "llvm/ABI/IRTypeMapper.h"
53#include "llvm/ABI/TargetInfo.h"
54#include "llvm/ADT/STLExtras.h"
55#include "llvm/ADT/StringExtras.h"
56#include "llvm/ADT/StringSwitch.h"
57#include "llvm/Analysis/TargetLibraryInfo.h"
58#include "llvm/BinaryFormat/ELF.h"
59#include "llvm/IR/AttributeMask.h"
60#include "llvm/IR/CallingConv.h"
61#include "llvm/IR/DataLayout.h"
62#include "llvm/IR/Intrinsics.h"
63#include "llvm/IR/LLVMContext.h"
64#include "llvm/IR/Module.h"
65#include "llvm/IR/ProfileSummary.h"
66#include "llvm/ProfileData/InstrProfReader.h"
67#include "llvm/ProfileData/SampleProf.h"
68#include "llvm/Support/ARMBuildAttributes.h"
69#include "llvm/Support/CRC.h"
70#include "llvm/Support/CodeGen.h"
71#include "llvm/Support/CommandLine.h"
72#include "llvm/Support/ConvertUTF.h"
73#include "llvm/Support/ErrorHandling.h"
74#include "llvm/Support/TimeProfiler.h"
75#include "llvm/TargetParser/AArch64TargetParser.h"
76#include "llvm/TargetParser/RISCVISAInfo.h"
77#include "llvm/TargetParser/Triple.h"
78#include "llvm/TargetParser/X86TargetParser.h"
79#include "llvm/Transforms/Instrumentation/KCFI.h"
80#include "llvm/Transforms/Utils/BuildLibCalls.h"
81#include "llvm/Transforms/Utils/KCFIHash.h"
89 "limited-coverage-experimental", llvm::cl::Hidden,
90 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
97 case TargetCXXABI::AppleARM64:
98 case TargetCXXABI::Fuchsia:
99 case TargetCXXABI::GenericAArch64:
100 case TargetCXXABI::GenericARM:
101 case TargetCXXABI::iOS:
102 case TargetCXXABI::WatchOS:
103 case TargetCXXABI::GenericMIPS:
104 case TargetCXXABI::GenericItanium:
105 case TargetCXXABI::WebAssembly:
106 case TargetCXXABI::XL:
108 case TargetCXXABI::Microsoft:
112 llvm_unreachable(
"invalid C++ ABI kind");
115static std::unique_ptr<TargetCodeGenInfo>
118 const llvm::Triple &Triple =
Target.getTriple();
121 switch (Triple.getArch()) {
125 case llvm::Triple::m68k:
127 case llvm::Triple::mips:
128 case llvm::Triple::mipsel:
129 if (Triple.getOS() == llvm::Triple::Win32)
133 case llvm::Triple::mips64:
134 case llvm::Triple::mips64el:
137 case llvm::Triple::avr: {
141 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
142 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
146 case llvm::Triple::aarch64:
147 case llvm::Triple::aarch64_32:
148 case llvm::Triple::aarch64_be: {
150 if (
Target.getABI() ==
"darwinpcs")
151 Kind = AArch64ABIKind::DarwinPCS;
152 else if (Triple.isOSWindows())
154 else if (
Target.getABI() ==
"aapcs-soft")
155 Kind = AArch64ABIKind::AAPCSSoft;
160 case llvm::Triple::wasm32:
161 case llvm::Triple::wasm64: {
163 if (
Target.getABI() ==
"experimental-mv")
164 Kind = WebAssemblyABIKind::ExperimentalMV;
168 case llvm::Triple::arm:
169 case llvm::Triple::armeb:
170 case llvm::Triple::thumb:
171 case llvm::Triple::thumbeb: {
172 if (Triple.getOS() == llvm::Triple::Win32)
176 StringRef ABIStr =
Target.getABI();
177 if (ABIStr ==
"apcs-gnu")
178 Kind = ARMABIKind::APCS;
179 else if (ABIStr ==
"aapcs16")
180 Kind = ARMABIKind::AAPCS16_VFP;
181 else if (CodeGenOpts.
FloatABI ==
"hard" ||
182 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
183 Kind = ARMABIKind::AAPCS_VFP;
188 case llvm::Triple::ppc: {
189 if (Triple.isOSAIX())
196 case llvm::Triple::ppcle: {
201 case llvm::Triple::ppc64:
202 if (Triple.isOSAIX())
205 if (Triple.isOSBinFormatELF()) {
207 if (
Target.getABI() ==
"elfv2")
208 Kind = PPC64_SVR4_ABIKind::ELFv2;
209 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
214 case llvm::Triple::ppc64le: {
215 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
217 if (
Target.getABI() ==
"elfv1")
218 Kind = PPC64_SVR4_ABIKind::ELFv1;
219 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
224 case llvm::Triple::nvptx:
225 case llvm::Triple::nvptx64:
228 case llvm::Triple::msp430:
231 case llvm::Triple::riscv32:
232 case llvm::Triple::riscv64:
233 case llvm::Triple::riscv32be:
234 case llvm::Triple::riscv64be: {
235 StringRef ABIStr =
Target.getABI();
237 unsigned ABIFLen = 0;
238 if (ABIStr.ends_with(
"f"))
240 else if (ABIStr.ends_with(
"d"))
242 bool EABI = ABIStr.ends_with(
"e");
246 case llvm::Triple::systemz: {
247 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
248 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
252 case llvm::Triple::tce:
253 case llvm::Triple::tcele:
254 case llvm::Triple::tcele64:
257 case llvm::Triple::x86: {
258 bool IsDarwinVectorABI = Triple.isOSDarwin();
259 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
261 if (Triple.getOS() == llvm::Triple::Win32) {
263 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
264 CodeGenOpts.NumRegisterParameters);
267 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
268 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
271 case llvm::Triple::x86_64: {
272 StringRef ABI =
Target.getABI();
273 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
274 : ABI ==
"avx" ? X86AVXABILevel::AVX
275 : X86AVXABILevel::None);
277 switch (Triple.getOS()) {
278 case llvm::Triple::UEFI:
279 case llvm::Triple::Win32:
285 case llvm::Triple::hexagon:
287 case llvm::Triple::lanai:
289 case llvm::Triple::r600:
291 case llvm::Triple::amdgcn:
293 case llvm::Triple::sparc:
295 case llvm::Triple::sparcv9:
297 case llvm::Triple::xcore:
299 case llvm::Triple::arc:
301 case llvm::Triple::spir:
302 case llvm::Triple::spir64:
304 case llvm::Triple::spirv32:
305 case llvm::Triple::spirv64:
306 case llvm::Triple::spirv:
308 case llvm::Triple::dxil:
310 case llvm::Triple::ve:
312 case llvm::Triple::csky: {
313 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
315 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
320 case llvm::Triple::bpfeb:
321 case llvm::Triple::bpfel:
323 case llvm::Triple::loongarch32:
324 case llvm::Triple::loongarch64: {
325 StringRef ABIStr =
Target.getABI();
326 unsigned ABIFRLen = 0;
327 if (ABIStr.ends_with(
"f"))
329 else if (ABIStr.ends_with(
"d"))
338 if (!TheTargetCodeGenInfo)
340 return *TheTargetCodeGenInfo;
344 if (!CodeGenOpts.ExperimentalABILowering)
351const llvm::abi::TargetInfo &
353 if (TheLLVMABITargetInfo)
354 return *TheLLVMABITargetInfo;
357 "LLVMABI lowering requested for an unsupported target");
358 TheLLVMABITargetInfo = llvm::abi::createBPFTargetInfo(TB);
359 return *TheLLVMABITargetInfo;
363 llvm::LLVMContext &Context,
367 if (Opts.AlignDouble || Opts.OpenCL)
370 llvm::Triple Triple =
Target.getTriple();
371 llvm::DataLayout DL(
Target.getDataLayoutString());
372 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
373 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
374 llvm::Align ClangAlign(Alignment / 8);
375 if (DLAlign != ClangAlign) {
376 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
377 <<
" mapping to " << *Ty <<
" has data layout alignment "
378 << DLAlign.value() <<
" while clang specifies "
379 << ClangAlign.value() <<
"\n";
384 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
386 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
388 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
390 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
393 if (Triple.getArch() != llvm::Triple::m68k)
394 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
397 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
398 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
399 Triple.getArch() != llvm::Triple::ve)
400 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
402 if (
Target.hasFloat16Type())
403 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
405 if (
Target.hasBFloat16Type())
406 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
407 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
409 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
412 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
414 if (
Target.hasFloat128Type())
415 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
416 if (
Target.hasIbm128Type())
417 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
419 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
421 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
422 llvm::errs() <<
"Datalayout for target " << Triple.str()
423 <<
" sets element-aligned vectors to '"
424 <<
Target.vectorsAreElementAligned()
425 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
439 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
440 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
442 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
446 AbiMapper = std::make_unique<QualTypeMapper>(
C, M.getDataLayout(), AbiAlloc);
447 AbiReverseMapper = std::make_unique<llvm::abi::IRTypeMapper>(
448 M.getContext(), M.getDataLayout());
452 llvm::LLVMContext &LLVMContext = M.getContext();
453 VoidTy = llvm::Type::getVoidTy(LLVMContext);
454 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
455 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
456 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
457 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
458 HalfTy = llvm::Type::getHalfTy(LLVMContext);
459 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
460 FloatTy = llvm::Type::getFloatTy(LLVMContext);
461 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
467 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
469 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
471 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
472 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
473 IntPtrTy = llvm::IntegerType::get(LLVMContext,
474 C.getTargetInfo().getMaxPointerWidth());
475 Int8PtrTy = llvm::PointerType::get(LLVMContext,
477 const llvm::DataLayout &DL = M.getDataLayout();
479 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
481 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
483 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
499 createOpenCLRuntime();
501 createOpenMPRuntime();
508 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
509 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
515 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
516 CodeGenOpts.CoverageNotesFile.size() ||
517 CodeGenOpts.CoverageDataFile.size())
525 Block.GlobalUniqueCount = 0;
527 if (
C.getLangOpts().ObjC)
530 if (CodeGenOpts.hasProfileClangUse()) {
531 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
532 CodeGenOpts.ProfileInstrumentUsePath, *FS,
533 CodeGenOpts.ProfileRemappingFile);
534 if (
auto E = ReaderOrErr.takeError()) {
535 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
536 Diags.Report(diag::err_reading_profile)
537 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
541 PGOReader = std::move(ReaderOrErr.get());
546 if (CodeGenOpts.CoverageMapping)
550 if (CodeGenOpts.UniqueInternalLinkageNames &&
551 !
getModule().getSourceFileName().empty()) {
555 Context.getTargetInfo());
556 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
560 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
561 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
562 CodeGenOpts.NumRegisterParameters);
571 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
572 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
574 this->MSHotPatchFunctions.push_back(std::string{*I});
576 auto &DE = Context.getDiagnostics();
577 DE.Report(diag::err_open_hotpatch_file_failed)
579 << BufOrErr.getError().message();
584 this->MSHotPatchFunctions.push_back(FuncName);
586 llvm::sort(this->MSHotPatchFunctions);
589 if (!Context.getAuxTargetInfo())
595void CodeGenModule::createObjCRuntime() {
612 llvm_unreachable(
"bad runtime kind");
615void CodeGenModule::createOpenCLRuntime() {
619void CodeGenModule::createOpenMPRuntime() {
620 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
621 Diags.Report(diag::err_omp_host_ir_file_not_found)
622 << LangOpts.OMPHostIRFile;
627 case llvm::Triple::nvptx:
628 case llvm::Triple::nvptx64:
629 case llvm::Triple::amdgcn:
630 case llvm::Triple::spirv64:
633 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
634 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
637 if (LangOpts.OpenMPSimd)
638 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
640 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
645void CodeGenModule::createCUDARuntime() {
649void CodeGenModule::createHLSLRuntime() {
650 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
654 Replacements[Name] =
C;
657void CodeGenModule::applyReplacements() {
658 for (
auto &I : Replacements) {
659 StringRef MangledName = I.first;
660 llvm::Constant *Replacement = I.second;
665 auto *NewF = dyn_cast<llvm::Function>(Replacement);
667 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
668 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
671 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
672 CE->getOpcode() == llvm::Instruction::GetElementPtr);
673 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
678 OldF->replaceAllUsesWith(Replacement);
680 NewF->removeFromParent();
681 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
684 OldF->eraseFromParent();
689 GlobalValReplacements.push_back(std::make_pair(GV,
C));
692void CodeGenModule::applyGlobalValReplacements() {
693 for (
auto &I : GlobalValReplacements) {
694 llvm::GlobalValue *GV = I.first;
695 llvm::Constant *
C = I.second;
697 GV->replaceAllUsesWith(
C);
698 GV->eraseFromParent();
705 const llvm::Constant *
C;
706 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
707 C = GA->getAliasee();
708 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
709 C = GI->getResolver();
713 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
717 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
726 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
727 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
731 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
735 if (GV->hasCommonLinkage()) {
736 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
737 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
738 Diags.
Report(Location, diag::err_alias_to_common);
743 if (GV->isDeclaration()) {
744 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
745 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
746 << IsIFunc << IsIFunc;
749 for (
const auto &[
Decl, Name] : MangledDeclNames) {
750 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
752 if (II && II->
getName() == GV->getName()) {
753 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
757 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
767 const auto *F = dyn_cast<llvm::Function>(GV);
769 Diags.
Report(Location, diag::err_alias_to_undefined)
770 << IsIFunc << IsIFunc;
774 llvm::FunctionType *FTy = F->getFunctionType();
775 if (!FTy->getReturnType()->isPointerTy()) {
776 Diags.
Report(Location, diag::err_ifunc_resolver_return);
790 if (GVar->hasAttribute(
"toc-data")) {
791 auto GVId = GVar->getName();
794 Diags.
Report(Location, diag::warn_toc_unsupported_type)
795 << GVId <<
"the variable has an alias";
797 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
798 llvm::AttributeSet NewAttributes =
799 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
800 GVar->setAttributes(NewAttributes);
804void CodeGenModule::checkAliases() {
809 DiagnosticsEngine &Diags =
getDiags();
810 for (
const GlobalDecl &GD : Aliases) {
812 SourceLocation Location;
814 bool IsIFunc = D->hasAttr<IFuncAttr>();
815 if (
const Attr *A = D->getDefiningAttr()) {
816 Location = A->getLocation();
817 Range = A->getRange();
819 llvm_unreachable(
"Not an alias or ifunc?");
823 const llvm::GlobalValue *GV =
nullptr;
825 MangledDeclNames, Range)) {
831 GlobalDecl AliaseeGD;
834 Diags.Report(Location, diag::err_alias_to_undefined)
835 << IsIFunc << IsIFunc;
844 if (AliasIsFuncDecl != AliaseeIsFunc) {
845 Diags.Report(Location, diag::err_alias_between_function_and_variable)
848 diag::note_aliasee_declaration);
855 if (AliasIsFuncDecl && AliaseeIsFunc) {
856 QualType AliasTy = D->getType();
858 auto shouldReportTypeMismatch = [&]() {
859 const auto *AliasFTy =
861 const auto *AliaseeFTy =
863 assert(AliasFTy && AliaseeFTy);
864 if (!Context.typesAreCompatible(AliasFTy->getReturnType(),
867 const auto *AliasFPTy = dyn_cast<FunctionProtoType>(AliasFTy);
868 const auto *AliaseeFPTy = dyn_cast<FunctionProtoType>(AliaseeFTy);
870 if ((AliasFPTy && AliasFPTy->isVariadic() && !AliaseeFPTy) ||
871 (AliaseeFPTy && AliaseeFPTy->isVariadic() && !AliasFPTy))
874 if (!AliasFPTy || !AliaseeFPTy)
878 if (AliasFPTy->getNumParams() != AliaseeFPTy->getNumParams() ||
879 AliasFPTy->isVariadic() != AliaseeFPTy->isVariadic())
881 for (
unsigned i = 0; i < AliasFPTy->getNumParams(); ++i)
882 if (!Context.typesAreCompatible(AliasFPTy->getParamType(i),
883 AliaseeFPTy->getParamType(i)))
887 if (shouldReportTypeMismatch()) {
888 Diags.Report(Location, diag::warn_alias_type_mismatch)
889 << AliasTy << AliaseeTy;
891 diag::note_aliasee_declaration);
897 if (
const llvm::GlobalVariable *GVar =
898 dyn_cast<const llvm::GlobalVariable>(GV))
902 llvm::Constant *Aliasee =
906 llvm::GlobalValue *AliaseeGV;
907 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
912 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
913 StringRef AliasSection = SA->getName();
914 if (AliasSection != AliaseeGV->getSection())
915 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
916 << AliasSection << IsIFunc << IsIFunc;
924 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
925 if (GA->isInterposable()) {
926 Diags.Report(Location, diag::warn_alias_to_weak_alias)
927 << GV->getName() << GA->getName() << IsIFunc;
928 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
929 GA->getAliasee(), Alias->getType());
941 llvm::Attribute::DisableSanitizerInstrumentation);
946 for (
const GlobalDecl &GD : Aliases) {
949 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
950 Alias->eraseFromParent();
955 DeferredDeclsToEmit.clear();
956 EmittedDeferredDecls.clear();
957 DeferredAnnotations.clear();
959 OpenMPRuntime->clear();
963 StringRef MainFile) {
966 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
967 if (MainFile.empty())
968 MainFile =
"<stdin>";
969 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
972 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
975 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
979static std::optional<llvm::GlobalValue::VisibilityTypes>
986 return llvm::GlobalValue::DefaultVisibility;
988 return llvm::GlobalValue::HiddenVisibility;
990 return llvm::GlobalValue::ProtectedVisibility;
992 llvm_unreachable(
"unknown option value!");
997 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
1006 GV.setDSOLocal(
false);
1007 GV.setVisibility(*
V);
1012 if (!LO.VisibilityFromDLLStorageClass)
1015 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
1018 std::optional<llvm::GlobalValue::VisibilityTypes>
1019 NoDLLStorageClassVisibility =
1022 std::optional<llvm::GlobalValue::VisibilityTypes>
1023 ExternDeclDLLImportVisibility =
1026 std::optional<llvm::GlobalValue::VisibilityTypes>
1027 ExternDeclNoDLLStorageClassVisibility =
1030 for (llvm::GlobalValue &GV : M.global_values()) {
1031 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
1034 if (GV.isDeclarationForLinker())
1036 llvm::GlobalValue::DLLImportStorageClass
1037 ? ExternDeclDLLImportVisibility
1038 : ExternDeclNoDLLStorageClassVisibility);
1041 llvm::GlobalValue::DLLExportStorageClass
1042 ? DLLExportVisibility
1043 : NoDLLStorageClassVisibility);
1045 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
1050 const llvm::Triple &Triple,
1054 return LangOpts.getStackProtector() == Mode;
1057std::optional<llvm::Attribute::AttrKind>
1059 if (D && D->
hasAttr<NoStackProtectorAttr>())
1061 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
1063 return llvm::Attribute::StackProtectStrong;
1065 return llvm::Attribute::StackProtect;
1067 return llvm::Attribute::StackProtectStrong;
1069 return llvm::Attribute::StackProtectReq;
1070 return std::nullopt;
1076 EmitModuleInitializers(Primary);
1078 DeferredDecls.insert_range(EmittedDeferredDecls);
1079 EmittedDeferredDecls.clear();
1080 EmitVTablesOpportunistically();
1081 applyGlobalValReplacements();
1082 applyReplacements();
1083 emitMultiVersionFunctions();
1084 emitPFPFieldsWithEvaluatedOffset();
1086 if (Context.getLangOpts().IncrementalExtensions &&
1087 GlobalTopLevelStmtBlockInFlight.first) {
1089 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1090 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1096 EmitCXXModuleInitFunc(Primary);
1098 EmitCXXGlobalInitFunc();
1099 EmitCXXGlobalCleanUpFunc();
1100 registerGlobalDtorsWithAtExit();
1101 EmitCXXThreadLocalInitFunc();
1103 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1105 if (Context.getLangOpts().CUDA && CUDARuntime) {
1106 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1109 if (OpenMPRuntime) {
1110 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1111 OpenMPRuntime->clear();
1115 PGOReader->getSummary(
false).getMD(VMContext),
1116 llvm::ProfileSummary::PSK_Instr);
1117 if (PGOStats.hasDiagnostics())
1123 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1124 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1126 EmitStaticExternCAliases();
1131 if (CoverageMapping)
1132 CoverageMapping->emit();
1133 if (CodeGenOpts.SanitizeCfiCrossDso) {
1137 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1139 emitAtAvailableLinkGuard();
1140 if (Context.getTargetInfo().getTriple().isWasm())
1147 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1148 llvm::CodeObjectVersionKind::COV_None) {
1149 getModule().addModuleFlag(llvm::Module::Error,
1150 "amdhsa_code_object_version",
1151 getTarget().getTargetOpts().CodeObjectVersion);
1156 auto *MDStr = llvm::MDString::get(
1161 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1170 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1172 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1174 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1178 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1182 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1184 auto *GV =
new llvm::GlobalVariable(
1185 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1186 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1192 auto *GV =
new llvm::GlobalVariable(
1194 llvm::Constant::getNullValue(
Int8Ty),
1203 if (CodeGenOpts.Autolink &&
1204 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1205 EmitModuleLinkOptions();
1220 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1221 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1222 for (
auto *MD : ELFDependentLibraries)
1223 NMD->addOperand(MD);
1226 if (CodeGenOpts.DwarfVersion) {
1227 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1228 CodeGenOpts.DwarfVersion);
1231 if (CodeGenOpts.Dwarf64)
1232 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1234 if (Context.getLangOpts().SemanticInterposition)
1236 getModule().setSemanticInterposition(
true);
1238 if (CodeGenOpts.EmitCodeView) {
1240 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1242 if (CodeGenOpts.CodeViewGHash) {
1243 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1245 if (CodeGenOpts.ControlFlowGuard) {
1248 llvm::Module::Warning,
"cfguard",
1249 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1250 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1253 llvm::Module::Warning,
"cfguard",
1254 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1256 if (CodeGenOpts.getWinControlFlowGuardMechanism() !=
1257 llvm::ControlFlowGuardMechanism::Automatic) {
1260 llvm::Module::Warning,
"cfguard-mechanism",
1261 static_cast<unsigned>(CodeGenOpts.getWinControlFlowGuardMechanism()));
1263 if (CodeGenOpts.EHContGuard) {
1265 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1267 if (Context.getLangOpts().Kernel) {
1269 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1271 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1276 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1278 llvm::Metadata *Ops[2] = {
1279 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1280 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1281 llvm::Type::getInt32Ty(VMContext), 1))};
1283 getModule().addModuleFlag(llvm::Module::Require,
1284 "StrictVTablePointersRequirement",
1285 llvm::MDNode::get(VMContext, Ops));
1291 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1292 llvm::DEBUG_METADATA_VERSION);
1297 uint64_t WCharWidth =
1298 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1299 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1300 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1303 getModule().addModuleFlag(llvm::Module::Warning,
1304 "zos_product_major_version",
1305 uint32_t(CLANG_VERSION_MAJOR));
1306 getModule().addModuleFlag(llvm::Module::Warning,
1307 "zos_product_minor_version",
1308 uint32_t(CLANG_VERSION_MINOR));
1309 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1310 uint32_t(CLANG_VERSION_PATCHLEVEL));
1312 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1313 llvm::MDString::get(VMContext, ProductId));
1318 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1319 llvm::MDString::get(VMContext, lang_str));
1321 time_t TT = PreprocessorOpts.SourceDateEpoch
1322 ? *PreprocessorOpts.SourceDateEpoch
1323 : std::time(
nullptr);
1324 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1325 static_cast<uint64_t
>(TT));
1328 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1329 llvm::MDString::get(VMContext,
"ascii"));
1332 llvm::Triple T = Context.getTargetInfo().getTriple();
1333 if (T.isARM() || T.isThumb()) {
1335 uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1336 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1340 StringRef ABIStr = Target.getABI();
1341 llvm::LLVMContext &Ctx = TheModule.getContext();
1342 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1343 llvm::MDString::get(Ctx, ABIStr));
1348 const std::vector<std::string> &Features =
1351 llvm::RISCVISAInfo::parseFeatures(T.isRISCV64() ? 64 : 32, Features);
1352 if (!errorToBool(ParseResult.takeError()))
1354 llvm::Module::AppendUnique,
"riscv-isa",
1356 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1359 if (CodeGenOpts.SanitizeCfiCrossDso) {
1361 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1364 if (CodeGenOpts.WholeProgramVTables) {
1368 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1369 CodeGenOpts.VirtualFunctionElimination);
1372 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1373 getModule().addModuleFlag(llvm::Module::Override,
1374 "CFI Canonical Jump Tables",
1375 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1378 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1379 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1383 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1385 llvm::Module::Append,
"Unique Source File Identifier",
1387 TheModule.getContext(),
1388 llvm::MDString::get(TheModule.getContext(),
1389 CodeGenOpts.UniqueSourceFileIdentifier)));
1392 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1393 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1396 if (CodeGenOpts.PatchableFunctionEntryOffset)
1397 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1398 CodeGenOpts.PatchableFunctionEntryOffset);
1399 if (CodeGenOpts.SanitizeKcfiArity)
1400 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1403 llvm::Module::Override,
"kcfi-hash",
1404 llvm::MDString::get(
1406 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1409 if (CodeGenOpts.CFProtectionReturn &&
1410 Target.checkCFProtectionReturnSupported(
getDiags())) {
1412 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1416 if (CodeGenOpts.CFProtectionBranch &&
1417 Target.checkCFProtectionBranchSupported(
getDiags())) {
1419 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1422 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1423 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1425 Scheme = Target.getDefaultCFBranchLabelScheme();
1427 llvm::Module::Error,
"cf-branch-label-scheme",
1433 if (CodeGenOpts.FunctionReturnThunks)
1434 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1436 if (CodeGenOpts.IndirectBranchCSPrefix)
1437 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1448 if (Context.getTargetInfo().hasFeature(
"ptrauth") &&
1449 LangOpts.getSignReturnAddressScope() !=
1451 getModule().addModuleFlag(llvm::Module::Override,
1452 "sign-return-address-buildattr", 1);
1453 if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
1454 getModule().addModuleFlag(llvm::Module::Override,
1455 "tag-stack-memory-buildattr", 1);
1457 if (T.isARM() || T.isThumb() || T.isAArch64()) {
1465 if (LangOpts.BranchTargetEnforcement)
1466 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1468 if (LangOpts.BranchProtectionPAuthLR)
1469 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1471 if (LangOpts.GuardedControlStack)
1472 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1473 if (LangOpts.hasSignReturnAddress())
1474 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1475 if (LangOpts.isSignReturnAddressScopeAll())
1476 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1478 if (!LangOpts.isSignReturnAddressWithAKey())
1479 getModule().addModuleFlag(llvm::Module::Min,
1480 "sign-return-address-with-bkey", 2);
1482 if (LangOpts.PointerAuthELFGOT)
1483 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-elf-got", 1);
1486 if (LangOpts.PointerAuthCalls)
1487 getModule().addModuleFlag(llvm::Module::Error,
1488 "ptrauth-sign-personality", 1);
1490 using namespace llvm::ELF;
1491 uint64_t PAuthABIVersion =
1492 (LangOpts.PointerAuthIntrinsics
1493 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1494 (LangOpts.PointerAuthCalls
1495 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1496 (LangOpts.PointerAuthReturns
1497 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1498 (LangOpts.PointerAuthAuthTraps
1499 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1500 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1501 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1502 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1503 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1504 (LangOpts.PointerAuthInitFini
1505 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1506 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1507 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1508 (LangOpts.PointerAuthELFGOT
1509 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1510 (LangOpts.PointerAuthIndirectGotos
1511 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1512 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1513 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1514 (LangOpts.PointerAuthFunctionTypeDiscrimination
1515 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1516 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1517 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1518 "Update when new enum items are defined");
1519 if (PAuthABIVersion != 0) {
1520 getModule().addModuleFlag(llvm::Module::Error,
1521 "aarch64-elf-pauthabi-platform",
1522 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1523 getModule().addModuleFlag(llvm::Module::Error,
1524 "aarch64-elf-pauthabi-version",
1529 if ((T.isARM() || T.isThumb()) &&
getTriple().isTargetAEABI() &&
1531 uint32_t TagVal = 0;
1532 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1534 llvm::DenormalMode::getPositiveZero()) {
1535 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1537 llvm::DenormalMode::getIEEE()) {
1538 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1539 DenormalTagBehavior = llvm::Module::Override;
1541 llvm::DenormalMode::getPreserveSign()) {
1542 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1544 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1549 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1550 llvm::ARMBuildAttrs::Allowed);
1553 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1555 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1556 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1560 if (CodeGenOpts.StackClashProtector)
1562 llvm::Module::Override,
"probe-stack",
1563 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1565 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1566 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1567 CodeGenOpts.StackProbeSize);
1569 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1570 llvm::LLVMContext &Ctx = TheModule.getContext();
1572 llvm::Module::Error,
"MemProfProfileFilename",
1573 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1576 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1580 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1581 CodeGenOpts.FP32DenormalMode.Output !=
1582 llvm::DenormalMode::IEEE);
1585 if (LangOpts.EHAsynch)
1586 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1589 if (CodeGenOpts.ImportCallOptimization)
1590 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1594 if (CodeGenOpts.getWinX64EHUnwindV2() != llvm::WinX64EHUnwindV2Mode::Disabled)
1596 llvm::Module::Warning,
"winx64-eh-unwindv2",
1597 static_cast<unsigned>(CodeGenOpts.getWinX64EHUnwindV2()));
1601 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1603 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1607 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1608 EmitOpenCLMetadata();
1615 auto Version = LangOpts.getOpenCLCompatibleVersion();
1616 llvm::Metadata *SPIRVerElts[] = {
1617 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1619 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1620 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1621 llvm::NamedMDNode *SPIRVerMD =
1622 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1623 llvm::LLVMContext &Ctx = TheModule.getContext();
1624 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1632 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1633 assert(PLevel < 3 &&
"Invalid PIC Level");
1634 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1635 if (Context.getLangOpts().PIE)
1636 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1640 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1641 .Case(
"tiny", llvm::CodeModel::Tiny)
1642 .Case(
"small", llvm::CodeModel::Small)
1643 .Case(
"kernel", llvm::CodeModel::Kernel)
1644 .Case(
"medium", llvm::CodeModel::Medium)
1645 .Case(
"large", llvm::CodeModel::Large)
1648 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1651 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1652 Context.getTargetInfo().getTriple().getArch() ==
1653 llvm::Triple::x86_64) {
1659 if (CodeGenOpts.NoPLT)
1662 CodeGenOpts.DirectAccessExternalData !=
1663 getModule().getDirectAccessExternalData()) {
1664 getModule().setDirectAccessExternalData(
1665 CodeGenOpts.DirectAccessExternalData);
1667 if (CodeGenOpts.UnwindTables)
1668 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1670 switch (CodeGenOpts.getFramePointer()) {
1675 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1678 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1681 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1684 getModule().setFramePointer(llvm::FramePointerKind::All);
1688 SimplifyPersonality();
1701 EmitVersionIdentMetadata();
1704 EmitCommandLineMetadata();
1712 getModule().setStackProtectorGuardSymbol(
1715 getModule().setStackProtectorGuardOffset(
1718 getModule().setStackProtectorGuardValueWidth(
1721 if (
getModule().getStackProtectorGuard() !=
"global") {
1722 Diags.Report(diag::err_opt_not_valid_without_opt)
1723 <<
"-mstack-protector-guard-record"
1724 <<
"-mstack-protector-guard=global";
1726 getModule().setStackProtectorGuardRecord(
true);
1731 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1733 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1735 if (
getContext().getTargetInfo().getMaxTLSAlign())
1736 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1737 getContext().getTargetInfo().getMaxTLSAlign());
1755 if (!MustTailCallUndefinedGlobals.empty()) {
1757 for (
auto &I : MustTailCallUndefinedGlobals) {
1758 if (!I.first->isDefined())
1759 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1763 if (!Entry || Entry->isWeakForLinker() ||
1764 Entry->isDeclarationForLinker())
1765 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1769 for (
auto &I : MustTailCallUndefinedGlobals) {
1778 if (Entry->isDeclarationForLinker()) {
1781 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
1783 CalleeIsLocal = Entry->isDSOLocal();
1787 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
1798 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
1799 ErrnoTBAAMD->addOperand(IntegerNode);
1804void CodeGenModule::EmitOpenCLMetadata() {
1810 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1811 llvm::Metadata *OCLVerElts[] = {
1812 llvm::ConstantAsMetadata::get(
1813 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1814 llvm::ConstantAsMetadata::get(
1815 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1816 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1817 llvm::LLVMContext &Ctx = TheModule.getContext();
1818 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1821 EmitVersion(
"opencl.ocl.version", CLVersion);
1822 if (LangOpts.OpenCLCPlusPlus) {
1824 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1828void CodeGenModule::EmitBackendOptionsMetadata(
1829 const CodeGenOptions &CodeGenOpts) {
1831 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1832 CodeGenOpts.SmallDataLimit);
1836 if (LangOpts.AllocTokenMode) {
1837 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
1838 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
1839 llvm::MDString::get(VMContext, S));
1841 if (LangOpts.AllocTokenMax)
1843 llvm::Module::Error,
"alloc-token-max",
1844 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1845 *LangOpts.AllocTokenMax));
1846 if (CodeGenOpts.SanitizeAllocTokenFastABI)
1847 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
1848 if (CodeGenOpts.SanitizeAllocTokenExtended)
1849 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
1865 return TBAA->getTypeInfo(QTy);
1884 return TBAA->getAccessInfo(AccessType);
1891 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1897 return TBAA->getTBAAStructInfo(QTy);
1903 return TBAA->getBaseTypeInfo(QTy);
1909 return TBAA->getAccessTagInfo(Info);
1916 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1924 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1932 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1938 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1943 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1955 std::string Msg =
Type;
1957 diag::err_codegen_unsupported)
1963 diag::err_codegen_unsupported)
1970 std::string Msg =
Type;
1972 diag::err_codegen_unsupported)
1977 llvm::function_ref<
void()> Fn) {
1978 StackHandler.runWithSufficientStackSpace(Loc, Fn);
1988 if (GV->hasLocalLinkage()) {
1989 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2002 if (Context.getLangOpts().OpenMP &&
2003 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
2004 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
2005 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
2006 OMPDeclareTargetDeclAttr::DT_NoHost &&
2008 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2015 if (Context.getLangOpts().CUDAIsDevice &&
2017 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
2018 bool NeedsProtected =
false;
2022 else if (
const auto *VD = dyn_cast<VarDecl>(D))
2023 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
2024 VD->hasAttr<CUDAConstantAttr>() ||
2025 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
2026 VD->getType()->isCUDADeviceBuiltinTextureType();
2027 if (NeedsProtected) {
2028 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2034 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2038 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
2042 if (GV->hasDLLExportStorageClass()) {
2045 diag::err_hidden_visibility_dllexport);
2048 diag::err_non_default_visibility_dllimport);
2054 !GV->isDeclarationForLinker())
2059 llvm::GlobalValue *GV) {
2060 if (GV->hasLocalLinkage())
2063 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
2067 if (GV->hasDLLImportStorageClass())
2070 const llvm::Triple &TT = CGM.
getTriple();
2072 if (TT.isOSCygMing()) {
2090 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
2098 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
2102 if (!TT.isOSBinFormatELF())
2108 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2116 return !(CGM.
getLangOpts().SemanticInterposition ||
2121 if (!GV->isDeclarationForLinker())
2127 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2134 if (CGOpts.DirectAccessExternalData) {
2140 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2141 if (!Var->isThreadLocal())
2166 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2168 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2178 if (D->
hasAttr<DLLImportAttr>())
2179 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2180 else if ((D->
hasAttr<DLLExportAttr>() ||
2182 !GV->isDeclarationForLinker())
2183 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2203 GV->setPartition(CodeGenOpts.SymbolPartition);
2207 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2208 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2209 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2210 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2211 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2214llvm::GlobalVariable::ThreadLocalMode
2216 switch (CodeGenOpts.getDefaultTLSModel()) {
2218 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2220 return llvm::GlobalVariable::LocalDynamicTLSModel;
2222 return llvm::GlobalVariable::InitialExecTLSModel;
2224 return llvm::GlobalVariable::LocalExecTLSModel;
2226 llvm_unreachable(
"Invalid TLS model!");
2230 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2232 llvm::GlobalValue::ThreadLocalMode TLM;
2236 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2240 GV->setThreadLocalMode(TLM);
2246 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2250 const CPUSpecificAttr *
Attr,
2272 bool OmitMultiVersionMangling =
false) {
2274 llvm::raw_svector_ostream Out(Buffer);
2283 assert(II &&
"Attempt to mangle unnamed decl.");
2284 const auto *FD = dyn_cast<FunctionDecl>(ND);
2289 Out <<
"__regcall4__" << II->
getName();
2291 Out <<
"__regcall3__" << II->
getName();
2292 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2294 Out <<
"__device_stub__" << II->
getName();
2296 DeviceKernelAttr::isOpenCLSpelling(
2297 FD->getAttr<DeviceKernelAttr>()) &&
2299 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2315 "Hash computed when not explicitly requested");
2319 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2320 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2321 switch (FD->getMultiVersionKind()) {
2325 FD->getAttr<CPUSpecificAttr>(),
2329 auto *
Attr = FD->getAttr<TargetAttr>();
2330 assert(
Attr &&
"Expected TargetAttr to be present "
2331 "for attribute mangling");
2337 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2338 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2339 "for attribute mangling");
2345 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2346 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2347 "for attribute mangling");
2354 llvm_unreachable(
"None multiversion type isn't valid here");
2364 return std::string(Out.str());
2367void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2368 const FunctionDecl *FD,
2369 StringRef &CurName) {
2376 std::string NonTargetName =
2384 "Other GD should now be a multiversioned function");
2394 if (OtherName != NonTargetName) {
2397 const auto ExistingRecord = Manglings.find(NonTargetName);
2398 if (ExistingRecord != std::end(Manglings))
2399 Manglings.remove(&(*ExistingRecord));
2400 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2405 CurName = OtherNameRef;
2407 Entry->setName(OtherName);
2417 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2431 auto FoundName = MangledDeclNames.find(CanonicalGD);
2432 if (FoundName != MangledDeclNames.end())
2433 return FoundName->second;
2470 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2471 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2480 llvm::raw_svector_ostream Out(Buffer);
2483 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2484 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2486 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2491 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2492 return Result.first->first();
2496 auto it = MangledDeclNames.begin();
2497 while (it != MangledDeclNames.end()) {
2498 if (it->second == Name)
2513 llvm::Constant *AssociatedData) {
2515 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2521 bool IsDtorAttrFunc) {
2522 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2524 DtorsUsingAtExit[Priority].push_back(Dtor);
2529 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2532void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2533 if (Fns.empty())
return;
2539 llvm::PointerType *PtrTy = llvm::PointerType::get(
2540 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2543 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2547 auto Ctors = Builder.beginArray(CtorStructTy);
2548 for (
const auto &I : Fns) {
2549 auto Ctor = Ctors.beginStruct(CtorStructTy);
2550 Ctor.addInt(
Int32Ty, I.Priority);
2551 if (InitFiniAuthSchema) {
2552 llvm::Constant *StorageAddress =
2554 ? llvm::ConstantExpr::getIntToPtr(
2555 llvm::ConstantInt::get(
2557 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2561 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2562 llvm::ConstantInt::get(
2564 Ctor.add(SignedCtorPtr);
2566 Ctor.add(I.Initializer);
2568 if (I.AssociatedData)
2569 Ctor.add(I.AssociatedData);
2571 Ctor.addNullPointer(PtrTy);
2572 Ctor.finishAndAddTo(Ctors);
2575 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2577 llvm::GlobalValue::AppendingLinkage);
2581 List->setAlignment(std::nullopt);
2586llvm::GlobalValue::LinkageTypes
2592 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2599 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2600 if (!MDS)
return nullptr;
2602 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2609 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2610 if (!UD->
hasAttr<TransparentUnionAttr>())
2612 if (!UD->
fields().empty())
2613 return UD->
fields().begin()->getType();
2622 bool GeneralizePointers) {
2635 bool GeneralizePointers) {
2638 for (
auto &Param : FnType->param_types())
2639 GeneralizedParams.push_back(
2643 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2644 GeneralizedParams, FnType->getExtProtoInfo());
2649 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2651 llvm_unreachable(
"Encountered unknown FunctionType");
2659 FnType->getReturnType(), FnType->getParamTypes(),
2660 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2662 std::string OutName;
2663 llvm::raw_string_ostream Out(OutName);
2671 Out <<
".normalized";
2673 Out <<
".generalized";
2675 return llvm::ConstantInt::get(
2681 llvm::Function *F,
bool IsThunk) {
2683 llvm::AttributeList PAL;
2686 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2690 Loc = D->getLocation();
2692 Error(Loc,
"__vectorcall calling convention is not currently supported");
2694 F->setAttributes(PAL);
2695 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2699 std::string ReadOnlyQual(
"__read_only");
2700 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2701 if (ReadOnlyPos != std::string::npos)
2703 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2705 std::string WriteOnlyQual(
"__write_only");
2706 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2707 if (WriteOnlyPos != std::string::npos)
2708 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2710 std::string ReadWriteQual(
"__read_write");
2711 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2712 if (ReadWritePos != std::string::npos)
2713 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2746 assert(((FD && CGF) || (!FD && !CGF)) &&
2747 "Incorrect use - FD and CGF should either be both null or not!");
2773 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2776 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2781 std::string typeQuals;
2785 const Decl *PDecl = parm;
2787 PDecl = TD->getDecl();
2788 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2789 if (A && A->isWriteOnly())
2790 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2791 else if (A && A->isReadWrite())
2792 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2794 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2796 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2798 auto getTypeSpelling = [&](
QualType Ty) {
2799 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2801 if (Ty.isCanonical()) {
2802 StringRef typeNameRef = typeName;
2804 if (typeNameRef.consume_front(
"unsigned "))
2805 return std::string(
"u") + typeNameRef.str();
2806 if (typeNameRef.consume_front(
"signed "))
2807 return typeNameRef.str();
2817 addressQuals.push_back(
2818 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2822 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2823 std::string baseTypeName =
2825 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2826 argBaseTypeNames.push_back(
2827 llvm::MDString::get(VMContext, baseTypeName));
2831 typeQuals =
"restrict";
2834 typeQuals += typeQuals.empty() ?
"const" :
" const";
2836 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2838 uint32_t AddrSpc = 0;
2843 addressQuals.push_back(
2844 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2848 std::string typeName = getTypeSpelling(ty);
2860 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2861 argBaseTypeNames.push_back(
2862 llvm::MDString::get(VMContext, baseTypeName));
2867 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2871 Fn->setMetadata(
"kernel_arg_addr_space",
2872 llvm::MDNode::get(VMContext, addressQuals));
2873 Fn->setMetadata(
"kernel_arg_access_qual",
2874 llvm::MDNode::get(VMContext, accessQuals));
2875 Fn->setMetadata(
"kernel_arg_type",
2876 llvm::MDNode::get(VMContext, argTypeNames));
2877 Fn->setMetadata(
"kernel_arg_base_type",
2878 llvm::MDNode::get(VMContext, argBaseTypeNames));
2879 Fn->setMetadata(
"kernel_arg_type_qual",
2880 llvm::MDNode::get(VMContext, argTypeQuals));
2884 Fn->setMetadata(
"kernel_arg_name",
2885 llvm::MDNode::get(VMContext, argNames));
2895 if (!LangOpts.Exceptions)
return false;
2898 if (LangOpts.CXXExceptions)
return true;
2901 if (LangOpts.ObjCExceptions) {
2921SmallVector<const CXXRecordDecl *, 0>
2923 llvm::SetVector<const CXXRecordDecl *> MostBases;
2928 MostBases.insert(RD);
2930 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2932 CollectMostBases(RD);
2933 return MostBases.takeVector();
2937 llvm::Function *F) {
2938 llvm::AttrBuilder B(F->getContext());
2940 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2941 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2943 if (CodeGenOpts.StackClashProtector)
2944 B.addAttribute(
"probe-stack",
"inline-asm");
2946 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2947 B.addAttribute(
"stack-probe-size",
2948 std::to_string(CodeGenOpts.StackProbeSize));
2951 B.addAttribute(llvm::Attribute::NoUnwind);
2953 if (std::optional<llvm::Attribute::AttrKind>
Attr =
2955 B.addAttribute(*
Attr);
2960 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2961 B.addAttribute(llvm::Attribute::AlwaysInline);
2965 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2967 B.addAttribute(llvm::Attribute::NoInline);
2975 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2976 B.addAttribute(
"aarch64_pstate_sm_body");
2979 if (
Attr->isNewZA())
2980 B.addAttribute(
"aarch64_new_za");
2981 if (
Attr->isNewZT0())
2982 B.addAttribute(
"aarch64_new_zt0");
2987 bool ShouldAddOptNone =
2988 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2990 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
2991 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
2994 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
2995 !D->
hasAttr<NoInlineAttr>()) {
2996 B.addAttribute(llvm::Attribute::AlwaysInline);
2997 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
2998 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3000 B.addAttribute(llvm::Attribute::OptimizeNone);
3003 B.addAttribute(llvm::Attribute::NoInline);
3008 B.addAttribute(llvm::Attribute::Naked);
3011 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
3012 F->removeFnAttr(llvm::Attribute::MinSize);
3013 }
else if (D->
hasAttr<NakedAttr>()) {
3015 B.addAttribute(llvm::Attribute::Naked);
3016 B.addAttribute(llvm::Attribute::NoInline);
3017 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
3018 B.addAttribute(llvm::Attribute::NoDuplicate);
3019 }
else if (D->
hasAttr<NoInlineAttr>() &&
3020 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3022 B.addAttribute(llvm::Attribute::NoInline);
3023 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
3024 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
3026 B.addAttribute(llvm::Attribute::AlwaysInline);
3030 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
3031 B.addAttribute(llvm::Attribute::NoInline);
3035 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3038 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
3039 return Redecl->isInlineSpecified();
3041 if (any_of(FD->
redecls(), CheckRedeclForInline))
3046 return any_of(Pattern->
redecls(), CheckRedeclForInline);
3048 if (CheckForInline(FD)) {
3049 B.addAttribute(llvm::Attribute::InlineHint);
3050 }
else if (CodeGenOpts.getInlining() ==
3053 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3054 B.addAttribute(llvm::Attribute::NoInline);
3061 if (!D->
hasAttr<OptimizeNoneAttr>()) {
3063 if (!ShouldAddOptNone)
3064 B.addAttribute(llvm::Attribute::OptimizeForSize);
3065 B.addAttribute(llvm::Attribute::Cold);
3068 B.addAttribute(llvm::Attribute::Hot);
3069 if (D->
hasAttr<MinSizeAttr>())
3070 B.addAttribute(llvm::Attribute::MinSize);
3075 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
3076 B.addAttribute(llvm::Attribute::NoOutline);
3080 llvm::MaybeAlign ExplicitAlignment;
3081 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
3082 ExplicitAlignment = llvm::Align(alignment);
3083 else if (LangOpts.FunctionAlignment)
3084 ExplicitAlignment = llvm::Align(1ull << LangOpts.FunctionAlignment);
3086 if (ExplicitAlignment) {
3087 F->setAlignment(ExplicitAlignment);
3088 F->setPreferredAlignment(ExplicitAlignment);
3089 }
else if (LangOpts.PreferredFunctionAlignment) {
3090 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
3099 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
3104 if (CodeGenOpts.SanitizeCfiCrossDso &&
3105 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
3106 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3114 if (CodeGenOpts.CallGraphSection) {
3115 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3122 auto *MD = dyn_cast<CXXMethodDecl>(D);
3125 llvm::Metadata *Id =
3127 MD->getType(), std::nullopt,
Base));
3128 F->addTypeMetadata(0, Id);
3135 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
3136 if (FD->
hasAttr<SYCLExternalAttr>())
3137 addSYCLModuleIdAttr(F);
3141void CodeGenModule::addSYCLModuleIdAttr(llvm::Function *Fn) {
3143 Fn->addFnAttr(
"sycl-module-id",
getModule().getModuleIdentifier());
3148 if (isa_and_nonnull<NamedDecl>(D))
3151 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3153 if (D && D->
hasAttr<UsedAttr>())
3156 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3158 ((CodeGenOpts.KeepPersistentStorageVariables &&
3159 (VD->getStorageDuration() ==
SD_Static ||
3160 VD->getStorageDuration() ==
SD_Thread)) ||
3161 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3162 VD->getType().isConstQualified())))
3167static std::vector<std::string>
3169 llvm::StringMap<bool> &FeatureMap) {
3170 llvm::StringMap<bool> DefaultFeatureMap;
3174 std::vector<std::string> Delta;
3175 for (
const auto &[K,
V] : FeatureMap) {
3176 auto DefaultIt = DefaultFeatureMap.find(K);
3177 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3178 Delta.push_back((
V ?
"+" :
"-") + K.str());
3184bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3185 llvm::AttrBuilder &Attrs,
3186 bool SetTargetFeatures) {
3192 std::vector<std::string> Features;
3193 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3196 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3197 assert((!TD || !TV) &&
"both target_version and target specified");
3200 bool AddedAttr =
false;
3201 if (TD || TV || SD || TC) {
3202 llvm::StringMap<bool> FeatureMap;
3209 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3212 if (!FeatureStr.empty()) {
3213 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3214 if (!ParsedAttr.
CPU.empty() &&
3216 TargetCPU = ParsedAttr.
CPU;
3219 if (!ParsedAttr.
Tune.empty() &&
3221 TuneCPU = ParsedAttr.
Tune;
3237 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3238 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3239 Entry.getKey().str());
3245 llvm::StringMap<bool> FeatureMap;
3259 if (!TargetCPU.empty()) {
3260 Attrs.addAttribute(
"target-cpu", TargetCPU);
3263 if (!TuneCPU.empty()) {
3264 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3267 if (!Features.empty() && SetTargetFeatures) {
3268 llvm::erase_if(Features, [&](
const std::string& F) {
3271 llvm::sort(Features);
3272 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3277 llvm::SmallVector<StringRef, 8> Feats;
3278 bool IsDefault =
false;
3280 IsDefault = TV->isDefaultVersion();
3281 TV->getFeatures(Feats);
3287 Attrs.addAttribute(
"fmv-features");
3289 }
else if (!Feats.empty()) {
3291 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3292 std::string FMVFeatures;
3293 for (StringRef F : OrderedFeats)
3294 FMVFeatures.append(
"," + F.str());
3295 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3302void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3303 llvm::GlobalObject *GO) {
3308 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3311 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3312 GV->addAttribute(
"bss-section", SA->getName());
3313 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3314 GV->addAttribute(
"data-section", SA->getName());
3315 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3316 GV->addAttribute(
"rodata-section", SA->getName());
3317 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3318 GV->addAttribute(
"relro-section", SA->getName());
3321 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3324 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3325 if (!D->
getAttr<SectionAttr>())
3326 F->setSection(SA->getName());
3328 llvm::AttrBuilder Attrs(F->getContext());
3329 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3333 llvm::AttributeMask RemoveAttrs;
3334 RemoveAttrs.addAttribute(
"target-cpu");
3335 RemoveAttrs.addAttribute(
"target-features");
3336 RemoveAttrs.addAttribute(
"fmv-features");
3337 RemoveAttrs.addAttribute(
"tune-cpu");
3338 F->removeFnAttrs(RemoveAttrs);
3339 F->addFnAttrs(Attrs);
3343 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3344 GO->setSection(CSA->getName());
3345 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3346 GO->setSection(SA->getName());
3359 F->setLinkage(llvm::Function::InternalLinkage);
3361 setNonAliasAttributes(GD, F);
3372 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3376 llvm::MDNode *MD = F->getMetadata(llvm::LLVMContext::MD_type);
3377 return MD && MD->hasGeneralizedMDString();
3381 llvm::Function *F) {
3388 if (!F->hasLocalLinkage() ||
3389 F->getFunction().hasAddressTaken(
nullptr,
true,
3396 llvm::Function *F) {
3398 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3409 F->addTypeMetadata(0, MD);
3418 if (CodeGenOpts.SanitizeCfiCrossDso)
3420 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3424 llvm::CallBase *CB) {
3429 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall() ||
3434 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
3435 getLLVMContext(), {llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
3438 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3439 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3443 llvm::LLVMContext &Ctx = F->getContext();
3444 llvm::MDBuilder MDB(Ctx);
3445 llvm::StringRef Salt;
3448 if (
const auto &Info = FP->getExtraAttributeInfo())
3449 Salt = Info.CFISalt;
3451 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3460 return llvm::all_of(Name, [](
const char &
C) {
3461 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3467 for (
auto &F : M.functions()) {
3469 bool AddressTaken = F.hasAddressTaken();
3470 if (!AddressTaken && F.hasLocalLinkage())
3471 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3476 if (!AddressTaken || !F.isDeclaration())
3479 const llvm::ConstantInt *
Type;
3480 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3481 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3485 StringRef Name = F.getName();
3489 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3490 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3491 Twine(
Type->getSExtValue()) +
" */\n")
3493 M.appendModuleInlineAsm(
Asm);
3497void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3498 bool IsIncompleteFunction,
3501 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3509 if (!IsIncompleteFunction)
3516 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3518 assert(!F->arg_empty() &&
3519 F->arg_begin()->getType()
3520 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3521 "unexpected this return");
3522 F->addParamAttr(0, llvm::Attribute::Returned);
3532 if (!IsIncompleteFunction && F->isDeclaration())
3535 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3536 F->setSection(CSA->getName());
3537 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3538 F->setSection(SA->getName());
3540 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3542 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3543 else if (EA->isWarning())
3544 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3549 const FunctionDecl *FDBody;
3550 bool HasBody = FD->
hasBody(FDBody);
3552 assert(HasBody &&
"Inline builtin declarations should always have an "
3554 if (shouldEmitFunction(FDBody))
3555 F->addFnAttr(llvm::Attribute::NoBuiltin);
3561 F->addFnAttr(llvm::Attribute::NoBuiltin);
3565 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3566 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3567 if (MD->isVirtual())
3568 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3574 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3575 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3578 if (CodeGenOpts.CallGraphSection)
3581 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3587 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3588 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3590 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3594 llvm::LLVMContext &Ctx = F->getContext();
3595 llvm::MDBuilder MDB(Ctx);
3599 int CalleeIdx = *CB->encoding_begin();
3600 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3601 F->addMetadata(llvm::LLVMContext::MD_callback,
3602 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3603 CalleeIdx, PayloadIndices,
3610 "Only globals with definition can force usage.");
3611 LLVMUsed.emplace_back(GV);
3615 assert(!GV->isDeclaration() &&
3616 "Only globals with definition can force usage.");
3617 LLVMCompilerUsed.emplace_back(GV);
3622 "Only globals with definition can force usage.");
3624 LLVMCompilerUsed.emplace_back(GV);
3626 LLVMUsed.emplace_back(GV);
3630 std::vector<llvm::WeakTrackingVH> &List) {
3637 UsedArray.resize(List.size());
3638 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3640 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3644 if (UsedArray.empty())
3646 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3648 auto *GV =
new llvm::GlobalVariable(
3649 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3650 llvm::ConstantArray::get(ATy, UsedArray), Name);
3652 GV->setSection(
"llvm.metadata");
3655void CodeGenModule::emitLLVMUsed() {
3656 emitUsed(*
this,
"llvm.used", LLVMUsed);
3657 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3662 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3671 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3677 ELFDependentLibraries.push_back(
3678 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3685 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3694 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3700 if (Visited.insert(Import).second)
3717 if (LL.IsFramework) {
3718 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3719 llvm::MDString::get(Context, LL.Library)};
3721 Metadata.push_back(llvm::MDNode::get(Context, Args));
3727 llvm::Metadata *Args[2] = {
3728 llvm::MDString::get(Context,
"lib"),
3729 llvm::MDString::get(Context, LL.Library),
3731 Metadata.push_back(llvm::MDNode::get(Context, Args));
3735 auto *OptString = llvm::MDString::get(Context, Opt);
3736 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3741void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3743 "We should only emit module initializers for named modules.");
3751 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3768 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
3774void CodeGenModule::EmitModuleLinkOptions() {
3778 llvm::SetVector<clang::Module *> LinkModules;
3779 llvm::SmallPtrSet<clang::Module *, 16> Visited;
3780 SmallVector<clang::Module *, 16> Stack;
3783 for (
Module *M : ImportedModules) {
3786 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3789 if (Visited.insert(M).second)
3795 while (!Stack.empty()) {
3798 bool AnyChildren =
false;
3807 if (Visited.insert(
SM).second) {
3808 Stack.push_back(
SM);
3816 LinkModules.insert(Mod);
3823 SmallVector<llvm::MDNode *, 16> MetadataArgs;
3825 for (
Module *M : LinkModules)
3826 if (Visited.insert(M).second)
3828 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3829 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3832 if (!LinkerOptionsMetadata.empty()) {
3833 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3834 for (
auto *MD : LinkerOptionsMetadata)
3835 NMD->addOperand(MD);
3839void CodeGenModule::EmitDeferred() {
3848 if (!DeferredVTables.empty()) {
3849 EmitDeferredVTables();
3854 assert(DeferredVTables.empty());
3861 llvm::append_range(DeferredDeclsToEmit,
3865 if (DeferredDeclsToEmit.empty())
3870 std::vector<GlobalDecl> CurDeclsToEmit;
3871 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3873 for (GlobalDecl &D : CurDeclsToEmit) {
3879 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
3883 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
3899 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3917 if (!GV->isDeclaration())
3921 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3925 EmitGlobalDefinition(D, GV);
3930 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3932 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3937void CodeGenModule::EmitVTablesOpportunistically() {
3943 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3944 &&
"Only emit opportunistic vtables with optimizations");
3946 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
3948 "This queue should only contain external vtables");
3949 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3950 VTables.GenerateClassData(RD);
3952 OpportunisticVTables.clear();
3956 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3961 DeferredAnnotations.clear();
3963 if (Annotations.empty())
3967 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3968 Annotations[0]->
getType(), Annotations.size()), Annotations);
3969 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3970 llvm::GlobalValue::AppendingLinkage,
3971 Array,
"llvm.global.annotations");
3976 llvm::Constant *&AStr = AnnotationStrings[Str];
3981 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3982 auto *gv =
new llvm::GlobalVariable(
3983 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3984 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3987 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4004 SM.getExpansionLineNumber(L);
4005 return llvm::ConstantInt::get(
Int32Ty, LineNo);
4013 llvm::FoldingSetNodeID ID;
4014 for (
Expr *E : Exprs) {
4017 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
4022 LLVMArgs.reserve(Exprs.size());
4024 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
4026 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
4029 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
4030 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
4031 llvm::GlobalValue::PrivateLinkage,
Struct,
4034 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4041 const AnnotateAttr *AA,
4049 llvm::Constant *GVInGlobalsAS = GV;
4050 if (GV->getAddressSpace() !=
4052 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
4054 llvm::PointerType::get(
4055 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
4059 llvm::Constant *Fields[] = {
4060 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
4062 return llvm::ConstantStruct::getAnon(Fields);
4066 llvm::GlobalValue *GV) {
4067 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
4077 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
4080 auto &
SM = Context.getSourceManager();
4082 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
4087 return NoSanitizeL.containsLocation(Kind, Loc);
4090 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
4094 llvm::GlobalVariable *GV,
4096 StringRef Category)
const {
4098 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
4100 auto &
SM = Context.getSourceManager();
4101 if (NoSanitizeL.containsMainFile(
4102 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
4105 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
4112 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
4113 Ty = AT->getElementType();
4118 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4126 StringRef Category)
const {
4129 auto Attr = ImbueAttr::NONE;
4131 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4132 if (
Attr == ImbueAttr::NONE)
4133 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4135 case ImbueAttr::NONE:
4137 case ImbueAttr::ALWAYS:
4138 Fn->addFnAttr(
"function-instrument",
"xray-always");
4140 case ImbueAttr::ALWAYS_ARG1:
4141 Fn->addFnAttr(
"function-instrument",
"xray-always");
4142 Fn->addFnAttr(
"xray-log-args",
"1");
4144 case ImbueAttr::NEVER:
4145 Fn->addFnAttr(
"function-instrument",
"xray-never");
4158 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4168 auto &
SM = Context.getSourceManager();
4169 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
4183 if (NumGroups > 1) {
4184 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4193 if (LangOpts.EmitAllDecls)
4196 const auto *VD = dyn_cast<VarDecl>(
Global);
4198 ((CodeGenOpts.KeepPersistentStorageVariables &&
4199 (VD->getStorageDuration() ==
SD_Static ||
4200 VD->getStorageDuration() ==
SD_Thread)) ||
4201 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4202 VD->getType().isConstQualified())))
4215 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4216 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4217 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4218 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4222 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4232 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4239 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4240 if (Context.getInlineVariableDefinitionKind(VD) ==
4245 if (CXX20ModuleInits && VD->getOwningModule() &&
4246 !VD->getOwningModule()->isModuleMapModule()) {
4255 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4258 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4271 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4275 llvm::Constant *
Init;
4278 if (!
V.isAbsent()) {
4289 llvm::Constant *Fields[4] = {
4293 llvm::ConstantDataArray::getRaw(
4294 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4296 Init = llvm::ConstantStruct::getAnon(Fields);
4299 auto *GV =
new llvm::GlobalVariable(
4301 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4303 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4306 if (!
V.isAbsent()) {
4319 llvm::GlobalVariable **Entry =
nullptr;
4320 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4325 llvm::Constant *
Init;
4329 assert(!
V.isAbsent());
4333 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4335 llvm::GlobalValue::PrivateLinkage,
Init,
4337 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4351 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4355 llvm::Constant *
Init =
Emitter.emitForInitializer(
4363 llvm::GlobalValue::LinkageTypes
Linkage =
4365 ? llvm::GlobalValue::LinkOnceODRLinkage
4366 : llvm::GlobalValue::InternalLinkage;
4367 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4371 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4378 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4379 assert(AA &&
"No alias?");
4389 llvm::Constant *Aliasee;
4391 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4399 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4400 WeakRefReferences.insert(F);
4408 if (
auto *A = D->
getAttr<AttrT>())
4409 return A->isImplicit();
4416 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4419 const auto *AA =
Global->getAttr<AliasAttr>();
4427 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4428 if (LangOpts.OpenMPIsTargetDevice)
4429 return !AliaseeDecl ||
4430 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4433 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4434 const bool AliaseeHasDeviceAttr =
4435 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4437 if (LangOpts.CUDAIsDevice)
4438 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4445bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4446 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4451 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4452 Global->hasAttr<CUDAConstantAttr>() ||
4453 Global->hasAttr<CUDASharedAttr>() ||
4454 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4455 Global->getType()->isCUDADeviceBuiltinTextureType();
4462 if (
Global->hasAttr<WeakRefAttr>())
4467 if (
Global->hasAttr<AliasAttr>()) {
4470 return EmitAliasDefinition(GD);
4474 if (
Global->hasAttr<IFuncAttr>())
4475 return emitIFuncDefinition(GD);
4478 if (
Global->hasAttr<CPUDispatchAttr>())
4479 return emitCPUDispatchDefinition(GD);
4484 if (LangOpts.CUDA) {
4486 "Expected Variable or Function");
4487 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4488 if (!shouldEmitCUDAGlobalVar(VD))
4490 }
else if (LangOpts.CUDAIsDevice) {
4491 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4492 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4493 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4497 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4498 !
Global->hasAttr<CUDAGlobalAttr>() &&
4500 !
Global->hasAttr<CUDAHostAttr>()))
4503 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4504 Global->hasAttr<CUDADeviceAttr>())
4508 if (LangOpts.OpenMP) {
4510 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4512 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4513 if (MustBeEmitted(
Global))
4517 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4518 if (MustBeEmitted(
Global))
4525 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4526 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4532 if (FD->
hasAttr<AnnotateAttr>()) {
4535 DeferredAnnotations[MangledName] = FD;
4550 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4556 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4558 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4559 if (LangOpts.OpenMP) {
4561 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4562 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4566 if (VD->hasExternalStorage() &&
4567 Res != OMPDeclareTargetDeclAttr::MT_Link)
4570 bool UnifiedMemoryEnabled =
4572 if (*Res == OMPDeclareTargetDeclAttr::MT_Local ||
4573 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4574 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4575 !UnifiedMemoryEnabled)) {
4578 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4579 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4580 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4581 UnifiedMemoryEnabled)) &&
4582 "Link clause or to clause with unified memory expected.");
4592 if (LangOpts.HLSL) {
4593 if (VD->getStorageClass() ==
SC_Extern) {
4602 if (Context.getInlineVariableDefinitionKind(VD) ==
4612 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4614 EmitGlobalDefinition(GD);
4615 addEmittedDeferredDecl(GD);
4623 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4624 CXXGlobalInits.push_back(
nullptr);
4630 addDeferredDeclToEmit(GD);
4631 }
else if (MustBeEmitted(
Global)) {
4633 assert(!MayBeEmittedEagerly(
Global));
4634 addDeferredDeclToEmit(GD);
4639 DeferredDecls[MangledName] = GD;
4645 if (
const auto *RT =
4646 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4647 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4648 RD = RD->getDefinitionOrSelf();
4649 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4657 struct FunctionIsDirectlyRecursive
4658 :
public ConstStmtVisitor<FunctionIsDirectlyRecursive, bool> {
4659 const StringRef Name;
4660 const Builtin::Context &BI;
4661 FunctionIsDirectlyRecursive(StringRef N,
const Builtin::Context &
C)
4664 bool VisitCallExpr(
const CallExpr *E) {
4668 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4669 if (Attr && Name == Attr->getLabel())
4674 std::string BuiltinNameStr = BI.
getName(BuiltinID);
4675 StringRef BuiltinName = BuiltinNameStr;
4676 return BuiltinName.consume_front(
"__builtin_") && Name == BuiltinName;
4679 bool VisitStmt(
const Stmt *S) {
4680 for (
const Stmt *Child : S->
children())
4681 if (Child && this->Visit(Child))
4688 struct DLLImportFunctionVisitor
4689 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4690 bool SafeToInline =
true;
4692 bool shouldVisitImplicitCode()
const {
return true; }
4694 bool VisitVarDecl(VarDecl *VD) {
4697 SafeToInline =
false;
4698 return SafeToInline;
4705 return SafeToInline;
4708 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4710 SafeToInline = D->
hasAttr<DLLImportAttr>();
4711 return SafeToInline;
4714 bool VisitDeclRefExpr(DeclRefExpr *E) {
4717 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4718 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4719 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4720 return SafeToInline;
4723 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4725 return SafeToInline;
4728 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4732 SafeToInline =
true;
4734 SafeToInline = M->
hasAttr<DLLImportAttr>();
4736 return SafeToInline;
4739 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4741 return SafeToInline;
4744 bool VisitCXXNewExpr(CXXNewExpr *E) {
4746 return SafeToInline;
4755CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4757 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4759 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4762 Name = Attr->getLabel();
4767 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
4768 const Stmt *Body = FD->
getBody();
4769 return Body ? Walker.Visit(Body) :
false;
4772bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4779 if (F->isInlineBuiltinDeclaration())
4782 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4787 if (
const Module *M = F->getOwningModule();
4788 M && M->getTopLevelModule()->isNamedModule() &&
4789 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4799 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4804 if (F->hasAttr<NoInlineAttr>())
4807 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4809 DLLImportFunctionVisitor Visitor;
4810 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4811 if (!Visitor.SafeToInline)
4814 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4817 for (
const Decl *
Member : Dtor->getParent()->decls())
4821 for (
const CXXBaseSpecifier &B : Dtor->getParent()->bases())
4832 return !isTriviallyRecursive(F);
4835bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4836 return CodeGenOpts.OptimizationLevel > 0;
4839void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
4840 llvm::GlobalValue *GV) {
4844 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4845 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4847 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4848 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4849 if (TC->isFirstOfVersion(I))
4852 EmitGlobalFunctionDefinition(GD, GV);
4858 AddDeferredMultiVersionResolverToEmit(GD);
4860 GetOrCreateMultiVersionResolver(GD);
4864void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
4867 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
4868 Context.getSourceManager(),
4869 "Generating code for declaration");
4871 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4874 if (!shouldEmitFunction(GD))
4877 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4879 llvm::raw_string_ostream
OS(Name);
4885 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4889 ABI->emitCXXStructor(GD);
4891 EmitMultiVersionFunctionDefinition(GD, GV);
4893 EmitGlobalFunctionDefinition(GD, GV);
4902 return EmitMultiVersionFunctionDefinition(GD, GV);
4903 return EmitGlobalFunctionDefinition(GD, GV);
4906 if (
const auto *VD = dyn_cast<VarDecl>(D))
4907 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4909 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4913 llvm::Function *NewFn);
4929static llvm::GlobalValue::LinkageTypes
4933 return llvm::GlobalValue::InternalLinkage;
4934 return llvm::GlobalValue::WeakODRLinkage;
4937void CodeGenModule::emitMultiVersionFunctions() {
4938 std::vector<GlobalDecl> MVFuncsToEmit;
4939 MultiVersionFuncs.swap(MVFuncsToEmit);
4940 for (GlobalDecl GD : MVFuncsToEmit) {
4942 assert(FD &&
"Expected a FunctionDecl");
4944 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
4945 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
4949 if (
Decl->isDefined()) {
4950 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4958 assert(
Func &&
"This should have just been created");
4966 bool ShouldEmitResolver = !
getTriple().isAArch64();
4967 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4968 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
4971 FD, [&](
const FunctionDecl *CurFD) {
4972 llvm::SmallVector<StringRef, 8> Feats;
4975 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4977 TA->getX86AddedFeatures(Feats);
4978 llvm::Function *
Func = createFunction(CurFD);
4979 DeclMap.insert({
Func, CurFD});
4980 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
4981 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4982 if (TVA->isDefaultVersion() && IsDefined)
4983 ShouldEmitResolver =
true;
4984 llvm::Function *
Func = createFunction(CurFD);
4985 DeclMap.insert({
Func, CurFD});
4987 TVA->getFeatures(Feats, Delim);
4988 Options.emplace_back(
Func, Feats);
4989 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4990 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4991 if (!TC->isFirstOfVersion(I))
4993 if (TC->isDefaultVersion(I) && IsDefined)
4994 ShouldEmitResolver =
true;
4995 llvm::Function *
Func = createFunction(CurFD, I);
4996 DeclMap.insert({
Func, CurFD});
4999 TC->getX86Feature(Feats, I);
5000 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
5003 TC->getFeatures(Feats, I, Delim);
5004 Options.emplace_back(
Func, Feats);
5008 llvm_unreachable(
"unexpected MultiVersionKind");
5011 if (!ShouldEmitResolver)
5014 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
5015 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
5016 ResolverConstant = IFunc->getResolver();
5021 *
this, GD, FD,
true);
5028 auto *Alias = llvm::GlobalAlias::create(
5030 MangledName +
".ifunc", IFunc, &
getModule());
5039 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
5040 const CodeGenFunction::FMVResolverOption &RHS) {
5046 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
5047 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
5048 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
5049 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
5050 return LHS.isSubsetOf(RHS);
5052 Diags.Report(DeclMap[I->Function]->getLocation(),
5053 diag::warn_unreachable_version)
5054 << I->Function->getName();
5055 assert(I->Function->user_empty() &&
"unexpected users");
5056 I->Function->eraseFromParent();
5057 I->Function =
nullptr;
5061 CodeGenFunction CGF(*
this);
5062 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5064 setMultiVersionResolverAttributes(ResolverFunc, GD);
5066 ResolverFunc->setComdat(
5067 getModule().getOrInsertComdat(ResolverFunc->getName()));
5073 if (!MVFuncsToEmit.empty())
5078 if (!MultiVersionFuncs.empty())
5079 emitMultiVersionFunctions();
5089 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
5091 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
5092 llvm::GlobalVariable::ExternalWeakLinkage,
5094 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5099void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
5100 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
5102 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
5104 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
5105 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
5106 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
5107 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5109 DS->takeName(OldDS);
5110 OldDS->replaceAllUsesWith(DS);
5111 OldDS->eraseFromParent();
5117 llvm::Constant *
New) {
5120 Old->replaceAllUsesWith(
New);
5121 Old->eraseFromParent();
5124void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5126 assert(FD &&
"Not a FunctionDecl?");
5128 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5129 assert(DD &&
"Not a cpu_dispatch Function?");
5135 UpdateMultiVersionNames(GD, FD, ResolverName);
5137 llvm::Type *ResolverType;
5138 GlobalDecl ResolverGD;
5140 ResolverType = llvm::FunctionType::get(
5151 ResolverName, ResolverType, ResolverGD,
false));
5154 ResolverFunc->setComdat(
5155 getModule().getOrInsertComdat(ResolverFunc->getName()));
5157 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5160 for (
const IdentifierInfo *II : DD->cpus()) {
5168 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5171 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5177 Func = GetOrCreateLLVMFunction(
5178 MangledName, DeclTy, ExistingDecl,
5184 llvm::SmallVector<StringRef, 32> Features;
5185 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5186 llvm::transform(Features, Features.begin(),
5187 [](StringRef Str) { return Str.substr(1); });
5188 llvm::erase_if(Features, [&Target](StringRef Feat) {
5189 return !Target.validateCpuSupports(Feat);
5195 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5196 const CodeGenFunction::FMVResolverOption &RHS) {
5197 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5198 llvm::X86::getCpuSupportsMask(RHS.
Features);
5205 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5206 (Options.end() - 2)->Features),
5207 [](
auto X) { return X == 0; })) {
5208 StringRef LHSName = (Options.end() - 2)->Function->getName();
5209 StringRef RHSName = (Options.end() - 1)->Function->getName();
5210 if (LHSName.compare(RHSName) < 0)
5211 Options.erase(Options.end() - 2);
5213 Options.erase(Options.end() - 1);
5216 CodeGenFunction CGF(*
this);
5217 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5218 setMultiVersionResolverAttributes(ResolverFunc, GD);
5223 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5228 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5235 *
this, GD, FD,
true);
5238 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5246void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5248 assert(FD &&
"Not a FunctionDecl?");
5251 std::string MangledName =
5253 if (!DeferredResolversToEmit.insert(MangledName).second)
5256 MultiVersionFuncs.push_back(GD);
5262llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5264 assert(FD &&
"Not a FunctionDecl?");
5266 std::string MangledName =
5271 std::string ResolverName = MangledName;
5275 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5279 ResolverName +=
".ifunc";
5286 ResolverName +=
".resolver";
5289 bool ShouldReturnIFunc =
5308 AddDeferredMultiVersionResolverToEmit(GD);
5312 if (ShouldReturnIFunc) {
5314 llvm::Type *ResolverType = llvm::FunctionType::get(
5316 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5317 MangledName +
".resolver", ResolverType, GlobalDecl{},
5325 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5327 GIF->setName(ResolverName);
5334 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5335 ResolverName, DeclTy, GlobalDecl{},
false);
5337 "Resolver should be created for the first time");
5342void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5344 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5357 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5368bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5369 const llvm::GlobalValue *GV)
const {
5370 auto SC = GV->getDLLStorageClass();
5371 if (SC == llvm::GlobalValue::DefaultStorageClass)
5374 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5375 !MRD->
hasAttr<DLLImportAttr>()) ||
5376 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5377 !MRD->
hasAttr<DLLExportAttr>())) &&
5388llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5389 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5390 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5394 std::string NameWithoutMultiVersionMangling;
5395 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5397 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5398 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5399 !DontDefer && !IsForDefinition) {
5402 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5404 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5407 GDDef = GlobalDecl(FDDef);
5415 UpdateMultiVersionNames(GD, FD, MangledName);
5416 if (!IsForDefinition) {
5422 AddDeferredMultiVersionResolverToEmit(GD);
5424 *
this, GD, FD,
true);
5433 *
this, GD, FD,
true);
5435 return GetOrCreateMultiVersionResolver(GD);
5440 if (!NameWithoutMultiVersionMangling.empty())
5441 MangledName = NameWithoutMultiVersionMangling;
5446 if (WeakRefReferences.erase(Entry)) {
5447 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5448 if (FD && !FD->
hasAttr<WeakAttr>())
5449 Entry->setLinkage(llvm::Function::ExternalLinkage);
5453 if (D && shouldDropDLLAttribute(D, Entry)) {
5454 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5460 if (IsForDefinition && !Entry->isDeclaration()) {
5467 DiagnosedConflictingDefinitions.insert(GD).second) {
5471 diag::note_previous_definition);
5476 (Entry->getValueType() == Ty)) {
5483 if (!IsForDefinition)
5490 bool IsIncompleteFunction =
false;
5492 llvm::FunctionType *FTy;
5496 FTy = llvm::FunctionType::get(
VoidTy,
false);
5497 IsIncompleteFunction =
true;
5501 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5502 Entry ? StringRef() : MangledName, &
getModule());
5506 if (D && D->
hasAttr<AnnotateAttr>())
5524 if (!Entry->use_empty()) {
5526 Entry->removeDeadConstantUsers();
5532 assert(F->getName() == MangledName &&
"name was uniqued!");
5534 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5535 if (ExtraAttrs.hasFnAttrs()) {
5536 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5544 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5547 addDeferredDeclToEmit(GD);
5552 auto DDI = DeferredDecls.find(MangledName);
5553 if (DDI != DeferredDecls.end()) {
5557 addDeferredDeclToEmit(DDI->second);
5558 DeferredDecls.erase(DDI);
5586 if (!IsIncompleteFunction) {
5587 assert(F->getFunctionType() == Ty);
5605 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5615 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5618 DD->getParent()->getNumVBases() == 0)
5623 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5624 false, llvm::AttributeList(),
5627 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5631 if (IsForDefinition)
5639 llvm::GlobalValue *F =
5642 return llvm::NoCFIValue::get(F);
5652 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5655 if (!
C.getLangOpts().CPlusPlus)
5660 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5661 ?
C.Idents.get(
"terminate")
5662 :
C.Idents.get(Name);
5664 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5668 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
5669 for (
const auto *
Result : LSD->lookup(&NS))
5670 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
5675 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5684 llvm::Function *F, StringRef Name) {
5690 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5693 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5694 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5695 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5702 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5703 if (AssumeConvergent) {
5705 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5708 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5713 llvm::Constant *
C = GetOrCreateLLVMFunction(
5715 false,
false, ExtraAttrs);
5717 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5733 llvm::AttributeList ExtraAttrs,
bool Local,
5734 bool AssumeConvergent) {
5735 if (AssumeConvergent) {
5737 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5741 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5745 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5754 markRegisterParameterAttributes(F);
5780 if (WeakRefReferences.erase(Entry)) {
5781 if (D && !D->
hasAttr<WeakAttr>())
5782 Entry->setLinkage(llvm::Function::ExternalLinkage);
5786 if (D && shouldDropDLLAttribute(D, Entry))
5787 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5789 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5792 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5797 if (IsForDefinition && !Entry->isDeclaration()) {
5805 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5807 DiagnosedConflictingDefinitions.insert(D).second) {
5811 diag::note_previous_definition);
5816 if (Entry->getType()->getAddressSpace() != TargetAS)
5817 return llvm::ConstantExpr::getAddrSpaceCast(
5818 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5822 if (!IsForDefinition)
5828 auto *GV =
new llvm::GlobalVariable(
5829 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5830 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5831 getContext().getTargetAddressSpace(DAddrSpace));
5836 GV->takeName(Entry);
5838 if (!Entry->use_empty()) {
5839 Entry->replaceAllUsesWith(GV);
5842 Entry->eraseFromParent();
5848 auto DDI = DeferredDecls.find(MangledName);
5849 if (DDI != DeferredDecls.end()) {
5852 addDeferredDeclToEmit(DDI->second);
5853 DeferredDecls.erase(DDI);
5858 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5865 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
5871 CXXThreadLocals.push_back(D);
5879 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
5880 EmitGlobalVarDefinition(D);
5885 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
5886 GV->setSection(SA->getName());
5890 if (
getTriple().getArch() == llvm::Triple::xcore &&
5894 GV->setSection(
".cp.rodata");
5897 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
5898 GV->setCodeModel(CMA->getModel());
5903 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5907 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
5908 bool HasMutableFields =
Record &&
Record->hasMutableFields();
5909 if (!HasMutableFields) {
5916 auto *InitType =
Init->getType();
5917 if (GV->getValueType() != InitType) {
5922 GV->setName(StringRef());
5927 ->stripPointerCasts());
5930 GV->eraseFromParent();
5933 GV->setInitializer(
Init);
5934 GV->setConstant(
true);
5935 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5955 SanitizerMD->reportGlobal(GV, *D);
5960 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5961 if (DAddrSpace != ExpectedAS)
5974 false, IsForDefinition);
5995 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5996 llvm::Align Alignment) {
5997 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5998 llvm::GlobalVariable *OldGV =
nullptr;
6002 if (GV->getValueType() == Ty)
6007 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
6012 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
6017 GV->takeName(OldGV);
6019 if (!OldGV->use_empty()) {
6020 OldGV->replaceAllUsesWith(GV);
6023 OldGV->eraseFromParent();
6027 !GV->hasAvailableExternallyLinkage())
6028 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6030 GV->setAlignment(Alignment);
6067 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
6075 if (GV && !GV->isDeclaration())
6080 if (!MustBeEmitted(D) && !GV) {
6081 DeferredDecls[MangledName] = D;
6086 EmitGlobalVarDefinition(D);
6091 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
6093 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
6108 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(
Addr)) {
6112 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
6115 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6117 if (!Fn->getSubprogram())
6123 return Context.toCharUnitsFromBits(
6128 if (LangOpts.OpenCL) {
6139 if (LangOpts.SYCLIsDevice &&
6143 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6145 if (D->
hasAttr<CUDAConstantAttr>())
6147 if (D->
hasAttr<CUDASharedAttr>())
6149 if (D->
hasAttr<CUDADeviceAttr>())
6157 if (LangOpts.OpenMP) {
6159 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6167 if (LangOpts.OpenCL)
6169 if (LangOpts.SYCLIsDevice)
6171 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
6179 if (
auto AS =
getTarget().getConstantAddressSpace())
6192static llvm::Constant *
6194 llvm::GlobalVariable *GV) {
6195 llvm::Constant *Cast = GV;
6200 GV, llvm::PointerType::get(
6207template<
typename SomeDecl>
6209 llvm::GlobalValue *GV) {
6224 const SomeDecl *
First = D->getFirstDecl();
6225 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6231 std::pair<StaticExternCMap::iterator, bool> R =
6232 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6237 R.first->second =
nullptr;
6244 if (D.
hasAttr<SelectAnyAttr>())
6248 if (
auto *VD = dyn_cast<VarDecl>(&D))
6262 llvm_unreachable(
"No such linkage");
6270 llvm::GlobalObject &GO) {
6273 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6281void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6296 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6297 OpenMPRuntime->emitTargetGlobalVariable(D))
6300 llvm::TrackingVH<llvm::Constant>
Init;
6301 bool NeedsGlobalCtor =
false;
6305 bool IsDefinitionAvailableExternally =
6307 bool NeedsGlobalDtor =
6308 !IsDefinitionAvailableExternally &&
6315 if (IsDefinitionAvailableExternally &&
6326 std::optional<ConstantEmitter> emitter;
6331 bool IsCUDASharedVar =
6336 bool IsCUDAShadowVar =
6338 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6339 D->
hasAttr<CUDASharedAttr>());
6340 bool IsCUDADeviceShadowVar =
6345 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6346 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6350 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6353 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6354 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6355 }
else if (!InitExpr) {
6368 initializedGlobalDecl = GlobalDecl(D);
6369 emitter.emplace(*
this);
6370 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6372 QualType T = InitExpr->
getType();
6378 if (!IsDefinitionAvailableExternally)
6379 NeedsGlobalCtor =
true;
6383 NeedsGlobalCtor =
false;
6387 Init = llvm::PoisonValue::get(
getTypes().ConvertType(T));
6395 DelayedCXXInitPosition.erase(D);
6402 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6407 llvm::Type* InitType =
Init->getType();
6408 llvm::Constant *Entry =
6412 Entry = Entry->stripPointerCasts();
6415 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6426 if (!GV || GV->getValueType() != InitType ||
6427 GV->getType()->getAddressSpace() !=
6431 Entry->setName(StringRef());
6436 ->stripPointerCasts());
6439 llvm::Constant *NewPtrForOldDecl =
6440 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6442 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6450 if (D->
hasAttr<AnnotateAttr>())
6463 if (LangOpts.CUDA) {
6464 if (LangOpts.CUDAIsDevice) {
6467 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6470 GV->setExternallyInitialized(
true);
6477 if (LangOpts.HLSL &&
6482 GV->setExternallyInitialized(
true);
6484 GV->setInitializer(
Init);
6491 emitter->finalize(GV);
6494 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6495 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6499 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6500 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6502 GV->setConstant(
true);
6507 if (std::optional<CharUnits> AlignValFromAllocate =
6509 AlignVal = *AlignValFromAllocate;
6527 Linkage == llvm::GlobalValue::ExternalLinkage &&
6528 Context.getTargetInfo().getTriple().isOSDarwin() &&
6530 Linkage = llvm::GlobalValue::InternalLinkage;
6535 if (LangOpts.HLSL &&
6537 Linkage = llvm::GlobalValue::ExternalLinkage;
6540 if (D->
hasAttr<DLLImportAttr>())
6541 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6542 else if (D->
hasAttr<DLLExportAttr>())
6543 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6545 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6547 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6549 GV->setConstant(
false);
6554 if (!GV->getInitializer()->isNullValue())
6555 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6558 setNonAliasAttributes(D, GV);
6560 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6562 CXXThreadLocals.push_back(D);
6569 if (NeedsGlobalCtor || NeedsGlobalDtor)
6570 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6572 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6577 DI->EmitGlobalVariable(GV, D);
6585 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6596 if (D->
hasAttr<SectionAttr>())
6602 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6603 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6604 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6605 D->
hasAttr<PragmaClangRodataSectionAttr>())
6613 if (D->
hasAttr<WeakImportAttr>())
6622 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6623 if (D->
hasAttr<AlignedAttr>())
6626 if (Context.isAlignmentRequired(VarType))
6630 for (
const FieldDecl *FD : RD->fields()) {
6631 if (FD->isBitField())
6633 if (FD->
hasAttr<AlignedAttr>())
6635 if (Context.isAlignmentRequired(FD->
getType()))
6647 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6648 Context.getTypeAlignIfKnown(D->
getType()) >
6655llvm::GlobalValue::LinkageTypes
6659 return llvm::Function::InternalLinkage;
6662 return llvm::GlobalVariable::WeakAnyLinkage;
6666 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6671 return llvm::GlobalValue::AvailableExternallyLinkage;
6685 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6686 : llvm::Function::InternalLinkage;
6700 return llvm::Function::ExternalLinkage;
6703 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6704 : llvm::Function::InternalLinkage;
6705 return llvm::Function::WeakODRLinkage;
6712 CodeGenOpts.NoCommon))
6713 return llvm::GlobalVariable::CommonLinkage;
6719 if (D->
hasAttr<SelectAnyAttr>())
6720 return llvm::GlobalVariable::WeakODRLinkage;
6724 return llvm::GlobalVariable::ExternalLinkage;
6727llvm::GlobalValue::LinkageTypes
6736 llvm::Function *newFn) {
6738 if (old->use_empty())
6741 llvm::Type *newRetTy = newFn->getReturnType();
6746 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6748 llvm::User *user = ui->getUser();
6752 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6753 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6759 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6762 if (!callSite->isCallee(&*ui))
6767 if (callSite->getType() != newRetTy && !callSite->use_empty())
6772 llvm::AttributeList oldAttrs = callSite->getAttributes();
6775 unsigned newNumArgs = newFn->arg_size();
6776 if (callSite->arg_size() < newNumArgs)
6782 bool dontTransform =
false;
6783 for (llvm::Argument &A : newFn->args()) {
6784 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6785 dontTransform =
true;
6790 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6798 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6802 callSite->getOperandBundlesAsDefs(newBundles);
6804 llvm::CallBase *newCall;
6806 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6807 callSite->getIterator());
6810 newCall = llvm::InvokeInst::Create(
6811 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6812 newArgs, newBundles,
"", callSite->getIterator());
6816 if (!newCall->getType()->isVoidTy())
6817 newCall->takeName(callSite);
6818 newCall->setAttributes(
6819 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6820 oldAttrs.getRetAttrs(), newArgAttrs));
6821 newCall->setCallingConv(callSite->getCallingConv());
6824 if (!callSite->use_empty())
6825 callSite->replaceAllUsesWith(newCall);
6828 if (callSite->getDebugLoc())
6829 newCall->setDebugLoc(callSite->getDebugLoc());
6831 callSitesToBeRemovedFromParent.push_back(callSite);
6834 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6835 callSite->eraseFromParent();
6849 llvm::Function *NewFn) {
6859 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6871void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6872 llvm::GlobalValue *GV) {
6880 if (!GV || (GV->getValueType() != Ty))
6886 if (!GV->isDeclaration())
6896 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
6897 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
6909 setNonAliasAttributes(GD, Fn);
6911 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
6912 (CodeGenOpts.OptimizationLevel == 0) &&
6915 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
6917 !D->
hasAttr<NoInlineAttr>() &&
6918 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
6919 !D->
hasAttr<OptimizeNoneAttr>() &&
6920 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
6921 !ShouldAddOptNone) {
6922 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
6928 auto GetPriority = [
this](
const auto *
Attr) ->
int {
6933 return Attr->DefaultPriority;
6936 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
6938 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
6944void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
6946 const AliasAttr *AA = D->
getAttr<AliasAttr>();
6947 assert(AA &&
"Not an alias?");
6951 if (AA->getAliasee() == MangledName) {
6952 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6959 if (Entry && !Entry->isDeclaration())
6962 Aliases.push_back(GD);
6968 llvm::Constant *Aliasee;
6969 llvm::GlobalValue::LinkageTypes
LT;
6971 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6977 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6984 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6986 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
6989 if (GA->getAliasee() == Entry) {
6990 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6994 assert(Entry->isDeclaration());
7003 GA->takeName(Entry);
7005 Entry->replaceAllUsesWith(GA);
7006 Entry->eraseFromParent();
7008 GA->setName(MangledName);
7016 GA->setLinkage(llvm::Function::WeakAnyLinkage);
7019 if (
const auto *VD = dyn_cast<VarDecl>(D))
7020 if (VD->getTLSKind())
7031void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
7033 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
7034 assert(IFA &&
"Not an ifunc?");
7038 if (IFA->getResolver() == MangledName) {
7039 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7045 if (Entry && !Entry->isDeclaration()) {
7048 DiagnosedConflictingDefinitions.insert(GD).second) {
7049 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
7052 diag::note_previous_definition);
7057 Aliases.push_back(GD);
7063 llvm::Constant *Resolver =
7064 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
7068 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
7069 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
7071 if (GIF->getResolver() == Entry) {
7072 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7075 assert(Entry->isDeclaration());
7084 GIF->takeName(Entry);
7086 Entry->replaceAllUsesWith(GIF);
7087 Entry->eraseFromParent();
7089 GIF->setName(MangledName);
7095 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
7096 (llvm::Intrinsic::ID)IID, Tys);
7099static llvm::StringMapEntry<llvm::GlobalVariable *> &
7102 bool &IsUTF16,
unsigned &StringLength) {
7103 StringRef String = Literal->getString();
7104 unsigned NumBytes = String.size();
7107 if (!Literal->containsNonAsciiOrNull()) {
7108 StringLength = NumBytes;
7109 return *Map.insert(std::make_pair(String,
nullptr)).first;
7116 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
7117 llvm::UTF16 *ToPtr = &ToBuf[0];
7119 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
7120 ToPtr + NumBytes, llvm::strictConversion);
7123 StringLength = ToPtr - &ToBuf[0];
7127 return *Map.insert(std::make_pair(
7128 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7129 (StringLength + 1) * 2),
7135 unsigned StringLength = 0;
7136 bool isUTF16 =
false;
7137 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7142 if (
auto *
C = Entry.second)
7147 const llvm::Triple &Triple =
getTriple();
7150 const bool IsSwiftABI =
7151 static_cast<unsigned>(CFRuntime) >=
7156 if (!CFConstantStringClassRef) {
7157 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7159 Ty = llvm::ArrayType::get(Ty, 0);
7161 switch (CFRuntime) {
7165 CFConstantStringClassName =
7166 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7167 :
"$s10Foundation19_NSCFConstantStringCN";
7171 CFConstantStringClassName =
7172 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7173 :
"$S10Foundation19_NSCFConstantStringCN";
7177 CFConstantStringClassName =
7178 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7179 :
"__T010Foundation19_NSCFConstantStringCN";
7186 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7187 llvm::GlobalValue *GV =
nullptr;
7189 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7196 if ((VD = dyn_cast<VarDecl>(
Result)))
7199 if (Triple.isOSBinFormatELF()) {
7201 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7203 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7204 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7205 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7207 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7215 CFConstantStringClassRef =
7216 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7219 QualType CFTy = Context.getCFConstantStringType();
7224 auto Fields = Builder.beginStruct(STy);
7233 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7234 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7236 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7240 llvm::Constant *
C =
nullptr;
7243 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7244 Entry.first().size() / 2);
7245 C = llvm::ConstantDataArray::get(VMContext, Arr);
7247 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7253 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7254 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7255 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7258 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7259 : Context.getTypeAlignInChars(Context.CharTy);
7265 if (Triple.isOSBinFormatMachO())
7266 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7267 :
"__TEXT,__cstring,cstring_literals");
7270 else if (Triple.isOSBinFormatELF())
7271 GV->setSection(
".rodata");
7277 llvm::IntegerType *LengthTy =
7287 Fields.addInt(LengthTy, StringLength);
7295 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7297 llvm::GlobalVariable::PrivateLinkage);
7298 GV->addAttribute(
"objc_arc_inert");
7299 switch (Triple.getObjectFormat()) {
7300 case llvm::Triple::UnknownObjectFormat:
7301 llvm_unreachable(
"unknown file format");
7302 case llvm::Triple::DXContainer:
7303 case llvm::Triple::GOFF:
7304 case llvm::Triple::SPIRV:
7305 case llvm::Triple::XCOFF:
7306 llvm_unreachable(
"unimplemented");
7307 case llvm::Triple::COFF:
7308 case llvm::Triple::ELF:
7309 case llvm::Triple::Wasm:
7310 GV->setSection(
"cfstring");
7312 case llvm::Triple::MachO:
7313 GV->setSection(
"__DATA,__cfstring");
7322 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7326 if (ObjCFastEnumerationStateType.isNull()) {
7327 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7331 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7332 Context.getPointerType(Context.UnsignedLongTy),
7333 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7336 for (
size_t i = 0; i < 4; ++i) {
7341 FieldTypes[i],
nullptr,
7350 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7353 return ObjCFastEnumerationStateType;
7367 assert(CAT &&
"String literal not of constant array type!");
7369 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7373 llvm::Type *ElemTy = AType->getElementType();
7374 unsigned NumElements = AType->getNumElements();
7377 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7379 Elements.reserve(NumElements);
7381 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7383 Elements.resize(NumElements);
7384 return llvm::ConstantDataArray::get(VMContext, Elements);
7387 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7389 Elements.reserve(NumElements);
7391 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7393 Elements.resize(NumElements);
7394 return llvm::ConstantDataArray::get(VMContext, Elements);
7397static llvm::GlobalVariable *
7406 auto *GV =
new llvm::GlobalVariable(
7407 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7408 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7410 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7411 if (GV->isWeakForLinker()) {
7412 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7413 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7429 llvm::GlobalVariable **Entry =
nullptr;
7430 if (!LangOpts.WritableStrings) {
7431 Entry = &ConstantStringMap[
C];
7432 if (
auto GV = *Entry) {
7433 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7436 GV->getValueType(), Alignment);
7441 StringRef GlobalVariableName;
7442 llvm::GlobalValue::LinkageTypes LT;
7447 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7448 !LangOpts.WritableStrings) {
7449 llvm::raw_svector_ostream Out(MangledNameBuffer);
7451 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7452 GlobalVariableName = MangledNameBuffer;
7454 LT = llvm::GlobalValue::PrivateLinkage;
7455 GlobalVariableName = Name;
7467 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7470 GV->getValueType(), Alignment);
7487 StringRef GlobalName) {
7488 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7493 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7496 llvm::GlobalVariable **Entry =
nullptr;
7497 if (!LangOpts.WritableStrings) {
7498 Entry = &ConstantStringMap[
C];
7499 if (
auto GV = *Entry) {
7500 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7503 GV->getValueType(), Alignment);
7509 GlobalName, Alignment);
7514 GV->getValueType(), Alignment);
7532 MaterializedType = E->
getType();
7536 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7537 if (!InsertResult.second) {
7540 if (!InsertResult.first->second) {
7545 InsertResult.first->second =
new llvm::GlobalVariable(
7546 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7550 llvm::cast<llvm::GlobalVariable>(
7551 InsertResult.first->second->stripPointerCasts())
7560 llvm::raw_svector_ostream Out(Name);
7582 std::optional<ConstantEmitter> emitter;
7583 llvm::Constant *InitialValue =
nullptr;
7588 emitter.emplace(*
this);
7589 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7594 Type = InitialValue->getType();
7603 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7605 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7609 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7613 Linkage = llvm::GlobalVariable::InternalLinkage;
7617 auto *GV =
new llvm::GlobalVariable(
7619 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7620 if (emitter) emitter->finalize(GV);
7622 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7624 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7626 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7630 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7631 if (VD->getTLSKind())
7633 llvm::Constant *CV = GV;
7636 GV, llvm::PointerType::get(
7642 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7644 Entry->replaceAllUsesWith(CV);
7645 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7654void CodeGenModule::EmitObjCPropertyImplementations(
const
7667 if (!Getter || Getter->isSynthesizedAccessorStub())
7670 auto *Setter = PID->getSetterMethodDecl();
7671 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7682 if (ivar->getType().isDestructedType())
7703void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7716 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7731 getContext().getObjCIdType(),
nullptr, D,
true,
7737 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7742void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7749 EmitDeclContext(LSD);
7752void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7754 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7757 std::unique_ptr<CodeGenFunction> &CurCGF =
7758 GlobalTopLevelStmtBlockInFlight.first;
7762 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7770 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7771 FunctionArgList Args;
7773 const CGFunctionInfo &FnInfo =
7776 llvm::Function *
Fn = llvm::Function::Create(
7777 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7779 CurCGF.reset(
new CodeGenFunction(*
this));
7780 GlobalTopLevelStmtBlockInFlight.second = D;
7781 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7783 CXXGlobalInits.push_back(Fn);
7786 CurCGF->EmitStmt(D->
getStmt());
7789void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7790 for (
auto *I : DC->
decls()) {
7796 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7797 for (
auto *M : OID->methods())
7816 case Decl::CXXConversion:
7817 case Decl::CXXMethod:
7818 case Decl::Function:
7825 case Decl::CXXDeductionGuide:
7830 case Decl::Decomposition:
7831 case Decl::VarTemplateSpecialization:
7833 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
7834 for (
auto *B : DD->flat_bindings())
7835 if (
auto *HD = B->getHoldingVar())
7842 case Decl::IndirectField:
7846 case Decl::Namespace:
7849 case Decl::ClassTemplateSpecialization: {
7852 if (Spec->getSpecializationKind() ==
7854 Spec->hasDefinition())
7855 DI->completeTemplateDefinition(*Spec);
7857 case Decl::CXXRecord: {
7861 DI->EmitAndRetainType(
7865 DI->completeUnusedClass(*CRD);
7868 for (
auto *I : CRD->
decls())
7874 case Decl::UsingShadow:
7875 case Decl::ClassTemplate:
7876 case Decl::VarTemplate:
7878 case Decl::VarTemplatePartialSpecialization:
7879 case Decl::FunctionTemplate:
7880 case Decl::TypeAliasTemplate:
7889 case Decl::UsingEnum:
7893 case Decl::NamespaceAlias:
7897 case Decl::UsingDirective:
7901 case Decl::CXXConstructor:
7904 case Decl::CXXDestructor:
7908 case Decl::StaticAssert:
7909 case Decl::ExplicitInstantiation:
7916 case Decl::ObjCInterface:
7917 case Decl::ObjCCategory:
7920 case Decl::ObjCProtocol: {
7922 if (Proto->isThisDeclarationADefinition())
7923 ObjCRuntime->GenerateProtocol(Proto);
7927 case Decl::ObjCCategoryImpl:
7933 case Decl::ObjCImplementation: {
7935 EmitObjCPropertyImplementations(OMD);
7936 EmitObjCIvarInitializations(OMD);
7937 ObjCRuntime->GenerateClass(OMD);
7941 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7942 OMD->getClassInterface()), OMD->getLocation());
7945 case Decl::ObjCMethod: {
7952 case Decl::ObjCCompatibleAlias:
7956 case Decl::PragmaComment: {
7958 switch (PCD->getCommentKind()) {
7960 llvm_unreachable(
"unexpected pragma comment kind");
7975 case Decl::PragmaDetectMismatch: {
7981 case Decl::LinkageSpec:
7985 case Decl::FileScopeAsm: {
7987 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7990 if (LangOpts.OpenMPIsTargetDevice)
7993 if (LangOpts.SYCLIsDevice)
7996 getModule().appendModuleInlineAsm(AD->getAsmString());
8000 case Decl::TopLevelStmt:
8004 case Decl::Import: {
8008 if (!ImportedModules.insert(Import->getImportedModule()))
8012 if (!Import->getImportedOwningModule()) {
8014 DI->EmitImportDecl(*Import);
8020 if (CXX20ModuleInits && Import->getImportedModule() &&
8021 Import->getImportedModule()->isNamedModule())
8030 Visited.insert(Import->getImportedModule());
8031 Stack.push_back(Import->getImportedModule());
8033 while (!Stack.empty()) {
8035 if (!EmittedModuleInitializers.insert(Mod).second)
8038 for (
auto *D : Context.getModuleInitializers(Mod))
8045 if (Submodule->IsExplicit)
8048 if (Visited.insert(Submodule).second)
8049 Stack.push_back(Submodule);
8059 case Decl::OMPThreadPrivate:
8063 case Decl::OMPAllocate:
8067 case Decl::OMPDeclareReduction:
8071 case Decl::OMPDeclareMapper:
8075 case Decl::OMPRequires:
8080 case Decl::TypeAlias:
8082 DI->EmitAndRetainType(
getContext().getTypedefType(
8090 DI->EmitAndRetainType(
8097 DI->EmitAndRetainType(
8101 case Decl::HLSLRootSignature:
8104 case Decl::HLSLBuffer:
8108 case Decl::OpenACCDeclare:
8111 case Decl::OpenACCRoutine:
8126 if (!CodeGenOpts.CoverageMapping)
8129 case Decl::CXXConversion:
8130 case Decl::CXXMethod:
8131 case Decl::Function:
8132 case Decl::ObjCMethod:
8133 case Decl::CXXConstructor:
8134 case Decl::CXXDestructor: {
8143 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8153 if (!CodeGenOpts.CoverageMapping)
8155 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8156 if (Fn->isTemplateInstantiation())
8159 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8167 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8170 const Decl *D = Entry.first;
8172 case Decl::CXXConversion:
8173 case Decl::CXXMethod:
8174 case Decl::Function:
8175 case Decl::ObjCMethod: {
8182 case Decl::CXXConstructor: {
8189 case Decl::CXXDestructor: {
8206 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8207 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8208 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8209 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8210 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8219 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8220 return llvm::ConstantInt::get(i64, PtrInt);
8224 llvm::NamedMDNode *&GlobalMetadata,
8226 llvm::GlobalValue *
Addr) {
8227 if (!GlobalMetadata)
8229 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8232 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8235 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8238bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8239 llvm::GlobalValue *CppFunc) {
8241 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8244 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8247 if (Elem == CppFunc)
8253 for (llvm::User *User : Elem->users()) {
8257 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8258 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8261 for (llvm::User *CEUser : ConstExpr->users()) {
8262 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8263 IFuncs.push_back(IFunc);
8268 CEs.push_back(ConstExpr);
8269 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8270 IFuncs.push_back(IFunc);
8282 for (llvm::GlobalIFunc *IFunc : IFuncs)
8283 IFunc->setResolver(
nullptr);
8284 for (llvm::ConstantExpr *ConstExpr : CEs)
8285 ConstExpr->destroyConstant();
8289 Elem->eraseFromParent();
8291 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8296 llvm::FunctionType::get(IFunc->getType(),
false);
8297 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8298 CppFunc->getName(), ResolverTy, {},
false);
8299 IFunc->setResolver(Resolver);
8309void CodeGenModule::EmitStaticExternCAliases() {
8312 for (
auto &I : StaticExternCValues) {
8313 const IdentifierInfo *Name = I.first;
8314 llvm::GlobalValue *Val = I.second;
8322 llvm::GlobalValue *ExistingElem =
8327 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8334 auto Res = Manglings.find(MangledName);
8335 if (Res == Manglings.end())
8337 Result = Res->getValue();
8348void CodeGenModule::EmitDeclMetadata() {
8349 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8351 for (
auto &I : MangledDeclNames) {
8352 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8362void CodeGenFunction::EmitDeclMetadata() {
8363 if (LocalDeclMap.empty())
return;
8368 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8370 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8372 for (
auto &I : LocalDeclMap) {
8373 const Decl *D = I.first;
8374 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8375 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8377 Alloca->setMetadata(
8378 DeclPtrKind, llvm::MDNode::get(
8379 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8380 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8387void CodeGenModule::EmitVersionIdentMetadata() {
8388 llvm::NamedMDNode *IdentMetadata =
8389 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8391 llvm::LLVMContext &Ctx = TheModule.getContext();
8393 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8394 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8397void CodeGenModule::EmitCommandLineMetadata() {
8398 llvm::NamedMDNode *CommandLineMetadata =
8399 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8401 llvm::LLVMContext &Ctx = TheModule.getContext();
8403 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8404 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8407void CodeGenModule::EmitCoverageFile() {
8408 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8412 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8413 llvm::LLVMContext &Ctx = TheModule.getContext();
8414 auto *CoverageDataFile =
8416 auto *CoverageNotesFile =
8418 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8419 llvm::MDNode *CU = CUNode->getOperand(i);
8420 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8421 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8434 LangOpts.ObjCRuntime.isGNUFamily())
8435 return ObjCRuntime->GetEHType(Ty);
8442 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8444 for (
auto RefExpr : D->
varlist()) {
8447 VD->getAnyInitializer() &&
8448 !VD->getAnyInitializer()->isConstantInitializer(
getContext());
8454 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8455 CXXGlobalInits.push_back(InitFunction);
8460CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
8464 FnType->getReturnType(), FnType->getParamTypes(),
8465 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8467 llvm::Metadata *&InternalId = Map[T.getCanonicalType()];
8472 std::string OutName;
8473 llvm::raw_string_ostream Out(OutName);
8478 Out <<
".normalized";
8501 return CreateMetadataIdentifierImpl(T, MetadataIdMap,
"");
8506 return CreateMetadataIdentifierImpl(T, VirtualMetadataIdMap,
".virtual");
8510 return CreateMetadataIdentifierImpl(T, GeneralizedMetadataIdMap,
8518 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8519 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8520 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8521 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8522 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8523 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8524 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8525 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8533 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8535 if (CodeGenOpts.SanitizeCfiCrossDso)
8537 VTable->addTypeMetadata(Offset.getQuantity(),
8538 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8541 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8542 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8548 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8558 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8573 bool forPointeeType) {
8584 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8591 bool AlignForArray = T->isArrayType();
8597 if (T->isIncompleteType()) {
8614 if (T.getQualifiers().hasUnaligned()) {
8616 }
else if (forPointeeType && !AlignForArray &&
8617 (RD = T->getAsCXXRecordDecl())) {
8628 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8641 if (NumAutoVarInit >= StopAfter) {
8644 if (!NumAutoVarInit) {
8658 const Decl *D)
const {
8662 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8664 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8670 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8674 llvm::MD5::MD5Result
Result;
8675 for (
const auto &Arg : PreprocessorOpts.Macros)
8676 Hash.update(Arg.first);
8680 llvm::sys::fs::UniqueID ID;
8684 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8688 SM.getDiagnostics().Report(diag::err_cannot_open_file)
8689 << PLoc.
getFilename() << Status.getError().message();
8691 ID = Status->getUniqueID();
8693 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8694 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8701 assert(DeferredDeclsToEmit.empty() &&
8702 "Should have emitted all decls deferred to emit.");
8703 assert(NewBuilder->DeferredDecls.empty() &&
8704 "Newly created module should not have deferred decls");
8705 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8706 assert(EmittedDeferredDecls.empty() &&
8707 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8709 assert(NewBuilder->DeferredVTables.empty() &&
8710 "Newly created module should not have deferred vtables");
8711 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8713 assert(NewBuilder->EmittedVTables.empty() &&
8714 "Newly created module should not have defined vtables");
8715 NewBuilder->EmittedVTables = std::move(EmittedVTables);
8717 assert(NewBuilder->MangledDeclNames.empty() &&
8718 "Newly created module should not have mangled decl names");
8719 assert(NewBuilder->Manglings.empty() &&
8720 "Newly created module should not have manglings");
8721 NewBuilder->Manglings = std::move(Manglings);
8723 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8725 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
8729 std::string OutName;
8730 llvm::raw_string_ostream Out(OutName);
8738 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8747 return RequireVectorDeletingDtor.count(RD);
8751 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8753 RequireVectorDeletingDtor.insert(RD);
8767 if (Entry && !Entry->isDeclaration()) {
8772 auto *NewFn = llvm::Function::Create(
8774 llvm::Function::ExternalLinkage, VDName, &
getModule());
8775 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
8777 NewFn->takeName(VDEntry);
8778 VDEntry->replaceAllUsesWith(NewFn);
8779 VDEntry->eraseFromParent();
8780 Entry->replaceAllUsesWith(NewFn);
8781 Entry->eraseFromParent();
8786 addDeferredDeclToEmit(VectorDtorGD);
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 bool hasExistingGeneralizedTypeMD(llvm::Function *F)
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.
__device__ __2f16 float __ockl_bool s
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
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.
bool isLibFunction(unsigned ID) const
Return true if this is a builtin for a libc/libm function, with a "__builtin_" prefix (e....
std::string getName(unsigned ID) const
Return the identifier name for the specified builtin, e.g.
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
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
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.
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
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.
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.
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 type metadata if the function is a potential indirect call target to support call g...
void AppendLinkerOptions(StringRef Opts)
Appends Opts to the "llvm.linker.options" metadata value.
void createCalleeTypeMetadataForIcall(const QualType &QT, llvm::CallBase *CB)
Create and attach 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)
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)
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.
bool shouldUseLLVMABILowering() const
True when -fexperimental-abi-lowering is in effect AND the active target has an LLVMABI implementatio...
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 addReplacement(StringRef Name, llvm::Constant *C)
llvm::Constant * getConstantSignedPointer(llvm::Constant *Pointer, const PointerAuthSchema &Schema, llvm::Constant *StorageAddress, GlobalDecl SchemaDecl, QualType SchemaType)
Sign a constant pointer using the given scheme, producing a constant with the same IR type.
void AddGlobalCtor(llvm::Function *Ctor, int Priority=65535, unsigned LexOrder=~0U, llvm::Constant *AssociatedData=nullptr)
AddGlobalCtor - Add a function to the list that will be called before main() runs.
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...
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
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
bool isImmediateFunction() const
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
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.
@ None
No signing for any function.
@ Swift5_0
Interoperability with the Swift 5.0 runtime.
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ 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.
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 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.
bool isAddressDiscriminated() const
uint16_t getConstantDiscrimination() const
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.
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.
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.
virtual llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const
bool supportsIFunc() const
Identify whether this target supports IFuncs.
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 ...
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
@ Hostcall
printf lowering scheme involving hostcalls, currently used by HIP programs by default
A template parameter object.
const APValue & getValue() const
A declaration that models statements at global scope.
The top declaration context.
static DeclContext * castToDeclContext(const TranslationUnitDecl *D)
const 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 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
Linkage getLinkage() const
Determine the linkage of this type.
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)
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)
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
The JSON file list parser is used to communicate input to InstallAPI.
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.
StringRef languageToString(Language L)
@ Dtor_VectorDeleting
Vector deleting dtor.
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object dtor.
@ Dtor_Deleting
Deleting dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, llvm::vfs::FileSystem &VFS, DiagnosticsEngine &Diags)
static const char * getCFBranchLabelSchemeFlagVal(const CFBranchLabelSchemeKind Scheme)
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
bool isExternallyVisible(Linkage L)
@ EST_None
no exception specification
std::string getClangFullVersion()
Retrieves a string representing the complete clang version, which includes the clang version number,...
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
cl::opt< bool > SystemHeadersCoverage
int const char * function
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
std::optional< StringRef > Architecture
llvm::SmallVector< StringRef, 8 > Features
llvm::CallingConv::ID RuntimeCC
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::PointerType * ConstGlobalsPtrTy
void* in the address space for constant globals
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * CharTy
char
unsigned char PointerWidthInBits
The width of a pointer into the generic address space.
unsigned char IntAlignInBytes
llvm::Type * HalfTy
half, bfloat, float, double
unsigned char SizeSizeInBytes
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * SizeTy
llvm::PointerType * GlobalsInt8PtrTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::IntegerType * IntTy
int
llvm::IntegerType * Int16Ty
llvm::PointerType * ProgramPtrTy
Pointer in program address space.
unsigned char PointerAlignInBytes
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
llvm::PointerType * AllocaInt8PtrTy
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool hasSideEffects() const
Return true if the evaluated expression has side effects.
Extra information about a function prototype.
static const LangStandard & getLangStandardForKind(Kind K)
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
A library or framework to link against when an entity from this module is used.
PointerAuthSchema InitFiniPointers
The ABI for function addresses in .init_array and .fini_array.
Describes how types, statements, expressions, and declarations should be printed.