mktbl.awk - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
       mktbl.awk (2173B)
       ---
            1 
            2 BEGIN                {
            3                 nvar=0
            4                 printf "#include <scc/mach.h>\n"\
            5                        "#include <scc/scc.h>\n"\
            6                        "#include \"../../as.h\"\n"\
            7                        "#include \"../" family "/proc.h\"\n"
            8 
            9                 rules = "target/" family "/opers.dat"
           10                 while (getline < rules > 0) {
           11                         regex[++nregs] = $1
           12                         value[nregs] = $2
           13                 }
           14                 close(rules)
           15 }
           16                 {sub(/#.*/,"")}
           17 
           18 $7 !~ cpu        {next}
           19 
           20 /^$/                {next}
           21 
           22                 {
           23                 if (op[$1] == 0) {
           24                         op[$1] = 1
           25                         opstart[$1] = nvar
           26                         opnames[nop++] = $1
           27                 }
           28                 opcount[$1]++
           29                 opargs[nvar] = $3
           30                 opsize[nvar] = $4
           31                 opbytes[nvar] = ($5 == "none") ? "" : $5
           32                 opformat[nvar++] = $6
           33                 formats[$6] = 1
           34 }
           35 
           36 END                {
           37                 for (i in formats)
           38                         printf "Format %s;\n", i
           39 
           40                 print "struct ins instab[] = {"
           41                 for (i = 0; i < nop; i++) {
           42                         n = opnames[i]
           43                         start = opstart[n]
           44                         end = start + opcount[n]
           45                         printf "\t{.str = \"%s\", .begin = %d, .end = %d},\n",
           46                                n, start, end
           47                 }
           48                 printf "};\n\n"
           49 
           50                 for (i = 0; i < nop; i++)
           51                         print opnames[i] | "./lexh"
           52                 close("./lexh")
           53 
           54                 print "struct op optab[] = {"
           55                 for (i = 0; i < nvar; i++) {
           56                         printf "\t/* %d */\n", i
           57                         printf "\t{\n" \
           58                                "\t\t.size = %d,\n"\
           59                                "\t\t.format = %s,\n",
           60                                opsize[i], opformat[i]
           61 
           62                         if (opbytes[i] != "")
           63                                 printf "\t\t.bytes = (unsigned char [%d]) {%s},\n",
           64                                         opsize[i],
           65                                         opbytes[i]
           66 
           67                         a = str2args(opargs[i])
           68                         if (a != "")
           69                                 printf "\t\t.args = (unsigned char []) {%s}\n", a
           70 
           71                         print "\t},"
           72                 }
           73                 print "};"
           74 }
           75 
           76 function str2args(s, args, i, j, out, n, found)
           77 {
           78         n = split(s, args, /,/)
           79         if (n == 0 || args[1] == "none")
           80                 return ""
           81         for (i = 1; i <= n; i++) {
           82                 a = args[i]
           83                 found = 0
           84 
           85                 if (a ~ /\?$/)
           86                         out = out "AOPT ,"
           87                 else if (a ~ /\+$/)
           88                         out = out "AREP ,"
           89 
           90                 for (j = 1; j <= nregs; j++) {
           91                         if (match(a, "^" regex[j])) {
           92                                 out = out value[j]
           93                                 found = 1
           94                                 break
           95                         }
           96                 }
           97 
           98                 if (!found) {
           99                         print FILENAME ":" NR ":" \
          100                               $0 ":wrong arg in opcode list", a > "/dev/stderr"
          101                         exit 1
          102                 }
          103 
          104                 a = substr(a, RLENGTH+1)
          105                 sub(/\?$/, "", a)
          106                 sub(/\+$/, "", a)
          107                 if (a != "") {
          108                         print FILENAME ":" NR ":" \
          109                               $0 ": trailing chars: ", a > "/dev/stderr"
          110                         exit 1
          111                 }
          112                 out = out ","
          113         }
          114         out = out "0"
          115 
          116         return out
          117 }