summaryrefslogtreecommitdiffstats
path: root/third_party/sqlite/src/mkopcodeh.awk
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/sqlite/src/mkopcodeh.awk')
-rwxr-xr-x[-rw-r--r--]third_party/sqlite/src/mkopcodeh.awk34
1 files changed, 15 insertions, 19 deletions
diff --git a/third_party/sqlite/src/mkopcodeh.awk b/third_party/sqlite/src/mkopcodeh.awk
index f6b90c1..796a7af 100644..100755
--- a/third_party/sqlite/src/mkopcodeh.awk
+++ b/third_party/sqlite/src/mkopcodeh.awk
@@ -25,11 +25,17 @@
#
# This script also scans for lines of the form:
#
-# case OP_aaaa: /* jump, in1, in2, in3, out2-prerelease, out3 */
+# case OP_aaaa: /* no-push */
#
-# When such comments are found on an opcode, it means that certain
-# properties apply to that opcode. Set corresponding flags using the
-# OPFLG_INITIALIZER macro.
+# When the no-push comment is found on an opcode, it means that that
+# opcode does not leave a result on the stack. By identifying which
+# opcodes leave results on the stack it is possible to determine a
+# much smaller upper bound on the size of the stack. This allows
+# a smaller stack to be allocated, which is important to embedded
+# systems with limited memory space. This script generates a series
+# of "NOPUSH_MASK" defines that contain bitmaps of opcodes that leave
+# results on the stack. The NOPUSH_MASK defines are used in vdbeaux.c
+# to help determine the maximum stack size.
#
@@ -49,7 +55,6 @@
in1[name] = 0
in2[name] = 0
in3[name] = 0
- out2[name] = 0
out3[name] = 0
for(i=3; i<NF; i++){
if($i=="same" && $(i+1)=="as"){
@@ -71,13 +76,10 @@
in2[name] = 1
}else if(x=="in3"){
in3[name] = 1
- }else if(x=="out2"){
- out2[name] = 1
}else if(x=="out3"){
out3[name] = 1
}
}
- order[n_op++] = name;
}
# Assign numbers to all opcodes and output the result.
@@ -87,11 +89,8 @@ END {
print "/* Automatically generated. Do not edit */"
print "/* See the mkopcodeh.awk script for details */"
op["OP_Noop"] = -1;
- order[n_op++] = "OP_Noop";
op["OP_Explain"] = -1;
- order[n_op++] = "OP_Explain";
- for(i=0; i<n_op; i++){
- name = order[i];
+ for(name in op){
if( op[name]<0 ){
cnt++
while( used[cnt] ) cnt++
@@ -124,18 +123,16 @@ END {
# bit 2: output to p1. release p1 before opcode runs
#
for(i=0; i<=max; i++) bv[i] = 0;
- for(i=0; i<n_op; i++){
- name = order[i];
+ for(name in op){
x = op[name]
a0 = a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0
- # a7 = a9 = a10 = a11 = a12 = a13 = a14 = a15 = 0
+ # a8 = a9 = a10 = a11 = a12 = a13 = a14 = a15 = 0
if( jump[name] ) a0 = 1;
if( out2_prerelease[name] ) a1 = 2;
if( in1[name] ) a2 = 4;
if( in2[name] ) a3 = 8;
if( in3[name] ) a4 = 16;
- if( out2[name] ) a5 = 32;
- if( out3[name] ) a6 = 64;
+ if( out3[name] ) a5 = 32;
# bv[x] = a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15;
bv[x] = a0+a1+a2+a3+a4+a5+a6+a7;
}
@@ -149,8 +146,7 @@ END {
print "#define OPFLG_IN1 0x0004 /* in1: P1 is an input */"
print "#define OPFLG_IN2 0x0008 /* in2: P2 is an input */"
print "#define OPFLG_IN3 0x0010 /* in3: P3 is an input */"
- print "#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */"
- print "#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */"
+ print "#define OPFLG_OUT3 0x0020 /* out3: P3 is an output */"
print "#define OPFLG_INITIALIZER {\\"
for(i=0; i<=max; i++){
if( i%8==0 ) printf("/* %3d */",i)