50#include "llvm/ADT/STLExtras.h"
51#include "llvm/ADT/StringExtras.h"
52#include "llvm/ADT/StringSwitch.h"
53#include "llvm/Analysis/TargetLibraryInfo.h"
54#include "llvm/BinaryFormat/ELF.h"
55#include "llvm/IR/AttributeMask.h"
56#include "llvm/IR/CallingConv.h"
57#include "llvm/IR/DataLayout.h"
58#include "llvm/IR/Intrinsics.h"
59#include "llvm/IR/LLVMContext.h"
60#include "llvm/IR/Module.h"
61#include "llvm/IR/ProfileSummary.h"
62#include "llvm/ProfileData/InstrProfReader.h"
63#include "llvm/ProfileData/SampleProf.h"
64#include "llvm/Support/CRC.h"
65#include "llvm/Support/CodeGen.h"
66#include "llvm/Support/CommandLine.h"
67#include "llvm/Support/ConvertUTF.h"
68#include "llvm/Support/ErrorHandling.h"
69#include "llvm/Support/Hash.h"
70#include "llvm/Support/TimeProfiler.h"
71#include "llvm/TargetParser/RISCVISAInfo.h"
72#include "llvm/TargetParser/Triple.h"
73#include "llvm/TargetParser/X86TargetParser.h"
74#include "llvm/Transforms/Instrumentation/KCFI.h"
75#include "llvm/Transforms/Utils/BuildLibCalls.h"
83 "limited-coverage-experimental", llvm::cl::Hidden,
84 llvm::cl::desc(
"Emit limited coverage mapping information (experimental)"));
91 case TargetCXXABI::AppleARM64:
92 case TargetCXXABI::Fuchsia:
93 case TargetCXXABI::GenericAArch64:
94 case TargetCXXABI::GenericARM:
95 case TargetCXXABI::iOS:
96 case TargetCXXABI::WatchOS:
97 case TargetCXXABI::GenericMIPS:
98 case TargetCXXABI::GenericItanium:
99 case TargetCXXABI::WebAssembly:
100 case TargetCXXABI::XL:
102 case TargetCXXABI::Microsoft:
106 llvm_unreachable(
"invalid C++ ABI kind");
109static std::unique_ptr<TargetCodeGenInfo>
112 const llvm::Triple &Triple =
Target.getTriple();
115 switch (Triple.getArch()) {
119 case llvm::Triple::m68k:
121 case llvm::Triple::mips:
122 case llvm::Triple::mipsel:
123 if (Triple.getOS() == llvm::Triple::Win32)
127 case llvm::Triple::mips64:
128 case llvm::Triple::mips64el:
131 case llvm::Triple::avr: {
135 unsigned NPR =
Target.getABI() ==
"avrtiny" ? 6 : 18;
136 unsigned NRR =
Target.getABI() ==
"avrtiny" ? 4 : 8;
140 case llvm::Triple::aarch64:
141 case llvm::Triple::aarch64_32:
142 case llvm::Triple::aarch64_be: {
144 if (
Target.getABI() ==
"darwinpcs")
145 Kind = AArch64ABIKind::DarwinPCS;
146 else if (Triple.isOSWindows())
148 else if (
Target.getABI() ==
"aapcs-soft")
149 Kind = AArch64ABIKind::AAPCSSoft;
154 case llvm::Triple::wasm32:
155 case llvm::Triple::wasm64: {
157 if (
Target.getABI() ==
"experimental-mv")
158 Kind = WebAssemblyABIKind::ExperimentalMV;
162 case llvm::Triple::arm:
163 case llvm::Triple::armeb:
164 case llvm::Triple::thumb:
165 case llvm::Triple::thumbeb: {
166 if (Triple.getOS() == llvm::Triple::Win32)
170 StringRef ABIStr =
Target.getABI();
171 if (ABIStr ==
"apcs-gnu")
172 Kind = ARMABIKind::APCS;
173 else if (ABIStr ==
"aapcs16")
174 Kind = ARMABIKind::AAPCS16_VFP;
175 else if (CodeGenOpts.
FloatABI ==
"hard" ||
176 (CodeGenOpts.
FloatABI !=
"soft" && Triple.isHardFloatABI()))
177 Kind = ARMABIKind::AAPCS_VFP;
182 case llvm::Triple::ppc: {
183 if (Triple.isOSAIX())
190 case llvm::Triple::ppcle: {
195 case llvm::Triple::ppc64:
196 if (Triple.isOSAIX())
199 if (Triple.isOSBinFormatELF()) {
201 if (
Target.getABI() ==
"elfv2")
202 Kind = PPC64_SVR4_ABIKind::ELFv2;
203 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
208 case llvm::Triple::ppc64le: {
209 assert(Triple.isOSBinFormatELF() &&
"PPC64 LE non-ELF not supported!");
211 if (
Target.getABI() ==
"elfv1")
212 Kind = PPC64_SVR4_ABIKind::ELFv1;
213 bool IsSoftFloat = CodeGenOpts.
FloatABI ==
"soft";
218 case llvm::Triple::nvptx:
219 case llvm::Triple::nvptx64:
222 case llvm::Triple::msp430:
225 case llvm::Triple::riscv32:
226 case llvm::Triple::riscv64: {
227 StringRef ABIStr =
Target.getABI();
229 unsigned ABIFLen = 0;
230 if (ABIStr.ends_with(
"f"))
232 else if (ABIStr.ends_with(
"d"))
234 bool EABI = ABIStr.ends_with(
"e");
238 case llvm::Triple::systemz: {
239 bool SoftFloat = CodeGenOpts.
FloatABI ==
"soft";
240 bool HasVector = !SoftFloat &&
Target.getABI() ==
"vector";
244 case llvm::Triple::tce:
245 case llvm::Triple::tcele:
248 case llvm::Triple::x86: {
249 bool IsDarwinVectorABI = Triple.isOSDarwin();
250 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
252 if (Triple.getOS() == llvm::Triple::Win32) {
254 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
255 CodeGenOpts.NumRegisterParameters);
258 CGM, IsDarwinVectorABI, IsWin32FloatStructABI,
259 CodeGenOpts.NumRegisterParameters, CodeGenOpts.
FloatABI ==
"soft");
262 case llvm::Triple::x86_64: {
263 StringRef ABI =
Target.getABI();
264 X86AVXABILevel AVXLevel = (ABI ==
"avx512" ? X86AVXABILevel::AVX512
265 : ABI ==
"avx" ? X86AVXABILevel::AVX
266 : X86AVXABILevel::None);
268 switch (Triple.getOS()) {
269 case llvm::Triple::UEFI:
270 case llvm::Triple::Win32:
276 case llvm::Triple::hexagon:
278 case llvm::Triple::lanai:
280 case llvm::Triple::r600:
282 case llvm::Triple::amdgcn:
284 case llvm::Triple::sparc:
286 case llvm::Triple::sparcv9:
288 case llvm::Triple::xcore:
290 case llvm::Triple::arc:
292 case llvm::Triple::spir:
293 case llvm::Triple::spir64:
295 case llvm::Triple::spirv32:
296 case llvm::Triple::spirv64:
297 case llvm::Triple::spirv:
299 case llvm::Triple::dxil:
301 case llvm::Triple::ve:
303 case llvm::Triple::csky: {
304 bool IsSoftFloat = !
Target.hasFeature(
"hard-float-abi");
306 Target.hasFeature(
"fpuv2_df") ||
Target.hasFeature(
"fpuv3_df");
311 case llvm::Triple::bpfeb:
312 case llvm::Triple::bpfel:
314 case llvm::Triple::loongarch32:
315 case llvm::Triple::loongarch64: {
316 StringRef ABIStr =
Target.getABI();
317 unsigned ABIFRLen = 0;
318 if (ABIStr.ends_with(
"f"))
320 else if (ABIStr.ends_with(
"d"))
329 if (!TheTargetCodeGenInfo)
331 return *TheTargetCodeGenInfo;
335 llvm::LLVMContext &Context,
339 if (Opts.AlignDouble || Opts.OpenCL || Opts.HLSL)
342 llvm::Triple Triple =
Target.getTriple();
343 llvm::DataLayout DL(
Target.getDataLayoutString());
344 auto Check = [&](
const char *Name, llvm::Type *Ty,
unsigned Alignment) {
345 llvm::Align DLAlign = DL.getABITypeAlign(Ty);
346 llvm::Align ClangAlign(Alignment / 8);
347 if (DLAlign != ClangAlign) {
348 llvm::errs() <<
"For target " << Triple.str() <<
" type " << Name
349 <<
" mapping to " << *Ty <<
" has data layout alignment "
350 << DLAlign.value() <<
" while clang specifies "
351 << ClangAlign.value() <<
"\n";
356 Check(
"bool", llvm::Type::getIntNTy(Context,
Target.BoolWidth),
358 Check(
"short", llvm::Type::getIntNTy(Context,
Target.ShortWidth),
360 Check(
"int", llvm::Type::getIntNTy(Context,
Target.IntWidth),
362 Check(
"long", llvm::Type::getIntNTy(Context,
Target.LongWidth),
365 if (Triple.getArch() != llvm::Triple::m68k)
366 Check(
"long long", llvm::Type::getIntNTy(Context,
Target.LongLongWidth),
369 if (
Target.hasInt128Type() && !
Target.getTargetOpts().ForceEnableInt128 &&
370 !Triple.isAMDGPU() && !Triple.isSPIRV() &&
371 Triple.getArch() != llvm::Triple::ve)
372 Check(
"__int128", llvm::Type::getIntNTy(Context, 128),
Target.Int128Align);
374 if (
Target.hasFloat16Type())
375 Check(
"half", llvm::Type::getFloatingPointTy(Context, *
Target.HalfFormat),
377 if (
Target.hasBFloat16Type())
378 Check(
"bfloat", llvm::Type::getBFloatTy(Context),
Target.BFloat16Align);
379 Check(
"float", llvm::Type::getFloatingPointTy(Context, *
Target.FloatFormat),
381 Check(
"double", llvm::Type::getFloatingPointTy(Context, *
Target.DoubleFormat),
384 llvm::Type::getFloatingPointTy(Context, *
Target.LongDoubleFormat),
386 if (
Target.hasFloat128Type())
387 Check(
"__float128", llvm::Type::getFP128Ty(Context),
Target.Float128Align);
388 if (
Target.hasIbm128Type())
389 Check(
"__ibm128", llvm::Type::getPPC_FP128Ty(Context),
Target.Ibm128Align);
391 Check(
"void*", llvm::PointerType::getUnqual(Context),
Target.PointerAlign);
402 : Context(
C), LangOpts(
C.
getLangOpts()), FS(FS), HeaderSearchOpts(HSO),
403 PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),
405 VMContext(M.
getContext()), VTables(*this), StackHandler(diags),
411 llvm::LLVMContext &LLVMContext = M.getContext();
412 VoidTy = llvm::Type::getVoidTy(LLVMContext);
413 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
414 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
415 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
416 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
417 HalfTy = llvm::Type::getHalfTy(LLVMContext);
418 BFloatTy = llvm::Type::getBFloatTy(LLVMContext);
419 FloatTy = llvm::Type::getFloatTy(LLVMContext);
420 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
426 C.toCharUnitsFromBits(
C.getTargetInfo().getMaxPointerWidth()).getQuantity();
428 C.toCharUnitsFromBits(
C.getTargetInfo().getIntAlign()).getQuantity();
430 llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getCharWidth());
431 IntTy = llvm::IntegerType::get(LLVMContext,
C.getTargetInfo().getIntWidth());
432 IntPtrTy = llvm::IntegerType::get(LLVMContext,
433 C.getTargetInfo().getMaxPointerWidth());
434 Int8PtrTy = llvm::PointerType::get(LLVMContext,
436 const llvm::DataLayout &DL = M.getDataLayout();
438 llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());
440 llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());
457 createOpenCLRuntime();
459 createOpenMPRuntime();
466 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
467 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
473 if (CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||
474 CodeGenOpts.CoverageNotesFile.size() ||
475 CodeGenOpts.CoverageDataFile.size())
483 Block.GlobalUniqueCount = 0;
485 if (
C.getLangOpts().ObjC)
488 if (CodeGenOpts.hasProfileClangUse()) {
489 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(
490 CodeGenOpts.ProfileInstrumentUsePath, *FS,
491 CodeGenOpts.ProfileRemappingFile);
492 if (
auto E = ReaderOrErr.takeError()) {
493 unsigned DiagID = Diags.getCustomDiagID(
495 llvm::handleAllErrors(std::move(E), [&](
const llvm::ErrorInfoBase &EI) {
497 << CodeGenOpts.ProfileInstrumentUsePath << EI.message();
501 PGOReader = std::move(ReaderOrErr.get());
506 if (CodeGenOpts.CoverageMapping)
510 if (CodeGenOpts.UniqueInternalLinkageNames &&
511 !
getModule().getSourceFileName().empty()) {
512 std::string Path =
getModule().getSourceFileName();
514 for (
const auto &Entry : LangOpts.MacroPrefixMap)
515 if (Path.rfind(Entry.first, 0) != std::string::npos) {
516 Path = Entry.second + Path.substr(Entry.first.size());
519 ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
523 if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
524 getModule().addModuleFlag(llvm::Module::Error,
"NumRegisterParameters",
525 CodeGenOpts.NumRegisterParameters);
534 const llvm::MemoryBuffer &FileBuffer = **BufOrErr;
535 for (llvm::line_iterator I(FileBuffer.getMemBufferRef(),
true), E;
537 this->MSHotPatchFunctions.push_back(std::string{*I});
539 auto &DE = Context.getDiagnostics();
542 "failed to open hotpatch functions file "
543 "(-fms-hotpatch-functions-file): %0 : %1");
545 << BufOrErr.getError().message();
550 this->MSHotPatchFunctions.push_back(FuncName);
552 llvm::sort(this->MSHotPatchFunctions);
555 if (!Context.getAuxTargetInfo())
561void CodeGenModule::createObjCRuntime() {
578 llvm_unreachable(
"bad runtime kind");
581void CodeGenModule::createOpenCLRuntime() {
585void CodeGenModule::createOpenMPRuntime() {
586 if (!LangOpts.OMPHostIRFile.empty() && !FS->exists(LangOpts.OMPHostIRFile))
587 Diags.Report(diag::err_omp_host_ir_file_not_found)
588 << LangOpts.OMPHostIRFile;
593 case llvm::Triple::nvptx:
594 case llvm::Triple::nvptx64:
595 case llvm::Triple::amdgcn:
596 case llvm::Triple::spirv64:
599 "OpenMP AMDGPU/NVPTX/SPIRV is only prepared to deal with device code.");
600 OpenMPRuntime.reset(
new CGOpenMPRuntimeGPU(*
this));
603 if (LangOpts.OpenMPSimd)
604 OpenMPRuntime.reset(
new CGOpenMPSIMDRuntime(*
this));
606 OpenMPRuntime.reset(
new CGOpenMPRuntime(*
this));
611void CodeGenModule::createCUDARuntime() {
615void CodeGenModule::createHLSLRuntime() {
616 HLSLRuntime.reset(
new CGHLSLRuntime(*
this));
620 Replacements[Name] =
C;
623void CodeGenModule::applyReplacements() {
624 for (
auto &I : Replacements) {
625 StringRef MangledName = I.first;
626 llvm::Constant *Replacement = I.second;
631 auto *NewF = dyn_cast<llvm::Function>(Replacement);
633 if (
auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
634 NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
637 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
638 CE->getOpcode() == llvm::Instruction::GetElementPtr);
639 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
644 OldF->replaceAllUsesWith(Replacement);
646 NewF->removeFromParent();
647 OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),
650 OldF->eraseFromParent();
655 GlobalValReplacements.push_back(std::make_pair(GV,
C));
658void CodeGenModule::applyGlobalValReplacements() {
659 for (
auto &I : GlobalValReplacements) {
660 llvm::GlobalValue *GV = I.first;
661 llvm::Constant *
C = I.second;
663 GV->replaceAllUsesWith(
C);
664 GV->eraseFromParent();
671 const llvm::Constant *
C;
672 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(GV))
673 C = GA->getAliasee();
674 else if (
auto *GI = dyn_cast<llvm::GlobalIFunc>(GV))
675 C = GI->getResolver();
679 const auto *AliaseeGV = dyn_cast<llvm::GlobalValue>(
C->stripPointerCasts());
683 const llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();
692 bool IsIFunc,
const llvm::GlobalValue *Alias,
const llvm::GlobalValue *&GV,
693 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,
697 Diags.
Report(Location, diag::err_cyclic_alias) << IsIFunc;
701 if (GV->hasCommonLinkage()) {
702 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
703 if (Triple.getObjectFormat() == llvm::Triple::XCOFF) {
704 Diags.
Report(Location, diag::err_alias_to_common);
709 if (GV->isDeclaration()) {
710 Diags.
Report(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;
711 Diags.
Report(Location, diag::note_alias_requires_mangled_name)
712 << IsIFunc << IsIFunc;
715 for (
const auto &[
Decl, Name] : MangledDeclNames) {
716 if (
const auto *ND = dyn_cast<NamedDecl>(
Decl.getDecl())) {
718 if (II && II->
getName() == GV->getName()) {
719 Diags.
Report(Location, diag::note_alias_mangled_name_alternative)
723 (Twine(IsIFunc ?
"ifunc" :
"alias") +
"(\"" + Name +
"\")")
733 const auto *F = dyn_cast<llvm::Function>(GV);
735 Diags.
Report(Location, diag::err_alias_to_undefined)
736 << IsIFunc << IsIFunc;
740 llvm::FunctionType *FTy = F->getFunctionType();
741 if (!FTy->getReturnType()->isPointerTy()) {
742 Diags.
Report(Location, diag::err_ifunc_resolver_return);
756 if (GVar->hasAttribute(
"toc-data")) {
757 auto GVId = GVar->getName();
760 Diags.
Report(Location, diag::warn_toc_unsupported_type)
761 << GVId <<
"the variable has an alias";
763 llvm::AttributeSet CurrAttributes = GVar->getAttributes();
764 llvm::AttributeSet NewAttributes =
765 CurrAttributes.removeAttribute(GVar->getContext(),
"toc-data");
766 GVar->setAttributes(NewAttributes);
770void CodeGenModule::checkAliases() {
775 DiagnosticsEngine &Diags =
getDiags();
776 for (
const GlobalDecl &GD : Aliases) {
778 SourceLocation Location;
780 bool IsIFunc = D->hasAttr<IFuncAttr>();
781 if (
const Attr *A = D->getDefiningAttr()) {
782 Location = A->getLocation();
783 Range = A->getRange();
785 llvm_unreachable(
"Not an alias or ifunc?");
789 const llvm::GlobalValue *GV =
nullptr;
791 MangledDeclNames, Range)) {
797 if (
const llvm::GlobalVariable *GVar =
798 dyn_cast<const llvm::GlobalVariable>(GV))
802 llvm::Constant *Aliasee =
806 llvm::GlobalValue *AliaseeGV;
807 if (
auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
812 if (
const SectionAttr *SA = D->getAttr<SectionAttr>()) {
813 StringRef AliasSection = SA->getName();
814 if (AliasSection != AliaseeGV->getSection())
815 Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
816 << AliasSection << IsIFunc << IsIFunc;
824 if (
auto *GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
825 if (GA->isInterposable()) {
826 Diags.Report(Location, diag::warn_alias_to_weak_alias)
827 << GV->getName() << GA->getName() << IsIFunc;
828 Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
829 GA->getAliasee(), Alias->getType());
841 llvm::Attribute::DisableSanitizerInstrumentation);
846 for (
const GlobalDecl &GD : Aliases) {
849 Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));
850 Alias->eraseFromParent();
855 DeferredDeclsToEmit.clear();
856 EmittedDeferredDecls.clear();
857 DeferredAnnotations.clear();
859 OpenMPRuntime->clear();
863 StringRef MainFile) {
866 if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
867 if (MainFile.empty())
868 MainFile =
"<stdin>";
869 Diags.
Report(diag::warn_profile_data_unprofiled) << MainFile;
872 Diags.
Report(diag::warn_profile_data_out_of_date) << Visited << Mismatched;
875 Diags.
Report(diag::warn_profile_data_missing) << Visited << Missing;
879static std::optional<llvm::GlobalValue::VisibilityTypes>
886 return llvm::GlobalValue::DefaultVisibility;
888 return llvm::GlobalValue::HiddenVisibility;
890 return llvm::GlobalValue::ProtectedVisibility;
892 llvm_unreachable(
"unknown option value!");
897 std::optional<llvm::GlobalValue::VisibilityTypes>
V) {
906 GV.setDSOLocal(
false);
907 GV.setVisibility(*
V);
912 if (!LO.VisibilityFromDLLStorageClass)
915 std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =
918 std::optional<llvm::GlobalValue::VisibilityTypes>
919 NoDLLStorageClassVisibility =
922 std::optional<llvm::GlobalValue::VisibilityTypes>
923 ExternDeclDLLImportVisibility =
926 std::optional<llvm::GlobalValue::VisibilityTypes>
927 ExternDeclNoDLLStorageClassVisibility =
930 for (llvm::GlobalValue &GV : M.global_values()) {
931 if (GV.hasAppendingLinkage() || GV.hasLocalLinkage())
934 if (GV.isDeclarationForLinker())
936 llvm::GlobalValue::DLLImportStorageClass
937 ? ExternDeclDLLImportVisibility
938 : ExternDeclNoDLLStorageClassVisibility);
941 llvm::GlobalValue::DLLExportStorageClass
942 ? DLLExportVisibility
943 : NoDLLStorageClassVisibility);
945 GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
950 const llvm::Triple &Triple,
954 return LangOpts.getStackProtector() == Mode;
960 EmitModuleInitializers(Primary);
962 DeferredDecls.insert_range(EmittedDeferredDecls);
963 EmittedDeferredDecls.clear();
964 EmitVTablesOpportunistically();
965 applyGlobalValReplacements();
967 emitMultiVersionFunctions();
969 if (Context.getLangOpts().IncrementalExtensions &&
970 GlobalTopLevelStmtBlockInFlight.first) {
972 GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->
getEndLoc());
973 GlobalTopLevelStmtBlockInFlight = {
nullptr,
nullptr};
979 EmitCXXModuleInitFunc(Primary);
981 EmitCXXGlobalInitFunc();
982 EmitCXXGlobalCleanUpFunc();
983 registerGlobalDtorsWithAtExit();
984 EmitCXXThreadLocalInitFunc();
986 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
988 if (Context.getLangOpts().CUDA && CUDARuntime) {
989 if (llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())
993 OpenMPRuntime->createOffloadEntriesAndInfoMetadata();
994 OpenMPRuntime->clear();
998 PGOReader->getSummary(
false).getMD(VMContext),
999 llvm::ProfileSummary::PSK_Instr);
1000 if (PGOStats.hasDiagnostics())
1006 EmitCtorList(GlobalCtors,
"llvm.global_ctors");
1007 EmitCtorList(GlobalDtors,
"llvm.global_dtors");
1009 EmitStaticExternCAliases();
1014 if (CoverageMapping)
1015 CoverageMapping->emit();
1016 if (CodeGenOpts.SanitizeCfiCrossDso) {
1020 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
1022 emitAtAvailableLinkGuard();
1023 if (Context.getTargetInfo().getTriple().isWasm())
1030 if (
getTarget().getTargetOpts().CodeObjectVersion !=
1031 llvm::CodeObjectVersionKind::COV_None) {
1032 getModule().addModuleFlag(llvm::Module::Error,
1033 "amdhsa_code_object_version",
1034 getTarget().getTargetOpts().CodeObjectVersion);
1039 auto *MDStr = llvm::MDString::get(
1044 getModule().addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
1053 if (!Context.CUDAExternalDeviceDeclODRUsedByHost.empty()) {
1055 for (
auto D : Context.CUDAExternalDeviceDeclODRUsedByHost) {
1057 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1061 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
1065 llvm::ArrayType *ATy = llvm::ArrayType::get(
Int8PtrTy, UsedArray.size());
1067 auto *GV =
new llvm::GlobalVariable(
1068 getModule(), ATy,
false, llvm::GlobalValue::InternalLinkage,
1069 llvm::ConstantArray::get(ATy, UsedArray),
"__clang_gpu_used_external");
1075 auto *GV =
new llvm::GlobalVariable(
1077 llvm::Constant::getNullValue(
Int8Ty),
1086 if (CodeGenOpts.Autolink &&
1087 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
1088 EmitModuleLinkOptions();
1103 if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) {
1104 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.dependent-libraries");
1105 for (
auto *MD : ELFDependentLibraries)
1106 NMD->addOperand(MD);
1109 if (CodeGenOpts.DwarfVersion) {
1110 getModule().addModuleFlag(llvm::Module::Max,
"Dwarf Version",
1111 CodeGenOpts.DwarfVersion);
1114 if (CodeGenOpts.Dwarf64)
1115 getModule().addModuleFlag(llvm::Module::Max,
"DWARF64", 1);
1117 if (Context.getLangOpts().SemanticInterposition)
1119 getModule().setSemanticInterposition(
true);
1121 if (CodeGenOpts.EmitCodeView) {
1123 getModule().addModuleFlag(llvm::Module::Warning,
"CodeView", 1);
1125 if (CodeGenOpts.CodeViewGHash) {
1126 getModule().addModuleFlag(llvm::Module::Warning,
"CodeViewGHash", 1);
1128 if (CodeGenOpts.ControlFlowGuard) {
1130 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 2);
1131 }
else if (CodeGenOpts.ControlFlowGuardNoChecks) {
1133 getModule().addModuleFlag(llvm::Module::Warning,
"cfguard", 1);
1135 if (CodeGenOpts.EHContGuard) {
1137 getModule().addModuleFlag(llvm::Module::Warning,
"ehcontguard", 1);
1139 if (Context.getLangOpts().Kernel) {
1141 getModule().addModuleFlag(llvm::Module::Warning,
"ms-kernel", 1);
1143 if (CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {
1148 getModule().addModuleFlag(llvm::Module::Error,
"StrictVTablePointers",1);
1150 llvm::Metadata *Ops[2] = {
1151 llvm::MDString::get(VMContext,
"StrictVTablePointers"),
1152 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1153 llvm::Type::getInt32Ty(VMContext), 1))};
1155 getModule().addModuleFlag(llvm::Module::Require,
1156 "StrictVTablePointersRequirement",
1157 llvm::MDNode::get(VMContext, Ops));
1163 getModule().addModuleFlag(llvm::Module::Warning,
"Debug Info Version",
1164 llvm::DEBUG_METADATA_VERSION);
1169 uint64_t WCharWidth =
1170 Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
1171 getModule().addModuleFlag(llvm::Module::Error,
"wchar_size", WCharWidth);
1174 getModule().addModuleFlag(llvm::Module::Warning,
1175 "zos_product_major_version",
1176 uint32_t(CLANG_VERSION_MAJOR));
1177 getModule().addModuleFlag(llvm::Module::Warning,
1178 "zos_product_minor_version",
1179 uint32_t(CLANG_VERSION_MINOR));
1180 getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_patchlevel",
1181 uint32_t(CLANG_VERSION_PATCHLEVEL));
1183 getModule().addModuleFlag(llvm::Module::Error,
"zos_product_id",
1184 llvm::MDString::get(VMContext, ProductId));
1189 getModule().addModuleFlag(llvm::Module::Error,
"zos_cu_language",
1190 llvm::MDString::get(VMContext, lang_str));
1192 time_t TT = PreprocessorOpts.SourceDateEpoch
1193 ? *PreprocessorOpts.SourceDateEpoch
1194 : std::time(
nullptr);
1195 getModule().addModuleFlag(llvm::Module::Max,
"zos_translation_time",
1196 static_cast<uint64_t
>(TT));
1199 getModule().addModuleFlag(llvm::Module::Error,
"zos_le_char_mode",
1200 llvm::MDString::get(VMContext,
"ascii"));
1203 llvm::Triple
T = Context.getTargetInfo().getTriple();
1204 if (
T.isARM() ||
T.isThumb()) {
1206 uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
1207 getModule().addModuleFlag(llvm::Module::Error,
"min_enum_size", EnumWidth);
1211 StringRef ABIStr = Target.getABI();
1212 llvm::LLVMContext &Ctx = TheModule.getContext();
1213 getModule().addModuleFlag(llvm::Module::Error,
"target-abi",
1214 llvm::MDString::get(Ctx, ABIStr));
1219 const std::vector<std::string> &Features =
1222 llvm::RISCVISAInfo::parseFeatures(
T.isRISCV64() ? 64 : 32, Features);
1223 if (!errorToBool(ParseResult.takeError()))
1225 llvm::Module::AppendUnique,
"riscv-isa",
1227 Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));
1230 if (CodeGenOpts.SanitizeCfiCrossDso) {
1232 getModule().addModuleFlag(llvm::Module::Override,
"Cross-DSO CFI", 1);
1235 if (CodeGenOpts.WholeProgramVTables) {
1239 getModule().addModuleFlag(llvm::Module::Error,
"Virtual Function Elim",
1240 CodeGenOpts.VirtualFunctionElimination);
1243 if (LangOpts.Sanitize.has(SanitizerKind::CFIICall)) {
1244 getModule().addModuleFlag(llvm::Module::Override,
1245 "CFI Canonical Jump Tables",
1246 CodeGenOpts.SanitizeCfiCanonicalJumpTables);
1249 if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1250 getModule().addModuleFlag(llvm::Module::Override,
"cfi-normalize-integers",
1254 if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1256 llvm::Module::Append,
"Unique Source File Identifier",
1258 TheModule.getContext(),
1259 llvm::MDString::get(TheModule.getContext(),
1260 CodeGenOpts.UniqueSourceFileIdentifier)));
1263 if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
1264 getModule().addModuleFlag(llvm::Module::Override,
"kcfi", 1);
1267 if (CodeGenOpts.PatchableFunctionEntryOffset)
1268 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-offset",
1269 CodeGenOpts.PatchableFunctionEntryOffset);
1270 if (CodeGenOpts.SanitizeKcfiArity)
1271 getModule().addModuleFlag(llvm::Module::Override,
"kcfi-arity", 1);
1274 llvm::Module::Override,
"kcfi-hash",
1275 llvm::MDString::get(
1277 llvm::stringifyKCFIHashAlgorithm(CodeGenOpts.SanitizeKcfiHash)));
1280 if (CodeGenOpts.CFProtectionReturn &&
1281 Target.checkCFProtectionReturnSupported(
getDiags())) {
1283 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-return",
1287 if (CodeGenOpts.CFProtectionBranch &&
1288 Target.checkCFProtectionBranchSupported(
getDiags())) {
1290 getModule().addModuleFlag(llvm::Module::Min,
"cf-protection-branch",
1293 auto Scheme = CodeGenOpts.getCFBranchLabelScheme();
1294 if (Target.checkCFBranchLabelSchemeSupported(Scheme,
getDiags())) {
1296 Scheme = Target.getDefaultCFBranchLabelScheme();
1298 llvm::Module::Error,
"cf-branch-label-scheme",
1304 if (CodeGenOpts.FunctionReturnThunks)
1305 getModule().addModuleFlag(llvm::Module::Override,
"function_return_thunk_extern", 1);
1307 if (CodeGenOpts.IndirectBranchCSPrefix)
1308 getModule().addModuleFlag(llvm::Module::Override,
"indirect_branch_cs_prefix", 1);
1319 if (Context.getTargetInfo().hasFeature(
"ptrauth") &&
1320 LangOpts.getSignReturnAddressScope() !=
1322 getModule().addModuleFlag(llvm::Module::Override,
1323 "sign-return-address-buildattr", 1);
1324 if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
1325 getModule().addModuleFlag(llvm::Module::Override,
1326 "tag-stack-memory-buildattr", 1);
1328 if (
T.isARM() ||
T.isThumb() ||
T.isAArch64()) {
1336 if (LangOpts.BranchTargetEnforcement)
1337 getModule().addModuleFlag(llvm::Module::Min,
"branch-target-enforcement",
1339 if (LangOpts.BranchProtectionPAuthLR)
1340 getModule().addModuleFlag(llvm::Module::Min,
"branch-protection-pauth-lr",
1342 if (LangOpts.GuardedControlStack)
1343 getModule().addModuleFlag(llvm::Module::Min,
"guarded-control-stack", 2);
1344 if (LangOpts.hasSignReturnAddress())
1345 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address", 2);
1346 if (LangOpts.isSignReturnAddressScopeAll())
1347 getModule().addModuleFlag(llvm::Module::Min,
"sign-return-address-all",
1349 if (!LangOpts.isSignReturnAddressWithAKey())
1350 getModule().addModuleFlag(llvm::Module::Min,
1351 "sign-return-address-with-bkey", 2);
1353 if (LangOpts.PointerAuthELFGOT)
1354 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-elf-got", 1);
1357 if (LangOpts.PointerAuthCalls)
1358 getModule().addModuleFlag(llvm::Module::Min,
"ptrauth-sign-personality",
1361 using namespace llvm::ELF;
1362 uint64_t PAuthABIVersion =
1363 (LangOpts.PointerAuthIntrinsics
1364 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1365 (LangOpts.PointerAuthCalls
1366 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1367 (LangOpts.PointerAuthReturns
1368 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1369 (LangOpts.PointerAuthAuthTraps
1370 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1371 (LangOpts.PointerAuthVTPtrAddressDiscrimination
1372 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1373 (LangOpts.PointerAuthVTPtrTypeDiscrimination
1374 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1375 (LangOpts.PointerAuthInitFini
1376 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1377 (LangOpts.PointerAuthInitFiniAddressDiscrimination
1378 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1379 (LangOpts.PointerAuthELFGOT
1380 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |
1381 (LangOpts.PointerAuthIndirectGotos
1382 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |
1383 (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination
1384 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |
1385 (LangOpts.PointerAuthFunctionTypeDiscrimination
1386 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);
1387 static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
1388 AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1389 "Update when new enum items are defined");
1390 if (PAuthABIVersion != 0) {
1391 getModule().addModuleFlag(llvm::Module::Error,
1392 "aarch64-elf-pauthabi-platform",
1393 AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1394 getModule().addModuleFlag(llvm::Module::Error,
1395 "aarch64-elf-pauthabi-version",
1401 if (CodeGenOpts.StackClashProtector)
1403 llvm::Module::Override,
"probe-stack",
1404 llvm::MDString::get(TheModule.getContext(),
"inline-asm"));
1406 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
1407 getModule().addModuleFlag(llvm::Module::Min,
"stack-probe-size",
1408 CodeGenOpts.StackProbeSize);
1410 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1411 llvm::LLVMContext &Ctx = TheModule.getContext();
1413 llvm::Module::Error,
"MemProfProfileFilename",
1414 llvm::MDString::get(Ctx, CodeGenOpts.MemoryProfileOutput));
1417 if (LangOpts.CUDAIsDevice &&
getTriple().isNVPTX()) {
1421 getModule().addModuleFlag(llvm::Module::Override,
"nvvm-reflect-ftz",
1422 CodeGenOpts.FP32DenormalMode.Output !=
1423 llvm::DenormalMode::IEEE);
1426 if (LangOpts.EHAsynch)
1427 getModule().addModuleFlag(llvm::Module::Warning,
"eh-asynch", 1);
1430 if (CodeGenOpts.ImportCallOptimization)
1431 getModule().addModuleFlag(llvm::Module::Warning,
"import-call-optimization",
1435 if (CodeGenOpts.getWinX64EHUnwindV2() != llvm::WinX64EHUnwindV2Mode::Disabled)
1437 llvm::Module::Warning,
"winx64-eh-unwindv2",
1438 static_cast<unsigned>(CodeGenOpts.getWinX64EHUnwindV2()));
1442 getModule().addModuleFlag(llvm::Module::Max,
"openmp", LangOpts.OpenMP);
1444 getModule().addModuleFlag(llvm::Module::Max,
"openmp-device",
1448 if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())) {
1449 EmitOpenCLMetadata();
1456 auto Version = LangOpts.getOpenCLCompatibleVersion();
1457 llvm::Metadata *SPIRVerElts[] = {
1458 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1460 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
1461 Int32Ty, (Version / 100 > 1) ? 0 : 2))};
1462 llvm::NamedMDNode *SPIRVerMD =
1463 TheModule.getOrInsertNamedMetadata(
"opencl.spir.version");
1464 llvm::LLVMContext &Ctx = TheModule.getContext();
1465 SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
1473 if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
1474 assert(PLevel < 3 &&
"Invalid PIC Level");
1475 getModule().setPICLevel(
static_cast<llvm::PICLevel::Level
>(PLevel));
1476 if (Context.getLangOpts().PIE)
1477 getModule().setPIELevel(
static_cast<llvm::PIELevel::Level
>(PLevel));
1481 unsigned CM = llvm::StringSwitch<unsigned>(
getCodeGenOpts().CodeModel)
1482 .Case(
"tiny", llvm::CodeModel::Tiny)
1483 .Case(
"small", llvm::CodeModel::Small)
1484 .Case(
"kernel", llvm::CodeModel::Kernel)
1485 .Case(
"medium", llvm::CodeModel::Medium)
1486 .Case(
"large", llvm::CodeModel::Large)
1489 llvm::CodeModel::Model codeModel =
static_cast<llvm::CodeModel::Model
>(CM);
1492 if ((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&
1493 Context.getTargetInfo().getTriple().getArch() ==
1494 llvm::Triple::x86_64) {
1500 if (CodeGenOpts.NoPLT)
1503 CodeGenOpts.DirectAccessExternalData !=
1504 getModule().getDirectAccessExternalData()) {
1505 getModule().setDirectAccessExternalData(
1506 CodeGenOpts.DirectAccessExternalData);
1508 if (CodeGenOpts.UnwindTables)
1509 getModule().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));
1511 switch (CodeGenOpts.getFramePointer()) {
1516 getModule().setFramePointer(llvm::FramePointerKind::Reserved);
1519 getModule().setFramePointer(llvm::FramePointerKind::NonLeafNoReserve);
1522 getModule().setFramePointer(llvm::FramePointerKind::NonLeaf);
1525 getModule().setFramePointer(llvm::FramePointerKind::All);
1529 SimplifyPersonality();
1542 EmitVersionIdentMetadata();
1545 EmitCommandLineMetadata();
1553 getModule().setStackProtectorGuardSymbol(
1556 getModule().setStackProtectorGuardOffset(
1561 getModule().addModuleFlag(llvm::Module::Override,
"SkipRaxSetup", 1);
1563 getModule().addModuleFlag(llvm::Module::Override,
"RegCallv4", 1);
1565 if (
getContext().getTargetInfo().getMaxTLSAlign())
1566 getModule().addModuleFlag(llvm::Module::Error,
"MaxTLSAlign",
1567 getContext().getTargetInfo().getMaxTLSAlign());
1585 if (
getTriple().isPPC() && !MustTailCallUndefinedGlobals.empty()) {
1586 for (
auto &I : MustTailCallUndefinedGlobals) {
1587 if (!I.first->isDefined())
1588 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1592 if (!Entry || Entry->isWeakForLinker() ||
1593 Entry->isDeclarationForLinker())
1594 getDiags().
Report(I.second, diag::err_ppc_impossible_musttail) << 2;
1605 auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(
ErrnoTBAAMDName);
1606 ErrnoTBAAMD->addOperand(IntegerNode);
1611void CodeGenModule::EmitOpenCLMetadata() {
1617 auto EmitVersion = [
this](StringRef MDName,
int Version) {
1618 llvm::Metadata *OCLVerElts[] = {
1619 llvm::ConstantAsMetadata::get(
1620 llvm::ConstantInt::get(
Int32Ty, Version / 100)),
1621 llvm::ConstantAsMetadata::get(
1622 llvm::ConstantInt::get(
Int32Ty, (Version % 100) / 10))};
1623 llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);
1624 llvm::LLVMContext &Ctx = TheModule.getContext();
1625 OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
1628 EmitVersion(
"opencl.ocl.version", CLVersion);
1629 if (LangOpts.OpenCLCPlusPlus) {
1631 EmitVersion(
"opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion);
1635void CodeGenModule::EmitBackendOptionsMetadata(
1636 const CodeGenOptions &CodeGenOpts) {
1638 getModule().addModuleFlag(llvm::Module::Min,
"SmallDataLimit",
1639 CodeGenOpts.SmallDataLimit);
1643 if (LangOpts.AllocTokenMode) {
1644 StringRef S = llvm::getAllocTokenModeAsString(*LangOpts.AllocTokenMode);
1645 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-mode",
1646 llvm::MDString::get(VMContext, S));
1648 if (LangOpts.AllocTokenMax)
1650 llvm::Module::Error,
"alloc-token-max",
1651 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1652 *LangOpts.AllocTokenMax));
1653 if (CodeGenOpts.SanitizeAllocTokenFastABI)
1654 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-fast-abi", 1);
1655 if (CodeGenOpts.SanitizeAllocTokenExtended)
1656 getModule().addModuleFlag(llvm::Module::Error,
"alloc-token-extended", 1);
1672 return TBAA->getTypeInfo(QTy);
1691 return TBAA->getAccessInfo(AccessType);
1698 return TBAA->getVTablePtrAccessInfo(VTablePtrType);
1704 return TBAA->getTBAAStructInfo(QTy);
1710 return TBAA->getBaseTypeInfo(QTy);
1716 return TBAA->getAccessTagInfo(Info);
1723 return TBAA->mergeTBAAInfoForCast(SourceInfo,
TargetInfo);
1731 return TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);
1739 return TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);
1745 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);
1750 I->setMetadata(llvm::LLVMContext::MD_invariant_group,
1763 "cannot compile this %0 yet");
1764 std::string Msg =
Type;
1773 "cannot compile this %0 yet");
1774 std::string Msg =
Type;
1779 llvm::function_ref<
void()> Fn) {
1780 StackHandler.runWithSufficientStackSpace(Loc, Fn);
1790 if (GV->hasLocalLinkage()) {
1791 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1804 if (Context.getLangOpts().OpenMP &&
1805 Context.getLangOpts().OpenMPIsTargetDevice &&
isa<VarDecl>(D) &&
1806 D->
hasAttr<OMPDeclareTargetDeclAttr>() &&
1807 D->
getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
1808 OMPDeclareTargetDeclAttr::DT_NoHost &&
1810 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1815 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
1819 if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
1823 if (GV->hasDLLExportStorageClass()) {
1826 diag::err_hidden_visibility_dllexport);
1829 diag::err_non_default_visibility_dllimport);
1835 !GV->isDeclarationForLinker())
1840 llvm::GlobalValue *GV) {
1841 if (GV->hasLocalLinkage())
1844 if (!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())
1848 if (GV->hasDLLImportStorageClass())
1851 const llvm::Triple &TT = CGM.
getTriple();
1853 if (TT.isOSCygMing()) {
1871 if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
1879 if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
1883 if (!TT.isOSBinFormatELF())
1889 if (RM != llvm::Reloc::Static && !LOpts.PIE) {
1897 return !(CGM.
getLangOpts().SemanticInterposition ||
1902 if (!GV->isDeclarationForLinker())
1908 if (RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())
1915 if (CGOpts.DirectAccessExternalData) {
1921 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(GV))
1922 if (!Var->isThreadLocal())
1947 const auto *D = dyn_cast<NamedDecl>(GD.
getDecl());
1949 if (
const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) {
1959 if (D->
hasAttr<DLLImportAttr>())
1960 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
1961 else if ((D->
hasAttr<DLLExportAttr>() ||
1963 !GV->isDeclarationForLinker())
1964 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
1984 GV->setPartition(CodeGenOpts.SymbolPartition);
1988 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
1989 .Case(
"global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
1990 .Case(
"local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
1991 .Case(
"initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
1992 .Case(
"local-exec", llvm::GlobalVariable::LocalExecTLSModel);
1995llvm::GlobalVariable::ThreadLocalMode
1997 switch (CodeGenOpts.getDefaultTLSModel()) {
1999 return llvm::GlobalVariable::GeneralDynamicTLSModel;
2001 return llvm::GlobalVariable::LocalDynamicTLSModel;
2003 return llvm::GlobalVariable::InitialExecTLSModel;
2005 return llvm::GlobalVariable::LocalExecTLSModel;
2007 llvm_unreachable(
"Invalid TLS model!");
2011 assert(D.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2013 llvm::GlobalValue::ThreadLocalMode TLM;
2017 if (
const TLSModelAttr *
Attr = D.
getAttr<TLSModelAttr>()) {
2021 GV->setThreadLocalMode(TLM);
2027 return (Twine(
'.') + Twine(
Target.CPUSpecificManglingCharacter(Name))).str();
2031 const CPUSpecificAttr *
Attr,
2053 bool OmitMultiVersionMangling =
false) {
2055 llvm::raw_svector_ostream Out(Buffer);
2064 assert(II &&
"Attempt to mangle unnamed decl.");
2065 const auto *FD = dyn_cast<FunctionDecl>(ND);
2070 Out <<
"__regcall4__" << II->
getName();
2072 Out <<
"__regcall3__" << II->
getName();
2073 }
else if (FD && FD->hasAttr<CUDAGlobalAttr>() &&
2075 Out <<
"__device_stub__" << II->
getName();
2077 DeviceKernelAttr::isOpenCLSpelling(
2078 FD->getAttr<DeviceKernelAttr>()) &&
2080 Out <<
"__clang_ocl_kern_imp_" << II->
getName();
2096 "Hash computed when not explicitly requested");
2100 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2101 if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
2102 switch (FD->getMultiVersionKind()) {
2106 FD->getAttr<CPUSpecificAttr>(),
2110 auto *
Attr = FD->getAttr<TargetAttr>();
2111 assert(
Attr &&
"Expected TargetAttr to be present "
2112 "for attribute mangling");
2118 auto *
Attr = FD->getAttr<TargetVersionAttr>();
2119 assert(
Attr &&
"Expected TargetVersionAttr to be present "
2120 "for attribute mangling");
2126 auto *
Attr = FD->getAttr<TargetClonesAttr>();
2127 assert(
Attr &&
"Expected TargetClonesAttr to be present "
2128 "for attribute mangling");
2135 llvm_unreachable(
"None multiversion type isn't valid here");
2145 return std::string(Out.str());
2148void CodeGenModule::UpdateMultiVersionNames(GlobalDecl GD,
2149 const FunctionDecl *FD,
2150 StringRef &CurName) {
2157 std::string NonTargetName =
2165 "Other GD should now be a multiversioned function");
2175 if (OtherName != NonTargetName) {
2178 const auto ExistingRecord = Manglings.find(NonTargetName);
2179 if (ExistingRecord != std::end(Manglings))
2180 Manglings.remove(&(*ExistingRecord));
2181 auto Result = Manglings.insert(std::make_pair(OtherName, OtherGD));
2186 CurName = OtherNameRef;
2188 Entry->setName(OtherName);
2198 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.
getDecl())) {
2212 auto FoundName = MangledDeclNames.find(CanonicalGD);
2213 if (FoundName != MangledDeclNames.end())
2214 return FoundName->second;
2251 auto Result = Manglings.insert(std::make_pair(MangledName, GD));
2252 return MangledDeclNames[CanonicalGD] =
Result.first->first();
2261 llvm::raw_svector_ostream Out(Buffer);
2264 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
2265 else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D))
2267 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D))
2272 auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
2273 return Result.first->first();
2277 auto it = MangledDeclNames.begin();
2278 while (it != MangledDeclNames.end()) {
2279 if (it->second == Name)
2294 llvm::Constant *AssociatedData) {
2296 GlobalCtors.push_back(
Structor(Priority, LexOrder, Ctor, AssociatedData));
2302 bool IsDtorAttrFunc) {
2303 if (CodeGenOpts.RegisterGlobalDtorsWithAtExit &&
2305 DtorsUsingAtExit[Priority].push_back(Dtor);
2310 GlobalDtors.push_back(
Structor(Priority, ~0
U, Dtor,
nullptr));
2313void CodeGenModule::EmitCtorList(CtorList &Fns,
const char *GlobalName) {
2314 if (Fns.empty())
return;
2320 llvm::PointerType *PtrTy = llvm::PointerType::get(
2321 getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2324 llvm::StructType *CtorStructTy = llvm::StructType::get(
Int32Ty, PtrTy, PtrTy);
2328 auto Ctors = Builder.beginArray(CtorStructTy);
2329 for (
const auto &I : Fns) {
2330 auto Ctor = Ctors.beginStruct(CtorStructTy);
2331 Ctor.addInt(
Int32Ty, I.Priority);
2332 if (InitFiniAuthSchema) {
2333 llvm::Constant *StorageAddress =
2335 ? llvm::ConstantExpr::getIntToPtr(
2336 llvm::ConstantInt::get(
2338 llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2342 I.Initializer, InitFiniAuthSchema.
getKey(), StorageAddress,
2343 llvm::ConstantInt::get(
2345 Ctor.add(SignedCtorPtr);
2347 Ctor.add(I.Initializer);
2349 if (I.AssociatedData)
2350 Ctor.add(I.AssociatedData);
2352 Ctor.addNullPointer(PtrTy);
2353 Ctor.finishAndAddTo(Ctors);
2356 auto List = Ctors.finishAndCreateGlobal(GlobalName,
getPointerAlign(),
2358 llvm::GlobalValue::AppendingLinkage);
2362 List->setAlignment(std::nullopt);
2367llvm::GlobalValue::LinkageTypes
2373 if (
const auto *Dtor = dyn_cast<CXXDestructorDecl>(D))
2380 llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);
2381 if (!MDS)
return nullptr;
2383 return llvm::ConstantInt::get(
Int64Ty, llvm::MD5Hash(MDS->getString()));
2390 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2391 if (!UD->
hasAttr<TransparentUnionAttr>())
2393 if (!UD->
fields().empty())
2394 return UD->
fields().begin()->getType();
2403 bool GeneralizePointers) {
2416 bool GeneralizePointers) {
2419 for (
auto &Param : FnType->param_types())
2420 GeneralizedParams.push_back(
2424 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers),
2425 GeneralizedParams, FnType->getExtProtoInfo());
2430 GeneralizeType(Ctx, FnType->getReturnType(), GeneralizePointers));
2432 llvm_unreachable(
"Encountered unknown FunctionType");
2440 FnType->getReturnType(), FnType->getParamTypes(),
2441 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
2443 std::string OutName;
2444 llvm::raw_string_ostream Out(OutName);
2452 Out <<
".normalized";
2454 Out <<
".generalized";
2456 return llvm::ConstantInt::get(
2462 llvm::Function *F,
bool IsThunk) {
2464 llvm::AttributeList PAL;
2467 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
2471 Loc = D->getLocation();
2473 Error(Loc,
"__vectorcall calling convention is not currently supported");
2475 F->setAttributes(PAL);
2476 F->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
2480 std::string ReadOnlyQual(
"__read_only");
2481 std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
2482 if (ReadOnlyPos != std::string::npos)
2484 TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);
2486 std::string WriteOnlyQual(
"__write_only");
2487 std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);
2488 if (WriteOnlyPos != std::string::npos)
2489 TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);
2491 std::string ReadWriteQual(
"__read_write");
2492 std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);
2493 if (ReadWritePos != std::string::npos)
2494 TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);
2527 assert(((FD && CGF) || (!FD && !CGF)) &&
2528 "Incorrect use - FD and CGF should either be both null or not!");
2554 for (
unsigned i = 0, e = FD->
getNumParams(); i != e; ++i) {
2557 argNames.push_back(llvm::MDString::get(VMContext, parm->
getName()));
2562 std::string typeQuals;
2566 const Decl *PDecl = parm;
2568 PDecl = TD->getDecl();
2569 const OpenCLAccessAttr *A = PDecl->
getAttr<OpenCLAccessAttr>();
2570 if (A && A->isWriteOnly())
2571 accessQuals.push_back(llvm::MDString::get(VMContext,
"write_only"));
2572 else if (A && A->isReadWrite())
2573 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_write"));
2575 accessQuals.push_back(llvm::MDString::get(VMContext,
"read_only"));
2577 accessQuals.push_back(llvm::MDString::get(VMContext,
"none"));
2579 auto getTypeSpelling = [&](
QualType Ty) {
2580 auto typeName = Ty.getUnqualifiedType().getAsString(Policy);
2582 if (Ty.isCanonical()) {
2583 StringRef typeNameRef = typeName;
2585 if (typeNameRef.consume_front(
"unsigned "))
2586 return std::string(
"u") + typeNameRef.str();
2587 if (typeNameRef.consume_front(
"signed "))
2588 return typeNameRef.str();
2598 addressQuals.push_back(
2599 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(
2603 std::string typeName = getTypeSpelling(pointeeTy) +
"*";
2604 std::string baseTypeName =
2606 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2607 argBaseTypeNames.push_back(
2608 llvm::MDString::get(VMContext, baseTypeName));
2612 typeQuals =
"restrict";
2615 typeQuals += typeQuals.empty() ?
"const" :
" const";
2617 typeQuals += typeQuals.empty() ?
"volatile" :
" volatile";
2619 uint32_t AddrSpc = 0;
2624 addressQuals.push_back(
2625 llvm::ConstantAsMetadata::get(CGF->
Builder.getInt32(AddrSpc)));
2629 std::string typeName = getTypeSpelling(ty);
2641 argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));
2642 argBaseTypeNames.push_back(
2643 llvm::MDString::get(VMContext, baseTypeName));
2648 argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));
2652 Fn->setMetadata(
"kernel_arg_addr_space",
2653 llvm::MDNode::get(VMContext, addressQuals));
2654 Fn->setMetadata(
"kernel_arg_access_qual",
2655 llvm::MDNode::get(VMContext, accessQuals));
2656 Fn->setMetadata(
"kernel_arg_type",
2657 llvm::MDNode::get(VMContext, argTypeNames));
2658 Fn->setMetadata(
"kernel_arg_base_type",
2659 llvm::MDNode::get(VMContext, argBaseTypeNames));
2660 Fn->setMetadata(
"kernel_arg_type_qual",
2661 llvm::MDNode::get(VMContext, argTypeQuals));
2665 Fn->setMetadata(
"kernel_arg_name",
2666 llvm::MDNode::get(VMContext, argNames));
2676 if (!LangOpts.Exceptions)
return false;
2679 if (LangOpts.CXXExceptions)
return true;
2682 if (LangOpts.ObjCExceptions) {
2702SmallVector<const CXXRecordDecl *, 0>
2704 llvm::SetVector<const CXXRecordDecl *> MostBases;
2709 MostBases.insert(RD);
2711 CollectMostBases(B.getType()->getAsCXXRecordDecl());
2713 CollectMostBases(RD);
2714 return MostBases.takeVector();
2718 llvm::Function *F) {
2719 llvm::AttrBuilder B(F->getContext());
2721 if ((!D || !D->
hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)
2722 B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));
2724 if (CodeGenOpts.StackClashProtector)
2725 B.addAttribute(
"probe-stack",
"inline-asm");
2727 if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)
2728 B.addAttribute(
"stack-probe-size",
2729 std::to_string(CodeGenOpts.StackProbeSize));
2732 B.addAttribute(llvm::Attribute::NoUnwind);
2734 if (D && D->
hasAttr<NoStackProtectorAttr>())
2736 else if (D && D->
hasAttr<StrictGuardStackCheckAttr>() &&
2738 B.addAttribute(llvm::Attribute::StackProtectStrong);
2740 B.addAttribute(llvm::Attribute::StackProtect);
2742 B.addAttribute(llvm::Attribute::StackProtectStrong);
2744 B.addAttribute(llvm::Attribute::StackProtectReq);
2748 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline))
2749 B.addAttribute(llvm::Attribute::AlwaysInline);
2753 else if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
2755 B.addAttribute(llvm::Attribute::NoInline);
2763 if (D->
hasAttr<ArmLocallyStreamingAttr>())
2764 B.addAttribute(
"aarch64_pstate_sm_body");
2767 if (
Attr->isNewZA())
2768 B.addAttribute(
"aarch64_new_za");
2769 if (
Attr->isNewZT0())
2770 B.addAttribute(
"aarch64_new_zt0");
2775 bool ShouldAddOptNone =
2776 !CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;
2778 ShouldAddOptNone &= !D->
hasAttr<MinSizeAttr>();
2779 ShouldAddOptNone &= !D->
hasAttr<AlwaysInlineAttr>();
2782 if (
getLangOpts().
HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&
2783 !D->
hasAttr<NoInlineAttr>()) {
2784 B.addAttribute(llvm::Attribute::AlwaysInline);
2785 }
else if ((ShouldAddOptNone || D->
hasAttr<OptimizeNoneAttr>()) &&
2786 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2788 B.addAttribute(llvm::Attribute::OptimizeNone);
2791 B.addAttribute(llvm::Attribute::NoInline);
2796 B.addAttribute(llvm::Attribute::Naked);
2799 F->removeFnAttr(llvm::Attribute::OptimizeForSize);
2800 F->removeFnAttr(llvm::Attribute::MinSize);
2801 }
else if (D->
hasAttr<NakedAttr>()) {
2803 B.addAttribute(llvm::Attribute::Naked);
2804 B.addAttribute(llvm::Attribute::NoInline);
2805 }
else if (D->
hasAttr<NoDuplicateAttr>()) {
2806 B.addAttribute(llvm::Attribute::NoDuplicate);
2807 }
else if (D->
hasAttr<NoInlineAttr>() &&
2808 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2810 B.addAttribute(llvm::Attribute::NoInline);
2811 }
else if (D->
hasAttr<AlwaysInlineAttr>() &&
2812 !F->hasFnAttribute(llvm::Attribute::NoInline)) {
2814 B.addAttribute(llvm::Attribute::AlwaysInline);
2818 if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline))
2819 B.addAttribute(llvm::Attribute::NoInline);
2823 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2826 auto CheckRedeclForInline = [](
const FunctionDecl *Redecl) {
2827 return Redecl->isInlineSpecified();
2829 if (any_of(FD->
redecls(), CheckRedeclForInline))
2834 return any_of(Pattern->
redecls(), CheckRedeclForInline);
2836 if (CheckForInline(FD)) {
2837 B.addAttribute(llvm::Attribute::InlineHint);
2838 }
else if (CodeGenOpts.getInlining() ==
2841 !F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {
2842 B.addAttribute(llvm::Attribute::NoInline);
2849 if (!D->
hasAttr<OptimizeNoneAttr>()) {
2851 if (!ShouldAddOptNone)
2852 B.addAttribute(llvm::Attribute::OptimizeForSize);
2853 B.addAttribute(llvm::Attribute::Cold);
2856 B.addAttribute(llvm::Attribute::Hot);
2857 if (D->
hasAttr<MinSizeAttr>())
2858 B.addAttribute(llvm::Attribute::MinSize);
2865 F->setAlignment(llvm::Align(alignment));
2867 if (!D->
hasAttr<AlignedAttr>())
2868 if (LangOpts.FunctionAlignment)
2869 F->setAlignment(llvm::Align(1ull << LangOpts.FunctionAlignment));
2877 F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));
2882 if (CodeGenOpts.SanitizeCfiCrossDso &&
2883 CodeGenOpts.SanitizeCfiCanonicalJumpTables) {
2884 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2892 if (CodeGenOpts.CallGraphSection) {
2893 if (
auto *FD = dyn_cast<FunctionDecl>(D))
2900 auto *MD = dyn_cast<CXXMethodDecl>(D);
2903 llvm::Metadata *Id =
2905 MD->getType(), std::nullopt,
Base));
2906 F->addTypeMetadata(0, Id);
2913 if (isa_and_nonnull<NamedDecl>(D))
2916 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
2918 if (D && D->
hasAttr<UsedAttr>())
2921 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D);
2923 ((CodeGenOpts.KeepPersistentStorageVariables &&
2924 (VD->getStorageDuration() ==
SD_Static ||
2925 VD->getStorageDuration() ==
SD_Thread)) ||
2926 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
2927 VD->getType().isConstQualified())))
2931bool CodeGenModule::GetCPUAndFeaturesAttributes(
GlobalDecl GD,
2932 llvm::AttrBuilder &Attrs,
2933 bool SetTargetFeatures) {
2939 std::vector<std::string> Features;
2940 const auto *FD = dyn_cast_or_null<FunctionDecl>(GD.
getDecl());
2943 const auto *TV = FD ? FD->
getAttr<TargetVersionAttr>() :
nullptr;
2944 assert((!TD || !TV) &&
"both target_version and target specified");
2947 bool AddedAttr =
false;
2948 if (TD || TV || SD || TC) {
2949 llvm::StringMap<bool> FeatureMap;
2953 for (
const llvm::StringMap<bool>::value_type &Entry : FeatureMap)
2954 Features.push_back((Entry.getValue() ?
"+" :
"-") + Entry.getKey().str());
2962 Target.parseTargetAttr(TD->getFeaturesStr());
2984 if (!TargetCPU.empty()) {
2985 Attrs.addAttribute(
"target-cpu", TargetCPU);
2988 if (!TuneCPU.empty()) {
2989 Attrs.addAttribute(
"tune-cpu", TuneCPU);
2992 if (!Features.empty() && SetTargetFeatures) {
2993 llvm::erase_if(Features, [&](
const std::string& F) {
2996 llvm::sort(Features);
2997 Attrs.addAttribute(
"target-features", llvm::join(Features,
","));
3002 llvm::SmallVector<StringRef, 8> Feats;
3003 bool IsDefault =
false;
3005 IsDefault = TV->isDefaultVersion();
3006 TV->getFeatures(Feats);
3012 Attrs.addAttribute(
"fmv-features");
3014 }
else if (!Feats.empty()) {
3016 std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());
3017 std::string FMVFeatures;
3018 for (StringRef F : OrderedFeats)
3019 FMVFeatures.append(
"," + F.str());
3020 Attrs.addAttribute(
"fmv-features", FMVFeatures.substr(1));
3027void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
3028 llvm::GlobalObject *GO) {
3033 if (
auto *GV = dyn_cast<llvm::GlobalVariable>(GO)) {
3036 if (
auto *SA = D->
getAttr<PragmaClangBSSSectionAttr>())
3037 GV->addAttribute(
"bss-section", SA->getName());
3038 if (
auto *SA = D->
getAttr<PragmaClangDataSectionAttr>())
3039 GV->addAttribute(
"data-section", SA->getName());
3040 if (
auto *SA = D->
getAttr<PragmaClangRodataSectionAttr>())
3041 GV->addAttribute(
"rodata-section", SA->getName());
3042 if (
auto *SA = D->
getAttr<PragmaClangRelroSectionAttr>())
3043 GV->addAttribute(
"relro-section", SA->getName());
3046 if (
auto *F = dyn_cast<llvm::Function>(GO)) {
3049 if (
auto *SA = D->
getAttr<PragmaClangTextSectionAttr>())
3050 if (!D->
getAttr<SectionAttr>())
3051 F->setSection(SA->getName());
3053 llvm::AttrBuilder Attrs(F->getContext());
3054 if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
3058 llvm::AttributeMask RemoveAttrs;
3059 RemoveAttrs.addAttribute(
"target-cpu");
3060 RemoveAttrs.addAttribute(
"target-features");
3061 RemoveAttrs.addAttribute(
"fmv-features");
3062 RemoveAttrs.addAttribute(
"tune-cpu");
3063 F->removeFnAttrs(RemoveAttrs);
3064 F->addFnAttrs(Attrs);
3068 if (
const auto *CSA = D->
getAttr<CodeSegAttr>())
3069 GO->setSection(CSA->getName());
3070 else if (
const auto *SA = D->
getAttr<SectionAttr>())
3071 GO->setSection(SA->getName());
3084 F->setLinkage(llvm::Function::InternalLinkage);
3086 setNonAliasAttributes(GD, F);
3097 GV->
setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
3101 llvm::MDNode *MD = F->getMetadata(llvm::LLVMContext::MD_type);
3102 return MD && MD->hasGeneralizedMDString();
3106 llvm::Function *F) {
3113 if (!F->hasLocalLinkage() ||
3114 F->getFunction().hasAddressTaken(
nullptr,
true,
3121 llvm::Function *F) {
3123 if (!LangOpts.Sanitize.has(SanitizerKind::CFIICall))
3134 F->addTypeMetadata(0, MD);
3143 if (CodeGenOpts.SanitizeCfiCrossDso)
3145 F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
3149 llvm::CallBase *CB) {
3151 if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall())
3155 llvm::MDTuple *TypeTuple = llvm::MDTuple::get(
3156 getLLVMContext(), {llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
3159 llvm::MDTuple *MDN = llvm::MDNode::get(
getLLVMContext(), {TypeTuple});
3160 CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
3164 llvm::LLVMContext &Ctx = F->getContext();
3165 llvm::MDBuilder MDB(Ctx);
3166 llvm::StringRef Salt;
3169 if (
const auto &Info = FP->getExtraAttributeInfo())
3170 Salt = Info.CFISalt;
3172 F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
3181 return llvm::all_of(Name, [](
const char &
C) {
3182 return llvm::isAlnum(
C) ||
C ==
'_' ||
C ==
'.';
3188 for (
auto &F : M.functions()) {
3190 bool AddressTaken = F.hasAddressTaken();
3191 if (!AddressTaken && F.hasLocalLinkage())
3192 F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
3197 if (!AddressTaken || !F.isDeclaration())
3200 const llvm::ConstantInt *
Type;
3201 if (
const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
3202 Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
3206 StringRef Name = F.getName();
3210 std::string
Asm = (
".weak __kcfi_typeid_" + Name +
"\n.set __kcfi_typeid_" +
3211 Name +
", " + Twine(
Type->getZExtValue()) +
" /* " +
3212 Twine(
Type->getSExtValue()) +
" */\n")
3214 M.appendModuleInlineAsm(
Asm);
3218void CodeGenModule::SetFunctionAttributes(
GlobalDecl GD, llvm::Function *F,
3219 bool IsIncompleteFunction,
3222 if (F->getIntrinsicID() != llvm::Intrinsic::not_intrinsic) {
3230 if (!IsIncompleteFunction)
3237 if (!IsThunk &&
getCXXABI().HasThisReturn(GD) &&
3239 assert(!F->arg_empty() &&
3240 F->arg_begin()->getType()
3241 ->canLosslesslyBitCastTo(F->getReturnType()) &&
3242 "unexpected this return");
3243 F->addParamAttr(0, llvm::Attribute::Returned);
3253 if (!IsIncompleteFunction && F->isDeclaration())
3256 if (
const auto *CSA = FD->
getAttr<CodeSegAttr>())
3257 F->setSection(CSA->getName());
3258 else if (
const auto *SA = FD->
getAttr<SectionAttr>())
3259 F->setSection(SA->getName());
3261 if (
const auto *EA = FD->
getAttr<ErrorAttr>()) {
3263 F->addFnAttr(
"dontcall-error", EA->getUserDiagnostic());
3264 else if (EA->isWarning())
3265 F->addFnAttr(
"dontcall-warn", EA->getUserDiagnostic());
3270 const FunctionDecl *FDBody;
3271 bool HasBody = FD->
hasBody(FDBody);
3273 assert(HasBody &&
"Inline builtin declarations should always have an "
3275 if (shouldEmitFunction(FDBody))
3276 F->addFnAttr(llvm::Attribute::NoBuiltin);
3282 F->addFnAttr(llvm::Attribute::NoBuiltin);
3286 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3287 else if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
3288 if (MD->isVirtual())
3289 F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3295 if (!CodeGenOpts.SanitizeCfiCrossDso ||
3296 !CodeGenOpts.SanitizeCfiCanonicalJumpTables)
3299 if (CodeGenOpts.CallGraphSection)
3302 if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
3308 if (CodeGenOpts.InlineMaxStackSize !=
UINT_MAX)
3309 F->addFnAttr(
"inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
3311 if (
const auto *CB = FD->
getAttr<CallbackAttr>()) {
3315 llvm::LLVMContext &Ctx = F->getContext();
3316 llvm::MDBuilder MDB(Ctx);
3320 int CalleeIdx = *CB->encoding_begin();
3321 ArrayRef<int> PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());
3322 F->addMetadata(llvm::LLVMContext::MD_callback,
3323 *llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(
3324 CalleeIdx, PayloadIndices,
3331 "Only globals with definition can force usage.");
3332 LLVMUsed.emplace_back(GV);
3336 assert(!GV->isDeclaration() &&
3337 "Only globals with definition can force usage.");
3338 LLVMCompilerUsed.emplace_back(GV);
3343 "Only globals with definition can force usage.");
3345 LLVMCompilerUsed.emplace_back(GV);
3347 LLVMUsed.emplace_back(GV);
3351 std::vector<llvm::WeakTrackingVH> &List) {
3358 UsedArray.resize(List.size());
3359 for (
unsigned i = 0, e = List.size(); i != e; ++i) {
3361 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3365 if (UsedArray.empty())
3367 llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.
Int8PtrTy, UsedArray.size());
3369 auto *GV =
new llvm::GlobalVariable(
3370 CGM.
getModule(), ATy,
false, llvm::GlobalValue::AppendingLinkage,
3371 llvm::ConstantArray::get(ATy, UsedArray), Name);
3373 GV->setSection(
"llvm.metadata");
3376void CodeGenModule::emitLLVMUsed() {
3377 emitUsed(*
this,
"llvm.used", LLVMUsed);
3378 emitUsed(*
this,
"llvm.compiler.used", LLVMCompilerUsed);
3383 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3392 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
getLLVMContext(), MDOpts));
3398 ELFDependentLibraries.push_back(
3399 llvm::MDNode::get(
C, llvm::MDString::get(
C, Lib)));
3406 LinkerOptionsMetadata.push_back(llvm::MDNode::get(
C, MDOpts));
3415 if (Mod->
Parent && Visited.insert(Mod->
Parent).second) {
3421 if (Visited.insert(Import).second)
3438 if (LL.IsFramework) {
3439 llvm::Metadata *Args[2] = {llvm::MDString::get(Context,
"-framework"),
3440 llvm::MDString::get(Context, LL.Library)};
3442 Metadata.push_back(llvm::MDNode::get(Context, Args));
3448 llvm::Metadata *Args[2] = {
3449 llvm::MDString::get(Context,
"lib"),
3450 llvm::MDString::get(Context, LL.Library),
3452 Metadata.push_back(llvm::MDNode::get(Context, Args));
3456 auto *OptString = llvm::MDString::get(Context, Opt);
3457 Metadata.push_back(llvm::MDNode::get(Context, OptString));
3462void CodeGenModule::EmitModuleInitializers(
clang::Module *Primary) {
3464 "We should only emit module initializers for named modules.");
3472 assert(
isa<VarDecl>(D) &&
"GMF initializer decl is not a var?");
3489 assert(
isa<VarDecl>(D) &&
"PMF initializer decl is not a var?");
3495void CodeGenModule::EmitModuleLinkOptions() {
3499 llvm::SetVector<clang::Module *> LinkModules;
3500 llvm::SmallPtrSet<clang::Module *, 16> Visited;
3501 SmallVector<clang::Module *, 16> Stack;
3504 for (
Module *M : ImportedModules) {
3507 if (M->getTopLevelModuleName() ==
getLangOpts().CurrentModule &&
3510 if (Visited.insert(M).second)
3516 while (!Stack.empty()) {
3519 bool AnyChildren =
false;
3528 if (Visited.insert(
SM).second) {
3529 Stack.push_back(
SM);
3537 LinkModules.insert(Mod);
3544 SmallVector<llvm::MDNode *, 16> MetadataArgs;
3546 for (
Module *M : LinkModules)
3547 if (Visited.insert(M).second)
3549 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
3550 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
3553 if (!LinkerOptionsMetadata.empty()) {
3554 auto *NMD =
getModule().getOrInsertNamedMetadata(
"llvm.linker.options");
3555 for (
auto *MD : LinkerOptionsMetadata)
3556 NMD->addOperand(MD);
3560void CodeGenModule::EmitDeferred() {
3569 if (!DeferredVTables.empty()) {
3570 EmitDeferredVTables();
3575 assert(DeferredVTables.empty());
3582 llvm::append_range(DeferredDeclsToEmit,
3586 if (DeferredDeclsToEmit.empty())
3591 std::vector<GlobalDecl> CurDeclsToEmit;
3592 CurDeclsToEmit.swap(DeferredDeclsToEmit);
3594 for (GlobalDecl &D : CurDeclsToEmit) {
3600 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>() &&
3604 if (!FD->
getAttr<SYCLKernelEntryPointAttr>()->isInvalidAttr()) {
3620 llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(
3638 if (!GV->isDeclaration())
3642 if (LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(D))
3646 EmitGlobalDefinition(D, GV);
3651 if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
3653 assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
3658void CodeGenModule::EmitVTablesOpportunistically() {
3664 assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())
3665 &&
"Only emit opportunistic vtables with optimizations");
3667 for (
const CXXRecordDecl *RD : OpportunisticVTables) {
3669 "This queue should only contain external vtables");
3670 if (
getCXXABI().canSpeculativelyEmitVTable(RD))
3671 VTables.GenerateClassData(RD);
3673 OpportunisticVTables.clear();
3677 for (
const auto& [MangledName, VD] : DeferredAnnotations) {
3682 DeferredAnnotations.clear();
3684 if (Annotations.empty())
3688 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
3689 Annotations[0]->
getType(), Annotations.size()), Annotations);
3690 auto *gv =
new llvm::GlobalVariable(
getModule(), Array->getType(),
false,
3691 llvm::GlobalValue::AppendingLinkage,
3692 Array,
"llvm.global.annotations");
3697 llvm::Constant *&AStr = AnnotationStrings[Str];
3702 llvm::Constant *
s = llvm::ConstantDataArray::getString(
getLLVMContext(), Str);
3703 auto *gv =
new llvm::GlobalVariable(
3704 getModule(),
s->getType(),
true, llvm::GlobalValue::PrivateLinkage,
s,
3705 ".str",
nullptr, llvm::GlobalValue::NotThreadLocal,
3708 gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3725 SM.getExpansionLineNumber(L);
3726 return llvm::ConstantInt::get(
Int32Ty, LineNo);
3734 llvm::FoldingSetNodeID ID;
3735 for (
Expr *E : Exprs) {
3738 llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];
3743 LLVMArgs.reserve(Exprs.size());
3745 llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](
const Expr *E) {
3747 return ConstEmiter.
emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(),
3750 auto *
Struct = llvm::ConstantStruct::getAnon(LLVMArgs);
3751 auto *GV =
new llvm::GlobalVariable(
getModule(),
Struct->getType(),
true,
3752 llvm::GlobalValue::PrivateLinkage,
Struct,
3755 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3762 const AnnotateAttr *AA,
3770 llvm::Constant *GVInGlobalsAS = GV;
3771 if (GV->getAddressSpace() !=
3773 GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(
3775 llvm::PointerType::get(
3776 GV->getContext(),
getDataLayout().getDefaultGlobalsAddressSpace()));
3780 llvm::Constant *Fields[] = {
3781 GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,
3783 return llvm::ConstantStruct::getAnon(Fields);
3787 llvm::GlobalValue *GV) {
3788 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
3798 if (NoSanitizeL.containsFunction(Kind, Fn->getName()))
3801 auto &
SM = Context.getSourceManager();
3803 if (NoSanitizeL.containsMainFile(Kind, MainFile.
getName()))
3808 return NoSanitizeL.containsLocation(Kind, Loc);
3811 return NoSanitizeL.containsFile(Kind, MainFile.
getName());
3815 llvm::GlobalVariable *GV,
3817 StringRef Category)
const {
3819 if (NoSanitizeL.containsGlobal(Kind, GV->getName(), Category))
3821 auto &
SM = Context.getSourceManager();
3822 if (NoSanitizeL.containsMainFile(
3823 Kind,
SM.getFileEntryRefForID(
SM.getMainFileID())->getName(),
3826 if (NoSanitizeL.containsLocation(Kind, Loc, Category))
3833 while (
auto AT = dyn_cast<ArrayType>(Ty.
getTypePtr()))
3834 Ty = AT->getElementType();
3839 if (NoSanitizeL.containsType(Kind, TypeStr, Category))
3847 StringRef Category)
const {
3850 auto Attr = ImbueAttr::NONE;
3852 Attr = XRayFilter.shouldImbueLocation(Loc, Category);
3853 if (
Attr == ImbueAttr::NONE)
3854 Attr = XRayFilter.shouldImbueFunction(Fn->getName());
3856 case ImbueAttr::NONE:
3858 case ImbueAttr::ALWAYS:
3859 Fn->addFnAttr(
"function-instrument",
"xray-always");
3861 case ImbueAttr::ALWAYS_ARG1:
3862 Fn->addFnAttr(
"function-instrument",
"xray-always");
3863 Fn->addFnAttr(
"xray-log-args",
"1");
3865 case ImbueAttr::NEVER:
3866 Fn->addFnAttr(
"function-instrument",
"xray-never");
3879 llvm::driver::ProfileInstrKind Kind =
getCodeGenOpts().getProfileInstr();
3889 auto &
SM = Context.getSourceManager();
3890 if (
auto MainFile =
SM.getFileEntryRefForID(
SM.getMainFileID()))
3904 if (NumGroups > 1) {
3905 auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
3914 if (LangOpts.EmitAllDecls)
3917 const auto *VD = dyn_cast<VarDecl>(
Global);
3919 ((CodeGenOpts.KeepPersistentStorageVariables &&
3920 (VD->getStorageDuration() ==
SD_Static ||
3921 VD->getStorageDuration() ==
SD_Thread)) ||
3922 (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==
SD_Static &&
3923 VD->getType().isConstQualified())))
3936 if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
3937 std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
3938 OMPDeclareTargetDeclAttr::getActiveAttr(
Global);
3939 if (!ActiveAttr || (*ActiveAttr)->getLevel() != (
unsigned)-1)
3943 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
3953 if (LangOpts.SYCLIsDevice && FD->
hasAttr<SYCLKernelEntryPointAttr>())
3956 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
3957 if (Context.getInlineVariableDefinitionKind(VD) ==
3962 if (CXX20ModuleInits && VD->getOwningModule() &&
3963 !VD->getOwningModule()->isModuleMapModule()) {
3972 if (LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&
3975 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
Global))
3988 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
3992 llvm::Constant *
Init;
3995 if (!
V.isAbsent()) {
4006 llvm::Constant *Fields[4] = {
4010 llvm::ConstantDataArray::getRaw(
4011 StringRef(
reinterpret_cast<char *
>(Parts.
Part4And5), 8), 8,
4013 Init = llvm::ConstantStruct::getAnon(Fields);
4016 auto *GV =
new llvm::GlobalVariable(
4018 true, llvm::GlobalValue::LinkOnceODRLinkage,
Init, Name);
4020 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4023 if (!
V.isAbsent()) {
4036 llvm::GlobalVariable **Entry =
nullptr;
4037 Entry = &UnnamedGlobalConstantDeclMap[GCD];
4042 llvm::Constant *
Init;
4046 assert(!
V.isAbsent());
4050 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4052 llvm::GlobalValue::PrivateLinkage,
Init,
4054 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4068 if (llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name))
4072 llvm::Constant *
Init =
Emitter.emitForInitializer(
4080 llvm::GlobalValue::LinkageTypes
Linkage =
4082 ? llvm::GlobalValue::LinkOnceODRLinkage
4083 : llvm::GlobalValue::InternalLinkage;
4084 auto *GV =
new llvm::GlobalVariable(
getModule(),
Init->getType(),
4088 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
4095 const AliasAttr *AA = VD->
getAttr<AliasAttr>();
4096 assert(AA &&
"No alias?");
4106 llvm::Constant *Aliasee;
4108 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
4116 F->setLinkage(llvm::Function::ExternalWeakLinkage);
4117 WeakRefReferences.insert(F);
4125 if (
auto *A = D->
getAttr<AttrT>())
4126 return A->isImplicit();
4133 if (!LangOpts.OpenMPIsTargetDevice && !LangOpts.CUDA)
4136 const auto *AA =
Global->getAttr<AliasAttr>();
4144 const auto *AliaseeDecl = dyn_cast<ValueDecl>(AliaseeGD.getDecl());
4145 if (LangOpts.OpenMPIsTargetDevice)
4146 return !AliaseeDecl ||
4147 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(AliaseeDecl);
4150 const bool HasDeviceAttr =
Global->hasAttr<CUDADeviceAttr>();
4151 const bool AliaseeHasDeviceAttr =
4152 AliaseeDecl && AliaseeDecl->hasAttr<CUDADeviceAttr>();
4154 if (LangOpts.CUDAIsDevice)
4155 return !HasDeviceAttr || !AliaseeHasDeviceAttr;
4162bool CodeGenModule::shouldEmitCUDAGlobalVar(
const VarDecl *
Global)
const {
4163 assert(LangOpts.CUDA &&
"Should not be called by non-CUDA languages");
4168 return !LangOpts.CUDAIsDevice ||
Global->hasAttr<CUDADeviceAttr>() ||
4169 Global->hasAttr<CUDAConstantAttr>() ||
4170 Global->hasAttr<CUDASharedAttr>() ||
4171 Global->getType()->isCUDADeviceBuiltinSurfaceType() ||
4172 Global->getType()->isCUDADeviceBuiltinTextureType();
4179 if (
Global->hasAttr<WeakRefAttr>())
4184 if (
Global->hasAttr<AliasAttr>()) {
4187 return EmitAliasDefinition(GD);
4191 if (
Global->hasAttr<IFuncAttr>())
4192 return emitIFuncDefinition(GD);
4195 if (
Global->hasAttr<CPUDispatchAttr>())
4196 return emitCPUDispatchDefinition(GD);
4201 if (LangOpts.CUDA) {
4203 "Expected Variable or Function");
4204 if (
const auto *VD = dyn_cast<VarDecl>(
Global)) {
4205 if (!shouldEmitCUDAGlobalVar(VD))
4207 }
else if (LangOpts.CUDAIsDevice) {
4208 const auto *FD = dyn_cast<FunctionDecl>(
Global);
4209 if ((!
Global->hasAttr<CUDADeviceAttr>() ||
4210 (LangOpts.OffloadImplicitHostDeviceTemplates &&
4214 !
getContext().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&
4215 !
Global->hasAttr<CUDAGlobalAttr>() &&
4217 !
Global->hasAttr<CUDAHostAttr>()))
4220 }
else if (!
Global->hasAttr<CUDAHostAttr>() &&
4221 Global->hasAttr<CUDADeviceAttr>())
4225 if (LangOpts.OpenMP) {
4227 if (OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))
4229 if (
auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
Global)) {
4230 if (MustBeEmitted(
Global))
4234 if (
auto *DMD = dyn_cast<OMPDeclareMapperDecl>(
Global)) {
4235 if (MustBeEmitted(
Global))
4242 if (
const auto *FD = dyn_cast<FunctionDecl>(
Global)) {
4243 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
4249 if (FD->
hasAttr<AnnotateAttr>()) {
4252 DeferredAnnotations[MangledName] = FD;
4267 GetOrCreateLLVMFunction(MangledName, Ty, GD,
false,
4273 assert(VD->isFileVarDecl() &&
"Cannot emit local var decl as global.");
4275 !Context.isMSStaticDataMemberInlineDefinition(VD)) {
4276 if (LangOpts.OpenMP) {
4278 if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
4279 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
4283 if (VD->hasExternalStorage() &&
4284 Res != OMPDeclareTargetDeclAttr::MT_Link)
4287 bool UnifiedMemoryEnabled =
4289 if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4290 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4291 !UnifiedMemoryEnabled) {
4294 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
4295 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
4296 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
4297 UnifiedMemoryEnabled)) &&
4298 "Link clause or to clause with unified memory expected.");
4307 if (Context.getInlineVariableDefinitionKind(VD) ==
4317 if (MustBeEmitted(
Global) && MayBeEmittedEagerly(
Global)) {
4319 EmitGlobalDefinition(GD);
4320 addEmittedDeferredDecl(GD);
4328 DelayedCXXInitPosition[
Global] = CXXGlobalInits.size();
4329 CXXGlobalInits.push_back(
nullptr);
4335 addDeferredDeclToEmit(GD);
4336 }
else if (MustBeEmitted(
Global)) {
4338 assert(!MayBeEmittedEagerly(
Global));
4339 addDeferredDeclToEmit(GD);
4344 DeferredDecls[MangledName] = GD;
4350 if (
const auto *RT =
4351 T->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
4352 if (
auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4353 RD = RD->getDefinitionOrSelf();
4354 if (RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())
4362 struct FunctionIsDirectlyRecursive
4363 :
public ConstStmtVisitor<FunctionIsDirectlyRecursive, bool> {
4364 const StringRef Name;
4365 const Builtin::Context &BI;
4366 FunctionIsDirectlyRecursive(StringRef N,
const Builtin::Context &
C)
4369 bool VisitCallExpr(
const CallExpr *E) {
4373 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4374 if (Attr && Name == Attr->getLabel())
4379 std::string BuiltinNameStr = BI.
getName(BuiltinID);
4380 StringRef BuiltinName = BuiltinNameStr;
4381 return BuiltinName.consume_front(
"__builtin_") && Name == BuiltinName;
4384 bool VisitStmt(
const Stmt *S) {
4385 for (
const Stmt *Child : S->
children())
4386 if (Child && this->Visit(Child))
4393 struct DLLImportFunctionVisitor
4394 :
public RecursiveASTVisitor<DLLImportFunctionVisitor> {
4395 bool SafeToInline =
true;
4397 bool shouldVisitImplicitCode()
const {
return true; }
4399 bool VisitVarDecl(VarDecl *VD) {
4402 SafeToInline =
false;
4403 return SafeToInline;
4410 return SafeToInline;
4413 bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4415 SafeToInline = D->
hasAttr<DLLImportAttr>();
4416 return SafeToInline;
4419 bool VisitDeclRefExpr(DeclRefExpr *E) {
4422 SafeToInline = VD->
hasAttr<DLLImportAttr>();
4423 else if (VarDecl *
V = dyn_cast<VarDecl>(VD))
4424 SafeToInline = !
V->hasGlobalStorage() ||
V->hasAttr<DLLImportAttr>();
4425 return SafeToInline;
4428 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
4430 return SafeToInline;
4433 bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4437 SafeToInline =
true;
4439 SafeToInline = M->
hasAttr<DLLImportAttr>();
4441 return SafeToInline;
4444 bool VisitCXXDeleteExpr(CXXDeleteExpr *E) {
4446 return SafeToInline;
4449 bool VisitCXXNewExpr(CXXNewExpr *E) {
4451 return SafeToInline;
4460CodeGenModule::isTriviallyRecursive(
const FunctionDecl *FD) {
4462 if (
getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
4464 AsmLabelAttr *Attr = FD->
getAttr<AsmLabelAttr>();
4467 Name = Attr->getLabel();
4472 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
4473 const Stmt *Body = FD->
getBody();
4474 return Body ? Walker.Visit(Body) :
false;
4477bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
4484 if (F->isInlineBuiltinDeclaration())
4487 if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
4492 if (
const Module *M = F->getOwningModule();
4493 M && M->getTopLevelModule()->isNamedModule() &&
4494 getContext().getCurrentNamedModule() != M->getTopLevelModule()) {
4504 if (!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {
4509 if (F->hasAttr<NoInlineAttr>())
4512 if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
4514 DLLImportFunctionVisitor Visitor;
4515 Visitor.TraverseFunctionDecl(
const_cast<FunctionDecl*
>(F));
4516 if (!Visitor.SafeToInline)
4519 if (
const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
4522 for (
const Decl *
Member : Dtor->getParent()->decls())
4526 for (
const CXXBaseSpecifier &B : Dtor->getParent()->bases())
4537 return !isTriviallyRecursive(F);
4540bool CodeGenModule::shouldOpportunisticallyEmitVTables() {
4541 return CodeGenOpts.OptimizationLevel > 0;
4544void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
4545 llvm::GlobalValue *GV) {
4549 auto *Spec = FD->
getAttr<CPUSpecificAttr>();
4550 for (
unsigned I = 0; I < Spec->cpus_size(); ++I)
4552 }
else if (
auto *TC = FD->
getAttr<TargetClonesAttr>()) {
4553 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I)
4554 if (TC->isFirstOfVersion(I))
4557 EmitGlobalFunctionDefinition(GD, GV);
4563 AddDeferredMultiVersionResolverToEmit(GD);
4565 GetOrCreateMultiVersionResolver(GD);
4569void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
4572 PrettyStackTraceDecl CrashInfo(
const_cast<ValueDecl *
>(D), D->
getLocation(),
4573 Context.getSourceManager(),
4574 "Generating code for declaration");
4576 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4579 if (!shouldEmitFunction(GD))
4582 llvm::TimeTraceScope TimeScope(
"CodeGen Function", [&]() {
4584 llvm::raw_string_ostream
OS(Name);
4590 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4594 ABI->emitCXXStructor(GD);
4596 EmitMultiVersionFunctionDefinition(GD, GV);
4598 EmitGlobalFunctionDefinition(GD, GV);
4607 return EmitMultiVersionFunctionDefinition(GD, GV);
4608 return EmitGlobalFunctionDefinition(GD, GV);
4611 if (
const auto *VD = dyn_cast<VarDecl>(D))
4612 return EmitGlobalVarDefinition(VD, !VD->hasDefinition());
4614 llvm_unreachable(
"Invalid argument to EmitGlobalDefinition()");
4618 llvm::Function *NewFn);
4634static llvm::GlobalValue::LinkageTypes
4638 return llvm::GlobalValue::InternalLinkage;
4639 return llvm::GlobalValue::WeakODRLinkage;
4642void CodeGenModule::emitMultiVersionFunctions() {
4643 std::vector<GlobalDecl> MVFuncsToEmit;
4644 MultiVersionFuncs.swap(MVFuncsToEmit);
4645 for (GlobalDecl GD : MVFuncsToEmit) {
4647 assert(FD &&
"Expected a FunctionDecl");
4649 auto createFunction = [&](
const FunctionDecl *
Decl,
unsigned MVIdx = 0) {
4650 GlobalDecl CurGD{
Decl->isDefined() ?
Decl->getDefinition() :
Decl, MVIdx};
4654 if (
Decl->isDefined()) {
4655 EmitGlobalFunctionDefinition(CurGD,
nullptr);
4663 assert(
Func &&
"This should have just been created");
4672 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4675 FD, [&](
const FunctionDecl *CurFD) {
4676 llvm::SmallVector<StringRef, 8> Feats;
4679 if (
const auto *TA = CurFD->
getAttr<TargetAttr>()) {
4681 TA->getX86AddedFeatures(Feats);
4682 llvm::Function *
Func = createFunction(CurFD);
4683 Options.emplace_back(
Func, Feats, TA->getX86Architecture());
4684 }
else if (
const auto *TVA = CurFD->
getAttr<TargetVersionAttr>()) {
4685 if (TVA->isDefaultVersion() && IsDefined)
4686 ShouldEmitResolver =
true;
4687 llvm::Function *
Func = createFunction(CurFD);
4689 TVA->getFeatures(Feats, Delim);
4690 Options.emplace_back(
Func, Feats);
4691 }
else if (
const auto *TC = CurFD->
getAttr<TargetClonesAttr>()) {
4692 for (
unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
4693 if (!TC->isFirstOfVersion(I))
4695 if (TC->isDefaultVersion(I) && IsDefined)
4696 ShouldEmitResolver =
true;
4697 llvm::Function *
Func = createFunction(CurFD, I);
4700 TC->getX86Feature(Feats, I);
4701 Options.emplace_back(
Func, Feats, TC->getX86Architecture(I));
4704 TC->getFeatures(Feats, I, Delim);
4705 Options.emplace_back(
Func, Feats);
4709 llvm_unreachable(
"unexpected MultiVersionKind");
4712 if (!ShouldEmitResolver)
4715 llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
4716 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
4717 ResolverConstant = IFunc->getResolver();
4721 *
this, GD, FD,
true);
4728 auto *Alias = llvm::GlobalAlias::create(
4730 MangledName +
".ifunc", IFunc, &
getModule());
4739 Options, [&TI](
const CodeGenFunction::FMVResolverOption &LHS,
4740 const CodeGenFunction::FMVResolverOption &RHS) {
4743 CodeGenFunction CGF(*
this);
4744 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4746 setMultiVersionResolverAttributes(ResolverFunc, GD);
4748 ResolverFunc->setComdat(
4749 getModule().getOrInsertComdat(ResolverFunc->getName()));
4755 if (!MVFuncsToEmit.empty())
4760 if (!MultiVersionFuncs.empty())
4761 emitMultiVersionFunctions();
4765 llvm::Constant *
New) {
4768 Old->replaceAllUsesWith(
New);
4769 Old->eraseFromParent();
4772void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
4774 assert(FD &&
"Not a FunctionDecl?");
4776 const auto *DD = FD->
getAttr<CPUDispatchAttr>();
4777 assert(DD &&
"Not a cpu_dispatch Function?");
4783 UpdateMultiVersionNames(GD, FD, ResolverName);
4785 llvm::Type *ResolverType;
4786 GlobalDecl ResolverGD;
4788 ResolverType = llvm::FunctionType::get(
4799 ResolverName, ResolverType, ResolverGD,
false));
4802 ResolverFunc->setComdat(
4803 getModule().getOrInsertComdat(ResolverFunc->getName()));
4805 SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
4808 for (
const IdentifierInfo *II : DD->cpus()) {
4816 GlobalDecl ExistingDecl = Manglings.lookup(MangledName);
4819 EmitGlobalFunctionDefinition(ExistingDecl,
nullptr);
4825 Func = GetOrCreateLLVMFunction(
4826 MangledName, DeclTy, ExistingDecl,
4832 llvm::SmallVector<StringRef, 32> Features;
4833 Target.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);
4834 llvm::transform(Features, Features.begin(),
4835 [](StringRef Str) { return Str.substr(1); });
4836 llvm::erase_if(Features, [&Target](StringRef Feat) {
4837 return !Target.validateCpuSupports(Feat);
4843 llvm::stable_sort(Options, [](
const CodeGenFunction::FMVResolverOption &LHS,
4844 const CodeGenFunction::FMVResolverOption &RHS) {
4845 return llvm::X86::getCpuSupportsMask(LHS.
Features) >
4846 llvm::X86::getCpuSupportsMask(RHS.
Features);
4853 while (Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(
4854 (Options.end() - 2)->Features),
4855 [](
auto X) { return X == 0; })) {
4856 StringRef LHSName = (Options.end() - 2)->Function->getName();
4857 StringRef RHSName = (Options.end() - 1)->Function->getName();
4858 if (LHSName.compare(RHSName) < 0)
4859 Options.erase(Options.end() - 2);
4861 Options.erase(Options.end() - 1);
4864 CodeGenFunction CGF(*
this);
4865 CGF.EmitMultiVersionResolver(ResolverFunc, Options);
4866 setMultiVersionResolverAttributes(ResolverFunc, GD);
4871 unsigned AS = IFunc->getType()->getPointerAddressSpace();
4876 auto *GI = llvm::GlobalIFunc::create(DeclTy, AS,
Linkage,
"",
4883 *
this, GD, FD,
true);
4886 auto *GA = llvm::GlobalAlias::create(DeclTy, AS,
Linkage, AliasName,
4894void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
4896 assert(FD &&
"Not a FunctionDecl?");
4899 std::string MangledName =
4901 if (!DeferredResolversToEmit.insert(MangledName).second)
4904 MultiVersionFuncs.push_back(GD);
4910llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
4912 assert(FD &&
"Not a FunctionDecl?");
4914 std::string MangledName =
4919 std::string ResolverName = MangledName;
4923 llvm_unreachable(
"unexpected MultiVersionKind::None for resolver");
4927 ResolverName +=
".ifunc";
4934 ResolverName +=
".resolver";
4937 bool ShouldReturnIFunc =
4956 AddDeferredMultiVersionResolverToEmit(GD);
4960 if (ShouldReturnIFunc) {
4962 llvm::Type *ResolverType = llvm::FunctionType::get(
4964 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4965 MangledName +
".resolver", ResolverType, GlobalDecl{},
4967 llvm::GlobalIFunc *GIF =
4970 GIF->setName(ResolverName);
4977 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4978 ResolverName, DeclTy, GlobalDecl{},
false);
4980 "Resolver should be created for the first time");
4985void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver,
4987 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.
getDecl());
4999 Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
5010bool CodeGenModule::shouldDropDLLAttribute(
const Decl *D,
5011 const llvm::GlobalValue *GV)
const {
5012 auto SC = GV->getDLLStorageClass();
5013 if (SC == llvm::GlobalValue::DefaultStorageClass)
5016 return (((SC == llvm::GlobalValue::DLLImportStorageClass &&
5017 !MRD->
hasAttr<DLLImportAttr>()) ||
5018 (SC == llvm::GlobalValue::DLLExportStorageClass &&
5019 !MRD->
hasAttr<DLLExportAttr>())) &&
5030llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
5031 StringRef MangledName, llvm::Type *Ty, GlobalDecl GD,
bool ForVTable,
5032 bool DontDefer,
bool IsThunk, llvm::AttributeList ExtraAttrs,
5036 std::string NameWithoutMultiVersionMangling;
5037 if (
const FunctionDecl *FD = cast_or_null<FunctionDecl>(D)) {
5039 if (
getLangOpts().OpenMPIsTargetDevice && OpenMPRuntime &&
5040 !OpenMPRuntime->markAsGlobalTarget(GD) && FD->
isDefined() &&
5041 !DontDefer && !IsForDefinition) {
5044 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(FDDef))
5046 else if (
const auto *DD = dyn_cast<CXXDestructorDecl>(FDDef))
5049 GDDef = GlobalDecl(FDDef);
5057 UpdateMultiVersionNames(GD, FD, MangledName);
5058 if (!IsForDefinition) {
5064 AddDeferredMultiVersionResolverToEmit(GD);
5066 *
this, GD, FD,
true);
5068 return GetOrCreateMultiVersionResolver(GD);
5073 if (!NameWithoutMultiVersionMangling.empty())
5074 MangledName = NameWithoutMultiVersionMangling;
5079 if (WeakRefReferences.erase(Entry)) {
5080 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
5081 if (FD && !FD->
hasAttr<WeakAttr>())
5082 Entry->setLinkage(llvm::Function::ExternalLinkage);
5086 if (D && shouldDropDLLAttribute(D, Entry)) {
5087 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5093 if (IsForDefinition && !Entry->isDeclaration()) {
5100 DiagnosedConflictingDefinitions.insert(GD).second) {
5104 diag::note_previous_definition);
5109 (Entry->getValueType() == Ty)) {
5116 if (!IsForDefinition)
5123 bool IsIncompleteFunction =
false;
5125 llvm::FunctionType *FTy;
5129 FTy = llvm::FunctionType::get(
VoidTy,
false);
5130 IsIncompleteFunction =
true;
5134 llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
5135 Entry ? StringRef() : MangledName, &
getModule());
5139 if (D && D->
hasAttr<AnnotateAttr>())
5157 if (!Entry->use_empty()) {
5159 Entry->removeDeadConstantUsers();
5165 assert(F->getName() == MangledName &&
"name was uniqued!");
5167 SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
5168 if (ExtraAttrs.hasFnAttrs()) {
5169 llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());
5177 if (isa_and_nonnull<CXXDestructorDecl>(D) &&
5180 addDeferredDeclToEmit(GD);
5185 auto DDI = DeferredDecls.find(MangledName);
5186 if (DDI != DeferredDecls.end()) {
5190 addDeferredDeclToEmit(DDI->second);
5191 DeferredDecls.erase(DDI);
5219 if (!IsIncompleteFunction) {
5220 assert(F->getFunctionType() == Ty);
5238 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
5248 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(GD.
getDecl())) {
5251 DD->getParent()->getNumVBases() == 0)
5256 auto *F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,
5257 false, llvm::AttributeList(),
5260 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
5264 if (IsForDefinition)
5272 llvm::GlobalValue *F =
5275 return llvm::NoCFIValue::get(F);
5284 for (
const auto *Result : DC->
lookup(&CII))
5285 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5288 if (!
C.getLangOpts().CPlusPlus)
5293 (Name ==
"_ZSt9terminatev" || Name ==
"?terminate@@YAXXZ")
5294 ?
C.Idents.get(
"terminate")
5295 :
C.Idents.get(Name);
5297 for (
const auto &N : {
"__cxxabiv1",
"std"}) {
5299 for (
const auto *Result : DC->
lookup(&NS)) {
5301 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(Result))
5302 for (
const auto *Result : LSD->lookup(&NS))
5303 if ((ND = dyn_cast<NamespaceDecl>(Result)))
5307 for (
const auto *Result : ND->
lookup(&CXXII))
5308 if (
const auto *FD = dyn_cast<FunctionDecl>(Result))
5317 llvm::Function *F, StringRef Name) {
5323 if (!Local && CGM.
getTriple().isWindowsItaniumEnvironment() &&
5326 if (!FD || FD->
hasAttr<DLLImportAttr>()) {
5327 F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
5328 F->setLinkage(llvm::GlobalValue::ExternalLinkage);
5335 llvm::AttributeList ExtraAttrs,
bool Local,
bool AssumeConvergent) {
5336 if (AssumeConvergent) {
5338 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5341 QualType FTy = Context.getFunctionType(ReturnTy, ArgTys,
5346 llvm::Constant *
C = GetOrCreateLLVMFunction(
5348 false,
false, ExtraAttrs);
5350 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5366 llvm::AttributeList ExtraAttrs,
bool Local,
5367 bool AssumeConvergent) {
5368 if (AssumeConvergent) {
5370 ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);
5374 GetOrCreateLLVMFunction(Name, FTy,
GlobalDecl(),
false,
5378 if (
auto *F = dyn_cast<llvm::Function>(
C)) {
5387 markRegisterParameterAttributes(F);
5413 if (WeakRefReferences.erase(Entry)) {
5414 if (D && !D->
hasAttr<WeakAttr>())
5415 Entry->setLinkage(llvm::Function::ExternalLinkage);
5419 if (D && shouldDropDLLAttribute(D, Entry))
5420 Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
5422 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D)
5425 if (Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)
5430 if (IsForDefinition && !Entry->isDeclaration()) {
5438 (OtherD = dyn_cast<VarDecl>(OtherGD.
getDecl())) &&
5440 DiagnosedConflictingDefinitions.insert(D).second) {
5444 diag::note_previous_definition);
5449 if (Entry->getType()->getAddressSpace() != TargetAS)
5450 return llvm::ConstantExpr::getAddrSpaceCast(
5451 Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));
5455 if (!IsForDefinition)
5461 auto *GV =
new llvm::GlobalVariable(
5462 getModule(), Ty,
false, llvm::GlobalValue::ExternalLinkage,
nullptr,
5463 MangledName,
nullptr, llvm::GlobalVariable::NotThreadLocal,
5464 getContext().getTargetAddressSpace(DAddrSpace));
5469 GV->takeName(Entry);
5471 if (!Entry->use_empty()) {
5472 Entry->replaceAllUsesWith(GV);
5475 Entry->eraseFromParent();
5481 auto DDI = DeferredDecls.find(MangledName);
5482 if (DDI != DeferredDecls.end()) {
5485 addDeferredDeclToEmit(DDI->second);
5486 DeferredDecls.erase(DDI);
5491 if (LangOpts.OpenMP && !LangOpts.OpenMPSimd)
5498 GV->setAlignment(
getContext().getDeclAlign(D).getAsAlign());
5504 CXXThreadLocals.push_back(D);
5512 if (
getContext().isMSStaticDataMemberInlineDefinition(D)) {
5513 EmitGlobalVarDefinition(D);
5518 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>())
5519 GV->setSection(SA->getName());
5523 if (
getTriple().getArch() == llvm::Triple::xcore &&
5527 GV->setSection(
".cp.rodata");
5530 if (
const auto *CMA = D->
getAttr<CodeModelAttr>())
5531 GV->setCodeModel(CMA->getModel());
5536 if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() &&
5540 Context.getBaseElementType(D->
getType())->getAsCXXRecordDecl();
5541 bool HasMutableFields =
Record &&
Record->hasMutableFields();
5542 if (!HasMutableFields) {
5549 auto *InitType =
Init->getType();
5550 if (GV->getValueType() != InitType) {
5555 GV->setName(StringRef());
5560 ->stripPointerCasts());
5563 GV->eraseFromParent();
5566 GV->setInitializer(
Init);
5567 GV->setConstant(
true);
5568 GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
5588 SanitizerMD->reportGlobal(GV, *D);
5593 assert(
getContext().getTargetAddressSpace(ExpectedAS) == TargetAS);
5594 if (DAddrSpace != ExpectedAS) {
5596 *
this, GV, DAddrSpace,
5609 false, IsForDefinition);
5630 StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes
Linkage,
5631 llvm::Align Alignment) {
5632 llvm::GlobalVariable *GV =
getModule().getNamedGlobal(Name);
5633 llvm::GlobalVariable *OldGV =
nullptr;
5637 if (GV->getValueType() == Ty)
5642 assert(GV->isDeclaration() &&
"Declaration has wrong type!");
5647 GV =
new llvm::GlobalVariable(
getModule(), Ty,
true,
5652 GV->takeName(OldGV);
5654 if (!OldGV->use_empty()) {
5655 OldGV->replaceAllUsesWith(GV);
5658 OldGV->eraseFromParent();
5662 !GV->hasAvailableExternallyLinkage())
5663 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
5665 GV->setAlignment(Alignment);
5702 assert(!D->
getInit() &&
"Cannot emit definite definitions here!");
5710 if (GV && !GV->isDeclaration())
5715 if (!MustBeEmitted(D) && !GV) {
5716 DeferredDecls[MangledName] = D;
5721 EmitGlobalVarDefinition(D);
5726 if (
auto const *CD = dyn_cast<const CXXConstructorDecl>(D))
5728 else if (
auto const *DD = dyn_cast<const CXXDestructorDecl>(D))
5743 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5746 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
5748 if (!Fn->getSubprogram())
5754 return Context.toCharUnitsFromBits(
5759 if (LangOpts.OpenCL) {
5770 if (LangOpts.SYCLIsDevice &&
5774 if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
5776 if (D->
hasAttr<CUDAConstantAttr>())
5778 if (D->
hasAttr<CUDASharedAttr>())
5780 if (D->
hasAttr<CUDADeviceAttr>())
5788 if (LangOpts.OpenMP) {
5790 if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS))
5798 if (LangOpts.OpenCL)
5800 if (LangOpts.SYCLIsDevice)
5802 if (LangOpts.HIP && LangOpts.CUDAIsDevice &&
getTriple().isSPIRV())
5810 if (
auto AS =
getTarget().getConstantAddressSpace())
5823static llvm::Constant *
5825 llvm::GlobalVariable *GV) {
5826 llvm::Constant *Cast = GV;
5832 llvm::PointerType::get(
5839template<
typename SomeDecl>
5841 llvm::GlobalValue *GV) {
5856 const SomeDecl *
First = D->getFirstDecl();
5857 if (
First->getDeclContext()->isRecord() || !
First->isInExternCContext())
5863 std::pair<StaticExternCMap::iterator, bool> R =
5864 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
5869 R.first->second =
nullptr;
5876 if (D.
hasAttr<SelectAnyAttr>())
5880 if (
auto *VD = dyn_cast<VarDecl>(&D))
5894 llvm_unreachable(
"No such linkage");
5902 llvm::GlobalObject &GO) {
5905 GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
5913void CodeGenModule::EmitGlobalVarDefinition(
const VarDecl *D,
5928 if (LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&
5929 OpenMPRuntime->emitTargetGlobalVariable(D))
5932 llvm::TrackingVH<llvm::Constant>
Init;
5933 bool NeedsGlobalCtor =
false;
5937 bool IsDefinitionAvailableExternally =
5939 bool NeedsGlobalDtor =
5940 !IsDefinitionAvailableExternally &&
5947 if (IsDefinitionAvailableExternally &&
5958 std::optional<ConstantEmitter> emitter;
5963 bool IsCUDASharedVar =
5968 bool IsCUDAShadowVar =
5970 (D->
hasAttr<CUDAConstantAttr>() || D->
hasAttr<CUDADeviceAttr>() ||
5971 D->
hasAttr<CUDASharedAttr>());
5972 bool IsCUDADeviceShadowVar =
5977 (IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar)) {
5978 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5982 Init = llvm::PoisonValue::get(
getTypes().ConvertType(ASTTy));
5985 }
else if (D->
hasAttr<LoaderUninitializedAttr>()) {
5986 Init = llvm::UndefValue::get(
getTypes().ConvertTypeForMem(ASTTy));
5987 }
else if (!InitExpr) {
6000 initializedGlobalDecl = GlobalDecl(D);
6001 emitter.emplace(*
this);
6002 llvm::Constant *
Initializer = emitter->tryEmitForInitializer(*InitDecl);
6010 if (!IsDefinitionAvailableExternally)
6011 NeedsGlobalCtor =
true;
6015 NeedsGlobalCtor =
false;
6027 DelayedCXXInitPosition.erase(D);
6034 assert(VarSize == CstSize &&
"Emitted constant has unexpected size");
6039 llvm::Type* InitType =
Init->getType();
6040 llvm::Constant *Entry =
6044 Entry = Entry->stripPointerCasts();
6047 auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
6058 if (!GV || GV->getValueType() != InitType ||
6059 GV->getType()->getAddressSpace() !=
6063 Entry->setName(StringRef());
6068 ->stripPointerCasts());
6071 llvm::Constant *NewPtrForOldDecl =
6072 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
6074 Entry->replaceAllUsesWith(NewPtrForOldDecl);
6082 if (D->
hasAttr<AnnotateAttr>())
6095 if (LangOpts.CUDA) {
6096 if (LangOpts.CUDAIsDevice) {
6097 if (
Linkage != llvm::GlobalValue::InternalLinkage &&
6098 (D->
hasAttr<CUDADeviceAttr>() || D->
hasAttr<CUDAConstantAttr>() ||
6101 GV->setExternallyInitialized(
true);
6111 GV->setExternallyInitialized(
true);
6113 GV->setInitializer(
Init);
6120 emitter->finalize(GV);
6123 GV->setConstant((D->
hasAttr<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||
6124 (!NeedsGlobalCtor && !NeedsGlobalDtor &&
6128 if (
const SectionAttr *SA = D->
getAttr<SectionAttr>()) {
6129 const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
6131 GV->setConstant(
true);
6136 if (std::optional<CharUnits> AlignValFromAllocate =
6138 AlignVal = *AlignValFromAllocate;
6156 Linkage == llvm::GlobalValue::ExternalLinkage &&
6157 Context.getTargetInfo().getTriple().isOSDarwin() &&
6159 Linkage = llvm::GlobalValue::InternalLinkage;
6165 Linkage = llvm::GlobalValue::ExternalLinkage;
6168 if (D->
hasAttr<DLLImportAttr>())
6169 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
6170 else if (D->
hasAttr<DLLExportAttr>())
6171 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
6173 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
6175 if (
Linkage == llvm::GlobalVariable::CommonLinkage) {
6177 GV->setConstant(
false);
6182 if (!GV->getInitializer()->isNullValue())
6183 GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
6186 setNonAliasAttributes(D, GV);
6188 if (D->
getTLSKind() && !GV->isThreadLocal()) {
6190 CXXThreadLocals.push_back(D);
6197 if (NeedsGlobalCtor || NeedsGlobalDtor)
6198 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
6200 SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
6205 DI->EmitGlobalVariable(GV, D);
6213 if ((NoCommon || D->
hasAttr<NoCommonAttr>()) && !D->
hasAttr<CommonAttr>())
6224 if (D->
hasAttr<SectionAttr>())
6230 if (D->
hasAttr<PragmaClangBSSSectionAttr>() ||
6231 D->
hasAttr<PragmaClangDataSectionAttr>() ||
6232 D->
hasAttr<PragmaClangRelroSectionAttr>() ||
6233 D->
hasAttr<PragmaClangRodataSectionAttr>())
6241 if (D->
hasAttr<WeakImportAttr>())
6250 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
6251 if (D->
hasAttr<AlignedAttr>())
6254 if (Context.isAlignmentRequired(VarType))
6258 for (
const FieldDecl *FD : RD->fields()) {
6259 if (FD->isBitField())
6261 if (FD->
hasAttr<AlignedAttr>())
6263 if (Context.isAlignmentRequired(FD->
getType()))
6275 if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() &&
6276 Context.getTypeAlignIfKnown(D->
getType()) >
6283llvm::GlobalValue::LinkageTypes
6287 return llvm::Function::InternalLinkage;
6290 return llvm::GlobalVariable::WeakAnyLinkage;
6294 return llvm::GlobalVariable::LinkOnceAnyLinkage;
6299 return llvm::GlobalValue::AvailableExternallyLinkage;
6313 return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
6314 : llvm::Function::InternalLinkage;
6328 return llvm::Function::ExternalLinkage;
6331 return D->
hasAttr<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage
6332 : llvm::Function::InternalLinkage;
6333 return llvm::Function::WeakODRLinkage;
6340 CodeGenOpts.NoCommon))
6341 return llvm::GlobalVariable::CommonLinkage;
6347 if (D->
hasAttr<SelectAnyAttr>())
6348 return llvm::GlobalVariable::WeakODRLinkage;
6352 return llvm::GlobalVariable::ExternalLinkage;
6355llvm::GlobalValue::LinkageTypes
6364 llvm::Function *newFn) {
6366 if (old->use_empty())
6369 llvm::Type *newRetTy = newFn->getReturnType();
6374 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
6376 llvm::User *user = ui->getUser();
6380 if (
auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
6381 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
6387 llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);
6390 if (!callSite->isCallee(&*ui))
6395 if (callSite->getType() != newRetTy && !callSite->use_empty())
6400 llvm::AttributeList oldAttrs = callSite->getAttributes();
6403 unsigned newNumArgs = newFn->arg_size();
6404 if (callSite->arg_size() < newNumArgs)
6410 bool dontTransform =
false;
6411 for (llvm::Argument &A : newFn->args()) {
6412 if (callSite->getArgOperand(argNo)->getType() != A.getType()) {
6413 dontTransform =
true;
6418 newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));
6426 newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);
6430 callSite->getOperandBundlesAsDefs(newBundles);
6432 llvm::CallBase *newCall;
6434 newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,
"",
6435 callSite->getIterator());
6438 newCall = llvm::InvokeInst::Create(
6439 newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),
6440 newArgs, newBundles,
"", callSite->getIterator());
6444 if (!newCall->getType()->isVoidTy())
6445 newCall->takeName(callSite);
6446 newCall->setAttributes(
6447 llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),
6448 oldAttrs.getRetAttrs(), newArgAttrs));
6449 newCall->setCallingConv(callSite->getCallingConv());
6452 if (!callSite->use_empty())
6453 callSite->replaceAllUsesWith(newCall);
6456 if (callSite->getDebugLoc())
6457 newCall->setDebugLoc(callSite->getDebugLoc());
6459 callSitesToBeRemovedFromParent.push_back(callSite);
6462 for (
auto *callSite : callSitesToBeRemovedFromParent) {
6463 callSite->eraseFromParent();
6477 llvm::Function *NewFn) {
6487 (LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))
6499void CodeGenModule::EmitGlobalFunctionDefinition(
GlobalDecl GD,
6500 llvm::GlobalValue *GV) {
6508 if (!GV || (GV->getValueType() != Ty))
6514 if (!GV->isDeclaration())
6533 setNonAliasAttributes(GD, Fn);
6535 bool ShouldAddOptNone = !CodeGenOpts.DisableO0ImplyOptNone &&
6536 (CodeGenOpts.OptimizationLevel == 0) &&
6539 if (DeviceKernelAttr::isOpenCLSpelling(D->
getAttr<DeviceKernelAttr>())) {
6541 !D->
hasAttr<NoInlineAttr>() &&
6542 !Fn->hasFnAttribute(llvm::Attribute::NoInline) &&
6543 !D->
hasAttr<OptimizeNoneAttr>() &&
6544 !Fn->hasFnAttribute(llvm::Attribute::OptimizeNone) &&
6545 !ShouldAddOptNone) {
6546 Fn->addFnAttr(llvm::Attribute::AlwaysInline);
6552 auto GetPriority = [
this](
const auto *
Attr) ->
int {
6557 return Attr->DefaultPriority;
6560 if (
const ConstructorAttr *CA = D->
getAttr<ConstructorAttr>())
6562 if (
const DestructorAttr *DA = D->
getAttr<DestructorAttr>())
6568void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
6570 const AliasAttr *AA = D->
getAttr<AliasAttr>();
6571 assert(AA &&
"Not an alias?");
6575 if (AA->getAliasee() == MangledName) {
6576 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6583 if (Entry && !Entry->isDeclaration())
6586 Aliases.push_back(GD);
6592 llvm::Constant *Aliasee;
6593 llvm::GlobalValue::LinkageTypes
LT;
6595 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
6601 if (
const auto *VD = dyn_cast<VarDecl>(GD.
getDecl()))
6608 unsigned AS = Aliasee->getType()->getPointerAddressSpace();
6610 llvm::GlobalAlias::create(DeclTy, AS, LT,
"", Aliasee, &
getModule());
6613 if (GA->getAliasee() == Entry) {
6614 Diags.Report(AA->getLocation(), diag::err_cyclic_alias) << 0;
6618 assert(Entry->isDeclaration());
6627 GA->takeName(Entry);
6629 Entry->replaceAllUsesWith(GA);
6630 Entry->eraseFromParent();
6632 GA->setName(MangledName);
6640 GA->setLinkage(llvm::Function::WeakAnyLinkage);
6643 if (
const auto *VD = dyn_cast<VarDecl>(D))
6644 if (VD->getTLSKind())
6655void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
6657 const IFuncAttr *IFA = D->
getAttr<IFuncAttr>();
6658 assert(IFA &&
"Not an ifunc?");
6662 if (IFA->getResolver() == MangledName) {
6663 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6669 if (Entry && !Entry->isDeclaration()) {
6672 DiagnosedConflictingDefinitions.insert(GD).second) {
6673 Diags.Report(D->
getLocation(), diag::err_duplicate_mangled_name)
6676 diag::note_previous_definition);
6681 Aliases.push_back(GD);
6687 llvm::Constant *Resolver =
6688 GetOrCreateLLVMFunction(IFA->getResolver(),
VoidTy, {},
6692 llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(
6693 DeclTy, AS, llvm::Function::ExternalLinkage,
"", Resolver, &
getModule());
6695 if (GIF->getResolver() == Entry) {
6696 Diags.Report(IFA->getLocation(), diag::err_cyclic_alias) << 1;
6699 assert(Entry->isDeclaration());
6708 GIF->takeName(Entry);
6710 Entry->replaceAllUsesWith(GIF);
6711 Entry->eraseFromParent();
6713 GIF->setName(MangledName);
6719 return llvm::Intrinsic::getOrInsertDeclaration(&
getModule(),
6720 (llvm::Intrinsic::ID)IID, Tys);
6723static llvm::StringMapEntry<llvm::GlobalVariable *> &
6726 bool &IsUTF16,
unsigned &StringLength) {
6727 StringRef String = Literal->getString();
6728 unsigned NumBytes = String.size();
6731 if (!Literal->containsNonAsciiOrNull()) {
6732 StringLength = NumBytes;
6733 return *Map.insert(std::make_pair(String,
nullptr)).first;
6740 const llvm::UTF8 *FromPtr = (
const llvm::UTF8 *)String.data();
6741 llvm::UTF16 *ToPtr = &ToBuf[0];
6743 (void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,
6744 ToPtr + NumBytes, llvm::strictConversion);
6747 StringLength = ToPtr - &ToBuf[0];
6751 return *Map.insert(std::make_pair(
6752 StringRef(
reinterpret_cast<const char *
>(ToBuf.data()),
6753 (StringLength + 1) * 2),
6759 unsigned StringLength = 0;
6760 bool isUTF16 =
false;
6761 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
6766 if (
auto *
C = Entry.second)
6771 const llvm::Triple &Triple =
getTriple();
6774 const bool IsSwiftABI =
6775 static_cast<unsigned>(CFRuntime) >=
6780 if (!CFConstantStringClassRef) {
6781 const char *CFConstantStringClassName =
"__CFConstantStringClassReference";
6783 Ty = llvm::ArrayType::get(Ty, 0);
6785 switch (CFRuntime) {
6789 CFConstantStringClassName =
6790 Triple.isOSDarwin() ?
"$s15SwiftFoundation19_NSCFConstantStringCN"
6791 :
"$s10Foundation19_NSCFConstantStringCN";
6795 CFConstantStringClassName =
6796 Triple.isOSDarwin() ?
"$S15SwiftFoundation19_NSCFConstantStringCN"
6797 :
"$S10Foundation19_NSCFConstantStringCN";
6801 CFConstantStringClassName =
6802 Triple.isOSDarwin() ?
"__T015SwiftFoundation19_NSCFConstantStringCN"
6803 :
"__T010Foundation19_NSCFConstantStringCN";
6810 if (Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {
6811 llvm::GlobalValue *GV =
nullptr;
6813 if ((GV = dyn_cast<llvm::GlobalValue>(
C))) {
6820 if ((VD = dyn_cast<VarDecl>(
Result)))
6823 if (Triple.isOSBinFormatELF()) {
6825 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6827 GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
6828 if (!VD || !VD->
hasAttr<DLLExportAttr>())
6829 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6831 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6839 CFConstantStringClassRef =
6840 IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(
C, Ty) :
C;
6843 QualType CFTy = Context.getCFConstantStringType();
6848 auto Fields = Builder.beginStruct(STy);
6857 Fields.addInt(
IntPtrTy, IsSwift4_1 ? 0x05 : 0x01);
6858 Fields.addInt(
Int64Ty, isUTF16 ? 0x07d0 : 0x07c8);
6860 Fields.addInt(
IntTy, isUTF16 ? 0x07d0 : 0x07C8);
6864 llvm::Constant *
C =
nullptr;
6867 reinterpret_cast<uint16_t *
>(
const_cast<char *
>(Entry.first().data())),
6868 Entry.first().size() / 2);
6869 C = llvm::ConstantDataArray::get(VMContext, Arr);
6871 C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
6877 new llvm::GlobalVariable(
getModule(),
C->getType(),
true,
6878 llvm::GlobalValue::PrivateLinkage,
C,
".str");
6879 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
6882 CharUnits Align = isUTF16 ? Context.getTypeAlignInChars(Context.ShortTy)
6883 : Context.getTypeAlignInChars(Context.CharTy);
6889 if (Triple.isOSBinFormatMachO())
6890 GV->setSection(isUTF16 ?
"__TEXT,__ustring"
6891 :
"__TEXT,__cstring,cstring_literals");
6894 else if (Triple.isOSBinFormatELF())
6895 GV->setSection(
".rodata");
6901 llvm::IntegerType *LengthTy =
6911 Fields.addInt(LengthTy, StringLength);
6919 GV = Fields.finishAndCreateGlobal(
"_unnamed_cfstring_", Alignment,
6921 llvm::GlobalVariable::PrivateLinkage);
6922 GV->addAttribute(
"objc_arc_inert");
6923 switch (Triple.getObjectFormat()) {
6924 case llvm::Triple::UnknownObjectFormat:
6925 llvm_unreachable(
"unknown file format");
6926 case llvm::Triple::DXContainer:
6927 case llvm::Triple::GOFF:
6928 case llvm::Triple::SPIRV:
6929 case llvm::Triple::XCOFF:
6930 llvm_unreachable(
"unimplemented");
6931 case llvm::Triple::COFF:
6932 case llvm::Triple::ELF:
6933 case llvm::Triple::Wasm:
6934 GV->setSection(
"cfstring");
6936 case llvm::Triple::MachO:
6937 GV->setSection(
"__DATA,__cfstring");
6946 return !CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;
6950 if (ObjCFastEnumerationStateType.isNull()) {
6951 RecordDecl *D = Context.buildImplicitRecord(
"__objcFastEnumerationState");
6955 Context.UnsignedLongTy, Context.getPointerType(Context.getObjCIdType()),
6956 Context.getPointerType(Context.UnsignedLongTy),
6957 Context.getConstantArrayType(Context.UnsignedLongTy, llvm::APInt(32, 5),
6960 for (
size_t i = 0; i < 4; ++i) {
6965 FieldTypes[i],
nullptr,
6974 ObjCFastEnumerationStateType = Context.getCanonicalTagType(D);
6977 return ObjCFastEnumerationStateType;
6991 assert(CAT &&
"String literal not of constant array type!");
6993 return llvm::ConstantDataArray::getString(VMContext, Str,
false);
6997 llvm::Type *ElemTy = AType->getElementType();
6998 unsigned NumElements = AType->getNumElements();
7001 if (ElemTy->getPrimitiveSizeInBits() == 16) {
7003 Elements.reserve(NumElements);
7005 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7007 Elements.resize(NumElements);
7008 return llvm::ConstantDataArray::get(VMContext, Elements);
7011 assert(ElemTy->getPrimitiveSizeInBits() == 32);
7013 Elements.reserve(NumElements);
7015 for(
unsigned i = 0, e = E->
getLength(); i != e; ++i)
7017 Elements.resize(NumElements);
7018 return llvm::ConstantDataArray::get(VMContext, Elements);
7021static llvm::GlobalVariable *
7030 auto *GV =
new llvm::GlobalVariable(
7031 M,
C->getType(), !CGM.
getLangOpts().WritableStrings, LT,
C, GlobalName,
7032 nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
7034 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
7035 if (GV->isWeakForLinker()) {
7036 assert(CGM.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
7037 GV->setComdat(M.getOrInsertComdat(GV->getName()));
7053 llvm::GlobalVariable **Entry =
nullptr;
7054 if (!LangOpts.WritableStrings) {
7055 Entry = &ConstantStringMap[
C];
7056 if (
auto GV = *Entry) {
7057 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7060 GV->getValueType(), Alignment);
7065 StringRef GlobalVariableName;
7066 llvm::GlobalValue::LinkageTypes LT;
7071 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(S) &&
7072 !LangOpts.WritableStrings) {
7073 llvm::raw_svector_ostream Out(MangledNameBuffer);
7075 LT = llvm::GlobalValue::LinkOnceODRLinkage;
7076 GlobalVariableName = MangledNameBuffer;
7078 LT = llvm::GlobalValue::PrivateLinkage;
7079 GlobalVariableName = Name;
7091 SanitizerMD->reportGlobal(GV, S->
getStrTokenLoc(0),
"<string literal>");
7094 GV->getValueType(), Alignment);
7111 StringRef GlobalName) {
7112 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
7117 llvm::ConstantDataArray::getString(
getLLVMContext(), StrWithNull,
false);
7120 llvm::GlobalVariable **Entry =
nullptr;
7121 if (!LangOpts.WritableStrings) {
7122 Entry = &ConstantStringMap[
C];
7123 if (
auto GV = *Entry) {
7124 if (uint64_t(Alignment.
getQuantity()) > GV->getAlignment())
7127 GV->getValueType(), Alignment);
7133 GlobalName, Alignment);
7138 GV->getValueType(), Alignment);
7151 MaterializedType = E->
getType();
7155 auto InsertResult = MaterializedGlobalTemporaryMap.insert({E,
nullptr});
7156 if (!InsertResult.second) {
7159 if (!InsertResult.first->second) {
7164 InsertResult.first->second =
new llvm::GlobalVariable(
7165 getModule(),
Type,
false, llvm::GlobalVariable::InternalLinkage,
7169 llvm::cast<llvm::GlobalVariable>(
7170 InsertResult.first->second->stripPointerCasts())
7179 llvm::raw_svector_ostream Out(Name);
7201 std::optional<ConstantEmitter> emitter;
7202 llvm::Constant *InitialValue =
nullptr;
7203 bool Constant =
false;
7207 emitter.emplace(*
this);
7208 InitialValue = emitter->emitForInitializer(*
Value, AddrSpace,
7213 Type = InitialValue->getType();
7222 if (
Linkage == llvm::GlobalVariable::ExternalLinkage) {
7224 if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
7228 Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
7232 Linkage = llvm::GlobalVariable::InternalLinkage;
7236 auto *GV =
new llvm::GlobalVariable(
7238 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
7239 if (emitter) emitter->finalize(GV);
7241 if (!llvm::GlobalValue::isLocalLinkage(
Linkage)) {
7243 if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)
7245 GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
7249 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
7250 if (VD->getTLSKind())
7252 llvm::Constant *CV = GV;
7255 *
this, GV, AddrSpace,
7256 llvm::PointerType::get(
7262 llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[E];
7264 Entry->replaceAllUsesWith(CV);
7265 llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();
7274void CodeGenModule::EmitObjCPropertyImplementations(
const
7287 if (!Getter || Getter->isSynthesizedAccessorStub())
7290 auto *Setter = PID->getSetterMethodDecl();
7291 if (!PD->
isReadOnly() && (!Setter || Setter->isSynthesizedAccessorStub()))
7302 if (ivar->getType().isDestructedType())
7323void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
7336 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod,
false);
7351 getContext().getObjCIdType(),
nullptr, D,
true,
7357 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod,
true);
7362void CodeGenModule::EmitLinkageSpec(
const LinkageSpecDecl *LSD) {
7369 EmitDeclContext(LSD);
7372void CodeGenModule::EmitTopLevelStmt(
const TopLevelStmtDecl *D) {
7374 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7377 std::unique_ptr<CodeGenFunction> &CurCGF =
7378 GlobalTopLevelStmtBlockInFlight.first;
7382 if (CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {
7390 std::string Name =
"__stmts__" + llvm::utostr(CXXGlobalInits.size());
7391 FunctionArgList Args;
7393 const CGFunctionInfo &FnInfo =
7396 llvm::Function *
Fn = llvm::Function::Create(
7397 FnTy, llvm::GlobalValue::InternalLinkage, Name, &
getModule());
7399 CurCGF.reset(
new CodeGenFunction(*
this));
7400 GlobalTopLevelStmtBlockInFlight.second = D;
7401 CurCGF->StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
7403 CXXGlobalInits.push_back(Fn);
7406 CurCGF->EmitStmt(D->
getStmt());
7409void CodeGenModule::EmitDeclContext(
const DeclContext *DC) {
7410 for (
auto *I : DC->
decls()) {
7416 if (
auto *OID = dyn_cast<ObjCImplDecl>(I)) {
7417 for (
auto *M : OID->methods())
7436 case Decl::CXXConversion:
7437 case Decl::CXXMethod:
7438 case Decl::Function:
7445 case Decl::CXXDeductionGuide:
7450 case Decl::Decomposition:
7451 case Decl::VarTemplateSpecialization:
7453 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
7454 for (
auto *B : DD->flat_bindings())
7455 if (
auto *HD = B->getHoldingVar())
7462 case Decl::IndirectField:
7466 case Decl::Namespace:
7469 case Decl::ClassTemplateSpecialization: {
7472 if (Spec->getSpecializationKind() ==
7474 Spec->hasDefinition())
7475 DI->completeTemplateDefinition(*Spec);
7477 case Decl::CXXRecord: {
7481 DI->EmitAndRetainType(
7485 DI->completeUnusedClass(*CRD);
7488 for (
auto *I : CRD->
decls())
7494 case Decl::UsingShadow:
7495 case Decl::ClassTemplate:
7496 case Decl::VarTemplate:
7498 case Decl::VarTemplatePartialSpecialization:
7499 case Decl::FunctionTemplate:
7500 case Decl::TypeAliasTemplate:
7509 case Decl::UsingEnum:
7513 case Decl::NamespaceAlias:
7517 case Decl::UsingDirective:
7521 case Decl::CXXConstructor:
7524 case Decl::CXXDestructor:
7528 case Decl::StaticAssert:
7535 case Decl::ObjCInterface:
7536 case Decl::ObjCCategory:
7539 case Decl::ObjCProtocol: {
7541 if (Proto->isThisDeclarationADefinition())
7542 ObjCRuntime->GenerateProtocol(Proto);
7546 case Decl::ObjCCategoryImpl:
7552 case Decl::ObjCImplementation: {
7554 EmitObjCPropertyImplementations(OMD);
7555 EmitObjCIvarInitializations(OMD);
7556 ObjCRuntime->GenerateClass(OMD);
7560 DI->getOrCreateInterfaceType(
getContext().getObjCInterfaceType(
7561 OMD->getClassInterface()), OMD->getLocation());
7564 case Decl::ObjCMethod: {
7571 case Decl::ObjCCompatibleAlias:
7575 case Decl::PragmaComment: {
7577 switch (PCD->getCommentKind()) {
7579 llvm_unreachable(
"unexpected pragma comment kind");
7594 case Decl::PragmaDetectMismatch: {
7600 case Decl::LinkageSpec:
7604 case Decl::FileScopeAsm: {
7606 if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
7609 if (LangOpts.OpenMPIsTargetDevice)
7612 if (LangOpts.SYCLIsDevice)
7615 getModule().appendModuleInlineAsm(AD->getAsmString());
7619 case Decl::TopLevelStmt:
7623 case Decl::Import: {
7627 if (!ImportedModules.insert(Import->getImportedModule()))
7631 if (!Import->getImportedOwningModule()) {
7633 DI->EmitImportDecl(*Import);
7639 if (CXX20ModuleInits && Import->getImportedModule() &&
7640 Import->getImportedModule()->isNamedModule())
7649 Visited.insert(Import->getImportedModule());
7650 Stack.push_back(Import->getImportedModule());
7652 while (!Stack.empty()) {
7654 if (!EmittedModuleInitializers.insert(Mod).second)
7657 for (
auto *D : Context.getModuleInitializers(Mod))
7664 if (Submodule->IsExplicit)
7667 if (Visited.insert(Submodule).second)
7668 Stack.push_back(Submodule);
7678 case Decl::OMPThreadPrivate:
7682 case Decl::OMPAllocate:
7686 case Decl::OMPDeclareReduction:
7690 case Decl::OMPDeclareMapper:
7694 case Decl::OMPRequires:
7699 case Decl::TypeAlias:
7701 DI->EmitAndRetainType(
getContext().getTypedefType(
7709 DI->EmitAndRetainType(
7716 DI->EmitAndRetainType(
7720 case Decl::HLSLRootSignature:
7723 case Decl::HLSLBuffer:
7727 case Decl::OpenACCDeclare:
7730 case Decl::OpenACCRoutine:
7745 if (!CodeGenOpts.CoverageMapping)
7748 case Decl::CXXConversion:
7749 case Decl::CXXMethod:
7750 case Decl::Function:
7751 case Decl::ObjCMethod:
7752 case Decl::CXXConstructor:
7753 case Decl::CXXDestructor: {
7762 DeferredEmptyCoverageMappingDecls.try_emplace(D,
true);
7772 if (!CodeGenOpts.CoverageMapping)
7774 if (
const auto *Fn = dyn_cast<FunctionDecl>(D)) {
7775 if (Fn->isTemplateInstantiation())
7778 DeferredEmptyCoverageMappingDecls.insert_or_assign(D,
false);
7786 for (
const auto &Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {
7789 const Decl *D = Entry.first;
7791 case Decl::CXXConversion:
7792 case Decl::CXXMethod:
7793 case Decl::Function:
7794 case Decl::ObjCMethod: {
7801 case Decl::CXXConstructor: {
7808 case Decl::CXXDestructor: {
7825 if (llvm::Function *F =
getModule().getFunction(
"main")) {
7826 if (!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&
7827 F->getReturnType()->isIntegerTy(Context.getTargetInfo().getIntWidth())) {
7828 auto *GA = llvm::GlobalAlias::create(
"__main_void", F);
7829 GA->setVisibility(llvm::GlobalValue::HiddenVisibility);
7838 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
7839 return llvm::ConstantInt::get(i64, PtrInt);
7843 llvm::NamedMDNode *&GlobalMetadata,
7845 llvm::GlobalValue *
Addr) {
7846 if (!GlobalMetadata)
7848 CGM.
getModule().getOrInsertNamedMetadata(
"clang.global.decl.ptrs");
7851 llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(
Addr),
7854 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
7857bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
7858 llvm::GlobalValue *CppFunc) {
7860 llvm::SmallVector<llvm::GlobalIFunc *> IFuncs;
7863 llvm::SmallVector<llvm::ConstantExpr *> CEs;
7866 if (Elem == CppFunc)
7872 for (llvm::User *User : Elem->users()) {
7876 if (
auto *ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {
7877 if (ConstExpr->getOpcode() != llvm::Instruction::BitCast)
7880 for (llvm::User *CEUser : ConstExpr->users()) {
7881 if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {
7882 IFuncs.push_back(IFunc);
7887 CEs.push_back(ConstExpr);
7888 }
else if (
auto *IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {
7889 IFuncs.push_back(IFunc);
7901 for (llvm::GlobalIFunc *IFunc : IFuncs)
7902 IFunc->setResolver(
nullptr);
7903 for (llvm::ConstantExpr *ConstExpr : CEs)
7904 ConstExpr->destroyConstant();
7908 Elem->eraseFromParent();
7910 for (llvm::GlobalIFunc *IFunc : IFuncs) {
7915 llvm::FunctionType::get(IFunc->getType(),
false);
7916 llvm::Constant *Resolver = GetOrCreateLLVMFunction(
7917 CppFunc->getName(), ResolverTy, {},
false);
7918 IFunc->setResolver(Resolver);
7928void CodeGenModule::EmitStaticExternCAliases() {
7931 for (
auto &I : StaticExternCValues) {
7932 const IdentifierInfo *Name = I.first;
7933 llvm::GlobalValue *Val = I.second;
7941 llvm::GlobalValue *ExistingElem =
7946 if (!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))
7953 auto Res = Manglings.find(MangledName);
7954 if (Res == Manglings.end())
7956 Result = Res->getValue();
7967void CodeGenModule::EmitDeclMetadata() {
7968 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7970 for (
auto &I : MangledDeclNames) {
7971 llvm::GlobalValue *
Addr =
getModule().getNamedValue(I.second);
7981void CodeGenFunction::EmitDeclMetadata() {
7982 if (LocalDeclMap.empty())
return;
7987 unsigned DeclPtrKind = Context.getMDKindID(
"clang.decl.ptr");
7989 llvm::NamedMDNode *GlobalMetadata =
nullptr;
7991 for (
auto &I : LocalDeclMap) {
7992 const Decl *D = I.first;
7993 llvm::Value *
Addr = I.second.emitRawPointer(*
this);
7994 if (
auto *Alloca = dyn_cast<llvm::AllocaInst>(
Addr)) {
7996 Alloca->setMetadata(
7997 DeclPtrKind, llvm::MDNode::get(
7998 Context, llvm::ValueAsMetadata::getConstant(DAddr)));
7999 }
else if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr)) {
8006void CodeGenModule::EmitVersionIdentMetadata() {
8007 llvm::NamedMDNode *IdentMetadata =
8008 TheModule.getOrInsertNamedMetadata(
"llvm.ident");
8010 llvm::LLVMContext &Ctx = TheModule.getContext();
8012 llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
8013 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
8016void CodeGenModule::EmitCommandLineMetadata() {
8017 llvm::NamedMDNode *CommandLineMetadata =
8018 TheModule.getOrInsertNamedMetadata(
"llvm.commandline");
8020 llvm::LLVMContext &Ctx = TheModule.getContext();
8022 llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};
8023 CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));
8026void CodeGenModule::EmitCoverageFile() {
8027 llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(
"llvm.dbg.cu");
8031 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(
"llvm.gcov");
8032 llvm::LLVMContext &Ctx = TheModule.getContext();
8033 auto *CoverageDataFile =
8035 auto *CoverageNotesFile =
8037 for (
int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
8038 llvm::MDNode *CU = CUNode->getOperand(i);
8039 llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};
8040 GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
8053 LangOpts.ObjCRuntime.isGNUFamily())
8054 return ObjCRuntime->GetEHType(Ty);
8061 if (LangOpts.OpenMP && LangOpts.OpenMPSimd)
8063 for (
auto RefExpr : D->
varlist()) {
8066 VD->getAnyInitializer() &&
8067 !VD->getAnyInitializer()->isConstantInitializer(
getContext(),
8074 VD,
Addr, RefExpr->getBeginLoc(), PerformInit))
8075 CXXGlobalInits.push_back(InitFunction);
8080CodeGenModule::CreateMetadataIdentifierImpl(
QualType T, MetadataTypeMap &Map,
8084 FnType->getReturnType(), FnType->getParamTypes(),
8085 FnType->getExtProtoInfo().withExceptionSpec(
EST_None));
8087 llvm::Metadata *&InternalId = Map[
T.getCanonicalType()];
8092 std::string OutName;
8093 llvm::raw_string_ostream Out(OutName);
8098 Out <<
".normalized";
8121 return CreateMetadataIdentifierImpl(
T, MetadataIdMap,
"");
8126 return CreateMetadataIdentifierImpl(
T, VirtualMetadataIdMap,
".virtual");
8130 return CreateMetadataIdentifierImpl(
T, GeneralizedMetadataIdMap,
8138 return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) &&
8139 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) ||
8140 (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) &&
8141 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) ||
8142 (LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) &&
8143 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIDerivedCast)) ||
8144 (LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast) &&
8145 !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIUnrelatedCast)));
8153 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8155 if (CodeGenOpts.SanitizeCfiCrossDso)
8157 VTable->addTypeMetadata(Offset.getQuantity(),
8158 llvm::ConstantAsMetadata::get(CrossDsoTypeId));
8161 llvm::Metadata *MD = llvm::MDString::get(
getLLVMContext(),
"all-vtables");
8162 VTable->addTypeMetadata(Offset.getQuantity(), MD);
8168 SanStats = std::make_unique<llvm::SanitizerStatReport>(&
getModule());
8178 auto *FTy = llvm::FunctionType::get(SamplerT, {
C->getType()},
false);
8193 bool forPointeeType) {
8204 if (
auto Align = TT->getDecl()->getMaxAlignment()) {
8211 bool AlignForArray =
T->isArrayType();
8217 if (
T->isIncompleteType()) {
8234 if (
T.getQualifiers().hasUnaligned()) {
8236 }
else if (forPointeeType && !AlignForArray &&
8237 (RD =
T->getAsCXXRecordDecl())) {
8248 if (
unsigned MaxAlign =
getLangOpts().MaxTypeAlign) {
8261 if (NumAutoVarInit >= StopAfter) {
8264 if (!NumAutoVarInit) {
8267 "-ftrivial-auto-var-init-stop-after=%0 has been enabled to limit the "
8268 "number of times ftrivial-auto-var-init=%1 gets applied.");
8282 const Decl *D)
const {
8286 OS << (isa<VarDecl>(D) ?
".static." :
".intern.");
8288 OS << (isa<VarDecl>(D) ?
"__static__" :
"__intern__");
8294 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8298 llvm::MD5::MD5Result
Result;
8299 for (
const auto &Arg : PreprocessorOpts.Macros)
8300 Hash.update(Arg.first);
8304 llvm::sys::fs::UniqueID ID;
8308 assert(PLoc.
isValid() &&
"Source location is expected to be valid.");
8312 SM.getDiagnostics().Report(diag::err_cannot_open_file)
8313 << PLoc.
getFilename() << Status.getError().message();
8315 ID = Status->getUniqueID();
8317 OS << llvm::format(
"%x", ID.getFile()) << llvm::format(
"%x", ID.getDevice())
8318 <<
"_" << llvm::utohexstr(
Result.low(),
true, 8);
8325 assert(DeferredDeclsToEmit.empty() &&
8326 "Should have emitted all decls deferred to emit.");
8327 assert(NewBuilder->DeferredDecls.empty() &&
8328 "Newly created module should not have deferred decls");
8329 NewBuilder->DeferredDecls = std::move(DeferredDecls);
8330 assert(EmittedDeferredDecls.empty() &&
8331 "Still have (unmerged) EmittedDeferredDecls deferred decls");
8333 assert(NewBuilder->DeferredVTables.empty() &&
8334 "Newly created module should not have deferred vtables");
8335 NewBuilder->DeferredVTables = std::move(DeferredVTables);
8337 assert(NewBuilder->MangledDeclNames.empty() &&
8338 "Newly created module should not have mangled decl names");
8339 assert(NewBuilder->Manglings.empty() &&
8340 "Newly created module should not have manglings");
8341 NewBuilder->Manglings = std::move(Manglings);
8343 NewBuilder->WeakRefReferences = std::move(WeakRefReferences);
8345 NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
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 std::string getMangledNameImpl(CIRGenModule &cgm, GlobalDecl gd, const NamedDecl *nd)
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 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 bool hasImplicitAttr(const ValueDecl *D)
static void emitUsed(CodeGenModule &CGM, StringRef Name, std::vector< llvm::WeakTrackingVH > &List)
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 void setWindowsItaniumDLLImport(CodeGenModule &CGM, bool Local, llvm::Function *F, 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 bool hasUnwindExceptions(const LangOptions &LangOpts)
Determines whether the language options require us to model unwind exceptions.
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.
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
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.
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
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
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 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
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()
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)
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.
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.
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...
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.
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.
Address performAddrSpaceCast(CodeGen::CodeGenFunction &CGF, Address Addr, LangAS SrcAddr, llvm::Type *DestTy, bool IsNonNull=false) const
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 LangAS getASTAllocaAddressSpace() const
Get the AST address space for alloca.
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.
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
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.
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.
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
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.
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
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.
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.
ParsedAttr - Represents a syntactic attribute.
bool isAddressDiscriminated() const
uint16_t getConstantDiscrimination() const
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
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,...
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
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.
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,...
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.
const FunctionProtoType * T
StringRef languageToString(Language L)
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object 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::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
LangAS ASTAllocaAddressSpace
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
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.
Contains information gathered from parsing the contents of TargetAttr.
PointerAuthSchema InitFiniPointers
The ABI for function addresses in .init_array and .fini_array.
Describes how types, statements, expressions, and declarations should be printed.