mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-01 19:29:22 +00:00
The underlying type of all plain enums in MSVC is 'int', even if the enumerator contains large 32-bit unsigned values or values greater than UINT_MAX. The only way to get a large or unsigned enum type is to request it explicitly with the C++11 strong enum types feature. However, since LLVM isn't C++11 yet, I had to add a conditional LLVM_ENUM_INT_TYPE to Compiler.h to control its usage. The motivating true positive for this change is compiling PointerIntPair with MSVC for win64. The PointerIntMask value is supposed to be pointer sized value of all ones with some low zeros. Instead, it's truncated to 32-bits! We are only saved later because it is sign extended back in the AND with int64_t, and we happen to want all ones. This silences lots of -Wmicrosoft warnings during a clang self-host targeting Windows. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191241 91177308-0d34-0410-b5e6-96231b3b80d8
79 lines
2.6 KiB
C++
79 lines
2.6 KiB
C++
//===-- llvm/MC/MachineLocation.h -------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// The MachineLocation class is used to represent a simple location in a machine
|
|
// frame. Locations will be one of two forms; a register or an address formed
|
|
// from a base address plus an offset. Register indirection can be specified by
|
|
// explicitly passing an offset to the constructor.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
#ifndef LLVM_MC_MACHINELOCATION_H
|
|
#define LLVM_MC_MACHINELOCATION_H
|
|
|
|
#include "llvm/Support/Compiler.h"
|
|
#include "llvm/Support/DataTypes.h"
|
|
|
|
namespace llvm {
|
|
class MCSymbol;
|
|
|
|
class MachineLocation {
|
|
private:
|
|
bool IsRegister; // True if location is a register.
|
|
unsigned Register; // gcc/gdb register number.
|
|
int Offset; // Displacement if not register.
|
|
public:
|
|
enum LLVM_ENUM_INT_TYPE(uint32_t) {
|
|
// The target register number for an abstract frame pointer. The value is
|
|
// an arbitrary value that doesn't collide with any real target register.
|
|
VirtualFP = ~0U
|
|
};
|
|
MachineLocation()
|
|
: IsRegister(false), Register(0), Offset(0) {}
|
|
/// Create a direct register location.
|
|
explicit MachineLocation(unsigned R)
|
|
: IsRegister(true), Register(R), Offset(0) {}
|
|
/// Create a register-indirect location with an offset.
|
|
MachineLocation(unsigned R, int O)
|
|
: IsRegister(false), Register(R), Offset(O) {}
|
|
|
|
bool operator==(const MachineLocation &Other) const {
|
|
return IsRegister == Other.IsRegister && Register == Other.Register &&
|
|
Offset == Other.Offset;
|
|
}
|
|
|
|
// Accessors.
|
|
/// \return true iff this is a register-indirect location.
|
|
bool isIndirect() const { return !IsRegister; }
|
|
bool isReg() const { return IsRegister; }
|
|
unsigned getReg() const { return Register; }
|
|
int getOffset() const { return Offset; }
|
|
void setIsRegister(bool Is) { IsRegister = Is; }
|
|
void setRegister(unsigned R) { Register = R; }
|
|
void setOffset(int O) { Offset = O; }
|
|
/// Make this location a direct register location.
|
|
void set(unsigned R) {
|
|
IsRegister = true;
|
|
Register = R;
|
|
Offset = 0;
|
|
}
|
|
/// Make this location a register-indirect+offset location.
|
|
void set(unsigned R, int O) {
|
|
IsRegister = false;
|
|
Register = R;
|
|
Offset = O;
|
|
}
|
|
|
|
#ifndef NDEBUG
|
|
void dump();
|
|
#endif
|
|
};
|
|
} // End llvm namespace
|
|
|
|
#endif
|