Index: third_party/sqlite/sqlite-src-3070603/tool/vdbe-compress.tcl |
diff --git a/third_party/sqlite/sqlite-src-3070603/tool/vdbe-compress.tcl b/third_party/sqlite/sqlite-src-3070603/tool/vdbe-compress.tcl |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3bcff9e5f0b3da01bdb873714f2d9e51602d6761 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3070603/tool/vdbe-compress.tcl |
@@ -0,0 +1,125 @@ |
+#!/usr/bin/tcl |
+# |
+# This script makes modifications to the vdbe.c source file which reduce |
+# the amount of stack space required by the sqlite3VdbeExec() routine. |
+# |
+# The modifications performed by this script are optional. The vdbe.c |
+# source file will compile correctly with and without the modifications |
+# performed by this script. And all routines within vdbe.c will compute |
+# the same result. The modifications made by this script merely help |
+# the C compiler to generate code for sqlite3VdbeExec() that uses less |
+# stack space. |
+# |
+# Script usage: |
+# |
+# mv vdbe.c vdbe.c.template |
+# tclsh vdbe-compress.tcl <vdbe.c.template >vdbe.c |
+# |
+# Modifications made: |
+# |
+# All modifications are within the sqlite3VdbeExec() function. The |
+# modifications seek to reduce the amount of stack space allocated by |
+# this routine by moving local variable declarations out of individual |
+# opcode implementations and into a single large union. The union contains |
+# a separate structure for each opcode and that structure contains the |
+# local variables used by that opcode. In this way, the total amount |
+# of stack space required by sqlite3VdbeExec() is reduced from the |
+# sum of all local variables to the maximum of the local variable space |
+# required for any single opcode. |
+# |
+# In order to be recognized by this script, local variables must appear |
+# on the first line after the open curly-brace that begins a new opcode |
+# implementation. Local variables must not have initializers, though they |
+# may be commented. |
+# |
+# The union definition is inserted in place of a special marker comment |
+# in the preamble to the sqlite3VdbeExec() implementation. |
+# |
+############################################################################# |
+# |
+set beforeUnion {} ;# C code before union |
+set unionDef {} ;# C code of the union |
+set afterUnion {} ;# C code after the union |
+set sCtr 0 ;# Context counter |
+ |
+# Read program text up to the spot where the union should be |
+# inserted. |
+# |
+while {![eof stdin]} { |
+ set line [gets stdin] |
+ if {[regexp {INSERT STACK UNION HERE} $line]} break |
+ append beforeUnion $line\n |
+} |
+ |
+# Process the remaining text. Build up the union definition as we go. |
+# |
+set vlist {} |
+set seenDecl 0 |
+set namechars {abcdefghijklmnopqrstuvwxyz} |
+set nnc [string length $namechars] |
+while {![eof stdin]} { |
+ set line [gets stdin] |
+ if {[regexp "^case (OP_\\w+): \173" $line all operator]} { |
+ append afterUnion $line\n |
+ set vlist {} |
+ while {![eof stdin]} { |
+ set line [gets stdin] |
+ if {[regexp {^ +(const )?\w+ \**(\w+)(\[.*\])?;} $line \ |
+ all constKeyword vname notused1]} { |
+ if {!$seenDecl} { |
+ set sname {} |
+ append sname [string index $namechars [expr {$sCtr/$nnc}]] |
+ append sname [string index $namechars [expr {$sCtr%$nnc}]] |
+ incr sCtr |
+ append unionDef " struct ${operator}_stack_vars \173\n" |
+ append afterUnion \ |
+ "#if 0 /* local variables moved into u.$sname */\n" |
+ set seenDecl 1 |
+ } |
+ append unionDef " $line\n" |
+ append afterUnion $line\n |
+ lappend vlist $vname |
+ } else { |
+ break |
+ } |
+ } |
+ if {$seenDecl} { |
+ append unionDef " \175 $sname;\n" |
+ append afterUnion "#endif /* local variables moved into u.$sname */\n" |
+ } |
+ set seenDecl 0 |
+ } |
+ if {[regexp "^\175" $line]} { |
+ append afterUnion $line\n |
+ set vlist {} |
+ } elseif {[llength $vlist]>0} { |
+ append line " " |
+ foreach v $vlist { |
+ regsub -all "(\[^a-zA-Z0-9>.\])${v}(\\W)" $line "\\1u.$sname.$v\\2" line |
+ regsub -all "(\[^a-zA-Z0-9>.\])${v}(\\W)" $line "\\1u.$sname.$v\\2" line |
+ } |
+ append afterUnion [string trimright $line]\n |
+ } elseif {$line=="" && [eof stdin]} { |
+ # no-op |
+ } else { |
+ append afterUnion $line\n |
+ } |
+} |
+ |
+# Output the resulting text. |
+# |
+puts -nonewline $beforeUnion |
+puts " /********************************************************************" |
+puts " ** Automatically generated code" |
+puts " **" |
+puts " ** The following union is automatically generated by the" |
+puts " ** vdbe-compress.tcl script. The purpose of this union is to" |
+puts " ** reduce the amount of stack space required by this function." |
+puts " ** See comments in the vdbe-compress.tcl script for details." |
+puts " */" |
+puts " union vdbeExecUnion \173" |
+puts -nonewline $unionDef |
+puts " \175 u;" |
+puts " /* End automatically generated code" |
+puts " ********************************************************************/" |
+puts -nonewline $afterUnion |