llvm.org GIT mirror llvm / release_1 include / llvm / CodeGen / MachineInstrAnnot.h
release_1

Tree @release_1 (Download .tar.gz)

MachineInstrAnnot.h @release_1

179cdfb
6fbcc26
 
 
 
 
 
 
179cdfb
 
7e684a9
179cdfb
7e684a9
 
 
 
 
2263df0
7e684a9
 
 
 
 
 
 
 
 
 
 
4d2faf6
 
2263df0
 
7e684a9
 
 
4d2faf6
2263df0
 
7e684a9
 
2263df0
7e684a9
 
 
4d2faf6
2263df0
975f6d4
 
 
7e684a9
 
4d2faf6
7e684a9
 
 
2263df0
7e684a9
 
 
a2bae30
 
179cdfb
4d2faf6
 
7e684a9
 
 
 
 
4d2faf6
7e684a9
 
 
 
 
 
 
4d2faf6
 
 
7e684a9
 
 
f425884
a2bae30
 
 
7e684a9
 
 
c6a4bf1
//===-- llvm/CodeGen/MachineInstrAnnot.h ------------------------*- C++ -*-===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
//  Annotations used to pass information between code generation phases.
// 
//===----------------------------------------------------------------------===//

#ifndef MACHINE_INSTR_ANNOT_h
#define MACHINE_INSTR_ANNOT_h

#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/Target/TargetRegInfo.h"

class Value;
class TmpInstruction;
class CallInst;

class CallArgInfo {
  // Flag values for different argument passing methods
  static const unsigned char IntArgReg = 0x1;
  static const unsigned char FPArgReg  = 0x2;
  static const unsigned char StackSlot = 0x4;
  
  Value*        argVal;         // this argument
  int           argCopyReg;     // register used for second copy of arg. when
                                // multiple  copies must be passed in registers
  unsigned char passingMethod;  // flags recording passing methods
  
public:
  // Constructors
  CallArgInfo(Value* _argVal)
    : argVal(_argVal), argCopyReg(TargetRegInfo::getInvalidRegNum()),
      passingMethod(0x0) {}
  
  CallArgInfo(const CallArgInfo& obj)
    : argVal(obj.argVal), argCopyReg(obj.argCopyReg),
      passingMethod(obj.passingMethod) {}
  
  // Accessor methods
  Value*        getArgVal()       { return argVal; }
  int           getArgCopy()      { return argCopyReg; }
  bool          usesIntArgReg()   { return (bool) (passingMethod & IntArgReg);} 
  bool          usesFPArgReg()    { return (bool) (passingMethod & FPArgReg); } 
  bool          usesStackSlot()   { return (bool) (passingMethod & StackSlot);} 
  
  // Modifier methods
  void          replaceArgVal(Value* newVal) { argVal = newVal; }
  void          setUseIntArgReg() { passingMethod |= IntArgReg; }
  void          setUseFPArgReg()  { passingMethod |= FPArgReg; }
  void          setUseStackSlot() { passingMethod |= StackSlot; }
  void          setArgCopy(int copyReg) { argCopyReg = copyReg; }
};


class CallArgsDescriptor {

  std::vector<CallArgInfo> argInfoVec;  // Descriptor for each argument
  CallInst* callInstr;                  // The call instruction == result value
  Value* funcPtr;                       // Pointer for indirect calls 
  TmpInstruction* retAddrReg;           // Tmp value for return address reg.
  bool isVarArgs;                       // Is this a varargs call?
  bool noPrototype;                     // Is this a call with no prototype?
  
public:
  CallArgsDescriptor(CallInst* _callInstr, TmpInstruction* _retAddrReg,
                     bool _isVarArgs, bool _noPrototype);
  
  // Accessor methods to retrieve information about the call
  // Note that operands are numbered 1..#CallArgs
  unsigned int    getNumArgs() const          { return argInfoVec.size(); }
  CallArgInfo&    getArgInfo(unsigned int op) { assert(op < argInfoVec.size());
                                                return argInfoVec[op]; }
  CallInst*       getCallInst() const         { return callInstr; }
  CallInst*       getReturnValue() const;
  Value*          getIndirectFuncPtr() const  { return funcPtr; }
  TmpInstruction* getReturnAddrReg() const    { return retAddrReg; }
  bool            isVarArgsFunc() const       { return isVarArgs; }
  bool            hasNoPrototype() const      { return noPrototype; }

  // Mechanism to get the descriptor for a CALL MachineInstr.
  // 
  static CallArgsDescriptor *get(const MachineInstr* MI);
};


#endif