MachineLocation.h revision 56e4d89642d0850f6392a90136848b3647abed97
160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey//===-- llvm/CodeGen/MachineLocation.h --------------------------*- C++ -*-===//
260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey//
360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey//                     The LLVM Compiler Infrastructure
460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey//
860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey//===----------------------------------------------------------------------===//
960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey// The MachineLocation class is used to represent a simple location in a machine
1060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey// frame.  Locations will be one of two forms; a register or an address formed
114188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey// from a base address plus an offset.  Register indirection can be specified by
124188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey// using an offset of zero.
134188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey//
144188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey// The MachineMove class is used to represent abstract move operations in the
154188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey// prolog/epilog of a compiled function.  A collection of these objects can be
164188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey// used by a debug consumer to track the location of values when unwinding stack
174188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey// frames.
1860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey//===----------------------------------------------------------------------===//
1960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
2060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
2160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey#ifndef LLVM_CODEGEN_MACHINELOCATION_H
2260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey#define LLVM_CODEGEN_MACHINELOCATION_H
2360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
2460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeynamespace llvm {
252e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  class MCSymbol;
262e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner
2760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeyclass MachineLocation {
2860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeyprivate:
2960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  bool IsRegister;                      // True if location is a register.
3060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  unsigned Register;                    // gcc/gdb register number.
3160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  int Offset;                           // Displacement if not register.
3260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeypublic:
334188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  enum {
344188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey    // The target register number for an abstract frame pointer. The value is
3556e4d89642d0850f6392a90136848b3647abed97Jakob Stoklund Olesen    // an arbitrary value that doesn't collide with any real target register.
364188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey    VirtualFP = ~0U
374188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  };
3860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  MachineLocation()
392e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  : IsRegister(false), Register(0), Offset(0) {}
40423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman  explicit MachineLocation(unsigned R)
412e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  : IsRegister(true), Register(R), Offset(0) {}
4260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  MachineLocation(unsigned R, int O)
432e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  : IsRegister(false), Register(R), Offset(O) {}
4460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
4560f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  // Accessors
46d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  bool isReg()           const { return IsRegister; }
47d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  unsigned getReg()      const { return Register; }
4860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  int getOffset()        const { return Offset; }
4960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void setIsRegister(bool Is)  { IsRegister = Is; }
5060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void setRegister(unsigned R) { Register = R; }
5160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void setOffset(int O)        { Offset = O; }
5260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void set(unsigned R) {
5360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    IsRegister = true;
5460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    Register = R;
5560f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    Offset = 0;
5660f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  }
5760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void set(unsigned R, int O) {
5860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    IsRegister = false;
5960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    Register = R;
6060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    Offset = O;
6160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  }
624188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
634188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey#ifndef NDEBUG
644188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  void dump();
654188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey#endif
664188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey};
674188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
682e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner/// MachineMove - This class represents the save or restore of a callee saved
692e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner/// register that exception or debug info needs to know about.
704188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskeyclass MachineMove {
714188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskeyprivate:
722e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  /// Label - Symbol for post-instruction address when result of move takes
732e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  /// effect.
742e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  MCSymbol *Label;
754188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
762e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  // Move to & from location.
772e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  MachineLocation Destination, Source;
784188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskeypublic:
792e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  MachineMove() : Label(0) {}
805e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey
816894b07996757134b7036753fcad85f354a0f5bdChris Lattner  MachineMove(MCSymbol *label, const MachineLocation &D,
826894b07996757134b7036753fcad85f354a0f5bdChris Lattner              const MachineLocation &S)
832e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  : Label(label), Destination(D), Source(S) {}
844188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
854188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  // Accessors
862e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  MCSymbol *getLabel()                    const { return Label; }
874188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  const MachineLocation &getDestination() const { return Destination; }
884188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  const MachineLocation &getSource()      const { return Source; }
8960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey};
9060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
9160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey} // End llvm namespace
9260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
9360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey#endif
94