1#!/usr/bin/perl 2# 3# Scrub the variable fields from the perf trace2 output to 4# make testing easier. 5 6use strict; 7use warnings; 8 9my$qpath='\'[^\']*\'|[^ ]*'; 10 11my$col_depth=0; 12my$col_thread=1; 13my$col_event=2; 14my$col_repo=3; 15my$col_t_abs=4; 16my$col_t_rel=5; 17my$col_category=6; 18my$col_rest=7; 19 20# This code assumes that the trace2 data was written with bare 21# turned on (which omits the "<clock> <file>:<line> | <parents>" 22# prefix. 23 24while(<>) { 25my@tokens=split/\|/; 26 27foreachmy$col(@tokens) {$col=~s/^\s+|\s+$//g; } 28 29if($tokens[$col_event] =~m/^start/) { 30# The 'start' message lists the contents of argv in $col_rest. 31# On some platforms (Windows), argv[0] is *sometimes* a canonical 32# absolute path to the EXE rather than the value passed in the 33# shell script. Replace it with a placeholder to simplify our 34# HEREDOC in the test script. 35my$argv0; 36my$argvRest; 37$tokens[$col_rest] =~s/^($qpath)\W*(.*)/_EXE_ $2/; 38} 39elsif($tokens[$col_event] =~m/cmd_path/) { 40# Likewise, the 'cmd_path' message breaks out argv[0]. 41# 42# This line is only emitted when RUNTIME_PREFIX is defined, 43# so just omit it for testing purposes. 44# $tokens[$col_rest] = "_EXE_"; 45goto SKIP_LINE; 46} 47elsif($tokens[$col_event] =~m/child_exit/) { 48$tokens[$col_rest] =~s/ pid:\d* / pid:_PID_ /; 49} 50elsif($tokens[$col_event] =~m/data/) { 51if($tokens[$col_category] =~m/process/) { 52# 'data' and 'data_json' events containing 'process' 53# category data are assumed to be platform-specific 54# and highly variable. Just omit them. 55goto SKIP_LINE; 56} 57} 58 59# t_abs and t_rel are either blank or a float. Replace the float 60# with a constant for matching the HEREDOC in the test script. 61if($tokens[$col_t_abs] =~m/\d/) { 62$tokens[$col_t_abs] ="_T_ABS_"; 63} 64if($tokens[$col_t_rel] =~m/\d/) { 65$tokens[$col_t_rel] ="_T_REL_"; 66} 67 68my$out; 69 70$out=join('|',@tokens); 71print"$out\n"; 72 73 SKIP_LINE: 74} 75 76