Index: celt/arm/arm2gnu.pl |
diff --git a/celt/arm/arm2gnu.pl b/celt/arm/arm2gnu.pl |
index e3139041cc5467475d94a901e63e07a4197b5219..6c922ac819d7e0889bdbb72c4e8bec9cf6be5d4b 100644 |
--- a/celt/arm/arm2gnu.pl |
+++ b/celt/arm/arm2gnu.pl |
@@ -26,6 +26,8 @@ |
my $bigend; # little/big endian |
my $nxstack; |
+my $apple = 0; |
+my $symprefix = ""; |
$nxstack = 0; |
@@ -34,11 +36,16 @@ eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' |
while ($ARGV[0] =~ /^-/) { |
$_ = shift; |
- last if /^--/; |
- if (/^-n/) { |
+ last if /^--$/; |
+ if (/^-n$/) { |
$nflag++; |
next; |
} |
+ if (/^--apple$/) { |
+ $apple = 1; |
+ $symprefix = "_"; |
+ next; |
+ } |
die "I don't recognize this switch: $_\\n"; |
} |
$printit++ unless $nflag; |
@@ -79,7 +86,7 @@ while (<>) { |
s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/; |
s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\"/; |
s/\bIMPORT\b/.extern/; |
- s/\bEXPORT\b/.global/; |
+ s/\bEXPORT\b\s*/.global $symprefix/; |
s/^(\s+)\[/$1IF/; |
s/^(\s+)\|/$1ELSE/; |
s/^(\s+)\]/$1ENDIF/; |
@@ -135,7 +142,7 @@ while (<>) { |
# won't match the original source file (we could use the .line |
# directive, which is documented to be obsolete, but then gdb will |
# show the wrong line in the translated source file). |
- s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/; |
+ s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/ unless ($apple); |
} |
} |
@@ -157,9 +164,13 @@ while (<>) { |
$prefix = ""; |
if ($proc) |
{ |
- $prefix = $prefix.sprintf("\t.type\t%s, %%function; ",$proc); |
+ $prefix = $prefix.sprintf("\t.type\t%s, %%function; ",$proc) unless ($apple); |
+ # Make sure we $prefix isn't empty here (for the $apple case). |
+ # We handle mangling the label here, make sure it doesn't match |
+ # the label handling below (if $prefix would be empty). |
+ $prefix = "; "; |
push(@proc_stack, $proc); |
- s/^[A-Za-z_\.]\w+/$&:/; |
+ s/^[A-Za-z_\.]\w+/$symprefix$&:/; |
} |
$prefix = $prefix."\t.thumb_func; " if ($thumb); |
s/\bPROC\b/@ $&/; |
@@ -172,7 +183,7 @@ while (<>) { |
my $proc; |
s/\bENDP\b/@ $&/; |
$proc = pop(@proc_stack); |
- $_ = "\t.size $proc, .-$proc".$_ if ($proc); |
+ $_ = "\t.size $proc, .-$proc".$_ if ($proc && !$apple); |
} |
s/\bSUBT\b/@ $&/; |
s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25 |
@@ -337,6 +348,6 @@ while (<>) { |
} |
#If we had a code section, mark that this object doesn't need an executable |
# stack. |
-if ($nxstack) { |
+if ($nxstack && !$apple) { |
printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n"); |
} |