14#ifndef LLVM_CLANG_LIB_CODEGEN_CGCALL_H
15#define LLVM_CLANG_LIB_CODEGEN_CGCALL_H
23#include "llvm/ADT/STLForwardCompat.h"
24#include "llvm/IR/Value.h"
49 : CalleeProtoTy(calleeProtoTy), CalleeDecl(calleeDecl) {}
51 : CalleeProtoTy(calleeProtoTy) {}
53 : CalleeProtoTy(nullptr), CalleeDecl(calleeDecl) {}
72 struct BuiltinInfoStorage {
76 struct PseudoDestructorInfoStorage {
79 struct VirtualInfoStorage {
83 llvm::FunctionType *FTy;
86 SpecialKind KindOrFunctionPointer;
94 explicit CGCallee(SpecialKind kind) : KindOrFunctionPointer(kind) {}
97 : KindOrFunctionPointer(SpecialKind::Builtin) {
103 CGCallee() : KindOrFunctionPointer(SpecialKind::Invalid) {}
108 : KindOrFunctionPointer(
109 SpecialKind(reinterpret_cast<
uintptr_t>(functionPtr))) {
111 assert(functionPtr &&
"configuring callee without function pointer");
112 assert(functionPtr->getType()->isPointerTy());
117 CGCallee result(SpecialKind::Builtin);
124 CGCallee result(SpecialKind::PseudoDestructor);
131 return CGCallee(abstractInfo, functionPtr);
136 return CGCallee(abstractInfo, functionPtr.getCallee());
140 llvm::FunctionType *FTy) {
141 CGCallee result(SpecialKind::Virtual);
150 return KindOrFunctionPointer == SpecialKind::Builtin;
162 return KindOrFunctionPointer == SpecialKind::PseudoDestructor;
180 return reinterpret_cast<llvm::Value *
>(
uintptr_t(KindOrFunctionPointer));
184 KindOrFunctionPointer =
185 SpecialKind(
reinterpret_cast<uintptr_t>(functionPtr));
189 return KindOrFunctionPointer == SpecialKind::Virtual;
239 assert(HasLV && !IsUsed);
243 assert(!HasLV && !IsUsed);
292 insert(end(), other.begin(), other.end());
293 Writebacks.insert(Writebacks.end(), other.Writebacks.begin(),
294 other.Writebacks.end());
295 CleanupsToDeactivate.insert(CleanupsToDeactivate.end(),
296 other.CleanupsToDeactivate.begin(),
297 other.CleanupsToDeactivate.end());
298 assert(!(StackBase && other.StackBase) &&
"can't merge stackbases");
300 StackBase = other.StackBase;
304 Writeback writeback = {srcLV, temporary, toUse};
305 Writebacks.push_back(writeback);
310 typedef llvm::iterator_range<SmallVectorImpl<Writeback>::const_iterator>
318 llvm::Instruction *IsActiveIP) {
322 CleanupsToDeactivate.push_back(ArgCleanup);
326 return CleanupsToDeactivate;
346 llvm::CallInst *StackBase =
nullptr;
360 LLVM_PREFERRED_TYPE(
bool)
361 unsigned IsVolatile : 1;
362 LLVM_PREFERRED_TYPE(
bool)
363 unsigned IsUnused : 1;
364 LLVM_PREFERRED_TYPE(
bool)
365 unsigned IsExternallyDestructed : 1;
371 bool IsExternallyDestructed =
false)
372 : Addr(Addr), IsVolatile(IsVolatile), IsUnused(IsUnused),
373 IsExternallyDestructed(IsExternallyDestructed) {}
404 bool WillInternalize);
414 return static_cast<FnInfoOpts>(llvm::to_underlying(A) |
415 llvm::to_underlying(B));
419 return static_cast<FnInfoOpts>(llvm::to_underlying(A) &
420 llvm::to_underlying(B));
Forward declaration of all AST node types.
C Language Family Type Representation.
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Abstract information about a function or function prototype.
const GlobalDecl getCalleeDecl() const
CGCalleeInfo(const FunctionProtoType *calleeProtoTy)
CGCalleeInfo(const FunctionProtoType *calleeProtoTy, GlobalDecl calleeDecl)
const FunctionProtoType * getCalleeFunctionProtoType() const
CGCalleeInfo(GlobalDecl calleeDecl)
All available information about a concrete callee.
CGCalleeInfo getAbstractInfo() const
CGCallee prepareConcreteCallee(CodeGenFunction &CGF) const
If this is a delayed callee computation of some sort, prepare a concrete callee.
VirtualInfoStorage VirtualInfo
const CXXPseudoDestructorExpr * getPseudoDestructorExpr() const
Address getThisAddress() const
const CallExpr * getVirtualCallExpr() const
BuiltinInfoStorage BuiltinInfo
bool isPseudoDestructor() const
llvm::Value * getFunctionPointer() const
PseudoDestructorInfoStorage PseudoDestructorInfo
static CGCallee forBuiltin(unsigned builtinID, const FunctionDecl *builtinDecl)
unsigned getBuiltinID() const
CGCallee(const CGCalleeInfo &abstractInfo, llvm::Value *functionPtr)
Construct a callee.
static CGCallee forVirtual(const CallExpr *CE, GlobalDecl MD, Address Addr, llvm::FunctionType *FTy)
void setFunctionPointer(llvm::Value *functionPtr)
static CGCallee forDirect(llvm::FunctionCallee functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
llvm::FunctionType * getVirtualFunctionType() const
const FunctionDecl * getBuiltinDecl() const
static CGCallee forPseudoDestructor(const CXXPseudoDestructorExpr *E)
GlobalDecl getVirtualMethodDecl() const
CGCalleeInfo AbstractInfo
CallArgList - Type for representing both the value and type of arguments in a call.
llvm::Instruction * getStackBase() const
void addUncopiedAggregate(LValue LV, QualType type)
llvm::iterator_range< SmallVectorImpl< Writeback >::const_iterator > writeback_const_range
void addArgCleanupDeactivation(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *IsActiveIP)
ArrayRef< CallArgCleanup > getCleanupsToDeactivate() const
bool hasWritebacks() const
void add(RValue rvalue, QualType type)
bool isUsingInAlloca() const
Returns if we're using an inalloca struct to pass arguments in memory.
void allocateArgumentMemory(CodeGenFunction &CGF)
void freeArgumentMemory(CodeGenFunction &CGF) const
writeback_const_range writebacks() const
void addWriteback(LValue srcLV, Address temporary, llvm::Value *toUse)
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...
A saved depth on the scope stack.
FunctionArgList - Type for representing both the decl and type of parameters to a function.
LValue - This represents an lvalue references.
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
bool isExternallyDestructed() const
ReturnValueSlot(Address Addr, bool IsVolatile, bool IsUnused=false, bool IsExternallyDestructed=false)
Address getAddress() const
Decl - This represents one declaration (or definition), e.g.
This represents one expression.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
GlobalDecl - represents a global declaration.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
A (possibly-)qualified type.
Options for controlling the target.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
FnInfoOpts operator|=(FnInfoOpts A, FnInfoOpts B)
FnInfoOpts operator&(FnInfoOpts A, FnInfoOpts B)
FnInfoOpts operator&=(FnInfoOpts A, FnInfoOpts B)
void mergeDefaultFunctionDefinitionAttributes(llvm::Function &F, const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, const TargetOptions &TargetOpts, bool WillInternalize)
Adds attributes to F according to our CodeGenOpts and LangOpts, as though we had emitted it ourselves...
BlockFlags operator|(BlockLiteralFlags l, BlockLiteralFlags r)
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
The JSON file list parser is used to communicate input to InstallAPI.
Diagnostic wrappers for TextAPI types for error reporting.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
llvm::Instruction * IsActiveIP
The "is active" insertion point.
EHScopeStack::stable_iterator Cleanup
llvm::Value * ToUse
A value to "use" after the writeback, or null.
LValue Source
The original argument.
Address Temporary
The temporary alloca.
LValue getKnownLValue() const
RValue getKnownRValue() const
CallArg(LValue lv, QualType ty)
void setRValue(RValue _RV)
void copyInto(CodeGenFunction &CGF, Address A) const
CallArg(RValue rv, QualType ty)
RValue getRValue(CodeGenFunction &CGF) const