Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[XRay] basic mode PID and TID always fetch
Summary: XRayRecords now includes a PID field. Basic handlers fetch pid and tid each time they are called instead of caching the value. Added a testcase that calls fork and checks if the child TID is different from the parent TID to verify that the processes' TID are different in the trace. Reviewers: dberris, Maknee Reviewed By: dberris, Maknee Subscribers: kpw, llvm-commits, #sanitizers Differential Revision: https://reviews.llvm.org/D49025 llvm-svn: 336769
- Loading branch information
1 parent
02867f0
commit 8299e4b
Showing
3 changed files
with
112 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
100 changes: 100 additions & 0 deletions
100
compiler-rt/test/xray/TestCases/Posix/fork_basic_logging.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
// Check that when forking in basic logging mode, we get the different tids for child and parent | ||
// RUN: %clangxx_xray -g -std=c++11 %s -o %t | ||
// RUN: rm -f fork-basic-logging-test-* | ||
// RUN: XRAY_OPTIONS="patch_premain=true xray_logfile_base=fork-basic-logging-test- \ | ||
// RUN: xray_mode=xray-basic verbosity=1" \ | ||
// RUN: %run %t 2>&1 | FileCheck %s | ||
// RUN: %llvm_xray convert --symbolize --output-format=yaml -instr_map=%t \ | ||
// RUN: "`ls -S fork-basic-logging-test-* | head -1`" \ | ||
// RUN: | FileCheck %s --check-prefix=TRACE | ||
|
||
// REQUIRES: x86_64-target-arch | ||
// REQUIRES: built-in-llvm-tree | ||
|
||
#include "xray/xray_log_interface.h" | ||
#include <stdio.h> | ||
#include <unistd.h> | ||
#include <stdint.h> | ||
#include <sys/syscall.h> | ||
|
||
//modified from sanitizer | ||
|
||
static uintptr_t syscall_gettid() { | ||
uint64_t retval; | ||
asm volatile("syscall" : "=a"(retval) : "a"(__NR_gettid) : "rcx", "r11", | ||
"memory", "cc"); | ||
return retval; | ||
} | ||
|
||
///////////// | ||
|
||
static uint64_t parent_tid; | ||
|
||
[[clang::xray_always_instrument]] | ||
uint64_t __attribute__((noinline)) log_syscall_gettid() | ||
{ | ||
//don't optimize this function away | ||
uint64_t tid = syscall_gettid(); | ||
printf("Logging tid %lu\n", tid); | ||
return tid; | ||
} | ||
|
||
[[clang::xray_always_instrument, clang::xray_log_args(1)]] | ||
void __attribute__((noinline)) print_parent_tid(uint64_t tid) | ||
{ | ||
printf("Parent with tid %lu", tid); | ||
} | ||
|
||
[[clang::xray_always_instrument, clang::xray_log_args(1)]] | ||
void __attribute__((noinline)) print_child_tid(uint64_t tid) | ||
{ | ||
printf("Child with tid %lu", tid); | ||
} | ||
|
||
[[clang::xray_always_instrument]] void __attribute__((noinline)) print_parent_or_child() | ||
{ | ||
uint64_t tid = syscall_gettid(); | ||
if(tid == parent_tid) | ||
{ | ||
print_parent_tid(tid); | ||
} | ||
else | ||
{ | ||
print_child_tid(tid); | ||
} | ||
} | ||
|
||
int main() | ||
{ | ||
parent_tid = log_syscall_gettid(); | ||
if(fork()) | ||
{ | ||
print_parent_or_child(); | ||
// CHECK: Parent with tid | ||
} | ||
else | ||
{ | ||
print_parent_or_child(); | ||
// CHECK: Child with tid | ||
} | ||
return 0; | ||
} | ||
|
||
// Make sure we know which thread is the parent process | ||
// TRACE-DAG: - { type: 0, func-id: [[LSGT:[0-9]+]], function: {{.*log_syscall_gettid.*}}, cpu: {{.*}}, thread: [[THREAD1:[0-9]+]], kind: function-enter, tsc: {{[0-9]+}} } | ||
|
||
// TRACE-DAG: - { type: 0, func-id: [[PPOC:[0-9]+]], function: {{.*print_parent_or_child.*}}, cpu: {{.*}}, thread: [[THREAD1]], kind: function-enter, tsc: {{[0-9]+}} } | ||
// | ||
// The parent will print its pid first | ||
// TRACE-DAG: - { type: 0, func-id: [[PPTARG:[0-9]+]], function: {{.*print_parent_tid.*}}, args: [ [[THREAD1]] ], cpu: {{.*}}, thread: [[THREAD1]], kind: function-enter-arg, tsc: {{[0-9]+}} } | ||
// TRACE-DAG: - { type: 0, func-id: [[PPTARG]], function: {{.*print_parent_tid.*}}, cpu: {{.*}}, thread: [[THREAD1]], kind: function-exit, tsc: {{[0-9]+}} } | ||
// | ||
// TRACE: - { type: 0, func-id: [[PPOC]], function: {{.*print_parent_or_child.*}}, cpu: {{.*}}, thread: [[THREAD1]], kind: function-{{exit|tail-exit}}, tsc: {{[0-9]+}} } | ||
|
||
// TRACE-DAG: - { type: 0, func-id: [[PPOC]], function: {{.*print_parent_or_child.*}}, cpu: {{.*}}, thread: [[THREAD2:[0-9]+]], kind: function-enter, tsc: {{[0-9]+}} } | ||
// | ||
// The child will print its pid now | ||
// TRACE-DAG: - { type: 0, func-id: [[PCTARG:[0-9]+]], function: {{.*print_child_tid.*}}, args: [ [[THREAD2]] ], cpu: {{.*}}, thread: [[THREAD2]], kind: function-enter-arg, tsc: {{[0-9]+}} } | ||
// TRACE-DAG: - { type: 0, func-id: [[PCTARG]], function: {{.*print_child_tid.*}}, cpu: {{.*}}, thread: [[THREAD2]], kind: function-exit, tsc: {{[0-9]+}} } | ||
// | ||
// TRACE: - { type: 0, func-id: [[PPOC]], function: {{.*print_parent_or_child.*}}, cpu: {{.*}}, thread: [[THREAD2]], kind: function-{{exit|tail-exit}}, tsc: {{[0-9]+}} } |