Brian Gaeke | 03cac37 | 2004-04-25 07:04:49 +0000 | [diff] [blame] | 1 | //===-- MachineInstrAnnot.h -------------------------------------*- C++ -*-===// |
John Criswell | b644598 | 2003-10-20 20:19:47 +0000 | [diff] [blame] | 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file was developed by the LLVM research group and is distributed under |
| 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
Chris Lattner | 02e7a86 | 2002-08-09 20:08:03 +0000 | [diff] [blame] | 9 | // |
Brian Gaeke | 03cac37 | 2004-04-25 07:04:49 +0000 | [diff] [blame] | 10 | // Annotations used to pass information between SparcV9 code generation phases. |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 11 | // |
Chris Lattner | 02e7a86 | 2002-08-09 20:08:03 +0000 | [diff] [blame] | 12 | //===----------------------------------------------------------------------===// |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 13 | |
Brian Gaeke | 03cac37 | 2004-04-25 07:04:49 +0000 | [diff] [blame] | 14 | #ifndef MACHINEINSTRANNOT_H |
| 15 | #define MACHINEINSTRANNOT_H |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 16 | |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 17 | #include "llvm/CodeGen/MachineInstr.h" |
Brian Gaeke | 71509a9 | 2004-04-23 18:15:47 +0000 | [diff] [blame] | 18 | #include "SparcV9RegInfo.h" |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 19 | |
Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 20 | namespace llvm { |
| 21 | |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 22 | class Value; |
| 23 | class TmpInstruction; |
| 24 | class CallInst; |
| 25 | |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 26 | class CallArgInfo { |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 27 | // Flag values for different argument passing methods |
| 28 | static const unsigned char IntArgReg = 0x1; |
| 29 | static const unsigned char FPArgReg = 0x2; |
| 30 | static const unsigned char StackSlot = 0x4; |
| 31 | |
Vikram S. Adve | e2e50f2 | 2003-07-10 19:46:15 +0000 | [diff] [blame] | 32 | Value* argVal; // this argument |
| 33 | int argCopyReg; // register used for second copy of arg. when |
Vikram S. Adve | 12067b65 | 2003-05-31 07:43:41 +0000 | [diff] [blame] | 34 | // multiple copies must be passed in registers |
| 35 | unsigned char passingMethod; // flags recording passing methods |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 36 | |
| 37 | public: |
| 38 | // Constructors |
Vikram S. Adve | e2e50f2 | 2003-07-10 19:46:15 +0000 | [diff] [blame] | 39 | CallArgInfo(Value* _argVal) |
Brian Gaeke | dca24dd | 2004-06-03 02:45:09 +0000 | [diff] [blame] | 40 | : argVal(_argVal), argCopyReg(SparcV9RegInfo::getInvalidRegNum()), |
Vikram S. Adve | 12067b65 | 2003-05-31 07:43:41 +0000 | [diff] [blame] | 41 | passingMethod(0x0) {} |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 42 | |
| 43 | CallArgInfo(const CallArgInfo& obj) |
Vikram S. Adve | 12067b65 | 2003-05-31 07:43:41 +0000 | [diff] [blame] | 44 | : argVal(obj.argVal), argCopyReg(obj.argCopyReg), |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 45 | passingMethod(obj.passingMethod) {} |
| 46 | |
| 47 | // Accessor methods |
Vikram S. Adve | e2e50f2 | 2003-07-10 19:46:15 +0000 | [diff] [blame] | 48 | Value* getArgVal() { return argVal; } |
Vikram S. Adve | 12067b65 | 2003-05-31 07:43:41 +0000 | [diff] [blame] | 49 | int getArgCopy() { return argCopyReg; } |
Vikram S. Adve | 72623d5 | 2002-07-10 21:51:46 +0000 | [diff] [blame] | 50 | bool usesIntArgReg() { return (bool) (passingMethod & IntArgReg);} |
| 51 | bool usesFPArgReg() { return (bool) (passingMethod & FPArgReg); } |
| 52 | bool usesStackSlot() { return (bool) (passingMethod & StackSlot);} |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 53 | |
| 54 | // Modifier methods |
Vikram S. Adve | e2e50f2 | 2003-07-10 19:46:15 +0000 | [diff] [blame] | 55 | void replaceArgVal(Value* newVal) { argVal = newVal; } |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 56 | void setUseIntArgReg() { passingMethod |= IntArgReg; } |
| 57 | void setUseFPArgReg() { passingMethod |= FPArgReg; } |
| 58 | void setUseStackSlot() { passingMethod |= StackSlot; } |
Vikram S. Adve | 12067b65 | 2003-05-31 07:43:41 +0000 | [diff] [blame] | 59 | void setArgCopy(int copyReg) { argCopyReg = copyReg; } |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 60 | }; |
| 61 | |
| 62 | |
Vikram S. Adve | a1b4f0f | 2002-10-29 19:41:18 +0000 | [diff] [blame] | 63 | class CallArgsDescriptor { |
| 64 | |
Chris Lattner | 02e7a86 | 2002-08-09 20:08:03 +0000 | [diff] [blame] | 65 | std::vector<CallArgInfo> argInfoVec; // Descriptor for each argument |
Vikram S. Adve | e2e50f2 | 2003-07-10 19:46:15 +0000 | [diff] [blame] | 66 | CallInst* callInstr; // The call instruction == result value |
| 67 | Value* funcPtr; // Pointer for indirect calls |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 68 | TmpInstruction* retAddrReg; // Tmp value for return address reg. |
| 69 | bool isVarArgs; // Is this a varargs call? |
| 70 | bool noPrototype; // Is this a call with no prototype? |
| 71 | |
| 72 | public: |
Vikram S. Adve | e2e50f2 | 2003-07-10 19:46:15 +0000 | [diff] [blame] | 73 | CallArgsDescriptor(CallInst* _callInstr, TmpInstruction* _retAddrReg, |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 74 | bool _isVarArgs, bool _noPrototype); |
| 75 | |
| 76 | // Accessor methods to retrieve information about the call |
| 77 | // Note that operands are numbered 1..#CallArgs |
| 78 | unsigned int getNumArgs() const { return argInfoVec.size(); } |
| 79 | CallArgInfo& getArgInfo(unsigned int op) { assert(op < argInfoVec.size()); |
| 80 | return argInfoVec[op]; } |
Vikram S. Adve | e2e50f2 | 2003-07-10 19:46:15 +0000 | [diff] [blame] | 81 | CallInst* getCallInst() const { return callInstr; } |
| 82 | CallInst* getReturnValue() const; |
| 83 | Value* getIndirectFuncPtr() const { return funcPtr; } |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 84 | TmpInstruction* getReturnAddrReg() const { return retAddrReg; } |
| 85 | bool isVarArgsFunc() const { return isVarArgs; } |
| 86 | bool hasNoPrototype() const { return noPrototype; } |
Vikram S. Adve | 8076fe8 | 2002-09-28 17:03:54 +0000 | [diff] [blame] | 87 | |
Vikram S. Adve | a1b4f0f | 2002-10-29 19:41:18 +0000 | [diff] [blame] | 88 | // Mechanism to get the descriptor for a CALL MachineInstr. |
| 89 | // |
| 90 | static CallArgsDescriptor *get(const MachineInstr* MI); |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 91 | }; |
| 92 | |
Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 93 | } // End llvm namespace |
Vikram S. Adve | 1e45411 | 2002-05-19 15:30:21 +0000 | [diff] [blame] | 94 | |
Chris Lattner | 880cfed | 2002-07-25 15:00:45 +0000 | [diff] [blame] | 95 | #endif |