Add support for explicit calling conventions

llvm-svn: 21745
This commit is contained in:
Chris Lattner 2005-05-06 20:26:26 +00:00
parent e29e1ff1e8
commit 4147522d71
3 changed files with 36 additions and 5 deletions

View File

@ -66,6 +66,7 @@ private:
ArgumentListType ArgumentList; // The formal arguments ArgumentListType ArgumentList; // The formal arguments
SymbolTable *SymTab; SymbolTable *SymTab;
unsigned CallingConvention;
friend class SymbolTableListTraits<Function, Module, Module>; friend class SymbolTableListTraits<Function, Module, Module>;
@ -106,6 +107,12 @@ public:
unsigned getIntrinsicID() const; unsigned getIntrinsicID() const;
bool isIntrinsic() const { return getIntrinsicID() != 0; } 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 /// renameLocalSymbols - This method goes through the Function's symbol table
/// and renames any symbols that conflict with symbols at global scope. This /// 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 /// is required before printing out to a textual form, to ensure that there is

View File

@ -467,8 +467,9 @@ public:
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
/// CallInst - This class represents a function call, abstracting a target /// CallInst - This class represents a function call, abstracting a target
/// machine's calling convention. This class uses the SubClassData field to /// machine's calling convention. This class uses low bit of the SubClassData
/// indicate whether or not this is a tail call. /// 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 { class CallInst : public Instruction {
CallInst(const CallInst &CI); CallInst(const CallInst &CI);
@ -502,8 +503,17 @@ public:
virtual CallInst *clone() const; virtual CallInst *clone() const;
bool mayWriteToMemory() const { return true; } bool mayWriteToMemory() const { return true; }
bool isTailCall() const { return SubclassData; } bool isTailCall() const { return SubclassData & 1; }
void setTailCall(bool isTailCall = true) { SubclassData = isTailCall; } 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 /// getCalledFunction - Return the function being called by this instruction
/// if it is a direct call. If it is a call through a function pointer, /// 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 { class InvokeInst : public TerminatorInst {
InvokeInst(const InvokeInst &BI); InvokeInst(const InvokeInst &BI);
@ -1184,6 +1196,13 @@ public:
bool mayWriteToMemory() const { return true; } 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 /// getCalledFunction - Return the function called, or null if this is an
/// indirect function invocation. /// indirect function invocation.
/// ///

View File

@ -52,6 +52,11 @@ public:
return CallSite(); 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 /// getType - Return the type of the instruction that generated this call site
/// ///
const Type *getType() const { return I->getType(); } const Type *getType() const { return I->getType(); }