Index: src/IceELFSection.h |
diff --git a/src/IceELFSection.h b/src/IceELFSection.h |
index ef1b299f68d1e8275175a9d61baa3f2d44979350..fcaa9d577e802ad2bc41c86e69259c6fab5109fa 100644 |
--- a/src/IceELFSection.h |
+++ b/src/IceELFSection.h |
@@ -356,17 +356,24 @@ void ELFRelocationSection::writeData(const GlobalContext &Ctx, ELFStreamer &Str, |
Symbol = SymTab->getNullSymbol(); |
} else { |
constexpr Assembler *Asm = nullptr; |
+ IceString Name = Fixup.symbol(&Ctx, Asm); |
Jim Stichnoth
2016/01/13 18:28:26
Can you move this into the "if (!Symbol) { ... }"
John
2016/01/13 20:48:03
Having this here allows for a better error-message
|
Symbol = SymTab->findSymbol(Fixup.symbol(&Ctx, Asm)); |
+ if (!Symbol) |
+ llvm::report_fatal_error(Name + ": Missing symbol mentioned in reloc"); |
} |
- if (!Symbol) |
- llvm::report_fatal_error("Missing symbol mentioned in reloc"); |
if (IsELF64) { |
- // TODO(jpp): check that Fixup.offset() is correct even for pc-rel. |
Elf64_Rela Rela; |
Rela.r_offset = Fixup.position(); |
Rela.setSymbolAndType(Symbol->getNumber(), Fixup.kind()); |
Rela.r_addend = Fixup.offset(); |
+ if (Fixup.kind() == llvm::ELF::R_X86_64_PC32) { |
+ // In ELF64, PC-relative relocations' addend need to account for |
Jim Stichnoth
2016/01/13 18:28:26
"addends" (for agreement)
Jim Stichnoth
2016/01/13 18:28:26
reflow comment to 80-col
John
2016/01/13 20:48:03
Done.
John
2016/01/13 20:48:03
Done.
|
+ // the immediate size. For now, this is always 4 (because x86-64 |
+ // sandboxed is the only ELF64 target currently implemented.) |
+ constexpr int32_t RelocImmediateSize = 4; |
+ Rela.r_addend -= RelocImmediateSize; |
+ } |
Str.writeAddrOrOffset<IsELF64>(Rela.r_offset); |
Str.writeELFXword<IsELF64>(Rela.r_info); |
Str.writeELFXword<IsELF64>(Rela.r_addend); |