Annotation of embedaddon/sqlite3/tool/vdbe-compress.tcl, revision 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>