• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2#
3# Copyright (C) 2007 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17# opcode-gen <file>
18#
19# Use the file bytecodes.txt to generate code inside <file>, based on
20# the directives found in that file:
21#
22#     opcodes:   static final ints for each opcode
23#     dops:      static final objects for each opcode
24#     dops-init: initialization code for the "dops"
25
26file="$1"
27tmpfile="/tmp/$$.txt"
28
29if [ "x$1" = "x" ]; then
30    echo "must specify a file"
31    exit 1
32fi
33
34# Set up prog to be the path of this script, including following symlinks,
35# and set up progdir to be the fully-qualified pathname of its directory.
36prog="$0"
37while [ -h "${prog}" ]; do
38    newProg=`/bin/ls -ld "${prog}"`
39    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
40    if expr "x${newProg}" : 'x/' >/dev/null; then
41        prog="${newProg}"
42    else
43        progdir=`dirname "${prog}"`
44        prog="${progdir}/${newProg}"
45    fi
46done
47oldwd=`pwd`
48progdir=`dirname "${prog}"`
49cd "${progdir}"
50progdir=`pwd`
51prog="${progdir}"/`basename "${prog}"`
52cd "${oldwd}"
53
54bytecodeFile="$progdir/bytecode.txt"
55
56awk -v "bytecodeFile=$bytecodeFile" '
57
58BEGIN {
59    readBytecodes();
60    consumeUntil = "";
61}
62
63consumeUntil != "" {
64    if (index($0, consumeUntil) != 0) {
65        consumeUntil = "";
66    } else {
67        next;
68    }
69}
70
71/BEGIN\(opcodes\)/ {
72    consumeUntil = "END(opcodes)";
73    print;
74
75    for (i = 0; i < 256; i++) {
76        printf("    public static final int %s = 0x%s;\n",
77               uppername[i], hex[i]);
78    }
79
80    next;
81}
82
83/BEGIN\(dops\)/ {
84    consumeUntil = "END(dops)";
85    print;
86
87    for (i = 0; i < 256; i++) {
88        if (index(name[i], "unused") != 0) {
89            continue;
90        }
91        printf("    public static final Dop %s =\n" \
92               "        new Dop(DalvOps.%s, DalvOps.%s,\n" \
93               "            Form%s.THE_ONE, %s, \"%s\");\n\n",
94               uppername[i], uppername[i], family[i], format[i], hasres[i],
95               name[i]);
96    }
97
98    next;
99}
100
101/BEGIN\(dops-init\)/ {
102    consumeUntil = "END(dops-init)";
103    print;
104
105    for (i = 0; i < 256; i++) {
106        if (index(name[i], "unused") != 0) {
107            continue;
108        }
109        printf("        set(%s);\n", uppername[i]);
110    }
111
112    next;
113}
114
115{ print; }
116
117function readBytecodes(i, parts) {
118    for (i = 0; i < 256; i++) {
119        $0 = "";
120        while (($0 == "") || (index($0, "#") != 0)) {
121            if ((getline <bytecodeFile) != 1) {
122                print "trouble reading bytecode file";
123                exit 1;
124            }
125        }
126        split($0, parts);
127        hex[i] = parts[1];
128        format[i] = parts[2];
129        hasres[i] = (parts[3] == "n") ? "false" : "true";
130        name[i] = parts[4];
131        uppername[i] = toupper(parts[4]);
132        gsub("[---/]", "_", uppername[i]);
133        split(name[i], parts, "/");
134        family[i] = toupper(parts[1]);
135        gsub("-", "_", family[i]);
136    }
137}
138' "$file" > "$tmpfile"
139
140cp "$tmpfile" "$file"
141rm "$tmpfile"
142