[llvm-dev] XRay: Demo on x86_64/Linux almost done; some questions.

Serge Rogatch via llvm-dev llvm-dev at lists.llvm.org
Fri Aug 5 11:06:58 PDT 2016


Hi Dean,

I have a question for 32-bit platforms. I see in the code that you used the
following in compiler-rt/trunk/lib/xray/xray_interface_internal.h :
struct XRaySledEntry {
  uint64_t Address;
  uint64_t Function;
  unsigned char Kind;
  unsigned char AlwaysInstrument;
  unsigned char Padding[14]; // Need 32 bytes
};

And the peer code in llvm/trunk/lib/Target/X86/X86MCInstLower.cpp :

void X86AsmPrinter::EmitXRayTable() {
  if (Sleds.empty())
    return;
  if (Subtarget->isTargetELF()) {
    auto *Section = OutContext.getELFSection(
        "xray_instr_map", ELF::SHT_PROGBITS,
        ELF::SHF_ALLOC | ELF::SHF_GROUP | ELF::SHF_MERGE, 0,
        CurrentFnSym->getName());
    auto PrevSection = OutStreamer->getCurrentSectionOnly();
    OutStreamer->SwitchSection(Section);
    for (const auto &Sled : Sleds) {
      OutStreamer->EmitSymbolValue(Sled.Sled, 8);
      OutStreamer->EmitSymbolValue(CurrentFnSym, 8);
      auto Kind = static_cast<uint8_t>(Sled.Kind);
      OutStreamer->EmitBytes(
          StringRef(reinterpret_cast<const char *>(&Kind), 1));
      OutStreamer->EmitBytes(
          StringRef(reinterpret_cast<const char *>(&Sled.AlwaysInstrument),
1));
      OutStreamer->EmitZeros(14);
    }
    OutStreamer->SwitchSection(PrevSection);
  }
  Sleds.clear();
}

So useful part of your entry is 18 bytes, and you add 14 bytes of padding
to achieve 32-byte alignment. But for 32-bit CPUs I understood that
XRaySledEntry::Address and XRaySledEntry::Function can be 32-bit too,
right? So the entry can fit 16 bytes, with 10 useful bytes and 6 bytes of
padding. Can I use 16-byte entries or is there some external (OS? ELF?
Linker?) requirement that one entry must be 32-bytes, or aligned at 32
bytes, etc.?

Thanks,
Serge

On 4 August 2016 at 19:29, Serge Rogatch <serge.rogatch at gmail.com> wrote:

> Yes, double-checking on the handler side whether its resources are still
> operational, e.g. by calling weak_ptr::lock() may be a better idea than
> elimination of spurious handler calls in XRay at a cost of heavy
> synchronization objects. Ok, let's live with spurious handler calls.
>
> Cheers,
> Serge
>
> On 4 August 2016 at 10:57, Dean Michael Berris <dean.berris at gmail.com>
> wrote:
>
>>
>> > On 4 Aug 2016, at 06:27, Serge Rogatch <serge.rogatch at gmail.com> wrote:
>> >
>> > Hi Dean,
>> >
>> > I have a question about the following piece of code in
>> compiler-rt/trunk/lib/xray/xray_trampoline_x86.S :
>> >   movq  _ZN6__xray19XRayPatchedFunctionE(%rip), %rax
>> >   testq  %rax, %rax
>> >   je  .Ltmp0
>> >
>> >   // assume that %r10d has the function id.
>> >   movl  %r10d, %edi
>> >   xor  %esi,%esi
>> >   callq  *%rax
>> > What happens if someone unsets the handler function (i.e. calls
>> __xray_remove_handler() ) or changes the handler (i.e. calls
>> __xray_set_handler() with a different pointer to function) between "movq
>> _ZN6__xray19XRayPatchedFunctionE(%rip), %rax" and "callq  *%rax" ? I
>> understood that the old handler will still be called, but isn't it a
>> problem? What if the code removing the handler starts destructing some
>> objects after that, so that a handler call would result in a crash or other
>> bad things?
>>
>> That would be unfortunate. :)
>>
>> Yes, you're right, it will be called despite having the handler be un-set
>> from the global atomic. Though I'd suggest that log handler implementations
>> really shouldn't be crashing, and should assume that it will be called at
>> any given time (from multiple threads, so it should also be thread-safe).
>> Consider also that we're taking a function pointer by design -- assuming
>> that it will be a pointer to a function that will only deal with globals
>> and the explicitly passed in arguments.
>>
>> An implementer of the log handler should really be responsible for
>> "internal signalling" -- i.e. implementing it so that any required
>> synchronisation happens internally.
>>
>> Does this help?
>>
>> PS. I think more definitive documentation for this is due, let me think
>> about putting something some documentation on how to use XRay as it is
>> currently implemented once we have the naive in-memory logging
>> implementation land (https://reviews.llvm.org/D21982).
>>
>> Cheers
>>
>> -- Dean
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160805/bc3f9f0b/attachment.html>


More information about the llvm-dev mailing list