summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Maste <emaste@freebsd.org>2014-03-03 14:27:49 +0000
committerEd Maste <emaste@freebsd.org>2014-03-03 14:27:49 +0000
commitc1e634da0c4015d9db8cbd893905b8015f7999d2 (patch)
treea0732153ffb82ba37bcaffdcaa824d8b18ca2ac1
parent6e983f35b4ecfb5fb9a5a9860701e9a85a038977 (diff)
downloadllvm-c1e634da0c4015d9db8cbd893905b8015f7999d2.tar.gz
llvm-c1e634da0c4015d9db8cbd893905b8015f7999d2.tar.bz2
llvm-c1e634da0c4015d9db8cbd893905b8015f7999d2.tar.xz
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202716 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp4
-rw-r--r--test/MC/Mips/mips64eb-fixups.s43
2 files changed, 47 insertions, 0 deletions
diff --git a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
index da332378bb..dfaa4db50d 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 0000000000..1ca8b0ae52
--- /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: ]