[llvm] r196432 - Fix a bug in darwin's 32-bit X86 handling of evaluating fixups.
Rafael EspĂndola
rafael.espindola at gmail.com
Thu Dec 5 08:42:15 PST 2013
Can you use llvm-objdump to disassemble? That should make the test a
bit more readable.
On 4 December 2013 18:36, Kevin Enderby <enderby at apple.com> wrote:
> Author: enderby
> Date: Wed Dec 4 17:36:24 2013
> New Revision: 196432
>
> URL: http://llvm.org/viewvc/llvm-project?rev=196432&view=rev
> Log:
> Fix a bug in darwin's 32-bit X86 handling of evaluating fixups.
>
> Where it would use a scattered relocation entry but falls back to a
> normal relocation entry because the FixupOffset is more than 24-bits.
>
> The bug is in the X86MachObjectWriter::RecordScatteredRelocation() where
> it changes reference parameter FixedValue but then returns false to indicate
> it did not create a scattered relocation entry. The fix is simply to save the
> original value of the parameter FixedValue at the start of the method and
> restore it if we are returning false in that case.
>
> rdar://15526046
>
> Added:
> llvm/trunk/test/MC/MachO/x86_32-scattered-reloc-fallback.s
> Modified:
> llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
>
> Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp?rev=196432&r1=196431&r2=196432&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp (original)
> +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp Wed Dec 4 17:36:24 2013
> @@ -362,6 +362,7 @@ bool X86MachObjectWriter::RecordScattere
> MCValue Target,
> unsigned Log2Size,
> uint64_t &FixedValue) {
> + uint64_t OriginalFixedValue = FixedValue;
> uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
> unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
> unsigned Type = MachO::GENERIC_RELOC_VANILLA;
> @@ -431,8 +432,10 @@ bool X86MachObjectWriter::RecordScattere
> // symbol, things can go badly.
> //
> // Required for 'as' compatibility.
> - if (FixupOffset > 0xffffff)
> + if (FixupOffset > 0xffffff) {
> + FixedValue = OriginalFixedValue;
> return false;
> + }
> }
>
> MachO::any_relocation_info MRE;
>
> Added: llvm/trunk/test/MC/MachO/x86_32-scattered-reloc-fallback.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/x86_32-scattered-reloc-fallback.s?rev=196432&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/MachO/x86_32-scattered-reloc-fallback.s (added)
> +++ llvm/trunk/test/MC/MachO/x86_32-scattered-reloc-fallback.s Wed Dec 4 17:36:24 2013
> @@ -0,0 +1,27 @@
> +// RUN: llvm-mc -triple i386-apple-darwin9 %s -filetype=obj -o - | macho-dump --dump-section-data | FileCheck %s
> +
> +// rdar://15526046
> +
> +.text
> +.globl _main
> +_main:
> + .space 0x01020f55, 0x90
> +bug:
> + movl $0, _key64b_9+4
> +.section __TEXT, __padding
> + .space 0x515b91, 0
> +.data
> + .space 0xa70, 0
> +.globl _key64b_9
> +_key64b_9:
> + .long 1
> + .long 2
> +
> +// The movl instruction above should produce this encoding where the address
> +// of _key64b_9 is at 0x01537560. This is testing falling back from using a
> +// scattered relocation to a normal relocation because the offset from the
> +// start of the section is more than 24-bits. But need to get the item to
> +// be relocated, in this case _key64b_9+4, value correct in the instruction.
> +// 01020f55 c7056475530100000000 movl $0x0, 0x1537564
> +
> +// CHECK: 90c70564 75530100 000000')
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list