52#include "llvm/ABI/IRTypeMapper.h"
53#include "llvm/ABI/TargetInfo.h"
54#include "llvm/ADT/STLExtras.h"
55#include "llvm/ADT/StringExtras.h"
56#include "llvm/ADT/StringSwitch.h"
57#include "llvm/Analysis/TargetLibraryInfo.h"
58#include "llvm/BinaryFormat/ELF.h"
59#include "llvm/IR/AttributeMask.h"
60#include "llvm/IR/CallingConv.h"
61#include "llvm/IR/DataLayout.h"
62#include "llvm/IR/Intrinsics.h"
63#include "llvm/IR/LLVMContext.h"
64#include "llvm/IR/Module.h"
65#include "llvm/IR/ProfileSummary.h"
66#include "llvm/ProfileData/InstrProfReader.h"
67#include "llvm/ProfileData/SampleProf.h"
68#include "llvm/Support/ARMBuildAttributes.h"
69#include "llvm/Support/CRC.h"
70#include "llvm/Support/CodeGen.h"
71#include "llvm/Support/CommandLine.h"
72#include "llvm/Support/ConvertUTF.h"
73#include "llvm/Support/ErrorHandling.h"
74#include "llvm/Support/TimeProfiler.h"
75#include "llvm/TargetParser/AArch64TargetParser.h"
76#include "llvm/TargetParser/RISCVISAInfo.h"
77#include "llvm/TargetParser/Triple.h"
78#include "llvm/TargetParser/X86TargetParser.h"
79#include "llvm/Transforms/Instrumentation/KCFI.h"
80#include "llvm/Transforms/Utils/BuildLibCalls.h"
81#include "llvm/Transforms/Utils/KCFIHash.h"
89 "limited-coverage-experimental", llvm::cl::Hidden,
90 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
97 case TargetCXXABI::AppleARM64:
98 case TargetCXXABI::Fuchsia:
99 case TargetCXXABI::GenericAArch64:
100 case TargetCXXABI::GenericARM:
101 case TargetCXXABI::iOS:
102 case TargetCXXABI::WatchOS:
103 case TargetCXXABI::GenericMIPS:
104 case TargetCXXABI::GenericItanium:
105 case TargetCXXABI::WebAssembly:
106 case TargetCXXABI::XL:
108 case TargetCXXABI::Microsoft:
112 llvm_unreachable(
"invalid C++ ABI kind");
115static std::unique_ptr<TargetCodeGenInfo>
118 const llvm::Triple &Triple =
Target.getTriple();
121 switch (Triple.getArch()) {
125 case llvm::Triple::m68k:
127 case llvm::Triple::mips:
128 case llvm::Triple::mipsel:
129 if (Triple.getOS() == llvm::Triple::Win32)
133 case llvm::Triple::mips64:
134 case llvm::Triple::mips64el:
137 case llvm::Triple::avr: {
141 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
142 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
146 case llvm::Triple::aarch64:
147 case llvm::Triple::aarch64_32:
148 case llvm::Triple::aarch64_be: {
150 if (
Target.getABI() ==
"darwinpcs")
151 Kind = AArch64ABIKind::DarwinPCS;
152 else if (Triple.isOSWindows())
154 else if (
Target.getABI() ==
"aapcs-soft")
155 Kind = AArch64ABIKind::AAPCSSoft;
160 case llvm::Triple::wasm32:
161 case llvm::Triple::wasm64: {
163 if (
Target.getABI() ==
"experimental-mv")
164 Kind = WebAssemblyABIKind::ExperimentalMV;
168 case llvm::Triple::arm:
169 case llvm::Triple::armeb:
170 case llvm::Triple::thumb:
171 case llvm::Triple::thumbeb: {
172 if (Triple.getOS() == llvm::Triple::Win32)
176 StringRef ABIStr =
Target.getABI();
177 if (ABIStr ==
"apcs-gnu")
178 Kind = ARMABIKind::APCS;
179 else if (ABIStr ==
"aapcs16")
180 Kind = ARMABIKind::AAPCS16_VFP;
181 else if (CodeGenOpts.
FloatABI ==
"hard" ||
182 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
183 Kind = ARMABIKind::AAPCS_VFP;
188 case llvm::Triple::ppc: {
189 if (Triple.isOSAIX())
196 case llvm::Triple::ppcle: {
201 case llvm::Triple::ppc64:
202 if (Triple.isOSAIX())
205 if (Triple.isOSBinFormatELF()) {
207 if (
Target.getABI() ==
"elfv2")
208 Kind = PPC64_SVR4_ABIKind::ELFv2;
209 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
214 case llvm::Triple::ppc64le: {
215 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
217 if (
Target.getABI() ==
"elfv1")
218 Kind = PPC64_SVR4_ABIKind::ELFv1;
219 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
224 case llvm::Triple::nvptx:
225 case llvm::Triple::nvptx64:
228 case llvm::Triple::msp430:
231 case llvm::Triple::riscv32:
232 case llvm::Triple::riscv64:
233 case llvm::Triple::riscv32be:
234 case llvm::Triple::riscv64be: {
235 StringRef ABIStr =
Target.getABI();
237 unsigned ABIFLen = 0;
238 if (ABIStr.ends_with(
"f"))
240 else if (ABIStr.ends_with(
"d"))
242 bool EABI = ABIStr.ends_with(
"e");
246 case llvm::Triple::systemz: {
247 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
248 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
252 case llvm::Triple::tce:
253 case llvm::Triple::tcele:
254 case llvm::Triple::tcele64:
257 case llvm::Triple::x86: {
258 bool IsDarwinVectorABI = Triple.isOSDarwin();
259 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
261 if (Triple.getOS() == llvm::Triple::Win32) {
263 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
264 CodeGenOpts.NumRegisterParameters);
267 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
268 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
271 case llvm::Triple::x86_64: {
272 StringRef ABI =
Target.getABI();
273 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
274 : ABI ==
"avx" ? X86AVXABILevel::AVX
275 : X86AVXABILevel::None);
277 switch (Triple.getOS()) {
278 case llvm::Triple::UEFI:
279 case llvm::Triple::Win32:
285 case llvm::Triple::hexagon:
287 case llvm::Triple::lanai:
289 case llvm::Triple::r600:
291 case llvm::Triple::amdgcn:
293 case llvm::Triple::sparc:
295 case llvm::Triple::sparcv9:
297 case llvm::Triple::xcore:
299 case llvm::Triple::arc:
301 case llvm::Triple::spir:
302 case llvm::Triple::spir64:
304 case llvm::Triple::spirv32:
305 case llvm::Triple::spirv64:
306 case llvm::Triple::spirv:
308 case llvm::Triple::dxil:
310 case llvm::Triple::ve:
312 case llvm::Triple::csky: {
313 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
315 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
320 case llvm::Triple::bpfeb:
321 case llvm::Triple::bpfel:
323 case llvm::Triple::loongarch32:
324 case llvm::Triple::loongarch64: {
325 StringRef ABIStr =
Target.getABI();
326 unsigned ABIFRLen = 0;
327 if (ABIStr.ends_with(
"f"))
329 else if (ABIStr.ends_with(
"d"))
338 if (!TheTargetCodeGenInfo)
340 return *TheTargetCodeGenInfo;
344 if (!CodeGenOpts.ExperimentalABILowering)
351const llvm::abi::TargetInfo &
353 if (TheLLVMABITargetInfo)
354 return *TheLLVMABITargetInfo;
357 "LLVMABI lowering requested for an unsupported target");
358 TheLLVMABITargetInfo = llvm::abi::createBPFTargetInfo(TB);
359 return *TheLLVMABITargetInfo;
363 llvm::LLVMContext &Context,
367 if (Opts.AlignDouble || Opts.OpenCL)
370 llvm::Triple Triple =
Target.getTriple();
371 llvm::DataLayout DL(
Target.getDataLayoutString());
372 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
373 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
374 llvm::Align ClangAlign(Alignment / 8);
375 if (DLAlign != ClangAlign) {
376 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
377 <<
" mapping to " << *Ty <<
" has data layout alignment "
378 << DLAlign.value() <<
" while clang specifies "
379 << ClangAlign.value() <<
"\n";
384 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
386 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
388 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
390 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
393 if (Triple.getArch() != llvm::Triple::m68k)
394 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
397 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
398 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
399 Triple.getArch() != llvm::Triple::ve)
400 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
402 if (
Target.hasFloat16Type())
403 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
405 if (
Target.hasBFloat16Type())
406 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
407 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
409 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
412 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
414 if (
Target.hasFloat128Type())
415 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
416 if (
Target.hasIbm128Type())
417 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
419 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
421 if (
Target.vectorsAreElementAligned() != DL.vectorsAreElementAligned()) {
422 llvm::errs() <<
"Datalayout for target " << Triple.str()
423 <<
" sets element-aligned vectors to '"
424 <<
Target.vectorsAreElementAligned()
425 <<
"' but clang specifies '" << DL.vectorsAreElementAligned()
439 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
440 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
442 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
446 AbiMapper = std::make_unique<QualTypeMapper>(
C, M.getDataLayout(), AbiAlloc);
447 AbiReverseMapper = std::make_unique<llvm::abi::IRTypeMapper>(
448 M.getContext(), M.getDataLayout());
452 llvm::LLVMContext &LLVMContext = M.getContext();
453 VoidTy = llvm::Type::getVoidTy(LLVMContext);
454 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
455 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
456 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
457 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
458 HalfTy = llvm::Type::getHalfTy(LLVMContext);
459 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
460 FloatTy = llvm::Type::getFloatTy(LLVMContext);
461 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
467 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
469 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
471 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
472 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
473 IntPtrTy = llvm::IntegerType::get(LLVMContext,
474 C.getTargetInfo().getMaxPointerWidth());
475 Int8PtrTy = llvm::PointerType::get(LLVMContext,
477 const llvm::DataLayout &DL = M.getDataLayout();
479 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
481 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
483 llvm::PointerType::get(LLVMContext, DL.getProgramAddressSpace());
499 createOpenCLRuntime();
501 createOpenMPRuntime();
508 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
509 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
515 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
516 CodeGenOpts.CoverageNotesFile.size() ||
517 CodeGenOpts.CoverageDataFile.size())
525 Block.GlobalUniqueCount = 0;
527 if (
C.getLangOpts().ObjC)
530 if (CodeGenOpts.hasProfileClangUse()) {
531 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
532 CodeGenOpts.ProfileInstrumentUsePath, *FS,
533 CodeGenOpts.ProfileRemappingFile);
534 if (
auto E = ReaderOrErr.takeError()) {
535 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
536 Diags.Report(diag::err_reading_profile)
537 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
541 PGOReader = std::move(ReaderOrErr.get());
546 if (CodeGenOpts.CoverageMapping)
550 if (CodeGenOpts.UniqueInternalLinkageNames &&
551 !
getModule().getSourceFileName().empty()) {
555 Context.getTargetInfo());
556 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
560 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
561 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
562 CodeGenOpts.NumRegisterParameters);
571 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
572 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
574 this->MSHotPatchFunctions.push_back(std::string{*I});
576 auto &DE = Context.getDiagnostics();
577 DE.Report(diag::err_open_hotpatch_file_failed)
579 << BufOrErr.getError().message();
584 this->MSHotPatchFunctions.push_back(FuncName);
586 llvm::sort(this->MSHotPatchFunctions);
589 if (!Context.getAuxTargetInfo())
595void CodeGenModule::createObjCRuntime() {
612 llvm_unreachable(
"bad runtime kind");
615void CodeGenModule::createOpenCLRuntime() {
619void CodeGenModule::createOpenMPRuntime() {
620 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
621 Diags.Report(diag::err_omp_host_ir_file_not_found)
622 << LangOpts.OMPHostIRFile;
627 case llvm::Triple::nvptx:
628 case llvm::Triple::nvptx64:
629 case llvm::Triple::amdgcn:
630 case llvm::Triple::spirv64:
633 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
634 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
637 if (LangOpts.OpenMPSimd)
638 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
640 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
645void CodeGenModule::createCUDARuntime() {
649void CodeGenModule::createHLSLRuntime() {
650 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
654 Replacements[Name] =
C;
657void CodeGenModule::applyReplacements() {
658 for (
auto &I : Replacements) {
659 StringRef MangledName = I.first;
660 llvm::Constant *Replacement = I.second;
665 auto *NewF = dyn_cast<llvm::Function>(Replacement);
667 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
668 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
671 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
672 CE->getOpcode() == llvm::Instruction::GetElementPtr);
673 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
678 OldF->replaceAllUsesWith(Replacement);
680 NewF->removeFromParent();
681 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
684 OldF->eraseFromParent();
689 GlobalValReplacements.push_back(std::make_pair(GV,
C));
692void CodeGenModule::applyGlobalValReplacements() {
693 for (
auto &I : GlobalValReplacements) {
694 llvm::GlobalValue *GV = I.first;
695 llvm::Constant *
C = I.second;
697 GV->replaceAllUsesWith(
C);
698 GV->eraseFromParent();
705 const llvm::Constant *
C;
706 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
707 C = GA->getAliasee();
708 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
709 C = GI->getResolver();
713 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
717 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
726 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
727 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
731 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
735 if (GV->hasCommonLinkage()) {
736 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
737 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
738 Diags.
Report(Location, diag::err_alias_to_common);
743 if (GV->isDeclaration()) {
744 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
745 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
746 << IsIFunc << IsIFunc;
749 for (
const auto &[
Decl, Name] : MangledDeclNames) {
750 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
752 if (II && II->
getName() == GV->getName()) {
753 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
757 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
767 const auto *F = dyn_cast<llvm::Function>(GV);
769 Diags.
Report(Location, diag::err_alias_to_undefined)
770 << IsIFunc << IsIFunc;
774 llvm::FunctionType *FTy = F->getFunctionType();
775 if (!FTy->getReturnType()->isPointerTy()) {
776 Diags.
Report(Location, diag::err_ifunc_resolver_return);
790 if (GVar->hasAttribute(
"toc-data")) {
791 auto GVId = GVar->getName();
794 Diags.
Report(Location, diag::warn_toc_unsupported_type)
795 << GVId <<
"the variable has an alias";
797 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
798 llvm::AttributeSet NewAttributes =
799 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
800 GVar->setAttributes(NewAttributes);
804void CodeGenModule::checkAliases() {
809 DiagnosticsEngine &Diags =
getDiags();
810 for (
const GlobalDecl &GD : Aliases) {
812 SourceLocation Location;
814 bool IsIFunc = D->hasAttr<IFuncAttr>();
815 if (
const Attr *A = D->getDefiningAttr()) {
816 Location = A->getLocation();
817 Range = A->getRange();
819 llvm_unreachable(
"Not an alias or ifunc?");
823 const llvm::GlobalValue *GV =
nullptr;
825 MangledDeclNames, Range)) {
831 GlobalDecl AliaseeGD;
834 Diags.Report(Location, diag::err_alias_to_undefined)
835 << IsIFunc << IsIFunc;
844 if (AliasIsFuncDecl != AliaseeIsFunc) {
845 Diags.Report(Location, diag::err_alias_between_function_and_variable)
848 diag::note_aliasee_declaration);
855 if (AliasIsFuncDecl && AliaseeIsFunc) {
856 QualType AliasTy = D->getType();
858 auto shouldReportTypeMismatch = [&]() {
859 const auto *AliasFTy =
861 const auto *AliaseeFTy =
863 assert(AliasFTy && AliaseeFTy);
864 if (!Context.typesAreCompatible(AliasFTy->getReturnType(),
867 const auto *AliasFPTy = dyn_cast<FunctionProtoType>(AliasFTy);
868 const auto *AliaseeFPTy = dyn_cast<FunctionProtoType>(AliaseeFTy);
870 if ((AliasFPTy && AliasFPTy->isVariadic() && !AliaseeFPTy) ||
871 (AliaseeFPTy && AliaseeFPTy->isVariadic() && !AliasFPTy))
874 if (!AliasFPTy || !AliaseeFPTy)
878 if (AliasFPTy->getNumParams() != AliaseeFPTy->getNumParams() ||
879 AliasFPTy->isVariadic() != AliaseeFPTy->isVariadic())
881 for (
unsigned i = 0; i < AliasFPTy->getNumParams(); ++i)
882 if (!Context.typesAreCompatible(AliasFPTy->getParamType(i),
883 AliaseeFPTy->getParamType(i)))
887 if (shouldReportTypeMismatch()) {
888 Diags.Report(Location, diag::warn_alias_type_mismatch)
889 << AliasTy << AliaseeTy;
891 diag::note_aliasee_declaration);
897 if (
const llvm::GlobalVariable *GVar =
898 dyn_cast<const llvm::GlobalVariable>(GV))
902 llvm::Constant *Aliasee =
906 llvm::GlobalValue *AliaseeGV;
907 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
912 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
913 StringRef AliasSection = SA->getName();
914 if (AliasSection != AliaseeGV->getSection())
915 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
916 << AliasSection << IsIFunc << IsIFunc;
924 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
925 if (GA->isInterposable()) {
926 Diags.Report(Location, diag::warn_alias_to_weak_alias)
927 << GV->getName() << GA->getName() << IsIFunc;
928 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
929 GA->getAliasee(), Alias->getType());
941 llvm::Attribute::DisableSanitizerInstrumentation);
946 for (
const GlobalDecl &GD : Aliases) {
949 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
950 Alias->eraseFromParent();
955 DeferredDeclsToEmit.clear();
956 EmittedDeferredDecls.clear();
957 DeferredAnnotations.clear();
959 OpenMPRuntime->clear();
963 StringRef MainFile) {
966 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
967 if (MainFile.empty())
968 MainFile =
"<stdin>";
969 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
972 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
975 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
979static std::optional<llvm::GlobalValue::VisibilityTypes>
986 return llvm::GlobalValue::DefaultVisibility;
988 return llvm::GlobalValue::HiddenVisibility;
990 return llvm::GlobalValue::ProtectedVisibility;
992 llvm_unreachable(
"unknown option value!");
997 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
1006 GV.setDSOLocal(
false);
1007 GV.setVisibility(*
V);
1012 if (!LO.VisibilityFromDLLStorageClass)
1015 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
1018 std::optional<llvm::GlobalValue::VisibilityTypes>
1019 NoDLLStorageClassVisibility =
1022 std::optional<llvm::GlobalValue::VisibilityTypes>
1023 ExternDeclDLLImportVisibility =
1026 std::optional<llvm::GlobalValue::VisibilityTypes>
1027 ExternDeclNoDLLStorageClassVisibility =
1030 for (llvm::GlobalValue &GV : M.global_values()) {
1031 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
1034 if (GV.isDeclarationForLinker())
1036 llvm::GlobalValue::DLLImportStorageClass
1037 ? ExternDeclDLLImportVisibility
1038 : ExternDeclNoDLLStorageClassVisibility);
1041 llvm::GlobalValue::DLLExportStorageClass
1042 ? DLLExportVisibility
1043 : NoDLLStorageClassVisibility);
1045 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
1050 const llvm::Triple &Triple,
1054 return LangOpts.getStackProtector() == Mode;
1057std::optional<llvm::Attribute::AttrKind>
1059 if (D && D->
hasAttr<NoStackProtectorAttr>())
1061 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
1063 return llvm::Attribute::StackProtectStrong;
1065 return llvm::Attribute::StackProtect;
1067 return llvm::Attribute::StackProtectStrong;
1069 return llvm::Attribute::StackProtectReq;
1070 return std::nullopt;
1076 EmitModuleInitializers(Primary);
1078 DeferredDecls.insert_range(EmittedDeferredDecls);
1079 EmittedDeferredDecls.clear();
1080 EmitVTablesOpportunistically();
1081 applyGlobalValReplacements();
1082 applyReplacements();
1083 emitMultiVersionFunctions();
1084 emitPFPFieldsWithEvaluatedOffset();
1086 if (Context.getLangOpts().IncrementalExtensions &&
1087 GlobalTopLevelStmtBlockInFlight.first) {
1089 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
1090 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
1096 EmitCXXModuleInitFunc(Primary);
1098 EmitCXXGlobalInitFunc();
1099 EmitCXXGlobalCleanUpFunc();
1100 registerGlobalDtorsWithAtExit();
1101 EmitCXXThreadLocalInitFunc();
1103 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
1105 if (Context.getLangOpts().CUDA && CUDARuntime) {
1106 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
1109 if (OpenMPRuntime) {
1110 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
1111 OpenMPRuntime->clear();
1115 PGOReader->getSummary(
false).getMD(VMContext),
1116 llvm::ProfileSummary::PSK_Instr);
1117 if (PGOStats.hasDiagnostics())
1123 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1124 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1126 EmitStaticExternCAliases();
1131 if (CoverageMapping)
1132 CoverageMapping->emit();
1133 if (CodeGenOpts.SanitizeCfiCrossDso) {
1137 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1139 emitAtAvailableLinkGuard();
1140 if (Context.getTargetInfo().getTriple().isWasm())
1147 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1148 llvm::CodeObjectVersionKind::COV_None) {
1149 getModule().addModuleFlag(llvm::Module::Error,
1150 "amdhsa_code_object_version",
1151 getTarget().getTargetOpts().CodeObjectVersion);
1156 auto *MDStr = llvm::MDString::get(
1161 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1170 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1172 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1174 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1178 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1182 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1184 auto *GV =
new llvm::GlobalVariable(
1185 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1186 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1192 auto *GV =
new llvm::GlobalVariable(
1194 llvm::Constant::getNullValue(
Int8Ty),
1203 if (CodeGenOpts.Autolink &&
1204 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1205 EmitModuleLinkOptions();
1220 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1221 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1222 for (
auto *MD : ELFDependentLibraries)
1223 NMD->addOperand(MD);
1226 if (CodeGenOpts.DwarfVersion) {
1227 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1228 CodeGenOpts.DwarfVersion);
1231 if (CodeGenOpts.Dwarf64)
1232 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1234 if (Context.getLangOpts().SemanticInterposition)
1236 getModule().setSemanticInterposition(
true);
1238 if (CodeGenOpts.EmitCodeView) {
1240 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1242 if (CodeGenOpts.CodeViewGHash) {
1243 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1245 if (CodeGenOpts.ControlFlowGuard) {
1248 llvm::Module::Warning,
"cfguard",
1249 static_cast<unsigned>(llvm::ControlFlowGuardMode::Enabled));
1250 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1253 llvm::Module::Warning,
"cfguard",
1254 static_cast<unsigned>(llvm::ControlFlowGuardMode::TableOnly));
1256 if (CodeGenOpts.getWinControlFlowGuardMechanism() !=
1257 llvm::ControlFlowGuardMechanism::Automatic) {
1260 llvm::Module::Warning,
"cfguard-mechanism",
1261 static_cast<unsigned>(CodeGenOpts.getWinControlFlowGuardMechanism()));
1263 if (CodeGenOpts.EHContGuard) {
1265 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1267 if (Context.getLangOpts().Kernel) {
1269 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1271 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1276 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1278 llvm::Metadata *Ops[2] = {
1279 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1280 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1281 llvm::Type::getInt32Ty(VMContext), 1))};
1283 getModule().addModuleFlag(llvm::Module::Require,
1284 "StrictVTablePointersRequirement",
1285 llvm::MDNode::get(VMContext, Ops));
1291 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1292 llvm::DEBUG_METADATA_VERSION);
1297 uint64_t WCharWidth =
1298 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1299 if (WCharWidth !=
getTriple().getDefaultWCharSize())
1300 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1303 getModule().addModuleFlag(llvm::Module::Warning,
1304 "zos_product_major_version",
1305 uint32_t(CLANG_VERSION_MAJOR));
1306 getModule().addModuleFlag(llvm::Module::Warning,
1307 "zos_product_minor_version",
1308 uint32_t(CLANG_VERSION_MINOR));
1309 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1310 uint32_t(CLANG_VERSION_PATCHLEVEL));
1312 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1313 llvm::MDString::get(VMContext, ProductId));
1318 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1319 llvm::MDString::get(VMContext, lang_str));
1321 time_t TT = PreprocessorOpts.SourceDateEpoch
1322 ? *PreprocessorOpts.SourceDateEpoch
1323 : std::time(
nullptr);
1324 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1325 static_cast<uint64_t
>(TT));
1328 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1329 llvm::MDString::get(VMContext,
"ascii"));
1332 llvm::Triple T = Context.getTargetInfo().getTriple();
1333 if (T.isARM() || T.isThumb()) {
1335 uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1336 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1340 StringRef ABIStr = Target.getABI();
1341 llvm::LLVMContext &Ctx = TheModule.getContext();
1342 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1343 llvm::MDString::get(Ctx, ABIStr));
1348 const std::vector<std::string> &Features =
1351 llvm::RISCVISAInfo::parseFeatures(T.isRISCV64() ? 64 : 32, Features);
1352 if (!errorToBool(ParseResult.takeError()))
1354 llvm::Module::AppendUnique,
"riscv-isa",
1356 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1359 if (CodeGenOpts.SanitizeCfiCrossDso) {
1361 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1364 if (CodeGenOpts.WholeProgramVTables) {
1368 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1369 CodeGenOpts.VirtualFunctionElimination);
1372 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1373 getModule().addModuleFlag(llvm::Module::Override,
1374 "CFI Canonical Jump Tables",
1375 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1378 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1379 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1383 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1385 llvm::Module::Append,
"Unique Source File Identifier",
1387 TheModule.getContext(),
1388 llvm::MDString::get(TheModule.getContext(),
1389 CodeGenOpts.UniqueSourceFileIdentifier)));
1392 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1393 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1396 if (CodeGenOpts.PatchableFunctionEntryOffset)
1397 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1398 CodeGenOpts.PatchableFunctionEntryOffset);
1399 if (CodeGenOpts.SanitizeKcfiArity)
1400 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1403 llvm::Module::Override,
"kcfi-hash",
1404 llvm::MDString::get(
1406 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1409 if (CodeGenOpts.CFProtectionReturn &&
1410 Target.checkCFProtectionReturnSupported(
getDiags())) {
1412 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1416 if (CodeGenOpts.CFProtectionBranch &&
1417 Target.checkCFProtectionBranchSupported(
getDiags())) {
1419 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1422 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1423 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1425 Scheme = Target.getDefaultCFBranchLabelScheme();
1427 llvm::Module::Error,
"cf-branch-label-scheme",
1433 if (CodeGenOpts.FunctionReturnThunks)
1434 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1436 if (CodeGenOpts.IndirectBranchCSPrefix)
1437 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1448 if (Context.getTargetInfo().hasFeature(
"ptrauth") &&
1449 LangOpts.getSignReturnAddressScope() !=
1451 getModule().addModuleFlag(llvm::Module::Override,
1452 "sign-return-address-buildattr", 1);
1453 if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
1454 getModule().addModuleFlag(llvm::Module::Override,
1455 "tag-stack-memory-buildattr", 1);
1457 if (T.isARM() || T.isThumb() || T.isAArch64()) {
1465 if (LangOpts.BranchTargetEnforcement)
1466 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1468 if (LangOpts.BranchProtectionPAuthLR)
1469 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1471 if (LangOpts.GuardedControlStack)
1472 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1473 if (LangOpts.hasSignReturnAddress())
1474 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1475 if (LangOpts.isSignReturnAddressScopeAll())
1476 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1478 if (!LangOpts.isSignReturnAddressWithAKey())
1479 getModule().addModuleFlag(llvm::Module::Min,
1480 "sign-return-address-with-bkey", 2);
1482 if (LangOpts.PointerAuthELFGOT)
1483 getModule().addModuleFlag(llvm::Module::Error,
"ptrauth-elf-got", 1);
1486 if (LangOpts.PointerAuthCalls)
1487 getModule().addModuleFlag(llvm::Module::Error,
1488 "ptrauth-sign-personality", 1);
1490 using namespace llvm::ELF;
1491 uint64_t PAuthABIVersion =
1492 (LangOpts.PointerAuthIntrinsics
1493 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1494 (LangOpts.PointerAuthCalls
1495 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1496 (LangOpts.PointerAuthReturns
1497 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1498 (LangOpts.PointerAuthAuthTraps
1499 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1500 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1501 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1502 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1503 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1504 (LangOpts.PointerAuthInitFini
1505 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1506 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1507 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1508 (LangOpts.PointerAuthELFGOT
1509 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1510 (LangOpts.PointerAuthIndirectGotos
1511 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1512 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1513 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1514 (LangOpts.PointerAuthFunctionTypeDiscrimination
1515 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1516 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1517 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1518 "Update when new enum items are defined");
1519 if (PAuthABIVersion != 0) {
1520 getModule().addModuleFlag(llvm::Module::Error,
1521 "aarch64-elf-pauthabi-platform",
1522 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1523 getModule().addModuleFlag(llvm::Module::Error,
1524 "aarch64-elf-pauthabi-version",
1529 if ((T.isARM() || T.isThumb()) &&
getTriple().isTargetAEABI() &&
1531 uint32_t TagVal = 0;
1532 llvm::Module::ModFlagBehavior DenormalTagBehavior = llvm::Module::Max;
1534 llvm::DenormalMode::getPositiveZero()) {
1535 TagVal = llvm::ARMBuildAttrs::PositiveZero;
1537 llvm::DenormalMode::getIEEE()) {
1538 TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1539 DenormalTagBehavior = llvm::Module::Override;
1541 llvm::DenormalMode::getPreserveSign()) {
1542 TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1544 getModule().addModuleFlag(DenormalTagBehavior,
"arm-eabi-fp-denormal",
1549 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-exceptions",
1550 llvm::ARMBuildAttrs::Allowed);
1553 TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1555 TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1556 getModule().addModuleFlag(llvm::Module::Min,
"arm-eabi-fp-number-model",
1560 if (CodeGenOpts.StackClashProtector)
1562 llvm::Module::Override,
"probe-stack",
1563 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1565 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1566 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1567 CodeGenOpts.StackProbeSize);
1569 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1570 llvm::LLVMContext &Ctx = TheModule.getContext();
1572 llvm::Module::Error,
"MemProfProfileFilename",
1573 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1576 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1580 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1581 CodeGenOpts.FP32DenormalMode.Output !=
1582 llvm::DenormalMode::IEEE);
1585 if (LangOpts.EHAsynch)
1586 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1589 if (CodeGenOpts.ImportCallOptimization)
1590 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1594 if (CodeGenOpts.getWinX64EHUnwindV2() != llvm::WinX64EHUnwindV2Mode::Disabled)
1596 llvm::Module::Warning,
"winx64-eh-unwindv2",
1597 static_cast<unsigned>(CodeGenOpts.getWinX64EHUnwindV2()));
1601 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1603 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1607 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1608 EmitOpenCLMetadata();
1615 auto Version = LangOpts.getOpenCLCompatibleVersion();
1616 llvm::Metadata *SPIRVerElts[] = {
1617 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1619 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1620 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1621 llvm::NamedMDNode *SPIRVerMD =
1622 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1623 llvm::LLVMContext &Ctx = TheModule.getContext();
1624 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1632 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1633 assert(PLevel < 3 &&
"Invalid PIC Level");
1634 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1635 if (Context.getLangOpts().PIE)
1636 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1640 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1641 .Case(
"tiny", llvm::CodeModel::Tiny)
1642 .Case(
"small", llvm::CodeModel::Small)
1643 .Case(
"kernel", llvm::CodeModel::Kernel)
1644 .Case(
"medium", llvm::CodeModel::Medium)
1645 .Case(
"large", llvm::CodeModel::Large)
1648 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1651 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1652 Context.getTargetInfo().getTriple().getArch() ==
1653 llvm::Triple::x86_64) {
1659 if (CodeGenOpts.NoPLT)
1662 CodeGenOpts.DirectAccessExternalData !=
1663 getModule().getDirectAccessExternalData()) {
1664 getModule().setDirectAccessExternalData(
1665 CodeGenOpts.DirectAccessExternalData);
1667 if (CodeGenOpts.UnwindTables)
1668 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1670 switch (CodeGenOpts.getFramePointer()) {
1675 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1678 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1681 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1684 getModule().setFramePointer(llvm::FramePointerKind::All);
1688 SimplifyPersonality();
1701 EmitVersionIdentMetadata();
1704 EmitCommandLineMetadata();
1712 getModule().setStackProtectorGuardSymbol(
1715 getModule().setStackProtectorGuardOffset(
1718 getModule().setStackProtectorGuardValueWidth(
1723 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1725 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1727 if (
getContext().getTargetInfo().getMaxTLSAlign())
1728 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1729 getContext().getTargetInfo().getMaxTLSAlign());
1747 if (!MustTailCallUndefinedGlobals.empty()) {
1749 for (
auto &I : MustTailCallUndefinedGlobals) {
1750 if (!I.first->isDefined())
1751 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1755 if (!Entry || Entry->isWeakForLinker() ||
1756 Entry->isDeclarationForLinker())
1757 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1761 for (
auto &I : MustTailCallUndefinedGlobals) {
1770 if (Entry->isDeclarationForLinker()) {
1773 Entry->hasHiddenVisibility() || Entry->hasProtectedVisibility();
1775 CalleeIsLocal = Entry->isDSOLocal();
1779 getDiags().
Report(I.second, diag::err_mips_impossible_musttail) << 1;
1790 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
1791 ErrnoTBAAMD->addOperand(IntegerNode);
1796void CodeGenModule::EmitOpenCLMetadata() {
1802 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1803 llvm::Metadata *OCLVerElts[] = {
1804 llvm::ConstantAsMetadata::get(
1805 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1806 llvm::ConstantAsMetadata::get(
1807 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1808 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1809 llvm::LLVMContext &Ctx = TheModule.getContext();
1810 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1813 EmitVersion(
"opencl.ocl.version", CLVersion);
1814 if (LangOpts.OpenCLCPlusPlus) {
1816 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1820void CodeGenModule::EmitBackendOptionsMetadata(
1821 const CodeGenOptions &CodeGenOpts) {
1823 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1824 CodeGenOpts.SmallDataLimit);
1828 if (LangOpts.AllocTokenMode) {
1829 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
1830 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
1831 llvm::MDString::get(VMContext, S));
1833 if (LangOpts.AllocTokenMax)
1835 llvm::Module::Error,
"alloc-token-max",
1836 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1837 *LangOpts.AllocTokenMax));
1838 if (CodeGenOpts.SanitizeAllocTokenFastABI)
1839 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
1840 if (CodeGenOpts.SanitizeAllocTokenExtended)
1841 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
1857 return TBAA->getTypeInfo(QTy);
1876 return TBAA->getAccessInfo(AccessType);
1883 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1889 return TBAA->getTBAAStructInfo(QTy);
1895 return TBAA->getBaseTypeInfo(QTy);
1901 return TBAA->getAccessTagInfo(Info);
1908 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1916 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1924 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1930 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1935 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1947 std::string Msg =
Type;
1949 diag::err_codegen_unsupported)
1955 diag::err_codegen_unsupported)
1962 std::string Msg =
Type;
1964 diag::err_codegen_unsupported)
1969 llvm::function_ref<
void()> Fn) {
1970 StackHandler.runWithSufficientStackSpace(Loc, Fn);
1980 if (GV->hasLocalLinkage()) {
1981 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1994 if (Context.getLangOpts().OpenMP &&
1995 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
1996 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
1997 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
1998 OMPDeclareTargetDeclAttr::DT_NoHost &&
2000 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2007 if (Context.getLangOpts().CUDAIsDevice &&
2009 !D->
hasAttr<OMPDeclareTargetDeclAttr>()) {
2010 bool NeedsProtected =
false;
2014 else if (
const auto *VD = dyn_cast<VarDecl>(D))
2015 NeedsProtected = VD->hasAttr<CUDADeviceAttr>() ||
2016 VD->hasAttr<CUDAConstantAttr>() ||
2017 VD->getType()->isCUDADeviceBuiltinSurfaceType() ||
2018 VD->getType()->isCUDADeviceBuiltinTextureType();
2019 if (NeedsProtected) {
2020 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
2026 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2030 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
2034 if (GV->hasDLLExportStorageClass()) {
2037 diag::err_hidden_visibility_dllexport);
2040 diag::err_non_default_visibility_dllimport);
2046 !GV->isDeclarationForLinker())
2051 llvm::GlobalValue *GV) {
2052 if (GV->hasLocalLinkage())
2055 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
2059 if (GV->hasDLLImportStorageClass())
2062 const llvm::Triple &TT = CGM.
getTriple();
2064 if (TT.isOSCygMing()) {
2082 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
2090 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
2094 if (!TT.isOSBinFormatELF())
2100 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
2108 return !(CGM.
getLangOpts().SemanticInterposition ||
2113 if (!GV->isDeclarationForLinker())
2119 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
2126 if (CGOpts.DirectAccessExternalData) {
2132 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
2133 if (!Var->isThreadLocal())
2158 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
2160 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
2170 if (D->
hasAttr<DLLImportAttr>())
2171 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2172 else if ((D->
hasAttr<DLLExportAttr>() ||
2174 !GV->isDeclarationForLinker())
2175 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
2195 GV->setPartition(CodeGenOpts.SymbolPartition);
2199 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
2200 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
2201 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
2202 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
2203 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
2206llvm::GlobalVariable::ThreadLocalMode
2208 switch (CodeGenOpts.getDefaultTLSModel()) {
2210 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2212 return llvm::GlobalVariable::LocalDynamicTLSModel;
2214 return llvm::GlobalVariable::InitialExecTLSModel;
2216 return llvm::GlobalVariable::LocalExecTLSModel;
2218 llvm_unreachable(
"Invalid TLS model!");
2222 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2224 llvm::GlobalValue::ThreadLocalMode TLM;
2228 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2232 GV->setThreadLocalMode(TLM);
2238 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2242 const CPUSpecificAttr *
Attr,
2264 bool OmitMultiVersionMangling =
false) {
2266 llvm::raw_svector_ostream Out(Buffer);
2275 assert(II &&
"Attempt to mangle unnamed decl.");
2276 const auto *FD = dyn_cast<FunctionDecl>(ND);
2281 Out <<
"__regcall4__" << II->
getName();
2283 Out <<
"__regcall3__" << II->
getName();
2284 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2286 Out <<
"__device_stub__" << II->
getName();
2288 DeviceKernelAttr::isOpenCLSpelling(
2289 FD->getAttr<DeviceKernelAttr>()) &&
2291 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2307 "Hash computed when not explicitly requested");
2311 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2312 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2313 switch (FD->getMultiVersionKind()) {
2317 FD->getAttr<CPUSpecificAttr>(),
2321 auto *
Attr = FD->getAttr<TargetAttr>();
2322 assert(
Attr &&
"Expected TargetAttr to be present "
2323 "for attribute mangling");
2329 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2330 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2331 "for attribute mangling");
2337 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2338 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2339 "for attribute mangling");
2346 llvm_unreachable(
"None multiversion type isn't valid here");
2356 return std::string(Out.str());
2359void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2360 const FunctionDecl *FD,
2361 StringRef &CurName) {
2368 std::string NonTargetName =
2376 "Other GD should now be a multiversioned function");
2386 if (OtherName != NonTargetName) {
2389 const auto ExistingRecord = Manglings.find(NonTargetName);
2390 if (ExistingRecord != std::end(Manglings))
2391 Manglings.remove(&(*ExistingRecord));
2392 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2397 CurName = OtherNameRef;
2399 Entry->setName(OtherName);
2409 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2423 auto FoundName = MangledDeclNames.find(CanonicalGD);
2424 if (FoundName != MangledDeclNames.end())
2425 return FoundName->second;
2462 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2463 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2472 llvm::raw_svector_ostream Out(Buffer);
2475 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2476 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2478 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2483 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2484 return Result.first->first();
2488 auto it = MangledDeclNames.begin();
2489 while (it != MangledDeclNames.end()) {
2490 if (it->second == Name)
2505 llvm::Constant *AssociatedData) {
2507 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2513 bool IsDtorAttrFunc) {
2514 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2516 DtorsUsingAtExit[Priority].push_back(Dtor);
2521 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2524void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2525 if (Fns.empty())
return;
2531 llvm::PointerType *PtrTy = llvm::PointerType::get(
2532 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2535 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2539 auto Ctors = Builder.beginArray(CtorStructTy);
2540 for (
const auto &I : Fns) {
2541 auto Ctor = Ctors.beginStruct(CtorStructTy);
2542 Ctor.addInt(
Int32Ty, I.Priority);
2543 if (InitFiniAuthSchema) {
2544 llvm::Constant *StorageAddress =
2546 ? llvm::ConstantExpr::getIntToPtr(
2547 llvm::ConstantInt::get(
2549 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2553 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2554 llvm::ConstantInt::get(
2556 Ctor.add(SignedCtorPtr);
2558 Ctor.add(I.Initializer);
2560 if (I.AssociatedData)
2561 Ctor.add(I.AssociatedData);
2563 Ctor.addNullPointer(PtrTy);
2564 Ctor.finishAndAddTo(Ctors);
2567 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2569 llvm::GlobalValue::AppendingLinkage);
2573 List->setAlignment(std::nullopt);
2578llvm::GlobalValue::LinkageTypes
2584 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2591 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2592 if (!MDS)
return nullptr;
2594 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2601 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2602 if (!UD->
hasAttr<TransparentUnionAttr>())
2604 if (!UD->
fields().empty())
2605 return UD->
fields().begin()->getType();
2614 bool GeneralizePointers) {
2627 bool GeneralizePointers) {
2630 for (
auto &Param : FnType->param_types())
2631 GeneralizedParams.push_back(
2635 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2636 GeneralizedParams, FnType->getExtProtoInfo());
2641 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2643 llvm_unreachable(
"Encountered unknown FunctionType");
2651 FnType->getReturnType(), FnType->getParamTypes(),
2652 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2654 std::string OutName;
2655 llvm::raw_string_ostream Out(OutName);
2663 Out <<
".normalized";
2665 Out <<
".generalized";
2667 return llvm::ConstantInt::get(
2673 llvm::Function *F,
bool IsThunk) {
2675 llvm::AttributeList PAL;
2678 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2682 Loc = D->getLocation();
2684 Error(Loc,
"__vectorcall calling convention is not currently supported");
2686 F->setAttributes(PAL);
2687 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2691 std::string ReadOnlyQual(
"__read_only");
2692 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2693 if (ReadOnlyPos != std::string::npos)
2695 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2697 std::string WriteOnlyQual(
"__write_only");
2698 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2699 if (WriteOnlyPos != std::string::npos)
2700 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2702 std::string ReadWriteQual(
"__read_write");
2703 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2704 if (ReadWritePos != std::string::npos)
2705 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2738 assert(((FD && CGF) || (!FD && !CGF)) &&
2739 "Incorrect use - FD and CGF should either be both null or not!");
2765 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2768 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2773 std::string typeQuals;
2777 const Decl *PDecl = parm;
2779 PDecl = TD->getDecl();
2780 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2781 if (A && A->isWriteOnly())
2782 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2783 else if (A && A->isReadWrite())
2784 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2786 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2788 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2790 auto getTypeSpelling = [&](
QualType Ty) {
2791 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2793 if (Ty.isCanonical()) {
2794 StringRef typeNameRef = typeName;
2796 if (typeNameRef.consume_front(
"unsigned "))
2797 return std::string(
"u") + typeNameRef.str();
2798 if (typeNameRef.consume_front(
"signed "))
2799 return typeNameRef.str();
2809 addressQuals.push_back(
2810 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2814 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2815 std::string baseTypeName =
2817 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2818 argBaseTypeNames.push_back(
2819 llvm::MDString::get(VMContext, baseTypeName));
2823 typeQuals =
"restrict";
2826 typeQuals += typeQuals.empty() ?
"const" :
" const";
2828 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2830 uint32_t AddrSpc = 0;
2835 addressQuals.push_back(
2836 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2840 std::string typeName = getTypeSpelling(ty);
2852 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2853 argBaseTypeNames.push_back(
2854 llvm::MDString::get(VMContext, baseTypeName));
2859 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2863 Fn->setMetadata(
"kernel_arg_addr_space",
2864 llvm::MDNode::get(VMContext, addressQuals));
2865 Fn->setMetadata(
"kernel_arg_access_qual",
2866 llvm::MDNode::get(VMContext, accessQuals));
2867 Fn->setMetadata(
"kernel_arg_type",
2868 llvm::MDNode::get(VMContext, argTypeNames));
2869 Fn->setMetadata(
"kernel_arg_base_type",
2870 llvm::MDNode::get(VMContext, argBaseTypeNames));
2871 Fn->setMetadata(
"kernel_arg_type_qual",
2872 llvm::MDNode::get(VMContext, argTypeQuals));
2876 Fn->setMetadata(
"kernel_arg_name",
2877 llvm::MDNode::get(VMContext, argNames));
2887 if (!LangOpts.Exceptions)
return false;
2890 if (LangOpts.CXXExceptions)
return true;
2893 if (LangOpts.ObjCExceptions) {
2913SmallVector<const CXXRecordDecl *, 0>
2915 llvm::SetVector<const CXXRecordDecl *> MostBases;
2920 MostBases.insert(RD);
2922 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2924 CollectMostBases(RD);
2925 return MostBases.takeVector();
2929 llvm::Function *F) {
2930 llvm::AttrBuilder B(F->getContext());
2932 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2933 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2935 if (CodeGenOpts.StackClashProtector)
2936 B.addAttribute(
"probe-stack",
"inline-asm");
2938 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2939 B.addAttribute(
"stack-probe-size",
2940 std::to_string(CodeGenOpts.StackProbeSize));
2943 B.addAttribute(llvm::Attribute::NoUnwind);
2945 if (std::optional<llvm::Attribute::AttrKind>
Attr =
2947 B.addAttribute(*
Attr);
2952 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2953 B.addAttribute(llvm::Attribute::AlwaysInline);
2957 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2959 B.addAttribute(llvm::Attribute::NoInline);
2967 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2968 B.addAttribute(
"aarch64_pstate_sm_body");
2971 if (
Attr->isNewZA())
2972 B.addAttribute(
"aarch64_new_za");
2973 if (
Attr->isNewZT0())
2974 B.addAttribute(
"aarch64_new_zt0");
2979 bool ShouldAddOptNone =
2980 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2982 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
2983 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
2986 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
2987 !D->
hasAttr<NoInlineAttr>()) {
2988 B.addAttribute(llvm::Attribute::AlwaysInline);
2989 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
2990 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2992 B.addAttribute(llvm::Attribute::OptimizeNone);
2995 B.addAttribute(llvm::Attribute::NoInline);
3000 B.addAttribute(llvm::Attribute::Naked);
3003 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
3004 F->removeFnAttr(llvm::Attribute::MinSize);
3005 }
else if (D->
hasAttr<NakedAttr>()) {
3007 B.addAttribute(llvm::Attribute::Naked);
3008 B.addAttribute(llvm::Attribute::NoInline);
3009 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
3010 B.addAttribute(llvm::Attribute::NoDuplicate);
3011 }
else if (D->
hasAttr<NoInlineAttr>() &&
3012 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3014 B.addAttribute(llvm::Attribute::NoInline);
3015 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
3016 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
3018 B.addAttribute(llvm::Attribute::AlwaysInline);
3022 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
3023 B.addAttribute(llvm::Attribute::NoInline);
3027 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3030 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
3031 return Redecl->isInlineSpecified();
3033 if (any_of(FD->
redecls(), CheckRedeclForInline))
3038 return any_of(Pattern->
redecls(), CheckRedeclForInline);
3040 if (CheckForInline(FD)) {
3041 B.addAttribute(llvm::Attribute::InlineHint);
3042 }
else if (CodeGenOpts.getInlining() ==
3045 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
3046 B.addAttribute(llvm::Attribute::NoInline);
3053 if (!D->
hasAttr<OptimizeNoneAttr>()) {
3055 if (!ShouldAddOptNone)
3056 B.addAttribute(llvm::Attribute::OptimizeForSize);
3057 B.addAttribute(llvm::Attribute::Cold);
3060 B.addAttribute(llvm::Attribute::Hot);
3061 if (D->
hasAttr<MinSizeAttr>())
3062 B.addAttribute(llvm::Attribute::MinSize);
3067 if (CodeGenOpts.DisableOutlining || D->
hasAttr<NoOutlineAttr>())
3068 B.addAttribute(llvm::Attribute::NoOutline);
3072 llvm::MaybeAlign ExplicitAlignment;
3073 if (
unsigned alignment = D->
getMaxAlignment() / Context.getCharWidth())
3074 ExplicitAlignment = llvm::Align(alignment);
3075 else if (LangOpts.FunctionAlignment)
3076 ExplicitAlignment = llvm::Align(1ull << LangOpts.FunctionAlignment);
3078 if (ExplicitAlignment) {
3079 F->setAlignment(ExplicitAlignment);
3080 F->setPreferredAlignment(ExplicitAlignment);
3081 }
else if (LangOpts.PreferredFunctionAlignment) {
3082 F->setPreferredAlignment(llvm::Align(LangOpts.PreferredFunctionAlignment));
3091 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
3096 if (CodeGenOpts.SanitizeCfiCrossDso &&
3097 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
3098 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
3106 if (CodeGenOpts.CallGraphSection) {
3107 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3114 auto *MD = dyn_cast<CXXMethodDecl>(D);
3117 llvm::Metadata *Id =
3119 MD->getType(), std::nullopt,
Base));
3120 F->addTypeMetadata(0, Id);
3127 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
3128 if (FD->
hasAttr<SYCLExternalAttr>())
3129 addSYCLModuleIdAttr(F);
3133void CodeGenModule::addSYCLModuleIdAttr(llvm::Function *Fn) {
3135 Fn->addFnAttr(
"sycl-module-id",
getModule().getModuleIdentifier());
3140 if (isa_and_nonnull<NamedDecl>(D))
3143 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
3145 if (D && D->
hasAttr<UsedAttr>())
3148 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
3150 ((CodeGenOpts.KeepPersistentStorageVariables &&
3151 (VD->getStorageDuration() ==
SD_Static ||
3152 VD->getStorageDuration() ==
SD_Thread)) ||
3153 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3154 VD->getType().isConstQualified())))
3159static std::vector<std::string>
3161 llvm::StringMap<bool> &FeatureMap) {
3162 llvm::StringMap<bool> DefaultFeatureMap;
3166 std::vector<std::string> Delta;
3167 for (
const auto &[K,
V] : FeatureMap) {
3168 auto DefaultIt = DefaultFeatureMap.find(K);
3169 if (DefaultIt == DefaultFeatureMap.end() || DefaultIt->getValue() !=
V)
3170 Delta.push_back((
V ?
"+" :
"-") + K.str());
3176bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD,
3177 llvm::AttrBuilder &Attrs,
3178 bool SetTargetFeatures) {
3184 std::vector<std::string> Features;
3185 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
3188 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
3189 assert((!TD || !TV) &&
"both target_version and target specified");
3192 bool AddedAttr =
false;
3193 if (TD || TV || SD || TC) {
3194 llvm::StringMap<bool> FeatureMap;
3201 StringRef FeatureStr = TD ? TD->getFeaturesStr() : StringRef();
3204 if (!FeatureStr.empty()) {
3205 ParsedTargetAttr ParsedAttr = Target.parseTargetAttr(FeatureStr);
3206 if (!ParsedAttr.
CPU.empty() &&
3208 TargetCPU = ParsedAttr.
CPU;
3211 if (!ParsedAttr.
Tune.empty() &&
3213 TuneCPU = ParsedAttr.
Tune;
3229 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
3230 Features.push_back((Entry.getValue() ?
"+" :
"-") +
3231 Entry.getKey().str());
3237 llvm::StringMap<bool> FeatureMap;
3251 if (!TargetCPU.empty()) {
3252 Attrs.addAttribute(
"target-cpu", TargetCPU);
3255 if (!TuneCPU.empty()) {
3256 Attrs.addAttribute(
"tune-cpu", TuneCPU);
3259 if (!Features.empty() && SetTargetFeatures) {
3260 llvm::erase_if(Features, [&](
const std::string& F) {
3263 llvm::sort(Features);
3264 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3269 llvm::SmallVector<StringRef, 8> Feats;
3270 bool IsDefault =
false;
3272 IsDefault = TV->isDefaultVersion();
3273 TV->getFeatures(Feats);
3279 Attrs.addAttribute(
"fmv-features");
3281 }
else if (!Feats.empty()) {
3283 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3284 std::string FMVFeatures;
3285 for (StringRef F : OrderedFeats)
3286 FMVFeatures.append(
"," + F.str());
3287 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3294void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3295 llvm::GlobalObject *GO) {
3300 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3303 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3304 GV->addAttribute(
"bss-section", SA->getName());
3305 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3306 GV->addAttribute(
"data-section", SA->getName());
3307 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3308 GV->addAttribute(
"rodata-section", SA->getName());
3309 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3310 GV->addAttribute(
"relro-section", SA->getName());
3313 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3316 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3317 if (!D->
getAttr<SectionAttr>())
3318 F->setSection(SA->getName());
3320 llvm::AttrBuilder Attrs(F->getContext());
3321 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3325 llvm::AttributeMask RemoveAttrs;
3326 RemoveAttrs.addAttribute(
"target-cpu");
3327 RemoveAttrs.addAttribute(
"target-features");
3328 RemoveAttrs.addAttribute(
"fmv-features");
3329 RemoveAttrs.addAttribute(
"tune-cpu");
3330 F->removeFnAttrs(RemoveAttrs);
3331 F->addFnAttrs(Attrs);
3335 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3336 GO->setSection(CSA->getName());
3337 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3338 GO->setSection(SA->getName());
3351 F->setLinkage(llvm::Function::InternalLinkage);
3353 setNonAliasAttributes(GD, F);
3364 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3368 llvm::MDNode *MD = F->getMetadata(llvm::LLVMContext::MD_type);
3369 return MD && MD->hasGeneralizedMDString();
3373 llvm::Function *F) {
3380 if (!F->hasLocalLinkage() ||
3381 F->getFunction().hasAddressTaken(
nullptr,
true,
3388 llvm::Function *F) {
3390 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3401 F->addTypeMetadata(0, MD);
3410 if (CodeGenOpts.SanitizeCfiCrossDso)
3412 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3416 llvm::CallBase *CB) {
3421 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall() ||
3426 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
3427 getLLVMContext(), {llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
3430 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3431 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3435 llvm::LLVMContext &Ctx = F->getContext();
3436 llvm::MDBuilder MDB(Ctx);
3437 llvm::StringRef Salt;
3440 if (
const auto &Info = FP->getExtraAttributeInfo())
3441 Salt = Info.CFISalt;
3443 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3452 return llvm::all_of(Name, [](
const char &
C) {
3453 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3459 for (
auto &F : M.functions()) {
3461 bool AddressTaken = F.hasAddressTaken();
3462 if (!AddressTaken && F.hasLocalLinkage())
3463 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3468 if (!AddressTaken || !F.isDeclaration())
3471 const llvm::ConstantInt *
Type;
3472 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3473 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3477 StringRef Name = F.getName();
3481 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3482 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3483 Twine(
Type->getSExtValue()) +
" */\n")
3485 M.appendModuleInlineAsm(
Asm);
3489void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3490 bool IsIncompleteFunction,
3493 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3501 if (!IsIncompleteFunction)
3508 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3510 assert(!F->arg_empty() &&
3511 F->arg_begin()->getType()
3512 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3513 "unexpected this return");
3514 F->addParamAttr(0, llvm::Attribute::Returned);
3524 if (!IsIncompleteFunction && F->isDeclaration())
3527 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3528 F->setSection(CSA->getName());
3529 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3530 F->setSection(SA->getName());
3532 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3534 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3535 else if (EA->isWarning())
3536 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3541 const FunctionDecl *FDBody;
3542 bool HasBody = FD->
hasBody(FDBody);
3544 assert(HasBody &&
"Inline builtin declarations should always have an "
3546 if (shouldEmitFunction(FDBody))
3547 F->addFnAttr(llvm::Attribute::NoBuiltin);
3553 F->addFnAttr(llvm::Attribute::NoBuiltin);
3557 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3558 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3559 if (MD->isVirtual())
3560 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3566 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3567 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3570 if (CodeGenOpts.CallGraphSection)
3573 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3579 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3580 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3582 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3586 llvm::LLVMContext &Ctx = F->getContext();
3587 llvm::MDBuilder MDB(Ctx);
3591 int CalleeIdx = *CB->encoding_begin();
3592 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3593 F->addMetadata(llvm::LLVMContext::MD_callback,
3594 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3595 CalleeIdx, PayloadIndices,
3602 "Only globals with definition can force usage.");
3603 LLVMUsed.emplace_back(GV);
3607 assert(!GV->isDeclaration() &&
3608 "Only globals with definition can force usage.");
3609 LLVMCompilerUsed.emplace_back(GV);
3614 "Only globals with definition can force usage.");
3616 LLVMCompilerUsed.emplace_back(GV);
3618 LLVMUsed.emplace_back(GV);
3622 std::vector<llvm::WeakTrackingVH> &List) {
3629 UsedArray.resize(List.size());
3630 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3632 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3636 if (UsedArray.empty())
3638 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3640 auto *GV =
new llvm::GlobalVariable(
3641 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3642 llvm::ConstantArray::get(ATy, UsedArray), Name);
3644 GV->setSection(
"llvm.metadata");
3647void CodeGenModule::emitLLVMUsed() {
3648 emitUsed(*
this,
"llvm.used", LLVMUsed);
3649 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3654 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3663 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3669 ELFDependentLibraries.push_back(
3670 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3677 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3686 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3692 if (Visited.insert(Import).second)
3709 if (LL.IsFramework) {
3710 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3711 llvm::MDString::get(Context, LL.Library)};
3713 Metadata.push_back(llvm::MDNode::get(Context, Args));
3719 llvm::Metadata *Args[2] = {
3720 llvm::MDString::get(Context,
"lib"),
3721 llvm::MDString::get(Context, LL.Library),
3723 Metadata.push_back(llvm::MDNode::get(Context, Args));
3727 auto *OptString = llvm::MDString::get(Context, Opt);
3728 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3733void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3735 "We should only emit module initializers for named modules.");
3743 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3760 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
3766void CodeGenModule::EmitModuleLinkOptions() {
3770 llvm::SetVector<clang::Module *> LinkModules;
3771 llvm::SmallPtrSet<clang::Module *, 16> Visited;
3772 SmallVector<clang::Module *, 16> Stack;
3775 for (
Module *M : ImportedModules) {
3778 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3781 if (Visited.insert(M).second)
3787 while (!Stack.empty()) {
3790 bool AnyChildren =
false;
3799 if (Visited.insert(
SM).second) {
3800 Stack.push_back(
SM);
3808 LinkModules.insert(Mod);
3815 SmallVector<llvm::MDNode *, 16> MetadataArgs;
3817 for (
Module *M : LinkModules)
3818 if (Visited.insert(M).second)
3820 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3821 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3824 if (!LinkerOptionsMetadata.empty()) {
3825 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3826 for (
auto *MD : LinkerOptionsMetadata)
3827 NMD->addOperand(MD);
3831void CodeGenModule::EmitDeferred() {
3840 if (!DeferredVTables.empty()) {
3841 EmitDeferredVTables();
3846 assert(DeferredVTables.empty());
3853 llvm::append_range(DeferredDeclsToEmit,
3857 if (DeferredDeclsToEmit.empty())
3862 std::vector<GlobalDecl> CurDeclsToEmit;
3863 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3865 for (GlobalDecl &D : CurDeclsToEmit) {
3871 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
3875 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
3891 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3909 if (!GV->isDeclaration())
3913 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3917 EmitGlobalDefinition(D, GV);
3922 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3924 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3929void CodeGenModule::EmitVTablesOpportunistically() {
3935 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3936 &&
"Only emit opportunistic vtables with optimizations");
3938 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
3940 "This queue should only contain external vtables");
3941 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3942 VTables.GenerateClassData(RD);
3944 OpportunisticVTables.clear();
3948 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3953 DeferredAnnotations.clear();
3955 if (Annotations.empty())
3959 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3960 Annotations[0]->
getType(), Annotations.size()), Annotations);
3961 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3962 llvm::GlobalValue::AppendingLinkage,
3963 Array,
"llvm.global.annotations");
3968 llvm::Constant *&AStr = AnnotationStrings[Str];
3973 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3974 auto *gv =
new llvm::GlobalVariable(
3975 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3976 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3979 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3996 SM.getExpansionLineNumber(L);
3997 return llvm::ConstantInt::get(
Int32Ty, LineNo);
4005 llvm::FoldingSetNodeID ID;
4006 for (
Expr *E : Exprs) {
4009 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
4014 LLVMArgs.reserve(Exprs.size());
4016 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
4018 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
4021 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
4022 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
4023 llvm::GlobalValue::PrivateLinkage,
Struct,
4026 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4033 const AnnotateAttr *AA,
4041 llvm::Constant *GVInGlobalsAS = GV;
4042 if (GV->getAddressSpace() !=
4044 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
4046 llvm::PointerType::get(
4047 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
4051 llvm::Constant *Fields[] = {
4052 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
4054 return llvm::ConstantStruct::getAnon(Fields);
4058 llvm::GlobalValue *GV) {
4059 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
4069 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
4072 auto &
SM = Context.getSourceManager();
4074 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
4079 return NoSanitizeL.containsLocation(Kind, Loc);
4082 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
4086 llvm::GlobalVariable *GV,
4088 StringRef Category)
const {
4090 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
4092 auto &
SM = Context.getSourceManager();
4093 if (NoSanitizeL.containsMainFile(
4094 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
4097 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
4104 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
4105 Ty = AT->getElementType();
4110 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
4118 StringRef Category)
const {
4121 auto Attr = ImbueAttr::NONE;
4123 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
4124 if (
Attr == ImbueAttr::NONE)
4125 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
4127 case ImbueAttr::NONE:
4129 case ImbueAttr::ALWAYS:
4130 Fn->addFnAttr(
"function-instrument",
"xray-always");
4132 case ImbueAttr::ALWAYS_ARG1:
4133 Fn->addFnAttr(
"function-instrument",
"xray-always");
4134 Fn->addFnAttr(
"xray-log-args",
"1");
4136 case ImbueAttr::NEVER:
4137 Fn->addFnAttr(
"function-instrument",
"xray-never");
4150 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
4160 auto &
SM = Context.getSourceManager();
4161 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
4175 if (NumGroups > 1) {
4176 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
4185 if (LangOpts.EmitAllDecls)
4188 const auto *VD = dyn_cast<VarDecl>(
Global);
4190 ((CodeGenOpts.KeepPersistentStorageVariables &&
4191 (VD->getStorageDuration() ==
SD_Static ||
4192 VD->getStorageDuration() ==
SD_Thread)) ||
4193 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
4194 VD->getType().isConstQualified())))
4207 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
4208 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
4209 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
4210 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
4214 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4224 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
4227 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4228 if (Context.getInlineVariableDefinitionKind(VD) ==
4233 if (CXX20ModuleInits && VD->getOwningModule() &&
4234 !VD->getOwningModule()->isModuleMapModule()) {
4243 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
4246 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
4259 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4263 llvm::Constant *
Init;
4266 if (!
V.isAbsent()) {
4277 llvm::Constant *Fields[4] = {
4281 llvm::ConstantDataArray::getRaw(
4282 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4284 Init = llvm::ConstantStruct::getAnon(Fields);
4287 auto *GV =
new llvm::GlobalVariable(
4289 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4291 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4294 if (!
V.isAbsent()) {
4307 llvm::GlobalVariable **Entry =
nullptr;
4308 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4313 llvm::Constant *
Init;
4317 assert(!
V.isAbsent());
4321 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4323 llvm::GlobalValue::PrivateLinkage,
Init,
4325 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4339 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4343 llvm::Constant *
Init =
Emitter.emitForInitializer(
4351 llvm::GlobalValue::LinkageTypes
Linkage =
4353 ? llvm::GlobalValue::LinkOnceODRLinkage
4354 : llvm::GlobalValue::InternalLinkage;
4355 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4359 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4366 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4367 assert(AA &&
"No alias?");
4377 llvm::Constant *Aliasee;
4379 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4387 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4388 WeakRefReferences.insert(F);
4396 if (
auto *A = D->
getAttr<AttrT>())
4397 return A->isImplicit();
4404 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4407 const auto *AA =
Global->getAttr<AliasAttr>();
4415 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4416 if (LangOpts.OpenMPIsTargetDevice)
4417 return !AliaseeDecl ||
4418 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4421 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4422 const bool AliaseeHasDeviceAttr =
4423 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4425 if (LangOpts.CUDAIsDevice)
4426 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4433bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4434 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4439 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4440 Global->hasAttr<CUDAConstantAttr>() ||
4441 Global->hasAttr<CUDASharedAttr>() ||
4442 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4443 Global->getType()->isCUDADeviceBuiltinTextureType();
4450 if (
Global->hasAttr<WeakRefAttr>())
4455 if (
Global->hasAttr<AliasAttr>()) {
4458 return EmitAliasDefinition(GD);
4462 if (
Global->hasAttr<IFuncAttr>())
4463 return emitIFuncDefinition(GD);
4466 if (
Global->hasAttr<CPUDispatchAttr>())
4467 return emitCPUDispatchDefinition(GD);
4472 if (LangOpts.CUDA) {
4474 "Expected Variable or Function");
4475 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4476 if (!shouldEmitCUDAGlobalVar(VD))
4478 }
else if (LangOpts.CUDAIsDevice) {
4479 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4480 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4481 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4485 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4486 !
Global->hasAttr<CUDAGlobalAttr>() &&
4488 !
Global->hasAttr<CUDAHostAttr>()))
4491 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4492 Global->hasAttr<CUDADeviceAttr>())
4496 if (LangOpts.OpenMP) {
4498 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4500 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4501 if (MustBeEmitted(
Global))
4505 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4506 if (MustBeEmitted(
Global))
4513 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4514 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4520 if (FD->
hasAttr<AnnotateAttr>()) {
4523 DeferredAnnotations[MangledName] = FD;
4538 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4544 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4546 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4547 if (LangOpts.OpenMP) {
4549 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4550 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4554 if (VD->hasExternalStorage() &&
4555 Res != OMPDeclareTargetDeclAttr::MT_Link)
4558 bool UnifiedMemoryEnabled =
4560 if (*Res == OMPDeclareTargetDeclAttr::MT_Local ||
4561 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4562 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4563 !UnifiedMemoryEnabled)) {
4566 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4567 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4568 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4569 UnifiedMemoryEnabled)) &&
4570 "Link clause or to clause with unified memory expected.");
4580 if (LangOpts.HLSL) {
4581 if (VD->getStorageClass() ==
SC_Extern) {
4590 if (Context.getInlineVariableDefinitionKind(VD) ==
4600 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4602 EmitGlobalDefinition(GD);
4603 addEmittedDeferredDecl(GD);
4611 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4612 CXXGlobalInits.push_back(
nullptr);
4618 addDeferredDeclToEmit(GD);
4619 }
else if (MustBeEmitted(
Global)) {
4621 assert(!MayBeEmittedEagerly(
Global));
4622 addDeferredDeclToEmit(GD);
4627 DeferredDecls[MangledName] = GD;
4633 if (
const auto *RT =
4634 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4635 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4636 RD = RD->getDefinitionOrSelf();
4637 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4645 struct FunctionIsDirectlyRecursive
4646 :
public ConstStmtVisitor<FunctionIsDirectlyRecursive, bool> {
4647 const StringRef Name;
4648 const Builtin::Context &BI;
4649 FunctionIsDirectlyRecursive(StringRef N,
const Builtin::Context &
C)
4652 bool VisitCallExpr(
const CallExpr *E) {
4656 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4657 if (Attr && Name == Attr->getLabel())
4662 std::string BuiltinNameStr = BI.
getName(BuiltinID);
4663 StringRef BuiltinName = BuiltinNameStr;
4664 return BuiltinName.consume_front(
"__builtin_") && Name == BuiltinName;
4667 bool VisitStmt(
const Stmt *S) {
4668 for (
const Stmt *Child : S->
children())
4669 if (Child && this->Visit(Child))
4676 struct DLLImportFunctionVisitor
4677 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4678 bool SafeToInline =
true;
4680 bool shouldVisitImplicitCode()
const {
return true; }
4682 bool VisitVarDecl(VarDecl *VD) {
4685 SafeToInline =
false;
4686 return SafeToInline;
4693 return SafeToInline;
4696 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4698 SafeToInline = D->
hasAttr<DLLImportAttr>();
4699 return SafeToInline;
4702 bool VisitDeclRefExpr(DeclRefExpr *E) {
4705 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4706 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4707 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4708 return SafeToInline;
4711 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4713 return SafeToInline;
4716 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4720 SafeToInline =
true;
4722 SafeToInline = M->
hasAttr<DLLImportAttr>();
4724 return SafeToInline;
4727 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4729 return SafeToInline;
4732 bool VisitCXXNewExpr(CXXNewExpr *E) {
4734 return SafeToInline;
4743CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4745 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4747 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4750 Name = Attr->getLabel();
4755 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
4756 const Stmt *Body = FD->
getBody();
4757 return Body ? Walker.Visit(Body) :
false;
4760bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4767 if (F->isInlineBuiltinDeclaration())
4770 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4775 if (
const Module *M = F->getOwningModule();
4776 M && M->getTopLevelModule()->isNamedModule() &&
4777 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4787 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4792 if (F->hasAttr<NoInlineAttr>())
4795 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4797 DLLImportFunctionVisitor Visitor;
4798 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4799 if (!Visitor.SafeToInline)
4802 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4805 for (
const Decl *
Member : Dtor->getParent()->decls())
4809 for (
const CXXBaseSpecifier &B : Dtor->getParent()->bases())
4820 return !isTriviallyRecursive(F);
4823bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4824 return CodeGenOpts.OptimizationLevel > 0;
4827void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
4828 llvm::GlobalValue *GV) {
4832 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4833 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4835 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4836 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4837 if (TC->isFirstOfVersion(I))
4840 EmitGlobalFunctionDefinition(GD, GV);
4846 AddDeferredMultiVersionResolverToEmit(GD);
4848 GetOrCreateMultiVersionResolver(GD);
4852void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
4855 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
4856 Context.getSourceManager(),
4857 "Generating code for declaration");
4859 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4862 if (!shouldEmitFunction(GD))
4865 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4867 llvm::raw_string_ostream
OS(Name);
4873 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4877 ABI->emitCXXStructor(GD);
4879 EmitMultiVersionFunctionDefinition(GD, GV);
4881 EmitGlobalFunctionDefinition(GD, GV);
4890 return EmitMultiVersionFunctionDefinition(GD, GV);
4891 return EmitGlobalFunctionDefinition(GD, GV);
4894 if (
const auto *VD = dyn_cast<VarDecl>(D))
4895 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4897 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4901 llvm::Function *NewFn);
4917static llvm::GlobalValue::LinkageTypes
4921 return llvm::GlobalValue::InternalLinkage;
4922 return llvm::GlobalValue::WeakODRLinkage;
4925void CodeGenModule::emitMultiVersionFunctions() {
4926 std::vector<GlobalDecl> MVFuncsToEmit;
4927 MultiVersionFuncs.swap(MVFuncsToEmit);
4928 for (GlobalDecl GD : MVFuncsToEmit) {
4930 assert(FD &&
"Expected a FunctionDecl");
4932 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
4933 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
4937 if (
Decl->isDefined()) {
4938 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4946 assert(
Func &&
"This should have just been created");
4954 bool ShouldEmitResolver = !
getTriple().isAArch64();
4955 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4956 llvm::DenseMap<llvm::Function *, const FunctionDecl *> DeclMap;
4959 FD, [&](
const FunctionDecl *CurFD) {
4960 llvm::SmallVector<StringRef, 8> Feats;
4963 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4965 TA->getX86AddedFeatures(Feats);
4966 llvm::Function *
Func = createFunction(CurFD);
4967 DeclMap.insert({
Func, CurFD});
4968 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
4969 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4970 if (TVA->isDefaultVersion() && IsDefined)
4971 ShouldEmitResolver =
true;
4972 llvm::Function *
Func = createFunction(CurFD);
4973 DeclMap.insert({
Func, CurFD});
4975 TVA->getFeatures(Feats, Delim);
4976 Options.emplace_back(
Func, Feats);
4977 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4978 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4979 if (!TC->isFirstOfVersion(I))
4981 if (TC->isDefaultVersion(I) && IsDefined)
4982 ShouldEmitResolver =
true;
4983 llvm::Function *
Func = createFunction(CurFD, I);
4984 DeclMap.insert({
Func, CurFD});
4987 TC->getX86Feature(Feats, I);
4988 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
4991 TC->getFeatures(Feats, I, Delim);
4992 Options.emplace_back(
Func, Feats);
4996 llvm_unreachable(
"unexpected MultiVersionKind");
4999 if (!ShouldEmitResolver)
5002 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
5003 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
5004 ResolverConstant = IFunc->getResolver();
5009 *
this, GD, FD,
true);
5016 auto *Alias = llvm::GlobalAlias::create(
5018 MangledName +
".ifunc", IFunc, &
getModule());
5027 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
5028 const CodeGenFunction::FMVResolverOption &RHS) {
5034 for (
auto I = Options.begin() + 1, E = Options.end(); I != E; ++I) {
5035 llvm::APInt RHS = llvm::AArch64::getCpuSupportsMask(I->Features);
5036 if (std::any_of(Options.begin(), I, [RHS](
auto RO) {
5037 llvm::APInt LHS = llvm::AArch64::getCpuSupportsMask(RO.Features);
5038 return LHS.isSubsetOf(RHS);
5040 Diags.Report(DeclMap[I->Function]->getLocation(),
5041 diag::warn_unreachable_version)
5042 << I->Function->getName();
5043 assert(I->Function->user_empty() &&
"unexpected users");
5044 I->Function->eraseFromParent();
5045 I->Function =
nullptr;
5049 CodeGenFunction CGF(*
this);
5050 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5052 setMultiVersionResolverAttributes(ResolverFunc, GD);
5054 ResolverFunc->setComdat(
5055 getModule().getOrInsertComdat(ResolverFunc->getName()));
5061 if (!MVFuncsToEmit.empty())
5066 if (!MultiVersionFuncs.empty())
5067 emitMultiVersionFunctions();
5077 llvm::GlobalValue *DS = TheModule.getNamedValue(DSName);
5079 DS =
new llvm::GlobalVariable(TheModule,
Int8Ty,
false,
5080 llvm::GlobalVariable::ExternalWeakLinkage,
5082 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5087void CodeGenModule::emitPFPFieldsWithEvaluatedOffset() {
5088 llvm::Constant *Nop = llvm::ConstantExpr::getIntToPtr(
5090 for (
auto *FD :
getContext().PFPFieldsWithEvaluatedOffset) {
5092 llvm::GlobalValue *OldDS = TheModule.getNamedValue(DSName);
5093 llvm::GlobalValue *DS = llvm::GlobalAlias::create(
5094 Int8Ty, 0, llvm::GlobalValue::ExternalLinkage, DSName, Nop, &TheModule);
5095 DS->setVisibility(llvm::GlobalValue::HiddenVisibility);
5097 DS->takeName(OldDS);
5098 OldDS->replaceAllUsesWith(DS);
5099 OldDS->eraseFromParent();
5105 llvm::Constant *
New) {
5108 Old->replaceAllUsesWith(
New);
5109 Old->eraseFromParent();
5112void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
5114 assert(FD &&
"Not a FunctionDecl?");
5116 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
5117 assert(DD &&
"Not a cpu_dispatch Function?");
5123 UpdateMultiVersionNames(GD, FD, ResolverName);
5125 llvm::Type *ResolverType;
5126 GlobalDecl ResolverGD;
5128 ResolverType = llvm::FunctionType::get(
5139 ResolverName, ResolverType, ResolverGD,
false));
5142 ResolverFunc->setComdat(
5143 getModule().getOrInsertComdat(ResolverFunc->getName()));
5145 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
5148 for (
const IdentifierInfo *II : DD->cpus()) {
5156 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
5159 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
5165 Func = GetOrCreateLLVMFunction(
5166 MangledName, DeclTy, ExistingDecl,
5172 llvm::SmallVector<StringRef, 32> Features;
5173 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
5174 llvm::transform(Features, Features.begin(),
5175 [](StringRef Str) { return Str.substr(1); });
5176 llvm::erase_if(Features, [&Target](StringRef Feat) {
5177 return !Target.validateCpuSupports(Feat);
5183 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
5184 const CodeGenFunction::FMVResolverOption &RHS) {
5185 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
5186 llvm::X86::getCpuSupportsMask(RHS.
Features);
5193 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
5194 (Options.end() - 2)->Features),
5195 [](
auto X) { return X == 0; })) {
5196 StringRef LHSName = (Options.end() - 2)->Function->getName();
5197 StringRef RHSName = (Options.end() - 1)->Function->getName();
5198 if (LHSName.compare(RHSName) < 0)
5199 Options.erase(Options.end() - 2);
5201 Options.erase(Options.end() - 1);
5204 CodeGenFunction CGF(*
this);
5205 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
5206 setMultiVersionResolverAttributes(ResolverFunc, GD);
5211 unsigned AS = IFunc->getType()->getPointerAddressSpace();
5216 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5223 *
this, GD, FD,
true);
5226 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
5234void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
5236 assert(FD &&
"Not a FunctionDecl?");
5239 std::string MangledName =
5241 if (!DeferredResolversToEmit.insert(MangledName).second)
5244 MultiVersionFuncs.push_back(GD);
5250llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
5252 assert(FD &&
"Not a FunctionDecl?");
5254 std::string MangledName =
5259 std::string ResolverName = MangledName;
5263 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
5267 ResolverName +=
".ifunc";
5274 ResolverName +=
".resolver";
5277 bool ShouldReturnIFunc =
5296 AddDeferredMultiVersionResolverToEmit(GD);
5300 if (ShouldReturnIFunc) {
5302 llvm::Type *ResolverType = llvm::FunctionType::get(
5304 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5305 MangledName +
".resolver", ResolverType, GlobalDecl{},
5313 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
5315 GIF->setName(ResolverName);
5322 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
5323 ResolverName, DeclTy, GlobalDecl{},
false);
5325 "Resolver should be created for the first time");
5330void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
5332 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
5345 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5356bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5357 const llvm::GlobalValue *GV)
const {
5358 auto SC = GV->getDLLStorageClass();
5359 if (SC == llvm::GlobalValue::DefaultStorageClass)
5362 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5363 !MRD->
hasAttr<DLLImportAttr>()) ||
5364 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5365 !MRD->
hasAttr<DLLExportAttr>())) &&
5376llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5377 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5378 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5382 std::string NameWithoutMultiVersionMangling;
5383 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5385 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5386 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5387 !DontDefer && !IsForDefinition) {
5390 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5392 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5395 GDDef = GlobalDecl(FDDef);
5403 UpdateMultiVersionNames(GD, FD, MangledName);
5404 if (!IsForDefinition) {
5410 AddDeferredMultiVersionResolverToEmit(GD);
5412 *
this, GD, FD,
true);
5421 *
this, GD, FD,
true);
5423 return GetOrCreateMultiVersionResolver(GD);
5428 if (!NameWithoutMultiVersionMangling.empty())
5429 MangledName = NameWithoutMultiVersionMangling;
5434 if (WeakRefReferences.erase(Entry)) {
5435 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5436 if (FD && !FD->
hasAttr<WeakAttr>())
5437 Entry->setLinkage(llvm::Function::ExternalLinkage);
5441 if (D && shouldDropDLLAttribute(D, Entry)) {
5442 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5448 if (IsForDefinition && !Entry->isDeclaration()) {
5455 DiagnosedConflictingDefinitions.insert(GD).second) {
5459 diag::note_previous_definition);
5464 (Entry->getValueType() == Ty)) {
5471 if (!IsForDefinition)
5478 bool IsIncompleteFunction =
false;
5480 llvm::FunctionType *FTy;
5484 FTy = llvm::FunctionType::get(
VoidTy,
false);
5485 IsIncompleteFunction =
true;
5489 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5490 Entry ? StringRef() : MangledName, &
getModule());
5494 if (D && D->
hasAttr<AnnotateAttr>())
5512 if (!Entry->use_empty()) {
5514 Entry->removeDeadConstantUsers();
5520 assert(F->getName() == MangledName &&
"name was uniqued!");
5522 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5523 if (ExtraAttrs.hasFnAttrs()) {
5524 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5532 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5535 addDeferredDeclToEmit(GD);
5540 auto DDI = DeferredDecls.find(MangledName);
5541 if (DDI != DeferredDecls.end()) {
5545 addDeferredDeclToEmit(DDI->second);
5546 DeferredDecls.erase(DDI);
5574 if (!IsIncompleteFunction) {
5575 assert(F->getFunctionType() == Ty);
5593 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5603 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5606 DD->getParent()->getNumVBases() == 0)
5611 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5612 false, llvm::AttributeList(),
5615 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5619 if (IsForDefinition)
5627 llvm::GlobalValue *F =
5630 return llvm::NoCFIValue::get(F);
5640 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5643 if (!
C.getLangOpts().CPlusPlus)
5648 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5649 ?
C.Idents.get(
"terminate")
5650 :
C.Idents.get(Name);
5652 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5656 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(
Result))
5657 for (
const auto *
Result : LSD->lookup(&NS))
5658 if ((ND = dyn_cast<NamespaceDecl>(
Result)))
5663 if (
const auto *FD = dyn_cast<FunctionDecl>(
Result))
5672 llvm::Function *F, StringRef Name) {
5678 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5681 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5682 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5683 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5690 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5691 if (AssumeConvergent) {
5693 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5696 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5701 llvm::Constant *
C = GetOrCreateLLVMFunction(
5703 false,
false, ExtraAttrs);
5705 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5721 llvm::AttributeList ExtraAttrs,
bool Local,
5722 bool AssumeConvergent) {
5723 if (AssumeConvergent) {
5725 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5729 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5733 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5742 markRegisterParameterAttributes(F);
5768 if (WeakRefReferences.erase(Entry)) {
5769 if (D && !D->
hasAttr<WeakAttr>())
5770 Entry->setLinkage(llvm::Function::ExternalLinkage);
5774 if (D && shouldDropDLLAttribute(D, Entry))
5775 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5777 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5780 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5785 if (IsForDefinition && !Entry->isDeclaration()) {
5793 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5795 DiagnosedConflictingDefinitions.insert(D).second) {
5799 diag::note_previous_definition);
5804 if (Entry->getType()->getAddressSpace() != TargetAS)
5805 return llvm::ConstantExpr::getAddrSpaceCast(
5806 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5810 if (!IsForDefinition)
5816 auto *GV =
new llvm::GlobalVariable(
5817 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5818 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5819 getContext().getTargetAddressSpace(DAddrSpace));
5824 GV->takeName(Entry);
5826 if (!Entry->use_empty()) {
5827 Entry->replaceAllUsesWith(GV);
5830 Entry->eraseFromParent();
5836 auto DDI = DeferredDecls.find(MangledName);
5837 if (DDI != DeferredDecls.end()) {
5840 addDeferredDeclToEmit(DDI->second);
5841 DeferredDecls.erase(DDI);
5846 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5853 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
5859 CXXThreadLocals.push_back(D);
5867 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
5868 EmitGlobalVarDefinition(D);
5873 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
5874 GV->setSection(SA->getName());
5878 if (
getTriple().getArch() == llvm::Triple::xcore &&
5882 GV->setSection(
".cp.rodata");
5885 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
5886 GV->setCodeModel(CMA->getModel());
5891 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5895 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
5896 bool HasMutableFields =
Record &&
Record->hasMutableFields();
5897 if (!HasMutableFields) {
5904 auto *InitType =
Init->getType();
5905 if (GV->getValueType() != InitType) {
5910 GV->setName(StringRef());
5915 ->stripPointerCasts());
5918 GV->eraseFromParent();
5921 GV->setInitializer(
Init);
5922 GV->setConstant(
true);
5923 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5943 SanitizerMD->reportGlobal(GV, *D);
5948 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5949 if (DAddrSpace != ExpectedAS)
5962 false, IsForDefinition);
5983 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5984 llvm::Align Alignment) {
5985 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5986 llvm::GlobalVariable *OldGV =
nullptr;
5990 if (GV->getValueType() == Ty)
5995 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
6000 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
6005 GV->takeName(OldGV);
6007 if (!OldGV->use_empty()) {
6008 OldGV->replaceAllUsesWith(GV);
6011 OldGV->eraseFromParent();
6015 !GV->hasAvailableExternallyLinkage())
6016 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
6018 GV->setAlignment(Alignment);
6055 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
6063 if (GV && !GV->isDeclaration())
6068 if (!MustBeEmitted(D) && !GV) {
6069 DeferredDecls[MangledName] = D;
6074 EmitGlobalVarDefinition(D);
6079 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
6081 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
6096 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(
Addr)) {
6100 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
6103 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6105 if (!Fn->getSubprogram())
6111 return Context.toCharUnitsFromBits(
6116 if (LangOpts.OpenCL) {
6127 if (LangOpts.SYCLIsDevice &&
6131 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
6133 if (D->
hasAttr<CUDAConstantAttr>())
6135 if (D->
hasAttr<CUDASharedAttr>())
6137 if (D->
hasAttr<CUDADeviceAttr>())
6145 if (LangOpts.OpenMP) {
6147 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
6155 if (LangOpts.OpenCL)
6157 if (LangOpts.SYCLIsDevice)
6159 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
6167 if (
auto AS =
getTarget().getConstantAddressSpace())
6180static llvm::Constant *
6182 llvm::GlobalVariable *GV) {
6183 llvm::Constant *Cast = GV;
6188 GV, llvm::PointerType::get(
6195template<
typename SomeDecl>
6197 llvm::GlobalValue *GV) {
6212 const SomeDecl *
First = D->getFirstDecl();
6213 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
6219 std::pair<StaticExternCMap::iterator, bool> R =
6220 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
6225 R.first->second =
nullptr;
6232 if (D.
hasAttr<SelectAnyAttr>())
6236 if (
auto *VD = dyn_cast<VarDecl>(&D))
6250 llvm_unreachable(
"No such linkage");
6258 llvm::GlobalObject &GO) {
6261 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
6269void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
6284 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
6285 OpenMPRuntime->emitTargetGlobalVariable(D))
6288 llvm::TrackingVH<llvm::Constant>
Init;
6289 bool NeedsGlobalCtor =
false;
6293 bool IsDefinitionAvailableExternally =
6295 bool NeedsGlobalDtor =
6296 !IsDefinitionAvailableExternally &&
6303 if (IsDefinitionAvailableExternally &&
6314 std::optional<ConstantEmitter> emitter;
6319 bool IsCUDASharedVar =
6324 bool IsCUDAShadowVar =
6326 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
6327 D->
hasAttr<CUDASharedAttr>());
6328 bool IsCUDADeviceShadowVar =
6333 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
6334 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6338 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
6341 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
6342 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
6343 }
else if (!InitExpr) {
6356 initializedGlobalDecl = GlobalDecl(D);
6357 emitter.emplace(*
this);
6358 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6360 QualType T = InitExpr->
getType();
6366 if (!IsDefinitionAvailableExternally)
6367 NeedsGlobalCtor =
true;
6371 NeedsGlobalCtor =
false;
6375 Init = llvm::PoisonValue::get(
getTypes().ConvertType(T));
6383 DelayedCXXInitPosition.erase(D);
6390 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6395 llvm::Type* InitType =
Init->getType();
6396 llvm::Constant *Entry =
6400 Entry = Entry->stripPointerCasts();
6403 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6414 if (!GV || GV->getValueType() != InitType ||
6415 GV->getType()->getAddressSpace() !=
6419 Entry->setName(StringRef());
6424 ->stripPointerCasts());
6427 llvm::Constant *NewPtrForOldDecl =
6428 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6430 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6438 if (D->
hasAttr<AnnotateAttr>())
6451 if (LangOpts.CUDA) {
6452 if (LangOpts.CUDAIsDevice) {
6455 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6458 GV->setExternallyInitialized(
true);
6465 if (LangOpts.HLSL &&
6470 GV->setExternallyInitialized(
true);
6472 GV->setInitializer(
Init);
6479 emitter->finalize(GV);
6482 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6483 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6487 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6488 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6490 GV->setConstant(
true);
6495 if (std::optional<CharUnits> AlignValFromAllocate =
6497 AlignVal = *AlignValFromAllocate;
6515 Linkage == llvm::GlobalValue::ExternalLinkage &&
6516 Context.getTargetInfo().getTriple().isOSDarwin() &&
6518 Linkage = llvm::GlobalValue::InternalLinkage;
6523 if (LangOpts.HLSL &&
6525 Linkage = llvm::GlobalValue::ExternalLinkage;
6528 if (D->
hasAttr<DLLImportAttr>())
6529 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6530 else if (D->
hasAttr<DLLExportAttr>())
6531 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6533 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6535 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6537 GV->setConstant(
false);
6542 if (!GV->getInitializer()->isNullValue())
6543 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6546 setNonAliasAttributes(D, GV);
6548 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6550 CXXThreadLocals.push_back(D);
6557 if (NeedsGlobalCtor || NeedsGlobalDtor)
6558 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6560 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6565 DI->EmitGlobalVariable(GV, D);
6573 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6584 if (D->
hasAttr<SectionAttr>())
6590 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6591 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6592 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6593 D->
hasAttr<PragmaClangRodataSectionAttr>())
6601 if (D->
hasAttr<WeakImportAttr>())
6610 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6611 if (D->
hasAttr<AlignedAttr>())
6614 if (Context.isAlignmentRequired(VarType))
6618 for (
const FieldDecl *FD : RD->fields()) {
6619 if (FD->isBitField())
6621 if (FD->
hasAttr<AlignedAttr>())
6623 if (Context.isAlignmentRequired(FD->
getType()))
6635 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6636 Context.getTypeAlignIfKnown(D->
getType()) >
6643llvm::GlobalValue::LinkageTypes
6647 return llvm::Function::InternalLinkage;
6650 return llvm::GlobalVariable::WeakAnyLinkage;
6654 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6659 return llvm::GlobalValue::AvailableExternallyLinkage;
6673 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6674 : llvm::Function::InternalLinkage;
6688 return llvm::Function::ExternalLinkage;
6691 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6692 : llvm::Function::InternalLinkage;
6693 return llvm::Function::WeakODRLinkage;
6700 CodeGenOpts.NoCommon))
6701 return llvm::GlobalVariable::CommonLinkage;
6707 if (D->
hasAttr<SelectAnyAttr>())
6708 return llvm::GlobalVariable::WeakODRLinkage;
6712 return llvm::GlobalVariable::ExternalLinkage;
6715llvm::GlobalValue::LinkageTypes
6724 llvm::Function *newFn) {
6726 if (old->use_empty())
6729 llvm::Type *newRetTy = newFn->getReturnType();
6734 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6736 llvm::User *user = ui->getUser();
6740 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6741 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6747 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6750 if (!callSite->isCallee(&*ui))
6755 if (callSite->getType() != newRetTy && !callSite->use_empty())
6760 llvm::AttributeList oldAttrs = callSite->getAttributes();
6763 unsigned newNumArgs = newFn->arg_size();
6764 if (callSite->arg_size() < newNumArgs)
6770 bool dontTransform =
false;
6771 for (llvm::Argument &A : newFn->args()) {
6772 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6773 dontTransform =
true;
6778 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6786 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6790 callSite->getOperandBundlesAsDefs(newBundles);
6792 llvm::CallBase *newCall;
6794 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6795 callSite->getIterator());
6798 newCall = llvm::InvokeInst::Create(
6799 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6800 newArgs, newBundles,
"", callSite->getIterator());
6804 if (!newCall->getType()->isVoidTy())
6805 newCall->takeName(callSite);
6806 newCall->setAttributes(
6807 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6808 oldAttrs.getRetAttrs(), newArgAttrs));
6809 newCall->setCallingConv(callSite->getCallingConv());
6812 if (!callSite->use_empty())
6813 callSite->replaceAllUsesWith(newCall);
6816 if (callSite->getDebugLoc())
6817 newCall->setDebugLoc(callSite->getDebugLoc());
6819 callSitesToBeRemovedFromParent.push_back(callSite);
6822 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6823 callSite->eraseFromParent();
6837 llvm::Function *NewFn) {
6847 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6859void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6860 llvm::GlobalValue *GV) {
6868 if (!GV || (GV->getValueType() != Ty))
6874 if (!GV->isDeclaration())
6884 if (
getTriple().isOSAIX() && D->isTargetClonesMultiVersion())
6885 Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
6896 setNonAliasAttributes(GD, Fn);
6898 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
6899 (CodeGenOpts.OptimizationLevel == 0) &&
6902 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
6904 !D->
hasAttr<NoInlineAttr>() &&
6905 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
6906 !D->
hasAttr<OptimizeNoneAttr>() &&
6907 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
6908 !ShouldAddOptNone) {
6909 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
6915 auto GetPriority = [
this](
const auto *
Attr) ->
int {
6920 return Attr->DefaultPriority;
6923 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
6925 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
6931void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
6933 const AliasAttr *AA = D->
getAttr<AliasAttr>();
6934 assert(AA &&
"Not an alias?");
6938 if (AA->getAliasee() == MangledName) {
6939 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6946 if (Entry && !Entry->isDeclaration())
6949 Aliases.push_back(GD);
6955 llvm::Constant *Aliasee;
6956 llvm::GlobalValue::LinkageTypes
LT;
6958 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6964 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6971 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6973 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
6976 if (GA->getAliasee() == Entry) {
6977 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6981 assert(Entry->isDeclaration());
6990 GA->takeName(Entry);
6992 Entry->replaceAllUsesWith(GA);
6993 Entry->eraseFromParent();
6995 GA->setName(MangledName);
7003 GA->setLinkage(llvm::Function::WeakAnyLinkage);
7006 if (
const auto *VD = dyn_cast<VarDecl>(D))
7007 if (VD->getTLSKind())
7018void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
7020 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
7021 assert(IFA &&
"Not an ifunc?");
7025 if (IFA->getResolver() == MangledName) {
7026 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7032 if (Entry && !Entry->isDeclaration()) {
7035 DiagnosedConflictingDefinitions.insert(GD).second) {
7036 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
7039 diag::note_previous_definition);
7044 Aliases.push_back(GD);
7050 llvm::Constant *Resolver =
7051 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
7055 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
7056 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
7058 if (GIF->getResolver() == Entry) {
7059 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
7062 assert(Entry->isDeclaration());
7071 GIF->takeName(Entry);
7073 Entry->replaceAllUsesWith(GIF);
7074 Entry->eraseFromParent();
7076 GIF->setName(MangledName);
7082 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
7083 (llvm::Intrinsic::ID)IID, Tys);
7086static llvm::StringMapEntry<llvm::GlobalVariable *> &
7089 bool &IsUTF16,
unsigned &StringLength) {
7090 StringRef String = Literal->getString();
7091 unsigned NumBytes = String.size();
7094 if (!Literal->containsNonAsciiOrNull()) {
7095 StringLength = NumBytes;
7096 return *Map.insert(std::make_pair(String,
nullptr)).first;
7103 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
7104 llvm::UTF16 *ToPtr = &ToBuf[0];
7106 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
7107 ToPtr + NumBytes, llvm::strictConversion);
7110 StringLength = ToPtr - &ToBuf[0];
7114 return *Map.insert(std::make_pair(
7115 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
7116 (StringLength + 1) * 2),
7122 unsigned StringLength = 0;
7123 bool isUTF16 =
false;
7124 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
7129 if (
auto *
C = Entry.second)
7134 const llvm::Triple &Triple =
getTriple();
7137 const bool IsSwiftABI =
7138 static_cast<unsigned>(CFRuntime) >=
7143 if (!CFConstantStringClassRef) {
7144 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
7146 Ty = llvm::ArrayType::get(Ty, 0);
7148 switch (CFRuntime) {
7152 CFConstantStringClassName =
7153 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
7154 :
"$s10Foundation19_NSCFConstantStringCN";
7158 CFConstantStringClassName =
7159 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
7160 :
"$S10Foundation19_NSCFConstantStringCN";
7164 CFConstantStringClassName =
7165 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
7166 :
"__T010Foundation19_NSCFConstantStringCN";
7173 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
7174 llvm::GlobalValue *GV =
nullptr;
7176 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
7183 if ((VD = dyn_cast<VarDecl>(
Result)))
7186 if (Triple.isOSBinFormatELF()) {
7188 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7190 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
7191 if (!VD || !VD->
hasAttr<DLLExportAttr>())
7192 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7194 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7202 CFConstantStringClassRef =
7203 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
7206 QualType CFTy = Context.getCFConstantStringType();
7211 auto Fields = Builder.beginStruct(STy);
7220 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
7221 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
7223 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
7227 llvm::Constant *
C =
nullptr;
7230 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
7231 Entry.first().size() / 2);
7232 C = llvm::ConstantDataArray::get(VMContext, Arr);
7234 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
7240 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
7241 llvm::GlobalValue::PrivateLinkage,
C,
".str");
7242 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7245 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
7246 : Context.getTypeAlignInChars(Context.CharTy);
7252 if (Triple.isOSBinFormatMachO())
7253 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
7254 :
"__TEXT,__cstring,cstring_literals");
7257 else if (Triple.isOSBinFormatELF())
7258 GV->setSection(
".rodata");
7264 llvm::IntegerType *LengthTy =
7274 Fields.addInt(LengthTy, StringLength);
7282 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
7284 llvm::GlobalVariable::PrivateLinkage);
7285 GV->addAttribute(
"objc_arc_inert");
7286 switch (Triple.getObjectFormat()) {
7287 case llvm::Triple::UnknownObjectFormat:
7288 llvm_unreachable(
"unknown file format");
7289 case llvm::Triple::DXContainer:
7290 case llvm::Triple::GOFF:
7291 case llvm::Triple::SPIRV:
7292 case llvm::Triple::XCOFF:
7293 llvm_unreachable(
"unimplemented");
7294 case llvm::Triple::COFF:
7295 case llvm::Triple::ELF:
7296 case llvm::Triple::Wasm:
7297 GV->setSection(
"cfstring");
7299 case llvm::Triple::MachO:
7300 GV->setSection(
"__DATA,__cfstring");
7309 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
7313 if (ObjCFastEnumerationStateType.isNull()) {
7314 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
7318 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
7319 Context.getPointerType(Context.UnsignedLongTy),
7320 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
7323 for (
size_t i = 0; i < 4; ++i) {
7328 FieldTypes[i],
nullptr,
7337 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
7340 return ObjCFastEnumerationStateType;
7354 assert(CAT &&
"String literal not of constant array type!");
7356 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
7360 llvm::Type *ElemTy = AType->getElementType();
7361 unsigned NumElements = AType->getNumElements();
7364 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7366 Elements.reserve(NumElements);
7368 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7370 Elements.resize(NumElements);
7371 return llvm::ConstantDataArray::get(VMContext, Elements);
7374 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7376 Elements.reserve(NumElements);
7378 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7380 Elements.resize(NumElements);
7381 return llvm::ConstantDataArray::get(VMContext, Elements);
7384static llvm::GlobalVariable *
7393 auto *GV =
new llvm::GlobalVariable(
7394 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7395 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7397 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7398 if (GV->isWeakForLinker()) {
7399 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7400 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7416 llvm::GlobalVariable **Entry =
nullptr;
7417 if (!LangOpts.WritableStrings) {
7418 Entry = &ConstantStringMap[
C];
7419 if (
auto GV = *Entry) {
7420 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7423 GV->getValueType(), Alignment);
7428 StringRef GlobalVariableName;
7429 llvm::GlobalValue::LinkageTypes LT;
7434 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7435 !LangOpts.WritableStrings) {
7436 llvm::raw_svector_ostream Out(MangledNameBuffer);
7438 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7439 GlobalVariableName = MangledNameBuffer;
7441 LT = llvm::GlobalValue::PrivateLinkage;
7442 GlobalVariableName = Name;
7454 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7457 GV->getValueType(), Alignment);
7474 StringRef GlobalName) {
7475 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7480 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7483 llvm::GlobalVariable **Entry =
nullptr;
7484 if (!LangOpts.WritableStrings) {
7485 Entry = &ConstantStringMap[
C];
7486 if (
auto GV = *Entry) {
7487 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7490 GV->getValueType(), Alignment);
7496 GlobalName, Alignment);
7501 GV->getValueType(), Alignment);
7519 MaterializedType = E->
getType();
7523 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7524 if (!InsertResult.second) {
7527 if (!InsertResult.first->second) {
7532 InsertResult.first->second =
new llvm::GlobalVariable(
7533 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7537 llvm::cast<llvm::GlobalVariable>(
7538 InsertResult.first->second->stripPointerCasts())
7547 llvm::raw_svector_ostream Out(Name);
7569 std::optional<ConstantEmitter> emitter;
7570 llvm::Constant *InitialValue =
nullptr;
7575 emitter.emplace(*
this);
7576 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7581 Type = InitialValue->getType();
7590 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7592 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7596 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7600 Linkage = llvm::GlobalVariable::InternalLinkage;
7604 auto *GV =
new llvm::GlobalVariable(
7606 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7607 if (emitter) emitter->finalize(GV);
7609 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7611 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7613 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7617 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7618 if (VD->getTLSKind())
7620 llvm::Constant *CV = GV;
7623 GV, llvm::PointerType::get(
7629 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7631 Entry->replaceAllUsesWith(CV);
7632 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7641void CodeGenModule::EmitObjCPropertyImplementations(
const
7654 if (!Getter || Getter->isSynthesizedAccessorStub())
7657 auto *Setter = PID->getSetterMethodDecl();
7658 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7669 if (ivar->getType().isDestructedType())
7690void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7703 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7718 getContext().getObjCIdType(),
nullptr, D,
true,
7724 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7729void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7736 EmitDeclContext(LSD);
7739void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7741 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7744 std::unique_ptr<CodeGenFunction> &CurCGF =
7745 GlobalTopLevelStmtBlockInFlight.first;
7749 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7757 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7758 FunctionArgList Args;
7760 const CGFunctionInfo &FnInfo =
7763 llvm::Function *
Fn = llvm::Function::Create(
7764 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7766 CurCGF.reset(
new CodeGenFunction(*
this));
7767 GlobalTopLevelStmtBlockInFlight.second = D;
7768 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7770 CXXGlobalInits.push_back(Fn);
7773 CurCGF->EmitStmt(D->
getStmt());
7776void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7777 for (
auto *I : DC->
decls()) {
7783 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7784 for (
auto *M : OID->methods())
7803 case Decl::CXXConversion:
7804 case Decl::CXXMethod:
7805 case Decl::Function:
7812 case Decl::CXXDeductionGuide:
7817 case Decl::Decomposition:
7818 case Decl::VarTemplateSpecialization:
7820 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
7821 for (
auto *B : DD->flat_bindings())
7822 if (
auto *HD = B->getHoldingVar())
7829 case Decl::IndirectField:
7833 case Decl::Namespace:
7836 case Decl::ClassTemplateSpecialization: {
7839 if (Spec->getSpecializationKind() ==
7841 Spec->hasDefinition())
7842 DI->completeTemplateDefinition(*Spec);
7844 case Decl::CXXRecord: {
7848 DI->EmitAndRetainType(
7852 DI->completeUnusedClass(*CRD);
7855 for (
auto *I : CRD->
decls())
7861 case Decl::UsingShadow:
7862 case Decl::ClassTemplate:
7863 case Decl::VarTemplate:
7865 case Decl::VarTemplatePartialSpecialization:
7866 case Decl::FunctionTemplate:
7867 case Decl::TypeAliasTemplate:
7876 case Decl::UsingEnum:
7880 case Decl::NamespaceAlias:
7884 case Decl::UsingDirective:
7888 case Decl::CXXConstructor:
7891 case Decl::CXXDestructor:
7895 case Decl::StaticAssert:
7896 case Decl::ExplicitInstantiation:
7903 case Decl::ObjCInterface:
7904 case Decl::ObjCCategory:
7907 case Decl::ObjCProtocol: {
7909 if (Proto->isThisDeclarationADefinition())
7910 ObjCRuntime->GenerateProtocol(Proto);
7914 case Decl::ObjCCategoryImpl:
7920 case Decl::ObjCImplementation: {
7922 EmitObjCPropertyImplementations(OMD);
7923 EmitObjCIvarInitializations(OMD);
7924 ObjCRuntime->GenerateClass(OMD);
7928 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7929 OMD->getClassInterface()), OMD->getLocation());
7932 case Decl::ObjCMethod: {
7939 case Decl::ObjCCompatibleAlias:
7943 case Decl::PragmaComment: {
7945 switch (PCD->getCommentKind()) {
7947 llvm_unreachable(
"unexpected pragma comment kind");
7962 case Decl::PragmaDetectMismatch: {
7968 case Decl::LinkageSpec:
7972 case Decl::FileScopeAsm: {
7974 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7977 if (LangOpts.OpenMPIsTargetDevice)
7980 if (LangOpts.SYCLIsDevice)
7983 getModule().appendModuleInlineAsm(AD->getAsmString());
7987 case Decl::TopLevelStmt:
7991 case Decl::Import: {
7995 if (!ImportedModules.insert(Import->getImportedModule()))
7999 if (!Import->getImportedOwningModule()) {
8001 DI->EmitImportDecl(*Import);
8007 if (CXX20ModuleInits && Import->getImportedModule() &&
8008 Import->getImportedModule()->isNamedModule())
8017 Visited.insert(Import->getImportedModule());
8018 Stack.push_back(Import->getImportedModule());
8020 while (!Stack.empty()) {
8022 if (!EmittedModuleInitializers.insert(Mod).second)
8025 for (
auto *D : Context.getModuleInitializers(Mod))
8032 if (Submodule->IsExplicit)
8035 if (Visited.insert(Submodule).second)
8036 Stack.push_back(Submodule);
8046 case Decl::OMPThreadPrivate:
8050 case Decl::OMPAllocate:
8054 case Decl::OMPDeclareReduction:
8058 case Decl::OMPDeclareMapper:
8062 case Decl::OMPRequires:
8067 case Decl::TypeAlias:
8069 DI->EmitAndRetainType(
getContext().getTypedefType(
8077 DI->EmitAndRetainType(
8084 DI->EmitAndRetainType(
8088 case Decl::HLSLRootSignature:
8091 case Decl::HLSLBuffer:
8095 case Decl::OpenACCDeclare:
8098 case Decl::OpenACCRoutine:
8113 if (!CodeGenOpts.CoverageMapping)
8116 case Decl::CXXConversion:
8117 case Decl::CXXMethod:
8118 case Decl::Function:
8119 case Decl::ObjCMethod:
8120 case Decl::CXXConstructor:
8121 case Decl::CXXDestructor: {
8130 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
8140 if (!CodeGenOpts.CoverageMapping)
8142 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
8143 if (Fn->isTemplateInstantiation())
8146 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
8154 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
8157 const Decl *D = Entry.first;
8159 case Decl::CXXConversion:
8160 case Decl::CXXMethod:
8161 case Decl::Function:
8162 case Decl::ObjCMethod: {
8169 case Decl::CXXConstructor: {
8176 case Decl::CXXDestructor: {
8193 if (llvm::Function *F =
getModule().getFunction(
"main")) {
8194 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
8195 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
8196 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
8197 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
8206 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
8207 return llvm::ConstantInt::get(i64, PtrInt);
8211 llvm::NamedMDNode *&GlobalMetadata,
8213 llvm::GlobalValue *
Addr) {
8214 if (!GlobalMetadata)
8216 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
8219 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
8222 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
8225bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
8226 llvm::GlobalValue *CppFunc) {
8228 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
8231 llvm::SmallVector<llvm::ConstantExpr *> CEs;
8234 if (Elem == CppFunc)
8240 for (llvm::User *User : Elem->users()) {
8244 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
8245 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
8248 for (llvm::User *CEUser : ConstExpr->users()) {
8249 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
8250 IFuncs.push_back(IFunc);
8255 CEs.push_back(ConstExpr);
8256 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
8257 IFuncs.push_back(IFunc);
8269 for (llvm::GlobalIFunc *IFunc : IFuncs)
8270 IFunc->setResolver(
nullptr);
8271 for (llvm::ConstantExpr *ConstExpr : CEs)
8272 ConstExpr->destroyConstant();
8276 Elem->eraseFromParent();
8278 for (llvm::GlobalIFunc *IFunc : IFuncs) {
8283 llvm::FunctionType::get(IFunc->getType(),
false);
8284 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
8285 CppFunc->getName(), ResolverTy, {},
false);
8286 IFunc->setResolver(Resolver);
8296void CodeGenModule::EmitStaticExternCAliases() {
8299 for (
auto &I : StaticExternCValues) {
8300 const IdentifierInfo *Name = I.first;
8301 llvm::GlobalValue *Val = I.second;
8309 llvm::GlobalValue *ExistingElem =
8314 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
8321 auto Res = Manglings.find(MangledName);
8322 if (Res == Manglings.end())
8324 Result = Res->getValue();
8335void CodeGenModule::EmitDeclMetadata() {
8336 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8338 for (
auto &I : MangledDeclNames) {
8339 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
8349void CodeGenFunction::EmitDeclMetadata() {
8350 if (LocalDeclMap.empty())
return;
8355 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
8357 llvm::NamedMDNode *GlobalMetadata =
nullptr;
8359 for (
auto &I : LocalDeclMap) {
8360 const Decl *D = I.first;
8361 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
8362 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
8364 Alloca->setMetadata(
8365 DeclPtrKind, llvm::MDNode::get(
8366 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
8367 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8374void CodeGenModule::EmitVersionIdentMetadata() {
8375 llvm::NamedMDNode *IdentMetadata =
8376 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8378 llvm::LLVMContext &Ctx = TheModule.getContext();
8380 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8381 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8384void CodeGenModule::EmitCommandLineMetadata() {
8385 llvm::NamedMDNode *CommandLineMetadata =
8386 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8388 llvm::LLVMContext &Ctx = TheModule.getContext();
8390 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8391 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8394void CodeGenModule::EmitCoverageFile() {
8395 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8399 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8400 llvm::LLVMContext &Ctx = TheModule.getContext();
8401 auto *CoverageDataFile =
8403 auto *CoverageNotesFile =
8405 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8406 llvm::MDNode *CU = CUNode->getOperand(i);
8407 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8408 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8421 LangOpts.ObjCRuntime.isGNUFamily())
8422 return ObjCRuntime->GetEHType(Ty);
8429 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8431 for (
auto RefExpr : D->
varlist()) {
8434 VD->getAnyInitializer() &&
8435 !VD->getAnyInitializer()->isConstantInitializer(
getContext());
8441 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8442 CXXGlobalInits.push_back(InitFunction);
8447CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
8451 FnType->getReturnType(), FnType->getParamTypes(),
8452 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8454 llvm::Metadata *&InternalId = Map[T.getCanonicalType()];
8459 std::string OutName;
8460 llvm::raw_string_ostream Out(OutName);
8465 Out <<
".normalized";
8488 return CreateMetadataIdentifierImpl(T, MetadataIdMap,
"");
8493 return CreateMetadataIdentifierImpl(T, VirtualMetadataIdMap,
".virtual");
8497 return CreateMetadataIdentifierImpl(T, GeneralizedMetadataIdMap,
8505 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8506 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8507 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8508 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8509 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8510 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8511 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8512 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8520 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8522 if (CodeGenOpts.SanitizeCfiCrossDso)
8524 VTable->addTypeMetadata(Offset.getQuantity(),
8525 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8528 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8529 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8535 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8545 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8560 bool forPointeeType) {
8571 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8578 bool AlignForArray = T->isArrayType();
8584 if (T->isIncompleteType()) {
8601 if (T.getQualifiers().hasUnaligned()) {
8603 }
else if (forPointeeType && !AlignForArray &&
8604 (RD = T->getAsCXXRecordDecl())) {
8615 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8628 if (NumAutoVarInit >= StopAfter) {
8631 if (!NumAutoVarInit) {
8645 const Decl *D)
const {
8649 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8651 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8657 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8661 llvm::MD5::MD5Result
Result;
8662 for (
const auto &Arg : PreprocessorOpts.Macros)
8663 Hash.update(Arg.first);
8667 llvm::sys::fs::UniqueID ID;
8671 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8675 SM.getDiagnostics().Report(diag::err_cannot_open_file)
8676 << PLoc.
getFilename() << Status.getError().message();
8678 ID = Status->getUniqueID();
8680 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8681 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8688 assert(DeferredDeclsToEmit.empty() &&
8689 "Should have emitted all decls deferred to emit.");
8690 assert(NewBuilder->DeferredDecls.empty() &&
8691 "Newly created module should not have deferred decls");
8692 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8693 assert(EmittedDeferredDecls.empty() &&
8694 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8696 assert(NewBuilder->DeferredVTables.empty() &&
8697 "Newly created module should not have deferred vtables");
8698 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8700 assert(NewBuilder->EmittedVTables.empty() &&
8701 "Newly created module should not have defined vtables");
8702 NewBuilder->EmittedVTables = std::move(EmittedVTables);
8704 assert(NewBuilder->MangledDeclNames.empty() &&
8705 "Newly created module should not have mangled decl names");
8706 assert(NewBuilder->Manglings.empty() &&
8707 "Newly created module should not have manglings");
8708 NewBuilder->Manglings = std::move(Manglings);
8710 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8712 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
8716 std::string OutName;
8717 llvm::raw_string_ostream Out(OutName);
8725 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8734 return RequireVectorDeletingDtor.count(RD);
8738 if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
8740 RequireVectorDeletingDtor.insert(RD);
8754 if (Entry && !Entry->isDeclaration()) {
8759 auto *NewFn = llvm::Function::Create(
8761 llvm::Function::ExternalLinkage, VDName, &
getModule());
8762 SetFunctionAttributes(VectorDtorGD, NewFn,
false,
8764 NewFn->takeName(VDEntry);
8765 VDEntry->replaceAllUsesWith(NewFn);
8766 VDEntry->eraseFromParent();
8767 Entry->replaceAllUsesWith(NewFn);
8768 Entry->eraseFromParent();
8773 addDeferredDeclToEmit(VectorDtorGD);
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the Diagnostic-related interfaces.
Defines enum values for all the target-independent builtin functions.
static bool shouldAssumeDSOLocal(const CIRGenModule &cgm, cir::CIRGlobalValueInterface gv)
static bool shouldBeInCOMDAT(CIRGenModule &cgm, const Decl &d)
static bool hasUnwindExceptions(const LangOptions &langOpts)
Determines whether the language options require us to model unwind exceptions.
static void setWindowsItaniumDLLImport(CIRGenModule &cgm, bool isLocal, cir::FuncOp funcOp, StringRef name)
static std::string getMangledNameImpl(CIRGenModule &cgm, GlobalDecl gd, const NamedDecl *nd)
static bool hasImplicitAttr(const ValueDecl *decl)
static std::vector< std::string > getFeatureDeltaFromDefault(const CIRGenModule &cgm, llvm::StringRef targetCPU, llvm::StringMap< bool > &featureMap)
Get the feature delta from the default feature map for the given target CPU.
static CIRGenCXXABI * createCXXABI(CIRGenModule &cgm)
static bool isVarDeclStrongDefinition(const ASTContext &astContext, CIRGenModule &cgm, const VarDecl *vd, bool noCommon)
static void setLinkageForGV(cir::GlobalOp &gv, const NamedDecl *nd)
static void emitUsed(CIRGenModule &cgm, StringRef name, std::vector< cir::CIRGlobalValueInterface > &list)
static bool hasExistingGeneralizedTypeMD(llvm::Function *F)
static void AppendCPUSpecificCPUDispatchMangling(const CodeGenModule &CGM, const CPUSpecificAttr *Attr, unsigned CPUIndex, raw_ostream &Out)
static bool AllTrivialInitializers(CodeGenModule &CGM, ObjCImplementationDecl *D)
static const FunctionDecl * GetRuntimeFunctionDecl(ASTContext &C, StringRef Name)
static GlobalDecl getBaseVariantGlobalDecl(const NamedDecl *D)
static void checkAliasForTocData(llvm::GlobalVariable *GVar, const CodeGenOptions &CodeGenOpts, DiagnosticsEngine &Diags, SourceLocation Location)
static const char PFPDeactivationSymbolPrefix[]
static bool HasNonDllImportDtor(QualType T)
static llvm::Constant * GetPointerConstant(llvm::LLVMContext &Context, const void *Ptr)
Turns the given pointer into a constant.
static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S)
static llvm::GlobalValue::LinkageTypes getMultiversionLinkage(CodeGenModule &CGM, GlobalDecl GD)
static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO, llvm::Module &M)
static QualType GeneralizeTransparentUnion(QualType Ty)
static std::string getCPUSpecificMangling(const CodeGenModule &CGM, StringRef Name)
static const char AnnotationSection[]
static bool isUniqueInternalLinkageDecl(GlobalDecl GD, CodeGenModule &CGM)
static bool allowKCFIIdentifier(StringRef Name)
static void replaceUsesOfNonProtoConstant(llvm::Constant *old, llvm::Function *newFn)
Replace the uses of a function that was declared with a non-proto type.
static llvm::Constant * castStringLiteralToDefaultAddressSpace(CodeGenModule &CGM, llvm::GlobalVariable *GV)
static void checkDataLayoutConsistency(const TargetInfo &Target, llvm::LLVMContext &Context, const LangOptions &Opts)
static QualType GeneralizeFunctionType(ASTContext &Ctx, QualType Ty, bool GeneralizePointers)
static bool needsDestructMethod(ObjCImplementationDecl *impl)
static bool isStackProtectorOn(const LangOptions &LangOpts, const llvm::Triple &Triple, clang::LangOptions::StackProtectorMode Mode)
static void removeImageAccessQualifier(std::string &TyName)
static llvm::StringMapEntry< llvm::GlobalVariable * > & GetConstantCFStringEntry(llvm::StringMap< llvm::GlobalVariable * > &Map, const StringLiteral *Literal, bool TargetIsLSB, bool &IsUTF16, unsigned &StringLength)
static void setLLVMVisibility(llvm::GlobalValue &GV, std::optional< llvm::GlobalValue::VisibilityTypes > V)
static llvm::GlobalVariable * GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT, CodeGenModule &CGM, StringRef GlobalName, CharUnits Alignment)
static llvm::APInt getFMVPriority(const TargetInfo &TI, const CodeGenFunction::FMVResolverOption &RO)
static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod, SmallVectorImpl< llvm::MDNode * > &Metadata, llvm::SmallPtrSet< Module *, 16 > &Visited)
Add link options implied by the given module, including modules it depends on, using a postorder walk...
static llvm::cl::opt< bool > LimitedCoverage("limited-coverage-experimental", llvm::cl::Hidden, llvm::cl::desc("Emit limited coverage mapping information (experimental)"))
static CGCXXABI * createCXXABI(CodeGenModule &CGM)
static std::unique_ptr< TargetCodeGenInfo > createTargetCodeGenInfo(CodeGenModule &CGM)
static const llvm::GlobalValue * getAliasedGlobal(const llvm::GlobalValue *GV)
static QualType GeneralizeType(ASTContext &Ctx, QualType Ty, bool GeneralizePointers)
static bool shouldSkipAliasEmission(const CodeGenModule &CGM, const ValueDecl *Global)
static constexpr auto ErrnoTBAAMDName
static unsigned ArgInfoAddressSpace(LangAS AS)
static void replaceDeclarationWith(llvm::GlobalValue *Old, llvm::Constant *New)
static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, llvm::Function *NewFn)
ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we implement a function with...
static std::optional< llvm::GlobalValue::VisibilityTypes > getLLVMVisibility(clang::LangOptions::VisibilityFromDLLStorageClassKinds K)
static bool requiresMemberFunctionPointerTypeMetadata(CodeGenModule &CGM, const CXXMethodDecl *MD)
static bool checkAliasedGlobal(const ASTContext &Context, DiagnosticsEngine &Diags, SourceLocation Location, bool IsIFunc, const llvm::GlobalValue *Alias, const llvm::GlobalValue *&GV, const llvm::MapVector< GlobalDecl, StringRef > &MangledDeclNames, SourceRange AliasRange)
static void EmitGlobalDeclMetadata(CodeGenModule &CGM, llvm::NamedMDNode *&GlobalMetadata, GlobalDecl D, llvm::GlobalValue *Addr)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Result
Implement __builtin_bit_cast and related operations.
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
Defines the clang::Preprocessor interface.
Maps Clang QualType instances to corresponding LLVM ABI type representations.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static const NamedDecl * getDefinition(const Decl *D)
Defines the SourceManager interface.
static CharUnits getTypeAllocSize(CodeGenModule &CGM, llvm::Type *type)
Defines version macros and version-related utility functions for Clang.
__device__ __2f16 float __ockl_bool s
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
const ProfileList & getProfileList() const
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
const XRayFunctionFilter & getXRayFilter() const
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
StringRef getCUIDHash() const
const LangOptions & getLangOpts() const
SelectorTable & Selectors
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
const NoSanitizeList & getNoSanitizeList() const
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const
Return the alignment in characters that should be given to a global variable with type T.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
DiagnosticsEngine & getDiagnostics() const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
CanQualType getCanonicalTagType(const TagDecl *TD) const
unsigned getTargetAddressSpace(LangAS AS) const
Module * getCurrentNamedModule() const
Get module under construction, nullptr if this is not a C++20 module.
Attr - This represents one attribute.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
bool isLibFunction(unsigned ID) const
Return true if this is a builtin for a libc/libm function, with a "__builtin_" prefix (e....
std::string getName(unsigned ID) const
Return the identifier name for the specified builtin, e.g.
Represents a base class of a C++ class.
CXXTemporary * getTemporary()
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ base or member initializer.
Expr * getInit() const
Get the initializer.
FunctionDecl * getOperatorDelete() const
Represents a C++ destructor within a class.
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Represents a static or instance method of a struct/union/class.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
FunctionDecl * getOperatorNew() const
Represents a C++ struct/union/class.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool hasDefinition() const
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
const CXXDestructorDecl * getDestructor() const
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
CharUnits - This is an opaque type for sizes expressed in character units.
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits One()
One - Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
std::string MSSecureHotPatchFunctionsFile
The name of a file that contains functions which will be compiled for hotpatching.
std::string RecordCommandLine
The string containing the commandline for the llvm.commandline metadata, if non-empty.
std::string FloatABI
The ABI to use for passing floating point arguments.
llvm::Reloc::Model RelocationModel
The name of the relocation model to use.
std::vector< std::string > TocDataVarsUserSpecified
List of global variables explicitly specified by the user as toc-data.
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
std::vector< std::string > MSSecureHotPatchFunctionsList
A list of functions which will be compiled for hotpatching.
ABIInfo - Target specific hooks for defining how a type should be passed or returned from functions.
virtual void appendAttributeMangling(TargetAttr *Attr, raw_ostream &Out) const
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
virtual void handleVarRegistration(const VarDecl *VD, llvm::GlobalVariable &Var)=0
Check whether a variable is a device variable and register it if true.
virtual llvm::GlobalValue * getKernelHandle(llvm::Function *Stub, GlobalDecl GD)=0
Get kernel handle by stub function.
virtual void internalizeDeviceSideVar(const VarDecl *D, llvm::GlobalValue::LinkageTypes &Linkage)=0
Adjust linkage of shadow variables in host compilation.
Implements C++ ABI-specific code generation functions.
virtual void EmitCXXConstructors(const CXXConstructorDecl *D)=0
Emit constructor variants required by this ABI.
virtual llvm::Constant * getAddrOfRTTIDescriptor(QualType Ty)=0
virtual void EmitCXXDestructors(const CXXDestructorDecl *D)=0
Emit destructor variants required by this ABI.
virtual void setCXXDestructorDLLStorage(llvm::GlobalValue *GV, const CXXDestructorDecl *Dtor, CXXDtorType DT) const
virtual llvm::GlobalValue::LinkageTypes getCXXDestructorLinkage(GVALinkage Linkage, const CXXDestructorDecl *Dtor, CXXDtorType DT) const
MangleContext & getMangleContext()
Gets the mangle context.
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
void EmitGlobalAlias(const llvm::GlobalValue *GV, const GlobalDecl Decl)
Emit information about global variable alias.
void EmitExternalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl)
Emit information about an external variable.
void EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc, QualType FnType, llvm::Function *Fn=nullptr)
Emit debug info for a function declaration.
void AddStringLiteralDebugInfo(llvm::GlobalVariable *GV, const StringLiteral *S)
DebugInfo isn't attached to string literals by default.
CGFunctionInfo - Class to encapsulate the information about a function definition.
void handleGlobalVarDefinition(const VarDecl *VD, llvm::GlobalVariable *Var)
void addRootSignature(const HLSLRootSignatureDecl *D)
void addBuffer(const HLSLBufferDecl *D)
llvm::Type * getSamplerType(const Type *T)
void emitDeferredTargetDecls() const
Emit deferred declare target variables marked for deferred emission.
virtual void emitDeclareTargetFunction(const FunctionDecl *FD, llvm::GlobalValue *GV)
Emit code for handling declare target functions in the runtime.
virtual ConstantAddress getAddrOfDeclareTargetVar(const VarDecl *VD)
Returns the address of the variable marked as declare target with link clause OR as declare target wi...
bool hasRequiresUnifiedSharedMemory() const
Return whether the unified_shared_memory has been specified.
virtual void emitDeclareSimdFunction(const FunctionDecl *FD, llvm::Function *Fn)
Marks function Fn with properly mangled versions of vector functions.
virtual void registerTargetGlobalVariable(const VarDecl *VD, llvm::Constant *Addr)
Checks if the provided global decl GD is a declare target variable and registers it when emitting cod...
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)
void EmitCfiCheckFail()
Emit a cross-DSO CFI failure handling function.
void GenerateObjCGetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCGetter - Synthesize an Objective-C property getter function.
void EmitCfiCheckStub()
Emit a stub for the cross-DSO CFI check function.
void GenerateObjCMethod(const ObjCMethodDecl *OMD)
Generate an Objective-C method.
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
void GenerateObjCSetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCSetter - Synthesize an Objective-C property setter function for the given property.
llvm::LLVMContext & getLLVMContext()
bool isTrivialInitializer(const Expr *Init)
Determine whether the given initializer is trivial in the sense that it requires no code to be genera...
This class organizes the cross-function state that is used while generating LLVM code.
StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD)
ConstantAddress GetAddrOfMSGuidDecl(const MSGuidDecl *GD)
Get the address of a GUID.
void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const
Set visibility, dllimport/dllexport and dso_local.
void AddVTableTypeMetadata(llvm::GlobalVariable *VTable, CharUnits Offset, const CXXRecordDecl *RD)
Create and attach type metadata for the given vtable.
void UpdateCompletedType(const TagDecl *TD)
llvm::MDNode * getTBAAAccessTagInfo(TBAAAccessInfo Info)
getTBAAAccessTagInfo - Get TBAA tag for a given memory access.
llvm::GlobalVariable::ThreadLocalMode GetDefaultLLVMTLSModel() const
Get LLVM TLS mode from CodeGenOptions.
void SetInternalFunctionAttributes(GlobalDecl GD, llvm::Function *F, const CGFunctionInfo &FI)
Set the attributes on the LLVM function for the given decl and function info.
void setDSOLocal(llvm::GlobalValue *GV) const
llvm::MDNode * getTBAAStructInfo(QualType QTy)
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
llvm::Constant * EmitAnnotationArgs(const AnnotateAttr *Attr)
Emit additional args of the annotation.
llvm::Module & getModule() const
std::optional< llvm::Attribute::AttrKind > StackProtectorAttribute(const Decl *D) const
llvm::GlobalValue * getPFPDeactivationSymbol(const FieldDecl *FD)
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
llvm::ConstantInt * CreateKCFITypeId(QualType T, StringRef Salt)
Generate a KCFI type identifier for T.
CGDebugInfo * getModuleDebugInfo()
llvm::Constant * performAddrSpaceCast(llvm::Constant *Src, llvm::Type *DestTy)
bool NeedAllVtablesTypeId() const
Returns whether this module needs the "all-vtables" type identifier.
void addCompilerUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.compiler.used metadata.
CodeGenVTables & getVTables()
llvm::ConstantInt * CreateCrossDsoCfiTypeId(llvm::Metadata *MD)
Generate a cross-DSO type identifier for MD.
CharUnits GetTargetTypeStoreSize(llvm::Type *Ty) const
Return the store size, in character units, of the given LLVM type.
void createFunctionTypeMetadataForIcall(const FunctionDecl *FD, llvm::Function *F)
Create and attach type metadata to the given function.
bool getExpressionLocationsEnabled() const
Return true if we should emit location information for expressions.
void addGlobalValReplacement(llvm::GlobalValue *GV, llvm::Constant *C)
bool classNeedsVectorDestructor(const CXXRecordDecl *RD)
Check that class need vector deleting destructor body.
llvm::Constant * GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH=false)
Get the address of the RTTI descriptor for the given type.
llvm::Constant * GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty=nullptr, bool ForVTable=false, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the given function.
void setGVPropertiesAux(llvm::GlobalValue *GV, const NamedDecl *D) const
const IntrusiveRefCntPtr< llvm::vfs::FileSystem > & getFileSystem() const
const ABIInfo & getABIInfo()
void EmitMainVoidAlias()
Emit an alias for "main" if it has no arguments (needed for wasm).
void DecorateInstructionWithInvariantGroup(llvm::Instruction *I, const CXXRecordDecl *RD)
Adds !invariant.barrier !tag to instruction.
DiagnosticsEngine & getDiags() const
bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn, SourceLocation Loc) const
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
llvm::Constant * getAddrOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the constructor/destructor of the given type.
void ErrorUnsupported(const Stmt *S, const char *Type)
Print out an error that codegen doesn't support the specified stmt yet.
llvm::Constant * EmitAnnotateAttr(llvm::GlobalValue *GV, const AnnotateAttr *AA, SourceLocation L)
Generate the llvm::ConstantStruct which contains the annotation information for a given GlobalValue.
void EmitOpenACCDeclare(const OpenACCDeclareDecl *D, CodeGenFunction *CGF=nullptr)
llvm::GlobalValue::LinkageTypes getLLVMLinkageForDeclarator(const DeclaratorDecl *D, GVALinkage Linkage)
Returns LLVM linkage for a declarator.
TBAAAccessInfo mergeTBAAInfoForMemoryTransfer(TBAAAccessInfo DestInfo, TBAAAccessInfo SrcInfo)
mergeTBAAInfoForMemoryTransfer - Get merged TBAA information for the purposes of memory transfer call...
const LangOptions & getLangOpts() const
CGCUDARuntime & getCUDARuntime()
Return a reference to the configured CUDA runtime.
llvm::Constant * EmitAnnotationLineNo(SourceLocation L)
Emit the annotation line number.
QualType getObjCFastEnumerationStateType()
Retrieve the record type that describes the state of an Objective-C fast enumeration loop (for....
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CodeGenTypes & getTypes()
bool shouldMapVisibilityToDLLExport(const NamedDecl *D) const
CGOpenCLRuntime & getOpenCLRuntime()
Return a reference to the configured OpenCL runtime.
const std::string & getModuleNameHash() const
const TargetInfo & getTarget() const
bool shouldEmitRTTI(bool ForEH=false)
void EmitGlobal(GlobalDecl D)
Emit code for a single global function or var decl.
llvm::Metadata * CreateMetadataIdentifierForType(QualType T)
Create a metadata identifier for the given type.
void addUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.used metadata.
void createIndirectFunctionTypeMD(const FunctionDecl *FD, llvm::Function *F)
Create and attach type metadata if the function is a potential indirect call target to support call g...
void AppendLinkerOptions(StringRef Opts)
Appends Opts to the "llvm.linker.options" metadata value.
void createCalleeTypeMetadataForIcall(const QualType &QT, llvm::CallBase *CB)
Create and attach type metadata to the given call.
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.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
GlobalDecl - represents a global declaration.
GlobalDecl getWithMultiVersionIndex(unsigned Index)
CXXCtorType getCtorType() const
GlobalDecl getWithKernelReferenceKind(KernelReferenceKind Kind)
GlobalDecl getCanonicalDecl() const
KernelReferenceKind getKernelReferenceKind() const
GlobalDecl getWithDecl(const Decl *D)
unsigned getMultiVersionIndex() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
@ None
No signing for any function.
@ Swift5_0
Interoperability with the Swift 5.0 runtime.
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
VisibilityFromDLLStorageClassKinds
@ Keep
Keep the IR-gen assigned visibility.
@ Protected
Override the IR-gen assigned visibility with protected visibility.
@ Default
Override the IR-gen assigned visibility with default visibility.
@ Hidden
Override the IR-gen assigned visibility with hidden visibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
std::string CUID
The user provided compilation unit ID, if non-empty.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
Visibility getVisibility() const
void setLinkage(Linkage L)
Linkage getLinkage() const
bool isVisibilityExplicit() const
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
Parts getParts() const
Get the decomposed parts of this declaration.
APValue & getAsAPValue() const
Get the value of this MSGuidDecl as an APValue.
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
void mangleBlock(const DeclContext *DC, const BlockDecl *BD, raw_ostream &Out)
void mangleCtorBlock(const CXXConstructorDecl *CD, CXXCtorType CT, const BlockDecl *BD, raw_ostream &Out)
void mangleGlobalBlock(const BlockDecl *BD, const NamedDecl *ID, raw_ostream &Out)
bool shouldMangleDeclName(const NamedDecl *D)
void mangleName(GlobalDecl GD, raw_ostream &)
virtual void mangleCanonicalTypeName(QualType T, raw_ostream &, bool NormalizeIntegers=false)=0
Generates a unique string for an externally visible type for use with TBAA or type uniquing.
virtual void mangleStringLiteral(const StringLiteral *SL, raw_ostream &)=0
ManglerKind getKind() const
virtual void needsUniqueInternalLinkageNames()
virtual void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, raw_ostream &)=0
void mangleDtorBlock(const CXXDestructorDecl *CD, CXXDtorType DT, const BlockDecl *BD, raw_ostream &Out)
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
APValue * getOrCreateValue(bool MayCreate) const
Get the storage for the constant value of a materialized temporary of static storage duration.
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
unsigned getManglingNumber() const
Describes a module or submodule.
bool isInterfaceOrPartition() const
bool isNamedModuleUnit() const
Is this a C++20 named module unit.
Module * Parent
The parent of this module.
Module * getPrivateModuleFragment() const
Get the Private Module Fragment (sub-module) for this module, it there is one.
Module * getGlobalModuleFragment() const
Get the Global Module Fragment (sub-module) for this module, it there is one.
llvm::iterator_range< submodule_iterator > submodules()
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
bool UseExportAsModuleLinkName
Autolinking uses the framework name for linking purposes when this is false and the export_as name ot...
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
bool isExternallyVisible() const
Represent a C++ namespace.
This represents 'pragma omp threadprivate ...' directive.
ObjCEncodeExpr, used for @encode in Objective-C.
QualType getEncodedType() const
propimpl_range property_impls() const
const ObjCInterfaceDecl * getClassInterface() const
void addInstanceMethod(ObjCMethodDecl *method)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
init_iterator init_end()
init_end() - Retrieve an iterator past the last initializer.
CXXCtorInitializer ** init_iterator
init_iterator - Iterates through the ivar initializer list.
init_iterator init_begin()
init_begin() - Retrieve an iterator to the first initializer.
unsigned getNumIvarInitializers() const
getNumArgs - Number of ivars which must be initialized.
void setHasDestructors(bool val)
void setHasNonZeroConstructors(bool val)
Represents an ObjC class declaration.
ObjCIvarDecl * all_declared_ivar_begin()
all_declared_ivar_begin - return first ivar declared in this class, its extensions and its implementa...
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarDecl * getNextIvar()
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
Represents one property declaration in an Objective-C interface.
ObjCMethodDecl * getGetterMethodDecl() const
bool isReadOnly() const
isReadOnly - Return true iff the property has a setter.
The basic abstraction for the target Objective-C runtime.
bool hasUnwindExceptions() const
Does this runtime use zero-cost exceptions?
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ GNUstep
'gnustep' is the modern non-fragile GNUstep runtime.
@ ObjFW
'objfw' is the Objective-C runtime included in ObjFW
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ GCC
'gcc' is the Objective-C runtime shipped with GCC, implementing a fragile Objective-C ABI
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
Represents a parameter to a function.
bool isAddressDiscriminated() const
uint16_t getConstantDiscrimination() const
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
static void processPathForFileMacro(SmallVectorImpl< char > &Path, const LangOptions &LangOpts, const TargetInfo &TI)
Represents an unpacked "presumed" location which can be presented to the user.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
ExclusionType getDefault(llvm::driver::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFunctionExcluded(StringRef FunctionName, llvm::driver::ProfileInstrKind Kind) const
std::optional< ExclusionType > isFileExcluded(StringRef FileName, llvm::driver::ProfileInstrKind Kind) const
ExclusionType
Represents if an how something should be excluded from profiling.
@ Skip
Profiling is skipped using the skipprofile attribute.
@ Allow
Profiling is allowed.
std::optional< ExclusionType > isLocationExcluded(SourceLocation Loc, llvm::driver::ProfileInstrKind Kind) const
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool isConstant(const ASTContext &Ctx) const
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType withCVRQualifiers(unsigned CVR) const
bool isConstQualified() const
Determine whether this type is const-qualified.
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Represents a struct/union/class.
field_range fields() const
virtual void completeDefinition()
Note that the definition of this type is now complete.
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
unsigned getLength() const
uint32_t getCodeUnit(size_t i) const
StringRef getString() const
unsigned getCharByteWidth() const
Represents the declaration of a struct/union/class/enum.
void startDefinition()
Starts the definition of this tag declaration.
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
bool isReadOnlyFeature(StringRef Feature) const
Determine whether the given target feature is read only.
virtual llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const
bool supportsIFunc() const
Identify whether this target supports IFuncs.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
@ Hostcall
printf lowering scheme involving hostcalls, currently used by HIP programs by default
A template parameter object.
const APValue & getValue() const
A declaration that models statements at global scope.
The top declaration context.
static DeclContext * castToDeclContext(const TranslationUnitDecl *D)
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool isHLSLResourceRecord() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isObjCObjectPointerType() const
Linkage getLinkage() const
Determine the linkage of this type.
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
bool isHLSLResourceRecordArray() const
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
const APValue & getValue() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Defines the clang::TargetInfo interface.
std::unique_ptr< TargetCodeGenInfo > createARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createM68kTargetCodeGenInfo(CodeGenModule &CGM)
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
std::unique_ptr< TargetCodeGenInfo > createBPFTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createMSP430TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createWebAssemblyTargetCodeGenInfo(CodeGenModule &CGM, WebAssemblyABIKind K)
std::unique_ptr< TargetCodeGenInfo > createPPC64_SVR4_TargetCodeGenInfo(CodeGenModule &CGM, PPC64_SVR4_ABIKind Kind, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createHexagonTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createNVPTXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createSystemZTargetCodeGenInfo(CodeGenModule &CGM, bool HasVector, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createWinX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters)
std::unique_ptr< TargetCodeGenInfo > createAIXTargetCodeGenInfo(CodeGenModule &CGM, bool Is64Bit)
std::unique_ptr< TargetCodeGenInfo > createAMDGPUTargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateMacObjCRuntime(CodeGenModule &CGM)
X86AVXABILevel
The AVX ABI level for X86 targets.
std::unique_ptr< TargetCodeGenInfo > createTCETargetCodeGenInfo(CodeGenModule &CGM)
CGObjCRuntime * CreateGNUObjCRuntime(CodeGenModule &CGM)
Creates an instance of an Objective-C runtime class.
std::unique_ptr< TargetCodeGenInfo > createWindowsARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind K)
std::unique_ptr< TargetCodeGenInfo > createAVRTargetCodeGenInfo(CodeGenModule &CGM, unsigned NPR, unsigned NRR)
std::unique_ptr< TargetCodeGenInfo > createDirectXTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createARCTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createDefaultTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind Kind)
std::unique_ptr< TargetCodeGenInfo > createSPIRVTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32)
std::unique_ptr< TargetCodeGenInfo > createSparcV8TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createVETargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCommonSPIRTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createRISCVTargetCodeGenInfo(CodeGenModule &CGM, unsigned XLen, unsigned FLen, bool EABI)
std::unique_ptr< TargetCodeGenInfo > createWindowsAArch64TargetCodeGenInfo(CodeGenModule &CGM, AArch64ABIKind K)
std::unique_ptr< TargetCodeGenInfo > createSparcV9TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createX86_32TargetCodeGenInfo(CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI, unsigned NumRegisterParameters, bool SoftFloatABI)
std::unique_ptr< TargetCodeGenInfo > createLanaiTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createPPC32TargetCodeGenInfo(CodeGenModule &CGM, bool SoftFloatABI)
CGCUDARuntime * CreateNVCUDARuntime(CodeGenModule &CGM)
Creates an instance of a CUDA runtime class.
std::unique_ptr< TargetCodeGenInfo > createLoongArchTargetCodeGenInfo(CodeGenModule &CGM, unsigned GRLen, unsigned FLen)
std::unique_ptr< TargetCodeGenInfo > createPPC64TargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createWinX86_64TargetCodeGenInfo(CodeGenModule &CGM, X86AVXABILevel AVXLevel)
std::unique_ptr< TargetCodeGenInfo > createXCoreTargetCodeGenInfo(CodeGenModule &CGM)
std::unique_ptr< TargetCodeGenInfo > createCSKYTargetCodeGenInfo(CodeGenModule &CGM, unsigned FLen)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
constexpr bool isInitializedByPipeline(LangAS AS)
bool LT(InterpState &S, CodePtr OpPC)
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
@ Ctor_Base
Base object ctor.
@ Ctor_Complete
Complete object ctor.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
std::string getClangVendor()
Retrieves the Clang vendor tag.
@ ICIS_NoInit
No in-class initializer.
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
StringRef languageToString(Language L)
@ Dtor_VectorDeleting
Vector deleting dtor.
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object dtor.
@ Dtor_Deleting
Deleting dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, llvm::vfs::FileSystem &VFS, DiagnosticsEngine &Diags)
static const char * getCFBranchLabelSchemeFlagVal(const CFBranchLabelSchemeKind Scheme)
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
bool isExternallyVisible(Linkage L)
@ EST_None
no exception specification
std::string getClangFullVersion()
Retrieves a string representing the complete clang version, which includes the clang version number,...
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
cl::opt< bool > SystemHeadersCoverage
int const char * function
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
std::optional< StringRef > Architecture
llvm::SmallVector< StringRef, 8 > Features
llvm::CallingConv::ID RuntimeCC
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::PointerType * ConstGlobalsPtrTy
void* in the address space for constant globals
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * CharTy
char
unsigned char PointerWidthInBits
The width of a pointer into the generic address space.
unsigned char IntAlignInBytes
llvm::Type * HalfTy
half, bfloat, float, double
unsigned char SizeSizeInBytes
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * SizeTy
llvm::PointerType * GlobalsInt8PtrTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::IntegerType * IntTy
int
llvm::IntegerType * Int16Ty
llvm::PointerType * ProgramPtrTy
Pointer in program address space.
unsigned char PointerAlignInBytes
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
llvm::PointerType * AllocaInt8PtrTy
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool hasSideEffects() const
Return true if the evaluated expression has side effects.
Extra information about a function prototype.
static const LangStandard & getLangStandardForKind(Kind K)
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
A library or framework to link against when an entity from this module is used.
PointerAuthSchema InitFiniPointers
The ABI for function addresses in .init_array and .fini_array.
Describes how types, statements, expressions, and declarations should be printed.