A RetroSearch Logo

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

Search Query:

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

clang: lib/CodeGen/CGDecl.cpp Source File

35#include "llvm/Analysis/ConstantFolding.h" 36#include "llvm/Analysis/ValueTracking.h" 37#include "llvm/IR/DataLayout.h" 38#include "llvm/IR/GlobalVariable.h" 39#include "llvm/IR/Instructions.h" 40#include "llvm/IR/Intrinsics.h" 41#include "llvm/IR/Type.h" 44using namespace clang

;

45using namespace

CodeGen;

48 "Clang max alignment greater than what LLVM supports?"

);

50void

CodeGenFunction::EmitDecl(

const Decl

&

D

) {

52 case

Decl::BuiltinTemplate:

53 case

Decl::TranslationUnit:

54 case

Decl::ExternCContext:

56 case

Decl::UnresolvedUsingTypename:

57 case

Decl::ClassTemplateSpecialization:

58 case

Decl::ClassTemplatePartialSpecialization:

59 case

Decl::VarTemplateSpecialization:

60 case

Decl::VarTemplatePartialSpecialization:

61 case

Decl::TemplateTypeParm:

62 case

Decl::UnresolvedUsingValue:

63 case

Decl::NonTypeTemplateParm:

64 case

Decl::CXXDeductionGuide:

66 case

Decl::CXXConstructor:

67 case

Decl::CXXDestructor:

68 case

Decl::CXXConversion:

70 case

Decl::MSProperty:

71 case

Decl::IndirectField:

73 case

Decl::ObjCAtDefsField:

75 case

Decl::ImplicitParam:

76 case

Decl::ClassTemplate:

77 case

Decl::VarTemplate:

78 case

Decl::FunctionTemplate:

79 case

Decl::TypeAliasTemplate:

80 case

Decl::TemplateTemplateParm:

81 case

Decl::ObjCMethod:

82 case

Decl::ObjCCategory:

83 case

Decl::ObjCProtocol:

84 case

Decl::ObjCInterface:

85 case

Decl::ObjCCategoryImpl:

86 case

Decl::ObjCImplementation:

87 case

Decl::ObjCProperty:

88 case

Decl::ObjCCompatibleAlias:

89 case

Decl::PragmaComment:

90 case

Decl::PragmaDetectMismatch:

91 case

Decl::AccessSpec:

92 case

Decl::LinkageSpec:

94 case

Decl::ObjCPropertyImpl:

95 case

Decl::FileScopeAsm:

96 case

Decl::TopLevelStmt:

98 case

Decl::FriendTemplate:

100 case

Decl::OutlinedFunction:

102 case

Decl::UsingShadow:

103 case

Decl::ConstructorUsingShadow:

104 case

Decl::ObjCTypeParam:

106 case

Decl::UnresolvedUsingIfExists:

107 case

Decl::HLSLBuffer:

108

llvm_unreachable(

"Declaration should not be in declstmts!"

);

110 case

Decl::CXXRecord:

118

DI->EmitAndRetainType(

getContext

().getEnumType(cast<EnumDecl>(&

D

)));

121 case

Decl::EnumConstant:

122 case

Decl::StaticAssert:

126 case

Decl::UnnamedGlobalConstant:

127 case

Decl::TemplateParamObject:

128 case

Decl::OMPThreadPrivate:

129 case

Decl::OMPAllocate:

130 case

Decl::OMPCapturedExpr:

131 case

Decl::OMPRequires:

134 case

Decl::ImplicitConceptSpecialization:

135 case

Decl::LifetimeExtendedTemporary:

136 case

Decl::RequiresExprBody:

140 case

Decl::NamespaceAlias:

142

DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(

D

));

146

DI->EmitUsingDecl(cast<UsingDecl>(

D

));

148 case

Decl::UsingEnum:

150

DI->EmitUsingEnumDecl(cast<UsingEnumDecl>(

D

));

152 case

Decl::UsingPack:

153 for

(

auto

*Using : cast<UsingPackDecl>(

D

).expansions())

156 case

Decl::UsingDirective:

158

DI->EmitUsingDirective(cast<UsingDirectiveDecl>(

D

));

161 case

Decl::Decomposition: {

162 const VarDecl

&VD = cast<VarDecl>(

D

);

164 "Should not see file-scope variables inside a function!"

);

166 if

(

auto

*DD = dyn_cast<DecompositionDecl>(&VD))

167 for

(

auto

*B : DD->flat_bindings())

168 if

(

auto

*HD = B->getHoldingVar())

174 case

Decl::OMPDeclareReduction:

177 case

Decl::OMPDeclareMapper:

181 case

Decl::TypeAlias: {

182 QualType

Ty = cast<TypedefNameDecl>(

D

).getUnderlyingType();

184

DI->EmitAndRetainType(Ty);

195 if

(

D

.hasExternalStorage())

204 if

(

D

.getType()->isSamplerT())

207

llvm::GlobalValue::LinkageTypes

Linkage

=

220

assert(

D

.hasLocalStorage());

229

assert(!

D

.isExternallyVisible() &&

"name shouldn't matter"

);

230

std::string ContextName;

232 if

(

auto

*CD = dyn_cast<CapturedDecl>(DC))

233

DC = cast<DeclContext>(CD->getNonClosureContext());

234 if

(

const auto

*FD = dyn_cast<FunctionDecl>(DC))

236 else if

(

const auto

*BD = dyn_cast<BlockDecl>(DC))

238 else if

(

const auto

*OMD = dyn_cast<ObjCMethodDecl>(DC))

239

ContextName = OMD->getSelector().getAsString();

241

llvm_unreachable(

"Unknown context for static var decl"

);

243

ContextName +=

"."

+

D

.getNameAsString();

253 if

(llvm::Constant *ExistingGV = StaticLocalDeclMap[&

D

])

272

llvm::Constant *

Init

=

nullptr

;

275 Init

= llvm::UndefValue::get(LTy);

279

llvm::GlobalVariable *GV =

new

llvm::GlobalVariable(

281 nullptr

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

282

GV->setAlignment(

getContext

().getDeclAlign(&

D

).getAsAlign());

285

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

287 if

(

D

.getTLSKind())

295

llvm::Constant *Addr = GV;

296 if

(AS != ExpectedAS) {

298

*

this

, GV, AS, ExpectedAS,

300 getContext

().getTargetAddressSpace(ExpectedAS)));

311 if

(isa<BlockDecl>(DC) || isa<CapturedDecl>(DC)) {

319 if

(

const auto

*CD = dyn_cast<CXXConstructorDecl>(DC))

321 else if

(

const auto

*DD = dyn_cast<CXXDestructorDecl>(DC))

323 else if

(

const auto

*FD = dyn_cast<FunctionDecl>(DC))

328

assert(isa<ObjCMethodDecl>(DC) &&

"unexpected parent code decl"

);

343

llvm::GlobalVariable *

345

llvm::GlobalVariable *GV) {

347

llvm::Constant *

Init

= emitter.tryEmitForInitializer(

D

);

359

GV->setConstant(

false

);

373

assert(VarSize == CstSize &&

"Emitted constant has unexpected size"

);

380 D

.getType().isConstantStorage(

getContext

(),

true

, !NeedsDtor));

381

GV->replaceInitializer(

Init

);

383

emitter.finalize(GV);

396

llvm::GlobalValue::LinkageTypes

Linkage

) {

406

setAddrOfLocalVar(&

D

,

Address

(addr, elemTy, alignment));

411 if

(

D

.getType()->isVariablyModifiedType())

415

llvm::Type *expectedType = addr->getType();

417

llvm::GlobalVariable *

var

=

418

cast<llvm::GlobalVariable>(addr->stripPointerCasts());

427 if

(

D

.getInit() && !isCudaSharedVar)

435 if

(

auto

*SA =

D

.

getAttr

<PragmaClangBSSSectionAttr>())

436 var

->addAttribute(

"bss-section"

, SA->getName());

437 if

(

auto

*SA =

D

.

getAttr

<PragmaClangDataSectionAttr>())

438 var

->addAttribute(

"data-section"

, SA->getName());

439 if

(

auto

*SA =

D

.

getAttr

<PragmaClangRodataSectionAttr>())

440 var

->addAttribute(

"rodata-section"

, SA->getName());

441 if

(

auto

*SA =

D

.

getAttr

<PragmaClangRelroSectionAttr>())

442 var

->addAttribute(

"relro-section"

, SA->getName());

444 if

(

const

SectionAttr *SA =

D

.

getAttr

<SectionAttr>())

445 var

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

460

llvm::Constant *castedAddr =

461

llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(var, expectedType);

462

LocalDeclMap.find(&

D

)->second =

Address

(castedAddr, elemTy, alignment);

478

CodeGenFunction::Destroyer *destroyer,

479 bool

useEHCleanupForArray)

480

: addr(addr),

type

(

type

), destroyer(destroyer),

481

useEHCleanupForArray(useEHCleanupForArray) {}

485

CodeGenFunction::Destroyer *destroyer;

486 bool

useEHCleanupForArray;

490 bool

useEHCleanupForArray =

491

flags.isForNormalCleanup() && this->useEHCleanupForArray;

497 template

<

class

Derived>

500

: NRVOFlag(NRVOFlag),

Loc

(addr), Ty(

type

) {}

502

llvm::Value *NRVOFlag;

508 bool

NRVO = flags.isForNormalCleanup() && NRVOFlag;

510

llvm::BasicBlock *SkipDtorBB =

nullptr

;

515

llvm::Value *DidNRVO =

517

CGF.

Builder

.CreateCondBr(DidNRVO, SkipDtorBB, RunDtorBB);

521 static_cast<

Derived *

>

(

this

)->emitDestructorCall(CGF);

526 virtual

~DestroyNRVOVariable() =

default

;

529 struct

DestroyNRVOVariableCXX final

530

: DestroyNRVOVariable<DestroyNRVOVariableCXX> {

533

: DestroyNRVOVariable<DestroyNRVOVariableCXX>(addr,

type

, NRVOFlag),

545 struct

DestroyNRVOVariableC final

546

: DestroyNRVOVariable<DestroyNRVOVariableC> {

547

DestroyNRVOVariableC(

Address

addr, llvm::Value *NRVOFlag,

QualType

Ty)

548

: DestroyNRVOVariable<DestroyNRVOVariableC>(addr, Ty, NRVOFlag) {}

557

CallStackRestore(

Address

Stack) : Stack(Stack) {}

558 bool

isRedundantBeforeReturn()

override

{

return true

; }

561

CGF.

Builder

.CreateStackRestore(

V

);

566

std::pair<llvm::Value *, llvm::Value *> AddrSizePair;

567

KmpcAllocFree(

const

std::pair<llvm::Value *, llvm::Value *> &AddrSizePair)

568

: AddrSizePair(AddrSizePair) {}

577

ExtendGCLifetime(

const VarDecl

*var) : Var(*

var

) {}

591

llvm::Constant *CleanupFn;

595

CallCleanupFunction(llvm::Constant *CleanupFn,

const CGFunctionInfo

*Info,

597

: CleanupFn(CleanupFn), FnInfo(*Info), Var(*Var) {}

632

llvm_unreachable(

"present but none"

);

640

(var.hasAttr<ObjCPreciseLifetimeAttr>()

645

CGF.

pushDestroy

(cleanupKind, addr, var.getType(), destroyer,

664 if

(

const Expr

*e = dyn_cast<Expr>(

s

)) {

667 s

= e = e->IgnoreParenCasts();

669 if

(

const DeclRefExpr

*ref = dyn_cast<DeclRefExpr>(e))

670 return

(ref->getDecl() == &var);

671 if

(

const BlockExpr

*be = dyn_cast<BlockExpr>(e)) {

672 const BlockDecl

*block = be->getBlockDecl();

673 for

(

const auto

&I : block->

captures

()) {

674 if

(I.getVariable() == &var)

680 for

(

const Stmt

*SubStmt :

s

->children())

689 if

(!

decl

)

return false

;

690 if

(!isa<VarDecl>(

decl

))

return false

;

697 bool

needsCast =

false

;

700 switch

(

castExpr

->getCastKind()) {

704 case

CK_BlockPointerToObjCPointerCast:

710 case

CK_LValueToRValue: {

752 if

(!

SanOpts

.

has

(SanitizerKind::NullabilityAssign))

761

SanitizerScope SanScope(

this

);

763

llvm::Constant *StaticData[] = {

765

llvm::ConstantInt::get(

Int8Ty

, 0),

768

SanitizerHandler::TypeMismatch, StaticData, RHS);

772 LValue

lvalue,

bool

capturedByInit) {

784

init = DIE->getExpr();

788 if

(

auto

*EWC = dyn_cast<ExprWithCleanups>(init)) {

789

CodeGenFunction::RunCleanupsScope

Scope

(*

this

);

797 bool

accessedByInit =

false

;

799

accessedByInit = (capturedByInit ||

isAccessedBy

(

D

, init));

800 if

(accessedByInit) {

803 if

(capturedByInit) {

824

llvm::Value *value =

nullptr

;

828

llvm_unreachable(

"present but none"

);

831 if

(!

D

|| !isa<VarDecl>(

D

) || !cast<VarDecl>(

D

)->isARCPseudoStrong()) {

890 unsigned

&NumStores) {

892 if

(isa<llvm::ConstantAggregateZero>(

Init

) ||

893

isa<llvm::ConstantPointerNull>(

Init

) ||

894

isa<llvm::UndefValue>(

Init

))

896 if

(isa<llvm::ConstantInt>(

Init

) || isa<llvm::ConstantFP>(

Init

) ||

897

isa<llvm::ConstantVector>(

Init

) || isa<llvm::BlockAddress>(

Init

) ||

898

isa<llvm::ConstantExpr>(

Init

))

899 return Init

->isNullValue() || NumStores--;

902 if

(isa<llvm::ConstantArray>(

Init

) || isa<llvm::ConstantStruct>(

Init

)) {

903 for

(

unsigned

i = 0, e =

Init

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

904

llvm::Constant *Elt = cast<llvm::Constant>(

Init

->getOperand(i));

911 if

(llvm::ConstantDataSequential *CDS =

912

dyn_cast<llvm::ConstantDataSequential>(

Init

)) {

913 for

(

unsigned

i = 0, e = CDS->getNumElements(); i != e; ++i) {

914

llvm::Constant *Elt = CDS->getElementAsConstant(i);

931

assert(!

Init

->isNullValue() && !isa<llvm::UndefValue>(

Init

) &&

932 "called emitStoresForInitAfterBZero for zero or undef value."

);

934 if

(isa<llvm::ConstantInt>(

Init

) || isa<llvm::ConstantFP>(

Init

) ||

935

isa<llvm::ConstantVector>(

Init

) || isa<llvm::BlockAddress>(

Init

) ||

936

isa<llvm::ConstantExpr>(

Init

)) {

937 auto

*I = Builder.CreateStore(

Init

,

Loc

, isVolatile);

939

I->addAnnotationMetadata(

"auto-init"

);

943 if

(llvm::ConstantDataSequential *CDS =

944

dyn_cast<llvm::ConstantDataSequential>(

Init

)) {

945 for

(

unsigned

i = 0, e = CDS->getNumElements(); i != e; ++i) {

946

llvm::Constant *Elt = CDS->getElementAsConstant(i);

949 if

(!Elt->isNullValue() && !isa<llvm::UndefValue>(Elt))

951

CGM, Elt, Builder.CreateConstInBoundsGEP2_32(

Loc

, 0, i), isVolatile,

952

Builder, IsAutoInit);

957

assert((isa<llvm::ConstantStruct>(

Init

) || isa<llvm::ConstantArray>(

Init

)) &&

958 "Unknown value type!"

);

960 for

(

unsigned

i = 0, e =

Init

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

961

llvm::Constant *Elt = cast<llvm::Constant>(

Init

->getOperand(i));

964 if

(!Elt->isNullValue() && !isa<llvm::UndefValue>(Elt))

966

Builder.CreateConstInBoundsGEP2_32(

Loc

, 0, i),

967

isVolatile, Builder, IsAutoInit);

975

uint64_t GlobalSize) {

977 if

(isa<llvm::ConstantAggregateZero>(

Init

))

return true

;

983 unsigned

StoreBudget = 6;

984

uint64_t SizeLimit = 32;

986 return

GlobalSize > SizeLimit &&

997 const

llvm::DataLayout &DL) {

998

uint64_t SizeLimit = 32;

999 if

(GlobalSize <= SizeLimit)

1001 return

llvm::isBytewiseValue(

Init

, DL);

1008

uint64_t GlobalByteSize) {

1010

uint64_t ByteSizeLimit = 64;

1013 if

(GlobalByteSize <= ByteSizeLimit)

1023 if

(isPattern == IsPattern::Yes)

1026 return

llvm::Constant::getNullValue(Ty);

1030

llvm::Constant *constant);

1035

llvm::StructType *STy,

1036

llvm::Constant *constant) {

1038 const

llvm::StructLayout *Layout = DL.getStructLayout(STy);

1039

llvm::Type *Int8Ty = llvm::IntegerType::getInt8Ty(CGM.

getLLVMContext

());

1040 unsigned

SizeSoFar = 0;

1042 bool

NestedIntact =

true

;

1043 for

(

unsigned

i = 0, e = STy->getNumElements(); i != e; i++) {

1044 unsigned

CurOff = Layout->getElementOffset(i);

1045 if

(SizeSoFar < CurOff) {

1046

assert(!STy->isPacked());

1047 auto

*PadTy = llvm::ArrayType::get(Int8Ty, CurOff - SizeSoFar);

1050

llvm::Constant *CurOp;

1051 if

(constant->isZeroValue())

1052

CurOp = llvm::Constant::getNullValue(STy->getElementType(i));

1054

CurOp = cast<llvm::Constant>(constant->getAggregateElement(i));

1057

NestedIntact =

false

;

1058

Values.push_back(NewOp);

1059

SizeSoFar = CurOff + DL.getTypeAllocSize(CurOp->getType());

1061 unsigned

TotalSize = Layout->getSizeInBytes();

1062 if

(SizeSoFar < TotalSize) {

1063 auto

*PadTy = llvm::ArrayType::get(Int8Ty, TotalSize - SizeSoFar);

1066 if

(NestedIntact && Values.size() == STy->getNumElements())

1068 return

llvm::ConstantStruct::getAnon(Values, STy->isPacked());

1074

llvm::Constant *constant) {

1075

llvm::Type *OrigTy = constant->getType();

1076 if

(

const auto

STy = dyn_cast<llvm::StructType>(OrigTy))

1078 if

(

auto

*ArrayTy = dyn_cast<llvm::ArrayType>(OrigTy)) {

1080

uint64_t Size = ArrayTy->getNumElements();

1083

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

1084 bool

ZeroInitializer = constant->isNullValue();

1085

llvm::Constant *OpValue, *PaddedOp;

1086 if

(ZeroInitializer) {

1087

OpValue = llvm::Constant::getNullValue(ElemTy);

1090 for

(

unsigned

Op = 0; Op != Size; ++Op) {

1091 if

(!ZeroInitializer) {

1092

OpValue = constant->getAggregateElement(Op);

1095

Values.push_back(PaddedOp);

1097 auto

*NewElemTy = Values[0]->getType();

1098 if

(NewElemTy == ElemTy)

1100 auto

*NewArrayTy = llvm::ArrayType::get(NewElemTy, Size);

1101 return

llvm::ConstantArray::get(NewArrayTy, Values);

1110

llvm::Constant *Constant,

1112 auto

FunctionName = [&](

const DeclContext

*DC) -> std::string {

1113 if

(

const auto

*FD = dyn_cast<FunctionDecl>(DC)) {

1114 if

(

const auto

*CC = dyn_cast<CXXConstructorDecl>(FD))

1115 return

CC->getNameAsString();

1116 if

(

const auto

*CD = dyn_cast<CXXDestructorDecl>(FD))

1117 return

CD->getNameAsString();

1119

}

else if

(

const auto

*OM = dyn_cast<ObjCMethodDecl>(DC)) {

1120 return

OM->getNameAsString();

1121

}

else if

(isa<BlockDecl>(DC)) {

1123

}

else if

(isa<CapturedDecl>(DC)) {

1124 return "<captured>"

;

1126

llvm_unreachable(

"expected a function or method"

);

1132

llvm::GlobalVariable *&CacheEntry = InitializerConstants[&

D

];

1133 if

(!CacheEntry || CacheEntry->getInitializer() != Constant) {

1134 auto

*Ty = Constant->getType();

1135 bool

isConstant =

true

;

1136

llvm::GlobalVariable *InsertBefore =

nullptr

;

1140 if

(

D

.hasGlobalStorage())

1143

Name = (

"__const."

+ FunctionName(DC) +

"."

+

D

.getName()).str();

1145

llvm_unreachable(

"local variable has no parent function or method"

);

1146

llvm::GlobalVariable *GV =

new

llvm::GlobalVariable(

1147 getModule

(), Ty, isConstant, llvm::GlobalValue::PrivateLinkage,

1148

Constant, Name, InsertBefore, llvm::GlobalValue::NotThreadLocal, AS);

1150

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

1152

}

else if

(CacheEntry->getAlignment() < uint64_t(Align.

getQuantity

())) {

1153

CacheEntry->setAlignment(Align.

getAsAlign

());

1156 return Address

(CacheEntry, CacheEntry->getValueType(), Align);

1162

llvm::Constant *Constant,

1171

llvm::Constant *constant,

bool

IsAutoInit) {

1172 auto

*Ty = constant->getType();

1173

uint64_t ConstantSize = CGM.

getDataLayout

().getTypeAllocSize(Ty);

1177 bool

canDoSingleStore = Ty->isIntOrIntVectorTy() ||

1178

Ty->isPtrOrPtrVectorTy() || Ty->isFPOrFPVectorTy();

1179 if

(canDoSingleStore) {

1180 auto

*I = Builder.CreateStore(constant,

Loc

, isVolatile);

1182

I->addAnnotationMetadata(

"auto-init"

);

1186 auto

*SizeVal = llvm::ConstantInt::get(CGM.

IntPtrTy

, ConstantSize);

1191 auto

*I = Builder.CreateMemSet(

Loc

, llvm::ConstantInt::get(CGM.

Int8Ty

, 0),

1192

SizeVal, isVolatile);

1194

I->addAnnotationMetadata(

"auto-init"

);

1196 bool

valueAlreadyCorrect =

1197

constant->isNullValue() || isa<llvm::UndefValue>(constant);

1198 if

(!valueAlreadyCorrect) {

1199 Loc

=

Loc

.withElementType(Ty);

1207

llvm::Value *Pattern =

1210

uint64_t

Value

= 0x00;

1211 if

(!isa<llvm::UndefValue>(Pattern)) {

1212 const

llvm::APInt &AP = cast<llvm::ConstantInt>(Pattern)->getValue();

1213

assert(AP.getBitWidth() <= 8);

1214 Value

= AP.getLimitedValue();

1216 auto

*I = Builder.CreateMemSet(

1217 Loc

, llvm::ConstantInt::get(CGM.

Int8Ty

,

Value

), SizeVal, isVolatile);

1219

I->addAnnotationMetadata(

"auto-init"

);

1225 bool

IsTrivialAutoVarInitPattern =

1229 if

(

auto

*STy = dyn_cast<llvm::StructType>(Ty)) {

1230 if

(STy ==

Loc

.getElementType() ||

1231

(STy !=

Loc

.getElementType() && IsTrivialAutoVarInitPattern)) {

1232 const

llvm::StructLayout *Layout =

1234 for

(

unsigned

i = 0; i != constant->getNumOperands(); i++) {

1237 Address

EltPtr = Builder.CreateConstInBoundsByteGEP(

1238 Loc

.withElementType(CGM.

Int8Ty

), CurOff);

1240

constant->getAggregateElement(i), IsAutoInit);

1244

}

else if

(

auto

*ATy = dyn_cast<llvm::ArrayType>(Ty)) {

1245 if

(ATy ==

Loc

.getElementType() ||

1246

(ATy !=

Loc

.getElementType() && IsTrivialAutoVarInitPattern)) {

1247 for

(

unsigned

i = 0; i != ATy->getNumElements(); i++) {

1248 Address

EltPtr = Builder.CreateConstGEP(

1249 Loc

.withElementType(ATy->getElementType()), i);

1251

constant->getAggregateElement(i), IsAutoInit);

1260

Builder.CreateMemCpy(

Loc

,

1262

CGM,

D

, Builder, constant,

Loc

.getAlignment()),

1263

SizeVal, isVolatile);

1265

I->addAnnotationMetadata(

"auto-init"

);

1271

llvm::Type *ElTy =

Loc

.getElementType();

1272

llvm::Constant *constant =

1281

llvm::Type *ElTy =

Loc

.getElementType();

1284

assert(!isa<llvm::UndefValue>(constant));

1290 auto

*Ty = constant->getType();

1291 if

(isa<llvm::UndefValue>(constant))

1293 if

(Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy())

1294 for

(llvm::Use &Op : constant->operands())

1301

llvm::Constant *constant) {

1302 auto

*Ty = constant->getType();

1303 if

(isa<llvm::UndefValue>(constant))

1305 if

(!(Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()))

1310 for

(

unsigned

Op = 0, NumOp = constant->getNumOperands(); Op != NumOp; ++Op) {

1311 auto

*OpValue = cast<llvm::Constant>(constant->getOperand(Op));

1314 if

(Ty->isStructTy())

1315 return

llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Values);

1316 if

(Ty->isArrayTy())

1317 return

llvm::ConstantArray::get(cast<llvm::ArrayType>(Ty), Values);

1318

assert(Ty->isVectorTy());

1319 return

llvm::ConstantVector::get(Values);

1335

llvm::Value *Addr) {

1336 if

(!ShouldEmitLifetimeMarkers)

1339

assert(Addr->getType()->getPointerAddressSpace() ==

1341 "Pointer should be in alloca address space"

);

1342

llvm::Value *SizeV = llvm::ConstantInt::get(

1344

llvm::CallInst *

C

=

1346 C

->setDoesNotThrow();

1351

assert(Addr->getType()->getPointerAddressSpace() ==

1353 "Pointer should be in alloca address space"

);

1354

llvm::CallInst *

C

=

1356 C

->setDoesNotThrow();

1363 C

->setDoesNotThrow();

1364 C

->setTailCallKind(llvm::CallInst::TCK_NoTail);

1376 while

(

getContext

().getAsVariableArrayType(Type1D)) {

1378 if

(

auto

*

C

= dyn_cast<llvm::ConstantInt>(VlaSize.NumElts))

1382

Twine Name = Twine(

"__vla_expr"

) + Twine(VLAExprCounter++);

1384

StringRef NameRef = Name.toStringRef(Buffer);

1386

VLAExprNames.push_back(&Ident);

1390

Dimensions.emplace_back(SizeExprAddr.getPointer(),

1393

Type1D = VlaSize.Type;

1402 unsigned

NameIdx = 0;

1403 for

(

auto

&VlaSize : Dimensions) {

1405 if

(

auto

*

C

= dyn_cast<llvm::ConstantInt>(VlaSize.NumElts))

1406

MD = llvm::ConstantAsMetadata::get(

C

);

1411 SizeTy

->getScalarSizeInBits(),

false

);

1416

ArtificialDecl->setImplicit();

1421

assert(MD &&

"No Size expression debug node created"

);

1429 return

4 *

C

.getTypeSize(

C

.UnsignedIntTy);

1454 if

(FuncDecl->

hasAttr

<NoDebugAttr>() || FuncDecl->

hasAttr

<OptimizeNoneAttr>())

1461

CodeGenFunction::AutoVarEmission

1468

AutoVarEmission emission(

D

);

1470 bool

isEscapingByRef =

D

.isEscapingByref();

1471

emission.IsEscapingByRef = isEscapingByRef;

1493 bool

NRVO =

getLangOpts

().ElideConstructors &&

D

.isNRVOVariable();

1496

address = OpenMPLocalAddr;

1497

AllocaAddr = OpenMPLocalAddr;

1508

(

D

.isConstexpr() ||

1510 getContext

().getBaseElementType(Ty)->isObjCObjectPointerType()) &&

1511 D

.getInit()->isConstantInitializer(

getContext

(),

false

)))) {

1529

assert(emission.wasEmittedAsGlobal());

1534

emission.IsConstantAggregate =

true

;

1552 const auto

*RD = RecordTy->getDecl();

1553 const auto

*CXXRD = dyn_cast<CXXRecordDecl>(RD);

1554 if

((CXXRD && !CXXRD->hasTrivialDestructor()) ||

1555

RD->isNonTrivialToPrimitiveDestroy()) {

1572

llvm::Type *allocaTy;

1573 if

(isEscapingByRef) {

1575

allocaTy = byrefInfo.Type;

1576

allocaAlignment = byrefInfo.ByrefAlignment;

1579

allocaAlignment = alignment;

1586 nullptr

, &AllocaAddr);

1591 bool

IsMSCatchParam =

1613

emission.SizeForLifetimeMarkers =

1617

assert(!emission.useLifetimeMarkers());

1628 bool

VarAllocated =

false

;

1631 if

(RT.isDelayedVariableLengthDecl(*

this

, &

D

)) {

1633

std::pair<llvm::Value *, llvm::Value *> AddrSizePair =

1640

address =

Base

.getAddress();

1648

VarAllocated =

true

;

1652 if

(!VarAllocated) {

1653 if

(!DidCallStackSave) {

1658

llvm::Value *

V

=

Builder

.CreateStackSave();

1662

DidCallStackSave =

true

;

1683

setAddrOfLocalVar(&

D

, address);

1684

emission.Addr = address;

1685

emission.AllocaAddr = AllocaAddr;

1694 if

(UsePointerValue) {

1706 if

(emission.useLifetimeMarkers())

1708

emission.getOriginalAllocatedAddress(),

1709

emission.getSizeForLifetimeMarkers());

1720

emission.getAllocatedAddress());

1731 if

(

const Expr

*

E

= dyn_cast<Expr>(S))

1733 for

(

const Stmt

*SubStmt : S->children())

1746 if

(

const BlockExpr

*BE = dyn_cast<BlockExpr>(

E

)) {

1748 for

(

const auto

&I :

Block

->captures()) {

1749 if

(I.getVariable() == &Var)

1757 if

(

const StmtExpr

*SE = dyn_cast<StmtExpr>(

E

)) {

1759 for

(

const auto

*BI : CS->

body

())

1760 if

(

const auto

*BIE = dyn_cast<Expr>(BI)) {

1764 else if

(

const auto

*DS = dyn_cast<DeclStmt>(BI)) {

1766 for

(

const auto

*I : DS->decls()) {

1767 if

(

const auto

*VD = dyn_cast<VarDecl>((I))) {

1798

!Construct->requiresZeroInitialization())

1804void

CodeGenFunction::emitZeroOrPatternForAutoVarInit(

QualType type

,

1808 auto

trivialAutoVarInitMaxSize =

1811 bool

isVolatile =

type

.isVolatileQualified();

1812 if

(!

Size

.isZero()) {

1819 switch

(trivialAutoVarInit) {

1821

llvm_unreachable(

"Uninitialized handled by caller"

);

1825 if

(trivialAutoVarInitMaxSize > 0 &&

1826

allocSize > trivialAutoVarInitMaxSize)

1833 if

(trivialAutoVarInitMaxSize > 0 &&

1834

allocSize > trivialAutoVarInitMaxSize)

1851 auto

SizeVal = VlaSize.NumElts;

1853 switch

(trivialAutoVarInit) {

1855

llvm_unreachable(

"Uninitialized handled by caller"

);

1860 if

(!EltSize.

isOne

())

1863

SizeVal, isVolatile);

1864

I->addAnnotationMetadata(

"auto-init"

);

1871

llvm::Type *ElTy =

Loc

.getElementType();

1878

llvm::Value *IsZeroSizedVLA =

Builder

.CreateICmpEQ(

1879

SizeVal, llvm::ConstantInt::get(SizeVal->getType(), 0),

1880 "vla.iszerosized"

);

1881 Builder

.CreateCondBr(IsZeroSizedVLA, ContBB, SetupBB);

1883 if

(!EltSize.

isOne

())

1885

llvm::Value *BaseSizeInChars =

1889 Begin

.emitRawPointer(*

this

),

1890

SizeVal,

"vla.end"

);

1891

llvm::BasicBlock *OriginBB =

Builder

.GetInsertBlock();

1893

llvm::PHINode *Cur =

Builder

.CreatePHI(

Begin

.getType(), 2,

"vla.cur"

);

1894

Cur->addIncoming(

Begin

.emitRawPointer(*

this

), OriginBB);

1895 CharUnits

CurAlign =

Loc

.getAlignment().alignmentOfArrayElement(EltSize);

1900

BaseSizeInChars, isVolatile);

1901

I->addAnnotationMetadata(

"auto-init"

);

1904

llvm::Value *Done =

Builder

.CreateICmpEQ(Next, End,

"vla-init.isdone"

);

1905 Builder

.CreateCondBr(Done, ContBB, LoopBB);

1906

Cur->addIncoming(Next, LoopBB);

1913

assert(emission.Variable &&

"emission was not valid!"

);

1916 if

(emission.wasEmittedAsGlobal())

return

;

1918 const VarDecl

&

D

= *emission.Variable;

1936 if

(emission.IsEscapingByRef)

1943 type

.isNonTrivialToPrimitiveDefaultInitialize() ==

1946 if

(emission.IsEscapingByRef)

1955 bool

capturedByInit =

1958 bool

locIsByrefHeader = !capturedByInit;

1960

locIsByrefHeader ? emission.getObjectAddress(*

this

) : emission.Addr;

1962 auto

hasNoTrivialAutoVarInitAttr = [&](

const Decl

*

D

) {

1963 return D

&&

D

->

hasAttr

<NoTrivialAutoVarInitAttr>();

1967

((

D

.isConstexpr() ||

D

.

getAttr

<UninitializedAttr>() ||

1968

hasNoTrivialAutoVarInitAttr(

type

->getAsTagDecl()) ||

1973 auto

initializeWhatIsTechnicallyUninitialized = [&](

Address Loc

) {

1974 if

(trivialAutoVarInit ==

1979 if

(emission.IsEscapingByRef && !locIsByrefHeader)

1982 return

emitZeroOrPatternForAutoVarInit(

type

,

D

,

Loc

);

1986 return

initializeWhatIsTechnicallyUninitialized(

Loc

);

1988

llvm::Constant *constant =

nullptr

;

1989 if

(emission.IsConstantAggregate ||

1990 D

.mightBeUsableInConstantExpressions(

getContext

())) {

1991

assert(!capturedByInit &&

"constant init contains a capturing block?"

);

1993 if

(constant && !constant->isZeroValue() &&

1994

(trivialAutoVarInit !=

2010 if

(constant &&

type

->isBitIntType() &&

2015

llvm::Type *LoadType =

2017

constant = llvm::ConstantFoldLoadFromConst(

2023 if

(trivialAutoVarInit !=

2034

initializeWhatIsTechnicallyUninitialized(

Loc

);

2044 if

(!emission.IsConstantAggregate) {

2067 LValue

lvalue,

bool

capturedByInit) {

2070 if

(

type

->isReferenceType()) {

2089 if

(

type

->isAtomicType()) {

2093 if

(isa<VarDecl>(

D

))

2095 else if

(

auto

*FD = dyn_cast<FieldDecl>(

D

))

2105

llvm_unreachable(

"bad evaluation kind"

);

2110 const

CodeGenFunction::AutoVarEmission &emission,

2116 Address

addr = emission.getObjectAddress(*

this

);

2126

llvm_unreachable(

"no cleanup for trivially-destructible variable"

);

2131 if

(emission.NRVOFlag) {

2132

assert(!

type

->isArrayType());

2134 EHStack

.pushCleanup<DestroyNRVOVariableCXX>(cleanupKind, addr,

type

, dtor,

2142 if

(

var

->isARCPseudoStrong())

return

;

2148 if

(!

var

->hasAttr<ObjCPreciseLifetimeAttr>())

2157 if

(emission.NRVOFlag) {

2158

assert(!

type

->isArrayType());

2159 EHStack

.pushCleanup<DestroyNRVOVariableC>(cleanupKind, addr,

2160

emission.NRVOFlag,

type

);

2171 bool

useEHCleanup = (cleanupKind &

EHCleanup

);

2172 EHStack

.pushCleanup<DestroyObject>(cleanupKind, addr,

type

, destroyer,

2177

assert(emission.Variable &&

"emission was not valid!"

);

2180 if

(emission.wasEmittedAsGlobal())

return

;

2186 const VarDecl

&

D

= *emission.Variable;

2194 D

.

hasAttr

<ObjCPreciseLifetimeAttr>()) {

2199 if

(

const

CleanupAttr *CA =

D

.

getAttr

<CleanupAttr>()) {

2203

assert(F &&

"Could not find function!"

);

2212 if

(emission.IsEscapingByRef &&

2215 if

(emission.Variable->getType().isObjCGCWeak())

2236

llvm_unreachable(

"Unknown DestructionKind"

);

2243

assert(dtorKind &&

"cannot push destructor for trivial type"

);

2253

assert(dtorKind &&

"cannot push destructor for trivial type"

);

2262 bool

useEHCleanupForArray) {

2263

pushFullExprCleanup<DestroyObject>(cleanupKind, addr,

type

,

2264

destroyer, useEHCleanupForArray);

2271

assert(dtorKind &&

"cannot push destructor for trivial type"

);

2280 bool

useEHCleanupForArray) {

2281

llvm::Instruction *DominatingIP =

2283 pushDestroy

(cleanupKind, addr,

type

, destroyer, useEHCleanupForArray);

2289 EHStack

.pushCleanup<CallStackRestore>(

Kind

, SPMem);

2293 CleanupKind

Kind, std::pair<llvm::Value *, llvm::Value *> AddrSizePair) {

2294 EHStack

.pushCleanup<KmpcAllocFree>(

Kind

, AddrSizePair);

2299

Destroyer *destroyer,

2300 bool

useEHCleanupForArray) {

2310

useEHCleanupForArray);

2314 return

pushCleanupAfterFullExprWithActiveFlag<DestroyObject>(

2316

useEHCleanupForArray);

2321 using

ConditionalCleanupType =

2328

AllocaTrackerRAII DeactivationAllocas(*

this

);

2331

pushCleanupAndDeferDeactivation<ConditionalCleanupType>(

2332

cleanupKind, SavedAddr,

type

, destroyer, useEHCleanupForArray);

2336 cleanup

.AddAuxAllocas(std::move(DeactivationAllocas).Take());

2344

pushCleanupAfterFullExprWithActiveFlag<ConditionalCleanupType>(

2345

cleanupKind, ActiveFlagForLifetimeExt, SavedAddr,

type

, destroyer,

2346

useEHCleanupForArray);

2361

Destroyer *destroyer,

2362 bool

useEHCleanupForArray) {

2365 return

destroyer(*

this

, addr,

type

);

2374 bool

checkZeroLength =

true

;

2377 if

(llvm::ConstantInt *constLength = dyn_cast<llvm::ConstantInt>(

length

)) {

2379 if

(constLength->isZero())

return

;

2380

checkZeroLength =

false

;

2387

checkZeroLength, useEHCleanupForArray);

2404

Destroyer *destroyer,

2405 bool

checkZeroLength,

2406 bool

useEHCleanup) {

2414 if

(checkZeroLength) {

2415

llvm::Value *isEmpty =

Builder

.CreateICmpEQ(begin, end,

2416 "arraydestroy.isempty"

);

2417 Builder

.CreateCondBr(isEmpty, doneBB, bodyBB);

2421

llvm::BasicBlock *entryBB =

Builder

.GetInsertBlock();

2423

llvm::PHINode *elementPast =

2424 Builder

.CreatePHI(begin->getType(), 2,

"arraydestroy.elementPast"

);

2425

elementPast->addIncoming(end, entryBB);

2428

llvm::Value *negativeOne = llvm::ConstantInt::get(

SizeTy

, -1,

true

);

2431

llvmElementType, elementPast, negativeOne,

"arraydestroy.element"

);

2438

destroyer(*

this

,

Address

(element, llvmElementType, elementAlign),

2445

llvm::Value *done =

Builder

.CreateICmpEQ(element, begin,

"arraydestroy.done"

);

2446 Builder

.CreateCondBr(done, doneBB, bodyBB);

2447

elementPast->addIncoming(element,

Builder

.GetInsertBlock());

2456

llvm::Value *begin, llvm::Value *end,

2462 unsigned

arrayDepth = 0;

2465 if

(!isa<VariableArrayType>(

arrayType

))

2471

llvm::Value *zero = llvm::ConstantInt::get(CGF.

SizeTy

, 0);

2475

elemTy, begin, gepIndices,

"pad.arraybegin"

);

2477

elemTy, end, gepIndices,

"pad.arrayend"

);

2492

llvm::Value *ArrayBegin;

2493

llvm::Value *ArrayEnd;

2495

CodeGenFunction::Destroyer *Destroyer;

2498

RegularPartialArrayDestroy(llvm::Value *arrayBegin, llvm::Value *arrayEnd,

2500

CodeGenFunction::Destroyer *destroyer)

2501

: ArrayBegin(arrayBegin), ArrayEnd(arrayEnd),

2502

ElementType(elementType), Destroyer(destroyer),

2503

ElementAlign(elementAlign) {}

2507

ElementType, ElementAlign, Destroyer);

2515

llvm::Value *ArrayBegin;

2518

CodeGenFunction::Destroyer *Destroyer;

2521

IrregularPartialArrayDestroy(llvm::Value *arrayBegin,

2525

CodeGenFunction::Destroyer *destroyer)

2526

: ArrayBegin(arrayBegin), ArrayEndPointer(arrayEndPointer),

2527

ElementType(elementType), Destroyer(destroyer),

2528

ElementAlign(elementAlign) {}

2533

ElementType, ElementAlign, Destroyer);

2548

Destroyer *destroyer) {

2549

pushFullExprCleanup<IrregularPartialArrayDestroy>(

2551

elementAlign, destroyer);

2561

llvm::Value *arrayEnd,

2564

Destroyer *destroyer) {

2565

pushFullExprCleanup<RegularPartialArrayDestroy>(

EHCleanup

,

2566

arrayBegin, arrayEnd,

2567

elementType, elementAlign,

2573 if

(LifetimeStartFn)

2574 return

LifetimeStartFn;

2575

LifetimeStartFn = llvm::Intrinsic::getOrInsertDeclaration(

2577 return

LifetimeStartFn;

2583 return

LifetimeEndFn;

2584

LifetimeEndFn = llvm::Intrinsic::getOrInsertDeclaration(

2586 return

LifetimeEndFn;

2593

FakeUseFn = llvm::Intrinsic::getOrInsertDeclaration(

2594

&

getModule

(), llvm::Intrinsic::fake_use);

2604

ConsumeARCParameter(llvm::Value *param,

2606

: Param(param), Precise(precise) {}

2621 bool

NoDebugInfo =

false

;

2623

assert((isa<ParmVarDecl>(

D

) || isa<ImplicitParamDecl>(

D

)) &&

2624 "Invalid argument to EmitParmDecl"

);

2628 if

(!isa<llvm::GlobalValue>(Arg.getAnyValue()))

2629

Arg.getAnyValue()->setName(

D

.getName());

2634 if

(

auto

IPD = dyn_cast<ImplicitParamDecl>(&

D

)) {

2638

llvm::Value *

V

= Arg.isIndirect()

2640

: Arg.getDirectValue();

2652 bool

DoStore =

false

;

2654 bool

UseIndirectDebugAddress =

false

;

2657 if

(Arg.isIndirect()) {

2658

DeclPtr = Arg.getIndirectAddress();

2671 if

(UseIndirectDebugAddress) {

2674 D

.getName() +

".indirect_addr"

);

2681 if

(SrcLangAS != DestLangAS) {

2682

assert(

getContext

().getTargetAddressSpace(SrcLangAS) ==

2688

*

this

,

V

, SrcLangAS, DestLangAS,

T

,

true

),

2701 "unexpected destructor type"

);

2703

CalleeDestructedParamCleanups[cast<ParmVarDecl>(&

D

)] =

2714

DeclPtr = OpenMPLocalAddr;

2715

AllocaPtr = DeclPtr;

2719 D

.getName() +

".addr"

, &AllocaPtr);

2724

llvm::Value *ArgVal = (DoStore ? Arg.getDirectValue() :

nullptr

);

2734 bool

isConsumed =

D

.

hasAttr

<NSConsumedAttr>();

2737 if

(

D

.isARCPseudoStrong()) {

2739 "pseudo-strong variable isn't strong?"

);

2740

assert(qs.

hasConst

() &&

"pseudo-strong variable should be const!"

);

2745 if

(Arg.isIndirect() && !ArgVal)

2789

setAddrOfLocalVar(&

D

, DeclPtr);

2798

&

D

== CXXABIThisDecl)) {

2809 if

(

const auto

*Var = dyn_cast_or_null<ParmVarDecl>(&

D

))

2820 if

(requiresReturnValueNullabilityCheck()) {

2823

SanitizerScope SanScope(

this

);

2824

RetValNullabilityPrecondition =

2825 Builder

.CreateAnd(RetValNullabilityPrecondition,

2826 Builder

.CreateIsNotNull(Arg.getAnyValue()));

2833 if

(!LangOpts.OpenMP || (!LangOpts.EmitAllDecls && !

D

->

isUsed

()))

2840 if

(!LangOpts.OpenMP || LangOpts.OpenMPSimd ||

2841

(!LangOpts.EmitAllDecls && !

D

->

isUsed

()))

2851 for

(

const Expr

*

E

:

D

->varlist()) {

2852 const auto

*DE = cast<DeclRefExpr>(

E

);

2853 const auto

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

2876 if

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

2881

llvm::PointerType *PTy = llvm::PointerType::get(Ty, TargetAS);

2886

llvm::GlobalVariable *DummyGV =

new

llvm::GlobalVariable(

2887 getModule

(), Entry->getValueType(),

false

,

2888

llvm::GlobalValue::CommonLinkage,

nullptr

,

"dummy"

,

nullptr

,

2889

llvm::GlobalVariable::NotThreadLocal, Entry->getAddressSpace());

2890

Entry->replaceAllUsesWith(DummyGV);

2892

Entry->mutateType(PTy);

2893

llvm::Constant *NewPtrForOldDecl =

2894

llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(

2895

Entry, DummyGV->getType());

2899

DummyGV->replaceAllUsesWith(NewPtrForOldDecl);

2900

DummyGV->eraseFromParent();

2904

std::optional<CharUnits>

2906 if

(

const auto

*AA = VD->

getAttr

<OMPAllocateDeclAttr>()) {

2907 if

(

Expr

*Alignment = AA->getAlignment()) {

2908 unsigned

UserAlign =

2909

Alignment->EvaluateKnownConstInt(

getContext

()).getExtValue();

2917

std::max<unsigned>(UserAlign, NaturalAlign.

getQuantity

()));

2920 return

std::nullopt;

Defines the clang::ASTContext interface.

static void emitStoresForInitAfterBZero(CodeGenModule &CGM, llvm::Constant *Init, Address Loc, bool isVolatile, CGBuilderTy &Builder, bool IsAutoInit)

For inits that canEmitInitWithFewStoresAfterBZero returned true for, emit the scalar stores that woul...

static bool isCapturedBy(const VarDecl &, const Expr *)

Determines whether the given __block variable is potentially captured by the given expression.

static void emitPartialArrayDestroy(CodeGenFunction &CGF, llvm::Value *begin, llvm::Value *end, QualType type, CharUnits elementAlign, CodeGenFunction::Destroyer *destroyer)

Perform partial array destruction as if in an EH cleanup.

static void emitStoresForPatternInit(CodeGenModule &CGM, const VarDecl &D, Address Loc, bool isVolatile, CGBuilderTy &Builder)

static bool canEmitInitWithFewStoresAfterBZero(llvm::Constant *Init, unsigned &NumStores)

Decide whether we can emit the non-zero parts of the specified initializer with equal or fewer than N...

static llvm::Constant * patternOrZeroFor(CodeGenModule &CGM, IsPattern isPattern, llvm::Type *Ty)

Generate a constant filled with either a pattern or zeroes.

static llvm::Constant * constWithPadding(CodeGenModule &CGM, IsPattern isPattern, llvm::Constant *constant)

Replace all padding bytes in a given constant with either a pattern byte or 0x00.

static llvm::Value * shouldUseMemSetToInitialize(llvm::Constant *Init, uint64_t GlobalSize, const llvm::DataLayout &DL)

Decide whether we should use memset to initialize a local variable instead of using a memcpy from a c...

static std::string getStaticDeclName(CodeGenModule &CGM, const VarDecl &D)

static void emitStoresForConstant(CodeGenModule &CGM, const VarDecl &D, Address Loc, bool isVolatile, CGBuilderTy &Builder, llvm::Constant *constant, bool IsAutoInit)

static bool shouldSplitConstantStore(CodeGenModule &CGM, uint64_t GlobalByteSize)

Decide whether we want to split a constant structure or array store into a sequence of its fields' st...

static llvm::Constant * replaceUndef(CodeGenModule &CGM, IsPattern isPattern, llvm::Constant *constant)

static bool shouldExtendLifetime(const ASTContext &Context, const Decl *FuncDecl, const VarDecl &D, ImplicitParamDecl *CXXABIThisDecl)

static bool tryEmitARCCopyWeakInit(CodeGenFunction &CGF, const LValue &destLV, const Expr *init)

static bool shouldUseBZeroPlusStoresToInitialize(llvm::Constant *Init, uint64_t GlobalSize)

Decide whether we should use bzero plus some stores to initialize a local variable instead of using a...

static llvm::Constant * constStructWithPadding(CodeGenModule &CGM, IsPattern isPattern, llvm::StructType *STy, llvm::Constant *constant)

Helper function for constWithPadding() to deal with padding in structures.

static bool containsUndef(llvm::Constant *constant)

static uint64_t maxFakeUseAggregateSize(const ASTContext &C)

Return the maximum size of an aggregate for which we generate a fake use intrinsic when -fextend-vari...

static bool isAccessedBy(const VarDecl &var, const Stmt *s)

static void EmitAutoVarWithLifetime(CodeGenFunction &CGF, const VarDecl &var, Address addr, Qualifiers::ObjCLifetime lifetime)

EmitAutoVarWithLifetime - Does the setup required for an automatic variable with lifetime.

static Address createUnnamedGlobalForMemcpyFrom(CodeGenModule &CGM, const VarDecl &D, CGBuilderTy &Builder, llvm::Constant *Constant, CharUnits Align)

static void emitStoresForZeroInit(CodeGenModule &CGM, const VarDecl &D, Address Loc, bool isVolatile, CGBuilderTy &Builder)

static void drillIntoBlockVariable(CodeGenFunction &CGF, LValue &lvalue, const VarDecl *var)

CodeGenFunction::ComplexPairTy ComplexPairTy

This file defines OpenMP nodes for declarative directives.

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)

__device__ __2f16 float __ockl_bool s

Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...

CharUnits getTypeAlignInChars(QualType T) const

Return the ABI-specified alignment of a (complete) type T, in characters.

QualType getPointerType(QualType T) const

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

const LangOptions & getLangOpts() const

QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const

getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...

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

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

const ArrayType * getAsArrayType(QualType T) const

Type Query functions.

uint64_t getTypeSize(QualType T) const

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

CharUnits getTypeSizeInChars(QualType T) const

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

const VariableArrayType * getAsVariableArrayType(QualType T) const

unsigned getTargetAddressSpace(LangAS AS) const

Represents an array type, per C99 6.7.5.2 - Array Declarators.

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

ArrayRef< Capture > captures() const

BlockExpr - Adaptor class for mixing a BlockDecl with expressions.

Represents a call to a C++ constructor.

Represents a C++ constructor within a class.

A use of a default initializer in a constructor or in aggregate initialization.

Represents a C++ destructor within a class.

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.

CharUnits alignmentOfArrayElement(CharUnits elementSize) const

Given that this is the alignment of the first element of an array, return the minimum alignment of an...

bool isOne() const

isOne - Test whether the quantity equals one.

static CharUnits fromQuantity(QuantityType Quantity)

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

bool hasReducedDebugInfo() const

Check if type and variable info should be emitted.

ABIArgInfo - Helper class to encapsulate information about how a specific C type should be passed to ...

bool getIndirectByVal() const

Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...

llvm::Value * emitRawPointer(CodeGenFunction &CGF) const

Return the pointer contained in this class after authenticating it and adding offset to it if necessa...

CharUnits getAlignment() const

llvm::Type * getElementType() const

Return the type of the values stored in this address.

Address withPointer(llvm::Value *NewPointer, KnownNonNull_t IsKnownNonNull) const

Return address with different pointer, but same element type and alignment.

Address withElementType(llvm::Type *ElemTy) const

Return address with different element type, but same pointer and alignment.

KnownNonNull_t isKnownNonNull() const

Whether the pointer is known not to be null.

static AggValueSlot forLValue(const LValue &LV, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)

static ApplyDebugLocation CreateDefaultArtificial(CodeGenFunction &CGF, SourceLocation TemporaryLocation)

Apply TemporaryLocation if it is valid.

static ApplyDebugLocation CreateEmpty(CodeGenFunction &CGF)

Set the IRBuilder to not attach debug locations.

llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)

llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)

llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")

llvm::LoadInst * CreateFlagLoad(llvm::Value *Addr, const llvm::Twine &Name="")

Emit a load from an i1 flag variable.

llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)

Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")

static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())

This class gathers all debug information during compilation and is responsible for emitting to llvm g...

void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl)

Emit information about a global variable.

Param2DILocTy & getParamDbgMappings()

llvm::DILocalVariable * EmitDeclareOfArgVariable(const VarDecl *Decl, llvm::Value *AI, unsigned ArgNo, CGBuilderTy &Builder, bool UsePointerValue=false)

Emit call to llvm.dbg.declare for an argument variable declaration.

llvm::DILocalVariable * EmitDeclareOfAutoVariable(const VarDecl *Decl, llvm::Value *AI, CGBuilderTy &Builder, const bool UsePointerValue=false)

Emit call to llvm.dbg.declare for an automatic variable declaration.

void setLocation(SourceLocation Loc)

Update the current source location.

void registerVLASizeExpression(QualType Ty, llvm::Metadata *SizeExpr)

Register VLA size expression debug node with the qualified type.

CGFunctionInfo - Class to encapsulate the information about a function definition.

const_arg_iterator arg_begin() const

MutableArrayRef< ArgInfo > arguments()

virtual void EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF, const VarDecl &D)

Emit the IR required for a work-group-local variable declaration, and add an entry to CGF's LocalDecl...

Allows to disable automatic handling of functions used in target regions as those marked as omp decla...

virtual void getKmpcFreeShared(CodeGenFunction &CGF, const std::pair< llvm::Value *, llvm::Value * > &AddrSizePair)

Get call to __kmpc_free_shared.

void emitUserDefinedMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)

Emit the function for the user defined mapper construct.

virtual void processRequiresDirective(const OMPRequiresDecl *D)

Perform check on requires decl to ensure that target architecture supports unified addressing.

virtual std::pair< llvm::Value *, llvm::Value * > getKmpcAllocShared(CodeGenFunction &CGF, const VarDecl *VD)

Get call to __kmpc_alloc_shared.

virtual void emitUserDefinedReduction(CodeGenFunction *CGF, const OMPDeclareReductionDecl *D)

Emit code for the specified user defined reduction construct.

virtual Address getAddressOfLocalVariable(CodeGenFunction &CGF, const VarDecl *VD)

Gets the OpenMP-specific address of the local variable.

CallArgList - Type for representing both the value and type of arguments in a call.

void add(RValue rvalue, QualType type)

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

void emitAutoVarTypeCleanup(const AutoVarEmission &emission, QualType::DestructionKind dtorKind)

void enterByrefCleanup(CleanupKind Kind, Address Addr, BlockFieldFlags Flags, bool LoadBlockVarAddr, bool CanThrow)

Enter a cleanup to destroy a __block variable.

llvm::Value * EmitLifetimeStart(llvm::TypeSize Size, llvm::Value *Addr)

static TypeEvaluationKind getEvaluationKind(QualType T)

getEvaluationKind - Return the TypeEvaluationKind of QualType T.

static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts=false)

ContainsLabel - Return true if the statement contains a label in it.

static Destroyer destroyNonTrivialCStruct

static bool cxxDestructorCanThrow(QualType T)

Check if T is a C++ class that has a destructor that can throw.

SanitizerSet SanOpts

Sanitizers enabled for this function.

RawAddress createCleanupActiveFlag()

llvm::DenseMap< const VarDecl *, llvm::Value * > NRVOFlags

A mapping from NRVO variables to the flags used to indicate when the NRVO has been applied to this va...

void EmitARCMoveWeak(Address dst, Address src)

void EmitAutoVarDecl(const VarDecl &D)

EmitAutoVarDecl - Emit an auto variable declaration.

void EmitLifetimeEnd(llvm::Value *Size, llvm::Value *Addr)

void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false)

EmitStoreThroughLValue - Store the specified rvalue into the specified lvalue, where both are guarant...

void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)

static bool hasScalarEvaluationKind(QualType T)

const BlockByrefInfo & getBlockByrefInfo(const VarDecl *var)

void EmitDecl(const Decl &D)

EmitDecl - Emit a declaration.

void pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin, Address arrayEndPointer, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)

RawAddress CreateDefaultAlignTempAlloca(llvm::Type *Ty, const Twine &Name="tmp")

CreateDefaultAlignedTempAlloca - This creates an alloca with the default ABI alignment of the given L...

llvm::Value * emitArrayLength(const ArrayType *arrayType, QualType &baseType, Address &addr)

emitArrayLength - Compute the length of an array, even if it's a VLA, and drill down to the base elem...

VlaSizePair getVLASize(const VariableArrayType *vla)

Returns an LLVM value that corresponds to the size, in non-variably-sized elements,...

CleanupKind getARCCleanupKind()

Retrieves the default cleanup kind for an ARC cleanup.

bool CurFuncIsThunk

In C++, whether we are code generating a thunk.

void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating, Address This, QualType ThisTy)

LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)

EmitLValue - Emit code to compute a designator that specifies the location of the expression.

void EmitExtendGCLifetime(llvm::Value *object)

EmitExtendGCLifetime - Given a pointer to an Objective-C object, make sure it survives garbage collec...

llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack

llvm::Value * EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored)

void EmitVariablyModifiedType(QualType Ty)

EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...

llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)

createBasicBlock - Create an LLVM basic block.

const LangOptions & getLangOpts() const

llvm::Constant * EmitCheckTypeDescriptor(QualType T)

Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.

void pushEHDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)

void emitArrayDestroy(llvm::Value *begin, llvm::Value *end, QualType elementType, CharUnits elementAlign, Destroyer *destroyer, bool checkZeroLength, bool useEHCleanup)

void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)

EmitBlock - Emit the given block.

void pushDestroyAndDeferDeactivation(QualType::DestructionKind dtorKind, Address addr, QualType type)

llvm::AllocaInst * CreateTempAlloca(llvm::Type *Ty, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)

CreateTempAlloca - This creates an alloca and inserts it into the entry block if ArraySize is nullptr...

const CodeGen::CGBlockInfo * BlockInfo

void EmitExprAsInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)

EmitExprAsInit - Emits the code necessary to initialize a location in memory with the given initializ...

void emitByrefStructureInit(const AutoVarEmission &emission)

ComplexPairTy EmitComplexExpr(const Expr *E, bool IgnoreReal=false, bool IgnoreImag=false)

EmitComplexExpr - Emit the computation of the specified expression of complex type,...

@ TCK_NonnullAssign

Checking the value assigned to a _Nonnull pointer. Must not be null.

llvm::Value * EmitARCStoreStrongCall(Address addr, llvm::Value *value, bool resultIgnored)

llvm::Type * ConvertTypeForMem(QualType T)

llvm::Value * EmitARCUnsafeUnretainedScalarExpr(const Expr *expr)

const Decl * CurCodeDecl

CurCodeDecl - This is the inner-most code context, which includes blocks.

void EmitAutoVarInit(const AutoVarEmission &emission)

void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)

DominatingValue< T >::saved_type saveValueInCond(T value)

RawAddress CreateMemTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)

CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen and cas...

void EmitStaticVarDecl(const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage)

static Destroyer destroyCXXObject

void EmitVarAnnotations(const VarDecl *D, llvm::Value *V)

Emit local annotations for the local variable V, declared by D.

Destroyer * getDestroyer(QualType::DestructionKind destructionKind)

void EmitAtomicInit(Expr *E, LValue lvalue)

const TargetInfo & getTarget() const

bool isInConditionalBranch() const

isInConditionalBranch - Return true if we're currently emitting one branch or the other of a conditio...

void emitDestroy(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)

void EmitCXXGuardedInit(const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)

Emit code in this function to perform a guarded variable initialization.

void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)

void initFullExprCleanupWithFlag(RawAddress ActiveFlag)

void EmitARCCopyWeak(Address dst, Address src)

void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerKind::SanitizerOrdinal > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs)

Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...

void setBlockContextParameter(const ImplicitParamDecl *D, unsigned argNum, llvm::Value *ptr)

void defaultInitNonTrivialCStructVar(LValue Dst)

bool HaveInsertPoint() const

HaveInsertPoint - True if an insertion point is defined.

llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)

Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...

bool isTrivialInitializer(const Expr *Init)

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

CGDebugInfo * getDebugInfo()

Address emitBlockByrefAddress(Address baseAddr, const VarDecl *V, bool followForward=true)

BuildBlockByrefAddress - Computes the location of the data in a variable which is declared as __block...

LValue EmitDeclRefLValue(const DeclRefExpr *E)

AggValueSlot::Overlap_t getOverlapForFieldInit(const FieldDecl *FD)

Determine whether a field initialization may overlap some other object.

llvm::Value * EmitARCRetainAutoreleaseScalarExpr(const Expr *expr)

const TargetCodeGenInfo & getTargetHooks() const

RValue EmitReferenceBindingToExpr(const Expr *E)

Emits a reference binding to the passed in expression.

void EmitAggExpr(const Expr *E, AggValueSlot AS)

EmitAggExpr - Emit the computation of the specified expression of aggregate type.

void EmitFakeUse(Address Addr)

VlaSizePair getVLAElements1D(const VariableArrayType *vla)

Return the number of elements for a single dimension for the given array type.

RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)

EmitCall - Generate a call of the given function, expecting the given result type,...

void EmitVarDecl(const VarDecl &D)

EmitVarDecl - Emit a local variable declaration.

ASTContext & getContext() const

llvm::Value * EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty, SourceLocation Loc, AlignmentSource Source=AlignmentSource::Type, bool isNontemporal=false)

EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...

void EmitNullabilityCheck(LValue LHS, llvm::Value *RHS, SourceLocation Loc)

Given an assignment *LHS = RHS, emit a test that checks if RHS is nonnull, if LHS is marked _Nonnull.

void Destroyer(CodeGenFunction &CGF, Address addr, QualType ty)

const Decl * CurFuncDecl

CurFuncDecl - Holds the Decl for the current outermost non-closure context.

AutoVarEmission EmitAutoVarAlloca(const VarDecl &var)

void pushDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)

Address ReturnValuePointer

ReturnValuePointer - The temporary alloca to hold a pointer to sret.

void EmitAutoVarCleanups(const AutoVarEmission &emission)

llvm::GlobalVariable * AddInitializerToStaticVarDecl(const VarDecl &D, llvm::GlobalVariable *GV)

AddInitializerToStaticVarDecl - Add the initializer for 'D' to the global variable that has already b...

void PopCleanupBlock(bool FallThroughIsBranchThrough=false, bool ForDeactivation=false)

PopCleanupBlock - Will pop the cleanup entry on the stack and process all branch fixups.

static Destroyer destroyARCWeak

bool needsEHCleanup(QualType::DestructionKind kind)

Determines whether an EH cleanup is required to destroy a type with the given destruction kind.

CleanupKind getCleanupKind(QualType::DestructionKind kind)

llvm::Type * ConvertType(QualType T)

void EmitARCInitWeak(Address addr, llvm::Value *value)

static Destroyer destroyARCStrongPrecise

VarBypassDetector Bypasses

llvm::Value * EmitARCRetainNonBlock(llvm::Value *value)

void pushStackRestore(CleanupKind kind, Address SPMem)

LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)

void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit)

EmitStoreOfComplex - Store a complex number into the specified l-value.

const CGFunctionInfo * CurFnInfo

void pushKmpcAllocFree(CleanupKind Kind, std::pair< llvm::Value *, llvm::Value * > AddrSizePair)

void EmitParmDecl(const VarDecl &D, ParamValue Arg, unsigned ArgNo)

EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.

Address ReturnValue

ReturnValue - The temporary alloca to hold the return value.

static Destroyer destroyARCStrongImprecise

void EnsureInsertPoint()

EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.

llvm::LLVMContext & getLLVMContext()

llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)

EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...

void EmitAndRegisterVariableArrayDimensions(CGDebugInfo *DI, const VarDecl &D, bool EmitDebugInfo)

Emits the alloca and debug information for the size expressions for each dimension of an array.

llvm::Value * EmitARCRetainScalarExpr(const Expr *expr)

void pushRegularPartialArrayCleanup(llvm::Value *arrayBegin, llvm::Value *arrayEnd, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)

void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)

EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...

bool hasLabelBeenSeenInCurrentScope() const

Return true if a label was seen in the current scope.

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

StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD)

void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const

Set visibility, dllimport/dllexport and dso_local.

llvm::Module & getModule() const

void setStaticLocalDeclAddress(const VarDecl *D, llvm::Constant *C)

llvm::Function * getLLVMLifetimeStartFn()

Lazily declare the @llvm.lifetime.start intrinsic.

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.

Address createUnnamedGlobalFrom(const VarDecl &D, llvm::Constant *Constant, CharUnits Align)

llvm::Constant * getNullPointer(llvm::PointerType *T, QualType QT)

Get target specific null pointer.

void ErrorUnsupported(const Stmt *S, const char *Type)

Print out an error that codegen doesn't support the specified stmt yet.

const LangOptions & getLangOpts() const

CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)

CodeGenTypes & getTypes()

CGOpenCLRuntime & getOpenCLRuntime()

Return a reference to the configured OpenCL runtime.

llvm::Function * getLLVMFakeUseFn()

Lazily declare the @llvm.fake.use intrinsic.

void addUsedGlobal(llvm::GlobalValue *GV)

Add a global to a list to be added to the llvm.used metadata.

void EmitOMPAllocateDecl(const OMPAllocateDecl *D)

Emit a code for the allocate directive.

llvm::GlobalValue::LinkageTypes getLLVMLinkageVarDefinition(const VarDecl *VD)

Returns LLVM linkage for a declarator.

const llvm::DataLayout & getDataLayout() const

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.

SanitizerMetadata * getSanitizerMetadata()

llvm::Constant * getOrCreateStaticVarDecl(const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage)

llvm::Constant * GetAddrOfGlobal(GlobalDecl GD, ForDefinition_t IsForDefinition=NotForDefinition)

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.

ASTContext & getContext() const

void EmitOMPDeclareMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)

Emit a code for declare mapper construct.

llvm::Function * getLLVMLifetimeEndFn()

Lazily declare the @llvm.lifetime.end intrinsic.

bool supportsCOMDAT() const

void EmitOMPRequiresDecl(const OMPRequiresDecl *D)

Emit a code for requires directive.

const TargetCodeGenInfo & getTargetCodeGenInfo()

const CodeGenOptions & getCodeGenOpts() const

StringRef getMangledName(GlobalDecl GD)

std::optional< CharUnits > getOMPAllocateAlignment(const VarDecl *VD)

Return the alignment specified in an allocate directive, if present.

llvm::LLVMContext & getLLVMContext()

llvm::GlobalValue * GetGlobalValue(StringRef Ref)

void EmitOMPDeclareReduction(const OMPDeclareReductionDecl *D, CodeGenFunction *CGF=nullptr)

Emit a code for declare reduction construct.

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

llvm::ConstantInt * getSize(CharUnits numChars)

Emit the given number of characters as a value of type size_t.

void markStmtMaybeUsed(const Stmt *S)

llvm::Type * convertTypeForLoadStore(QualType T, llvm::Type *LLVMTy=nullptr)

Given that T is a scalar type, return the IR type that should be used for load and store operations.

llvm::Type * ConvertTypeForMem(QualType T)

ConvertTypeForMem - Convert type T into a llvm::Type.

bool typeRequiresSplitIntoByteArray(QualType ASTTy, llvm::Type *LLVMTy=nullptr)

Check whether the given type needs to be laid out in memory using an opaque byte-array type because i...

const CGFunctionInfo & arrangeFunctionDeclaration(const FunctionDecl *FD)

Free functions are functions that are compatible with an ordinary C function pointer type.

llvm::Constant * tryEmitAbstractForInitializer(const VarDecl &D)

Try to emit the initializer of the given declaration as an abstract constant.

A cleanup scope which generates the cleanup blocks lazily.

Information for lazily generating a cleanup.

ConditionalCleanup stores the saved form of its parameters, then restores them and performs the clean...

stable_iterator stable_begin() const

Create a stable reference to the top of the EH stack.

iterator begin() const

Returns an iterator pointing to the innermost EH scope.

LValue - This represents an lvalue references.

llvm::Value * getPointer(CodeGenFunction &CGF) const

Address getAddress() const

void setNonGC(bool Value)

void setAddress(Address address)

Qualifiers::ObjCLifetime getObjCLifetime() const

RValue - This trivial value class is used to represent the result of an expression that is evaluated.

static RValue get(llvm::Value *V)

An abstract representation of an aligned address.

llvm::Value * getPointer() const

static RawAddress invalid()

ReturnValueSlot - Contains the address where the return value of a function can be stored,...

Address performAddrSpaceCast(CodeGen::CodeGenFunction &CGF, Address Addr, LangAS SrcAddr, LangAS DestAddr, llvm::Type *DestTy, bool IsNonNull=false) const

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

bool IsBypassed(const VarDecl *D) const

Returns true if the variable declaration was by bypassed by any goto or switch statement.

CompoundStmt - This represents a group of statements like { stmt stmt }.

DeclContext - This is used only as base class of specific decl types that can act as declaration cont...

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

Decl - This represents one declaration (or definition), e.g.

const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const

If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...

bool isImplicit() const

isImplicit - Indicates whether the declaration was implicitly generated by the implementation.

Decl * getNonClosureContext()

Find the innermost non-closure ancestor of this declaration, walking up through blocks,...

SourceLocation getLocation() const

bool isUsed(bool CheckUsedAttr=true) const

Whether any (re-)declaration of the entity was used, meaning that a definition is required.

DeclContext * getDeclContext()

This represents one expression.

Expr * IgnoreParenCasts() LLVM_READONLY

Skip past any parentheses and casts which might surround this expression until reaching a fixed point...

Expr * IgnoreParens() LLVM_READONLY

Skip past any parentheses which might surround this expression until reaching a fixed point.

bool isLValue() const

isLValue - True if this expression is an "l-value" according to the rules of the current language.

SourceLocation getExprLoc() const LLVM_READONLY

getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...

Represents a function declaration or definition.

GlobalDecl - represents a global declaration.

const Decl * getDecl() const

One of these records is kept for each identifier that is lexed.

IdentifierInfo & getOwn(StringRef Name)

Gets an IdentifierInfo for the given name without consulting external sources.

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

This represents '#pragma omp declare mapper ...' directive.

This represents '#pragma omp declare reduction ...' directive.

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

A (possibly-)qualified type.

bool isVolatileQualified() const

Determine whether this type is volatile-qualified.

@ DK_objc_strong_lifetime

@ PDIK_Struct

The type is a struct containing a field whose type is not PCK_Trivial.

LangAS getAddressSpace() const

Return the address space of this type.

bool isConstant(const ASTContext &Ctx) const

Qualifiers getQualifiers() const

Retrieve the set of qualifiers applied to this type.

Qualifiers::ObjCLifetime getObjCLifetime() const

Returns lifetime attribute of this type.

QualType getNonReferenceType() const

If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...

QualType getUnqualifiedType() const

Retrieve the unqualified variant of the given type, removing as little sugar as possible.

bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)

bool isPODType(const ASTContext &Context) const

Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).

The collection of all-type qualifiers we support.

@ OCL_Strong

Assigning into this object requires the old value to be released and the new value to be retained.

@ OCL_ExplicitNone

This object can be modified without requiring retains or releases.

@ OCL_None

There is no lifetime qualification on this type.

@ OCL_Weak

Reading or writing from this object requires a barrier call.

@ OCL_Autoreleasing

Assigning into this object requires a lifetime extension.

ObjCLifetime getObjCLifetime() const

bool isParamDestroyedInCallee() const

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

RecordDecl * getDecl() const

Scope - A scope is a transient data structure that is used while parsing the program.

static const uint64_t MaximumAlignment

Encodes a location in the source.

StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).

Stmt - This represents one statement.

bool isMicrosoft() const

Is this ABI an MSVC-compatible ABI?

TargetCXXABI getCXXABI() const

Get the C++ ABI currently in use.

bool isConstantSizeType() const

Return true if this is not a variable sized type, according to the rules of C99 6....

const T * castAs() const

Member-template castAs<specific type>.

bool isVariablyModifiedType() const

Whether this type is a variably-modified type (C99 6.7.5).

const T * getAs() const

Member-template getAs<specific type>'.

bool isRecordType() const

std::optional< NullabilityKind > getNullability() const

Determine the nullability of the given type.

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.

static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)

bool hasGlobalStorage() const

Returns true for all variables that do not have local storage.

const Expr * getInit() const

bool isLocalVarDecl() const

Returns true for local variable declarations other than parameters.

Defines the clang::TargetInfo interface.

@ Decl

The l-value was an access to a declared entity or something equivalently strong, like the address of ...

llvm::Constant * initializationPatternFor(CodeGenModule &, llvm::Type *)

@ NormalCleanup

Denotes a cleanup that should run when a scope is exited using normal control flow (falling off the e...

@ EHCleanup

Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...

ARCPreciseLifetime_t

Does an ARC strong l-value have precise lifetime?

const internal::VariadicAllOfMatcher< Type > type

Matches Types in the clang AST.

const AstTypeMatcher< ArrayType > arrayType

Matches all kinds of arrays.

const internal::VariadicAllOfMatcher< Decl > decl

Matches declarations.

const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr

Matches any cast nodes of Clang's AST.

constexpr Variable var(Literal L)

Returns the variable of L.

tooling::Replacements cleanup(const FormatStyle &Style, StringRef Code, ArrayRef< tooling::Range > Ranges, StringRef FileName="<stdin>")

Clean up any erroneous/redundant code in the given Ranges in Code.

bool Null(InterpState &S, CodePtr OpPC, uint64_t Value, const Descriptor *Desc)

bool Zero(InterpState &S, CodePtr OpPC)

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

@ Ctor_Base

Base object ctor.

@ NonNull

Values of this type can never be null.

Linkage

Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.

@ SD_Automatic

Automatic storage duration (most local variables).

@ Dtor_Base

Base object dtor.

@ Dtor_Complete

Complete object dtor.

LangAS

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

@ VK_LValue

An l-value expression is a reference to an object with independent storage.

const FunctionProtoType * T

@ ThreadPrivateVar

Parameter for Thread private variable.

float __ovld __cnfn length(float)

Return the length of vector p, i.e., sqrt(p.x2 + p.y 2 + ...)

static Address getAddressOfLocalVariable(CodeGenFunction &CGF, const VarDecl *VD)

Gets the OpenMP-specific address of the local variable /p VD.

llvm::IntegerType * Int64Ty

llvm::IntegerType * Int8Ty

i8, i16, i32, and i64

llvm::IntegerType * SizeTy

llvm::IntegerType * IntPtrTy

llvm::PointerType * Int8PtrTy

llvm::PointerType * AllocaInt8PtrTy

LangAS getASTAllocaAddressSpace() const

A metaprogramming class for ensuring that a value will dominate an arbitrary position in a function.

bool has(SanitizerMask K) const

Check if a certain (single) sanitizer is 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