diff options
author | Dean Michael Berris <dberris@google.com> | 2017-06-19 03:52:25 +0000 |
---|---|---|
committer | Dean Michael Berris <dberris@google.com> | 2017-06-19 03:52:25 +0000 |
commit | 366176ff1bf74e8fe330cdc5b712845b94650078 (patch) | |
tree | c5d7bd1b898661e052c63276b888fe9267595adc /test/xray | |
parent | 028649d48d70b36ab6226c81cba4e76936ca9bd1 (diff) |
[XRay][compiler-rt][NFC] Add a test for both arg1 and arg0 handling in the same binary
This test makes sure we can handle both arg0 and arg1 handling in the
same binary, and making sure that the XRay runtime calls the correct
trampoline when handlers for both of these cases are installed.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@305660 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/xray')
-rw-r--r-- | test/xray/TestCases/Linux/arg1-arg0-logging.cc | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/test/xray/TestCases/Linux/arg1-arg0-logging.cc b/test/xray/TestCases/Linux/arg1-arg0-logging.cc new file mode 100644 index 000000000..e7730bfa6 --- /dev/null +++ b/test/xray/TestCases/Linux/arg1-arg0-logging.cc @@ -0,0 +1,39 @@ +// Allow having both the no-arg and arg1 logging implementation live together, +// and be called in the correct cases. +// +// RUN: rm arg0-arg1-logging-* || true +// RUN: %clangxx_xray -std=c++11 %s -o %t +// RUN: XRAY_OPTIONS="patch_premain=true verbosity=1 xray_logfile_base=arg0-arg1-logging-" %run %t +// +// TODO: Support these in ARM and PPC +// XFAIL: arm || aarch64 || mips +// UNSUPPORTED: powerpc64le + +#include "xray/xray_interface.h" +#include <cassert> +#include <cstdio> + +using namespace std; + +bool arg0loggercalled = false; +void arg0logger(int32_t, XRayEntryType) { arg0loggercalled = true; } + +[[clang::xray_always_instrument]] void arg0fn() { printf("hello, arg0!\n"); } + +bool arg1loggercalled = false; +void arg1logger(int32_t, XRayEntryType, uint64_t) { arg1loggercalled = true; } + +[[ clang::xray_always_instrument, clang::xray_log_args(1) ]] void +arg1fn(uint64_t arg1) { + printf("hello, arg1!\n"); +} + +int main(int argc, char *argv[]) { + __xray_set_handler(arg0logger); + __xray_set_handler_arg1(arg1logger); + arg0fn(); + arg1fn(0xcafef00d); + __xray_remove_handler_arg1(); + __xray_remove_handler(); + assert(arg0loggercalled && arg1loggercalled); +} |