Index: src/IceInstX8664.cpp |
diff --git a/src/IceInstX8664.cpp b/src/IceInstX8664.cpp |
index a7236a3f67cd6f9de5992f8692927db97e7b81e3..7bac57ebe1e6f6f14c711317160627ebe45d4819 100644 |
--- a/src/IceInstX8664.cpp |
+++ b/src/IceInstX8664.cpp |
@@ -136,7 +136,17 @@ void TargetX8664Traits::X86OperandMem::emit(const Cfg *Func) const { |
// rematerializable base/index and Disp. |
assert(Disp == 0); |
const bool UseNonsfi = Func->getContext()->getFlags().getUseNonsfi(); |
- CR->emitWithoutPrefix(Func->getTarget(), UseNonsfi ? "@GOTOFF" : ""); |
+ CR->emitWithoutPrefix(Target, UseNonsfi ? "@GOTOFF" : ""); |
+ assert(!UseNonsfi); |
+ if (Base == nullptr && Index == nullptr) { |
+ if (CR->getName() != "") { // rip-relative addressing. |
+ if (NeedSandboxing) { |
+ Str << "(%rip)"; |
+ } else { |
+ Str << "(%eip)"; |
+ } |
+ } |
+ } |
} else { |
llvm_unreachable("Invalid offset type for x86 mem operand"); |
} |
@@ -256,10 +266,16 @@ TargetX8664Traits::Address TargetX8664Traits::X86OperandMem::toAsmAddress( |
if (getOffset() != nullptr) { |
if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(getOffset())) { |
Disp += static_cast<int32_t>(CI->getValue()); |
- } else if (const auto CR = |
+ } else if (const auto *CR = |
llvm::dyn_cast<ConstantRelocatable>(getOffset())) { |
- Disp = CR->getOffset(); |
- Fixup = Asm->createFixup(FK_Abs, CR); |
+ RelocOffsetT DispAdjustment = 0; |
+ if (CR->getName() != "") { |
+ const auto FixupKind = |
+ (getBase() != nullptr || getIndex() != nullptr) ? FK_Abs : FK_PcRel; |
+ DispAdjustment = FixupKind == FK_PcRel ? 4 : 0; |
+ Fixup = Asm->createFixup(FixupKind, CR); |
+ } |
+ Disp = CR->getOffset() - DispAdjustment; |
} else { |
llvm_unreachable("Unexpected offset type"); |
} |
@@ -290,7 +306,15 @@ TargetX8664Traits::Address TargetX8664Traits::X86OperandMem::toAsmAddress( |
Fixup); |
} |
- return X8664::Traits::Address(Disp, Fixup); |
+ if (Fixup == nullptr) { |
+ // Absolute addresses are not allowed in Nexes -- they must be rebased |
+ // w.r.t. %r15. |
+ // Exception: LEAs are fine because they do not touch memory. |
+ assert(!Target->needSandboxing() || IsLeaAddr); |
+ return X8664::Traits::Address::Absolute(Disp); |
+ } |
+ |
+ return X8664::Traits::Address::RipRelative(Disp, Fixup); |
} |
TargetX8664Traits::Address |