Index: src/IceFixups.cpp |
diff --git a/src/IceFixups.cpp b/src/IceFixups.cpp |
index 59bd4f32b31a3a5e9b3af0902e3196e48cb79241..ef594acb8ed87837cb39aebde1b630507eed4d47 100644 |
--- a/src/IceFixups.cpp |
+++ b/src/IceFixups.cpp |
@@ -29,7 +29,8 @@ RelocOffsetT AssemblerFixup::offset() const { |
return 0; |
} |
-IceString AssemblerFixup::symbol(const GlobalContext *Ctx) const { |
+IceString AssemblerFixup::symbol(const GlobalContext *Ctx, |
+ const Assembler *Asm) const { |
std::string Buffer; |
llvm::raw_string_ostream Str(Buffer); |
const Constant *C = value_; |
@@ -39,6 +40,9 @@ IceString AssemblerFixup::symbol(const GlobalContext *Ctx) const { |
Str << CR->getName(); |
else |
Str << Ctx->mangleName(CR->getName()); |
+ if (Asm && !Asm->fixupIsPCRel(kind()) && Ctx->getFlags().getUseNonsfi()) { |
+ Str << "@GOTOFF"; |
+ } |
} else { |
// NOTE: currently only float/doubles are put into constant pools. In the |
// future we may put integers as well. |
@@ -57,7 +61,7 @@ size_t AssemblerFixup::emit(GlobalContext *Ctx, const Assembler &Asm) const { |
if (isNullSymbol()) |
Str << "__Sz_AbsoluteZero"; |
else |
- Str << symbol(Ctx); |
+ Str << symbol(Ctx, &Asm); |
RelocOffsetT Offset = Asm.load<RelocOffsetT>(position()); |
if (Offset) |
Str << " + " << Offset; |