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 1960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeynamespace llvm { 202e9919a5e5fe76f4b1e3290103c4bfd149ebba9cChris Lattner class MCSymbol; 21639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach 2260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeyclass MachineLocation { 2360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeyprivate: 2460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey bool IsRegister; // True if location is a register. 2560f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey unsigned Register; // gcc/gdb register number. 2660f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey int Offset; // Displacement if not register. 2760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskeypublic: 284188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey enum { 294188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey // The target register number for an abstract frame pointer. The value is 3056e4d89642d0850f6392a90136848b3647abed97Jakob Stoklund Olesen // an arbitrary value that doesn't collide with any real target register. 314188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey VirtualFP = ~0U 324188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey }; 3360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey MachineLocation() 342d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng : IsRegister(false), Register(0), Offset(0) {} 3513131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl /// Create a direct register location. 36423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman explicit MachineLocation(unsigned R) 372d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng : IsRegister(true), Register(R), Offset(0) {} 3813131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl /// Create a register-indirect location with an offset. 3960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey MachineLocation(unsigned R, int O) 402d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng : IsRegister(false), Register(R), Offset(O) {} 416c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel 426c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel bool operator==(const MachineLocation &Other) const { 436c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel return IsRegister == Other.IsRegister && Register == Other.Register && 446c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel Offset == Other.Offset; 456c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel } 46639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach 4760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey // Accessors 4813131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl bool isIndirect() const { return !IsRegister; } 49d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isReg() const { return IsRegister; } 50d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman unsigned getReg() const { return Register; } 5160f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey int getOffset() const { return Offset; } 5260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey void setIsRegister(bool Is) { IsRegister = Is; } 5360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey void setRegister(unsigned R) { Register = R; } 5460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey void setOffset(int O) { Offset = O; } 5513131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl /// Make this location a direct register location. 5660f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey void set(unsigned R) { 5760f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey IsRegister = true; 5860f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey Register = R; 5960f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey Offset = 0; 6060f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey } 6113131e62fc9a523b3cc8ad98cc9def97ff89391aAdrian Prantl /// Make this location a register-indirect+offset location. 6260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey void set(unsigned R, int O) { 6360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey IsRegister = false; 6460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey Register = R; 6560f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey Offset = O; 6660f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey } 674188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey 684188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey#ifndef NDEBUG 694188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey void dump(); 704188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey#endif 714188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey}; 7260f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey} // End llvm namespace 7360f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey 7460f27ff87983ef1fe55095c6ff10ce7406e3f3bdJim Laskey#endif 75