1 //===- llvm/MC/MachineLocation.h --------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // The MachineLocation class is used to represent a simple location in a machine 9 // frame. Locations will be one of two forms; a register or an address formed 10 // from a base address plus an offset. Register indirection can be specified by 11 // explicitly passing an offset to the constructor. 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_MC_MACHINELOCATION_H 15 #define LLVM_MC_MACHINELOCATION_H 16 17 #include <cstdint> 18 #include <cassert> 19 20 namespace llvm { 21 22 class MachineLocation { 23 private: 24 bool IsRegister = false; ///< True if location is a register. 25 unsigned Register = 0; ///< gcc/gdb register number. 26 27 public: 28 enum : uint32_t { 29 // The target register number for an abstract frame pointer. The value is 30 // an arbitrary value that doesn't collide with any real target register. 31 VirtualFP = ~0U 32 }; 33 34 MachineLocation() = default; 35 /// Create a direct register location. 36 explicit MachineLocation(unsigned R, bool Indirect = false) 37 : IsRegister(!Indirect), Register(R) {} 38 39 bool operator==(const MachineLocation &Other) const { 40 return IsRegister == Other.IsRegister && Register == Other.Register; 41 } 42 43 // Accessors. 44 /// \return true iff this is a register-indirect location. isIndirect()45 bool isIndirect() const { return !IsRegister; } isReg()46 bool isReg() const { return IsRegister; } getReg()47 unsigned getReg() const { return Register; } setIsRegister(bool Is)48 void setIsRegister(bool Is) { IsRegister = Is; } setRegister(unsigned R)49 void setRegister(unsigned R) { Register = R; } 50 }; 51 52 inline bool operator!=(const MachineLocation &LHS, const MachineLocation &RHS) { 53 return !(LHS == RHS); 54 } 55 56 } // end namespace llvm 57 58 #endif // LLVM_MC_MACHINELOCATION_H 59