From: Chris Lattner Date: Fri, 6 May 2005 20:26:26 +0000 (+0000) Subject: Add support for explicit calling conventions X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=3340ffe85431f705e91aa4d4b64207f80d0d8c2f;p=oota-llvm.git Add support for explicit calling conventions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21745 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Function.h b/include/llvm/Function.h index edd88617b0f..38f33ceeb8f 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -66,6 +66,7 @@ private: ArgumentListType ArgumentList; // The formal arguments SymbolTable *SymTab; + unsigned CallingConvention; friend class SymbolTableListTraits; @@ -106,6 +107,12 @@ public: unsigned getIntrinsicID() const; bool isIntrinsic() const { return getIntrinsicID() != 0; } + /// getCallingConv()/setCallingConv(uint) - These method get and set the + /// calling convention of this function. The enum values for the known + /// calling conventions are defined in CallingConv.h. + unsigned getCallingConv() const { return CallingConvention; } + void setCallingConv(unsigned CC) { CallingConvention = CC; } + /// renameLocalSymbols - This method goes through the Function's symbol table /// and renames any symbols that conflict with symbols at global scope. This /// is required before printing out to a textual form, to ensure that there is diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h index b398361aec2..696466858d1 100644 --- a/include/llvm/Instructions.h +++ b/include/llvm/Instructions.h @@ -467,8 +467,9 @@ public: //===----------------------------------------------------------------------===// /// CallInst - This class represents a function call, abstracting a target -/// machine's calling convention. This class uses the SubClassData field to -/// indicate whether or not this is a tail call. +/// machine's calling convention. This class uses low bit of the SubClassData +/// field to indicate whether or not this is a tail call. The rest of the bits +/// hold the calling convention of the call. /// class CallInst : public Instruction { CallInst(const CallInst &CI); @@ -502,8 +503,17 @@ public: virtual CallInst *clone() const; bool mayWriteToMemory() const { return true; } - bool isTailCall() const { return SubclassData; } - void setTailCall(bool isTailCall = true) { SubclassData = isTailCall; } + bool isTailCall() const { return SubclassData & 1; } + void setTailCall(bool isTailCall = true) { + SubclassData = (SubclassData & ~1) | isTailCall; + } + + /// getCallingConv/setCallingConv - Get or set the calling convention of this + /// function call. + unsigned getCallingConv() const { return SubclassData >> 1; } + void setCallingConv(unsigned CC) { + SubclassData = (SubclassData & 1) | (CC << 1); + } /// getCalledFunction - Return the function being called by this instruction /// if it is a direct call. If it is a call through a function pointer, @@ -1165,7 +1175,9 @@ private: //===----------------------------------------------------------------------===// //===--------------------------------------------------------------------------- -/// InvokeInst - Invoke instruction + +/// InvokeInst - Invoke instruction. The SubclassData field is used to hold the +/// calling convention of the call. /// class InvokeInst : public TerminatorInst { InvokeInst(const InvokeInst &BI); @@ -1184,6 +1196,13 @@ public: bool mayWriteToMemory() const { return true; } + /// getCallingConv/setCallingConv - Get or set the calling convention of this + /// function call. + unsigned getCallingConv() const { return SubclassData; } + void setCallingConv(unsigned CC) { + SubclassData = CC; + } + /// getCalledFunction - Return the function called, or null if this is an /// indirect function invocation. /// diff --git a/include/llvm/Support/CallSite.h b/include/llvm/Support/CallSite.h index 9df71a2743d..9d393e050b6 100644 --- a/include/llvm/Support/CallSite.h +++ b/include/llvm/Support/CallSite.h @@ -52,6 +52,11 @@ public: return CallSite(); } + /// getCallingConv/setCallingConv - get or set the calling convention of the + /// call. + unsigned getCallingConv() const; + void setCallingConv(unsigned CC); + /// getType - Return the type of the instruction that generated this call site /// const Type *getType() const { return I->getType(); }