<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>