A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://clang.llvm.org/doxygen/CodeGenModule_8cpp_source.html below:

clang: lib/CodeGen/CodeGenModule.cpp Source File

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/TimeProfiler.h" 70#include "llvm/Support/xxhash.h" 71#include "llvm/TargetParser/RISCVISAInfo.h" 72#include "llvm/TargetParser/Triple.h" 73#include "llvm/TargetParser/X86TargetParser.h" 74#include "llvm/Transforms/Utils/BuildLibCalls.h" 78using namespace clang

;

79using namespace

CodeGen;

82 "limited-coverage-experimental"

, llvm::cl::Hidden,

83

llvm::cl::desc(

"Emit limited coverage mapping information (experimental)"

));

89 case

TargetCXXABI::AppleARM64:

90 case

TargetCXXABI::Fuchsia:

91 case

TargetCXXABI::GenericAArch64:

92 case

TargetCXXABI::GenericARM:

93 case

TargetCXXABI::iOS:

94 case

TargetCXXABI::WatchOS:

95 case

TargetCXXABI::GenericMIPS:

96 case

TargetCXXABI::GenericItanium:

97 case

TargetCXXABI::WebAssembly:

98 case

TargetCXXABI::XL:

100 case

TargetCXXABI::Microsoft:

104

llvm_unreachable(

"invalid C++ ABI kind"

);

107static

std::unique_ptr<TargetCodeGenInfo>

113 switch

(Triple.getArch()) {

117 case

llvm::Triple::m68k:

119 case

llvm::Triple::mips:

120 case

llvm::Triple::mipsel:

121 if

(Triple.getOS() == llvm::Triple::NaCl)

123 else 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;

150 else if

(

Target

.getABI() ==

"pauthtest"

)

151

Kind = AArch64ABIKind::PAuthTest;

156 case

llvm::Triple::wasm32:

157 case

llvm::Triple::wasm64: {

159 if

(

Target

.getABI() ==

"experimental-mv"

)

160

Kind = WebAssemblyABIKind::ExperimentalMV;

164 case

llvm::Triple::arm:

165 case

llvm::Triple::armeb:

166 case

llvm::Triple::thumb:

167 case

llvm::Triple::thumbeb: {

168 if

(Triple.getOS() == llvm::Triple::Win32)

172

StringRef ABIStr =

Target

.getABI();

173 if

(ABIStr ==

"apcs-gnu"

)

174

Kind = ARMABIKind::APCS;

175 else if

(ABIStr ==

"aapcs16"

)

176

Kind = ARMABIKind::AAPCS16_VFP;

177 else if

(CodeGenOpts.

FloatABI

==

"hard"

||

178

(CodeGenOpts.

FloatABI

!=

"soft"

&& Triple.isHardFloatABI()))

179

Kind = ARMABIKind::AAPCS_VFP;

184 case

llvm::Triple::ppc: {

185 if

(Triple.isOSAIX())

192 case

llvm::Triple::ppcle: {

193 bool

IsSoftFloat = CodeGenOpts.

FloatABI

==

"soft"

;

196 case

llvm::Triple::ppc64:

197 if

(Triple.isOSAIX())

200 if

(Triple.isOSBinFormatELF()) {

202 if

(

Target

.getABI() ==

"elfv2"

)

203

Kind = PPC64_SVR4_ABIKind::ELFv2;

204 bool

IsSoftFloat = CodeGenOpts.

FloatABI

==

"soft"

;

209 case

llvm::Triple::ppc64le: {

210

assert(Triple.isOSBinFormatELF() &&

"PPC64 LE non-ELF not supported!"

);

212 if

(

Target

.getABI() ==

"elfv1"

)

213

Kind = PPC64_SVR4_ABIKind::ELFv1;

214 bool

IsSoftFloat = CodeGenOpts.

FloatABI

==

"soft"

;

219 case

llvm::Triple::nvptx:

220 case

llvm::Triple::nvptx64:

223 case

llvm::Triple::msp430:

226 case

llvm::Triple::riscv32:

227 case

llvm::Triple::riscv64: {

228

StringRef ABIStr =

Target

.getABI();

229 unsigned

XLen =

Target

.getPointerWidth(LangAS::Default);

230 unsigned

ABIFLen = 0;

231 if

(ABIStr.ends_with(

"f"

))

233 else if

(ABIStr.ends_with(

"d"

))

235 bool

EABI = ABIStr.ends_with(

"e"

);

239 case

llvm::Triple::systemz: {

240 bool

SoftFloat = CodeGenOpts.

FloatABI

==

"soft"

;

241 bool

HasVector = !SoftFloat &&

Target

.getABI() ==

"vector"

;

245 case

llvm::Triple::tce:

246 case

llvm::Triple::tcele:

249 case

llvm::Triple::x86: {

250 bool

IsDarwinVectorABI = Triple.isOSDarwin();

251 bool

IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();

253 if

(Triple.getOS() == llvm::Triple::Win32) {

255

CGM, IsDarwinVectorABI, IsWin32FloatStructABI,

256

CodeGenOpts.NumRegisterParameters);

259

CGM, IsDarwinVectorABI, IsWin32FloatStructABI,

260

CodeGenOpts.NumRegisterParameters, CodeGenOpts.

FloatABI

==

"soft"

);

263 case

llvm::Triple::x86_64: {

264

StringRef ABI =

Target

.getABI();

265 X86AVXABILevel

AVXLevel = (ABI ==

"avx512"

? X86AVXABILevel::AVX512

266

: ABI ==

"avx"

? X86AVXABILevel::AVX

267

: X86AVXABILevel::None);

269 switch

(Triple.getOS()) {

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"

))

323

CGM,

Target

.getPointerWidth(LangAS::Default), ABIFRLen);

329 if

(!TheTargetCodeGenInfo)

331 return

*TheTargetCodeGenInfo;

341

: Context(

C

), LangOpts(

C

.getLangOpts()), FS(FS), HeaderSearchOpts(HSO),

342

PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags),

344

VMContext(M.getContext()), VTables(*this), StackHandler(diags),

349

llvm::LLVMContext &LLVMContext = M.getContext();

350 VoidTy

= llvm::Type::getVoidTy(LLVMContext);

351 Int8Ty

= llvm::Type::getInt8Ty(LLVMContext);

352 Int16Ty

= llvm::Type::getInt16Ty(LLVMContext);

353 Int32Ty

= llvm::Type::getInt32Ty(LLVMContext);

354 Int64Ty

= llvm::Type::getInt64Ty(LLVMContext);

355 HalfTy

= llvm::Type::getHalfTy(LLVMContext);

356 BFloatTy

= llvm::Type::getBFloatTy(LLVMContext);

357 FloatTy

= llvm::Type::getFloatTy(LLVMContext);

358 DoubleTy

= llvm::Type::getDoubleTy(LLVMContext);

364 C

.toCharUnitsFromBits(

C

.getTargetInfo().getMaxPointerWidth()).getQuantity();

366 C

.toCharUnitsFromBits(

C

.getTargetInfo().getIntAlign()).getQuantity();

368

llvm::IntegerType::get(LLVMContext,

C

.getTargetInfo().getCharWidth());

369 IntTy

= llvm::IntegerType::get(LLVMContext,

C

.getTargetInfo().getIntWidth());

370 IntPtrTy

= llvm::IntegerType::get(LLVMContext,

371 C

.getTargetInfo().getMaxPointerWidth());

372 Int8PtrTy

= llvm::PointerType::get(LLVMContext,

374 const

llvm::DataLayout &DL = M.getDataLayout();

376

llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());

378

llvm::PointerType::get(LLVMContext, DL.getDefaultGlobalsAddressSpace());

395

createOpenCLRuntime();

397

createOpenMPRuntime();

404 if

(LangOpts.

Sanitize

.

hasOneOf

(SanitizerKind::Thread | SanitizerKind::Type) ||

405

(!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))

411 if

(CodeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo ||

416

Block.GlobalUniqueCount = 0;

418 if

(

C

.getLangOpts().ObjC)

422 auto

ReaderOrErr = llvm::IndexedInstrProfReader::create(

429

PGOReader = std::move(ReaderOrErr.get());

434 if

(CodeGenOpts.CoverageMapping)

438 if

(CodeGenOpts.UniqueInternalLinkageNames &&

439

!

getModule

().getSourceFileName().empty()) {

443 if

(

Path

.rfind(Entry.first, 0) != std::string::npos) {

444 Path

= Entry.second +

Path

.substr(Entry.first.size());

447

ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(

Path

);

452 getModule

().addModuleFlag(llvm::Module::Error,

"NumRegisterParameters"

,

453

CodeGenOpts.NumRegisterParameters);

458void

CodeGenModule::createObjCRuntime() {

475

llvm_unreachable(

"bad runtime kind"

);

478void

CodeGenModule::createOpenCLRuntime() {

482void

CodeGenModule::createOpenMPRuntime() {

486 case

llvm::Triple::nvptx:

487 case

llvm::Triple::nvptx64:

488 case

llvm::Triple::amdgcn:

490 "OpenMP AMDGPU/NVPTX is only prepared to deal with device code."

);

494 if

(LangOpts.OpenMPSimd)

502void

CodeGenModule::createCUDARuntime() {

506void

CodeGenModule::createHLSLRuntime() {

511

Replacements[Name] =

C

;

514void

CodeGenModule::applyReplacements() {

515 for

(

auto

&I : Replacements) {

516

StringRef MangledName = I.first;

517

llvm::Constant *Replacement = I.second;

521 auto

*OldF = cast<llvm::Function>(Entry);

522 auto

*NewF = dyn_cast<llvm::Function>(Replacement);

524 if

(

auto

*Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {

525

NewF = dyn_cast<llvm::Function>(Alias->getAliasee());

527 auto

*CE = cast<llvm::ConstantExpr>(Replacement);

528

assert(CE->getOpcode() == llvm::Instruction::BitCast ||

529

CE->getOpcode() == llvm::Instruction::GetElementPtr);

530

NewF = dyn_cast<llvm::Function>(CE->getOperand(0));

535

OldF->replaceAllUsesWith(Replacement);

537

NewF->removeFromParent();

538

OldF->getParent()->getFunctionList().insertAfter(OldF->getIterator(),

541

OldF->eraseFromParent();

546

GlobalValReplacements.push_back(std::make_pair(GV,

C

));

549void

CodeGenModule::applyGlobalValReplacements() {

550 for

(

auto

&I : GlobalValReplacements) {

551

llvm::GlobalValue *GV = I.first;

552

llvm::Constant *

C

= I.second;

554

GV->replaceAllUsesWith(

C

);

555

GV->eraseFromParent();

562 const

llvm::Constant *

C

;

563 if

(

auto

*GA = dyn_cast<llvm::GlobalAlias>(GV))

564 C

= GA->getAliasee();

565 else if

(

auto

*GI = dyn_cast<llvm::GlobalIFunc>(GV))

566 C

= GI->getResolver();

570 const auto

*AliaseeGV = dyn_cast<llvm::GlobalValue>(

C

->stripPointerCasts());

574 const

llvm::GlobalValue *FinalGV = AliaseeGV->getAliaseeObject();

583 bool

IsIFunc,

const

llvm::GlobalValue *Alias,

const

llvm::GlobalValue *&GV,

584 const

llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames,

588

Diags.

Report

(Location, diag::err_cyclic_alias) << IsIFunc;

592 if

(GV->hasCommonLinkage()) {

594 if

(Triple.getObjectFormat() == llvm::Triple::XCOFF) {

595

Diags.

Report

(Location, diag::err_alias_to_common);

600 if

(GV->isDeclaration()) {

601

Diags.

Report

(Location, diag::err_alias_to_undefined) << IsIFunc << IsIFunc;

602

Diags.

Report

(Location, diag::note_alias_requires_mangled_name)

603

<< IsIFunc << IsIFunc;

606 for

(

const auto

&[

Decl

, Name] : MangledDeclNames) {

607 if

(

const auto

*ND = dyn_cast<NamedDecl>(

Decl

.getDecl())) {

609 if

(II && II->

getName

() == GV->getName()) {

610

Diags.

Report

(Location, diag::note_alias_mangled_name_alternative)

614

(Twine(IsIFunc ?

"ifunc"

:

"alias"

) +

"(\""

+ Name +

"\")"

)

624 const auto

*F = dyn_cast<llvm::Function>(GV);

626

Diags.

Report

(Location, diag::err_alias_to_undefined)

627

<< IsIFunc << IsIFunc;

631

llvm::FunctionType *FTy = F->getFunctionType();

632 if

(!FTy->getReturnType()->isPointerTy()) {

633

Diags.

Report

(Location, diag::err_ifunc_resolver_return);

647 if

(GVar->hasAttribute(

"toc-data"

)) {

648 auto

GVId = GVar->getName();

651

Diags.

Report

(Location, diag::warn_toc_unsupported_type)

652

<< GVId <<

"the variable has an alias"

;

654

llvm::AttributeSet CurrAttributes = GVar->getAttributes();

655

llvm::AttributeSet NewAttributes =

656

CurrAttributes.removeAttribute(GVar->getContext(),

"toc-data"

);

657

GVar->setAttributes(NewAttributes);

661void

CodeGenModule::checkAliases() {

668 const auto

*

D

= cast<ValueDecl>(GD.getDecl());

671 bool

IsIFunc =

D

->

hasAttr

<IFuncAttr>();

673

Location = A->getLocation();

674 Range

= A->getRange();

676

llvm_unreachable(

"Not an alias or ifunc?"

);

680 const

llvm::GlobalValue *GV =

nullptr

;

682

MangledDeclNames,

Range

)) {

688 if

(

const

llvm::GlobalVariable *GVar =

689

dyn_cast<const llvm::GlobalVariable>(GV))

693

llvm::Constant *Aliasee =

694

IsIFunc ? cast<llvm::GlobalIFunc>(Alias)->getResolver()

695

: cast<llvm::GlobalAlias>(Alias)->getAliasee();

697

llvm::GlobalValue *AliaseeGV;

698 if

(

auto

CE = dyn_cast<llvm::ConstantExpr>(Aliasee))

699

AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0));

701

AliaseeGV = cast<llvm::GlobalValue>(Aliasee);

703 if

(

const

SectionAttr *SA =

D

->

getAttr

<SectionAttr>()) {

704

StringRef AliasSection = SA->getName();

705 if

(AliasSection != AliaseeGV->getSection())

706

Diags.

Report

(SA->getLocation(), diag::warn_alias_with_section)

707

<< AliasSection << IsIFunc << IsIFunc;

715 if

(

auto

*GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {

716 if

(GA->isInterposable()) {

717

Diags.

Report

(Location, diag::warn_alias_to_weak_alias)

718

<< GV->getName() << GA->getName() << IsIFunc;

719

Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(

720

GA->getAliasee(), Alias->getType());

723

cast<llvm::GlobalIFunc>(Alias)->setResolver(Aliasee);

725

cast<llvm::GlobalAlias>(Alias)->setAliasee(Aliasee);

731

cast<llvm::Function>(Aliasee)->addFnAttr(

732

llvm::Attribute::DisableSanitizerInstrumentation);

740

Alias->replaceAllUsesWith(llvm::PoisonValue::get(Alias->getType()));

741

Alias->eraseFromParent();

746

DeferredDeclsToEmit.clear();

747

EmittedDeferredDecls.clear();

748

DeferredAnnotations.clear();

750

OpenMPRuntime->clear();

754

StringRef MainFile) {

757 if

(VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {

758 if

(MainFile.empty())

759

MainFile =

"<stdin>"

;

760

Diags.

Report

(diag::warn_profile_data_unprofiled) << MainFile;

763

Diags.

Report

(diag::warn_profile_data_out_of_date) << Visited << Mismatched;

766

Diags.

Report

(diag::warn_profile_data_missing) << Visited << Missing;

770static

std::optional<llvm::GlobalValue::VisibilityTypes>

777 return

llvm::GlobalValue::DefaultVisibility;

779 return

llvm::GlobalValue::HiddenVisibility;

781 return

llvm::GlobalValue::ProtectedVisibility;

783

llvm_unreachable(

"unknown option value!"

);

788

std::optional<llvm::GlobalValue::VisibilityTypes>

V

) {

797

GV.setDSOLocal(

false

);

798

GV.setVisibility(*

V

);

803 if

(!LO.VisibilityFromDLLStorageClass)

806

std::optional<llvm::GlobalValue::VisibilityTypes> DLLExportVisibility =

809

std::optional<llvm::GlobalValue::VisibilityTypes>

810

NoDLLStorageClassVisibility =

813

std::optional<llvm::GlobalValue::VisibilityTypes>

814

ExternDeclDLLImportVisibility =

817

std::optional<llvm::GlobalValue::VisibilityTypes>

818

ExternDeclNoDLLStorageClassVisibility =

821 for

(llvm::GlobalValue &GV : M.global_values()) {

822 if

(GV.hasAppendingLinkage() || GV.hasLocalLinkage())

825 if

(GV.isDeclarationForLinker())

827

llvm::GlobalValue::DLLImportStorageClass

828

? ExternDeclDLLImportVisibility

829

: ExternDeclNoDLLStorageClassVisibility);

832

llvm::GlobalValue::DLLExportStorageClass

833

? DLLExportVisibility

834

: NoDLLStorageClassVisibility);

836

GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);

841 const

llvm::Triple &Triple,

843 if

(Triple.isAMDGPU() || Triple.isNVPTX())

845 return

LangOpts.getStackProtector() == Mode;

851

EmitModuleInitializers(Primary);

853

DeferredDecls.insert(EmittedDeferredDecls.begin(),

854

EmittedDeferredDecls.end());

855

EmittedDeferredDecls.clear();

856

EmitVTablesOpportunistically();

857

applyGlobalValReplacements();

859

emitMultiVersionFunctions();

861 if

(Context.

getLangOpts

().IncrementalExtensions &&

862

GlobalTopLevelStmtBlockInFlight.first) {

864

GlobalTopLevelStmtBlockInFlight.first->FinishFunction(TLSD->

getEndLoc

());

865

GlobalTopLevelStmtBlockInFlight = {

nullptr

,

nullptr

};

871

EmitCXXModuleInitFunc(Primary);

873

EmitCXXGlobalInitFunc();

874

EmitCXXGlobalCleanUpFunc();

875

registerGlobalDtorsWithAtExit();

876

EmitCXXThreadLocalInitFunc();

878 if

(llvm::Function *ObjCInitFunction =

ObjCRuntime

->ModuleInitFunction())

881 if

(llvm::Function *CudaCtorFunction = CUDARuntime->finalizeModule())

885

OpenMPRuntime->createOffloadEntriesAndInfoMetadata();

886

OpenMPRuntime->clear();

890

PGOReader->getSummary(

false

).getMD(VMContext),

891

llvm::ProfileSummary::PSK_Instr);

898

EmitCtorList(GlobalCtors,

"llvm.global_ctors"

);

899

EmitCtorList(GlobalDtors,

"llvm.global_dtors"

);

901

EmitStaticExternCAliases();

907

CoverageMapping->emit();

908 if

(CodeGenOpts.SanitizeCfiCrossDso) {

912 if

(LangOpts.

Sanitize

.

has

(SanitizerKind::KCFI))

914

emitAtAvailableLinkGuard();

922 if

(

getTarget

().getTargetOpts().CodeObjectVersion !=

923

llvm::CodeObjectVersionKind::COV_None) {

924 getModule

().addModuleFlag(llvm::Module::Error,

925 "amdhsa_code_object_version"

,

926 getTarget

().getTargetOpts().CodeObjectVersion);

931 auto

*MDStr = llvm::MDString::get(

936 getModule

().addModuleFlag(llvm::Module::Error,

"amdgpu_printf_kind"

,

949 if

(

auto

*FD = dyn_cast<FunctionDecl>(

D

))

953

UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(

957

llvm::ArrayType *ATy = llvm::ArrayType::get(

Int8PtrTy

, UsedArray.size());

959 auto

*GV =

new

llvm::GlobalVariable(

960 getModule

(), ATy,

false

, llvm::GlobalValue::InternalLinkage,

961

llvm::ConstantArray::get(ATy, UsedArray),

"__clang_gpu_used_external"

);

964 if

(LangOpts.HIP && !

getLangOpts

().OffloadingNewDriver) {

967 auto

*GV =

new

llvm::GlobalVariable(

969

llvm::Constant::getNullValue(

Int8Ty

),

977 if

(CodeGenOpts.Autolink &&

978

(Context.

getLangOpts

().Modules || !LinkerOptionsMetadata.empty())) {

979

EmitModuleLinkOptions();

994 if

(!ELFDependentLibraries.empty() && !Context.

getLangOpts

().CUDAIsDevice) {

995 auto

*NMD =

getModule

().getOrInsertNamedMetadata(

"llvm.dependent-libraries"

);

996 for

(

auto

*MD : ELFDependentLibraries)

1000 if

(CodeGenOpts.DwarfVersion) {

1001 getModule

().addModuleFlag(llvm::Module::Max,

"Dwarf Version"

,

1002

CodeGenOpts.DwarfVersion);

1005 if

(CodeGenOpts.Dwarf64)

1006 getModule

().addModuleFlag(llvm::Module::Max,

"DWARF64"

, 1);

1008 if

(Context.

getLangOpts

().SemanticInterposition)

1010 getModule

().setSemanticInterposition(

true

);

1012 if

(CodeGenOpts.EmitCodeView) {

1014 getModule

().addModuleFlag(llvm::Module::Warning,

"CodeView"

, 1);

1016 if

(CodeGenOpts.CodeViewGHash) {

1017 getModule

().addModuleFlag(llvm::Module::Warning,

"CodeViewGHash"

, 1);

1019 if

(CodeGenOpts.ControlFlowGuard) {

1021 getModule

().addModuleFlag(llvm::Module::Warning,

"cfguard"

, 2);

1022

}

else if

(CodeGenOpts.ControlFlowGuardNoChecks) {

1024 getModule

().addModuleFlag(llvm::Module::Warning,

"cfguard"

, 1);

1026 if

(CodeGenOpts.EHContGuard) {

1028 getModule

().addModuleFlag(llvm::Module::Warning,

"ehcontguard"

, 1);

1032 getModule

().addModuleFlag(llvm::Module::Warning,

"ms-kernel"

, 1);

1034 if

(CodeGenOpts.OptimizationLevel > 0 && CodeGenOpts.StrictVTablePointers) {

1039 getModule

().addModuleFlag(llvm::Module::Error,

"StrictVTablePointers"

,1);

1041

llvm::Metadata *Ops[2] = {

1042

llvm::MDString::get(VMContext,

"StrictVTablePointers"

),

1043

llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(

1044

llvm::Type::getInt32Ty(VMContext), 1))};

1046 getModule

().addModuleFlag(llvm::Module::Require,

1047 "StrictVTablePointersRequirement"

,

1048

llvm::MDNode::get(VMContext, Ops));

1054 getModule

().addModuleFlag(llvm::Module::Warning,

"Debug Info Version"

,

1055

llvm::DEBUG_METADATA_VERSION);

1060

uint64_t WCharWidth =

1062 getModule

().addModuleFlag(llvm::Module::Error,

"wchar_size"

, WCharWidth);

1065 getModule

().addModuleFlag(llvm::Module::Warning,

1066 "zos_product_major_version"

,

1067

uint32_t(CLANG_VERSION_MAJOR));

1068 getModule

().addModuleFlag(llvm::Module::Warning,

1069 "zos_product_minor_version"

,

1070

uint32_t(CLANG_VERSION_MINOR));

1071 getModule

().addModuleFlag(llvm::Module::Warning,

"zos_product_patchlevel"

,

1072

uint32_t(CLANG_VERSION_PATCHLEVEL));

1074 getModule

().addModuleFlag(llvm::Module::Error,

"zos_product_id"

,

1075

llvm::MDString::get(VMContext, ProductId));

1080 getModule

().addModuleFlag(llvm::Module::Error,

"zos_cu_language"

,

1081

llvm::MDString::get(VMContext, lang_str));

1085

: std::time(

nullptr

);

1086 getModule

().addModuleFlag(llvm::Module::Max,

"zos_translation_time"

,

1087 static_cast<

uint64_t

>

(TT));

1090 getModule

().addModuleFlag(llvm::Module::Error,

"zos_le_char_mode"

,

1091

llvm::MDString::get(VMContext,

"ascii"

));

1095 if

(

T

.isARM() ||

T

.isThumb()) {

1097

uint64_t EnumWidth = Context.

getLangOpts

().ShortEnums ? 1 : 4;

1098 getModule

().addModuleFlag(llvm::Module::Error,

"min_enum_size"

, EnumWidth);

1101 if

(

T

.isRISCV()) {

1102

StringRef ABIStr =

Target

.getABI();

1103

llvm::LLVMContext &Ctx = TheModule.getContext();

1104 getModule

().addModuleFlag(llvm::Module::Error,

"target-abi"

,

1105

llvm::MDString::get(Ctx, ABIStr));

1110 const

std::vector<std::string> &Features =

1113

llvm::RISCVISAInfo::parseFeatures(

T

.isRISCV64() ? 64 : 32, Features);

1114 if

(!errorToBool(ParseResult.takeError()))

1116

llvm::Module::AppendUnique,

"riscv-isa"

,

1118

Ctx, llvm::MDString::get(Ctx, (*ParseResult)->toString())));

1121 if

(CodeGenOpts.SanitizeCfiCrossDso) {

1123 getModule

().addModuleFlag(llvm::Module::Override,

"Cross-DSO CFI"

, 1);

1126 if

(CodeGenOpts.WholeProgramVTables) {

1130 getModule

().addModuleFlag(llvm::Module::Error,

"Virtual Function Elim"

,

1131

CodeGenOpts.VirtualFunctionElimination);

1134 if

(LangOpts.

Sanitize

.

has

(SanitizerKind::CFIICall)) {

1135 getModule

().addModuleFlag(llvm::Module::Override,

1136 "CFI Canonical Jump Tables"

,

1137

CodeGenOpts.SanitizeCfiCanonicalJumpTables);

1140 if

(CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {

1141 getModule

().addModuleFlag(llvm::Module::Override,

"cfi-normalize-integers"

,

1145 if

(LangOpts.

Sanitize

.

has

(SanitizerKind::KCFI)) {

1146 getModule

().addModuleFlag(llvm::Module::Override,

"kcfi"

, 1);

1149 if

(CodeGenOpts.PatchableFunctionEntryOffset)

1150 getModule

().addModuleFlag(llvm::Module::Override,

"kcfi-offset"

,

1151

CodeGenOpts.PatchableFunctionEntryOffset);

1154 if

(CodeGenOpts.CFProtectionReturn &&

1157 getModule

().addModuleFlag(llvm::Module::Min,

"cf-protection-return"

,

1161 if

(CodeGenOpts.CFProtectionBranch &&

1164 getModule

().addModuleFlag(llvm::Module::Min,

"cf-protection-branch"

,

1167 auto

Scheme = CodeGenOpts.getCFBranchLabelScheme();

1168 if

(

Target

.checkCFBranchLabelSchemeSupported(Scheme,

getDiags

())) {

1170

Scheme =

Target

.getDefaultCFBranchLabelScheme();

1172

llvm::Module::Error,

"cf-branch-label-scheme"

,

1178 if

(CodeGenOpts.FunctionReturnThunks)

1179 getModule

().addModuleFlag(llvm::Module::Override,

"function_return_thunk_extern"

, 1);

1181 if

(CodeGenOpts.IndirectBranchCSPrefix)

1182 getModule

().addModuleFlag(llvm::Module::Override,

"indirect_branch_cs_prefix"

, 1);

1194

LangOpts.getSignReturnAddressScope() !=

1196 getModule

().addModuleFlag(llvm::Module::Override,

1197 "sign-return-address-buildattr"

, 1);

1198 if

(LangOpts.

Sanitize

.

has

(SanitizerKind::MemtagStack))

1199 getModule

().addModuleFlag(llvm::Module::Override,

1200 "tag-stack-memory-buildattr"

, 1);

1202 if

(

T

.isARM() ||

T

.isThumb() ||

T

.isAArch64()) {

1203 if

(LangOpts.BranchTargetEnforcement)

1204 getModule

().addModuleFlag(llvm::Module::Min,

"branch-target-enforcement"

,

1206 if

(LangOpts.BranchProtectionPAuthLR)

1207 getModule

().addModuleFlag(llvm::Module::Min,

"branch-protection-pauth-lr"

,

1209 if

(LangOpts.GuardedControlStack)

1210 getModule

().addModuleFlag(llvm::Module::Min,

"guarded-control-stack"

, 1);

1212 getModule

().addModuleFlag(llvm::Module::Min,

"sign-return-address"

, 1);

1214 getModule

().addModuleFlag(llvm::Module::Min,

"sign-return-address-all"

,

1217 getModule

().addModuleFlag(llvm::Module::Min,

1218 "sign-return-address-with-bkey"

, 1);

1220 if

(LangOpts.PointerAuthELFGOT)

1221 getModule

().addModuleFlag(llvm::Module::Min,

"ptrauth-elf-got"

, 1);

1224 if

(LangOpts.PointerAuthCalls)

1225 getModule

().addModuleFlag(llvm::Module::Min,

"ptrauth-sign-personality"

,

1227

assert(

getTriple

().isOSBinFormatELF());

1228 using namespace

llvm::ELF;

1229

uint64_t PAuthABIVersion =

1230

(LangOpts.PointerAuthIntrinsics

1231

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |

1232

(LangOpts.PointerAuthCalls

1233

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |

1234

(LangOpts.PointerAuthReturns

1235

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |

1236

(LangOpts.PointerAuthAuthTraps

1237

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |

1238

(LangOpts.PointerAuthVTPtrAddressDiscrimination

1239

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |

1240

(LangOpts.PointerAuthVTPtrTypeDiscrimination

1241

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |

1242

(LangOpts.PointerAuthInitFini

1243

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |

1244

(LangOpts.PointerAuthInitFiniAddressDiscrimination

1245

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |

1246

(LangOpts.PointerAuthELFGOT

1247

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT) |

1248

(LangOpts.PointerAuthIndirectGotos

1249

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOTOS) |

1250

(LangOpts.PointerAuthTypeInfoVTPtrDiscrimination

1251

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_TYPEINFOVPTRDISCR) |

1252

(LangOpts.PointerAuthFunctionTypeDiscrimination

1253

<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR);

1254 static_assert

(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==

1255

AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,

1256 "Update when new enum items are defined"

);

1257 if

(PAuthABIVersion != 0) {

1258 getModule

().addModuleFlag(llvm::Module::Error,

1259 "aarch64-elf-pauthabi-platform"

,

1260

AARCH64_PAUTH_PLATFORM_LLVM_LINUX);

1261 getModule

().addModuleFlag(llvm::Module::Error,

1262 "aarch64-elf-pauthabi-version"

,

1268 if

(CodeGenOpts.StackClashProtector)

1270

llvm::Module::Override,

"probe-stack"

,

1271

llvm::MDString::get(TheModule.getContext(),

"inline-asm"

));

1273 if

(CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)

1274 getModule

().addModuleFlag(llvm::Module::Min,

"stack-probe-size"

,

1275

CodeGenOpts.StackProbeSize);

1278

llvm::LLVMContext &Ctx = TheModule.getContext();

1280

llvm::Module::Error,

"MemProfProfileFilename"

,

1284 if

(LangOpts.CUDAIsDevice &&

getTriple

().isNVPTX()) {

1288 getModule

().addModuleFlag(llvm::Module::Override,

"nvvm-reflect-ftz"

,

1290

llvm::DenormalMode::IEEE);

1293 if

(LangOpts.EHAsynch)

1294 getModule

().addModuleFlag(llvm::Module::Warning,

"eh-asynch"

, 1);

1297 if

(CodeGenOpts.ImportCallOptimization)

1298 getModule

().addModuleFlag(llvm::Module::Warning,

"import-call-optimization"

,

1303 getModule

().addModuleFlag(llvm::Module::Max,

"openmp"

, LangOpts.OpenMP);

1305 getModule

().addModuleFlag(llvm::Module::Max,

"openmp-device"

,

1309 if

(LangOpts.OpenCL || (LangOpts.CUDAIsDevice &&

getTriple

().isSPIRV())) {

1310

EmitOpenCLMetadata();

1318

llvm::Metadata *SPIRVerElts[] = {

1319

llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(

1321

llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(

1322 Int32Ty

, (Version / 100 > 1) ? 0 : 2))};

1323

llvm::NamedMDNode *SPIRVerMD =

1324

TheModule.getOrInsertNamedMetadata(

"opencl.spir.version"

);

1325

llvm::LLVMContext &Ctx = TheModule.getContext();

1326

SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));

1334 if

(uint32_t PLevel = Context.

getLangOpts

().PICLevel) {

1335

assert(PLevel < 3 &&

"Invalid PIC Level"

);

1336 getModule

().setPICLevel(

static_cast<

llvm::PICLevel::Level

>

(PLevel));

1338 getModule

().setPIELevel(

static_cast<

llvm::PIELevel::Level

>

(PLevel));

1342 unsigned

CM = llvm::StringSwitch<unsigned>(

getCodeGenOpts

().CodeModel)

1343

.Case(

"tiny"

, llvm::CodeModel::Tiny)

1344

.Case(

"small"

, llvm::CodeModel::Small)

1345

.Case(

"kernel"

, llvm::CodeModel::Kernel)

1346

.Case(

"medium"

, llvm::CodeModel::Medium)

1347

.Case(

"large"

, llvm::CodeModel::Large)

1350

llvm::CodeModel::Model codeModel =

static_cast<

llvm::CodeModel::Model

>

(CM);

1353 if

((CM == llvm::CodeModel::Medium || CM == llvm::CodeModel::Large) &&

1355

llvm::Triple::x86_64) {

1361 if

(CodeGenOpts.NoPLT)

1364

CodeGenOpts.DirectAccessExternalData !=

1365 getModule

().getDirectAccessExternalData()) {

1366 getModule

().setDirectAccessExternalData(

1367

CodeGenOpts.DirectAccessExternalData);

1369 if

(CodeGenOpts.UnwindTables)

1370 getModule

().setUwtable(llvm::UWTableKind(CodeGenOpts.UnwindTables));

1372 switch

(CodeGenOpts.getFramePointer()) {

1377 getModule

().setFramePointer(llvm::FramePointerKind::Reserved);

1380 getModule

().setFramePointer(llvm::FramePointerKind::NonLeaf);

1383 getModule

().setFramePointer(llvm::FramePointerKind::All);

1387

SimplifyPersonality();

1400

EmitVersionIdentMetadata();

1403

EmitCommandLineMetadata();

1411 getModule

().setStackProtectorGuardSymbol(

1414 getModule

().setStackProtectorGuardOffset(

1419 getModule

().addModuleFlag(llvm::Module::Override,

"SkipRaxSetup"

, 1);

1421 getModule

().addModuleFlag(llvm::Module::Override,

"RegCallv4"

, 1);

1423 if

(

getContext

().getTargetInfo().getMaxTLSAlign())

1424 getModule

().addModuleFlag(llvm::Module::Error,

"MaxTLSAlign"

,

1425 getContext

().getTargetInfo().getMaxTLSAlign());

1443 if

(

getTriple

().isPPC() && !MustTailCallUndefinedGlobals.empty()) {

1444 for

(

auto

&I : MustTailCallUndefinedGlobals) {

1445 if

(!I.first->isDefined())

1446 getDiags

().

Report

(I.second, diag::err_ppc_impossible_musttail) << 2;

1450 if

(!Entry || Entry->isWeakForLinker() ||

1451

Entry->isDeclarationForLinker())

1452 getDiags

().

Report

(I.second, diag::err_ppc_impossible_musttail) << 2;

1458void

CodeGenModule::EmitOpenCLMetadata() {

1464 auto

EmitVersion = [

this

](StringRef MDName,

int

Version) {

1465

llvm::Metadata *OCLVerElts[] = {

1466

llvm::ConstantAsMetadata::get(

1467

llvm::ConstantInt::get(

Int32Ty

, Version / 100)),

1468

llvm::ConstantAsMetadata::get(

1469

llvm::ConstantInt::get(

Int32Ty

, (Version % 100) / 10))};

1470

llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName);

1471

llvm::LLVMContext &Ctx = TheModule.getContext();

1472

OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));

1475

EmitVersion(

"opencl.ocl.version"

, CLVersion);

1476 if

(LangOpts.OpenCLCPlusPlus) {

1478

EmitVersion(

"opencl.cxx.version"

, LangOpts.OpenCLCPlusPlusVersion);

1482void

CodeGenModule::EmitBackendOptionsMetadata(

1485 getModule

().addModuleFlag(llvm::Module::Min,

"SmallDataLimit"

,

1486

CodeGenOpts.SmallDataLimit);

1503 return

TBAA->getTypeInfo(QTy);

1522 return

TBAA->getAccessInfo(AccessType);

1529 return

TBAA->getVTablePtrAccessInfo(VTablePtrType);

1535 return

TBAA->getTBAAStructInfo(QTy);

1541 return

TBAA->getBaseTypeInfo(QTy);

1547 return

TBAA->getAccessTagInfo(Info);

1554 return

TBAA->mergeTBAAInfoForCast(SourceInfo,

TargetInfo

);

1562 return

TBAA->mergeTBAAInfoForConditionalOperator(InfoA, InfoB);

1570 return

TBAA->mergeTBAAInfoForConditionalOperator(DestInfo, SrcInfo);

1576

Inst->setMetadata(llvm::LLVMContext::MD_tbaa, Tag);

1581

I->setMetadata(llvm::LLVMContext::MD_invariant_group,

1594 "cannot compile this %0 yet"

);

1595

std::string Msg =

Type

;

1597

<< Msg << S->getSourceRange();

1604 "cannot compile this %0 yet"

);

1605

std::string Msg =

Type

;

1610

llvm::function_ref<

void

()> Fn) {

1621 if

(GV->hasLocalLinkage()) {

1622

GV->setVisibility(llvm::GlobalValue::DefaultVisibility);

1636

Context.

getLangOpts

().OpenMPIsTargetDevice && isa<VarDecl>(

D

) &&

1637 D

->

hasAttr

<OMPDeclareTargetDeclAttr>() &&

1638 D

->

getAttr

<OMPDeclareTargetDeclAttr>()->getDevType() !=

1639

OMPDeclareTargetDeclAttr::DT_NoHost &&

1641

GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);

1645 if

(GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {

1649 if

(GV->hasDLLExportStorageClass()) {

1652

diag::err_hidden_visibility_dllexport);

1655

diag::err_non_default_visibility_dllimport);

1661

!GV->isDeclarationForLinker())

1666

llvm::GlobalValue *GV) {

1667 if

(GV->hasLocalLinkage())

1670 if

(!GV->hasDefaultVisibility() && !GV->hasExternalWeakLinkage())

1674 if

(GV->hasDLLImportStorageClass())

1677 const

llvm::Triple &TT = CGM.

getTriple

();

1679 if

(TT.isWindowsGNUEnvironment()) {

1688 if

(GV->isDeclarationForLinker() && isa<llvm::GlobalVariable>(GV) &&

1697 if

(TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())

1705 if

(TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))

1709 if

(!TT.isOSBinFormatELF())

1715 if

(RM != llvm::Reloc::Static && !LOpts.PIE) {

1721 if

(!(isa<llvm::Function>(GV) && GV->canBenefitFromLocalAlias()))

1723 return

!(CGM.

getLangOpts

().SemanticInterposition ||

1728 if

(!GV->isDeclarationForLinker())

1734 if

(RM == llvm::Reloc::PIC_ && GV->hasExternalWeakLinkage())

1741 if

(CGOpts.DirectAccessExternalData) {

1747 if

(

auto

*Var = dyn_cast<llvm::GlobalVariable>(GV))

1748 if

(!Var->isThreadLocal())

1757 if

(isa<llvm::Function>(GV) && !CGOpts.NoPLT && RM == llvm::Reloc::Static)

1773 const auto

*

D

= dyn_cast<NamedDecl>(GD.

getDecl

());

1775 if

(

const auto

*Dtor = dyn_cast_or_null<CXXDestructorDecl>(

D

)) {

1784 if

(

D

&&

D

->isExternallyVisible()) {

1785 if

(

D

->

hasAttr

<DLLImportAttr>())

1786

GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);

1787 else if

((

D

->

hasAttr

<DLLExportAttr>() ||

1789

!GV->isDeclarationForLinker())

1790

GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);

1814 return

llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)

1815

.Case(

"global-dynamic"

, llvm::GlobalVariable::GeneralDynamicTLSModel)

1816

.Case(

"local-dynamic"

, llvm::GlobalVariable::LocalDynamicTLSModel)

1817

.Case(

"initial-exec"

, llvm::GlobalVariable::InitialExecTLSModel)

1818

.Case(

"local-exec"

, llvm::GlobalVariable::LocalExecTLSModel);

1821

llvm::GlobalVariable::ThreadLocalMode

1823 switch

(CodeGenOpts.getDefaultTLSModel()) {

1825 return

llvm::GlobalVariable::GeneralDynamicTLSModel;

1827 return

llvm::GlobalVariable::LocalDynamicTLSModel;

1829 return

llvm::GlobalVariable::InitialExecTLSModel;

1831 return

llvm::GlobalVariable::LocalExecTLSModel;

1833

llvm_unreachable(

"Invalid TLS model!"

);

1837

assert(

D

.getTLSKind() &&

"setting TLS mode on non-TLS var!"

);

1839

llvm::GlobalValue::ThreadLocalMode TLM;

1843 if

(

const

TLSModelAttr *

Attr

=

D

.

getAttr

<TLSModelAttr>()) {

1847

GV->setThreadLocalMode(TLM);

1853 return

(Twine(

'.'

) + Twine(

Target

.CPUSpecificManglingCharacter(Name))).str();

1857 const

CPUSpecificAttr *

Attr

,

1865

Out <<

".resolver"

;

1879 bool

OmitMultiVersionMangling =

false

) {

1881

llvm::raw_svector_ostream Out(Buffer);

1890

assert(II &&

"Attempt to mangle unnamed decl."

);

1891 const auto

*FD = dyn_cast<FunctionDecl>(ND);

1896

Out <<

"__regcall4__"

<< II->

getName

();

1898

Out <<

"__regcall3__"

<< II->

getName

();

1899

}

else if

(FD && FD->hasAttr<CUDAGlobalAttr>() &&

1901

Out <<

"__device_stub__"

<< II->

getName

();

1917 "Hash computed when not explicitly requested"

);

1921 if

(

const auto

*FD = dyn_cast<FunctionDecl>(ND))

1922 if

(FD->isMultiVersion() && !OmitMultiVersionMangling) {

1923 switch

(FD->getMultiVersionKind()) {

1927

FD->getAttr<CPUSpecificAttr>(),

1931 auto

*

Attr

= FD->getAttr<TargetAttr>();

1932

assert(

Attr

&&

"Expected TargetAttr to be present " 1933 "for attribute mangling"

);

1939 auto

*

Attr

= FD->getAttr<TargetVersionAttr>();

1940

assert(

Attr

&&

"Expected TargetVersionAttr to be present " 1941 "for attribute mangling"

);

1947 auto

*

Attr

= FD->getAttr<TargetClonesAttr>();

1948

assert(

Attr

&&

"Expected TargetClonesAttr to be present " 1949 "for attribute mangling"

);

1956

llvm_unreachable(

"None multiversion type isn't valid here"

);

1966 return

std::string(Out.str());

1969void

CodeGenModule::UpdateMultiVersionNames(

GlobalDecl

GD,

1971

StringRef &CurName) {

1978

std::string NonTargetName =

1986 "Other GD should now be a multiversioned function"

);

1996 if

(OtherName != NonTargetName) {

1999 const auto

ExistingRecord = Manglings.find(NonTargetName);

2000 if

(ExistingRecord != std::end(Manglings))

2001

Manglings.remove(&(*ExistingRecord));

2002 auto Result

= Manglings.insert(std::make_pair(OtherName, OtherGD));

2007

CurName = OtherNameRef;

2009

Entry->setName(OtherName);

2019 if

(

const auto

*CD = dyn_cast<CXXConstructorDecl>(CanonicalGD.

getDecl

())) {

2033 auto

FoundName = MangledDeclNames.find(CanonicalGD);

2034 if

(FoundName != MangledDeclNames.end())

2035 return

FoundName->second;

2039 const auto

*ND = cast<NamedDecl>(GD.

getDecl

());

2051

assert(!isa<FunctionDecl>(ND) || !ND->hasAttr<CUDAGlobalAttr>() ||

2071 auto Result

= Manglings.insert(std::make_pair(MangledName, GD));

2072 return

MangledDeclNames[CanonicalGD] =

Result

.first->first();

2081

llvm::raw_svector_ostream Out(Buffer);

2084

dyn_cast_or_null<VarDecl>(initializedGlobalDecl.

getDecl

()), Out);

2085 else if

(

const auto

*CD = dyn_cast<CXXConstructorDecl>(

D

))

2087 else if

(

const auto

*DD = dyn_cast<CXXDestructorDecl>(

D

))

2090

MangleCtx.

mangleBlock

(cast<DeclContext>(

D

), BD, Out);

2092 auto Result

= Manglings.insert(std::make_pair(Out.str(), BD));

2093 return Result

.first->first();

2097 auto

it = MangledDeclNames.begin();

2098 while

(it != MangledDeclNames.end()) {

2099 if

(it->second == Name)

2107 return getModule

().getNamedValue(Name);

2114

llvm::Constant *AssociatedData) {

2116

GlobalCtors.push_back(

Structor

(

Priority

, LexOrder, Ctor, AssociatedData));

2122 bool

IsDtorAttrFunc) {

2123 if

(CodeGenOpts.RegisterGlobalDtorsWithAtExit &&

2125

DtorsUsingAtExit[

Priority

].push_back(Dtor);

2133void

CodeGenModule::EmitCtorList(CtorList &Fns,

const char

*GlobalName) {

2134 if

(Fns.empty())

return

;

2140

llvm::PointerType *PtrTy = llvm::PointerType::get(

2141 getLLVMContext

(), TheModule.getDataLayout().getProgramAddressSpace());

2144

llvm::StructType *CtorStructTy = llvm::StructType::get(

Int32Ty

, PtrTy, PtrTy);

2148 auto

Ctors = Builder.beginArray(CtorStructTy);

2149 for

(

const auto

&I : Fns) {

2150 auto

Ctor = Ctors.beginStruct(CtorStructTy);

2151

Ctor.addInt(

Int32Ty

, I.Priority);

2152 if

(InitFiniAuthSchema) {

2153

llvm::Constant *StorageAddress =

2155

? llvm::ConstantExpr::getIntToPtr(

2156

llvm::ConstantInt::get(

2158

llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),

2162

I.Initializer, InitFiniAuthSchema.

getKey

(), StorageAddress,

2163

llvm::ConstantInt::get(

2165

Ctor.add(SignedCtorPtr);

2167

Ctor.add(I.Initializer);

2169 if

(I.AssociatedData)

2170

Ctor.add(I.AssociatedData);

2172

Ctor.addNullPointer(PtrTy);

2173

Ctor.finishAndAddTo(Ctors);

2176 auto

List = Ctors.finishAndCreateGlobal(GlobalName,

getPointerAlign

(),

2178

llvm::GlobalValue::AppendingLinkage);

2182

List->setAlignment(std::nullopt);

2187

llvm::GlobalValue::LinkageTypes

2189 const auto

*

D

= cast<FunctionDecl>(GD.

getDecl

());

2193 if

(

const auto

*Dtor = dyn_cast<CXXDestructorDecl>(

D

))

2200

llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD);

2201 if

(!MDS)

return nullptr

;

2203 return

llvm::ConstantInt::get(

Int64Ty

, llvm::MD5Hash(MDS->getString()));

2209

FnType->getReturnType(), FnType->getParamTypes(),

2210

FnType->getExtProtoInfo().withExceptionSpec(

EST_None

));

2212

std::string OutName;

2213

llvm::raw_string_ostream Out(OutName);

2218

Out <<

".normalized"

;

2220 return

llvm::ConstantInt::get(

Int32Ty

,

2221 static_cast<

uint32_t

>

(llvm::xxHash64(OutName)));

2226

llvm::Function *F,

bool

IsThunk) {

2228

llvm::AttributeList PAL;

2231 if

(

CallingConv

== llvm::CallingConv::X86_VectorCall &&

2237

Error(

Loc

,

"__vectorcall calling convention is not currently supported"

);

2239

F->setAttributes(PAL);

2240

F->setCallingConv(

static_cast<

llvm::CallingConv::ID

>

(

CallingConv

));

2244

std::string ReadOnlyQual(

"__read_only"

);

2245

std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);

2246 if

(ReadOnlyPos != std::string::npos)

2248

TyName.erase(ReadOnlyPos, ReadOnlyQual.size() + 1);

2250

std::string WriteOnlyQual(

"__write_only"

);

2251

std::string::size_type WriteOnlyPos = TyName.find(WriteOnlyQual);

2252 if

(WriteOnlyPos != std::string::npos)

2253

TyName.erase(WriteOnlyPos, WriteOnlyQual.size() + 1);

2255

std::string ReadWriteQual(

"__read_write"

);

2256

std::string::size_type ReadWritePos = TyName.find(ReadWriteQual);

2257 if

(ReadWritePos != std::string::npos)

2258

TyName.erase(ReadWritePos, ReadWriteQual.size() + 1);

2291

assert(((FD && CGF) || (!FD && !CGF)) &&

2292 "Incorrect use - FD and CGF should either be both null or not!"

);

2318 for

(

unsigned

i = 0, e = FD->

getNumParams

(); i != e; ++i) {

2321

argNames.push_back(llvm::MDString::get(VMContext, parm->

getName

()));

2326

std::string typeQuals;

2330 const Decl

*PDecl = parm;

2332

PDecl = TD->getDecl();

2333 const

OpenCLAccessAttr *A = PDecl->

getAttr

<OpenCLAccessAttr>();

2334 if

(A && A->isWriteOnly())

2335

accessQuals.push_back(llvm::MDString::get(VMContext,

"write_only"

));

2336 else if

(A && A->isReadWrite())

2337

accessQuals.push_back(llvm::MDString::get(VMContext,

"read_write"

));

2339

accessQuals.push_back(llvm::MDString::get(VMContext,

"read_only"

));

2341

accessQuals.push_back(llvm::MDString::get(VMContext,

"none"

));

2343 auto

getTypeSpelling = [&](

QualType

Ty) {

2344 auto

typeName = Ty.getUnqualifiedType().getAsString(Policy);

2346 if

(Ty.isCanonical()) {

2347

StringRef typeNameRef = typeName;

2349 if

(typeNameRef.consume_front(

"unsigned "

))

2350 return

std::string(

"u"

) + typeNameRef.str();

2351 if

(typeNameRef.consume_front(

"signed "

))

2352 return

typeNameRef.str();

2362

addressQuals.push_back(

2363

llvm::ConstantAsMetadata::get(CGF->

Builder

.getInt32(

2367

std::string typeName = getTypeSpelling(pointeeTy) +

"*"

;

2368

std::string baseTypeName =

2370

argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));

2371

argBaseTypeNames.push_back(

2372

llvm::MDString::get(VMContext, baseTypeName));

2376

typeQuals =

"restrict"

;

2379

typeQuals += typeQuals.empty() ?

"const"

:

" const"

;

2381

typeQuals += typeQuals.empty() ?

"volatile"

:

" volatile"

;

2383

uint32_t AddrSpc = 0;

2388

addressQuals.push_back(

2389

llvm::ConstantAsMetadata::get(CGF->

Builder

.getInt32(AddrSpc)));

2393

std::string typeName = getTypeSpelling(ty);

2405

argTypeNames.push_back(llvm::MDString::get(VMContext, typeName));

2406

argBaseTypeNames.push_back(

2407

llvm::MDString::get(VMContext, baseTypeName));

2410

typeQuals =

"pipe"

;

2412

argTypeQuals.push_back(llvm::MDString::get(VMContext, typeQuals));

2416

Fn->setMetadata(

"kernel_arg_addr_space"

,

2417

llvm::MDNode::get(VMContext, addressQuals));

2418

Fn->setMetadata(

"kernel_arg_access_qual"

,

2419

llvm::MDNode::get(VMContext, accessQuals));

2420

Fn->setMetadata(

"kernel_arg_type"

,

2421

llvm::MDNode::get(VMContext, argTypeNames));

2422

Fn->setMetadata(

"kernel_arg_base_type"

,

2423

llvm::MDNode::get(VMContext, argBaseTypeNames));

2424

Fn->setMetadata(

"kernel_arg_type_qual"

,

2425

llvm::MDNode::get(VMContext, argTypeQuals));

2429

Fn->setMetadata(

"kernel_arg_name"

,

2430

llvm::MDNode::get(VMContext, argNames));

2440 if

(!LangOpts.Exceptions)

return false

;

2443 if

(LangOpts.CXXExceptions)

return true

;

2446 if

(LangOpts.ObjCExceptions) {

2463

!isa<CXXConstructorDecl, CXXDestructorDecl>(MD);

2468

llvm::SetVector<const CXXRecordDecl *> MostBases;

2470

std::function<void (

const CXXRecordDecl

*)> CollectMostBases;

2473

MostBases.insert(RD);

2475

CollectMostBases(B.getType()->getAsCXXRecordDecl());

2477

CollectMostBases(RD);

2478 return

MostBases.takeVector();

2482

llvm::Function *F) {

2483

llvm::AttrBuilder B(F->getContext());

2485 if

((!

D

|| !

D

->

hasAttr

<NoUwtableAttr>()) && CodeGenOpts.UnwindTables)

2486

B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables));

2488 if

(CodeGenOpts.StackClashProtector)

2489

B.addAttribute(

"probe-stack"

,

"inline-asm"

);

2491 if

(CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096)

2492

B.addAttribute(

"stack-probe-size"

,

2493

std::to_string(CodeGenOpts.StackProbeSize));

2496

B.addAttribute(llvm::Attribute::NoUnwind);

2498 if

(

D

&&

D

->

hasAttr

<NoStackProtectorAttr>())

2500 else if

(

D

&&

D

->

hasAttr

<StrictGuardStackCheckAttr>() &&

2502

B.addAttribute(llvm::Attribute::StackProtectStrong);

2504

B.addAttribute(llvm::Attribute::StackProtect);

2506

B.addAttribute(llvm::Attribute::StackProtectStrong);

2508

B.addAttribute(llvm::Attribute::StackProtectReq);

2512 if

(

getLangOpts

().

HLSL

&& !F->hasFnAttribute(llvm::Attribute::NoInline))

2513

B.addAttribute(llvm::Attribute::AlwaysInline);

2517 else if

(!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&

2519

B.addAttribute(llvm::Attribute::NoInline);

2527 if

(

D

->

hasAttr

<ArmLocallyStreamingAttr>())

2528

B.addAttribute(

"aarch64_pstate_sm_body"

);

2531 if

(

Attr

->isNewZA())

2532

B.addAttribute(

"aarch64_new_za"

);

2533 if

(

Attr

->isNewZT0())

2534

B.addAttribute(

"aarch64_new_zt0"

);

2539 bool

ShouldAddOptNone =

2540

!CodeGenOpts.DisableO0ImplyOptNone && CodeGenOpts.OptimizationLevel == 0;

2542

ShouldAddOptNone &= !

D

->

hasAttr

<MinSizeAttr>();

2543

ShouldAddOptNone &= !

D

->

hasAttr

<AlwaysInlineAttr>();

2546 if

(

getLangOpts

().HLSL && !F->hasFnAttribute(llvm::Attribute::NoInline) &&

2548

B.addAttribute(llvm::Attribute::AlwaysInline);

2549

}

else if

((ShouldAddOptNone ||

D

->

hasAttr

<OptimizeNoneAttr>()) &&

2550

!F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {

2552

B.addAttribute(llvm::Attribute::OptimizeNone);

2555

B.addAttribute(llvm::Attribute::NoInline);

2560

B.addAttribute(llvm::Attribute::Naked);

2563

F->removeFnAttr(llvm::Attribute::OptimizeForSize);

2564

F->removeFnAttr(llvm::Attribute::MinSize);

2565

}

else if

(

D

->

hasAttr

<NakedAttr>()) {

2567

B.addAttribute(llvm::Attribute::Naked);

2568

B.addAttribute(llvm::Attribute::NoInline);

2569

}

else if

(

D

->

hasAttr

<NoDuplicateAttr>()) {

2570

B.addAttribute(llvm::Attribute::NoDuplicate);

2571

}

else if

(

D

->

hasAttr

<NoInlineAttr>() &&

2572

!F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {

2574

B.addAttribute(llvm::Attribute::NoInline);

2575

}

else if

(

D

->

hasAttr

<AlwaysInlineAttr>() &&

2576

!F->hasFnAttribute(llvm::Attribute::NoInline)) {

2578

B.addAttribute(llvm::Attribute::AlwaysInline);

2582 if

(!F->hasFnAttribute(llvm::Attribute::AlwaysInline))

2583

B.addAttribute(llvm::Attribute::NoInline);

2587 if

(

auto

*FD = dyn_cast<FunctionDecl>(

D

)) {

2590 auto

CheckRedeclForInline = [](

const FunctionDecl

*Redecl) {

2591 return

Redecl->isInlineSpecified();

2593 if

(any_of(FD->

redecls

(), CheckRedeclForInline))

2598 return

any_of(Pattern->

redecls

(), CheckRedeclForInline);

2600 if

(CheckForInline(FD)) {

2601

B.addAttribute(llvm::Attribute::InlineHint);

2602

}

else if

(CodeGenOpts.getInlining() ==

2605

!F->hasFnAttribute(llvm::Attribute::AlwaysInline)) {

2606

B.addAttribute(llvm::Attribute::NoInline);

2613 if

(!

D

->

hasAttr

<OptimizeNoneAttr>()) {

2615 if

(!ShouldAddOptNone)

2616

B.addAttribute(llvm::Attribute::OptimizeForSize);

2617

B.addAttribute(llvm::Attribute::Cold);

2620

B.addAttribute(llvm::Attribute::Hot);

2622

B.addAttribute(llvm::Attribute::MinSize);

2629

F->setAlignment(llvm::Align(alignment));

2631 if

(!

D

->

hasAttr

<AlignedAttr>())

2632 if

(LangOpts.FunctionAlignment)

2633

F->setAlignment(llvm::Align(1ull << LangOpts.FunctionAlignment));

2640 if

(isa<CXXMethodDecl>(

D

) && F->getPointerAlignment(

getDataLayout

()) < 2)

2641

F->setAlignment(std::max(llvm::Align(2), F->getAlign().valueOrOne()));

2646 if

(CodeGenOpts.SanitizeCfiCrossDso &&

2647

CodeGenOpts.SanitizeCfiCanonicalJumpTables) {

2648 if

(

auto

*FD = dyn_cast<FunctionDecl>(

D

)) {

2659 auto

*MD = dyn_cast<CXXMethodDecl>(

D

);

2662

llvm::Metadata *

Id

=

2665

F->addTypeMetadata(0,

Id

);

2672 if

(isa_and_nonnull<NamedDecl>(

D

))

2675

GV->setVisibility(llvm::GlobalValue::DefaultVisibility);

2680 if

(

const auto

*VD = dyn_cast_if_present<VarDecl>(

D

);

2682

((CodeGenOpts.KeepPersistentStorageVariables &&

2683

(VD->getStorageDuration() ==

SD_Static

||

2684

VD->getStorageDuration() ==

SD_Thread

)) ||

2685

(CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==

SD_Static

&&

2686

VD->getType().isConstQualified())))

2690bool

CodeGenModule::GetCPUAndFeaturesAttributes(

GlobalDecl

GD,

2691

llvm::AttrBuilder &Attrs,

2692 bool

SetTargetFeatures) {

2698

std::vector<std::string> Features;

2699 const auto

*FD = dyn_cast_or_null<FunctionDecl>(GD.

getDecl

());

2701 const auto

*TD = FD ? FD->

getAttr

<TargetAttr>() :

nullptr

;

2702 const auto

*TV = FD ? FD->

getAttr

<TargetVersionAttr>() :

nullptr

;

2703

assert((!TD || !TV) &&

"both target_version and target specified"

);

2704 const auto

*SD = FD ? FD->

getAttr

<CPUSpecificAttr>() :

nullptr

;

2705 const auto

*TC = FD ? FD->

getAttr

<TargetClonesAttr>() :

nullptr

;

2706 bool

AddedAttr =

false

;

2707 if

(TD || TV || SD || TC) {

2708

llvm::StringMap<bool> FeatureMap;

2712 for

(

const

llvm::StringMap<bool>::value_type &Entry : FeatureMap)

2713

Features.push_back((Entry.getValue() ?

"+"

:

"-"

) + Entry.getKey().str());

2721 Target

.parseTargetAttr(TD->getFeaturesStr());

2743 if

(!TargetCPU.empty()) {

2744

Attrs.addAttribute(

"target-cpu"

, TargetCPU);

2747 if

(!TuneCPU.empty()) {

2748

Attrs.addAttribute(

"tune-cpu"

, TuneCPU);

2751 if

(!Features.empty() && SetTargetFeatures) {

2752

llvm::erase_if(Features, [&](

const

std::string& F) {

2755

llvm::sort(Features);

2756

Attrs.addAttribute(

"target-features"

, llvm::join(Features,

","

));

2762 bool

IsDefault =

false

;

2764

IsDefault = TV->isDefaultVersion();

2765

TV->getFeatures(Feats);

2771

Attrs.addAttribute(

"fmv-features"

);

2773

}

else if

(!Feats.empty()) {

2775

std::set<StringRef> OrderedFeats(Feats.begin(), Feats.end());

2776

std::string FMVFeatures;

2777 for

(StringRef F : OrderedFeats)

2778

FMVFeatures.append(

","

+ F.str());

2779

Attrs.addAttribute(

"fmv-features"

, FMVFeatures.substr(1));

2786void

CodeGenModule::setNonAliasAttributes(

GlobalDecl

GD,

2787

llvm::GlobalObject *GO) {

2792 if

(

auto

*GV = dyn_cast<llvm::GlobalVariable>(GO)) {

2795 if

(

auto

*SA =

D

->

getAttr

<PragmaClangBSSSectionAttr>())

2796

GV->addAttribute(

"bss-section"

, SA->getName());

2797 if

(

auto

*SA =

D

->

getAttr

<PragmaClangDataSectionAttr>())

2798

GV->addAttribute(

"data-section"

, SA->getName());

2799 if

(

auto

*SA =

D

->

getAttr

<PragmaClangRodataSectionAttr>())

2800

GV->addAttribute(

"rodata-section"

, SA->getName());

2801 if

(

auto

*SA =

D

->

getAttr

<PragmaClangRelroSectionAttr>())

2802

GV->addAttribute(

"relro-section"

, SA->getName());

2805 if

(

auto

*F = dyn_cast<llvm::Function>(GO)) {

2808 if

(

auto

*SA =

D

->

getAttr

<PragmaClangTextSectionAttr>())

2809 if

(!

D

->

getAttr

<SectionAttr>())

2810

F->setSection(SA->getName());

2812

llvm::AttrBuilder Attrs(F->getContext());

2813 if

(GetCPUAndFeaturesAttributes(GD, Attrs)) {

2817

llvm::AttributeMask RemoveAttrs;

2818

RemoveAttrs.addAttribute(

"target-cpu"

);

2819

RemoveAttrs.addAttribute(

"target-features"

);

2820

RemoveAttrs.addAttribute(

"fmv-features"

);

2821

RemoveAttrs.addAttribute(

"tune-cpu"

);

2822

F->removeFnAttrs(RemoveAttrs);

2823

F->addFnAttrs(Attrs);

2827 if

(

const auto

*CSA =

D

->

getAttr

<CodeSegAttr>())

2828

GO->setSection(CSA->getName());

2829 else if

(

const auto

*SA =

D

->

getAttr

<SectionAttr>())

2830

GO->setSection(SA->getName());

2843

F->setLinkage(llvm::Function::InternalLinkage);

2845

setNonAliasAttributes(GD, F);

2856

GV->

setLinkage

(llvm::GlobalValue::ExternalWeakLinkage);

2860

llvm::Function *F) {

2862 if

(!LangOpts.

Sanitize

.

has

(SanitizerKind::CFIICall))

2867 if

(isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic())

2871

F->addTypeMetadata(0, MD);

2875 if

(CodeGenOpts.SanitizeCfiCrossDso)

2877

F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));

2881

llvm::LLVMContext &Ctx = F->getContext();

2882

llvm::MDBuilder MDB(Ctx);

2883

F->setMetadata(llvm::LLVMContext::MD_kcfi_type,

2892 return

llvm::all_of(Name, [](

const char

&

C

) {

2893 return

llvm::isAlnum(

C

) ||

C

==

'_'

||

C

==

'.'

;

2899 for

(

auto

&F : M.functions()) {

2901 bool

AddressTaken = F.hasAddressTaken();

2902 if

(!AddressTaken && F.hasLocalLinkage())

2903

F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);

2908 if

(!AddressTaken || !F.isDeclaration())

2911 const

llvm::ConstantInt *

Type

;

2912 if

(

const

llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))

2913 Type

= llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));

2917

StringRef Name = F.getName();

2921

std::string

Asm

= (

".weak __kcfi_typeid_"

+ Name +

"\n.set __kcfi_typeid_"

+

2922

Name +

", "

+ Twine(

Type

->getZExtValue()) +

"\n"

)

2924

M.appendModuleInlineAsm(

Asm

);

2928void

CodeGenModule::SetFunctionAttributes(

GlobalDecl

GD, llvm::Function *F,

2929 bool

IsIncompleteFunction,

2932 if

(llvm::Intrinsic::ID IID = F->getIntrinsicID()) {

2935

F->setAttributes(llvm::Intrinsic::getAttributes(

getLLVMContext

(), IID));

2939 const auto

*FD = cast<FunctionDecl>(GD.

getDecl

());

2941 if

(!IsIncompleteFunction)

2948 if

(!IsThunk &&

getCXXABI

().HasThisReturn(GD) &&

2950

assert(!F->arg_empty() &&

2951

F->arg_begin()->getType()

2952

->canLosslesslyBitCastTo(F->getReturnType()) &&

2953 "unexpected this return"

);

2954

F->addParamAttr(0, llvm::Attribute::Returned);

2964 if

(!IsIncompleteFunction && F->isDeclaration())

2967 if

(

const auto

*CSA = FD->

getAttr

<CodeSegAttr>())

2968

F->setSection(CSA->getName());

2969 else if

(

const auto

*SA = FD->

getAttr

<SectionAttr>())

2970

F->setSection(SA->getName());

2972 if

(

const auto

*EA = FD->

getAttr

<ErrorAttr>()) {

2974

F->addFnAttr(

"dontcall-error"

, EA->getUserDiagnostic());

2975 else if

(EA->isWarning())

2976

F->addFnAttr(

"dontcall-warn"

, EA->getUserDiagnostic());

2982 bool

HasBody = FD->

hasBody

(FDBody);

2984

assert(HasBody &&

"Inline builtin declarations should always have an " 2985 "available body!"

);

2986 if

(shouldEmitFunction(FDBody))

2987

F->addFnAttr(llvm::Attribute::NoBuiltin);

2993

F->addFnAttr(llvm::Attribute::NoBuiltin);

2996 if

(isa<CXXConstructorDecl>(FD) || isa<CXXDestructorDecl>(FD))

2997

F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);

2998 else if

(

const auto

*MD = dyn_cast<CXXMethodDecl>(FD))

2999 if

(MD->isVirtual())

3000

F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);

3006 if

(!CodeGenOpts.SanitizeCfiCrossDso ||

3007

!CodeGenOpts.SanitizeCfiCanonicalJumpTables)

3010 if

(LangOpts.

Sanitize

.

has

(SanitizerKind::KCFI))

3016 if

(CodeGenOpts.InlineMaxStackSize !=

UINT_MAX

)

3017

F->addFnAttr(

"inline-max-stacksize"

, llvm::utostr(CodeGenOpts.InlineMaxStackSize));

3019 if

(

const auto

*CB = FD->

getAttr

<CallbackAttr>()) {

3023

llvm::LLVMContext &Ctx = F->getContext();

3024

llvm::MDBuilder MDB(Ctx);

3028 int

CalleeIdx = *CB->encoding_begin();

3029 ArrayRef<int>

PayloadIndices(CB->encoding_begin() + 1, CB->encoding_end());

3030

F->addMetadata(llvm::LLVMContext::MD_callback,

3031

*llvm::MDNode::get(Ctx, {MDB.createCallbackEncoding(

3032

CalleeIdx, PayloadIndices,

3038

assert((isa<llvm::Function>(GV) || !GV->isDeclaration()) &&

3039 "Only globals with definition can force usage."

);

3040

LLVMUsed.emplace_back(GV);

3044

assert(!GV->isDeclaration() &&

3045 "Only globals with definition can force usage."

);

3046

LLVMCompilerUsed.emplace_back(GV);

3050

assert((isa<llvm::Function>(GV) || !GV->isDeclaration()) &&

3051 "Only globals with definition can force usage."

);

3053

LLVMCompilerUsed.emplace_back(GV);

3055

LLVMUsed.emplace_back(GV);

3059

std::vector<llvm::WeakTrackingVH> &List) {

3066

UsedArray.resize(List.size());

3067 for

(

unsigned

i = 0, e = List.size(); i != e; ++i) {

3069

llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(

3070

cast<llvm::Constant>(&*List[i]), CGM.

Int8PtrTy

);

3073 if

(UsedArray.empty())

3075

llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.

Int8PtrTy

, UsedArray.size());

3077 auto

*GV =

new

llvm::GlobalVariable(

3078

CGM.

getModule

(), ATy,

false

, llvm::GlobalValue::AppendingLinkage,

3079

llvm::ConstantArray::get(ATy, UsedArray), Name);

3081

GV->setSection(

"llvm.metadata"

);

3084void

CodeGenModule::emitLLVMUsed() {

3085 emitUsed

(*

this

,

"llvm.used"

, LLVMUsed);

3086 emitUsed

(*

this

,

"llvm.compiler.used"

, LLVMCompilerUsed);

3091

LinkerOptionsMetadata.push_back(llvm::MDNode::get(

getLLVMContext

(), MDOpts));

3100

LinkerOptionsMetadata.push_back(llvm::MDNode::get(

getLLVMContext

(), MDOpts));

3106

ELFDependentLibraries.push_back(

3107

llvm::MDNode::get(

C

, llvm::MDString::get(

C

, Lib)));

3114

LinkerOptionsMetadata.push_back(llvm::MDNode::get(

C

, MDOpts));

3129 if

(

Visited

.insert(Import).second)

3146 if

(LL.IsFramework) {

3147

llvm::Metadata *Args[2] = {llvm::MDString::get(Context,

"-framework"

),

3148

llvm::MDString::get(Context, LL.Library)};

3150

Metadata.push_back(llvm::MDNode::get(Context, Args));

3156

llvm::Metadata *Args[2] = {

3157

llvm::MDString::get(Context,

"lib"

),

3158

llvm::MDString::get(Context, LL.Library),

3160

Metadata.push_back(llvm::MDNode::get(Context, Args));

3164 auto

*OptString = llvm::MDString::get(Context, Opt);

3165

Metadata.push_back(llvm::MDNode::get(Context, OptString));

3170void

CodeGenModule::EmitModuleInitializers(

clang::Module

*Primary) {

3172 "We should only emit module initializers for named modules."

);

3178 if

(isa<ImportDecl>(

D

))

3180

assert(isa<VarDecl>(

D

) &&

"GMF initializer decl is not a var?"

);

3187 if

(isa<ImportDecl>(

D

))

3195 if

(isa<ImportDecl>(

D

))

3197

assert(isa<VarDecl>(

D

) &&

"PMF initializer decl is not a var?"

);

3203void

CodeGenModule::EmitModuleLinkOptions() {

3207

llvm::SetVector<clang::Module *> LinkModules;

3212 for

(

Module

*M : ImportedModules) {

3215 if

(M->getTopLevelModuleName() ==

getLangOpts

().CurrentModule &&

3218 if

(

Visited

.insert(M).second)

3224 while

(!Stack.empty()) {

3227 bool

AnyChildren =

false

;

3233 if

(

SM

->IsExplicit)

3237

Stack.push_back(

SM

);

3238

AnyChildren =

true

;

3245

LinkModules.insert(Mod);

3254 for

(

Module

*M : LinkModules)

3255 if

(

Visited

.insert(M).second)

3257

std::reverse(MetadataArgs.begin(), MetadataArgs.end());

3258

LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());

3261 auto

*NMD =

getModule

().getOrInsertNamedMetadata(

"llvm.linker.options"

);

3262 for

(

auto

*MD : LinkerOptionsMetadata)

3263

NMD->addOperand(MD);

3266void

CodeGenModule::EmitDeferred() {

3275 if

(!DeferredVTables.empty()) {

3276

EmitDeferredVTables();

3281

assert(DeferredVTables.empty());

3288

llvm::append_range(DeferredDeclsToEmit,

3292 if

(DeferredDeclsToEmit.empty())

3297

std::vector<GlobalDecl> CurDeclsToEmit;

3298

CurDeclsToEmit.swap(DeferredDeclsToEmit);

3305

llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(

3323 if

(!GV->isDeclaration())

3327 if

(LangOpts.OpenMP && OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(

D

))

3331

EmitGlobalDefinition(

D

, GV);

3336 if

(!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {

3338

assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());

3343void

CodeGenModule::EmitVTablesOpportunistically() {

3349

assert((OpportunisticVTables.empty() || shouldOpportunisticallyEmitVTables())

3350

&&

"Only emit opportunistic vtables with optimizations"

);

3353

assert(

getVTables

().isVTableExternal(RD) &&

3354 "This queue should only contain external vtables"

);

3355 if

(

getCXXABI

().canSpeculativelyEmitVTable(RD))

3358

OpportunisticVTables.clear();

3362 for

(

const auto

& [MangledName, VD] : DeferredAnnotations) {

3367

DeferredAnnotations.clear();

3369 if

(Annotations.empty())

3373

llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(

3374

Annotations[0]->getType(), Annotations.size()), Annotations);

3375 auto

*gv =

new

llvm::GlobalVariable(

getModule

(), Array->getType(),

false

,

3376

llvm::GlobalValue::AppendingLinkage,

3377

Array,

"llvm.global.annotations"

);

3382

llvm::Constant *&AStr = AnnotationStrings[Str];

3387

llvm::Constant *

s

= llvm::ConstantDataArray::getString(

getLLVMContext

(), Str);

3388 auto

*gv =

new

llvm::GlobalVariable(

3389 getModule

(),

s

->getType(),

true

, llvm::GlobalValue::PrivateLinkage,

s

,

3390 ".str"

,

nullptr

, llvm::GlobalValue::NotThreadLocal,

3393

gv->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);

3410 SM

.getExpansionLineNumber(L);

3411 return

llvm::ConstantInt::get(

Int32Ty

, LineNo);

3419

llvm::FoldingSetNodeID ID;

3420 for

(

Expr

*

E

: Exprs) {

3421

ID.Add(cast<clang::ConstantExpr>(

E

)->getAPValueResult());

3423

llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()];

3428

LLVMArgs.reserve(Exprs.size());

3430

llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](

const Expr

*

E

) {

3431 const auto

*CE = cast<clang::ConstantExpr>(

E

);

3432 return

ConstEmiter.

emitAbstract

(CE->getBeginLoc(), CE->getAPValueResult(),

3435 auto

*

Struct

= llvm::ConstantStruct::getAnon(LLVMArgs);

3436 auto

*GV =

new

llvm::GlobalVariable(

getModule

(),

Struct

->getType(),

true

,

3437

llvm::GlobalValue::PrivateLinkage,

Struct

,

3440

GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);

3447 const

AnnotateAttr *AA,

3455

llvm::Constant *GVInGlobalsAS = GV;

3456 if

(GV->getAddressSpace() !=

3458

GVInGlobalsAS = llvm::ConstantExpr::getAddrSpaceCast(

3460

llvm::PointerType::get(

3461

GV->getContext(),

getDataLayout

().getDefaultGlobalsAddressSpace()));

3465

llvm::Constant *Fields[] = {

3466

GVInGlobalsAS, AnnoGV, UnitGV, LineNoCst, Args,

3468 return

llvm::ConstantStruct::getAnon(Fields);

3472

llvm::GlobalValue *GV) {

3473

assert(

D

->

hasAttr

<AnnotateAttr>() &&

"no annotate attribute"

);

3483 if

(NoSanitizeL.containsFunction(Kind, Fn->getName()))

3488 if

(NoSanitizeL.containsMainFile(Kind, MainFile.

getName

()))

3493 return

NoSanitizeL.containsLocation(Kind,

Loc

);

3496 return

NoSanitizeL.containsFile(Kind, MainFile.

getName

());

3500

llvm::GlobalVariable *GV,

3504 if

(NoSanitizeL.containsGlobal(Kind, GV->getName(),

Category

))

3507 if

(NoSanitizeL.containsMainFile(

3508

Kind,

SM

.getFileEntryRefForID(

SM

.getMainFileID())->getName(),

3511 if

(NoSanitizeL.containsLocation(Kind,

Loc

,

Category

))

3518 while

(

auto

AT = dyn_cast<ArrayType>(Ty.

getTypePtr

()))

3519

Ty = AT->getElementType();

3524 if

(NoSanitizeL.containsType(Kind, TypeStr,

Category

))

3535 auto Attr

= ImbueAttr::NONE;

3538 if

(

Attr

== ImbueAttr::NONE)

3539 Attr

= XRayFilter.shouldImbueFunction(Fn->getName());

3541 case

ImbueAttr::NONE:

3543 case

ImbueAttr::ALWAYS:

3544

Fn->addFnAttr(

"function-instrument"

,

"xray-always"

);

3546 case

ImbueAttr::ALWAYS_ARG1:

3547

Fn->addFnAttr(

"function-instrument"

,

"xray-always"

);

3548

Fn->addFnAttr(

"xray-log-args"

,

"1"

);

3550 case

ImbueAttr::NEVER:

3551

Fn->addFnAttr(

"function-instrument"

,

"xray-never"

);

3575 if

(

auto

MainFile =

SM

.getFileEntryRefForID(

SM

.getMainFileID()))

3589 if

(NumGroups > 1) {

3590 auto

Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;

3599 if

(LangOpts.EmitAllDecls)

3602 const auto

*VD = dyn_cast<VarDecl>(

Global

);

3604

((CodeGenOpts.KeepPersistentStorageVariables &&

3605

(VD->getStorageDuration() ==

SD_Static

||

3606

VD->getStorageDuration() ==

SD_Thread

)) ||

3607

(CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() ==

SD_Static

&&

3608

VD->getType().isConstQualified())))

3621 if

(LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {

3622

std::optional<OMPDeclareTargetDeclAttr *> ActiveAttr =

3623

OMPDeclareTargetDeclAttr::getActiveAttr(

Global

);

3624 if

(!ActiveAttr || (*ActiveAttr)->getLevel() != (

unsigned

)-1)

3628 if

(

const auto

*FD = dyn_cast<FunctionDecl>(

Global

)) {

3637 if

(

const auto

*VD = dyn_cast<VarDecl>(

Global

)) {

3643 if

(CXX20ModuleInits && VD->getOwningModule() &&

3644

!VD->getOwningModule()->isModuleMapModule()) {

3653 if

(LangOpts.OpenMP && LangOpts.OpenMPUseTLS &&

3654 getContext

().getTargetInfo().isTLSSupported() && isa<VarDecl>(

Global

) &&

3656

!OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(

Global

))

3669 if

(llvm::GlobalVariable *GV =

getModule

().getNamedGlobal(Name))

3673

llvm::Constant *

Init

;

3676 if

(!

V

.isAbsent()) {

3687

llvm::Constant *Fields[4] = {

3691

llvm::ConstantDataArray::getRaw(

3692

StringRef(

reinterpret_cast<char

*

>

(Parts.

Part4And5

), 8), 8,

3694 Init

= llvm::ConstantStruct::getAnon(Fields);

3697 auto

*GV =

new

llvm::GlobalVariable(

3699 true

, llvm::GlobalValue::LinkOnceODRLinkage,

Init

, Name);

3701

GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));

3704 if

(!

V

.isAbsent()) {

3717

llvm::GlobalVariable **Entry =

nullptr

;

3718

Entry = &UnnamedGlobalConstantDeclMap[GCD];

3723

llvm::Constant *

Init

;

3727

assert(!

V

.isAbsent());

3731 auto

*GV =

new

llvm::GlobalVariable(

getModule

(),

Init

->getType(),

3733

llvm::GlobalValue::PrivateLinkage,

Init

,

3735

GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);

3749 if

(llvm::GlobalVariable *GV =

getModule

().getNamedGlobal(Name))

3753

llvm::Constant *

Init

=

Emitter

.emitForInitializer(

3761

llvm::GlobalValue::LinkageTypes

Linkage

=

3763

? llvm::GlobalValue::LinkOnceODRLinkage

3764

: llvm::GlobalValue::InternalLinkage;

3765 auto

*GV =

new

llvm::GlobalVariable(

getModule

(),

Init

->getType(),

3769

GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));

3776 const

AliasAttr *AA = VD->

getAttr

<AliasAttr>();

3777

assert(AA &&

"No alias?"

);

3787

llvm::Constant *Aliasee;

3788 if

(isa<llvm::FunctionType>(DeclTy))

3789

Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,

3796 auto

*F = cast<llvm::GlobalValue>(Aliasee);

3797

F->setLinkage(llvm::Function::ExternalWeakLinkage);

3798

WeakRefReferences.insert(F);

3806 if

(

auto

*A =

D

->

getAttr

<AttrT>())

3807 return

A->isImplicit();

3811bool

CodeGenModule::shouldEmitCUDAGlobalVar(

const VarDecl

*

Global

)

const

{

3812

assert(LangOpts.CUDA &&

"Should not be called by non-CUDA languages"

);

3817 return

!LangOpts.CUDAIsDevice ||

Global

->hasAttr<CUDADeviceAttr>() ||

3818 Global

->hasAttr<CUDAConstantAttr>() ||

3819 Global

->hasAttr<CUDASharedAttr>() ||

3820 Global

->getType()->isCUDADeviceBuiltinSurfaceType() ||

3821 Global

->getType()->isCUDADeviceBuiltinTextureType();

3828 if

(

Global

->hasAttr<WeakRefAttr>())

3833 if

(

Global

->hasAttr<AliasAttr>())

3834 return

EmitAliasDefinition(GD);

3837 if

(

Global

->hasAttr<IFuncAttr>())

3838 return

emitIFuncDefinition(GD);

3841 if

(

Global

->hasAttr<CPUDispatchAttr>())

3842 return

emitCPUDispatchDefinition(GD);

3847 if

(LangOpts.CUDA) {

3848

assert((isa<FunctionDecl>(

Global

) || isa<VarDecl>(

Global

)) &&

3849 "Expected Variable or Function"

);

3850 if

(

const auto

*VD = dyn_cast<VarDecl>(

Global

)) {

3851 if

(!shouldEmitCUDAGlobalVar(VD))

3853

}

else if

(LangOpts.CUDAIsDevice) {

3854 const auto

*FD = dyn_cast<FunctionDecl>(

Global

);

3855 if

((!

Global

->hasAttr<CUDADeviceAttr>() ||

3856

(LangOpts.OffloadImplicitHostDeviceTemplates &&

3857

hasImplicitAttr<CUDAHostAttr>(FD) &&

3858

hasImplicitAttr<CUDADeviceAttr>(FD) && !FD->

isConstexpr

() &&

3860

!

getContext

().CUDAImplicitHostDeviceFunUsedByDevice.count(FD))) &&

3861

!

Global

->hasAttr<CUDAGlobalAttr>() &&

3862

!(LangOpts.HIPStdPar && isa<FunctionDecl>(

Global

) &&

3863

!

Global

->hasAttr<CUDAHostAttr>()))

3866

}

else if

(!

Global

->hasAttr<CUDAHostAttr>() &&

3867 Global

->hasAttr<CUDADeviceAttr>())

3871 if

(LangOpts.OpenMP) {

3873 if

(OpenMPRuntime && OpenMPRuntime->emitTargetGlobal(GD))

3875 if

(

auto

*DRD = dyn_cast<OMPDeclareReductionDecl>(

Global

)) {

3876 if

(MustBeEmitted(

Global

))

3880 if

(

auto

*DMD = dyn_cast<OMPDeclareMapperDecl>(

Global

)) {

3881 if

(MustBeEmitted(

Global

))

3888 if

(

const auto

*FD = dyn_cast<FunctionDecl>(

Global

)) {

3891 if

(FD->

hasAttr

<AnnotateAttr>()) {

3894

DeferredAnnotations[MangledName] = FD;

3909

GetOrCreateLLVMFunction(MangledName, Ty, GD,

false

,

3914 const auto

*VD = cast<VarDecl>(

Global

);

3915

assert(VD->isFileVarDecl() &&

"Cannot emit local var decl as global."

);

3918 if

(LangOpts.OpenMP) {

3920 if

(std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =

3921

OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {

3925 if

(VD->hasExternalStorage() &&

3926

Res != OMPDeclareTargetDeclAttr::MT_Link)

3929 bool

UnifiedMemoryEnabled =

3931 if

((*Res == OMPDeclareTargetDeclAttr::MT_To ||

3932

*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&

3933

!UnifiedMemoryEnabled) {

3936

assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||

3937

((*Res == OMPDeclareTargetDeclAttr::MT_To ||

3938

*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&

3939

UnifiedMemoryEnabled)) &&

3940 "Link clause or to clause with unified memory expected."

);

3959 if

(MustBeEmitted(

Global

) && MayBeEmittedEagerly(

Global

)) {

3961

EmitGlobalDefinition(GD);

3962

addEmittedDeferredDecl(GD);

3969

cast<VarDecl>(

Global

)->hasInit()) {

3970

DelayedCXXInitPosition[

Global

] = CXXGlobalInits.size();

3971

CXXGlobalInits.push_back(

nullptr

);

3977

addDeferredDeclToEmit(GD);

3978

}

else if

(MustBeEmitted(

Global

)) {

3980

assert(!MayBeEmittedEagerly(

Global

));

3981

addDeferredDeclToEmit(GD);

3986

DeferredDecls[MangledName] = GD;

3993 if

(

CXXRecordDecl

*RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))

3994 if

(RD->getDestructor() && !RD->getDestructor()->hasAttr<DLLImportAttr>())

4001 struct

FunctionIsDirectlyRecursive

4003 const

StringRef Name;

4006

: Name(N), BI(

C

) {}

4008 bool

VisitCallExpr(

const CallExpr

*

E

) {

4012

AsmLabelAttr *

Attr

= FD->

getAttr

<AsmLabelAttr>();

4013 if

(

Attr

&& Name ==

Attr

->getLabel())

4018

StringRef BuiltinName = BI.

getName

(BuiltinID);

4019 if

(BuiltinName.starts_with(

"__builtin_"

) &&

4020

Name == BuiltinName.slice(strlen(

"__builtin_"

), StringRef::npos)) {

4026 bool

VisitStmt(

const Stmt

*S) {

4027 for

(

const Stmt

*Child : S->children())

4028 if

(Child && this->Visit(Child))

4035 struct

DLLImportFunctionVisitor

4037 bool

SafeToInline =

true

;

4039 bool

shouldVisitImplicitCode()

const

{

return true

; }

4041 bool

VisitVarDecl(

VarDecl

*VD) {

4044

SafeToInline =

false

;

4045 return

SafeToInline;

4052 return

SafeToInline;

4056 if

(

const auto

*

D

=

E

->getTemporary()->getDestructor())

4057

SafeToInline =

D

->

hasAttr

<DLLImportAttr>();

4058 return

SafeToInline;

4063 if

(isa<FunctionDecl>(VD))

4064

SafeToInline = VD->

hasAttr

<DLLImportAttr>();

4065 else if

(

VarDecl

*

V

= dyn_cast<VarDecl>(VD))

4066

SafeToInline = !

V

->hasGlobalStorage() ||

V

->hasAttr<DLLImportAttr>();

4067 return

SafeToInline;

4071

SafeToInline =

E

->getConstructor()->hasAttr<DLLImportAttr>();

4072 return

SafeToInline;

4079

SafeToInline =

true

;

4081

SafeToInline = M->

hasAttr

<DLLImportAttr>();

4083 return

SafeToInline;

4087

SafeToInline =

E

->getOperatorDelete()->hasAttr<DLLImportAttr>();

4088 return

SafeToInline;

4092

SafeToInline =

E

->getOperatorNew()->hasAttr<DLLImportAttr>();

4093 return

SafeToInline;

4102

CodeGenModule::isTriviallyRecursive(

const FunctionDecl

*FD) {

4104 if

(

getCXXABI

().getMangleContext().shouldMangleDeclName(FD)) {

4106

AsmLabelAttr *

Attr

= FD->

getAttr

<AsmLabelAttr>();

4109

Name =

Attr

->getLabel();

4114

FunctionIsDirectlyRecursive Walker(Name, Context.

BuiltinInfo

);

4116 return

Body ? Walker.Visit(Body) :

false

;

4119bool

CodeGenModule::shouldEmitFunction(

GlobalDecl

GD) {

4123 const auto

*F = cast<FunctionDecl>(GD.

getDecl

());

4126 if

(F->isInlineBuiltinDeclaration())

4129 if

(CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())

4134 if

(

const Module

*M = F->getOwningModule();

4135

M && M->getTopLevelModule()->isNamedModule() &&

4136 getContext

().getCurrentNamedModule() != M->getTopLevelModule()) {

4146 if

(!F->isTemplateInstantiation() || !F->hasAttr<AlwaysInlineAttr>()) {

4151 if

(F->hasAttr<NoInlineAttr>())

4154 if

(F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {

4156

DLLImportFunctionVisitor Visitor;

4157

Visitor.TraverseFunctionDecl(

const_cast<FunctionDecl

*

>

(F));

4158 if

(!Visitor.SafeToInline)

4164 for

(

const Decl

*

Member

: Dtor->getParent()->decls())

4165 if

(isa<FieldDecl>(

Member

))

4179 return

!isTriviallyRecursive(F);

4182bool

CodeGenModule::shouldOpportunisticallyEmitVTables() {

4183 return

CodeGenOpts.OptimizationLevel > 0;

4186void

CodeGenModule::EmitMultiVersionFunctionDefinition(

GlobalDecl

GD,

4187

llvm::GlobalValue *GV) {

4188 const auto

*FD = cast<FunctionDecl>(GD.

getDecl

());

4191 auto

*Spec = FD->

getAttr

<CPUSpecificAttr>();

4192 for

(

unsigned

I = 0; I < Spec->cpus_size(); ++I)

4194

}

else if

(

auto

*TC = FD->

getAttr

<TargetClonesAttr>()) {

4195 for

(

unsigned

I = 0; I < TC->featuresStrs_size(); ++I)

4198

TC->isFirstOfVersion(I))

4201

GetOrCreateMultiVersionResolver(GD);

4203

EmitGlobalFunctionDefinition(GD, GV);

4208

AddDeferredMultiVersionResolverToEmit(GD);

4211void

CodeGenModule::EmitGlobalDefinition(

GlobalDecl

GD, llvm::GlobalValue *GV) {

4212 const auto

*

D

= cast<ValueDecl>(GD.

getDecl

());

4216 "Generating code for declaration"

);

4218 if

(

const auto

*FD = dyn_cast<FunctionDecl>(

D

)) {

4221 if

(!shouldEmitFunction(GD))

4224

llvm::TimeTraceScope TimeScope(

"CodeGen Function"

, [&]() {

4226

llvm::raw_string_ostream OS(Name);

4232 if

(

const auto

*Method = dyn_cast<CXXMethodDecl>(

D

)) {

4235 if

(isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method))

4236

ABI->emitCXXStructor(GD);

4238

EmitMultiVersionFunctionDefinition(GD, GV);

4240

EmitGlobalFunctionDefinition(GD, GV);

4242 if

(Method->isVirtual())

4249 return

EmitMultiVersionFunctionDefinition(GD, GV);

4250 return

EmitGlobalFunctionDefinition(GD, GV);

4253 if

(

const auto

*VD = dyn_cast<VarDecl>(

D

))

4254 return

EmitGlobalVarDefinition(VD, !VD->hasDefinition());

4256

llvm_unreachable(

"Invalid argument to EmitGlobalDefinition()"

);

4260

llvm::Function *NewFn);

4263 const

CodeGenFunction::FMVResolverOption &RO) {

4265 if

(RO.Architecture)

4266

Features.push_back(*RO.Architecture);

4275static

llvm::GlobalValue::LinkageTypes

4279 return

llvm::GlobalValue::InternalLinkage;

4280 return

llvm::GlobalValue::WeakODRLinkage;

4283void

CodeGenModule::emitMultiVersionFunctions() {

4284

std::vector<GlobalDecl> MVFuncsToEmit;

4285

MultiVersionFuncs.swap(MVFuncsToEmit);

4287 const auto

*FD = cast<FunctionDecl>(GD.

getDecl

());

4288

assert(FD &&

"Expected a FunctionDecl"

);

4290 auto

createFunction = [&](

const FunctionDecl

*

Decl

,

unsigned

MVIdx = 0) {

4295 if

(

Decl

->isDefined()) {

4296

EmitGlobalFunctionDefinition(CurGD,

nullptr

);

4304

assert(

Func

&&

"This should have just been created"

);

4306 return

cast<llvm::Function>(

Func

);

4320 if

(

const auto

*TA = CurFD->

getAttr

<TargetAttr>()) {

4321

assert(getTarget().getTriple().isX86() &&

"Unsupported target"

);

4322

TA->getX86AddedFeatures(Feats);

4323

llvm::Function *Func = createFunction(CurFD);

4324

Options.emplace_back(Func, Feats, TA->getX86Architecture());

4325

}

else if

(

const auto

*TVA = CurFD->

getAttr

<TargetVersionAttr>()) {

4326

if (TVA->isDefaultVersion() && IsDefined)

4327

ShouldEmitResolver = true;

4328

llvm::Function *Func = createFunction(CurFD);

4329

char Delim = getTarget().getTriple().isAArch64() ?

'+'

:

','

;

4330

TVA->getFeatures(Feats, Delim);

4331

Options.emplace_back(Func, Feats);

4332

}

else if

(

const auto

*TC = CurFD->

getAttr

<TargetClonesAttr>()) {

4334

ShouldEmitResolver = true;

4335

for (unsigned I = 0; I < TC->featuresStrs_size(); ++I) {

4336

if (!TC->isFirstOfVersion(I))

4339

llvm::Function *Func = createFunction(CurFD, I);

4341

if (getTarget().getTriple().isX86()) {

4342

TC->getX86Feature(Feats, I);

4343

Options.emplace_back(Func, Feats, TC->getX86Architecture(I));

4345

char Delim = getTarget().getTriple().isAArch64() ?

'+'

:

','

;

4346

TC->getFeatures(Feats, I, Delim);

4347

Options.emplace_back(Func, Feats);

4351

llvm_unreachable(

"unexpected MultiVersionKind"

);

4354 if

(!ShouldEmitResolver)

4357

llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);

4358 if

(

auto

*IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {

4359

ResolverConstant = IFunc->getResolver();

4363

*

this

, GD, FD,

true

);

4370 auto

*Alias = llvm::GlobalAlias::create(

4372

MangledName +

".ifunc"

, IFunc, &

getModule

());

4377

llvm::Function *ResolverFunc = cast<llvm::Function>(ResolverConstant);

4382

ResolverFunc->setComdat(

4383 getModule

().getOrInsertComdat(ResolverFunc->getName()));

4387

Options, [&TI](

const

CodeGenFunction::FMVResolverOption &LHS,

4388 const

CodeGenFunction::FMVResolverOption &RHS) {

4392

CGF.EmitMultiVersionResolver(ResolverFunc, Options);

4398 if

(!MVFuncsToEmit.empty())

4403 if

(!MultiVersionFuncs.empty())

4404

emitMultiVersionFunctions();

4408

llvm::Constant *New) {

4409

assert(cast<llvm::Function>(Old)->isDeclaration() &&

"Not a declaration"

);

4411

Old->replaceAllUsesWith(New);

4412

Old->eraseFromParent();

4415void

CodeGenModule::emitCPUDispatchDefinition(

GlobalDecl

GD) {

4416 const auto

*FD = cast<FunctionDecl>(GD.

getDecl

());

4417

assert(FD &&

"Not a FunctionDecl?"

);

4419 const auto

*DD = FD->

getAttr

<CPUDispatchAttr>();

4420

assert(DD &&

"Not a cpu_dispatch Function?"

);

4426

UpdateMultiVersionNames(GD, FD, ResolverName);

4428

llvm::Type *ResolverType;

4431

ResolverType = llvm::FunctionType::get(

4432

llvm::PointerType::get(DeclTy,

4441 auto

*ResolverFunc = cast<llvm::Function>(GetOrCreateLLVMFunction(

4442

ResolverName, ResolverType, ResolverGD,

false

));

4445

ResolverFunc->setComdat(

4446 getModule

().getOrInsertComdat(ResolverFunc->getName()));

4459 GlobalDecl

ExistingDecl = Manglings.lookup(MangledName);

4460 if

(ExistingDecl.

getDecl

() &&

4462

EmitGlobalFunctionDefinition(ExistingDecl,

nullptr

);

4465 if

(!ExistingDecl.

getDecl

())

4468 Func

= GetOrCreateLLVMFunction(

4469

MangledName, DeclTy, ExistingDecl,

4476 Target

.getCPUSpecificCPUDispatchFeatures(II->getName(), Features);

4477

llvm::transform(Features, Features.begin(),

4478

[](StringRef Str) { return Str.substr(1); });

4479

llvm::erase_if(Features, [&

Target

](StringRef Feat) {

4480 return

!

Target

.validateCpuSupports(Feat);

4482

Options.emplace_back(cast<llvm::Function>(

Func

), Features);

4486

llvm::stable_sort(Options, [](

const

CodeGenFunction::FMVResolverOption &LHS,

4487 const

CodeGenFunction::FMVResolverOption &RHS) {

4488 return

llvm::X86::getCpuSupportsMask(LHS.Features) >

4489

llvm::X86::getCpuSupportsMask(RHS.Features);

4496 while

(Options.size() > 1 && llvm::all_of(llvm::X86::getCpuSupportsMask(

4497

(Options.end() - 2)->Features),

4498

[](

auto X

) { return X == 0; })) {

4499

StringRef LHSName = (Options.end() - 2)->

Function

->getName();

4500

StringRef RHSName = (Options.end() - 1)->

Function

->getName();

4501 if

(LHSName.compare(RHSName) < 0)

4502

Options.erase(Options.end() - 2);

4504

Options.erase(Options.end() - 1);

4508

CGF.EmitMultiVersionResolver(ResolverFunc, Options);

4512 auto

*IFunc = cast<llvm::GlobalValue>(GetOrCreateMultiVersionResolver(GD));

4513 unsigned

AS = IFunc->getType()->getPointerAddressSpace();

4517 if

(!isa<llvm::GlobalIFunc>(IFunc)) {

4518 auto

*GI = llvm::GlobalIFunc::create(DeclTy, AS,

Linkage

,

""

,

4525

*

this

, GD, FD,

true

);

4528 auto

*GA = llvm::GlobalAlias::create(DeclTy, AS,

Linkage

, AliasName,

4536void

CodeGenModule::AddDeferredMultiVersionResolverToEmit(

GlobalDecl

GD) {

4537 const auto

*FD = cast<FunctionDecl>(GD.

getDecl

());

4538

assert(FD &&

"Not a FunctionDecl?"

);

4541

std::string MangledName =

4543 if

(!DeferredResolversToEmit.insert(MangledName).second)

4546

MultiVersionFuncs.push_back(GD);

4552

llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(

GlobalDecl

GD) {

4553 const auto

*FD = cast<FunctionDecl>(GD.

getDecl

());

4554

assert(FD &&

"Not a FunctionDecl?"

);

4556

std::string MangledName =

4561

std::string ResolverName = MangledName;

4565

llvm_unreachable(

"unexpected MultiVersionKind::None for resolver"

);

4569

ResolverName +=

".ifunc"

;

4576

ResolverName +=

".resolver"

;

4579 bool

ShouldReturnIFunc =

4589 if

(ResolverGV && (isa<llvm::GlobalIFunc>(ResolverGV) || !ShouldReturnIFunc))

4598

AddDeferredMultiVersionResolverToEmit(GD);

4602 if

(ShouldReturnIFunc) {

4604

llvm::Type *ResolverType =

4605

llvm::FunctionType::get(llvm::PointerType::get(DeclTy, AS),

false

);

4606

llvm::Constant *Resolver = GetOrCreateLLVMFunction(

4607

MangledName +

".resolver"

, ResolverType,

GlobalDecl

{},

4609

llvm::GlobalIFunc *GIF =

4612

GIF->setName(ResolverName);

4619

llvm::Constant *Resolver = GetOrCreateLLVMFunction(

4620

ResolverName, DeclTy,

GlobalDecl

{},

false

);

4621

assert(isa<llvm::GlobalValue>(Resolver) && !ResolverGV &&

4622 "Resolver should be created for the first time"

);

4627bool

CodeGenModule::shouldDropDLLAttribute(

const Decl

*

D

,

4628 const

llvm::GlobalValue *GV)

const

{

4629 auto

SC = GV->getDLLStorageClass();

4630 if

(SC == llvm::GlobalValue::DefaultStorageClass)

4633 return

(((SC == llvm::GlobalValue::DLLImportStorageClass &&

4634

!MRD->

hasAttr

<DLLImportAttr>()) ||

4635

(SC == llvm::GlobalValue::DLLExportStorageClass &&

4636

!MRD->

hasAttr

<DLLExportAttr>())) &&

4647

llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(

4648

StringRef MangledName, llvm::Type *Ty,

GlobalDecl

GD,

bool

ForVTable,

4649 bool

DontDefer,

bool

IsThunk, llvm::AttributeList ExtraAttrs,

4653

std::string NameWithoutMultiVersionMangling;

4656 if

(

const FunctionDecl

*FD = cast_or_null<FunctionDecl>(

D

)) {

4658 if

(

getLangOpts

().OpenMPIsTargetDevice && OpenMPRuntime &&

4659

!OpenMPRuntime->markAsGlobalTarget(GD) && FD->

isDefined

() &&

4660

!DontDefer && !IsForDefinition) {

4663 if

(

const auto

*CD = dyn_cast<CXXConstructorDecl>(FDDef))

4665 else if

(

const auto

*DD = dyn_cast<CXXDestructorDecl>(FDDef))

4674

UpdateMultiVersionNames(GD, FD, MangledName);

4675 if

(!IsForDefinition) {

4681

AddDeferredMultiVersionResolverToEmit(GD);

4683

*

this

, GD, FD,

true

);

4685 return

GetOrCreateMultiVersionResolver(GD);

4690 if

(!NameWithoutMultiVersionMangling.empty())

4691

MangledName = NameWithoutMultiVersionMangling;

4696 if

(WeakRefReferences.erase(Entry)) {

4698 if

(FD && !FD->

hasAttr

<WeakAttr>())

4699

Entry->setLinkage(llvm::Function::ExternalLinkage);

4703 if

(

D

&& shouldDropDLLAttribute(

D

, Entry)) {

4704

Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);

4710 if

(IsForDefinition && !Entry->isDeclaration()) {

4717

DiagnosedConflictingDefinitions.insert(GD).second) {

4721

diag::note_previous_definition);

4725 if

((isa<llvm::Function>(Entry) || isa<llvm::GlobalAlias>(Entry)) &&

4726

(Entry->getValueType() == Ty)) {

4733 if

(!IsForDefinition)

4740 bool

IsIncompleteFunction =

false

;

4742

llvm::FunctionType *FTy;

4743 if

(isa<llvm::FunctionType>(Ty)) {

4744

FTy = cast<llvm::FunctionType>(Ty);

4746

FTy = llvm::FunctionType::get(

VoidTy

,

false

);

4747

IsIncompleteFunction =

true

;

4751

llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,

4752

Entry ? StringRef() : MangledName, &

getModule

());

4756 if

(

D

&&

D

->

hasAttr

<AnnotateAttr>())

4757

DeferredAnnotations[MangledName] = cast<ValueDecl>(

D

);

4774 if

(!Entry->use_empty()) {

4776

Entry->removeDeadConstantUsers();

4782

assert(F->getName() == MangledName &&

"name was uniqued!"

);

4784

SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);

4785 if

(ExtraAttrs.hasFnAttrs()) {

4786

llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs());

4794 if

(isa_and_nonnull<CXXDestructorDecl>(

D

) &&

4795 getCXXABI

().useThunkForDtorVariant(cast<CXXDestructorDecl>(

D

),

4797

addDeferredDeclToEmit(GD);

4802 auto

DDI = DeferredDecls.find(MangledName);

4803 if

(DDI != DeferredDecls.end()) {

4807

addDeferredDeclToEmit(DDI->second);

4808

DeferredDecls.erase(DDI);

4823 for

(

const auto

*FD = cast<FunctionDecl>(

D

)->getMostRecentDecl(); FD;

4836 if

(!IsIncompleteFunction) {

4837

assert(F->getFunctionType() == Ty);

4853 const auto

*FD = cast<FunctionDecl>(GD.

getDecl

());

4860 if

(

const auto

*DD = dyn_cast<CXXDestructorDecl>(GD.

getDecl

())) {

4863

DD->getParent()->getNumVBases() == 0)

4868 auto

*F = GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer,

4869 false

, llvm::AttributeList(),

4872 if

(LangOpts.CUDA && !LangOpts.CUDAIsDevice &&

4873

cast<FunctionDecl>(GD.

getDecl

())->hasAttr<CUDAGlobalAttr>()) {

4875

cast<llvm::Function>(F->stripPointerCasts()), GD);

4876 if

(IsForDefinition)

4884

llvm::GlobalValue *F =

4887 return

llvm::NoCFIValue::get(F);

4897 if

(

const auto

*FD = dyn_cast<FunctionDecl>(

Result

))

4900 if

(!

C

.getLangOpts().CPlusPlus)

4905

(Name ==

"_ZSt9terminatev"

|| Name ==

"?terminate@@YAXXZ"

)

4906

?

C

.Idents.get(

"terminate"

)

4907

:

C

.Idents.get(Name);

4909 for

(

const auto

&N : {

"__cxxabiv1"

,

"std"

}) {

4913 if

(

auto

*LSD = dyn_cast<LinkageSpecDecl>(

Result

))

4914 for

(

const auto

*

Result

: LSD->lookup(&NS))

4915 if

((ND = dyn_cast<NamespaceDecl>(

Result

)))

4920 if

(

const auto

*FD = dyn_cast<FunctionDecl>(

Result

))

4929

llvm::Function *F, StringRef Name) {

4935 if

(!Local && CGM.

getTriple

().isWindowsItaniumEnvironment() &&

4938 if

(!FD || FD->

hasAttr

<DLLImportAttr>()) {

4939

F->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);

4940

F->setLinkage(llvm::GlobalValue::ExternalLinkage);

4947

llvm::AttributeList ExtraAttrs,

bool

Local,

bool

AssumeConvergent) {

4948 if

(AssumeConvergent) {

4950

ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);

4958

llvm::Constant *

C

= GetOrCreateLLVMFunction(

4960 false

,

false

, ExtraAttrs);

4962 if

(

auto

*F = dyn_cast<llvm::Function>(

C

)) {

4971 return

{ConvTy,

C

};

4976

llvm::FunctionCallee

4978

llvm::AttributeList ExtraAttrs,

bool

Local,

4979 bool

AssumeConvergent) {

4980 if

(AssumeConvergent) {

4982

ExtraAttrs.addFnAttribute(VMContext, llvm::Attribute::Convergent);

4985

llvm::Constant *

C

=

4986

GetOrCreateLLVMFunction(Name, FTy,

GlobalDecl

(),

false

,

4990 if

(

auto

*F = dyn_cast<llvm::Function>(

C

)) {

4999

markRegisterParameterAttributes(F);

5025 if

(WeakRefReferences.erase(Entry)) {

5027

Entry->setLinkage(llvm::Function::ExternalLinkage);

5031 if

(

D

&& shouldDropDLLAttribute(

D

, Entry))

5032

Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);

5034 if

(LangOpts.OpenMP && !LangOpts.OpenMPSimd &&

D

)

5037 if

(Entry->getValueType() == Ty && Entry->getAddressSpace() == TargetAS)

5042 if

(IsForDefinition && !Entry->isDeclaration()) {

5050

(OtherD = dyn_cast<VarDecl>(OtherGD.

getDecl

())) &&

5052

DiagnosedConflictingDefinitions.insert(

D

).second) {

5056

diag::note_previous_definition);

5061 if

(Entry->getType()->getAddressSpace() != TargetAS)

5062 return

llvm::ConstantExpr::getAddrSpaceCast(

5063

Entry, llvm::PointerType::get(Ty->getContext(), TargetAS));

5067 if

(!IsForDefinition)

5073 auto

*GV =

new

llvm::GlobalVariable(

5074 getModule

(), Ty,

false

, llvm::GlobalValue::ExternalLinkage,

nullptr

,

5075

MangledName,

nullptr

, llvm::GlobalVariable::NotThreadLocal,

5076 getContext

().getTargetAddressSpace(DAddrSpace));

5081

GV->takeName(Entry);

5083 if

(!Entry->use_empty()) {

5084

Entry->replaceAllUsesWith(GV);

5087

Entry->eraseFromParent();

5093 auto

DDI = DeferredDecls.find(MangledName);

5094 if

(DDI != DeferredDecls.end()) {

5097

addDeferredDeclToEmit(DDI->second);

5098

DeferredDecls.erase(DDI);

5103 if

(LangOpts.OpenMP && !LangOpts.OpenMPSimd)

5108

GV->setConstant(

D

->getType().isConstantStorage(

getContext

(),

false

,

false

));

5110

GV->setAlignment(

getContext

().getDeclAlign(

D

).getAsAlign());

5114 if

(

D

->getTLSKind()) {

5116

CXXThreadLocals.push_back(

D

);

5124 if

(

getContext

().isMSStaticDataMemberInlineDefinition(

D

)) {

5125

EmitGlobalVarDefinition(

D

);

5129 if

(

D

->hasExternalStorage()) {

5130 if

(

const

SectionAttr *SA =

D

->

getAttr

<SectionAttr>())

5131

GV->setSection(SA->getName());

5135 if

(

getTriple

().getArch() == llvm::Triple::xcore &&

5137 D

->getType().isConstant(Context) &&

5139

GV->setSection(

".cp.rodata"

);

5142 if

(

const auto

*CMA =

D

->

getAttr

<CodeModelAttr>())

5143

GV->setCodeModel(CMA->getModel());

5148 if

(Context.

getLangOpts

().CPlusPlus && GV->hasExternalLinkage() &&

5149 D

->getType().isConstQualified() && !GV->hasInitializer() &&

5150

!

D

->hasDefinition() &&

D

->hasInit() && !

D

->

hasAttr

<DLLImportAttr>()) {

5154 if

(!HasMutableFields) {

5156 const Expr

*InitExpr =

D

->getAnyInitializer(InitDecl);

5161 auto

*InitType =

Init

->getType();

5162 if

(GV->getValueType() != InitType) {

5167

GV->setName(StringRef());

5170 auto

*NewGV = cast<llvm::GlobalVariable>(

5172

->stripPointerCasts());

5175

GV->eraseFromParent();

5178

GV->setInitializer(

Init

);

5179

GV->setConstant(

true

);

5180

GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);

5195 D

->hasExternalStorage())

5200

SanitizerMD->reportGlobal(GV, *

D

);

5203 D

?

D

->getType().getAddressSpace()

5205

assert(

getContext

().getTargetAddressSpace(ExpectedAS) == TargetAS);

5206 if

(DAddrSpace != ExpectedAS) {

5208

*

this

, GV, DAddrSpace, ExpectedAS,

5219 if

(isa<CXXConstructorDecl>(

D

) || isa<CXXDestructorDecl>(

D

))

5221 false

, IsForDefinition);

5223 if

(isa<CXXMethodDecl>(

D

)) {

5231 if

(isa<FunctionDecl>(

D

)) {

5242

StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes

Linkage

,

5243

llvm::Align Alignment) {

5244

llvm::GlobalVariable *GV =

getModule

().getNamedGlobal(Name);

5245

llvm::GlobalVariable *OldGV =

nullptr

;

5249 if

(GV->getValueType() == Ty)

5254

assert(GV->isDeclaration() &&

"Declaration has wrong type!"

);

5259

GV =

new

llvm::GlobalVariable(

getModule

(), Ty,

true

,

5264

GV->takeName(OldGV);

5266 if

(!OldGV->use_empty()) {

5267

OldGV->replaceAllUsesWith(GV);

5270

OldGV->eraseFromParent();

5274

!GV->hasAvailableExternallyLinkage())

5275

GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));

5277

GV->setAlignment(Alignment);

5291

assert(

D

->hasGlobalStorage() &&

"Not a global variable"

);

5309 setDSOLocal

(cast<llvm::GlobalValue>(Ret->stripPointerCasts()));

5314

assert(!

D

->getInit() &&

"Cannot emit definite definitions here!"

);

5322 if

(GV && !GV->isDeclaration())

5327 if

(!MustBeEmitted(

D

) && !GV) {

5328

DeferredDecls[MangledName] =

D

;

5333

EmitGlobalVarDefinition(

D

);

5337 if

(

auto const

*

V

= dyn_cast<const VarDecl>(

D

))

5338

EmitExternalVarDeclaration(

V

);

5339 if

(

auto const

*FD = dyn_cast<const FunctionDecl>(

D

))

5340

EmitExternalFunctionDeclaration(FD);

5349 if

(LangOpts.OpenCL) {

5360 if

(LangOpts.SYCLIsDevice &&

5364 if

(LangOpts.CUDA && LangOpts.CUDAIsDevice) {

5366 if

(

D

->

hasAttr

<CUDAConstantAttr>())

5368 if

(

D

->

hasAttr

<CUDASharedAttr>())

5370 if

(

D

->

hasAttr

<CUDADeviceAttr>())

5372 if

(

D

->getType().isConstQualified())

5378 if

(LangOpts.OpenMP) {

5380 if

(OpenMPRuntime->hasAllocateAttributeForGlobalVar(

D

, AS))

5388 if

(LangOpts.OpenCL)

5390 if

(LangOpts.SYCLIsDevice)

5392 if

(LangOpts.HIP && LangOpts.CUDAIsDevice &&

getTriple

().isSPIRV())

5400 if

(

auto

AS =

getTarget

().getConstantAddressSpace())

5413static

llvm::Constant *

5415

llvm::GlobalVariable *GV) {

5416

llvm::Constant *Cast = GV;

5422

llvm::PointerType::get(

5429template

<

typename

SomeDecl>

5431

llvm::GlobalValue *GV) {

5437 if

(!

D

->template hasAttr<UsedAttr>())

5446 const

SomeDecl *

First

=

D

->getFirstDecl();

5447 if

(

First

->getDeclContext()->isRecord() || !

First

->isInExternCContext())

5453

std::pair<StaticExternCMap::iterator, bool> R =

5454

StaticExternCValues.insert(std::make_pair(

D

->getIdentifier(), GV));

5459

R.first->second =

nullptr

;

5466 if

(

D

.

hasAttr

<SelectAnyAttr>())

5470 if

(

auto

*VD = dyn_cast<VarDecl>(&

D

))

5484

llvm_unreachable(

"No such linkage"

);

5492

llvm::GlobalObject &GO) {

5495

GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));

5503void

CodeGenModule::EmitGlobalVarDefinition(

const VarDecl

*

D

,

5513 if

(LangOpts.OpenMPIsTargetDevice && OpenMPRuntime &&

5514

OpenMPRuntime->emitTargetGlobalVariable(

D

))

5517

llvm::TrackingVH<llvm::Constant>

Init

;

5518 bool

NeedsGlobalCtor =

false

;

5522 bool

IsDefinitionAvailableExternally =

5524 bool

NeedsGlobalDtor =

5525

!IsDefinitionAvailableExternally &&

5532 if

(IsDefinitionAvailableExternally &&

5533

(!

D

->hasConstantInitialization() ||

5537

!

D

->getType().isConstantStorage(

getContext

(),

true

,

true

)))

5541 const Expr

*InitExpr =

D

->getAnyInitializer(InitDecl);

5543

std::optional<ConstantEmitter> emitter;

5548 bool

IsCUDASharedVar =

5553 bool

IsCUDAShadowVar =

5557 bool

IsCUDADeviceShadowVar =

5559

(

D

->getType()->isCUDADeviceBuiltinSurfaceType() ||

5560 D

->getType()->isCUDADeviceBuiltinTextureType());

5562

(IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar))

5563 Init

= llvm::UndefValue::get(

getTypes

().ConvertTypeForMem(ASTTy));

5564 else if

(

D

->

hasAttr

<LoaderUninitializedAttr>())

5565 Init

= llvm::UndefValue::get(

getTypes

().ConvertTypeForMem(ASTTy));

5566 else if

(!InitExpr) {

5580

emitter.emplace(*

this

);

5581

llvm::Constant *

Initializer

= emitter->tryEmitForInitializer(*InitDecl);

5584 if

(

D

->getType()->isReferenceType())

5589 if

(!IsDefinitionAvailableExternally)

5590

NeedsGlobalCtor =

true

;

5594

NeedsGlobalCtor =

false

;

5598 Init

= llvm::PoisonValue::get(

getTypes

().ConvertType(

T

));

5606

DelayedCXXInitPosition.erase(

D

);

5613

assert(VarSize == CstSize &&

"Emitted constant has unexpected size"

);

5618

llvm::Type* InitType =

Init

->getType();

5619

llvm::Constant *Entry =

5623

Entry = Entry->stripPointerCasts();

5626 auto

*GV = dyn_cast<llvm::GlobalVariable>(Entry);

5637 if

(!GV || GV->getValueType() != InitType ||

5638

GV->getType()->getAddressSpace() !=

5642

Entry->setName(StringRef());

5645

GV = cast<llvm::GlobalVariable>(

5647

->stripPointerCasts());

5650

llvm::Constant *NewPtrForOldDecl =

5651

llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,

5653

Entry->replaceAllUsesWith(NewPtrForOldDecl);

5656

cast<llvm::GlobalValue>(Entry)->eraseFromParent();

5661 if

(

D

->

hasAttr

<AnnotateAttr>())

5674 if

(LangOpts.CUDA) {

5675 if

(LangOpts.CUDAIsDevice) {

5676 if

(

Linkage

!= llvm::GlobalValue::InternalLinkage &&

5678 D

->getType()->isCUDADeviceBuiltinSurfaceType() ||

5679 D

->getType()->isCUDADeviceBuiltinTextureType()))

5680

GV->setExternallyInitialized(

true

);

5690

GV->setInitializer(

Init

);

5692

emitter->finalize(GV);

5695

GV->setConstant((

D

->

hasAttr

<CUDAConstantAttr>() && LangOpts.CUDAIsDevice) ||

5696

(!NeedsGlobalCtor && !NeedsGlobalDtor &&

5697 D

->getType().isConstantStorage(

getContext

(),

true

,

true

)));

5700 if

(

const

SectionAttr *SA =

D

->

getAttr

<SectionAttr>()) {

5703

GV->setConstant(

true

);

5708 if

(std::optional<CharUnits> AlignValFromAllocate =

5710

AlignVal = *AlignValFromAllocate;

5728 Linkage

== llvm::GlobalValue::ExternalLinkage &&

5731 Linkage

= llvm::GlobalValue::InternalLinkage;

5734 if

(

D

->

hasAttr

<DLLImportAttr>())

5735

GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);

5736 else if

(

D

->

hasAttr

<DLLExportAttr>())

5737

GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);

5739

GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);

5741 if

(

Linkage

== llvm::GlobalVariable::CommonLinkage) {

5743

GV->setConstant(

false

);

5748 if

(!GV->getInitializer()->isNullValue())

5749

GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);

5752

setNonAliasAttributes(

D

, GV);

5754 if

(

D

->getTLSKind() && !GV->isThreadLocal()) {

5756

CXXThreadLocals.push_back(

D

);

5763 if

(NeedsGlobalCtor || NeedsGlobalDtor)

5764

EmitCXXGlobalVarDeclInitFunc(

D

, GV, NeedsGlobalCtor);

5766

SanitizerMD->reportGlobal(GV, *

D

, NeedsGlobalCtor);

5771

DI->EmitGlobalVariable(GV,

D

);

5774void

CodeGenModule::EmitExternalVarDeclaration(

const VarDecl

*

D

) {

5779

llvm::Constant *GV =

5781

DI->EmitExternalVariable(

5782

cast<llvm::GlobalVariable>(GV->stripPointerCasts()),

D

);

5786void

CodeGenModule::EmitExternalFunctionDeclaration(

const FunctionDecl

*FD) {

5791 auto

*

Fn

= cast<llvm::Function>(

5792

GetOrCreateLLVMFunction(MangledName, Ty, FD,

false

));

5793 if

(!

Fn

->getSubprogram())

5803 if

((NoCommon ||

D

->

hasAttr

<NoCommonAttr>()) && !

D

->

hasAttr

<CommonAttr>())

5810 if

(

D

->getInit() ||

D

->hasExternalStorage())

5820 if

(

D

->

hasAttr

<PragmaClangBSSSectionAttr>() ||

5821 D

->

hasAttr

<PragmaClangDataSectionAttr>() ||

5822 D

->

hasAttr

<PragmaClangRelroSectionAttr>() ||

5823 D

->

hasAttr

<PragmaClangRodataSectionAttr>())

5827 if

(

D

->getTLSKind())

5831 if

(

D

->

hasAttr

<WeakImportAttr>())

5850 if

(FD->isBitField())

5852 if

(FD->

hasAttr

<AlignedAttr>())

5874

llvm::GlobalValue::LinkageTypes

5878 return

llvm::Function::InternalLinkage;

5881 return

llvm::GlobalVariable::WeakAnyLinkage;

5885 return

llvm::GlobalVariable::LinkOnceAnyLinkage;

5890 return

llvm::GlobalValue::AvailableExternallyLinkage;

5904 return

!Context.

getLangOpts

().AppleKext ? llvm::Function::LinkOnceODRLinkage

5905

: llvm::Function::InternalLinkage;

5919 return

llvm::Function::ExternalLinkage;

5922 return D

->

hasAttr

<CUDAGlobalAttr>() ? llvm::Function::ExternalLinkage

5923

: llvm::Function::InternalLinkage;

5924 return

llvm::Function::WeakODRLinkage;

5931

CodeGenOpts.NoCommon))

5932 return

llvm::GlobalVariable::CommonLinkage;

5938 if

(

D

->

hasAttr

<SelectAnyAttr>())

5939 return

llvm::GlobalVariable::WeakODRLinkage;

5943 return

llvm::GlobalVariable::ExternalLinkage;

5946

llvm::GlobalValue::LinkageTypes

5955

llvm::Function *newFn) {

5957 if

(old->use_empty())

5960

llvm::Type *newRetTy = newFn->getReturnType();

5965 for

(llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();

5967

llvm::User *user = ui->getUser();

5971 if

(

auto

*bitcast = dyn_cast<llvm::ConstantExpr>(user)) {

5972 if

(bitcast->getOpcode() == llvm::Instruction::BitCast)

5978

llvm::CallBase *callSite = dyn_cast<llvm::CallBase>(user);

5981 if

(!callSite->isCallee(&*ui))

5986 if

(callSite->getType() != newRetTy && !callSite->use_empty())

5991

llvm::AttributeList oldAttrs = callSite->getAttributes();

5994 unsigned

newNumArgs = newFn->arg_size();

5995 if

(callSite->arg_size() < newNumArgs)

6001 bool

dontTransform =

false

;

6002 for

(llvm::Argument &A : newFn->args()) {

6003 if

(callSite->getArgOperand(argNo)->getType() != A.getType()) {

6004

dontTransform =

true

;

6009

newArgAttrs.push_back(oldAttrs.getParamAttrs(argNo));

6017

newArgs.append(callSite->arg_begin(), callSite->arg_begin() + argNo);

6021

callSite->getOperandBundlesAsDefs(newBundles);

6023

llvm::CallBase *newCall;

6024 if

(isa<llvm::CallInst>(callSite)) {

6025

newCall = llvm::CallInst::Create(newFn, newArgs, newBundles,

""

,

6026

callSite->getIterator());

6028 auto

*oldInvoke = cast<llvm::InvokeInst>(callSite);

6029

newCall = llvm::InvokeInst::Create(

6030

newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(),

6031

newArgs, newBundles,

""

, callSite->getIterator());

6035 if

(!newCall->getType()->isVoidTy())

6036

newCall->takeName(callSite);

6037

newCall->setAttributes(

6038

llvm::AttributeList::get(newFn->getContext(), oldAttrs.getFnAttrs(),

6039

oldAttrs.getRetAttrs(), newArgAttrs));

6040

newCall->setCallingConv(callSite->getCallingConv());

6043 if

(!callSite->use_empty())

6044

callSite->replaceAllUsesWith(newCall);

6047 if

(callSite->getDebugLoc())

6048

newCall->setDebugLoc(callSite->getDebugLoc());

6050

callSitesToBeRemovedFromParent.push_back(callSite);

6053 for

(

auto

*callSite : callSitesToBeRemovedFromParent) {

6054

callSite->eraseFromParent();

6068

llvm::Function *NewFn) {

6070 if

(!isa<llvm::Function>(Old))

return

;

6078

(LangOpts.CUDA && !shouldEmitCUDAGlobalVar(VD)))

6090void

CodeGenModule::EmitGlobalFunctionDefinition(

GlobalDecl

GD,

6091

llvm::GlobalValue *GV) {

6092 const auto

*

D

= cast<FunctionDecl>(GD.

getDecl

());

6099 if

(!GV || (GV->getValueType() != Ty))

6105 if

(!GV->isDeclaration())

6112 auto

*Fn = cast<llvm::Function>(GV);

6124

setNonAliasAttributes(GD, Fn);

6127 if

(

const

ConstructorAttr *CA =

D

->

getAttr

<ConstructorAttr>())

6129 if

(

const

DestructorAttr *DA =

D

->

getAttr

<DestructorAttr>())

6135void

CodeGenModule::EmitAliasDefinition(

GlobalDecl

GD) {

6136 const auto

*

D

= cast<ValueDecl>(GD.

getDecl

());

6137 const

AliasAttr *AA =

D

->

getAttr

<AliasAttr>();

6138

assert(AA &&

"Not an alias?"

);

6142 if

(AA->getAliasee() == MangledName) {

6143

Diags.

Report

(AA->getLocation(), diag::err_cyclic_alias) << 0;

6150 if

(Entry && !Entry->isDeclaration())

6153

Aliases.push_back(GD);

6159

llvm::Constant *Aliasee;

6160

llvm::GlobalValue::LinkageTypes

LT

;

6161 if

(isa<llvm::FunctionType>(DeclTy)) {

6162

Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,

6168 if

(

const auto

*VD = dyn_cast<VarDecl>(GD.

getDecl

()))

6175 unsigned

AS = Aliasee->getType()->getPointerAddressSpace();

6177

llvm::GlobalAlias::create(DeclTy, AS,

LT

,

""

, Aliasee, &

getModule

());

6180 if

(GA->getAliasee() == Entry) {

6181

Diags.

Report

(AA->getLocation(), diag::err_cyclic_alias) << 0;

6185

assert(Entry->isDeclaration());

6194

GA->takeName(Entry);

6196

Entry->replaceAllUsesWith(GA);

6197

Entry->eraseFromParent();

6199

GA->setName(MangledName);

6207

GA->setLinkage(llvm::Function::WeakAnyLinkage);

6210 if

(

const auto

*VD = dyn_cast<VarDecl>(

D

))

6211 if

(VD->getTLSKind())

6217 if

(isa<VarDecl>(

D

))

6219

DI->EmitGlobalAlias(cast<llvm::GlobalValue>(GA->getAliasee()->stripPointerCasts()), GD);

6222void

CodeGenModule::emitIFuncDefinition(

GlobalDecl

GD) {

6223 const auto

*

D

= cast<ValueDecl>(GD.

getDecl

());

6224 const

IFuncAttr *IFA =

D

->

getAttr

<IFuncAttr>();

6225

assert(IFA &&

"Not an ifunc?"

);

6229 if

(IFA->getResolver() == MangledName) {

6230

Diags.

Report

(IFA->getLocation(), diag::err_cyclic_alias) << 1;

6236 if

(Entry && !Entry->isDeclaration()) {

6239

DiagnosedConflictingDefinitions.insert(GD).second) {

6243

diag::note_previous_definition);

6248

Aliases.push_back(GD);

6254

llvm::Constant *Resolver =

6255

GetOrCreateLLVMFunction(IFA->getResolver(),

VoidTy

, {},

6259

llvm::GlobalIFunc *GIF = llvm::GlobalIFunc::create(

6260

DeclTy, AS, llvm::Function::ExternalLinkage,

""

, Resolver, &

getModule

());

6262 if

(GIF->getResolver() == Entry) {

6263

Diags.

Report

(IFA->getLocation(), diag::err_cyclic_alias) << 1;

6266

assert(Entry->isDeclaration());

6275

GIF->takeName(Entry);

6277

Entry->replaceAllUsesWith(GIF);

6278

Entry->eraseFromParent();

6280

GIF->setName(MangledName);

6286 return

llvm::Intrinsic::getOrInsertDeclaration(&

getModule

(),

6287

(llvm::Intrinsic::ID)IID, Tys);

6290static

llvm::StringMapEntry<llvm::GlobalVariable *> &

6293 bool

&IsUTF16,

unsigned

&StringLength) {

6294

StringRef String = Literal->getString();

6295 unsigned

NumBytes = String.size();

6298 if

(!Literal->containsNonAsciiOrNull()) {

6299

StringLength = NumBytes;

6300 return

*Map.insert(std::make_pair(String,

nullptr

)).first;

6307 const

llvm::UTF8 *FromPtr = (

const

llvm::UTF8 *)String.data();

6308

llvm::UTF16 *ToPtr = &ToBuf[0];

6310

(void)llvm::ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, &ToPtr,

6311

ToPtr + NumBytes, llvm::strictConversion);

6314

StringLength = ToPtr - &ToBuf[0];

6318 return

*Map.insert(std::make_pair(

6319

StringRef(

reinterpret_cast<const char

*

>

(ToBuf.data()),

6320

(StringLength + 1) * 2),

6326 unsigned

StringLength = 0;

6327 bool

isUTF16 =

false

;

6328

llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =

6333 if

(

auto

*

C

= Entry.second)

6338 const

llvm::Triple &Triple =

getTriple

();

6341 const bool

IsSwiftABI =

6342 static_cast<unsigned>

(CFRuntime) >=

6347 if

(!CFConstantStringClassRef) {

6348 const char

*CFConstantStringClassName =

"__CFConstantStringClassReference"

;

6350

Ty = llvm::ArrayType::get(Ty, 0);

6352 switch

(CFRuntime) {

6356

CFConstantStringClassName =

6357

Triple.isOSDarwin() ?

"$s15SwiftFoundation19_NSCFConstantStringCN" 6358

:

"$s10Foundation19_NSCFConstantStringCN"

;

6362

CFConstantStringClassName =

6363

Triple.isOSDarwin() ?

"$S15SwiftFoundation19_NSCFConstantStringCN" 6364

:

"$S10Foundation19_NSCFConstantStringCN"

;

6368

CFConstantStringClassName =

6369

Triple.isOSDarwin() ?

"__T015SwiftFoundation19_NSCFConstantStringCN" 6370

:

"__T010Foundation19_NSCFConstantStringCN"

;

6377 if

(Triple.isOSBinFormatELF() || Triple.isOSBinFormatCOFF()) {

6378

llvm::GlobalValue *GV =

nullptr

;

6380 if

((GV = dyn_cast<llvm::GlobalValue>(

C

))) {

6387 if

((VD = dyn_cast<VarDecl>(

Result

)))

6390 if

(Triple.isOSBinFormatELF()) {

6392

GV->setLinkage(llvm::GlobalValue::ExternalLinkage);

6394

GV->setLinkage(llvm::GlobalValue::ExternalLinkage);

6395 if

(!VD || !VD->

hasAttr

<DLLExportAttr>())

6396

GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);

6398

GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);

6406

CFConstantStringClassRef =

6407

IsSwiftABI ? llvm::ConstantExpr::getPtrToInt(

C

, Ty) :

C

;

6412 auto

*STy = cast<llvm::StructType>(

getTypes

().ConvertType(CFTy));

6415 auto

Fields = Builder.beginStruct(STy);

6418

Fields.add(cast<llvm::Constant>(CFConstantStringClassRef));

6422

Fields.addInt(

IntPtrTy

, IsSwift4_1 ? 0x05 : 0x01);

6423

Fields.addInt(

Int64Ty

, isUTF16 ? 0x07d0 : 0x07c8);

6425

Fields.addInt(

IntTy

, isUTF16 ? 0x07d0 : 0x07C8);

6429

llvm::Constant *

C

=

nullptr

;

6432 reinterpret_cast<

uint16_t *

>

(

const_cast<char

*

>

(Entry.first().data())),

6433

Entry.first().size() / 2);

6434 C

= llvm::ConstantDataArray::get(VMContext, Arr);

6436 C

= llvm::ConstantDataArray::getString(VMContext, Entry.first());

6442 new

llvm::GlobalVariable(

getModule

(),

C

->getType(),

true

,

6443

llvm::GlobalValue::PrivateLinkage,

C

,

".str"

);

6444

GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);

6454 if

(Triple.isOSBinFormatMachO())

6455

GV->setSection(isUTF16 ?

"__TEXT,__ustring" 6456

:

"__TEXT,__cstring,cstring_literals"

);

6459 else if

(Triple.isOSBinFormatELF())

6460

GV->setSection(

".rodata"

);

6466

llvm::IntegerType *LengthTy =

6476

Fields.addInt(LengthTy, StringLength);

6484

GV = Fields.finishAndCreateGlobal(

"_unnamed_cfstring_"

, Alignment,

6486

llvm::GlobalVariable::PrivateLinkage);

6487

GV->addAttribute(

"objc_arc_inert"

);

6488 switch

(Triple.getObjectFormat()) {

6489 case

llvm::Triple::UnknownObjectFormat:

6490

llvm_unreachable(

"unknown file format"

);

6491 case

llvm::Triple::DXContainer:

6492 case

llvm::Triple::GOFF:

6493 case

llvm::Triple::SPIRV:

6494 case

llvm::Triple::XCOFF:

6495

llvm_unreachable(

"unimplemented"

);

6496 case

llvm::Triple::COFF:

6497 case

llvm::Triple::ELF:

6498 case

llvm::Triple::Wasm:

6499

GV->setSection(

"cfstring"

);

6501 case

llvm::Triple::MachO:

6502

GV->setSection(

"__DATA,__cfstring"

);

6511 return

!CodeGenOpts.EmitCodeView || CodeGenOpts.DebugColumnInfo;

6515 if

(ObjCFastEnumerationStateType.

isNull

()) {

6517 D

->startDefinition();

6525 for

(

size_t

i = 0; i < 4; ++i) {

6530

FieldTypes[i],

nullptr

,

6538 D

->completeDefinition();

6542 return

ObjCFastEnumerationStateType;

6551 if

(

E

->getCharByteWidth() == 1) {

6556

assert(CAT &&

"String literal not of constant array type!"

);

6558 return

llvm::ConstantDataArray::getString(VMContext, Str,

false

);

6561 auto

*AType = cast<llvm::ArrayType>(

getTypes

().ConvertType(

E

->

getType

()));

6562

llvm::Type *ElemTy = AType->getElementType();

6563 unsigned

NumElements = AType->getNumElements();

6566 if

(ElemTy->getPrimitiveSizeInBits() == 16) {

6568

Elements.reserve(NumElements);

6570 for

(

unsigned

i = 0, e =

E

->getLength(); i != e; ++i)

6571

Elements.push_back(

E

->getCodeUnit(i));

6572

Elements.resize(NumElements);

6573 return

llvm::ConstantDataArray::get(VMContext, Elements);

6576

assert(ElemTy->getPrimitiveSizeInBits() == 32);

6578

Elements.reserve(NumElements);

6580 for

(

unsigned

i = 0, e =

E

->getLength(); i != e; ++i)

6581

Elements.push_back(

E

->getCodeUnit(i));

6582

Elements.resize(NumElements);

6583 return

llvm::ConstantDataArray::get(VMContext, Elements);

6586static

llvm::GlobalVariable *

6595 auto

*GV =

new

llvm::GlobalVariable(

6596

M,

C

->getType(), !CGM.

getLangOpts

().WritableStrings,

LT

,

C

, GlobalName,

6597 nullptr

, llvm::GlobalVariable::NotThreadLocal, AddrSpace);

6599

GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);

6600 if

(GV->isWeakForLinker()) {

6601

assert(CGM.

supportsCOMDAT

() &&

"Only COFF uses weak string literals"

);

6602

GV->setComdat(M.getOrInsertComdat(GV->getName()));

6618

llvm::GlobalVariable **Entry =

nullptr

;

6619 if

(!LangOpts.WritableStrings) {

6620

Entry = &ConstantStringMap[

C

];

6621 if

(

auto

GV = *Entry) {

6622 if

(uint64_t(Alignment.

getQuantity

()) > GV->getAlignment())

6625

GV->getValueType(), Alignment);

6630

StringRef GlobalVariableName;

6631

llvm::GlobalValue::LinkageTypes

LT

;

6636 if

(

getCXXABI

().getMangleContext().shouldMangleStringLiteral(S) &&

6637

!LangOpts.WritableStrings) {

6638

llvm::raw_svector_ostream Out(MangledNameBuffer);

6640 LT

= llvm::GlobalValue::LinkOnceODRLinkage;

6641

GlobalVariableName = MangledNameBuffer;

6643 LT

= llvm::GlobalValue::PrivateLinkage;

6644

GlobalVariableName = Name;

6656

SanitizerMD->reportGlobal(GV, S->getStrTokenLoc(0),

"<string literal>"

);

6659

GV->getValueType(), Alignment);

6676 const

std::string &Str,

const char

*GlobalName) {

6677

StringRef StrWithNull(Str.c_str(), Str.size() + 1);

6681

llvm::Constant *

C

=

6682

llvm::ConstantDataArray::getString(

getLLVMContext

(), StrWithNull,

false

);

6685

llvm::GlobalVariable **Entry =

nullptr

;

6686 if

(!LangOpts.WritableStrings) {

6687

Entry = &ConstantStringMap[

C

];

6688 if

(

auto

GV = *Entry) {

6689 if

(uint64_t(Alignment.

getQuantity

()) > GV->getAlignment())

6692

GV->getValueType(), Alignment);

6698

GlobalName =

".str"

;

6701

GlobalName, Alignment);

6706

GV->getValueType(), Alignment);

6711

assert((

E

->getStorageDuration() ==

SD_Static

||

6712 E

->getStorageDuration() ==

SD_Thread

) &&

"not a global temporary"

);

6713 const auto

*VD = cast<VarDecl>(

E

->getExtendingDecl());

6718 if

(

Init

==

E

->getSubExpr())

6719

MaterializedType =

E

->

getType

();

6723 auto

InsertResult = MaterializedGlobalTemporaryMap.insert({

E

,

nullptr

});

6724 if

(!InsertResult.second) {

6727 if

(!InsertResult.first->second) {

6732

InsertResult.first->second =

new

llvm::GlobalVariable(

6733 getModule

(),

Type

,

false

, llvm::GlobalVariable::InternalLinkage,

6737

llvm::cast<llvm::GlobalVariable>(

6738

InsertResult.first->second->stripPointerCasts())

6747

llvm::raw_svector_ostream Out(Name);

6749

VD,

E

->getManglingNumber(), Out);

6752 if

(

E

->getStorageDuration() ==

SD_Static

&& VD->evaluateValue()) {

6758 Value

=

E

->getOrCreateValue(

false

);

6769

std::optional<ConstantEmitter> emitter;

6770

llvm::Constant *InitialValue =

nullptr

;

6771 bool

Constant =

false

;

6775

emitter.emplace(*

this

);

6776

InitialValue = emitter->emitForInitializer(*

Value

, AddrSpace,

6781 Type

= InitialValue->getType();

6790 if

(

Linkage

== llvm::GlobalVariable::ExternalLinkage) {

6792 if

(VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&

6796 Linkage

= llvm::GlobalVariable::LinkOnceODRLinkage;

6800 Linkage

= llvm::GlobalVariable::InternalLinkage;

6804 auto

*GV =

new

llvm::GlobalVariable(

6806 nullptr

, llvm::GlobalVariable::NotThreadLocal, TargetAS);

6807 if

(emitter) emitter->finalize(GV);

6809 if

(!llvm::GlobalValue::isLocalLinkage(

Linkage

)) {

6811 if

(GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass)

6813

GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);

6817

GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));

6818 if

(VD->getTLSKind())

6820

llvm::Constant *CV = GV;

6824

llvm::PointerType::get(

6830

llvm::Constant *&Entry = MaterializedGlobalTemporaryMap[

E

];

6832

Entry->replaceAllUsesWith(CV);

6833

llvm::cast<llvm::GlobalVariable>(Entry)->eraseFromParent();

6842void

CodeGenModule::EmitObjCPropertyImplementations(

const 6844 for

(

const auto

*PID :

D

->property_impls()) {

6855 if

(!Getter || Getter->isSynthesizedAccessorStub())

6858 auto

*Setter = PID->getSetterMethodDecl();

6859 if

(!PD->

isReadOnly

() && (!Setter || Setter->isSynthesizedAccessorStub()))

6870 if

(ivar->getType().isDestructedType())

6880 E

=

D

->init_end(); B !=

E

; ++B) {

6903 D

->addInstanceMethod(DTORMethod);

6905 D

->setHasDestructors(

true

);

6910 if

(

D

->getNumIvarInitializers() == 0 ||

6919 getContext

().getObjCIdType(),

nullptr

,

D

,

true

,

6924 D

->addInstanceMethod(CTORMethod);

6926 D

->setHasNonZeroConstructors(

true

);

6937

EmitDeclContext(LSD);

6942 if

(LangOpts.CUDA && LangOpts.CUDAIsDevice)

6945

std::unique_ptr<CodeGenFunction> &CurCGF =

6946

GlobalTopLevelStmtBlockInFlight.first;

6950 if

(CurCGF && CXXGlobalInits.back() != CurCGF->CurFn) {

6958

std::string Name =

"__stmts__"

+ llvm::utostr(CXXGlobalInits.size());

6964

llvm::Function *

Fn

= llvm::Function::Create(

6965

FnTy, llvm::GlobalValue::InternalLinkage, Name, &

getModule

());

6968

GlobalTopLevelStmtBlockInFlight.second =

D

;

6969

CurCGF->StartFunction(

GlobalDecl

(), RetTy, Fn, FnInfo, Args,

6971

CXXGlobalInits.push_back(Fn);

6974

CurCGF->EmitStmt(

D

->getStmt());

6977void

CodeGenModule::EmitDeclContext(

const DeclContext

*DC) {

6978 for

(

auto

*I : DC->

decls

()) {

6984 if

(

auto

*OID = dyn_cast<ObjCImplDecl>(I)) {

6985 for

(

auto

*M : OID->methods())

7004 case

Decl::CXXConversion:

7005 case

Decl::CXXMethod:

7006 case

Decl::Function:

7013 case

Decl::CXXDeductionGuide:

7018 case

Decl::Decomposition:

7019 case

Decl::VarTemplateSpecialization:

7021 if

(

auto

*DD = dyn_cast<DecompositionDecl>(

D

))

7022 for

(

auto

*B : DD->flat_bindings())

7023 if

(

auto

*HD = B->getHoldingVar())

7030 case

Decl::IndirectField:

7034 case

Decl::Namespace:

7035

EmitDeclContext(cast<NamespaceDecl>(

D

));

7037 case

Decl::ClassTemplateSpecialization: {

7038 const auto

*Spec = cast<ClassTemplateSpecializationDecl>(

D

);

7040 if

(Spec->getSpecializationKind() ==

7042

Spec->hasDefinition())

7043

DI->completeTemplateDefinition(*Spec);

7045 case

Decl::CXXRecord: {

7052

DI->completeUnusedClass(*CRD);

7055 for

(

auto

*I : CRD->

decls

())

7056 if

(isa<VarDecl>(I) || isa<CXXRecordDecl>(I))

7061 case

Decl::UsingShadow:

7062 case

Decl::ClassTemplate:

7063 case

Decl::VarTemplate:

7065 case

Decl::VarTemplatePartialSpecialization:

7066 case

Decl::FunctionTemplate:

7067 case

Decl::TypeAliasTemplate:

7074

DI->EmitUsingDecl(cast<UsingDecl>(*

D

));

7076 case

Decl::UsingEnum:

7078

DI->EmitUsingEnumDecl(cast<UsingEnumDecl>(*

D

));

7080 case

Decl::NamespaceAlias:

7082

DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*

D

));

7084 case

Decl::UsingDirective:

7086

DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*

D

));

7088 case

Decl::CXXConstructor:

7091 case

Decl::CXXDestructor:

7095 case

Decl::StaticAssert:

7102 case

Decl::ObjCInterface:

7103 case

Decl::ObjCCategory:

7106 case

Decl::ObjCProtocol: {

7107 auto

*Proto = cast<ObjCProtocolDecl>(

D

);

7108 if

(Proto->isThisDeclarationADefinition())

7113 case

Decl::ObjCCategoryImpl:

7116 ObjCRuntime

->GenerateCategory(cast<ObjCCategoryImplDecl>(

D

));

7119 case

Decl::ObjCImplementation: {

7120 auto

*OMD = cast<ObjCImplementationDecl>(

D

);

7121

EmitObjCPropertyImplementations(OMD);

7122

EmitObjCIvarInitializations(OMD);

7127

DI->getOrCreateInterfaceType(

getContext

().getObjCInterfaceType(

7128

OMD->getClassInterface()), OMD->getLocation());

7131 case

Decl::ObjCMethod: {

7132 auto

*OMD = cast<ObjCMethodDecl>(

D

);

7138 case

Decl::ObjCCompatibleAlias:

7139 ObjCRuntime

->RegisterAlias(cast<ObjCCompatibleAliasDecl>(

D

));

7142 case

Decl::PragmaComment: {

7143 const auto

*PCD = cast<PragmaCommentDecl>(

D

);

7144 switch

(PCD->getCommentKind()) {

7146

llvm_unreachable(

"unexpected pragma comment kind"

);

7161 case

Decl::PragmaDetectMismatch: {

7162 const auto

*PDMD = cast<PragmaDetectMismatchDecl>(

D

);

7167 case

Decl::LinkageSpec:

7168

EmitLinkageSpec(cast<LinkageSpecDecl>(

D

));

7171 case

Decl::FileScopeAsm: {

7173 if

(LangOpts.CUDA && LangOpts.CUDAIsDevice)

7176 if

(LangOpts.OpenMPIsTargetDevice)

7179 if

(LangOpts.SYCLIsDevice)

7181 auto

*AD = cast<FileScopeAsmDecl>(

D

);

7182 getModule

().appendModuleInlineAsm(AD->getAsmString()->getString());

7186 case

Decl::TopLevelStmt:

7187

EmitTopLevelStmt(cast<TopLevelStmtDecl>(

D

));

7190 case

Decl::Import: {

7191 auto

*Import = cast<ImportDecl>(

D

);

7194 if

(!ImportedModules.insert(Import->getImportedModule()))

7198 if

(!Import->getImportedOwningModule()) {

7200

DI->EmitImportDecl(*Import);

7206 if

(CXX20ModuleInits && Import->getImportedModule() &&

7207

Import->getImportedModule()->isNamedModule())

7216 Visited

.insert(Import->getImportedModule());

7217

Stack.push_back(Import->getImportedModule());

7219 while

(!Stack.empty()) {

7221 if

(!EmittedModuleInitializers.insert(Mod).second)

7228 for

(

auto

*Submodule : Mod->

submodules

()) {

7231 if

(Submodule->IsExplicit)

7234 if

(

Visited

.insert(Submodule).second)

7235

Stack.push_back(Submodule);

7242

EmitDeclContext(cast<ExportDecl>(

D

));

7245 case

Decl::OMPThreadPrivate:

7249 case

Decl::OMPAllocate:

7253 case

Decl::OMPDeclareReduction:

7257 case

Decl::OMPDeclareMapper:

7261 case

Decl::OMPRequires:

7266 case

Decl::TypeAlias:

7268

DI->EmitAndRetainType(

7269 getContext

().getTypedefType(cast<TypedefNameDecl>(

D

)));

7281

DI->EmitAndRetainType(

getContext

().getEnumType(cast<EnumDecl>(

D

)));

7284 case

Decl::HLSLBuffer:

7292

assert(isa<TypeDecl>(

D

) &&

"Unsupported decl kind"

);

7299 if

(!CodeGenOpts.CoverageMapping)

7302 case

Decl::CXXConversion:

7303 case

Decl::CXXMethod:

7304 case

Decl::Function:

7305 case

Decl::ObjCMethod:

7306 case

Decl::CXXConstructor:

7307 case

Decl::CXXDestructor: {

7308 if

(!cast<FunctionDecl>(

D

)->doesThisDeclarationHaveABody())

7316

DeferredEmptyCoverageMappingDecls.try_emplace(

D

,

true

);

7326 if

(!CodeGenOpts.CoverageMapping)

7328 if

(

const auto

*Fn = dyn_cast<FunctionDecl>(

D

)) {

7329 if

(Fn->isTemplateInstantiation())

7332

DeferredEmptyCoverageMappingDecls.insert_or_assign(

D

,

false

);

7340 for

(

const auto

&Entry : DeferredEmptyCoverageMappingDecls.takeVector()) {

7343 const Decl

*

D

= Entry.first;

7345 case

Decl::CXXConversion:

7346 case

Decl::CXXMethod:

7347 case

Decl::Function:

7348 case

Decl::ObjCMethod: {

7355 case

Decl::CXXConstructor: {

7362 case

Decl::CXXDestructor: {

7379 if

(llvm::Function *F =

getModule

().getFunction(

"main"

)) {

7380 if

(!F->isDeclaration() && F->arg_size() == 0 && !F->isVarArg() &&

7382 auto

*GA = llvm::GlobalAlias::create(

"__main_void"

, F);

7383

GA->setVisibility(llvm::GlobalValue::HiddenVisibility);

7392

llvm::Type *i64 = llvm::Type::getInt64Ty(Context);

7393 return

llvm::ConstantInt::get(i64, PtrInt);

7397

llvm::NamedMDNode *&GlobalMetadata,

7399

llvm::GlobalValue *Addr) {

7400 if

(!GlobalMetadata)

7402

CGM.

getModule

().getOrInsertNamedMetadata(

"clang.global.decl.ptrs"

);

7405

llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(Addr),

7408

GlobalMetadata->addOperand(llvm::MDNode::get(CGM.

getLLVMContext

(), Ops));

7411bool

CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,

7412

llvm::GlobalValue *CppFunc) {

7420 if

(Elem == CppFunc)

7426 for

(llvm::User *User : Elem->users()) {

7430 if

(

auto

*ConstExpr = dyn_cast<llvm::ConstantExpr>(User)) {

7431 if

(ConstExpr->getOpcode() != llvm::Instruction::BitCast)

7434 for

(llvm::User *CEUser : ConstExpr->users()) {

7435 if

(

auto

*IFunc = dyn_cast<llvm::GlobalIFunc>(CEUser)) {

7436

IFuncs.push_back(IFunc);

7441

CEs.push_back(ConstExpr);

7442

}

else if

(

auto

*IFunc = dyn_cast<llvm::GlobalIFunc>(User)) {

7443

IFuncs.push_back(IFunc);

7455 for

(llvm::GlobalIFunc *IFunc : IFuncs)

7456

IFunc->setResolver(

nullptr

);

7457 for

(llvm::ConstantExpr *ConstExpr : CEs)

7458

ConstExpr->destroyConstant();

7462

Elem->eraseFromParent();

7464 for

(llvm::GlobalIFunc *IFunc : IFuncs) {

7469

llvm::FunctionType::get(IFunc->getType(),

false

);

7470

llvm::Constant *Resolver = GetOrCreateLLVMFunction(

7471

CppFunc->getName(), ResolverTy, {},

false

);

7472

IFunc->setResolver(Resolver);

7482void

CodeGenModule::EmitStaticExternCAliases() {

7485 for

(

auto

&I : StaticExternCValues) {

7487

llvm::GlobalValue *Val = I.second;

7495

llvm::GlobalValue *ExistingElem =

7496 getModule

().getNamedValue(Name->getName());

7500 if

(!ExistingElem || CheckAndReplaceExternCIFuncs(ExistingElem, Val))

7507 auto

Res = Manglings.find(MangledName);

7508 if

(Res == Manglings.end())

7510 Result

= Res->getValue();

7521void

CodeGenModule::EmitDeclMetadata() {

7522

llvm::NamedMDNode *GlobalMetadata =

nullptr

;

7524 for

(

auto

&I : MangledDeclNames) {

7525

llvm::GlobalValue *Addr =

getModule

().getNamedValue(I.second);

7535void

CodeGenFunction::EmitDeclMetadata() {

7536 if

(LocalDeclMap.empty())

return

;

7541 unsigned

DeclPtrKind = Context.getMDKindID(

"clang.decl.ptr"

);

7543

llvm::NamedMDNode *GlobalMetadata =

nullptr

;

7545 for

(

auto

&I : LocalDeclMap) {

7546 const Decl

*

D

= I.first;

7547

llvm::Value *Addr = I.second.emitRawPointer(*

this

);

7548 if

(

auto

*Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {

7550

Alloca->setMetadata(

7551

DeclPtrKind, llvm::MDNode::get(

7552

Context, llvm::ValueAsMetadata::getConstant(DAddr)));

7553

}

else if

(

auto

*GV = dyn_cast<llvm::GlobalValue>(Addr)) {

7560void

CodeGenModule::EmitVersionIdentMetadata() {

7561

llvm::NamedMDNode *IdentMetadata =

7562

TheModule.getOrInsertNamedMetadata(

"llvm.ident"

);

7564

llvm::LLVMContext &Ctx = TheModule.getContext();

7566

llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};

7567

IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));

7570void

CodeGenModule::EmitCommandLineMetadata() {

7571

llvm::NamedMDNode *CommandLineMetadata =

7572

TheModule.getOrInsertNamedMetadata(

"llvm.commandline"

);

7574

llvm::LLVMContext &Ctx = TheModule.getContext();

7576

llvm::Metadata *CommandLineNode[] = {llvm::MDString::get(Ctx, CommandLine)};

7577

CommandLineMetadata->addOperand(llvm::MDNode::get(Ctx, CommandLineNode));

7580void

CodeGenModule::EmitCoverageFile() {

7581

llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata(

"llvm.dbg.cu"

);

7585

llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata(

"llvm.gcov"

);

7586

llvm::LLVMContext &Ctx = TheModule.getContext();

7587 auto

*CoverageDataFile =

7589 auto

*CoverageNotesFile =

7591 for

(

int

i = 0, e = CUNode->getNumOperands(); i != e; ++i) {

7592

llvm::MDNode *CU = CUNode->getOperand(i);

7593

llvm::Metadata *Elts[] = {CoverageNotesFile, CoverageDataFile, CU};

7594

GCov->addOperand(llvm::MDNode::get(Ctx, Elts));

7615 if

(LangOpts.OpenMP && LangOpts.OpenMPSimd)

7617 for

(

auto

RefExpr :

D

->varlist()) {

7618 auto

*VD = cast<VarDecl>(cast<DeclRefExpr>(RefExpr)->getDecl());

7620

VD->getAnyInitializer() &&

7621

!VD->getAnyInitializer()->isConstantInitializer(

getContext

(),

7627 if

(

auto

InitFunction =

getOpenMPRuntime

().emitThreadPrivateVarDefinition(

7628

VD, Addr, RefExpr->getBeginLoc(), PerformInit))

7629

CXXGlobalInits.push_back(InitFunction);

7634

CodeGenModule::CreateMetadataIdentifierImpl(

QualType T

, MetadataTypeMap &Map,

7638

FnType->getReturnType(), FnType->getParamTypes(),

7639

FnType->getExtProtoInfo().withExceptionSpec(

EST_None

));

7641

llvm::Metadata *&InternalId = Map[

T

.getCanonicalType()];

7646

std::string OutName;

7647

llvm::raw_string_ostream Out(OutName);

7652

Out <<

".normalized"

;

7666 return

CreateMetadataIdentifierImpl(

T

, MetadataIdMap,

""

);

7671 return

CreateMetadataIdentifierImpl(

T

, VirtualMetadataIdMap,

".virtual"

);

7691 for

(

auto

&Param : FnType->param_types())

7696

GeneralizedParams, FnType->getExtProtoInfo());

7703

llvm_unreachable(

"Encountered unknown FunctionType"

);

7708

GeneralizedMetadataIdMap,

".generalized"

);

7715 return

((LangOpts.

Sanitize

.

has

(SanitizerKind::CFIVCall) &&

7717

(LangOpts.

Sanitize

.

has

(SanitizerKind::CFINVCall) &&

7719

(LangOpts.

Sanitize

.

has

(SanitizerKind::CFIDerivedCast) &&

7721

(LangOpts.

Sanitize

.

has

(SanitizerKind::CFIUnrelatedCast) &&

7728

llvm::Metadata *MD =

7730

VTable->addTypeMetadata(Offset.getQuantity(), MD);

7732 if

(CodeGenOpts.SanitizeCfiCrossDso)

7734

VTable->addTypeMetadata(Offset.getQuantity(),

7735

llvm::ConstantAsMetadata::get(CrossDsoTypeId));

7738

llvm::Metadata *MD = llvm::MDString::get(

getLLVMContext

(),

"all-vtables"

);

7739

VTable->addTypeMetadata(Offset.getQuantity(), MD);

7745

SanStats = std::make_unique<llvm::SanitizerStatReport>(&

getModule

());

7755 auto

*FTy = llvm::FunctionType::get(SamplerT, {

C

->getType()},

false

);

7770 bool

forPointeeType) {

7781 if

(

auto

Align = TT->getDecl()->getMaxAlignment()) {

7811 if

(

T

.getQualifiers().hasUnaligned()) {

7813

}

else if

(forPointeeType && !AlignForArray &&

7825 if

(

unsigned

MaxAlign =

getLangOpts

().MaxTypeAlign) {

7838 if

(NumAutoVarInit >= StopAfter) {

7841 if

(!NumAutoVarInit) {

7844 "-ftrivial-auto-var-init-stop-after=%0 has been enabled to limit the " 7845 "number of times ftrivial-auto-var-init=%1 gets applied."

);

7859 const Decl

*

D

)

const

{

7863

OS << (isa<VarDecl>(

D

) ?

".static."

:

".intern."

);

7865

OS << (isa<VarDecl>(

D

) ?

"__static__"

:

"__intern__"

);

7871

assert(PLoc.

isValid

() &&

"Source location is expected to be valid."

);

7875

llvm::MD5::MD5Result

Result

;

7876 for

(

const auto

&Arg : PreprocessorOpts.

Macros

)

7877

Hash.update(Arg.first);

7881

llvm::sys::fs::UniqueID ID;

7882 if

(llvm::sys::fs::getUniqueID(PLoc.

getFilename

(), ID)) {

7884

assert(PLoc.

isValid

() &&

"Source location is expected to be valid."

);

7885 if

(

auto

EC = llvm::sys::fs::getUniqueID(PLoc.

getFilename

(), ID))

7886 SM

.getDiagnostics().Report(diag::err_cannot_open_file)

7889

OS << llvm::format(

"%x"

, ID.getFile()) << llvm::format(

"%x"

, ID.getDevice())

7890

<<

"_"

<< llvm::utohexstr(

Result

.low(),

true

,

8);

7897

assert(DeferredDeclsToEmit.empty() &&

7898 "Should have emitted all decls deferred to emit."

);

7899

assert(NewBuilder->DeferredDecls.empty() &&

7900 "Newly created module should not have deferred decls"

);

7901

NewBuilder->DeferredDecls = std::move(DeferredDecls);

7902

assert(EmittedDeferredDecls.empty() &&

7903 "Still have (unmerged) EmittedDeferredDecls deferred decls"

);

7905

assert(NewBuilder->DeferredVTables.empty() &&

7906 "Newly created module should not have deferred vtables"

);

7907

NewBuilder->DeferredVTables = std::move(DeferredVTables);

7909

assert(NewBuilder->MangledDeclNames.empty() &&

7910 "Newly created module should not have mangled decl names"

);

7911

assert(NewBuilder->Manglings.empty() &&

7912 "Newly created module should not have manglings"

);

7913

NewBuilder->Manglings = std::move(Manglings);

7915

NewBuilder->WeakRefReferences = std::move(WeakRefReferences);

7917

NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);

Defines the clang::ASTContext interface.

ASTImporterLookupTable & LT

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 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 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 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 QualType GeneralizeFunctionType(ASTContext &Ctx, QualType Ty)

static bool allowKCFIIdentifier(StringRef Name)

static bool shouldAssumeDSOLocal(const CodeGenModule &CGM, llvm::GlobalValue *GV)

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 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 uint64_t getFMVPriority(const TargetInfo &TI, const CodeGenFunction::FMVResolverOption &RO)

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 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 bool shouldBeInCOMDAT(CodeGenModule &CGM, const Decl &D)

static std::string getMangledNameImpl(CodeGenModule &CGM, GlobalDecl GD, const NamedDecl *ND, bool OmitMultiVersionMangling=false)

static void setLinkageForGV(llvm::GlobalValue *GV, const NamedDecl *ND)

static unsigned ArgInfoAddressSpace(LangAS AS)

static void replaceDeclarationWith(llvm::GlobalValue *Old, llvm::Constant *New)

static QualType GeneralizeType(ASTContext &Ctx, QualType Ty)

static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, llvm::Function *NewFn)

ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we implement a function with...

static bool isVarDeclStrongDefinition(const ASTContext &Context, CodeGenModule &CGM, const VarDecl *D, bool NoCommon)

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::DenseSet< const void * > Visited

llvm::MachO::Target Target

llvm::MachO::Record Record

Defines the clang::Module class, which describes a module in the source code.

static const RecordType * getRecordType(QualType QT)

Checks that the passed in QualType either is of RecordType or points to RecordType.

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()

TranslationUnitDecl * getTranslationUnitDecl() const

const ConstantArrayType * getAsConstantArrayType(QualType T) const

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

llvm::StringMap< SectionInfo > SectionInfos

QualType getTagDeclType(const TagDecl *Decl) const

Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.

QualType getMemberPointerType(QualType T, const Type *Cls) const

Return the uniqued reference to the type for a member pointer to the specified type in the specified ...

QualType getRecordType(const RecordDecl *Decl) 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()'.

CanQualType getCanonicalType(QualType T) const

Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...

bool shouldExternalize(const Decl *D) const

Whether a C++ static variable or CUDA/HIP kernel should be externalized.

FullSourceLoc getFullLoc(SourceLocation Loc) const

const XRayFunctionFilter & getXRayFilter() const

ArrayRef< Decl * > getModuleInitializers(Module *M)

Get the initializations to perform when importing a module, if any.

bool DeclMustBeEmitted(const Decl *D)

Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...

RecordDecl * buildImplicitRecord(StringRef Name, RecordDecl::TagKind TK=RecordDecl::TagKind::Struct) const

Create a new implicit TU-level CXXRecordDecl or RecordDecl declaration.

QualType getPointerType(QualType T) const

Return the uniqued reference to the type for a pointer to the specified type.

StringRef getCUIDHash() const

bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const

Returns true if this is an inline-initialized static data member which is treated as a definition for...

Builtin::Context & BuiltinInfo

QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const

Return the unique reference to the type for a constant array of the specified element type.

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.

llvm::SetVector< const ValueDecl * > CUDAExternalDeviceDeclODRUsedByHost

Keep track of CUDA/HIP external kernels or device variables ODR-used by host code.

QualType getCFConstantStringType() const

Return the C structure type used to represent constant CFStrings.

const NoSanitizeList & getNoSanitizeList() const

GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const

CanQualType UnsignedLongTy

bool isAlignmentRequired(const Type *T) const

Determine if the alignment the type has was required using an alignment attribute.

CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const

Return a conservative estimate of the alignment of the specified decl D.

int64_t toBits(CharUnits CharSize) const

Convert a size in characters to a size in bits.

const clang::PrintingPolicy & getPrintingPolicy() const

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

QualType getObjCIdType() const

Represents the Objective-CC id type.

CharUnits getTypeSizeInChars(QualType T) const

Return the size of the specified (complete) type T, in characters.

unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const

Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...

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.

unsigned getTargetAddressSpace(LangAS AS) const

QualType getWideCharType() const

Return the type of wide characters.

InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const

Determine whether a definition of this inline variable should be treated as a weak or strong definiti...

Module * getCurrentNamedModule() const

Get module under construction, nullptr if this is not a C++20 module.

uint64_t getCharWidth() const

Return the size of the character type, in bits.

Attr - This represents one attribute.

Represents a block literal declaration, which is like an unnamed FunctionDecl.

Holds information about both target-independent and target-specific builtins, allowing easy queries b...

bool isLibFunction(unsigned ID) const

Return true if this is a builtin for a libc/libm function, with a "__builtin_" prefix (e....

llvm::StringRef getName(unsigned ID) const

Return the identifier name for the specified builtin, e.g.

Represents a base class of a C++ class.

Represents binding an expression to a temporary.

Represents a call to a C++ constructor.

Represents a C++ base or member initializer.

Expr * getInit() const

Get the initializer.

Represents a delete expression for memory deallocation and destructor calls, e.g.

Represents a C++ destructor within a class.

Represents a call to a member function that may be written either with member call syntax (e....

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.

Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".

Represents a C++ struct/union/class.

bool hasMutableFields() const

Determine whether this class, or any of its class subobjects, contains a mutable field.

unsigned getNumBases() const

Retrieves the number of base classes of this class.

bool hasDefinition() const

CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).

CanProxy< U > castAs() const

CharUnits - This is an opaque type for sizes expressed in character units.

llvm::Align getAsAlign() const

getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...

QuantityType getQuantity() const

getQuantity - Get the raw integer representation of this quantity.

static CharUnits One()

One - Construct a CharUnits quantity of one.

static CharUnits fromQuantity(QuantityType Quantity)

fromQuantity - Construct a CharUnits quantity from a raw integer type.

CodeGenOptions - Track various options which control how the code is optimized and passed to the back...

std::string 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::string CoverageNotesFile

The filename with path we use for coverage notes files.

std::string ProfileInstrumentUsePath

Name of the profile file to use as input for -fprofile-instr-use.

std::string MemoryProfileOutput

Name of the profile file to use as output for with -fmemory-profile.

std::vector< std::string > TocDataVarsUserSpecified

List of global variables explicitly specified by the user as toc-data.

std::string CoverageDataFile

The filename with path we use for coverage data files.

PointerAuthOptions PointerAuth

Configuration for pointer-signing.

llvm::DenormalMode FP32DenormalMode

The floating-point denormal mode to use, for float.

SanitizerSet SanitizeTrap

Set of sanitizer checks that trap rather than diagnose.

std::string ProfileRemappingFile

Name of the profile remapping file to apply to the profile data supplied by -fprofile-sample-use or -...

bool hasProfileClangUse() const

Check if Clang profile use is on.

std::string SymbolPartition

The name of the partition that symbols are assigned to, specified with -fsymbol-partition (see https:...

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 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 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...

Class supports emissionof SIMD-only code.

CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...

void GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP, ObjCMethodDecl *MD, bool ctor)

void GenerateObjCMethod(const ObjCMethodDecl *OMD)

void EmitCfiCheckStub()

Emit a stub for the cross-DSO CFI check function.

void EmitCfiCheckFail()

Emit a cross-DSO CFI failure handling function.

bool isTrivialInitializer(const Expr *Init)

Determine whether the given initializer is trivial in the sense that it requires no code to be genera...

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.

void GenerateObjCGetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)

GenerateObjCGetter - Synthesize an Objective-C property getter function.

llvm::LLVMContext & getLLVMContext()

void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)

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.

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.

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 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.

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 AppendLinkerOptions(StringRef Opts)

Appends Opts to the "llvm.linker.options" metadata value.

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.

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)

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 CreateFunctionTypeMetadataForIcall(const FunctionDecl *FD, llvm::Function *F)

Create and attach type metadata to the given function.

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 addReplacement(StringRef Name, llvm::Constant *C)

llvm::ConstantInt * CreateKCFITypeId(QualType T)

Generate a KCFI type identifier for T.

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.

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, const char *GlobalName=nullptr)

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 GenerateClassData(const CXXRecordDecl *RD)

GenerateClassData - Generate all the class data required to be generated upon definition of a KeyFunc...

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.

FunctionArgList - Type for representing both the decl and type of parameters to a function.

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, LangAS DestAddr, 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.

ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.

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.

decl_range decls() const

decls_begin/decls_end - Iterate over the declarations stored in this context.

A reference to a declared variable, function, enum, etc.

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.

FunctionDecl * getAsFunction() LLVM_READONLY

Returns the function itself, or the templated function if this is a function template.

const Attr * getDefiningAttr() const

Return this declaration's defining attribute if it has one.

llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const

SourceLocation getLocation() const

SourceLocation getBeginLoc() const LLVM_READONLY

DeclContext * getLexicalDeclContext()

getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).

virtual Decl * getCanonicalDecl()

Retrieves the "canonical" declaration of the given declaration.

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.

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 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 * 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 isReplaceableGlobalAllocationFunction(std::optional< unsigned > *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const

Determines whether this function is one of the replaceable global allocation functions: void *operato...

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.

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...

bool isSignReturnAddressWithAKey() const

Check if return address signing uses AKey.

clang::ObjCRuntime ObjCRuntime

CoreFoundationABI CFRuntime

SanitizerSet Sanitize

Set of enabled sanitizers.

bool hasSignReturnAddress() const

Check if return address signing is enabled.

std::map< std::string, std::string, std::greater< std::string > > MacroPrefixMap

A prefix map for FILE, BASE_FILE and __builtin_FILE().

LangStandard::Kind LangStd

The used language standard.

bool isSignReturnAddressScopeAll() const

Check if leaf functions are also signed.

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

Represents a linkage specification.

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.

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.

Represent a C++ namespace.

This represents '#pragma omp threadprivate ...' directive.

ObjCEncodeExpr, used for @encode in Objective-C.

const ObjCInterfaceDecl * getClassInterface() const

ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...

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()

ObjCMethodDecl - Represents an instance or class method declaration.

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?

bool isGNUFamily() const

Is this runtime basically of the GNU family of runtimes?

@ 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...

std::optional< uint64_t > SourceDateEpoch

If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.

std::vector< std::pair< std::string, bool > > Macros

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.

PrettyStackTraceDecl - If a crash occurs, indicate that it happened when doing something to a specifi...

std::optional< ExclusionType > isFunctionExcluded(StringRef FunctionName, CodeGenOptions::ProfileInstrKind Kind) const

std::optional< ExclusionType > isLocationExcluded(SourceLocation Loc, CodeGenOptions::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.

ExclusionType getDefault(CodeGenOptions::ProfileInstrKind Kind) const

std::optional< ExclusionType > isFileExcluded(StringRef FileName, CodeGenOptions::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.

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

A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...

A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...

decl_type * getPreviousDecl()

Return the previous declaration of this declaration or NULL if this is the first declaration.

decl_type * 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.

Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)

Can create any sort of selector.

Smart pointer class that efficiently represents Objective-C method names.

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.

void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)

Run some code with "sufficient" stack space.

Stmt - This represents one statement.

StringLiteral - This represents a string literal expression, e.g.

Represents the declaration of a struct/union/class/enum.

bool isMicrosoft() const

Is this ABI an MSVC-compatible ABI?

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.

unsigned getIntWidth() const

getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...

bool supportsIFunc() const

Identify whether this target supports IFuncs.

TargetCXXABI getCXXABI() const

Get the C++ ABI currently in use.

unsigned getLongWidth() const

getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...

virtual uint64_t getFMVPriority(ArrayRef< StringRef > Features) const

virtual bool hasFeature(StringRef Feature) const

Determine whether the given target has the given feature.

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 Type * getTypeForDecl() const

The base class of the type hierarchy.

CXXRecordDecl * getAsCXXRecordDecl() const

Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...

bool isPointerType() const

const T * castAs() const

Member-template castAs<specific type>.

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.

const Type * getBaseElementTypeUnsafe() const

Get the base element type of this type, potentially discarding type qualifiers.

bool isCUDADeviceBuiltinTextureType() const

Check if the type is the CUDA device builtin texture type.

bool isIncompleteType(NamedDecl **Def=nullptr) const

Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...

bool isObjCObjectPointerType() const

Linkage getLinkage() const

Determine the linkage of this type.

const T * getAs() const

Member-template getAs<specific type>'.

bool isRecordType() const

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.

bool hasFlexibleArrayInit(const ASTContext &Ctx) const

Whether this variable has a flexible array member initialized with one or more elements.

CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const

If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...

VarDecl * getDefinition(ASTContext &)

Get the real (not just tentative) definition for this declaration.

@ TLS_Dynamic

TLS with a dynamic initializer.

@ DeclarationOnly

This declaration is only a declaration.

@ Definition

This declaration is definitely a definition.

TemplateSpecializationKind getTemplateSpecializationKind() const

If this variable is an instantiation of a variable template or a static data member of a class templa...

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 > createPNaClTargetCodeGenInfo(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)

llvm::PointerUnion< const Decl *, const Expr * > DeclTy

The JSON file list parser is used to communicate input to InstallAPI.

CXXCtorType

C++ constructor types.

@ Ctor_Base

Base object ctor.

@ Ctor_Complete

Complete object ctor.

if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))

void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, DiagnosticsEngine &Diags)

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)

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...

@ Asm

Assembly: we accept this only so that we can preprocess it.

@ SD_Thread

Thread storage duration.

@ SD_Static

Static storage duration.

bool isLambdaCallOperator(const CXXMethodDecl *MD)

@ Result

The result type of a method or function.

StringRef languageToString(Language L)

@ Dtor_Base

Base object dtor.

@ Dtor_Complete

Complete object dtor.

LangAS

Defines the address space values used by the address space qualifier of QualType.

@ FirstTargetAddressSpace

static const char * getCFBranchLabelSchemeFlagVal(const CFBranchLabelSchemeKind Scheme)

const FunctionProtoType * T

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.

@ 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

__UINTPTR_TYPE__ uintptr_t

An unsigned integer type with the property that any valid pointer to void can be converted to this ty...

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

Extra information about a function prototype.

static const LangStandard & getLangStandardForKind(Kind K)

Parts of a decomposed MSGuidDecl.

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.

bool has(SanitizerMask K) const

Check if a certain (single) sanitizer is enabled.

bool hasOneOf(SanitizerMask K) const

Check if one or more sanitizers are enabled.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4