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