From 1644c2608f482c33ede9aa124e454515bc75389f Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Mon, 3 Mar 2014 14:27:49 +0000 Subject: [PATCH] [mips] support FK_Data_2 and FK_Data_8 to fix big-endian debug data This fixes invalid lengths in .debug_aranges on big-endian mips64 (lengths appear to be left-shifted by 32 bits) and in .debug_loc. Differential Revision: http://llvm-reviews.chandlerc.com/D2517 llvm-svn: 202716 --- .../Mips/MCTargetDesc/MipsAsmBackend.cpp | 4 ++ test/MC/Mips/mips64eb-fixups.s | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 test/MC/Mips/mips64eb-fixups.s diff --git a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp index da332378bb1..dfaa4db50d9 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp @@ -38,6 +38,7 @@ static unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value, switch (Kind) { default: return 0; + case FK_Data_2: case FK_GPRel_4: case FK_Data_4: case FK_Data_8: @@ -140,12 +141,15 @@ public: unsigned FullSize; switch ((unsigned)Kind) { + case FK_Data_2: case Mips::fixup_Mips_16: FullSize = 2; break; + case FK_Data_8: case Mips::fixup_Mips_64: FullSize = 8; break; + case FK_Data_4: default: FullSize = 4; break; diff --git a/test/MC/Mips/mips64eb-fixups.s b/test/MC/Mips/mips64eb-fixups.s new file mode 100644 index 00000000000..1ca8b0ae529 --- /dev/null +++ b/test/MC/Mips/mips64eb-fixups.s @@ -0,0 +1,43 @@ +# RUN: llvm-mc -filetype=obj -triple mips64eb-unknown-freebsd %s -o - | llvm-readobj -s -sd | FileCheck %s + + .section .fixups,"",@progbits + .byte 0xff +$diff0 = ($loc1)-($loc0) + .2byte ($diff0) + + .byte 0xff +$diff1 = ($loc2)-($loc0) + .4byte ($diff1) + + .byte 0xff +$diff2 = ($loc3)-($loc0) + .8byte ($diff2) + .byte 0xff + +$loc0: + .byte 0xee +$loc1: + .byte 0xdd +$loc2: + .byte 0xcc +$loc3: + +# CHECK: AddressSize: 64bit +# CHECK: Section { +# CHECK: Name: .fixups (12) +# CHECK-NEXT: Type: SHT_PROGBITS (0x1) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x0 +# CHECK-NEXT: Offset: 0x40 +# CHECK-NEXT: Size: 21 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 1 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: SectionData ( +# CHECK-NEXT: 0000: FF0001FF 00000002 FF000000 00000000 |................| +# CHECK-NEXT: 0010: 03FFEEDD CC |.....| +# CHECK-NEXT: ) +# CHECK-NEXT: } +# CHECK: ]