Skip to content

Commit

Permalink
Add support for ARM and AArch64 BE object files
Browse files Browse the repository at this point in the history
This change fixes the ARM and AArch64 relocation visitors in
RelocVisitor.  They were unconditionally assuming the object data are
little-endian.  Tests have been added to ensure that the
llvm-dwarfdump utility does not crash when processing big-endian
object files.

Patch by Charlie Turner.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218407 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rengolin committed Sep 24, 2014
1 parent c0104e4 commit bc7101b
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 4 deletions.
17 changes: 13 additions & 4 deletions include/llvm/Object/RelocVisitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,8 @@ class RelocVisitor {

// AArch64 ELF
RelocToApply visitELF_AARCH64_ABS32(RelocationRef R, uint64_t Value) {
int64_t Addend = getAddend64LE(R);
int64_t Addend;
getELFRelocationAddend(R, Addend);
int64_t Res = Value + Addend;

// Overflow check allows for both signed and unsigned interpretation.
Expand All @@ -317,7 +318,8 @@ class RelocVisitor {
}

RelocToApply visitELF_AARCH64_ABS64(RelocationRef R, uint64_t Value) {
int64_t Addend = getAddend64LE(R);
int64_t Addend;
getELFRelocationAddend(R, Addend);
return RelocToApply(Value + Addend, 8);
}

Expand Down Expand Up @@ -354,8 +356,15 @@ class RelocVisitor {
}

RelocToApply visitELF_ARM_ABS32(RelocationRef R, uint64_t Value) {
int64_t Addend = getAddend32LE(R);
return RelocToApply(Value + Addend, 4);
int64_t Addend;
getELFRelocationAddend(R, Addend);
int64_t Res = Value + Addend;

// Overflow check allows for both signed and unsigned interpretation.
if (Res < INT32_MIN || Res > UINT32_MAX)
HasError = true;

return RelocToApply(static_cast<uint32_t>(Res), 4);
}

};
Expand Down
16 changes: 16 additions & 0 deletions test/tools/llvm-dwarfdump/AArch64/big-endian-dump.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
; RUN: llc -O0 -filetype=obj -o %t1 < %s
; RUN: llvm-dwarfdump %t1

target datalayout = "E-m:e-i64:64-i128:128-n32:64-S128"
target triple = "aarch64_be-none--eabi"

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4}
!llvm.ident = !{!5}

!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.6.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/a/empty.c] [DW_LANG_C99]
!1 = metadata !{metadata !"empty.c", metadata !"/a"}
!2 = metadata !{}
!3 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
!4 = metadata !{i32 2, metadata !"Debug Info Version", i32 1}
!5 = metadata !{metadata !"clang version 3.6.0 "}
2 changes: 2 additions & 0 deletions test/tools/llvm-dwarfdump/AArch64/lit.local.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
if not 'AArch64' in config.root.targets:
config.unsupported = True
18 changes: 18 additions & 0 deletions test/tools/llvm-dwarfdump/ARM/big-endian-dump.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
; RUN: llc -O0 -filetype=obj -o %t1 < %s
; RUN: llvm-dwarfdump %t1

target datalayout = "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64"
target triple = "armebv8-none--eabi"

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4, !5, !6}
!llvm.ident = !{!7}

!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.6.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/a/empty.c] [DW_LANG_C99]
!1 = metadata !{metadata !"empty.c", metadata !"/a"}
!2 = metadata !{}
!3 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
!4 = metadata !{i32 2, metadata !"Debug Info Version", i32 1}
!5 = metadata !{i32 1, metadata !"wchar_size", i32 4}
!6 = metadata !{i32 1, metadata !"min_enum_size", i32 4}
!7 = metadata !{metadata !"clang version 3.6.0 "}
2 changes: 2 additions & 0 deletions test/tools/llvm-dwarfdump/ARM/lit.local.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
if not 'ARM' in config.root.targets:
config.unsupported = True

0 comments on commit bc7101b

Please sign in to comment.