X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/00fab7f6cbb427e331c007ed07403be1add49b25..5c19d3d6403ded95f8675596aa250240b6f7e467:/tools/stack-cleaner/clean-stack-filter diff --git a/tools/stack-cleaner/clean-stack-filter b/tools/stack-cleaner/clean-stack-filter index 8c5c01ca1c..64e79903c5 100755 --- a/tools/stack-cleaner/clean-stack-filter +++ b/tools/stack-cleaner/clean-stack-filter @@ -1,9 +1,10 @@ -#!/usr/bin/perl -w +#!/usr/bin/env perl # Transform assembly in order to clean each stack frame for X86_64. use strict; -$SIG{__WARN__} = sub { die @_ }; +use warnings; +$SIG{__WARN__} = sub { die @_ }; # Whether we are still scanning the content of a function: our $scanproc = 0; @@ -23,11 +24,20 @@ sub emit_code { my $offset = - $size - 8; if($size != 0) { + # This is a crude hack to disable the stack cleaning on the main + # stack. It relies on the fact that the main stack is high in + # the address space and the other stacks are in the heap (lower). + print("\tmovq \$0x7fff00000000, %r11\n"); + print("\tcmpq %r11, %rsp\n"); + print("\tjae .Lstack_cleaner_done$id\n"); + + # Loop over the stack frame quadwords and zero it: print("\tmovabsq \$$qsize, %r11\n"); print(".Lstack_cleaner_loop$id:\n"); print("\tmovq \$0, $offset(%rsp,%r11,8)\n"); print("\tsubq \$1, %r11\n"); print("\tjne .Lstack_cleaner_loop$id\n"); + print(".Lstack_cleaner_done$id:\n"); } print $lines;