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";
249 if (Triple.getOS() == llvm::Triple::ZOS)
254 case llvm::Triple::tce:
255 case llvm::Triple::tcele:
256 case llvm::Triple::tcele64:
259 case llvm::Triple::x86: {
260 bool IsDarwinVectorABI = Triple.isOSDarwin();
261 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
263 if (Triple.getOS() == llvm::Triple::Win32) {
265 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
266 CodeGenOpts.NumRegisterParameters);
269 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
270 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
273 case llvm::Triple::x86_64: {
274 StringRef ABI =
Target.getABI();
275 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
276 : ABI ==
"avx" ? X86AVXABILevel::AVX
277 : X86AVXABILevel::None);
279 switch (Triple.getOS()) {
280 case llvm::Triple::UEFI:
281 case llvm::Triple::Win32:
287 case llvm::Triple::hexagon:
289 case llvm::Triple::lanai:
291 case llvm::Triple::r600:
293 case llvm::Triple::amdgcn:
295 case llvm::Triple::sparc:
297 case llvm::Triple::sparcv9:
299 case llvm::Triple::xcore:
301 case llvm::Triple::arc:
303 case llvm::Triple::spir:
304 case llvm::Triple::spir64:
306 case llvm::Triple::spirv32:
307 case llvm::Triple::spirv64:
308 case llvm::Triple::spirv:
310 case llvm::Triple::dxil:
312 case llvm::Triple::ve:
314 case llvm::Triple::csky: {
315 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
317 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
322 case llvm::Triple::bpfeb:
323 case llvm::Triple::bpfel:
325 case llvm::Triple::loongarch32:
326 case llvm::Triple::loongarch64: {
327 StringRef ABIStr =
Target.getABI();
328 unsigned ABIFRLen = 0;
329 if (ABIStr.ends_with(
"f"))
331 else if (ABIStr.ends_with(
"d"))
340 if (!TheTargetCodeGenInfo)
342 return *TheTargetCodeGenInfo;
346 if (!CodeGenOpts.ExperimentalABILowering)
353const llvm::abi::TargetInfo &
355 if (TheLLVMABITargetInfo)
356 return *TheLLVMABITargetInfo;
359 "LLVMABI lowering requested for an unsupported target");
360 TheLLVMABITargetInfo = llvm::abi::createBPFTargetInfo(TB);
361 return *TheLLVMABITargetInfo;
365 llvm::LLVMContext &Context,
369 if (Opts.AlignDouble || Opts.OpenCL)
372 llvm::Triple Triple =
Target.getTriple();
373 llvm::DataLayout DL(
Target.getDataLayoutString());
374 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
375 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
376 llvm::Align ClangAlign(Alignment / 8);
377 if (DLAlign != ClangAlign) {
378 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
379 <<
" mapping to " << *Ty <<
" has data layout alignment "
380 << DLAlign.value() <<
" while clang specifies "
381 << ClangAlign.value() <<
"\n";
386 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
388 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
390 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
392 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
395 if (Triple.getArch() != llvm::Triple::m68k)
396 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
399 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
400 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
401 Triple.getArch() != llvm::Triple::ve)
402 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
404 if (
Target.hasFloat16Type())
405 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
407 if (
Target.hasBFloat16Type())
408 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
409 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
411 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
414 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
416 if (
Target.hasFloat128Type())
417 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
418 if (
Target.hasIbm128Type())
419 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
421 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
423 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
424 llvm::errs() <<
"Datalayout for target " << Triple.str()
425 <<
" sets element-aligned vectors to '"
426 <<
Target.vectorsAreElementAligned()
427 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
441 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
442 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
444 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
448 AbiMapper = std::make_unique<QualTypeMapper>(
C, M.getDataLayout(), AbiAlloc);
449 AbiReverseMapper = std::make_unique<llvm::abi::IRTypeMapper>(
450 M.getContext(), M.getDataLayout());
454 llvm::LLVMContext &LLVMContext = M.getContext();
455 VoidTy = llvm::Type::getVoidTy(LLVMContext);
456 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
457 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
458 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
459 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
460 HalfTy = llvm::Type::getHalfTy(LLVMContext);
461 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
462 FloatTy = llvm::Type::getFloatTy(LLVMContext);
463 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
469 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
471 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
473 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
474 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
475 IntPtrTy = llvm::IntegerType::get(LLVMContext,
476 C.getTargetInfo().getMaxPointerWidth());
477 Int8PtrTy = llvm::PointerType::get(LLVMContext,
479 const llvm::DataLayout &DL = M.getDataLayout();
481 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
483 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
485 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
501 createOpenCLRuntime();
503 createOpenMPRuntime();
510 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
511 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
517 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
518 CodeGenOpts.CoverageNotesFile.size() ||
519 CodeGenOpts.CoverageDataFile.size())
527 Block.GlobalUniqueCount = 0;
529 if (
C.getLangOpts().ObjC)
532 if (CodeGenOpts.hasProfileClangUse()) {
533 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
534 CodeGenOpts.ProfileInstrumentUsePath, *FS,
535 CodeGenOpts.ProfileRemappingFile);
536 if (
auto E = ReaderOrErr.takeError()) {
537 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
538 Diags.Report(diag::err_reading_profile)
539 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
543 PGOReader = std::move(ReaderOrErr.get());
548 if (CodeGenOpts.CoverageMapping)
552 if (CodeGenOpts.UniqueInternalLinkageNames &&
553 !
getModule().getSourceFileName().empty()) {
557 Context.getTargetInfo());
558 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
562 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
563 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
564 CodeGenOpts.NumRegisterParameters);
573 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
574 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
576 this->MSHotPatchFunctions.push_back(std::string{*I});
578 auto &DE = Context.getDiagnostics();
579 DE.Report(diag::err_open_hotpatch_file_failed)
581 << BufOrErr.getError().message();
586 this->MSHotPatchFunctions.push_back(FuncName);
588 llvm::sort(this->MSHotPatchFunctions);
591 if (!Context.getAuxTargetInfo())
597void CodeGenModule::createObjCRuntime() {
614 llvm_unreachable(
"bad runtime kind");
617void CodeGenModule::createOpenCLRuntime() {
621void CodeGenModule::createOpenMPRuntime() {
622 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
623 Diags.Report(diag::err_omp_host_ir_file_not_found)
624 << LangOpts.OMPHostIRFile;
629 case llvm::Triple::nvptx:
630 case llvm::Triple::nvptx64:
631 case llvm::Triple::amdgcn:
632 case llvm::Triple::spirv64:
635 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
636 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
639 if (LangOpts.OpenMPSimd)
640 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
642 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
647void CodeGenModule::createCUDARuntime() {
651void CodeGenModule::createHLSLRuntime() {
652 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
656 Replacements[Name] =
C;
659void CodeGenModule::applyReplacements() {
660 for (
auto &I : Replacements) {
661 StringRef MangledName = I.first;
662 llvm::Constant *Replacement = I.second;
667 auto *NewF = dyn_cast<llvm::Function>(Replacement);
669 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
670 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
673 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
674 CE->getOpcode() == llvm::Instruction::GetElementPtr);
675 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
680 OldF->replaceAllUsesWith(Replacement);
682 NewF->removeFromParent();
683 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
686 OldF->eraseFromParent();
691 GlobalValReplacements.push_back(std::make_pair(GV,
C));
694void CodeGenModule::applyGlobalValReplacements() {
695 for (
auto &I : GlobalValReplacements) {
696 llvm::GlobalValue *GV = I.first;
697 llvm::Constant *
C = I.second;
699 GV->replaceAllUsesWith(
C);
700 GV->eraseFromParent();
707 const llvm::Constant *
C;
708 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
709 C = GA->getAliasee();
710 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
711 C = GI->getResolver();
715 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
719 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
728 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
729 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
733 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
737 if (GV->hasCommonLinkage()) {
738 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
739 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
740 Diags.
Report(Location, diag::err_alias_to_common);
745 if (GV->isDeclaration()) {
746 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
747 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
748 << IsIFunc << IsIFunc;
751 for (
const auto &[
Decl, Name] : MangledDeclNames) {
752 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
754 if (II && II->
getName() == GV->getName()) {
755 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
759 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
769 const auto *F = dyn_cast<llvm::Function>(GV);
771 Diags.
Report(Location, diag::err_alias_to_undefined)
772 << IsIFunc << IsIFunc;
776 llvm::FunctionType *FTy = F->getFunctionType();
777 if (!FTy->getReturnType()->isPointerTy()) {
778 Diags.
Report(Location, diag::err_ifunc_resolver_return);
792 if (GVar->hasAttribute(
"toc-data")) {
793 auto GVId = GVar->getName();
796 Diags.
Report(Location, diag::warn_toc_unsupported_type)
797 << GVId <<
"the variable has an alias";
799 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
800 llvm::AttributeSet NewAttributes =
801 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
802 GVar->setAttributes(NewAttributes);
806void CodeGenModule::checkAliases() {
811 DiagnosticsEngine &Diags =
getDiags();
812 for (
const GlobalDecl &GD : Aliases) {
814 SourceLocation Location;
816 bool IsIFunc = D->hasAttr<IFuncAttr>();
817 if (
const Attr *A = D->getDefiningAttr()) {
818 Location = A->getLocation();
819 Range = A->getRange();
821 llvm_unreachable(
"Not an alias or ifunc?");
825 const llvm::GlobalValue *GV =
nullptr;
827 MangledDeclNames, Range)) {
833 GlobalDecl AliaseeGD;
836 Diags.Report(Location, diag::err_alias_to_undefined)
837 << IsIFunc << IsIFunc;
846 if (AliasIsFuncDecl != AliaseeIsFunc) {
847 Diags.Report(Location, diag::err_alias_between_function_and_variable)
850 diag::note_aliasee_declaration);
857 if (AliasIsFuncDecl && AliaseeIsFunc) {
858 QualType AliasTy = D->getType();
860 auto shouldReportTypeMismatch = [&]() {
861 const auto *AliasFTy =
863 const auto *AliaseeFTy =
865 assert(AliasFTy && AliaseeFTy);
866 if (!Context.typesAreCompatible(AliasFTy->getReturnType(),
869 const auto *AliasFPTy = dyn_cast<FunctionProtoType>(AliasFTy);
870 const auto *AliaseeFPTy = dyn_cast<FunctionProtoType>(AliaseeFTy);
872 if ((AliasFPTy && AliasFPTy->isVariadic() && !AliaseeFPTy) ||
873 (AliaseeFPTy && AliaseeFPTy->isVariadic() && !AliasFPTy))
876 if (!AliasFPTy || !AliaseeFPTy)
880 if (AliasFPTy->getNumParams() != AliaseeFPTy->getNumParams() ||
881 AliasFPTy->isVariadic() != AliaseeFPTy->isVariadic())
883 for (
unsigned i = 0; i < AliasFPTy->getNumParams(); ++i)
884 if (!Context.typesAreCompatible(AliasFPTy->getParamType(i),
885 AliaseeFPTy->getParamType(i)))
889 if (shouldReportTypeMismatch()) {
890 Diags.Report(Location, diag::warn_alias_type_mismatch)
891 << AliasTy << AliaseeTy;
893 diag::note_aliasee_declaration);
899 if (
const llvm::GlobalVariable *GVar =
900 dyn_cast<const llvm::GlobalVariable>(GV))
904 llvm::Constant *Aliasee =
908 llvm::GlobalValue *AliaseeGV;
909 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
914 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
915 StringRef AliasSection = SA->getName();
916 if (AliasSection != AliaseeGV->getSection())
917 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
918 << AliasSection << IsIFunc << IsIFunc;
926 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
927 if (GA->isInterposable()) {
928 Diags.Report(Location, diag::warn_alias_to_weak_alias)
929 << GV->getName() << GA->getName() << IsIFunc;
930 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
931 GA->getAliasee(), Alias->getType());
943 llvm::Attribute::DisableSanitizerInstrumentation);
948 for (
const GlobalDecl &GD : Aliases) {
951 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
952 Alias->eraseFromParent();
957 DeferredDeclsToEmit.clear();
958 EmittedDeferredDecls.clear();
959 DeferredAnnotations.clear();
961 OpenMPRuntime->clear();
965 StringRef MainFile) {
968 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
969 if (MainFile.empty())
970 MainFile =
"<stdin>";
971 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
974 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
977 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
981static std::optional<llvm::GlobalValue::VisibilityTypes>
988 return llvm::GlobalValue::DefaultVisibility;
990 return llvm::GlobalValue::HiddenVisibility;
992 return llvm::GlobalValue::ProtectedVisibility;
994 llvm_unreachable(
"unknown option value!");
999 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
1008 GV.setDSOLocal(
false);
1009 GV.setVisibility(*
V);
1014 if (!LO.VisibilityFromDLLStorageClass)
1017 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
1020 std::optional<llvm::GlobalValue::VisibilityTypes>
1021 NoDLLStorageClassVisibility =
1024 std::optional<llvm::GlobalValue::VisibilityTypes>
1025 ExternDeclDLLImportVisibility =
1028 std::optional<llvm::GlobalValue::VisibilityTypes>
1029 ExternDeclNoDLLStorageClassVisibility =
1032 for (llvm::GlobalValue &GV : M.global_values()) {
1033 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
1036 if (GV.isDeclarationForLinker())
1038 llvm::GlobalValue::DLLImportStorageClass
1039 ? ExternDeclDLLImportVisibility
1040 : ExternDeclNoDLLStorageClassVisibility);
1043 llvm::GlobalValue::DLLExportStorageClass
1044 ? DLLExportVisibility
1045 : NoDLLStorageClassVisibility);
1047 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
1052 const llvm::Triple &Triple,
1056 return LangOpts.getStackProtector() == Mode;
1059std::optional<llvm::Attribute::AttrKind>
1061 if (D && D->
hasAttr<NoStackProtectorAttr>())
1063 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
1065 return llvm::Attribute::StackProtectStrong;
1067 return llvm::Attribute::StackProtect;
1069 return llvm::Attribute::StackProtectStrong;
1071 return llvm::Attribute::StackProtectReq;
1072 return std::nullopt;
1078 EmitModuleInitializers(Primary);
1080 DeferredDecls.insert_range(EmittedDeferredDecls);
1081 EmittedDeferredDecls.clear();
1082 EmitVTablesOpportunistically();
1083 applyGlobalValReplacements();
1084 applyReplacements();
1085 emitMultiVersionFunctions();
1086 emitPFPFieldsWithEvaluatedOffset();
1088 if (Context.getLangOpts().IncrementalExtensions &&
1089 GlobalTopLevelStmtBlockInFlight.first) {
1091 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1092 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1098 EmitCXXModuleInitFunc(Primary);
1100 EmitCXXGlobalInitFunc();
1101 EmitCXXGlobalCleanUpFunc();
1102 registerGlobalDtorsWithAtExit();
1103 EmitCXXThreadLocalInitFunc();
1105 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1107 if (Context.getLangOpts().CUDA && CUDARuntime) {
1108 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1111 if (OpenMPRuntime) {
1112 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1113 OpenMPRuntime->clear();
1117 PGOReader->getSummary(
false).getMD(VMContext),
1118 llvm::ProfileSummary::PSK_Instr);
1119 if (PGOStats.hasDiagnostics())
1125 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1126 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1128 EmitStaticExternCAliases();
1133 if (CoverageMapping)
1134 CoverageMapping->emit();
1135 if (CodeGenOpts.SanitizeCfiCrossDso) {
1139 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1141 emitAtAvailableLinkGuard();
1142 if (Context.getTargetInfo().getTriple().isWasm())
1149 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1150 llvm::CodeObjectVersionKind::COV_None) {
1151 getModule().addModuleFlag(llvm::Module::Error,
1152 "amdhsa_code_object_version",
1153 getTarget().getTargetOpts().CodeObjectVersion);
1158 auto *MDStr = llvm::MDString::get(
1163 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1172 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1174 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1176 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1180 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1184 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1186 auto *GV =
new llvm::GlobalVariable(
1187 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1188 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1194 auto *GV =
new llvm::GlobalVariable(
1196 llvm::Constant::getNullValue(
Int8Ty),
1205 if (CodeGenOpts.Autolink &&
1206 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1207 EmitModuleLinkOptions();
1222 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1223 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1224 for (
auto *MD : ELFDependentLibraries)
1225 NMD->addOperand(MD);
1228 if (CodeGenOpts.DwarfVersion) {
1229 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1230 CodeGenOpts.DwarfVersion);
1233 if (CodeGenOpts.Dwarf64)
1234 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1236 if (Context.getLangOpts().SemanticInterposition)
1238 getModule().setSemanticInterposition(
true);
1240 if (CodeGenOpts.EmitCodeView) {
1242 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1244 if (CodeGenOpts.CodeViewGHash) {
1245 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1247 if (CodeGenOpts.ControlFlowGuard) {
1250 llvm::Module::Warning,
"cfguard",
1251 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1252 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1255 llvm::Module::Warning,
"cfguard",
1256 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1258 if (CodeGenOpts.getWinControlFlowGuardMechanism() !=
1259 llvm::ControlFlowGuardMechanism::Automatic) {
1262 llvm::Module::Warning,
"cfguard-mechanism",
1263 static_cast<unsigned>(CodeGenOpts.getWinControlFlowGuardMechanism()));
1265 if (CodeGenOpts.EHContGuard) {
1267 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1269 if (Context.getLangOpts().Kernel) {
1271 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1273 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1278 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1280 llvm::Metadata *Ops[2] = {
1281 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1282 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1283 llvm::Type::getInt32Ty(VMContext), 1))};
1285 getModule().addModuleFlag(llvm::Module::Require,
1286 "StrictVTablePointersRequirement",
1287 llvm::MDNode::get(VMContext, Ops));
1293 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1294 llvm::DEBUG_METADATA_VERSION);
1299 uint64_t WCharWidth =
1300 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1301 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1302 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1305 getModule().addModuleFlag(llvm::Module::Warning,
1306 "zos_product_major_version",
1308 getModule().addModuleFlag(llvm::Module::Warning,
1309 "zos_product_minor_version",
1311 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1312 uint32_t(CLANG_VERSION_PATCHLEVEL));
1314 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1315 llvm::MDString::get(VMContext, ProductId));
1320 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1321 llvm::MDString::get(VMContext, lang_str));
1323 time_t TT = PreprocessorOpts.SourceDateEpoch
1324 ? *PreprocessorOpts.SourceDateEpoch
1325 : std::time(
nullptr);
1326 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1327 static_cast<uint64_t
>(TT));
1330 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1331 llvm::MDString::get(VMContext,
"ascii"));
1334 llvm::Triple T = Context.getTargetInfo().getTriple();
1335 if (T.isARM() || T.isThumb()) {
1337 uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1338 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1342 StringRef ABIStr = Target.getABI();
1343 llvm::LLVMContext &Ctx = TheModule.getContext();
1344 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1345 llvm::MDString::get(Ctx, ABIStr));
1350 const std::vector<std::string> &Features =
1353 llvm::RISCVISAInfo::parseFeatures(T.isRISCV64() ? 64 : 32, Features);
1354 if (!errorToBool(ParseResult.takeError()))
1356 llvm::Module::AppendUnique,
"riscv-isa",
1358 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1361 if (CodeGenOpts.SanitizeCfiCrossDso) {
1363 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1366 if (CodeGenOpts.WholeProgramVTables) {
1370 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1371 CodeGenOpts.VirtualFunctionElimination);
1374 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1375 getModule().addModuleFlag(llvm::Module::Override,
1376 "CFI Canonical Jump Tables",
1377 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1380 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1381 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1385 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1387 llvm::Module::Append,
"Unique Source File Identifier",
1389 TheModule.getContext(),
1390 llvm::MDString::get(TheModule.getContext(),
1391 CodeGenOpts.UniqueSourceFileIdentifier)));
1394 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1395 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1398 if (CodeGenOpts.PatchableFunctionEntryOffset)
1399 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1400 CodeGenOpts.PatchableFunctionEntryOffset);
1401 if (CodeGenOpts.SanitizeKcfiArity)
1402 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1405 llvm::Module::Override,
"kcfi-hash",
1406 llvm::MDString::get(
1408 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1411 if (CodeGenOpts.CFProtectionReturn &&
1412 Target.checkCFProtectionReturnSupported(
getDiags())) {
1414 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1418 if (CodeGenOpts.CFProtectionBranch &&
1419 Target.checkCFProtectionBranchSupported(
getDiags())) {
1421 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1424 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1425 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1427 Scheme = Target.getDefaultCFBranchLabelScheme();
1429 llvm::Module::Error,
"cf-branch-label-scheme",
1435 if (CodeGenOpts.FunctionReturnThunks)
1436 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1438 if (CodeGenOpts.IndirectBranchCSPrefix)
1439 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1450 if (Context.getTargetInfo().hasFeature(
"ptrauth") &&
1451 LangOpts.getSignReturnAddressScope() !=
1453 getModule().addModuleFlag(llvm::Module::Override,
1454 "sign-return-address-buildattr", 1);
1455 if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
1456 getModule().addModuleFlag(llvm::Module::Override,
1457 "tag-stack-memory-buildattr", 1);
1459 if (T.isARM() || T.isThumb() || T.isAArch64()) {
1467 if (LangOpts.BranchTargetEnforcement)
1468 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1470 if (LangOpts.BranchProtectionPAuthLR)
1471 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1473 if (LangOpts.GuardedControlStack)
1474 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1475 if (LangOpts.hasSignReturnAddress())
1476 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1477 if (LangOpts.isSignReturnAddressScopeAll())
1478 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1480 if (!LangOpts.isSignReturnAddressWithAKey())
1481 getModule().addModuleFlag(llvm::Module::Min,
1482 "sign-return-address-with-bkey", 2);
1484 if (LangOpts.PointerAuthELFGOT)
1485 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-elf-got", 1);
1488 if (LangOpts.PointerAuthCalls)
1489 getModule().addModuleFlag(llvm::Module::Error,
1490 "ptrauth-sign-personality", 1);
1492 using namespace llvm::ELF;
1493 uint64_t PAuthABIVersion =
1494 (LangOpts.PointerAuthIntrinsics
1495 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1496 (LangOpts.PointerAuthCalls
1497 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1498 (LangOpts.PointerAuthReturns
1499 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1500 (LangOpts.PointerAuthAuthTraps
1501 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1502 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1503 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1504 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1505 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1506 (LangOpts.PointerAuthInitFini
1507 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1508 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1509 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1510 (LangOpts.PointerAuthELFGOT
1511 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1512 (LangOpts.PointerAuthIndirectGotos
1513 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1514 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1515 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1516 (LangOpts.PointerAuthFunctionTypeDiscrimination
1517 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1518 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1519 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1520 "Update when new enum items are defined");
1521 if (PAuthABIVersion != 0) {
1522 getModule().addModuleFlag(llvm::Module::Error,
1523 "aarch64-elf-pauthabi-platform",
1524 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1525 getModule().addModuleFlag(llvm::Module::Error,
1526 "aarch64-elf-pauthabi-version",
1531 if ((T.isARM() || T.isThumb()) &&
getTriple().isTargetAEABI() &&
1533 uint32_t TagVal = 0;
1534 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1536 llvm::DenormalMode::getPositiveZero()) {
1537 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1539 llvm::DenormalMode::getIEEE()) {
1540 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1541 DenormalTagBehavior = llvm::Module::Override;
1543 llvm::DenormalMode::getPreserveSign()) {
1544 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1546 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1551 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1552 llvm::ARMBuildAttrs::Allowed);
1555 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1557 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1558 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1562 if (CodeGenOpts.StackClashProtector)
1564 llvm::Module::Override,
"probe-stack",
1565 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1567 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1568 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1569 CodeGenOpts.StackProbeSize);
1571 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1572 llvm::LLVMContext &Ctx = TheModule.getContext();
1574 llvm::Module::Error,
"MemProfProfileFilename",
1575 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1578 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1582 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1583 CodeGenOpts.FP32DenormalMode.Output !=
1584 llvm::DenormalMode::IEEE);
1587 if (LangOpts.EHAsynch)
1588 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1591 if (CodeGenOpts.ImportCallOptimization)
1592 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1602 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
1603 if (UnwindMode == llvm::WinX64EHUnwindMode::Default) {
1604 if (T.isOSWindows() && T.isX86_64() &&
1605 Context.getTargetInfo().hasFeature(
"egpr"))
1606 UnwindMode = llvm::WinX64EHUnwindMode::V3;
1608 UnwindMode = llvm::WinX64EHUnwindMode::V1;
1610 if (UnwindMode != llvm::WinX64EHUnwindMode::V1)
1611 getModule().addModuleFlag(llvm::Module::Warning,
"winx64-eh-unwind",
1612 static_cast<unsigned>(UnwindMode));
1616 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1618 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1622 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1623 EmitOpenCLMetadata();
1630 auto Version = LangOpts.getOpenCLCompatibleVersion();
1631 llvm::Metadata *SPIRVerElts[] = {
1632 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1634 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1635 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1636 llvm::NamedMDNode *SPIRVerMD =
1637 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1638 llvm::LLVMContext &Ctx = TheModule.getContext();
1639 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1647 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1648 assert(PLevel < 3 &&
"Invalid PIC Level");
1649 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1650 if (Context.getLangOpts().PIE)
1651 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1655 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1656 .Case(
"tiny", llvm::CodeModel::Tiny)
1657 .Case(
"small", llvm::CodeModel::Small)
1658 .Case(
"kernel", llvm::CodeModel::Kernel)
1659 .Case(
"medium", llvm::CodeModel::Medium)
1660 .Case(
"large", llvm::CodeModel::Large)
1663 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1666 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1667 Context.getTargetInfo().getTriple().getArch() ==
1668 llvm::Triple::x86_64) {
1674 if (CodeGenOpts.NoPLT)
1677 CodeGenOpts.DirectAccessExternalData !=
1678 getModule().getDirectAccessExternalData()) {
1679 getModule().setDirectAccessExternalData(
1680 CodeGenOpts.DirectAccessExternalData);
1682 if (CodeGenOpts.UnwindTables)
1683 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1685 switch (CodeGenOpts.getFramePointer()) {
1690 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1693 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1696 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1699 getModule().setFramePointer(llvm::FramePointerKind::All);
1703 SimplifyPersonality();
1716 EmitVersionIdentMetadata();
1719 EmitCommandLineMetadata();
1727 getModule().setStackProtectorGuardSymbol(
1730 getModule().setStackProtectorGuardOffset(
1733 getModule().setStackProtectorGuardValueWidth(
1736 if (
getModule().getStackProtectorGuard() !=
"global") {
1737 Diags.Report(diag::err_opt_not_valid_without_opt)
1738 <<
"-mstack-protector-guard-record"
1739 <<
"-mstack-protector-guard=global";
1741 getModule().setStackProtectorGuardRecord(
true);
1746 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1748 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1750 if (
getContext().getTargetInfo().getMaxTLSAlign())
1751 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1752 getContext().getTargetInfo().getMaxTLSAlign());
1770 if (!MustTailCallUndefinedGlobals.empty()) {
1772 for (
auto &I : MustTailCallUndefinedGlobals) {
1773 if (!I.first->isDefined())
1774 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1778 if (!Entry || Entry->isWeakForLinker() ||
1779 Entry->isDeclarationForLinker())
1780 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1784 for (
auto &I : MustTailCallUndefinedGlobals) {
1793 if (Entry->isDeclarationForLinker()) {
1796 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
1798 CalleeIsLocal = Entry->isDSOLocal();
1802 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
1813 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
1814 ErrnoTBAAMD->addOperand(IntegerNode);
1819void CodeGenModule::EmitOpenCLMetadata() {
1825 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1826 llvm::Metadata *OCLVerElts[] = {
1827 llvm::ConstantAsMetadata::get(
1828 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1829 llvm::ConstantAsMetadata::get(
1830 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1831 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1832 llvm::LLVMContext &Ctx = TheModule.getContext();
1833 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1836 EmitVersion(
"opencl.ocl.version", CLVersion);
1837 if (LangOpts.OpenCLCPlusPlus) {
1839 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1843void CodeGenModule::EmitBackendOptionsMetadata(
1844 const CodeGenOptions &CodeGenOpts) {
1846 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1847 CodeGenOpts.SmallDataLimit);
1851 if (LangOpts.AllocTokenMode) {
1852 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
1853 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
1854 llvm::MDString::get(VMContext, S));
1856 if (LangOpts.AllocTokenMax)
1858 llvm::Module::Error,
"alloc-token-max",
1859 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1860 *LangOpts.AllocTokenMax));
1861 if (CodeGenOpts.SanitizeAllocTokenFastABI)
1862 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
1863 if (CodeGenOpts.SanitizeAllocTokenExtended)
1864 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
1880 return TBAA->getTypeInfo(QTy);
1899 return TBAA->getAccessInfo(AccessType);
1906 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1912 return TBAA->getTBAAStructInfo(QTy);
1918 return TBAA->getBaseTypeInfo(QTy);
1924 return TBAA->getAccessTagInfo(Info);
1931 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1939 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1947 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1953 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1958 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1970 std::string Msg =
Type;
1972 diag::err_codegen_unsupported)
1978 diag::err_codegen_unsupported)
1985 std::string Msg =
Type;
1987 diag::err_codegen_unsupported)
1992 llvm::function_ref<
void()> Fn) {
1993 StackHandler.runWithSufficientStackSpace(Loc, Fn);
2003 if (GV->hasLocalLinkage()) {
2004 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2017 if (Context.getLangOpts().OpenMP &&
2018 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
2019 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
2020 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
2021 OMPDeclareTargetDeclAttr::DT_NoHost &&
2023 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2030 if (Context.getLangOpts().CUDAIsDevice &&
2032 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
2033 bool NeedsProtected =
false;
2037 else if (
const auto *VD = dyn_cast<VarDecl>(D))
2038 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
2039 VD->hasAttr<CUDAConstantAttr>() ||
2040 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
2041 VD->getType()->isCUDADeviceBuiltinTextureType();
2042 if (NeedsProtected) {
2043 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2049 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2053 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
2057 if (GV->hasDLLExportStorageClass()) {
2060 diag::err_hidden_visibility_dllexport);
2063 diag::err_non_default_visibility_dllimport);
2069 !GV->isDeclarationForLinker())
2074 llvm::GlobalValue *GV) {
2075 if (GV->hasLocalLinkage())
2078 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
2082 if (GV->hasDLLImportStorageClass())
2085 const llvm::Triple &TT = CGM.
getTriple();
2087 if (TT.isOSCygMing()) {
2105 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
2113 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
2117 if (!TT.isOSBinFormatELF())
2123 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2131 return !(CGM.
getLangOpts().SemanticInterposition ||
2136 if (!GV->isDeclarationForLinker())
2142 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2149 if (CGOpts.DirectAccessExternalData) {
2155 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2156 if (!Var->isThreadLocal())
2181 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2183 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2193 if (D->
hasAttr<DLLImportAttr>())
2194 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2195 else if ((D->
hasAttr<DLLExportAttr>() ||
2197 !GV->isDeclarationForLinker())
2198 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2218 GV->setPartition(CodeGenOpts.SymbolPartition);
2222 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2223 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2224 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2225 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2226 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2229llvm::GlobalVariable::ThreadLocalMode
2231 switch (CodeGenOpts.getDefaultTLSModel()) {
2233 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2235 return llvm::GlobalVariable::LocalDynamicTLSModel;
2237 return llvm::GlobalVariable::InitialExecTLSModel;
2239 return llvm::GlobalVariable::LocalExecTLSModel;
2241 llvm_unreachable(
"Invalid TLS model!");
2245 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2247 llvm::GlobalValue::ThreadLocalMode TLM;
2251 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2255 GV->setThreadLocalMode(TLM);
2261 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2265 const CPUSpecificAttr *
Attr,
2282 !D->
hasAttr<AsmLabelAttr>() &&
2288 bool OmitMultiVersionMangling =
false) {
2290 llvm::raw_svector_ostream Out(Buffer);
2299 assert(II &&
"Attempt to mangle unnamed decl.");
2300 const auto *FD = dyn_cast<FunctionDecl>(ND);
2305 Out <<
"__regcall4__" << II->
getName();
2307 Out <<
"__regcall3__" << II->
getName();
2308 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2310 Out <<
"__device_stub__" << II->
getName();
2312 DeviceKernelAttr::isOpenCLSpelling(
2313 FD->getAttr<DeviceKernelAttr>()) &&
2315 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2331 "Hash computed when not explicitly requested");
2335 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2336 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2337 switch (FD->getMultiVersionKind()) {
2341 FD->getAttr<CPUSpecificAttr>(),
2345 auto *
Attr = FD->getAttr<TargetAttr>();
2346 assert(
Attr &&
"Expected TargetAttr to be present "
2347 "for attribute mangling");
2353 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2354 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2355 "for attribute mangling");
2361 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2362 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2363 "for attribute mangling");
2370 llvm_unreachable(
"None multiversion type isn't valid here");
2380 return std::string(Out.str());
2383void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2384 const FunctionDecl *FD,
2385 StringRef &CurName) {
2392 std::string NonTargetName =
2400 "Other GD should now be a multiversioned function");
2410 if (OtherName != NonTargetName) {
2413 const auto ExistingRecord = Manglings.find(NonTargetName);
2414 if (ExistingRecord != std::end(Manglings))
2415 Manglings.remove(&(*ExistingRecord));
2416 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2421 CurName = OtherNameRef;
2423 Entry->setName(OtherName);
2433 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2447 auto FoundName = MangledDeclNames.find(CanonicalGD);
2448 if (FoundName != MangledDeclNames.end())
2449 return FoundName->second;
2486 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2487 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2496 llvm::raw_svector_ostream Out(Buffer);
2499 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2500 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2502 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2507 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2508 return Result.first->first();
2512 auto it = MangledDeclNames.begin();
2513 while (it != MangledDeclNames.end()) {
2514 if (it->second == Name)
2529 llvm::Constant *AssociatedData) {
2531 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2537 bool IsDtorAttrFunc) {
2538 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2540 DtorsUsingAtExit[Priority].push_back(Dtor);
2545 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2548void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2549 if (Fns.empty())
return;
2555 llvm::PointerType *PtrTy = llvm::PointerType::get(
2556 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2559 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2563 auto Ctors = Builder.beginArray(CtorStructTy);
2564 for (
const auto &I : Fns) {
2565 auto Ctor = Ctors.beginStruct(CtorStructTy);
2566 Ctor.addInt(
Int32Ty, I.Priority);
2567 if (InitFiniAuthSchema) {
2568 llvm::Constant *StorageAddress =
2570 ? llvm::ConstantExpr::getIntToPtr(
2571 llvm::ConstantInt::get(
2573 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2577 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2578 llvm::ConstantInt::get(
2580 Ctor.add(SignedCtorPtr);
2582 Ctor.add(I.Initializer);
2584 if (I.AssociatedData)
2585 Ctor.add(I.AssociatedData);
2587 Ctor.addNullPointer(PtrTy);
2588 Ctor.finishAndAddTo(Ctors);
2591 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2593 llvm::GlobalValue::AppendingLinkage);
2597 List->setAlignment(std::nullopt);
2602llvm::GlobalValue::LinkageTypes
2608 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2615 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2616 if (!MDS)
return nullptr;
2618 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2626 if (!UD->
hasAttr<TransparentUnionAttr>())
2628 if (!UD->
fields().empty())
2629 return UD->
fields().begin()->getType();
2638 bool GeneralizePointers) {
2651 bool GeneralizePointers) {
2654 for (
auto &Param : FnType->param_types())
2655 GeneralizedParams.push_back(
2659 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2660 GeneralizedParams, FnType->getExtProtoInfo());
2665 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2667 llvm_unreachable(
"Encountered unknown FunctionType");
2675 FnType->getReturnType(), FnType->getParamTypes(),
2676 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2678 std::string OutName;
2679 llvm::raw_string_ostream Out(OutName);
2687 Out <<
".normalized";
2689 Out <<
".generalized";
2691 return llvm::ConstantInt::get(
2697 llvm::Function *F,
bool IsThunk) {
2699 llvm::AttributeList PAL;
2702 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2706 Loc = D->getLocation();
2708 Error(Loc,
"__vectorcall calling convention is not currently supported");
2710 F->setAttributes(PAL);
2711 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2715 std::string ReadOnlyQual(
"__read_only");
2716 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2717 if (ReadOnlyPos != std::string::npos)
2719 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2721 std::string WriteOnlyQual(
"__write_only");
2722 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2723 if (WriteOnlyPos != std::string::npos)
2724 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2726 std::string ReadWriteQual(
"__read_write");
2727 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2728 if (ReadWritePos != std::string::npos)
2729 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2762 assert(((FD && CGF) || (!FD && !CGF)) &&
2763 "Incorrect use - FD and CGF should either be both null or not!");
2789 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2792 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2797 std::string typeQuals;
2801 const Decl *PDecl = parm;
2803 PDecl = TD->getDecl();
2804 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2805 if (A && A->isWriteOnly())
2806 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2807 else if (A && A->isReadWrite())
2808 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2810 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2812 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2814 auto getTypeSpelling = [&](
QualType Ty) {
2815 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2817 if (Ty.isCanonical()) {
2818 StringRef typeNameRef = typeName;
2820 if (typeNameRef.consume_front(
"unsigned "))
2821 return std::string(
"u") + typeNameRef.str();
2822 if (typeNameRef.consume_front(
"signed "))
2823 return typeNameRef.str();
2833 addressQuals.push_back(
2834 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2838 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2839 std::string baseTypeName =
2841 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2842 argBaseTypeNames.push_back(
2843 llvm::MDString::get(VMContext, baseTypeName));
2847 typeQuals =
"restrict";
2850 typeQuals += typeQuals.empty() ?
"const" :
" const";
2852 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2854 uint32_t AddrSpc = 0;
2859 addressQuals.push_back(
2860 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2864 std::string typeName = getTypeSpelling(ty);
2876 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2877 argBaseTypeNames.push_back(
2878 llvm::MDString::get(VMContext, baseTypeName));
2883 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2887 Fn->setMetadata(
"kernel_arg_addr_space",
2888 llvm::MDNode::get(VMContext, addressQuals));
2889 Fn->setMetadata(
"kernel_arg_access_qual",
2890 llvm::MDNode::get(VMContext, accessQuals));
2891 Fn->setMetadata(
"kernel_arg_type",
2892 llvm::MDNode::get(VMContext, argTypeNames));
2893 Fn->setMetadata(
"kernel_arg_base_type",
2894 llvm::MDNode::get(VMContext, argBaseTypeNames));
2895 Fn->setMetadata(
"kernel_arg_type_qual",
2896 llvm::MDNode::get(VMContext, argTypeQuals));
2900 Fn->setMetadata(
"kernel_arg_name",
2901 llvm::MDNode::get(VMContext, argNames));
2911 if (!LangOpts.Exceptions)
return false;
2914 if (LangOpts.CXXExceptions)
return true;
2917 if (LangOpts.ObjCExceptions) {
2937SmallVector<const CXXRecordDecl *, 0>
2939 llvm::SetVector<const CXXRecordDecl *> MostBases;
2944 MostBases.insert(RD);
2946 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2948 CollectMostBases(RD);
2949 return MostBases.takeVector();
2953 llvm::Function *F) {
2954 llvm::AttrBuilder B(F->getContext());
2956 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2957 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2959 if (CodeGenOpts.StackClashProtector)
2960 B.addAttribute(
"probe-stack",
"inline-asm");
2962 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2963 B.addAttribute(
"stack-probe-size",
2964 std::to_string(CodeGenOpts.StackProbeSize));
2967 B.addAttribute(llvm::Attribute::NoUnwind);
2969 if (std::optional<llvm::Attribute::AttrKind>
Attr =
2971 B.addAttribute(*
Attr);
2976 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2977 B.addAttribute(llvm::Attribute::AlwaysInline);
2981 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2983 B.addAttribute(llvm::Attribute::NoInline);
2991 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2992 B.addAttribute(
"aarch64_pstate_sm_body");
2995 if (
Attr->isNewZA())
2996 B.addAttribute(
"aarch64_new_za");
2997 if (
Attr->isNewZT0())
2998 B.addAttribute(
"aarch64_new_zt0");
3003 bool ShouldAddOptNone =
3004 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
3006 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
3007 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
3010 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
3011 !D->
hasAttr<NoInlineAttr>()) {
3012 B.addAttribute(llvm::Attribute::AlwaysInline);
3013 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
3014 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3016 B.addAttribute(llvm::Attribute::OptimizeNone);
3019 B.addAttribute(llvm::Attribute::NoInline);
3024 B.addAttribute(llvm::Attribute::Naked);
3027 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
3028 F->removeFnAttr(llvm::Attribute::MinSize);
3029 }
else if (D->
hasAttr<NakedAttr>()) {
3031 B.addAttribute(llvm::Attribute::Naked);
3032 B.addAttribute(llvm::Attribute::NoInline);
3033 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
3034 B.addAttribute(llvm::Attribute::NoDuplicate);
3035 }
else if (D->
hasAttr<NoInlineAttr>() &&
3036 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3038 B.addAttribute(llvm::Attribute::NoInline);
3039 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
3040 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
3042 B.addAttribute(llvm::Attribute::AlwaysInline);
3046 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
3047 B.addAttribute(llvm::Attribute::NoInline);
3051 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3054 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
3055 return Redecl->isInlineSpecified();
3057 if (any_of(FD->
redecls(), CheckRedeclForInline))
3062 return any_of(Pattern->
redecls(), CheckRedeclForInline);
3064 if (CheckForInline(FD)) {
3065 B.addAttribute(llvm::Attribute::InlineHint);
3066 }
else if (CodeGenOpts.getInlining() ==
3069 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3070 B.addAttribute(llvm::Attribute::NoInline);
3077 if (!D->
hasAttr<OptimizeNoneAttr>()) {
3079 if (!ShouldAddOptNone)
3080 B.addAttribute(llvm::Attribute::OptimizeForSize);
3081 B.addAttribute(llvm::Attribute::Cold);
3084 B.addAttribute(llvm::Attribute::Hot);
3085 if (D->
hasAttr<MinSizeAttr>())
3086 B.addAttribute(llvm::Attribute::MinSize);
3091 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
3092 B.addAttribute(llvm::Attribute::NoOutline);
3096 llvm::MaybeAlign ExplicitAlignment;
3097 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
3098 ExplicitAlignment = llvm::Align(alignment);
3099 else if (LangOpts.FunctionAlignment)
3100 ExplicitAlignment = llvm::Align(1ull << LangOpts.FunctionAlignment);
3102 if (ExplicitAlignment) {
3103 F->setAlignment(ExplicitAlignment);
3104 F->setPreferredAlignment(ExplicitAlignment);
3105 }
else if (LangOpts.PreferredFunctionAlignment) {
3106 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
3115 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
3120 if (CodeGenOpts.SanitizeCfiCrossDso &&
3121 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
3122 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3130 if (CodeGenOpts.CallGraphSection) {
3131 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3138 auto *MD = dyn_cast<CXXMethodDecl>(D);
3141 llvm::Metadata *Id =
3143 MD->getType(), std::nullopt,
Base));
3144 F->addTypeMetadata(0, Id);
3151 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
3152 if (FD->
hasAttr<SYCLExternalAttr>())
3153 addSYCLModuleIdAttr(F);
3157void CodeGenModule::addSYCLModuleIdAttr(llvm::Function *Fn) {
3159 Fn->addFnAttr(
"sycl-module-id",
getModule().getModuleIdentifier());
3164 if (isa_and_nonnull<NamedDecl>(D))
3167 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3169 if (D && D->
hasAttr<UsedAttr>())
3172 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3174 ((CodeGenOpts.KeepPersistentStorageVariables &&
3175 (VD->getStorageDuration() ==
SD_Static ||
3176 VD->getStorageDuration() ==
SD_Thread)) ||
3177 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3178 VD->getType().isConstQualified())))
3183static std::vector<std::string>
3185 llvm::StringMap<bool> &FeatureMap) {
3186 llvm::StringMap<bool> DefaultFeatureMap;
3190 std::vector<std::string> Delta;
3191 for (
const auto &[K,
V] : FeatureMap) {
3192 auto DefaultIt = DefaultFeatureMap.find(K);
3193 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3194 Delta.push_back((
V ?
"+" :
"-") + K.str());
3200bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3201 llvm::AttrBuilder &Attrs,
3202 bool SetTargetFeatures) {
3208 std::vector<std::string> Features;
3209 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3212 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3213 assert((!TD || !TV) &&
"both target_version and target specified");
3216 bool AddedAttr =
false;
3217 if (TD || TV || SD || TC) {
3218 llvm::StringMap<bool> FeatureMap;
3225 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3228 if (!FeatureStr.empty()) {
3229 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3230 if (!ParsedAttr.
CPU.empty() &&
3232 TargetCPU = ParsedAttr.
CPU;
3235 if (!ParsedAttr.
Tune.empty() &&
3237 TuneCPU = ParsedAttr.
Tune;
3253 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3254 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3255 Entry.getKey().str());
3261 llvm::StringMap<bool> FeatureMap;
3275 if (!TargetCPU.empty()) {
3276 Attrs.addAttribute(
"target-cpu", TargetCPU);
3279 if (!TuneCPU.empty()) {
3280 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3283 if (!Features.empty() && SetTargetFeatures) {
3284 llvm::erase_if(Features, [&](
const std::string& F) {
3287 llvm::sort(Features);
3288 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3293 llvm::SmallVector<StringRef, 8> Feats;
3294 bool IsDefault =
false;
3296 IsDefault = TV->isDefaultVersion();
3297 TV->getFeatures(Feats);
3303 Attrs.addAttribute(
"fmv-features");
3305 }
else if (!Feats.empty()) {
3307 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3308 std::string FMVFeatures;
3309 for (StringRef F : OrderedFeats)
3310 FMVFeatures.append(
"," + F.str());
3311 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3318void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3319 llvm::GlobalObject *GO) {
3324 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3327 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3328 GV->addAttribute(
"bss-section", SA->getName());
3329 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3330 GV->addAttribute(
"data-section", SA->getName());
3331 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3332 GV->addAttribute(
"rodata-section", SA->getName());
3333 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3334 GV->addAttribute(
"relro-section", SA->getName());
3337 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3340 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3341 if (!D->
getAttr<SectionAttr>())
3342 F->setSection(SA->getName());
3344 llvm::AttrBuilder Attrs(F->getContext());
3345 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3349 llvm::AttributeMask RemoveAttrs;
3350 RemoveAttrs.addAttribute(
"target-cpu");
3351 RemoveAttrs.addAttribute(
"target-features");
3352 RemoveAttrs.addAttribute(
"fmv-features");
3353 RemoveAttrs.addAttribute(
"tune-cpu");
3354 F->removeFnAttrs(RemoveAttrs);
3355 F->addFnAttrs(Attrs);
3359 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3360 GO->setSection(CSA->getName());
3361 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3362 GO->setSection(SA->getName());
3375 F->setLinkage(llvm::Function::InternalLinkage);
3377 setNonAliasAttributes(GD, F);
3388 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3392 llvm::MDNode *MD = F->getMetadata(llvm::LLVMContext::MD_type);
3393 return MD && MD->hasGeneralizedMDString();
3397 llvm::Function *F) {
3404 if (!F->hasLocalLinkage() ||
3405 F->getFunction().hasAddressTaken(
nullptr,
true,
3412 llvm::Function *F) {
3414 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3425 F->addTypeMetadata(0, MD);
3434 if (CodeGenOpts.SanitizeCfiCrossDso)
3436 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3440 llvm::CallBase *CB) {
3445 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall() ||
3450 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
3451 getLLVMContext(), {llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
3454 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3455 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3459 llvm::LLVMContext &Ctx = F->getContext();
3460 llvm::MDBuilder MDB(Ctx);
3461 llvm::StringRef Salt;
3464 if (
const auto &Info = FP->getExtraAttributeInfo())
3465 Salt = Info.CFISalt;
3467 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3476 return llvm::all_of(Name, [](
const char &
C) {
3477 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3483 for (
auto &F : M.functions()) {
3485 bool AddressTaken = F.hasAddressTaken();
3486 if (!AddressTaken && F.hasLocalLinkage())
3487 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3492 if (!AddressTaken || !F.isDeclaration())
3495 const llvm::ConstantInt *
Type;
3496 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3497 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3501 StringRef Name = F.getName();
3505 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3506 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3507 Twine(
Type->getSExtValue()) +
" */\n")
3509 M.appendModuleInlineAsm(
Asm);
3513void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3514 bool IsIncompleteFunction,
3517 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3525 if (!IsIncompleteFunction)
3532 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3534 assert(!F->arg_empty() &&
3535 F->arg_begin()->getType()
3536 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3537 "unexpected this return");
3538 F->addParamAttr(0, llvm::Attribute::Returned);
3548 if (!IsIncompleteFunction && F->isDeclaration())
3551 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3552 F->setSection(CSA->getName());
3553 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3554 F->setSection(SA->getName());
3556 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3558 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3559 else if (EA->isWarning())
3560 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3565 const FunctionDecl *FDBody;
3566 bool HasBody = FD->
hasBody(FDBody);
3568 assert(HasBody &&
"Inline builtin declarations should always have an "
3570 if (shouldEmitFunction(FDBody))
3571 F->addFnAttr(llvm::Attribute::NoBuiltin);
3577 F->addFnAttr(llvm::Attribute::NoBuiltin);
3581 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3582 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3583 if (MD->isVirtual())
3584 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3590 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3591 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3594 if (CodeGenOpts.CallGraphSection)
3597 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3603 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3604 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3606 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3610 llvm::LLVMContext &Ctx = F->getContext();
3611 llvm::MDBuilder MDB(Ctx);
3615 int CalleeIdx = *CB->encoding_begin();
3616 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3617 F->addMetadata(llvm::LLVMContext::MD_callback,
3618 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3619 CalleeIdx, PayloadIndices,
3626 "Only globals with definition can force usage.");
3627 LLVMUsed.emplace_back(GV);
3631 assert(!GV->isDeclaration() &&
3632 "Only globals with definition can force usage.");
3633 LLVMCompilerUsed.emplace_back(GV);
3638 "Only globals with definition can force usage.");
3640 LLVMCompilerUsed.emplace_back(GV);
3642 LLVMUsed.emplace_back(GV);
3646 std::vector<llvm::WeakTrackingVH> &List) {
3653 UsedArray.resize(List.size());
3654 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3656 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3660 if (UsedArray.empty())
3662 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3664 auto *GV =
new llvm::GlobalVariable(
3665 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3666 llvm::ConstantArray::get(ATy, UsedArray), Name);
3668 GV->setSection(
"llvm.metadata");
3671void CodeGenModule::emitLLVMUsed() {
3672 emitUsed(*
this,
"llvm.used", LLVMUsed);
3673 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3678 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3687 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3693 ELFDependentLibraries.push_back(
3694 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3701 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3710 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3716 if (Visited.insert(Import).second)
3733 if (LL.IsFramework) {
3734 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3735 llvm::MDString::get(Context, LL.Library)};
3737 Metadata.push_back(llvm::MDNode::get(Context, Args));
3743 llvm::Metadata *Args[2] = {
3744 llvm::MDString::get(Context,
"lib"),
3745 llvm::MDString::get(Context, LL.Library),
3747 Metadata.push_back(llvm::MDNode::get(Context, Args));
3751 auto *OptString = llvm::MDString::get(Context, Opt);
3752 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3757void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3759 "We should only emit module initializers for named modules.");
3767 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3784 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
3790void CodeGenModule::EmitModuleLinkOptions() {
3794 llvm::SetVector<clang::Module *> LinkModules;
3795 llvm::SmallPtrSet<clang::Module *, 16> Visited;
3796 SmallVector<clang::Module *, 16> Stack;
3799 for (
Module *M : ImportedModules) {
3802 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3805 if (Visited.insert(M).second)
3811 while (!Stack.empty()) {
3814 bool AnyChildren =
false;
3823 if (Visited.insert(
SM).second) {
3824 Stack.push_back(
SM);
3832 LinkModules.insert(Mod);
3839 SmallVector<llvm::MDNode *, 16> MetadataArgs;
3841 for (
Module *M : LinkModules)
3842 if (Visited.insert(M).second)
3844 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3845 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3848 if (!LinkerOptionsMetadata.empty()) {
3849 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3850 for (
auto *MD : LinkerOptionsMetadata)
3851 NMD->addOperand(MD);
3855void CodeGenModule::EmitDeferred() {
3864 if (!DeferredVTables.empty()) {
3865 EmitDeferredVTables();
3870 assert(DeferredVTables.empty());
3877 llvm::append_range(DeferredDeclsToEmit,
3881 if (DeferredDeclsToEmit.empty())
3886 std::vector<GlobalDecl> CurDeclsToEmit;
3887 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3889 for (GlobalDecl &D : CurDeclsToEmit) {
3895 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
3899 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
3915 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3933 if (!GV->isDeclaration())
3937 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3941 EmitGlobalDefinition(D, GV);
3946 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3948 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3953void CodeGenModule::EmitVTablesOpportunistically() {
3959 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3960 &&
"Only emit opportunistic vtables with optimizations");
3962 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
3964 "This queue should only contain external vtables");
3965 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3966 VTables.GenerateClassData(RD);
3968 OpportunisticVTables.clear();
3972 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3977 DeferredAnnotations.clear();
3979 if (Annotations.empty())
3983 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3984 Annotations[0]->
getType(), Annotations.size()), Annotations);
3985 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3986 llvm::GlobalValue::AppendingLinkage,
3987 Array,
"llvm.global.annotations");
3992 llvm::Constant *&AStr = AnnotationStrings[Str];
3997 llvm::Constant *s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3998 auto *gv =
new llvm::GlobalVariable(
3999 getModule(), s->getType(),
true, llvm::GlobalValue::PrivateLinkage, s,
4000 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
4003 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4020 SM.getExpansionLineNumber(L);
4021 return llvm::ConstantInt::get(
Int32Ty, LineNo);
4029 llvm::FoldingSetNodeID ID;
4030 for (
Expr *E : Exprs) {
4033 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
4038 LLVMArgs.reserve(Exprs.size());
4040 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
4042 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
4045 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
4046 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
4047 llvm::GlobalValue::PrivateLinkage,
Struct,
4050 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4057 const AnnotateAttr *AA,
4065 llvm::Constant *GVInGlobalsAS = GV;
4066 if (GV->getAddressSpace() !=
4068 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
4070 llvm::PointerType::get(
4071 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
4075 llvm::Constant *Fields[] = {
4076 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
4078 return llvm::ConstantStruct::getAnon(Fields);
4082 llvm::GlobalValue *GV) {
4083 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
4093 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
4096 auto &
SM = Context.getSourceManager();
4098 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
4103 return NoSanitizeL.containsLocation(Kind, Loc);
4106 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
4110 llvm::GlobalVariable *GV,
4112 StringRef Category)
const {
4114 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
4116 auto &
SM = Context.getSourceManager();
4117 if (NoSanitizeL.containsMainFile(
4118 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
4121 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
4128 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
4129 Ty = AT->getElementType();
4134 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4142 StringRef Category)
const {
4145 auto Attr = ImbueAttr::NONE;
4147 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4148 if (
Attr == ImbueAttr::NONE)
4149 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4151 case ImbueAttr::NONE:
4153 case ImbueAttr::ALWAYS:
4154 Fn->addFnAttr(
"function-instrument",
"xray-always");
4156 case ImbueAttr::ALWAYS_ARG1:
4157 Fn->addFnAttr(
"function-instrument",
"xray-always");
4158 Fn->addFnAttr(
"xray-log-args",
"1");
4160 case ImbueAttr::NEVER:
4161 Fn->addFnAttr(
"function-instrument",
"xray-never");
4174 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4184 auto &
SM = Context.getSourceManager();
4185 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
4199 if (NumGroups > 1) {
4200 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4209 if (LangOpts.EmitAllDecls)
4212 const auto *VD = dyn_cast<VarDecl>(
Global);
4214 ((CodeGenOpts.KeepPersistentStorageVariables &&
4215 (VD->getStorageDuration() ==
SD_Static ||
4216 VD->getStorageDuration() ==
SD_Thread)) ||
4217 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4218 VD->getType().isConstQualified())))
4231 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4232 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4233 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4234 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4238 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4248 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4255 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4256 if (Context.getInlineVariableDefinitionKind(VD) ==
4261 if (CXX20ModuleInits && VD->getOwningModule() &&
4262 !VD->getOwningModule()->isModuleMapModule()) {
4271 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4274 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4287 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4291 llvm::Constant *
Init;
4294 if (!
V.isAbsent()) {
4305 llvm::Constant *Fields[4] = {
4309 llvm::ConstantDataArray::getRaw(
4310 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4312 Init = llvm::ConstantStruct::getAnon(Fields);
4315 auto *GV =
new llvm::GlobalVariable(
4317 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4319 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4322 if (!
V.isAbsent()) {
4335 llvm::GlobalVariable **Entry =
nullptr;
4336 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4341 llvm::Constant *
Init;
4345 assert(!
V.isAbsent());
4349 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4351 llvm::GlobalValue::PrivateLinkage,
Init,
4353 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4368 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4372 llvm::Constant *
Init =
Emitter.emitForInitializer(
4380 llvm::GlobalValue::LinkageTypes
Linkage =
4382 ? llvm::GlobalValue::LinkOnceODRLinkage
4383 : llvm::GlobalValue::InternalLinkage;
4384 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4388 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4395 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4396 assert(AA &&
"No alias?");
4406 llvm::Constant *Aliasee;
4408 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4416 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4417 WeakRefReferences.insert(F);
4425 if (
auto *A = D->
getAttr<AttrT>())
4426 return A->isImplicit();
4433 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4436 const auto *AA =
Global->getAttr<AliasAttr>();
4444 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4445 if (LangOpts.OpenMPIsTargetDevice)
4446 return !AliaseeDecl ||
4447 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4450 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4451 const bool AliaseeHasDeviceAttr =
4452 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4454 if (LangOpts.CUDAIsDevice)
4455 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4462bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4463 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4468 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4469 Global->hasAttr<CUDAConstantAttr>() ||
4470 Global->hasAttr<CUDASharedAttr>() ||
4471 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4472 Global->getType()->isCUDADeviceBuiltinTextureType();
4479 if (
Global->hasAttr<WeakRefAttr>())
4484 if (
Global->hasAttr<AliasAttr>()) {
4487 return EmitAliasDefinition(GD);
4491 if (
Global->hasAttr<IFuncAttr>())
4492 return emitIFuncDefinition(GD);
4495 if (
Global->hasAttr<CPUDispatchAttr>())
4496 return emitCPUDispatchDefinition(GD);
4501 if (LangOpts.CUDA) {
4503 "Expected Variable or Function");
4504 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4505 if (!shouldEmitCUDAGlobalVar(VD))
4507 }
else if (LangOpts.CUDAIsDevice) {
4508 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4509 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4510 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4514 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4515 !
Global->hasAttr<CUDAGlobalAttr>() &&
4517 !
Global->hasAttr<CUDAHostAttr>()))
4520 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4521 Global->hasAttr<CUDADeviceAttr>())
4525 if (LangOpts.OpenMP) {
4527 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4529 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4530 if (MustBeEmitted(
Global))
4534 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4535 if (MustBeEmitted(
Global))
4542 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4543 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4549 if (FD->
hasAttr<AnnotateAttr>()) {
4552 DeferredAnnotations[MangledName] = FD;
4567 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4573 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4575 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4576 if (LangOpts.OpenMP) {
4578 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4579 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4583 if (VD->hasExternalStorage() &&
4584 Res != OMPDeclareTargetDeclAttr::MT_Link)
4587 bool UnifiedMemoryEnabled =
4589 if (*Res == OMPDeclareTargetDeclAttr::MT_Local ||
4590 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4591 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4592 !UnifiedMemoryEnabled)) {
4595 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4596 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4597 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4598 UnifiedMemoryEnabled)) &&
4599 "Link clause or to clause with unified memory expected.");
4609 if (LangOpts.HLSL) {
4610 if (VD->getStorageClass() ==
SC_Extern) {
4619 if (Context.getInlineVariableDefinitionKind(VD) ==
4629 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4631 EmitGlobalDefinition(GD);
4632 addEmittedDeferredDecl(GD);
4640 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4641 CXXGlobalInits.push_back(
nullptr);
4647 addDeferredDeclToEmit(GD);
4648 }
else if (MustBeEmitted(
Global)) {
4650 assert(!MayBeEmittedEagerly(
Global));
4651 addDeferredDeclToEmit(GD);
4656 DeferredDecls[MangledName] = GD;
4662 if (
const auto *RT =
4663 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4664 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4665 RD = RD->getDefinitionOrSelf();
4666 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4674 struct FunctionIsDirectlyRecursive
4675 :
public ConstStmtVisitor<FunctionIsDirectlyRecursive, bool> {
4676 const StringRef Name;
4677 const Builtin::Context &BI;
4678 FunctionIsDirectlyRecursive(StringRef N,
const Builtin::Context &
C)
4681 bool VisitCallExpr(
const CallExpr *E) {
4685 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4686 if (Attr && Name == Attr->getLabel())
4691 std::string BuiltinNameStr = BI.
getName(BuiltinID);
4692 StringRef BuiltinName = BuiltinNameStr;
4693 return BuiltinName.consume_front(
"__builtin_") && Name == BuiltinName;
4696 bool VisitStmt(
const Stmt *S) {
4697 for (
const Stmt *Child : S->
children())
4698 if (Child && this->Visit(Child))
4705 struct DLLImportFunctionVisitor
4706 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4707 bool SafeToInline =
true;
4709 bool shouldVisitImplicitCode()
const {
return true; }
4711 bool VisitVarDecl(VarDecl *VD) {
4714 SafeToInline =
false;
4715 return SafeToInline;
4722 return SafeToInline;
4725 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4727 SafeToInline = D->
hasAttr<DLLImportAttr>();
4728 return SafeToInline;
4731 bool VisitDeclRefExpr(DeclRefExpr *E) {
4734 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4735 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4736 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4737 return SafeToInline;
4740 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4742 return SafeToInline;
4745 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4749 SafeToInline =
true;
4751 SafeToInline = M->
hasAttr<DLLImportAttr>();
4753 return SafeToInline;
4756 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4758 return SafeToInline;
4761 bool VisitCXXNewExpr(CXXNewExpr *E) {
4763 return SafeToInline;
4772CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4774 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4776 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4779 Name = Attr->getLabel();
4784 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
4785 const Stmt *Body = FD->
getBody();
4786 return Body ? Walker.Visit(Body) :
false;
4789bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4796 if (F->isInlineBuiltinDeclaration())
4799 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4804 if (
const Module *M = F->getOwningModule();
4805 M && M->getTopLevelModule()->isNamedModule() &&
4806 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4816 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4821 if (F->hasAttr<NoInlineAttr>())
4824 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4826 DLLImportFunctionVisitor Visitor;
4827 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4828 if (!Visitor.SafeToInline)
4831 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4834 for (
const Decl *
Member : Dtor->getParent()->decls())
4838 for (
const CXXBaseSpecifier &B : Dtor->getParent()->bases())
4849 return !isTriviallyRecursive(F);
4852bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4853 return CodeGenOpts.OptimizationLevel > 0;
4856void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
4857 llvm::GlobalValue *GV) {
4861 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4862 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4864 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4865 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4866 if (TC->isFirstOfVersion(I))
4869 EmitGlobalFunctionDefinition(GD, GV);
4875 AddDeferredMultiVersionResolverToEmit(GD);
4877 GetOrCreateMultiVersionResolver(GD);
4881void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
4884 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
4885 Context.getSourceManager(),
4886 "Generating code for declaration");
4888 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4891 if (!shouldEmitFunction(GD))
4894 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4896 llvm::raw_string_ostream
OS(Name);
4902 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4906 ABI->emitCXXStructor(GD);
4908 EmitMultiVersionFunctionDefinition(GD, GV);
4910 EmitGlobalFunctionDefinition(GD, GV);
4919 return EmitMultiVersionFunctionDefinition(GD, GV);
4920 return EmitGlobalFunctionDefinition(GD, GV);
4923 if (
const auto *VD = dyn_cast<VarDecl>(D))
4924 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4926 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4930 llvm::Function *NewFn);
4946static llvm::GlobalValue::LinkageTypes
4950 return llvm::GlobalValue::InternalLinkage;
4951 return llvm::GlobalValue::WeakODRLinkage;
4954void CodeGenModule::emitMultiVersionFunctions() {
4955 std::vector<GlobalDecl> MVFuncsToEmit;
4956 MultiVersionFuncs.swap(MVFuncsToEmit);
4957 for (GlobalDecl GD : MVFuncsToEmit) {
4959 assert(FD &&
"Expected a FunctionDecl");
4961 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
4962 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
4966 if (
Decl->isDefined()) {
4967 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4975 assert(
Func &&
"This should have just been created");
4983 bool ShouldEmitResolver = !
getTriple().isAArch64();
4984 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4985 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
4988 FD, [&](
const FunctionDecl *CurFD) {
4989 llvm::SmallVector<StringRef, 8> Feats;
4992 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4994 TA->getX86AddedFeatures(Feats);
4995 llvm::Function *
Func = createFunction(CurFD);
4996 DeclMap.insert({
Func, CurFD});
4997 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
4998 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4999 if (TVA->isDefaultVersion() && IsDefined)
5000 ShouldEmitResolver =
true;
5001 llvm::Function *
Func = createFunction(CurFD);
5002 DeclMap.insert({
Func, CurFD});
5004 TVA->getFeatures(Feats, Delim);
5005 Options.emplace_back(
Func, Feats);
5006 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
5007 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
5008 if (!TC->isFirstOfVersion(I))
5010 if (TC->isDefaultVersion(I) && IsDefined)
5011 ShouldEmitResolver =
true;
5012 llvm::Function *
Func = createFunction(CurFD, I);
5013 DeclMap.insert({
Func, CurFD});
5016 TC->getX86Feature(Feats, I);
5017 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
5020 TC->getFeatures(Feats, I, Delim);
5021 Options.emplace_back(
Func, Feats);
5025 llvm_unreachable(
"unexpected MultiVersionKind");
5028 if (!ShouldEmitResolver)
5031 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
5032 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
5033 ResolverConstant = IFunc->getResolver();
5038 *
this, GD, FD,
true);
5045 auto *Alias = llvm::GlobalAlias::create(
5047 MangledName +
".ifunc", IFunc, &
getModule());
5056 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
5057 const CodeGenFunction::FMVResolverOption &RHS) {
5063 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
5064 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
5065 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
5066 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
5067 return LHS.isSubsetOf(RHS);
5069 Diags.Report(DeclMap[I->Function]->getLocation(),
5070 diag::warn_unreachable_version)
5071 << I->Function->getName();
5072 assert(I->Function->user_empty() &&
"unexpected users");
5073 I->Function->eraseFromParent();
5074 I->Function =
nullptr;
5078 CodeGenFunction CGF(*
this);
5079 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5081 setMultiVersionResolverAttributes(ResolverFunc, GD);
5083 ResolverFunc->setComdat(
5084 getModule().getOrInsertComdat(ResolverFunc->getName()));
5090 if (!MVFuncsToEmit.empty())
5095 if (!MultiVersionFuncs.empty())
5096 emitMultiVersionFunctions();
5106 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
5108 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
5109 llvm::GlobalVariable::ExternalWeakLinkage,
5111 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5116void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
5117 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
5119 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
5121 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
5122 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
5123 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
5124 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5126 DS->takeName(OldDS);
5127 OldDS->replaceAllUsesWith(DS);
5128 OldDS->eraseFromParent();
5134 llvm::Constant *
New) {
5137 Old->replaceAllUsesWith(
New);
5138 Old->eraseFromParent();
5141void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5143 assert(FD &&
"Not a FunctionDecl?");
5145 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5146 assert(DD &&
"Not a cpu_dispatch Function?");
5152 UpdateMultiVersionNames(GD, FD, ResolverName);
5154 llvm::Type *ResolverType;
5155 GlobalDecl ResolverGD;
5157 ResolverType = llvm::FunctionType::get(
5168 ResolverName, ResolverType, ResolverGD,
false));
5171 ResolverFunc->setComdat(
5172 getModule().getOrInsertComdat(ResolverFunc->getName()));
5174 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5177 for (
const IdentifierInfo *II : DD->cpus()) {
5185 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5188 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5194 Func = GetOrCreateLLVMFunction(
5195 MangledName, DeclTy, ExistingDecl,
5201 llvm::SmallVector<StringRef, 32> Features;
5202 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5203 llvm::transform(Features, Features.begin(),
5204 [](StringRef Str) { return Str.substr(1); });
5205 llvm::erase_if(Features, [&Target](StringRef Feat) {
5206 return !Target.validateCpuSupports(Feat);
5212 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5213 const CodeGenFunction::FMVResolverOption &RHS) {
5214 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5215 llvm::X86::getCpuSupportsMask(RHS.
Features);
5222 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5223 (Options.end() - 2)->Features),
5224 [](
auto X) { return X == 0; })) {
5225 StringRef LHSName = (Options.end() - 2)->Function->getName();
5226 StringRef RHSName = (Options.end() - 1)->Function->getName();
5227 if (LHSName.compare(RHSName) < 0)
5228 Options.erase(Options.end() - 2);
5230 Options.erase(Options.end() - 1);
5233 CodeGenFunction CGF(*
this);
5234 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5235 setMultiVersionResolverAttributes(ResolverFunc, GD);
5240 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5245 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5252 *
this, GD, FD,
true);
5255 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5263void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5265 assert(FD &&
"Not a FunctionDecl?");
5268 std::string MangledName =
5270 if (!DeferredResolversToEmit.insert(MangledName).second)
5273 MultiVersionFuncs.push_back(GD);
5279llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5281 assert(FD &&
"Not a FunctionDecl?");
5283 std::string MangledName =
5288 std::string ResolverName = MangledName;
5292 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5296 ResolverName +=
".ifunc";
5303 ResolverName +=
".resolver";
5306 bool ShouldReturnIFunc =
5325 AddDeferredMultiVersionResolverToEmit(GD);
5329 if (ShouldReturnIFunc) {
5331 llvm::Type *ResolverType = llvm::FunctionType::get(
5333 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5334 MangledName +
".resolver", ResolverType, GlobalDecl{},
5342 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5344 GIF->setName(ResolverName);
5351 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5352 ResolverName, DeclTy, GlobalDecl{},
false);
5354 "Resolver should be created for the first time");
5359void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5361 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5374 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5385bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5386 const llvm::GlobalValue *GV)
const {
5387 auto SC = GV->getDLLStorageClass();
5388 if (SC == llvm::GlobalValue::DefaultStorageClass)
5391 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5392 !MRD->
hasAttr<DLLImportAttr>()) ||
5393 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5394 !MRD->
hasAttr<DLLExportAttr>())) &&
5405llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5406 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5407 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5411 std::string NameWithoutMultiVersionMangling;
5412 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5414 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5415 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5416 !DontDefer && !IsForDefinition) {
5419 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5421 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5424 GDDef = GlobalDecl(FDDef);
5432 UpdateMultiVersionNames(GD, FD, MangledName);
5433 if (!IsForDefinition) {
5439 AddDeferredMultiVersionResolverToEmit(GD);
5441 *
this, GD, FD,
true);
5450 *
this, GD, FD,
true);
5452 return GetOrCreateMultiVersionResolver(GD);
5457 if (!NameWithoutMultiVersionMangling.empty())
5458 MangledName = NameWithoutMultiVersionMangling;
5463 if (WeakRefReferences.erase(Entry)) {
5464 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5465 if (FD && !FD->
hasAttr<WeakAttr>())
5466 Entry->setLinkage(llvm::Function::ExternalLinkage);
5470 if (D && shouldDropDLLAttribute(D, Entry)) {
5471 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5477 if (IsForDefinition && !Entry->isDeclaration()) {
5484 DiagnosedConflictingDefinitions.insert(GD).second) {
5488 diag::note_previous_definition);
5493 (Entry->getValueType() == Ty)) {
5500 if (!IsForDefinition)
5507 bool IsIncompleteFunction =
false;
5509 llvm::FunctionType *FTy;
5513 FTy = llvm::FunctionType::get(
VoidTy,
false);
5514 IsIncompleteFunction =
true;
5518 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5519 Entry ? StringRef() : MangledName, &
getModule());
5523 if (D && D->
hasAttr<AnnotateAttr>())
5541 if (!Entry->use_empty()) {
5543 Entry->removeDeadConstantUsers();
5549 assert(F->getName() == MangledName &&
"name was uniqued!");
5551 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5552 if (ExtraAttrs.hasFnAttrs()) {
5553 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5561 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5564 addDeferredDeclToEmit(GD);
5569 auto DDI = DeferredDecls.find(MangledName);
5570 if (DDI != DeferredDecls.end()) {
5574 addDeferredDeclToEmit(DDI->second);
5575 DeferredDecls.erase(DDI);
5603 if (!IsIncompleteFunction) {
5604 assert(F->getFunctionType() == Ty);
5622 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5632 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5635 DD->getParent()->getNumVBases() == 0)
5640 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5641 false, llvm::AttributeList(),
5644 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5648 if (IsForDefinition)
5656 llvm::GlobalValue *F =
5659 return llvm::NoCFIValue::get(F);
5669 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5672 if (!
C.getLangOpts().CPlusPlus)
5677 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5678 ?
C.Idents.get(
"terminate")
5679 :
C.Idents.get(Name);
5681 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5685 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
5686 for (
const auto *
Result : LSD->lookup(&NS))
5687 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
5692 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5701 llvm::Function *F, StringRef Name) {
5707 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5710 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5711 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5712 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5719 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5720 if (AssumeConvergent) {
5722 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5725 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5730 llvm::Constant *
C = GetOrCreateLLVMFunction(
5732 false,
false, ExtraAttrs);
5734 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5750 llvm::AttributeList ExtraAttrs,
bool Local,
5751 bool AssumeConvergent) {
5752 if (AssumeConvergent) {
5754 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5758 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5762 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5771 markRegisterParameterAttributes(F);
5797 if (WeakRefReferences.erase(Entry)) {
5798 if (D && !D->
hasAttr<WeakAttr>())
5799 Entry->setLinkage(llvm::Function::ExternalLinkage);
5803 if (D && shouldDropDLLAttribute(D, Entry))
5804 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5806 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5809 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5814 if (IsForDefinition && !Entry->isDeclaration()) {
5822 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5824 DiagnosedConflictingDefinitions.insert(D).second) {
5828 diag::note_previous_definition);
5833 if (Entry->getType()->getAddressSpace() != TargetAS)
5834 return llvm::ConstantExpr::getAddrSpaceCast(
5835 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5839 if (!IsForDefinition)
5845 auto *GV =
new llvm::GlobalVariable(
5846 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5847 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5848 getContext().getTargetAddressSpace(DAddrSpace));
5853 GV->takeName(Entry);
5855 if (!Entry->use_empty()) {
5856 Entry->replaceAllUsesWith(GV);
5859 Entry->eraseFromParent();
5865 auto DDI = DeferredDecls.find(MangledName);
5866 if (DDI != DeferredDecls.end()) {
5869 addDeferredDeclToEmit(DDI->second);
5870 DeferredDecls.erase(DDI);
5875 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5882 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
5888 CXXThreadLocals.push_back(D);
5896 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
5897 EmitGlobalVarDefinition(D);
5902 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
5903 GV->setSection(SA->getName());
5907 if (
getTriple().getArch() == llvm::Triple::xcore &&
5911 GV->setSection(
".cp.rodata");
5914 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
5915 GV->setCodeModel(CMA->getModel());
5920 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5924 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
5925 bool HasMutableFields =
Record &&
Record->hasMutableFields();
5926 if (!HasMutableFields) {
5933 auto *InitType =
Init->getType();
5934 if (GV->getValueType() != InitType) {
5939 GV->setName(StringRef());
5944 ->stripPointerCasts());
5947 GV->eraseFromParent();
5950 GV->setInitializer(
Init);
5951 GV->setConstant(
true);
5952 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5972 SanitizerMD->reportGlobal(GV, *D);
5977 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5978 if (DAddrSpace != ExpectedAS)
5991 false, IsForDefinition);
6012 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
6013 llvm::Align Alignment) {
6014 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
6015 llvm::GlobalVariable *OldGV =
nullptr;
6019 if (GV->getValueType() == Ty)
6024 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
6029 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
6034 GV->takeName(OldGV);
6036 if (!OldGV->use_empty()) {
6037 OldGV->replaceAllUsesWith(GV);
6040 OldGV->eraseFromParent();
6044 !GV->hasAvailableExternallyLinkage())
6045 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6047 GV->setAlignment(Alignment);
6084 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
6092 if (GV && !GV->isDeclaration())
6097 if (!MustBeEmitted(D) && !GV) {
6098 DeferredDecls[MangledName] = D;
6103 EmitGlobalVarDefinition(D);
6108 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
6110 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
6125 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(
Addr)) {
6129 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
6132 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6134 if (!Fn->getSubprogram())
6140 return Context.toCharUnitsFromBits(
6145 if (LangOpts.OpenCL) {
6156 if (LangOpts.SYCLIsDevice &&
6160 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6162 if (D->
hasAttr<CUDAConstantAttr>())
6164 if (D->
hasAttr<CUDASharedAttr>())
6166 if (D->
hasAttr<CUDADeviceAttr>())
6174 if (LangOpts.OpenMP) {
6176 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6184 if (LangOpts.OpenCL)
6186 if (LangOpts.SYCLIsDevice)
6188 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
6196 if (
auto AS =
getTarget().getConstantAddressSpace())
6209static llvm::Constant *
6211 llvm::GlobalVariable *GV) {
6212 llvm::Constant *Cast = GV;
6217 GV, llvm::PointerType::get(
6224template<
typename SomeDecl>
6226 llvm::GlobalValue *GV) {
6241 const SomeDecl *
First = D->getFirstDecl();
6242 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6248 std::pair<StaticExternCMap::iterator, bool> R =
6249 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6254 R.first->second =
nullptr;
6261 if (D.
hasAttr<SelectAnyAttr>())
6265 if (
auto *VD = dyn_cast<VarDecl>(&D))
6279 llvm_unreachable(
"No such linkage");
6287 llvm::GlobalObject &GO) {
6290 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6298void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6313 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6314 OpenMPRuntime->emitTargetGlobalVariable(D))
6317 llvm::TrackingVH<llvm::Constant>
Init;
6318 bool NeedsGlobalCtor =
false;
6322 bool IsDefinitionAvailableExternally =
6324 bool NeedsGlobalDtor =
6325 !IsDefinitionAvailableExternally &&
6332 if (IsDefinitionAvailableExternally &&
6343 std::optional<ConstantEmitter> emitter;
6348 bool IsCUDASharedVar =
6353 bool IsCUDAShadowVar =
6355 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6356 D->
hasAttr<CUDASharedAttr>());
6357 bool IsCUDADeviceShadowVar =
6362 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6363 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6367 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6370 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6371 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6372 }
else if (!InitExpr) {
6385 initializedGlobalDecl = GlobalDecl(D);
6386 emitter.emplace(*
this);
6387 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6389 QualType T = InitExpr->
getType();
6395 if (!IsDefinitionAvailableExternally)
6396 NeedsGlobalCtor =
true;
6400 NeedsGlobalCtor =
false;
6404 Init = llvm::PoisonValue::get(
getTypes().ConvertType(T));
6412 DelayedCXXInitPosition.erase(D);
6419 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6424 llvm::Type* InitType =
Init->getType();
6425 llvm::Constant *Entry =
6429 Entry = Entry->stripPointerCasts();
6432 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6443 if (!GV || GV->getValueType() != InitType ||
6444 GV->getType()->getAddressSpace() !=
6448 Entry->setName(StringRef());
6453 ->stripPointerCasts());
6456 llvm::Constant *NewPtrForOldDecl =
6457 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6459 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6467 if (D->
hasAttr<AnnotateAttr>())
6480 if (LangOpts.CUDA) {
6481 if (LangOpts.CUDAIsDevice) {
6484 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6487 GV->setExternallyInitialized(
true);
6494 if (LangOpts.HLSL &&
6499 GV->setExternallyInitialized(
true);
6501 GV->setInitializer(
Init);
6508 emitter->finalize(GV);
6511 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6512 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6516 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6517 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6519 GV->setConstant(
true);
6524 if (std::optional<CharUnits> AlignValFromAllocate =
6526 AlignVal = *AlignValFromAllocate;
6544 Linkage == llvm::GlobalValue::ExternalLinkage &&
6545 Context.getTargetInfo().getTriple().isOSDarwin() &&
6547 Linkage = llvm::GlobalValue::InternalLinkage;
6552 if (LangOpts.HLSL &&
6554 Linkage = llvm::GlobalValue::ExternalLinkage;
6557 if (D->
hasAttr<DLLImportAttr>())
6558 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6559 else if (D->
hasAttr<DLLExportAttr>())
6560 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6562 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6564 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6566 GV->setConstant(
false);
6571 if (!GV->getInitializer()->isNullValue())
6572 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6575 setNonAliasAttributes(D, GV);
6577 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6579 CXXThreadLocals.push_back(D);
6586 if (NeedsGlobalCtor || NeedsGlobalDtor)
6587 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6589 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6594 DI->EmitGlobalVariable(GV, D);
6602 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6613 if (D->
hasAttr<SectionAttr>())
6619 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6620 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6621 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6622 D->
hasAttr<PragmaClangRodataSectionAttr>())
6630 if (D->
hasAttr<WeakImportAttr>())
6639 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6640 if (D->
hasAttr<AlignedAttr>())
6643 if (Context.isAlignmentRequired(VarType))
6647 for (
const FieldDecl *FD : RD->fields()) {
6648 if (FD->isBitField())
6650 if (FD->
hasAttr<AlignedAttr>())
6652 if (Context.isAlignmentRequired(FD->
getType()))
6664 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6665 Context.getTypeAlignIfKnown(D->
getType()) >
6672llvm::GlobalValue::LinkageTypes
6676 return llvm::Function::InternalLinkage;
6679 return llvm::GlobalVariable::WeakAnyLinkage;
6683 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6688 return llvm::GlobalValue::AvailableExternallyLinkage;
6702 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6703 : llvm::Function::InternalLinkage;
6717 return llvm::Function::ExternalLinkage;
6720 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6721 : llvm::Function::InternalLinkage;
6722 return llvm::Function::WeakODRLinkage;
6729 CodeGenOpts.NoCommon))
6730 return llvm::GlobalVariable::CommonLinkage;
6736 if (D->
hasAttr<SelectAnyAttr>())
6737 return llvm::GlobalVariable::WeakODRLinkage;
6741 return llvm::GlobalVariable::ExternalLinkage;
6744llvm::GlobalValue::LinkageTypes
6753 llvm::Function *newFn) {
6755 if (old->use_empty())
6758 llvm::Type *newRetTy = newFn->getReturnType();
6763 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6765 llvm::User *user = ui->getUser();
6769 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6770 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6776 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6779 if (!callSite->isCallee(&*ui))
6784 if (callSite->getType() != newRetTy && !callSite->use_empty())
6789 llvm::AttributeList oldAttrs = callSite->getAttributes();
6792 unsigned newNumArgs = newFn->arg_size();
6793 if (callSite->arg_size() < newNumArgs)
6799 bool dontTransform =
false;
6800 for (llvm::Argument &A : newFn->args()) {
6801 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6802 dontTransform =
true;
6807 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6815 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6819 callSite->getOperandBundlesAsDefs(newBundles);
6821 llvm::CallBase *newCall;
6823 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6824 callSite->getIterator());
6827 newCall = llvm::InvokeInst::Create(
6828 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6829 newArgs, newBundles,
"", callSite->getIterator());
6833 if (!newCall->getType()->isVoidTy())
6834 newCall->takeName(callSite);
6835 newCall->setAttributes(
6836 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6837 oldAttrs.getRetAttrs(), newArgAttrs));
6838 newCall->setCallingConv(callSite->getCallingConv());
6841 if (!callSite->use_empty())
6842 callSite->replaceAllUsesWith(newCall);
6845 if (callSite->getDebugLoc())
6846 newCall->setDebugLoc(callSite->getDebugLoc());
6848 callSitesToBeRemovedFromParent.push_back(callSite);
6851 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6852 callSite->eraseFromParent();
6866 llvm::Function *NewFn) {
6876 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6888void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6889 llvm::GlobalValue *GV) {
6897 if (!GV || (GV->getValueType() != Ty))
6903 if (!GV->isDeclaration())
6913 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
6914 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
6926 setNonAliasAttributes(GD, Fn);
6928 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
6929 (CodeGenOpts.OptimizationLevel == 0) &&
6932 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
6934 !D->
hasAttr<NoInlineAttr>() &&
6935 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
6936 !D->
hasAttr<OptimizeNoneAttr>() &&
6937 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
6938 !ShouldAddOptNone) {
6939 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
6949 auto UnwindMode = CodeGenOpts.getWinX64EHUnwind();
6950 if (UnwindMode != llvm::WinX64EHUnwindMode::Default &&
6951 UnwindMode != llvm::WinX64EHUnwindMode::V3 &&
6952 Fn->needsUnwindTableEntry()) {
6953 bool HasEGPR =
false;
6954 if (Fn->hasFnAttribute(
"target-features")) {
6956 Fn->getFnAttribute(
"target-features").getValueAsString();
6958 Feats.split(Tokens,
',', -1,
false);
6959 for (StringRef
Tok : Tokens) {
6962 else if (
Tok ==
"-egpr")
6966 HasEGPR = Context.getTargetInfo().hasFeature(
"egpr");
6969 unsigned DiagID = Diags.getCustomDiagID(
6971 "EGPR target feature requires unwind version 3");
6977 auto GetPriority = [
this](
const auto *Attr) ->
int {
6978 Expr *E = Attr->getPriority();
6982 return Attr->DefaultPriority;
6985 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
6987 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
6993void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
6995 const AliasAttr *AA = D->
getAttr<AliasAttr>();
6996 assert(AA &&
"Not an alias?");
7000 if (AA->getAliasee() == MangledName) {
7001 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7008 if (Entry && !Entry->isDeclaration())
7011 Aliases.push_back(GD);
7017 llvm::Constant *Aliasee;
7018 llvm::GlobalValue::LinkageTypes
LT;
7020 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
7026 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
7033 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
7035 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
7038 if (GA->getAliasee() == Entry) {
7039 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
7043 assert(Entry->isDeclaration());
7052 GA->takeName(Entry);
7054 Entry->replaceAllUsesWith(GA);
7055 Entry->eraseFromParent();
7057 GA->setName(MangledName);
7065 GA->setLinkage(llvm::Function::WeakAnyLinkage);
7068 if (
const auto *VD = dyn_cast<VarDecl>(D))
7069 if (VD->getTLSKind())
7080void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
7082 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
7083 assert(IFA &&
"Not an ifunc?");
7087 if (IFA->getResolver() == MangledName) {
7088 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7094 if (Entry && !Entry->isDeclaration()) {
7097 DiagnosedConflictingDefinitions.insert(GD).second) {
7098 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
7101 diag::note_previous_definition);
7106 Aliases.push_back(GD);
7112 llvm::Constant *Resolver =
7113 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
7117 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
7118 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
7120 if (GIF->getResolver() == Entry) {
7121 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7124 assert(Entry->isDeclaration());
7133 GIF->takeName(Entry);
7135 Entry->replaceAllUsesWith(GIF);
7136 Entry->eraseFromParent();
7138 GIF->setName(MangledName);
7144 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
7145 (llvm::Intrinsic::ID)IID, Tys);
7148static llvm::StringMapEntry<llvm::GlobalVariable *> &
7151 bool &IsUTF16,
unsigned &StringLength) {
7152 StringRef String = Literal->getString();
7153 unsigned NumBytes = String.size();
7156 if (!Literal->containsNonAsciiOrNull()) {
7157 StringLength = NumBytes;
7158 return *Map.insert(std::make_pair(String,
nullptr)).first;
7165 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
7166 llvm::UTF16 *ToPtr = &ToBuf[0];
7168 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
7169 ToPtr + NumBytes, llvm::strictConversion);
7172 StringLength = ToPtr - &ToBuf[0];
7176 return *Map.insert(std::make_pair(
7177 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7178 (StringLength + 1) * 2),
7184 unsigned StringLength = 0;
7185 bool isUTF16 =
false;
7186 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7191 if (
auto *
C = Entry.second)
7196 const llvm::Triple &Triple =
getTriple();
7199 const bool IsSwiftABI =
7200 static_cast<unsigned>(CFRuntime) >=
7205 if (!CFConstantStringClassRef) {
7206 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7208 Ty = llvm::ArrayType::get(Ty, 0);
7210 switch (CFRuntime) {
7214 CFConstantStringClassName =
7215 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7216 :
"$s10Foundation19_NSCFConstantStringCN";
7220 CFConstantStringClassName =
7221 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7222 :
"$S10Foundation19_NSCFConstantStringCN";
7226 CFConstantStringClassName =
7227 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7228 :
"__T010Foundation19_NSCFConstantStringCN";
7235 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7236 llvm::GlobalValue *GV =
nullptr;
7238 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7245 if ((VD = dyn_cast<VarDecl>(
Result)))
7248 if (Triple.isOSBinFormatELF()) {
7250 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7252 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7253 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7254 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7256 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7264 CFConstantStringClassRef =
7265 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7268 QualType CFTy = Context.getCFConstantStringType();
7273 auto Fields = Builder.beginStruct(STy);
7282 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7283 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7285 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7289 llvm::Constant *
C =
nullptr;
7292 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7293 Entry.first().size() / 2);
7294 C = llvm::ConstantDataArray::get(VMContext, Arr);
7296 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7302 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7303 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7304 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7307 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7308 : Context.getTypeAlignInChars(Context.CharTy);
7314 if (Triple.isOSBinFormatMachO())
7315 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7316 :
"__TEXT,__cstring,cstring_literals");
7319 else if (Triple.isOSBinFormatELF())
7320 GV->setSection(
".rodata");
7326 llvm::IntegerType *LengthTy =
7336 Fields.addInt(LengthTy, StringLength);
7344 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7346 llvm::GlobalVariable::PrivateLinkage);
7347 GV->addAttribute(
"objc_arc_inert");
7348 switch (Triple.getObjectFormat()) {
7349 case llvm::Triple::UnknownObjectFormat:
7350 llvm_unreachable(
"unknown file format");
7351 case llvm::Triple::DXContainer:
7352 case llvm::Triple::GOFF:
7353 case llvm::Triple::SPIRV:
7354 case llvm::Triple::XCOFF:
7355 llvm_unreachable(
"unimplemented");
7356 case llvm::Triple::COFF:
7357 case llvm::Triple::ELF:
7358 case llvm::Triple::Wasm:
7359 GV->setSection(
"cfstring");
7361 case llvm::Triple::MachO:
7362 GV->setSection(
"__DATA,__cfstring");
7371 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7375 if (ObjCFastEnumerationStateType.isNull()) {
7376 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7380 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7381 Context.getPointerType(Context.UnsignedLongTy),
7382 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7385 for (
size_t i = 0; i < 4; ++i) {
7390 FieldTypes[i],
nullptr,
7399 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7402 return ObjCFastEnumerationStateType;
7416 assert(CAT &&
"String literal not of constant array type!");
7418 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7422 llvm::Type *ElemTy = AType->getElementType();
7423 unsigned NumElements = AType->getNumElements();
7426 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7428 Elements.reserve(NumElements);
7430 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7432 Elements.resize(NumElements);
7433 return llvm::ConstantDataArray::get(VMContext, Elements);
7436 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7438 Elements.reserve(NumElements);
7440 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7442 Elements.resize(NumElements);
7443 return llvm::ConstantDataArray::get(VMContext, Elements);
7446static llvm::GlobalVariable *
7455 auto *GV =
new llvm::GlobalVariable(
7456 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7457 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7459 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7460 if (GV->isWeakForLinker()) {
7461 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7462 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7478 llvm::GlobalVariable **Entry =
nullptr;
7479 if (!LangOpts.WritableStrings) {
7480 Entry = &ConstantStringMap[
C];
7481 if (
auto GV = *Entry) {
7482 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7485 GV->getValueType(), Alignment);
7490 StringRef GlobalVariableName;
7491 llvm::GlobalValue::LinkageTypes LT;
7496 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7497 !LangOpts.WritableStrings) {
7498 llvm::raw_svector_ostream Out(MangledNameBuffer);
7500 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7501 GlobalVariableName = MangledNameBuffer;
7503 LT = llvm::GlobalValue::PrivateLinkage;
7504 GlobalVariableName = Name;
7516 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7519 GV->getValueType(), Alignment);
7536 StringRef GlobalName) {
7537 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7542 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7545 llvm::GlobalVariable **Entry =
nullptr;
7546 if (!LangOpts.WritableStrings) {
7547 Entry = &ConstantStringMap[
C];
7548 if (
auto GV = *Entry) {
7549 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7552 GV->getValueType(), Alignment);
7558 GlobalName, Alignment);
7563 GV->getValueType(), Alignment);
7581 MaterializedType = E->
getType();
7585 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7586 if (!InsertResult.second) {
7589 if (!InsertResult.first->second) {
7594 InsertResult.first->second =
new llvm::GlobalVariable(
7595 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7599 llvm::cast<llvm::GlobalVariable>(
7600 InsertResult.first->second->stripPointerCasts())
7609 llvm::raw_svector_ostream Out(Name);
7631 std::optional<ConstantEmitter> emitter;
7632 llvm::Constant *InitialValue =
nullptr;
7637 emitter.emplace(*
this);
7638 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7643 Type = InitialValue->getType();
7652 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7654 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7658 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7662 Linkage = llvm::GlobalVariable::InternalLinkage;
7666 auto *GV =
new llvm::GlobalVariable(
7668 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7669 if (emitter) emitter->finalize(GV);
7671 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7673 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7675 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7679 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7680 if (VD->getTLSKind())
7682 llvm::Constant *CV = GV;
7685 GV, llvm::PointerType::get(
7691 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7693 Entry->replaceAllUsesWith(CV);
7694 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7703void CodeGenModule::EmitObjCPropertyImplementations(
const
7716 if (!Getter || Getter->isSynthesizedAccessorStub())
7719 auto *Setter = PID->getSetterMethodDecl();
7720 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7731 if (ivar->getType().isDestructedType())
7752void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7765 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7780 getContext().getObjCIdType(),
nullptr, D,
true,
7786 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7791void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7798 EmitDeclContext(LSD);
7801void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7803 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7806 std::unique_ptr<CodeGenFunction> &CurCGF =
7807 GlobalTopLevelStmtBlockInFlight.first;
7811 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7819 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7820 FunctionArgList Args;
7822 const CGFunctionInfo &FnInfo =
7825 llvm::Function *
Fn = llvm::Function::Create(
7826 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7828 CurCGF.reset(
new CodeGenFunction(*
this));
7829 GlobalTopLevelStmtBlockInFlight.second = D;
7830 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7832 CXXGlobalInits.push_back(Fn);
7835 CurCGF->EmitStmt(D->
getStmt());
7838void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7839 for (
auto *I : DC->
decls()) {
7845 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7846 for (
auto *M : OID->methods())
7865 case Decl::CXXConversion:
7866 case Decl::CXXMethod:
7867 case Decl::Function:
7874 case Decl::CXXDeductionGuide:
7879 case Decl::Decomposition:
7880 case Decl::VarTemplateSpecialization:
7882 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
7883 for (
auto *B : DD->flat_bindings())
7884 if (
auto *HD = B->getHoldingVar())
7891 case Decl::IndirectField:
7895 case Decl::Namespace:
7898 case Decl::ClassTemplateSpecialization: {
7901 if (Spec->getSpecializationKind() ==
7903 Spec->hasDefinition())
7904 DI->completeTemplateDefinition(*Spec);
7906 case Decl::CXXRecord: {
7910 DI->EmitAndRetainType(
7914 DI->completeUnusedClass(*CRD);
7917 for (
auto *I : CRD->
decls())
7923 case Decl::UsingShadow:
7924 case Decl::ClassTemplate:
7925 case Decl::VarTemplate:
7927 case Decl::VarTemplatePartialSpecialization:
7928 case Decl::FunctionTemplate:
7929 case Decl::TypeAliasTemplate:
7938 case Decl::UsingEnum:
7942 case Decl::NamespaceAlias:
7946 case Decl::UsingDirective:
7950 case Decl::CXXConstructor:
7953 case Decl::CXXDestructor:
7957 case Decl::StaticAssert:
7958 case Decl::ExplicitInstantiation:
7965 case Decl::ObjCInterface:
7966 case Decl::ObjCCategory:
7969 case Decl::ObjCProtocol: {
7971 if (Proto->isThisDeclarationADefinition())
7972 ObjCRuntime->GenerateProtocol(Proto);
7976 case Decl::ObjCCategoryImpl:
7982 case Decl::ObjCImplementation: {
7984 EmitObjCPropertyImplementations(OMD);
7985 EmitObjCIvarInitializations(OMD);
7986 ObjCRuntime->GenerateClass(OMD);
7990 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7991 OMD->getClassInterface()), OMD->getLocation());
7994 case Decl::ObjCMethod: {
8001 case Decl::ObjCCompatibleAlias:
8005 case Decl::PragmaComment: {
8007 switch (PCD->getCommentKind()) {
8009 llvm_unreachable(
"unexpected pragma comment kind");
8024 case Decl::PragmaDetectMismatch: {
8030 case Decl::LinkageSpec:
8034 case Decl::FileScopeAsm: {
8036 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
8039 if (LangOpts.OpenMPIsTargetDevice)
8042 if (LangOpts.SYCLIsDevice)
8045 getModule().appendModuleInlineAsm(AD->getAsmString());
8049 case Decl::TopLevelStmt:
8053 case Decl::Import: {
8057 if (!ImportedModules.insert(Import->getImportedModule()))
8061 if (!Import->getImportedOwningModule()) {
8063 DI->EmitImportDecl(*Import);
8069 if (CXX20ModuleInits && Import->getImportedModule() &&
8070 Import->getImportedModule()->isNamedModule())
8079 Visited.insert(Import->getImportedModule());
8080 Stack.push_back(Import->getImportedModule());
8082 while (!Stack.empty()) {
8084 if (!EmittedModuleInitializers.insert(Mod).second)
8087 for (
auto *D : Context.getModuleInitializers(Mod))
8094 if (Submodule->IsExplicit)
8097 if (Visited.insert(Submodule).second)
8098 Stack.push_back(Submodule);
8108 case Decl::OMPThreadPrivate:
8112 case Decl::OMPAllocate:
8116 case Decl::OMPDeclareReduction:
8120 case Decl::OMPDeclareMapper:
8124 case Decl::OMPRequires:
8129 case Decl::TypeAlias:
8131 DI->EmitAndRetainType(
getContext().getTypedefType(
8139 DI->EmitAndRetainType(
8146 DI->EmitAndRetainType(
8150 case Decl::HLSLRootSignature:
8153 case Decl::HLSLBuffer:
8157 case Decl::OpenACCDeclare:
8160 case Decl::OpenACCRoutine:
8175 if (!CodeGenOpts.CoverageMapping)
8178 case Decl::CXXConversion:
8179 case Decl::CXXMethod:
8180 case Decl::Function:
8181 case Decl::ObjCMethod:
8182 case Decl::CXXConstructor:
8183 case Decl::CXXDestructor: {
8192 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8202 if (!CodeGenOpts.CoverageMapping)
8204 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8205 if (Fn->isTemplateInstantiation())
8208 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8216 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8219 const Decl *D = Entry.first;
8221 case Decl::CXXConversion:
8222 case Decl::CXXMethod:
8223 case Decl::Function:
8224 case Decl::ObjCMethod: {
8231 case Decl::CXXConstructor: {
8238 case Decl::CXXDestructor: {
8255 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8256 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8257 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8258 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8259 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8268 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8269 return llvm::ConstantInt::get(i64, PtrInt);
8273 llvm::NamedMDNode *&GlobalMetadata,
8275 llvm::GlobalValue *
Addr) {
8276 if (!GlobalMetadata)
8278 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8281 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8284 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8287bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8288 llvm::GlobalValue *CppFunc) {
8290 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8293 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8296 if (Elem == CppFunc)
8302 for (llvm::User *User : Elem->users()) {
8306 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8307 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8310 for (llvm::User *CEUser : ConstExpr->users()) {
8311 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8312 IFuncs.push_back(IFunc);
8317 CEs.push_back(ConstExpr);
8318 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8319 IFuncs.push_back(IFunc);
8331 for (llvm::GlobalIFunc *IFunc : IFuncs)
8332 IFunc->setResolver(
nullptr);
8333 for (llvm::ConstantExpr *ConstExpr : CEs)
8334 ConstExpr->destroyConstant();
8338 Elem->eraseFromParent();
8340 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8345 llvm::FunctionType::get(IFunc->getType(),
false);
8346 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8347 CppFunc->getName(), ResolverTy, {},
false);
8348 IFunc->setResolver(Resolver);
8358void CodeGenModule::EmitStaticExternCAliases() {
8361 for (
auto &I : StaticExternCValues) {
8362 const IdentifierInfo *Name = I.first;
8363 llvm::GlobalValue *Val = I.second;
8371 llvm::GlobalValue *ExistingElem =
8376 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8383 auto Res = Manglings.find(MangledName);
8384 if (Res == Manglings.end())
8386 Result = Res->getValue();
8397void CodeGenModule::EmitDeclMetadata() {
8398 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8400 for (
auto &I : MangledDeclNames) {
8401 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8411void CodeGenFunction::EmitDeclMetadata() {
8412 if (LocalDeclMap.empty())
return;
8417 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8419 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8421 for (
auto &I : LocalDeclMap) {
8422 const Decl *D = I.first;
8423 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8424 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8426 Alloca->setMetadata(
8427 DeclPtrKind, llvm::MDNode::get(
8428 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8429 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8436void CodeGenModule::EmitVersionIdentMetadata() {
8437 llvm::NamedMDNode *IdentMetadata =
8438 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8440 llvm::LLVMContext &Ctx = TheModule.getContext();
8442 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8443 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8446void CodeGenModule::EmitCommandLineMetadata() {
8447 llvm::NamedMDNode *CommandLineMetadata =
8448 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8450 llvm::LLVMContext &Ctx = TheModule.getContext();
8452 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8453 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8456void CodeGenModule::EmitCoverageFile() {
8457 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8461 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8462 llvm::LLVMContext &Ctx = TheModule.getContext();
8463 auto *CoverageDataFile =
8465 auto *CoverageNotesFile =
8467 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8468 llvm::MDNode *CU = CUNode->getOperand(i);
8469 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8470 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8483 LangOpts.ObjCRuntime.isGNUFamily())
8484 return ObjCRuntime->GetEHType(Ty);
8491 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8493 for (
auto RefExpr : D->
varlist()) {
8496 VD->getAnyInitializer() &&
8497 !VD->getAnyInitializer()->isConstantInitializer(
getContext());
8503 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8504 CXXGlobalInits.push_back(InitFunction);
8509CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
8513 FnType->getReturnType(), FnType->getParamTypes(),
8514 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8516 llvm::Metadata *&InternalId = Map[T.getCanonicalType()];
8521 std::string OutName;
8522 llvm::raw_string_ostream Out(OutName);
8527 Out <<
".normalized";
8550 return CreateMetadataIdentifierImpl(T, MetadataIdMap,
"");
8555 return CreateMetadataIdentifierImpl(T, VirtualMetadataIdMap,
".virtual");
8559 return CreateMetadataIdentifierImpl(T, GeneralizedMetadataIdMap,
8567 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8568 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8569 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8570 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8571 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8572 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8573 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8574 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8582 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8584 if (CodeGenOpts.SanitizeCfiCrossDso)
8586 VTable->addTypeMetadata(Offset.getQuantity(),
8587 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8590 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8591 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8597 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8607 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8622 bool forPointeeType) {
8633 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8640 bool AlignForArray = T->isArrayType();
8646 if (T->isIncompleteType()) {
8663 if (T.getQualifiers().hasUnaligned()) {
8665 }
else if (forPointeeType && !AlignForArray &&
8666 (RD = T->getAsCXXRecordDecl())) {
8677 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8690 if (NumAutoVarInit >= StopAfter) {
8693 if (!NumAutoVarInit) {
8707 const Decl *D)
const {
8711 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8713 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8719 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8723 llvm::MD5::MD5Result
Result;
8724 for (
const auto &Arg : PreprocessorOpts.Macros)
8725 Hash.update(Arg.first);
8729 llvm::sys::fs::UniqueID ID;
8733 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8737 SM.getDiagnostics().Report(diag::err_cannot_open_file)
8738 << PLoc.
getFilename() << Status.getError().message();
8740 ID = Status->getUniqueID();
8742 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8743 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8750 assert(DeferredDeclsToEmit.empty() &&
8751 "Should have emitted all decls deferred to emit.");
8752 assert(NewBuilder->DeferredDecls.empty() &&
8753 "Newly created module should not have deferred decls");
8754 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8755 assert(EmittedDeferredDecls.empty() &&
8756 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8758 assert(NewBuilder->DeferredVTables.empty() &&
8759 "Newly created module should not have deferred vtables");
8760 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8762 assert(NewBuilder->EmittedVTables.empty() &&
8763 "Newly created module should not have defined vtables");
8764 NewBuilder->EmittedVTables = std::move(EmittedVTables);
8766 assert(NewBuilder->MangledDeclNames.empty() &&
8767 "Newly created module should not have mangled decl names");
8768 assert(NewBuilder->Manglings.empty() &&
8769 "Newly created module should not have manglings");
8770 NewBuilder->Manglings = std::move(Manglings);
8772 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8774 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
8778 std::string OutName;
8779 llvm::raw_string_ostream Out(OutName);
8787 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8796 return RequireVectorDeletingDtor.count(RD);
8800 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8802 RequireVectorDeletingDtor.insert(RD);
8816 if (Entry && !Entry->isDeclaration()) {
8821 auto *NewFn = llvm::Function::Create(
8823 llvm::Function::ExternalLinkage, VDName, &
getModule());
8824 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
8826 NewFn->takeName(VDEntry);
8827 VDEntry->replaceAllUsesWith(NewFn);
8828 VDEntry->eraseFromParent();
8829 Entry->replaceAllUsesWith(NewFn);
8830 Entry->eraseFromParent();
8835 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.
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.
RecordDecl * getDefinitionOrSelf() const
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
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)
std::unique_ptr< TargetCodeGenInfo > createSystemZ_ZOS_TargetCodeGenInfo(CodeGenModule &CGM, bool HasVector, bool SoftFloatABI)
CGCUDARuntime * CreateNVCUDARuntime(CodeGenModule &CGM)
Creates an instance of a CUDA runtime class.
std::unique_ptr< TargetCodeGenInfo > createLoongArchTargetCodeGenInfo(CodeGenModule &CGM, unsigned GRLen, unsigned FLen)
std::unique_ptr< TargetCodeGenInfo > createPPC64TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWinX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createXCoreTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCSKYTargetCodeGenInfo(CodeGenModule &CGM, unsigned FLen)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
constexpr bool isInitializedByPipeline(LangAS AS)
bool LT(InterpState &S, CodePtr OpPC)
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...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
std::optional< StringRef > Architecture
llvm::SmallVector< StringRef, 8 > Features
llvm::CallingConv::ID RuntimeCC
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::PointerType * ConstGlobalsPtrTy
void* in the address space for constant globals
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * CharTy
char
unsigned char PointerWidthInBits
The width of a pointer into the generic address space.
unsigned char IntAlignInBytes
llvm::Type * HalfTy
half, bfloat, float, double
unsigned char SizeSizeInBytes
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * SizeTy
llvm::PointerType * GlobalsInt8PtrTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::IntegerType * IntTy
int
llvm::IntegerType * Int16Ty
llvm::PointerType * ProgramPtrTy
Pointer in program address space.
unsigned char PointerAlignInBytes
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
llvm::PointerType * AllocaInt8PtrTy
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool hasSideEffects() const
Return true if the evaluated expression has side effects.
Extra information about a function prototype.
static const LangStandard & getLangStandardForKind(Kind K)
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
A library or framework to link against when an entity from this module is used.
PointerAuthSchema InitFiniPointers
The ABI for function addresses in .init_array and .fini_array.
Describes how types, statements, expressions, and declarations should be printed.