1*a58d3d2aSXin Li#!/usr/bin/perl 2*a58d3d2aSXin Li# Copyright (C) 2002-2013 Xiph.org Foundation 3*a58d3d2aSXin Li# 4*a58d3d2aSXin Li# Redistribution and use in source and binary forms, with or without 5*a58d3d2aSXin Li# modification, are permitted provided that the following conditions 6*a58d3d2aSXin Li# are met: 7*a58d3d2aSXin Li# 8*a58d3d2aSXin Li# - Redistributions of source code must retain the above copyright 9*a58d3d2aSXin Li# notice, this list of conditions and the following disclaimer. 10*a58d3d2aSXin Li# 11*a58d3d2aSXin Li# - Redistributions in binary form must reproduce the above copyright 12*a58d3d2aSXin Li# notice, this list of conditions and the following disclaimer in the 13*a58d3d2aSXin Li# documentation and/or other materials provided with the distribution. 14*a58d3d2aSXin Li# 15*a58d3d2aSXin Li# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16*a58d3d2aSXin Li# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17*a58d3d2aSXin Li# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18*a58d3d2aSXin Li# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 19*a58d3d2aSXin Li# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20*a58d3d2aSXin Li# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21*a58d3d2aSXin Li# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22*a58d3d2aSXin Li# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 23*a58d3d2aSXin Li# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 24*a58d3d2aSXin Li# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25*a58d3d2aSXin Li# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*a58d3d2aSXin Li 27*a58d3d2aSXin Limy $bigend; # little/big endian 28*a58d3d2aSXin Limy $nxstack; 29*a58d3d2aSXin Limy $apple = 0; 30*a58d3d2aSXin Limy $symprefix = ""; 31*a58d3d2aSXin Li 32*a58d3d2aSXin Li$nxstack = 0; 33*a58d3d2aSXin Li 34*a58d3d2aSXin Lieval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' 35*a58d3d2aSXin Li if $running_under_some_shell; 36*a58d3d2aSXin Li 37*a58d3d2aSXin Liwhile ($ARGV[0] =~ /^-/) { 38*a58d3d2aSXin Li $_ = shift; 39*a58d3d2aSXin Li last if /^--$/; 40*a58d3d2aSXin Li if (/^-n$/) { 41*a58d3d2aSXin Li $nflag++; 42*a58d3d2aSXin Li next; 43*a58d3d2aSXin Li } 44*a58d3d2aSXin Li if (/^--apple$/) { 45*a58d3d2aSXin Li $apple = 1; 46*a58d3d2aSXin Li $symprefix = "_"; 47*a58d3d2aSXin Li next; 48*a58d3d2aSXin Li } 49*a58d3d2aSXin Li die "I don't recognize this switch: $_\\n"; 50*a58d3d2aSXin Li} 51*a58d3d2aSXin Li$printit++ unless $nflag; 52*a58d3d2aSXin Li 53*a58d3d2aSXin Li$\ = "\n"; # automatically add newline on print 54*a58d3d2aSXin Li$n=0; 55*a58d3d2aSXin Li 56*a58d3d2aSXin Li$thumb = 0; # ARM mode by default, not Thumb. 57*a58d3d2aSXin Li@proc_stack = (); 58*a58d3d2aSXin Li 59*a58d3d2aSXin Liprintf (" .syntax unified\n"); 60*a58d3d2aSXin Li 61*a58d3d2aSXin LiLINE: 62*a58d3d2aSXin Liwhile (<>) { 63*a58d3d2aSXin Li 64*a58d3d2aSXin Li # For ADRLs we need to add a new line after the substituted one. 65*a58d3d2aSXin Li $addPadding = 0; 66*a58d3d2aSXin Li 67*a58d3d2aSXin Li # First, we do not dare to touch *anything* inside double quotes, do we? 68*a58d3d2aSXin Li # Second, if you want a dollar character in the string, 69*a58d3d2aSXin Li # insert two of them -- that's how ARM C and assembler treat strings. 70*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+DCB[ \t]*\"/$1: .ascii \"/ && do { s/\$\$/\$/g; next }; 71*a58d3d2aSXin Li s/\bDCB\b[ \t]*\"/.ascii \"/ && do { s/\$\$/\$/g; next }; 72*a58d3d2aSXin Li s/^(\S+)\s+RN\s+(\S+)/$1 .req r$2/ && do { s/\$\$/\$/g; next }; 73*a58d3d2aSXin Li # If there's nothing on a line but a comment, don't try to apply any further 74*a58d3d2aSXin Li # substitutions (this is a cheap hack to avoid mucking up the license header) 75*a58d3d2aSXin Li s/^([ \t]*);/$1@/ && do { s/\$\$/\$/g; next }; 76*a58d3d2aSXin Li # If substituted -- leave immediately ! 77*a58d3d2aSXin Li 78*a58d3d2aSXin Li s/@/,:/; 79*a58d3d2aSXin Li s/;/@/; 80*a58d3d2aSXin Li while ( /@.*'/ ) { 81*a58d3d2aSXin Li s/(@.*)'/$1/g; 82*a58d3d2aSXin Li } 83*a58d3d2aSXin Li s/\{FALSE\}/0/g; 84*a58d3d2aSXin Li s/\{TRUE\}/1/g; 85*a58d3d2aSXin Li s/\{(\w\w\w\w+)\}/$1/g; 86*a58d3d2aSXin Li s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/; 87*a58d3d2aSXin Li s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\"/; 88*a58d3d2aSXin Li s/\bIMPORT\b/.extern/; 89*a58d3d2aSXin Li s/\bEXPORT\b\s*/.global $symprefix/; 90*a58d3d2aSXin Li s/^(\s+)\[/$1IF/; 91*a58d3d2aSXin Li s/^(\s+)\|/$1ELSE/; 92*a58d3d2aSXin Li s/^(\s+)\]/$1ENDIF/; 93*a58d3d2aSXin Li s/IF *:DEF:/ .ifdef/; 94*a58d3d2aSXin Li s/IF *:LNOT: *:DEF:/ .ifndef/; 95*a58d3d2aSXin Li s/ELSE/ .else/; 96*a58d3d2aSXin Li s/ENDIF/ .endif/; 97*a58d3d2aSXin Li 98*a58d3d2aSXin Li if( /\bIF\b/ ) { 99*a58d3d2aSXin Li s/\bIF\b/ .if/; 100*a58d3d2aSXin Li s/=/==/; 101*a58d3d2aSXin Li } 102*a58d3d2aSXin Li if ( $n == 2) { 103*a58d3d2aSXin Li s/\$/\\/g; 104*a58d3d2aSXin Li } 105*a58d3d2aSXin Li if ($n == 1) { 106*a58d3d2aSXin Li s/\$//g; 107*a58d3d2aSXin Li s/label//g; 108*a58d3d2aSXin Li $n = 2; 109*a58d3d2aSXin Li } 110*a58d3d2aSXin Li if ( /MACRO/ ) { 111*a58d3d2aSXin Li s/MACRO *\n/.macro/; 112*a58d3d2aSXin Li $n=1; 113*a58d3d2aSXin Li } 114*a58d3d2aSXin Li if ( /\bMEND\b/ ) { 115*a58d3d2aSXin Li s/\bMEND\b/.endm/; 116*a58d3d2aSXin Li $n=0; 117*a58d3d2aSXin Li } 118*a58d3d2aSXin Li 119*a58d3d2aSXin Li # ".rdata" doesn't work in 'as' version 2.13.2, as it is ".rodata" there. 120*a58d3d2aSXin Li # 121*a58d3d2aSXin Li if ( /\bAREA\b/ ) { 122*a58d3d2aSXin Li my $align; 123*a58d3d2aSXin Li $align = "2"; 124*a58d3d2aSXin Li if ( /ALIGN=(\d+)/ ) { 125*a58d3d2aSXin Li $align = $1; 126*a58d3d2aSXin Li } 127*a58d3d2aSXin Li if ( /CODE/ ) { 128*a58d3d2aSXin Li $nxstack = 1; 129*a58d3d2aSXin Li } 130*a58d3d2aSXin Li s/^(.+)CODE(.+)READONLY(.*)/ .text/; 131*a58d3d2aSXin Li s/^(.+)DATA(.+)READONLY(.*)/ .section .rdata/; 132*a58d3d2aSXin Li s/^(.+)\|\|\.data\|\|(.+)/ .data/; 133*a58d3d2aSXin Li s/^(.+)\|\|\.bss\|\|(.+)/ .bss/; 134*a58d3d2aSXin Li s/$/; .p2align $align/; 135*a58d3d2aSXin Li # Enable NEON instructions but don't produce a binary that requires 136*a58d3d2aSXin Li # ARMv7. RVCT does not have equivalent directives, so we just do this 137*a58d3d2aSXin Li # for all CODE areas. 138*a58d3d2aSXin Li if ( /.text/ ) { 139*a58d3d2aSXin Li # Separating .arch, .fpu, etc., by semicolons does not work (gas 140*a58d3d2aSXin Li # thinks the semicolon is part of the arch name, even when there's 141*a58d3d2aSXin Li # whitespace separating them). Sadly this means our line numbers 142*a58d3d2aSXin Li # won't match the original source file (we could use the .line 143*a58d3d2aSXin Li # directive, which is documented to be obsolete, but then gdb will 144*a58d3d2aSXin Li # show the wrong line in the translated source file). 145*a58d3d2aSXin Li s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/ unless ($apple); 146*a58d3d2aSXin Li } 147*a58d3d2aSXin Li } 148*a58d3d2aSXin Li 149*a58d3d2aSXin Li s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3|| 150*a58d3d2aSXin Li s/\|\|\.bss\$(\d+)\|\|/.L_BSS$1/; # ||.bss$2|| 151*a58d3d2aSXin Li s/\|\|\.data\$(\d+)\|\|/.L_DATA$1/; # ||.data$2|| 152*a58d3d2aSXin Li s/\|\|([a-zA-Z0-9_]+)\@([a-zA-Z0-9_]+)\|\|/@ $&/; 153*a58d3d2aSXin Li s/^(\s+)\%(\s)/ .space $1/; 154*a58d3d2aSXin Li 155*a58d3d2aSXin Li s/\|(.+)\.(\d+)\|/\.$1_$2/; # |L80.123| -> .L80_123 156*a58d3d2aSXin Li s/\bCODE32\b/.code 32/ && do {$thumb = 0}; 157*a58d3d2aSXin Li s/\bCODE16\b/.code 16/ && do {$thumb = 1}; 158*a58d3d2aSXin Li if (/\bPROC\b/) 159*a58d3d2aSXin Li { 160*a58d3d2aSXin Li my $prefix; 161*a58d3d2aSXin Li my $proc; 162*a58d3d2aSXin Li /^([A-Za-z_\.]\w+)\b/; 163*a58d3d2aSXin Li $proc = $1; 164*a58d3d2aSXin Li $prefix = ""; 165*a58d3d2aSXin Li if ($proc) 166*a58d3d2aSXin Li { 167*a58d3d2aSXin Li $prefix = $prefix.sprintf("\t.type\t%s, %%function", $proc) unless ($apple); 168*a58d3d2aSXin Li # Make sure we $prefix isn't empty here (for the $apple case). 169*a58d3d2aSXin Li # We handle mangling the label here, make sure it doesn't match 170*a58d3d2aSXin Li # the label handling below (if $prefix would be empty). 171*a58d3d2aSXin Li $prefix = $prefix."; "; 172*a58d3d2aSXin Li push(@proc_stack, $proc); 173*a58d3d2aSXin Li s/^[A-Za-z_\.]\w+/$symprefix$&:/; 174*a58d3d2aSXin Li } 175*a58d3d2aSXin Li $prefix = $prefix."\t.thumb_func; " if ($thumb); 176*a58d3d2aSXin Li s/\bPROC\b/@ $&/; 177*a58d3d2aSXin Li $_ = $prefix.$_; 178*a58d3d2aSXin Li } 179*a58d3d2aSXin Li s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/; 180*a58d3d2aSXin Li s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/; 181*a58d3d2aSXin Li if (/\bENDP\b/) 182*a58d3d2aSXin Li { 183*a58d3d2aSXin Li my $proc; 184*a58d3d2aSXin Li s/\bENDP\b/@ $&/; 185*a58d3d2aSXin Li $proc = pop(@proc_stack); 186*a58d3d2aSXin Li $_ = "\t.size $proc, .-$proc".$_ if ($proc && !$apple); 187*a58d3d2aSXin Li } 188*a58d3d2aSXin Li s/\bSUBT\b/@ $&/; 189*a58d3d2aSXin Li s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25 190*a58d3d2aSXin Li s/\bKEEP\b/@ $&/; 191*a58d3d2aSXin Li s/\bEXPORTAS\b/@ $&/; 192*a58d3d2aSXin Li s/\|\|(.)+\bEQU\b/@ $&/; 193*a58d3d2aSXin Li s/\|\|([\w\$]+)\|\|/$1/; 194*a58d3d2aSXin Li s/\bENTRY\b/@ $&/; 195*a58d3d2aSXin Li s/\bASSERT\b/@ $&/; 196*a58d3d2aSXin Li s/\bGBLL\b/@ $&/; 197*a58d3d2aSXin Li s/\bGBLA\b/@ $&/; 198*a58d3d2aSXin Li s/^\W+OPT\b/@ $&/; 199*a58d3d2aSXin Li s/:OR:/|/g; 200*a58d3d2aSXin Li s/:SHL:/<</g; 201*a58d3d2aSXin Li s/:SHR:/>>/g; 202*a58d3d2aSXin Li s/:AND:/&/g; 203*a58d3d2aSXin Li s/:LAND:/&&/g; 204*a58d3d2aSXin Li s/CPSR/cpsr/; 205*a58d3d2aSXin Li s/SPSR/spsr/; 206*a58d3d2aSXin Li s/ALIGN$/.balign 4/; 207*a58d3d2aSXin Li s/ALIGN\s+([0-9x]+)$/.balign $1/; 208*a58d3d2aSXin Li s/psr_cxsf/psr_all/; 209*a58d3d2aSXin Li s/LTORG/.ltorg/; 210*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+EQU/ .set $1,/; 211*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+SETL/ .set $1,/; 212*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+SETA/ .set $1,/; 213*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+\*/ .set $1,/; 214*a58d3d2aSXin Li 215*a58d3d2aSXin Li # {PC} + 0xdeadfeed --> . + 0xdeadfeed 216*a58d3d2aSXin Li s/\{PC\} \+/ \. +/; 217*a58d3d2aSXin Li 218*a58d3d2aSXin Li # Single hex constant on the line ! 219*a58d3d2aSXin Li # 220*a58d3d2aSXin Li # >>> NOTE <<< 221*a58d3d2aSXin Li # Double-precision floats in gcc are always mixed-endian, which means 222*a58d3d2aSXin Li # bytes in two words are little-endian, but words are big-endian. 223*a58d3d2aSXin Li # So, 0x0000deadfeed0000 would be stored as 0x0000dead at low address 224*a58d3d2aSXin Li # and 0xfeed0000 at high address. 225*a58d3d2aSXin Li # 226*a58d3d2aSXin Li s/\bDCFD\b[ \t]+0x([a-fA-F0-9]{8})([a-fA-F0-9]{8})/.long 0x$1, 0x$2/; 227*a58d3d2aSXin Li # Only decimal constants on the line, no hex ! 228*a58d3d2aSXin Li s/\bDCFD\b[ \t]+([0-9\.\-]+)/.double $1/; 229*a58d3d2aSXin Li 230*a58d3d2aSXin Li # Single hex constant on the line ! 231*a58d3d2aSXin Li# s/\bDCFS\b[ \t]+0x([a-f0-9]{8})([a-f0-9]{8})/.long 0x$1, 0x$2/; 232*a58d3d2aSXin Li # Only decimal constants on the line, no hex ! 233*a58d3d2aSXin Li# s/\bDCFS\b[ \t]+([0-9\.\-]+)/.double $1/; 234*a58d3d2aSXin Li s/\bDCFS[ \t]+0x/.word 0x/; 235*a58d3d2aSXin Li s/\bDCFS\b/.float/; 236*a58d3d2aSXin Li 237*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+DCD/$1 .word/; 238*a58d3d2aSXin Li s/\bDCD\b/.word/; 239*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+DCW/$1 .short/; 240*a58d3d2aSXin Li s/\bDCW\b/.short/; 241*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+DCB/$1 .byte/; 242*a58d3d2aSXin Li s/\bDCB\b/.byte/; 243*a58d3d2aSXin Li s/^([A-Za-z_]\w*)[ \t]+\%/.comm $1,/; 244*a58d3d2aSXin Li s/^[A-Za-z_\.]\w+/$&:/; 245*a58d3d2aSXin Li s/^(\d+)/$1:/; 246*a58d3d2aSXin Li s/\%(\d+)/$1b_or_f/; 247*a58d3d2aSXin Li s/\%[Bb](\d+)/$1b/; 248*a58d3d2aSXin Li s/\%[Ff](\d+)/$1f/; 249*a58d3d2aSXin Li s/\%[Ff][Tt](\d+)/$1f/; 250*a58d3d2aSXin Li s/&([\dA-Fa-f]+)/0x$1/; 251*a58d3d2aSXin Li if ( /\b2_[01]+\b/ ) { 252*a58d3d2aSXin Li s/\b2_([01]+)\b/conv$1&&&&/g; 253*a58d3d2aSXin Li while ( /[01][01][01][01]&&&&/ ) { 254*a58d3d2aSXin Li s/0000&&&&/&&&&0/g; 255*a58d3d2aSXin Li s/0001&&&&/&&&&1/g; 256*a58d3d2aSXin Li s/0010&&&&/&&&&2/g; 257*a58d3d2aSXin Li s/0011&&&&/&&&&3/g; 258*a58d3d2aSXin Li s/0100&&&&/&&&&4/g; 259*a58d3d2aSXin Li s/0101&&&&/&&&&5/g; 260*a58d3d2aSXin Li s/0110&&&&/&&&&6/g; 261*a58d3d2aSXin Li s/0111&&&&/&&&&7/g; 262*a58d3d2aSXin Li s/1000&&&&/&&&&8/g; 263*a58d3d2aSXin Li s/1001&&&&/&&&&9/g; 264*a58d3d2aSXin Li s/1010&&&&/&&&&A/g; 265*a58d3d2aSXin Li s/1011&&&&/&&&&B/g; 266*a58d3d2aSXin Li s/1100&&&&/&&&&C/g; 267*a58d3d2aSXin Li s/1101&&&&/&&&&D/g; 268*a58d3d2aSXin Li s/1110&&&&/&&&&E/g; 269*a58d3d2aSXin Li s/1111&&&&/&&&&F/g; 270*a58d3d2aSXin Li } 271*a58d3d2aSXin Li s/000&&&&/&&&&0/g; 272*a58d3d2aSXin Li s/001&&&&/&&&&1/g; 273*a58d3d2aSXin Li s/010&&&&/&&&&2/g; 274*a58d3d2aSXin Li s/011&&&&/&&&&3/g; 275*a58d3d2aSXin Li s/100&&&&/&&&&4/g; 276*a58d3d2aSXin Li s/101&&&&/&&&&5/g; 277*a58d3d2aSXin Li s/110&&&&/&&&&6/g; 278*a58d3d2aSXin Li s/111&&&&/&&&&7/g; 279*a58d3d2aSXin Li s/00&&&&/&&&&0/g; 280*a58d3d2aSXin Li s/01&&&&/&&&&1/g; 281*a58d3d2aSXin Li s/10&&&&/&&&&2/g; 282*a58d3d2aSXin Li s/11&&&&/&&&&3/g; 283*a58d3d2aSXin Li s/0&&&&/&&&&0/g; 284*a58d3d2aSXin Li s/1&&&&/&&&&1/g; 285*a58d3d2aSXin Li s/conv&&&&/0x/g; 286*a58d3d2aSXin Li } 287*a58d3d2aSXin Li 288*a58d3d2aSXin Li if ( /commandline/) 289*a58d3d2aSXin Li { 290*a58d3d2aSXin Li if( /-bigend/) 291*a58d3d2aSXin Li { 292*a58d3d2aSXin Li $bigend=1; 293*a58d3d2aSXin Li } 294*a58d3d2aSXin Li } 295*a58d3d2aSXin Li 296*a58d3d2aSXin Li if ( /\bDCDU\b/ ) 297*a58d3d2aSXin Li { 298*a58d3d2aSXin Li my $cmd=$_; 299*a58d3d2aSXin Li my $value; 300*a58d3d2aSXin Li my $prefix; 301*a58d3d2aSXin Li my $w1; 302*a58d3d2aSXin Li my $w2; 303*a58d3d2aSXin Li my $w3; 304*a58d3d2aSXin Li my $w4; 305*a58d3d2aSXin Li 306*a58d3d2aSXin Li s/\s+DCDU\b/@ $&/; 307*a58d3d2aSXin Li 308*a58d3d2aSXin Li $cmd =~ /\bDCDU\b\s+0x(\d+)/; 309*a58d3d2aSXin Li $value = $1; 310*a58d3d2aSXin Li $value =~ /(\w\w)(\w\w)(\w\w)(\w\w)/; 311*a58d3d2aSXin Li $w1 = $1; 312*a58d3d2aSXin Li $w2 = $2; 313*a58d3d2aSXin Li $w3 = $3; 314*a58d3d2aSXin Li $w4 = $4; 315*a58d3d2aSXin Li 316*a58d3d2aSXin Li if( $bigend ne "") 317*a58d3d2aSXin Li { 318*a58d3d2aSXin Li # big endian 319*a58d3d2aSXin Li $prefix = "\t.byte\t0x".$w1.";". 320*a58d3d2aSXin Li "\t.byte\t0x".$w2.";". 321*a58d3d2aSXin Li "\t.byte\t0x".$w3.";". 322*a58d3d2aSXin Li "\t.byte\t0x".$w4."; "; 323*a58d3d2aSXin Li } 324*a58d3d2aSXin Li else 325*a58d3d2aSXin Li { 326*a58d3d2aSXin Li # little endian 327*a58d3d2aSXin Li $prefix = "\t.byte\t0x".$w4.";". 328*a58d3d2aSXin Li "\t.byte\t0x".$w3.";". 329*a58d3d2aSXin Li "\t.byte\t0x".$w2.";". 330*a58d3d2aSXin Li "\t.byte\t0x".$w1."; "; 331*a58d3d2aSXin Li } 332*a58d3d2aSXin Li $_=$prefix.$_; 333*a58d3d2aSXin Li } 334*a58d3d2aSXin Li 335*a58d3d2aSXin Li if ( /\badrl\b/i ) 336*a58d3d2aSXin Li { 337*a58d3d2aSXin Li s/\badrl\s+(\w+)\s*,\s*(\w+)/ldr $1,=$2/i; 338*a58d3d2aSXin Li $addPadding = 1; 339*a58d3d2aSXin Li } 340*a58d3d2aSXin Li s/\bEND\b/@ END/; 341*a58d3d2aSXin Li} continue { 342*a58d3d2aSXin Li printf ("%s", $_) if $printit; 343*a58d3d2aSXin Li if ($addPadding != 0) 344*a58d3d2aSXin Li { 345*a58d3d2aSXin Li printf (" mov r0,r0\n"); 346*a58d3d2aSXin Li $addPadding = 0; 347*a58d3d2aSXin Li } 348*a58d3d2aSXin Li} 349*a58d3d2aSXin Li#If we had a code section, mark that this object doesn't need an executable 350*a58d3d2aSXin Li# stack. 351*a58d3d2aSXin Liif ($nxstack && !$apple) { 352*a58d3d2aSXin Li printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n"); 353*a58d3d2aSXin Li} 354