1*fb1b10abSAndroid Build Coastguard Worker#!/usr/bin/env perl 2*fb1b10abSAndroid Build Coastguard Worker## 3*fb1b10abSAndroid Build Coastguard Worker## Copyright (c) 2010 The WebM project authors. All Rights Reserved. 4*fb1b10abSAndroid Build Coastguard Worker## 5*fb1b10abSAndroid Build Coastguard Worker## Use of this source code is governed by a BSD-style license 6*fb1b10abSAndroid Build Coastguard Worker## that can be found in the LICENSE file in the root of the source 7*fb1b10abSAndroid Build Coastguard Worker## tree. An additional intellectual property rights grant can be found 8*fb1b10abSAndroid Build Coastguard Worker## in the file PATENTS. All contributing project authors may 9*fb1b10abSAndroid Build Coastguard Worker## be found in the AUTHORS file in the root of the source tree. 10*fb1b10abSAndroid Build Coastguard Worker## 11*fb1b10abSAndroid Build Coastguard Worker 12*fb1b10abSAndroid Build Coastguard Worker 13*fb1b10abSAndroid Build Coastguard Worker# ads2gas_apple.pl 14*fb1b10abSAndroid Build Coastguard Worker# Author: Eric Fung (efung (at) acm.org) 15*fb1b10abSAndroid Build Coastguard Worker# 16*fb1b10abSAndroid Build Coastguard Worker# Convert ARM Developer Suite 1.0.1 syntax assembly source to GNU as format 17*fb1b10abSAndroid Build Coastguard Worker# 18*fb1b10abSAndroid Build Coastguard Worker# Usage: cat inputfile | perl ads2gas_apple.pl > outputfile 19*fb1b10abSAndroid Build Coastguard Worker# 20*fb1b10abSAndroid Build Coastguard Worker 21*fb1b10abSAndroid Build Coastguard Workerprint "@ This file was created from a .asm file\n"; 22*fb1b10abSAndroid Build Coastguard Workerprint "@ using the ads2gas_apple.pl script.\n\n"; 23*fb1b10abSAndroid Build Coastguard Workerprint ".syntax unified\n"; 24*fb1b10abSAndroid Build Coastguard Worker 25*fb1b10abSAndroid Build Coastguard Workermy %macro_aliases; 26*fb1b10abSAndroid Build Coastguard Worker 27*fb1b10abSAndroid Build Coastguard Workermy @mapping_list = ("\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", "\$8", "\$9"); 28*fb1b10abSAndroid Build Coastguard Worker 29*fb1b10abSAndroid Build Coastguard Workermy @incoming_array; 30*fb1b10abSAndroid Build Coastguard Worker 31*fb1b10abSAndroid Build Coastguard Worker# Perl trim function to remove whitespace from the start and end of the string 32*fb1b10abSAndroid Build Coastguard Workersub trim($) 33*fb1b10abSAndroid Build Coastguard Worker{ 34*fb1b10abSAndroid Build Coastguard Worker my $string = shift; 35*fb1b10abSAndroid Build Coastguard Worker $string =~ s/^\s+//; 36*fb1b10abSAndroid Build Coastguard Worker $string =~ s/\s+$//; 37*fb1b10abSAndroid Build Coastguard Worker return $string; 38*fb1b10abSAndroid Build Coastguard Worker} 39*fb1b10abSAndroid Build Coastguard Worker 40*fb1b10abSAndroid Build Coastguard Workerwhile (<STDIN>) 41*fb1b10abSAndroid Build Coastguard Worker{ 42*fb1b10abSAndroid Build Coastguard Worker # Load and store alignment 43*fb1b10abSAndroid Build Coastguard Worker s/@/,:/g; 44*fb1b10abSAndroid Build Coastguard Worker 45*fb1b10abSAndroid Build Coastguard Worker # Comment character 46*fb1b10abSAndroid Build Coastguard Worker s/;/@/; 47*fb1b10abSAndroid Build Coastguard Worker 48*fb1b10abSAndroid Build Coastguard Worker # Convert ELSE to .else 49*fb1b10abSAndroid Build Coastguard Worker s/\bELSE\b/.else/g; 50*fb1b10abSAndroid Build Coastguard Worker 51*fb1b10abSAndroid Build Coastguard Worker # Convert ENDIF to .endif 52*fb1b10abSAndroid Build Coastguard Worker s/\bENDIF\b/.endif/g; 53*fb1b10abSAndroid Build Coastguard Worker 54*fb1b10abSAndroid Build Coastguard Worker # Convert IF to .if 55*fb1b10abSAndroid Build Coastguard Worker if (s/\bIF\b/.if/g) { 56*fb1b10abSAndroid Build Coastguard Worker s/=+/==/g; 57*fb1b10abSAndroid Build Coastguard Worker } 58*fb1b10abSAndroid Build Coastguard Worker 59*fb1b10abSAndroid Build Coastguard Worker # Convert INCLUDE to .INCLUDE "file" 60*fb1b10abSAndroid Build Coastguard Worker s/INCLUDE\s?(.*)$/.include \"$1\"/; 61*fb1b10abSAndroid Build Coastguard Worker 62*fb1b10abSAndroid Build Coastguard Worker # No AREA required 63*fb1b10abSAndroid Build Coastguard Worker # But ALIGNs in AREA must be obeyed 64*fb1b10abSAndroid Build Coastguard Worker s/^(\s*)\bAREA\b.*ALIGN=([0-9])$/$1.text\n$1.p2align $2/; 65*fb1b10abSAndroid Build Coastguard Worker # If no ALIGN, strip the AREA and align to 4 bytes 66*fb1b10abSAndroid Build Coastguard Worker s/^(\s*)\bAREA\b.*$/$1.text\n$1.p2align 2/; 67*fb1b10abSAndroid Build Coastguard Worker 68*fb1b10abSAndroid Build Coastguard Worker # Make function visible to linker. 69*fb1b10abSAndroid Build Coastguard Worker s/EXPORT\s+\|([\$\w]*)\|/.globl _$1/; 70*fb1b10abSAndroid Build Coastguard Worker 71*fb1b10abSAndroid Build Coastguard Worker # No vertical bars on function names 72*fb1b10abSAndroid Build Coastguard Worker s/^\|(\$?\w+)\|/$1/g; 73*fb1b10abSAndroid Build Coastguard Worker 74*fb1b10abSAndroid Build Coastguard Worker # Labels and functions need a leading underscore and trailing colon 75*fb1b10abSAndroid Build Coastguard Worker s/^([a-zA-Z_0-9\$]+)/_$1:/ if !/EQU/; 76*fb1b10abSAndroid Build Coastguard Worker 77*fb1b10abSAndroid Build Coastguard Worker # Branches need to call the correct, underscored, function 78*fb1b10abSAndroid Build Coastguard Worker s/^(\s+b[egln]?[teq]?\s+)([a-zA-Z_0-9\$]+)/$1 _$2/ if !/EQU/; 79*fb1b10abSAndroid Build Coastguard Worker 80*fb1b10abSAndroid Build Coastguard Worker # ALIGN directive 81*fb1b10abSAndroid Build Coastguard Worker s/\bALIGN\b/.balign/g; 82*fb1b10abSAndroid Build Coastguard Worker 83*fb1b10abSAndroid Build Coastguard Worker # Strip ARM 84*fb1b10abSAndroid Build Coastguard Worker s/\s+ARM//; 85*fb1b10abSAndroid Build Coastguard Worker 86*fb1b10abSAndroid Build Coastguard Worker # Strip REQUIRE8 87*fb1b10abSAndroid Build Coastguard Worker s/\s+REQUIRE8//; 88*fb1b10abSAndroid Build Coastguard Worker 89*fb1b10abSAndroid Build Coastguard Worker # Strip PRESERVE8 90*fb1b10abSAndroid Build Coastguard Worker s/\s+PRESERVE8//; 91*fb1b10abSAndroid Build Coastguard Worker 92*fb1b10abSAndroid Build Coastguard Worker # Strip PROC and ENDPROC 93*fb1b10abSAndroid Build Coastguard Worker s/\bPROC\b//g; 94*fb1b10abSAndroid Build Coastguard Worker s/\bENDP\b//g; 95*fb1b10abSAndroid Build Coastguard Worker 96*fb1b10abSAndroid Build Coastguard Worker # EQU directive 97*fb1b10abSAndroid Build Coastguard Worker s/(\S+\s+)EQU(\s+\S+)/.equ $1, $2/; 98*fb1b10abSAndroid Build Coastguard Worker 99*fb1b10abSAndroid Build Coastguard Worker # Begin macro definition 100*fb1b10abSAndroid Build Coastguard Worker if (/\bMACRO\b/) { 101*fb1b10abSAndroid Build Coastguard Worker # Process next line down, which will be the macro definition 102*fb1b10abSAndroid Build Coastguard Worker $_ = <STDIN>; 103*fb1b10abSAndroid Build Coastguard Worker s/^/.macro/; 104*fb1b10abSAndroid Build Coastguard Worker s/\$//g; # Remove $ from the variables in the declaration 105*fb1b10abSAndroid Build Coastguard Worker } 106*fb1b10abSAndroid Build Coastguard Worker 107*fb1b10abSAndroid Build Coastguard Worker s/\$/\\/g; # Use \ to reference formal parameters 108*fb1b10abSAndroid Build Coastguard Worker # End macro definition 109*fb1b10abSAndroid Build Coastguard Worker 110*fb1b10abSAndroid Build Coastguard Worker s/\bMEND\b/.endm/; # No need to tell it where to stop assembling 111*fb1b10abSAndroid Build Coastguard Worker next if /^\s*END\s*$/; 112*fb1b10abSAndroid Build Coastguard Worker s/[ \t]+$//; 113*fb1b10abSAndroid Build Coastguard Worker print; 114*fb1b10abSAndroid Build Coastguard Worker} 115