mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
[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
This commit is contained in:
parent
f3e8d64a87
commit
d0514764e5
@ -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,
|
||||
|
150
test/tools/llvm-xray/ARM/extract-instrmap.test
Normal file
150
test/tools/llvm-xray/ARM/extract-instrmap.test
Normal file
@ -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: ...
|
@ -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.
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user