From bc7101b134cbd66a9e2ef1edfd56fe4ec24e5e1c Mon Sep 17 00:00:00 2001 From: Renato Golin Date: Wed, 24 Sep 2014 20:07:30 +0000 Subject: [PATCH] Add support for ARM and AArch64 BE object files 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 --- include/llvm/Object/RelocVisitor.h | 17 +++++++++++++---- .../llvm-dwarfdump/AArch64/big-endian-dump.ll | 16 ++++++++++++++++ .../tools/llvm-dwarfdump/AArch64/lit.local.cfg | 2 ++ .../llvm-dwarfdump/ARM/big-endian-dump.ll | 18 ++++++++++++++++++ test/tools/llvm-dwarfdump/ARM/lit.local.cfg | 2 ++ 5 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 test/tools/llvm-dwarfdump/AArch64/big-endian-dump.ll create mode 100644 test/tools/llvm-dwarfdump/AArch64/lit.local.cfg create mode 100644 test/tools/llvm-dwarfdump/ARM/big-endian-dump.ll create mode 100644 test/tools/llvm-dwarfdump/ARM/lit.local.cfg diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index 36852f21b51..0e99f368b48 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -306,7 +306,8 @@ private: // 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. @@ -317,7 +318,8 @@ private: } 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); } @@ -354,8 +356,15 @@ private: } 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(Res), 4); } }; diff --git a/test/tools/llvm-dwarfdump/AArch64/big-endian-dump.ll b/test/tools/llvm-dwarfdump/AArch64/big-endian-dump.ll new file mode 100644 index 00000000000..7c1524e02b5 --- /dev/null +++ b/test/tools/llvm-dwarfdump/AArch64/big-endian-dump.ll @@ -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 "} diff --git a/test/tools/llvm-dwarfdump/AArch64/lit.local.cfg b/test/tools/llvm-dwarfdump/AArch64/lit.local.cfg new file mode 100644 index 00000000000..7184443994b --- /dev/null +++ b/test/tools/llvm-dwarfdump/AArch64/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'AArch64' in config.root.targets: + config.unsupported = True diff --git a/test/tools/llvm-dwarfdump/ARM/big-endian-dump.ll b/test/tools/llvm-dwarfdump/ARM/big-endian-dump.ll new file mode 100644 index 00000000000..b7f962d5f16 --- /dev/null +++ b/test/tools/llvm-dwarfdump/ARM/big-endian-dump.ll @@ -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 "} diff --git a/test/tools/llvm-dwarfdump/ARM/lit.local.cfg b/test/tools/llvm-dwarfdump/ARM/lit.local.cfg new file mode 100644 index 00000000000..236e1d34416 --- /dev/null +++ b/test/tools/llvm-dwarfdump/ARM/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'ARM' in config.root.targets: + config.unsupported = True -- 2.34.1