| OLD | NEW |
| 1 #!/usr/bin/perl | 1 #!/usr/bin/perl |
| 2 # Copyright (C) 2002-2013 Xiph.org Foundation | 2 # Copyright (C) 2002-2013 Xiph.org Foundation |
| 3 # | 3 # |
| 4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
| 5 # modification, are permitted provided that the following conditions | 5 # modification, are permitted provided that the following conditions |
| 6 # are met: | 6 # are met: |
| 7 # | 7 # |
| 8 # - Redistributions of source code must retain the above copyright | 8 # - Redistributions of source code must retain the above copyright |
| 9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
| 10 # | 10 # |
| 11 # - Redistributions in binary form must reproduce the above copyright | 11 # - Redistributions in binary form must reproduce the above copyright |
| 12 # notice, this list of conditions and the following disclaimer in the | 12 # notice, this list of conditions and the following disclaimer in the |
| 13 # documentation and/or other materials provided with the distribution. | 13 # documentation and/or other materials provided with the distribution. |
| 14 # | 14 # |
| 15 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 15 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 17 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 17 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 18 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | 18 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER |
| 19 # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 19 # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 20 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 20 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 21 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 21 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 22 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | 22 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| 23 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 23 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| 24 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 25 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 26 | 26 |
| 27 my $bigend; # little/big endian | 27 my $bigend; # little/big endian |
| 28 my $nxstack; | 28 my $nxstack; |
| 29 my $apple = 0; |
| 30 my $symprefix = ""; |
| 29 | 31 |
| 30 $nxstack = 0; | 32 $nxstack = 0; |
| 31 | 33 |
| 32 eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' | 34 eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' |
| 33 if $running_under_some_shell; | 35 if $running_under_some_shell; |
| 34 | 36 |
| 35 while ($ARGV[0] =~ /^-/) { | 37 while ($ARGV[0] =~ /^-/) { |
| 36 $_ = shift; | 38 $_ = shift; |
| 37 last if /^--/; | 39 last if /^--$/; |
| 38 if (/^-n/) { | 40 if (/^-n$/) { |
| 39 $nflag++; | 41 $nflag++; |
| 40 next; | 42 next; |
| 41 } | 43 } |
| 44 if (/^--apple$/) { |
| 45 $apple = 1; |
| 46 $symprefix = "_"; |
| 47 next; |
| 48 } |
| 42 die "I don't recognize this switch: $_\\n"; | 49 die "I don't recognize this switch: $_\\n"; |
| 43 } | 50 } |
| 44 $printit++ unless $nflag; | 51 $printit++ unless $nflag; |
| 45 | 52 |
| 46 $\ = "\n"; # automatically add newline on print | 53 $\ = "\n"; # automatically add newline on print |
| 47 $n=0; | 54 $n=0; |
| 48 | 55 |
| 49 $thumb = 0; # ARM mode by default, not Thumb. | 56 $thumb = 0; # ARM mode by default, not Thumb. |
| 50 @proc_stack = (); | 57 @proc_stack = (); |
| 51 | 58 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 72 s/;/@/; | 79 s/;/@/; |
| 73 while ( /@.*'/ ) { | 80 while ( /@.*'/ ) { |
| 74 s/(@.*)'/$1/g; | 81 s/(@.*)'/$1/g; |
| 75 } | 82 } |
| 76 s/\{FALSE\}/0/g; | 83 s/\{FALSE\}/0/g; |
| 77 s/\{TRUE\}/1/g; | 84 s/\{TRUE\}/1/g; |
| 78 s/\{(\w\w\w\w+)\}/$1/g; | 85 s/\{(\w\w\w\w+)\}/$1/g; |
| 79 s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/; | 86 s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/; |
| 80 s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\
"/; | 87 s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\
"/; |
| 81 s/\bIMPORT\b/.extern/; | 88 s/\bIMPORT\b/.extern/; |
| 82 s/\bEXPORT\b/.global/; | 89 s/\bEXPORT\b\s*/.global $symprefix/; |
| 83 s/^(\s+)\[/$1IF/; | 90 s/^(\s+)\[/$1IF/; |
| 84 s/^(\s+)\|/$1ELSE/; | 91 s/^(\s+)\|/$1ELSE/; |
| 85 s/^(\s+)\]/$1ENDIF/; | 92 s/^(\s+)\]/$1ENDIF/; |
| 86 s/IF *:DEF:/ .ifdef/; | 93 s/IF *:DEF:/ .ifdef/; |
| 87 s/IF *:LNOT: *:DEF:/ .ifndef/; | 94 s/IF *:LNOT: *:DEF:/ .ifndef/; |
| 88 s/ELSE/ .else/; | 95 s/ELSE/ .else/; |
| 89 s/ENDIF/ .endif/; | 96 s/ENDIF/ .endif/; |
| 90 | 97 |
| 91 if( /\bIF\b/ ) { | 98 if( /\bIF\b/ ) { |
| 92 s/\bIF\b/ .if/; | 99 s/\bIF\b/ .if/; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 # Enable NEON instructions but don't produce a binary that requires | 135 # Enable NEON instructions but don't produce a binary that requires |
| 129 # ARMv7. RVCT does not have equivalent directives, so we just do this | 136 # ARMv7. RVCT does not have equivalent directives, so we just do this |
| 130 # for all CODE areas. | 137 # for all CODE areas. |
| 131 if ( /.text/ ) { | 138 if ( /.text/ ) { |
| 132 # Separating .arch, .fpu, etc., by semicolons does not work (gas | 139 # Separating .arch, .fpu, etc., by semicolons does not work (gas |
| 133 # thinks the semicolon is part of the arch name, even when there's | 140 # thinks the semicolon is part of the arch name, even when there's |
| 134 # whitespace separating them). Sadly this means our line numbers | 141 # whitespace separating them). Sadly this means our line numbers |
| 135 # won't match the original source file (we could use the .line | 142 # won't match the original source file (we could use the .line |
| 136 # directive, which is documented to be obsolete, but then gdb will | 143 # directive, which is documented to be obsolete, but then gdb will |
| 137 # show the wrong line in the translated source file). | 144 # show the wrong line in the translated source file). |
| 138 s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/; | 145 s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/ unless
($apple); |
| 139 } | 146 } |
| 140 } | 147 } |
| 141 | 148 |
| 142 s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3|| | 149 s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3|| |
| 143 s/\|\|\.bss\$(\d+)\|\|/.L_BSS$1/; # ||.bss$2|| | 150 s/\|\|\.bss\$(\d+)\|\|/.L_BSS$1/; # ||.bss$2|| |
| 144 s/\|\|\.data\$(\d+)\|\|/.L_DATA$1/; # ||.data$2|| | 151 s/\|\|\.data\$(\d+)\|\|/.L_DATA$1/; # ||.data$2|| |
| 145 s/\|\|([a-zA-Z0-9_]+)\@([a-zA-Z0-9_]+)\|\|/@ $&/; | 152 s/\|\|([a-zA-Z0-9_]+)\@([a-zA-Z0-9_]+)\|\|/@ $&/; |
| 146 s/^(\s+)\%(\s)/ .space $1/; | 153 s/^(\s+)\%(\s)/ .space $1/; |
| 147 | 154 |
| 148 s/\|(.+)\.(\d+)\|/\.$1_$2/; # |L80.123| -> .L80_123 | 155 s/\|(.+)\.(\d+)\|/\.$1_$2/; # |L80.123| -> .L80_123 |
| 149 s/\bCODE32\b/.code 32/ && do {$thumb = 0}; | 156 s/\bCODE32\b/.code 32/ && do {$thumb = 0}; |
| 150 s/\bCODE16\b/.code 16/ && do {$thumb = 1}; | 157 s/\bCODE16\b/.code 16/ && do {$thumb = 1}; |
| 151 if (/\bPROC\b/) | 158 if (/\bPROC\b/) |
| 152 { | 159 { |
| 153 my $prefix; | 160 my $prefix; |
| 154 my $proc; | 161 my $proc; |
| 155 /^([A-Za-z_\.]\w+)\b/; | 162 /^([A-Za-z_\.]\w+)\b/; |
| 156 $proc = $1; | 163 $proc = $1; |
| 157 $prefix = ""; | 164 $prefix = ""; |
| 158 if ($proc) | 165 if ($proc) |
| 159 { | 166 { |
| 160 $prefix = $prefix.sprintf("\t.type\t%s, %%function; ",$proc); | 167 $prefix = $prefix.sprintf("\t.type\t%s, %%function; ",$proc) unless
($apple); |
| 168 # Make sure we $prefix isn't empty here (for the $apple case). |
| 169 # We handle mangling the label here, make sure it doesn't match |
| 170 # the label handling below (if $prefix would be empty). |
| 171 $prefix = "; "; |
| 161 push(@proc_stack, $proc); | 172 push(@proc_stack, $proc); |
| 162 s/^[A-Za-z_\.]\w+/$&:/; | 173 s/^[A-Za-z_\.]\w+/$symprefix$&:/; |
| 163 } | 174 } |
| 164 $prefix = $prefix."\t.thumb_func; " if ($thumb); | 175 $prefix = $prefix."\t.thumb_func; " if ($thumb); |
| 165 s/\bPROC\b/@ $&/; | 176 s/\bPROC\b/@ $&/; |
| 166 $_ = $prefix.$_; | 177 $_ = $prefix.$_; |
| 167 } | 178 } |
| 168 s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/; | 179 s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/; |
| 169 s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/; | 180 s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/; |
| 170 if (/\bENDP\b/) | 181 if (/\bENDP\b/) |
| 171 { | 182 { |
| 172 my $proc; | 183 my $proc; |
| 173 s/\bENDP\b/@ $&/; | 184 s/\bENDP\b/@ $&/; |
| 174 $proc = pop(@proc_stack); | 185 $proc = pop(@proc_stack); |
| 175 $_ = "\t.size $proc, .-$proc".$_ if ($proc); | 186 $_ = "\t.size $proc, .-$proc".$_ if ($proc && !$apple); |
| 176 } | 187 } |
| 177 s/\bSUBT\b/@ $&/; | 188 s/\bSUBT\b/@ $&/; |
| 178 s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25 | 189 s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25 |
| 179 s/\bKEEP\b/@ $&/; | 190 s/\bKEEP\b/@ $&/; |
| 180 s/\bEXPORTAS\b/@ $&/; | 191 s/\bEXPORTAS\b/@ $&/; |
| 181 s/\|\|(.)+\bEQU\b/@ $&/; | 192 s/\|\|(.)+\bEQU\b/@ $&/; |
| 182 s/\|\|([\w\$]+)\|\|/$1/; | 193 s/\|\|([\w\$]+)\|\|/$1/; |
| 183 s/\bENTRY\b/@ $&/; | 194 s/\bENTRY\b/@ $&/; |
| 184 s/\bASSERT\b/@ $&/; | 195 s/\bASSERT\b/@ $&/; |
| 185 s/\bGBLL\b/@ $&/; | 196 s/\bGBLL\b/@ $&/; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 } continue { | 341 } continue { |
| 331 printf ("%s", $_) if $printit; | 342 printf ("%s", $_) if $printit; |
| 332 if ($addPadding != 0) | 343 if ($addPadding != 0) |
| 333 { | 344 { |
| 334 printf (" mov r0,r0\n"); | 345 printf (" mov r0,r0\n"); |
| 335 $addPadding = 0; | 346 $addPadding = 0; |
| 336 } | 347 } |
| 337 } | 348 } |
| 338 #If we had a code section, mark that this object doesn't need an executable | 349 #If we had a code section, mark that this object doesn't need an executable |
| 339 # stack. | 350 # stack. |
| 340 if ($nxstack) { | 351 if ($nxstack && !$apple) { |
| 341 printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n"); | 352 printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n"); |
| 342 } | 353 } |
| OLD | NEW |