From 8e59427e3ac10c7d331b18cd49a72ea56988f57e Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Mon, 6 Oct 2014 07:02:58 +0000 Subject: [PATCH] Add support for ARM and AArch64 big endian objects to RelocVisitor. Patch by Charlie Turner. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219109 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/RelocVisitor.h | 17 +++++++++++++---- test/DebugInfo/AArch64/big-endian-dump.ll | 14 ++++++++++++++ test/DebugInfo/ARM/big-endian-dump.ll | 16 ++++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 test/DebugInfo/AArch64/big-endian-dump.ll create mode 100644 test/DebugInfo/ARM/big-endian-dump.ll diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index c30699f511e..9eb768daa0a 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -304,7 +304,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. @@ -315,7 +316,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); } @@ -352,8 +354,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/DebugInfo/AArch64/big-endian-dump.ll b/test/DebugInfo/AArch64/big-endian-dump.ll new file mode 100644 index 00000000000..7b48fa243c2 --- /dev/null +++ b/test/DebugInfo/AArch64/big-endian-dump.ll @@ -0,0 +1,14 @@ +; RUN: llc -O0 -filetype=obj -mtriple=aarch64_be-none-linux < %s | llvm-dwarfdump - + +target datalayout = "E-m:e-i64:64-i128:128-n32:64-S128" + +!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/DebugInfo/ARM/big-endian-dump.ll b/test/DebugInfo/ARM/big-endian-dump.ll new file mode 100644 index 00000000000..5b157b4a556 --- /dev/null +++ b/test/DebugInfo/ARM/big-endian-dump.ll @@ -0,0 +1,16 @@ +; RUN: llc -O0 -filetype=obj -mtriple=armeb-none-linux < %s | llvm-dwarfdump - + +target datalayout = "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" + +!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.34.1