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>