[llvm] e62d67f - [xray] Add llvm-xray extract support for 32 bit ARM

Richard Smith via llvm-commits llvm-commits at lists.llvm.org
Thu May 28 17:27:01 PDT 2020


Looks like this change has caused a bunch of buildbot failures. For example:

http://lab.llvm.org:8011/builders/ppc64le-lld-multistage-test/builds/9676

On Thu, 28 May 2020 at 15:44, Ian Levesque via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

>
> 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.
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200528/e6893017/attachment.html>


More information about the llvm-commits mailing list