From b05dc5546062f29bf08837db8f680879aa1c14cf Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Mon, 11 Feb 2013 11:16:02 +0000 Subject: [PATCH] AArch64: Add basic relocation processing for llvm-dwarfdump. This allows llvm-dwarfdump to handle the relocations needed, at least for LLVM-produced code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174874 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/RelocVisitor.h | 30 ++++++++++++++++++ .../Inputs/dwarfdump-test.elf-aarch64 | Bin 0 -> 3360 bytes test/DebugInfo/dwarfdump-aarch64.test | 16 ++++++++++ 3 files changed, 46 insertions(+) create mode 100644 test/DebugInfo/Inputs/dwarfdump-test.elf-aarch64 create mode 100644 test/DebugInfo/dwarfdump-aarch64.test diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index edac89914d8..2dcbdf90532 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -92,6 +92,16 @@ public: HasError = true; return RelocToApply(); } + } else if (FileFormat == "ELF64-aarch64") { + switch (RelocType) { + case llvm::ELF::R_AARCH64_ABS32: + return visitELF_AARCH64_ABS32(R, Value); + case llvm::ELF::R_AARCH64_ABS64: + return visitELF_AARCH64_ABS64(R, Value); + default: + HasError = true; + return RelocToApply(); + } } HasError = true; return RelocToApply(); @@ -172,6 +182,26 @@ private: uint32_t Res = (Value + Addend) & 0xFFFFFFFF; return RelocToApply(Res, 4); } + + // AArch64 ELF + RelocToApply visitELF_AARCH64_ABS32(RelocationRef R, uint64_t Value) { + int64_t Addend; + R.getAdditionalInfo(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); + } + + RelocToApply visitELF_AARCH64_ABS64(RelocationRef R, uint64_t Value) { + int64_t Addend; + R.getAdditionalInfo(Addend); + return RelocToApply(Value + Addend, 8); + } + }; } diff --git a/test/DebugInfo/Inputs/dwarfdump-test.elf-aarch64 b/test/DebugInfo/Inputs/dwarfdump-test.elf-aarch64 new file mode 100644 index 0000000000000000000000000000000000000000..f5079687c9830928754115f3cf71d8a104b2e659 GIT binary patch literal 3360 zcmbtW&2L*p5TErrZ5pR;5~rmhrM8fxLPej`CKS>_v8onPDObb+BcXfK)?lYXf7N}!~rD4AAp1qQZJ4W_i{ui3N!m=ob~!4R2b>)&iv+UclPUj zaDDyFgi@2hq~H-K5v=}6;y@@Gwg@L61N%R~PkVP05BKgvf1tBx2U*w|EW*xi1^Vdn z0B!qd{_$^%#hqQP&k}YOu|W#{9O%S0>2`H?dvKU!wY_)u>O+j#|6Z4VS*pTPbqY4n zCdxi(MmCM|I2jA2tK%9_P3@vd0#uT$6a6iK36dw0pk~!lIy0fuvufthVj8uc(&<_ryHfRvLcmX6|;-?bX|@+={o7W2eGKyBQS1db8kP zTs;?dH(R#~<;{AddafHZpy}6JP;Z6co8Umj+DB5L?wy{_LOz0r?R(5!o6au3HT~So z7m3eJZNRGr<;|NVzg+GHx52~Mz83~tA$a9pPqdxQa(Jf`3}wHIgFX;PrC!(-zouWQ zw`y$;8)X^;8ueB%Vo~e*O++H|M!N!DZv%sdei=FG?=+2E^+O+>+tictymx*$=l{dZ zqcg4IAty+YWvQpAqhg8#a12=&Bkc>cV~`$19Y`KIm?s(k4tvV)?&!~0?{;pkXVHLS z{#XAW(U_GLSHFE1m zYBwfAaE!rq5-f6U3#fB3GJiJ?jIn(u274O+d;j8pg@Re+4(ol?#ntauzEx$PQT?c- zZv8$*%#DcOYI0_{+L{g_wJG5rUKaiu_E1Meej7p>Fu#Sauyw)M4du z)IEcroBwOX;_?sh@guq(b;H)pKU6pj*(KqReFug!1~AX_i0UOHxwkMtbj!=A4_q!9 zmTuosx@<(M^e7dL$d`(xik2yURyuZPQN7|SMtIy#AbfnjGz2~N>O=$6!&R~dYV41U z0xW6Z#d5UToOlOBQNz)3(BSxk6hqp)a^ngOGvgp4+U)dE6}=;KRz2lirIm_{lKTgo zf11p1QGUx?hEl2CYgg9RO1+BTszIlVKT9>pSMmP)plt+8HkS;uP*E@NGHaIt@zamia`IdJgT XSbmXv$;;xfCKTs{fY{3#x%PhpN&40c literal 0 HcmV?d00001 diff --git a/test/DebugInfo/dwarfdump-aarch64.test b/test/DebugInfo/dwarfdump-aarch64.test new file mode 100644 index 00000000000..2f7bc477954 --- /dev/null +++ b/test/DebugInfo/dwarfdump-aarch64.test @@ -0,0 +1,16 @@ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-aarch64 \ +RUN: | FileCheck %s + +We're mostly checking that relocations are applied correctly +here. Currently R_AARCH64_ABS32 is used for references to debug data +and R_AARCH64_ABS64 is used for program addresses. + +A couple of ABS32s, both at 0 and elsewhere, interpreted correctly: + +CHECK: DW_AT_producer [DW_FORM_strp] ( .debug_str[0x00000000] = "clang version 3.3 ") +CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000013] = "tmp.c") + +A couple of ABS64s similarly: + +CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +CHECK: DW_AT_high_pc [DW_FORM_addr] (0x000000000000005c)