Index: src/IceInstX8664.cpp |
diff --git a/src/IceInstX8664.cpp b/src/IceInstX8664.cpp |
index da09a9e295444649fe5506ca8384cccf319e3144..cc385dbe185568aa60ac2ec6ac37acf6f5a41148 100644 |
--- a/src/IceInstX8664.cpp |
+++ b/src/IceInstX8664.cpp |
@@ -64,13 +64,11 @@ void MachineTraits<TargetX8664>::X86Operand::dump(const Cfg *, |
Str << "<OperandX8664>"; |
} |
-MachineTraits<TargetX8664>::X86OperandMem::X86OperandMem(Cfg *Func, Type Ty, |
- Variable *Base, |
- Constant *Offset, |
- Variable *Index, |
- uint16_t Shift) |
+MachineTraits<TargetX8664>::X86OperandMem::X86OperandMem( |
+ Cfg *Func, Type Ty, Variable *Base, Constant *Offset, Variable *Index, |
+ uint16_t Shift, bool IsPIC) |
: X86Operand(kMem, Ty), Base(Base), Offset(Offset), Index(Index), |
- Shift(Shift) { |
+ Shift(Shift), IsPIC(IsPIC) { |
assert(Shift <= 3); |
Vars = nullptr; |
NumVars = 0; |
@@ -102,7 +100,8 @@ void MachineTraits<TargetX8664>::X86OperandMem::emit(const Cfg *Func) const { |
// Emit a non-zero offset without a leading '$'. |
Str << CI->getValue(); |
} else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Offset)) { |
- CR->emitWithoutPrefix(Func->getTarget()); |
+ const bool UseNonsfi = Func->getContext()->getFlags().getUseNonsfi(); |
+ CR->emitWithoutPrefix(Func->getTarget(), UseNonsfi ? "@GOTOFF" : ""); |
} else { |
llvm_unreachable("Invalid offset type for x86 mem operand"); |
} |
@@ -188,7 +187,7 @@ MachineTraits<TargetX8664>::X86OperandMem::toAsmAddress( |
} else if (const auto CR = |
llvm::dyn_cast<ConstantRelocatable>(getOffset())) { |
Disp = CR->getOffset() - 4; |
- Fixup = Asm->createFixup(PcRelFixup, CR); |
+ Fixup = Asm->createFixup(FixupKindPcRel, CR); |
} else { |
llvm_unreachable("Unexpected offset type"); |
} |