Annotation of embedaddon/sqlite3/tool/vdbe-compress.tcl, revision 1.1.1.1
1.1 misho 1: #!/usr/bin/tcl
2: #
3: # This script makes modifications to the vdbe.c source file which reduce
4: # the amount of stack space required by the sqlite3VdbeExec() routine.
5: #
6: # The modifications performed by this script are optional. The vdbe.c
7: # source file will compile correctly with and without the modifications
8: # performed by this script. And all routines within vdbe.c will compute
9: # the same result. The modifications made by this script merely help
10: # the C compiler to generate code for sqlite3VdbeExec() that uses less
11: # stack space.
12: #
13: # Script usage:
14: #
15: # mv vdbe.c vdbe.c.template
16: # tclsh vdbe-compress.tcl <vdbe.c.template >vdbe.c
17: #
18: # Modifications made:
19: #
20: # All modifications are within the sqlite3VdbeExec() function. The
21: # modifications seek to reduce the amount of stack space allocated by
22: # this routine by moving local variable declarations out of individual
23: # opcode implementations and into a single large union. The union contains
24: # a separate structure for each opcode and that structure contains the
25: # local variables used by that opcode. In this way, the total amount
26: # of stack space required by sqlite3VdbeExec() is reduced from the
27: # sum of all local variables to the maximum of the local variable space
28: # required for any single opcode.
29: #
30: # In order to be recognized by this script, local variables must appear
31: # on the first line after the open curly-brace that begins a new opcode
32: # implementation. Local variables must not have initializers, though they
33: # may be commented.
34: #
35: # The union definition is inserted in place of a special marker comment
36: # in the preamble to the sqlite3VdbeExec() implementation.
37: #
38: #############################################################################
39: #
40: set beforeUnion {} ;# C code before union
41: set unionDef {} ;# C code of the union
42: set afterUnion {} ;# C code after the union
43: set sCtr 0 ;# Context counter
44:
45: # Read program text up to the spot where the union should be
46: # inserted.
47: #
48: while {![eof stdin]} {
49: set line [gets stdin]
50: if {[regexp {INSERT STACK UNION HERE} $line]} break
51: append beforeUnion $line\n
52: }
53:
54: # Process the remaining text. Build up the union definition as we go.
55: #
56: set vlist {}
57: set seenDecl 0
58: set namechars {abcdefghijklmnopqrstuvwxyz}
59: set nnc [string length $namechars]
60: while {![eof stdin]} {
61: set line [gets stdin]
62: if {[regexp "^case (OP_\\w+): \173" $line all operator]} {
63: append afterUnion $line\n
64: set vlist {}
65: while {![eof stdin]} {
66: set line [gets stdin]
67: if {[regexp {^ +(const )?\w+ \**(\w+)(\[.*\])?;} $line \
68: all constKeyword vname notused1]} {
69: if {!$seenDecl} {
70: set sname {}
71: append sname [string index $namechars [expr {$sCtr/$nnc}]]
72: append sname [string index $namechars [expr {$sCtr%$nnc}]]
73: incr sCtr
74: append unionDef " struct ${operator}_stack_vars \173\n"
75: append afterUnion \
76: "#if 0 /* local variables moved into u.$sname */\n"
77: set seenDecl 1
78: }
79: append unionDef " $line\n"
80: append afterUnion $line\n
81: lappend vlist $vname
82: } else {
83: break
84: }
85: }
86: if {$seenDecl} {
87: append unionDef " \175 $sname;\n"
88: append afterUnion "#endif /* local variables moved into u.$sname */\n"
89: }
90: set seenDecl 0
91: }
92: if {[regexp "^\175" $line]} {
93: append afterUnion $line\n
94: set vlist {}
95: } elseif {[llength $vlist]>0} {
96: append line " "
97: foreach v $vlist {
98: regsub -all "(\[^a-zA-Z0-9>.\])${v}(\\W)" $line "\\1u.$sname.$v\\2" line
99: regsub -all "(\[^a-zA-Z0-9>.\])${v}(\\W)" $line "\\1u.$sname.$v\\2" line
100: }
101: append afterUnion [string trimright $line]\n
102: } elseif {$line=="" && [eof stdin]} {
103: # no-op
104: } else {
105: append afterUnion $line\n
106: }
107: }
108:
109: # Output the resulting text.
110: #
111: puts -nonewline $beforeUnion
112: puts " /********************************************************************"
113: puts " ** Automatically generated code"
114: puts " **"
115: puts " ** The following union is automatically generated by the"
116: puts " ** vdbe-compress.tcl script. The purpose of this union is to"
117: puts " ** reduce the amount of stack space required by this function."
118: puts " ** See comments in the vdbe-compress.tcl script for details."
119: puts " */"
120: puts " union vdbeExecUnion \173"
121: puts -nonewline $unionDef
122: puts " \175 u;"
123: puts " /* End automatically generated code"
124: puts " ********************************************************************/"
125: puts -nonewline $afterUnion
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>