1#!/bin/bash 2set -e 3set -u 4 5# depends on 'm apf_disassembler' 6"${ANDROID_HOST_OUT}/bin/apf_disassembler" < apf2java.in > apf2java.txt 7 8sed -r \ 9's@: li +r([01]), (-?[0-9]+)@: gen.addLoadImmediate(R\1, \2);@;'\ 10's@: and +r0, (-?[0-9]+)@: gen.addAnd(\1);@;'\ 11's@: add +r0, (-?[0-9]+)@: gen.addAdd(\1);@;'\ 12's@: add +r0, r1@: gen.addAddR1();@;'\ 13's@: swap +@: gen.addSwap();@;'\ 14's@: neg +r([01])@: gen.addNeg(R\1);@;'\ 15's@: jmp +(PASS|DROP)@: gen.addJump(\1_LABEL);@;'\ 16's@: jbsne +r0, 0x([0-9a-f]+), ([0-9]+), ([0-9a-f]+)@: gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("\3"), LABEL_\2);@;'\ 17's@: jeq +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1Equals(0x\2, LABEL_\3);@;'\ 18's@: jne +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1NotEquals(0x\2, LABEL_\3);@;'\ 19's@: jlt +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1LessThan(0x\2, LABEL_\3);@;'\ 20's@: jgt +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1GreaterThan(0x\2, LABEL_\3);@;'\ 21's@: jset +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1AnyBitsSet(0x\2, LABEL_\3);@;'\ 22's@: jmp +([0-9]+)@: gen.addJump(LABEL_\1);@;'\ 23's@: lddw +r0, \[r1\]@: gen.addLoadData(R0, 0);@;'\ 24's@: stdw +r0, \[r1\]@: gen.addStoreData(R0, 0);@;'\ 25's@: ldb +r([01]), \[([0-9]+)\]@: gen.addLoad8(R\1, \2);@;'\ 26's@: ldh +r([01]), \[([0-9]+)\]@: gen.addLoad16(R\1, \2);@;'\ 27's@: ldw +r([01]), \[([0-9]+)\]@: gen.addLoad32(R\1, \2);@;'\ 28's@: ldbx +r([01]), \[r1\+([0-9]+)\]@: gen.addLoad8Indexed(R\1, \2);@;'\ 29's@: ldhx +r([01]), \[r1\+([0-9]+)\]@: gen.addLoad16Indexed(R\1, \2);@;'\ 30's@: ldwx +r([01]), \[r1\+([0-9]+)\]@: gen.addLoad32Indexed(R\1, \2);@;'\ 31's@: ldm +r([01]), m\[([0-9]+)\]@: gen.addLoadFromMemory(R\1, \2);@;'\ 32'/addJumpIfR0(Greater|Less)Than/s@(0x[8-f][0-9a-f]{7})@\1L@;'\ 33< apf2java.txt > tmp 34declare -ar LABELS=($(sed -rn 's@.*LABEL_([0-9]+).*@\1@p' < tmp | sort -u)) 35for L in "${LABELS[@]}"; do 36 #echo "[LABEL_${L}]" 37 sed -r "s@^( +${L}:)@\ngen.defineLabel(LABEL_${L});\n\1@" < tmp > tmp2 38 cat tmp2 > tmp 39done 40 41sed -r \ 42's@^ +[0-9]+: @@;'\ 43's@(LABEL_[0-9]+)@"\1"@;'\ 44"s@\"LABEL_${LABELS[-1]}\"@\"LABEL_INC_AND_DROP\"@;"\ 45"s@\"LABEL_${LABELS[-2]}\"@\"LABEL_INC_AND_PASS\"@;"\ 46"s@\"LABEL_${LABELS[-3]}\"@\"LABEL_UNSOLICITED_MULTICAST_NA\"@;"\ 47< tmp > tmp2 48# The above label renames are based on what our current generator emits as prologue. 49 50if [[ "$(egrep -v '^$|gen' < tmp2 | wc -l)" != 0 ]]; then 51 echo 'Failure to translate:' 52 egrep -v '^$|gen' < tmp2 53 exit 1 54fi 55 56{ 57 echo ' @Test' 58 echo ' public void testFullApfV4ProgramGeneration() throws IllegalInstructionException {' 59 echo ' ApfV4Generator gen = new ApfV4Generator(APF_VERSION_4);' 60 sed -r 's@^(.+)$@ \1@' < tmp2 61 echo 62 echo ' byte[] program = gen.generate();' 63 echo ' final String programString = toHexString(program).toLowerCase();' 64 echo -n ' final String referenceProgramHexString = "' 65 tr -d '\n' < apf2java.in 66 echo '";' 67 echo ' assertEquals(referenceProgramHexString, programString);' 68 echo ' }' 69} > apf2java.out 70 71rm -f tmp tmp2 72