<div dir="ltr">Looks like this change has caused a bunch of buildbot failures. For example:<div><br></div><div><a href="http://lab.llvm.org:8011/builders/ppc64le-lld-multistage-test/builds/9676">http://lab.llvm.org:8011/builders/ppc64le-lld-multistage-test/builds/9676</a><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 28 May 2020 at 15:44, Ian Levesque via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Ian Levesque<br>
Date: 2020-05-28T18:41:11-04:00<br>
New Revision: e62d67f770d279d0ef7e6f1175e0a88aaffd58b0<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/e62d67f770d279d0ef7e6f1175e0a88aaffd58b0" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/e62d67f770d279d0ef7e6f1175e0a88aaffd58b0</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/e62d67f770d279d0ef7e6f1175e0a88aaffd58b0.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/e62d67f770d279d0ef7e6f1175e0a88aaffd58b0.diff</a><br>
<br>
LOG: [xray] Add llvm-xray extract support for 32 bit ARM<br>
<br>
Summary:<br>
XRay works on 32-bit ARM but extract didn't support it.<br>
<br>
See also another previous attempt in D77858.<br>
<br>
Reviewers: MaskRay, dberris, johnislarry<br>
<br>
Subscribers: kristof.beyls, hiraditya, danielkiss, llvm-commits<br>
<br>
Tags: #llvm<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D80185" rel="noreferrer" target="_blank">https://reviews.llvm.org/D80185</a><br>
<br>
Added: <br>
llvm/test/tools/llvm-xray/ARM/extract-instrmap.test<br>
<br>
Modified: <br>
llvm/lib/XRay/InstrumentationMap.cpp<br>
llvm/test/tools/llvm-xray/X86/bad-instrmap-sizes.txt<br>
llvm/test/tools/llvm-xray/X86/unsupported-elf32.txt<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff --git a/llvm/lib/XRay/InstrumentationMap.cpp b/llvm/lib/XRay/InstrumentationMap.cpp<br>
index 9db9692c1f9e..de0a9e60a511 100644<br>
--- a/llvm/lib/XRay/InstrumentationMap.cpp<br>
+++ b/llvm/lib/XRay/InstrumentationMap.cpp<br>
@@ -61,6 +61,7 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile,<br>
if ((!ObjFile.getBinary()->isELF() && !ObjFile.getBinary()->isMachO()) ||<br>
!(ObjFile.getBinary()->getArch() == Triple::x86_64 ||<br>
ObjFile.getBinary()->getArch() == Triple::ppc64le ||<br>
+ ObjFile.getBinary()->getArch() == Triple::arm ||<br>
ObjFile.getBinary()->getArch() == Triple::aarch64))<br>
return make_error<StringError>(<br>
"File format not supported (only does ELF and Mach-O little endian "<br>
@@ -115,7 +116,14 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile,<br>
<br>
for (const object::SectionRef &Section : Sections) {<br>
for (const object::RelocationRef &Reloc : Section.relocations()) {<br>
- if (SupportsRelocation && SupportsRelocation(Reloc.getType())) {<br>
+ if (ObjFile.getBinary()->getArch() == Triple::arm) {<br>
+ if (SupportsRelocation && SupportsRelocation(Reloc.getType())) {<br>
+ Expected<uint64_t> ValueOrErr = Reloc.getSymbol()->getValue();<br>
+ if (!ValueOrErr)<br>
+ return ValueOrErr.takeError();<br>
+ Relocs.insert({Reloc.getOffset(), Resolver(Reloc, *ValueOrErr, 0)});<br>
+ }<br>
+ } else if (SupportsRelocation && SupportsRelocation(Reloc.getType())) {<br>
auto AddendOrErr = object::ELFRelocationRef(Reloc).getAddend();<br>
auto A = AddendOrErr ? *AddendOrErr : 0;<br>
Expected<uint64_t> ValueOrErr = Reloc.getSymbol()->getValue();<br>
@@ -133,12 +141,13 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile,<br>
<br>
// Copy the instrumentation map data into the Sleds data structure.<br>
auto C = Contents.bytes_begin();<br>
- static constexpr size_t ELF64SledEntrySize = 32;<br>
+ bool Is32Bit = ObjFile.getBinary()->makeTriple().isArch32Bit();<br>
+ size_t ELFSledEntrySize = Is32Bit ? 16 : 32;<br>
<br>
- if ((C - Contents.bytes_end()) % ELF64SledEntrySize != 0)<br>
+ if ((C - Contents.bytes_end()) % ELFSledEntrySize != 0)<br>
return make_error<StringError>(<br>
Twine("Instrumentation map entries not evenly divisible by size of "<br>
- "an XRay sled entry in ELF64."),<br>
+ "an XRay sled entry."),<br>
std::make_error_code(std::errc::executable_format_error));<br>
<br>
auto RelocateOrElse = [&](uint64_t Offset, uint64_t Address) {<br>
@@ -151,20 +160,26 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile,<br>
return Address;<br>
};<br>
<br>
- const int WordSize = 8;<br>
+ const int WordSize = Is32Bit ? 4 : 8;<br>
int32_t FuncId = 1;<br>
uint64_t CurFn = 0;<br>
- for (; C != Contents.bytes_end(); C += ELF64SledEntrySize) {<br>
+ for (; C != Contents.bytes_end(); C += ELFSledEntrySize) {<br>
DataExtractor Extractor(<br>
- StringRef(reinterpret_cast<const char *>(C), ELF64SledEntrySize), true,<br>
+ StringRef(reinterpret_cast<const char *>(C), ELFSledEntrySize), true,<br>
8);<br>
Sleds.push_back({});<br>
auto &Entry = Sleds.back();<br>
uint64_t OffsetPtr = 0;<br>
uint64_t AddrOff = OffsetPtr;<br>
- Entry.Address = RelocateOrElse(AddrOff, Extractor.getU64(&OffsetPtr));<br>
+ if (Is32Bit)<br>
+ Entry.Address = RelocateOrElse(AddrOff, Extractor.getU32(&OffsetPtr));<br>
+ else<br>
+ Entry.Address = RelocateOrElse(AddrOff, Extractor.getU64(&OffsetPtr));<br>
uint64_t FuncOff = OffsetPtr;<br>
- Entry.Function = RelocateOrElse(FuncOff, Extractor.getU64(&OffsetPtr));<br>
+ if (Is32Bit)<br>
+ Entry.Function = RelocateOrElse(FuncOff, Extractor.getU32(&OffsetPtr));<br>
+ else<br>
+ Entry.Function = RelocateOrElse(FuncOff, Extractor.getU64(&OffsetPtr));<br>
auto Kind = Extractor.getU8(&OffsetPtr);<br>
static constexpr SledEntry::FunctionKinds Kinds[] = {<br>
SledEntry::FunctionKinds::ENTRY, SledEntry::FunctionKinds::EXIT,<br>
<br>
diff --git a/llvm/test/tools/llvm-xray/ARM/extract-instrmap.test b/llvm/test/tools/llvm-xray/ARM/extract-instrmap.test<br>
new file mode 100644<br>
index 000000000000..79f743f1dbde<br>
--- /dev/null<br>
+++ b/llvm/test/tools/llvm-xray/ARM/extract-instrmap.test<br>
@@ -0,0 +1,150 @@<br>
+## This test makes sure we can extract the instrumentation map from an<br>
+## XRay-instrumented PIE file.<br>
+<br>
+## Generated from the following source:<br>
+## __attribute__((xray_always_instrument)) void foo() {}<br>
+## __attribute__((xray_always_instrument)) void bar() {}<br>
+## __attribute__((xray_always_instrument)) void jar() {}<br>
+## Built with the following arguments:<br>
+## -target armv7a-linux-androideabi -nostdlib -fxray-instrument -fPIC -shared<br>
+<br>
+--- !ELF<br>
+FileHeader:<br>
+ Class: ELFCLASS32<br>
+ Data: ELFDATA2LSB<br>
+ Type: ET_DYN<br>
+ Machine: EM_ARM<br>
+ Flags: [ EF_ARM_SOFT_FLOAT, EF_ARM_EABI_VER5 ]<br>
+ Entry: 0x00000000000012B0<br>
+ProgramHeaders:<br>
+ - Type: PT_LOAD<br>
+ Flags: [ PF_R ]<br>
+ Sections:<br>
+ - Section: .rel.dyn<br>
+ Align: 0x0000000000001000<br>
+ - Type: PT_LOAD<br>
+ Flags: [ PF_X, PF_R ]<br>
+ Sections:<br>
+ - Section: .text<br>
+ VAddr: 0x00000000000012B0<br>
+ Align: 0x0000000000001000<br>
+ - Type: PT_LOAD<br>
+ Flags: [ PF_W, PF_R ]<br>
+ Sections:<br>
+ - Section: xray_instr_map<br>
+ - Section: xray_fn_idx<br>
+ VAddr: 0x00000000000033CC<br>
+ Align: 0x0000000000001000<br>
+Sections:<br>
+ - Name: .rel.dyn<br>
+ Type: SHT_REL<br>
+ Flags: [ SHF_ALLOC ]<br>
+ Address: 0x0000000000000200<br>
+ Link: .dynsym<br>
+ AddressAlign: 0x0000000000000004<br>
+ Relocations:<br>
+ - Offset: 0x00000000000033CC<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x00000000000033DC<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x00000000000033EC<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x00000000000033FC<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x000000000000340C<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x000000000000341C<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x0000000000003430<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x0000000000003434<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x0000000000003438<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x000000000000343C<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x0000000000003440<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x0000000000003444<br>
+ Type: R_ARM_RELATIVE<br>
+ - Offset: 0x00000000000033F0<br>
+ Symbol: _Z3barv<br>
+ Type: R_ARM_ABS32<br>
+ - Offset: 0x0000000000003400<br>
+ Symbol: _Z3barv<br>
+ Type: R_ARM_ABS32<br>
+ - Offset: 0x00000000000033D0<br>
+ Symbol: _Z3foov<br>
+ Type: R_ARM_ABS32<br>
+ - Offset: 0x00000000000033E0<br>
+ Symbol: _Z3foov<br>
+ Type: R_ARM_ABS32<br>
+ - Offset: 0x0000000000003410<br>
+ Symbol: _Z3jarv<br>
+ Type: R_ARM_ABS32<br>
+ - Offset: 0x0000000000003420<br>
+ Symbol: _Z3jarv<br>
+ Type: R_ARM_ABS32<br>
+ - Name: .text<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]<br>
+ Address: 0x00000000000012B0<br>
+ AddressAlign: 0x0000000000000004<br>
+ Size: 180<br>
+ - Name: xray_instr_map<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_LINK_ORDER ]<br>
+ Address: 0x00000000000033CC<br>
+ Link: .text<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: B0120000000000000001000000000000CC120000000000000101000000000000EC120000000000000001000000000000081300000000000001010000000000002813000000000000000100000000000044130000000000000101000000000000<br>
+ - Name: xray_fn_idx<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_LINK_ORDER ]<br>
+ Address: 0x0000000000003430<br>
+ Link: .text<br>
+ AddressAlign: 0x0000000000000008<br>
+ Content: CC330000EC330000EC3300000C3400000C3400002C340000<br>
+DynamicSymbols:<br>
+ - Name: _Z3barv<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+ Binding: STB_GLOBAL<br>
+ Value: 0x00000000000012EC<br>
+ Size: 0x000000000000003C<br>
+ - Name: _Z3foov<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+ Binding: STB_GLOBAL<br>
+ Value: 0x00000000000012B0<br>
+ Size: 0x000000000000003C<br>
+ - Name: _Z3jarv<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+ Binding: STB_GLOBAL<br>
+ Value: 0x0000000000001328<br>
+ Size: 0x000000000000003C<br>
+...<br>
+<br>
+# RUN: yaml2obj %s -o %t.so<br>
+# RUN: llvm-xray extract %t.so -s | FileCheck %s<br>
+<br>
+# CHECK: ---<br>
+# CHECK-NEXT: - { id: 1, address: 0x00000000000012B0, function: 0x00000000000012B0, kind: function-enter, always-instrument: true, function-name: 'foo()' }<br>
+# CHECK-NEXT: - { id: 1, address: 0x00000000000012CC, function: 0x00000000000012B0, kind: function-exit, always-instrument: true, function-name: 'foo()' }<br>
+# CHECK-NEXT: - { id: 2, address: 0x00000000000012EC, function: 0x00000000000012EC, kind: function-enter, always-instrument: true, function-name: 'bar()' }<br>
+# CHECK-NEXT: - { id: 2, address: 0x0000000000001308, function: 0x00000000000012EC, kind: function-exit, always-instrument: true, function-name: 'bar()' }<br>
+# CHECK-NEXT: - { id: 3, address: 0x0000000000001328, function: 0x0000000000001328, kind: function-enter, always-instrument: true, function-name: 'jar()' }<br>
+# CHECK-NEXT: - { id: 3, address: 0x0000000000001344, function: 0x0000000000001328, kind: function-exit, always-instrument: true, function-name: 'jar()' }<br>
+# CHECK-NEXT: ...<br>
+<br>
+# RUN: llvm-xray extract -s --no-demangle %t.so | FileCheck --check-prefix=MANGLED %s<br>
+<br>
+# MANGLED: ---<br>
+# MANGLED-NEXT: - { id: 1, address: 0x00000000000012B0, function: 0x00000000000012B0, kind: function-enter, always-instrument: true, function-name: _Z3foov }<br>
+# MANGLED-NEXT: - { id: 1, address: 0x00000000000012CC, function: 0x00000000000012B0, kind: function-exit, always-instrument: true, function-name: _Z3foov }<br>
+# MANGLED-NEXT: - { id: 2, address: 0x00000000000012EC, function: 0x00000000000012EC, kind: function-enter, always-instrument: true, function-name: _Z3barv }<br>
+# MANGLED-NEXT: - { id: 2, address: 0x0000000000001308, function: 0x00000000000012EC, kind: function-exit, always-instrument: true, function-name: _Z3barv }<br>
+# MANGLED-NEXT: - { id: 3, address: 0x0000000000001328, function: 0x0000000000001328, kind: function-enter, always-instrument: true, function-name: _Z3jarv }<br>
+# MANGLED-NEXT: - { id: 3, address: 0x0000000000001344, function: 0x0000000000001328, kind: function-exit, always-instrument: true, function-name: _Z3jarv }<br>
+# MANGLED-NEXT: ...<br>
<br>
diff --git a/llvm/test/tools/llvm-xray/X86/bad-instrmap-sizes.txt b/llvm/test/tools/llvm-xray/X86/bad-instrmap-sizes.txt<br>
index 4ea33510e5dc..0c574461fda1 100644<br>
--- a/llvm/test/tools/llvm-xray/X86/bad-instrmap-sizes.txt<br>
+++ b/llvm/test/tools/llvm-xray/X86/bad-instrmap-sizes.txt<br>
@@ -1,3 +1,3 @@<br>
; RUN: not llvm-xray extract %S/Inputs/elf64-badentrysizes.bin 2>&1 | FileCheck %s<br>
; CHECK: llvm-xray: Cannot extract instrumentation map from '{{.*}}elf64-badentrysizes.bin'.<br>
-; CHECK-NEXT: Instrumentation map entries not evenly divisible by size of an XRay sled entry in ELF64.<br>
+; CHECK-NEXT: Instrumentation map entries not evenly divisible by size of an XRay sled entry.<br>
<br>
diff --git a/llvm/test/tools/llvm-xray/X86/unsupported-elf32.txt b/llvm/test/tools/llvm-xray/X86/unsupported-elf32.txt<br>
index 1fc3a1a08287..dc025d96956b 100644<br>
--- a/llvm/test/tools/llvm-xray/X86/unsupported-elf32.txt<br>
+++ b/llvm/test/tools/llvm-xray/X86/unsupported-elf32.txt<br>
@@ -1,3 +1,3 @@<br>
; RUN: not llvm-xray extract %S/Inputs/elf32-noxray.bin 2>&1 | FileCheck %s<br>
; CHECK: llvm-xray: Cannot extract instrumentation map from '{{.*}}elf32-noxray.bin'.<br>
-; CHECK-NEXT: File format not supported (only does ELF and Mach-O little endian 64-bit).<br>
+; CHECK-NEXT: File format not supported. Supports: AArch64/ARM/ppc64le/x86-64.<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>