12d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng//===-- llvm/MC/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
1213131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl// explicitly passing an offset to the constructor.
1360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey//===----------------------------------------------------------------------===//
1460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
1560f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
162d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng#ifndef LLVM_MC_MACHINELOCATION_H
172d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng#define LLVM_MC_MACHINELOCATION_H
1860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
19118a0659ab8a4d0e0af343b88e5fa71a5c1eb6a6Reid Kleckner#include "llvm/Support/Compiler.h"
20118a0659ab8a4d0e0af343b88e5fa71a5c1eb6a6Reid Kleckner#include "llvm/Support/DataTypes.h"
21118a0659ab8a4d0e0af343b88e5fa71a5c1eb6a6Reid Kleckner
2260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeynamespace llvm {
232e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner  class MCSymbol;
24639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
2560f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeyclass MachineLocation {
2660f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeyprivate:
2760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  bool IsRegister;                      // True if location is a register.
2860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  unsigned Register;                    // gcc/gdb register number.
2960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  int Offset;                           // Displacement if not register.
3060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeypublic:
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  enum : uint32_t {
324188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey    // The target register number for an abstract frame pointer. The value is
3356e4d89642d0850f6392a90136848b3647abed97Jakob Stoklund Olesen    // an arbitrary value that doesn't collide with any real target register.
344188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey    VirtualFP = ~0U
354188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  };
3660f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  MachineLocation()
372d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng    : IsRegister(false), Register(0), Offset(0) {}
3813131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl  /// Create a direct register location.
39423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman  explicit MachineLocation(unsigned R)
402d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng    : IsRegister(true), Register(R), Offset(0) {}
4113131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl  /// Create a register-indirect location with an offset.
4260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  MachineLocation(unsigned R, int O)
432d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng    : IsRegister(false), Register(R), Offset(O) {}
446c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel
456c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel  bool operator==(const MachineLocation &Other) const {
466c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel      return IsRegister == Other.IsRegister && Register == Other.Register &&
476c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel        Offset == Other.Offset;
486c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel  }
49639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
500a4371a2073d8841768cf3e8cf65601a8d7cc4fcAdrian Prantl  // Accessors.
510a4371a2073d8841768cf3e8cf65601a8d7cc4fcAdrian Prantl  /// \return true iff this is a register-indirect location.
5213131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl  bool isIndirect()      const { return !IsRegister; }
53d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  bool isReg()           const { return IsRegister; }
54d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  unsigned getReg()      const { return Register; }
5560f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  int getOffset()        const { return Offset; }
5660f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void setIsRegister(bool Is)  { IsRegister = Is; }
5760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void setRegister(unsigned R) { Register = R; }
5860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void setOffset(int O)        { Offset = O; }
5913131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl  /// Make this location a direct register location.
6060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void set(unsigned R) {
6160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    IsRegister = true;
6260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    Register = R;
6360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    Offset = 0;
6460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  }
6513131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl  /// Make this location a register-indirect+offset location.
6660f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  void set(unsigned R, int O) {
6760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    IsRegister = false;
6860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    Register = R;
6960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey    Offset = O;
7060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey  }
714188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
724188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey#ifndef NDEBUG
734188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  void dump();
744188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey#endif
754188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey};
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline bool operator!=(const MachineLocation &LHS, const MachineLocation &RHS) {
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return !(LHS == RHS);
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey} // End llvm namespace
8260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey
8360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey#endif
84