A RetroSearch Logo

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

Search Query:

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

clang: lib/CodeGen/CGExprCXX.cpp Source File

22#include "llvm/IR/Intrinsics.h" 24using namespace clang

;

25using namespace

CodeGen;

28struct

MemberCallInfo {

37

llvm::Value *This, llvm::Value *ImplicitParam,

40 auto

*MD = cast<CXXMethodDecl>(GD.

getDecl

());

42

assert(CE ==

nullptr

|| isa<CXXMemberCallExpr>(CE) ||

43

isa<CXXOperatorCallExpr>(CE));

44

assert(MD->isImplicitObjectMemberFunction() &&

45 "Trying to emit a member or operator call expr on a static method!"

);

59 unsigned

PrefixSize = Args.size() - 1;

69 unsigned

ArgsToSkip = 0;

70 if

(

const auto

*Op = dyn_cast<CXXOperatorCallExpr>(CE)) {

71 if

(

const auto

*M = dyn_cast<CXXMethodDecl>(Op->getCalleeDecl()))

73 static_cast<unsigned>

(!M->isExplicitObjectMemberFunction());

80 "No CallExpr specified for function with non-zero number of arguments"

);

82 return

{required, PrefixSize};

85RValue

CodeGenFunction::EmitCXXMemberOrOperatorCall(

87 ReturnValueSlot

ReturnValue, llvm::Value *This, llvm::Value *ImplicitParam,

89

llvm::CallBase **CallOrInvoke) {

93

*

this

, MD, This, ImplicitParam, ImplicitParamTy, CE, Args, RtlArgs);

95

Args, FPT, CallInfo.ReqArgs, CallInfo.PrefixSize);

104

llvm::CallBase **CallOrInvoke) {

107

assert(!ThisTy.

isNull

());

109 "Pointer/Object mixup"

);

113 if

(SrcAS != DstAS) {

122

ImplicitParamTy, CE, Args,

nullptr

);

131 QualType

DestroyedType =

E

->getDestroyedType();

136 Expr

*BaseExpr =

E

->getBase();

141 if

(

E

->isArrow()) {

144

BaseQuals = PTy->getPointeeType().getQualifiers();

185 return

cast<CXXRecordDecl>(Ty->

getDecl

());

192

llvm::CallBase **CallOrInvoke) {

195 if

(isa<BinaryOperator>(callee))

198 const MemberExpr

*ME = cast<MemberExpr>(callee);

211 bool

IsArrow = ME->

isArrow

();

215

HasQualifier, Qualifier, IsArrow,

216 Base

, CallOrInvoke);

222 const Expr

*

Base

, llvm::CallBase **CallOrInvoke) {

223

assert(isa<CXXMemberCallExpr>(CE) || isa<CXXOperatorCallExpr>(CE));

226 bool

CanUseVirtualCall = MD->

isVirtual

() && !HasQualifier;

229 if

(CanUseVirtualCall &&

233

assert(DevirtualizedMethod);

235 const Expr

*Inner =

Base

->IgnoreParenBaseCasts();

243

DevirtualizedMethod =

nullptr

;

253

DevirtualizedMethod =

nullptr

;

257 bool

TrivialForCodegen =

259 bool

TrivialAssignment =

268 LValue

TrivialAssignmentRHS;

269 if

(

auto

*OCE = dyn_cast<CXXOperatorCallExpr>(CE)) {

270 if

(OCE->isAssignmentOp()) {

271 if

(TrivialAssignment) {

274

RtlArgs = &RtlArgStorage;

297

assert(

ReturnValue

.isNull() &&

"Constructor shouldn't have return value"

);

305 false

,

This

.getAddress(), Args,

307 false

, CallOrInvoke);

311 if

(TrivialForCodegen) {

312 if

(isa<CXXDestructorDecl>(MD))

315 if

(TrivialAssignment) {

321 LValue

RHS = isa<CXXOperatorCallExpr>(CE)

322

? TrivialAssignmentRHS

329 "unknown trivial member function"

);

334

DevirtualizedMethod ? DevirtualizedMethod : MD;

336 if

(

const auto

*Dtor = dyn_cast<CXXDestructorDecl>(CalleeDecl))

353 if

(

const auto

*CMCE = dyn_cast<CXXMemberCallExpr>(CE)) {

354 auto

*IOA = CMCE->getImplicitObjectArgument();

356 if

(IsImplicitObjectCXXThis)

357

SkippedChecks.

set

(SanitizerKind::Alignment,

true

);

358 if

(IsImplicitObjectCXXThis || isa<DeclRefExpr>(IOA))

359

SkippedChecks.

set

(SanitizerKind::Null,

true

);

364 This

.emitRawPointer(*

this

),

374 bool

UseVirtualCall = CanUseVirtualCall && !DevirtualizedMethod;

378 "Destructor shouldn't have explicit parameters"

);

379

assert(

ReturnValue

.isNull() &&

"Destructor shouldn't have return value"

);

380 if

(UseVirtualCall) {

383

cast<CXXMemberCallExpr>(CE), CallOrInvoke);

387 if

(

getLangOpts

().AppleKext && Dtor->isVirtual() && HasQualifier)

389 else if

(!DevirtualizedMethod)

397

IsArrow ?

Base

->getType()->getPointeeType() :

Base

->getType();

409 if

(UseVirtualCall) {

412 if

(

SanOpts

.

has

(SanitizerKind::CFINVCall) &&

423 else if

(!DevirtualizedMethod)

436

*

this

, CalleeDecl,

This

.getAddress(), UseVirtualCall);

437 This

.setAddress(NewThisAddr);

442 nullptr

,

QualType

(), CE, RtlArgs, CallOrInvoke);

448

llvm::CallBase **CallOrInvoke) {

473

llvm::Value *ThisPtrForCall =

nullptr

;

476

ThisPtrForCall, MemFnPtr, MPT);

500 "Trying to emit a member call expr on a static method!"

);

503 false

,

E

->getArg(0), CallOrInvoke);

508

llvm::CallBase **CallOrInvoke) {

516 if

(

Base

->isEmpty())

532

std::vector<CharUnits> VBPtrOffsets =

534 for

(

CharUnits

VBPtrOffset : VBPtrOffsets) {

536 if

(VBPtrOffset >= NVSize)

538

std::pair<CharUnits, CharUnits> LastStore = Stores.pop_back_val();

539 CharUnits

LastStoreOffset = LastStore.first;

540 CharUnits

LastStoreSize = LastStore.second;

542 CharUnits

SplitBeforeOffset = LastStoreOffset;

543 CharUnits

SplitBeforeSize = VBPtrOffset - SplitBeforeOffset;

544

assert(!SplitBeforeSize.

isNegative

() &&

"negative store size!"

);

545 if

(!SplitBeforeSize.

isZero

())

546

Stores.emplace_back(SplitBeforeOffset, SplitBeforeSize);

548 CharUnits

SplitAfterOffset = VBPtrOffset + VBPtrWidth;

549 CharUnits

SplitAfterSize = LastStoreSize - SplitAfterOffset;

550

assert(!SplitAfterSize.

isNegative

() &&

"negative store size!"

);

551 if

(!SplitAfterSize.

isZero

())

552

Stores.emplace_back(SplitAfterOffset, SplitAfterSize);

562 if

(!NullConstantForBase->isNullValue()) {

563

llvm::GlobalVariable *NullVariable =

new

llvm::GlobalVariable(

564

CGF.

CGM

.

getModule

(), NullConstantForBase->getType(),

565 true

, llvm::GlobalVariable::PrivateLinkage,

566

NullConstantForBase, Twine());

570

NullVariable->setAlignment(Align.

getAsAlign

());

575 for

(std::pair<CharUnits, CharUnits> Store : Stores) {

578

llvm::Value *StoreSizeVal = CGF.

CGM

.

getSize

(StoreSize);

589 for

(std::pair<CharUnits, CharUnits> Store : Stores) {

592

llvm::Value *StoreSizeVal = CGF.

CGM

.

getSize

(StoreSize);

595

CGF.

Builder

.getInt8(0), StoreSizeVal);

603

assert(!Dest.

isIgnored

() &&

"Must have a destination!"

);

610 if

(

E

->requiresZeroInitialization() && !Dest.

isZeroed

()) {

611 switch

(

E

->getConstructionKind()) {

629 if

(

getLangOpts

().ElideConstructors &&

E

->isElidable()) {

635 const Expr

*SrcObj =

E

->getArg(0);

649 bool

ForVirtualBase =

false

;

652 switch

(

E

->getConstructionKind()) {

664

ForVirtualBase =

true

;

679

Exp =

E

->getSubExpr();

680

assert(isa<CXXConstructExpr>(Exp) &&

681 "EmitSynthesizedCXXCopyCtor - unknown copy ctor expr"

);

684

RunCleanupsScope

Scope

(*

this

);

690 if

(

E

->requiresZeroInitialization())

694

&&

"EmitSynthesizedCXXCopyCtor - Copied-in Array"

);

705 if

(

E

->getOperatorNew()->isReservedGlobalPlacementOperator())

713 unsigned

minElements,

714

llvm::Value *&numElements,

715

llvm::Value *&sizeWithoutCookie) {

722 return

sizeWithoutCookie;

726 unsigned

sizeWidth = CGF.

SizeTy

->getBitWidth();

729

llvm::APInt cookieSize(sizeWidth,

739

assert(isa<llvm::IntegerType>(numElements->getType()));

748

= (*e->

getArraySize

())->getType()->isSignedIntegerOrEnumerationType();

749

llvm::IntegerType *numElementsType

750

= cast<llvm::IntegerType>(numElements->getType());

751 unsigned

numElementsWidth = numElementsType->getBitWidth();

754

llvm::APInt arraySizeMultiplier(sizeWidth, 1);

757 type

= CAT->getElementType();

758

arraySizeMultiplier *= CAT->getSize();

762

llvm::APInt typeSizeMultiplier(sizeWidth, typeSize.

getQuantity

());

763

typeSizeMultiplier *= arraySizeMultiplier;

770 if

(llvm::ConstantInt *numElementsC =

771

dyn_cast<llvm::ConstantInt>(numElements)) {

772 const

llvm::APInt &count = numElementsC->getValue();

774 bool

hasAnyOverflow =

false

;

777 if

(isSigned && count.isNegative())

778

hasAnyOverflow =

true

;

783 else if

(numElementsWidth > sizeWidth &&

784

numElementsWidth - sizeWidth > count.countl_zero())

785

hasAnyOverflow =

true

;

788

llvm::APInt adjustedCount = count.zextOrTrunc(sizeWidth);

792 if

(adjustedCount.ult(minElements))

793

hasAnyOverflow =

true

;

798

numElements = llvm::ConstantInt::get(CGF.

SizeTy

,

799

adjustedCount * arraySizeMultiplier);

803

llvm::APInt allocationSize

804

= adjustedCount.umul_ov(typeSizeMultiplier, overflow);

805

hasAnyOverflow |= overflow;

808 if

(cookieSize != 0) {

811

sizeWithoutCookie = llvm::ConstantInt::get(CGF.

SizeTy

, allocationSize);

813

allocationSize = allocationSize.uadd_ov(cookieSize, overflow);

814

hasAnyOverflow |= overflow;

818 if

(hasAnyOverflow) {

819

size = llvm::Constant::getAllOnesValue(CGF.

SizeTy

);

821

size = llvm::ConstantInt::get(CGF.

SizeTy

, allocationSize);

839

llvm::Value *hasOverflow =

nullptr

;

844 if

(numElementsWidth > sizeWidth) {

845

llvm::APInt threshold =

846

llvm::APInt::getOneBitSet(numElementsWidth, sizeWidth);

848

llvm::Value *thresholdV

849

= llvm::ConstantInt::get(numElementsType, threshold);

851

hasOverflow = CGF.

Builder

.CreateICmpUGE(numElements, thresholdV);

852

numElements = CGF.

Builder

.CreateTrunc(numElements, CGF.

SizeTy

);

855

}

else if

(isSigned) {

856 if

(numElementsWidth < sizeWidth)

857

numElements = CGF.

Builder

.CreateSExt(numElements, CGF.

SizeTy

);

864 if

(typeSizeMultiplier == 1)

865

hasOverflow = CGF.

Builder

.CreateICmpSLT(numElements,

866

llvm::ConstantInt::get(CGF.

SizeTy

, minElements));

869

}

else if

(numElementsWidth < sizeWidth) {

870

numElements = CGF.

Builder

.CreateZExt(numElements, CGF.

SizeTy

);

873

assert(numElements->getType() == CGF.

SizeTy

);

878

hasOverflow = CGF.

Builder

.CreateICmpULT(numElements,

879

llvm::ConstantInt::get(CGF.

SizeTy

, minElements));

880

}

else if

(numElementsWidth > sizeWidth) {

884

hasOverflow = CGF.

Builder

.CreateOr(hasOverflow,

885

CGF.

Builder

.CreateICmpULT(numElements,

886

llvm::ConstantInt::get(CGF.

SizeTy

, minElements)));

899 if

(typeSizeMultiplier != 1) {

900

llvm::Function *umul_with_overflow

904

llvm::ConstantInt::get(CGF.

SizeTy

, typeSizeMultiplier);

905

llvm::Value *result =

906

CGF.

Builder

.CreateCall(umul_with_overflow, {size, tsmV});

908

llvm::Value *overflowed = CGF.

Builder

.CreateExtractValue(result, 1);

910

hasOverflow = CGF.

Builder

.CreateOr(hasOverflow, overflowed);

912

hasOverflow = overflowed;

914

size = CGF.

Builder

.CreateExtractValue(result, 0);

917 if

(arraySizeMultiplier != 1) {

920 if

(typeSize.

isOne

()) {

921

assert(arraySizeMultiplier == typeSizeMultiplier);

927

llvm::ConstantInt::get(CGF.

SizeTy

, arraySizeMultiplier);

928

numElements = CGF.

Builder

.CreateMul(numElements, asmV);

933

assert(arraySizeMultiplier == 1);

937 if

(cookieSize != 0) {

938

sizeWithoutCookie = size;

940

llvm::Function *uadd_with_overflow

943

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

SizeTy

, cookieSize);

944

llvm::Value *result =

945

CGF.

Builder

.CreateCall(uadd_with_overflow, {size, cookieSizeV});

947

llvm::Value *overflowed = CGF.

Builder

.CreateExtractValue(result, 1);

949

hasOverflow = CGF.

Builder

.CreateOr(hasOverflow, overflowed);

951

hasOverflow = overflowed;

953

size = CGF.

Builder

.CreateExtractValue(result, 0);

960

size = CGF.

Builder

.CreateSelect(hasOverflow,

961

llvm::Constant::getAllOnesValue(CGF.

SizeTy

),

966

sizeWithoutCookie = size;

968

assert(sizeWithoutCookie &&

"didn't set sizeWithoutCookie?"

);

998

llvm_unreachable(

"bad evaluation kind"

);

1003 Address

BeginPtr, llvm::Value *NumElements,

1004

llvm::Value *AllocSizeWithoutCookie) {

1007 if

(!

E

->hasInitializer())

1012 unsigned

InitListElements = 0;

1014 const Expr

*

Init

=

E

->getInitializer();

1017

CleanupDeactivationScope deactivation(*

this

);

1018 bool

pushedCleanup =

false

;

1025 auto

TryMemsetInitialization = [&]() ->

bool

{

1035 auto

*RemainingSize = AllocSizeWithoutCookie;

1036 if

(InitListElements) {

1038 auto

*InitializedSize = llvm::ConstantInt::get(

1039

RemainingSize->getType(),

1040 getContext

().getTypeSizeInChars(ElementType).getQuantity() *

1042

RemainingSize =

Builder

.CreateSub(RemainingSize, InitializedSize);

1054 const Expr

*IgnoreParen =

nullptr

;

1056

IgnoreParen =

Init

->IgnoreParenImpCasts();

1057

CPLIE = dyn_cast<CXXParenListInitExpr>(IgnoreParen);

1058

SL = dyn_cast<StringLiteral>(IgnoreParen);

1059

OCEE = dyn_cast<ObjCEncodeExpr>(IgnoreParen);

1063 if

(ILE || CPLIE || SL || OCEE) {

1084

cast<ConstantArrayType>(

Init

->getType()->getAsArrayTypeUnsafe())

1087

CurPtr, InitListElements,

"string.init.end"

);

1090

llvm::ConstantInt *ConstNum = dyn_cast<llvm::ConstantInt>(NumElements);

1091 if

(!ConstNum || !ConstNum->equalsInt(InitListElements)) {

1092 bool

OK = TryMemsetInitialization();

1094

assert(OK &&

"couldn't memset character type?"

);

1101

InitListElements = InitExprs.size();

1105 QualType

AllocType =

E

->getAllocatedType();

1115

AllocaTrackerRAII AllocaTracker(*

this

);

1120

llvm::Instruction *DominatingIP =

1125

EndOfInit, ElementType, ElementAlign,

1128

.AddAuxAllocas(AllocaTracker.Take());

1131

pushedCleanup =

true

;

1136 for

(

const Expr

*IE : InitExprs) {

1162 while

(

Init

&&

Init

->getType()->isConstantArrayType()) {

1163 auto

*SubILE = dyn_cast<InitListExpr>(

Init

);

1166

assert(SubILE->getNumInits() == 0 &&

"explicit inits in array filler?"

);

1167 Init

= SubILE->getArrayFiller();

1176

llvm::ConstantInt *ConstNum = dyn_cast<llvm::ConstantInt>(NumElements);

1177 if

(ConstNum && ConstNum->getZExtValue() <= InitListElements) {

1181

assert(

Init

&&

"have trailing elements to initialize but no initializer"

);

1190 if

(!CCE->requiresZeroInitialization() || Ctor->

getParent

()->

isEmpty

())

1193 if

(TryMemsetInitialization())

1205 if

(InitListElements)

1206

NumElements =

Builder

.CreateSub(

1208

llvm::ConstantInt::get(NumElements->getType(), InitListElements));

1211

CCE->requiresZeroInitialization());

1217 if

(isa<ImplicitValueInitExpr>(

Init

)) {

1218 if

(TryMemsetInitialization())

1229

assert(

getContext

().hasSameUnqualifiedType(ElementType,

Init

->getType()) &&

1230 "got wrong type of element to initialize"

);

1233 if

(

auto

*ILE = dyn_cast<InitListExpr>(

Init

))

1234 if

(ILE->

getNumInits

() == 0 && TryMemsetInitialization())

1239 if

(

auto

*ILE = dyn_cast<InitListExpr>(

Init

)) {

1241 if

(RType->getDecl()->isStruct()) {

1242 unsigned

NumElements = 0;

1243 if

(

auto

*CXXRD = dyn_cast<CXXRecordDecl>(RType->getDecl()))

1244

NumElements = CXXRD->getNumBases();

1245 for

(

auto

*Field : RType->getDecl()->fields())

1246 if

(!

Field

->isUnnamedBitField())

1250 for

(

unsigned

i = 0, e = ILE->

getNumInits

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

1251 if

(!isa<ImplicitValueInitExpr>(ILE->

getInit

(i)))

1253 if

(ILE->

getNumInits

() == NumElements && TryMemsetInitialization())

1260

llvm::BasicBlock *EntryBB =

Builder

.GetInsertBlock();

1273

EndPtr,

"array.isempty"

);

1274 Builder

.CreateCondBr(IsEmpty, ContBB, LoopBB);

1281

llvm::PHINode *CurPtrPhi =

1283

CurPtrPhi->addIncoming(CurPtr.

emitRawPointer

(*

this

), EntryBB);

1293

llvm::Instruction *DominatingIP =

1307

deactivation.ForceDeactivate();

1310

llvm::Value *NextPtr =

Builder

.CreateConstInBoundsGEP1_32(

1315

llvm::Value *IsEnd =

Builder

.CreateICmpEQ(NextPtr, EndPtr,

"array.atend"

);

1316 Builder

.CreateCondBr(IsEnd, ContBB, LoopBB);

1317

CurPtrPhi->addIncoming(NextPtr,

Builder

.GetInsertBlock());

1323 QualType

ElementType, llvm::Type *ElementTy,

1324 Address

NewPtr, llvm::Value *NumElements,

1325

llvm::Value *AllocSizeWithoutCookie) {

1329

AllocSizeWithoutCookie);

1330 else if

(

const Expr

*

Init

=

E

->getInitializer())

1341

llvm::CallBase *CallOrInvoke;

1346

Args, CalleeType,

false

),

1354

llvm::Function *Fn = dyn_cast<llvm::Function>(CalleePtr);

1356

Fn && Fn->hasFnAttribute(llvm::Attribute::NoBuiltin)) {

1357

CallOrInvoke->addFnAttr(llvm::Attribute::Builtin);

1374 if

(

auto

*FD = dyn_cast<FunctionDecl>(

Decl

))

1377

llvm_unreachable(

"predeclared global operator new/delete is missing"

);

1382struct

UsualDeleteParams {

1383 bool

DestroyingDelete =

false

;

1385 bool

Alignment =

false

;

1390

UsualDeleteParams Params;

1400

Params.DestroyingDelete =

true

;

1407

Params.Size =

true

;

1412

Params.Alignment =

true

;

1416

assert(AI == AE &&

"unexpected usual deallocation function parameter"

);

1424 template

<

typename

Traits>

1427 typedef typename

Traits::ValueTy ValueTy;

1429 typedef typename

Traits::RValueTy RValueTy;

1430 struct

PlacementArg {

1435 unsigned

NumPlacementArgs : 31;

1436

LLVM_PREFERRED_TYPE(

bool

)

1437 unsigned

PassAlignmentToPlacementDelete : 1;

1443

PlacementArg *getPlacementArgs() {

1444 return reinterpret_cast<

PlacementArg *

>

(

this

+ 1);

1448 static size_t

getExtraSize(

size_t

NumPlacementArgs) {

1449 return

NumPlacementArgs *

sizeof

(PlacementArg);

1452

CallDeleteDuringNew(

size_t

NumPlacementArgs,

1454

ValueTy AllocSize,

bool

PassAlignmentToPlacementDelete,

1456

: NumPlacementArgs(NumPlacementArgs),

1457

PassAlignmentToPlacementDelete(PassAlignmentToPlacementDelete),

1458

OperatorDelete(OperatorDelete), Ptr(Ptr), AllocSize(AllocSize),

1459

AllocAlign(AllocAlign) {}

1461 void

setPlacementArg(

unsigned

I, RValueTy Arg,

QualType Type

) {

1462

assert(I < NumPlacementArgs &&

"index out of range"

);

1463

getPlacementArgs()[I] = {Arg,

Type

};

1472

DeleteArgs.

add

(Traits::get(CGF, Ptr), FPT->getParamType(0));

1475

UsualDeleteParams Params;

1476 if

(NumPlacementArgs) {

1479

Params.Alignment = PassAlignmentToPlacementDelete;

1486

assert(!Params.DestroyingDelete &&

1487 "should not call destroying delete in a new-expression"

);

1491

DeleteArgs.add(Traits::get(CGF, AllocSize),

1498 if

(Params.Alignment)

1499

DeleteArgs.add(

RValue::get

(llvm::ConstantInt::get(

1504 for

(

unsigned

I = 0; I != NumPlacementArgs; ++I) {

1505 auto

Arg = getPlacementArgs()[I];

1506

DeleteArgs.add(Traits::get(CGF, Arg.ArgValue), Arg.ArgType);

1520

llvm::Value *AllocSize,

1523 unsigned

NumNonPlacementArgs =

E

->passAlignment() ? 2 : 1;

1528 struct

DirectCleanupTraits {

1529 typedef

llvm::Value *ValueTy;

1535 typedef

CallDeleteDuringNew<DirectCleanupTraits> DirectCleanup;

1538 EHCleanup

,

E

->getNumPlacementArgs(),

E

->getOperatorDelete(),

1539

NewPtr.

emitRawPointer

(CGF), AllocSize,

E

->passAlignment(), AllocAlign);

1540 for

(

unsigned

I = 0, N =

E

->getNumPlacementArgs(); I != N; ++I) {

1541 auto

&Arg = NewArgs[I + NumNonPlacementArgs];

1542

Cleanup->setPlacementArg(I, Arg.getRValue(CGF), Arg.Ty);

1554 struct

ConditionalCleanupTraits {

1558 return V

.restore(CGF);

1561 typedef

CallDeleteDuringNew<ConditionalCleanupTraits> ConditionalCleanup;

1563

ConditionalCleanup *Cleanup = CGF.

EHStack 1565 E

->getNumPlacementArgs(),

1566 E

->getOperatorDelete(),

1569 E

->passAlignment(),

1571 for

(

unsigned

I = 0, N =

E

->getNumPlacementArgs(); I != N; ++I) {

1572 auto

&Arg = NewArgs[I + NumNonPlacementArgs];

1573

Cleanup->setPlacementArg(

1589 unsigned

minElements = 0;

1590 if

(

E

->isArray() &&

E

->hasInitializer()) {

1591 const Expr

*

Init

=

E

->getInitializer();

1594 const Expr

*IgnoreParen =

Init

->IgnoreParenImpCasts();

1596

isa<StringLiteral>(IgnoreParen) || isa<ObjCEncodeExpr>(IgnoreParen)) {

1598

cast<ConstantArrayType>(

Init

->getType()->getAsArrayTypeUnsafe())

1600

}

else if

(ILE || CPLIE) {

1605

llvm::Value *numElements =

nullptr

;

1606

llvm::Value *allocSizeWithoutCookie =

nullptr

;

1607

llvm::Value *allocSize =

1609

allocSizeWithoutCookie);

1617

assert(

E

->getNumPlacementArgs() == 1);

1618 const Expr

*

arg

= *

E

->placement_arguments().begin();

1631 if

(

E

->getOperatorDelete() &&

1632

!

E

->getOperatorDelete()->isReservedGlobalPlacementOperator()) {

1640 unsigned

ParamsToSkip = 0;

1647 if

(allocSize != allocSizeWithoutCookie) {

1649

allocAlign = std::max(allocAlign, cookieAlign);

1653 if

(

E

->passAlignment()) {

1657

assert(

getContext

().hasSameUnqualifiedType(

1660 "wrong type for alignment parameter"

);

1664

assert(allocator->

isVariadic

() &&

"can't pass alignment to allocator"

);

1666

allocatorArgs.

add

(

1672 EmitCallArgs

(allocatorArgs, allocatorType,

E

->placement_arguments(),

1673

AbstractCallee(),

ParamsToSkip);

1680 if

(

auto

*newCall = dyn_cast<llvm::CallBase>(RV.

getScalarVal

()))

1689 if

(!

E

->passAlignment() &&

1691 unsigned

AllocatorAlign = llvm::bit_floor(std::min<uint64_t>(

1693

allocationAlign = std::max(

1694

allocationAlign,

getContext

().toCharUnitsFromBits(AllocatorAlign));

1704 bool

nullCheck =

E

->shouldNullCheckAllocation() &&

1708

llvm::BasicBlock *nullCheckBB =

nullptr

;

1709

llvm::BasicBlock *contBB =

nullptr

;

1713

ConditionalEvaluation conditional(*

this

);

1716

conditional.begin(*

this

);

1718

nullCheckBB =

Builder

.GetInsertBlock();

1723 Builder

.CreateCondBr(isNull, contBB, notNullBB);

1730

llvm::Instruction *cleanupDominator =

nullptr

;

1731 if

(

E

->getOperatorDelete() &&

1732

!

E

->getOperatorDelete()->isReservedGlobalPlacementOperator()) {

1736

cleanupDominator =

Builder

.CreateUnreachable();

1739

assert((allocSize == allocSizeWithoutCookie) ==

1741 if

(allocSize != allocSizeWithoutCookie) {

1742

assert(

E

->isArray());

1765

SkippedChecks.

set

(SanitizerKind::Null, nullCheck);

1767 E

->getAllocatedTypeSourceInfo()->getTypeLoc().

getBeginLoc

(),

1768

result, allocType, result.

getAlignment

(), SkippedChecks,

1772

allocSizeWithoutCookie);

1777 if

(operatorDeleteCleanup.

isValid

()) {

1779

cleanupDominator->eraseFromParent();

1783

conditional.end(*

this

);

1785

llvm::BasicBlock *notNullBB =

Builder

.GetInsertBlock();

1788

llvm::PHINode *PHI =

Builder

.CreatePHI(resultPtr->getType(), 2);

1789

PHI->addIncoming(resultPtr, notNullBB);

1790

PHI->addIncoming(llvm::Constant::getNullValue(resultPtr->getType()),

1800

llvm::Value *DeletePtr,

QualType

DeleteTy,

1801

llvm::Value *NumElements,

1803

assert((!NumElements && CookieSize.

isZero

()) ||

1810 auto

ParamTypeIt = DeleteFTy->param_type_begin();

1817

llvm::AllocaInst *DestroyingDeleteTag =

nullptr

;

1818 if

(Params.DestroyingDelete) {

1823

DestroyingDeleteTag->setAlignment(Align.

getAsAlign

());

1830 QualType

SizeType = *ParamTypeIt++;

1840 if

(!CookieSize.

isZero

())

1848 if

(Params.Alignment) {

1849 QualType

AlignValType = *ParamTypeIt++;

1853

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

ConvertType

(AlignValType),

1855

DeleteArgs.add(

RValue::get

(Align), AlignValType);

1858

assert(ParamTypeIt == DeleteFTy->param_type_end() &&

1859 "unknown parameter to usual delete function"

);

1866 if

(DestroyingDeleteTag && DestroyingDeleteTag->use_empty())

1867

DestroyingDeleteTag->eraseFromParent();

1877

CallObjectDelete(llvm::Value *Ptr,

1880

: Ptr(Ptr), OperatorDelete(OperatorDelete), ElementType(ElementType) {}

1890

llvm::Value *CompletePtr,

1893

OperatorDelete, ElementType);

1904 if

(Dtor && Dtor->isVirtual())

1919

llvm::BasicBlock *UnconditionalDeleteBlock) {

1929

assert(!OperatorDelete->isDestroyingOperatorDelete());

1940 bool

UseVirtualCall =

true

;

1942 if

(

auto

*DevirtualizedDtor =

1943

dyn_cast_or_null<const CXXDestructorDecl>(

1946

UseVirtualCall =

false

;

1952

Dtor = DevirtualizedDtor;

1959

UseVirtualCall =

true

;

1962 if

(UseVirtualCall) {

1974

CGF.

EHStack

.pushCleanup<CallObjectDelete>(

2001

CGF.

EmitBlock

(UnconditionalDeleteBlock);

2015

llvm::Value *NumElements;

2019

CallArrayDelete(llvm::Value *Ptr,

2021

llvm::Value *NumElements,

2024

: Ptr(Ptr), OperatorDelete(OperatorDelete), NumElements(NumElements),

2025

ElementType(ElementType), CookieSize(CookieSize) {}

2028

CGF.

EmitDeleteCall

(OperatorDelete, Ptr, ElementType, NumElements,

2039

llvm::Value *numElements =

nullptr

;

2040

llvm::Value *allocatedPtr =

nullptr

;

2043

numElements, allocatedPtr, cookieSize);

2045

assert(allocatedPtr &&

"ReadArrayCookie didn't set allocated pointer"

);

2048 const FunctionDecl

*operatorDelete =

E

->getOperatorDelete();

2050

allocatedPtr, operatorDelete,

2051

numElements, elementType,

2056

assert(numElements &&

"no element count for a type with a destructor!"

);

2064

deletedPtr.

getElementType

(), arrayBegin, numElements,

"delete.end"

);

2080 const Expr

*Arg =

E

->getArgument();

2099 QualType

DeleteTy =

E

->getDestroyedType();

2103 if

(

E

->getOperatorDelete()->isDestroyingOperatorDelete()) {

2116

GEP.push_back(Zero);

2120

=

getContext

().getAsConstantArrayType(DeleteTy)) {

2122

DeleteTy = Arr->getElementType();

2125

GEP.push_back(Zero);

2134 if

(

E

->isArrayForm()) {

2144

llvm::Type *StdTypeInfoPtrTy,

2145 bool

HasNullCheck) {

2156

ThisPtr, SrcRecordTy);

2163

llvm::BasicBlock *BadTypeidBlock =

2168

CGF.

Builder

.CreateCondBr(

IsNull

, BadTypeidBlock, EndBlock);

2188 auto

MaybeASCast = [=](

auto

&&

TypeInfo

) {

2195 if

(

E

->isTypeOperand()) {

2207 if

(

E

->isPotentiallyEvaluated() && !

E

->isMostDerived(

getContext

()))

2209 E

->hasNullCheck());

2219 return

llvm::Constant::getNullValue(DestLTy);

2226

CGF.

Builder

.ClearInsertionPoint();

2227 return

llvm::PoisonValue::get(DestLTy);

2243 if

(IsDynamicCastToVoid) {

2250

SrcRecordTy = SrcTy;

2264 if

(!

Builder

.GetInsertBlock())

2270

assert(SrcRecordTy->

isRecordType

() &&

"source type must be a record type!"

);

2274 bool

IsExact = !IsDynamicCastToVoid &&

2282 bool

ShouldNullCheckSrcValue =

2286

llvm::BasicBlock *CastNull =

nullptr

;

2287

llvm::BasicBlock *CastNotNull =

nullptr

;

2290 if

(ShouldNullCheckSrcValue) {

2299

llvm::Value *

Value

;

2300 if

(IsDynamicCastToVoid) {

2302

}

else if

(IsExact) {

2306

*

this

, ThisAddr, SrcRecordTy, DestTy, DestRecordTy, CastEnd, CastNull);

2309 "destination type must be a record type!"

);

2311

DestTy, DestRecordTy, CastEnd);

2313

CastNotNull =

Builder

.GetInsertBlock();

2315

llvm::Value *NullValue =

nullptr

;

2316 if

(ShouldNullCheckSrcValue) {

2321

CastNull =

Builder

.GetInsertBlock();

2330

PHI->addIncoming(

Value

, CastNotNull);

2331

PHI->addIncoming(NullValue, CastNull);

static MemberCallInfo commonEmitCXXMemberOrOperatorCall(CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This, llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *CE, CallArgList &Args, CallArgList *RtlArgs)

static llvm::Value * EmitTypeidFromVTable(CodeGenFunction &CGF, const Expr *E, llvm::Type *StdTypeInfoPtrTy, bool HasNullCheck)

static llvm::Value * EmitDynamicCastToNull(CodeGenFunction &CGF, QualType DestTy)

static RValue EmitNewDeleteCall(CodeGenFunction &CGF, const FunctionDecl *CalleeDecl, const FunctionProtoType *CalleeType, const CallArgList &Args)

Emit a call to an operator new or operator delete function, as implicitly created by new-expressions ...

static void EmitDestroyingObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, Address Ptr, QualType ElementType)

Emit the code for deleting a single object with a destroying operator delete.

static void EmitNullBaseClassInitialization(CodeGenFunction &CGF, Address DestPtr, const CXXRecordDecl *Base)

static void EnterNewDeleteCleanup(CodeGenFunction &CGF, const CXXNewExpr *E, Address NewPtr, llvm::Value *AllocSize, CharUnits AllocAlign, const CallArgList &NewArgs)

Enter a cleanup to call 'operator delete' if the initializer in a new-expression throws.

static bool EmitObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, Address Ptr, QualType ElementType, llvm::BasicBlock *UnconditionalDeleteBlock)

Emit the code for deleting a single object.

static UsualDeleteParams getUsualDeleteParams(const FunctionDecl *FD)

static CXXRecordDecl * getCXXRecord(const Expr *E)

static CharUnits CalculateCookiePadding(CodeGenFunction &CGF, const CXXNewExpr *E)

static void EmitArrayDelete(CodeGenFunction &CGF, const CXXDeleteExpr *E, Address deletedPtr, QualType elementType)

Emit the code for deleting an array of objects.

static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const Expr *Init, QualType AllocType, Address NewPtr, AggValueSlot::Overlap_t MayOverlap)

static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E, QualType ElementType, llvm::Type *ElementTy, Address NewPtr, llvm::Value *NumElements, llvm::Value *AllocSizeWithoutCookie)

static llvm::Value * EmitCXXNewAllocSize(CodeGenFunction &CGF, const CXXNewExpr *e, unsigned minElements, llvm::Value *&numElements, llvm::Value *&sizeWithoutCookie)

llvm::MachO::Target Target

static QualType getPointeeType(const MemRegion *R)

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

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.

DeclarationNameTable DeclarationNames

const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const

Get or compute information about the layout of the specified record (struct/union/class) D,...

bool hasSameType(QualType T1, QualType T2) const

Determine whether the given types T1 and T2 are equivalent.

QualType getPointerType(QualType T) const

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

QualType getBaseElementType(const ArrayType *VAT) const

Return the innermost element type of an array type.

CanQualType getSizeType() const

Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.

CharUnits getTypeSizeInChars(QualType T) const

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

CharUnits toCharUnitsFromBits(int64_t BitSize) const

Convert a size in bits to a size in characters.

uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const

Return number of constant array elements.

ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...

CharUnits getNonVirtualAlignment() const

getNonVirtualAlignment - Get the non-virtual alignment (in chars) of an object, which is the alignmen...

CharUnits getNonVirtualSize() const

getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...

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

A builtin binary operation expression such as "x + y" or "x <= y".

Represents a call to a CUDA kernel function.

Represents a call to a C++ constructor.

Represents a C++ constructor within a class.

bool isDefaultConstructor() const

Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...

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

FunctionDecl * getOperatorDelete() const

Represents a C++ destructor within a class.

A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).

bool isAlwaysNull() const

isAlwaysNull - Return whether the result of the dynamic_cast is proven to always be null.

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.

QualType getThisType() const

Return the type of the this pointer.

bool isMoveAssignmentOperator() const

Determine whether this is a move assignment operator.

Qualifiers getMethodQualifiers() const

CXXMethodDecl * getDevirtualizedMethod(const Expr *Base, bool IsAppleKext)

If it's possible to devirtualize a call to this method, return the called function.

CXXMethodDecl * getCorrespondingMethodInClass(const CXXRecordDecl *RD, bool MayBeBase=false)

Find the method in RD that corresponds to this one.

bool isCopyAssignmentOperator() const

Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...

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

QualType getAllocatedType() const

std::optional< Expr * > getArraySize()

This might return std::nullopt even if isArray() returns true, since there might not be an array size...

A call to an overloaded operator written using operator syntax.

Represents a list-initialization with parenthesis.

ArrayRef< Expr * > getInitExprs()

Represents a C++ pseudo-destructor (C++ [expr.pseudo]).

Represents a C++ struct/union/class.

bool isEffectivelyFinal() const

Determine whether it's impossible for a class to be derived from this class.

bool hasTrivialDestructor() const

Determine whether this class has a trivial destructor (C++ [class.dtor]p3)

bool isDynamicClass() const

bool hasDefinition() const

bool isEmpty() const

Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).

CXXDestructorDecl * getDestructor() const

Returns the destructor decl for this class.

A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...

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

Expr * getArg(unsigned Arg)

getArg - Return the specified argument.

SourceLocation getBeginLoc() const LLVM_READONLY

FunctionDecl * getDirectCallee()

If the callee is a FunctionDecl, return it. Otherwise return null.

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

CharUnits alignmentAtOffset(CharUnits offset) const

Given that this is a non-zero alignment value, what is the alignment at the given offset?

bool isNegative() const

isNegative - Test whether the quantity is less than zero.

bool isZero() const

isZero - Test whether the quantity equals zero.

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.

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

Zero - Construct a CharUnits quantity of zero.

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 withElementType(llvm::Type *ElemTy) const

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

Address setKnownNonNull()

void setAlignment(CharUnits Value)

llvm::PointerType * getType() const

Return the type of the pointer value.

bool isSanitizerChecked() const

Address getAddress() const

IsZeroed_t isZeroed() const

static AggValueSlot forAddr(Address addr, Qualifiers quals, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)

forAddr - Make a slot for an aggregate value.

A scoped helper to set the current debug location to the specified location or preferred location of ...

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

Address CreateConstInBoundsByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")

Given a pointer to i8, adjust it by a given constant offset.

llvm::Value * CreateIsNull(Address Addr, const Twine &Name="")

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.

Address CreateLaunderInvariantGroup(Address Addr)

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

llvm::ConstantInt * getSize(CharUnits N)

Address CreateConstInBoundsGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")

Given addr = T* ... produce name = getelementptr inbounds addr, i64 index where i64 is actually the t...

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

virtual RValue EmitCUDAKernelCallExpr(CodeGenFunction &CGF, const CUDAKernelCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)

virtual bool shouldEmitExactDynamicCast(QualType DestRecordTy)=0

virtual std::vector< CharUnits > getVBPtrOffsets(const CXXRecordDecl *RD)

Gets the offsets of all the virtual base pointers in a given class.

virtual void ReadArrayCookie(CodeGenFunction &CGF, Address Ptr, const CXXDeleteExpr *expr, QualType ElementType, llvm::Value *&NumElements, llvm::Value *&AllocPtr, CharUnits &CookieSize)

Reads the array cookie associated with the given pointer, if it has one.

virtual bool shouldTypeidBeNullChecked(QualType SrcRecordTy)=0

virtual std::pair< llvm::Value *, const CXXRecordDecl * > LoadVTablePtr(CodeGenFunction &CGF, Address This, const CXXRecordDecl *RD)=0

Load a vtable from This, an object of polymorphic type RD, or from one of its virtual bases if it doe...

virtual Address adjustThisArgumentForVirtualFunctionCall(CodeGenFunction &CGF, GlobalDecl GD, Address This, bool VirtualCall)

Perform ABI-specific "this" argument adjustment required prior to a call of a virtual function.

virtual void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, Address Ptr, QualType ElementType, const CXXDestructorDecl *Dtor)=0

virtual llvm::Value * emitExactDynamicCast(CodeGenFunction &CGF, Address Value, QualType SrcRecordTy, QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastSuccess, llvm::BasicBlock *CastFail)=0

Emit a dynamic_cast from SrcRecordTy to DestRecordTy.

virtual const CXXRecordDecl * getThisArgumentTypeForMethod(GlobalDecl GD)

Get the type of the implicit "this" parameter used by a method.

virtual bool EmitBadCastCall(CodeGenFunction &CGF)=0

virtual llvm::Value * EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy, Address ThisPtr, llvm::Type *StdTypeInfoPtrTy)=0

virtual CGCallee EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, const Expr *E, Address This, llvm::Value *&ThisPtrForCall, llvm::Value *MemPtr, const MemberPointerType *MPT)

Load a member function from an object and a member function pointer.

virtual llvm::Value * EmitVirtualDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType, Address This, DeleteOrMemberCallExpr E, llvm::CallBase **CallOrInvoke)=0

Emit the ABI-specific virtual destructor call.

virtual CharUnits GetArrayCookieSize(const CXXNewExpr *expr)

Returns the extra size required in order to store the array cookie for the given new-expression.

virtual void EmitBadTypeidCall(CodeGenFunction &CGF)=0

virtual llvm::Value * emitDynamicCastToVoid(CodeGenFunction &CGF, Address Value, QualType SrcRecordTy)=0

virtual llvm::Value * emitDynamicCastCall(CodeGenFunction &CGF, Address Value, QualType SrcRecordTy, QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd)=0

virtual Address InitializeArrayCookie(CodeGenFunction &CGF, Address NewPtr, llvm::Value *NumElements, const CXXNewExpr *expr, QualType ElementType)

Initialize the array cookie for the given allocation.

virtual bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr, QualType SrcRecordTy)=0

All available information about a concrete callee.

static CGCallee forVirtual(const CallExpr *CE, GlobalDecl MD, Address Addr, llvm::FunctionType *FTy)

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

void addHeapAllocSiteMetadata(llvm::CallBase *CallSite, QualType AllocatedTy, SourceLocation Loc)

Add heapallocsite metadata for MSAllocator calls.

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

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

void add(RValue rvalue, QualType type)

void addFrom(const CallArgList &other)

Add all the arguments from another CallArgList to this one.

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

void EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D, Address This, Address Src, const CXXConstructExpr *E)

void pushCallObjectDeleteCleanup(const FunctionDecl *OperatorDelete, llvm::Value *CompletePtr, QualType ElementType)

void EmitARCDestroyWeak(Address addr)

void EmitNullInitialization(Address DestPtr, QualType Ty)

EmitNullInitialization - Generate code to set a value of the given type to null, If the type contains...

GlobalDecl CurGD

CurGD - The GlobalDecl for the current function being compiled.

void DeactivateCleanupBlock(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *DominatingIP)

DeactivateCleanupBlock - Deactivates the given cleanup block.

static TypeEvaluationKind getEvaluationKind(QualType T)

getEvaluationKind - Return the TypeEvaluationKind of QualType T.

bool sanitizePerformTypeCheck() const

Whether any type-checking sanitizers are enabled.

SanitizerSet SanOpts

Sanitizers enabled for this function.

void EmitVTablePtrCheckForCall(const CXXRecordDecl *RD, llvm::Value *VTable, CFITypeCheckKind TCK, SourceLocation Loc)

EmitVTablePtrCheckForCall - Virtual method MD is being called via VTable.

RValue EmitCUDAKernelCallExpr(const CUDAKernelCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)

void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range< CallExpr::const_arg_iterator > ArgRange, AbstractCallee AC=AbstractCallee(), unsigned ParamsToSkip=0, EvaluationOrder Order=EvaluationOrder::Default)

RValue EmitCXXMemberOrOperatorCall(const CXXMethodDecl *Method, const CGCallee &Callee, ReturnValueSlot ReturnValue, llvm::Value *This, llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *E, CallArgList *RtlArgs, llvm::CallBase **CallOrInvoke)

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

void EmitSynthesizedCXXCopyCtor(Address Dest, Address Src, const Expr *Exp)

void EmitCXXAggrConstructorCall(const CXXConstructorDecl *D, const ArrayType *ArrayTy, Address ArrayPtr, const CXXConstructExpr *E, bool NewPointerIsChecked, bool ZeroInitialization=false)

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

RValue EmitCXXMemberOrOperatorMemberCallExpr(const CallExpr *CE, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, bool HasQualifier, NestedNameSpecifier *Qualifier, bool IsArrow, const Expr *Base, llvm::CallBase **CallOrInvoke)

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

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

llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack

void EmitDeleteCall(const FunctionDecl *DeleteFD, llvm::Value *Ptr, QualType DeleteTy, llvm::Value *NumElements=nullptr, CharUnits CookieSize=CharUnits())

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

createBasicBlock - Create an LLVM basic block.

RValue EmitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E)

const LangOptions & getLangOpts() const

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.

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

@ TCK_ConstructorCall

Checking the 'this' pointer for a constructor call.

@ TCK_MemberCall

Checking the 'this' pointer for a call to a non-static member function.

@ TCK_DynamicOperation

Checking the operand of a dynamic_cast or a typeid expression.

void EmitIgnoredExpr(const Expr *E)

EmitIgnoredExpr - Emit an expression in a context which ignores the result.

llvm::Type * ConvertTypeForMem(QualType T)

void EmitAggregateAssign(LValue Dest, LValue Src, QualType EltTy)

Emit an aggregate assignment.

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

@ ForceRightToLeft

! Language semantics require right-to-left evaluation.

Destroyer * getDestroyer(QualType::DestructionKind destructionKind)

void EmitNewArrayInitializer(const CXXNewExpr *E, QualType elementType, llvm::Type *ElementTy, Address NewPtr, llvm::Value *NumElements, llvm::Value *AllocSizeWithoutCookie)

void initFullExprCleanup()

Set up the last cleanup that was pushed as a conditional full-expression cleanup.

bool isInConditionalBranch() const

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

llvm::Value * getTypeSize(QualType Ty)

Returns calculated size of the specified type.

Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)

EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...

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

void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit)

EmitComplexExprIntoLValue - Emit the given expression of complex type and place its result into the s...

RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)

RValue EmitBuiltinNewDeleteCall(const FunctionProtoType *Type, const CallExpr *TheCallExpr, bool IsDelete)

void EmitCXXConstructorCall(const CXXConstructorDecl *D, CXXCtorType Type, bool ForVirtualBase, bool Delegating, AggValueSlot ThisAVS, const CXXConstructExpr *E)

CGDebugInfo * getDebugInfo()

void EmitBranch(llvm::BasicBlock *Block)

EmitBranch - Emit a branch to the specified basic block from the current insert block,...

void EmitCXXDeleteExpr(const CXXDeleteExpr *E)

const TargetCodeGenInfo & getTargetHooks() const

void EmitAggExpr(const Expr *E, AggValueSlot AS)

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

RValue EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)

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

ASTContext & getContext() const

CGCallee BuildAppleKextVirtualCall(const CXXMethodDecl *MD, NestedNameSpecifier *Qual, llvm::Type *Ty)

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

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

bool needsEHCleanup(QualType::DestructionKind kind)

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

void EmitCXXConstructExpr(const CXXConstructExpr *E, AggValueSlot Dest)

RValue EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)

llvm::Type * ConvertType(QualType T)

llvm::Value * EmitCXXTypeidExpr(const CXXTypeidExpr *E)

CodeGenTypes & getTypes() const

void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)

llvm::Value * EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE)

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

const CallExpr * MustTailCall

Address ReturnValue

ReturnValue - The temporary alloca to hold the return value.

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

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

llvm::Value * EmitCXXNewExpr(const CXXNewExpr *E)

void EmitARCDestroyStrong(Address addr, ARCPreciseLifetime_t precise)

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

static bool IsWrappedCXXThis(const Expr *E)

Check if E is a C++ "this" pointer wrapped in value-preserving casts.

void EmitExplicitCastExprType(const ExplicitCastExpr *E, CodeGenFunction *CGF=nullptr)

Emit type info if type of an expression is a variably modified type.

llvm::Module & getModule() const

llvm::Constant * EmitNullConstantForBase(const CXXRecordDecl *Record)

Return a null constant appropriate for zero-initializing a base class with the given type.

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.

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.

const LangOptions & getLangOpts() const

CGCUDARuntime & getCUDARuntime()

Return a reference to the configured CUDA runtime.

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

CodeGenTypes & getTypes()

CGCXXABI & getCXXABI() const

const CodeGenOptions & getCodeGenOpts() const

llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})

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.

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.

CanQualType DeriveThisType(const CXXRecordDecl *RD, const CXXMethodDecl *MD)

Derives the 'this' type for codegen purposes, i.e.

llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)

GetFunctionType - Get the LLVM function type for.

const CGFunctionInfo & arrangeCXXMethodCall(const CallArgList &args, const FunctionProtoType *type, RequiredArgs required, unsigned numPrefixArgs)

Arrange a call to a C++ method, passing the given arguments.

const CGFunctionInfo & arrangeFreeFunctionCall(const CallArgList &Args, const FunctionType *Ty, bool ChainCall)

Figure out the rules for calling a function with the given formal type using the given arguments.

bool isZeroInitializable(QualType T)

IsZeroInitializable - Return whether a type can be zero-initialized (in the C++ sense) with an LLVM z...

const CGFunctionInfo & arrangeCXXStructorDeclaration(GlobalDecl GD)

llvm::Constant * tryEmitAbstract(const Expr *E, QualType T)

Try to emit the result of the given expression as an abstract constant.

Information for lazily generating a cleanup.

A saved depth on the scope stack.

stable_iterator stable_begin() const

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

T * pushCleanupWithExtra(CleanupKind Kind, size_t N, As... A)

Push a cleanup with non-constant storage requirements on the stack.

iterator find(stable_iterator save) const

Turn a stable reference to a scope depth into a unstable pointer to the EH stack.

AlignmentSource getAlignmentSource() const

LValue - This represents an lvalue references.

Address getAddress() const

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

static RValue get(llvm::Value *V)

static RValue getAggregate(Address addr, bool isVolatile=false)

Convert an Address to an RValue.

llvm::Value * getScalarVal() const

getScalarVal() - Return the Value* of this scalar value.

A class for recording the number of arguments that a function signature requires.

static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, unsigned additional)

Compute the arguments required by the given formal prototype, given that there may be some additional...

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

Represents the canonical version of C arrays with a specified constant size.

DeclContext * getParent()

getParent - Returns the containing DeclContext.

lookup_result lookup(DeclarationName Name) const

lookup - Find the declarations (if any) with the given Name in this context.

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

The name of a declaration.

QualType getIntegerType() const

Return the integer type this enum decl corresponds to.

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

EnumDecl * getDecl() const

QualType getTypeAsWritten() const

getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...

Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...

This represents one expression.

Expr * IgnoreParens() LLVM_READONLY

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

bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const

Determine whether the result of this expression is a temporary object of the given class type.

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.

bool isDestroyingOperatorDelete() const

Determine whether this is a destroying operator delete.

QualType getReturnType() const

bool isTrivial() const

Whether this function is "trivial" in some specialized C++ senses.

bool isVariadic() const

Whether this function is variadic.

bool isReservedGlobalPlacementOperator() const

Determines whether this operator new or delete is one of the reserved global placement operators: voi...

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

Whether this function is defaulted.

OverloadedOperatorKind getOverloadedOperator() const

getOverloadedOperator - Which C++ overloaded operator this function represents, if any.

Represents a prototype with parameter type info, e.g.

param_type_iterator param_type_begin() const

unsigned getNumParams() const

QualType getParamType(unsigned i) const

param_type_iterator param_type_end() const

GlobalDecl - represents a global declaration.

CXXCtorType getCtorType() const

const Decl * getDecl() const

Represents an implicitly-generated value initialization of an object of a given type.

Describes an C or C++ initializer list.

bool isStringLiteralInit() const

Is this an initializer for an array of characters, initialized by a string literal or an @encode?

unsigned getNumInits() const

Expr * getArrayFiller()

If this initializer list initializes an array with more elements than there are initializers in the l...

const Expr * getInit(unsigned Init) const

ArrayRef< Expr * > inits()

MemberExpr - [C99 6.5.2.3] Structure and Union Members.

ValueDecl * getMemberDecl() const

Retrieve the member declaration to which this expression refers.

bool hasQualifier() const

Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...

NestedNameSpecifier * getQualifier() const

If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.

A pointer to member type per C++ 8.3.3 - Pointers to members.

Represents a C++ nested name specifier, such as "\::std::vector<int>::".

ObjCEncodeExpr, used for @encode in Objective-C.

PointerType - C99 6.7.5.1 - Pointer Declarators.

A (possibly-)qualified type.

bool isVolatileQualified() const

Determine whether this type is volatile-qualified.

bool isNull() const

Return true if this QualType doesn't point to a type yet.

LangAS getAddressSpace() const

Return the address space of this type.

Qualifiers getQualifiers() const

Retrieve the set of qualifiers applied to this type.

Qualifiers::ObjCLifetime getObjCLifetime() const

Returns lifetime attribute of this type.

QualType getCanonicalType() const

DestructionKind isDestructedType() const

Returns a nonzero value if objects of this type require non-trivial work to clean up after.

bool isPODType(const ASTContext &Context) const

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

bool hasStrongOrWeakObjCLifetime() const

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.

LangAS getAddressSpace() const

bool mayInsertExtraPadding(bool EmitRemark=false) const

Whether we are allowed to insert extra padding between fields.

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

RecordDecl * getDecl() const

Base for LValueReferenceType and RValueReferenceType.

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

Encodes a location in the source.

SourceLocation getBeginLoc() const LLVM_READONLY

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

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

bool isVoidPointerType() const

bool isPointerType() const

bool isIntegerType() const

isIntegerType() does not include complex integers (a GCC extension).

const T * castAs() const

Member-template castAs<specific type>.

QualType getPointeeType() const

If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.

const ArrayType * getAsArrayTypeUnsafe() const

A variant of getAs<> for array types which silently discards qualifiers from the outermost type.

const T * getAs() const

Member-template getAs<specific type>'.

bool isRecordType() const

@ Decl

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

@ EHCleanup

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

const internal::VariadicAllOfMatcher< Type > type

Matches Types in the clang AST.

const AstTypeMatcher< ArrayType > arrayType

Matches all kinds of arrays.

bool This(InterpState &S, CodePtr OpPC)

bool Zero(InterpState &S, CodePtr OpPC)

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.

@ Dtor_Complete

Complete object dtor.

LangAS

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

const FunctionProtoType * T

bool declaresSameEntity(const Decl *D1, const Decl *D2)

Determine whether two declarations declare the same entity.

__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)

llvm::IntegerType * Int8Ty

i8, i16, i32, and i64

CharUnits getPointerSize() const

llvm::IntegerType * SizeTy

CharUnits getSizeAlign() const

llvm::PointerType * Int8PtrTy

CharUnits getPointerAlign() const

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

static saved_type save(CodeGenFunction &CGF, type value)

void set(SanitizerMask K, bool Value)

Enable or disable a certain (single) sanitizer.

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