提交 b17ff188 编写于 作者: A Andy Polyakov

perlasm/ppc-xlate.pl: recognize .type directive.

Reviewed-by: NRich Salz <rsalz@openssl.org>
上级 fca8f5de
...@@ -11,40 +11,65 @@ my $output = shift; ...@@ -11,40 +11,65 @@ my $output = shift;
open STDOUT,">$output" || die "can't open $output: $!"; open STDOUT,">$output" || die "can't open $output: $!";
my %GLOBALS; my %GLOBALS;
my %TYPES;
my $dotinlocallabels=($flavour=~/linux/)?1:0; my $dotinlocallabels=($flavour=~/linux/)?1:0;
################################################################ ################################################################
# directives which need special treatment on different platforms # directives which need special treatment on different platforms
################################################################ ################################################################
my $type = sub {
my ($dir,$name,$type) = @_;
$TYPES{$name} = $type;
if ($flavour =~ /linux/) {
$name =~ s|^\.||;
".type $name,$type";
} else {
"";
}
};
my $globl = sub { my $globl = sub {
my $junk = shift; my $junk = shift;
my $name = shift; my $name = shift;
my $global = \$GLOBALS{$name}; my $global = \$GLOBALS{$name};
my $type = \$TYPES{$name};
my $ret; my $ret;
$name =~ s|^[\.\_]||; $name =~ s|^\.||;
SWITCH: for ($flavour) { SWITCH: for ($flavour) {
/aix/ && do { $name = ".$name"; /aix/ && do { if (!$$type) {
$$type = "\@function";
}
if ($$type =~ /function/) {
$name = ".$name";
}
last; last;
}; };
/osx/ && do { $name = "_$name"; /osx/ && do { $name = "_$name";
last; last;
}; };
/linux.*(32|64le)/ /linux.*(32|64le)/
&& do { $ret .= ".globl $name\n"; && do { $ret .= ".globl $name";
$ret .= ".type $name,\@function"; if (!$$type) {
$ret .= "\n.type $name,\@function";
$$type = "\@function";
}
last; last;
}; };
/linux.*64/ && do { $ret .= ".globl $name\n"; /linux.*64/ && do { $ret .= ".globl $name";
$ret .= ".type $name,\@function\n"; if (!$$type) {
$ret .= ".section \".opd\",\"aw\"\n"; $ret .= "\n.type $name,\@function";
$ret .= ".align 3\n"; $$type = "\@function";
$ret .= "$name:\n"; }
$ret .= ".quad .$name,.TOC.\@tocbase,0\n"; if ($$type =~ /function/) {
$ret .= ".previous\n"; $ret .= "\n.section \".opd\",\"aw\"";
$ret .= "\n.align 3";
$name = ".$name"; $ret .= "\n$name:";
$ret .= "\n.quad .$name,.TOC.\@tocbase,0";
$ret .= "\n.previous";
$name = ".$name";
}
last; last;
}; };
} }
...@@ -70,9 +95,13 @@ my $machine = sub { ...@@ -70,9 +95,13 @@ my $machine = sub {
my $size = sub { my $size = sub {
if ($flavour =~ /linux/) if ($flavour =~ /linux/)
{ shift; { shift;
my $name = shift; $name =~ s|^[\.\_]||; my $name = shift;
my $ret = ".size $name,.-".($flavour=~/64$/?".":"").$name; my $real = $GLOBALS{$name} ? \$GLOBALS{$name} : \$name;
$ret .= "\n.size .$name,.-.$name" if ($flavour=~/64$/); my $ret = ".size $$real,.-$$real";
$name =~ s|^\.||;
if ($$real ne $name) {
$ret .= "\n.size $name,.-$$real";
}
$ret; $ret;
} }
else else
...@@ -234,7 +263,7 @@ while($line=<>) { ...@@ -234,7 +263,7 @@ while($line=<>) {
$line =~ s|\s+$||; # ... and at the end $line =~ s|\s+$||; # ... and at the end
{ {
$line =~ s|\b\.L(\w+)|L$1|g; # common denominator for Locallabel $line =~ s|\.L(\w+)|L$1|g; # common denominator for Locallabel
$line =~ s|\bL(\w+)|\.L$1|g if ($dotinlocallabels); $line =~ s|\bL(\w+)|\.L$1|g if ($dotinlocallabels);
} }
...@@ -242,8 +271,13 @@ while($line=<>) { ...@@ -242,8 +271,13 @@ while($line=<>) {
$line =~ s|(^[\.\w]+)\:\s*||; $line =~ s|(^[\.\w]+)\:\s*||;
my $label = $1; my $label = $1;
if ($label) { if ($label) {
printf "%s:",($GLOBALS{$label} or $label); my $xlated = ($GLOBALS{$label} or $label);
printf "\n.localentry\t$GLOBALS{$label},0" if ($GLOBALS{$label} && $flavour =~ /linux.*64le/); print "$xlated:";
if ($flavour =~ /linux.*64le/) {
if ($TYPES{$label} =~ /function/) {
printf "\n.localentry %s,0\n",$xlated;
}
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册