-#!/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;
# Size of the stack for this function:
our $size = 0;
-
# Counter for assigning unique ids to labels:
our $id=0;
if($size != 0) {
# This is a crude hack to disable the stack cleaning on the main
- # stack. It rellies on the fact that the main stack is high in
- # the address space and the other stacks are in the hap (lower).
- print("\tmovq \$0x7ffff7ff8000, %r11\n");
+ # 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("\tjbe .Lstack_cleaner_done$id\n");
+ print("\tjae .Lstack_cleaner_done$id\n");
# Loop over the stack frame quadwords and zero it:
print("\tmovabsq \$$qsize, %r11\n");
if ($scanproc) {
$lines = $lines . $_;
if (m/^[ \t]*.cfi_endproc$/) {
- emit_code();
+ emit_code();
} elsif (m/^[ \t]*pushq/) {
- $size += 8;
+ $size += 8;
} elsif (m/^[ \t]*subq[\t *]\$([0-9]*),[ \t]*%rsp$/) {
- my $val = $1;
- $val = oct($val) if $val =~ /^0/;
- $size += $val;
- emit_code();
+ my $val = $1;
+ $val = oct($val) if $val =~ /^0/;
+ $size += $val;
+ emit_code();
}
} elsif (m/^[ \t]*.cfi_startproc$/) {
print $_;