Index: src/IceTargetLoweringX8664Traits.h |
diff --git a/src/IceTargetLoweringX8664Traits.h b/src/IceTargetLoweringX8664Traits.h |
index 6e26945d23139f921bb72153fdcaa43fc5e6292d..8fa088234abe2ac1015b6ff511c095b65d4c0fd0 100644 |
--- a/src/IceTargetLoweringX8664Traits.h |
+++ b/src/IceTargetLoweringX8664Traits.h |
@@ -69,8 +69,10 @@ template <> struct MachineTraits<TargetX8664> { |
using RegisterSet = ::Ice::RegX8664; |
static const GPRRegister Encoded_Reg_Accumulator = RegX8664::Encoded_Reg_eax; |
static const GPRRegister Encoded_Reg_Counter = RegX8664::Encoded_Reg_ecx; |
- static const FixupKind PcRelFixup = llvm::ELF::R_X86_64_PC32; |
- static const FixupKind RelFixup = llvm::ELF::R_X86_64_32S; |
+ static constexpr FixupKind FixupKindPcRel = llvm::ELF::R_X86_64_PC32; |
+ static constexpr FixupKind FixupKindAbs = llvm::ELF::R_X86_64_32S; |
+ static constexpr FixupKind FixupKindGotoff = llvm::ELF::R_X86_64_GOTOFF64; |
+ static constexpr FixupKind FixupKindGotPC = llvm::ELF::R_X86_64_GOTPC32; |
class Operand { |
public: |
@@ -265,7 +267,7 @@ template <> struct MachineTraits<TargetX8664> { |
static Address ofConstPool(Assembler *Asm, const Constant *Imm) { |
// TODO(jpp): ??? |
- AssemblerFixup *Fixup = Asm->createFixup(RelFixup, Imm); |
+ AssemblerFixup *Fixup = Asm->createFixup(FixupKindAbs, Imm); |
const RelocOffsetT Offset = 4; |
return Address(Offset, Fixup); |
} |
@@ -705,11 +707,12 @@ template <> struct MachineTraits<TargetX8664> { |
static X86OperandMem * |
create(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, |
Variable *Index = nullptr, uint16_t Shift = 0, |
- SegmentRegisters SegmentRegister = DefaultSegment) { |
+ SegmentRegisters SegmentRegister = DefaultSegment, |
+ bool IsPIC = false) { |
assert(SegmentRegister == DefaultSegment); |
(void)SegmentRegister; |
return new (Func->allocate<X86OperandMem>()) |
- X86OperandMem(Func, Ty, Base, Offset, Index, Shift); |
+ X86OperandMem(Func, Ty, Base, Offset, Index, Shift, IsPIC); |
} |
Variable *getBase() const { return Base; } |
Constant *getOffset() const { return Offset; } |
@@ -717,6 +720,8 @@ template <> struct MachineTraits<TargetX8664> { |
uint16_t getShift() const { return Shift; } |
SegmentRegisters getSegmentRegister() const { return DefaultSegment; } |
void emitSegmentOverride(Assembler *) const {} |
+ void setIsPIC() { IsPIC = true; } |
+ bool getIsPIC() const { return IsPIC; } |
Address toAsmAddress(Assembler *Asm, |
const Ice::TargetLowering *Target) const; |
@@ -734,12 +739,13 @@ template <> struct MachineTraits<TargetX8664> { |
private: |
X86OperandMem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, |
- Variable *Index, uint16_t Shift); |
+ Variable *Index, uint16_t Shift, bool IsPIC); |
Variable *Base; |
Constant *Offset; |
Variable *Index; |
uint16_t Shift; |
+ bool IsPIC; |
/// A flag to show if this memory operand is a randomized one. Randomized |
/// memory operands are generated in |
/// TargetX86Base::randomizeOrPoolImmediate() |