aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Object/RelocVisitor.h30
-rw-r--r--test/DebugInfo/Inputs/dwarfdump-test.elf-aarch64bin0 -> 3360 bytes
-rw-r--r--test/DebugInfo/dwarfdump-aarch64.test16
3 files changed, 46 insertions, 0 deletions
diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h
index edac89914d..2dcbdf9053 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<uint32_t>(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 0000000000..f5079687c9
--- /dev/null
+++ b/test/DebugInfo/Inputs/dwarfdump-test.elf-aarch64
Binary files differ
diff --git a/test/DebugInfo/dwarfdump-aarch64.test b/test/DebugInfo/dwarfdump-aarch64.test
new file mode 100644
index 0000000000..2f7bc47795
--- /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)