diff options
Diffstat (limited to 'malloc/trace2dat')
| -rwxr-xr-x | malloc/trace2dat | 203 |
1 files changed, 0 insertions, 203 deletions
diff --git a/malloc/trace2dat b/malloc/trace2dat deleted file mode 100755 index d09ca6c1c3..0000000000 --- a/malloc/trace2dat +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/perl -# -*- perl -*- - -$outfile = shift @ARGV; - -$outfile = "trace2c.dat" unless $outfile; - -die("$outfile already exists") if -f $outfile; - -# Arrays starting with c_ are data code to be emitted later - - -# Reserve idx 0 to be a NULL pointer -$last_idx = 0; -sub ptr2idx { - my ($ptr) = @_; - if ($ptr2idx{$ptr}) { - return $ptr2idx{$ptr}; - } - if ($ptr =~ /^0+$/) { - return 0; - } - # we intentionally never return zero - $last_idx ++; - $ptr2idx{$ptr} = $last_idx; - return $last_idx; -} - -sub put_int { - my ($val) = @_; - if ($val < 0) { - print STDERR "Error: negative value in put_int\n"; - exit(1); - } - my ($rv) = chr($val & 127); - while ($val > 127) { - $val >>= 7; - $rv = chr(($val & 127) | 128) . $rv; - } - return $rv; -} - - -$sync_counter = 0; - -# thread 2 waits for thread 1 -sub sync { - my ($thread1, $thread2) = @_; - if (! $sync_init{$thread1}) { - push (@c_sync, "volatile int sync_${thread1} = 0;"); - $sync_init{$thread1} = 1; - } - $sync_counter ++; - $c_threads{$thread1} .= $c_sync_w . &put_int($sync_counter); - $c_threads{$thread2} .= $c_sync_r . &put_int($sync_counter); -} - -sub acq_ptr { - my ($ptr) = @_; - if ($owner{$ptr} && $owner{$ptr} ne $thread) { - &sync ($owner{$ptr}, $thread); - } - $owner{$ptr} = $thread; -} - -$master_thread = undef; - -# These must stay in sync with trace_run.c -$c_nop = chr(0); -$c_done = chr(1); -$c_malloc = chr(2); -$c_calloc = chr(3); -$c_realloc = chr(4); -$c_free = chr(5); -$c_sync_w = chr(6); -$c_sync_r = chr(7); -$c_alloc_ptrs = chr(8); -$c_alloc_syncs = chr(9); -$c_nthreads = chr(10); -$c_start_thread = chr(11); - -$line = 0; -while (<>) { - $line ++; - next if /^threadid/; - next if /out of/; - - ($thread, $type, $path, $ptr1, $size, $ptr2) = split(' '); - $size = hex($size); - $idx1 = &ptr2idx($ptr1); - $idx2 = &ptr2idx($ptr2); - - if (! $master_thread) { - $master_thread = $thread; - } elsif (! $threads{$thread}) { - # make new thread start at the "right" time - &sync ($master_thread, $thread); - } - - $threads{$thread} = 1; - - if ($type eq "malloc") { - # In case another thread needs to free this chunk first - &acq_ptr($ptr2); - $c_threads{$thread} .= $c_malloc . &put_int($idx2) . &put_int($size); - $leak{$ptr2} = $size; - $owner{$ptr2} = $thread; - $valid{$ptr2} = 1; - } - - if ($type eq "calloc") { - # In case another thread needs to free this chunk first - &acq_ptr($ptr2); - $c_threads{$thread} .= $c_calloc . &put_int($idx2) . &put_int($size); - $leak{$ptr2} = $size; - $owner{$ptr2} = $thread; - $valid{$ptr2} = 1; - } - - if ($type eq "free") { - if ($ptr1 =~ /^0+$/) { - $c_threads{$thread} .= $c_free . &put_int(0); - } elsif ($valid{$ptr1}) { - # if it was allocated in another thread - &acq_ptr($ptr1); - $c_threads{$thread} .= $c_free . &put_int($idx1); - delete $leak{$ptr1}; - $valid{$ptr1} = 0; - } else { - #push (@{$c_threads{$thread}}, sprintf(" // free (p%s) (invalid ptr $ptr1 in thread $thread)", $idx1)); - } - } - - if ($type eq "realloc") { - if ($owner{$ptr1}) { - &acq_ptr($ptr1); - &acq_ptr($ptr2); - $c_threads{$thread} .= $c_realloc . &put_int($idx2) . &put_int($idx1) . &put_int($size); - # ptr1 might be the same as ptr2, so sequence matters - delete $leak{$ptr1}; - $leak{$ptr2} = $size; - $valid{$ptr1} = 0; - $valid{$ptr2} = 1; - } - } -} -print $line . " lines read\n"; - -$nthreads = 0; -for $thread (sort keys %threads) { - $c_threads{$thread} .= $c_done; - $nthreads ++; -} - -sub code_dump { - my ($code) = @_; - for $c (split(//, $code)) { - print hex(ord($c)), " "; - } - print "\n"; -} - -sub gen_main { - my ($len) = @_; - my ($code); - my ($ptr) = $len; - - $code = $c_alloc_ptrs . &put_int($last_idx+1); - &code_dump($code); - $code .= $c_alloc_syncs . &put_int($sync_counter+1); - - # Keep these together - $code .= $c_nthreads . &put_int($nthreads); - for $thread (sort keys %threads) { - printf("Start thread offset %x\n", $ptr); - $code .= $c_start_thread . &put_int ($ptr); - $ptr += length($c_threads{$thread}); - } - - $code .= $c_done; - return length($code), $code; -} - -$len = 1; -$nlen = 2; -while ($len != $nlen) { - $len = $nlen; - ($nlen, $maincode) = &gen_main($len); - print "main size $len/$nlen\n"; -} - -&code_dump($maincode); - -open(F, ">$outfile"); -print F $maincode; -for $thread (sort keys %threads) { - printf "Thread $thread size %10d " , length($c_threads{$thread}); - &code_dump (substr($c_threads{$thread}, 0, 16)); - print F $c_threads{$thread}; -} -close (F); - -exit 0; |
