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