hanchenye-llvm-project/llvm/lib/MC
Daniel Sanders a463d31a64 [mips] Correct the ordering of HI/LO pairs in the relocation table.
Summary:
There seems to have been a misunderstanding as to the meaning of 'offset' in
the rules laid down by our ABI. The previous code believed that 'offset' meant
the offset within the section that the relocation is applied to. However, it
should have meant the offset from the symbol used in the relocation expression.

This patch adds two fields to ELFRelocationEntry and uses them to correct the
order of relocations for MIPS. These fields contain:
* The original symbol before shouldRelocateWithSymbol() is considered. This
  ensures that R_MIPS_GOT16 is able to correctly distinguish between local and
  external symbols, allowing us to tell whether %got() requires a matching
  %lo() or not (local symbols require one, external symbols don't). It also
  prevents confusing cases where the fuzzy matching rules cause things like
  %hi(foo)/%lo(foo+3) and %hi(bar)/%lo(bar+1) to swap their %lo()'s.
* The original offset before shouldRelocateWithSymbol() is considered. The
  existing Addend field is always zero when the object uses in place addends
  (because it's already moved it to the encoding) but MIPS needs to use the
  original offset to ensure that the linker correctly calculates the carry-in
  bit for %hi() and %got().

IAS ensures that unmatchable %hi()/%got() relocations are placed at the end of
the table to ensure that the linker rejects the table (we're unable to report
such errors directly). The alternatives to this risk accidental matching
against inappropriate relocations which may silently compute incorrect values
due to an incorrect carry bit between the %lo() and %hi()/%got().

Reviewers: sdardis

Subscribers: dsanders, sdardis, rafael, llvm-commits

Differential Revision: http://reviews.llvm.org/D19718

llvm-svn: 268733
2016-05-06 13:49:25 +00:00
..
MCDisassembler One more batch of self-containing headers. 2016-01-27 19:29:56 +00:00
MCParser ARM: put extern __thread stubs in a special section. 2016-04-25 21:12:04 +00:00
CMakeLists.txt Move ObjectYAML code to a new library. 2016-03-01 19:15:06 +00:00
ConstantPools.cpp [ARM,AArch64] Store source location of asm constant pool entries 2015-11-16 16:25:47 +00:00
ELFObjectWriter.cpp [mips] Correct the ordering of HI/LO pairs in the relocation table. 2016-05-06 13:49:25 +00:00
LLVMBuild.txt
MCAsmBackend.cpp MachO: enable .data_region directives everywhere 2016-04-21 23:00:17 +00:00
MCAsmInfo.cpp [MachO] Add MachO alt-entry directive support. 2016-03-15 01:43:05 +00:00
MCAsmInfoCOFF.cpp [MC] Use LShr for constant evaluation of ">>" on non-arm64 darwin. 2015-11-11 00:51:36 +00:00
MCAsmInfoDarwin.cpp ARM: put extern __thread stubs in a special section. 2016-04-25 21:12:04 +00:00
MCAsmInfoELF.cpp [WebAssembly] Don't create a needless .note.GNU-stack section 2016-01-15 23:59:13 +00:00
MCAsmStreamer.cpp [MC] Create unique .pdata sections for every .text section 2016-05-02 23:22:18 +00:00
MCAssembler.cpp [MCAssembler] Allow backend to finalize layout post-relaxation. 2016-04-27 21:26:13 +00:00
MCCodeEmitter.cpp
MCCodeGenInfo.cpp
MCCodeView.cpp [codeview] Fix emission of file changes in inline line tables 2016-02-19 23:55:38 +00:00
MCContext.cpp [MC] Create unique .pdata sections for every .text section 2016-05-02 23:22:18 +00:00
MCDwarf.cpp Read discriminators correctly from object file. 2016-04-28 22:09:37 +00:00
MCELFObjectTargetWriter.cpp Always sort by offset first. NFC. 2015-12-17 15:08:24 +00:00
MCELFStreamer.cpp [mips] Use MipsMCExpr instead of MCSymbolRefExpr for all relocations. 2016-05-03 13:35:44 +00:00
MCExpr.cpp [mips] Use MipsMCExpr instead of MCSymbolRefExpr for all relocations. 2016-05-03 13:35:44 +00:00
MCFragment.cpp [NFC] Header cleanup 2016-04-18 09:17:29 +00:00
MCInst.cpp Annotate dump() methods with LLVM_DUMP_METHOD, addressing Richard Smith r259192 post commit comment. 2016-01-29 20:50:44 +00:00
MCInstPrinter.cpp
MCInstrAnalysis.cpp
MCInstrDesc.cpp Replace uint16_t with the MCPhysReg typedef in many places. A lot of physical register arrays already use this typedef. 2015-12-05 07:13:35 +00:00
MCLabel.cpp Annotate dump() methods with LLVM_DUMP_METHOD, addressing Richard Smith r259192 post commit comment. 2016-01-29 20:50:44 +00:00
MCLinkerOptimizationHint.cpp
MCMachOStreamer.cpp MachO: enable .data_region directives everywhere 2016-04-21 23:00:17 +00:00
MCMachObjectTargetWriter.cpp
MCNullStreamer.cpp
MCObjectFileInfo.cpp Add accidentally deleted "break" 2016-04-25 21:28:52 +00:00
MCObjectStreamer.cpp [MC] Add support for encoding CodeView variable definition ranges 2016-02-05 01:55:49 +00:00
MCObjectWriter.cpp Fix pr24486. 2015-10-05 12:07:05 +00:00
MCRegisterInfo.cpp [codeview] Bail on a DBG_VALUE register operand with no register 2016-02-16 21:49:26 +00:00
MCSchedule.cpp
MCSection.cpp Annotate dump() methods with LLVM_DUMP_METHOD, addressing Richard Smith r259192 post commit comment. 2016-01-29 20:50:44 +00:00
MCSectionCOFF.cpp Sink COFF.h MC include into .cpp files 2015-09-03 16:41:50 +00:00
MCSectionELF.cpp Bring r252305 back with a test fix. 2015-11-06 15:30:45 +00:00
MCSectionMachO.cpp [ADT] Switch a bunch of places in LLVM that were doing single-character 2015-09-10 06:12:31 +00:00
MCStreamer.cpp [MC] Create unique .pdata sections for every .text section 2016-05-02 23:22:18 +00:00
MCSubtargetInfo.cpp (NFC) Change SubtargetFeatures::ToggleFeature and 2016-01-05 10:25:56 +00:00
MCSymbol.cpp Annotate dump() methods with LLVM_DUMP_METHOD, addressing Richard Smith r259192 post commit comment. 2016-01-29 20:50:44 +00:00
MCSymbolELF.cpp
MCTargetOptions.cpp [MC, COFF] Support link /incremental conditionally 2015-12-21 22:09:27 +00:00
MCValue.cpp Annotate dump() methods with LLVM_DUMP_METHOD, addressing Richard Smith r259192 post commit comment. 2016-01-29 20:50:44 +00:00
MCWin64EH.cpp [MC] Create unique .pdata sections for every .text section 2016-05-02 23:22:18 +00:00
MCWinEH.cpp [MC] Create unique .pdata sections for every .text section 2016-05-02 23:22:18 +00:00
MachObjectWriter.cpp Reapply: "ARM: put correct symbol index on indirect pointers in __thread_ptr."" 2016-04-26 18:29:16 +00:00
StringTableBuilder.cpp Make StringTableBuilder to cache hash values. 2016-05-06 00:51:58 +00:00
SubtargetFeature.cpp [NFC] Header cleanup 2016-04-18 09:17:29 +00:00
WinCOFFObjectWriter.cpp [MC] Add support for encoding CodeView variable definition ranges 2016-02-05 01:55:49 +00:00
WinCOFFStreamer.cpp [Object] Make .alt_entry directive parsing MachO specific. 2016-04-11 18:33:45 +00:00