25#include "llvm/IR/Instruction.h"
26#include "llvm/Support/SaveAndRestore.h"
29using namespace CodeGen;
54 llvm::Value *BaseValue,
56 unsigned CVRQualifiers,
57 llvm::Value *Offset) {
64 llvm::Value *
V = BaseValue;
86 uint64_t FieldBitOffset =
92 llvm::alignTo(BitOffset + BitFieldSize, AlignmentBits));
116 struct CatchHandler {
119 llvm::BasicBlock *
Block;
126 CallObjCEndCatch(
bool MightThrow, llvm::FunctionCallee Fn)
127 : MightThrow(MightThrow), Fn(Fn) {}
129 llvm::FunctionCallee Fn;
142 llvm::FunctionCallee beginCatchFn,
143 llvm::FunctionCallee endCatchFn,
144 llvm::FunctionCallee exceptionRethrowFn) {
147 if (S.getNumCatchStmts())
155 FinallyInfo.
enter(CGF, Finally->getFinallyBody(),
156 beginCatchFn, endCatchFn, exceptionRethrowFn);
162 if (S.getNumCatchStmts()) {
164 const VarDecl *CatchDecl = CatchStmt->getCatchParamDecl();
166 Handlers.push_back(CatchHandler());
167 CatchHandler &Handler = Handlers.back();
168 Handler.Variable = CatchDecl;
169 Handler.Body = CatchStmt->getCatchBody();
176 Handler.TypeInfo = catchAll.RTTI;
177 Handler.Flags = catchAll.Flags;
186 for (
unsigned I = 0,
E = Handlers.size(); I !=
E; ++I)
187 Catch->
setHandler(I, { Handlers[I].TypeInfo, Handlers[I].Flags }, Handlers[I].Block);
196 const Stmt *FinallyBlock = Finally->getFinallyBody();
204 llvm::Function *FinallyFunc = HelperCGF.
CurFn;
216 if (S.getNumCatchStmts())
220 CGBuilderTy::InsertPoint SavedIP = CGF.
Builder.saveAndClearIP();
223 for (CatchHandler &Handler : Handlers) {
229 llvm::BasicBlock::iterator CPICandidate =
230 Handler.Block->getFirstNonPHIIt();
231 if (CPICandidate != Handler.Block->end()) {
232 if (
auto *CPI = dyn_cast_or_null<llvm::CatchPadInst>(CPICandidate)) {
243 llvm::Value *Exn = RawExn;
249 bool EndCatchMightThrow = (Handler.Variable ==
nullptr);
257 if (
const VarDecl *CatchParam = Handler.Variable) {
258 llvm::Type *CatchType = CGF.
ConvertType(CatchParam->getType());
259 llvm::Value *CastExn = CGF.
Builder.CreateBitCast(Exn, CatchType);
276 CGF.
Builder.restoreIP(SavedIP);
279 if (!useFunclets && S.getFinallyStmt())
280 FinallyInfo.
exit(CGF);
307 llvm_unreachable(
"invalid ownership qualifier");
312 llvm::FunctionCallee SyncExitFn;
313 llvm::Value *SyncArg;
314 CallSyncExit(llvm::FunctionCallee SyncExitFn, llvm::Value *SyncArg)
315 : SyncExitFn(SyncExitFn), SyncArg(SyncArg) {}
325 llvm::FunctionCallee syncEnterFn,
326 llvm::FunctionCallee syncExitFn) {
331 const Expr *lockExpr = S.getSynchExpr();
342 CGF.
Builder.CreateCall(syncEnterFn, lock)->setDoesNotThrow();
364 llvm::PointerType *signatureType =
389 llvm::Value *receiver) {
403 dyn_cast_or_null<ObjCMethodDecl>(CGF.
CurCodeDecl)) {
404 auto self = curMethod->getSelfDecl();
405 if (self->getType().isConstQualified()) {
406 if (
auto LI = dyn_cast<llvm::LoadInst>(receiver->stripPointerCasts())) {
408 if (selfAddr == LI->getPointerOperand()) {
421 if (ID->isWeakImported())
423 }
while ((ID = ID->getSuperClass()));
431 CallArgList::const_iterator I = callArgs.begin();
435 if (param->
hasAttr<NSConsumedAttr>()) {
436 RValue RV = I->getRValue(CGF);
438 "NullReturnState::complete - arg not on object");
443 if (RD && RD->isParamDestroyedInCallee()) {
444 RValue RV = I->getRValue(CGF);
454 llvm_unreachable(
"unexpected dtor kind");
469 bool includeCategoryName) {
471 llvm::raw_string_ostream
out(buffer);
474 includeCategoryName);
Defines the Objective-C statement AST node classes.
uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, const ObjCIvarDecl *Ivar) const
Get the offset of an ObjCIvarDecl in bits.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
uint64_t getCharWidth() const
Return the size of the character type, in bits.
CharUnits - This is an opaque type for sizes expressed in character units.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
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...
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
MangleContext & getMangleContext()
Gets the mangle context.
CGFunctionInfo - Class to encapsulate the information about a function definition.
virtual llvm::Constant * GetEHType(QualType T)=0
Get the type constant to catch for the given ObjC pointer type.
virtual CatchTypeInfo getCatchAllTypeInfo()
void EmitInitOfCatchParam(CodeGenFunction &CGF, llvm::Value *exn, const VarDecl *paramDecl)
bool canMessageReceiverBeNull(CodeGenFunction &CGF, const ObjCMethodDecl *method, bool isSuper, const ObjCInterfaceDecl *classReceiver, llvm::Value *receiver)
std::string getSymbolNameForMethod(const ObjCMethodDecl *method, bool includeCategoryName=true)
static void destroyCalleeDestroyedArguments(CodeGenFunction &CGF, const ObjCMethodDecl *method, const CallArgList &callArgs)
Destroy the callee-destroyed arguments of the given method, if it has any.
LValue EmitValueForIvarAtOffset(CodeGen::CodeGenFunction &CGF, const ObjCInterfaceDecl *OID, llvm::Value *BaseValue, const ObjCIvarDecl *Ivar, unsigned CVRQualifiers, llvm::Value *Offset)
uint64_t ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM, const ObjCInterfaceDecl *OID, const ObjCIvarDecl *Ivar)
Compute an offset to the given ivar, suitable for passing to EmitValueForIvarAtOffset.
static bool isWeakLinkedClass(const ObjCInterfaceDecl *cls)
virtual llvm::Constant * GetOrEmitProtocol(const ObjCProtocolDecl *PD)=0
GetOrEmitProtocol - Get the protocol object for the given declaration, emitting it if necessary.
void EmitTryCatchStmt(CodeGenFunction &CGF, const ObjCAtTryStmt &S, llvm::FunctionCallee beginCatchFn, llvm::FunctionCallee endCatchFn, llvm::FunctionCallee exceptionRethrowFn)
Emits a try / catch statement.
CodeGen::CodeGenModule & CGM
MessageSendInfo getMessageSendInfo(const ObjCMethodDecl *method, QualType resultType, CallArgList &callArgs)
Compute the pointer-to-function type to which a message send should be casted in order to correctly c...
void EmitAtSynchronizedStmt(CodeGenFunction &CGF, const ObjCAtSynchronizedStmt &S, llvm::FunctionCallee syncEnterFn, llvm::FunctionCallee syncExitFn)
Emits an @synchronize() statement, using the syncEnterFn and syncExitFn arguments as the functions ca...
unsigned ComputeBitfieldBitOffset(CodeGen::CodeGenModule &CGM, const ObjCInterfaceDecl *ID, const ObjCIvarDecl *Ivar)
CallArgList - Type for representing both the value and type of arguments in a call.
A class controlling the emission of a finally block.
void exit(CodeGenFunction &CGF)
void enter(CodeGenFunction &CGF, const Stmt *Finally, llvm::FunctionCallee beginCatchFn, llvm::FunctionCallee endCatchFn, llvm::FunctionCallee rethrowFn)
Enters a finally block for an implementation using zero-cost exceptions.
void ForceCleanup()
Force the emission of cleanups now, instead of waiting until this object is destroyed.
Enters a new scope for capturing cleanups, all of which will be executed once the scope is exited.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
llvm::Value * EmitObjCConsumeObject(QualType T, llvm::Value *Ptr)
Produce the code for a CK_ARCConsumeObject.
static Destroyer destroyNonTrivialCStruct
JumpDest getJumpDestInCurrentScope(llvm::BasicBlock *Target)
The given basic block lies in the current EH scope, but may be a target of a potentially scope-crossi...
void EmitARCInitWeak(Address addr, llvm::Value *value)
i8* @objc_initWeak(i8** addr, i8* value) Returns value.
llvm::Value * getExceptionFromSlot()
Returns the contents of the function's exception object and selector slots.
llvm::Type * ConvertType(QualType T)
llvm::CallBase * EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
Emits a call or invoke instruction to the given runtime function.
void EmitAutoVarDecl(const VarDecl &D)
EmitAutoVarDecl - Emit an auto variable declaration.
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
const LangOptions & getLangOpts() const
static Destroyer destroyCXXObject
void EmitBranchThroughCleanup(JumpDest Dest)
EmitBranchThroughCleanup - Emit a branch from the current insert block through the normal cleanup han...
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)
Release the given object.
Address getExceptionSlot()
Returns a pointer to the function's exception object and selector slot, which is assigned in every la...
llvm::Value * EmitARCRetainScalarExpr(const Expr *expr)
EmitARCRetainScalarExpr - Semantically equivalent to EmitARCRetainObject(e->getType(),...
void popCatchScope()
popCatchScope - Pops the catch scope at the top of the EHScope stack, emitting any required code (oth...
void startOutlinedSEHHelper(CodeGenFunction &ParentCGF, bool IsFilter, const Stmt *OutlinedStmt)
Arrange a function prototype that can be called by Windows exception handling personalities.
void pushSEHCleanup(CleanupKind kind, llvm::Function *FinallyFunc)
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
void EmitStmt(const Stmt *S, ArrayRef< const Attr * > Attrs={})
EmitStmt - Emit the code for the statement.
llvm::Value * EmitARCRetainNonBlock(llvm::Value *value)
Retain the given object, with normal retain semantics.
SmallVector< llvm::Value *, 8 > ObjCEHValueStack
ObjCEHValueStack - Stack of Objective-C exception values, used for rethrows.
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
llvm::Instruction * CurrentFuncletPad
llvm::LLVMContext & getLLVMContext()
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
LValue MakeNaturalAlignRawAddrLValue(llvm::Value *V, QualType T)
This class organizes the cross-function state that is used while generating LLVM code.
CodeGenTypes & getTypes()
const TargetInfo & getTarget() const
const llvm::DataLayout & getDataLayout() const
CGCXXABI & getCXXABI() const
ASTContext & getContext() const
llvm::LLVMContext & getLLVMContext()
CGObjCRuntime & getObjCRuntime()
Return a reference to the configured Objective-C runtime.
const CGFunctionInfo & arrangeUnprototypedObjCMessageSend(QualType returnType, const CallArgList &args)
const CGFunctionInfo & arrangeObjCMessageSendSignature(const ObjCMethodDecl *MD, QualType receiverType)
Arrange the argument and result information for the function type through which to perform a send to ...
const CGFunctionInfo & arrangeCall(const CGFunctionInfo &declFI, const CallArgList &args)
Given a function info for a declaration, return the function info for a call with the given arguments...
A scope which attempts to handle some, possibly all, types of exceptions.
void setHandler(unsigned I, llvm::Constant *Type, llvm::BasicBlock *Block)
Information for lazily generating a cleanup.
class EHCatchScope * pushCatch(unsigned NumHandlers)
Push a set of catch handlers on the stack.
LValue - This represents an lvalue references.
static LValue MakeBitfield(Address Addr, const CGBitFieldInfo &Info, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Create a new object to represent a bit-field access.
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
Address getAggregateAddress() const
getAggregateAddr() - Return the Value* of the address of the aggregate.
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
This represents one expression.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getBitWidthValue() const
Computes the bit width of this field, if this is a bit field.
void mangleObjCMethodName(const ObjCMethodDecl *MD, raw_ostream &OS, bool includePrefixByte=true, bool includeCategoryNamespace=true) const
Represents Objective-C's @catch statement.
Represents Objective-C's @finally statement.
Represents Objective-C's @synchronized statement.
Represents Objective-C's @try ... @catch ... @finally statement.
const ObjCInterfaceDecl * getClassInterface() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
const Type * getTypeForDecl() const
ObjCIvarDecl - Represents an ObjC instance variable.
QualType getUsageType(QualType objectType) const
Retrieve the type of this instance variable when viewed as a member of a specific object type.
ObjCMethodDecl - Represents an instance or class method declaration.
param_const_iterator param_end() const
param_const_iterator param_begin() const
bool isClassMethod() const
Represents an Objective-C protocol declaration.
Represents a parameter to a function.
A (possibly-)qualified type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
QualType withCVRQualifiers(unsigned CVR) const
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
@ 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
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
unsigned getCharAlign() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Represents a variable declaration or definition.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
@ NormalCleanup
Denotes a cleanup that should run when a scope is exited using normal control flow (falling off the e...
llvm::Constant * emitObjCProtocolObject(CodeGenModule &CGM, const ObjCProtocolDecl *p)
Get a pointer to a protocol object for the given declaration, emitting it if it hasn't already been e...
The JSON file list parser is used to communicate input to InstallAPI.
Structure with information about how a bitfield should be accessed.
unsigned StorageSize
The storage size in bits which should be used when accessing this bitfield.
static CGBitFieldInfo MakeInfo(class CodeGenTypes &Types, const FieldDecl *FD, uint64_t Offset, uint64_t Size, uint64_t StorageSize, CharUnits StorageOffset)
Given a bit-field decl, build an appropriate helper object for accessing that field (which is expecte...
A jump destination is an abstract label, branching to which may require a jump out through normal cle...
llvm::BasicBlock * getBlock() const
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
static const EHPersonality & get(CodeGenModule &CGM, const FunctionDecl *FD)
bool usesFuncletPads() const
Does this personality use landingpads or the family of pad instructions designed to form funclets?