aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-05-06 20:26:26 +0000
committerChris Lattner <sabre@nondot.org>2005-05-06 20:26:26 +0000
commit3340ffe85431f705e91aa4d4b64207f80d0d8c2f (patch)
treea155906865d7e65af09bb816149d4fdedd1420b3
parenta62e52ab181c10738066e65a6dcc6c3cdfa5d806 (diff)
Add support for explicit calling conventions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21745 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Function.h7
-rw-r--r--include/llvm/Instructions.h29
-rw-r--r--include/llvm/Support/CallSite.h5
3 files changed, 36 insertions, 5 deletions
diff --git a/include/llvm/Function.h b/include/llvm/Function.h
index edd88617b0..38f33ceeb8 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<Function, Module, Module>;
@@ -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 b398361aec..696466858d 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 9df71a2743..9d393e050b 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(); }