• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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