aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js11
-rw-r--r--src/preamble.js96
-rw-r--r--tests/python/LICENSE279
-rw-r--r--tests/python/ccproxy.py88
-rw-r--r--tests/python/python.ll519786
-rw-r--r--tests/python/readme.txt19
-rw-r--r--tests/runner.py14
7 files changed, 520246 insertions, 47 deletions
diff --git a/src/library.js b/src/library.js
index 166806ba..9a979ade 100644
--- a/src/library.js
+++ b/src/library.js
@@ -29,6 +29,10 @@ var Library = {
__print__(Pointer_stringify(p) + '\n');
},
+ fputc: function(chr, stream) {
+ __print__(String.fromCharCode(chr));
+ },
+
putchar: function(p) {
__print__(String.fromCharCode(p));
},
@@ -55,8 +59,8 @@ var Library = {
},
fwrite: function(ptr, size, count, stream) {
- print('[fwrite] ' + Pointer_stringify(ptr).slice(0,count));
- return count; // or 0?
+ __print__(intArrayToString(Array_copy(ptr, count)));
+ return count;
},
fclose: function(stream) {
@@ -85,6 +89,9 @@ var Library = {
return 0; // XXX
},
+ clearerr: function(stream) {
+ },
+
// stdlib.h
abs: 'Math.abs',
diff --git a/src/preamble.js b/src/preamble.js
index aa58e172..da6660ba 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -152,15 +152,11 @@ function Pointer_make(slab, pos, allocator) {
}
function Pointer_stringify(ptr) {
- ptr = Pointer_niceify(ptr);
-
var ret = "";
var i = 0;
var t;
while (1) {
-// if ((ptr.pos + i) >= ptr.slab.length) { return "<< Invalid read: " + (ptr.pos+i) + " : " + ptr.slab.length + " >>"; } else {}
- if ((ptr.pos+i) >= ptr.slab.length) { break; } else {}
- t = String.fromCharCode(ptr.slab[ptr.pos + i]);
+ t = String.fromCharCode(IHEAP[ptr + i]);
if (t == "\0") { break; } else {}
ret += t;
i += 1;
@@ -263,48 +259,54 @@ function __formatString() {
while (curr) { // Note: should be curr != 0, technically. But this helps catch bugs with undefineds
curr = IHEAP[textIndex];
next = IHEAP[textIndex+1];
- if (curr == '%'.charCodeAt(0) && ['d', 'u', 'f', '.'].indexOf(String.fromCharCode(next)) != -1) {
- var currArg;
- var argText;
- // Handle very very simply formatting, namely only %.Xf
- if (next == '.'.charCodeAt(0)) {
- var limit = 0;
- while(1) {
- var limitChr = IHEAP[textIndex+2];
- if (!(limitChr >= '0'.charCodeAt(0) && limitChr <= '9'.charCodeAt(0))) break;
- limit *= 10;
- limit += limitChr - '0'.charCodeAt(0);
- textIndex++;
- }
- textIndex--;
+ if (curr == '%'.charCodeAt(0)) {
+ if (next == 'l'.charCodeAt(0)) {
+ textIndex++;
next = IHEAP[textIndex+1];
- currArg = getNextArg(next);
- argText = String(+currArg); // +: boolean=>int
- var dotIndex = argText.indexOf('.');
- if (dotIndex == -1) {
- dotIndex = argText.length;
- argText += '.';
+ }
+ if (['d', 'u', 'f', '.'].indexOf(String.fromCharCode(next)) != -1) {
+ var currArg;
+ var argText;
+ // Handle very very simply formatting, namely only %.Xf
+ if (next == '.'.charCodeAt(0)) {
+ var limit = 0;
+ while(1) {
+ var limitChr = IHEAP[textIndex+2];
+ if (!(limitChr >= '0'.charCodeAt(0) && limitChr <= '9'.charCodeAt(0))) break;
+ limit *= 10;
+ limit += limitChr - '0'.charCodeAt(0);
+ textIndex++;
+ }
+ textIndex--;
+ next = IHEAP[textIndex+1];
+ currArg = getNextArg(next);
+ argText = String(+currArg); // +: boolean=>int
+ var dotIndex = argText.indexOf('.');
+ if (dotIndex == -1) {
+ dotIndex = argText.length;
+ argText += '.';
+ }
+ argText += '00000000000'; // padding
+ argText = argText.substr(0, dotIndex+1+limit);
+ textIndex += 2;
+ } else if (next == 'u'.charCodeAt(0)) {
+ currArg = getNextArg(next);
+ argText = String(unSign(currArg, 32));
+ } else {
+ currArg = getNextArg(next);
+ argText = String(+currArg); // +: boolean=>int
}
- argText += '00000000000'; // padding
- argText = argText.substr(0, dotIndex+1+limit);
+ argText.split('').forEach(function(chr) {
+ ret.push(chr.charCodeAt(0));
+ });
+ textIndex += 2;
+ } else if (next == 's'.charCodeAt(0)) {
+ ret = ret.concat(String_copy(getNextArg(next)));
+ textIndex += 2;
+ } else if (next == 'c'.charCodeAt(0)) {
+ ret = ret.concat(getNextArg(next));
textIndex += 2;
- } else if (next == 'u'.charCodeAt(0)) {
- currArg = getNextArg(next);
- argText = String(unSign(currArg, 32));
- } else {
- currArg = getNextArg(next);
- argText = String(+currArg); // +: boolean=>int
}
- argText.split('').forEach(function(chr) {
- ret.push(chr.charCodeAt(0));
- });
- textIndex += 2;
- } else if (curr == '%'.charCodeAt(0) && next == 's'.charCodeAt(0)) {
- ret = ret.concat(String_copy(getNextArg(next)));
- textIndex += 2;
- } else if (curr == '%'.charCodeAt(0) && next == 'c'.charCodeAt(0)) {
- ret = ret.concat(getNextArg(next));
- textIndex += 2;
} else {
ret.push(curr);
textIndex += 1;
@@ -418,6 +420,14 @@ function intArrayFromString(stringy) {
return ret;
}
+function intArrayToString(array) {
+ var ret = '';
+ for (var i = 0; i < array.length; i++) {
+ ret += String.fromCharCode(array[i]);
+ }
+ return ret;
+}
+
// Converts a value we have as signed, into an unsigned value. For
// example, -1 in int32 would be a very large number as unsigned.
function unSign(value, bits) {
diff --git a/tests/python/LICENSE b/tests/python/LICENSE
new file mode 100644
index 00000000..5cdb01e8
--- /dev/null
+++ b/tests/python/LICENSE
@@ -0,0 +1,279 @@
+A. HISTORY OF THE SOFTWARE
+==========================
+
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+as a successor of a language called ABC. Guido remains Python's
+principal author, although it includes many contributions from others.
+
+In 1995, Guido continued his work on Python at the Corporation for
+National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+in Reston, Virginia where he released several versions of the
+software.
+
+In May 2000, Guido and the Python core development team moved to
+BeOpen.com to form the BeOpen PythonLabs team. In October of the same
+year, the PythonLabs team moved to Digital Creations (now Zope
+Corporation, see http://www.zope.com). In 2001, the Python Software
+Foundation (PSF, see http://www.python.org/psf/) was formed, a
+non-profit organization created specifically to own Python-related
+Intellectual Property. Zope Corporation is a sponsoring member of
+the PSF.
+
+All Python releases are Open Source (see http://www.opensource.org for
+the Open Source Definition). Historically, most, but not all, Python
+releases have also been GPL-compatible; the table below summarizes
+the various releases.
+
+ Release Derived Year Owner GPL-
+ from compatible? (1)
+
+ 0.9.0 thru 1.2 1991-1995 CWI yes
+ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
+ 1.6 1.5.2 2000 CNRI no
+ 2.0 1.6 2000 BeOpen.com no
+ 1.6.1 1.6 2001 CNRI yes (2)
+ 2.1 2.0+1.6.1 2001 PSF no
+ 2.0.1 2.0+1.6.1 2001 PSF yes
+ 2.1.1 2.1+2.0.1 2001 PSF yes
+ 2.2 2.1.1 2001 PSF yes
+ 2.1.2 2.1.1 2002 PSF yes
+ 2.1.3 2.1.2 2002 PSF yes
+ 2.2.1 2.2 2002 PSF yes
+ 2.2.2 2.2.1 2002 PSF yes
+ 2.2.3 2.2.2 2003 PSF yes
+ 2.3 2.2.2 2002-2003 PSF yes
+ 2.3.1 2.3 2002-2003 PSF yes
+ 2.3.2 2.3.1 2002-2003 PSF yes
+ 2.3.3 2.3.2 2002-2003 PSF yes
+ 2.3.4 2.3.3 2004 PSF yes
+ 2.3.5 2.3.4 2005 PSF yes
+ 2.4 2.3 2004 PSF yes
+ 2.4.1 2.4 2005 PSF yes
+ 2.4.2 2.4.1 2005 PSF yes
+ 2.4.3 2.4.2 2006 PSF yes
+ 2.4.4 2.4.3 2006 PSF yes
+ 2.5 2.4 2006 PSF yes
+ 2.5.1 2.5 2007 PSF yes
+ 2.5.2 2.5.1 2008 PSF yes
+ 2.5.3 2.5.2 2008 PSF yes
+ 2.6 2.5 2008 PSF yes
+ 2.6.1 2.6 2008 PSF yes
+ 2.6.2 2.6.1 2009 PSF yes
+ 2.6.3 2.6.2 2009 PSF yes
+ 2.6.4 2.6.3 2009 PSF yes
+ 2.6.5 2.6.4 2010 PSF yes
+ 2.7 2.6 2010 PSF yes
+
+Footnotes:
+
+(1) GPL-compatible doesn't mean that we're distributing Python under
+ the GPL. All Python licenses, unlike the GPL, let you distribute
+ a modified version without making your changes open source. The
+ GPL-compatible licenses make it possible to combine Python with
+ other software that is released under the GPL; the others don't.
+
+(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+ because its license has a choice of law clause. According to
+ CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+ is "not incompatible" with the GPL.
+
+Thanks to the many outside volunteers who have worked under Guido's
+direction to make these releases possible.
+
+
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+--------------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using this software ("Python") in source or binary form and
+its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF hereby
+grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+analyze, test, perform and/or display publicly, prepare derivative works,
+distribute, and otherwise use Python alone or in any derivative version,
+provided, however, that PSF's License Agreement and PSF's notice of copyright,
+i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+Python Software Foundation; All Rights Reserved" are retained in Python alone or
+in any derivative version prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python.
+
+4. PSF is making Python available to Licensee on an "AS IS"
+basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee. This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions. Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee. This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party. As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee. Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement. This Agreement together with
+Python 1.6.1 may be located on the Internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013. This
+Agreement may also be obtained from a proxy server on the Internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee. This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
+
+ ACCEPT
+
+
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands. All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/tests/python/ccproxy.py b/tests/python/ccproxy.py
new file mode 100644
index 00000000..853b30f4
--- /dev/null
+++ b/tests/python/ccproxy.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+
+from __future__ import with_statement
+
+import sys
+import os
+import subprocess
+
+CC='..LLVM_GCC_DIR../llvm-gcc'
+CC_ARG_SKIP = ['-g', '-O1', '-O2', '-O3']
+CC_ADDITIONAL_ARGS = ['-m32', '-U__i386__', '-U__x86_64__', '-UX87_DOUBLE_ROUNDING', '-UHAVE_GCC_ASM_FOR_X87']
+
+#CC='llvm-gcc'
+#CC_ARG_SKIP = ['-g', '-O1', '-O2', '-O3']
+#CC_ADDITIONAL_ARGS = ['-U__i386__', '-U__x86_64__']
+
+LINK='..LLVM_DIR../llvm-link'
+ALLOWED_LINK_ARGS = ['-f', '-help', '-o', '-print-after', '-print-after-all', '-print-before',
+ '-print-before-all', '-time-passes', '-v', '-verify-dom-info', '-version' ]
+#LINK_ARG_SKIP = ['-pthread', '-DNDEBUG', '-g', '-O3', '-Wall', '-Wstrict-prototypes',
+# '-lpthread', '-ldl', '-lutil', '-Xlinker', '-export-dynamic', '-lm', '-shared']
+
+# ---------------- End configs -------------
+
+# no-op if called as ranlibproxy.py
+if os.path.basename(sys.argv[0])=='ranlibproxy.py':
+ sys.exit(0)
+
+
+use_linker = True
+#use_linker = False
+
+opts = []
+files = []
+for arg in sys.argv[1:]:
+ if arg.startswith('-'):
+ opts.append(arg)
+ else:
+ files.append(arg)
+ if arg.endswith('.c'):
+ use_linker = False
+
+if '--version' in opts:
+ use_linker = False
+
+if use_linker:
+ call = LINK
+ newargs = []
+ found_o = False
+ for arg in sys.argv[1:]:
+ if os.path.basename(sys.argv[0])=='arproxy.py':
+ if arg.endswith('.a'):
+ newargs.append('-o=%s' % arg)
+ elif arg.endswith('.o'):
+ newargs.append(arg)
+ else:
+ pass
+ continue
+ if found_o:
+ newargs.append('-o=%s' % arg)
+ found_o = False
+ continue
+ if arg.startswith('-'):
+ if arg == '-o':
+ found_o = True
+ continue
+ prefix = arg.split('=')[0]
+ if prefix in ALLOWED_LINK_ARGS:
+ newargs.append(arg)
+ else:
+ # not option, so just append
+ newargs.append(arg)
+else:
+ call = CC
+ newargs = [ arg for arg in sys.argv[1:] if arg not in CC_ARG_SKIP ] + CC_ADDITIONAL_ARGS
+ if 'conftest.c' not in files:
+ newargs.append('-emit-llvm')
+ if CC=='llvm-gcc':
+ newargs.append('-c')
+
+with open('ccproxy.log', 'a') as f:
+ f.write('## Called with %s\n' % ' '.join(sys.argv))
+ f.write('** Calling %s %s\n\n' % (call, ' '.join(newargs)))
+ f.flush()
+
+print "Running:", call, newargs
+
+os.execvp(call, [call] + newargs)
diff --git a/tests/python/python.ll b/tests/python/python.ll
new file mode 100644
index 00000000..093f363f
--- /dev/null
+++ b/tests/python/python.ll
@@ -0,0 +1,519786 @@
+; ModuleID = 'python.bc'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
+target triple = "i386-pc-linux-gnu"
+
+%0 = type { %1 }
+%1 = type { %struct._expr*, %struct.asdl_seq*, %struct.asdl_seq*, %struct._expr*, %struct._expr* }
+%2 = type { %struct._comprehension }
+%3 = type { %4 }
+%4 = type { %struct._expr*, %struct._expr*, %struct._expr* }
+%5 = type { %6 }
+%6 = type { %struct.NullImporter*, %struct._arguments*, %struct.asdl_seq*, %struct.asdl_seq* }
+%7 = type { %union.PyGC_Head*, %union.PyGC_Head*, i32 }
+%8 = type { %struct.SRE_REPEAT* }
+%9 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %10 }
+%10 = type { i8*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, [8 x i8] }
+%11 = type { %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter**, %struct.NullImporter**)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, [4 x i8] }
+%12 = type { i32, %struct.PyTypeObject*, i32, i8*, i32, i32, void (%struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.FILE*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, i8*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyNumberMethods*, %struct.PySequenceMethods*, %struct.PyMappingMethods*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.PyBufferProcs*, i32, i8*, i32 (%struct.NullImporter*, i32 (%struct.NullImporter*, i8*)*, i8*)*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, i32)*, i32, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyMethodDef*, %struct.PyMemberDef*, %struct.PyGetSetDef*, %struct.PyTypeObject*, %struct.NullImporter*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, i32, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.PyTypeObject*, i32)*, %struct.NullImporter* (%struct.PyTypeObject*, %struct.NullImporter*, %struct.NullImporter*)*, [36 x i8] }
+%13 = type { i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i32, i32)*, i32 (%struct.NullImporter*, i32, %struct.NullImporter*)*, i32 (%struct.NullImporter*, i32, i32, %struct.NullImporter*)*, [12 x i8] }
+%14 = type { i32 (%struct.NullImporter*, i32, i8**)*, i32 (%struct.NullImporter*, i32, i8**)*, i32 (%struct.NullImporter*, i32*)*, i32 (%struct.NullImporter*, i32, i8**)*, [8 x i8] }
+%15 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %16 }
+%16 = type { i8*, [12 x i8] }
+%17 = type { i32, %struct.PyTypeObject*, i32, i8*, i32, i32, void (%struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.FILE*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, i8*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyNumberMethods*, %struct.PySequenceMethods*, %struct.PyMappingMethods*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.PyBufferProcs*, i32, i8*, i32 (%struct.NullImporter*, i32 (%struct.NullImporter*, i8*)*, i8*)*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, i32)*, i32, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyMethodDef*, %struct.PyMemberDef*, %struct.PyGetSetDef*, %struct.PyTypeObject*, %struct.NullImporter*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, i32, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.PyTypeObject*, i32)*, %struct.NullImporter* (%struct.PyTypeObject*, %struct.NullImporter*, %struct.NullImporter*)*, void (i8*)*, [32 x i8] }
+%18 = type { %struct.PyMethodDef, %10 }
+%19 = type { i32, %struct.PyTypeObject*, i32, i8*, i32, i32, void (%struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.FILE*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, i8*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyNumberMethods*, %struct.PySequenceMethods*, %struct.PyMappingMethods*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.PyBufferProcs*, i32, i8*, i32 (%struct.NullImporter*, i32 (%struct.NullImporter*, i8*)*, i8*)*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, i32)*, i32, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyMethodDef*, %struct.PyMemberDef*, [72 x i8] }
+%20 = type { i32, %struct.PyTypeObject*, i32, i8*, i32, i32, void (%struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.FILE*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, i8*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyNumberMethods*, %struct.PySequenceMethods*, %struct.PyMappingMethods*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.PyBufferProcs*, i32, i8*, [104 x i8] }
+%21 = type { %22, %23 }
+%22 = type { i8*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, i8*)*, [8 x i8] }
+%23 = type { i8*, [16 x i8] }
+%24 = type { i32, %struct.PyTypeObject*, i32, i8*, i32, i32, void (%struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.FILE*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, i8*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyNumberMethods*, %struct.PySequenceMethods*, %struct.PyMappingMethods*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.PyBufferProcs*, i32, i8*, i32 (%struct.NullImporter*, i32 (%struct.NullImporter*, i8*)*, i8*)*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, i32)*, i32, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyMethodDef*, %struct.PyMemberDef*, %struct.PyGetSetDef*, [68 x i8] }
+%25 = type { i32 (i8*)*, i8* }
+%26 = type { i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i32, i32)*, i32 (%struct.NullImporter*, i32, %struct.NullImporter*)*, i32 (%struct.NullImporter*, i32, i32, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*)*, [8 x i8] }
+%27 = type { %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %23 }
+%28 = type { %29, %23 }
+%29 = type { i8*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, i8*)*, i8*, [4 x i8] }
+%30 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %31, %struct.PyMethodDef, %struct.PyMethodDef, %10 }
+%31 = type { i8*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32, [4 x i8] }
+%32 = type { %33, %33, %33, %33, %33, %33, %33, %33, %33, %33, %33, %33, %33, %33, %23 }
+%33 = type { i8*, i32, i32, i32, [4 x i8] }
+%34 = type { %struct.PyMethodDef, %31, %struct.PyMethodDef, %10 }
+%35 = type { %struct.PyMemberDef, %struct.PyMemberDef, %23 }
+%36 = type { %33, %33, %23 }
+%37 = type { %38, %23 }
+%38 = type { i8*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, [12 x i8] }
+%39 = type { i32, %struct.PyTypeObject*, i32, i8*, i32, i32, void (%struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.FILE*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, i8*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyNumberMethods*, %struct.PySequenceMethods*, %struct.PyMappingMethods*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.PyBufferProcs*, i32, i8*, i32 (%struct.NullImporter*, i32 (%struct.NullImporter*, i8*)*, i8*)*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, i32)*, i32, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyMethodDef*, %struct.PyMemberDef*, %struct.PyGetSetDef*, %struct.PyTypeObject*, %struct.NullImporter*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, [52 x i8] }
+%40 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %16 }
+%41 = type { %33, %23 }
+%42 = type { %38, %38, %38, %23 }
+%43 = type { %33, %33, %33, %33, %23 }
+%44 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %16 }
+%45 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %10 }
+%46 = type { %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, [88 x i8] }
+%47 = type { %struct._frozen, %struct._frozen, %48 }
+%48 = type { i8*, i8*, [4 x i8] }
+%49 = type { i64, i64, i8* }
+%50 = type { %31, %31, %31, %struct.PyMethodDef }
+%51 = type { %22, %22, %22, %23 }
+%52 = type { %struct.PyMemberDef, %23 }
+%53 = type { %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %23 }
+%54 = type { %31, %16 }
+%55 = type { %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %23 }
+%56 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %10 }
+%57 = type { %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %struct.PyMemberDef, %23 }
+%58 = type { %29, %29, %29, %23 }
+%59 = type { i32, %struct.PyTypeObject*, i32, i8*, i32, i32, [172 x i8] }
+%60 = type { %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %struct.PyStructSequence_Field, %61 }
+%61 = type { i8*, [4 x i8] }
+%62 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %31, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %10 }
+%63 = type { %struct.PyGetSetDef, %struct.PyGetSetDef, %23 }
+%64 = type { %33, %33, %33, %33, %33, %23 }
+%65 = type { %29, %29, %29, %29, %29, %29, %29, %23 }
+%66 = type { i32, %struct.PyTypeObject*, i32, i8*, i32, i32, void (%struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.FILE*, i32)*, %struct.NullImporter* (%struct.NullImporter*, i8*)*, i32 (%struct.NullImporter*, i8*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyNumberMethods*, %struct.PySequenceMethods*, %struct.PyMappingMethods*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*)*, i32 (%struct.NullImporter*, %struct.NullImporter*, %struct.NullImporter*)*, %struct.PyBufferProcs*, i32, i8*, i32 (%struct.NullImporter*, i32 (%struct.NullImporter*, i8*)*, i8*)*, i32 (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*, %struct.NullImporter*, i32)*, i32, %struct.NullImporter* (%struct.NullImporter*)*, %struct.NullImporter* (%struct.NullImporter*)*, %struct.PyMethodDef*, %struct.PyMemberDef*, %struct.PyGetSetDef*, %struct.PyTypeObject*, %struct.NullImporter*, [60 x i8] }
+%67 = type { %33, %33, %33, %33, %33, %33, %33, %23 }
+%68 = type { %22, %22, %22, %22, %22, %22, %22, %22, %23 }
+%69 = type { %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %struct.PyMethodDef, %10 }
+%70 = type { %33, %33, %33, %23 }
+%71 = type { %struct.PyMethodDef, %struct.Py