[PATCH] D23988: [compiler-rt][XRay] Support tail call sleds

Serge Rogatch via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 27 12:53:26 PDT 2016


rSerge added a comment.

I've tried seemingly the same approach on ARM with the following program:

  #include <cstdio>
  #include <cassert>
  #include <xray/xray_interface.h>
  
  [[clang::xray_always_instrument]] void __attribute__ ((noinline)) fC() { 
    std::printf("In fC()\n");
  }
  
  [[clang::xray_always_instrument]] void __attribute__ ((noinline)) fB() { 
    std::printf("In fB()\n");
    fC();
  }
  
  [[clang::xray_always_instrument]] void __attribute__ ((noinline)) fA() { 
    std::printf("In fA()\n");
    fB();
  }
  
  // Avoid infinite recursion in case the logging function is instrumented (so calls logging
  //   function again).
  [[clang::xray_never_instrument]] void simplyPrint(int32_t functionId, XRayEntryType xret)
  {
    printf("XRay: functionId=%d type=%d.\n", int(functionId), int(xret));
  }
  
  int main(int argc, char* argv[]) {
    __xray_set_handler(simplyPrint);
  
    printf("Patching...\n");
    __xray_patch();
    fA();
  
    printf("Unpatching...\n");
    __xray_unpatch();       
    fA();
  
    return 0;
  }

For me it gives the following results

  Patching...
  XRay: functionId=3 type=0.
  In fA()
  XRay: functionId=3 type=1.
  XRay: functionId=2 type=0.
  In fB()
  XRay: functionId=2 type=1.
  XRay: functionId=1 type=0.
  XRay: functionId=1 type=1.
  In fC()
  Unpatching...
  In fA()
  In fB()
  In fC()

So for function `fC()` the exit sled seems to be called too much before function exit: before printing `In Ff()`. I compiled with the following generic flags: `-O3 -g -fxray-instrument -Wall -std=c++14  -ffunction-sections -fdata-sections` (this list doesn't include my specific flags like `--target=armv7-linux-gnueabihf` etc.).

Does the code snippet work correctly for you on x86_64? Or is the above output expected?


https://reviews.llvm.org/D23988





More information about the llvm-commits mailing list