Index: src/IceAssemblerARM32.cpp |
diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp |
index 11175373c63620dc70546d7ee55cb734cf7140fb..613fa7772b78d58ca188bdfdf50a74c32db844c4 100644 |
--- a/src/IceAssemblerARM32.cpp |
+++ b/src/IceAssemblerARM32.cpp |
@@ -593,11 +593,16 @@ size_t MoveRelocatableFixup::emit(GlobalContext *Ctx, |
IValueT Inst = Asm.load<IValueT>(position()); |
const bool IsMovw = kind() == llvm::ELF::R_ARM_MOVW_ABS_NC || |
kind() == llvm::ELF::R_ARM_MOVW_PREL_NC; |
+ const IceString Symbol = symbol(); |
+ const bool NeedsPCRelSuffix = |
+ (Asm.fixupIsPCRel(kind()) || Symbol == GlobalOffsetTable); |
Str << "\t" |
"mov" << (IsMovw ? "w" : "t") << "\t" |
<< RegARM32::getRegName(RegNumT::fixme((Inst >> kRdShift) & 0xF)) |
- << ", #:" << (IsMovw ? "lower" : "upper") << "16:" << symbol(&Asm) |
- << "\t@ .word " << llvm::format_hex_no_prefix(Inst, 8) << "\n"; |
+ << ", #:" << (IsMovw ? "lower" : "upper") << "16:" << Symbol |
+ << (NeedsPCRelSuffix ? " - ." : "") << "\t@ .word " |
+ // TODO(jpp): This is broken, it also needs to add a magic constant. |
+ << llvm::format_hex_no_prefix(Inst, 8) << "\n"; |
return InstARM32::InstSize; |
} |
@@ -650,7 +655,7 @@ size_t BlRelocatableFixup::emit(GlobalContext *Ctx, |
Ostream &Str = Ctx->getStrEmit(); |
IValueT Inst = Asm.load<IValueT>(position()); |
Str << "\t" |
- "bl\t" << symbol(&Asm) << "\t@ .word " |
+ "bl\t" << symbol() << "\t@ .word " |
<< llvm::format_hex_no_prefix(Inst, 8) << "\n"; |
return InstARM32::InstSize; |
} |