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