[llvm-commits] CVS: llvm/tools/llvm-upgrade/Makefile UpgradeLexer.cpp.cvs UpgradeLexer.l.cvs UpgradeParser.cpp.cvs UpgradeParser.h.cvs UpgradeParser.y.cvs llvm-upgrade.cpp

Reid Spencer reid at x10sys.com
Fri Jan 26 00:19:26 PST 2007



Changes in directory llvm/tools/llvm-upgrade:

Makefile updated: 1.5 -> 1.6
UpgradeLexer.cpp.cvs updated: 1.16 -> 1.17
UpgradeLexer.l.cvs updated: 1.16 -> 1.17
UpgradeParser.cpp.cvs updated: 1.44 -> 1.45
UpgradeParser.h.cvs updated: 1.31 -> 1.32
UpgradeParser.y.cvs updated: 1.43 -> 1.44
llvm-upgrade.cpp updated: 1.7 -> 1.8
---
Log message:

Regenerate.


---
Diffs of the changes:  (+9268 -6194)

 Makefile              |    2 
 UpgradeLexer.cpp.cvs  | 1838 ++++++-----
 UpgradeLexer.l.cvs    |  479 +--
 UpgradeParser.cpp.cvs | 7944 +++++++++++++++++++++++++++++---------------------
 UpgradeParser.h.cvs   |  498 +--
 UpgradeParser.y.cvs   | 4678 ++++++++++++++++++-----------
 llvm-upgrade.cpp      |   23 
 7 files changed, 9268 insertions(+), 6194 deletions(-)


Index: llvm/tools/llvm-upgrade/Makefile
diff -u llvm/tools/llvm-upgrade/Makefile:1.5 llvm/tools/llvm-upgrade/Makefile:1.6
--- llvm/tools/llvm-upgrade/Makefile:1.5	Fri Jan  5 16:03:42 2007
+++ llvm/tools/llvm-upgrade/Makefile	Fri Jan 26 02:19:09 2007
@@ -9,7 +9,7 @@
 
 LEVEL = ../..
 TOOLNAME = llvm-upgrade
-LINK_COMPONENTS := support system
+LINK_COMPONENTS := BCWriter Core support system
 REQUIRES_EH := 1
 
 include $(LEVEL)/Makefile.common


Index: llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs
diff -u llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.16 llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.17
--- llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.16	Sun Jan 14 20:41:46 2007
+++ llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs	Fri Jan 26 02:19:09 2007
@@ -20,7 +20,7 @@
 /* A lexical scanner generated by flex*/
 
 /* Scanner skeleton version:
- * $Header: /var/cvs/llvm/llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs,v 1.16 2007/01/15 02:41:46 reid Exp $
+ * $Header: /var/cvs/llvm/llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs,v 1.17 2007/01/26 08:19:09 reid Exp $
  */
 
 #define FLEX_SCANNER
@@ -317,39 +317,39 @@
 	*yy_cp = '\0'; \
 	yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 157
-#define YY_END_OF_BUFFER 158
-static yyconst short int yy_acclist[235] =
+#define YY_NUM_RULES 156
+#define YY_END_OF_BUFFER 157
+static yyconst short int yy_acclist[234] =
     {   0,
-      158,  156,  157,  155,  156,  157,  155,  157,  156,  157,
-      156,  157,  156,  157,  156,  157,  156,  157,  156,  157,
-      148,  156,  157,  148,  156,  157,    1,  156,  157,  156,
-      157,  156,  157,  156,  157,  156,  157,  156,  157,  156,
-      157,  156,  157,  156,  157,  156,  157,  156,  157,  156,
-      157,  156,  157,  156,  157,  156,  157,  156,  157,  156,
-      157,  156,  157,  156,  157,  156,  157,  156,  157,  156,
-      157,  147,  145,  144,  144,  151,  149,  153,  148,    1,
-      129,   39,   87,   56,   88,   77,   23,  147,  144,  144,
-      152,  153,   20,  153,  154,   65,   76,   37,   32,   40,
-
-       68,    3,   57,   58,   59,   52,   67,   93,   98,   96,
-       97,   95,   94,   99,  107,   72,  128,   92,   90,  123,
-      124,   91,   89,   66,  101,  106,  104,  105,  103,  102,
-      100,   78,  146,  153,  153,  125,   47,  108,  109,   86,
-       71,  137,   75,   85,  138,   54,  126,   22,  150,   70,
-      112,   74,   24,    4,   64,   69,   53,   73,   46,   11,
-      111,  153,   34,    2,    5,   60,  114,   62,   48,   80,
-       84,   82,   83,   81,   79,   50,  139,  110,   49,   55,
-       21,  136,   43,   61,   28,  133,   42,  116,  115,    7,
-      131,   31,  135,   36,   63,  122,  118,  130,   25,   26,
-
-      117,  132,   51,  127,  121,   41,    6,   27,  113,   35,
-        8,   16,    9,  120,   10,  119,   33,   12,   14,   13,
-       30,   38,   15,   29,  134,  140,  142,  143,   17,   44,
-      141,   18,   45,   19
+      157,  155,  156,  154,  155,  156,  154,  156,  155,  156,
+      155,  156,  155,  156,  155,  156,  155,  156,  155,  156,
+      147,  155,  156,  147,  155,  156,    1,  155,  156,  155,
+      156,  155,  156,  155,  156,  155,  156,  155,  156,  155,
+      156,  155,  156,  155,  156,  155,  156,  155,  156,  155,
+      156,  155,  156,  155,  156,  155,  156,  155,  156,  155,
+      156,  155,  156,  155,  156,  155,  156,  155,  156,  155,
+      156,  146,  144,  143,  143,  150,  148,  152,  147,    1,
+      129,   41,   85,   86,   75,   23,  146,  143,  143,  151,
+      152,   20,  152,  153,   63,   74,   39,   34,   42,   66,
+
+        3,   52,   65,   25,   95,  100,   98,   99,   97,   96,
+      101,  105,   70,  128,   90,   88,  121,  122,   89,   87,
+       64,  103,   94,   92,   93,   91,  104,  102,   76,  145,
+      152,  152,  124,   57,  106,  107,   84,   69,  136,   73,
+       83,  137,   54,  123,   22,  149,   68,  110,   72,   26,
+        4,   61,   67,   53,   71,   56,   11,  109,  152,   36,
+        2,    5,   58,  112,   60,   48,   78,   82,   80,   81,
+       79,   77,   50,  138,  108,   49,   55,   21,  126,  135,
+       45,   59,   30,   24,   44,  114,  113,    7,  131,   33,
+      134,   38,   62,  120,  116,  130,   27,   28,  115,  132,
+
+       51,  127,  125,  119,   43,    6,   29,  111,   37,    8,
+       17,    9,  118,   10,  117,   35,   12,   14,   13,   32,
+       40,   15,   31,  133,  139,  141,  142,   16,   46,  140,
+       18,   47,   19
     } ;
 
-static yyconst short int yy_accept[609] =
+static yyconst short int yy_accept[611] =
     {   0,
         1,    1,    1,    2,    4,    7,    9,   11,   13,   15,
        17,   19,   21,   24,   27,   30,   32,   34,   36,   38,
@@ -359,65 +359,65 @@
        81,   81,   81,   81,   81,   81,   81,   81,   81,   82,
        82,   83,   83,   83,   83,   83,   83,   83,   83,   83,
        84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   85,   85,   85,   85,   85,   85,   85,
-       85,   85,   85,   85,   86,   86,   86,   86,   86,   86,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       85,   85,   85,   85,   85,   85,   85,   85,   86,   86,
 
-       86,   87,   87,   87,   87,   87,   87,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,   87,   87,   87,   88,
-       88,   88,   88,   88,   88,   88,   88,   88,   88,   88,
-       88,   88,   88,   88,   88,   88,   88,   89,   90,   92,
-       93,   94,   95,   95,   96,   97,   97,   97,   98,   98,
-       98,   99,   99,  100,  100,  100,  100,  100,  101,  101,
-      101,  101,  101,  101,  101,  102,  102,  102,  103,  103,
-      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
-      103,  104,  105,  106,  106,  106,  106,  107,  107,  107,
-      107,  107,  107,  107,  107,  107,  107,  108,  108,  109,
-
-      110,  111,  112,  113,  114,  114,  115,  116,  116,  116,
-      117,  118,  118,  118,  118,  118,  118,  118,  118,  119,
-      120,  121,  121,  122,  122,  122,  122,  123,  124,  124,
-      124,  125,  125,  125,  125,  125,  125,  125,  125,  125,
-      126,  127,  128,  128,  128,  129,  129,  130,  130,  131,
-      131,  132,  132,  132,  132,  132,  132,  132,  132,  132,
-      132,  133,  133,  133,  134,  135,  135,  135,  135,  136,
-      136,  136,  136,  137,  137,  137,  138,  139,  140,  140,
-      140,  140,  140,  140,  140,  140,  140,  140,  140,  140,
-      140,  140,  140,  140,  141,  142,  142,  142,  142,  142,
-
-      143,  144,  144,  144,  145,  145,  145,  145,  145,  145,
-      145,  145,  145,  146,  147,  148,  148,  148,  149,  149,
-      149,  149,  150,  150,  151,  151,  151,  151,  151,  151,
-      151,  152,  152,  152,  152,  152,  153,  153,  153,  154,
-      154,  154,  155,  155,  156,  156,  157,  158,  158,  158,
-      158,  158,  158,  158,  159,  159,  159,  160,  160,  161,
-      161,  161,  162,  163,  164,  164,  164,  165,  165,  165,
-      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-      165,  165,  166,  166,  167,  168,  168,  168,  168,  168,
-      168,  168,  168,  168,  168,  168,  169,  169,  169,  169,
-
-      169,  169,  169,  169,  170,  170,  170,  171,  172,  173,
-      174,  175,  176,  177,  177,  177,  177,  178,  178,  178,
-      178,  179,  180,  180,  181,  182,  182,  182,  182,  182,
-      182,  182,  182,  182,  182,  183,  183,  183,  184,  184,
-      184,  184,  184,  184,  184,  184,  185,  186,  187,  187,
-      187,  188,  189,  190,  190,  190,  191,  191,  191,  191,
-      191,  192,  192,  193,  194,  195,  196,  196,  196,  196,
-      197,  197,  197,  198,  199,  200,  201,  202,  202,  202,
-      203,  204,  205,  205,  205,  205,  205,  205,  206,  206,
-      207,  207,  208,  209,  209,  209,  209,  209,  209,  210,
-
-      210,  210,  210,  210,  210,  210,  210,  210,  211,  211,
-      211,  211,  211,  211,  211,  211,  211,  211,  212,  212,
-      212,  212,  212,  213,  213,  213,  213,  213,  214,  215,
-      216,  216,  217,  217,  217,  217,  217,  218,  218,  218,
-      218,  219,  219,  220,  221,  221,  221,  221,  221,  221,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
+       87,   87,   87,   87,   88,   89,   91,   92,   93,   94,
+       94,   95,   96,   96,   96,   97,   97,   97,   98,   98,
+       99,   99,   99,   99,   99,  100,  100,  100,  100,  100,
+      100,  100,  101,  101,  101,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  104,  105,  105,  106,  107,  108,  109,  110,  111,
+
+      111,  112,  113,  113,  113,  114,  115,  115,  115,  115,
+      115,  115,  115,  115,  116,  117,  118,  118,  119,  119,
+      119,  119,  120,  121,  121,  121,  122,  122,  122,  122,
+      122,  122,  122,  122,  122,  123,  124,  125,  125,  125,
+      126,  126,  127,  127,  128,  128,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,  129,  130,  130,
+      130,  131,  132,  132,  132,  132,  133,  133,  133,  133,
+      134,  134,  134,  135,  136,  137,  137,  137,  137,  137,
+      137,  137,  137,  137,  137,  137,  137,  137,  137,  137,
+      137,  138,  139,  139,  139,  139,  139,  140,  141,  141,
+
+      141,  142,  142,  142,  142,  142,  142,  142,  142,  142,
+      143,  144,  145,  145,  145,  146,  146,  146,  146,  147,
+      147,  148,  148,  148,  148,  148,  148,  148,  149,  149,
+      149,  149,  149,  150,  150,  150,  151,  151,  151,  152,
+      152,  153,  153,  154,  155,  155,  155,  155,  155,  155,
+      155,  156,  156,  156,  156,  156,  157,  157,  158,  158,
+      158,  159,  160,  161,  161,  161,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
+      162,  163,  163,  164,  165,  165,  165,  165,  165,  165,
+      165,  165,  165,  165,  165,  166,  166,  166,  166,  166,
+
+      166,  166,  166,  167,  167,  167,  168,  169,  170,  171,
+      172,  173,  174,  174,  174,  174,  175,  175,  175,  175,
+      176,  177,  177,  178,  179,  179,  179,  179,  179,  179,
+      180,  180,  180,  180,  180,  180,  181,  181,  181,  182,
+      182,  182,  182,  182,  182,  182,  182,  183,  184,  185,
+      185,  185,  186,  187,  188,  188,  188,  189,  189,  189,
+      189,  189,  190,  190,  191,  192,  193,  194,  194,  194,
+      194,  195,  195,  195,  196,  197,  198,  199,  200,  200,
+      200,  201,  202,  203,  204,  204,  204,  204,  204,  204,
+      205,  205,  206,  206,  207,  208,  208,  208,  208,  208,
+
+      208,  209,  209,  209,  209,  209,  209,  209,  209,  209,
+      210,  210,  210,  210,  210,  210,  210,  210,  210,  210,
+      211,  211,  211,  211,  211,  212,  212,  212,  212,  212,
+      213,  214,  215,  215,  216,  216,  216,  216,  216,  217,
+      217,  217,  217,  218,  218,  219,  220,  220,  220,  220,
+      220,  220,  220,  220,  220,  220,  220,  220,  220,  220,
       221,  221,  221,  221,  221,  221,  221,  221,  222,  222,
-      222,  222,  222,  222,  222,  222,  223,  223,  223,  223,
-      223,  223,  224,  224,  224,  224,  224,  225,  225,  225,
-      226,  226,  226,  226,  226,  226,  226,  226,  226,  226,
-      226,  226,  226,  226,  227,  227,  228,  229,  230,  230,
+      222,  222,  222,  222,  223,  223,  223,  223,  223,  224,
+      224,  224,  225,  225,  225,  225,  225,  225,  225,  225,
+      225,  225,  225,  225,  225,  225,  226,  226,  227,  228,
 
-      231,  231,  232,  233,  234,  234,  235,  235
+      229,  229,  230,  230,  231,  232,  233,  233,  234,  234
     } ;
 
 static yyconst int yy_ec[256] =
@@ -426,16 +426,16 @@
         1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    2,    1,    4,    1,    5,    6,    1,    1,    1,
-        1,    1,    7,    1,    8,    9,    1,   10,   11,   12,
-       13,   14,   15,   16,   15,   17,   15,   18,   19,    1,
-        1,    1,    1,    1,   20,   20,   20,   20,   21,   20,
+        1,    1,    7,    1,    8,    9,    1,   10,   11,   11,
+       11,   11,   11,   12,   11,   13,   11,   14,   15,    1,
+        1,    1,    1,    1,   16,   16,   16,   16,   17,   16,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        1,    1,    1,    1,   22,    1,   23,   24,   25,   26,
+        1,    1,    1,    1,   18,    1,   19,   20,   21,   22,
 
-       27,   28,   29,   30,   31,    5,   32,   33,   34,   35,
-       36,   37,   38,   39,   40,   41,   42,   43,   44,   45,
-       46,   47,    1,    1,    1,    1,    1,    1,    1,    1,
+       23,   24,   25,   26,   27,    5,   28,   29,   30,   31,
+       32,   33,   34,   35,   36,   37,   38,   39,   40,   41,
+       42,   43,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -452,291 +452,291 @@
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[48] =
+static yyconst int yy_meta[44] =
     {   0,
-        1,    1,    2,    1,    3,    1,    4,    5,    3,    6,
-        6,    6,    6,    6,    6,    6,    6,    7,    1,    3,
-        8,    3,    3,    3,    3,    3,    8,    3,    3,    3,
+        1,    1,    2,    1,    3,    1,    1,    3,    3,    3,
+        3,    3,    3,    4,    1,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    3,    3,    3,    3
+        3,    3,    3
     } ;
 
-static yyconst short int yy_base[617] =
+static yyconst short int yy_base[615] =
     {   0,
-        0,    0, 1298, 1299, 1299, 1299, 1293, 1278,   40,    0,
-       48,   58,   68, 1250,    0,   68,   71,   81,   91,   52,
-      105,   93,  134,  117,  118,   73,  137,  143,   98,  175,
-      144,  210,  159,  116,   56,  119, 1290, 1299, 1275, 1299,
-        0,  241,    0, 1283, 1282,  140,  249, 1245,  267,    0,
-       70,  163,  145,   31,  157,  160,  168,   57, 1271,  170,
-       94,  180,  182,   54,  193,  189,  194,  114,  205, 1270,
-      271,  207,  204,  211,  208,  279,  206,  228,  249,   53,
-      121,  254, 1269,  268,  280,  281,  283,  290,  291,  285,
-      286,  287,  300, 1268,  305,  292,  309,  310,  314,  293,
-
-      316,  217,  317,  321,  311,  147,  322,  325,  328,  331,
-      341,  329,  344,  336,  339,  358,  347,  348, 1267,  363,
-      349,  346,  366,  370,  371,  372,  373,  384,  377,  388,
-      253,  398,  378,  401,  385,  403, 1266,    0,    0,  372,
-     1265,    0,  442,    0, 1264,  404,  407, 1263,  408,  412,
-     1262,  409, 1261,  414,  427,  428,  423, 1260,  418,  429,
-      444,  445,  447,  448, 1259,  452,  449,  454,  457,  459,
-      456,  458,  460,  464,  469,  255,  470,  476,  473,  471,
-     1258, 1257, 1256,  475,  472,  484,  486,  483,  490,  496,
-      497,  498,  500,  502,  503,  504, 1255,  507, 1254, 1253,
-
-     1252, 1251, 1250, 1249,  505, 1248, 1247,  512,  508, 1246,
-     1245,  540,  517,  516,  521,  515,  551,  530, 1244, 1243,
-     1242,  552, 1241,  554,  556,  557, 1240, 1239,  555,  558,
-     1238,  559,  561,  563,  567,  572,  569,  570,  577, 1237,
-     1236, 1235,  580,  583, 1234,  587, 1233,  585, 1232,  588,
-     1231,  590,  513,  584,  591,  514,  598,  592,  596,  416,
-     1230,  595,  607, 1299,  605,  622,  626,  628,  630,  621,
-      622,  623, 1229,  624,  626, 1228, 1227, 1226,  625,  627,
-      628,  633,  634,  636,  635,  637,  642,  647,  644,  643,
-      654,  646,  658, 1225, 1224,  645,  656,  660,  661, 1223,
-
-     1222,  666,  667, 1221,  669,  670,  671,  675,  673,  674,
-      676,  680, 1220, 1219, 1218,  683,  688, 1217,  686,  677,
-      690,    0,  696, 1216,  698,  697,  699,  706,  707,  709,
-     1215,  702,  712,  714,  717, 1214,  724,  713, 1213,  726,
-      721, 1212,  731, 1211,  728, 1210, 1209,  732,  734,  739,
-      740,  741,  743, 1208,  744,  747, 1207,  748, 1206,  751,
-      750, 1205,    0, 1204,  752,  754, 1203,  755,  759,  764,
-      767,  770,  758,  772,  776,  780,  781,  783,  782,  784,
-      785, 1202,  786, 1201, 1200,  789,  791,  794,  787,  788,
-      797,  798,  806,  807,  808, 1199,  810,  809,  812,  815,
-
-      816,  820,  822, 1198,  814,  828, 1197, 1196, 1195, 1194,
-     1193, 1192, 1191,  830,  831,  833, 1190,  834,  836,  838,
-     1189, 1188,  837, 1187, 1186,  839,  842,  840,  843,  844,
-      850,  853,  854,  857, 1185,  860,  861, 1184,  864,  865,
-      867,  869,  868,  870,  871, 1183, 1182, 1181,  875,  876,
-     1180, 1179, 1178,  885,  882, 1177,  887,  891,  897,  883,
-     1176,  886, 1175, 1174, 1173, 1172,  894,  901,  903, 1171,
-      904,  907, 1170, 1169, 1168, 1167, 1166,  908,  910, 1165,
-     1164, 1163,  909,  905,  911,  912,  914, 1162,  916, 1161,
-      923, 1160, 1159,  926,  928,  929,  930,  933, 1158,  934,
-
-      935,  936,  938,  937,  948,  932,  940, 1157,  944,  950,
-      956,  960,  962,  964,  966,  967,  968, 1156,  946,  972,
-      974,  975, 1155,  976,  977,  978,  980, 1150, 1147, 1144,
-      983, 1136,  993,  981,  985,  986, 1133,  998,  999, 1003,
-     1130, 1006, 1124, 1113, 1007, 1008, 1009, 1010, 1011, 1013,
-     1014, 1018, 1020, 1019, 1023, 1022, 1025, 1111, 1024, 1031,
-     1026, 1035, 1039, 1040, 1036, 1109, 1043, 1044, 1046, 1050,
-     1051, 1108, 1054, 1052, 1055, 1056, 1106, 1060, 1062, 1104,
-     1064, 1067, 1057, 1069, 1076, 1077, 1080, 1081, 1082, 1084,
-     1085, 1083, 1087, 1101, 1088, 1100, 1099, 1094, 1089,  982,
+        0,    0, 1308, 1309, 1309, 1309, 1303, 1292,   36,   40,
+       44,   50,   56,   62,    0,   63,   66,   81,   89,   47,
+      108,   91,  105,   96,  119,  117,  144,  128,   68,  170,
+      169,  202,   92,  111,  131,  125, 1301, 1309, 1290, 1309,
+        0,  207,  229,  234,  239,   70,  244,  259,  264,    0,
+      139,  145,  142,   76,  136,  156,  157,   31, 1289,  162,
+      164,  192,   48,  172,  268,  175,  173,  221,  212, 1288,
+      276,  278,  138,  186,   72,  279,  277,  280,  289,  249,
+      282,  290,  216,  281,  291,  189,  294,  284,  295, 1287,
+      297,  306,   73,  305,  316,  317,  246,  311,  318,  322,
+
+      323,  324,  327,  329,  330,  338,  332,  348,  350,  333,
+      337,  334,  362,  336,  364, 1286,  367,  351,  359,  371,
+      374,  379,  375,  381,  405,  386,  389,  403,  396,  378,
+      250,  376,  400, 1285,    0,  436,  440, 1284,  454,  471,
+        0, 1283,  382,  406, 1282,  410,  425, 1281,  415, 1280,
+      422,  430,  440,  456, 1279,  458,  459,  473,  412,  447,
+      460, 1278,  474,  442,  472,  477,  480,  476,  461,  478,
+      416,  488,  490,  491,  494,  495,  496,  492,  499,  506,
+      507,  500,  513,  505,  508,  520,  521,  523,  524,  525,
+     1277, 1276,  526, 1275, 1274, 1273, 1272, 1271, 1270,  527,
+
+     1269, 1268,  529,  533, 1267, 1266,  561,  538,  537,  542,
+      534,  572,  550, 1265, 1264, 1263,  553, 1262,  535,  575,
+      536, 1261, 1260,  576,  577, 1259,  555,  579,  540,  580,
+      586,  582,  585,  588, 1258, 1257, 1256,  593,  596, 1255,
+      590, 1254,  597, 1253,  600, 1252,  601,  602,  604,  605,
+      619,  609,  612,  618,  622,  611,  214, 1251,  628,  629,
+     1309,  635,  643,  651,  657,  662,  651,  663,  664, 1250,
+      665,  666, 1249, 1248, 1247,  667,  669,  672,  673,  675,
+      676,  677,  678,  683,  679,  686,  685,  691,  690,  693,
+     1246, 1245,  687,  697,  701,  702, 1244, 1243,  703,  707,
+
+     1242,  708,  709,  711,  713,  714,  719,  715,  721, 1241,
+     1240, 1239,  722,  724, 1238,  727,  729,  735,    0,  737,
+     1237,  741,  738,  742,  747,  748,  749, 1236,  743,  635,
+      750,  755, 1235,  760,  761, 1234,  763,  764, 1233,  767,
+     1232,  773, 1231, 1230,  775,  776,  778,  777,  781,  780,
+     1229,  783,  784,  789,  791, 1228,  792, 1227,  798,  793,
+     1226,  813, 1225,  794,  795, 1224,  801,  807,  816,  817,
+      822,  813,  796,  819,  825,  826,  828,  829,  830,  832,
+     1223,  833, 1222, 1221,  836,  837,  831,  842,  841,  843,
+      846,  853,  854,  855, 1220,  857,  858,  861,  862,  863,
+
+      866,  865, 1219,  876,  860, 1218, 1217, 1216, 1215, 1214,
+     1213, 1212,  877,  879,  880, 1211,  881,  882,  886, 1210,
+     1209,  884, 1208, 1207,  885,  890,  888,  887,  891, 1206,
+      898,  900,  901,  904,  907, 1205,  909,  911, 1204,  912,
+      916,  716,  917,  914,  915,  919, 1203, 1202, 1201,  935,
+      918, 1200, 1199, 1198,  925,  928, 1197,  938,  942,  943,
+      930, 1196,  945, 1195, 1194, 1193, 1192,  946,  949,  954,
+     1191,  950,  955, 1190, 1189, 1188, 1187, 1186,  956,  958,
+     1185, 1184, 1183, 1182,  957,  960,  968,  961,  962, 1181,
+      963, 1180,  973, 1179, 1178,  964,  975,  977,  978,  980,
+
+     1177,  981,  983,  984,  987,  988,  992,  994,  995, 1176,
+      997,  998, 1005, 1006, 1004, 1008, 1012, 1014,  920, 1175,
+     1015, 1017, 1020, 1021, 1174, 1023, 1024, 1025, 1026, 1171,
+     1162, 1160, 1029, 1159, 1027, 1044, 1032, 1028, 1158, 1045,
+     1049, 1033, 1157, 1050, 1155, 1154, 1053, 1055, 1056, 1057,
+     1059, 1060, 1061, 1063, 1065, 1066, 1067, 1069, 1071, 1152,
+     1074, 1077, 1080, 1082, 1083, 1085, 1087, 1148, 1090, 1091,
+     1096, 1097, 1098, 1147, 1095, 1101, 1102, 1103, 1145, 1107,
+     1108, 1140, 1106, 1109, 1114, 1118, 1122, 1123, 1126, 1129,
+     1128, 1130, 1131, 1132, 1133, 1070, 1134,  643,  552,  548,
 
-     1098,  756,  527,  419, 1093,  326, 1299, 1132, 1138, 1144,
-      268, 1152, 1158,  123, 1161, 1166
+     1139,  444, 1144,  360,  285,  252, 1142,  133, 1309, 1177,
+     1179,  143, 1183,   57
     } ;
 
-static yyconst short int yy_def[617] =
+static yyconst short int yy_def[615] =
     {   0,
-      607,    1,  607,  607,  607,  607,  608,  609,  610,  611,
-      609,  609,   11,   13,  612,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  608,  607,  609,  607,
-      613,  613,  614,  611,   11,  609,   11,   13,   11,  612,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  607,  613,   42,  615,
-      609,   47,   11,   49,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,   49,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  607,  615,  616,  616,  143,  143,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  212,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  267,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,    1,  609,  609,  609,  609,  610,  611,  612,  609,
+      611,  611,  611,  611,  613,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  610,  609,  611,  609,
+      614,  614,  609,  609,  611,  611,  611,  611,  611,  613,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  609,  614,  614,  609,  611,  611,  611,
+       49,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+
+      611,  611,  611,  611,  611,  611,   49,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      609,  609,  609,  609,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  207,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  609,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
 
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-
-      609,  609,  609,  609,  609,  609,    0,  607,  607,  607,
-      607,  607,  607,  607,  607,  607
+      611,  611,  611,  611,  611,  611,  611,  611,    0,  609,
+      609,  609,  609,  609
     } ;
 
-static yyconst short int yy_nxt[1347] =
+static yyconst short int yy_nxt[1353] =
     {   0,
         4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
-       14,   14,   14,   14,   14,   14,   14,    4,   15,    8,
-        8,    8,   16,   17,   18,   19,   20,   21,   22,    8,
-       23,    8,   24,   25,   26,   27,   28,    8,   29,   30,
-       31,   32,   33,   34,   35,    8,   36,   42,   40,   43,
-       43,   43,   43,   43,   43,   43,   43,   45,   45,   45,
-       45,   45,   45,   45,   45,   40,   46,  149,  181,   40,
-       40,   40,  134,   40,   40,   40,   47,   48,   48,   48,
-       48,   48,   48,   48,   48,   40,   69,   40,   40,   70,
-       40,  135,  155,   51,  162,  145,   71,   56,   40,   94,
-
-       52,   57,   53,   60,   54,   61,   58,   55,   40,   59,
-       40,   40,   49,   64,   95,   40,   62,   65,  158,   78,
-       63,   66,   40,   67,  105,   79,   68,   72,   43,   73,
-       74,   40,  182,   40,   40,   40,   40,   75,   40,   87,
-       91,   76,  133,   77,   80,  136,   81,   88,  141,   82,
-       83,   40,   89,   92,   40,  167,   90,   40,   84,   93,
-       40,   40,   40,   96,   40,   97,  118,   85,   86,   98,
-      148,   99,  102,  100,   40,  101,   40,   40,  103,  119,
-       40,  131,  120,  104,  106,   40,  150,   40,  152,  121,
-      151,  212,   40,  146,  132,  147,  153,   40,  107,   40,
-
-      108,  109,  156,  110,  111,  112,   40,  113,  154,  157,
-       40,   40,  159,  114,  160,  115,  116,  163,  117,  106,
-      161,   40,   40,   40,   40,   40,  166,   40,   40,  164,
-      168,  165,  178,  122,   40,  123,  124,  173,  125,  171,
-      126,  174,  127,  175,  128,   40,  172,  207,  129,  130,
-      139,  139,  139,  139,  139,  139,  139,  139,  142,  142,
-      142,  142,  142,  142,  142,  142,   40,  183,  179,  143,
-       40,   40,   40,   44,  256,  143,  144,  144,  144,  144,
-      144,  144,  144,  144,  180,   40,  144,  144,   40,  144,
-      144,  144,  144,  144,  144,  169,   40,   40,   40,  297,
-
-       40,  184,   40,   40,   40,  176,  189,   40,   40,   40,
-       40,  170,  196,  192,  194,  205,  185,   40,  195,  177,
-      186,  187,   40,  188,  190,  193,   40,   40,   40,  199,
-      191,   40,  197,   40,   40,  200,  202,  198,   40,   40,
-      204,  206,   40,   40,  210,   40,   40,  208,   40,  201,
-      203,  211,  215,   40,  225,  214,   40,  219,   40,  209,
-      216,   40,  229,   40,   40,   40,   40,  213,  217,  226,
-      227,  220,  218,  221,  230,   40,  222,  232,  233,  223,
-       40,  231,  224,   40,  228,  237,  234,   40,   40,   40,
-       40,  238,  266,  235,   40,   40,  239,  241,  266,  245,
-
-      259,   40,   40,  254,  236,   40,  243,  240,  246,  248,
-      249,  242,  244,  247,  250,   40,  260,  255,   40,  251,
-       40,   40,  252,  261,   40,   40,   40,  253,  257,   40,
-      258,   40,  270,   40,  272,   40,   40,  360,  275,  274,
-       40,  262,  271,  279,   40,   40,   40,  263,  267,  268,
-      273,  269,  269,  269,  269,  269,  269,  269,  269,  276,
-      277,   40,   40,  278,   40,   40,   40,  282,  280,   40,
-      281,   40,  287,   40,   40,   40,   40,   40,  285,  283,
-      284,   40,  286,  289,  288,  290,   40,   40,   40,   40,
-       40,  296,   40,   40,  303,  292,  294,  291,  293,  302,
-
-       40,   40,  300,   40,  305,  298,  295,   40,  299,  301,
-      306,  304,  307,   40,   40,   40,  310,   40,  309,   40,
-       40,   40,   40,  313,   40,   40,  308,  311,  314,   40,
-       40,   40,   40,   40,   40,  316,  356,  312,   40,  318,
-      315,  326,  319,  353,   40,  317,  320,   40,  321,  322,
-      322,  322,  322,  322,  322,  322,  322,  323,  324,  322,
-      322,  325,  322,  322,  322,  322,  322,  322,   40,   40,
-      331,   40,   40,   40,   40,   40,   40,  327,   40,  328,
-       40,  333,  334,  329,   40,  330,   40,   40,  336,   40,
-      332,  340,  335,  339,   40,  344,  337,   40,  342,  338,
-
-       40,   40,   40,  341,   40,   40,  343,   40,   40,   40,
-      345,  350,   40,   40,  358,   40,  352,  354,  348,  346,
-      347,  349,  351,  357,   40,  266,  355,  359,  267,  267,
-      361,  266,  607,  607,  607,   39,  607,   39,   40,   40,
-       40,   40,   40,   40,   40,   40,  365,  362,  368,  369,
-       40,   40,   40,   40,   40,  364,  373,  366,  367,   40,
-       40,   40,   40,   40,   40,  372,  374,  370,  371,  378,
-      376,   40,  382,   40,  377,   40,  381,   40,   40,  375,
-      379,  380,  383,   40,   40,  384,   40,   40,   40,  390,
-       40,   40,   40,   40,   40,  391,  385,   40,  389,  386,
-
-       40,  387,  388,   40,  395,   40,  396,   40,  392,  393,
-      394,  397,  398,   40,   40,   40,   40,  402,  399,   40,
-      400,  406,  404,   40,   40,  403,   40,  401,  405,   40,
-       40,   40,  408,  410,   40,  412,  407,  418,   40,  414,
-      415,   40,  413,   40,  416,   40,  409,  411,   40,   40,
-      417,   40,  419,  420,  422,  421,   40,   40,   40,  423,
-       40,   40,  424,  427,   40,   40,  425,   40,   40,   40,
-      426,   40,   40,   40,  435,   40,   40,  428,  432,  436,
-      434,   40,  429,  438,   40,  430,  439,   40,  431,   40,
-      433,  440,  441,   40,  437,  443,  442,   40,   40,   40,
-
-       40,   40,   40,   40,   40,   40,   40,  446,   40,  450,
-      451,   40,  444,  455,   40,   40,  445,  447,  449,  452,
-      456,  453,  448,   40,   40,   40,   40,   40,  454,   40,
-      457,   40,   40,   40,  461,  463,  464,   40,  458,   40,
-      459,  465,  466,  460,  462,   40,  467,   40,   40,  469,
-       40,   40,  468,   40,   40,   40,   40,   40,  472,   40,
-       40,   40,  471,  474,  476,  480,  479,   40,  470,  473,
-       40,   40,  482,  477,   40,  484,  475,   40,   40,  478,
-      483,   40,   40,  481,   40,   40,   40,   40,   40,  490,
-      487,  486,   40,   40,  485,  492,  496,  497,  489,   40,
-
-       40,  488,   40,   40,   40,  494,  495,  493,   40,  499,
-      505,   40,  491,  501,   40,  500,  498,  502,   40,  503,
-       40,   40,   40,  504,   40,   40,   40,   40,   40,   40,
-      509,   40,  506,   40,  510,  507,  515,  508,  511,  512,
-       40,  513,  516,   40,  514,   40,   40,   40,  517,   40,
-       40,   40,   40,   40,   40,   40,  518,   40,  519,  524,
-      525,   40,  523,   40,  520,   40,  521,   40,  527,  526,
-      528,  531,  522,   40,  530,  529,  534,   40,  535,   40,
-      532,   40,  536,   40,   40,   40,  533,  542,  537,   40,
-      539,   40,   40,   40,   40,   40,  541,   40,   40,   40,
-
-       40,  545,   40,   40,  538,  552,  549,  540,  546,  554,
-       40,  547,  543,  550,  544,   40,   40,  553,  548,  551,
-       40,  556,  555,   40,   40,   40,   40,   40,   40,  559,
-       40,   40,  562,  557,  560,   40,   40,   40,  565,   40,
-       40,   40,   40,   40,  563,  569,  558,  571,   40,  561,
-      567,  568,   40,   40,  570,  572,   40,   40,  566,  564,
-       40,   40,  574,   40,  573,  576,  577,   40,   40,   40,
-      580,   40,   40,   40,   40,  575,  578,   40,  581,   40,
-      584,   40,  582,  583,   40,  586,   40,  592,  589,  579,
-      587,  591,  585,   40,   40,  588,  590,   40,   40,   40,
-
-       40,   40,   40,  593,   40,   40,   40,  598,  599,  600,
-       40,   40,  595,  604,  594,   40,   40,   40,   40,  597,
-      596,   40,  603,   40,  605,   40,   40,  602,   40,  601,
-       40,  606,   37,   37,   37,   37,   37,   37,   37,   37,
-       39,   40,   39,   39,   39,   39,   41,   40,   41,   41,
-       40,   41,   50,   40,   50,   50,   50,   50,   50,   50,
-      138,   40,  138,  138,   40,  138,  265,   40,  265,  363,
-      363,  363,   40,   40,   40,   40,   40,   40,   40,   40,
-       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
+       14,   14,   14,    4,   15,    8,    8,    8,   16,   17,
+       18,   19,   20,   21,   22,    8,   23,    8,   24,   25,
+       26,   27,   28,    8,   29,   30,   31,   32,   33,   34,
+       35,    8,   36,   42,   40,   43,   43,   43,   43,   44,
+       44,   44,   44,   45,   45,   45,   45,   40,   46,  135,
+       40,   40,  152,   40,   47,   48,   48,   48,   48,   40,
+       47,   48,   48,   48,   48,   40,   40,   69,  138,   40,
+       70,   40,  158,   40,   51,   40,   40,   71,   56,   40,
+      102,   52,   57,   53,   40,   54,   49,   58,   55,   60,
+
+       59,   61,   40,  172,   40,   40,  194,   64,  146,   40,
+      128,   65,   62,   78,   83,   66,   63,   67,   40,   79,
+       68,   40,   84,  129,   40,   80,   72,   85,   73,   74,
+       40,   86,   40,  130,   81,   82,   75,   87,   40,   90,
+       76,   40,   77,  131,   40,   41,   40,  133,   91,   40,
+       88,   40,   40,   99,   92,   40,   89,   40,   40,  100,
+      142,  147,  132,  145,  101,  148,   93,  170,   94,   40,
+       40,  143,   95,  144,   96,   40,   97,   40,   98,  103,
+      149,  150,   40,   40,  155,   40,   40,  115,   40,  104,
+      153,  105,  106,  151,  107,  108,  109,  154,  110,   40,
+
+      116,  163,   40,  117,  111,   40,  112,  113,  159,  114,
+      118,  103,  171,  162,  188,   40,  136,  136,  136,  136,
+      156,  119,  157,  120,  121,   40,  122,   40,  123,   40,
+      124,  359,  125,  165,   40,  183,  126,  127,   43,   43,
+       43,   43,  137,   44,   44,   44,   44,   47,   45,   45,
+       45,   45,   40,  139,  139,  139,  139,   40,  164,   40,
+      140,  257,   40,   40,  200,   40,  140,   47,   48,   48,
+       48,   48,   40,  141,  141,  141,  141,   40,  178,  141,
+      141,   40,  141,  141,  141,  141,  141,  141,  160,   40,
+       40,   40,   40,   40,   40,   40,  166,   40,   40,  175,
+
+      161,  173,   40,   40,   40,  190,  168,   40,   40,  186,
+       40,  184,  167,  169,  179,  174,  176,  185,   40,   40,
+      177,  187,  189,  191,   40,  180,  181,  195,  182,   40,
+       40,   40,  201,  192,  193,   40,   40,   40,  197,  199,
+       40,  196,   40,   40,  202,   40,   40,   40,  203,   40,
+       40,   40,  198,  205,  214,  222,  209,  204,  210,  224,
+      206,   40,  227,   40,   40,  225,  211,  207,  215,  223,
+      208,  220,   40,   40,  212,   40,  216,   40,  213,  217,
+       40,  226,  218,  232,   40,  219,  221,   40,   40,   40,
+      228,   40,   40,  230,   40,   40,  256,  234,  229,   40,
+
+      233,  236,   40,  240,  231,  238,  267,  235,  249,   40,
+      258,  239,  241,   40,  250,  237,   40,  242,   40,   40,
+      251,  252,  254,   40,  255,   40,  243,  244,   40,   40,
+      279,  245,  269,  253,  259,   40,  246,  268,   40,  247,
+      260,  271,  272,   40,  248,  136,  136,  136,  136,  262,
+      262,  262,  262,   40,  292,   40,  263,   40,  273,  270,
+       40,  284,  263,  139,  139,  139,  139,   40,  274,   40,
+      140,   40,   40,   40,   40,  280,  140,  264,  265,  276,
+      266,  266,  266,  266,   40,   40,   40,   40,  281,   40,
+       40,   40,  275,   40,  277,  278,  282,  290,  285,  286,
+
+      283,   40,  287,   40,   40,   40,  293,   40,   40,   40,
+      291,  289,   40,   40,  288,  300,  297,  299,   40,   40,
+       40,   40,  295,  298,  301,  296,   40,  302,  303,  304,
+      294,  306,  308,   40,   40,  307,   40,   40,   40,   40,
+       40,  310,   40,  305,  309,  311,   40,   40,   40,   40,
+       40,   40,  313,   40,  315,   40,  323,  312,  330,  317,
+      316,   40,  314,   40,  337,   40,   40,  332,   40,  318,
+      319,  319,  319,  319,  320,  321,  319,  319,  322,  319,
+      319,  319,  319,  319,  319,   40,  328,  329,   40,   40,
+       40,  335,   40,   40,  324,   40,  325,  331,   40,   40,
+
+      326,   40,  327,   40,  341,  333,   40,  336,  339,   40,
+       40,  334,  338,   40,   40,   40,  340,   40,   40,  347,
+      346,  342,   40,  349,   40,   40,  343,  345,  350,  344,
+      348,   40,   40,  351,  355,   40,  352,  353,  358,  356,
+      357,   40,   40,  354,  262,  262,  262,  262,   40,  264,
+      264,  263,  362,  362,  362,  362,   40,  263,  413,  360,
+      362,  362,  362,  362,   40,  361,  266,  266,  266,  266,
+       40,  266,  266,  266,  266,   40,   40,   40,   40,   40,
+       40,  363,   40,  364,  367,   40,   40,  368,   40,   40,
+       40,   40,   40,  372,  365,  366,   40,  377,   40,   40,
+
+       40,  371,  373,   40,   40,  369,   40,  375,  370,  380,
+       40,  376,  381,  382,   40,   40,   40,  374,  378,  379,
+       40,   40,   40,  383,   40,  389,   40,   40,   40,   40,
+      390,  388,   40,  384,   40,   40,  385,   40,  386,  387,
+       40,  394,   40,  391,  393,  392,  396,  395,   40,  397,
+       40,   40,  399,  398,   40,   40,   40,  493,  405,  403,
+       40,   40,   40,   40,  400,  401,  402,  404,   40,  407,
+      409,  411,  414,   40,   40,  406,   40,   40,  415,  412,
+       40,  417,  416,  408,  410,  418,   40,  420,   40,   40,
+       40,   40,  419,   40,   40,  421,   40,   40,  422,  426,
+
+      423,  424,   40,  425,   40,   40,   40,   40,   40,   40,
+      427,   40,  436,  430,   40,  444,  437,  428,  429,  435,
+       40,  433,  362,  362,  362,  362,   40,  439,  432,   40,
+       40,  431,   40,  434,  440,   40,  438,  441,   40,   40,
+      442,   40,   40,   40,   40,   40,   40,  443,  447,   40,
+       40,  445,  451,  452,   40,   40,   40,  446,  448,   40,
+      450,  455,  453,  454,  456,  449,   40,   40,   40,  457,
+       40,   40,  458,   40,   40,   40,   40,  462,   40,   40,
+      464,  465,  459,  460,  466,  467,  461,  463,  468,   40,
+       40,  469,   40,   40,   40,   40,  471,   40,   40,   40,
+
+       40,   40,  473,   40,   40,  472,  475,  470,  477,  481,
+      480,   40,  474,   40,   40,  483,  478,   40,  476,  486,
+       40,  479,   40,  482,   40,   40,  485,   40,   40,   40,
+       40,   40,   40,   40,  484,  489,  492,  488,   40,  494,
+      487,   40,  491,   40,  543,  501,  496,  490,   40,  495,
+      497,   40,  498,  499,  500,   40,   40,  502,   40,   40,
+      503,  505,   40,   40,  504,  507,  506,   40,   40,   40,
+       40,   40,  511,   40,   40,   40,   40,   40,  512,  509,
+      508,   40,  513,  514,  510,  515,   40,  518,   40,  517,
+       40,   40,  519,   40,   40,  516,   40,   40,  522,  520,
+
+       40,   40,  526,  527,  521,   40,  525,   40,   40,  523,
+       40,   40,  529,  528,  532,  530,  524,   40,   40,   40,
+      536,   40,  531,  537,  538,   40,  539,   40,   40,  533,
+       40,  534,  541,   40,   40,  535,   40,   40,   40,   40,
+       40,   40,   40,  547,  540,   40,   40,  556,  551,  553,
+      542,  548,  544,  545,  549,  552,  546,   40,   40,  559,
+      555,  550,   40,   40,  554,  557,   40,  558,   40,   40,
+       40,  561,   40,   40,   40,  564,   40,  562,   40,   40,
+       40,  567,   40,   40,   40,  571,  560,   40,  565,  573,
+       40,  569,  563,   40,  570,   40,   40,  572,   40,  568,
+
+       40,  574,  566,   40,   40,  578,  575,  579,   40,   40,
+       40,   40,  576,  582,   40,   40,   40,  586,  577,   40,
+       40,   40,   40,  580,  583,  584,  585,   40,  588,  593,
+      591,   40,  581,  589,  592,   40,   40,  587,  590,   40,
+      594,   40,   40,   40,   40,   40,   40,   40,  595,  600,
+      601,  602,   40,   40,  597,   40,  596,   40,   40,  606,
+       40,   40,  598,  599,  605,   40,  607,   40,   40,  604,
+       40,   40,   40,   40,  603,   40,  608,   37,   37,   37,
+       37,   39,   39,   50,   40,   50,   50,   40,   40,   40,
        40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
 
        40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
@@ -747,166 +747,168 @@
        40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
        40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
        40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
-       40,   40,   40,  264,   40,   40,   40,   40,   40,   39,
-       47,  140,   40,  137,   39,   40,   38,  607,    3,  607,
+       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,  261,   40,
 
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607
+       40,   40,   40,   40,  134,   40,   38,  609,    3,  609,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,  609
     } ;
 
-static yyconst short int yy_chk[1347] =
+static yyconst short int yy_chk[1353] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    9,   54,    9,
-        9,    9,    9,    9,    9,    9,    9,   11,   11,   11,
-       11,   11,   11,   11,   11,   11,   12,   54,   80,   20,
-       80,   64,   35,   35,   58,   12,   13,   13,   13,   13,
-       13,   13,   13,   13,   13,   16,   20,   51,   17,   20,
-       26,   35,   58,   16,   64,   51,   20,   17,   18,   26,
-
-       16,   17,   16,   18,   16,   18,   17,   16,   19,   17,
-       22,   61,   13,   19,   26,   29,   18,   19,   61,   22,
-       18,   19,   21,   19,   29,   22,   19,   21,  614,   21,
-       21,   68,   81,   34,   24,   25,   36,   21,   81,   24,
-       25,   21,   34,   21,   23,   36,   23,   24,   46,   23,
-       23,   23,   24,   25,   27,   68,   24,   46,   23,   25,
-       28,   31,   53,   27,  106,   27,   31,   23,   23,   27,
-       53,   27,   28,   27,   55,   27,   33,   56,   28,   31,
-       52,   33,   31,   28,   30,   57,   55,   60,   56,   31,
-       55,  106,   30,   52,   33,   52,   57,   62,   30,   63,
-
-       30,   30,   60,   30,   30,   30,   66,   30,   57,   60,
-       65,   67,   62,   30,   62,   30,   30,   65,   30,   32,
-       63,   73,   69,   77,   72,   75,   67,   32,   74,   65,
-       69,   66,   77,   32,  102,   32,   32,   73,   32,   72,
-       32,   74,   32,   75,   32,   78,   72,  102,   32,   32,
-       42,   42,   42,   42,   42,   42,   42,   42,   47,   47,
-       47,   47,   47,   47,   47,   47,   79,   82,   78,   47,
-      131,   82,  176,  611,  131,   47,   49,   49,   49,   49,
-       49,   49,   49,   49,   79,   84,   49,   49,   71,   49,
-       49,   49,   49,   49,   49,   71,   76,   85,   86,  176,
-
-       87,   84,   90,   91,   92,   76,   87,   88,   89,   96,
-      100,   71,   92,   89,   90,  100,   85,   93,   91,   76,
-       86,   86,   95,   86,   88,   89,   97,   98,  105,   96,
-       88,   99,   93,  101,  103,   97,   98,   95,  104,  107,
-       99,  101,  108,  606,  105,  109,  112,  103,  110,   97,
-       98,  105,  109,  114,  112,  108,  115,  110,  111,  104,
-      109,  113,  114,  122,  117,  118,  121,  107,  109,  112,
-      113,  110,  109,  111,  115,  116,  111,  117,  118,  111,
-      120,  116,  111,  123,  113,  121,  118,  124,  125,  126,
-      127,  122,  140,  120,  129,  133,  123,  125,  140,  127,
-
-      133,  128,  135,  129,  120,  130,  126,  124,  127,  128,
-      128,  125,  126,  127,  128,  132,  134,  130,  134,  128,
-      136,  146,  128,  135,  147,  149,  152,  128,  132,  150,
-      132,  154,  146,  260,  149,  159,  604,  260,  154,  152,
-      157,  136,  147,  159,  155,  156,  160,  136,  143,  143,
-      150,  143,  143,  143,  143,  143,  143,  143,  143,  155,
-      156,  161,  162,  157,  163,  164,  167,  162,  160,  166,
-      161,  168,  167,  171,  169,  172,  170,  173,  166,  163,
-      164,  174,  166,  169,  168,  170,  175,  177,  180,  185,
-      179,  175,  184,  178,  180,  171,  173,  170,  172,  179,
-
-      188,  186,  178,  187,  185,  177,  174,  189,  177,  178,
-      186,  184,  187,  190,  191,  192,  189,  193,  188,  194,
-      195,  196,  205,  192,  198,  209,  187,  190,  193,  208,
-      253,  256,  216,  214,  213,  195,  256,  191,  215,  198,
-      194,  216,  205,  253,  603,  196,  208,  218,  209,  212,
-      212,  212,  212,  212,  212,  212,  212,  213,  214,  212,
-      212,  215,  212,  212,  212,  212,  212,  212,  217,  222,
-      218,  224,  229,  225,  226,  230,  232,  217,  233,  217,
-      234,  224,  225,  217,  235,  217,  237,  238,  229,  236,
-      222,  234,  226,  233,  239,  237,  230,  243,  236,  232,
-
-      244,  254,  248,  235,  246,  250,  236,  252,  255,  258,
-      238,  248,  262,  259,  258,  257,  252,  254,  244,  239,
-      243,  246,  250,  257,  263,  265,  255,  259,  266,  266,
-      262,  265,  267,  267,  268,  268,  269,  269,  270,  271,
-      272,  274,  279,  275,  280,  281,  271,  263,  275,  279,
-      282,  283,  285,  284,  286,  270,  283,  272,  274,  287,
-      290,  289,  296,  292,  288,  282,  284,  280,  281,  288,
-      286,  291,  292,  297,  287,  293,  291,  298,  299,  285,
-      289,  290,  293,  302,  303,  296,  305,  306,  307,  303,
-      309,  310,  308,  311,  320,  305,  297,  312,  302,  298,
-
-      316,  298,  299,  319,  309,  317,  310,  321,  306,  307,
-      308,  311,  312,  323,  326,  325,  327,  320,  316,  332,
-      317,  326,  323,  328,  329,  321,  330,  319,  325,  333,
-      338,  334,  328,  329,  335,  330,  327,  338,  341,  333,
-      334,  337,  332,  340,  335,  345,  328,  329,  343,  348,
-      337,  349,  340,  341,  345,  343,  350,  351,  352,  348,
-      353,  355,  349,  352,  356,  358,  350,  361,  360,  365,
-      351,  366,  368,  602,  365,  373,  369,  353,  360,  366,
-      361,  370,  355,  369,  371,  356,  370,  372,  358,  374,
-      360,  371,  372,  375,  368,  374,  373,  376,  377,  379,
-
-      378,  380,  381,  383,  389,  390,  386,  377,  387,  381,
-      383,  388,  375,  389,  391,  392,  376,  378,  380,  386,
-      390,  387,  379,  393,  394,  395,  398,  397,  388,  399,
-      391,  405,  400,  401,  395,  398,  399,  402,  392,  403,
-      393,  400,  401,  394,  397,  406,  402,  414,  415,  405,
-      416,  418,  403,  419,  423,  420,  426,  428,  415,  427,
-      429,  430,  414,  418,  420,  428,  427,  431,  406,  416,
-      432,  433,  430,  423,  434,  432,  419,  436,  437,  426,
-      431,  439,  440,  429,  441,  443,  442,  444,  445,  440,
-      436,  434,  449,  450,  433,  442,  449,  449,  439,  455,
-
-      460,  437,  454,  462,  457,  444,  445,  443,  458,  454,
-      462,  467,  441,  457,  459,  455,  450,  458,  468,  459,
-      469,  471,  484,  460,  472,  478,  483,  479,  485,  486,
-      471,  487,  467,  489,  472,  468,  485,  469,  478,  479,
-      491,  483,  486,  494,  484,  495,  496,  497,  487,  506,
-      498,  500,  501,  502,  504,  503,  489,  507,  491,  498,
-      500,  509,  497,  519,  494,  505,  495,  510,  502,  501,
-      503,  506,  496,  511,  505,  504,  510,  512,  511,  513,
-      507,  514,  512,  515,  516,  517,  509,  519,  513,  520,
-      515,  521,  522,  524,  525,  526,  517,  527,  534,  600,
-
-      531,  522,  535,  536,  514,  534,  527,  516,  524,  536,
-      533,  525,  520,  531,  521,  538,  539,  535,  526,  533,
-      540,  539,  538,  542,  545,  546,  547,  548,  549,  545,
-      550,  551,  548,  540,  546,  552,  554,  553,  551,  556,
-      555,  559,  557,  561,  549,  555,  542,  557,  560,  547,
-      553,  554,  562,  565,  556,  559,  563,  564,  552,  550,
-      567,  568,  561,  569,  560,  563,  564,  570,  571,  574,
-      568,  573,  575,  576,  583,  562,  565,  578,  569,  579,
-      573,  581,  570,  571,  582,  575,  584,  583,  579,  567,
-      576,  582,  574,  585,  586,  578,  581,  587,  588,  589,
-
-      592,  590,  591,  584,  593,  595,  599,  589,  590,  591,
-      605,  598,  586,  599,  585,  601,  597,  596,  594,  588,
-      587,  580,  595,  577,  601,  572,  566,  593,  558,  592,
-      544,  605,  608,  608,  608,  608,  608,  608,  608,  608,
-      609,  543,  609,  609,  609,  609,  610,  541,  610,  610,
-      537,  610,  612,  532,  612,  612,  612,  612,  612,  612,
-      613,  530,  613,  613,  529,  613,  615,  528,  615,  616,
-      616,  616,  523,  518,  508,  499,  493,  492,  490,  488,
-      482,  481,  480,  477,  476,  475,  474,  473,  470,  466,
-      465,  464,  463,  461,  456,  453,  452,  451,  448,  447,
-
-      446,  438,  435,  425,  424,  422,  421,  417,  413,  412,
-      411,  410,  409,  408,  407,  404,  396,  385,  384,  382,
-      367,  364,  362,  359,  357,  354,  347,  346,  344,  342,
-      339,  336,  331,  324,  318,  315,  314,  313,  304,  301,
-      300,  295,  294,  278,  277,  276,  273,  261,  251,  249,
-      247,  245,  242,  241,  240,  231,  228,  227,  223,  221,
-      220,  219,  211,  210,  207,  206,  204,  203,  202,  201,
-      200,  199,  197,  183,  182,  181,  165,  158,  153,  151,
-      148,  145,  141,  137,  119,   94,   83,   70,   59,   48,
-       45,   44,   39,   37,   14,    8,    7,    3,  607,  607,
-
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607
+        1,    1,    1,    9,   58,    9,    9,    9,    9,   10,
+       10,   10,   10,   11,   11,   11,   11,   11,   12,  614,
+       20,   63,   58,   12,   13,   13,   13,   13,   13,   13,
+       14,   14,   14,   14,   14,   14,   16,   20,   46,   17,
+       20,   29,   63,   46,   16,   75,   93,   20,   17,   54,
+       29,   16,   17,   16,   18,   16,   13,   17,   16,   18,
+
+       17,   18,   19,   75,   22,   33,   93,   19,   54,   24,
+       33,   19,   18,   22,   24,   19,   18,   19,   23,   22,
+       19,   21,   24,   33,   34,   23,   21,   24,   21,   21,
+       26,   24,   25,   34,   23,   23,   21,   25,   36,   26,
+       21,   28,   21,   35,   35,  612,  608,   36,   26,   55,
+       25,   73,   51,   28,   26,   53,   25,   27,   52,   28,
+       51,   55,   35,   53,   28,   55,   27,   73,   27,   56,
+       57,   52,   27,   52,   27,   60,   27,   61,   27,   30,
+       56,   57,   31,   30,   61,   64,   67,   31,   66,   30,
+       60,   30,   30,   57,   30,   30,   30,   60,   30,   74,
+
+       31,   67,   86,   31,   30,   62,   30,   30,   64,   30,
+       31,   32,   74,   66,   86,   32,   42,   42,   42,   42,
+       62,   32,   62,   32,   32,   69,   32,  257,   32,   83,
+       32,  257,   32,   69,   68,   83,   32,   32,   43,   43,
+       43,   43,   44,   44,   44,   44,   44,   45,   45,   45,
+       45,   45,   45,   47,   47,   47,   47,   47,   68,   97,
+       47,  131,   80,  131,   97,  606,   47,   48,   48,   48,
+       48,   48,   48,   49,   49,   49,   49,   49,   80,   49,
+       49,   65,   49,   49,   49,   49,   49,   49,   65,   71,
+       77,   72,   76,   78,   84,   81,   71,   88,  605,   77,
+
+       65,   76,   79,   82,   85,   88,   72,   87,   89,   85,
+       91,   84,   71,   72,   81,   76,   78,   84,   94,   92,
+       79,   85,   87,   89,   98,   82,   82,   94,   82,   95,
+       96,   99,   98,   91,   92,  100,  101,  102,   95,   96,
+      103,   94,  104,  105,   99,  107,  110,  112,  100,  114,
+      111,  106,   95,  102,  107,  110,  105,  101,  106,  111,
+      102,  108,  114,  109,  118,  112,  106,  103,  107,  110,
+      104,  109,  119,  604,  106,  113,  108,  115,  106,  108,
+      117,  113,  108,  118,  120,  108,  109,  121,  123,  132,
+      115,  130,  122,  117,  124,  143,  130,  120,  115,  126,
+
+      119,  122,  127,  124,  117,  123,  143,  121,  126,  129,
+      132,  123,  124,  133,  127,  122,  128,  124,  125,  144,
+      128,  128,  129,  146,  129,  159,  125,  125,  149,  171,
+      159,  125,  146,  128,  133,  151,  125,  144,  147,  125,
+      133,  149,  151,  152,  125,  136,  136,  136,  136,  137,
+      137,  137,  137,  153,  171,  164,  137,  602,  152,  147,
+      160,  164,  137,  139,  139,  139,  139,  139,  153,  154,
+      139,  156,  157,  161,  169,  160,  139,  140,  140,  156,
+      140,  140,  140,  140,  140,  165,  158,  163,  161,  168,
+      166,  170,  154,  167,  157,  158,  163,  169,  165,  166,
+
+      163,  172,  167,  173,  174,  178,  172,  175,  176,  177,
+      170,  168,  179,  182,  167,  177,  175,  176,  184,  180,
+      181,  185,  174,  175,  178,  174,  183,  179,  180,  181,
+      173,  182,  184,  186,  187,  183,  188,  189,  190,  193,
+      200,  186,  203,  181,  185,  187,  204,  211,  219,  221,
+      209,  208,  189,  229,  193,  210,  211,  188,  219,  203,
+      200,  600,  190,  213,  229,  599,  217,  221,  227,  204,
+      207,  207,  207,  207,  208,  209,  207,  207,  210,  207,
+      207,  207,  207,  207,  207,  212,  213,  217,  220,  224,
+      225,  227,  228,  230,  212,  232,  212,  220,  233,  231,
+
+      212,  234,  212,  241,  232,  224,  238,  228,  231,  239,
+      243,  225,  230,  245,  247,  248,  231,  249,  250,  243,
+      241,  233,  252,  247,  256,  253,  234,  239,  248,  238,
+      245,  254,  251,  249,  253,  255,  250,  251,  256,  254,
+      255,  259,  260,  252,  262,  262,  262,  262,  330,  263,
+      263,  262,  263,  263,  263,  263,  598,  262,  330,  259,
+      264,  264,  264,  264,  267,  260,  265,  265,  265,  265,
+      265,  266,  266,  266,  266,  266,  268,  269,  271,  272,
+      276,  267,  277,  268,  272,  278,  279,  276,  280,  281,
+      282,  283,  285,  280,  269,  271,  284,  285,  287,  286,
+
+      293,  279,  281,  289,  288,  277,  290,  283,  278,  288,
+      294,  284,  289,  290,  295,  296,  299,  282,  286,  287,
+      300,  302,  303,  293,  304,  300,  305,  306,  308,  442,
+      302,  299,  307,  294,  309,  313,  295,  314,  295,  296,
+      316,  306,  317,  303,  305,  304,  308,  307,  318,  309,
+      320,  323,  314,  313,  322,  324,  329,  442,  323,  320,
+      325,  326,  327,  331,  316,  317,  318,  322,  332,  325,
+      326,  327,  331,  334,  335,  324,  337,  338,  332,  329,
+      340,  335,  334,  325,  326,  337,  342,  340,  345,  346,
+      348,  347,  338,  350,  349,  342,  352,  353,  345,  349,
+
+      346,  347,  354,  348,  355,  357,  360,  364,  365,  373,
+      350,  359,  364,  354,  367,  373,  365,  352,  353,  360,
+      368,  359,  362,  362,  362,  362,  372,  368,  357,  369,
+      370,  355,  374,  359,  369,  371,  367,  370,  375,  376,
+      371,  377,  378,  379,  387,  380,  382,  372,  376,  385,
+      386,  374,  380,  382,  389,  388,  390,  375,  377,  391,
+      379,  387,  385,  386,  388,  378,  392,  393,  394,  389,
+      396,  397,  390,  405,  398,  399,  400,  394,  402,  401,
+      397,  398,  391,  392,  399,  400,  393,  396,  401,  404,
+      413,  402,  414,  415,  417,  418,  405,  422,  425,  419,
+
+      428,  427,  414,  426,  429,  413,  417,  404,  419,  427,
+      426,  431,  415,  432,  433,  429,  422,  434,  418,  433,
+      435,  425,  437,  428,  438,  440,  432,  444,  445,  441,
+      443,  451,  446,  519,  431,  437,  441,  435,  455,  443,
+      434,  456,  440,  461,  519,  455,  445,  438,  450,  444,
+      446,  458,  450,  450,  451,  459,  460,  456,  463,  468,
+      458,  460,  469,  472,  459,  463,  461,  470,  473,  479,
+      485,  480,  472,  486,  488,  489,  491,  496,  473,  469,
+      468,  487,  479,  480,  470,  485,  493,  488,  497,  487,
+      498,  499,  489,  500,  502,  486,  503,  504,  496,  491,
+
+      505,  506,  500,  502,  493,  507,  499,  508,  509,  497,
+      511,  512,  504,  503,  507,  505,  498,  515,  513,  514,
+      512,  516,  506,  513,  514,  517,  515,  518,  521,  508,
+      522,  509,  517,  523,  524,  511,  526,  527,  528,  529,
+      535,  538,  533,  524,  516,  537,  542,  538,  529,  535,
+      518,  526,  521,  522,  527,  533,  523,  536,  540,  542,
+      537,  528,  541,  544,  536,  540,  547,  541,  548,  549,
+      550,  547,  551,  552,  553,  550,  554,  548,  555,  556,
+      557,  553,  558,  596,  559,  557,  544,  561,  551,  559,
+      562,  555,  549,  563,  556,  564,  565,  558,  566,  554,
+
+      567,  561,  552,  569,  570,  565,  562,  566,  575,  571,
+      572,  573,  563,  570,  576,  577,  578,  575,  564,  583,
+      580,  581,  584,  567,  571,  572,  573,  585,  577,  584,
+      581,  586,  569,  578,  583,  587,  588,  576,  580,  589,
+      585,  591,  590,  592,  593,  594,  595,  597,  586,  591,
+      592,  593,  601,  582,  588,  607,  587,  603,  579,  601,
+      574,  568,  589,  590,  597,  560,  603,  546,  545,  595,
+      543,  539,  534,  532,  594,  531,  607,  610,  610,  610,
+      610,  611,  611,  613,  530,  613,  613,  525,  520,  510,
+      501,  495,  494,  492,  490,  484,  483,  482,  481,  478,
+
+      477,  476,  475,  474,  471,  467,  466,  465,  464,  462,
+      457,  454,  453,  452,  449,  448,  447,  439,  436,  430,
+      424,  423,  421,  420,  416,  412,  411,  410,  409,  408,
+      407,  406,  403,  395,  384,  383,  381,  366,  363,  361,
+      358,  356,  351,  344,  343,  341,  339,  336,  333,  328,
+      321,  315,  312,  311,  310,  301,  298,  297,  292,  291,
+      275,  274,  273,  270,  258,  246,  244,  242,  240,  237,
+      236,  235,  226,  223,  222,  218,  216,  215,  214,  206,
+      205,  202,  201,  199,  198,  197,  196,  195,  194,  192,
+      191,  162,  155,  150,  148,  145,  142,  138,  134,  116,
+
+       90,   70,   59,   39,   37,    8,    7,    3,  609,  609,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      609,  609
     } ;
 
 static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
@@ -923,7 +925,7 @@
 #define YY_MORE_ADJ 0
 #define YY_RESTORE_YY_MORE_OFFSET
 char *yytext;
-#line 1 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 1 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 #define INITIAL 0
 /*===-- UpgradeLexer.l - Scanner for 1.9 assembly files --------*- C++ -*--===//
 //
@@ -938,9 +940,10 @@
 //
 //===----------------------------------------------------------------------===*/
 #define YY_NEVER_INTERACTIVE 1
-#line 28 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-
+#line 28 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 #include "UpgradeInternals.h"
+#include "llvm/Module.h"
+#include <list>
 #include "UpgradeParser.h"
 #include <cctype>
 #include <cstdlib>
@@ -955,17 +958,108 @@
   } \
 }
 
+#define YY_NEVER_INTERACTIVE 1
 
 // Construct a token value for a non-obsolete token
-#define RET_TOK(sym) \
-  Upgradelval.String = new std::string(yytext); \
+#define RET_TOK(type, Enum, sym) \
+  Upgradelval.type = Enum; \
   return sym
 
-#define RET_TY(sym,OldTY,NewTY,sign) \
-  Upgradelval.Ty = getType(NewTY, OldTY); \
+#define RET_TY(sym,NewTY,sign) \
+  Upgradelval.PrimType.T = NewTY; \
+  Upgradelval.PrimType.S = sign; \
   return sym
 
-#define YY_NEVER_INTERACTIVE 1
+namespace llvm {
+
+// TODO: All of the static identifiers are figured out by the lexer,
+// these should be hashed to reduce the lexer size
+
+// UnEscapeLexed - Run through the specified buffer and change \xx codes to the
+// appropriate character.  If AllowNull is set to false, a \00 value will cause
+// an exception to be thrown.
+//
+// If AllowNull is set to true, the return value of the function points to the
+// last character of the string in memory.
+//
+char *UnEscapeLexed(char *Buffer, bool AllowNull) {
+  char *BOut = Buffer;
+  for (char *BIn = Buffer; *BIn; ) {
+    if (BIn[0] == '\\' && isxdigit(BIn[1]) && isxdigit(BIn[2])) {
+      char Tmp = BIn[3]; BIn[3] = 0;     // Terminate string
+      *BOut = (char)strtol(BIn+1, 0, 16);  // Convert to number
+      if (!AllowNull && !*BOut)
+        error("String literal cannot accept \\00 escape!");
+
+      BIn[3] = Tmp;                  // Restore character
+      BIn += 3;                      // Skip over handled chars
+      ++BOut;
+    } else {
+      *BOut++ = *BIn++;
+    }
+  }
+
+  return BOut;
+}
+
+// atoull - Convert an ascii string of decimal digits into the unsigned long
+// long representation... this does not have to do input error checking,
+// because we know that the input will be matched by a suitable regex...
+//
+static uint64_t atoull(const char *Buffer) {
+  uint64_t Result = 0;
+  for (; *Buffer; Buffer++) {
+    uint64_t OldRes = Result;
+    Result *= 10;
+    Result += *Buffer-'0';
+    if (Result < OldRes)   // Uh, oh, overflow detected!!!
+      error("constant bigger than 64 bits detected!");
+  }
+  return Result;
+}
+
+static uint64_t HexIntToVal(const char *Buffer) {
+  uint64_t Result = 0;
+  for (; *Buffer; ++Buffer) {
+    uint64_t OldRes = Result;
+    Result *= 16;
+    char C = *Buffer;
+    if (C >= '0' && C <= '9')
+      Result += C-'0';
+    else if (C >= 'A' && C <= 'F')
+      Result += C-'A'+10;
+    else if (C >= 'a' && C <= 'f')
+      Result += C-'a'+10;
+
+    if (Result < OldRes)   // Uh, oh, overflow detected!!!
+      error("constant bigger than 64 bits detected!");
+  }
+  return Result;
+}
+
+
+// HexToFP - Convert the ascii string in hexidecimal format to the floating
+// point representation of it.
+//
+static double HexToFP(const char *Buffer) {
+  // Behave nicely in the face of C TBAA rules... see:
+  // http://www.nullstone.com/htmls/category/aliastyp.htm
+  union {
+    uint64_t UI;
+    double FP;
+  } UIntToFP;
+  UIntToFP.UI = HexIntToVal(Buffer);
+
+  assert(sizeof(double) == sizeof(uint64_t) &&
+         "Data sizes incompatible on this target!");
+  return UIntToFP.FP;   // Cast Hex constant to double
+}
+
+
+} // End llvm namespace
+
+using namespace llvm;
+
 /* Comments start with a ; and go till end of line */
 /* Variable(Value) identifiers start with a % sign */
 /* Label identifiers end with a colon */
@@ -982,7 +1076,7 @@
 /* HexIntConstant - Hexadecimal constant generated by the CFE to avoid forcing
  * it to deal with 64 bit numbers.
  */
-#line 986 "UpgradeLexer.cpp"
+#line 1080 "UpgradeLexer.cpp"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1133,10 +1227,10 @@
 	register char *yy_cp = NULL, *yy_bp = NULL;
 	register int yy_act;
 
-#line 97 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 189 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 
 
-#line 1140 "UpgradeLexer.cpp"
+#line 1234 "UpgradeLexer.cpp"
 
 	if ( yy_init )
 		{
@@ -1184,14 +1278,14 @@
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 608 )
+				if ( yy_current_state >= 610 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
 			*yy_state_ptr++ = yy_current_state;
 			++yy_cp;
 			}
-		while ( yy_current_state != 607 );
+		while ( yy_current_state != 609 );
 
 yy_find_action:
 		yy_current_state = *--yy_state_ptr;
@@ -1229,776 +1323,816 @@
 	{ /* beginning of action switch */
 case 1:
 YY_RULE_SETUP
-#line 99 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 191 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 { /* Ignore comments for now */ }
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 101 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( BEGINTOK); }
+#line 193 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return BEGINTOK; }
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 102 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ENDTOK); }
+#line 194 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ENDTOK; }
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 103 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TRUETOK);  }
+#line 195 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TRUETOK;  }
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 104 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FALSETOK); }
+#line 196 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return FALSETOK; }
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 105 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DECLARE); }
+#line 197 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DECLARE; }
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 106 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( GLOBAL); }
+#line 198 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return GLOBAL; }
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 107 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CONSTANT); }
+#line 199 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return CONSTANT; }
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 108 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( INTERNAL); }
+#line 200 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return INTERNAL; }
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 109 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LINKONCE); }
+#line 201 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return LINKONCE; }
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 110 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( WEAK); }
+#line 202 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return WEAK; }
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 111 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( APPENDING); }
+#line 203 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return APPENDING; }
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 112 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DLLIMPORT); }
+#line 204 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DLLIMPORT; }
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 113 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DLLEXPORT); }
+#line 205 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DLLEXPORT; }
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 114 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EXTERN_WEAK); }
+#line 206 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EXTERN_WEAK; }
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 115 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EXTERNAL); }
+#line 207 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EXTERNAL; }    /* Deprecated, turn into external */
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 116 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UNINITIALIZED); }  // alias for external
+#line 208 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EXTERNAL; }
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 117 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( IMPLEMENTATION); }
+#line 209 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return IMPLEMENTATION; }
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 118 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ZEROINITIALIZER); }
+#line 210 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ZEROINITIALIZER; }
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 119 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DOTDOTDOT); }
+#line 211 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DOTDOTDOT; }
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 120 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UNDEF); }
+#line 212 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UNDEF; }
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 121 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( NULL_TOK); }
+#line 213 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return NULL_TOK; }
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 122 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TO); }
+#line 214 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TO; }
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 123 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TAIL); }
+#line 215 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EXCEPT; }
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 124 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TARGET); }
+#line 216 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return NOT; }  /* Deprecated, turned into XOR */
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 125 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TRIPLE); }
+#line 217 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TAIL; }
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 126 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DEPLIBS); }
+#line 218 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TARGET; }
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 127 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ENDIAN); }
+#line 219 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TRIPLE; }
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 128 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( POINTERSIZE); }
+#line 220 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DEPLIBS; }
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 129 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DATALAYOUT); }
+#line 221 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ENDIAN; }
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 130 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LITTLE); }
+#line 222 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return POINTERSIZE; }
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 131 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( BIG); }
+#line 223 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DATALAYOUT; }
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 132 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( VOLATILE); }
+#line 224 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return LITTLE; }
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 133 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ALIGN);  }
+#line 225 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return BIG; }
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 134 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SECTION); }
+#line 226 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return VOLATILE; }
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 135 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( MODULE); }
+#line 227 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ALIGN;  }
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 136 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ASM_TOK); }
+#line 228 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SECTION; }
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 137 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SIDEEFFECT); }
+#line 229 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return MODULE; }
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 139 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CC_TOK); }
+#line 230 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ASM_TOK; }
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 140 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CCC_TOK); }
+#line 231 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SIDEEFFECT; }
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 141 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CSRETCC_TOK); }
+#line 233 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return CC_TOK; }
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 142 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FASTCC_TOK); }
+#line 234 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return CCC_TOK; }
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 143 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( COLDCC_TOK); }
+#line 235 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return CSRETCC_TOK; }
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 144 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( X86_STDCALLCC_TOK); }
+#line 236 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return FASTCC_TOK; }
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 145 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( X86_FASTCALLCC_TOK); }
+#line 237 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return COLDCC_TOK; }
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 147 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(VOID,VoidTy,"void",false); }
+#line 238 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return X86_STDCALLCC_TOK; }
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 148 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(BOOL,BoolTy,"i1",false); }
+#line 239 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return X86_FASTCALLCC_TOK; }
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 149 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(SBYTE,SByteTy,"i8",true); }
+#line 241 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(SBYTE,  Type::Int8Ty,  Signed);  }
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 150 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(UBYTE,UByteTy,"i8",false); }
+#line 242 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(UBYTE,  Type::Int8Ty,  Unsigned); }
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 151 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(SHORT,ShortTy,"i16",true); }
+#line 243 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(SHORT,  Type::Int16Ty, Signed);  }
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 152 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(USHORT,UShortTy,"i16",false); }
+#line 244 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(USHORT, Type::Int16Ty, Unsigned); }
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 153 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(INT,IntTy,"i32",true);   }
+#line 245 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(INT,    Type::Int32Ty, Signed);  }
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 154 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(UINT,UIntTy,"i32",false);  }
+#line 246 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(UINT,   Type::Int32Ty, Unsigned); }
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 155 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(LONG,LongTy,"i64",true);  }
+#line 247 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(LONG,   Type::Int64Ty, Signed);  }
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 156 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(ULONG,ULongTy,"i64",false); }
+#line 248 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(ULONG,  Type::Int64Ty, Unsigned); }
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 157 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(UBYTE,UByteTy,"i8",false); }
+#line 249 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(VOID,   Type::VoidTy,  Signless  ); }
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 158 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(USHORT,UShortTy,"i16",false); }
+#line 250 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(BOOL,   Type::Int1Ty,  Unsigned  ); }
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 159 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(UINT,UIntTy,"i32",false); }
+#line 251 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(FLOAT,  Type::FloatTy, Signless ); }
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 160 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(ULONG,ULongTy,"i64",false); }
+#line 252 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(DOUBLE, Type::DoubleTy,Signless); }
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 161 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(FLOAT,FloatTy,"float",false); }
+#line 253 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(LABEL,  Type::LabelTy, Signless ); }
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 162 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(DOUBLE,DoubleTy,"double",false); }
+#line 254 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TYPE;   }
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 163 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(LABEL,LabelTy,"label",false); }
+#line 255 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OPAQUE; }
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 164 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OPAQUE); }
+#line 257 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, AddOp, ADD); }
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 165 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(TYPE);   }
+#line 258 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SubOp, SUB); }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 167 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ADD); }
+#line 259 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, MulOp, MUL); }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 168 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SUB); }
+#line 260 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, DivOp,  DIV); }
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 169 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( MUL); }
+#line 261 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, UDivOp, UDIV); }
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 170 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DIV); }
+#line 262 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SDivOp, SDIV); }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 171 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UDIV); }
+#line 263 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, FDivOp, FDIV); }
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 172 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SDIV); }
+#line 264 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, RemOp,  REM); }
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 173 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FDIV); }
+#line 265 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, URemOp, UREM); }
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 174 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( REM);  }
+#line 266 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SRemOp, SREM); }
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 175 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UREM); }
+#line 267 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, FRemOp, FREM); }
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 176 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SREM); }
+#line 268 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, AndOp, AND); }
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 177 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FREM); }
+#line 269 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, OrOp , OR ); }
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 178 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( AND); }
+#line 270 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, XorOp, XOR); }
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 179 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( OR); }
+#line 271 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetNE, SETNE); }
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 180 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( XOR); }
+#line 272 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetEQ, SETEQ); }
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 181 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETNE); }
+#line 273 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetLT, SETLT); }
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 182 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETEQ); }
+#line 274 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetGT, SETGT); }
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 183 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETLT); }
+#line 275 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetLE, SETLE); }
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 184 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETGT); }
+#line 276 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetGE, SETGE); }
 	YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 185 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETLE); }
+#line 277 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ICmpOp, ICMP); }
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 186 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETGE); }
+#line 278 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, FCmpOp, FCMP); }
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 187 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ICMP); }
+#line 280 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EQ; }
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 188 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(FCMP); }
+#line 281 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return NE; }
 	YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 189 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(EQ); }
+#line 282 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SLT; }
 	YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 190 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(NE); }
+#line 283 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SGT; }
 	YY_BREAK
 case 89:
 YY_RULE_SETUP
-#line 191 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(SLT); }
+#line 284 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SLE; }
 	YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 192 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(SGT); }
+#line 285 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SGE; }
 	YY_BREAK
 case 91:
 YY_RULE_SETUP
-#line 193 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(SLE); }
+#line 286 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ULT; }
 	YY_BREAK
 case 92:
 YY_RULE_SETUP
-#line 194 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(SGE); }
+#line 287 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UGT; }
 	YY_BREAK
 case 93:
 YY_RULE_SETUP
-#line 195 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OEQ); }
+#line 288 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ULE; }
 	YY_BREAK
 case 94:
 YY_RULE_SETUP
-#line 196 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ONE); }
+#line 289 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UGE; }
 	YY_BREAK
 case 95:
 YY_RULE_SETUP
-#line 197 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OLT); }
+#line 290 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OEQ; }
 	YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 198 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OGT); }
+#line 291 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ONE; }
 	YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 199 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OLE); }
+#line 292 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OLT; }
 	YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 200 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OGE); }
+#line 293 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OGT; }
 	YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 201 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ORD); }
+#line 294 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OLE; }
 	YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 202 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UNO); }
+#line 295 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OGE; }
 	YY_BREAK
 case 101:
 YY_RULE_SETUP
-#line 203 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UEQ); }
+#line 296 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ORD; }
 	YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 204 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UNE); }
+#line 297 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UNO; }
 	YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 205 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ULT); }
+#line 298 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UEQ; }
 	YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 206 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UGT); }
+#line 299 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UNE; }
 	YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 207 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ULE); }
+#line 301 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, PHIOp, PHI_TOK); }
 	YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 208 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UGE); }
+#line 302 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, CallOp, CALL); }
 	YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 210 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( PHI_TOK); }
+#line 303 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, CastOp, CAST);  }
 	YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 211 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CALL); }
+#line 304 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, TruncOp, TRUNC); }
 	YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 212 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CAST); }
+#line 305 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, ZExtOp , ZEXT); }
 	YY_BREAK
 case 110:
 YY_RULE_SETUP
-#line 213 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TRUNC); }
+#line 306 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, SExtOp, SEXT); }
 	YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 214 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ZEXT); }
+#line 307 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, FPTruncOp, FPTRUNC); }
 	YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 215 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SEXT); }
+#line 308 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, FPExtOp, FPEXT); }
 	YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 216 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPTRUNC); }
+#line 309 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, FPToUIOp, FPTOUI); }
 	YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 217 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPEXT); }
+#line 310 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, FPToSIOp, FPTOSI); }
 	YY_BREAK
 case 115:
 YY_RULE_SETUP
-#line 218 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPTOUI); }
+#line 311 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, UIToFPOp, UITOFP); }
 	YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 219 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPTOSI); }
+#line 312 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, SIToFPOp, SITOFP); }
 	YY_BREAK
 case 117:
 YY_RULE_SETUP
-#line 220 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UITOFP); }
+#line 313 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, PtrToIntOp, PTRTOINT); }
 	YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 221 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SITOFP); }
+#line 314 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, IntToPtrOp, INTTOPTR); }
 	YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 222 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( PTRTOINT); }
+#line 315 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, BitCastOp, BITCAST); }
 	YY_BREAK
 case 120:
 YY_RULE_SETUP
-#line 223 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( INTTOPTR); }
+#line 316 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, SelectOp, SELECT); }
 	YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 224 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( BITCAST); }
+#line 317 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ShlOp, SHL); }
 	YY_BREAK
 case 122:
 YY_RULE_SETUP
-#line 225 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SELECT); }
+#line 318 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ShrOp, SHR); }
 	YY_BREAK
 case 123:
 YY_RULE_SETUP
-#line 226 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SHL); }
+#line 319 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, LShrOp, LSHR); }
 	YY_BREAK
 case 124:
 YY_RULE_SETUP
-#line 227 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SHR); }
+#line 320 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, AShrOp, ASHR); }
 	YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 228 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ASHR); }
+#line 321 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return VANEXT_old; }
 	YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 229 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LSHR); }
+#line 322 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return VAARG_old; }
 	YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 230 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( VAARG); }
+#line 323 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, VAArg , VAARG); }
 	YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 231 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( RET); }
+#line 324 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, RetOp, RET); }
 	YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 232 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( BR); }
+#line 325 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, BrOp, BR); }
 	YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 233 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SWITCH); }
+#line 326 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, SwitchOp, SWITCH); }
 	YY_BREAK
 case 131:
 YY_RULE_SETUP
-#line 234 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( INVOKE); }
+#line 327 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, InvokeOp, INVOKE); }
 	YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 235 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UNWIND); }
+#line 328 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UNWIND; }
 	YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 236 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EXCEPT); } // alias for unwind
+#line 329 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, UnreachableOp, UNREACHABLE); }
 	YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 237 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UNREACHABLE); }
+#line 331 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, MallocOp, MALLOC); }
 	YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 239 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( MALLOC); }
+#line 332 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, AllocaOp, ALLOCA); }
 	YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 240 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ALLOCA); }
+#line 333 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, FreeOp, FREE); }
 	YY_BREAK
 case 137:
 YY_RULE_SETUP
-#line 241 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FREE); }
+#line 334 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, LoadOp, LOAD); }
 	YY_BREAK
 case 138:
 YY_RULE_SETUP
-#line 242 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LOAD); }
+#line 335 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, StoreOp, STORE); }
 	YY_BREAK
 case 139:
 YY_RULE_SETUP
-#line 243 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( STORE); }
+#line 336 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, GetElementPtrOp, GETELEMENTPTR); }
 	YY_BREAK
 case 140:
 YY_RULE_SETUP
-#line 244 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( GETELEMENTPTR); }
+#line 338 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ExtractElementOp, EXTRACTELEMENT); }
 	YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 246 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EXTRACTELEMENT); }
+#line 339 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, InsertElementOp, INSERTELEMENT); }
 	YY_BREAK
 case 142:
 YY_RULE_SETUP
-#line 247 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( INSERTELEMENT); }
+#line 340 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ShuffleVectorOp, SHUFFLEVECTOR); }
 	YY_BREAK
 case 143:
 YY_RULE_SETUP
-#line 248 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SHUFFLEVECTOR); }
+#line 343 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+                  UnEscapeLexed(yytext+1);
+                  Upgradelval.StrVal = strdup(yytext+1);             // Skip %
+                  return VAR_ID;
+                }
 	YY_BREAK
 case 144:
 YY_RULE_SETUP
-#line 251 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( VAR_ID); }
+#line 348 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+                  yytext[strlen(yytext)-1] = 0;  // nuke colon
+                  UnEscapeLexed(yytext);
+                  Upgradelval.StrVal = strdup(yytext);
+                  return LABELSTR;
+                }
 	YY_BREAK
 case 145:
 YY_RULE_SETUP
-#line 252 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LABELSTR); }
+#line 354 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+                  yytext[strlen(yytext)-2] = 0;  // nuke colon, end quote
+                  UnEscapeLexed(yytext+1);
+                  Upgradelval.StrVal = strdup(yytext+1);
+                  return LABELSTR;
+                }
 	YY_BREAK
 case 146:
 YY_RULE_SETUP
-#line 253 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LABELSTR); }
+#line 361 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ // Note that we cannot unescape a string constant here!  The
+                   // string constant might contain a \00 which would not be
+                   // understood by the string stuff.  It is valid to make a
+                   // [sbyte] c"Hello World\00" constant, for example.
+                   //
+                   yytext[strlen(yytext)-1] = 0;           // nuke end quote
+                   Upgradelval.StrVal = strdup(yytext+1);  // Nuke start quote
+                   return STRINGCONSTANT;
+                 }
 	YY_BREAK
 case 147:
 YY_RULE_SETUP
-#line 254 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( STRINGCONSTANT ); }
+#line 372 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ Upgradelval.UInt64Val = atoull(yytext); return EUINT64VAL; }
 	YY_BREAK
 case 148:
 YY_RULE_SETUP
-#line 255 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EUINT64VAL ); }
+#line 373 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+                  uint64_t Val = atoull(yytext+1);
+                  // +1:  we have bigger negative range
+                  if (Val > (uint64_t)INT64_MAX+1)
+                    error("Constant too large for signed 64 bits!");
+                  Upgradelval.SInt64Val = -Val;
+                  return ESINT64VAL;
+                }
 	YY_BREAK
 case 149:
 YY_RULE_SETUP
-#line 256 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ESINT64VAL ); }
+#line 381 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+                   Upgradelval.UInt64Val = HexIntToVal(yytext+3);
+                   return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL;
+                 }
 	YY_BREAK
 case 150:
 YY_RULE_SETUP
-#line 257 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( yytext[0] == 's' ? ESINT64VAL : EUINT64VAL ); }
+#line 386 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+                  uint64_t Val = atoull(yytext+1);
+                  if ((unsigned)Val != Val)
+                    error("Invalid value number (too large)!");
+                  Upgradelval.UIntVal = unsigned(Val);
+                  return UINTVAL;
+                }
 	YY_BREAK
 case 151:
 YY_RULE_SETUP
-#line 258 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UINTVAL); }
+#line 393 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+                  uint64_t Val = atoull(yytext+2);
+                  // +1:  we have bigger negative range
+                  if (Val > (uint64_t)INT32_MAX+1)
+                    error("Constant too large for signed 32 bits!");
+                  Upgradelval.SIntVal = (int)-Val;
+                  return SINTVAL;
+                }
 	YY_BREAK
 case 152:
 YY_RULE_SETUP
-#line 259 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SINTVAL); }
+#line 402 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ Upgradelval.FPVal = atof(yytext); return FPVAL; }
 	YY_BREAK
 case 153:
 YY_RULE_SETUP
-#line 260 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPVAL); }
-	YY_BREAK
-case 154:
-YY_RULE_SETUP
-#line 261 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPVAL); }
+#line 403 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ Upgradelval.FPVal = HexToFP(yytext); return FPVAL; }
 	YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 262 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 405 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 {
                   /* Make sure to free the internal buffers for flex when we are
                    * done reading our input!
@@ -2007,22 +2141,22 @@
                   return EOF;
                 }
 	YY_BREAK
-case 155:
+case 154:
 YY_RULE_SETUP
-#line 270 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 413 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 { /* Ignore whitespace */ }
 	YY_BREAK
-case 156:
+case 155:
 YY_RULE_SETUP
-#line 271 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 414 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 { return yytext[0]; }
 	YY_BREAK
-case 157:
+case 156:
 YY_RULE_SETUP
-#line 273 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 416 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
 	YY_BREAK
-#line 2026 "UpgradeLexer.cpp"
+#line 2160 "UpgradeLexer.cpp"
 
 	case YY_END_OF_BUFFER:
 		{
@@ -2309,7 +2443,7 @@
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 608 )
+			if ( yy_current_state >= 610 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2339,11 +2473,11 @@
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 608 )
+		if ( yy_current_state >= 610 )
 			yy_c = yy_meta[(unsigned int) yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 607);
+	yy_is_jam = (yy_current_state == 609);
 	if ( ! yy_is_jam )
 		*yy_state_ptr++ = yy_current_state;
 
@@ -2900,5 +3034,5 @@
 	return 0;
 	}
 #endif
-#line 273 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 416 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
 


Index: llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs
diff -u llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs:1.16 llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs:1.17
--- llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs:1.16	Sun Jan 14 20:41:46 2007
+++ llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs	Fri Jan 26 02:19:09 2007
@@ -25,8 +25,9 @@
 %option noyymore
 
 %{
-
 #include "UpgradeInternals.h"
+#include "llvm/Module.h"
+#include <list>
 #include "UpgradeParser.h"
 #include <cctype>
 #include <cstdlib>
@@ -41,17 +42,108 @@
   } \
 }
 
+#define YY_NEVER_INTERACTIVE 1
 
 // Construct a token value for a non-obsolete token
-#define RET_TOK(sym) \
-  Upgradelval.String = new std::string(yytext); \
+#define RET_TOK(type, Enum, sym) \
+  Upgradelval.type = Enum; \
   return sym
 
-#define RET_TY(sym,OldTY,NewTY,sign) \
-  Upgradelval.Ty = getType(NewTY, OldTY); \
+#define RET_TY(sym,NewTY,sign) \
+  Upgradelval.PrimType.T = NewTY; \
+  Upgradelval.PrimType.S = sign; \
   return sym
 
-#define YY_NEVER_INTERACTIVE 1
+namespace llvm {
+
+// TODO: All of the static identifiers are figured out by the lexer,
+// these should be hashed to reduce the lexer size
+
+// UnEscapeLexed - Run through the specified buffer and change \xx codes to the
+// appropriate character.  If AllowNull is set to false, a \00 value will cause
+// an exception to be thrown.
+//
+// If AllowNull is set to true, the return value of the function points to the
+// last character of the string in memory.
+//
+char *UnEscapeLexed(char *Buffer, bool AllowNull) {
+  char *BOut = Buffer;
+  for (char *BIn = Buffer; *BIn; ) {
+    if (BIn[0] == '\\' && isxdigit(BIn[1]) && isxdigit(BIn[2])) {
+      char Tmp = BIn[3]; BIn[3] = 0;     // Terminate string
+      *BOut = (char)strtol(BIn+1, 0, 16);  // Convert to number
+      if (!AllowNull && !*BOut)
+        error("String literal cannot accept \\00 escape!");
+
+      BIn[3] = Tmp;                  // Restore character
+      BIn += 3;                      // Skip over handled chars
+      ++BOut;
+    } else {
+      *BOut++ = *BIn++;
+    }
+  }
+
+  return BOut;
+}
+
+// atoull - Convert an ascii string of decimal digits into the unsigned long
+// long representation... this does not have to do input error checking,
+// because we know that the input will be matched by a suitable regex...
+//
+static uint64_t atoull(const char *Buffer) {
+  uint64_t Result = 0;
+  for (; *Buffer; Buffer++) {
+    uint64_t OldRes = Result;
+    Result *= 10;
+    Result += *Buffer-'0';
+    if (Result < OldRes)   // Uh, oh, overflow detected!!!
+      error("constant bigger than 64 bits detected!");
+  }
+  return Result;
+}
+
+static uint64_t HexIntToVal(const char *Buffer) {
+  uint64_t Result = 0;
+  for (; *Buffer; ++Buffer) {
+    uint64_t OldRes = Result;
+    Result *= 16;
+    char C = *Buffer;
+    if (C >= '0' && C <= '9')
+      Result += C-'0';
+    else if (C >= 'A' && C <= 'F')
+      Result += C-'A'+10;
+    else if (C >= 'a' && C <= 'f')
+      Result += C-'a'+10;
+
+    if (Result < OldRes)   // Uh, oh, overflow detected!!!
+      error("constant bigger than 64 bits detected!");
+  }
+  return Result;
+}
+
+
+// HexToFP - Convert the ascii string in hexidecimal format to the floating
+// point representation of it.
+//
+static double HexToFP(const char *Buffer) {
+  // Behave nicely in the face of C TBAA rules... see:
+  // http://www.nullstone.com/htmls/category/aliastyp.htm
+  union {
+    uint64_t UI;
+    double FP;
+  } UIntToFP;
+  UIntToFP.UI = HexIntToVal(Buffer);
+
+  assert(sizeof(double) == sizeof(uint64_t) &&
+         "Data sizes incompatible on this target!");
+  return UIntToFP.FP;   // Cast Hex constant to double
+}
+
+
+} // End llvm namespace
+
+using namespace llvm;
+
 %}
 
 
@@ -98,168 +190,219 @@
 
 {Comment}       { /* Ignore comments for now */ }
 
-begin           { RET_TOK( BEGINTOK); }
-end             { RET_TOK( ENDTOK); }
-true            { RET_TOK( TRUETOK);  }
-false           { RET_TOK( FALSETOK); }
-declare         { RET_TOK( DECLARE); }
-global          { RET_TOK( GLOBAL); }
-constant        { RET_TOK( CONSTANT); }
-internal        { RET_TOK( INTERNAL); }
-linkonce        { RET_TOK( LINKONCE); }
-weak            { RET_TOK( WEAK); }
-appending       { RET_TOK( APPENDING); }
-dllimport       { RET_TOK( DLLIMPORT); }
-dllexport       { RET_TOK( DLLEXPORT); }
-extern_weak     { RET_TOK( EXTERN_WEAK); }
-external        { RET_TOK( EXTERNAL); }
-uninitialized   { RET_TOK( UNINITIALIZED); }  // alias for external
-implementation  { RET_TOK( IMPLEMENTATION); }
-zeroinitializer { RET_TOK( ZEROINITIALIZER); }
-\.\.\.          { RET_TOK( DOTDOTDOT); }
-undef           { RET_TOK( UNDEF); }
-null            { RET_TOK( NULL_TOK); }
-to              { RET_TOK( TO); }
-tail            { RET_TOK( TAIL); }
-target          { RET_TOK( TARGET); }
-triple          { RET_TOK( TRIPLE); }
-deplibs         { RET_TOK( DEPLIBS); }
-endian          { RET_TOK( ENDIAN); }
-pointersize     { RET_TOK( POINTERSIZE); }
-datalayout      { RET_TOK( DATALAYOUT); }
-little          { RET_TOK( LITTLE); }
-big             { RET_TOK( BIG); }
-volatile        { RET_TOK( VOLATILE); }
-align           { RET_TOK( ALIGN);  }
-section         { RET_TOK( SECTION); }
-module          { RET_TOK( MODULE); }
-asm             { RET_TOK( ASM_TOK); }
-sideeffect      { RET_TOK( SIDEEFFECT); }
-
-cc              { RET_TOK( CC_TOK); }
-ccc             { RET_TOK( CCC_TOK); }
-csretcc         { RET_TOK( CSRETCC_TOK); }
-fastcc          { RET_TOK( FASTCC_TOK); }
-coldcc          { RET_TOK( COLDCC_TOK); }
-x86_stdcallcc   { RET_TOK( X86_STDCALLCC_TOK); }
-x86_fastcallcc  { RET_TOK( X86_FASTCALLCC_TOK); }
-
-void            { RET_TY(VOID,VoidTy,"void",false); }
-bool            { RET_TY(BOOL,BoolTy,"i1",false); }
-sbyte           { RET_TY(SBYTE,SByteTy,"i8",true); }
-ubyte           { RET_TY(UBYTE,UByteTy,"i8",false); }
-short           { RET_TY(SHORT,ShortTy,"i16",true); }
-ushort          { RET_TY(USHORT,UShortTy,"i16",false); }
-int             { RET_TY(INT,IntTy,"i32",true);   }
-uint            { RET_TY(UINT,UIntTy,"i32",false);  }
-long            { RET_TY(LONG,LongTy,"i64",true);  }
-ulong           { RET_TY(ULONG,ULongTy,"i64",false); }
-i8              { RET_TY(UBYTE,UByteTy,"i8",false); }
-i16             { RET_TY(USHORT,UShortTy,"i16",false); }
-i32             { RET_TY(UINT,UIntTy,"i32",false); }
-i64             { RET_TY(ULONG,ULongTy,"i64",false); }
-float           { RET_TY(FLOAT,FloatTy,"float",false); }
-double          { RET_TY(DOUBLE,DoubleTy,"double",false); }
-label           { RET_TY(LABEL,LabelTy,"label",false); }
-opaque          { RET_TOK(OPAQUE); }
-type            { RET_TOK(TYPE);   }
-
-add             { RET_TOK( ADD); }
-sub             { RET_TOK( SUB); }
-mul             { RET_TOK( MUL); }
-div             { RET_TOK( DIV); }
-udiv            { RET_TOK( UDIV); }
-sdiv            { RET_TOK( SDIV); }
-fdiv            { RET_TOK( FDIV); }
-rem             { RET_TOK( REM);  }
-urem            { RET_TOK( UREM); }
-srem            { RET_TOK( SREM); }
-frem            { RET_TOK( FREM); }
-and             { RET_TOK( AND); }
-or              { RET_TOK( OR); }
-xor             { RET_TOK( XOR); }
-setne           { RET_TOK( SETNE); }
-seteq           { RET_TOK( SETEQ); }
-setlt           { RET_TOK( SETLT); }
-setgt           { RET_TOK( SETGT); }
-setle           { RET_TOK( SETLE); }
-setge           { RET_TOK( SETGE); }
-icmp            { RET_TOK(ICMP); }
-fcmp            { RET_TOK(FCMP); }
-eq              { RET_TOK(EQ); }
-ne              { RET_TOK(NE); }
-slt             { RET_TOK(SLT); }
-sgt             { RET_TOK(SGT); }
-sle             { RET_TOK(SLE); }
-sge             { RET_TOK(SGE); }
-oeq             { RET_TOK(OEQ); }
-one             { RET_TOK(ONE); }
-olt             { RET_TOK(OLT); }
-ogt             { RET_TOK(OGT); }
-ole             { RET_TOK(OLE); }
-oge             { RET_TOK(OGE); }
-ord             { RET_TOK(ORD); }
-uno             { RET_TOK(UNO); }
-ueq             { RET_TOK(UEQ); }
-une             { RET_TOK(UNE); }
-ult             { RET_TOK(ULT); }
-ugt             { RET_TOK(UGT); }
-ule             { RET_TOK(ULE); }
-uge             { RET_TOK(UGE); }
-
-phi             { RET_TOK( PHI_TOK); }
-call            { RET_TOK( CALL); }
-cast            { RET_TOK( CAST); }
-trunc           { RET_TOK( TRUNC); }
-zext            { RET_TOK( ZEXT); }
-sext            { RET_TOK( SEXT); }
-fptrunc         { RET_TOK( FPTRUNC); }
-fpext           { RET_TOK( FPEXT); }
-fptoui          { RET_TOK( FPTOUI); }
-fptosi          { RET_TOK( FPTOSI); }
-uitofp          { RET_TOK( UITOFP); }
-sitofp          { RET_TOK( SITOFP); }
-ptrtoint        { RET_TOK( PTRTOINT); }
-inttoptr        { RET_TOK( INTTOPTR); }
-bitcast         { RET_TOK( BITCAST); }
-select          { RET_TOK( SELECT); }
-shl             { RET_TOK( SHL); }
-shr             { RET_TOK( SHR); }
-ashr            { RET_TOK( ASHR); }
-lshr            { RET_TOK( LSHR); }
-va_arg          { RET_TOK( VAARG); }
-ret             { RET_TOK( RET); }
-br              { RET_TOK( BR); }
-switch          { RET_TOK( SWITCH); }
-invoke          { RET_TOK( INVOKE); }
-unwind          { RET_TOK( UNWIND); }
-except          { RET_TOK( EXCEPT); } // alias for unwind
-unreachable     { RET_TOK( UNREACHABLE); }
-
-malloc          { RET_TOK( MALLOC); }
-alloca          { RET_TOK( ALLOCA); }
-free            { RET_TOK( FREE); }
-load            { RET_TOK( LOAD); }
-store           { RET_TOK( STORE); }
-getelementptr   { RET_TOK( GETELEMENTPTR); }
-
-extractelement  { RET_TOK( EXTRACTELEMENT); }
-insertelement   { RET_TOK( INSERTELEMENT); }
-shufflevector   { RET_TOK( SHUFFLEVECTOR); }
-
-
-{VarID}          { RET_TOK( VAR_ID); }
-{Label}          { RET_TOK( LABELSTR); }
-{QuoteLabel}     { RET_TOK( LABELSTR); }
-{StringConstant} { RET_TOK( STRINGCONSTANT ); }
-{PInteger}       { RET_TOK( EUINT64VAL ); }
-{NInteger}       { RET_TOK( ESINT64VAL ); }
-{HexIntConstant} { RET_TOK( yytext[0] == 's' ? ESINT64VAL : EUINT64VAL ); }
-{EPInteger}      { RET_TOK( UINTVAL); }
-{ENInteger}      { RET_TOK( SINTVAL); }
-{FPConstant}     { RET_TOK( FPVAL); }
-{HexFPConstant}  { RET_TOK( FPVAL); }
-<<EOF>>          {
+begin           { return BEGINTOK; }
+end             { return ENDTOK; }
+true            { return TRUETOK;  }
+false           { return FALSETOK; }
+declare         { return DECLARE; }
+global          { return GLOBAL; }
+constant        { return CONSTANT; }
+internal        { return INTERNAL; }
+linkonce        { return LINKONCE; }
+weak            { return WEAK; }
+appending       { return APPENDING; }
+dllimport       { return DLLIMPORT; }
+dllexport       { return DLLEXPORT; }
+extern_weak     { return EXTERN_WEAK; }
+uninitialized   { return EXTERNAL; }    /* Deprecated, turn into external */
+external        { return EXTERNAL; }
+implementation  { return IMPLEMENTATION; }
+zeroinitializer { return ZEROINITIALIZER; }
+\.\.\.          { return DOTDOTDOT; }
+undef           { return UNDEF; }
+null            { return NULL_TOK; }
+to              { return TO; }
+except          { return EXCEPT; }
+not             { return NOT; }  /* Deprecated, turned into XOR */
+tail            { return TAIL; }
+target          { return TARGET; }
+triple          { return TRIPLE; }
+deplibs         { return DEPLIBS; }
+endian          { return ENDIAN; }
+pointersize     { return POINTERSIZE; }
+datalayout      { return DATALAYOUT; }
+little          { return LITTLE; }
+big             { return BIG; }
+volatile        { return VOLATILE; }
+align           { return ALIGN;  }
+section         { return SECTION; }
+module          { return MODULE; }
+asm             { return ASM_TOK; }
+sideeffect      { return SIDEEFFECT; }
+
+cc              { return CC_TOK; }
+ccc             { return CCC_TOK; }
+csretcc         { return CSRETCC_TOK; }
+fastcc          { return FASTCC_TOK; }
+coldcc          { return COLDCC_TOK; }
+x86_stdcallcc   { return X86_STDCALLCC_TOK; }
+x86_fastcallcc  { return X86_FASTCALLCC_TOK; }
+
+sbyte           { RET_TY(SBYTE,  Type::Int8Ty,  Signed);  }
+ubyte           { RET_TY(UBYTE,  Type::Int8Ty,  Unsigned); }
+short           { RET_TY(SHORT,  Type::Int16Ty, Signed);  }
+ushort          { RET_TY(USHORT, Type::Int16Ty, Unsigned); }
+int             { RET_TY(INT,    Type::Int32Ty, Signed);  }
+uint            { RET_TY(UINT,   Type::Int32Ty, Unsigned); }
+long            { RET_TY(LONG,   Type::Int64Ty, Signed);  }
+ulong           { RET_TY(ULONG,  Type::Int64Ty, Unsigned); }
+void            { RET_TY(VOID,   Type::VoidTy,  Signless  ); }
+bool            { RET_TY(BOOL,   Type::Int1Ty,  Unsigned  ); }
+float           { RET_TY(FLOAT,  Type::FloatTy, Signless ); }
+double          { RET_TY(DOUBLE, Type::DoubleTy,Signless); }
+label           { RET_TY(LABEL,  Type::LabelTy, Signless ); }
+type            { return TYPE;   }
+opaque          { return OPAQUE; }
+
+add             { RET_TOK(BinaryOpVal, AddOp, ADD); }
+sub             { RET_TOK(BinaryOpVal, SubOp, SUB); }
+mul             { RET_TOK(BinaryOpVal, MulOp, MUL); }
+div             { RET_TOK(BinaryOpVal, DivOp,  DIV); }
+udiv            { RET_TOK(BinaryOpVal, UDivOp, UDIV); }
+sdiv            { RET_TOK(BinaryOpVal, SDivOp, SDIV); }
+fdiv            { RET_TOK(BinaryOpVal, FDivOp, FDIV); }
+rem             { RET_TOK(BinaryOpVal, RemOp,  REM); }
+urem            { RET_TOK(BinaryOpVal, URemOp, UREM); }
+srem            { RET_TOK(BinaryOpVal, SRemOp, SREM); }
+frem            { RET_TOK(BinaryOpVal, FRemOp, FREM); }
+and             { RET_TOK(BinaryOpVal, AndOp, AND); }
+or              { RET_TOK(BinaryOpVal, OrOp , OR ); }
+xor             { RET_TOK(BinaryOpVal, XorOp, XOR); }
+setne           { RET_TOK(BinaryOpVal, SetNE, SETNE); }
+seteq           { RET_TOK(BinaryOpVal, SetEQ, SETEQ); }
+setlt           { RET_TOK(BinaryOpVal, SetLT, SETLT); }
+setgt           { RET_TOK(BinaryOpVal, SetGT, SETGT); }
+setle           { RET_TOK(BinaryOpVal, SetLE, SETLE); }
+setge           { RET_TOK(BinaryOpVal, SetGE, SETGE); }
+icmp            { RET_TOK(OtherOpVal, ICmpOp, ICMP); }
+fcmp            { RET_TOK(OtherOpVal, FCmpOp, FCMP); }
+
+eq              { return EQ; }
+ne              { return NE; }
+slt             { return SLT; }
+sgt             { return SGT; }
+sle             { return SLE; }
+sge             { return SGE; }
+ult             { return ULT; }
+ugt             { return UGT; }
+ule             { return ULE; }
+uge             { return UGE; }
+oeq             { return OEQ; }
+one             { return ONE; }
+olt             { return OLT; }
+ogt             { return OGT; }
+ole             { return OLE; }
+oge             { return OGE; }
+ord             { return ORD; }
+uno             { return UNO; }
+ueq             { return UEQ; }
+une             { return UNE; }
+
+phi             { RET_TOK(OtherOpVal, PHIOp, PHI_TOK); }
+call            { RET_TOK(OtherOpVal, CallOp, CALL); }
+cast            { RET_TOK(CastOpVal, CastOp, CAST);  }
+trunc           { RET_TOK(CastOpVal, TruncOp, TRUNC); }
+zext            { RET_TOK(CastOpVal, ZExtOp , ZEXT); }
+sext            { RET_TOK(CastOpVal, SExtOp, SEXT); }
+fptrunc         { RET_TOK(CastOpVal, FPTruncOp, FPTRUNC); }
+fpext           { RET_TOK(CastOpVal, FPExtOp, FPEXT); }
+fptoui          { RET_TOK(CastOpVal, FPToUIOp, FPTOUI); }
+fptosi          { RET_TOK(CastOpVal, FPToSIOp, FPTOSI); }
+uitofp          { RET_TOK(CastOpVal, UIToFPOp, UITOFP); }
+sitofp          { RET_TOK(CastOpVal, SIToFPOp, SITOFP); }
+ptrtoint        { RET_TOK(CastOpVal, PtrToIntOp, PTRTOINT); }
+inttoptr        { RET_TOK(CastOpVal, IntToPtrOp, INTTOPTR); }
+bitcast         { RET_TOK(CastOpVal, BitCastOp, BITCAST); }
+select          { RET_TOK(OtherOpVal, SelectOp, SELECT); }
+shl             { RET_TOK(OtherOpVal, ShlOp, SHL); }
+shr             { RET_TOK(OtherOpVal, ShrOp, SHR); }
+lshr            { RET_TOK(OtherOpVal, LShrOp, LSHR); }
+ashr            { RET_TOK(OtherOpVal, AShrOp, ASHR); }
+vanext          { return VANEXT_old; }
+vaarg           { return VAARG_old; }
+va_arg          { RET_TOK(OtherOpVal, VAArg , VAARG); }
+ret             { RET_TOK(TermOpVal, RetOp, RET); }
+br              { RET_TOK(TermOpVal, BrOp, BR); }
+switch          { RET_TOK(TermOpVal, SwitchOp, SWITCH); }
+invoke          { RET_TOK(TermOpVal, InvokeOp, INVOKE); }
+unwind          { return UNWIND; }
+unreachable     { RET_TOK(TermOpVal, UnreachableOp, UNREACHABLE); }
+
+malloc          { RET_TOK(MemOpVal, MallocOp, MALLOC); }
+alloca          { RET_TOK(MemOpVal, AllocaOp, ALLOCA); }
+free            { RET_TOK(MemOpVal, FreeOp, FREE); }
+load            { RET_TOK(MemOpVal, LoadOp, LOAD); }
+store           { RET_TOK(MemOpVal, StoreOp, STORE); }
+getelementptr   { RET_TOK(MemOpVal, GetElementPtrOp, GETELEMENTPTR); }
+
+extractelement  { RET_TOK(OtherOpVal, ExtractElementOp, EXTRACTELEMENT); }
+insertelement   { RET_TOK(OtherOpVal, InsertElementOp, INSERTELEMENT); }
+shufflevector   { RET_TOK(OtherOpVal, ShuffleVectorOp, SHUFFLEVECTOR); }
+
+
+{VarID}         {
+                  UnEscapeLexed(yytext+1);
+                  Upgradelval.StrVal = strdup(yytext+1);             // Skip %
+                  return VAR_ID;
+                }
+{Label}         {
+                  yytext[strlen(yytext)-1] = 0;  // nuke colon
+                  UnEscapeLexed(yytext);
+                  Upgradelval.StrVal = strdup(yytext);
+                  return LABELSTR;
+                }
+{QuoteLabel}    {
+                  yytext[strlen(yytext)-2] = 0;  // nuke colon, end quote
+                  UnEscapeLexed(yytext+1);
+                  Upgradelval.StrVal = strdup(yytext+1);
+                  return LABELSTR;
+                }
+
+{StringConstant} { // Note that we cannot unescape a string constant here!  The
+                   // string constant might contain a \00 which would not be
+                   // understood by the string stuff.  It is valid to make a
+                   // [sbyte] c"Hello World\00" constant, for example.
+                   //
+                   yytext[strlen(yytext)-1] = 0;           // nuke end quote
+                   Upgradelval.StrVal = strdup(yytext+1);  // Nuke start quote
+                   return STRINGCONSTANT;
+                 }
+
+
+{PInteger}      { Upgradelval.UInt64Val = atoull(yytext); return EUINT64VAL; }
+{NInteger}      {
+                  uint64_t Val = atoull(yytext+1);
+                  // +1:  we have bigger negative range
+                  if (Val > (uint64_t)INT64_MAX+1)
+                    error("Constant too large for signed 64 bits!");
+                  Upgradelval.SInt64Val = -Val;
+                  return ESINT64VAL;
+                }
+{HexIntConstant} {
+                   Upgradelval.UInt64Val = HexIntToVal(yytext+3);
+                   return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL;
+                 }
+
+{EPInteger}     {
+                  uint64_t Val = atoull(yytext+1);
+                  if ((unsigned)Val != Val)
+                    error("Invalid value number (too large)!");
+                  Upgradelval.UIntVal = unsigned(Val);
+                  return UINTVAL;
+                }
+{ENInteger}     {
+                  uint64_t Val = atoull(yytext+2);
+                  // +1:  we have bigger negative range
+                  if (Val > (uint64_t)INT32_MAX+1)
+                    error("Constant too large for signed 32 bits!");
+                  Upgradelval.SIntVal = (int)-Val;
+                  return SINTVAL;
+                }
+
+{FPConstant}    { Upgradelval.FPVal = atof(yytext); return FPVAL; }
+{HexFPConstant} { Upgradelval.FPVal = HexToFP(yytext); return FPVAL; }
+
+<<EOF>>         {
                   /* Make sure to free the internal buffers for flex when we are
                    * done reading our input!
                    */


Index: llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs
diff -u llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.44 llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.45
--- llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.44	Sun Jan 21 13:30:52 2007
+++ llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs	Fri Jan 26 02:19:09 2007
@@ -1,7 +1,7 @@
-/* A Bison parser, made from /usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y, by GNU bison 1.75.  */
+/* A Bison parser, made by GNU Bison 2.1.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -15,8 +15,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 /* As a special exception, when this file is copied by Bison into a
    Bison output file, you may use that output file without restriction.
@@ -34,16 +34,21 @@
    USER NAME SPACE" below.  */
 
 /* Identify Bison output.  */
-#define YYBISON	1
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.1"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
 
 /* Pure parsers.  */
-#define YYPURE	0
+#define YYPURE 0
 
 /* Using locations.  */
 #define YYLSP_NEEDED 0
 
-/* If NAME_PREFIX is specified substitute the variables and functions
-   names.  */
+/* Substitute the variable and function names.  */
 #define yyparse Upgradeparse
 #define yylex   Upgradelex
 #define yyerror Upgradeerror
@@ -59,61 +64,61 @@
    /* Put the tokens into the symbol table, so that GDB and other debuggers
       know about them.  */
    enum yytokentype {
-     VOID = 258,
-     BOOL = 259,
-     SBYTE = 260,
-     UBYTE = 261,
-     SHORT = 262,
-     USHORT = 263,
-     INT = 264,
-     UINT = 265,
-     LONG = 266,
-     ULONG = 267,
-     FLOAT = 268,
-     DOUBLE = 269,
-     LABEL = 270,
-     OPAQUE = 271,
-     ESINT64VAL = 272,
-     EUINT64VAL = 273,
-     SINTVAL = 274,
-     UINTVAL = 275,
-     FPVAL = 276,
-     NULL_TOK = 277,
-     UNDEF = 278,
-     ZEROINITIALIZER = 279,
-     TRUETOK = 280,
-     FALSETOK = 281,
-     TYPE = 282,
-     VAR_ID = 283,
-     LABELSTR = 284,
-     STRINGCONSTANT = 285,
-     IMPLEMENTATION = 286,
-     BEGINTOK = 287,
-     ENDTOK = 288,
-     DECLARE = 289,
-     GLOBAL = 290,
-     CONSTANT = 291,
-     SECTION = 292,
-     VOLATILE = 293,
-     TO = 294,
-     DOTDOTDOT = 295,
-     CONST = 296,
-     INTERNAL = 297,
-     LINKONCE = 298,
-     WEAK = 299,
+     ESINT64VAL = 258,
+     EUINT64VAL = 259,
+     SINTVAL = 260,
+     UINTVAL = 261,
+     FPVAL = 262,
+     VOID = 263,
+     BOOL = 264,
+     SBYTE = 265,
+     UBYTE = 266,
+     SHORT = 267,
+     USHORT = 268,
+     INT = 269,
+     UINT = 270,
+     LONG = 271,
+     ULONG = 272,
+     FLOAT = 273,
+     DOUBLE = 274,
+     TYPE = 275,
+     LABEL = 276,
+     VAR_ID = 277,
+     LABELSTR = 278,
+     STRINGCONSTANT = 279,
+     IMPLEMENTATION = 280,
+     ZEROINITIALIZER = 281,
+     TRUETOK = 282,
+     FALSETOK = 283,
+     BEGINTOK = 284,
+     ENDTOK = 285,
+     DECLARE = 286,
+     GLOBAL = 287,
+     CONSTANT = 288,
+     SECTION = 289,
+     VOLATILE = 290,
+     TO = 291,
+     DOTDOTDOT = 292,
+     NULL_TOK = 293,
+     UNDEF = 294,
+     CONST = 295,
+     INTERNAL = 296,
+     LINKONCE = 297,
+     WEAK = 298,
+     APPENDING = 299,
      DLLIMPORT = 300,
      DLLEXPORT = 301,
      EXTERN_WEAK = 302,
-     APPENDING = 303,
-     EXTERNAL = 304,
-     TARGET = 305,
-     TRIPLE = 306,
-     ENDIAN = 307,
-     POINTERSIZE = 308,
-     LITTLE = 309,
-     BIG = 310,
-     ALIGN = 311,
-     UNINITIALIZED = 312,
+     OPAQUE = 303,
+     NOT = 304,
+     EXTERNAL = 305,
+     TARGET = 306,
+     TRIPLE = 307,
+     ENDIAN = 308,
+     POINTERSIZE = 309,
+     LITTLE = 310,
+     BIG = 311,
+     ALIGN = 312,
      DEPLIBS = 313,
      CALL = 314,
      TAIL = 315,
@@ -132,9 +137,9 @@
      BR = 328,
      SWITCH = 329,
      INVOKE = 330,
-     EXCEPT = 331,
+     UNREACHABLE = 331,
      UNWIND = 332,
-     UNREACHABLE = 333,
+     EXCEPT = 333,
      ADD = 334,
      SUB = 335,
      MUL = 336,
@@ -157,112 +162,115 @@
      SETNE = 353,
      ICMP = 354,
      FCMP = 355,
-     EQ = 356,
-     NE = 357,
-     SLT = 358,
-     SGT = 359,
-     SLE = 360,
-     SGE = 361,
-     OEQ = 362,
-     ONE = 363,
-     OLT = 364,
-     OGT = 365,
-     OLE = 366,
-     OGE = 367,
-     ORD = 368,
-     UNO = 369,
-     UEQ = 370,
-     UNE = 371,
-     ULT = 372,
-     UGT = 373,
-     ULE = 374,
-     UGE = 375,
-     MALLOC = 376,
-     ALLOCA = 377,
-     FREE = 378,
-     LOAD = 379,
-     STORE = 380,
-     GETELEMENTPTR = 381,
-     PHI_TOK = 382,
-     SELECT = 383,
-     SHL = 384,
-     SHR = 385,
-     ASHR = 386,
-     LSHR = 387,
-     VAARG = 388,
-     EXTRACTELEMENT = 389,
-     INSERTELEMENT = 390,
-     SHUFFLEVECTOR = 391,
-     CAST = 392,
-     TRUNC = 393,
-     ZEXT = 394,
-     SEXT = 395,
-     FPTRUNC = 396,
-     FPEXT = 397,
-     FPTOUI = 398,
-     FPTOSI = 399,
-     UITOFP = 400,
-     SITOFP = 401,
-     PTRTOINT = 402,
-     INTTOPTR = 403,
-     BITCAST = 404
+     MALLOC = 356,
+     ALLOCA = 357,
+     FREE = 358,
+     LOAD = 359,
+     STORE = 360,
+     GETELEMENTPTR = 361,
+     PHI_TOK = 362,
+     SELECT = 363,
+     SHL = 364,
+     SHR = 365,
+     ASHR = 366,
+     LSHR = 367,
+     VAARG = 368,
+     EXTRACTELEMENT = 369,
+     INSERTELEMENT = 370,
+     SHUFFLEVECTOR = 371,
+     VAARG_old = 372,
+     VANEXT_old = 373,
+     EQ = 374,
+     NE = 375,
+     SLT = 376,
+     SGT = 377,
+     SLE = 378,
+     SGE = 379,
+     ULT = 380,
+     UGT = 381,
+     ULE = 382,
+     UGE = 383,
+     OEQ = 384,
+     ONE = 385,
+     OLT = 386,
+     OGT = 387,
+     OLE = 388,
+     OGE = 389,
+     ORD = 390,
+     UNO = 391,
+     UEQ = 392,
+     UNE = 393,
+     CAST = 394,
+     TRUNC = 395,
+     ZEXT = 396,
+     SEXT = 397,
+     FPTRUNC = 398,
+     FPEXT = 399,
+     FPTOUI = 400,
+     FPTOSI = 401,
+     UITOFP = 402,
+     SITOFP = 403,
+     PTRTOINT = 404,
+     INTTOPTR = 405,
+     BITCAST = 406
    };
 #endif
-#define VOID 258
-#define BOOL 259
-#define SBYTE 260
-#define UBYTE 261
-#define SHORT 262
-#define USHORT 263
-#define INT 264
-#define UINT 265
-#define LONG 266
-#define ULONG 267
-#define FLOAT 268
-#define DOUBLE 269
-#define LABEL 270
-#define OPAQUE 271
-#define ESINT64VAL 272
-#define EUINT64VAL 273
-#define SINTVAL 274
-#define UINTVAL 275
-#define FPVAL 276
-#define NULL_TOK 277
-#define UNDEF 278
-#define ZEROINITIALIZER 279
-#define TRUETOK 280
-#define FALSETOK 281
-#define TYPE 282
-#define VAR_ID 283
-#define LABELSTR 284
-#define STRINGCONSTANT 285
-#define IMPLEMENTATION 286
-#define BEGINTOK 287
-#define ENDTOK 288
-#define DECLARE 289
-#define GLOBAL 290
-#define CONSTANT 291
-#define SECTION 292
-#define VOLATILE 293
-#define TO 294
-#define DOTDOTDOT 295
-#define CONST 296
-#define INTERNAL 297
-#define LINKONCE 298
-#define WEAK 299
+/* Tokens.  */
+#define ESINT64VAL 258
+#define EUINT64VAL 259
+#define SINTVAL 260
+#define UINTVAL 261
+#define FPVAL 262
+#define VOID 263
+#define BOOL 264
+#define SBYTE 265
+#define UBYTE 266
+#define SHORT 267
+#define USHORT 268
+#define INT 269
+#define UINT 270
+#define LONG 271
+#define ULONG 272
+#define FLOAT 273
+#define DOUBLE 274
+#define TYPE 275
+#define LABEL 276
+#define VAR_ID 277
+#define LABELSTR 278
+#define STRINGCONSTANT 279
+#define IMPLEMENTATION 280
+#define ZEROINITIALIZER 281
+#define TRUETOK 282
+#define FALSETOK 283
+#define BEGINTOK 284
+#define ENDTOK 285
+#define DECLARE 286
+#define GLOBAL 287
+#define CONSTANT 288
+#define SECTION 289
+#define VOLATILE 290
+#define TO 291
+#define DOTDOTDOT 292
+#define NULL_TOK 293
+#define UNDEF 294
+#define CONST 295
+#define INTERNAL 296
+#define LINKONCE 297
+#define WEAK 298
+#define APPENDING 299
 #define DLLIMPORT 300
 #define DLLEXPORT 301
 #define EXTERN_WEAK 302
-#define APPENDING 303
-#define EXTERNAL 304
-#define TARGET 305
-#define TRIPLE 306
-#define ENDIAN 307
-#define POINTERSIZE 308
-#define LITTLE 309
-#define BIG 310
-#define ALIGN 311
-#define UNINITIALIZED 312
+#define OPAQUE 303
+#define NOT 304
+#define EXTERNAL 305
+#define TARGET 306
+#define TRIPLE 307
+#define ENDIAN 308
+#define POINTERSIZE 309
+#define LITTLE 310
+#define BIG 311
+#define ALIGN 312
 #define DEPLIBS 313
 #define CALL 314
 #define TAIL 315
@@ -281,9 +289,9 @@
 #define BR 328
 #define SWITCH 329
 #define INVOKE 330
-#define EXCEPT 331
+#define UNREACHABLE 331
 #define UNWIND 332
-#define UNREACHABLE 333
+#define EXCEPT 333
 #define ADD 334
 #define SUB 335
 #define MUL 336
@@ -306,1013 +314,1515 @@
 #define SETNE 353
 #define ICMP 354
 #define FCMP 355
-#define EQ 356
-#define NE 357
-#define SLT 358
-#define SGT 359
-#define SLE 360
-#define SGE 361
-#define OEQ 362
-#define ONE 363
-#define OLT 364
-#define OGT 365
-#define OLE 366
-#define OGE 367
-#define ORD 368
-#define UNO 369
-#define UEQ 370
-#define UNE 371
-#define ULT 372
-#define UGT 373
-#define ULE 374
-#define UGE 375
-#define MALLOC 376
-#define ALLOCA 377
-#define FREE 378
-#define LOAD 379
-#define STORE 380
-#define GETELEMENTPTR 381
-#define PHI_TOK 382
-#define SELECT 383
-#define SHL 384
-#define SHR 385
-#define ASHR 386
-#define LSHR 387
-#define VAARG 388
-#define EXTRACTELEMENT 389
-#define INSERTELEMENT 390
-#define SHUFFLEVECTOR 391
-#define CAST 392
-#define TRUNC 393
-#define ZEXT 394
-#define SEXT 395
-#define FPTRUNC 396
-#define FPEXT 397
-#define FPTOUI 398
-#define FPTOSI 399
-#define UITOFP 400
-#define SITOFP 401
-#define PTRTOINT 402
-#define INTTOPTR 403
-#define BITCAST 404
+#define MALLOC 356
+#define ALLOCA 357
+#define FREE 358
+#define LOAD 359
+#define STORE 360
+#define GETELEMENTPTR 361
+#define PHI_TOK 362
+#define SELECT 363
+#define SHL 364
+#define SHR 365
+#define ASHR 366
+#define LSHR 367
+#define VAARG 368
+#define EXTRACTELEMENT 369
+#define INSERTELEMENT 370
+#define SHUFFLEVECTOR 371
+#define VAARG_old 372
+#define VANEXT_old 373
+#define EQ 374
+#define NE 375
+#define SLT 376
+#define SGT 377
+#define SLE 378
+#define SGE 379
+#define ULT 380
+#define UGT 381
+#define ULE 382
+#define UGE 383
+#define OEQ 384
+#define ONE 385
+#define OLT 386
+#define OGT 387
+#define OLE 388
+#define OGE 389
+#define ORD 390
+#define UNO 391
+#define UEQ 392
+#define UNE 393
+#define CAST 394
+#define TRUNC 395
+#define ZEXT 396
+#define SEXT 397
+#define FPTRUNC 398
+#define FPEXT 399
+#define FPTOUI 400
+#define FPTOSI 401
+#define UITOFP 402
+#define SITOFP 403
+#define PTRTOINT 404
+#define INTTOPTR 405
+#define BITCAST 406
 
 
 
 
 /* Copy the first part of user declarations.  */
-#line 14 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 14 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
 
 #include "UpgradeInternals.h"
+#include "llvm/CallingConv.h"
+#include "llvm/InlineAsm.h"
+#include "llvm/Instructions.h"
+#include "llvm/Module.h"
+#include "llvm/SymbolTable.h"
+#include "llvm/Support/GetElementPtrTypeIterator.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/MathExtras.h"
 #include <algorithm>
-#include <map>
-#include <utility>
 #include <iostream>
+#include <list>
+#include <utility>
+
+// DEBUG_UPREFS - Define this symbol if you want to enable debugging output
+// relating to upreferences in the input stream.
+//
+//#define DEBUG_UPREFS 1
+#ifdef DEBUG_UPREFS
+#define UR_OUT(X) std::cerr << X
+#else
+#define UR_OUT(X)
+#endif
 
 #define YYERROR_VERBOSE 1
 #define YYINCLUDED_STDLIB_H
 #define YYDEBUG 1
 
-int yylex();                       // declaration" of xxx warnings.
+int yylex();
 int yyparse();
-extern int yydebug;
 
-static std::string CurFilename;
-static std::ostream *O = 0;
-std::istream* LexInput = 0;
-unsigned SizeOfPointer = 32;
+int yyerror(const char*);
+static void warning(const std::string& WarningMsg);
 
+namespace llvm {
 
-// This bool controls whether attributes are ever added to function declarations
-// definitions and calls.
-static bool AddAttributes = false;
 
-static void warning(const std::string& msg);
+SignedType *SignedType::SByteTy = 0;
+SignedType *SignedType::SShortTy = 0;
+SignedType *SignedType::SIntTy = 0;
+SignedType *SignedType::SLongTy = 0;
+
+inline bool SignedType::classof(const Type *T) {
+  if (T->getTypeID() != IntegerTyID)
+    return false;
+  return (T == SByteTy || T == SShortTy || T == SIntTy || T == SLongTy );
+}
 
-void UpgradeAssembly(const std::string &infile, std::istream& in, 
-                     std::ostream &out, bool debug, bool addAttrs)
+SignedType::SignedType(const IntegerType* ITy) 
+  : IntegerType(ITy->getBitWidth()), base_type(ITy)
 {
-  Upgradelineno = 1; 
-  CurFilename = infile;
-  LexInput = ∈
-  yydebug = debug;
-  AddAttributes = addAttrs;
-  O = &out;
+}
 
-  if (yyparse()) {
-    std::cerr << "llvm-upgrade: parse failed.\n";
-    out << "llvm-upgrade: parse failed.\n";
-    exit(1);
-  }
+const SignedType *SignedType::get(const IntegerType* ITy) {
+  if (ITy == Type::Int8Ty) {
+    if (!SByteTy)
+      SByteTy = new SignedType(IntegerType::get(8));
+    return SByteTy;
+  } else if (ITy == Type::Int16Ty) {
+    if (!SShortTy)
+      SShortTy = new SignedType(IntegerType::get(16));
+    return SShortTy;
+  } else if (ITy == Type::Int32Ty) {
+    if (!SIntTy)
+      SIntTy = new SignedType(IntegerType::get(32));
+    return SIntTy;
+  } else if (ITy == Type::Int64Ty) {
+    if (!SLongTy)
+      SLongTy = new SignedType(IntegerType::get(64));
+    return SLongTy;
+  } else
+    assert(0 && "Invalid integer type for SignedType::get");
 }
 
-namespace { // Anonymous namespace to keep our implementation local
+static inline Signedness getSign(const Type *&Ty) {
+  if (const SignedType *STy = dyn_cast<SignedType>(Ty)) {
+    Ty = STy->getBaseType();
+    return Signed;
+  } else if (isa<IntegerType>(Ty))
+    return Unsigned;
+  return Signless;
+}
 
+static const Type*
+resolveTypeImpl(const Type* Ty, std::vector<const Type*>& TyStack)
+{
+  // Nothing to resolve if it isn't a derived type
+  if (!Ty->isDerivedType())
+    return Ty;
+
+  // Prevent infinite recursion for recursive types
+  for (std::vector<const Type*>::const_iterator I = TyStack.begin(), 
+       E = TyStack.end(); I != E; ++I)
+    if (Ty == *I)
+      return Ty;
+
+  // Okay, haven't seen this derived type yet, push it on the stack.
+  const Type* Result = Ty;
+  TyStack.push_back(Ty);
+
+  // Process the type
+  switch (Ty->getTypeID()) {
+    default: assert(0 && "Invalid derived type");
+    case Type::IntegerTyID:
+      break;
+    case Type::FunctionTyID: {
+      const FunctionType* FTy = cast<FunctionType>(Ty);
+      const Type* RetTy = resolveTypeImpl(FTy->getReturnType(), TyStack);
+      std::vector<const Type*> Types;
+      FunctionType::ParamAttrsList Attrs;
+      Attrs.push_back(FTy->getParamAttrs(0));
+      for (unsigned i = 0; i < FTy->getNumParams(); ++i) {
+        Types.push_back(resolveTypeImpl(FTy->getParamType(i), TyStack));
+        Attrs.push_back(FTy->getParamAttrs(i+1));
+      }
+      Result = FunctionType::get(RetTy, Types, FTy->isVarArg(), Attrs);
+      break;
+    }
+    case Type::StructTyID:
+    case Type::PackedStructTyID: {
+      const StructType *STy = cast<StructType>(Ty);
+      std::vector<const Type*> FieldTypes;
+      for (unsigned i = 0; i < STy->getNumElements(); ++i)
+        FieldTypes.push_back(resolveTypeImpl(STy->getElementType(i), TyStack));
+      Result = StructType::get(FieldTypes, STy->isPacked());
+      break;
+    }
+    case Type::ArrayTyID: {
+      const ArrayType *ATy = cast<ArrayType>(Ty);
+      uint64_t NElems = ATy->getNumElements();
+      const Type *ElemTy = resolveTypeImpl(ATy->getElementType(), TyStack);
+      Result = ArrayType::get(ElemTy, NElems);
+      break;
+    }
+    case Type::PointerTyID: {
+      const PointerType *PTy = cast<PointerType>(Ty);
+      const Type *ElemTy = resolveTypeImpl(PTy->getElementType(), TyStack);
+      Result = PointerType::get(ElemTy);
+      break;
+    }
+    case Type::PackedTyID: {
+      const PackedType *PTy = cast<PackedType>(Ty);
+      unsigned NElems = PTy->getNumElements();
+      const Type *ElemTy = resolveTypeImpl(PTy->getElementType(), TyStack);
+      Result = PackedType::get(ElemTy, NElems);
+      break;
+    }
+  }
+  // Done with it, pop it off.
+  TyStack.pop_back();
+  return Result;
+}
 
-/// This type is used to keep track of the signedness of values. Instead
-/// of creating llvm::Value directly, the parser will create Value which
-/// associates a Value* with a Signedness indication.
-struct Value {
-  std::string* val;
-  const Type* type;
-  bool constant;
-  bool isConstant() const { return constant; }
-  ~Value() { delete val; }
-};
+static inline const Type* resolveType(const Type* Ty) {
+  if (!Ty)
+    return 0;
+  if (const SignedType* STy = dyn_cast<SignedType>(Ty))
+    return STy->getBaseType();
+  std::vector<const Type*> TyStack;
+  return resolveTypeImpl(Ty, TyStack);
+}
 
+std::istream* LexInput;
+static std::string CurFilename;
 
-/// This type is used to keep track of the signedness of the obsolete
-/// integer types. Instead of creating an llvm::Type directly, the Lexer will
-/// create instances of Type which retains the signedness indication so
-/// it can be used by the parser for upgrade decisions.
-/// For example if "uint" is encountered then the "first" field will be set 
-/// to "int32" and the "second" field will be set to "isUnsigned".  If the 
-/// type is not obsolete then "second" will be set to "isSignless".
-class Type {
-public:
-  static const Type* get(const std::string &newType, TypeIDs oldType);
-  static const Type* get(const std::string& newType, TypeIDs oldType, 
-                             const Type* eTy, const Type* rTy);
-
-  static const Type* get(const std::string& newType, TypeIDs oldType, 
-                             const Type *eTy, uint64_t elems);
-
-  static const Type* get(const std::string& newType, TypeIDs oldType, 
-                             TypeList* TL);
+// This bool controls whether attributes are ever added to function declarations
+// definitions and calls.
+static bool AddAttributes = false;
 
-  static const Type* get(const std::string& newType, const Type* resTy, 
-                             TypeList* TL);
+static Module *ParserResult;
+static bool ObsoleteVarArgs;
+static bool NewVarArgs;
+static BasicBlock *CurBB;
+static GlobalVariable *CurGV;
 
-  const Type* resolve() const;
-  bool operator<(const Type& that) const;
 
-  bool sameNewTyAs(const Type* that) const {
-    return this->newTy == that->newTy;
-  }
 
-  bool sameOldTyAs(const Type* that) const;
+// This contains info used when building the body of a function.  It is
+// destroyed when the function is completed.
+//
+typedef std::vector<Value *> ValueList;           // Numbered defs
+
+typedef std::pair<std::string,const Type*> RenameMapKey;
+typedef std::map<RenameMapKey,std::string> RenameMapType;
+
+static void 
+ResolveDefinitions(std::map<const Type *,ValueList> &LateResolvers,
+                   std::map<const Type *,ValueList> *FutureLateResolvers = 0);
+
+static struct PerModuleInfo {
+  Module *CurrentModule;
+  std::map<const Type *, ValueList> Values; // Module level numbered definitions
+  std::map<const Type *,ValueList> LateResolveValues;
+  std::vector<PATypeHolder>    Types;
+  std::map<ValID, PATypeHolder> LateResolveTypes;
+  static Module::Endianness Endian;
+  static Module::PointerSize PointerSize;
+  RenameMapType RenameMap;
+
+  /// PlaceHolderInfo - When temporary placeholder objects are created, remember
+  /// how they were referenced and on which line of the input they came from so
+  /// that we can resolve them later and print error messages as appropriate.
+  std::map<Value*, std::pair<ValID, int> > PlaceHolderInfo;
+
+  // GlobalRefs - This maintains a mapping between <Type, ValID>'s and forward
+  // references to global values.  Global values may be referenced before they
+  // are defined, and if so, the temporary object that they represent is held
+  // here.  This is used for forward references of GlobalValues.
+  //
+  typedef std::map<std::pair<const PointerType *, ValID>, GlobalValue*> 
+    GlobalRefsType;
+  GlobalRefsType GlobalRefs;
+
+  void ModuleDone() {
+    // If we could not resolve some functions at function compilation time
+    // (calls to functions before they are defined), resolve them now...  Types
+    // are resolved when the constant pool has been completely parsed.
+    //
+    ResolveDefinitions(LateResolveValues);
+
+    // Check to make sure that all global value forward references have been
+    // resolved!
+    //
+    if (!GlobalRefs.empty()) {
+      std::string UndefinedReferences = "Unresolved global references exist:\n";
+
+      for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end();
+           I != E; ++I) {
+        UndefinedReferences += "  " + I->first.first->getDescription() + " " +
+                               I->first.second.getName() + "\n";
+      }
+      error(UndefinedReferences);
+      return;
+    }
 
-  TypeIDs getElementTy() const {
-    if (elemTy) {
-      return elemTy->oldTy;
+    if (CurrentModule->getDataLayout().empty()) {
+      std::string dataLayout;
+      if (Endian != Module::AnyEndianness)
+        dataLayout.append(Endian == Module::BigEndian ? "E" : "e");
+      if (PointerSize != Module::AnyPointerSize) {
+        if (!dataLayout.empty())
+          dataLayout += "-";
+        dataLayout.append(PointerSize == Module::Pointer64 ? 
+                          "p:64:64" : "p:32:32");
+      }
+      CurrentModule->setDataLayout(dataLayout);
     }
-    return UnresolvedTy;
+
+    Values.clear();         // Clear out function local definitions
+    Types.clear();
+    CurrentModule = 0;
+  }
+
+  // GetForwardRefForGlobal - Check to see if there is a forward reference
+  // for this global.  If so, remove it from the GlobalRefs map and return it.
+  // If not, just return null.
+  GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) {
+    // Check to see if there is a forward reference to this global variable...
+    // if there is, eliminate it and patch the reference to use the new def'n.
+    GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID));
+    GlobalValue *Ret = 0;
+    if (I != GlobalRefs.end()) {
+      Ret = I->second;
+      GlobalRefs.erase(I);
+    }
+    return Ret;
+  }
+  void setEndianness(Module::Endianness E) { Endian = E; }
+  void setPointerSize(Module::PointerSize sz) { PointerSize = sz; }
+} CurModule;
+
+Module::Endianness  PerModuleInfo::Endian = Module::AnyEndianness;
+Module::PointerSize PerModuleInfo::PointerSize = Module::AnyPointerSize;
+
+static struct PerFunctionInfo {
+  Function *CurrentFunction;     // Pointer to current function being created
+
+  std::map<const Type*, ValueList> Values; // Keep track of #'d definitions
+  std::map<const Type*, ValueList> LateResolveValues;
+  bool isDeclare;                   // Is this function a forward declararation?
+  GlobalValue::LinkageTypes Linkage;// Linkage for forward declaration.
+
+  /// BBForwardRefs - When we see forward references to basic blocks, keep
+  /// track of them here.
+  std::map<BasicBlock*, std::pair<ValID, int> > BBForwardRefs;
+  std::vector<BasicBlock*> NumberedBlocks;
+  RenameMapType RenameMap;
+  std::set<Value*> SignedValues;
+  unsigned NextBBNum;
+
+  inline PerFunctionInfo() {
+    CurrentFunction = 0;
+    isDeclare = false;
+    Linkage = GlobalValue::ExternalLinkage;    
   }
 
-  unsigned getUpRefNum() const {
-    assert(oldTy == UpRefTy && "Can't getUpRefNum on non upreference");
-    return atoi(&((getNewTy().c_str())[1])); // skip the slash
+  inline void FunctionStart(Function *M) {
+    CurrentFunction = M;
+    NextBBNum = 0;
   }
 
-  typedef std::vector<const Type*> UpRefStack;
-  void getSignedness(unsigned &sNum, unsigned &uNum, UpRefStack& stk) const;
-  std::string makeUniqueName(const std::string& BaseName) const;
-
-  const std::string& getNewTy() const { return newTy; }
-  const Type* getResultType() const { return resultTy; }
-  const Type* getElementType() const { return elemTy; }
+  void FunctionDone() {
+    NumberedBlocks.clear();
 
-  const Type* getPointerType() const {
-    return get(newTy + "*", PointerTy, this, (Type*)0);
-  }
+    // Any forward referenced blocks left?
+    if (!BBForwardRefs.empty()) {
+      error("Undefined reference to label " + 
+            BBForwardRefs.begin()->first->getName());
+      return;
+    }
 
-  bool isUnresolved() const { return oldTy == UnresolvedTy; }
-  bool isUpReference() const { return oldTy == UpRefTy; }
-  bool isVoid() const { return oldTy == VoidTy; }
-  bool isBool() const { return oldTy == BoolTy; }
-  bool isSigned() const {
-    return oldTy == SByteTy || oldTy == ShortTy || 
-           oldTy == IntTy || oldTy == LongTy;
-  }
+    // Resolve all forward references now.
+    ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
 
-  bool isUnsigned() const {
-    return oldTy == UByteTy || oldTy == UShortTy || 
-           oldTy == UIntTy || oldTy == ULongTy;
-  }
-  bool isSignless() const { return !isSigned() && !isUnsigned(); }
-  bool isInteger() const { return isSigned() || isUnsigned(); }
-  bool isIntegral() const { return oldTy == BoolTy || isInteger(); }
-  bool isFloatingPoint() const { return oldTy == DoubleTy || oldTy == FloatTy; }
-  bool isPacked() const { return oldTy == PackedTy; }
-  bool isPointer() const { return oldTy == PointerTy; }
-  bool isStruct() const { return oldTy == StructTy || oldTy == PackedStructTy; }
-  bool isArray() const { return oldTy == ArrayTy; }
-  bool isOther() const { 
-    return !isPacked() && !isPointer() && !isFloatingPoint() && !isIntegral(); }
-  bool isFunction() const { return oldTy == FunctionTy; }
-  bool isComposite() const {
-    return isStruct() || isPointer() || isArray() || isPacked();
+    Values.clear();         // Clear out function local definitions
+    RenameMap.clear();
+    SignedValues.clear();
+    CurrentFunction = 0;
+    isDeclare = false;
+    Linkage = GlobalValue::ExternalLinkage;
   }
+} CurFun;  // Info for the current function...
 
-  bool isAttributeCandidate() const {
-    return isIntegral() && getBitWidth() < 32;
-  }
+static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }
 
-  bool isUnresolvedDeep() const;
 
-  unsigned getBitWidth() const;
+//===----------------------------------------------------------------------===//
+//               Code to handle definitions of all the types
+//===----------------------------------------------------------------------===//
 
-  const Type* getIndexedType(const Value*  V) const;
+static int InsertValue(Value *V,
+                  std::map<const Type*,ValueList> &ValueTab = CurFun.Values) {
+  if (V->hasName()) return -1;           // Is this a numbered definition?
 
-  unsigned getNumStructElements() const { 
-    return (elements ? elements->size() : 0);
-  }
+  // Yes, insert the value into the value table...
+  ValueList &List = ValueTab[V->getType()];
+  List.push_back(V);
+  return List.size()-1;
+}
 
-  const Type* getElement(unsigned idx) const {
-    if (elements)
-      if (idx < elements->size())
-        return (*elements)[idx];
+static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
+  switch (D.Type) {
+  case ValID::NumberVal:               // Is it a numbered definition?
+    // Module constants occupy the lowest numbered slots...
+    if ((unsigned)D.Num < CurModule.Types.size()) {
+      return CurModule.Types[(unsigned)D.Num];
+    }
+    break;
+  case ValID::NameVal:                 // Is it a named definition?
+    if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
+      D.destroy();  // Free old strdup'd memory...
+      return N;
+    }
+    break;
+  default:
+    error("Internal parser error: Invalid symbol type reference");
     return 0;
   }
 
-private:
-  Type() 
-    : newTy(), oldTy(UnresolvedTy), elemTy(0), resultTy(0), elements(0),
-      nelems(0) {
-  }
+  // If we reached here, we referenced either a symbol that we don't know about
+  // or an id number that hasn't been read yet.  We may be referencing something
+  // forward, so just create an entry to be resolved later and get to it...
+  //
+  if (DoNotImprovise) return 0;  // Do we just want a null to be returned?
 
-  Type(const Type& that); // do not implement
-  Type& operator=(const Type& that); // do not implement
 
-  ~Type() { delete elements; }
+  if (inFunctionScope()) {
+    if (D.Type == ValID::NameVal) {
+      error("Reference to an undefined type: '" + D.getName() + "'");
+      return 0;
+    } else {
+      error("Reference to an undefined type: #" + itostr(D.Num));
+      return 0;
+    }
+  }
 
-  struct ltfunctor
-  {
-    bool operator()(const Type* X, const Type* Y) const {
-      assert(X && "Can't compare null pointer");
-      assert(Y && "Can't compare null pointer");
-      return *X < *Y;
+  std::map<ValID, PATypeHolder>::iterator I =CurModule.LateResolveTypes.find(D);
+  if (I != CurModule.LateResolveTypes.end())
+    return I->second;
+
+  Type *Typ = OpaqueType::get();
+  CurModule.LateResolveTypes.insert(std::make_pair(D, Typ));
+  return Typ;
+ }
+
+// getExistingValue - Look up the value specified by the provided type and
+// the provided ValID.  If the value exists and has already been defined, return
+// it.  Otherwise return null.
+//
+static Value *getExistingValue(const Type *Ty, const ValID &D) {
+  if (isa<FunctionType>(Ty)) {
+    error("Functions are not values and must be referenced as pointers");
+  }
+
+  switch (D.Type) {
+  case ValID::NumberVal: {                 // Is it a numbered definition?
+    unsigned Num = (unsigned)D.Num;
+
+    // Module constants occupy the lowest numbered slots...
+    std::map<const Type*,ValueList>::iterator VI = CurModule.Values.find(Ty);
+    if (VI != CurModule.Values.end()) {
+      if (Num < VI->second.size())
+        return VI->second[Num];
+      Num -= VI->second.size();
+    }
+
+    // Make sure that our type is within bounds
+    VI = CurFun.Values.find(Ty);
+    if (VI == CurFun.Values.end()) return 0;
+
+    // Check that the number is within bounds...
+    if (VI->second.size() <= Num) return 0;
+
+    return VI->second[Num];
+  }
+
+  case ValID::NameVal: {                // Is it a named definition?
+    // Get the name out of the ID
+    std::string Name(D.Name);
+    Value* V = 0;
+    RenameMapKey Key = std::make_pair(Name, Ty);
+    if (inFunctionScope()) {
+      // See if the name was renamed
+      RenameMapType::const_iterator I = CurFun.RenameMap.find(Key);
+      std::string LookupName;
+      if (I != CurFun.RenameMap.end())
+        LookupName = I->second;
+      else
+        LookupName = Name;
+      SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
+      V = SymTab.lookup(Ty, LookupName);
+    }
+    if (!V) {
+      RenameMapType::const_iterator I = CurModule.RenameMap.find(Key);
+      std::string LookupName;
+      if (I != CurModule.RenameMap.end())
+        LookupName = I->second;
+      else
+        LookupName = Name;
+      V = CurModule.CurrentModule->getValueSymbolTable().lookup(Ty, LookupName);
     }
-  };
+    if (V == 0) 
+      return 0;
 
-  typedef std::set<const Type*, ltfunctor> TypeRegMap;
+    D.destroy();  // Free old strdup'd memory...
+    return V;
+  }
 
-  static const Type* add_new_type(Type* existing);
+  // Check to make sure that "Ty" is an integral type, and that our
+  // value will fit into the specified type...
+  case ValID::ConstSIntVal:    // Is it a constant pool reference??
+    if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
+      error("Signed integral constant '" + itostr(D.ConstPool64) + 
+            "' is invalid for type '" + Ty->getDescription() + "'");
+    }
+    return ConstantInt::get(Ty, D.ConstPool64);
+
+  case ValID::ConstUIntVal:     // Is it an unsigned const pool reference?
+    if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
+      if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64))
+        error("Integral constant '" + utostr(D.UConstPool64) + 
+              "' is invalid or out of range");
+      else     // This is really a signed reference.  Transmogrify.
+        return ConstantInt::get(Ty, D.ConstPool64);
+    } else
+      return ConstantInt::get(Ty, D.UConstPool64);
 
-  std::string newTy;
-  TypeIDs oldTy;
-  Type *elemTy;
-  Type *resultTy;
-  TypeList *elements;
-  uint64_t nelems;
-  static TypeRegMap registry;
-public:
-  typedef std::vector<const Type*> TypeVector;
-  typedef std::map<std::string,const Type*> TypeMap;
-  typedef std::map<const Type*,std::string> TypePlaneMap;
-  typedef std::map<std::string,TypePlaneMap> GlobalsTypeMap;
-  static TypeVector EnumeratedTypes;
-  static TypeMap NamedTypes;
-  static GlobalsTypeMap Globals;
-};
+  case ValID::ConstFPVal:        // Is it a floating point const pool reference?
+    if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP))
+      error("FP constant invalid for type");
+    return ConstantFP::get(Ty, D.ConstPoolFP);
+
+  case ValID::ConstNullVal:      // Is it a null value?
+    if (!isa<PointerType>(Ty))
+      error("Cannot create a a non pointer null");
+    return ConstantPointerNull::get(cast<PointerType>(Ty));
+
+  case ValID::ConstUndefVal:      // Is it an undef value?
+    return UndefValue::get(Ty);
+
+  case ValID::ConstZeroVal:      // Is it a zero value?
+    return Constant::getNullValue(Ty);
+    
+  case ValID::ConstantVal:       // Fully resolved constant?
+    if (D.ConstantValue->getType() != Ty) 
+      error("Constant expression type different from required type");
+    return D.ConstantValue;
+
+  case ValID::InlineAsmVal: {    // Inline asm expression
+    const PointerType *PTy = dyn_cast<PointerType>(Ty);
+    const FunctionType *FTy =
+      PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
+    if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints))
+      error("Invalid type for asm constraint string");
+    InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
+                                   D.IAD->HasSideEffects);
+    D.destroy();   // Free InlineAsmDescriptor.
+    return IA;
+  }
+  default:
+    assert(0 && "Unhandled case");
+    return 0;
+  }   // End of switch
 
-Type::TypeRegMap     Type::registry;
-Type::TypeVector     Type::EnumeratedTypes;
-Type::TypeMap        Type::NamedTypes;
-Type::GlobalsTypeMap Type::Globals;
-
-const Type* Type::get(const std::string &newType, TypeIDs oldType) {
-  Type* Ty = new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = oldType;
-  return add_new_type(Ty);
+  assert(0 && "Unhandled case");
+  return 0;
 }
 
-const Type* Type::get(const std::string& newType, TypeIDs oldType, 
-                              const Type* eTy, const Type* rTy) {
-  Type* Ty= new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = oldType;
-  Ty->elemTy = const_cast<Type*>(eTy);
-  Ty->resultTy = const_cast<Type*>(rTy);
-  return add_new_type(Ty);
-}
+// getVal - This function is identical to getExistingValue, except that if a
+// value is not already defined, it "improvises" by creating a placeholder var
+// that looks and acts just like the requested variable.  When the value is
+// defined later, all uses of the placeholder variable are replaced with the
+// real thing.
+//
+static Value *getVal(const Type *Ty, const ValID &ID) {
+  if (Ty == Type::LabelTy)
+    error("Cannot use a basic block here");
+
+  // See if the value has already been defined.
+  Value *V = getExistingValue(Ty, ID);
+  if (V) return V;
+
+  if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty))
+    error("Invalid use of a composite type");
+
+  // If we reached here, we referenced either a symbol that we don't know about
+  // or an id number that hasn't been read yet.  We may be referencing something
+  // forward, so just create an entry to be resolved later and get to it...
+  assert(!isa<SignedType>(Ty) && "Can't create value with SignedType");
+  V = new Argument(Ty);
+
+  // Remember where this forward reference came from.  FIXME, shouldn't we try
+  // to recycle these things??
+  CurModule.PlaceHolderInfo.insert(
+    std::make_pair(V, std::make_pair(ID, Upgradelineno-1)));
 
-const Type* Type::get(const std::string& newType, TypeIDs oldType, 
-                              const Type *eTy, uint64_t elems) {
-  Type* Ty = new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = oldType;
-  Ty->elemTy = const_cast<Type*>(eTy);
-  Ty->nelems = elems;
-  return  add_new_type(Ty);
+  if (inFunctionScope())
+    InsertValue(V, CurFun.LateResolveValues);
+  else
+    InsertValue(V, CurModule.LateResolveValues);
+  return V;
 }
 
-const Type* Type::get(const std::string& newType, TypeIDs oldType, 
-                              TypeList* TL) {
-  Type* Ty = new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = oldType;
-  Ty->elements = TL;
-  return add_new_type(Ty);
-}
+/// getBBVal - This is used for two purposes:
+///  * If isDefinition is true, a new basic block with the specified ID is being
+///    defined.
+///  * If isDefinition is true, this is a reference to a basic block, which may
+///    or may not be a forward reference.
+///
+static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {
+  assert(inFunctionScope() && "Can't get basic block at global scope");
+
+  std::string Name;
+  BasicBlock *BB = 0;
+  switch (ID.Type) {
+  default: 
+    error("Illegal label reference " + ID.getName());
+    break;
+  case ValID::NumberVal:                // Is it a numbered definition?
+    if (unsigned(ID.Num) >= CurFun.NumberedBlocks.size())
+      CurFun.NumberedBlocks.resize(ID.Num+1);
+    BB = CurFun.NumberedBlocks[ID.Num];
+    break;
+  case ValID::NameVal:                  // Is it a named definition?
+    Name = ID.Name;
+    if (Value *N = CurFun.CurrentFunction->
+                   getValueSymbolTable().lookup(Type::LabelTy, Name)) {
+      if (N->getType() != Type::LabelTy)
+        error("Name '" + Name + "' does not refer to a BasicBlock");
+      BB = cast<BasicBlock>(N);
+    }
+    break;
+  }
 
-const Type* Type::get(const std::string& newType, const Type* resTy,
-                              TypeList* TL) {
-  Type* Ty = new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = FunctionTy;
-  Ty->resultTy = const_cast<Type*>(resTy);
-  Ty->elements = TL;
-  return add_new_type(Ty);
-}
+  // See if the block has already been defined.
+  if (BB) {
+    // If this is the definition of the block, make sure the existing value was
+    // just a forward reference.  If it was a forward reference, there will be
+    // an entry for it in the PlaceHolderInfo map.
+    if (isDefinition && !CurFun.BBForwardRefs.erase(BB))
+      // The existing value was a definition, not a forward reference.
+      error("Redefinition of label " + ID.getName());
+
+    ID.destroy();                       // Free strdup'd memory.
+    return BB;
+  }
+
+  // Otherwise this block has not been seen before.
+  BB = new BasicBlock("", CurFun.CurrentFunction);
+  if (ID.Type == ValID::NameVal) {
+    BB->setName(ID.Name);
+  } else {
+    CurFun.NumberedBlocks[ID.Num] = BB;
+  }
 
-const Type* Type::resolve() const {
-  if (isUnresolved()) {
-    if (getNewTy()[0] == '%' && isdigit(newTy[1])) {
-      unsigned ref = atoi(&((newTy.c_str())[1])); // skip the %
-      if (ref < EnumeratedTypes.size()) {
-        return EnumeratedTypes[ref];
-      } else {
-        std::string msg("Can't resolve numbered type: ");
-        msg += getNewTy();
-        yyerror(msg.c_str());
-      }
-    } else {
-      Type::TypeMap::iterator I = NamedTypes.find(newTy);
-      if (I != NamedTypes.end()) {
-        return I->second;
-      } else {
-        std::string msg("Cannot resolve type: ");
-        msg += getNewTy();
-        yyerror(msg.c_str());
-      }
-    }
+  // If this is not a definition, keep track of it so we can use it as a forward
+  // reference.
+  if (!isDefinition) {
+    // Remember where this forward reference came from.
+    CurFun.BBForwardRefs[BB] = std::make_pair(ID, Upgradelineno);
+  } else {
+    // The forward declaration could have been inserted anywhere in the
+    // function: insert it into the correct place now.
+    CurFun.CurrentFunction->getBasicBlockList().remove(BB);
+    CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
   }
-  // otherwise its already resolved.
-  return this;
+  ID.destroy();
+  return BB;
 }
 
-bool Type::operator<(const Type& that) const {
-  if (this == &that)
-    return false;
-  if (oldTy != that.oldTy)
-    return oldTy < that.oldTy;
-  switch (oldTy) {
-    case UpRefTy: {
-      unsigned thisUp = this->getUpRefNum();
-      unsigned thatUp = that.getUpRefNum();
-      return thisUp < thatUp;
-    }
-    case PackedTy:
-    case ArrayTy:
-      if (this->nelems != that.nelems)
-        return nelems < that.nelems;
-    case PointerTy: {
-      const Type* thisTy = this->elemTy;
-      const Type* thatTy = that.elemTy;
-      return *thisTy < *thatTy;
-    }
-    case FunctionTy: {
-      const Type* thisTy = this->resultTy;
-      const Type* thatTy = that.resultTy;
-      if (!thisTy->sameOldTyAs(thatTy))
-        return *thisTy < *thatTy;
-      /* FALL THROUGH */
-    }
-    case StructTy:
-    case PackedStructTy: {
-      if (elements->size() != that.elements->size())
-        return elements->size() < that.elements->size();
-      for (unsigned i = 0; i < elements->size(); i++) {
-        const Type* thisTy = (*this->elements)[i];
-        const Type* thatTy = (*that.elements)[i];
-        if (!thisTy->sameOldTyAs(thatTy))
-          return *thisTy < *thatTy;
+
+//===----------------------------------------------------------------------===//
+//              Code to handle forward references in instructions
+//===----------------------------------------------------------------------===//
+//
+// This code handles the late binding needed with statements that reference
+// values not defined yet... for example, a forward branch, or the PHI node for
+// a loop body.
+//
+// This keeps a table (CurFun.LateResolveValues) of all such forward references
+// and back patchs after we are done.
+//
+
+// ResolveDefinitions - If we could not resolve some defs at parsing
+// time (forward branches, phi functions for loops, etc...) resolve the
+// defs now...
+//
+static void 
+ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
+                   std::map<const Type*,ValueList> *FutureLateResolvers) {
+  // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
+  for (std::map<const Type*,ValueList>::iterator LRI = LateResolvers.begin(),
+         E = LateResolvers.end(); LRI != E; ++LRI) {
+    ValueList &List = LRI->second;
+    while (!List.empty()) {
+      Value *V = List.back();
+      List.pop_back();
+
+      std::map<Value*, std::pair<ValID, int> >::iterator PHI =
+        CurModule.PlaceHolderInfo.find(V);
+      assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error");
+
+      ValID &DID = PHI->second.first;
+
+      Value *TheRealValue = getExistingValue(LRI->first, DID);
+      if (TheRealValue) {
+        V->replaceAllUsesWith(TheRealValue);
+        delete V;
+        CurModule.PlaceHolderInfo.erase(PHI);
+      } else if (FutureLateResolvers) {
+        // Functions have their unresolved items forwarded to the module late
+        // resolver table
+        InsertValue(V, *FutureLateResolvers);
+      } else {
+        if (DID.Type == ValID::NameVal) {
+          error("Reference to an invalid definition: '" +DID.getName()+
+                "' of type '" + V->getType()->getDescription() + "'",
+                PHI->second.second);
+          return;
+        } else {
+          error("Reference to an invalid definition: #" +
+                itostr(DID.Num) + " of type '" + 
+                V->getType()->getDescription() + "'", PHI->second.second);
+          return;
+        }
       }
-      break;
     }
-    case UnresolvedTy:
-      return this->newTy < that.newTy;
-    default:
-      break;
   }
-  return false; 
+
+  LateResolvers.clear();
 }
 
-bool Type::sameOldTyAs(const Type* that) const {
-  if (that == 0)
-    return false;
-  if ( this == that ) 
-    return true;
-  if (oldTy != that->oldTy)
-    return false;
-  switch (oldTy) {
-    case PackedTy:
-    case ArrayTy:
-      if (nelems != that->nelems)
-        return false;
-      /* FALL THROUGH */
-    case PointerTy: {
-      const Type* thisTy = this->elemTy;
-      const Type* thatTy = that->elemTy;
-      return thisTy->sameOldTyAs(thatTy);
-    }
-    case FunctionTy: {
-      const Type* thisTy = this->resultTy;
-      const Type* thatTy = that->resultTy;
-      if (!thisTy->sameOldTyAs(thatTy))
-        return false;
-      /* FALL THROUGH */
-    }
-    case StructTy:
-    case PackedStructTy: {
-      if (elements->size() != that->elements->size())
-        return false;
-      for (unsigned i = 0; i < elements->size(); i++) {
-        const Type* thisTy = (*this->elements)[i];
-        const Type* thatTy = (*that->elements)[i];
-        if (!thisTy->sameOldTyAs(thatTy))
-          return false;
-      }
-      return true;
-    }
-    case UnresolvedTy:
-      return this->newTy == that->newTy;
-    default:
-      return true; // for all others oldTy == that->oldTy is sufficient
+// ResolveTypeTo - A brand new type was just declared.  This means that (if
+// name is not null) things referencing Name can be resolved.  Otherwise, things
+// refering to the number can be resolved.  Do this now.
+//
+static void ResolveTypeTo(char *Name, const Type *ToTy) {
+  ValID D;
+  if (Name) D = ValID::create(Name);
+  else      D = ValID::create((int)CurModule.Types.size());
+
+  std::map<ValID, PATypeHolder>::iterator I =
+    CurModule.LateResolveTypes.find(D);
+  if (I != CurModule.LateResolveTypes.end()) {
+    ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy);
+    CurModule.LateResolveTypes.erase(I);
   }
-  return true;
 }
 
-bool Type::isUnresolvedDeep() const {
-  switch (oldTy) {
-    case UnresolvedTy: 
-      return true;
-    case PackedTy:
-    case ArrayTy:
-    case PointerTy:
-      return elemTy->isUnresolvedDeep();
-    case PackedStructTy:
-    case StructTy:
-      for (unsigned i = 0; i < elements->size(); i++)
-        if ((*elements)[i]->isUnresolvedDeep())
-          return true;
-      return false;
-    default:
-      return false;
-  }
+static std::string makeNameUnique(const std::string& Name) {
+  static unsigned UniqueNameCounter = 1;
+  std::string Result(Name);
+  Result += ".upgrd." + llvm::utostr(UniqueNameCounter++);
+  return Result;
 }
 
-unsigned Type::getBitWidth() const {
-  switch (oldTy) {
-    default:
-    case LabelTy:
-    case VoidTy : return 0;
-    case BoolTy : return 1;
-    case SByteTy: case UByteTy : return 8;
-    case ShortTy: case UShortTy : return 16;
-    case IntTy: case UIntTy: case FloatTy: return 32;
-    case LongTy: case ULongTy: case DoubleTy : return 64;
-    case PointerTy: return SizeOfPointer; // global var
-    case PackedTy: 
-    case ArrayTy: 
-      return nelems * elemTy->getBitWidth();
-    case StructTy:
-    case PackedStructTy: {
-      uint64_t size = 0;
-      for (unsigned i = 0; i < elements->size(); i++) {
-        size += (*elements)[i]->getBitWidth();
+// setValueName - Set the specified value to the name given.  The name may be
+// null potentially, in which case this is a noop.  The string passed in is
+// assumed to be a malloc'd string buffer, and is free'd by this function.
+//
+static void setValueName(Value *V, char *NameStr) {
+  if (NameStr) {
+    std::string Name(NameStr);      // Copy string
+    free(NameStr);                  // Free old string
+
+    if (V->getType() == Type::VoidTy) {
+      error("Can't assign name '" + Name + "' to value with void type");
+      return;
+    }
+
+    assert(!isa<SignedType>(V->getType()) && "Shouldn't have SignedType Value");
+    assert(inFunctionScope() && "Must be in function scope");
+
+    // Search the function's symbol table for an existing value of this name
+    Value* Existing = 0;
+    SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
+    SymbolTable::plane_const_iterator PI = ST.plane_begin(), PE =ST.plane_end();
+    for ( ; PI != PE; ++PI) {
+      SymbolTable::value_const_iterator VI = PI->second.find(Name);
+      if (VI != PI->second.end()) {
+        Existing = VI->second;
+        break;
       }
-      return size;
     }
+    if (Existing) {
+      if (Existing->getType() == V->getType()) {
+        // The type of the Existing value and the new one are the same. This
+        // is probably a type plane collapsing error. If the types involved
+        // are both integer, just rename it. Otherwise it 
+        // is a redefinition error.
+        if (!Existing->getType()->isInteger()) {
+          error("Redefinition of value named '" + Name + "' in the '" +
+                V->getType()->getDescription() + "' type plane");
+          return;
+        }
+      } 
+      // In LLVM 2.0 we don't allow names to be re-used for any values in a 
+      // function, regardless of Type. Previously re-use of names was okay as 
+      // long as they were distinct types. With type planes collapsing because
+      // of the signedness change and because of PR411, this can no longer be
+      // supported. We must search the entire symbol table for a conflicting
+      // name and make the name unique. No warning is needed as this can't 
+      // cause a problem.
+      std::string NewName = makeNameUnique(Name);
+      // We're changing the name but it will probably be used by other 
+      // instructions as operands later on. Consequently we have to retain
+      // a mapping of the renaming that we're doing.
+      RenameMapKey Key = std::make_pair(Name,V->getType());
+      CurFun.RenameMap[Key] = NewName;
+      Name = NewName;
+    }
+
+    // Set the name.
+    V->setName(Name);
   }
 }
 
-const Type* Type::getIndexedType(const Value*  V) const {
-  if (isStruct()) {
-    if (V->isConstant() && V->type->isInteger()) {
-      size_t pos = V->val->find(' ') + 1;
-      if (pos < V->val->size()) {
-        uint64_t idx = atoi(V->val->substr(pos).c_str());
-        return (*elements)[idx];
+/// ParseGlobalVariable - Handle parsing of a global.  If Initializer is null,
+/// this is a declaration, otherwise it is a definition.
+static GlobalVariable *
+ParseGlobalVariable(char *NameStr,GlobalValue::LinkageTypes Linkage,
+                    bool isConstantGlobal, const Type *Ty,
+                    Constant *Initializer) {
+  if (isa<FunctionType>(Ty))
+    error("Cannot declare global vars of function type");
+
+  const PointerType *PTy = PointerType::get(Ty);
+
+  std::string Name;
+  if (NameStr) {
+    Name = NameStr;      // Copy string
+    free(NameStr);       // Free old string
+  }
+
+  // See if this global value was forward referenced.  If so, recycle the
+  // object.
+  ValID ID;
+  if (!Name.empty()) {
+    ID = ValID::create((char*)Name.c_str());
+  } else {
+    ID = ValID::create((int)CurModule.Values[PTy].size());
+  }
+
+  if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
+    // Move the global to the end of the list, from whereever it was
+    // previously inserted.
+    GlobalVariable *GV = cast<GlobalVariable>(FWGV);
+    CurModule.CurrentModule->getGlobalList().remove(GV);
+    CurModule.CurrentModule->getGlobalList().push_back(GV);
+    GV->setInitializer(Initializer);
+    GV->setLinkage(Linkage);
+    GV->setConstant(isConstantGlobal);
+    InsertValue(GV, CurModule.Values);
+    return GV;
+  }
+
+  // If this global has a name, check to see if there is already a definition
+  // of this global in the module and emit warnings if there are conflicts.
+  if (!Name.empty()) {
+    // The global has a name. See if there's an existing one of the same name.
+    if (CurModule.CurrentModule->getNamedGlobal(Name)) {
+      // We found an existing global ov the same name. This isn't allowed 
+      // in LLVM 2.0. Consequently, we must alter the name of the global so it
+      // can at least compile. This can happen because of type planes 
+      // There is alread a global of the same name which means there is a
+      // conflict. Let's see what we can do about it.
+      std::string NewName(makeNameUnique(Name));
+      if (Linkage == GlobalValue::InternalLinkage) {
+        // The linkage type is internal so just warn about the rename without
+        // invoking "scarey language" about linkage failures. GVars with
+        // InternalLinkage can be renamed at will.
+        warning("Global variable '" + Name + "' was renamed to '"+ 
+                NewName + "'");
       } else {
-        yyerror("Invalid value for constant integer");
-        return 0;
+        // The linkage of this gval is external so we can't reliably rename 
+        // it because it could potentially create a linking problem.  
+        // However, we can't leave the name conflict in the output either or 
+        // it won't assemble with LLVM 2.0.  So, all we can do is rename 
+        // this one to something unique and emit a warning about the problem.
+        warning("Renaming global variable '" + Name + "' to '" + NewName + 
+                  "' may cause linkage errors");
       }
-    } else {
-      yyerror("Structure requires constant index");
-      return 0;
+
+      // Put the renaming in the global rename map
+      RenameMapKey Key = std::make_pair(Name,PointerType::get(Ty));
+      CurModule.RenameMap[Key] = NewName;
+
+      // Rename it
+      Name = NewName;
     }
   }
-  if (isArray() || isPacked() || isPointer())
-    return elemTy;
-  yyerror("Invalid type for getIndexedType");
-  return 0;
+
+  // Otherwise there is no existing GV to use, create one now.
+  GlobalVariable *GV =
+    new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
+                       CurModule.CurrentModule);
+  InsertValue(GV, CurModule.Values);
+  return GV;
 }
 
-void Type::getSignedness(unsigned &sNum, unsigned &uNum, 
-                             UpRefStack& stack) const {
-  switch (oldTy) {
-    default:
-    case OpaqueTy: case LabelTy: case VoidTy: case BoolTy: 
-    case FloatTy : case DoubleTy: case UpRefTy:
-      return;
-    case SByteTy: case ShortTy: case LongTy: case IntTy: 
-      sNum++;
-      return;
-    case UByteTy: case UShortTy: case UIntTy: case ULongTy: 
-      uNum++;
-      return;
-    case PointerTy:
-    case PackedTy: 
-    case ArrayTy:
-      stack.push_back(this);
-      elemTy->getSignedness(sNum, uNum, stack);
-      return;
-    case StructTy:
-    case PackedStructTy: {
-      stack.push_back(this);
-      for (unsigned i = 0; i < elements->size(); i++) {
-        (*elements)[i]->getSignedness(sNum, uNum, stack);
-      }
-      return;
-    }
-    case UnresolvedTy: {
-      const Type* Ty = this->resolve();
-      // Let's not recurse.
-      UpRefStack::const_iterator I = stack.begin(), E = stack.end();
-      for ( ; I != E && *I != Ty; ++I) 
-        ;
-      if (I == E)
-        Ty->getSignedness(sNum, uNum, stack);
-      return;
+// setTypeName - Set the specified type to the name given.  The name may be
+// null potentially, in which case this is a noop.  The string passed in is
+// assumed to be a malloc'd string buffer, and is freed by this function.
+//
+// This function returns true if the type has already been defined, but is
+// allowed to be redefined in the specified context.  If the name is a new name
+// for the type plane, it is inserted and false is returned.
+static bool setTypeName(const Type *T, char *NameStr) {
+  assert(!inFunctionScope() && "Can't give types function-local names");
+  if (NameStr == 0) return false;
+ 
+  std::string Name(NameStr);      // Copy string
+  free(NameStr);                  // Free old string
+
+  // We don't allow assigning names to void type
+  if (T == Type::VoidTy) {
+    error("Can't assign name '" + Name + "' to the void type");
+    return false;
+  }
+
+  // Set the type name, checking for conflicts as we do so.
+  bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T);
+
+  if (AlreadyExists) {   // Inserting a name that is already defined???
+    const Type *Existing = CurModule.CurrentModule->getTypeByName(Name);
+    assert(Existing && "Conflict but no matching type?");
+
+    // There is only one case where this is allowed: when we are refining an
+    // opaque type.  In this case, Existing will be an opaque type.
+    if (const OpaqueType *OpTy = dyn_cast<OpaqueType>(Existing)) {
+      // We ARE replacing an opaque type!
+      const_cast<OpaqueType*>(OpTy)->refineAbstractTypeTo(T);
+      return true;
     }
+
+    // Otherwise, this is an attempt to redefine a type. That's okay if
+    // the redefinition is identical to the original. This will be so if
+    // Existing and T point to the same Type object. In this one case we
+    // allow the equivalent redefinition.
+    if (Existing == T) return true;  // Yes, it's equal.
+
+    // Any other kind of (non-equivalent) redefinition is an error.
+    error("Redefinition of type named '" + Name + "' in the '" +
+          T->getDescription() + "' type plane");
   }
+
+  return false;
 }
 
-std::string AddSuffix(const std::string& Name, const std::string& Suffix) {
-  if (Name[Name.size()-1] == '"') {
-    std::string Result = Name;
-    Result.insert(Result.size()-1, Suffix);
-    return Result;
-  }
-  return Name + Suffix;
+//===----------------------------------------------------------------------===//
+// Code for handling upreferences in type names...
+//
+
+// TypeContains - Returns true if Ty directly contains E in it.
+//
+static bool TypeContains(const Type *Ty, const Type *E) {
+  return std::find(Ty->subtype_begin(), Ty->subtype_end(),
+                   E) != Ty->subtype_end();
 }
 
-std::string Type::makeUniqueName(const std::string& BaseName) const {
-  if (BaseName == "\"alloca point\"")
-    return BaseName;
-  switch (oldTy) {
-    default:
-      break;
-    case OpaqueTy: case LabelTy: case VoidTy: case BoolTy: case UpRefTy:
-    case FloatTy : case DoubleTy: case UnresolvedTy:
-      return BaseName;
-    case SByteTy: case ShortTy: case LongTy: case IntTy: 
-      return AddSuffix(BaseName, ".s");
-    case UByteTy: case UShortTy: case UIntTy: case ULongTy: 
-      return AddSuffix(BaseName, ".u");
-  }
+namespace {
+  struct UpRefRecord {
+    // NestingLevel - The number of nesting levels that need to be popped before
+    // this type is resolved.
+    unsigned NestingLevel;
+
+    // LastContainedTy - This is the type at the current binding level for the
+    // type.  Every time we reduce the nesting level, this gets updated.
+    const Type *LastContainedTy;
+
+    // UpRefTy - This is the actual opaque type that the upreference is
+    // represented with.
+    OpaqueType *UpRefTy;
 
-  unsigned uNum = 0, sNum = 0;
-  std::string Suffix;
-  switch (oldTy) {
-    case PointerTy:
-    case PackedTy: 
-    case ArrayTy: {
-      Type::UpRefStack stack;
-      elemTy->resolve()->getSignedness(sNum, uNum, stack);
-      break;
-    }
-    case StructTy:
-    case PackedStructTy: {
-      for (unsigned i = 0; i < elements->size(); i++) {
-        Type::UpRefStack stack;
-        (*elements)[i]->resolve()->getSignedness(sNum, uNum, stack);
+    UpRefRecord(unsigned NL, OpaqueType *URTy)
+      : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {}
+  };
+}
+
+// UpRefs - A list of the outstanding upreferences that need to be resolved.
+static std::vector<UpRefRecord> UpRefs;
+
+/// HandleUpRefs - Every time we finish a new layer of types, this function is
+/// called.  It loops through the UpRefs vector, which is a list of the
+/// currently active types.  For each type, if the up reference is contained in
+/// the newly completed type, we decrement the level count.  When the level
+/// count reaches zero, the upreferenced type is the type that is passed in:
+/// thus we can complete the cycle.
+///
+static PATypeHolder HandleUpRefs(const Type *ty) {
+  // If Ty isn't abstract, or if there are no up-references in it, then there is
+  // nothing to resolve here.
+  if (!ty->isAbstract() || UpRefs.empty()) return ty;
+  
+  PATypeHolder Ty(ty);
+  UR_OUT("Type '" << Ty->getDescription() <<
+         "' newly formed.  Resolving upreferences.\n" <<
+         UpRefs.size() << " upreferences active!\n");
+
+  // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
+  // to zero), we resolve them all together before we resolve them to Ty.  At
+  // the end of the loop, if there is anything to resolve to Ty, it will be in
+  // this variable.
+  OpaqueType *TypeToResolve = 0;
+
+  for (unsigned i = 0; i != UpRefs.size(); ++i) {
+    UR_OUT("  UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
+           << UpRefs[i].second->getDescription() << ") = "
+           << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n");
+    if (TypeContains(Ty, UpRefs[i].LastContainedTy)) {
+      // Decrement level of upreference
+      unsigned Level = --UpRefs[i].NestingLevel;
+      UpRefs[i].LastContainedTy = Ty;
+      UR_OUT("  Uplevel Ref Level = " << Level << "\n");
+      if (Level == 0) {                     // Upreference should be resolved!
+        if (!TypeToResolve) {
+          TypeToResolve = UpRefs[i].UpRefTy;
+        } else {
+          UR_OUT("  * Resolving upreference for "
+                 << UpRefs[i].second->getDescription() << "\n";
+                 std::string OldName = UpRefs[i].UpRefTy->getDescription());
+          UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
+          UR_OUT("  * Type '" << OldName << "' refined upreference to: "
+                 << (const void*)Ty << ", " << Ty->getDescription() << "\n");
+        }
+        UpRefs.erase(UpRefs.begin()+i);     // Remove from upreference list...
+        --i;                                // Do not skip the next element...
       }
-      break;
     }
-    default:
-      assert(0 && "Invalid Type");
-      break;
   }
 
-  if (sNum == 0 && uNum == 0)
-    return BaseName;
-
-  switch (oldTy) {
-    default:             Suffix += ".nada"; break;
-    case PointerTy:      Suffix += ".pntr"; break;
-    case PackedTy:       Suffix += ".pckd"; break;
-    case ArrayTy:        Suffix += ".arry"; break;
-    case StructTy:       Suffix += ".strc"; break;
-    case PackedStructTy: Suffix += ".pstr"; break;
+  if (TypeToResolve) {
+    UR_OUT("  * Resolving upreference for "
+           << UpRefs[i].second->getDescription() << "\n";
+           std::string OldName = TypeToResolve->getDescription());
+    TypeToResolve->refineAbstractTypeTo(Ty);
   }
 
-  Suffix += ".s" + llvm::utostr(sNum);
-  Suffix += ".u" + llvm::utostr(uNum);
-  return AddSuffix(BaseName, Suffix);
+  return Ty;
 }
 
-Type& Type::operator=(const Type& that) {
-  oldTy = that.oldTy;
-  nelems = that.nelems;
-  newTy = that.newTy;
-  elemTy = that.elemTy;
-  resultTy = that.resultTy;
-  if (that.elements) {
-    elements = new TypeList(that.elements->size());
-    *elements = *that.elements;
-  } else {
-    elements = 0;
+static inline Instruction::TermOps 
+getTermOp(TermOps op) {
+  switch (op) {
+    default           : assert(0 && "Invalid OldTermOp");
+    case RetOp        : return Instruction::Ret;
+    case BrOp         : return Instruction::Br;
+    case SwitchOp     : return Instruction::Switch;
+    case InvokeOp     : return Instruction::Invoke;
+    case UnwindOp     : return Instruction::Unwind;
+    case UnreachableOp: return Instruction::Unreachable;
   }
-  return *this;
 }
 
-const Type* Type::add_new_type(Type* newTy) {
-  TypeRegMap::iterator I = registry.find(newTy);
-  if (I != registry.end()) {
-    delete newTy;
-    return *I;
+static inline Instruction::BinaryOps 
+getBinaryOp(BinaryOps op, const Type *Ty, Signedness Sign) {
+  switch (op) {
+    default     : assert(0 && "Invalid OldBinaryOps");
+    case SetEQ  : 
+    case SetNE  : 
+    case SetLE  :
+    case SetGE  :
+    case SetLT  :
+    case SetGT  : assert(0 && "Should use getCompareOp");
+    case AddOp  : return Instruction::Add;
+    case SubOp  : return Instruction::Sub;
+    case MulOp  : return Instruction::Mul;
+    case DivOp  : {
+      // This is an obsolete instruction so we must upgrade it based on the
+      // types of its operands.
+      bool isFP = Ty->isFloatingPoint();
+      if (const PackedType* PTy = dyn_cast<PackedType>(Ty))
+        // If its a packed type we want to use the element type
+        isFP = PTy->getElementType()->isFloatingPoint();
+      if (isFP)
+        return Instruction::FDiv;
+      else if (Sign == Signed)
+        return Instruction::SDiv;
+      return Instruction::UDiv;
+    }
+    case UDivOp : return Instruction::UDiv;
+    case SDivOp : return Instruction::SDiv;
+    case FDivOp : return Instruction::FDiv;
+    case RemOp  : {
+      // This is an obsolete instruction so we must upgrade it based on the
+      // types of its operands.
+      bool isFP = Ty->isFloatingPoint();
+      if (const PackedType* PTy = dyn_cast<PackedType>(Ty))
+        // If its a packed type we want to use the element type
+        isFP = PTy->getElementType()->isFloatingPoint();
+      // Select correct opcode
+      if (isFP)
+        return Instruction::FRem;
+      else if (Sign == Signed)
+        return Instruction::SRem;
+      return Instruction::URem;
+    }
+    case URemOp : return Instruction::URem;
+    case SRemOp : return Instruction::SRem;
+    case FRemOp : return Instruction::FRem;
+    case AndOp  : return Instruction::And;
+    case OrOp   : return Instruction::Or;
+    case XorOp  : return Instruction::Xor;
   }
-  registry.insert(newTy);
-  return newTy;
 }
 
-class Instruction {
-};
-
-/// This type is used to keep track of the signedness of constants.
-struct Constant {
-  std::string *cnst;
-  const Type *type;
-  ~Constant() { delete cnst; }
-};
-
-/// This variable provides a counter for unique names. It is used in various
-/// productions to ensure a unique name is generated.
-static uint64_t UniqueNameCounter = 1;
-
-// This is set when a DECLARE keyword is recognized so that subsequent parsing
-// of a function prototype can know if its a declaration or definition.
-static bool isDeclare = false;
-
-// This bool is used to communicate between the InstVal and Inst rules about
-// whether or not a cast should be deleted. When the flag is set, InstVal has
-// determined that the cast is a candidate. However, it can only be deleted if
-// the value being casted is the same value name as the instruction. The Inst
-// rule makes that comparison if the flag is set and comments out the
-// instruction if they match.
-static bool deleteUselessCastFlag = false;
-static std::string* deleteUselessCastName = 0;
-
-
-
-const char* getCastOpcode(std::string& Source, const Type* SrcTy, 
-                          const Type* DstTy) {
-  unsigned SrcBits = SrcTy->getBitWidth();
-  unsigned DstBits = DstTy->getBitWidth();
-  const char* opcode = "bitcast";
-  // Run through the possibilities ...
-  if (DstTy->isIntegral()) {                        // Casting to integral
-    if (SrcTy->isIntegral()) {                      // Casting from integral
-      if (DstBits < SrcBits)
-        opcode = "trunc";
-      else if (DstBits > SrcBits) {                // its an extension
-        if (SrcTy->isSigned())
-          opcode ="sext";                          // signed -> SEXT
+static inline Instruction::OtherOps 
+getCompareOp(BinaryOps op, unsigned short &predicate, const Type* &Ty,
+             Signedness Sign) {
+  bool isSigned = Sign == Signed;
+  bool isFP = Ty->isFloatingPoint();
+  switch (op) {
+    default     : assert(0 && "Invalid OldSetCC");
+    case SetEQ  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OEQ;
+        return Instruction::FCmp;
+      } else {
+        predicate = ICmpInst::ICMP_EQ;
+        return Instruction::ICmp;
+      }
+    case SetNE  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_UNE;
+        return Instruction::FCmp;
+      } else {
+        predicate = ICmpInst::ICMP_NE;
+        return Instruction::ICmp;
+      }
+    case SetLE  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OLE;
+        return Instruction::FCmp;
+      } else {
+        if (isSigned)
+          predicate = ICmpInst::ICMP_SLE;
         else
-          opcode = "zext";                         // unsigned -> ZEXT
+          predicate = ICmpInst::ICMP_ULE;
+        return Instruction::ICmp;
+      }
+    case SetGE  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OGE;
+        return Instruction::FCmp;
       } else {
-        opcode = "bitcast";                        // Same size, No-op cast
+        if (isSigned)
+          predicate = ICmpInst::ICMP_SGE;
+        else
+          predicate = ICmpInst::ICMP_UGE;
+        return Instruction::ICmp;
       }
-    } else if (SrcTy->isFloatingPoint()) {          // Casting from floating pt
-      if (DstTy->isSigned()) 
-        opcode = "fptosi";                         // FP -> sint
-      else
-        opcode = "fptoui";                         // FP -> uint 
-    } else if (SrcTy->isPacked()) {
-      assert(DstBits == SrcTy->getBitWidth() &&
-               "Casting packed to integer of different width");
-        opcode = "bitcast";                        // same size, no-op cast
-    } else {
-      assert(SrcTy->isPointer() &&
-             "Casting from a value that is not first-class type");
-      opcode = "ptrtoint";                         // ptr -> int
-    }
-  } else if (DstTy->isFloatingPoint()) {           // Casting to floating pt
-    if (SrcTy->isIntegral()) {                     // Casting from integral
-      if (SrcTy->isSigned())
-        opcode = "sitofp";                         // sint -> FP
-      else
-        opcode = "uitofp";                         // uint -> FP
-    } else if (SrcTy->isFloatingPoint()) {         // Casting from floating pt
-      if (DstBits < SrcBits) {
-        opcode = "fptrunc";                        // FP -> smaller FP
-      } else if (DstBits > SrcBits) {
-        opcode = "fpext";                          // FP -> larger FP
-      } else  {
-        opcode ="bitcast";                         // same size, no-op cast
+    case SetLT  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OLT;
+        return Instruction::FCmp;
+      } else {
+        if (isSigned)
+          predicate = ICmpInst::ICMP_SLT;
+        else
+          predicate = ICmpInst::ICMP_ULT;
+        return Instruction::ICmp;
+      }
+    case SetGT  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OGT;
+        return Instruction::FCmp;
+      } else {
+        if (isSigned)
+          predicate = ICmpInst::ICMP_SGT;
+        else
+          predicate = ICmpInst::ICMP_UGT;
+        return Instruction::ICmp;
       }
-    } else if (SrcTy->isPacked()) {
-      assert(DstBits == SrcTy->getBitWidth() &&
-             "Casting packed to floating point of different width");
-        opcode = "bitcast";                        // same size, no-op cast
-    } else {
-      assert(0 && "Casting pointer or non-first class to float");
-    }
-  } else if (DstTy->isPacked()) {
-    if (SrcTy->isPacked()) {
-      assert(DstTy->getBitWidth() == SrcTy->getBitWidth() &&
-             "Casting packed to packed of different widths");
-      opcode = "bitcast";                          // packed -> packed
-    } else if (DstTy->getBitWidth() == SrcBits) {
-      opcode = "bitcast";                          // float/int -> packed
-    } else {
-      assert(!"Illegal cast to packed (wrong type or size)");
-    }
-  } else if (DstTy->isPointer()) {
-    if (SrcTy->isPointer()) {
-      opcode = "bitcast";                          // ptr -> ptr
-    } else if (SrcTy->isIntegral()) {
-      opcode = "inttoptr";                         // int -> ptr
-    } else {
-      assert(!"Casting invalid type to pointer");
-    }
-  } else {
-    assert(!"Casting to type that is not first-class");
   }
-  return opcode;
 }
 
-std::string getCastUpgrade(const std::string& Src, const Type* SrcTy,
-                           const Type* DstTy, bool isConst) {
-  std::string Result;
-  std::string Source = Src;
-  if (SrcTy->isFloatingPoint() && DstTy->isPointer()) {
-    // fp -> ptr cast is no longer supported but we must upgrade this
-    // by doing a double cast: fp -> int -> ptr
-    if (isConst)
-      Source = "i64 fptoui(" + Source + " to i64)";
-    else {
-      *O << "    %cast_upgrade" << UniqueNameCounter << " = fptoui " 
-         << Source << " to i64\n";
-      Source = "i64 %cast_upgrade" + llvm::utostr(UniqueNameCounter++);
-    }
-    // Update the SrcTy for the getCastOpcode call below
-    SrcTy = Type::get("i64", ULongTy);
-  } else if (DstTy->isBool()) {
-    // cast type %x to bool was previously defined as setne type %x, null
-    // The cast semantic is now to truncate, not compare so we must retain
-    // the original intent by replacing the cast with a setne
-    const char* comparator = SrcTy->isPointer() ? ", null" : 
-      (SrcTy->isFloatingPoint() ? ", 0.0" : 
-       (SrcTy->isBool() ? ", false" : ", 0"));
-    const char* compareOp = SrcTy->isFloatingPoint() ? "fcmp one " : "icmp ne ";
-    if (isConst) { 
-      Result = "(" + Source + comparator + ")";
-      Result = compareOp + Result;
-    } else
-      Result = compareOp + Source + comparator;
-    return Result; // skip cast processing below
+static inline Instruction::MemoryOps getMemoryOp(MemoryOps op) {
+  switch (op) {
+    default              : assert(0 && "Invalid OldMemoryOps");
+    case MallocOp        : return Instruction::Malloc;
+    case FreeOp          : return Instruction::Free;
+    case AllocaOp        : return Instruction::Alloca;
+    case LoadOp          : return Instruction::Load;
+    case StoreOp         : return Instruction::Store;
+    case GetElementPtrOp : return Instruction::GetElementPtr;
   }
-  SrcTy = SrcTy->resolve();
-  DstTy = DstTy->resolve();
-  std::string Opcode(getCastOpcode(Source, SrcTy, DstTy));
-  if (isConst)
-    Result += Opcode + "( " + Source + " to " + DstTy->getNewTy() + ")";
-  else
-    Result += Opcode + " " + Source + " to " + DstTy->getNewTy();
-  return Result;
 }
 
-const char* getDivRemOpcode(const std::string& opcode, const Type* TI) {
-  const char* op = opcode.c_str();
-  const Type* Ty = TI->resolve();
-  if (Ty->isPacked())
-    Ty = Ty->getElementType();
-  if (opcode == "div")
-    if (Ty->isFloatingPoint())
-      op = "fdiv";
-    else if (Ty->isUnsigned())
-      op = "udiv";
-    else if (Ty->isSigned())
-      op = "sdiv";
-    else
-      yyerror("Invalid type for div instruction");
-  else if (opcode == "rem")
-    if (Ty->isFloatingPoint())
-      op = "frem";
-    else if (Ty->isUnsigned())
-      op = "urem";
-    else if (Ty->isSigned())
-      op = "srem";
-    else
-      yyerror("Invalid type for rem instruction");
-  return op;
+static inline Instruction::OtherOps 
+getOtherOp(OtherOps op, Signedness Sign) {
+  switch (op) {
+    default               : assert(0 && "Invalid OldOtherOps");
+    case PHIOp            : return Instruction::PHI;
+    case CallOp           : return Instruction::Call;
+    case ShlOp            : return Instruction::Shl;
+    case ShrOp            : 
+      if (Sign == Signed)
+        return Instruction::AShr;
+      return Instruction::LShr;
+    case SelectOp         : return Instruction::Select;
+    case UserOp1          : return Instruction::UserOp1;
+    case UserOp2          : return Instruction::UserOp2;
+    case VAArg            : return Instruction::VAArg;
+    case ExtractElementOp : return Instruction::ExtractElement;
+    case InsertElementOp  : return Instruction::InsertElement;
+    case ShuffleVectorOp  : return Instruction::ShuffleVector;
+    case ICmpOp           : return Instruction::ICmp;
+    case FCmpOp           : return Instruction::FCmp;
+    case LShrOp           : return Instruction::LShr;
+    case AShrOp           : return Instruction::AShr;
+  };
 }
 
-std::string getCompareOp(const std::string& setcc, const Type* TI) {
-  assert(setcc.length() == 5);
-  char cc1 = setcc[3];
-  char cc2 = setcc[4];
-  assert(cc1 == 'e' || cc1 == 'n' || cc1 == 'l' || cc1 == 'g');
-  assert(cc2 == 'q' || cc2 == 'e' || cc2 == 'e' || cc2 == 't');
-  std::string result("xcmp xxx");
-  result[6] = cc1;
-  result[7] = cc2;
-  if (TI->isFloatingPoint()) {
-    result[0] = 'f';
-    result[5] = 'o';
-    if (cc1 == 'n')
-      result[5] = 'u'; // NE maps to unordered
-    else
-      result[5] = 'o'; // everything else maps to ordered
-  } else if (TI->isIntegral() || TI->isPointer()) {
-    result[0] = 'i';
-    if ((cc1 == 'e' && cc2 == 'q') || (cc1 == 'n' && cc2 == 'e'))
-      result.erase(5,1);
-    else if (TI->isSigned())
-      result[5] = 's';
-    else if (TI->isUnsigned() || TI->isPointer() || TI->isBool())
-      result[5] = 'u';
-    else
-      yyerror("Invalid integral type for setcc");
-  }
-  return result;
+static inline Value*
+getCast(CastOps op, Value *Src, Signedness SrcSign, const Type *DstTy, 
+        Signedness DstSign, bool ForceInstruction = false) {
+  Instruction::CastOps Opcode;
+  const Type* SrcTy = Src->getType();
+  if (op == CastOp) {
+    if (SrcTy->isFloatingPoint() && isa<PointerType>(DstTy)) {
+      // fp -> ptr cast is no longer supported but we must upgrade this
+      // by doing a double cast: fp -> int -> ptr
+      SrcTy = Type::Int64Ty;
+      Opcode = Instruction::IntToPtr;
+      if (isa<Constant>(Src)) {
+        Src = ConstantExpr::getCast(Instruction::FPToUI, 
+                                     cast<Constant>(Src), SrcTy);
+      } else {
+        std::string NewName(makeNameUnique(Src->getName()));
+        Src = new FPToUIInst(Src, SrcTy, NewName, CurBB);
+      }
+    } else if (isa<IntegerType>(DstTy) &&
+               cast<IntegerType>(DstTy)->getBitWidth() == 1) {
+      // cast type %x to bool was previously defined as setne type %x, null
+      // The cast semantic is now to truncate, not compare so we must retain
+      // the original intent by replacing the cast with a setne
+      Constant* Null = Constant::getNullValue(SrcTy);
+      Instruction::OtherOps Opcode = Instruction::ICmp;
+      unsigned short predicate = ICmpInst::ICMP_NE;
+      if (SrcTy->isFloatingPoint()) {
+        Opcode = Instruction::FCmp;
+        predicate = FCmpInst::FCMP_ONE;
+      } else if (!SrcTy->isInteger() && !isa<PointerType>(SrcTy)) {
+        error("Invalid cast to bool");
+      }
+      if (isa<Constant>(Src) && !ForceInstruction)
+        return ConstantExpr::getCompare(predicate, cast<Constant>(Src), Null);
+      else
+        return CmpInst::create(Opcode, predicate, Src, Null);
+    }
+    // Determine the opcode to use by calling CastInst::getCastOpcode
+    Opcode = 
+      CastInst::getCastOpcode(Src, SrcSign == Signed, DstTy, DstSign == Signed);
+
+  } else switch (op) {
+    default: assert(0 && "Invalid cast token");
+    case TruncOp:    Opcode = Instruction::Trunc; break;
+    case ZExtOp:     Opcode = Instruction::ZExt; break;
+    case SExtOp:     Opcode = Instruction::SExt; break;
+    case FPTruncOp:  Opcode = Instruction::FPTrunc; break;
+    case FPExtOp:    Opcode = Instruction::FPExt; break;
+    case FPToUIOp:   Opcode = Instruction::FPToUI; break;
+    case FPToSIOp:   Opcode = Instruction::FPToSI; break;
+    case UIToFPOp:   Opcode = Instruction::UIToFP; break;
+    case SIToFPOp:   Opcode = Instruction::SIToFP; break;
+    case PtrToIntOp: Opcode = Instruction::PtrToInt; break;
+    case IntToPtrOp: Opcode = Instruction::IntToPtr; break;
+    case BitCastOp:  Opcode = Instruction::BitCast; break;
+  }
+
+  if (isa<Constant>(Src) && !ForceInstruction)
+    return ConstantExpr::getCast(Opcode, cast<Constant>(Src), DstTy);
+  return CastInst::create(Opcode, Src, DstTy);
 }
 
-const Type* getFunctionReturnType(const Type* PFTy) {
-  PFTy = PFTy->resolve();
-  if (PFTy->isPointer()) {
-    const Type* ElemTy = PFTy->getElementType();
-    ElemTy = ElemTy->resolve();
-    if (ElemTy->isFunction())
-      return ElemTy->getResultType();
-  } else if (PFTy->isFunction()) {
-    return PFTy->getResultType();
+static Instruction *
+upgradeIntrinsicCall(const Type* RetTy, const ValID &ID, 
+                     std::vector<Value*>& Args) {
+
+  std::string Name = ID.Type == ValID::NameVal ? ID.Name : "";
+  if (Name == "llvm.isunordered.f32" || Name == "llvm.isunordered.f64") {
+    if (Args.size() != 2)
+      error("Invalid prototype for " + Name + " prototype");
+    return new FCmpInst(FCmpInst::FCMP_UNO, Args[0], Args[1]);
+  } else {
+    static unsigned upgradeCount = 1;
+    const Type* PtrTy = PointerType::get(Type::Int8Ty);
+    std::vector<const Type*> Params;
+    if (Name == "llvm.va_start" || Name == "llvm.va_end") {
+      if (Args.size() != 1)
+        error("Invalid prototype for " + Name + " prototype");
+      Params.push_back(PtrTy);
+      const FunctionType *FTy = FunctionType::get(Type::VoidTy, Params, false);
+      const PointerType *PFTy = PointerType::get(FTy);
+      Value* Func = getVal(PFTy, ID);
+      std::string InstName("va_upgrade");
+      InstName += llvm::utostr(upgradeCount++);
+      Args[0] = new BitCastInst(Args[0], PtrTy, InstName, CurBB);
+      return new CallInst(Func, Args);
+    } else if (Name == "llvm.va_copy") {
+      if (Args.size() != 2)
+        error("Invalid prototype for " + Name + " prototype");
+      Params.push_back(PtrTy);
+      Params.push_back(PtrTy);
+      const FunctionType *FTy = FunctionType::get(Type::VoidTy, Params, false);
+      const PointerType *PFTy = PointerType::get(FTy);
+      Value* Func = getVal(PFTy, ID);
+      std::string InstName0("va_upgrade");
+      InstName0 += llvm::utostr(upgradeCount++);
+      std::string InstName1("va_upgrade");
+      InstName1 += llvm::utostr(upgradeCount++);
+      Args[0] = new BitCastInst(Args[0], PtrTy, InstName0, CurBB);
+      Args[1] = new BitCastInst(Args[1], PtrTy, InstName1, CurBB);
+      return new CallInst(Func, Args);
+    }
   }
-  return PFTy;
+  return 0;
 }
 
-const Type* ResolveUpReference(const Type* Ty, 
-                                   Type::UpRefStack* stack) {
-  assert(Ty->isUpReference() && "Can't resolve a non-upreference");
-  unsigned upref = Ty->getUpRefNum();
-  assert(upref < stack->size() && "Invalid up reference");
-  return (*stack)[upref - stack->size() - 1];
+const Type* upgradeGEPIndices(const Type* PTy, 
+                       std::vector<ValueInfo> *Indices, 
+                       std::vector<Value*>    &VIndices, 
+                       std::vector<Constant*> *CIndices = 0) {
+  // Traverse the indices with a gep_type_iterator so we can build the list
+  // of constant and value indices for use later. Also perform upgrades
+  VIndices.clear();
+  if (CIndices) CIndices->clear();
+  for (unsigned i = 0, e = Indices->size(); i != e; ++i)
+    VIndices.push_back((*Indices)[i].V);
+  generic_gep_type_iterator<std::vector<Value*>::iterator>
+    GTI = gep_type_begin(PTy, VIndices.begin(),  VIndices.end()),
+    GTE = gep_type_end(PTy,  VIndices.begin(),  VIndices.end());
+  for (unsigned i = 0, e = Indices->size(); i != e && GTI != GTE; ++i, ++GTI) {
+    Value *Index = VIndices[i];
+    if (CIndices && !isa<Constant>(Index))
+      error("Indices to constant getelementptr must be constants");
+    // LLVM 1.2 and earlier used ubyte struct indices.  Convert any ubyte 
+    // struct indices to i32 struct indices with ZExt for compatibility.
+    else if (isa<StructType>(*GTI)) {        // Only change struct indices
+      if (ConstantInt *CUI = dyn_cast<ConstantInt>(Index))
+        if (CUI->getType()->getBitWidth() == 8)
+          Index = 
+            ConstantExpr::getCast(Instruction::ZExt, CUI, Type::Int32Ty);
+    } else {
+      // Make sure that unsigned SequentialType indices are zext'd to 
+      // 64-bits if they were smaller than that because LLVM 2.0 will sext 
+      // all indices for SequentialType elements. We must retain the same 
+      // semantic (zext) for unsigned types.
+      if (const IntegerType *Ity = dyn_cast<IntegerType>(Index->getType()))
+        if (Ity->getBitWidth() < 64 && (*Indices)[i].S == Unsigned)
+          if (CIndices)
+            Index = ConstantExpr::getCast(Instruction::ZExt, 
+              cast<Constant>(Index), Type::Int64Ty);
+          else
+            Index = CastInst::create(Instruction::ZExt, Index, Type::Int64Ty,
+              "gep_upgrade", CurBB);
+    }
+    // Add to the CIndices list, if requested.
+    if (CIndices)
+      CIndices->push_back(cast<Constant>(Index));
+  }
+
+  const Type *IdxTy =
+    GetElementPtrInst::getIndexedType(PTy, VIndices, true);
+    if (!IdxTy)
+      error("Index list invalid for constant getelementptr");
+  return IdxTy;
 }
 
-const Type* getGEPIndexedType(const Type* PTy, ValueList* idxs) {
-  const Type* Result = PTy = PTy->resolve();
-  assert(PTy->isPointer() && "GEP Operand is not a pointer?");
-  Type::UpRefStack stack;
-  for (unsigned i = 0; i < idxs->size(); ++i) {
-    if (Result->isComposite()) {
-      Result = Result->getIndexedType((*idxs)[i]);
-      Result = Result->resolve();
-      stack.push_back(Result);
-    } else
-      yyerror("Invalid type for index");
-  }
-  // Resolve upreferences so we can return a more natural type
-  if (Result->isPointer()) {
-    if (Result->getElementType()->isUpReference()) {
-      stack.push_back(Result);
-      Result = ResolveUpReference(Result->getElementType(), &stack);
-    }
-  } else if (Result->isUpReference()) {
-    Result = ResolveUpReference(Result->getElementType(), &stack);
+Module* UpgradeAssembly(const std::string &infile, std::istream& in, 
+                              bool debug, bool addAttrs)
+{
+  Upgradelineno = 1; 
+  CurFilename = infile;
+  LexInput = ∈
+  yydebug = debug;
+  AddAttributes = addAttrs;
+  ObsoleteVarArgs = false;
+  NewVarArgs = false;
+
+  CurModule.CurrentModule = new Module(CurFilename);
+
+  // Check to make sure the parser succeeded
+  if (yyparse()) {
+    if (ParserResult)
+      delete ParserResult;
+    std::cerr << "llvm-upgrade: parse failed.\n";
+    return 0;
   }
-  return Result->getPointerType();
-}
 
-// This function handles appending .u or .s to integer value names that
-// were previously unsigned or signed, respectively. This avoids name
-// collisions since the unsigned and signed type planes have collapsed
-// into a single signless type plane.
-std::string getUniqueName(const std::string *Name, const Type* Ty,
-                          bool isGlobal = false, bool isDef = false) {
-
-  // If its not a symbolic name, don't modify it, probably a constant val.
-  if ((*Name)[0] != '%' && (*Name)[0] != '"')
-    return *Name;
-
-  // If its a numeric reference, just leave it alone.
-  if (isdigit((*Name)[1]))
-    return *Name;
-
-  // Resolve the type
-  Ty = Ty->resolve(); 
-
-  // If its a global name, get its uniquified name, if any
-  Type::GlobalsTypeMap::iterator GI = Type::Globals.find(*Name);
-  if (GI != Type::Globals.end()) {
-    Type::TypePlaneMap::iterator TPI = GI->second.begin();
-    Type::TypePlaneMap::iterator TPE = GI->second.end();
-    for ( ; TPI != TPE ; ++TPI) {
-      if (TPI->first->sameNewTyAs(Ty)) 
-        return TPI->second;
-    }
+  // Check to make sure that parsing produced a result
+  if (!ParserResult) {
+    std::cerr << "llvm-upgrade: no parse result.\n";
+    return 0;
   }
 
-  if (isGlobal) {
-    // We didn't find a global name, but if its supposed to be global then all 
-    // we can do is return the name. This is probably a forward reference of a 
-    // global value that hasn't been defined yet. Since we have no definition
-    // we don't know its linkage class. Just assume its an external and the name
-    // shouldn't change.
-    return *Name;
+  // Reset ParserResult variable while saving its value for the result.
+  Module *Result = ParserResult;
+  ParserResult = 0;
+
+  //Not all functions use vaarg, so make a second check for ObsoleteVarArgs
+  {
+    Function* F;
+    if ((F = Result->getNamedFunction("llvm.va_start"))
+        && F->getFunctionType()->getNumParams() == 0)
+      ObsoleteVarArgs = true;
+    if((F = Result->getNamedFunction("llvm.va_copy"))
+       && F->getFunctionType()->getNumParams() == 1)
+      ObsoleteVarArgs = true;
   }
 
-  // Default the result to the current name
-  std::string Result = Ty->makeUniqueName(*Name);
+  if (ObsoleteVarArgs && NewVarArgs) {
+    error("This file is corrupt: it uses both new and old style varargs");
+    return 0;
+  }
 
-  return Result;
-}
+  if(ObsoleteVarArgs) {
+    if(Function* F = Result->getNamedFunction("llvm.va_start")) {
+      if (F->arg_size() != 0) {
+        error("Obsolete va_start takes 0 argument");
+        return 0;
+      }
+      
+      //foo = va_start()
+      // ->
+      //bar = alloca typeof(foo)
+      //va_start(bar)
+      //foo = load bar
+
+      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+      const Type* ArgTy = F->getFunctionType()->getReturnType();
+      const Type* ArgTyPtr = PointerType::get(ArgTy);
+      Function* NF = cast<Function>(Result->getOrInsertFunction(
+        "llvm.va_start", RetTy, ArgTyPtr, (Type *)0));
+
+      while (!F->use_empty()) {
+        CallInst* CI = cast<CallInst>(F->use_back());
+        AllocaInst* bar = new AllocaInst(ArgTy, 0, "vastart.fix.1", CI);
+        new CallInst(NF, bar, "", CI);
+        Value* foo = new LoadInst(bar, "vastart.fix.2", CI);
+        CI->replaceAllUsesWith(foo);
+        CI->getParent()->getInstList().erase(CI);
+      }
+      Result->getFunctionList().erase(F);
+    }
+    
+    if(Function* F = Result->getNamedFunction("llvm.va_end")) {
+      if(F->arg_size() != 1) {
+        error("Obsolete va_end takes 1 argument");
+        return 0;
+      }
 
-std::string getGlobalName(const std::string* Name, const std::string Linkage,
-                          const Type* Ty, bool isConstant) {
-  // Default to given name
-  std::string Result = *Name; 
-  // Look up the name in the Globals Map
-  Type::GlobalsTypeMap::iterator GI = Type::Globals.find(*Name);
-  // Did we see this global name before?
-  if (GI != Type::Globals.end()) {
-    if (Ty->isUnresolvedDeep()) {
-      // The Gval's type is unresolved. Consequently, we can't disambiguate it
-      // by type. We'll just change its name and emit a warning.
-      warning("Cannot disambiguate global value '" + *Name + 
-              "' because type '" + Ty->getNewTy() + "'is unresolved.\n");
-      Result = *Name + ".unique";
-      UniqueNameCounter++;
-      Result += llvm::utostr(UniqueNameCounter);
-      return Result;
-    } else {
-      Type::TypePlaneMap::iterator TPI = GI->second.find(Ty);
-      if (TPI != GI->second.end()) {
-        // We found an existing name of the same old type. This isn't allowed 
-        // in LLVM 2.0. Consequently, we must alter the name of the global so it
-        // can at least compile. References to the global will yield the first
-        // definition, which is okay. We also must warn about this.
-        Result = *Name + ".unique";
-        UniqueNameCounter++;
-        Result += llvm::utostr(UniqueNameCounter);
-        warning(std::string("Global variable '") + *Name + "' was renamed to '"+
-                Result + "'");
-      } else { 
-        // There isn't an existing definition for this name according to the
-        // old types. Now search the TypePlanMap for types with the same new
-        // name. 
-        Type::TypePlaneMap::iterator TPI = GI->second.begin();
-        Type::TypePlaneMap::iterator TPE = GI->second.end();
-        for ( ; TPI != TPE; ++TPI) {
-          if (TPI->first->sameNewTyAs(Ty)) {
-            // The new types are the same but the old types are different so 
-            // this is a global name collision resulting from type planes 
-            // collapsing. 
-            if (Linkage == "external" || Linkage == "dllimport" || 
-                Linkage == "extern_weak" || Linkage == "") {
-              // The linkage of this gval is external so we can't reliably 
-              // rename it because it could potentially create a linking 
-              // problem.  However, we can't leave the name conflict in the 
-              // output either or it won't assemble with LLVM 2.0.  So, all we 
-              // can do is rename this one to something unique and emit a 
-              // warning about the problem.
-              Result = *Name + ".unique";
-              UniqueNameCounter++;
-              Result += llvm::utostr(UniqueNameCounter);
-              warning("Renaming global value '" + *Name + "' to '" + Result + 
-                      "' may cause linkage errors.");
-              return Result;
-            } else {
-              // Its linkage is internal and its type is known so we can 
-              // disambiguate the name collision successfully based on the type.
-              Result = getUniqueName(Name, Ty);
-              TPI->second = Result;
-              return Result;
-            }
-          }
-        }
-        // We didn't find an entry in the type plane with the same new type and
-        // the old types differ so this is a new type plane for this global 
-        // variable. We just fall through to the logic below which inserts
-        // the global.
+      //vaend foo
+      // ->
+      //bar = alloca 1 of typeof(foo)
+      //vaend bar
+      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+      const Type* ArgTy = F->getFunctionType()->getParamType(0);
+      const Type* ArgTyPtr = PointerType::get(ArgTy);
+      Function* NF = cast<Function>(Result->getOrInsertFunction(
+        "llvm.va_end", RetTy, ArgTyPtr, (Type *)0));
+
+      while (!F->use_empty()) {
+        CallInst* CI = cast<CallInst>(F->use_back());
+        AllocaInst* bar = new AllocaInst(ArgTy, 0, "vaend.fix.1", CI);
+        new StoreInst(CI->getOperand(1), bar, CI);
+        new CallInst(NF, bar, "", CI);
+        CI->getParent()->getInstList().erase(CI);
       }
+      Result->getFunctionList().erase(F);
     }
-  }
 
-  // Its a new global name, if it is external we can't change it
-  if (isConstant || Linkage == "external" || Linkage == "dllimport" || 
-      Linkage == "extern_weak" || Linkage == "") {
-    Type::Globals[Result][Ty] = Result;
-    return Result;
+    if(Function* F = Result->getNamedFunction("llvm.va_copy")) {
+      if(F->arg_size() != 1) {
+        error("Obsolete va_copy takes 1 argument");
+        return 0;
+      }
+      //foo = vacopy(bar)
+      // ->
+      //a = alloca 1 of typeof(foo)
+      //b = alloca 1 of typeof(foo)
+      //store bar -> b
+      //vacopy(a, b)
+      //foo = load a
+      
+      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+      const Type* ArgTy = F->getFunctionType()->getReturnType();
+      const Type* ArgTyPtr = PointerType::get(ArgTy);
+      Function* NF = cast<Function>(Result->getOrInsertFunction(
+        "llvm.va_copy", RetTy, ArgTyPtr, ArgTyPtr, (Type *)0));
+
+      while (!F->use_empty()) {
+        CallInst* CI = cast<CallInst>(F->use_back());
+        AllocaInst* a = new AllocaInst(ArgTy, 0, "vacopy.fix.1", CI);
+        AllocaInst* b = new AllocaInst(ArgTy, 0, "vacopy.fix.2", CI);
+        new StoreInst(CI->getOperand(1), b, CI);
+        new CallInst(NF, a, b, "", CI);
+        Value* foo = new LoadInst(a, "vacopy.fix.3", CI);
+        CI->replaceAllUsesWith(foo);
+        CI->getParent()->getInstList().erase(CI);
+      }
+      Result->getFunctionList().erase(F);
+    }
   }
 
-  // Its a new global name, and it is internal, change the name to make it
-  // unique for its type.
-  // Result = getUniqueName(Name, Ty);
-  Type::Globals[*Name][Ty] = Result;
   return Result;
 }
 
-} // End anonymous namespace
+} // end llvm namespace
 
-// This function is used by the Lexer to create a Type. It can't be
-// in the anonymous namespace.
-const Type* getType(const std::string& newTy, TypeIDs oldTy) {
-  return Type::get(newTy, oldTy);
-}
+using namespace llvm;
 
 
 
@@ -1329,53 +1839,108 @@
 # define YYERROR_VERBOSE 0
 #endif
 
-#ifndef YYSTYPE
-#line 971 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-typedef union {
-  std::string*    String;
-  const Type*     Ty;
-  Value*          Val;
-  Constant*       Const;
-  ValueList*      ValList;
-  TypeList*       TypeVec;
-} yystype;
-/* Line 188 of /usr/local/share/bison/yacc.c.  */
-#line 1344 "UpgradeParser.tab.c"
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
 #endif
 
-#ifndef YYLTYPE
-typedef struct yyltype
-{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-} yyltype;
-# define YYLTYPE yyltype
-# define YYLTYPE_IS_TRIVIAL 1
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 1469 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+typedef union YYSTYPE {
+  llvm::Module                           *ModuleVal;
+  llvm::Function                         *FunctionVal;
+  std::pair<llvm::PATypeInfo, char*>     *ArgVal;
+  llvm::BasicBlock                       *BasicBlockVal;
+  llvm::TerminatorInst                   *TermInstVal;
+  llvm::InstrInfo                        InstVal;
+  llvm::ConstInfo                        ConstVal;
+  llvm::ValueInfo                        ValueVal;
+  llvm::PATypeInfo                       TypeVal;
+  llvm::TypeInfo                         PrimType;
+  llvm::PHIListInfo                      PHIList;
+  std::list<llvm::PATypeInfo>            *TypeList;
+  std::vector<llvm::ValueInfo>           *ValueList;
+  std::vector<llvm::ConstInfo>           *ConstVector;
+
+
+  std::vector<std::pair<llvm::PATypeInfo,char*> > *ArgList;
+  // Represent the RHS of PHI node
+  std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
+
+  llvm::GlobalValue::LinkageTypes         Linkage;
+  int64_t                           SInt64Val;
+  uint64_t                          UInt64Val;
+  int                               SIntVal;
+  unsigned                          UIntVal;
+  double                            FPVal;
+  bool                              BoolVal;
+
+  char                             *StrVal;   // This memory is strdup'd!
+  llvm::ValID                       ValIDVal; // strdup'd memory maybe!
+
+  llvm::BinaryOps                   BinaryOpVal;
+  llvm::TermOps                     TermOpVal;
+  llvm::MemoryOps                   MemOpVal;
+  llvm::OtherOps                    OtherOpVal;
+  llvm::CastOps                     CastOpVal;
+  llvm::ICmpInst::Predicate         IPred;
+  llvm::FCmpInst::Predicate         FPred;
+  llvm::Module::Endianness          Endianness;
+} YYSTYPE;
+/* Line 196 of yacc.c.  */
+#line 1892 "UpgradeParser.tab.c"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
+
+
 /* Copy the second part of user declarations.  */
 
 
-/* Line 213 of /usr/local/share/bison/yacc.c.  */
-#line 1365 "UpgradeParser.tab.c"
+/* Line 219 of yacc.c.  */
+#line 1904 "UpgradeParser.tab.c"
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
 
 #if ! defined (yyoverflow) || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
-# if YYSTACK_USE_ALLOCA
-#  define YYSTACK_ALLOC alloca
-# else
-#  ifndef YYSTACK_USE_ALLOCA
-#   if defined (alloca) || defined (_ALLOCA_H)
-#    define YYSTACK_ALLOC alloca
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
 #   else
-#    ifdef __GNUC__
-#     define YYSTACK_ALLOC __builtin_alloca
+#    define YYSTACK_ALLOC alloca
+#    if defined (__STDC__) || defined (__cplusplus)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     define YYINCLUDED_STDLIB_H
 #    endif
 #   endif
 #  endif
@@ -1384,50 +1949,76 @@
 # ifdef YYSTACK_ALLOC
    /* Pacify GCC's `empty if-body' warning. */
 #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+#  endif
 # else
-#  if defined (__STDC__) || defined (__cplusplus)
-#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#   define YYSIZE_T size_t
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
+#  endif
+#  ifdef __cplusplus
+extern "C" {
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
+	&& (defined (__STDC__) || defined (__cplusplus)))
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
+	&& (defined (__STDC__) || defined (__cplusplus)))
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifdef __cplusplus
+}
 #  endif
-#  define YYSTACK_ALLOC malloc
-#  define YYSTACK_FREE free
 # endif
 #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
 
 
 #if (! defined (yyoverflow) \
      && (! defined (__cplusplus) \
-	 || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  short yyss;
+  short int yyss;
   YYSTYPE yyvs;
   };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short) + sizeof (YYSTYPE))				\
-      + YYSTACK_GAP_MAX)
+     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
+      + YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
-#  if 1 < __GNUC__
+#  if defined (__GNUC__) && 1 < __GNUC__
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
 #   define YYCOPY(To, From, Count)		\
       do					\
 	{					\
-	  register YYSIZE_T yyi;		\
+	  YYSIZE_T yyi;				\
 	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];	\
+	    (To)[yyi] = (From)[yyi];		\
 	}					\
       while (0)
 #  endif
@@ -1444,7 +2035,7 @@
 	YYSIZE_T yynewbytes;						\
 	YYCOPY (&yyptr->Stack, Stack, yysize);				\
 	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;	\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
     while (0)
@@ -1454,28 +2045,29 @@
 #if defined (__STDC__) || defined (__cplusplus)
    typedef signed char yysigned_char;
 #else
-   typedef short yysigned_char;
+   typedef short int yysigned_char;
 #endif
 
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  4
-#define YYLAST   1473
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   1712
 
 /* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  164
+#define YYNTOKENS  166
 /* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  76
+#define YYNNTS  79
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  301
+#define YYNRULES  308
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  585
+#define YYNSTATES  604
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   404
+#define YYMAXUTOK   406
 
-#define YYTRANSLATE(X) \
-  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+#define YYTRANSLATE(YYX)						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
 static const unsigned char yytranslate[] =
@@ -1484,15 +2076,15 @@
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-     153,   154,   162,     2,   151,     2,     2,     2,     2,     2,
+     155,   156,   164,     2,   153,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-     158,   150,   159,     2,     2,     2,     2,     2,     2,     2,
+     160,   152,   161,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   155,   152,   157,     2,     2,     2,     2,     2,   163,
+       2,   157,   154,   159,     2,     2,     2,     2,     2,   165,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-     156,     2,     2,   160,     2,   161,     2,     2,     2,     2,
+     158,     2,     2,   162,     2,   163,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1520,13 +2112,13 @@
      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
      125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
      135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149
+     145,   146,   147,   148,   149,   150,   151
 };
 
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-static const unsigned short yyprhs[] =
+static const unsigned short int yyprhs[] =
 {
        0,     0,     3,     5,     7,     9,    11,    13,    15,    17,
       19,    21,    23,    25,    27,    29,    31,    33,    35,    37,
@@ -1537,210 +2129,213 @@
      119,   121,   123,   125,   127,   129,   131,   133,   135,   137,
      139,   141,   143,   145,   147,   149,   151,   153,   155,   157,
      159,   161,   164,   165,   167,   169,   171,   173,   175,   177,
-     179,   180,   182,   184,   186,   188,   190,   192,   195,   196,
+     179,   180,   181,   183,   185,   187,   189,   191,   193,   196,
      197,   200,   201,   205,   208,   209,   211,   212,   216,   218,
      221,   223,   225,   227,   229,   231,   233,   235,   237,   239,
      241,   243,   245,   247,   249,   251,   253,   255,   257,   259,
      261,   264,   269,   275,   281,   285,   288,   294,   299,   302,
      304,   308,   310,   314,   316,   317,   322,   326,   330,   335,
-     340,   344,   347,   350,   353,   356,   359,   362,   365,   368,
-     371,   374,   381,   387,   396,   403,   410,   417,   425,   433,
-     440,   447,   456,   465,   469,   471,   473,   475,   477,   480,
-     483,   488,   491,   493,   495,   497,   502,   505,   510,   517,
-     524,   531,   538,   542,   547,   548,   550,   552,   554,   558,
-     562,   566,   570,   574,   578,   580,   581,   583,   585,   587,
-     588,   591,   595,   597,   599,   603,   605,   606,   615,   617,
-     619,   623,   625,   627,   631,   632,   634,   636,   637,   642,
-     643,   645,   647,   649,   651,   653,   655,   657,   659,   661,
-     665,   667,   673,   675,   677,   679,   681,   684,   687,   689,
-     692,   695,   696,   698,   700,   702,   705,   708,   712,   722,
-     732,   741,   756,   758,   760,   767,   773,   776,   783,   791,
-     793,   797,   799,   800,   803,   805,   811,   817,   823,   830,
-     837,   842,   847,   854,   859,   864,   871,   878,   881,   889,
-     891,   894,   895,   897,   898,   902,   909,   913,   920,   923,
-     928,   935
+     340,   344,   351,   357,   360,   363,   366,   369,   372,   375,
+     378,   381,   384,   387,   394,   400,   409,   416,   423,   430,
+     438,   446,   453,   460,   469,   478,   482,   484,   486,   488,
+     490,   493,   496,   501,   504,   506,   511,   514,   519,   520,
+     528,   529,   537,   538,   546,   547,   555,   559,   564,   565,
+     567,   569,   571,   575,   579,   583,   587,   591,   595,   597,
+     598,   600,   602,   604,   605,   608,   612,   614,   616,   620,
+     622,   623,   632,   634,   636,   640,   642,   644,   647,   648,
+     650,   652,   653,   658,   659,   661,   663,   665,   667,   669,
+     671,   673,   675,   677,   681,   683,   689,   691,   693,   695,
+     697,   700,   703,   706,   710,   713,   714,   716,   718,   720,
+     723,   726,   730,   740,   750,   759,   773,   775,   777,   784,
+     790,   793,   800,   808,   810,   814,   816,   817,   820,   822,
+     828,   834,   840,   847,   854,   857,   862,   867,   874,   879,
+     884,   889,   894,   901,   908,   911,   919,   921,   924,   925,
+     927,   928,   932,   939,   943,   950,   953,   958,   965
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const short yyrhs[] =
+static const short int yyrhs[] =
 {
-     198,     0,    -1,    19,    -1,    20,    -1,    17,    -1,    18,
+     200,     0,    -1,     5,    -1,     6,    -1,     3,    -1,     4,
       -1,    79,    -1,    80,    -1,    81,    -1,    82,    -1,    83,
       -1,    84,    -1,    85,    -1,    86,    -1,    87,    -1,    88,
       -1,    89,    -1,    90,    -1,    91,    -1,    92,    -1,    93,
       -1,    94,    -1,    95,    -1,    96,    -1,    97,    -1,    98,
-      -1,   101,    -1,   102,    -1,   103,    -1,   104,    -1,   105,
-      -1,   106,    -1,   117,    -1,   118,    -1,   119,    -1,   120,
-      -1,   107,    -1,   108,    -1,   109,    -1,   110,    -1,   111,
-      -1,   112,    -1,   113,    -1,   114,    -1,   115,    -1,   116,
-      -1,   117,    -1,   118,    -1,   119,    -1,   120,    -1,    25,
-      -1,    26,    -1,   129,    -1,   130,    -1,   131,    -1,   132,
-      -1,   138,    -1,   139,    -1,   140,    -1,   141,    -1,   142,
-      -1,   143,    -1,   144,    -1,   145,    -1,   146,    -1,   147,
-      -1,   148,    -1,   149,    -1,   137,    -1,    11,    -1,     9,
-      -1,     7,    -1,     5,    -1,    12,    -1,    10,    -1,     8,
-      -1,     6,    -1,   174,    -1,   175,    -1,    13,    -1,    14,
-      -1,   207,   150,    -1,    -1,    42,    -1,    43,    -1,    44,
-      -1,    48,    -1,    45,    -1,    46,    -1,    47,    -1,    -1,
-      65,    -1,    66,    -1,    67,    -1,    68,    -1,    69,    -1,
-      70,    -1,    64,    18,    -1,    -1,    -1,    56,    18,    -1,
-      -1,   151,    56,    18,    -1,    37,    30,    -1,    -1,   183,
-      -1,    -1,   151,   186,   185,    -1,   183,    -1,    56,    18,
-      -1,   189,    -1,     3,    -1,   191,    -1,     3,    -1,   191,
-      -1,     4,    -1,     5,    -1,     6,    -1,     7,    -1,     8,
+      -1,   119,    -1,   120,    -1,   121,    -1,   122,    -1,   123,
+      -1,   124,    -1,   125,    -1,   126,    -1,   127,    -1,   128,
+      -1,   129,    -1,   130,    -1,   131,    -1,   132,    -1,   133,
+      -1,   134,    -1,   135,    -1,   136,    -1,   137,    -1,   138,
+      -1,   125,    -1,   126,    -1,   127,    -1,   128,    -1,    27,
+      -1,    28,    -1,   109,    -1,   110,    -1,   111,    -1,   112,
+      -1,   140,    -1,   141,    -1,   142,    -1,   143,    -1,   144,
+      -1,   145,    -1,   146,    -1,   147,    -1,   148,    -1,   149,
+      -1,   150,    -1,   151,    -1,   139,    -1,    16,    -1,    14,
+      -1,    12,    -1,    10,    -1,    17,    -1,    15,    -1,    13,
+      -1,    11,    -1,   176,    -1,   177,    -1,    18,    -1,    19,
+      -1,   212,   152,    -1,    -1,    41,    -1,    42,    -1,    43,
+      -1,    44,    -1,    45,    -1,    46,    -1,    47,    -1,    -1,
+      -1,    65,    -1,    66,    -1,    67,    -1,    68,    -1,    69,
+      -1,    70,    -1,    64,     4,    -1,    -1,    57,     4,    -1,
+      -1,   153,    57,     4,    -1,    34,    24,    -1,    -1,   185,
+      -1,    -1,   153,   188,   187,    -1,   185,    -1,    57,     4,
+      -1,   191,    -1,     8,    -1,   193,    -1,     8,    -1,   193,
       -1,     9,    -1,    10,    -1,    11,    -1,    12,    -1,    13,
-      -1,    14,    -1,    15,    -1,    16,    -1,   222,    -1,   190,
-      -1,   152,    18,    -1,   188,   153,   193,   154,    -1,   155,
-      18,   156,   191,   157,    -1,   158,    18,   156,   191,   159,
-      -1,   160,   192,   161,    -1,   160,   161,    -1,   158,   160,
-     192,   161,   159,    -1,   158,   160,   161,   159,    -1,   191,
-     162,    -1,   191,    -1,   192,   151,   191,    -1,   192,    -1,
-     192,   151,    40,    -1,    40,    -1,    -1,   189,   155,   196,
-     157,    -1,   189,   155,   157,    -1,   189,   163,    30,    -1,
-     189,   158,   196,   159,    -1,   189,   160,   196,   161,    -1,
-     189,   160,   161,    -1,   189,    22,    -1,   189,    23,    -1,
-     189,   222,    -1,   189,   195,    -1,   189,    24,    -1,   174,
-     166,    -1,   175,   166,    -1,     4,    25,    -1,     4,    26,
-      -1,   177,    21,    -1,   173,   153,   194,    39,   189,   154,
-      -1,   126,   153,   194,   237,   154,    -1,   128,   153,   194,
-     151,   194,   151,   194,   154,    -1,   167,   153,   194,   151,
-     194,   154,    -1,   168,   153,   194,   151,   194,   154,    -1,
-     169,   153,   194,   151,   194,   154,    -1,    99,   170,   153,
-     194,   151,   194,   154,    -1,   100,   171,   153,   194,   151,
-     194,   154,    -1,   172,   153,   194,   151,   194,   154,    -1,
-     134,   153,   194,   151,   194,   154,    -1,   135,   153,   194,
-     151,   194,   151,   194,   154,    -1,   136,   153,   194,   151,
-     194,   151,   194,   154,    -1,   196,   151,   194,    -1,   194,
-      -1,    35,    -1,    36,    -1,   199,    -1,   199,   216,    -1,
-     199,   218,    -1,   199,    62,    61,   202,    -1,   199,    31,
-      -1,   201,    -1,    49,    -1,    57,    -1,   201,   178,    27,
-     187,    -1,   201,   218,    -1,   201,    62,    61,   202,    -1,
-     201,   178,   179,   197,   194,   185,    -1,   201,   178,   200,
-     197,   189,   185,    -1,   201,   178,    45,   197,   189,   185,
-      -1,   201,   178,    47,   197,   189,   185,    -1,   201,    50,
-     204,    -1,   201,    58,   150,   205,    -1,    -1,    30,    -1,
-      55,    -1,    54,    -1,    52,   150,   203,    -1,    53,   150,
-      18,    -1,    51,   150,    30,    -1,    71,   150,    30,    -1,
-     155,   206,   157,    -1,   206,   151,    30,    -1,    30,    -1,
-      -1,    28,    -1,    30,    -1,   207,    -1,    -1,   189,   208,
-      -1,   210,   151,   209,    -1,   209,    -1,   210,    -1,   210,
-     151,    40,    -1,    40,    -1,    -1,   180,   187,   207,   153,
-     211,   154,   184,   181,    -1,    32,    -1,   160,    -1,   179,
-     212,   213,    -1,    33,    -1,   161,    -1,   214,   225,   215,
-      -1,    -1,    45,    -1,    47,    -1,    -1,    34,   219,   217,
-     212,    -1,    -1,    63,    -1,    17,    -1,    18,    -1,    21,
-      -1,    25,    -1,    26,    -1,    22,    -1,    23,    -1,    24,
-      -1,   158,   196,   159,    -1,   195,    -1,    61,   220,    30,
-     151,    30,    -1,   165,    -1,   207,    -1,   222,    -1,   221,
-      -1,   189,   223,    -1,   225,   226,    -1,   226,    -1,   227,
-     229,    -1,   227,   231,    -1,    -1,    29,    -1,    77,    -1,
-      76,    -1,    72,   224,    -1,    72,     3,    -1,    73,    15,
-     223,    -1,    73,     4,   223,   151,    15,   223,   151,    15,
-     223,    -1,    74,   176,   223,   151,    15,   223,   155,   230,
-     157,    -1,    74,   176,   223,   151,    15,   223,   155,   157,
-      -1,   178,    75,   180,   187,   223,   153,   234,   154,    39,
-      15,   223,   228,    15,   223,    -1,   228,    -1,    78,    -1,
-     230,   176,   221,   151,    15,   223,    -1,   176,   221,   151,
-      15,   223,    -1,   178,   236,    -1,   189,   155,   223,   151,
-     223,   157,    -1,   232,   151,   155,   223,   151,   223,   157,
-      -1,   224,    -1,   233,   151,   224,    -1,   233,    -1,    -1,
-      60,    59,    -1,    59,    -1,   167,   189,   223,   151,   223,
-      -1,   168,   189,   223,   151,   223,    -1,   169,   189,   223,
-     151,   223,    -1,    99,   170,   189,   223,   151,   223,    -1,
-     100,   171,   189,   223,   151,   223,    -1,   172,   224,   151,
-     224,    -1,   173,   224,    39,   189,    -1,   128,   224,   151,
-     224,   151,   224,    -1,   133,   224,   151,   189,    -1,   134,
-     224,   151,   224,    -1,   135,   224,   151,   224,   151,   224,
-      -1,   136,   224,   151,   224,   151,   224,    -1,   127,   232,
-      -1,   235,   180,   187,   223,   153,   234,   154,    -1,   239,
-      -1,   151,   233,    -1,    -1,    38,    -1,    -1,   121,   189,
-     182,    -1,   121,   189,   151,    10,   223,   182,    -1,   122,
-     189,   182,    -1,   122,   189,   151,    10,   223,   182,    -1,
-     123,   224,    -1,   238,   124,   189,   223,    -1,   238,   125,
-     224,   151,   189,   223,    -1,   126,   189,   223,   237,    -1
+      -1,    14,    -1,    15,    -1,    16,    -1,    17,    -1,    18,
+      -1,    19,    -1,    21,    -1,   192,    -1,    48,    -1,   227,
+      -1,   154,     4,    -1,   190,   155,   195,   156,    -1,   157,
+       4,   158,   193,   159,    -1,   160,     4,   158,   193,   161,
+      -1,   162,   194,   163,    -1,   162,   163,    -1,   160,   162,
+     194,   163,   161,    -1,   160,   162,   163,   161,    -1,   193,
+     164,    -1,   193,    -1,   194,   153,   193,    -1,   194,    -1,
+     194,   153,    37,    -1,    37,    -1,    -1,   191,   157,   198,
+     159,    -1,   191,   157,   159,    -1,   191,   165,    24,    -1,
+     191,   160,   198,   161,    -1,   191,   162,   198,   163,    -1,
+     191,   162,   163,    -1,   191,   160,   162,   198,   163,   161,
+      -1,   191,   160,   162,   163,   161,    -1,   191,    38,    -1,
+     191,    39,    -1,   191,   227,    -1,   191,   197,    -1,   191,
+      26,    -1,   176,   168,    -1,   177,     4,    -1,     9,    27,
+      -1,     9,    28,    -1,   179,     7,    -1,   175,   155,   196,
+      36,   191,   156,    -1,   106,   155,   196,   242,   156,    -1,
+     108,   155,   196,   153,   196,   153,   196,   156,    -1,   169,
+     155,   196,   153,   196,   156,    -1,   170,   155,   196,   153,
+     196,   156,    -1,   171,   155,   196,   153,   196,   156,    -1,
+      99,   172,   155,   196,   153,   196,   156,    -1,   100,   173,
+     155,   196,   153,   196,   156,    -1,   174,   155,   196,   153,
+     196,   156,    -1,   114,   155,   196,   153,   196,   156,    -1,
+     115,   155,   196,   153,   196,   153,   196,   156,    -1,   116,
+     155,   196,   153,   196,   153,   196,   156,    -1,   198,   153,
+     196,    -1,   196,    -1,    32,    -1,    33,    -1,   201,    -1,
+     201,   221,    -1,   201,   223,    -1,   201,    62,    61,   207,
+      -1,   201,    25,    -1,   202,    -1,   202,   180,    20,   189,
+      -1,   202,   223,    -1,   202,    62,    61,   207,    -1,    -1,
+     202,   180,   181,   199,   196,   203,   187,    -1,    -1,   202,
+     180,    50,   199,   191,   204,   187,    -1,    -1,   202,   180,
+      45,   199,   191,   205,   187,    -1,    -1,   202,   180,    47,
+     199,   191,   206,   187,    -1,   202,    51,   209,    -1,   202,
+      58,   152,   210,    -1,    -1,    24,    -1,    56,    -1,    55,
+      -1,    53,   152,   208,    -1,    54,   152,     4,    -1,    52,
+     152,    24,    -1,    71,   152,    24,    -1,   157,   211,   159,
+      -1,   211,   153,    24,    -1,    24,    -1,    -1,    22,    -1,
+      24,    -1,   212,    -1,    -1,   191,   213,    -1,   215,   153,
+     214,    -1,   214,    -1,   215,    -1,   215,   153,    37,    -1,
+      37,    -1,    -1,   182,   189,   212,   155,   216,   156,   186,
+     183,    -1,    29,    -1,   162,    -1,   181,   217,   218,    -1,
+      30,    -1,   163,    -1,   230,   220,    -1,    -1,    45,    -1,
+      47,    -1,    -1,    31,   224,   222,   217,    -1,    -1,    63,
+      -1,     3,    -1,     4,    -1,     7,    -1,    27,    -1,    28,
+      -1,    38,    -1,    39,    -1,    26,    -1,   160,   198,   161,
+      -1,   197,    -1,    61,   225,    24,   153,    24,    -1,   167,
+      -1,   212,    -1,   227,    -1,   226,    -1,   191,   228,    -1,
+     230,   231,    -1,   219,   231,    -1,   232,   180,   234,    -1,
+     232,   236,    -1,    -1,    23,    -1,    77,    -1,    78,    -1,
+      72,   229,    -1,    72,     8,    -1,    73,    21,   228,    -1,
+      73,     9,   228,   153,    21,   228,   153,    21,   228,    -1,
+      74,   178,   228,   153,    21,   228,   157,   235,   159,    -1,
+      74,   178,   228,   153,    21,   228,   157,   159,    -1,    75,
+     182,   189,   228,   155,   239,   156,    36,    21,   228,   233,
+      21,   228,    -1,   233,    -1,    76,    -1,   235,   178,   226,
+     153,    21,   228,    -1,   178,   226,   153,    21,   228,    -1,
+     180,   241,    -1,   191,   157,   228,   153,   228,   159,    -1,
+     237,   153,   157,   228,   153,   228,   159,    -1,   229,    -1,
+     238,   153,   229,    -1,   238,    -1,    -1,    60,    59,    -1,
+      59,    -1,   169,   191,   228,   153,   228,    -1,   170,   191,
+     228,   153,   228,    -1,   171,   191,   228,   153,   228,    -1,
+      99,   172,   191,   228,   153,   228,    -1,   100,   173,   191,
+     228,   153,   228,    -1,    49,   229,    -1,   174,   229,   153,
+     229,    -1,   175,   229,    36,   191,    -1,   108,   229,   153,
+     229,   153,   229,    -1,   113,   229,   153,   191,    -1,   117,
+     229,   153,   191,    -1,   118,   229,   153,   191,    -1,   114,
+     229,   153,   229,    -1,   115,   229,   153,   229,   153,   229,
+      -1,   116,   229,   153,   229,   153,   229,    -1,   107,   237,
+      -1,   240,   182,   189,   228,   155,   239,   156,    -1,   244,
+      -1,   153,   238,    -1,    -1,    35,    -1,    -1,   101,   191,
+     184,    -1,   101,   191,   153,    15,   228,   184,    -1,   102,
+     191,   184,    -1,   102,   191,   153,    15,   228,   184,    -1,
+     103,   229,    -1,   243,   104,   191,   228,    -1,   243,   105,
+     229,   153,   191,   228,    -1,   106,   191,   228,   242,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short yyrline[] =
+static const unsigned short int yyrline[] =
 {
-       0,  1036,  1036,  1036,  1037,  1037,  1041,  1041,  1041,  1041,
-    1041,  1041,  1041,  1042,  1042,  1042,  1042,  1043,  1043,  1043,
-    1044,  1044,  1044,  1044,  1044,  1044,  1045,  1045,  1045,  1045,
-    1045,  1045,  1045,  1045,  1045,  1045,  1046,  1046,  1046,  1046,
-    1046,  1046,  1046,  1046,  1046,  1046,  1047,  1047,  1047,  1047,
-    1047,  1047,  1048,  1048,  1048,  1048,  1049,  1049,  1049,  1049,
-    1049,  1049,  1049,  1049,  1050,  1050,  1050,  1050,  1050,  1055,
-    1055,  1055,  1055,  1056,  1056,  1056,  1056,  1057,  1057,  1058,
-    1058,  1061,  1064,  1069,  1069,  1069,  1069,  1069,  1069,  1070,
-    1071,  1074,  1074,  1074,  1074,  1074,  1075,  1076,  1081,  1086,
-    1087,  1090,  1091,  1099,  1105,  1106,  1109,  1110,  1119,  1120,
-    1133,  1133,  1134,  1134,  1135,  1139,  1139,  1139,  1139,  1139,
-    1139,  1139,  1140,  1140,  1140,  1140,  1140,  1142,  1145,  1148,
-    1151,  1155,  1168,  1174,  1180,  1190,  1193,  1203,  1206,  1214,
-    1218,  1225,  1226,  1231,  1236,  1246,  1253,  1259,  1266,  1273,
-    1280,  1286,  1293,  1300,  1308,  1315,  1322,  1329,  1336,  1343,
-    1350,  1358,  1372,  1384,  1389,  1395,  1400,  1406,  1411,  1416,
-    1424,  1429,  1434,  1444,  1449,  1454,  1454,  1464,  1469,  1472,
-    1477,  1481,  1485,  1488,  1488,  1491,  1501,  1506,  1511,  1521,
-    1531,  1541,  1551,  1556,  1561,  1566,  1568,  1568,  1571,  1576,
-    1583,  1588,  1595,  1602,  1607,  1608,  1616,  1616,  1617,  1617,
-    1619,  1628,  1632,  1636,  1639,  1644,  1647,  1650,  1673,  1674,
-    1678,  1689,  1690,  1692,  1701,  1702,  1703,  1707,  1707,  1721,
-    1722,  1725,  1725,  1725,  1725,  1725,  1725,  1725,  1726,  1727,
-    1732,  1733,  1742,  1742,  1746,  1752,  1763,  1772,  1775,  1783,
-    1787,  1792,  1795,  1801,  1801,  1803,  1808,  1813,  1818,  1826,
-    1836,  1845,  1867,  1872,  1878,  1884,  1892,  1910,  1919,  1929,
-    1933,  1940,  1941,  1945,  1950,  1953,  1964,  1974,  1985,  1995,
-    2005,  2016,  2046,  2055,  2062,  2071,  2078,  2085,  2091,  2142,
-    2147,  2148,  2152,  2153,  2156,  2165,  2175,  2184,  2195,  2202,
-    2213,  2224
+       0,  1607,  1607,  1608,  1616,  1617,  1627,  1627,  1627,  1627,
+    1627,  1627,  1627,  1627,  1627,  1627,  1627,  1631,  1631,  1631,
+    1635,  1635,  1635,  1635,  1635,  1635,  1639,  1639,  1640,  1640,
+    1641,  1641,  1642,  1642,  1643,  1643,  1647,  1647,  1648,  1648,
+    1649,  1649,  1650,  1650,  1651,  1651,  1652,  1652,  1653,  1653,
+    1654,  1655,  1658,  1658,  1658,  1658,  1662,  1662,  1662,  1662,
+    1662,  1662,  1662,  1663,  1663,  1663,  1663,  1663,  1663,  1669,
+    1669,  1669,  1669,  1673,  1673,  1673,  1673,  1677,  1677,  1681,
+    1681,  1686,  1689,  1694,  1695,  1696,  1697,  1698,  1699,  1700,
+    1701,  1705,  1706,  1707,  1708,  1709,  1710,  1711,  1712,  1722,
+    1723,  1731,  1732,  1740,  1749,  1750,  1757,  1758,  1762,  1766,
+    1782,  1783,  1790,  1791,  1798,  1806,  1806,  1806,  1806,  1806,
+    1806,  1806,  1807,  1807,  1807,  1807,  1807,  1812,  1816,  1820,
+    1825,  1834,  1850,  1856,  1869,  1878,  1882,  1893,  1897,  1910,
+    1914,  1921,  1922,  1928,  1935,  1947,  1977,  1990,  2013,  2041,
+    2063,  2074,  2096,  2107,  2116,  2121,  2179,  2186,  2194,  2201,
+    2208,  2212,  2216,  2225,  2240,  2253,  2262,  2290,  2303,  2312,
+    2318,  2324,  2333,  2339,  2345,  2356,  2357,  2366,  2367,  2379,
+    2388,  2389,  2390,  2391,  2392,  2408,  2428,  2430,  2432,  2432,
+    2439,  2439,  2446,  2446,  2453,  2453,  2461,  2463,  2465,  2470,
+    2484,  2485,  2489,  2492,  2500,  2504,  2511,  2515,  2519,  2523,
+    2531,  2531,  2535,  2536,  2540,  2548,  2553,  2561,  2562,  2569,
+    2576,  2580,  2686,  2686,  2690,  2700,  2700,  2704,  2708,  2710,
+    2711,  2715,  2715,  2727,  2728,  2733,  2734,  2735,  2736,  2737,
+    2738,  2739,  2740,  2741,  2762,  2765,  2780,  2781,  2786,  2786,
+    2794,  2803,  2806,  2815,  2825,  2830,  2839,  2850,  2850,  2853,
+    2856,  2859,  2863,  2869,  2884,  2890,  2941,  2944,  2950,  2960,
+    2973,  3002,  3010,  3018,  3022,  3029,  3030,  3034,  3037,  3043,
+    3060,  3076,  3090,  3102,  3114,  3125,  3134,  3143,  3152,  3159,
+    3180,  3204,  3210,  3216,  3222,  3238,  3311,  3319,  3320,  3324,
+    3325,  3329,  3335,  3341,  3347,  3353,  3360,  3372,  3386
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE
-/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals. */
 static const char *const yytname[] =
 {
-  "$end", "error", "$undefined", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", 
-  "USHORT", "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "LABEL", 
-  "OPAQUE", "ESINT64VAL", "EUINT64VAL", "SINTVAL", "UINTVAL", "FPVAL", 
-  "NULL_TOK", "UNDEF", "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "TYPE", 
-  "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION", "BEGINTOK", 
-  "ENDTOK", "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO", 
-  "DOTDOTDOT", "CONST", "INTERNAL", "LINKONCE", "WEAK", "DLLIMPORT", 
-  "DLLEXPORT", "EXTERN_WEAK", "APPENDING", "EXTERNAL", "TARGET", "TRIPLE", 
-  "ENDIAN", "POINTERSIZE", "LITTLE", "BIG", "ALIGN", "UNINITIALIZED", 
-  "DEPLIBS", "CALL", "TAIL", "ASM_TOK", "MODULE", "SIDEEFFECT", "CC_TOK", 
-  "CCC_TOK", "CSRETCC_TOK", "FASTCC_TOK", "COLDCC_TOK", 
-  "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT", "RET", "BR", 
-  "SWITCH", "INVOKE", "EXCEPT", "UNWIND", "UNREACHABLE", "ADD", "SUB", 
-  "MUL", "DIV", "UDIV", "SDIV", "FDIV", "REM", "UREM", "SREM", "FREM", 
-  "AND", "OR", "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ", 
-  "SETNE", "ICMP", "FCMP", "EQ", "NE", "SLT", "SGT", "SLE", "SGE", "OEQ", 
-  "ONE", "OLT", "OGT", "OLE", "OGE", "ORD", "UNO", "UEQ", "UNE", "ULT", 
-  "UGT", "ULE", "UGE", "MALLOC", "ALLOCA", "FREE", "LOAD", "STORE", 
-  "GETELEMENTPTR", "PHI_TOK", "SELECT", "SHL", "SHR", "ASHR", "LSHR", 
-  "VAARG", "EXTRACTELEMENT", "INSERTELEMENT", "SHUFFLEVECTOR", "CAST", 
-  "TRUNC", "ZEXT", "SEXT", "FPTRUNC", "FPEXT", "FPTOUI", "FPTOSI", 
-  "UITOFP", "SITOFP", "PTRTOINT", "INTTOPTR", "BITCAST", "'='", "','", 
-  "'\\\\'", "'('", "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", "'}'", 
-  "'*'", "'c'", "$accept", "IntVal", "EInt64Val", "ArithmeticOps", 
-  "LogicalOps", "SetCondOps", "IPredicates", "FPredicates", "ShiftOps", 
-  "CastOps", "SIntType", "UIntType", "IntType", "FPType", "OptAssign", 
-  "OptLinkage", "OptCallingConv", "OptAlign", "OptCAlign", 
-  "SectionString", "OptSection", "GlobalVarAttributes", 
-  "GlobalVarAttribute", "TypesV", "UpRTypesV", "Types", "PrimType", 
-  "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", "ConstExpr", 
-  "ConstVector", "GlobalType", "Module", "DefinitionList", "External", 
-  "ConstPool", "AsmBlock", "BigOrLittle", "TargetDefinition", 
-  "LibrariesDefinition", "LibList", "Name", "OptName", "ArgVal", 
-  "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader", 
-  "END", "Function", "FnDeclareLinkage", "FunctionProto", "@1", 
-  "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef", 
-  "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList", 
-  "Unwind", "BBTerminatorInst", "JumpTable", "Inst", "PHIList", 
-  "ValueRefList", "ValueRefListE", "OptTailCall", "InstVal", "IndexList", 
+  "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL",
+  "UINTVAL", "FPVAL", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", "USHORT",
+  "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "TYPE", "LABEL",
+  "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION",
+  "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK",
+  "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO",
+  "DOTDOTDOT", "NULL_TOK", "UNDEF", "CONST", "INTERNAL", "LINKONCE",
+  "WEAK", "APPENDING", "DLLIMPORT", "DLLEXPORT", "EXTERN_WEAK", "OPAQUE",
+  "NOT", "EXTERNAL", "TARGET", "TRIPLE", "ENDIAN", "POINTERSIZE", "LITTLE",
+  "BIG", "ALIGN", "DEPLIBS", "CALL", "TAIL", "ASM_TOK", "MODULE",
+  "SIDEEFFECT", "CC_TOK", "CCC_TOK", "CSRETCC_TOK", "FASTCC_TOK",
+  "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT",
+  "RET", "BR", "SWITCH", "INVOKE", "UNREACHABLE", "UNWIND", "EXCEPT",
+  "ADD", "SUB", "MUL", "DIV", "UDIV", "SDIV", "FDIV", "REM", "UREM",
+  "SREM", "FREM", "AND", "OR", "XOR", "SETLE", "SETGE", "SETLT", "SETGT",
+  "SETEQ", "SETNE", "ICMP", "FCMP", "MALLOC", "ALLOCA", "FREE", "LOAD",
+  "STORE", "GETELEMENTPTR", "PHI_TOK", "SELECT", "SHL", "SHR", "ASHR",
+  "LSHR", "VAARG", "EXTRACTELEMENT", "INSERTELEMENT", "SHUFFLEVECTOR",
+  "VAARG_old", "VANEXT_old", "EQ", "NE", "SLT", "SGT", "SLE", "SGE", "ULT",
+  "UGT", "ULE", "UGE", "OEQ", "ONE", "OLT", "OGT", "OLE", "OGE", "ORD",
+  "UNO", "UEQ", "UNE", "CAST", "TRUNC", "ZEXT", "SEXT", "FPTRUNC", "FPEXT",
+  "FPTOUI", "FPTOSI", "UITOFP", "SITOFP", "PTRTOINT", "INTTOPTR",
+  "BITCAST", "'='", "','", "'\\\\'", "'('", "')'", "'['", "'x'", "']'",
+  "'<'", "'>'", "'{'", "'}'", "'*'", "'c'", "$accept", "INTVAL",
+  "EINT64VAL", "ArithmeticOps", "LogicalOps", "SetCondOps", "IPredicates",
+  "FPredicates", "ShiftOps", "CastOps", "SIntType", "UIntType", "IntType",
+  "FPType", "OptAssign", "OptLinkage", "OptCallingConv", "OptAlign",
+  "OptCAlign", "SectionString", "OptSection", "GlobalVarAttributes",
+  "GlobalVarAttribute", "TypesV", "UpRTypesV", "Types", "PrimType",
+  "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", "ConstExpr",
+  "ConstVector", "GlobalType", "Module", "FunctionList", "ConstPool", "@1",
+  "@2", "@3", "@4", "AsmBlock", "BigOrLittle", "TargetDefinition",
+  "LibrariesDefinition", "LibList", "Name", "OptName", "ArgVal",
+  "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader",
+  "END", "Function", "FnDeclareLinkage", "FunctionProto", "@5",
+  "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef",
+  "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList",
+  "Unwind", "BBTerminatorInst", "JumpTable", "Inst", "PHIList",
+  "ValueRefList", "ValueRefListE", "OptTailCall", "InstVal", "IndexList",
   "OptVolatile", "MemoryInst", 0
 };
 #endif
@@ -1748,7 +2343,7 @@
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
-static const unsigned short yytoknum[] =
+static const unsigned short int yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -1765,45 +2360,45 @@
      375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
      385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
      395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
-      61,    44,    92,    40,    41,    91,   120,    93,    60,    62,
-     123,   125,    42,    99
+     405,   406,    61,    44,    92,    40,    41,    91,   120,    93,
+      60,    62,   123,   125,    42,    99
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const unsigned char yyr1[] =
 {
-       0,   164,   165,   165,   166,   166,   167,   167,   167,   167,
-     167,   167,   167,   167,   167,   167,   167,   168,   168,   168,
-     169,   169,   169,   169,   169,   169,   170,   170,   170,   170,
-     170,   170,   170,   170,   170,   170,   171,   171,   171,   171,
-     171,   171,   171,   171,   171,   171,   171,   171,   171,   171,
-     171,   171,   172,   172,   172,   172,   173,   173,   173,   173,
-     173,   173,   173,   173,   173,   173,   173,   173,   173,   174,
-     174,   174,   174,   175,   175,   175,   175,   176,   176,   177,
-     177,   178,   178,   179,   179,   179,   179,   179,   179,   179,
-     179,   180,   180,   180,   180,   180,   180,   180,   180,   181,
-     181,   182,   182,   183,   184,   184,   185,   185,   186,   186,
-     187,   187,   188,   188,   189,   190,   190,   190,   190,   190,
-     190,   190,   190,   190,   190,   190,   190,   191,   191,   191,
-     191,   191,   191,   191,   191,   191,   191,   191,   191,   192,
-     192,   193,   193,   193,   193,   194,   194,   194,   194,   194,
-     194,   194,   194,   194,   194,   194,   194,   194,   194,   194,
-     194,   195,   195,   195,   195,   195,   195,   195,   195,   195,
-     195,   195,   195,   196,   196,   197,   197,   198,   199,   199,
-     199,   199,   199,   200,   200,   201,   201,   201,   201,   201,
-     201,   201,   201,   201,   201,   202,   203,   203,   204,   204,
-     204,   204,   205,   206,   206,   206,   207,   207,   208,   208,
-     209,   210,   210,   211,   211,   211,   211,   212,   213,   213,
-     214,   215,   215,   216,   217,   217,   217,   219,   218,   220,
-     220,   221,   221,   221,   221,   221,   221,   221,   221,   221,
-     221,   221,   222,   222,   223,   223,   224,   225,   225,   226,
-     227,   227,   227,   228,   228,   229,   229,   229,   229,   229,
-     229,   229,   229,   229,   230,   230,   231,   232,   232,   233,
-     233,   234,   234,   235,   235,   236,   236,   236,   236,   236,
-     236,   236,   236,   236,   236,   236,   236,   236,   236,   236,
-     237,   237,   238,   238,   239,   239,   239,   239,   239,   239,
-     239,   239
+       0,   166,   167,   167,   168,   168,   169,   169,   169,   169,
+     169,   169,   169,   169,   169,   169,   169,   170,   170,   170,
+     171,   171,   171,   171,   171,   171,   172,   172,   172,   172,
+     172,   172,   172,   172,   172,   172,   173,   173,   173,   173,
+     173,   173,   173,   173,   173,   173,   173,   173,   173,   173,
+     173,   173,   174,   174,   174,   174,   175,   175,   175,   175,
+     175,   175,   175,   175,   175,   175,   175,   175,   175,   176,
+     176,   176,   176,   177,   177,   177,   177,   178,   178,   179,
+     179,   180,   180,   181,   181,   181,   181,   181,   181,   181,
+     181,   182,   182,   182,   182,   182,   182,   182,   182,   183,
+     183,   184,   184,   185,   186,   186,   187,   187,   188,   188,
+     189,   189,   190,   190,   191,   192,   192,   192,   192,   192,
+     192,   192,   192,   192,   192,   192,   192,   193,   193,   193,
+     193,   193,   193,   193,   193,   193,   193,   193,   193,   194,
+     194,   195,   195,   195,   195,   196,   196,   196,   196,   196,
+     196,   196,   196,   196,   196,   196,   196,   196,   196,   196,
+     196,   196,   196,   197,   197,   197,   197,   197,   197,   197,
+     197,   197,   197,   197,   197,   198,   198,   199,   199,   200,
+     201,   201,   201,   201,   201,   202,   202,   202,   203,   202,
+     204,   202,   205,   202,   206,   202,   202,   202,   202,   207,
+     208,   208,   209,   209,   209,   209,   210,   211,   211,   211,
+     212,   212,   213,   213,   214,   215,   215,   216,   216,   216,
+     216,   217,   218,   218,   219,   220,   220,   221,   222,   222,
+     222,   224,   223,   225,   225,   226,   226,   226,   226,   226,
+     226,   226,   226,   226,   226,   226,   227,   227,   228,   228,
+     229,   230,   230,   231,   232,   232,   232,   233,   233,   234,
+     234,   234,   234,   234,   234,   234,   234,   234,   235,   235,
+     236,   237,   237,   238,   238,   239,   239,   240,   240,   241,
+     241,   241,   241,   241,   241,   241,   241,   241,   241,   241,
+     241,   241,   241,   241,   241,   241,   241,   242,   242,   243,
+     243,   244,   244,   244,   244,   244,   244,   244,   244
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1818,586 +2413,625 @@
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     2,     0,     1,     1,     1,     1,     1,     1,     1,
-       0,     1,     1,     1,     1,     1,     1,     2,     0,     0,
+       0,     0,     1,     1,     1,     1,     1,     1,     2,     0,
        2,     0,     3,     2,     0,     1,     0,     3,     1,     2,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        2,     4,     5,     5,     3,     2,     5,     4,     2,     1,
        3,     1,     3,     1,     0,     4,     3,     3,     4,     4,
-       3,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     6,     5,     8,     6,     6,     6,     7,     7,     6,
-       6,     8,     8,     3,     1,     1,     1,     1,     2,     2,
-       4,     2,     1,     1,     1,     4,     2,     4,     6,     6,
-       6,     6,     3,     4,     0,     1,     1,     1,     3,     3,
-       3,     3,     3,     3,     1,     0,     1,     1,     1,     0,
-       2,     3,     1,     1,     3,     1,     0,     8,     1,     1,
-       3,     1,     1,     3,     0,     1,     1,     0,     4,     0,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     3,
-       1,     5,     1,     1,     1,     1,     2,     2,     1,     2,
-       2,     0,     1,     1,     1,     2,     2,     3,     9,     9,
-       8,    14,     1,     1,     6,     5,     2,     6,     7,     1,
-       3,     1,     0,     2,     1,     5,     5,     5,     6,     6,
-       4,     4,     6,     4,     4,     6,     6,     2,     7,     1,
-       2,     0,     1,     0,     3,     6,     3,     6,     2,     4,
-       6,     4
+       3,     6,     5,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     6,     5,     8,     6,     6,     6,     7,
+       7,     6,     6,     8,     8,     3,     1,     1,     1,     1,
+       2,     2,     4,     2,     1,     4,     2,     4,     0,     7,
+       0,     7,     0,     7,     0,     7,     3,     4,     0,     1,
+       1,     1,     3,     3,     3,     3,     3,     3,     1,     0,
+       1,     1,     1,     0,     2,     3,     1,     1,     3,     1,
+       0,     8,     1,     1,     3,     1,     1,     2,     0,     1,
+       1,     0,     4,     0,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     3,     1,     5,     1,     1,     1,     1,
+       2,     2,     2,     3,     2,     0,     1,     1,     1,     2,
+       2,     3,     9,     9,     8,    13,     1,     1,     6,     5,
+       2,     6,     7,     1,     3,     1,     0,     2,     1,     5,
+       5,     5,     6,     6,     2,     4,     4,     6,     4,     4,
+       4,     4,     6,     6,     2,     7,     1,     2,     0,     1,
+       0,     3,     6,     3,     6,     2,     4,     6,     4
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
-static const unsigned short yydefact[] =
+static const unsigned short int yydefact[] =
 {
-     194,     0,    90,   182,     1,   181,   227,    83,    84,    85,
-      87,    88,    89,    86,     0,    98,   251,   178,   179,   206,
-     207,     0,     0,     0,    90,     0,   186,   224,     0,     0,
-      91,    92,    93,    94,    95,    96,     0,     0,   252,   251,
-     248,    82,     0,     0,     0,     0,   192,     0,     0,     0,
-       0,     0,   183,   184,     0,     0,    81,   225,   226,    98,
-     195,   180,    97,   111,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,     2,     3,     0,
-       0,     0,     0,   242,     0,     0,   110,   129,   114,   243,
-     128,   218,   219,   220,   221,   222,   223,   247,     0,     0,
-       0,   254,   253,   263,   293,   262,   249,   250,     0,     0,
-       0,     0,   205,   193,   187,   185,   175,   176,     0,     0,
-       0,     0,   228,   130,     0,     0,     0,   113,   135,   139,
-       0,     0,   144,   138,   256,     0,   255,     0,     0,    72,
-      76,    71,    75,    70,    74,    69,    73,    77,    78,     0,
-     292,   274,     0,    98,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,     0,     0,     0,     0,     0,     0,
-       0,     0,    52,    53,    54,    55,     0,     0,     0,     0,
-      68,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,     0,     0,     0,     0,     0,    98,   266,
-       0,   289,   200,   197,   196,   198,   199,   201,   204,     0,
-     106,   106,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,     0,     0,     0,     0,   106,   106,     0,
-       0,     0,     0,     0,   134,   216,   143,   141,     0,   231,
-     232,   233,   236,   237,   238,   234,   235,   229,     0,     0,
+     198,     0,    90,   184,     1,   183,   231,    83,    84,    85,
+      86,    87,    88,    89,     0,    91,   255,   180,   181,   255,
+     210,   211,     0,     0,     0,    90,     0,   186,   228,     0,
+       0,    92,    93,    94,    95,    96,    97,     0,     0,   256,
+     252,    82,   225,   226,   227,   251,     0,     0,     0,     0,
+     196,     0,     0,     0,     0,     0,     0,     0,    81,   229,
+     230,    91,   199,   182,    98,     2,     3,   111,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     128,     0,     0,     0,     0,   246,     0,     0,   110,   127,
+     114,   247,   129,   222,   223,   224,   300,   254,     0,     0,
+       0,     0,   209,   197,   187,   185,   177,   178,     0,     0,
+       0,     0,   232,   130,     0,     0,     0,   113,   135,   139,
+       0,     0,   144,   138,   299,     0,   278,     0,     0,     0,
+       0,    91,   267,   257,   258,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,     0,     0,     0,
+       0,     0,     0,    52,    53,    54,    55,     0,     0,     0,
+       0,     0,     0,    68,    56,    57,    58,    59,    60,    61,
+      62,    63,    64,    65,    66,    67,     0,     0,     0,     0,
+       0,   266,   253,    91,   270,     0,   296,   204,   201,   200,
+     202,   203,   205,   208,     0,   192,   194,   190,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,     0,
+       0,     0,     0,   188,     0,     0,     0,     0,     0,   134,
+     220,   143,   141,     0,     0,   284,   277,   260,   259,     0,
+       0,    72,    76,    71,    75,    70,    74,    69,    73,    77,
+      78,     0,     0,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,     0,    50,    51,    46,    47,    48,    49,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+       0,   101,   101,   305,     0,     0,   294,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   206,   106,   106,   106,   160,   161,     4,
+       5,   158,   159,   162,   157,   153,   154,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   240,   245,   244,   246,     0,   257,     0,   273,     0,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-       0,    50,    51,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,     0,   101,   101,
-     298,     0,     0,   287,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   202,     0,
-     190,   191,   158,   159,     4,     5,   156,   157,   160,   151,
-     152,   155,     0,     0,     0,     0,   154,   153,   188,   189,
-     112,   112,   137,     0,   140,   215,   209,   212,   213,     0,
-       0,   131,   230,     0,     0,     0,     0,     0,     0,     0,
-       0,   174,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   294,     0,   296,   291,     0,     0,
+       0,     0,     0,   156,   155,   106,   112,   112,   137,     0,
+     140,   219,   213,   216,   217,     0,     0,   131,   235,   236,
+     237,   242,   238,   239,   240,   241,   233,     0,   244,   249,
+     248,   250,     0,   261,     0,     0,     0,     0,     0,   301,
+       0,   303,   298,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   203,     0,     0,   108,   106,   146,     0,
-       0,   150,     0,   147,   132,   133,   136,   208,   210,     0,
-     104,   142,     0,     0,     0,   291,     0,     0,     0,     0,
-       0,   239,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   301,     0,     0,     0,
-     283,   284,     0,     0,     0,     0,     0,   280,   281,     0,
-     299,     0,   103,   109,   107,   145,   148,   149,   214,   211,
-     105,    99,     0,     0,     0,     0,     0,     0,     0,     0,
-     173,     0,     0,     0,     0,     0,     0,     0,   272,     0,
-       0,   101,   102,   101,   269,   290,     0,     0,     0,     0,
-       0,   275,   276,   277,   272,     0,     0,   217,   241,     0,
-       0,   162,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   271,     0,   278,   279,     0,   295,   297,
-       0,     0,     0,   282,   285,   286,     0,   300,   100,     0,
-       0,     0,   170,     0,     0,   164,   165,   166,   169,   161,
-       0,   260,     0,     0,     0,   270,   267,     0,   288,   167,
-     168,     0,     0,     0,   258,     0,   259,     0,     0,   268,
-     163,   171,   172,     0,     0,     0,     0,     0,     0,   265,
-       0,     0,   264,     0,   261
+     207,     0,   193,   195,   191,     0,     0,     0,     0,     0,
+       0,     0,   146,   176,     0,     0,     0,   150,     0,   147,
+       0,     0,     0,     0,     0,   189,   132,   133,   136,   212,
+     214,     0,   104,   142,   234,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   308,     0,     0,     0,
+     288,   291,     0,     0,   289,   290,     0,     0,     0,   285,
+     286,     0,   306,     0,     0,     0,   108,   106,     0,     0,
+     298,     0,     0,     0,     0,     0,   145,   135,   114,     0,
+     148,   149,     0,     0,     0,     0,     0,   218,   215,   105,
+      99,     0,   243,     0,     0,   276,     0,     0,   101,   102,
+     101,   273,   297,     0,     0,     0,     0,     0,   279,   280,
+     281,   276,     0,   103,   109,   107,     0,     0,     0,     0,
+       0,     0,     0,   175,   152,     0,     0,     0,     0,     0,
+       0,     0,   221,     0,     0,     0,   275,     0,   282,   283,
+       0,   302,   304,     0,     0,     0,   287,   292,   293,     0,
+     307,     0,     0,   164,     0,     0,     0,     0,   151,     0,
+       0,     0,     0,     0,   100,   245,     0,     0,     0,   274,
+     271,     0,   295,     0,     0,     0,   172,     0,     0,   166,
+     167,   168,   171,   163,     0,   264,     0,     0,     0,   272,
+     169,   170,     0,     0,     0,   262,     0,   263,     0,     0,
+     165,   173,   174,     0,     0,     0,     0,     0,     0,   269,
+       0,     0,   268,   265
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
-static const short yydefgoto[] =
+static const short int yydefgoto[] =
 {
-      -1,    83,   336,   266,   267,   268,   290,   307,   269,   270,
-     233,   234,   149,   235,    24,    15,    36,   507,   384,   406,
-     471,   330,   407,    84,    85,   236,    87,    88,   130,   248,
-     371,   271,   372,   118,     1,     2,    55,     3,    61,   215,
-      46,   113,   219,    89,   418,   357,   358,   359,    37,    93,
-      16,    96,    17,    59,    18,    27,   363,   272,    90,   274,
-     494,    39,    40,    41,   105,   106,   553,   107,   313,   523,
-     524,   208,   209,   446,   210,   211
+      -1,    85,   311,   328,   329,   330,   263,   280,   331,   332,
+     219,   220,   251,   221,    25,    15,    37,   522,   369,   456,
+     480,   392,   457,    86,    87,   222,    89,    90,   120,   233,
+     403,   358,   404,   108,     1,     2,     3,   335,   306,   304,
+     305,    63,   200,    50,   103,   204,    91,   420,   343,   344,
+     345,    38,    95,    16,    44,    17,    61,    18,    28,   425,
+     359,    92,   361,   491,    19,    40,    41,   191,   192,   577,
+      97,   286,   526,   527,   193,   194,   436,   195,   196
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -537
-static const short yypact[] =
+#define YYPACT_NINF -508
+static const short int yypact[] =
 {
-    -537,    75,    61,  1145,  -537,  -537,  -537,  -537,  -537,  -537,
-    -537,  -537,  -537,  -537,    18,   180,    55,  -537,  -537,  -537,
-    -537,   -28,   -61,    33,   130,   -40,  -537,   102,    87,   117,
-    -537,  -537,  -537,  -537,  -537,  -537,   838,   -24,  -537,   -15,
-    -537,    48,   -11,    -2,     6,    12,  -537,    11,    87,   838,
-      -9,    -9,  -537,  -537,    -9,    -9,  -537,  -537,  -537,   180,
-    -537,  -537,  -537,    32,  -537,  -537,  -537,  -537,  -537,  -537,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,   164,
-     171,    -6,   512,  -537,   135,    41,  -537,  -537,  -103,  -537,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,   883,    45,
-     192,  -537,  -537,  -537,  1324,  -537,  -537,  -537,   175,   126,
-     190,   188,   203,  -537,  -537,  -537,  -537,  -537,   911,   911,
-     957,   911,  -537,  -537,    81,    97,   561,  -537,  -537,  -103,
-    -109,   121,   641,  -537,    32,  1140,  -537,  1140,  1140,  -537,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  1140,
-    -537,  -537,   219,   180,  -537,  -537,  -537,  -537,  -537,  -537,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,
-    -537,  -537,  -537,  -537,    10,   112,   911,   911,   911,   911,
-     911,   911,  -537,  -537,  -537,  -537,   911,   911,   911,   911,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,
-    -537,  -537,  -537,   911,   911,   911,   911,   911,   180,  -537,
-      59,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,   -71,
-     129,   129,   167,   193,   195,   218,   222,   224,   234,   243,
-     250,   261,   263,   252,   252,   264,   993,   129,   129,   911,
-     911,   127,   -97,   911,  -537,   680,  -537,   136,   137,  -537,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,   229,    10,   112,
-     140,   141,   144,   145,   146,   957,   147,   148,   150,   154,
-     155,  -537,  -537,  -537,  -537,   158,  -537,   160,  -537,   838,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,
-     911,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,   911,   163,   165,
-    -537,  1140,   162,   169,   170,   172,   173,   174,   176,  1140,
-    1140,  1140,   177,   276,   838,   911,   911,   288,  -537,    -8,
-    -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,
-    -537,  -537,   724,   957,   590,   292,  -537,  -537,  -537,  -537,
-    -106,  -104,  -537,   179,  -103,  -537,   135,  -537,   178,   181,
-     752,  -537,  -537,   296,   183,   187,   957,   957,   957,   957,
-     957,  -537,  -131,   957,   957,   957,   957,   957,   315,   316,
-    1140,  1140,  1140,     1,  -537,     7,  -537,   191,  1140,   186,
-     911,   911,   911,   911,   911,   194,   197,   201,   911,   911,
-    1140,  1140,   202,  -537,   304,   326,  -537,   129,  -537,   -60,
-     -78,  -537,   -74,  -537,  -537,  -537,  -537,  -537,  -537,   799,
-     309,  -537,   208,   957,   957,   191,   210,   213,   223,   225,
-     957,  -537,   230,   231,   235,   236,   308,  1140,  1140,   227,
-     237,   238,  1140,   357,  1140,   911,  -537,   239,  1140,   241,
-    -537,  -537,   242,   244,  1140,  1140,  1140,  -537,  -537,   248,
-    -537,   911,  -537,  -537,  -537,  -537,  -537,  -537,  -537,  -537,
-    -537,   338,   366,   246,   251,   249,   957,   957,   957,   957,
-    -537,   957,   957,   957,   957,   911,   253,   258,   911,  1140,
-    1140,   254,  -537,   254,  -537,   255,  1140,   256,   911,   911,
-     911,  -537,  -537,  -537,   911,  1140,   390,  -537,  -537,   957,
-     957,  -537,   265,   260,   266,   267,   268,   272,   274,   275,
-     277,   400,    29,   255,   280,  -537,  -537,   363,  -537,  -537,
-     911,   278,  1140,  -537,  -537,  -537,   282,  -537,  -537,   283,
-     287,   957,  -537,   957,   957,  -537,  -537,  -537,  -537,  -537,
-    1140,  -537,  1229,    60,   381,  -537,  -537,   286,  -537,  -537,
-    -537,   290,   293,   294,  -537,   270,  -537,  1229,   435,  -537,
-    -537,  -537,  -537,   436,   302,  1140,  1140,   441,   196,  -537,
-    1140,   442,  -537,  1140,  -537
+    -508,    18,   144,   546,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,  -508,  -508,  -508,     2,   152,    47,  -508,  -508,   -15,
+    -508,  -508,   -30,   -75,    29,    69,   -10,  -508,    98,   104,
+     151,  -508,  -508,  -508,  -508,  -508,  -508,  1307,    -8,  -508,
+    -508,   149,  -508,  -508,  -508,  -508,    11,    20,    22,    24,
+    -508,    27,   104,  1307,     0,     0,     0,     0,  -508,  -508,
+    -508,   152,  -508,  -508,  -508,  -508,  -508,    37,  -508,  -508,
+    -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,   194,   200,     3,   695,  -508,   149,    54,  -508,  -508,
+     -81,  -508,  -508,  -508,  -508,  -508,  1561,  -508,   186,   -19,
+     210,   188,   203,  -508,  -508,  -508,  -508,  -508,  1368,  1368,
+    1368,  1409,  -508,  -508,    66,    70,   715,  -508,  -508,   -81,
+     -85,    75,   781,  -508,  -508,  1368,  -508,   172,  1429,    58,
+     255,   152,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,  -508,  -508,  -508,  -508,   208,   394,  1368,  1368,  1368,
+    1368,  1368,  1368,  -508,  -508,  -508,  -508,  1368,  1368,  1368,
+    1368,  1368,  1368,  -508,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,  -508,  -508,  -508,  -508,  -508,  1368,  1368,  1368,  1368,
+    1368,  -508,  -508,   152,  -508,    55,  -508,  -508,  -508,  -508,
+    -508,  -508,  -508,  -508,   -50,  -508,  -508,  -508,   153,   179,
+     228,   191,   229,   193,   230,   197,   231,   233,   234,   199,
+     232,   235,   537,  -508,  1368,  1368,    84,   -45,  1368,  -508,
+    1149,  -508,    93,    91,   898,  -508,  -508,    37,  -508,   898,
+     898,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,   898,  1307,  -508,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,  -508,  -508,  1368,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,  -508,
+    1368,    95,    96,  -508,   898,    99,    97,   105,   106,   107,
+     120,   123,   126,   127,   898,   898,   898,   128,   221,  1307,
+    1368,  1368,   258,  -508,   132,   132,   132,  -508,  -508,  -508,
+    -508,  -508,  -508,  -508,  -508,  -508,  -508,   208,   394,   131,
+     134,   135,   136,   137,  1190,  1470,   736,   259,   139,   140,
+     141,   142,   148,  -508,  -508,   132,  -130,   -23,  -508,   143,
+     -81,  -508,   149,  -508,   155,   154,  1210,  -508,  -508,  -508,
+    -508,  -508,  -508,  -508,  -508,  -508,   224,  1409,  -508,  -508,
+    -508,  -508,   156,  -508,   163,   898,   898,   898,     4,  -508,
+       5,  -508,   164,   898,   162,  1368,  1368,  1368,  1368,  1368,
+    1368,  1368,   167,   168,   169,  1368,  1368,   898,   898,   170,
+    -508,   -17,  -508,  -508,  -508,   150,   182,  1409,  1409,  1409,
+    1409,  1409,  -508,  -508,   -13,   756,   -24,  -508,   -36,  -508,
+    1409,  1409,  1409,  1409,  1409,  -508,  -508,  -508,  -508,  -508,
+    -508,  1251,   290,  -508,  -508,   301,   -14,   324,   325,   198,
+     201,   202,   898,   348,   898,  1368,  -508,   204,   898,   205,
+    -508,  -508,   211,   214,  -508,  -508,   898,   898,   898,  -508,
+    -508,   213,  -508,  1368,   332,   365,  -508,   132,  1409,  1409,
+     164,   217,   222,   223,   225,  1409,  -508,   216,   -71,   -27,
+    -508,  -508,   226,   236,   237,   240,   338,  -508,  -508,  -508,
+     326,   241,  -508,   898,   898,  1368,   898,   898,   242,  -508,
+     242,  -508,   243,   898,   244,  1368,  1368,  1368,  -508,  -508,
+    -508,  1368,   898,  -508,  -508,  -508,   246,   247,   245,  1409,
+    1409,  1409,  1409,  -508,  -508,   220,  1409,  1409,  1409,  1409,
+    1368,   378,  -508,   361,   249,   248,   243,   250,  -508,  -508,
+     329,  -508,  -508,  1368,   256,   898,  -508,  -508,  -508,   251,
+    -508,  1409,  1409,  -508,   261,   252,   270,   271,  -508,   269,
+     272,   275,   279,   280,  -508,  -508,   367,    40,   368,  -508,
+    -508,   267,  -508,   281,   282,  1409,  -508,  1409,  1409,  -508,
+    -508,  -508,  -508,  -508,   898,  -508,   996,    85,   382,  -508,
+    -508,  -508,   283,   285,   288,  -508,   274,  -508,   996,   898,
+    -508,  -508,  -508,   424,   293,   130,   898,   426,   430,  -508,
+     898,   898,  -508,  -508
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const short yypgoto[] =
+static const short int yypgoto[] =
 {
-    -537,  -537,   226,   361,   362,   365,   209,   214,   368,   370,
-     -99,   -98,  -507,  -537,   420,   452,  -134,  -537,  -303,    57,
-    -537,  -216,  -537,   -45,  -537,   -36,  -537,   -79,   -30,  -537,
-    -111,   245,  -210,   104,  -537,  -537,  -537,  -537,   431,  -537,
-    -537,  -537,  -537,     4,  -537,    63,  -537,  -537,   421,  -537,
-    -537,  -537,  -537,  -537,   480,  -537,  -537,  -536,  -105,    58,
-     -88,  -537,   445,  -537,   -93,  -537,  -537,  -537,  -537,    42,
-     -18,  -537,  -537,    64,  -537,  -537
+    -508,  -508,  -508,   356,   357,   360,   145,   147,   371,   374,
+    -128,  -127,  -497,  -508,   416,   436,  -117,  -508,  -277,    41,
+    -508,  -296,  -508,   -47,  -508,   -37,  -508,   -58,    46,  -508,
+     -99,   253,  -298,    49,  -508,  -508,  -508,  -508,  -508,  -508,
+    -508,   419,  -508,  -508,  -508,  -508,     8,  -508,    51,  -508,
+    -508,   412,  -508,  -508,  -508,  -508,  -508,   471,  -508,  -508,
+    -507,  -209,    67,  -124,  -508,   457,  -508,  -118,  -508,  -508,
+    -508,  -508,    43,   -22,  -508,  -508,    21,  -508,  -508
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, parse error.  */
-#define YYTABLE_NINF -178
-static const short yytable[] =
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -180
+static const short int yytable[] =
 {
-      86,   147,   148,   129,   115,   331,   386,    25,    91,   237,
-     136,   442,   125,    86,    38,   552,   565,   444,    94,   279,
-     430,   348,   349,    42,    43,    44,   116,   117,   431,   404,
-     273,   574,   273,   273,   139,   140,   141,   142,   143,   144,
-     145,   146,   243,    45,   273,    25,   567,   129,   405,   137,
-    -112,   414,   244,   129,   243,   415,   133,   443,   133,   133,
-     138,  -177,   135,   443,   353,   139,   140,   141,   142,   143,
-     144,   145,   146,   430,   324,     4,    19,   430,    20,    28,
-     327,   466,   220,   221,    38,   238,   328,   467,   131,    47,
-     310,   430,     5,   314,    48,     6,   242,   465,   315,   316,
-     317,   318,   247,     7,     8,     9,    10,    11,    12,    13,
-      56,   280,   281,   282,   283,   284,   285,    60,   322,   323,
-      98,    99,   100,    14,   101,   102,   103,   286,   287,   288,
-     289,   347,   409,   410,   412,    62,    92,   291,   292,   108,
-     308,   309,   135,   311,   312,   135,    95,    57,   109,    58,
-     135,   135,   135,   135,   126,   119,   110,    49,   120,   121,
-     350,   351,   111,    19,   354,    20,   112,   319,   320,   321,
-     135,   135,     7,     8,     9,    50,    11,    51,    13,    52,
-     213,   214,   123,   325,   326,  -113,   551,    53,   528,   124,
-     529,   464,   332,   333,   132,   275,   276,   139,   140,   141,
-     142,   143,   144,   145,   146,   212,   273,   277,   216,   356,
-     -72,   -72,   -76,   -76,   273,   273,   273,   566,   217,   293,
-     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
-     304,   305,   306,   218,   380,   -71,   -71,   239,   402,   -75,
-     -75,   -70,   -70,    86,    29,    30,    31,    32,    33,    34,
-      35,   -74,   -74,   240,   381,   425,   426,   427,   428,   429,
-     -69,   -69,   432,   433,   434,   435,   436,   -73,   -73,   334,
-     335,   382,   101,   102,   245,   273,   273,   273,   278,   400,
-     329,   354,   -79,   273,   -80,   338,   352,   360,    86,   401,
-     135,   361,   362,   366,   367,   273,   273,   368,   369,   370,
-     373,   374,   449,   375,   451,   452,   453,   376,   377,   378,
-     457,   379,   473,   474,   383,   399,   385,   388,   403,   480,
-     389,   390,   413,   391,   392,   393,   422,   394,   398,   419,
-     437,   438,   273,   273,   462,   420,   423,   273,   416,   273,
-     424,   448,   445,   273,   463,   454,   404,   485,   455,   273,
-     273,   273,   456,   461,   135,   450,   135,   135,   135,   472,
-     417,   476,   135,   458,   477,   512,   513,   514,   515,   387,
-     516,   517,   518,   519,   478,   492,   479,   395,   396,   397,
-     488,   481,   482,   356,   273,   273,   483,   484,   489,   490,
-     496,   273,   498,   499,   506,   500,   508,   509,   539,   540,
-     273,   504,   510,   511,   521,   527,   530,   532,   538,   135,
-     533,   534,   535,   522,   542,   550,   541,   543,   544,   443,
-     568,   573,   545,   147,   148,   505,   546,   273,   547,   548,
-     561,   549,   562,   563,   554,   556,   558,   559,   439,   440,
-     441,   560,   555,   569,   570,   273,   447,   571,   572,   520,
-     575,   576,   135,   577,   147,   148,   580,   583,   459,   460,
-     337,   104,   135,   135,   135,   203,   204,   364,   135,   205,
-     273,   273,   206,   365,   207,   273,    54,   470,   273,   114,
-     122,   346,   469,    26,    97,   581,   536,   495,     0,   475,
-       0,     0,     0,     0,   135,   486,   487,     0,     0,     0,
-     491,     0,   493,     0,     0,     0,   497,     0,     0,     0,
-       0,     0,   501,   502,   503,   127,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,     0,
-       0,    77,    78,     0,     0,     0,     0,     0,     0,     0,
-      19,     0,    20,     0,     0,     0,     0,   525,   526,     0,
-       0,     0,     0,     0,   531,     0,     0,     0,     0,     0,
-       0,     0,     0,   537,   127,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,     0,     0,
-      77,    78,     0,     0,     0,     0,     0,     0,     0,    19,
-     557,    20,     0,   127,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,    75,    76,     0,   564,    77,
-      78,     0,     0,     0,     0,     0,     0,     0,    19,     0,
-      20,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   578,   579,     0,     0,     0,   582,     0,
-       0,   584,     0,     0,   127,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,     0,     0,
-      77,    78,     0,     0,    79,     0,     0,    80,     0,    19,
-      81,    20,    82,   128,     0,     0,     0,     0,     0,     0,
-       0,   246,     0,   127,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,     0,     0,    77,
-      78,     0,     0,     0,     0,     0,     0,     0,    19,     0,
-      20,     0,     0,    79,     0,     0,    80,     0,     0,    81,
-     355,    82,   241,     0,     0,     0,     0,   127,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,    75,
-      76,     0,    79,    77,    78,    80,     0,     0,    81,     0,
-      82,   411,    19,     0,    20,   127,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,     0,
-       0,    77,    78,     0,     0,     0,     0,     0,     0,     0,
-      19,     0,    20,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   421,    79,     0,     0,    80,     0,     0,    81,
-       0,    82,   127,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,     0,     0,    77,    78,
-       0,     0,     0,     0,     0,     0,     0,    19,     0,    20,
-       0,     0,    79,     0,     0,    80,     0,     0,    81,   468,
-      82,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,     0,     0,    77,    78,     0,
-       0,     0,     0,     0,     0,     0,    19,     0,    20,     0,
-       0,     0,     0,     0,     0,     0,    79,     0,     0,    80,
-       0,   408,    81,     0,    82,     0,   134,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-       0,     0,    77,    78,    79,     0,     0,    80,     0,     0,
-      81,    19,    82,    20,   127,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,     0,     0,
-      77,    78,     0,     0,     0,     0,     0,     0,     0,    19,
-       0,    20,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    79,     0,     0,    80,     0,     0,    81,     0,    82,
-     127,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,    75,    76,     0,     0,    77,    78,     0,     0,
-       0,     0,     0,     0,     0,    19,     0,    20,     0,     0,
-      79,     0,     0,    80,     0,     0,    81,     0,    82,     0,
+      88,   235,   249,   250,   238,   371,   105,   115,    39,   393,
+     394,    26,   223,   334,   252,    42,    88,   454,     4,   432,
+     434,    93,    46,    47,    48,   360,   119,   406,   408,   416,
+     360,   360,   106,   107,   123,   283,   198,   199,   287,   415,
+     455,    49,   360,   288,   289,   290,   291,   292,   293,    26,
+     241,   242,   243,   244,   245,   246,   247,   248,   119,   426,
+     576,   433,   433,    29,   119,   297,   298,   239,   228,   586,
+      39,   205,   206,   207,  -112,   360,   299,    51,   229,   240,
+     588,   594,  -139,   123,  -112,   360,   360,   360,   234,    53,
+      52,   234,  -139,   123,   121,   241,   242,   243,   244,   245,
+     246,   247,   248,   302,   109,   110,   111,   469,   228,   303,
+       7,     8,     9,    10,    54,    12,    55,   465,   339,    56,
+     281,   282,   234,   284,   285,   234,   465,   471,    62,   465,
+     234,   234,   234,   234,   234,   234,   515,   470,   417,   465,
+     465,   123,    58,    59,  -179,    60,   466,   482,    43,   294,
+     295,   296,   234,   234,    94,    64,   360,   360,   360,   300,
+     301,   505,   227,    98,   360,   116,   336,   337,   232,     5,
+     340,    20,    99,    21,   100,     6,   101,   389,   360,   360,
+     307,   308,   -72,   -72,   102,     7,     8,     9,    10,    11,
+      12,    13,  -113,   342,   -71,   -71,   -70,   -70,   113,   575,
+     -69,   -69,   309,   310,   114,   365,    14,   133,   134,   122,
+     197,   531,   202,   532,   201,    88,    30,    31,    32,    33,
+      34,    35,    36,   360,   224,   360,   366,   203,   225,   360,
+     230,   236,   -76,   -75,   -74,   -73,   312,   360,   360,   360,
+     -79,   -80,   313,   367,   587,   338,   346,   347,   368,   370,
+     374,   439,   387,   441,   442,   443,   373,   386,   375,   376,
+     377,   449,    88,   388,   234,   241,   242,   243,   244,   245,
+     246,   247,   248,   378,   360,   360,   379,   360,   360,   380,
+     381,   385,   390,   409,   360,   391,   397,   424,   340,   398,
+     399,   400,   401,   360,   410,   411,   412,   413,   460,   461,
+     462,   463,   464,   414,   418,   458,   362,   363,   421,   427,
+     422,   472,   473,   474,   475,   476,   428,   435,   364,   438,
+     446,   447,   448,   453,   454,   481,   360,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   459,   234,   440,
+     234,   234,   234,   444,   445,   483,   484,   468,   234,   450,
+     419,   372,   489,   485,   486,   487,   503,   493,   495,   506,
+     507,   382,   383,   384,   496,   360,   513,   497,   501,   504,
+     509,   536,   537,   538,   520,   510,   511,   514,   512,   516,
+     360,   548,   554,   521,   342,   555,   433,   360,   574,   517,
+     518,   360,   360,   519,   523,   530,   533,   535,   234,   541,
+     542,   543,   556,   589,   578,   557,   558,   562,   566,   559,
+     544,   545,   546,   547,   565,   560,   502,   549,   550,   551,
+     552,   264,   265,   567,   568,   569,   579,   593,   570,   249,
+     250,   571,   429,   430,   431,   572,   573,   580,   581,   590,
+     437,   591,   563,   564,   592,   596,   597,   600,   234,   249,
+     250,   601,   186,   187,   451,   452,   188,    96,   234,   234,
+     234,    57,   395,   479,   234,   396,   582,   189,   583,   584,
+     190,   104,   478,   112,    27,   333,    45,   598,   492,   539,
+       0,   508,     0,   553,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   234,     0,     0,   488,
+       0,   490,     0,     0,     0,   494,     0,     0,     0,     0,
+       0,     0,     0,   498,   499,   500,     0,     0,     0,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    65,    66,     0,     0,     0,     0,     0,     0,
+     524,   525,     0,   528,   529,     0,     0,     0,     0,    20,
+     534,    21,     0,   314,     0,     0,   -82,     0,    20,   540,
+      21,     0,     0,     0,     0,   315,   316,     6,   -82,   -82,
+       0,     0,     0,     0,     0,     0,     0,   -82,   -82,   -82,
+     -82,   -82,   -82,   -82,     0,     0,   -82,    22,     0,     0,
+       0,     0,   561,     0,    23,     0,     0,     0,    24,     0,
+       0,     0,     0,     0,     0,     0,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   317,   318,     0,     0,
+       0,   585,     0,   319,     0,   320,   163,   164,   165,   166,
+       0,   321,   322,   323,     0,     0,   595,     0,     0,     0,
+       0,     0,     0,   599,     0,     0,     0,   602,   603,     0,
+       0,     0,     0,     0,     0,     0,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,     0,
+       0,     0,     0,     0,   324,     0,     0,   325,     0,   326,
+      65,    66,   327,   117,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,     0,    79,    20,     0,    21,
+      65,    66,     0,   117,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,     0,    79,    20,     0,    21,
+       0,    65,    66,    80,   117,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,     0,    79,    20,     0,
+      21,    65,    66,    80,   117,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,     0,    79,    20,     0,
+      21,     0,     0,     0,    80,     0,    65,    66,     0,   117,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,     0,    79,    20,    80,    21,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   231,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    80,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    77,    78,     0,   339,   340,   341,     0,     0,
-       0,    19,     0,    20,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    79,     0,     0,    80,     0,
-       0,    81,     0,    82,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    81,
+       0,     0,    82,     0,     0,    83,     0,    84,   118,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    81,
+       0,     0,    82,     0,     0,    83,     0,    84,   226,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    79,     0,     0,    80,     0,     0,    81,
-       0,    82,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   258,   259,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    79,
-       0,     0,    80,     0,     0,    81,     0,    82,     0,   260,
-       0,   261,   182,   183,   184,   185,     0,   262,   263,   264,
-     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,     0,     0,     0,     0,     0,   342,     0,
-       0,   343,     0,   344,     0,     0,   345,   249,   250,    77,
-      78,   251,   252,   253,   254,   255,   256,     0,    19,     0,
-      20,     0,   -82,    19,     0,    20,     0,     0,     0,     6,
-     -82,   -82,     0,     0,     0,     0,     0,   -82,   -82,   -82,
-     -82,   -82,   -82,   -82,   -82,    21,     0,     0,     0,     0,
-       0,   257,   -82,    22,     0,     0,     0,    23,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   258,
-     259,     0,     0,     0,     0,     0,   249,   250,     0,     0,
-     251,   252,   253,   254,   255,   256,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   260,     0,   261,   182,
-     183,   184,   185,     0,   262,   263,   264,   190,   191,   192,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     257,     0,     0,     0,     0,     0,     0,     0,   265,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   258,   259,
+      81,     0,     0,    82,     0,     0,    83,     0,    84,   407,
+       0,   348,   349,    65,    66,   350,     0,     0,     0,     0,
+      81,     0,     0,    82,     0,     0,    83,     0,    84,   467,
+      20,     0,    21,     0,   351,   352,   353,     0,     0,     0,
+       0,     0,     0,     0,     0,    81,   354,   355,    82,     0,
+       0,    83,     0,    84,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   356,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   317,   318,   348,
+     349,     0,     0,   350,   319,     0,   320,   163,   164,   165,
+     166,     0,   321,   322,   323,     0,     0,     0,     0,     0,
+       0,     0,   351,   352,   353,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   354,   355,     0,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+       0,     0,     0,     0,     0,     0,     0,   356,   357,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   260,     0,   261,   182,   183,
-     184,   185,   150,   262,   263,   264,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,     0,
-       0,     0,     0,   151,   152,     0,     0,   265,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   153,
-       0,     0,     0,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,   173,   174,   175,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   317,   318,     0,     0,     0,
+       0,     0,   319,     0,   320,   163,   164,   165,   166,     0,
+     321,   322,   323,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,     0,     0,
+       0,     0,     0,     0,    65,    66,   357,   117,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,     0,
+      79,    20,     0,    21,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   341,     0,     0,     0,
+       0,     0,     0,     0,     0,    65,    66,    80,   117,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+       0,    79,    20,     0,    21,    65,    66,     0,   117,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+       0,    79,    20,     0,    21,     0,     0,     0,    80,     0,
+       0,     0,     0,     0,     0,     0,     0,   423,     0,     0,
+       0,     0,     0,     0,     0,     0,    65,    66,    80,   117,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,     0,    79,    20,     0,    21,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   477,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    80,
+       0,     0,     0,    81,     0,     0,    82,     0,     0,    83,
+       0,    84,    65,    66,     0,    67,    68,    69,    70,    71,
+      72,    73,    74,    75,    76,    77,    78,     0,    79,    20,
+       0,    21,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    81,     0,     0,    82,     0,   402,
+      83,     0,    84,     0,     0,    80,     0,     0,     0,     0,
+       0,     0,     0,     0,    81,     0,     0,    82,     0,     0,
+      83,     0,    84,    65,    66,     0,   117,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,     0,    79,
+      20,     0,    21,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    81,     0,     0,    82,     0,
+       0,    83,     0,    84,    65,    66,    80,   117,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,     0,
+      79,    20,     0,    21,    65,    66,     0,   237,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,     0,
+      79,    20,     0,    21,     0,     0,     0,    80,     0,     0,
+       0,    81,     0,     0,    82,     0,     0,    83,     0,    84,
+       0,     0,     0,     0,     0,    65,    66,    80,   117,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+       0,    79,    20,     0,    21,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    80,     0,
+       0,     0,    81,     0,     0,    82,     0,     0,    83,     0,
+      84,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    81,     0,     0,    82,     0,     0,    83,
+       0,    84,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    81,     0,     0,    82,     0,     0,    83,
+       0,    84,     0,     0,     0,     0,   124,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     125,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     126,   127,     0,     0,    81,     0,     0,    82,     0,     0,
+      83,     0,   405,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,     0,     0,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   176,   177,   178,     0,     0,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185
 };
 
-static const short yycheck[] =
+static const short int yycheck[] =
 {
-      36,   100,   100,    82,    49,   221,   309,     3,    32,   120,
-      98,    10,    18,    49,    29,   522,   552,    10,    33,   153,
-     151,   237,   238,    51,    52,    53,    35,    36,   159,    37,
-     135,   567,   137,   138,     5,     6,     7,     8,     9,    10,
-      11,    12,   151,    71,   149,    41,   553,   126,    56,     4,
-     153,   157,   161,   132,   151,   159,   162,    56,   162,   162,
-      15,     0,    98,    56,   161,     5,     6,     7,     8,     9,
-      10,    11,    12,   151,   208,     0,    28,   151,    30,    61,
-     151,   159,   118,   119,    29,   121,   157,   161,    84,   150,
-     178,   151,    31,   181,    61,    34,   126,   157,   186,   187,
-     188,   189,   132,    42,    43,    44,    45,    46,    47,    48,
-     150,   101,   102,   103,   104,   105,   106,    30,   206,   207,
-      72,    73,    74,    62,    76,    77,    78,   117,   118,   119,
-     120,   236,   342,   343,   344,    18,   160,    25,    26,   150,
-     176,   177,   178,   179,   180,   181,   161,    45,   150,    47,
-     186,   187,   188,   189,   160,    51,   150,    27,    54,    55,
-     239,   240,   150,    28,   243,    30,   155,   203,   204,   205,
-     206,   207,    42,    43,    44,    45,    46,    47,    48,    49,
-      54,    55,    18,   124,   125,   153,   157,    57,   491,    18,
-     493,   407,    25,    26,   153,   137,   138,     5,     6,     7,
-       8,     9,    10,    11,    12,    30,   311,   149,    18,   245,
-      17,    18,    17,    18,   319,   320,   321,   157,    30,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,    30,   279,    17,    18,   156,   326,    17,
-      18,    17,    18,   279,    64,    65,    66,    67,    68,    69,
-      70,    17,    18,   156,   290,   366,   367,   368,   369,   370,
-      17,    18,   373,   374,   375,   376,   377,    17,    18,    17,
-      18,   307,    76,    77,   153,   380,   381,   382,    59,   324,
-     151,   360,    21,   388,    21,    21,   159,   151,   324,   325,
-     326,   154,    63,   153,   153,   400,   401,   153,   153,   153,
-     153,   153,   390,   153,   392,   393,   394,   153,   153,   151,
-     398,   151,   423,   424,   151,    39,   151,   155,    30,   430,
-     151,   151,    30,   151,   151,   151,    30,   151,   151,   151,
-      15,    15,   437,   438,    30,   154,   153,   442,   159,   444,
-     153,   155,   151,   448,    18,   151,    37,    39,   151,   454,
-     455,   456,   151,   151,   390,   391,   392,   393,   394,   151,
-     356,   151,   398,   399,   151,   476,   477,   478,   479,   311,
-     481,   482,   483,   484,   151,    18,   151,   319,   320,   321,
-     153,   151,   151,   419,   489,   490,   151,   151,   151,   151,
-     151,   496,   151,   151,    56,   151,    30,   151,   509,   510,
-     505,   153,   151,   154,   151,   151,   151,   151,    18,   445,
-     498,   499,   500,   155,   154,    15,   151,   151,   151,    56,
-      39,   151,   154,   522,   522,   461,   154,   532,   154,   154,
-     541,   154,   543,   544,   154,   157,   154,   154,   380,   381,
-     382,   154,   530,   157,   154,   550,   388,   154,   154,   485,
-      15,    15,   488,   151,   553,   553,    15,    15,   400,   401,
-     234,    41,   498,   499,   500,   104,   104,   258,   504,   104,
-     575,   576,   104,   259,   104,   580,    24,   420,   583,    48,
-      59,   236,   419,     3,    39,   578,   504,   445,    -1,   425,
-      -1,    -1,    -1,    -1,   530,   437,   438,    -1,    -1,    -1,
-     442,    -1,   444,    -1,    -1,    -1,   448,    -1,    -1,    -1,
-      -1,    -1,   454,   455,   456,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    -1,
-      -1,    19,    20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      28,    -1,    30,    -1,    -1,    -1,    -1,   489,   490,    -1,
-      -1,    -1,    -1,    -1,   496,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   505,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    -1,    -1,
-      19,    20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    28,
-     532,    30,    -1,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    -1,   550,    19,
-      20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    28,    -1,
-      30,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   575,   576,    -1,    -1,    -1,   580,    -1,
-      -1,   583,    -1,    -1,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    -1,    -1,
-      19,    20,    -1,    -1,   152,    -1,    -1,   155,    -1,    28,
-     158,    30,   160,   161,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    40,    -1,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    -1,    -1,    19,
-      20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    28,    -1,
-      30,    -1,    -1,   152,    -1,    -1,   155,    -1,    -1,   158,
-      40,   160,   161,    -1,    -1,    -1,    -1,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    -1,   152,    19,    20,   155,    -1,    -1,   158,    -1,
-     160,   161,    28,    -1,    30,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    -1,
-      -1,    19,    20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      28,    -1,    30,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    40,   152,    -1,    -1,   155,    -1,    -1,   158,
-      -1,   160,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    -1,    -1,    19,    20,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    28,    -1,    30,
-      -1,    -1,   152,    -1,    -1,   155,    -1,    -1,   158,    40,
-     160,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    -1,    -1,    19,    20,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    28,    -1,    30,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   152,    -1,    -1,   155,
-      -1,   157,   158,    -1,   160,    -1,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      -1,    -1,    19,    20,   152,    -1,    -1,   155,    -1,    -1,
-     158,    28,   160,    30,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    -1,    -1,
-      19,    20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    28,
-      -1,    30,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   152,    -1,    -1,   155,    -1,    -1,   158,    -1,   160,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    -1,    -1,    19,    20,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    28,    -1,    30,    -1,    -1,
-     152,    -1,    -1,   155,    -1,    -1,   158,    -1,   160,    -1,
+      37,   125,   130,   130,   128,   282,    53,     4,    23,   305,
+     306,     3,   111,   222,   131,    30,    53,    34,     0,    15,
+      15,    29,    52,    53,    54,   234,    84,   325,   326,   159,
+     239,   240,    32,    33,   164,   159,    55,    56,   162,   335,
+      57,    71,   251,   167,   168,   169,   170,   171,   172,    41,
+      10,    11,    12,    13,    14,    15,    16,    17,   116,   357,
+     557,    57,    57,    61,   122,   189,   190,     9,   153,   576,
+      23,   108,   109,   110,   155,   284,   193,   152,   163,    21,
+     577,   588,   153,   164,   155,   294,   295,   296,   125,    20,
+      61,   128,   163,   164,    86,    10,    11,    12,    13,    14,
+      15,    16,    17,   153,    55,    56,    57,   405,   153,   159,
+      41,    42,    43,    44,    45,    46,    47,   153,   163,    50,
+     157,   158,   159,   160,   161,   162,   153,   163,    24,   153,
+     167,   168,   169,   170,   171,   172,   163,   161,   161,   153,
+     153,   164,   152,    45,     0,    47,   159,   161,   163,   186,
+     187,   188,   189,   190,   162,     4,   365,   366,   367,   104,
+     105,   457,   116,   152,   373,   162,   224,   225,   122,    25,
+     228,    22,   152,    24,   152,    31,   152,   301,   387,   388,
+      27,    28,     3,     4,   157,    41,    42,    43,    44,    45,
+      46,    47,   155,   230,     3,     4,     3,     4,     4,   159,
+       3,     4,     3,     4,     4,   252,    62,    77,    78,   155,
+      24,   488,    24,   490,     4,   252,    64,    65,    66,    67,
+      68,    69,    70,   432,   158,   434,   263,    24,   158,   438,
+     155,    59,     4,     4,     4,     4,     4,   446,   447,   448,
+       7,     7,     7,   280,   159,   161,   153,   156,   153,   153,
+     153,   375,   299,   377,   378,   379,   157,    36,   153,   153,
+     153,   385,   299,   300,   301,    10,    11,    12,    13,    14,
+      15,    16,    17,   153,   483,   484,   153,   486,   487,   153,
+     153,   153,    24,    24,   493,   153,   155,    63,   346,   155,
+     155,   155,   155,   502,   155,   155,   155,   155,   397,   398,
+     399,   400,   401,   155,   161,   155,   239,   240,   153,   153,
+     156,   410,   411,   412,   413,   414,   153,   153,   251,   157,
+     153,   153,   153,   153,    34,    24,   535,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,   155,   375,   376,
+     377,   378,   379,   380,   381,    21,    21,   405,   385,   386,
+     342,   284,     4,   155,   153,   153,    24,   153,   153,   458,
+     459,   294,   295,   296,   153,   574,   465,   153,   155,     4,
+     153,   495,   496,   497,    36,   153,   153,   161,   153,   153,
+     589,   161,     4,    57,   421,    24,    57,   596,    21,   153,
+     153,   600,   601,   153,   153,   153,   153,   153,   435,   153,
+     153,   156,   153,    21,    36,   157,   156,   156,   156,   533,
+     509,   510,   511,   512,   153,   159,   453,   516,   517,   518,
+     519,    27,    28,   153,   153,   156,   159,   153,   156,   557,
+     557,   156,   365,   366,   367,   156,   156,   156,   156,   156,
+     373,   156,   541,   542,   156,    21,   153,    21,   485,   577,
+     577,    21,    96,    96,   387,   388,    96,    41,   495,   496,
+     497,    25,   317,   422,   501,   318,   565,    96,   567,   568,
+      96,    52,   421,    61,     3,   222,    19,   595,   435,   501,
+      -1,   460,    -1,   520,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   533,    -1,    -1,   432,
+      -1,   434,    -1,    -1,    -1,   438,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   446,   447,   448,    -1,    -1,    -1,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,     5,     6,    -1,    -1,    -1,    -1,    -1,    -1,
+     483,   484,    -1,   486,   487,    -1,    -1,    -1,    -1,    22,
+     493,    24,    -1,    26,    -1,    -1,    20,    -1,    22,   502,
+      24,    -1,    -1,    -1,    -1,    38,    39,    31,    32,    33,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    41,    42,    43,
+      44,    45,    46,    47,    -1,    -1,    50,    51,    -1,    -1,
+      -1,    -1,   535,    -1,    58,    -1,    -1,    -1,    62,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,    -1,    -1,
+      -1,   574,    -1,   106,    -1,   108,   109,   110,   111,   112,
+      -1,   114,   115,   116,    -1,    -1,   589,    -1,    -1,    -1,
+      -1,    -1,    -1,   596,    -1,    -1,    -1,   600,   601,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,    -1,
+      -1,    -1,    -1,    -1,   157,    -1,    -1,   160,    -1,   162,
+       5,     6,   165,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    -1,    21,    22,    -1,    24,
+       5,     6,    -1,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    -1,    21,    22,    -1,    24,
+      -1,     5,     6,    48,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    -1,    21,    22,    -1,
+      24,     5,     6,    48,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    -1,    21,    22,    -1,
+      24,    -1,    -1,    -1,    48,    -1,     5,     6,    -1,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    -1,    21,    22,    48,    24,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    37,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    19,    20,    -1,    22,    23,    24,    -1,    -1,
-      -1,    28,    -1,    30,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   152,    -1,    -1,   155,    -1,
-      -1,   158,    -1,   160,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   154,
+      -1,    -1,   157,    -1,    -1,   160,    -1,   162,   163,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   154,
+      -1,    -1,   157,    -1,    -1,   160,    -1,   162,   163,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   152,    -1,    -1,   155,    -1,    -1,   158,
-      -1,   160,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   152,
-      -1,    -1,   155,    -1,    -1,   158,    -1,   160,    -1,   126,
-      -1,   128,   129,   130,   131,   132,    -1,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,    -1,    -1,    -1,    -1,    -1,   155,    -1,
-      -1,   158,    -1,   160,    -1,    -1,   163,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    -1,    28,    -1,
-      30,    -1,    27,    28,    -1,    30,    -1,    -1,    -1,    34,
-      35,    36,    -1,    -1,    -1,    -1,    -1,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    -1,    -1,    -1,    -1,
-      -1,    61,    57,    58,    -1,    -1,    -1,    62,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    79,
-      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,    -1,    -1,    -1,    -1,    -1,    17,    18,    -1,    -1,
-      21,    22,    23,    24,    25,    26,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   126,    -1,   128,   129,
-     130,   131,   132,    -1,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
-      61,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   158,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     154,    -1,    -1,   157,    -1,    -1,   160,    -1,   162,   163,
+      -1,     3,     4,     5,     6,     7,    -1,    -1,    -1,    -1,
+     154,    -1,    -1,   157,    -1,    -1,   160,    -1,   162,   163,
+      22,    -1,    24,    -1,    26,    27,    28,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   154,    38,    39,   157,    -1,
+      -1,   160,    -1,   162,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
+      92,    93,    94,    95,    96,    97,    98,    99,   100,     3,
+       4,    -1,    -1,     7,   106,    -1,   108,   109,   110,   111,
+     112,    -1,   114,   115,   116,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    26,    27,    28,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    38,    39,    -1,   139,   140,   141,
+     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,   160,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   126,    -1,   128,   129,   130,
-     131,   132,    38,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,    -1,
-      -1,    -1,    -1,    59,    60,    -1,    -1,   158,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,
-      -1,    -1,    -1,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,    -1,    -1,    -1,
+      -1,    -1,   106,    -1,   108,   109,   110,   111,   112,    -1,
+     114,   115,   116,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   121,   122,   123,    -1,    -1,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149
+      -1,    -1,    -1,    -1,    -1,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,    -1,    -1,
+      -1,    -1,    -1,    -1,     5,     6,   160,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    -1,
+      21,    22,    -1,    24,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    37,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,     5,     6,    48,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      -1,    21,    22,    -1,    24,     5,     6,    -1,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      -1,    21,    22,    -1,    24,    -1,    -1,    -1,    48,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    37,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     5,     6,    48,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    -1,    21,    22,    -1,    24,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    37,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,
+      -1,    -1,    -1,   154,    -1,    -1,   157,    -1,    -1,   160,
+      -1,   162,     5,     6,    -1,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    -1,    21,    22,
+      -1,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   154,    -1,    -1,   157,    -1,   159,
+     160,    -1,   162,    -1,    -1,    48,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   154,    -1,    -1,   157,    -1,    -1,
+     160,    -1,   162,     5,     6,    -1,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    -1,    21,
+      22,    -1,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   154,    -1,    -1,   157,    -1,
+      -1,   160,    -1,   162,     5,     6,    48,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    -1,
+      21,    22,    -1,    24,     5,     6,    -1,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    -1,
+      21,    22,    -1,    24,    -1,    -1,    -1,    48,    -1,    -1,
+      -1,   154,    -1,    -1,   157,    -1,    -1,   160,    -1,   162,
+      -1,    -1,    -1,    -1,    -1,     5,     6,    48,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      -1,    21,    22,    -1,    24,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,
+      -1,    -1,   154,    -1,    -1,   157,    -1,    -1,   160,    -1,
+     162,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   154,    -1,    -1,   157,    -1,    -1,   160,
+      -1,   162,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   154,    -1,    -1,   157,    -1,    -1,   160,
+      -1,   162,    -1,    -1,    -1,    -1,    35,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      49,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      59,    60,    -1,    -1,   154,    -1,    -1,   157,    -1,    -1,
+     160,    -1,   162,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,    -1,    -1,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const unsigned char yystos[] =
 {
-       0,   198,   199,   201,     0,    31,    34,    42,    43,    44,
-      45,    46,    47,    48,    62,   179,   214,   216,   218,    28,
-      30,    50,    58,    62,   178,   207,   218,   219,    61,    64,
-      65,    66,    67,    68,    69,    70,   180,   212,    29,   225,
-     226,   227,    51,    52,    53,    71,   204,   150,    61,    27,
-      45,    47,    49,    57,   179,   200,   150,    45,    47,   217,
-      30,   202,    18,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    19,    20,   152,
-     155,   158,   160,   165,   187,   188,   189,   190,   191,   207,
-     222,    32,   160,   213,    33,   161,   215,   226,    72,    73,
-      74,    76,    77,    78,   178,   228,   229,   231,   150,   150,
-     150,   150,   155,   205,   202,   187,    35,    36,   197,   197,
-     197,   197,   212,    18,    18,    18,   160,     3,   161,   191,
-     192,   207,   153,   162,     3,   189,   224,     4,    15,     5,
-       6,     7,     8,     9,    10,    11,    12,   174,   175,   176,
-      38,    59,    60,    75,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   121,   122,   123,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   167,   168,   169,   172,   173,   235,   236,
-     238,   239,    30,    54,    55,   203,    18,    30,    30,   206,
-     189,   189,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,   174,   175,   177,   189,   194,   189,   156,
-     156,   161,   192,   151,   161,   153,    40,   192,   193,    17,
-      18,    21,    22,    23,    24,    25,    26,    61,    99,   100,
-     126,   128,   134,   135,   136,   158,   167,   168,   169,   172,
-     173,   195,   221,   222,   223,   223,   223,   223,    59,   180,
-     101,   102,   103,   104,   105,   106,   117,   118,   119,   120,
-     170,    25,    26,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   171,   189,   189,
-     224,   189,   189,   232,   224,   224,   224,   224,   224,   189,
-     189,   189,   224,   224,   180,   124,   125,   151,   157,   151,
-     185,   185,    25,    26,    17,    18,   166,   166,    21,    22,
-      23,    24,   155,   158,   160,   163,   195,   222,   185,   185,
-     191,   191,   159,   161,   191,    40,   189,   209,   210,   211,
-     151,   154,    63,   220,   170,   171,   153,   153,   153,   153,
-     153,   194,   196,   153,   153,   153,   153,   153,   151,   151,
-     187,   189,   189,   151,   182,   151,   182,   223,   155,   151,
-     151,   151,   151,   151,   151,   223,   223,   223,   151,    39,
-     187,   189,   224,    30,    37,    56,   183,   186,   157,   196,
-     196,   161,   196,    30,   157,   159,   159,   207,   208,   151,
-     154,    40,    30,   153,   153,   194,   194,   194,   194,   194,
-     151,   159,   194,   194,   194,   194,   194,    15,    15,   223,
-     223,   223,    10,    56,    10,   151,   237,   223,   155,   224,
-     189,   224,   224,   224,   151,   151,   151,   224,   189,   223,
-     223,   151,    30,    18,   185,   157,   159,   161,    40,   209,
-     183,   184,   151,   194,   194,   237,   151,   151,   151,   151,
-     194,   151,   151,   151,   151,    39,   223,   223,   153,   151,
-     151,   223,    18,   223,   224,   233,   151,   223,   151,   151,
-     151,   223,   223,   223,   153,   189,    56,   181,    30,   151,
-     151,   154,   194,   194,   194,   194,   194,   194,   194,   194,
-     189,   151,   155,   233,   234,   223,   223,   151,   182,   182,
-     151,   223,   151,   224,   224,   224,   234,   223,    18,   194,
-     194,   151,   154,   151,   151,   154,   154,   154,   154,   154,
-      15,   157,   176,   230,   154,   224,   157,   223,   154,   154,
-     154,   194,   194,   194,   223,   221,   157,   176,    39,   157,
-     154,   154,   154,   151,   221,    15,    15,   151,   223,   223,
-      15,   228,   223,    15,   223
+       0,   200,   201,   202,     0,    25,    31,    41,    42,    43,
+      44,    45,    46,    47,    62,   181,   219,   221,   223,   230,
+      22,    24,    51,    58,    62,   180,   212,   223,   224,    61,
+      64,    65,    66,    67,    68,    69,    70,   182,   217,    23,
+     231,   232,    30,   163,   220,   231,    52,    53,    54,    71,
+     209,   152,    61,    20,    45,    47,    50,   181,   152,    45,
+      47,   222,    24,   207,     4,     5,     6,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    21,
+      48,   154,   157,   160,   162,   167,   189,   190,   191,   192,
+     193,   212,   227,    29,   162,   218,   180,   236,   152,   152,
+     152,   152,   157,   210,   207,   189,    32,    33,   199,   199,
+     199,   199,   217,     4,     4,     4,   162,     8,   163,   193,
+     194,   212,   155,   164,    35,    49,    59,    60,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   169,   170,   171,   174,
+     175,   233,   234,   240,   241,   243,   244,    24,    55,    56,
+     208,     4,    24,    24,   211,   191,   191,   191,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,   176,
+     177,   179,   191,   196,   158,   158,   163,   194,   153,   163,
+     155,    37,   194,   195,   191,   229,    59,     8,   229,     9,
+      21,    10,    11,    12,    13,    14,    15,    16,    17,   176,
+     177,   178,   182,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   172,    27,    28,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     173,   191,   191,   229,   191,   191,   237,   229,   229,   229,
+     229,   229,   229,   229,   191,   191,   191,   229,   229,   182,
+     104,   105,   153,   159,   205,   206,   204,    27,    28,     3,
+       4,   168,     4,     7,    26,    38,    39,    99,   100,   106,
+     108,   114,   115,   116,   157,   160,   162,   165,   169,   170,
+     171,   174,   175,   197,   227,   203,   193,   193,   161,   163,
+     193,    37,   191,   214,   215,   216,   153,   156,     3,     4,
+       7,    26,    27,    28,    38,    39,    61,   160,   197,   226,
+     227,   228,   228,   228,   228,   189,   191,   191,   153,   184,
+     153,   184,   228,   157,   153,   153,   153,   153,   153,   153,
+     153,   153,   228,   228,   228,   153,    36,   189,   191,   229,
+      24,   153,   187,   187,   187,   172,   173,   155,   155,   155,
+     155,   155,   159,   196,   198,   162,   198,   163,   198,    24,
+     155,   155,   155,   155,   155,   187,   159,   161,   161,   212,
+     213,   153,   156,    37,    63,   225,   198,   153,   153,   228,
+     228,   228,    15,    57,    15,   153,   242,   228,   157,   229,
+     191,   229,   229,   229,   191,   191,   153,   153,   153,   229,
+     191,   228,   228,   153,    34,    57,   185,   188,   155,   155,
+     196,   196,   196,   196,   196,   153,   159,   163,   193,   198,
+     161,   163,   196,   196,   196,   196,   196,    37,   214,   185,
+     186,    24,   161,    21,    21,   155,   153,   153,   228,     4,
+     228,   229,   238,   153,   228,   153,   153,   153,   228,   228,
+     228,   155,   191,    24,     4,   187,   196,   196,   242,   153,
+     153,   153,   153,   196,   161,   163,   153,   153,   153,   153,
+      36,    57,   183,   153,   228,   228,   238,   239,   228,   228,
+     153,   184,   184,   153,   228,   153,   229,   229,   229,   239,
+     228,   153,   153,   156,   196,   196,   196,   196,   161,   196,
+     196,   196,   196,   191,     4,    24,   153,   157,   156,   229,
+     159,   228,   156,   196,   196,   153,   156,   153,   153,   156,
+     156,   156,   156,   156,    21,   159,   178,   235,    36,   159,
+     156,   156,   196,   196,   196,   228,   226,   159,   178,    21,
+     156,   156,   156,   153,   226,   228,    21,   153,   233,   228,
+      21,    21,   228,   228
 };
 
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
-#endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
-#endif
-#if ! defined (YYSIZE_T)
-# if defined (__STDC__) || defined (__cplusplus)
-#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYSIZE_T size_t
-# endif
-#endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
-#endif
-
 #define yyerrok		(yyerrstatus = 0)
 #define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		-2
+#define YYEMPTY		(-2)
 #define YYEOF		0
 
 #define YYACCEPT	goto yyacceptlab
 #define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrlab1
+#define YYERROR		goto yyerrorlab
+
 
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
@@ -2413,34 +3047,71 @@
     {								\
       yychar = (Token);						\
       yylval = (Value);						\
-      yychar1 = YYTRANSLATE (yychar);				\
+      yytoken = YYTRANSLATE (yychar);				\
       YYPOPSTACK;						\
       goto yybackup;						\
     }								\
   else								\
-    { 								\
-      yyerror ("syntax error: cannot back up");			\
+    {								\
+      yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;							\
     }								\
 while (0)
 
+
 #define YYTERROR	1
 #define YYERRCODE	256
 
-/* YYLLOC_DEFAULT -- Compute the default location (before the actions
-   are run).  */
 
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
 #ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)           \
-  Current.first_line   = Rhs[1].first_line;      \
-  Current.first_column = Rhs[1].first_column;    \
-  Current.last_line    = Rhs[N].last_line;       \
-  Current.last_column  = Rhs[N].last_column;
+# define YYLLOC_DEFAULT(Current, Rhs, N)				\
+    do									\
+      if (N)								\
+	{								\
+	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
+	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
+	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
+	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
+	}								\
+      else								\
+	{								\
+	  (Current).first_line   = (Current).last_line   =		\
+	    YYRHSLOC (Rhs, 0).last_line;				\
+	  (Current).first_column = (Current).last_column =		\
+	    YYRHSLOC (Rhs, 0).last_column;				\
+	}								\
+    while (0)
 #endif
 
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)			\
+     fprintf (File, "%d.%d-%d.%d",			\
+              (Loc).first_line, (Loc).first_column,	\
+              (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
 /* YYLEX -- calling `yylex' with the right arguments.  */
 
-#define YYLEX	yylex ()
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -2455,19 +3126,86 @@
   if (yydebug)					\
     YYFPRINTF Args;				\
 } while (0)
-# define YYDSYMPRINT(Args)			\
-do {						\
-  if (yydebug)					\
-    yysymprint Args;				\
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
+do {								\
+  if (yydebug)							\
+    {								\
+      YYFPRINTF (stderr, "%s ", Title);				\
+      yysymprint (stderr,					\
+                  Type, Value);	\
+      YYFPRINTF (stderr, "\n");					\
+    }								\
 } while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short int *bottom;
+    short int *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
+             yyrule - 1, yylno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (Rule);		\
+} while (0)
+
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !YYDEBUG */
 # define YYDPRINTF(Args)
-# define YYDSYMPRINT(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
 #endif /* !YYDEBUG */
 
+
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef	YYINITDEPTH
 # define YYINITDEPTH 200
@@ -2477,13 +3215,9 @@
    if the built-in stack extension method is used).
 
    Do not make this value too large; the results are undefined if
-   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
    evaluated with infinite-precision integer arithmetic.  */
 
-#if YYMAXDEPTH == 0
-# undef YYMAXDEPTH
-#endif
-
 #ifndef YYMAXDEPTH
 # define YYMAXDEPTH 10000
 #endif
@@ -2505,7 +3239,7 @@
      const char *yystr;
 #   endif
 {
-  register const char *yys = yystr;
+  const char *yys = yystr;
 
   while (*yys++ != '\0')
     continue;
@@ -2530,8 +3264,8 @@
      const char *yysrc;
 #   endif
 {
-  register char *yyd = yydest;
-  register const char *yys = yysrc;
+  char *yyd = yydest;
+  const char *yys = yysrc;
 
   while ((*yyd++ = *yys++) != '\0')
     continue;
@@ -2541,124 +3275,186 @@
 #  endif
 # endif
 
-#endif /* !YYERROR_VERBOSE */
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      size_t yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+	switch (*++yyp)
+	  {
+	  case '\'':
+	  case ',':
+	    goto do_not_strip_quotes;
+
+	  case '\\':
+	    if (*++yyp != '\\')
+	      goto do_not_strip_quotes;
+	    /* Fall through.  */
+	  default:
+	    if (yyres)
+	      yyres[yyn] = *yyp;
+	    yyn++;
+	    break;
+
+	  case '"':
+	    if (yyres)
+	      yyres[yyn] = '\0';
+	    return yyn;
+	  }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+#endif /* YYERROR_VERBOSE */
 
 
 
 #if YYDEBUG
-/*-----------------------------.
-| Print this symbol on YYOUT.  |
-`-----------------------------*/
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
 
-static void
 #if defined (__STDC__) || defined (__cplusplus)
-yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
 #else
-yysymprint (yyout, yytype, yyvalue)
-    FILE* yyout;
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
     int yytype;
-    YYSTYPE yyvalue;
+    YYSTYPE *yyvaluep;
 #endif
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvalue;
+  (void) yyvaluep;
 
   if (yytype < YYNTOKENS)
-    {
-      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
-# ifdef YYPRINT
-      YYPRINT (yyout, yytoknum[yytype], yyvalue);
-# endif
-    }
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
   else
-    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
 
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
   switch (yytype)
     {
       default:
         break;
     }
-  YYFPRINTF (yyout, ")");
+  YYFPRINTF (yyoutput, ")");
 }
-#endif /* YYDEBUG. */
-
 
+#endif /* ! YYDEBUG */
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-static void
 #if defined (__STDC__) || defined (__cplusplus)
-yydestruct (int yytype, YYSTYPE yyvalue)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
 #else
-yydestruct (yytype, yyvalue)
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
     int yytype;
-    YYSTYPE yyvalue;
+    YYSTYPE *yyvaluep;
 #endif
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvalue;
+  (void) yyvaluep;
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 
   switch (yytype)
     {
+
       default:
         break;
     }
 }
-
 
 
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
-   into yyparse.  The argument should have type void *.
-   It should actually point to an object.
-   Grammar actions can access the variable by casting it
-   to the proper pointer type.  */
+/* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
 # if defined (__STDC__) || defined (__cplusplus)
-#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL
+int yyparse (void *YYPARSE_PARAM);
 # else
-#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+int yyparse ();
 # endif
-#else /* !YYPARSE_PARAM */
-# define YYPARSE_PARAM_ARG
-# define YYPARSE_PARAM_DECL
-#endif /* !YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes.  */
-#ifdef __GNUC__
-# ifdef YYPARSE_PARAM
-int yyparse (void *);
-# else
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int yyparse (void);
-# endif
+#else
+int yyparse ();
 #endif
+#endif /* ! YYPARSE_PARAM */
+
 
 
-/* The lookahead symbol.  */
+/* The look-ahead symbol.  */
 int yychar;
 
-/* The semantic value of the lookahead symbol.  */
+/* The semantic value of the look-ahead symbol.  */
 YYSTYPE yylval;
 
-/* Number of parse errors so far.  */
+/* Number of syntax errors so far.  */
 int yynerrs;
 
 
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int
-yyparse (YYPARSE_PARAM_ARG)
-     YYPARSE_PARAM_DECL
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
 {
   
-  register int yystate;
-  register int yyn;
+  int yystate;
+  int yyn;
   int yyresult;
   /* Number of tokens to shift before error messages enabled.  */
   int yyerrstatus;
-  /* Lookahead token as an internal (translated) token number.  */
-  int yychar1 = 0;
+  /* Look-ahead token as an internal (translated) token number.  */
+  int yytoken = 0;
 
   /* Three stacks and their tools:
      `yyss': related to states,
@@ -2669,14 +3465,14 @@
      to reallocate them elsewhere.  */
 
   /* The state stack.  */
-  short	yyssa[YYINITDEPTH];
-  short *yyss = yyssa;
-  register short *yyssp;
+  short int yyssa[YYINITDEPTH];
+  short int *yyss = yyssa;
+  short int *yyssp;
 
   /* The semantic value stack.  */
   YYSTYPE yyvsa[YYINITDEPTH];
   YYSTYPE *yyvs = yyvsa;
-  register YYSTYPE *yyvsp;
+  YYSTYPE *yyvsp;
 
 
 
@@ -2722,7 +3518,7 @@
  yysetstate:
   *yyssp = yystate;
 
-  if (yyssp >= yyss + yystacksize - 1)
+  if (yyss + yystacksize - 1 <= yyssp)
     {
       /* Get the current used size of the three stacks, in elements.  */
       YYSIZE_T yysize = yyssp - yyss + 1;
@@ -2733,14 +3529,14 @@
 	   these so that the &'s don't force the real ones into
 	   memory.  */
 	YYSTYPE *yyvs1 = yyvs;
-	short *yyss1 = yyss;
+	short int *yyss1 = yyss;
 
 
 	/* Each stack pointer address is followed by the size of the
 	   data in use in that stack, in bytes.  This used to be a
 	   conditional around just the two extra args, but that might
 	   be undefined if yyoverflow is a macro.  */
-	yyoverflow ("parser stack overflow",
+	yyoverflow (YY_("memory exhausted"),
 		    &yyss1, yysize * sizeof (*yyssp),
 		    &yyvs1, yysize * sizeof (*yyvsp),
 
@@ -2751,21 +3547,21 @@
       }
 #else /* no yyoverflow */
 # ifndef YYSTACK_RELOCATE
-      goto yyoverflowlab;
+      goto yyexhaustedlab;
 # else
       /* Extend the stack our own way.  */
-      if (yystacksize >= YYMAXDEPTH)
-	goto yyoverflowlab;
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyexhaustedlab;
       yystacksize *= 2;
-      if (yystacksize > YYMAXDEPTH)
+      if (YYMAXDEPTH < yystacksize)
 	yystacksize = YYMAXDEPTH;
 
       {
-	short *yyss1 = yyss;
+	short int *yyss1 = yyss;
 	union yyalloc *yyptr =
 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 	if (! yyptr)
-	  goto yyoverflowlab;
+	  goto yyexhaustedlab;
 	YYSTACK_RELOCATE (yyss);
 	YYSTACK_RELOCATE (yyvs);
 
@@ -2783,7 +3579,7 @@
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 		  (unsigned long int) yystacksize));
 
-      if (yyssp >= yyss + yystacksize - 1)
+      if (yyss + yystacksize - 1 <= yyssp)
 	YYABORT;
     }
 
@@ -2797,50 +3593,39 @@
 yybackup:
 
 /* Do appropriate processing given the current state.  */
-/* Read a lookahead token if we need one and don't already have one.  */
+/* Read a look-ahead token if we need one and don't already have one.  */
 /* yyresume: */
 
-  /* First try to decide what to do without reference to lookahead token.  */
+  /* First try to decide what to do without reference to look-ahead token.  */
 
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
 
-  /* Not known => get a lookahead token if don't already have one.  */
-
-  /* yychar is either YYEMPTY or YYEOF
-     or a valid token in external form.  */
+  /* Not known => get a look-ahead token if don't already have one.  */
 
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
       yychar = YYLEX;
     }
 
-  /* Convert token to internal form (in yychar1) for indexing tables with.  */
-
-  if (yychar <= 0)		/* This means end of input.  */
+  if (yychar <= YYEOF)
     {
-      yychar1 = 0;
-      yychar = YYEOF;		/* Don't call YYLEX any more.  */
-
+      yychar = yytoken = YYEOF;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
   else
     {
-      yychar1 = YYTRANSLATE (yychar);
-
-      /* We have to keep this `#if YYDEBUG', since we use variables
-	 which are defined only if `YYDEBUG' is set.  */
-      YYDPRINTF ((stderr, "Next token is "));
-      YYDSYMPRINT ((stderr, yychar1, yylval));
-      YYDPRINTF ((stderr, "\n"));
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
     }
 
-  /* If the proper action on seeing token YYCHAR1 is to reduce or to
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
      detect an error, take that action.  */
-  yyn += yychar1;
-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
     goto yydefault;
   yyn = yytable[yyn];
   if (yyn <= 0)
@@ -2854,9 +3639,8 @@
   if (yyn == YYFINAL)
     YYACCEPT;
 
-  /* Shift the lookahead token.  */
-  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
-	      yychar, yytname[yychar1]));
+  /* Shift the look-ahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 
   /* Discard the token being shifted unless it is eof.  */
   if (yychar != YYEOF)
@@ -2902,1696 +3686,2439 @@
   yyval = yyvsp[1-yylen];
 
 
-
-#if YYDEBUG
-  /* We have to keep this `#if YYDEBUG', since we use variables which
-     are defined only if `YYDEBUG' is set.  */
-  if (yydebug)
-    {
-      int yyi;
-
-      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
-		 yyn - 1, yyrline[yyn]);
-
-      /* Print the symbols being reduced, and their result.  */
-      for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
-	YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
-    }
-#endif
+  YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
-        case 81:
-#line 1061 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+        case 3:
+#line 1608 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.String = yyvsp[-1].String;
-  }
+    if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX)     // Outside of my range!
+      error("Value too large for type");
+    (yyval.SIntVal) = (int32_t)(yyvsp[0].UIntVal);
+  ;}
+    break;
+
+  case 5:
+#line 1617 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if ((yyvsp[0].UInt64Val) > (uint64_t)INT64_MAX)     // Outside of my range!
+      error("Value too large for type");
+    (yyval.SInt64Val) = (int64_t)(yyvsp[0].UInt64Val);
+  ;}
+    break;
+
+  case 26:
+#line 1639 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_EQ; ;}
+    break;
+
+  case 27:
+#line 1639 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_NE; ;}
+    break;
+
+  case 28:
+#line 1640 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_SLT; ;}
+    break;
+
+  case 29:
+#line 1640 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_SGT; ;}
+    break;
+
+  case 30:
+#line 1641 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_SLE; ;}
+    break;
+
+  case 31:
+#line 1641 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_SGE; ;}
+    break;
+
+  case 32:
+#line 1642 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_ULT; ;}
+    break;
+
+  case 33:
+#line 1642 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_UGT; ;}
+    break;
+
+  case 34:
+#line 1643 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_ULE; ;}
+    break;
+
+  case 35:
+#line 1643 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.IPred) = ICmpInst::ICMP_UGE; ;}
+    break;
+
+  case 36:
+#line 1647 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_OEQ; ;}
+    break;
+
+  case 37:
+#line 1647 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_ONE; ;}
+    break;
+
+  case 38:
+#line 1648 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_OLT; ;}
+    break;
+
+  case 39:
+#line 1648 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_OGT; ;}
+    break;
+
+  case 40:
+#line 1649 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_OLE; ;}
+    break;
+
+  case 41:
+#line 1649 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_OGE; ;}
+    break;
+
+  case 42:
+#line 1650 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_ORD; ;}
+    break;
+
+  case 43:
+#line 1650 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_UNO; ;}
+    break;
+
+  case 44:
+#line 1651 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_UEQ; ;}
+    break;
+
+  case 45:
+#line 1651 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_UNE; ;}
+    break;
+
+  case 46:
+#line 1652 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_ULT; ;}
+    break;
+
+  case 47:
+#line 1652 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_UGT; ;}
+    break;
+
+  case 48:
+#line 1653 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_ULE; ;}
+    break;
+
+  case 49:
+#line 1653 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_UGE; ;}
+    break;
+
+  case 50:
+#line 1654 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_TRUE; ;}
+    break;
+
+  case 51:
+#line 1655 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.FPred) = FCmpInst::FCMP_FALSE; ;}
+    break;
+
+  case 81:
+#line 1686 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.StrVal) = (yyvsp[-1].StrVal);
+  ;}
     break;
 
   case 82:
-#line 1064 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1689 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.String = new std::string(""); 
-  }
+    (yyval.StrVal) = 0;
+  ;}
+    break;
+
+  case 83:
+#line 1694 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
+    break;
+
+  case 84:
+#line 1695 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
+    break;
+
+  case 85:
+#line 1696 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
+    break;
+
+  case 86:
+#line 1697 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
+    break;
+
+  case 87:
+#line 1698 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
+    break;
+
+  case 88:
+#line 1699 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
+    break;
+
+  case 89:
+#line 1700 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
     break;
 
   case 90:
-#line 1071 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(""); }
+#line 1701 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
+    break;
+
+  case 91:
+#line 1705 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = CallingConv::C; ;}
+    break;
+
+  case 92:
+#line 1706 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = CallingConv::C; ;}
+    break;
+
+  case 93:
+#line 1707 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = CallingConv::CSRet; ;}
+    break;
+
+  case 94:
+#line 1708 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = CallingConv::Fast; ;}
+    break;
+
+  case 95:
+#line 1709 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = CallingConv::Cold; ;}
+    break;
+
+  case 96:
+#line 1710 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = CallingConv::X86_StdCall; ;}
     break;
 
   case 97:
-#line 1076 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { 
-    *yyvsp[-1].String += *yyvsp[0].String; 
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-1].String; 
-    }
+#line 1711 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = CallingConv::X86_FastCall; ;}
     break;
 
   case 98:
-#line 1081 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(""); }
+#line 1712 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val))
+      error("Calling conv too large");
+    (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+  ;}
     break;
 
   case 99:
-#line 1086 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+#line 1722 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = 0; ;}
     break;
 
   case 100:
-#line 1087 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { *yyvsp[-1].String += " " + *yyvsp[0].String; delete yyvsp[0].String; yyval.String = yyvsp[-1].String; }
+#line 1723 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+    if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
+      error("Alignment must be a power of two");
+  ;}
     break;
 
   case 101:
-#line 1090 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+#line 1731 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = 0; ;}
     break;
 
   case 102:
-#line 1091 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { 
-    yyvsp[-1].String->insert(0, ", "); 
-    *yyvsp[-1].String += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-1].String;
-  }
+#line 1732 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+    if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
+      error("Alignment must be a power of two");
+  ;}
     break;
 
   case 103:
-#line 1099 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { 
-    *yyvsp[-1].String += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-1].String;
-  }
+#line 1740 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i)
+      if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\')
+        error("Invalid character in section name");
+    (yyval.StrVal) = (yyvsp[0].StrVal);
+  ;}
     break;
 
   case 104:
-#line 1105 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+#line 1749 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.StrVal) = 0; ;}
+    break;
+
+  case 105:
+#line 1750 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.StrVal) = (yyvsp[0].StrVal); ;}
     break;
 
   case 106:
-#line 1109 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+#line 1757 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {;}
     break;
 
   case 107:
-#line 1110 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1758 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {;}
+    break;
+
+  case 108:
+#line 1762 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-      yyvsp[-1].String->insert(0, ", ");
-      if (!yyvsp[0].String->empty())
-        *yyvsp[-1].String += " " + *yyvsp[0].String;
-      delete yyvsp[0].String;
-      yyval.String = yyvsp[-1].String;
-    }
+    CurGV->setSection((yyvsp[0].StrVal));
+    free((yyvsp[0].StrVal));
+  ;}
     break;
 
   case 109:
-#line 1120 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1766 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-      *yyvsp[-1].String += " " + *yyvsp[0].String;
-      delete yyvsp[0].String;
-      yyval.String = yyvsp[-1].String;
-    }
+    if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val)))
+      error("Alignment must be a power of two");
+    CurGV->setAlignment((yyvsp[0].UInt64Val));
+    
+  ;}
+    break;
+
+  case 111:
+#line 1783 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { 
+    (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T); 
+    (yyval.TypeVal).S = Signless;
+  ;}
+    break;
+
+  case 113:
+#line 1791 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { 
+    (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T); 
+    (yyval.TypeVal).S = Signless;
+  ;}
+    break;
+
+  case 114:
+#line 1798 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if (!UpRefs.empty())
+      error("Invalid upreference in type: " + (*(yyvsp[0].TypeVal).T)->getDescription());
+    (yyval.TypeVal) = (yyvsp[0].TypeVal);
+  ;}
     break;
 
   case 127:
-#line 1142 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1812 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     { 
-    yyval.Ty = Type::get(*yyvsp[0].String, OpaqueTy);
-  }
+    (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T);
+    (yyval.TypeVal).S = (yyvsp[0].PrimType).S;
+  ;}
     break;
 
   case 128:
-#line 1145 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { 
-    yyval.Ty = Type::get(*yyvsp[0].String, UnresolvedTy);
-  }
+#line 1816 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.TypeVal).T = new PATypeHolder(OpaqueType::get());
+    (yyval.TypeVal).S = Signless;
+  ;}
     break;
 
   case 129:
-#line 1148 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { 
-    yyval.Ty = yyvsp[0].Ty; 
-  }
+#line 1820 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {            // Named types are also simple types...
+    const Type* tmp = getTypeVal((yyvsp[0].ValIDVal));
+    (yyval.TypeVal).T = new PATypeHolder(tmp);
+    (yyval.TypeVal).S = Signless; // FIXME: what if its signed?
+  ;}
     break;
 
   case 130:
-#line 1151 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1825 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {                   // Type UpReference
-    yyvsp[0].String->insert(0, "\\");
-    yyval.Ty = Type::get(*yyvsp[0].String, UpRefTy);
-  }
+    if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) 
+      error("Value out of range");
+    OpaqueType *OT = OpaqueType::get();        // Use temporary placeholder
+    UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT));  // Add to vector...
+    (yyval.TypeVal).T = new PATypeHolder(OT);
+    (yyval.TypeVal).S = Signless;
+    UR_OUT("New Upreference!\n");
+  ;}
     break;
 
   case 131:
-#line 1155 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1834 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {           // Function derived type?
-    std::string newTy( yyvsp[-3].Ty->getNewTy() + "(");
-    for (unsigned i = 0; i < yyvsp[-1].TypeVec->size(); ++i) {
-      if (i != 0)
-        newTy +=  ", ";
-      if ((*yyvsp[-1].TypeVec)[i]->isVoid())
-        newTy += "...";
-      else
-        newTy += (*yyvsp[-1].TypeVec)[i]->getNewTy();
-    }
-    newTy += ")";
-    yyval.Ty = Type::get(newTy, yyvsp[-3].Ty, yyvsp[-1].TypeVec);
-  }
+    std::vector<const Type*> Params;
+    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-1].TypeList)->begin(),
+           E = (yyvsp[-1].TypeList)->end(); I != E; ++I) {
+      Params.push_back(I->T->get());
+      delete I->T;
+    }
+    bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
+    if (isVarArg) Params.pop_back();
+
+    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(
+                           FunctionType::get((yyvsp[-3].TypeVal).T->get(),Params,isVarArg)));
+    (yyval.TypeVal).S = (yyvsp[-3].TypeVal).S;
+    delete (yyvsp[-3].TypeVal).T;    // Delete the return type handle
+    delete (yyvsp[-1].TypeList);      // Delete the argument list
+  ;}
     break;
 
   case 132:
-#line 1168 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1850 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {          // Sized array type?
-    uint64_t elems = atoi(yyvsp[-3].String->c_str());
-    yyvsp[-3].String->insert(0,"[ ");
-    *yyvsp[-3].String += " x " + yyvsp[-1].Ty->getNewTy() + " ]";
-    yyval.Ty = Type::get(*yyvsp[-3].String, ArrayTy, yyvsp[-1].Ty, elems);
-  }
+    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(ArrayType::get((yyvsp[-1].TypeVal).T->get(), 
+                                                        (unsigned)(yyvsp[-3].UInt64Val))));
+    (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 133:
-#line 1174 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1856 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {          // Packed array type?
-    uint64_t elems = atoi(yyvsp[-3].String->c_str());
-    yyvsp[-3].String->insert(0,"< ");
-    *yyvsp[-3].String += " x " + yyvsp[-1].Ty->getNewTy() + " >";
-    yyval.Ty = Type::get(*yyvsp[-3].String, PackedTy, yyvsp[-1].Ty, elems);
-  }
+     const llvm::Type* ElemTy = (yyvsp[-1].TypeVal).T->get();
+     if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val))
+        error("Unsigned result not equal to signed result");
+     if (!(ElemTy->isInteger() || ElemTy->isFloatingPoint()))
+        error("Elements of a PackedType must be integer or floating point");
+     if (!isPowerOf2_32((yyvsp[-3].UInt64Val)))
+       error("PackedType length should be a power of 2");
+     (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(PackedType::get(ElemTy, 
+                                          (unsigned)(yyvsp[-3].UInt64Val))));
+     (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
+     delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 134:
-#line 1180 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1869 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {                        // Structure type?
-    std::string newTy("{");
-    for (unsigned i = 0; i < yyvsp[-1].TypeVec->size(); ++i) {
-      if (i != 0)
-        newTy +=  ", ";
-      newTy += (*yyvsp[-1].TypeVec)[i]->getNewTy();
-    }
-    newTy += "}";
-    yyval.Ty = Type::get(newTy, StructTy, yyvsp[-1].TypeVec);
-  }
+    std::vector<const Type*> Elements;
+    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-1].TypeList)->begin(),
+           E = (yyvsp[-1].TypeList)->end(); I != E; ++I)
+      Elements.push_back(I->T->get());
+    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
+    (yyval.TypeVal).S = Signless;
+    delete (yyvsp[-1].TypeList);
+  ;}
     break;
 
   case 135:
-#line 1190 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1878 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {                                  // Empty structure type?
-    yyval.Ty = Type::get("{}", StructTy, new TypeList());
-  }
+    (yyval.TypeVal).T = new PATypeHolder(StructType::get(std::vector<const Type*>()));
+    (yyval.TypeVal).S = Signless;
+  ;}
     break;
 
   case 136:
-#line 1193 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1882 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {                // Packed Structure type?
-    std::string newTy("<{");
-    for (unsigned i = 0; i < yyvsp[-2].TypeVec->size(); ++i) {
-      if (i != 0)
-        newTy +=  ", ";
-      newTy += (*yyvsp[-2].TypeVec)[i]->getNewTy();
-    }
-    newTy += "}>";
-    yyval.Ty = Type::get(newTy, PackedStructTy, yyvsp[-2].TypeVec);
-  }
+    std::vector<const Type*> Elements;
+    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-2].TypeList)->begin(),
+           E = (yyvsp[-2].TypeList)->end(); I != E; ++I) {
+      Elements.push_back(I->T->get());
+      delete I->T;
+    }
+    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
+    (yyval.TypeVal).S = Signless;
+    delete (yyvsp[-2].TypeList);
+  ;}
     break;
 
   case 137:
-#line 1203 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1893 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {                          // Empty packed structure type?
-    yyval.Ty = Type::get("<{}>", PackedStructTy, new TypeList());
-  }
+    (yyval.TypeVal).T = new PATypeHolder(StructType::get(std::vector<const Type*>(),true));
+    (yyval.TypeVal).S = Signless;
+  ;}
     break;
 
   case 138:
-#line 1206 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1897 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {                             // Pointer type?
-    yyval.Ty = yyvsp[-1].Ty->getPointerType();
-  }
+    if ((yyvsp[-1].TypeVal).T->get() == Type::LabelTy)
+      error("Cannot form a pointer to a basic block");
+    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(PointerType::get((yyvsp[-1].TypeVal).T->get())));
+    (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 139:
-#line 1214 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1910 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.TypeVec = new TypeList();
-    yyval.TypeVec->push_back(yyvsp[0].Ty);
-  }
+    (yyval.TypeList) = new std::list<PATypeInfo>();
+    (yyval.TypeList)->push_back((yyvsp[0].TypeVal)); 
+  ;}
     break;
 
   case 140:
-#line 1218 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1914 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.TypeVec = yyvsp[-2].TypeVec;
-    yyval.TypeVec->push_back(yyvsp[0].Ty);
-  }
+    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back((yyvsp[0].TypeVal));
+  ;}
     break;
 
   case 142:
-#line 1226 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1922 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.TypeVec = yyvsp[-2].TypeVec;
-    yyval.TypeVec->push_back(Type::get("void",VoidTy));
-    delete yyvsp[0].String;
-  }
+    PATypeInfo VoidTI;
+    VoidTI.T = new PATypeHolder(Type::VoidTy);
+    VoidTI.S = Signless;
+    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(VoidTI);
+  ;}
     break;
 
   case 143:
-#line 1231 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1928 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.TypeVec = new TypeList();
-    yyval.TypeVec->push_back(Type::get("void",VoidTy));
-    delete yyvsp[0].String;
-  }
+    (yyval.TypeList) = new std::list<PATypeInfo>();
+    PATypeInfo VoidTI;
+    VoidTI.T = new PATypeHolder(Type::VoidTy);
+    VoidTI.S = Signless;
+    (yyval.TypeList)->push_back(VoidTI);
+  ;}
     break;
 
   case 144:
-#line 1236 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1935 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.TypeVec = new TypeList();
-  }
+    (yyval.TypeList) = new std::list<PATypeInfo>();
+  ;}
     break;
 
   case 145:
-#line 1246 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1947 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     { // Nonempty unsized arr
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-3].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-3].Ty->getNewTy());
-    *yyval.Const->cnst += " [ " + *yyvsp[-1].String + " ]";
-    delete yyvsp[-1].String;
-  }
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-3].TypeVal).T->get());
+    if (ATy == 0)
+      error("Cannot make array constant with type: '" + 
+            (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
+    const Type *ETy = ATy->getElementType();
+    int NumElements = ATy->getNumElements();
+
+    // Verify that we have the correct size...
+    if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size())
+      error("Type mismatch: constant sized array initialized with " +
+            utostr((yyvsp[-1].ConstVector)->size()) +  " arguments, but has size of " + 
+            itostr(NumElements) + "");
+
+    // Verify all elements are correct type!
+    std::vector<Constant*> Elems;
+    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
+      Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+      const Type* ValTy = C->getType();
+      if (ETy != ValTy)
+        error("Element #" + utostr(i) + " is not of type '" + 
+              ETy->getDescription() +"' as required!\nIt is of type '"+
+              ValTy->getDescription() + "'");
+      Elems.push_back(C);
+    }
+    (yyval.ConstVal).C = ConstantArray::get(ATy, Elems);
+    (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
+    delete (yyvsp[-3].TypeVal).T; 
+    delete (yyvsp[-1].ConstVector);
+  ;}
     break;
 
   case 146:
-#line 1253 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1977 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-2].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-2].Ty->getNewTy());
-    *yyval.Const->cnst += "[ ]";
-  }
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal).T->get());
+    if (ATy == 0)
+      error("Cannot make array constant with type: '" + 
+            (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+    int NumElements = ATy->getNumElements();
+    if (NumElements != -1 && NumElements != 0) 
+      error("Type mismatch: constant sized array initialized with 0"
+            " arguments, but has size of " + itostr(NumElements) +"");
+    (yyval.ConstVal).C = ConstantArray::get(ATy, std::vector<Constant*>());
+    (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
+    delete (yyvsp[-2].TypeVal).T;
+  ;}
     break;
 
   case 147:
-#line 1259 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1990 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-2].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-2].Ty->getNewTy());
-    *yyval.Const->cnst += " c" + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal).T->get());
+    if (ATy == 0)
+      error("Cannot make array constant with type: '" + 
+            (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+    int NumElements = ATy->getNumElements();
+    const Type *ETy = dyn_cast<IntegerType>(ATy->getElementType());
+    if (!ETy || cast<IntegerType>(ETy)->getBitWidth() != 8)
+      error("String arrays require type i8, not '" + ETy->getDescription() + 
+            "'");
+    char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
+    if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal)))
+      error("Can't build string constant of size " + 
+            itostr((int)(EndStr-(yyvsp[0].StrVal))) + " when array has size " + 
+            itostr(NumElements) + "");
+    std::vector<Constant*> Vals;
+    for (char *C = (char *)(yyvsp[0].StrVal); C != (char *)EndStr; ++C)
+      Vals.push_back(ConstantInt::get(ETy, *C));
+    free((yyvsp[0].StrVal));
+    (yyval.ConstVal).C = ConstantArray::get(ATy, Vals);
+    (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
+    delete (yyvsp[-2].TypeVal).T;
+  ;}
     break;
 
   case 148:
-#line 1266 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2013 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     { // Nonempty unsized arr
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-3].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-3].Ty->getNewTy());
-    *yyval.Const->cnst += " < " + *yyvsp[-1].String + " >";
-    delete yyvsp[-1].String;
-  }
+    const PackedType *PTy = dyn_cast<PackedType>((yyvsp[-3].TypeVal).T->get());
+    if (PTy == 0)
+      error("Cannot make packed constant with type: '" + 
+            (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
+    const Type *ETy = PTy->getElementType();
+    int NumElements = PTy->getNumElements();
+    // Verify that we have the correct size...
+    if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size())
+      error("Type mismatch: constant sized packed initialized with " +
+            utostr((yyvsp[-1].ConstVector)->size()) +  " arguments, but has size of " + 
+            itostr(NumElements) + "");
+    // Verify all elements are correct type!
+    std::vector<Constant*> Elems;
+    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
+      Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+      const Type* ValTy = C->getType();
+      if (ETy != ValTy)
+        error("Element #" + utostr(i) + " is not of type '" + 
+              ETy->getDescription() +"' as required!\nIt is of type '"+
+              ValTy->getDescription() + "'");
+      Elems.push_back(C);
+    }
+    (yyval.ConstVal).C = ConstantPacked::get(PTy, Elems);
+    (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
+    delete (yyvsp[-3].TypeVal).T;
+    delete (yyvsp[-1].ConstVector);
+  ;}
     break;
 
   case 149:
-#line 1273 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2041 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-3].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-3].Ty->getNewTy());
-    *yyval.Const->cnst += " { " + *yyvsp[-1].String + " }";
-    delete yyvsp[-1].String;
-  }
+    const StructType *STy = dyn_cast<StructType>((yyvsp[-3].TypeVal).T->get());
+    if (STy == 0)
+      error("Cannot make struct constant with type: '" + 
+            (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
+    if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes())
+      error("Illegal number of initializers for structure type");
+
+    // Check to ensure that constants are compatible with the type initializer!
+    std::vector<Constant*> Fields;
+    for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i) {
+      Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+      if (C->getType() != STy->getElementType(i))
+        error("Expected type '" + STy->getElementType(i)->getDescription() +
+              "' for element #" + utostr(i) + " of structure initializer");
+      Fields.push_back(C);
+    }
+    (yyval.ConstVal).C = ConstantStruct::get(STy, Fields);
+    (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
+    delete (yyvsp[-3].TypeVal).T;
+    delete (yyvsp[-1].ConstVector);
+  ;}
     break;
 
   case 150:
-#line 1280 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2063 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-2].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-2].Ty->getNewTy());
-    *yyval.Const->cnst += " {}";
-  }
+    const StructType *STy = dyn_cast<StructType>((yyvsp[-2].TypeVal).T->get());
+    if (STy == 0)
+      error("Cannot make struct constant with type: '" + 
+              (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+    if (STy->getNumContainedTypes() != 0)
+      error("Illegal number of initializers for structure type");
+    (yyval.ConstVal).C = ConstantStruct::get(STy, std::vector<Constant*>());
+    (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
+    delete (yyvsp[-2].TypeVal).T;
+  ;}
     break;
 
   case 151:
-#line 1286 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2074 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst +=  " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+    const StructType *STy = dyn_cast<StructType>((yyvsp[-5].TypeVal).T->get());
+    if (STy == 0)
+      error("Cannot make packed struct constant with type: '" + 
+            (yyvsp[-5].TypeVal).T->get()->getDescription() + "'");
+    if ((yyvsp[-2].ConstVector)->size() != STy->getNumContainedTypes())
+      error("Illegal number of initializers for packed structure type");
+
+    // Check to ensure that constants are compatible with the type initializer!
+    std::vector<Constant*> Fields;
+    for (unsigned i = 0, e = (yyvsp[-2].ConstVector)->size(); i != e; ++i) {
+      Constant *C = (*(yyvsp[-2].ConstVector))[i].C;
+      if (C->getType() != STy->getElementType(i))
+        error("Expected type '" + STy->getElementType(i)->getDescription() +
+              "' for element #" + utostr(i) + " of packed struct initializer");
+      Fields.push_back(C);
+    }
+    (yyval.ConstVal).C = ConstantStruct::get(STy, Fields);
+    (yyval.ConstVal).S = (yyvsp[-5].TypeVal).S;
+    delete (yyvsp[-5].TypeVal).T; 
+    delete (yyvsp[-2].ConstVector);
+  ;}
     break;
 
   case 152:
-#line 1293 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2096 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+    const StructType *STy = dyn_cast<StructType>((yyvsp[-4].TypeVal).T->get());
+    if (STy == 0)
+      error("Cannot make packed struct constant with type: '" + 
+              (yyvsp[-4].TypeVal).T->get()->getDescription() + "'");
+    if (STy->getNumContainedTypes() != 0)
+      error("Illegal number of initializers for packed structure type");
+    (yyval.ConstVal).C = ConstantStruct::get(STy, std::vector<Constant*>());
+    (yyval.ConstVal).S = (yyvsp[-4].TypeVal).S;
+    delete (yyvsp[-4].TypeVal).T;
+  ;}
     break;
 
   case 153:
-#line 1300 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2107 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    std::string Name = getUniqueName(yyvsp[0].String, yyvsp[-1].Ty->resolve(), true);
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + Name;
-    delete yyvsp[0].String;
-  }
+    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+    if (PTy == 0)
+      error("Cannot make null pointer constant with type: '" + 
+            (yyvsp[-1].TypeVal).T->get()->getDescription() + "'");
+    (yyval.ConstVal).C = ConstantPointerNull::get(PTy);
+    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 154:
-#line 1308 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2116 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+    (yyval.ConstVal).C = UndefValue::get((yyvsp[-1].TypeVal).T->get());
+    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 155:
-#line 1315 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2121 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+    const PointerType *Ty = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+    if (Ty == 0)
+      error("Global const reference must be a pointer type, not" +
+            (yyvsp[-1].TypeVal).T->get()->getDescription());
+
+    // ConstExprs can exist in the body of a function, thus creating
+    // GlobalValues whenever they refer to a variable.  Because we are in
+    // the context of a function, getExistingValue will search the functions
+    // symbol table instead of the module symbol table for the global symbol,
+    // which throws things all off.  To get around this, we just tell
+    // getExistingValue that we are at global scope here.
+    //
+    Function *SavedCurFn = CurFun.CurrentFunction;
+    CurFun.CurrentFunction = 0;
+    Value *V = getExistingValue(Ty, (yyvsp[0].ValIDVal));
+    CurFun.CurrentFunction = SavedCurFn;
+
+    // If this is an initializer for a constant pointer, which is referencing a
+    // (currently) undefined variable, create a stub now that shall be replaced
+    // in the future with the right type of variable.
+    //
+    if (V == 0) {
+      assert(isa<PointerType>(Ty) && "Globals may only be used as pointers");
+      const PointerType *PT = cast<PointerType>(Ty);
+
+      // First check to see if the forward references value is already created!
+      PerModuleInfo::GlobalRefsType::iterator I =
+        CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[0].ValIDVal)));
+    
+      if (I != CurModule.GlobalRefs.end()) {
+        V = I->second;             // Placeholder already exists, use it...
+        (yyvsp[0].ValIDVal).destroy();
+      } else {
+        std::string Name;
+        if ((yyvsp[0].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[0].ValIDVal).Name;
+
+        // Create the forward referenced global.
+        GlobalValue *GV;
+        if (const FunctionType *FTy = 
+                 dyn_cast<FunctionType>(PT->getElementType())) {
+          GV = new Function(FTy, GlobalValue::ExternalLinkage, Name,
+                            CurModule.CurrentModule);
+        } else {
+          GV = new GlobalVariable(PT->getElementType(), false,
+                                  GlobalValue::ExternalLinkage, 0,
+                                  Name, CurModule.CurrentModule);
+        }
+
+        // Keep track of the fact that we have a forward ref to recycle it
+        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[0].ValIDVal)), GV));
+        V = GV;
+      }
+    }
+    (yyval.ConstVal).C = cast<GlobalValue>(V);
+    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+    delete (yyvsp[-1].TypeVal).T;            // Free the type handle
+  ;}
     break;
 
   case 156:
-#line 1322 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {      // integral constants
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+#line 2179 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if ((yyvsp[-1].TypeVal).T->get() != (yyvsp[0].ConstVal).C->getType())
+      error("Mismatched types for constant expression");
+    (yyval.ConstVal) = (yyvsp[0].ConstVal);
+    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 157:
-#line 1329 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {            // integral constants
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+#line 2186 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+    if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
+      error("Cannot create a null initialized value of this type");
+    (yyval.ConstVal).C = Constant::getNullValue(Ty);
+    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 158:
-#line 1336 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {                      // Boolean constants
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+#line 2194 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {      // integral constants
+    const Type *Ty = (yyvsp[-1].PrimType).T;
+    if (!ConstantInt::isValueValidForType(Ty, (yyvsp[0].SInt64Val)))
+      error("Constant value doesn't fit in type");
+    (yyval.ConstVal).C = ConstantInt::get(Ty, (yyvsp[0].SInt64Val));
+    (yyval.ConstVal).S = Signed;
+  ;}
     break;
 
   case 159:
-#line 1343 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {                     // Boolean constants
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+#line 2201 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {            // integral constants
+    const Type *Ty = (yyvsp[-1].PrimType).T;
+    if (!ConstantInt::isValueValidForType(Ty, (yyvsp[0].UInt64Val)))
+      error("Constant value doesn't fit in type");
+    (yyval.ConstVal).C = ConstantInt::get(Ty, (yyvsp[0].UInt64Val));
+    (yyval.ConstVal).S = Unsigned;
+  ;}
     break;
 
   case 160:
-#line 1350 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {                   // Float & Double constants
-    yyval.Const = new Constant;
-    yyval.Const->type = yyvsp[-1].Ty;
-    yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
-    *yyval.Const->cnst += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+#line 2208 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {                      // Boolean constants
+    (yyval.ConstVal).C = ConstantInt::get(Type::Int1Ty, true);
+    (yyval.ConstVal).S = Unsigned;
+  ;}
     break;
 
   case 161:
-#line 1358 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    std::string source = *yyvsp[-3].Const->cnst;
-    const Type* SrcTy = yyvsp[-3].Const->type->resolve();
-    const Type* DstTy = yyvsp[-1].Ty->resolve(); 
-    if (*yyvsp[-5].String == "cast") {
-      // Call getCastUpgrade to upgrade the old cast
-      yyval.String = new std::string(getCastUpgrade(source, SrcTy, DstTy, true));
-    } else {
-      // Nothing to upgrade, just create the cast constant expr
-      yyval.String = new std::string(*yyvsp[-5].String);
-      *yyval.String += "( " + source + " to " + yyvsp[-1].Ty->getNewTy() + ")";
-    }
-    delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-2].String;
-  }
+#line 2212 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {                     // Boolean constants
+    (yyval.ConstVal).C = ConstantInt::get(Type::Int1Ty, false);
+    (yyval.ConstVal).S = Unsigned;
+  ;}
     break;
 
   case 162:
-#line 1372 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *yyvsp[-4].String += "(" + *yyvsp[-2].Const->cnst;
-    for (unsigned i = 0; i < yyvsp[-1].ValList->size(); ++i) {
-      Value* V = (*yyvsp[-1].ValList)[i];
-      *yyvsp[-4].String += ", " + *V->val;
-      delete V;
-    }
-    *yyvsp[-4].String += ")";
-    yyval.String = yyvsp[-4].String;
-    delete yyvsp[-2].Const;
-    delete yyvsp[-1].ValList;
-  }
+#line 2216 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {                   // Float & Double constants
+    if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType).T, (yyvsp[0].FPVal)))
+      error("Floating point constant invalid for type");
+    (yyval.ConstVal).C = ConstantFP::get((yyvsp[-1].PrimType).T, (yyvsp[0].FPVal));
+    (yyval.ConstVal).S = Signless;
+  ;}
     break;
 
   case 163:
-#line 1384 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2225 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-7].String += "(" + *yyvsp[-5].Const->cnst + "," + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-5].Const; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-    yyval.String = yyvsp[-7].String;
-  }
+    const Type* SrcTy = (yyvsp[-3].ConstVal).C->getType();
+    const Type* DstTy = (yyvsp[-1].TypeVal).T->get();
+    Signedness SrcSign = (yyvsp[-3].ConstVal).S;
+    Signedness DstSign = (yyvsp[-1].TypeVal).S;
+    if (!SrcTy->isFirstClassType())
+      error("cast constant expression from a non-primitive type: '" +
+            SrcTy->getDescription() + "'");
+    if (!DstTy->isFirstClassType())
+      error("cast constant expression to a non-primitive type: '" +
+            DstTy->getDescription() + "'");
+    (yyval.ConstVal).C = cast<Constant>(getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal).C, SrcSign, DstTy, DstSign));
+    (yyval.ConstVal).S = DstSign;
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 164:
-#line 1389 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2240 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const char* op = getDivRemOpcode(*yyvsp[-5].String, yyvsp[-3].Const->type); 
-    yyval.String = new std::string(op);
-    *yyval.String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-  }
+    const Type *Ty = (yyvsp[-2].ConstVal).C->getType();
+    if (!isa<PointerType>(Ty))
+      error("GetElementPtr requires a pointer operand");
+
+    std::vector<Value*> VIndices;
+    std::vector<Constant*> CIndices;
+    upgradeGEPIndices((yyvsp[-2].ConstVal).C->getType(), (yyvsp[-1].ValueList), VIndices, &CIndices);
+
+    delete (yyvsp[-1].ValueList);
+    (yyval.ConstVal).C = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal).C, CIndices);
+    (yyval.ConstVal).S = Signless;
+  ;}
     break;
 
   case 165:
-#line 1395 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2253 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-5].String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-    yyval.String = yyvsp[-5].String;
-  }
+    if (!(yyvsp[-5].ConstVal).C->getType()->isInteger() ||
+        cast<IntegerType>((yyvsp[-5].ConstVal).C->getType())->getBitWidth() != 1)
+      error("Select condition must be bool type");
+    if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType())
+      error("Select operand types must match");
+    (yyval.ConstVal).C = ConstantExpr::getSelect((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = Unsigned;
+  ;}
     break;
 
   case 166:
-#line 1400 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2262 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-5].String = getCompareOp(*yyvsp[-5].String, yyvsp[-3].Const->type);
-    *yyvsp[-5].String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-    yyval.String = yyvsp[-5].String;
-  }
+    const Type *Ty = (yyvsp[-3].ConstVal).C->getType();
+    if (Ty != (yyvsp[-1].ConstVal).C->getType())
+      error("Binary operator types must match");
+    // First, make sure we're dealing with the right opcode by upgrading from
+    // obsolete versions.
+    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-5].BinaryOpVal), Ty, (yyvsp[-3].ConstVal).S);
+
+    // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs.
+    // To retain backward compatibility with these early compilers, we emit a
+    // cast to the appropriate integer type automatically if we are in the
+    // broken case.  See PR424 for more information.
+    if (!isa<PointerType>(Ty)) {
+      (yyval.ConstVal).C = ConstantExpr::get(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    } else {
+      const Type *IntPtrTy = 0;
+      switch (CurModule.CurrentModule->getPointerSize()) {
+      case Module::Pointer32: IntPtrTy = Type::Int32Ty; break;
+      case Module::Pointer64: IntPtrTy = Type::Int64Ty; break;
+      default: error("invalid pointer binary constant expr");
+      }
+      (yyval.ConstVal).C = ConstantExpr::get(Opcode, 
+             ConstantExpr::getCast(Instruction::PtrToInt, (yyvsp[-3].ConstVal).C, IntPtrTy),
+             ConstantExpr::getCast(Instruction::PtrToInt, (yyvsp[-1].ConstVal).C, IntPtrTy));
+      (yyval.ConstVal).C = ConstantExpr::getCast(Instruction::IntToPtr, (yyval.ConstVal).C, Ty);
+    }
+    (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S; 
+  ;}
     break;
 
   case 167:
-#line 1406 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2290 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-6].String += " " + *yyvsp[-5].String + " (" +  *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-    yyval.String = yyvsp[-6].String;
-  }
+    const Type* Ty = (yyvsp[-3].ConstVal).C->getType();
+    if (Ty != (yyvsp[-1].ConstVal).C->getType())
+      error("Logical operator types must match");
+    if (!Ty->isInteger()) {
+      if (!isa<PackedType>(Ty) || 
+          !cast<PackedType>(Ty)->getElementType()->isInteger())
+        error("Logical operator requires integer operands");
+    }
+    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-5].BinaryOpVal), Ty, (yyvsp[-3].ConstVal).S);
+    (yyval.ConstVal).C = ConstantExpr::get(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+  ;}
     break;
 
   case 168:
-#line 1411 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2303 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-6].String += " " + *yyvsp[-5].String + " (" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-    yyval.String = yyvsp[-6].String;
-  }
+    const Type* Ty = (yyvsp[-3].ConstVal).C->getType();
+    if (Ty != (yyvsp[-1].ConstVal).C->getType())
+      error("setcc operand types must match");
+    unsigned short pred;
+    Instruction::OtherOps Opcode = getCompareOp((yyvsp[-5].BinaryOpVal), pred, Ty, (yyvsp[-3].ConstVal).S);
+    (yyval.ConstVal).C = ConstantExpr::getCompare(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = Unsigned;
+  ;}
     break;
 
   case 169:
-#line 1416 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2312 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const char* shiftop = yyvsp[-5].String->c_str();
-    if (*yyvsp[-5].String == "shr")
-      shiftop = (yyvsp[-3].Const->type->isUnsigned()) ? "lshr" : "ashr";
-    yyval.String = new std::string(shiftop);
-    *yyval.String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-  }
+    if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType()) 
+      error("icmp operand types must match");
+    (yyval.ConstVal).C = ConstantExpr::getCompare((yyvsp[-5].IPred), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = Unsigned;
+  ;}
     break;
 
   case 170:
-#line 1424 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2318 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-5].String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-    yyval.String = yyvsp[-5].String;
-  }
+    if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType()) 
+      error("fcmp operand types must match");
+    (yyval.ConstVal).C = ConstantExpr::getCompare((yyvsp[-5].FPred), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = Unsigned;
+  ;}
     break;
 
   case 171:
-#line 1429 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2324 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-7].String += "(" + *yyvsp[-5].Const->cnst + "," + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-5].Const; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-    yyval.String = yyvsp[-7].String;
-  }
+    if (!(yyvsp[-1].ConstVal).C->getType()->isInteger() ||
+        cast<IntegerType>((yyvsp[-1].ConstVal).C->getType())->getBitWidth() != 8)
+      error("Shift count for shift constant must be unsigned byte");
+    if (!(yyvsp[-3].ConstVal).C->getType()->isInteger())
+      error("Shift constant expression requires integer operand");
+    (yyval.ConstVal).C = ConstantExpr::get(getOtherOp((yyvsp[-5].OtherOpVal), (yyvsp[-3].ConstVal).S), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+  ;}
     break;
 
   case 172:
-#line 1434 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2333 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-7].String += "(" + *yyvsp[-5].Const->cnst + "," + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
-    delete yyvsp[-5].Const; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
-    yyval.String = yyvsp[-7].String;
-  }
+    if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+      error("Invalid extractelement operands");
+    (yyval.ConstVal).C = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+  ;}
     break;
 
   case 173:
-#line 1444 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2339 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-2].String += ", " + *yyvsp[0].Const->cnst;
-    delete yyvsp[0].Const;
-    yyval.String = yyvsp[-2].String;
-  }
+    if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+      error("Invalid insertelement operands");
+    (yyval.ConstVal).C = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[-5].ConstVal).S;
+  ;}
     break;
 
   case 174:
-#line 1449 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(*yyvsp[0].Const->cnst); delete yyvsp[0].Const; }
+#line 2345 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+      error("Invalid shufflevector operands");
+    (yyval.ConstVal).C = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[-5].ConstVal).S;
+  ;}
     break;
 
-  case 177:
-#line 1464 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+  case 175:
+#line 2356 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); ;}
+    break;
+
+  case 176:
+#line 2357 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-}
+    (yyval.ConstVector) = new std::vector<ConstInfo>();
+    (yyval.ConstVector)->push_back((yyvsp[0].ConstVal));
+  ;}
+    break;
+
+  case 177:
+#line 2366 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.BoolVal) = false; ;}
     break;
 
   case 178:
-#line 1469 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    yyval.String = 0;
-  }
+#line 2367 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.BoolVal) = true; ;}
     break;
 
   case 179:
-#line 1472 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2379 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *O << *yyvsp[0].String << '\n';
-    delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+    (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal);
+    CurModule.ModuleDone();
+  ;}
     break;
 
   case 180:
-#line 1477 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *O << "module asm " << ' ' << *yyvsp[0].String << '\n';
-    yyval.String = 0;
-  }
+#line 2388 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CurFun.FunctionDone(); ;}
     break;
 
   case 181:
-#line 1481 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *O << "implementation\n";
-    yyval.String = 0;
-  }
+#line 2389 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); ;}
     break;
 
   case 182:
-#line 1485 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = 0; }
+#line 2390 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ModuleVal) = (yyvsp[-3].ModuleVal); ;}
+    break;
+
+  case 183:
+#line 2391 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); ;}
     break;
 
   case 184:
-#line 1488 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = yyvsp[0].String; *yyval.String = "external"; }
+#line 2392 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.ModuleVal) = CurModule.CurrentModule;
+    // Emit an error if there are any unresolved types left.
+    if (!CurModule.LateResolveTypes.empty()) {
+      const ValID &DID = CurModule.LateResolveTypes.begin()->first;
+      if (DID.Type == ValID::NameVal) {
+        error("Reference to an undefined type: '"+DID.getName() + "'");
+      } else {
+        error("Reference to an undefined type: #" + itostr(DID.Num));
+      }
+    }
+  ;}
     break;
 
   case 185:
-#line 1491 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2408 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    Type::EnumeratedTypes.push_back(yyvsp[0].Ty);
-    if (!yyvsp[-2].String->empty()) {
-      Type::NamedTypes[*yyvsp[-2].String] = yyvsp[0].Ty;
-      *O << *yyvsp[-2].String << " = ";
-    }
-    *O << "type " << yyvsp[0].Ty->getNewTy() << '\n';
-    delete yyvsp[-2].String; delete yyvsp[-1].String;
-    yyval.String = 0;
-  }
+    // Eagerly resolve types.  This is not an optimization, this is a
+    // requirement that is due to the fact that we could have this:
+    //
+    // %list = type { %list * }
+    // %list = type { %list * }    ; repeated type decl
+    //
+    // If types are not resolved eagerly, then the two types will not be
+    // determined to be the same type!
+    //
+    const Type* Ty = (yyvsp[0].TypeVal).T->get();
+    ResolveTypeTo((yyvsp[-2].StrVal), Ty);
+
+    if (!setTypeName(Ty, (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) {
+      // If this is a named type that is not a redefinition, add it to the slot
+      // table.
+      CurModule.Types.push_back(Ty);
+    }
+    delete (yyvsp[0].TypeVal).T;
+  ;}
     break;
 
   case 186:
-#line 1501 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2428 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {       // Function prototypes can be in const pool
-    *O << *yyvsp[0].String << '\n';
-    delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+  ;}
     break;
 
   case 187:
-#line 1506 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2430 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {  // Asm blocks can be in the const pool
-    *O << *yyvsp[-2].String << ' ' << *yyvsp[-1].String << ' ' << *yyvsp[0].String << '\n';
-    delete yyvsp[-2].String; delete yyvsp[-1].String; delete yyvsp[0].String; 
-    yyval.String = 0;
-  }
+  ;}
     break;
 
   case 188:
-#line 1511 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2432 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!yyvsp[-4].String->empty()) {
-      std::string Name = getGlobalName(yyvsp[-4].String,*yyvsp[-3].String, yyvsp[-1].Const->type->getPointerType(),
-                                       *yyvsp[-2].String == "constant");
-      *O << Name << " = ";
-    }
-    *O << *yyvsp[-3].String << ' ' << *yyvsp[-2].String << ' ' << *yyvsp[-1].Const->cnst << ' ' << *yyvsp[0].String << '\n';
-    delete yyvsp[-4].String; delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String; 
-    yyval.String = 0;
-  }
+    if ((yyvsp[0].ConstVal).C == 0) 
+      error("Global value initializer is not a constant");
+    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), (yyvsp[-2].Linkage), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal).C->getType(), (yyvsp[0].ConstVal).C);
+  ;}
     break;
 
   case 189:
-#line 1521 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2436 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!yyvsp[-4].String->empty()) {
-      std::string Name = getGlobalName(yyvsp[-4].String,*yyvsp[-3].String,yyvsp[-1].Ty->getPointerType(),
-                                       *yyvsp[-2].String == "constant");
-      *O << Name << " = ";
-    }
-    *O <<  *yyvsp[-3].String << ' ' << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].String << '\n';
-    delete yyvsp[-4].String; delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+    CurGV = 0;
+  ;}
     break;
 
   case 190:
-#line 1531 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2439 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!yyvsp[-4].String->empty()) {
-      std::string Name = getGlobalName(yyvsp[-4].String,*yyvsp[-3].String,yyvsp[-1].Ty->getPointerType(),
-                                       *yyvsp[-2].String == "constant");
-      *O << Name << " = ";
-    }
-    *O << *yyvsp[-3].String << ' ' << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].String << '\n';
-    delete yyvsp[-4].String; delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+    const Type *Ty = (yyvsp[0].TypeVal).T->get();
+    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal), Ty, 0);
+    delete (yyvsp[0].TypeVal).T;
+  ;}
     break;
 
   case 191:
-#line 1541 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2443 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!yyvsp[-4].String->empty()) {
-      std::string Name = getGlobalName(yyvsp[-4].String,*yyvsp[-3].String,yyvsp[-1].Ty->getPointerType(),
-                                       *yyvsp[-2].String == "constant");
-      *O << Name << " = ";
-    }
-    *O << *yyvsp[-3].String << ' ' << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].String << '\n';
-    delete yyvsp[-4].String; delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+    CurGV = 0;
+  ;}
     break;
 
   case 192:
-#line 1551 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { 
-    *O << *yyvsp[-1].String << ' ' << *yyvsp[0].String << '\n';
-    delete yyvsp[-1].String; delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+#line 2446 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type *Ty = (yyvsp[0].TypeVal).T->get();
+    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal), Ty, 0);
+    delete (yyvsp[0].TypeVal).T;
+  ;}
     break;
 
   case 193:
-#line 1556 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2450 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *O << *yyvsp[-2].String << " = " << *yyvsp[0].String << '\n';
-    delete yyvsp[-2].String; delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+    CurGV = 0;
+  ;}
     break;
 
   case 194:
-#line 1561 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2453 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type *Ty = (yyvsp[0].TypeVal).T->get();
+    CurGV = 
+      ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[-1].BoolVal), Ty, 0);
+    delete (yyvsp[0].TypeVal).T;
+  ;}
+    break;
+
+  case 195:
+#line 2458 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    CurGV = 0;
+  ;}
+    break;
+
+  case 196:
+#line 2461 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     { 
-    yyval.String = 0;
-  }
+  ;}
     break;
 
-  case 198:
-#line 1571 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+  case 197:
+#line 2463 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-2].String += " = " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-2].String;
-  }
+  ;}
+    break;
+
+  case 198:
+#line 2465 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { 
+  ;}
     break;
 
   case 199:
-#line 1576 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2470 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-2].String += " = " + *yyvsp[0].String;
-    if (*yyvsp[0].String == "64")
-      SizeOfPointer = 64;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-2].String;
-  }
+    const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
+    char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
+    std::string NewAsm((yyvsp[0].StrVal), EndStr);
+    free((yyvsp[0].StrVal));
+
+    if (AsmSoFar.empty())
+      CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
+    else
+      CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
+  ;}
     break;
 
   case 200:
-#line 1583 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *yyvsp[-2].String += " = " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-2].String;
-  }
+#line 2484 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Endianness) = Module::BigEndian; ;}
     break;
 
   case 201:
-#line 1588 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *yyvsp[-2].String += " = " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-2].String;
-  }
+#line 2485 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.Endianness) = Module::LittleEndian; ;}
     break;
 
   case 202:
-#line 1595 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2489 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyvsp[-1].String->insert(0, "[ ");
-    *yyvsp[-1].String += " ]";
-    yyval.String = yyvsp[-1].String;
-  }
+    CurModule.setEndianness((yyvsp[0].Endianness));
+  ;}
     break;
 
   case 203:
-#line 1602 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2492 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-2].String += ", " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-2].String;
-  }
+    if ((yyvsp[0].UInt64Val) == 32)
+      CurModule.setPointerSize(Module::Pointer32);
+    else if ((yyvsp[0].UInt64Val) == 64)
+      CurModule.setPointerSize(Module::Pointer64);
+    else
+      error("Invalid pointer size: '" + utostr((yyvsp[0].UInt64Val)) + "'");
+  ;}
     break;
 
-  case 205:
-#line 1608 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+  case 204:
+#line 2500 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.String = new std::string();
-  }
-    break;
-
-  case 209:
-#line 1617 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+    CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal));
+    free((yyvsp[0].StrVal));
+  ;}
     break;
 
-  case 210:
-#line 1619 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+  case 205:
+#line 2504 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-  yyval.String = new std::string(yyvsp[-1].Ty->getNewTy());
-  if (!yyvsp[0].String->empty()) {
-    std::string Name = getUniqueName(yyvsp[0].String, yyvsp[-1].Ty->resolve());
-    *yyval.String += " " + Name;
-  }
-  delete yyvsp[0].String;
-}
+    CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal));
+    free((yyvsp[0].StrVal));
+  ;}
     break;
 
-  case 211:
-#line 1628 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+  case 207:
+#line 2515 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-2].String += ", " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
+      CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
+      free((yyvsp[0].StrVal));
+  ;}
     break;
 
-  case 212:
-#line 1632 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+  case 208:
+#line 2519 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.String = yyvsp[0].String;
-  }
+    CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
+    free((yyvsp[0].StrVal));
+  ;}
+    break;
+
+  case 209:
+#line 2523 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { ;}
     break;
 
   case 213:
-#line 1636 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    yyval.String = yyvsp[0].String;
-  }
+#line 2536 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.StrVal) = 0; ;}
     break;
 
   case 214:
-#line 1639 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2540 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-2].String += ", ...";
-    yyval.String = yyvsp[-2].String;
-    delete yyvsp[0].String;
-  }
+    if ((yyvsp[-1].TypeVal).T->get() == Type::VoidTy)
+      error("void typed arguments are invalid");
+    (yyval.ArgVal) = new std::pair<PATypeInfo, char*>((yyvsp[-1].TypeVal), (yyvsp[0].StrVal));
+  ;}
     break;
 
   case 215:
-#line 1644 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2548 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.String = yyvsp[0].String;
-  }
+    (yyval.ArgList) = (yyvsp[-2].ArgList);
+    (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal));
+    delete (yyvsp[0].ArgVal);
+  ;}
     break;
 
   case 216:
-#line 1647 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+#line 2553 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.ArgList) = new std::vector<std::pair<PATypeInfo,char*> >();
+    (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal));
+    delete (yyvsp[0].ArgVal);
+  ;}
     break;
 
   case 217:
-#line 1650 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    if (*yyvsp[-5].String == "%llvm.va_start" || *yyvsp[-5].String == "%llvm.va_end") {
-      *yyvsp[-3].String = "i8*";
-    } else if (*yyvsp[-5].String == "%llvm.va_copy") {
-      *yyvsp[-3].String = "i8*, i8*";
-    }
-    if (!yyvsp[-7].String->empty()) {
-      *yyvsp[-7].String += " ";
-    }
-    *yyvsp[-7].String += yyvsp[-6].Ty->getNewTy() + " " + *yyvsp[-5].String + "(" + *yyvsp[-3].String + ")";
-    if (!yyvsp[-1].String->empty()) {
-      *yyvsp[-7].String += " " + *yyvsp[-1].String;
-    }
-    if (!yyvsp[0].String->empty()) {
-      *yyvsp[-7].String += " " + *yyvsp[0].String;
-    }
-    delete yyvsp[-5].String;
-    delete yyvsp[-3].String;
-    delete yyvsp[-1].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-7].String;
-  }
+#line 2561 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ArgList) = (yyvsp[0].ArgList); ;}
     break;
 
   case 218:
-#line 1673 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string("{"); delete yyvsp[0].String; }
+#line 2562 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.ArgList) = (yyvsp[-2].ArgList);
+    PATypeInfo VoidTI;
+    VoidTI.T = new PATypeHolder(Type::VoidTy);
+    VoidTI.S = Signless;
+    (yyval.ArgList)->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
+  ;}
     break;
 
   case 219:
-#line 1674 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string ("{"); }
+#line 2569 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.ArgList) = new std::vector<std::pair<PATypeInfo,char*> >();
+    PATypeInfo VoidTI;
+    VoidTI.T = new PATypeHolder(Type::VoidTy);
+    VoidTI.S = Signless;
+    (yyval.ArgList)->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
+  ;}
     break;
 
   case 220:
-#line 1678 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *O << "define ";
-    if (!yyvsp[-2].String->empty()) {
-      *O << *yyvsp[-2].String << ' ';
-    }
-    *O << *yyvsp[-1].String << ' ' << *yyvsp[0].String << '\n';
-    delete yyvsp[-2].String; delete yyvsp[-1].String; delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+#line 2576 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ArgList) = 0; ;}
     break;
 
   case 221:
-#line 1689 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string("}"); delete yyvsp[0].String; }
+#line 2580 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    UnEscapeLexed((yyvsp[-5].StrVal));
+    std::string FunctionName((yyvsp[-5].StrVal));
+    free((yyvsp[-5].StrVal));  // Free strdup'd memory!
+
+    const Type* RetTy = (yyvsp[-6].TypeVal).T->get();
+    
+    if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
+      error("LLVM functions cannot return aggregate types");
+
+    std::vector<const Type*> ParamTypeList;
+
+    // In LLVM 2.0 the signatures of three varargs intrinsics changed to take
+    // i8*. We check here for those names and override the parameter list
+    // types to ensure the prototype is correct.
+    if (FunctionName == "llvm.va_start" || FunctionName == "llvm.va_end") {
+      ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+    } else if (FunctionName == "llvm.va_copy") {
+      ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+      ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+    } else if ((yyvsp[-3].ArgList)) {   // If there are arguments...
+      for (std::vector<std::pair<PATypeInfo,char*> >::iterator 
+           I = (yyvsp[-3].ArgList)->begin(), E = (yyvsp[-3].ArgList)->end(); I != E; ++I) {
+        const Type *Ty = I->first.T->get();
+        ParamTypeList.push_back(Ty);
+      }
+    }
+
+    bool isVarArg = 
+      ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
+    if (isVarArg) ParamTypeList.pop_back();
+
+    const FunctionType *FT = FunctionType::get(RetTy, ParamTypeList, isVarArg);
+    const PointerType *PFT = PointerType::get(FT);
+    delete (yyvsp[-6].TypeVal).T;
+
+    ValID ID;
+    if (!FunctionName.empty()) {
+      ID = ValID::create((char*)FunctionName.c_str());
+    } else {
+      ID = ValID::create((int)CurModule.Values[PFT].size());
+    }
+
+    Function *Fn = 0;
+    // See if this function was forward referenced.  If so, recycle the object.
+    if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
+      // Move the function to the end of the list, from whereever it was 
+      // previously inserted.
+      Fn = cast<Function>(FWRef);
+      CurModule.CurrentModule->getFunctionList().remove(Fn);
+      CurModule.CurrentModule->getFunctionList().push_back(Fn);
+    } else if (!FunctionName.empty() &&     // Merge with an earlier prototype?
+               (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) {
+      // If this is the case, either we need to be a forward decl, or it needs 
+      // to be.
+      if (!CurFun.isDeclare && !Fn->isExternal())
+        error("Redefinition of function '" + FunctionName + "'");
+      
+      // Make sure to strip off any argument names so we can't get conflicts.
+      if (Fn->isExternal())
+        for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
+             AI != AE; ++AI)
+          AI->setName("");
+    } else  {  // Not already defined?
+      Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
+                        CurModule.CurrentModule);
+
+      InsertValue(Fn, CurModule.Values);
+    }
+
+    CurFun.FunctionStart(Fn);
+
+    if (CurFun.isDeclare) {
+      // If we have declaration, always overwrite linkage.  This will allow us 
+      // to correctly handle cases, when pointer to function is passed as 
+      // argument to another function.
+      Fn->setLinkage(CurFun.Linkage);
+    }
+    Fn->setCallingConv((yyvsp[-7].UIntVal));
+    Fn->setAlignment((yyvsp[0].UIntVal));
+    if ((yyvsp[-1].StrVal)) {
+      Fn->setSection((yyvsp[-1].StrVal));
+      free((yyvsp[-1].StrVal));
+    }
+
+    // Add all of the arguments we parsed to the function...
+    if ((yyvsp[-3].ArgList)) {                     // Is null if empty...
+      if (isVarArg) {  // Nuke the last entry
+        assert((yyvsp[-3].ArgList)->back().first.T->get() == Type::VoidTy && 
+               (yyvsp[-3].ArgList)->back().second == 0 && "Not a varargs marker");
+        delete (yyvsp[-3].ArgList)->back().first.T;
+        (yyvsp[-3].ArgList)->pop_back();  // Delete the last entry
+      }
+      Function::arg_iterator ArgIt = Fn->arg_begin();
+      for (std::vector<std::pair<PATypeInfo,char*> >::iterator 
+           I = (yyvsp[-3].ArgList)->begin(), E = (yyvsp[-3].ArgList)->end(); I != E; ++I, ++ArgIt) {
+        delete I->first.T;                        // Delete the typeholder...
+        setValueName(ArgIt, I->second);           // Insert arg into symtab...
+        InsertValue(ArgIt);
+      }
+      delete (yyvsp[-3].ArgList);                     // We're now done with the argument list
+    }
+  ;}
+    break;
+
+  case 224:
+#line 2690 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.FunctionVal) = CurFun.CurrentFunction;
+
+    // Make sure that we keep track of the linkage type even if there was a
+    // previous "declare".
+    (yyval.FunctionVal)->setLinkage((yyvsp[-2].Linkage));
+  ;}
+    break;
+
+  case 227:
+#line 2704 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+  ;}
+    break;
+
+  case 229:
+#line 2710 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;}
+    break;
+
+  case 230:
+#line 2711 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; ;}
     break;
 
-  case 222:
-#line 1690 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string("}"); }
+  case 231:
+#line 2715 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { CurFun.isDeclare = true; ;}
     break;
 
-  case 223:
-#line 1692 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+  case 232:
+#line 2715 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-  if (yyvsp[-1].String)
-    *O << *yyvsp[-1].String;
-  *O << *yyvsp[0].String << "\n\n";
-  delete yyvsp[-2].String; delete yyvsp[-1].String; delete yyvsp[0].String;
-  yyval.String = 0;
-}
+    (yyval.FunctionVal) = CurFun.CurrentFunction;
+    CurFun.FunctionDone();
+    
+  ;}
     break;
 
-  case 224:
-#line 1701 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+  case 233:
+#line 2727 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.BoolVal) = false; ;}
     break;
 
-  case 227:
-#line 1707 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { isDeclare = true; }
+  case 234:
+#line 2728 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.BoolVal) = true; ;}
     break;
 
-  case 228:
-#line 1707 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { 
-    if (!yyvsp[-1].String->empty())
-      *yyvsp[-3].String += " " + *yyvsp[-1].String;
-    *yyvsp[-3].String += " " + *yyvsp[0].String;
-    delete yyvsp[-1].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-3].String;
-    isDeclare = false;
-  }
+  case 235:
+#line 2733 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {    (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); ;}
     break;
 
-  case 229:
-#line 1721 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+  case 236:
+#line 2734 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); ;}
+    break;
+
+  case 237:
+#line 2735 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); ;}
+    break;
+
+  case 238:
+#line 2736 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, true)); ;}
     break;
 
   case 239:
-#line 1727 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { 
-    yyvsp[-1].String->insert(0, "<");
-    *yyvsp[-1].String += ">";
-    yyval.String = yyvsp[-1].String;
-  }
+#line 2737 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, false)); ;}
+    break;
+
+  case 240:
+#line 2738 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::createNull(); ;}
     break;
 
   case 241:
-#line 1733 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    if (!yyvsp[-3].String->empty()) {
-      *yyvsp[-4].String += " " + *yyvsp[-3].String;
-    }
-    *yyvsp[-4].String += " " + *yyvsp[-2].String + ", " + *yyvsp[0].String;
-    delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
-    yyval.String = yyvsp[-4].String;
-  }
+#line 2739 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::createUndef(); ;}
+    break;
+
+  case 242:
+#line 2740 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::createZeroInit(); ;}
+    break;
+
+  case 243:
+#line 2741 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { // Nonempty unsized packed vector
+    const Type *ETy = (*(yyvsp[-1].ConstVector))[0].C->getType();
+    int NumElements = (yyvsp[-1].ConstVector)->size(); 
+    PackedType* pt = PackedType::get(ETy, NumElements);
+    PATypeHolder* PTy = new PATypeHolder(
+      HandleUpRefs(PackedType::get(ETy, NumElements)));
+    
+    // Verify all elements are correct type!
+    std::vector<Constant*> Elems;
+    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
+      Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+      const Type *CTy = C->getType();
+      if (ETy != CTy)
+        error("Element #" + utostr(i) + " is not of type '" + 
+              ETy->getDescription() +"' as required!\nIt is of type '" +
+              CTy->getDescription() + "'");
+      Elems.push_back(C);
+    }
+    (yyval.ValIDVal) = ValID::create(ConstantPacked::get(pt, Elems));
+    delete PTy; delete (yyvsp[-1].ConstVector);
+  ;}
     break;
 
   case 244:
-#line 1746 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2762 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Val = new Value;
-    yyval.Val->val = yyvsp[0].String;
-    yyval.Val->constant = false;
-    yyval.Val->type = 0;
-  }
+    (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal).C);
+  ;}
     break;
 
   case 245:
-#line 1752 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2765 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.Val = new Value;
-    yyval.Val->val = yyvsp[0].String;
-    yyval.Val->constant = true;
-    yyval.Val->type = 0;
-  }
+    char *End = UnEscapeLexed((yyvsp[-2].StrVal), true);
+    std::string AsmStr = std::string((yyvsp[-2].StrVal), End);
+    End = UnEscapeLexed((yyvsp[0].StrVal), true);
+    std::string Constraints = std::string((yyvsp[0].StrVal), End);
+    (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[-3].BoolVal));
+    free((yyvsp[-2].StrVal));
+    free((yyvsp[0].StrVal));
+  ;}
     break;
 
   case 246:
-#line 1763 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    yyvsp[-1].Ty = yyvsp[-1].Ty->resolve();
-    std::string Name = getUniqueName(yyvsp[0].Val->val, yyvsp[-1].Ty);
-    yyval.Val = yyvsp[0].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = new std::string(yyvsp[-1].Ty->getNewTy() + " " + Name);
-    yyval.Val->type = yyvsp[-1].Ty;
-  }
+#line 2780 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {  (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal)); ;}
     break;
 
   case 247:
-#line 1772 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    yyval.String = 0;
-  }
-    break;
-
-  case 248:
-#line 1775 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { // Do not allow functions with 0 basic blocks   
-    yyval.String = 0;
-  }
-    break;
-
-  case 249:
-#line 1783 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    yyval.String = 0;
-  }
+#line 2781 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {  (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal)); ;}
     break;
 
   case 250:
-#line 1787 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *O << "    " << *yyvsp[0].String << '\n';
-    delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+#line 2794 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { 
+    const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+    (yyval.ValueVal).S = (yyvsp[-1].TypeVal).S;
+    (yyval.ValueVal).V = getVal(Ty, (yyvsp[0].ValIDVal)); 
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
   case 251:
-#line 1792 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2803 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.String = 0;
-  }
+    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+  ;}
     break;
 
   case 252:
-#line 1795 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2806 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { // Do not allow functions with 0 basic blocks   
+    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+  ;}
+    break;
+
+  case 253:
+#line 2815 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *O << *yyvsp[0].String << '\n';
-    delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+    setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal));
+    InsertValue((yyvsp[0].TermInstVal));
+    (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal));
+    InsertValue((yyvsp[-2].BasicBlockVal));
+    (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal);
+  ;}
     break;
 
   case 254:
-#line 1801 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = yyvsp[0].String; *yyval.String = "unwind"; }
+#line 2825 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if ((yyvsp[0].InstVal).I)
+      (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal).I);
+    (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal);
+  ;}
     break;
 
   case 255:
-#line 1803 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {              // Return with a result...
-    *O << "    " << *yyvsp[-1].String << ' ' << *yyvsp[0].Val->val << '\n';
-    delete yyvsp[-1].String; delete yyvsp[0].Val;
-    yyval.String = 0;
-  }
+#line 2830 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true);
+    // Make sure to move the basic block to the correct location in the
+    // function, instead of leaving it inserted wherever it was first
+    // referenced.
+    Function::BasicBlockListType &BBL = 
+      CurFun.CurrentFunction->getBasicBlockList();
+    BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal));
+  ;}
     break;
 
   case 256:
-#line 1808 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {                                       // Return with no result...
-    *O << "    " << *yyvsp[-1].String << ' ' << yyvsp[0].Ty->getNewTy() << '\n';
-    delete yyvsp[-1].String;
-    yyval.String = 0;
-  }
-    break;
-
-  case 257:
-#line 1813 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {                         // Unconditional Branch...
-    *O << "    " << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].Val->val << '\n';
-    delete yyvsp[-2].String; delete yyvsp[0].Val;
-    yyval.String = 0;
-  }
-    break;
-
-  case 258:
-#line 1818 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {  
-    std::string Name = getUniqueName(yyvsp[-6].Val->val, yyvsp[-7].Ty);
-    *O << "    " << *yyvsp[-8].String << ' ' << yyvsp[-7].Ty->getNewTy() << ' ' << Name << ", " 
-       << yyvsp[-4].Ty->getNewTy() << ' ' << *yyvsp[-3].Val->val << ", " << yyvsp[-1].Ty->getNewTy() << ' ' 
-       << *yyvsp[0].Val->val << '\n';
-    delete yyvsp[-8].String; delete yyvsp[-6].Val; delete yyvsp[-3].Val; delete yyvsp[0].Val;
-    yyval.String = 0;
-  }
+#line 2839 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[0].StrVal)), true);
+    // Make sure to move the basic block to the correct location in the
+    // function, instead of leaving it inserted wherever it was first
+    // referenced.
+    Function::BasicBlockListType &BBL = 
+      CurFun.CurrentFunction->getBasicBlockList();
+    BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal));
+  ;}
     break;
 
   case 259:
-#line 1826 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    std::string Name = getUniqueName(yyvsp[-6].Val->val, yyvsp[-7].Ty);
-    *O << "    " << *yyvsp[-8].String << ' ' << yyvsp[-7].Ty->getNewTy() << ' ' << Name << ", " 
-       << yyvsp[-4].Ty->getNewTy() << ' ' << *yyvsp[-3].Val->val << " [" << *yyvsp[-1].String << " ]\n";
-    delete yyvsp[-8].String; 
-    delete yyvsp[-6].Val;
-    delete yyvsp[-3].Val; 
-    delete yyvsp[-1].String;
-    yyval.String = 0;
-  }
+#line 2853 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {              // Return with a result...
+    (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal).V);
+  ;}
     break;
 
   case 260:
-#line 1836 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    std::string Name = getUniqueName(yyvsp[-5].Val->val, yyvsp[-6].Ty);
-    *O << "    " << *yyvsp[-7].String << ' ' << yyvsp[-6].Ty->getNewTy() << ' ' << Name << ", " 
-       << yyvsp[-3].Ty->getNewTy() << ' ' << *yyvsp[-2].Val->val << "[]\n";
-    delete yyvsp[-7].String; 
-    delete yyvsp[-5].Val; 
-    delete yyvsp[-2].Val;
-    yyval.String = 0;
-  }
+#line 2856 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {                                       // Return with no result...
+    (yyval.TermInstVal) = new ReturnInst();
+  ;}
     break;
 
   case 261:
-#line 1846 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    const Type* ResTy = getFunctionReturnType(yyvsp[-10].Ty);
-    *O << "    ";
-    if (!yyvsp[-13].String->empty()) {
-      std::string Name = getUniqueName(yyvsp[-13].String, ResTy);
-      *O << Name << " = ";
-    }
-    *O << *yyvsp[-12].String << ' ' << *yyvsp[-11].String << ' ' << yyvsp[-10].Ty->getNewTy() << ' ' << *yyvsp[-9].Val->val << " (";
-    for (unsigned i = 0; i < yyvsp[-7].ValList->size(); ++i) {
-      Value* V = (*yyvsp[-7].ValList)[i];
-      *O << *V->val;
-      if (i+1 < yyvsp[-7].ValList->size())
-        *O << ", ";
-      delete V;
-    }
-    *O << ") " << *yyvsp[-5].String << ' ' << yyvsp[-4].Ty->getNewTy() << ' ' << *yyvsp[-3].Val->val << ' ' 
-       << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].Val->val << '\n';
-    delete yyvsp[-13].String; delete yyvsp[-12].String; delete yyvsp[-11].String; delete yyvsp[-9].Val; delete yyvsp[-7].ValList; 
-    delete yyvsp[-5].String; delete yyvsp[-3].Val; delete yyvsp[-2].String; delete yyvsp[0].Val; 
-    yyval.String = 0;
-  }
+#line 2859 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {                         // Unconditional Branch...
+    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    (yyval.TermInstVal) = new BranchInst(tmpBB);
+  ;}
     break;
 
   case 262:
-#line 1867 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *O << "    " << *yyvsp[0].String << '\n';
-    delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+#line 2863 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {  
+    BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal));
+    BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal));
+    Value* tmpVal = getVal(Type::Int1Ty, (yyvsp[-6].ValIDVal));
+    (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal);
+  ;}
     break;
 
   case 263:
-#line 1872 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2869 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *O << "    " << *yyvsp[0].String << '\n';
-    delete yyvsp[0].String;
-    yyval.String = 0;
-  }
+    Value* tmpVal = getVal((yyvsp[-7].PrimType).T, (yyvsp[-6].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal));
+    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size());
+    (yyval.TermInstVal) = S;
+    std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[-1].JumpTable)->begin(),
+      E = (yyvsp[-1].JumpTable)->end();
+    for (; I != E; ++I) {
+      if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
+          S->addCase(CI, I->second);
+      else
+        error("Switch case is constant, but not a simple integer");
+    }
+    delete (yyvsp[-1].JumpTable);
+  ;}
     break;
 
   case 264:
-#line 1878 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2884 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-5].String += " " + yyvsp[-4].Ty->getNewTy() + " " + *yyvsp[-3].String + ", " + yyvsp[-1].Ty->getNewTy() + " " + 
-           *yyvsp[0].Val->val;
-    delete yyvsp[-3].String; delete yyvsp[0].Val;
-    yyval.String = yyvsp[-5].String;
-  }
+    Value* tmpVal = getVal((yyvsp[-6].PrimType).T, (yyvsp[-5].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal));
+    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
+    (yyval.TermInstVal) = S;
+  ;}
     break;
 
   case 265:
-#line 1884 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2891 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyvsp[-3].String->insert(0, yyvsp[-4].Ty->getNewTy() + " " );
-    *yyvsp[-3].String += ", " + yyvsp[-1].Ty->getNewTy() + " " + *yyvsp[0].Val->val;
-    delete yyvsp[0].Val;
-    yyval.String = yyvsp[-3].String;
-  }
+    const PointerType *PFTy;
+    const FunctionType *Ty;
+
+    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-10].TypeVal).T->get())) ||
+        !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
+      // Pull out the types of all of the arguments...
+      std::vector<const Type*> ParamTypes;
+      if ((yyvsp[-7].ValueList)) {
+        for (std::vector<ValueInfo>::iterator I = (yyvsp[-7].ValueList)->begin(), E = (yyvsp[-7].ValueList)->end();
+             I != E; ++I)
+          ParamTypes.push_back((*I).V->getType());
+      }
+      bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
+      if (isVarArg) ParamTypes.pop_back();
+      Ty = FunctionType::get((yyvsp[-10].TypeVal).T->get(), ParamTypes, isVarArg);
+      PFTy = PointerType::get(Ty);
+    }
+    Value *V = getVal(PFTy, (yyvsp[-9].ValIDVal));   // Get the function we're calling...
+    BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal));
+    BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal));
+
+    // Create the call node...
+    if (!(yyvsp[-7].ValueList)) {                                   // Has no arguments?
+      (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector<Value*>());
+    } else {                                     // Has arguments?
+      // Loop through FunctionType's arguments and ensure they are specified
+      // correctly!
+      //
+      FunctionType::param_iterator I = Ty->param_begin();
+      FunctionType::param_iterator E = Ty->param_end();
+      std::vector<ValueInfo>::iterator ArgI = (yyvsp[-7].ValueList)->begin(), ArgE = (yyvsp[-7].ValueList)->end();
+
+      std::vector<Value*> Args;
+      for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
+        if ((*ArgI).V->getType() != *I)
+          error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
+                (*I)->getDescription() + "'");
+        Args.push_back((*ArgI).V);
+      }
+
+      if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
+        error("Invalid number of parameters detected");
+
+      (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, Args);
+    }
+    cast<InvokeInst>((yyval.TermInstVal))->setCallingConv((yyvsp[-11].UIntVal));
+    delete (yyvsp[-10].TypeVal).T;
+    delete (yyvsp[-7].ValueList);
+  ;}
     break;
 
   case 266:
-#line 1892 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2941 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!yyvsp[-1].String->empty()) {
-      // Get a unique name for this value, based on its type.
-      std::string Name = getUniqueName(yyvsp[-1].String, yyvsp[0].Val->type);
-      *yyvsp[-1].String = Name + " = ";
-      if (deleteUselessCastFlag && *deleteUselessCastName == Name) {
-        // don't actually delete it, just comment it out
-        yyvsp[-1].String->insert(0, "; USELSS BITCAST: "); 
-        delete deleteUselessCastName;
-      }
-    }
-    *yyvsp[-1].String += *yyvsp[0].Val->val;
-    delete yyvsp[0].Val;
-    deleteUselessCastFlag = false;
-    yyval.String = yyvsp[-1].String; 
-  }
+    (yyval.TermInstVal) = new UnwindInst();
+  ;}
     break;
 
   case 267:
-#line 1910 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {    // Used for PHI nodes
-    std::string Name = getUniqueName(yyvsp[-3].Val->val, yyvsp[-5].Ty);
-    Name.insert(0, yyvsp[-5].Ty->getNewTy() + "[");
-    Name += "," + *yyvsp[-1].Val->val + "]";
-    yyval.Val = new Value;
-    yyval.Val->val = new std::string(Name);
-    yyval.Val->type = yyvsp[-5].Ty;
-    delete yyvsp[-3].Val; delete yyvsp[-1].Val;
-  }
+#line 2944 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.TermInstVal) = new UnreachableInst();
+  ;}
     break;
 
   case 268:
-#line 1919 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2950 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    std::string Name = getUniqueName(yyvsp[-3].Val->val, yyvsp[-6].Val->type);
-    *yyvsp[-6].Val->val += ", [" + Name + "," + *yyvsp[-1].Val->val + "]";
-    delete yyvsp[-3].Val; 
-    delete yyvsp[-1].Val;
-    yyval.Val = yyvsp[-6].Val;
-  }
+    (yyval.JumpTable) = (yyvsp[-5].JumpTable);
+    Constant *V = cast<Constant>(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal)));
+    
+    if (V == 0)
+      error("May only switch on a constant pool value");
+
+    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB));
+  ;}
     break;
 
   case 269:
-#line 1929 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2960 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.ValList = new ValueList();
-    yyval.ValList->push_back(yyvsp[0].Val);
-  }
+    (yyval.JumpTable) = new std::vector<std::pair<Constant*, BasicBlock*> >();
+    Constant *V = cast<Constant>(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal)));
+
+    if (V == 0)
+      error("May only switch on a constant pool value");
+
+    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); 
+  ;}
     break;
 
   case 270:
-#line 1933 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2973 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.ValList = yyvsp[-2].ValList;
-    yyval.ValList->push_back(yyvsp[0].Val);
-  }
+    bool omit = false;
+    if ((yyvsp[-1].StrVal))
+      if (BitCastInst *BCI = dyn_cast<BitCastInst>((yyvsp[0].InstVal).I))
+        if (BCI->getSrcTy() == BCI->getDestTy() && 
+            BCI->getOperand(0)->getName() == (yyvsp[-1].StrVal))
+          // This is a useless bit cast causing a name redefinition. It is
+          // a bit cast from a type to the same type of an operand with the
+          // same name as the name we would give this instruction. Since this
+          // instruction results in no code generation, it is safe to omit
+          // the instruction. This situation can occur because of collapsed
+          // type planes. For example:
+          //   %X = add int %Y, %Z
+          //   %X = cast int %Y to uint
+          // After upgrade, this looks like:
+          //   %X = add i32 %Y, %Z
+          //   %X = bitcast i32 to i32
+          // The bitcast is clearly useless so we omit it.
+          omit = true;
+    if (omit) {
+      (yyval.InstVal).I = 0;
+      (yyval.InstVal).S = Signless;
+    } else {
+      setValueName((yyvsp[0].InstVal).I, (yyvsp[-1].StrVal));
+      InsertValue((yyvsp[0].InstVal).I);
+      (yyval.InstVal) = (yyvsp[0].InstVal);
+    }
+  ;}
     break;
 
   case 271:
-#line 1940 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.ValList = yyvsp[0].ValList; }
+#line 3002 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {    // Used for PHI nodes
+    (yyval.PHIList).P = new std::list<std::pair<Value*, BasicBlock*> >();
+    (yyval.PHIList).S = (yyvsp[-5].TypeVal).S;
+    Value* tmpVal = getVal((yyvsp[-5].TypeVal).T->get(), (yyvsp[-3].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+    (yyval.PHIList).P->push_back(std::make_pair(tmpVal, tmpBB));
+    delete (yyvsp[-5].TypeVal).T;
+  ;}
     break;
 
   case 272:
-#line 1941 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.ValList = new ValueList(); }
+#line 3010 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.PHIList) = (yyvsp[-6].PHIList);
+    Value* tmpVal = getVal((yyvsp[-6].PHIList).P->front().first->getType(), (yyvsp[-3].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+    (yyvsp[-6].PHIList).P->push_back(std::make_pair(tmpVal, tmpBB));
+  ;}
     break;
 
   case 273:
-#line 1945 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *yyvsp[-1].String += " " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-    yyval.String = yyvsp[-1].String;
-  }
+#line 3018 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {    // Used for call statements, and memory insts...
+    (yyval.ValueList) = new std::vector<ValueInfo>();
+    (yyval.ValueList)->push_back((yyvsp[0].ValueVal));
+  ;}
     break;
 
-  case 275:
-#line 1953 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    const char* op = getDivRemOpcode(*yyvsp[-4].String, yyvsp[-3].Ty); 
-    std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
-    std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = new std::string(op);
-    *yyval.Val->val += " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + ", " + Name2;
-    yyval.Val->type = yyvsp[-3].Ty;
-    delete yyvsp[-4].String; delete yyvsp[0].Val;
-  }
+  case 274:
+#line 3022 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.ValueList) = (yyvsp[-2].ValueList);
+    (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal));
+  ;}
     break;
 
   case 276:
-#line 1964 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
-    std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
-    *yyvsp[-4].String += " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + ", " + Name2;
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-4].String;
-    yyval.Val->type = yyvsp[-3].Ty;
-    delete yyvsp[0].Val;
-  }
+#line 3030 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValueList) = 0; ;}
     break;
 
   case 277:
-#line 1974 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3034 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
-    std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
-    *yyvsp[-4].String = getCompareOp(*yyvsp[-4].String, yyvsp[-3].Ty);
-    *yyvsp[-4].String += " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + ", " + Name2;
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-4].String;
-    yyval.Val->type = Type::get("i1",BoolTy);
-    delete yyvsp[0].Val;
-  }
+    (yyval.BoolVal) = true;
+  ;}
     break;
 
   case 278:
-#line 1985 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3037 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
-    std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
-    *yyvsp[-5].String += " " + *yyvsp[-4].String + " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + "," + Name2;
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-5].String;
-    yyval.Val->type = Type::get("i1",BoolTy);
-    delete yyvsp[-4].String; delete yyvsp[0].Val;
-  }
+    (yyval.BoolVal) = false;
+  ;}
     break;
 
   case 279:
-#line 1995 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3043 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
-    std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
-    *yyvsp[-5].String += " " + *yyvsp[-4].String + " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + "," + Name2;
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-5].String;
-    yyval.Val->type = Type::get("i1",BoolTy);
-    delete yyvsp[-4].String; delete yyvsp[0].Val;
-  }
+    const Type* Ty = (yyvsp[-3].TypeVal).T->get();
+    if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa<PackedType>(Ty))
+      error("Arithmetic operator requires integer, FP, or packed operands");
+    if (isa<PackedType>(Ty) && 
+        ((yyvsp[-4].BinaryOpVal) == URemOp || (yyvsp[-4].BinaryOpVal) == SRemOp || (yyvsp[-4].BinaryOpVal) == FRemOp || (yyvsp[-4].BinaryOpVal) == RemOp))
+      error("Remainder not supported on packed types");
+    // Upgrade the opcode from obsolete versions before we do anything with it.
+    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-4].BinaryOpVal), Ty, (yyvsp[-3].TypeVal).S);
+    Value* val1 = getVal(Ty, (yyvsp[-2].ValIDVal)); 
+    Value* val2 = getVal(Ty, (yyvsp[0].ValIDVal));
+    (yyval.InstVal).I = BinaryOperator::create(Opcode, val1, val2);
+    if ((yyval.InstVal).I == 0)
+      error("binary operator returned null");
+    (yyval.InstVal).S = (yyvsp[-3].TypeVal).S;
+    delete (yyvsp[-3].TypeVal).T;
+  ;}
     break;
 
   case 280:
-#line 2005 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3060 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const char* shiftop = yyvsp[-3].String->c_str();
-    if (*yyvsp[-3].String == "shr")
-      shiftop = (yyvsp[-2].Val->type->isUnsigned()) ? "lshr" : "ashr";
-    std::string *val = new std::string(shiftop);
-    *val += " " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = val;
-    delete yyvsp[-3].String; delete yyvsp[0].Val;
-  }
+    const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+    if (!Ty->isInteger()) {
+      if (!isa<PackedType>(Ty) ||
+          !cast<PackedType>(Ty)->getElementType()->isInteger())
+        error("Logical operator requires integral operands");
+    }
+    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-4].BinaryOpVal), Ty, (yyvsp[-3].TypeVal).S);
+    Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+    Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+    (yyval.InstVal).I = BinaryOperator::create(Opcode, tmpVal1, tmpVal2);
+    if ((yyval.InstVal).I == 0)
+      error("binary operator returned null");
+    (yyval.InstVal).S = (yyvsp[-3].TypeVal).S;
+    delete (yyvsp[-3].TypeVal).T;
+  ;}
     break;
 
   case 281:
-#line 2016 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3076 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    std::string source = *yyvsp[-2].Val->val;
-    const Type* SrcTy = yyvsp[-2].Val->type->resolve();
-    const Type* DstTy = yyvsp[0].Ty->resolve();
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = new std::string();
-    yyval.Val->type = DstTy;
-    if (*yyvsp[-3].String == "cast") {
-      *yyval.Val->val += getCastUpgrade(source, SrcTy, DstTy, false);
-    } else {
-      *yyval.Val->val += *yyvsp[-3].String + " " + source + " to " + DstTy->getNewTy();
-    }
-    // Check to see if this is a useless cast of a value to the same name
-    // and the same type. Such casts will probably cause redefinition errors
-    // when assembled and perform no code gen action so just remove them.
-    if (*yyvsp[-3].String == "cast" || *yyvsp[-3].String == "bitcast")
-      if (SrcTy->isInteger() && DstTy->isInteger() &&
-          SrcTy->getBitWidth() == DstTy->getBitWidth()) {
-        deleteUselessCastFlag = true; // Flag the "Inst" rule
-        deleteUselessCastName = new std::string(*yyvsp[-2].Val->val); // save the name
-        size_t pos = deleteUselessCastName->find_first_of("%\"",0);
-        if (pos != std::string::npos) {
-          // remove the type portion before val
-          deleteUselessCastName->erase(0, pos);
-        }
-      }
-    delete yyvsp[-3].String; 
-    delete yyvsp[-1].String;
-  }
+    const Type* Ty = (yyvsp[-3].TypeVal).T->get();
+    if(isa<PackedType>(Ty))
+      error("PackedTypes currently not supported in setcc instructions");
+    unsigned short pred;
+    Instruction::OtherOps Opcode = getCompareOp((yyvsp[-4].BinaryOpVal), pred, Ty, (yyvsp[-3].TypeVal).S);
+    Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+    Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+    (yyval.InstVal).I = CmpInst::create(Opcode, pred, tmpVal1, tmpVal2);
+    if ((yyval.InstVal).I == 0)
+      error("binary operator returned null");
+    (yyval.InstVal).S = Unsigned;
+    delete (yyvsp[-3].TypeVal).T;
+  ;}
     break;
 
   case 282:
-#line 2046 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3090 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-5].String += " " + *yyvsp[-4].Val->val + ", " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
-    yyval.Val = yyvsp[-4].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-5].String;
-    yyval.Val->type = yyvsp[-2].Val->type;
-    delete yyvsp[-2].Val;
-    delete yyvsp[0].Val;
-  }
+    const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+    if (isa<PackedType>(Ty)) 
+      error("PackedTypes currently not supported in icmp instructions");
+    else if (!Ty->isInteger() && !isa<PointerType>(Ty))
+      error("icmp requires integer or pointer typed operands");
+    Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+    Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+    (yyval.InstVal).I = new ICmpInst((yyvsp[-4].IPred), tmpVal1, tmpVal2);
+    (yyval.InstVal).S = Unsigned;
+    delete (yyvsp[-3].TypeVal).T;
+  ;}
     break;
 
   case 283:
-#line 2055 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3102 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-3].String += " " + *yyvsp[-2].Val->val + ", " + yyvsp[0].Ty->getNewTy();
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-3].String;
-    yyval.Val->type = yyvsp[0].Ty;
-  }
+    const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+    if (isa<PackedType>(Ty))
+      error("PackedTypes currently not supported in fcmp instructions");
+    else if (!Ty->isFloatingPoint())
+      error("fcmp instruction requires floating point operands");
+    Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+    Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+    (yyval.InstVal).I = new FCmpInst((yyvsp[-4].FPred), tmpVal1, tmpVal2);
+    (yyval.InstVal).S = Unsigned;
+    delete (yyvsp[-3].TypeVal).T;
+  ;}
     break;
 
   case 284:
-#line 2062 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3114 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-3].String += " " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
-    yyval.Val = yyvsp[-2].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-3].String;
-    yyval.Val->type = yyval.Val->type->resolve();
-    yyval.Val->type = yyval.Val->type->getElementType();
-    delete yyvsp[0].Val;
-  }
+    warning("Use of obsolete 'not' instruction: Replacing with 'xor");
+    const Type *Ty = (yyvsp[0].ValueVal).V->getType();
+    Value *Ones = ConstantInt::getAllOnesValue(Ty);
+    if (Ones == 0)
+      error("Expected integral type for not instruction");
+    (yyval.InstVal).I = BinaryOperator::create(Instruction::Xor, (yyvsp[0].ValueVal).V, Ones);
+    if ((yyval.InstVal).I == 0)
+      error("Could not create a xor instruction");
+    (yyval.InstVal).S = (yyvsp[0].ValueVal).S
+  ;}
     break;
 
   case 285:
-#line 2071 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3125 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-5].String += " " + *yyvsp[-4].Val->val + ", " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
-    yyval.Val = yyvsp[-4].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-5].String;
-    delete yyvsp[-2].Val; delete yyvsp[0].Val;
-  }
+    if (!(yyvsp[0].ValueVal).V->getType()->isInteger() ||
+        cast<IntegerType>((yyvsp[0].ValueVal).V->getType())->getBitWidth() != 8)
+      error("Shift amount must be int8");
+    if (!(yyvsp[-2].ValueVal).V->getType()->isInteger())
+      error("Shift constant expression requires integer operand");
+    (yyval.InstVal).I = new ShiftInst(getOtherOp((yyvsp[-3].OtherOpVal), (yyvsp[-2].ValueVal).S), (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[-2].ValueVal).S;
+  ;}
     break;
 
   case 286:
-#line 2078 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3134 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-5].String += " " + *yyvsp[-4].Val->val + ", " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
-    yyval.Val = yyvsp[-4].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-5].String;
-    delete yyvsp[-2].Val; delete yyvsp[0].Val;
-  }
+    const Type *DstTy = (yyvsp[0].TypeVal).T->get();
+    if (!DstTy->isFirstClassType())
+      error("cast instruction to a non-primitive type: '" +
+            DstTy->getDescription() + "'");
+    (yyval.InstVal).I = cast<Instruction>(getCast((yyvsp[-3].CastOpVal), (yyvsp[-2].ValueVal).V, (yyvsp[-2].ValueVal).S, DstTy, (yyvsp[0].TypeVal).S, true));
+    (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
+    delete (yyvsp[0].TypeVal).T;
+  ;}
     break;
 
   case 287:
-#line 2085 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3143 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-1].String += " " + *yyvsp[0].Val->val;
-    yyval.Val = yyvsp[0].Val;
-    delete yyvsp[0].Val->val;
-    yyval.Val->val = yyvsp[-1].String;
-  }
+    if (!(yyvsp[-4].ValueVal).V->getType()->isInteger() ||
+        cast<IntegerType>((yyvsp[-4].ValueVal).V->getType())->getBitWidth() != 1)
+      error("select condition must be bool");
+    if ((yyvsp[-2].ValueVal).V->getType() != (yyvsp[0].ValueVal).V->getType())
+      error("select value types should match");
+    (yyval.InstVal).I = new SelectInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+  ;}
     break;
 
   case 288:
-#line 2091 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3152 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    // map llvm.isunordered to "fcmp uno" 
-    yyval.Val = new Value;
-    if (*yyvsp[-3].Val->val == "%llvm.isunordered.f32" ||
-        *yyvsp[-3].Val->val == "%llvm.isunordered.f64") {
-      yyval.Val->val = new std::string( "fcmp uno " + *(*yyvsp[-1].ValList)[0]->val + ", ");
-      size_t pos = (*yyvsp[-1].ValList)[1]->val->find(' ');
-      assert(pos != std::string::npos && "no space?");
-      *yyval.Val->val += (*yyvsp[-1].ValList)[1]->val->substr(pos+1);
-      yyval.Val->type = Type::get("i1", BoolTy);
-    } else {
-      static unsigned upgradeCount = 1;
-      if (*yyvsp[-3].Val->val == "%llvm.va_start" || *yyvsp[-3].Val->val == "%llvm.va_end") {
-        if (!yyvsp[-1].ValList->empty()) {
-          std::string name("%va_upgrade");
-          name += llvm::utostr(upgradeCount++);
-          yyvsp[-6].String->insert(0, name + " = bitcast " + *(*yyvsp[-1].ValList)[0]->val + " to i8*\n    ");
-          *(*yyvsp[-1].ValList)[0]->val = "i8* " + name;
-          (*yyvsp[-1].ValList)[0]->type = Type::get("i8", UByteTy)->getPointerType();
-        }
-      } else if (*yyvsp[-3].Val->val == "%llvm.va_copy") {
-        std::string name0("%va_upgrade");
-        name0 += llvm::utostr(upgradeCount++);
-        std::string name1("%va_upgrade");
-        name1 += llvm::utostr(upgradeCount++);
-        yyvsp[-6].String->insert(0, name0 + " = bitcast " + *(*yyvsp[-1].ValList)[0]->val + " to i8*\n    " +
-                      name1 + " = bitcast " + *(*yyvsp[-1].ValList)[1]->val + " to i8*\n    ");
-        *(*yyvsp[-1].ValList)[0]->val = "i8* " + name0;
-        (*yyvsp[-1].ValList)[0]->type = Type::get("i8", UByteTy)->getPointerType();
-        *(*yyvsp[-1].ValList)[1]->val = "i8* " + name1;
-        (*yyvsp[-1].ValList)[0]->type = Type::get("i8", UByteTy)->getPointerType();
-      }
-      if (!yyvsp[-5].String->empty())
-        *yyvsp[-6].String += " " + *yyvsp[-5].String;
-      if (!yyvsp[-6].String->empty())
-        *yyvsp[-6].String += " ";
-      *yyvsp[-6].String += yyvsp[-4].Ty->getNewTy() + " " + *yyvsp[-3].Val->val + "(";
-      for (unsigned i = 0; i < yyvsp[-1].ValList->size(); ++i) {
-        Value* V = (*yyvsp[-1].ValList)[i];
-        *yyvsp[-6].String += *V->val;
-        if (i+1 < yyvsp[-1].ValList->size())
-          *yyvsp[-6].String += ", ";
-        delete V;
-      }
-      *yyvsp[-6].String += ")";
-      yyval.Val = new Value;
-      yyval.Val->val = yyvsp[-6].String;
-      yyval.Val->type = getFunctionReturnType(yyvsp[-4].Ty);
-    }
-    delete yyvsp[-5].String; delete yyvsp[-3].Val; delete yyvsp[-1].ValList;
-  }
+    const Type *Ty = (yyvsp[0].TypeVal).T->get();
+    NewVarArgs = true;
+    (yyval.InstVal).I = new VAArgInst((yyvsp[-2].ValueVal).V, Ty);
+    (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
+    delete (yyvsp[0].TypeVal).T;
+  ;}
+    break;
+
+  case 289:
+#line 3159 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType();
+    const Type* DstTy = (yyvsp[0].TypeVal).T->get();
+    ObsoleteVarArgs = true;
+    Function* NF = cast<Function>(CurModule.CurrentModule->
+      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+
+    //b = vaarg a, t -> 
+    //foo = alloca 1 of t
+    //bar = vacopy a 
+    //store bar -> foo
+    //b = vaarg foo, t
+    AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix");
+    CurBB->getInstList().push_back(foo);
+    CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal).V);
+    CurBB->getInstList().push_back(bar);
+    CurBB->getInstList().push_back(new StoreInst(bar, foo));
+    (yyval.InstVal).I = new VAArgInst(foo, DstTy);
+    (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
+    delete (yyvsp[0].TypeVal).T;
+  ;}
     break;
 
   case 290:
-#line 2147 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.ValList = yyvsp[0].ValList; }
+#line 3180 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType();
+    const Type* DstTy = (yyvsp[0].TypeVal).T->get();
+    ObsoleteVarArgs = true;
+    Function* NF = cast<Function>(CurModule.CurrentModule->
+      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+
+    //b = vanext a, t ->
+    //foo = alloca 1 of t
+    //bar = vacopy a
+    //store bar -> foo
+    //tmp = vaarg foo, t
+    //b = load foo
+    AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix");
+    CurBB->getInstList().push_back(foo);
+    CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal).V);
+    CurBB->getInstList().push_back(bar);
+    CurBB->getInstList().push_back(new StoreInst(bar, foo));
+    Instruction* tmp = new VAArgInst(foo, DstTy);
+    CurBB->getInstList().push_back(tmp);
+    (yyval.InstVal).I = new LoadInst(foo);
+    (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
+    delete (yyvsp[0].TypeVal).T;
+  ;}
     break;
 
   case 291:
-#line 2148 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {  yyval.ValList = new ValueList(); }
+#line 3204 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+      error("Invalid extractelement operands");
+    (yyval.InstVal).I = new ExtractElementInst((yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[-2].ValueVal).S;
+  ;}
+    break;
+
+  case 292:
+#line 3210 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+      error("Invalid insertelement operands");
+    (yyval.InstVal).I = new InsertElementInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+  ;}
     break;
 
   case 293:
-#line 2153 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+#line 3216 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+      error("Invalid shufflevector operands");
+    (yyval.InstVal).I = new ShuffleVectorInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+  ;}
     break;
 
   case 294:
-#line 2156 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3222 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-2].String += " " + yyvsp[-1].Ty->getNewTy();
-    if (!yyvsp[0].String->empty())
-      *yyvsp[-2].String += " " + *yyvsp[0].String;
-    yyval.Val = new Value;
-    yyval.Val->val = yyvsp[-2].String;
-    yyval.Val->type = yyvsp[-1].Ty->getPointerType();
-    delete yyvsp[0].String;
-  }
+    const Type *Ty = (yyvsp[0].PHIList).P->front().first->getType();
+    if (!Ty->isFirstClassType())
+      error("PHI node operands must be of first class type");
+    PHINode *PHI = new PHINode(Ty);
+    PHI->reserveOperandSpace((yyvsp[0].PHIList).P->size());
+    while ((yyvsp[0].PHIList).P->begin() != (yyvsp[0].PHIList).P->end()) {
+      if ((yyvsp[0].PHIList).P->front().first->getType() != Ty) 
+        error("All elements of a PHI node must be of the same type");
+      PHI->addIncoming((yyvsp[0].PHIList).P->front().first, (yyvsp[0].PHIList).P->front().second);
+      (yyvsp[0].PHIList).P->pop_front();
+    }
+    (yyval.InstVal).I = PHI;
+    (yyval.InstVal).S = (yyvsp[0].PHIList).S;
+    delete (yyvsp[0].PHIList).P;  // Free the list...
+  ;}
     break;
 
   case 295:
-#line 2165 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3238 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    std::string Name = getUniqueName(yyvsp[-1].Val->val, yyvsp[-2].Ty);
-    *yyvsp[-5].String += " " + yyvsp[-4].Ty->getNewTy() + ", " + yyvsp[-2].Ty->getNewTy() + " " + Name;
-    if (!yyvsp[0].String->empty())
-      *yyvsp[-5].String += " " + *yyvsp[0].String;
-    yyval.Val = new Value;
-    yyval.Val->val = yyvsp[-5].String;
-    yyval.Val->type = yyvsp[-4].Ty->getPointerType();
-    delete yyvsp[-1].Val; delete yyvsp[0].String;
-  }
+
+    // Handle the short call syntax
+    const PointerType *PFTy;
+    const FunctionType *FTy;
+    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-4].TypeVal).T->get())) ||
+        !(FTy = dyn_cast<FunctionType>(PFTy->getElementType()))) {
+      // Pull out the types of all of the arguments...
+      std::vector<const Type*> ParamTypes;
+      if ((yyvsp[-1].ValueList)) {
+        for (std::vector<ValueInfo>::iterator I = (yyvsp[-1].ValueList)->begin(), E = (yyvsp[-1].ValueList)->end();
+             I != E; ++I)
+          ParamTypes.push_back((*I).V->getType());
+      }
+
+      bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
+      if (isVarArg) ParamTypes.pop_back();
+
+      const Type *RetTy = (yyvsp[-4].TypeVal).T->get();
+      if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
+        error("Functions cannot return aggregate types");
+
+      FTy = FunctionType::get(RetTy, ParamTypes, isVarArg);
+      PFTy = PointerType::get(FTy);
+    }
+
+    // First upgrade any intrinsic calls.
+    std::vector<Value*> Args;
+    if ((yyvsp[-1].ValueList))
+      for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i < e; ++i) 
+        Args.push_back((*(yyvsp[-1].ValueList))[i].V);
+    Instruction *Inst = upgradeIntrinsicCall(FTy, (yyvsp[-3].ValIDVal), Args);
+
+    // If we got an upgraded intrinsic
+    if (Inst) {
+      (yyval.InstVal).I = Inst;
+      (yyval.InstVal).S = Signless;
+    } else {
+      // Get the function we're calling
+      Value *V = getVal(PFTy, (yyvsp[-3].ValIDVal));
+
+      // Check the argument values match
+      if (!(yyvsp[-1].ValueList)) {                                   // Has no arguments?
+        // Make sure no arguments is a good thing!
+        if (FTy->getNumParams() != 0)
+          error("No arguments passed to a function that expects arguments");
+      } else {                                     // Has arguments?
+        // Loop through FunctionType's arguments and ensure they are specified
+        // correctly!
+        //
+        FunctionType::param_iterator I = FTy->param_begin();
+        FunctionType::param_iterator E = FTy->param_end();
+        std::vector<ValueInfo>::iterator ArgI = (yyvsp[-1].ValueList)->begin(), ArgE = (yyvsp[-1].ValueList)->end();
+
+        for (; ArgI != ArgE && I != E; ++ArgI, ++I)
+          if ((*ArgI).V->getType() != *I)
+            error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
+                  (*I)->getDescription() + "'");
+
+        if (I != E || (ArgI != ArgE && !FTy->isVarArg()))
+          error("Invalid number of parameters detected");
+      }
+
+      // Create the call instruction
+      CallInst *CI = new CallInst(V, Args);
+      CI->setTailCall((yyvsp[-6].BoolVal));
+      CI->setCallingConv((yyvsp[-5].UIntVal));
+      (yyval.InstVal).I = CI;
+      (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
+    }
+    delete (yyvsp[-4].TypeVal).T;
+    delete (yyvsp[-1].ValueList);
+  ;}
     break;
 
   case 296:
-#line 2175 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3311 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    *yyvsp[-2].String += " " + yyvsp[-1].Ty->getNewTy();
-    if (!yyvsp[0].String->empty())
-      *yyvsp[-2].String += " " + *yyvsp[0].String;
-    yyval.Val = new Value;
-    yyval.Val->val = yyvsp[-2].String;
-    yyval.Val->type = yyvsp[-1].Ty->getPointerType();
-    delete yyvsp[0].String;
-  }
+    (yyval.InstVal) = (yyvsp[0].InstVal);
+  ;}
     break;
 
   case 297:
-#line 2184 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    std::string Name = getUniqueName(yyvsp[-1].Val->val, yyvsp[-2].Ty);
-    *yyvsp[-5].String += " " + yyvsp[-4].Ty->getNewTy() + ", " + yyvsp[-2].Ty->getNewTy() + " " + Name;
-    if (!yyvsp[0].String->empty())
-      *yyvsp[-5].String += " " + *yyvsp[0].String;
-    yyval.Val = yyvsp[-1].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-5].String;
-    yyval.Val->type = yyvsp[-4].Ty->getPointerType();
-    delete yyvsp[0].String;
-  }
+#line 3319 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValueList) = (yyvsp[0].ValueList); ;}
     break;
 
   case 298:
-#line 2195 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *yyvsp[-1].String += " " + *yyvsp[0].Val->val;
-    yyval.Val = yyvsp[0].Val;
-    delete yyvsp[0].Val->val;
-    yyval.Val->val = yyvsp[-1].String;
-    yyval.Val->type = Type::get("void", VoidTy); 
-  }
+#line 3320 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValueList) = new std::vector<ValueInfo>(); ;}
     break;
 
   case 299:
-#line 2202 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    std::string Name = getUniqueName(yyvsp[0].Val->val, yyvsp[-1].Ty);
-    if (!yyvsp[-3].String->empty())
-      *yyvsp[-3].String += " ";
-    *yyvsp[-3].String += *yyvsp[-2].String + " " + yyvsp[-1].Ty->getNewTy() + " " + Name;
-    yyval.Val = yyvsp[0].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-3].String;
-    yyval.Val->type = yyvsp[-1].Ty->getElementType();
-    delete yyvsp[-2].String;
-  }
+#line 3324 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.BoolVal) = true; ;}
     break;
 
   case 300:
-#line 2213 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    std::string Name = getUniqueName(yyvsp[0].Val->val, yyvsp[-1].Ty);
-    if (!yyvsp[-5].String->empty())
-      *yyvsp[-5].String += " ";
-    *yyvsp[-5].String += *yyvsp[-4].String + " " + *yyvsp[-3].Val->val + ", " + yyvsp[-1].Ty->getNewTy() + " " + Name;
-    yyval.Val = yyvsp[-3].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-5].String;
-    yyval.Val->type = Type::get("void", VoidTy);
-    delete yyvsp[-4].String; delete yyvsp[0].Val;
-  }
+#line 3325 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.BoolVal) = false; ;}
     break;
 
   case 301:
-#line 2224 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3329 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    std::string Name = getUniqueName(yyvsp[-1].Val->val, yyvsp[-2].Ty);
-    // Upgrade the indices
-    for (unsigned i = 0; i < yyvsp[0].ValList->size(); ++i) {
-      Value* V = (*yyvsp[0].ValList)[i];
-      if (V->type->isUnsigned() && !V->isConstant() && 
-          V->type->getBitWidth() < 64) {
-        *O << "    %gep_upgrade" << UniqueNameCounter << " = zext " << *V->val 
-           << " to i64\n";
-        *V->val = "i64 %gep_upgrade" + llvm::utostr(UniqueNameCounter++);
-        V->type = Type::get("i64",ULongTy);
-      }
-    }
-    *yyvsp[-3].String += " " + yyvsp[-2].Ty->getNewTy() + " " + Name;
-    for (unsigned i = 0; i < yyvsp[0].ValList->size(); ++i) {
-      Value* V = (*yyvsp[0].ValList)[i];
-      *yyvsp[-3].String += ", " + *V->val;
-    }
-    yyval.Val = yyvsp[-1].Val;
-    delete yyval.Val->val;
-    yyval.Val->val = yyvsp[-3].String;
-    yyval.Val->type = getGEPIndexedType(yyvsp[-2].Ty,yyvsp[0].ValList); 
-    for (unsigned i = 0; i < yyvsp[0].ValList->size(); ++i)
-      delete (*yyvsp[0].ValList)[i];
-    delete yyvsp[0].ValList;
-  }
+    const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
+    (yyval.InstVal).I = new MallocInst(Ty, 0, (yyvsp[0].UIntVal));
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
     break;
 
+  case 302:
+#line 3335 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type *Ty = (yyvsp[-4].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
+    (yyval.InstVal).I = new MallocInst(Ty, getVal((yyvsp[-2].PrimType).T, (yyvsp[-1].ValIDVal)), (yyvsp[0].UIntVal));
+    delete (yyvsp[-4].TypeVal).T;
+  ;}
+    break;
+
+  case 303:
+#line 3341 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
+    (yyval.InstVal).I = new AllocaInst(Ty, 0, (yyvsp[0].UIntVal));
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
+    break;
+
+  case 304:
+#line 3347 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type *Ty = (yyvsp[-4].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
+    (yyval.InstVal).I = new AllocaInst(Ty, getVal((yyvsp[-2].PrimType).T, (yyvsp[-1].ValIDVal)), (yyvsp[0].UIntVal));
+    delete (yyvsp[-4].TypeVal).T;
+  ;}
+    break;
+
+  case 305:
+#line 3353 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type *PTy = (yyvsp[0].ValueVal).V->getType();
+    if (!isa<PointerType>(PTy))
+      error("Trying to free nonpointer type '" + PTy->getDescription() + "'");
+    (yyval.InstVal).I = new FreeInst((yyvsp[0].ValueVal).V);
+    (yyval.InstVal).S = Signless;
+  ;}
+    break;
+
+  case 306:
+#line 3360 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type* Ty = (yyvsp[-1].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
+    if (!isa<PointerType>(Ty))
+      error("Can't load from nonpointer type: " + Ty->getDescription());
+    if (!cast<PointerType>(Ty)->getElementType()->isFirstClassType())
+      error("Can't load from pointer of non-first-class type: " +
+                     Ty->getDescription());
+    Value* tmpVal = getVal(Ty, (yyvsp[0].ValIDVal));
+    (yyval.InstVal).I = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal));
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
+    break;
+
+  case 307:
+#line 3372 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+    if (!PTy)
+      error("Can't store to a nonpointer type: " + 
+             (yyvsp[-1].TypeVal).T->get()->getDescription());
+    const Type *ElTy = PTy->getElementType();
+    if (ElTy != (yyvsp[-3].ValueVal).V->getType())
+      error("Can't store '" + (yyvsp[-3].ValueVal).V->getType()->getDescription() +
+            "' into space of type '" + ElTy->getDescription() + "'");
+    Value* tmpVal = getVal(PTy, (yyvsp[0].ValIDVal));
+    (yyval.InstVal).I = new StoreInst((yyvsp[-3].ValueVal).V, tmpVal, (yyvsp[-5].BoolVal));
+    (yyval.InstVal).S = Signless;
+    delete (yyvsp[-1].TypeVal).T;
+  ;}
+    break;
+
+  case 308:
+#line 3386 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    const Type* Ty = (yyvsp[-2].TypeVal).T->get();
+    if (!isa<PointerType>(Ty))
+      error("getelementptr insn requires pointer operand");
+
+    std::vector<Value*> VIndices;
+    upgradeGEPIndices(Ty, (yyvsp[0].ValueList), VIndices);
 
+    Value* tmpVal = getVal(Ty, (yyvsp[-1].ValIDVal));
+    (yyval.InstVal).I = new GetElementPtrInst(tmpVal, VIndices);
+    (yyval.InstVal).S = Signless;
+    delete (yyvsp[-2].TypeVal).T;
+    delete (yyvsp[0].ValueList);
+  ;}
+    break;
+
+
+      default: break;
     }
 
-/* Line 1016 of /usr/local/share/bison/yacc.c.  */
-#line 4580 "UpgradeParser.tab.c"
+/* Line 1126 of yacc.c.  */
+#line 6116 "UpgradeParser.tab.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
 
 
-#if YYDEBUG
-  if (yydebug)
-    {
-      short *yyssp1 = yyss - 1;
-      YYFPRINTF (stderr, "state stack now");
-      while (yyssp1 != yyssp)
-	YYFPRINTF (stderr, " %d", *++yyssp1);
-      YYFPRINTF (stderr, "\n");
-    }
-#endif
+  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
 
@@ -4624,90 +6151,153 @@
 
       if (YYPACT_NINF < yyn && yyn < YYLAST)
 	{
-	  YYSIZE_T yysize = 0;
 	  int yytype = YYTRANSLATE (yychar);
-	  char *yymsg;
-	  int yyx, yycount;
+	  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+	  YYSIZE_T yysize = yysize0;
+	  YYSIZE_T yysize1;
+	  int yysize_overflow = 0;
+	  char *yymsg = 0;
+#	  define YYERROR_VERBOSE_ARGS_MAXIMUM 5
+	  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+	  int yyx;
+
+#if 0
+	  /* This is so xgettext sees the translatable formats that are
+	     constructed on the fly.  */
+	  YY_("syntax error, unexpected %s");
+	  YY_("syntax error, unexpected %s, expecting %s");
+	  YY_("syntax error, unexpected %s, expecting %s or %s");
+	  YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+	  YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+#endif
+	  char *yyfmt;
+	  char const *yyf;
+	  static char const yyunexpected[] = "syntax error, unexpected %s";
+	  static char const yyexpecting[] = ", expecting %s";
+	  static char const yyor[] = " or %s";
+	  char yyformat[sizeof yyunexpected
+			+ sizeof yyexpecting - 1
+			+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+			   * (sizeof yyor - 1))];
+	  char const *yyprefix = yyexpecting;
 
-	  yycount = 0;
 	  /* Start YYX at -YYN if negative to avoid negative indexes in
 	     YYCHECK.  */
-	  for (yyx = yyn < 0 ? -yyn : 0;
-	       yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+	  int yyxbegin = yyn < 0 ? -yyn : 0;
+
+	  /* Stay within bounds of both yycheck and yytname.  */
+	  int yychecklim = YYLAST - yyn;
+	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+	  int yycount = 1;
+
+	  yyarg[0] = yytname[yytype];
+	  yyfmt = yystpcpy (yyformat, yyunexpected);
+
+	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
 	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	      yysize += yystrlen (yytname[yyx]) + 15, yycount++;
-	  yysize += yystrlen ("parse error, unexpected ") + 1;
-	  yysize += yystrlen (yytname[yytype]);
-	  yymsg = (char *) YYSTACK_ALLOC (yysize);
-	  if (yymsg != 0)
+	      {
+		if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+		  {
+		    yycount = 1;
+		    yysize = yysize0;
+		    yyformat[sizeof yyunexpected - 1] = '\0';
+		    break;
+		  }
+		yyarg[yycount++] = yytname[yyx];
+		yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+		yysize_overflow |= yysize1 < yysize;
+		yysize = yysize1;
+		yyfmt = yystpcpy (yyfmt, yyprefix);
+		yyprefix = yyor;
+	      }
+
+	  yyf = YY_(yyformat);
+	  yysize1 = yysize + yystrlen (yyf);
+	  yysize_overflow |= yysize1 < yysize;
+	  yysize = yysize1;
+
+	  if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
+	    yymsg = (char *) YYSTACK_ALLOC (yysize);
+	  if (yymsg)
 	    {
-	      char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
-	      yyp = yystpcpy (yyp, yytname[yytype]);
-
-	      if (yycount < 5)
+	      /* Avoid sprintf, as that infringes on the user's name space.
+		 Don't have undefined behavior even if the translation
+		 produced a string with the wrong number of "%s"s.  */
+	      char *yyp = yymsg;
+	      int yyi = 0;
+	      while ((*yyp = *yyf))
 		{
-		  yycount = 0;
-		  for (yyx = yyn < 0 ? -yyn : 0;
-		       yyx < (int) (sizeof (yytname) / sizeof (char *));
-		       yyx++)
-		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-		      {
-			const char *yyq = ! yycount ? ", expecting " : " or ";
-			yyp = yystpcpy (yyp, yyq);
-			yyp = yystpcpy (yyp, yytname[yyx]);
-			yycount++;
-		      }
+		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		    {
+		      yyp += yytnamerr (yyp, yyarg[yyi++]);
+		      yyf += 2;
+		    }
+		  else
+		    {
+		      yyp++;
+		      yyf++;
+		    }
 		}
 	      yyerror (yymsg);
 	      YYSTACK_FREE (yymsg);
 	    }
 	  else
-	    yyerror ("parse error; also virtual memory exhausted");
+	    {
+	      yyerror (YY_("syntax error"));
+	      goto yyexhaustedlab;
+	    }
 	}
       else
 #endif /* YYERROR_VERBOSE */
-	yyerror ("parse error");
+	yyerror (YY_("syntax error"));
     }
-  goto yyerrlab1;
 
 
-/*----------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action.  |
-`----------------------------------------------------*/
-yyerrlab1:
+
   if (yyerrstatus == 3)
     {
-      /* If just tried and failed to reuse lookahead token after an
+      /* If just tried and failed to reuse look-ahead token after an
 	 error, discard it.  */
 
-      /* Return failure if at end of input.  */
-      if (yychar == YYEOF)
+      if (yychar <= YYEOF)
         {
-	  /* Pop the error token.  */
-          YYPOPSTACK;
-	  /* Pop the rest of the stack.  */
-	  while (yyssp > yyss)
-	    {
-	      YYDPRINTF ((stderr, "Error: popping "));
-	      YYDSYMPRINT ((stderr,
-			    yystos[*yyssp],
-			    *yyvsp));
-	      YYDPRINTF ((stderr, "\n"));
-	      yydestruct (yystos[*yyssp], *yyvsp);
-	      YYPOPSTACK;
-	    }
-	  YYABORT;
+	  /* Return failure if at end of input.  */
+	  if (yychar == YYEOF)
+	    YYABORT;
         }
-
-      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
-		  yychar, yytname[yychar1]));
-      yydestruct (yychar1, yylval);
-      yychar = YYEMPTY;
+      else
+	{
+	  yydestruct ("Error: discarding", yytoken, &yylval);
+	  yychar = YYEMPTY;
+	}
     }
 
-  /* Else will try to reuse lookahead token after shifting the error
+  /* Else will try to reuse look-ahead token after shifting the error
      token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (0)
+     goto yyerrorlab;
+
+yyvsp -= yylen;
+  yyssp -= yylen;
+  yystate = *yyssp;
+  goto yyerrlab1;
+
 
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
   yyerrstatus = 3;	/* Each real token shifted decrements this.  */
 
   for (;;)
@@ -4728,36 +6318,22 @@
       if (yyssp == yyss)
 	YYABORT;
 
-      YYDPRINTF ((stderr, "Error: popping "));
-      YYDSYMPRINT ((stderr,
-		    yystos[*yyssp], *yyvsp));
-      YYDPRINTF ((stderr, "\n"));
-
-      yydestruct (yystos[yystate], *yyvsp);
-      yyvsp--;
-      yystate = *--yyssp;
-
 
-#if YYDEBUG
-      if (yydebug)
-	{
-	  short *yyssp1 = yyss - 1;
-	  YYFPRINTF (stderr, "Error: state stack now");
-	  while (yyssp1 != yyssp)
-	    YYFPRINTF (stderr, " %d", *++yyssp1);
-	  YYFPRINTF (stderr, "\n");
-	}
-#endif
+      yydestruct ("Error: popping", yystos[yystate], yyvsp);
+      YYPOPSTACK;
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
     }
 
   if (yyn == YYFINAL)
     YYACCEPT;
 
-  YYDPRINTF ((stderr, "Shifting error token, "));
-
   *++yyvsp = yylval;
 
 
+  /* Shift the error token. */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
   yystate = yyn;
   goto yynewstate;
 
@@ -4777,16 +6353,25 @@
   goto yyreturn;
 
 #ifndef yyoverflow
-/*----------------------------------------------.
-| yyoverflowlab -- parser overflow comes here.  |
-`----------------------------------------------*/
-yyoverflowlab:
-  yyerror ("parser stack overflow");
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
   yyresult = 2;
   /* Fall through.  */
 #endif
 
 yyreturn:
+  if (yychar != YYEOF && yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+		 yytoken, &yylval);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+		  yystos[*yyssp], yyvsp);
+      YYPOPSTACK;
+    }
 #ifndef yyoverflow
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
@@ -4795,34 +6380,37 @@
 }
 
 
-#line 2251 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3402 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
 
 
 int yyerror(const char *ErrorMsg) {
   std::string where 
     = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
-                  + ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
-  std::string errMsg = where + "error: " + std::string(ErrorMsg) + 
-                       " while reading ";
-  if (yychar == YYEMPTY || yychar == 0)
-    errMsg += "end-of-file.";
-  else
-    errMsg += "token: '" + std::string(Upgradetext, Upgradeleng) + "'";
+                  + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": ";
+  std::string errMsg = where + "error: " + std::string(ErrorMsg);
+  if (yychar != YYEMPTY && yychar != 0)
+    errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
+              "'.";
   std::cerr << "llvm-upgrade: " << errMsg << '\n';
-  *O << "llvm-upgrade parse failed.\n";
+  std::cout << "llvm-upgrade: parse failed.\n";
   exit(1);
 }
 
 void warning(const std::string& ErrorMsg) {
   std::string where 
     = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
-                  + ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
-  std::string errMsg = where + "warning: " + std::string(ErrorMsg) + 
-                       " while reading ";
-  if (yychar == YYEMPTY || yychar == 0)
-    errMsg += "end-of-file.";
-  else
-    errMsg += "token: '" + std::string(Upgradetext, Upgradeleng) + "'";
+                  + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": ";
+  std::string errMsg = where + "warning: " + std::string(ErrorMsg);
+  if (yychar != YYEMPTY && yychar != 0)
+    errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
+              "'.";
   std::cerr << "llvm-upgrade: " << errMsg << '\n';
 }
 
+void error(const std::string& ErrorMsg, int LineNo) {
+  if (LineNo == -1) LineNo = Upgradelineno;
+  Upgradelineno = LineNo;
+  yyerror(ErrorMsg.c_str());
+}
+
+


Index: llvm/tools/llvm-upgrade/UpgradeParser.h.cvs
diff -u llvm/tools/llvm-upgrade/UpgradeParser.h.cvs:1.31 llvm/tools/llvm-upgrade/UpgradeParser.h.cvs:1.32
--- llvm/tools/llvm-upgrade/UpgradeParser.h.cvs:1.31	Sun Jan 21 13:30:52 2007
+++ llvm/tools/llvm-upgrade/UpgradeParser.h.cvs	Fri Jan 26 02:19:09 2007
@@ -1,7 +1,7 @@
-/* A Bison parser, made from /usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y, by GNU bison 1.75.  */
+/* A Bison parser, made by GNU Bison 2.1.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -15,78 +15,75 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 /* As a special exception, when this file is copied by Bison into a
    Bison output file, you may use that output file without restriction.
    This special exception was added by the Free Software Foundation
    in version 1.24 of Bison.  */
 
-#ifndef BISON_UPGRADEPARSER_TAB_H
-# define BISON_UPGRADEPARSER_TAB_H
-
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
    /* Put the tokens into the symbol table, so that GDB and other debuggers
       know about them.  */
    enum yytokentype {
-     VOID = 258,
-     BOOL = 259,
-     SBYTE = 260,
-     UBYTE = 261,
-     SHORT = 262,
-     USHORT = 263,
-     INT = 264,
-     UINT = 265,
-     LONG = 266,
-     ULONG = 267,
-     FLOAT = 268,
-     DOUBLE = 269,
-     LABEL = 270,
-     OPAQUE = 271,
-     ESINT64VAL = 272,
-     EUINT64VAL = 273,
-     SINTVAL = 274,
-     UINTVAL = 275,
-     FPVAL = 276,
-     NULL_TOK = 277,
-     UNDEF = 278,
-     ZEROINITIALIZER = 279,
-     TRUETOK = 280,
-     FALSETOK = 281,
-     TYPE = 282,
-     VAR_ID = 283,
-     LABELSTR = 284,
-     STRINGCONSTANT = 285,
-     IMPLEMENTATION = 286,
-     BEGINTOK = 287,
-     ENDTOK = 288,
-     DECLARE = 289,
-     GLOBAL = 290,
-     CONSTANT = 291,
-     SECTION = 292,
-     VOLATILE = 293,
-     TO = 294,
-     DOTDOTDOT = 295,
-     CONST = 296,
-     INTERNAL = 297,
-     LINKONCE = 298,
-     WEAK = 299,
+     ESINT64VAL = 258,
+     EUINT64VAL = 259,
+     SINTVAL = 260,
+     UINTVAL = 261,
+     FPVAL = 262,
+     VOID = 263,
+     BOOL = 264,
+     SBYTE = 265,
+     UBYTE = 266,
+     SHORT = 267,
+     USHORT = 268,
+     INT = 269,
+     UINT = 270,
+     LONG = 271,
+     ULONG = 272,
+     FLOAT = 273,
+     DOUBLE = 274,
+     TYPE = 275,
+     LABEL = 276,
+     VAR_ID = 277,
+     LABELSTR = 278,
+     STRINGCONSTANT = 279,
+     IMPLEMENTATION = 280,
+     ZEROINITIALIZER = 281,
+     TRUETOK = 282,
+     FALSETOK = 283,
+     BEGINTOK = 284,
+     ENDTOK = 285,
+     DECLARE = 286,
+     GLOBAL = 287,
+     CONSTANT = 288,
+     SECTION = 289,
+     VOLATILE = 290,
+     TO = 291,
+     DOTDOTDOT = 292,
+     NULL_TOK = 293,
+     UNDEF = 294,
+     CONST = 295,
+     INTERNAL = 296,
+     LINKONCE = 297,
+     WEAK = 298,
+     APPENDING = 299,
      DLLIMPORT = 300,
      DLLEXPORT = 301,
      EXTERN_WEAK = 302,
-     APPENDING = 303,
-     EXTERNAL = 304,
-     TARGET = 305,
-     TRIPLE = 306,
-     ENDIAN = 307,
-     POINTERSIZE = 308,
-     LITTLE = 309,
-     BIG = 310,
-     ALIGN = 311,
-     UNINITIALIZED = 312,
+     OPAQUE = 303,
+     NOT = 304,
+     EXTERNAL = 305,
+     TARGET = 306,
+     TRIPLE = 307,
+     ENDIAN = 308,
+     POINTERSIZE = 309,
+     LITTLE = 310,
+     BIG = 311,
+     ALIGN = 312,
      DEPLIBS = 313,
      CALL = 314,
      TAIL = 315,
@@ -105,9 +102,9 @@
      BR = 328,
      SWITCH = 329,
      INVOKE = 330,
-     EXCEPT = 331,
+     UNREACHABLE = 331,
      UNWIND = 332,
-     UNREACHABLE = 333,
+     EXCEPT = 333,
      ADD = 334,
      SUB = 335,
      MUL = 336,
@@ -130,112 +127,115 @@
      SETNE = 353,
      ICMP = 354,
      FCMP = 355,
-     EQ = 356,
-     NE = 357,
-     SLT = 358,
-     SGT = 359,
-     SLE = 360,
-     SGE = 361,
-     OEQ = 362,
-     ONE = 363,
-     OLT = 364,
-     OGT = 365,
-     OLE = 366,
-     OGE = 367,
-     ORD = 368,
-     UNO = 369,
-     UEQ = 370,
-     UNE = 371,
-     ULT = 372,
-     UGT = 373,
-     ULE = 374,
-     UGE = 375,
-     MALLOC = 376,
-     ALLOCA = 377,
-     FREE = 378,
-     LOAD = 379,
-     STORE = 380,
-     GETELEMENTPTR = 381,
-     PHI_TOK = 382,
-     SELECT = 383,
-     SHL = 384,
-     SHR = 385,
-     ASHR = 386,
-     LSHR = 387,
-     VAARG = 388,
-     EXTRACTELEMENT = 389,
-     INSERTELEMENT = 390,
-     SHUFFLEVECTOR = 391,
-     CAST = 392,
-     TRUNC = 393,
-     ZEXT = 394,
-     SEXT = 395,
-     FPTRUNC = 396,
-     FPEXT = 397,
-     FPTOUI = 398,
-     FPTOSI = 399,
-     UITOFP = 400,
-     SITOFP = 401,
-     PTRTOINT = 402,
-     INTTOPTR = 403,
-     BITCAST = 404
+     MALLOC = 356,
+     ALLOCA = 357,
+     FREE = 358,
+     LOAD = 359,
+     STORE = 360,
+     GETELEMENTPTR = 361,
+     PHI_TOK = 362,
+     SELECT = 363,
+     SHL = 364,
+     SHR = 365,
+     ASHR = 366,
+     LSHR = 367,
+     VAARG = 368,
+     EXTRACTELEMENT = 369,
+     INSERTELEMENT = 370,
+     SHUFFLEVECTOR = 371,
+     VAARG_old = 372,
+     VANEXT_old = 373,
+     EQ = 374,
+     NE = 375,
+     SLT = 376,
+     SGT = 377,
+     SLE = 378,
+     SGE = 379,
+     ULT = 380,
+     UGT = 381,
+     ULE = 382,
+     UGE = 383,
+     OEQ = 384,
+     ONE = 385,
+     OLT = 386,
+     OGT = 387,
+     OLE = 388,
+     OGE = 389,
+     ORD = 390,
+     UNO = 391,
+     UEQ = 392,
+     UNE = 393,
+     CAST = 394,
+     TRUNC = 395,
+     ZEXT = 396,
+     SEXT = 397,
+     FPTRUNC = 398,
+     FPEXT = 399,
+     FPTOUI = 400,
+     FPTOSI = 401,
+     UITOFP = 402,
+     SITOFP = 403,
+     PTRTOINT = 404,
+     INTTOPTR = 405,
+     BITCAST = 406
    };
 #endif
-#define VOID 258
-#define BOOL 259
-#define SBYTE 260
-#define UBYTE 261
-#define SHORT 262
-#define USHORT 263
-#define INT 264
-#define UINT 265
-#define LONG 266
-#define ULONG 267
-#define FLOAT 268
-#define DOUBLE 269
-#define LABEL 270
-#define OPAQUE 271
-#define ESINT64VAL 272
-#define EUINT64VAL 273
-#define SINTVAL 274
-#define UINTVAL 275
-#define FPVAL 276
-#define NULL_TOK 277
-#define UNDEF 278
-#define ZEROINITIALIZER 279
-#define TRUETOK 280
-#define FALSETOK 281
-#define TYPE 282
-#define VAR_ID 283
-#define LABELSTR 284
-#define STRINGCONSTANT 285
-#define IMPLEMENTATION 286
-#define BEGINTOK 287
-#define ENDTOK 288
-#define DECLARE 289
-#define GLOBAL 290
-#define CONSTANT 291
-#define SECTION 292
-#define VOLATILE 293
-#define TO 294
-#define DOTDOTDOT 295
-#define CONST 296
-#define INTERNAL 297
-#define LINKONCE 298
-#define WEAK 299
+/* Tokens.  */
+#define ESINT64VAL 258
+#define EUINT64VAL 259
+#define SINTVAL 260
+#define UINTVAL 261
+#define FPVAL 262
+#define VOID 263
+#define BOOL 264
+#define SBYTE 265
+#define UBYTE 266
+#define SHORT 267
+#define USHORT 268
+#define INT 269
+#define UINT 270
+#define LONG 271
+#define ULONG 272
+#define FLOAT 273
+#define DOUBLE 274
+#define TYPE 275
+#define LABEL 276
+#define VAR_ID 277
+#define LABELSTR 278
+#define STRINGCONSTANT 279
+#define IMPLEMENTATION 280
+#define ZEROINITIALIZER 281
+#define TRUETOK 282
+#define FALSETOK 283
+#define BEGINTOK 284
+#define ENDTOK 285
+#define DECLARE 286
+#define GLOBAL 287
+#define CONSTANT 288
+#define SECTION 289
+#define VOLATILE 290
+#define TO 291
+#define DOTDOTDOT 292
+#define NULL_TOK 293
+#define UNDEF 294
+#define CONST 295
+#define INTERNAL 296
+#define LINKONCE 297
+#define WEAK 298
+#define APPENDING 299
 #define DLLIMPORT 300
 #define DLLEXPORT 301
 #define EXTERN_WEAK 302
-#define APPENDING 303
-#define EXTERNAL 304
-#define TARGET 305
-#define TRIPLE 306
-#define ENDIAN 307
-#define POINTERSIZE 308
-#define LITTLE 309
-#define BIG 310
-#define ALIGN 311
-#define UNINITIALIZED 312
+#define OPAQUE 303
+#define NOT 304
+#define EXTERNAL 305
+#define TARGET 306
+#define TRIPLE 307
+#define ENDIAN 308
+#define POINTERSIZE 309
+#define LITTLE 310
+#define BIG 311
+#define ALIGN 312
 #define DEPLIBS 313
 #define CALL 314
 #define TAIL 315
@@ -254,9 +254,9 @@
 #define BR 328
 #define SWITCH 329
 #define INVOKE 330
-#define EXCEPT 331
+#define UNREACHABLE 331
 #define UNWIND 332
-#define UNREACHABLE 333
+#define EXCEPT 333
 #define ADD 334
 #define SUB 335
 #define MUL 336
@@ -279,76 +279,112 @@
 #define SETNE 353
 #define ICMP 354
 #define FCMP 355
-#define EQ 356
-#define NE 357
-#define SLT 358
-#define SGT 359
-#define SLE 360
-#define SGE 361
-#define OEQ 362
-#define ONE 363
-#define OLT 364
-#define OGT 365
-#define OLE 366
-#define OGE 367
-#define ORD 368
-#define UNO 369
-#define UEQ 370
-#define UNE 371
-#define ULT 372
-#define UGT 373
-#define ULE 374
-#define UGE 375
-#define MALLOC 376
-#define ALLOCA 377
-#define FREE 378
-#define LOAD 379
-#define STORE 380
-#define GETELEMENTPTR 381
-#define PHI_TOK 382
-#define SELECT 383
-#define SHL 384
-#define SHR 385
-#define ASHR 386
-#define LSHR 387
-#define VAARG 388
-#define EXTRACTELEMENT 389
-#define INSERTELEMENT 390
-#define SHUFFLEVECTOR 391
-#define CAST 392
-#define TRUNC 393
-#define ZEXT 394
-#define SEXT 395
-#define FPTRUNC 396
-#define FPEXT 397
-#define FPTOUI 398
-#define FPTOSI 399
-#define UITOFP 400
-#define SITOFP 401
-#define PTRTOINT 402
-#define INTTOPTR 403
-#define BITCAST 404
-
-
-
-
-#ifndef YYSTYPE
-#line 971 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-typedef union {
-  std::string*    String;
-  const Type*     Ty;
-  Value*          Val;
-  Constant*       Const;
-  ValueList*      ValList;
-  TypeList*       TypeVec;
-} yystype;
-/* Line 1237 of /usr/local/share/bison/yacc.c.  */
-#line 347 "UpgradeParser.tab.h"
-# define YYSTYPE yystype
+#define MALLOC 356
+#define ALLOCA 357
+#define FREE 358
+#define LOAD 359
+#define STORE 360
+#define GETELEMENTPTR 361
+#define PHI_TOK 362
+#define SELECT 363
+#define SHL 364
+#define SHR 365
+#define ASHR 366
+#define LSHR 367
+#define VAARG 368
+#define EXTRACTELEMENT 369
+#define INSERTELEMENT 370
+#define SHUFFLEVECTOR 371
+#define VAARG_old 372
+#define VANEXT_old 373
+#define EQ 374
+#define NE 375
+#define SLT 376
+#define SGT 377
+#define SLE 378
+#define SGE 379
+#define ULT 380
+#define UGT 381
+#define ULE 382
+#define UGE 383
+#define OEQ 384
+#define ONE 385
+#define OLT 386
+#define OGT 387
+#define OLE 388
+#define OGE 389
+#define ORD 390
+#define UNO 391
+#define UEQ 392
+#define UNE 393
+#define CAST 394
+#define TRUNC 395
+#define ZEXT 396
+#define SEXT 397
+#define FPTRUNC 398
+#define FPEXT 399
+#define FPTOUI 400
+#define FPTOSI 401
+#define UITOFP 402
+#define SITOFP 403
+#define PTRTOINT 404
+#define INTTOPTR 405
+#define BITCAST 406
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 1469 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+typedef union YYSTYPE {
+  llvm::Module                           *ModuleVal;
+  llvm::Function                         *FunctionVal;
+  std::pair<llvm::PATypeInfo, char*>     *ArgVal;
+  llvm::BasicBlock                       *BasicBlockVal;
+  llvm::TerminatorInst                   *TermInstVal;
+  llvm::InstrInfo                        InstVal;
+  llvm::ConstInfo                        ConstVal;
+  llvm::ValueInfo                        ValueVal;
+  llvm::PATypeInfo                       TypeVal;
+  llvm::TypeInfo                         PrimType;
+  llvm::PHIListInfo                      PHIList;
+  std::list<llvm::PATypeInfo>            *TypeList;
+  std::vector<llvm::ValueInfo>           *ValueList;
+  std::vector<llvm::ConstInfo>           *ConstVector;
+
+
+  std::vector<std::pair<llvm::PATypeInfo,char*> > *ArgList;
+  // Represent the RHS of PHI node
+  std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
+
+  llvm::GlobalValue::LinkageTypes         Linkage;
+  int64_t                           SInt64Val;
+  uint64_t                          UInt64Val;
+  int                               SIntVal;
+  unsigned                          UIntVal;
+  double                            FPVal;
+  bool                              BoolVal;
+
+  char                             *StrVal;   // This memory is strdup'd!
+  llvm::ValID                       ValIDVal; // strdup'd memory maybe!
+
+  llvm::BinaryOps                   BinaryOpVal;
+  llvm::TermOps                     TermOpVal;
+  llvm::MemoryOps                   MemOpVal;
+  llvm::OtherOps                    OtherOpVal;
+  llvm::CastOps                     CastOpVal;
+  llvm::ICmpInst::Predicate         IPred;
+  llvm::FCmpInst::Predicate         FPred;
+  llvm::Module::Endianness          Endianness;
+} YYSTYPE;
+/* Line 1447 of yacc.c.  */
+#line 382 "UpgradeParser.tab.h"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 extern YYSTYPE Upgradelval;
 
 
-#endif /* not BISON_UPGRADEPARSER_TAB_H */
 


Index: llvm/tools/llvm-upgrade/UpgradeParser.y.cvs
diff -u llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.43 llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.44
--- llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.43	Sun Jan 21 13:30:52 2007
+++ llvm/tools/llvm-upgrade/UpgradeParser.y.cvs	Fri Jan 26 02:19:09 2007
@@ -1,1127 +1,1775 @@
-//===-- UpgradeParser.y - Upgrade parser for llvm assmbly -------*- C++ -*-===//
+//===-- llvmAsmParser.y - Parser for llvm assembly files --------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Reid Spencer and is distributed under the
-// University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
-//  This file implements the bison parser for LLVM 1.9 assembly language.
+//  This file implements the bison parser for LLVM assembly languages files.
 //
 //===----------------------------------------------------------------------===//
 
 %{
 #include "UpgradeInternals.h"
+#include "llvm/CallingConv.h"
+#include "llvm/InlineAsm.h"
+#include "llvm/Instructions.h"
+#include "llvm/Module.h"
+#include "llvm/SymbolTable.h"
+#include "llvm/Support/GetElementPtrTypeIterator.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/MathExtras.h"
 #include <algorithm>
-#include <map>
-#include <utility>
 #include <iostream>
+#include <list>
+#include <utility>
+
+// DEBUG_UPREFS - Define this symbol if you want to enable debugging output
+// relating to upreferences in the input stream.
+//
+//#define DEBUG_UPREFS 1
+#ifdef DEBUG_UPREFS
+#define UR_OUT(X) std::cerr << X
+#else
+#define UR_OUT(X)
+#endif
 
 #define YYERROR_VERBOSE 1
 #define YYINCLUDED_STDLIB_H
 #define YYDEBUG 1
 
-int yylex();                       // declaration" of xxx warnings.
+int yylex();
 int yyparse();
-extern int yydebug;
 
-static std::string CurFilename;
-static std::ostream *O = 0;
-std::istream* LexInput = 0;
-unsigned SizeOfPointer = 32;
+int yyerror(const char*);
+static void warning(const std::string& WarningMsg);
 
+namespace llvm {
 
-// This bool controls whether attributes are ever added to function declarations
-// definitions and calls.
-static bool AddAttributes = false;
 
-static void warning(const std::string& msg);
+SignedType *SignedType::SByteTy = 0;
+SignedType *SignedType::SShortTy = 0;
+SignedType *SignedType::SIntTy = 0;
+SignedType *SignedType::SLongTy = 0;
+
+inline bool SignedType::classof(const Type *T) {
+  if (T->getTypeID() != IntegerTyID)
+    return false;
+  return (T == SByteTy || T == SShortTy || T == SIntTy || T == SLongTy );
+}
 
-void UpgradeAssembly(const std::string &infile, std::istream& in, 
-                     std::ostream &out, bool debug, bool addAttrs)
+SignedType::SignedType(const IntegerType* ITy) 
+  : IntegerType(ITy->getBitWidth()), base_type(ITy)
 {
-  Upgradelineno = 1; 
-  CurFilename = infile;
-  LexInput = ∈
-  yydebug = debug;
-  AddAttributes = addAttrs;
-  O = &out;
+}
 
-  if (yyparse()) {
-    std::cerr << "llvm-upgrade: parse failed.\n";
-    out << "llvm-upgrade: parse failed.\n";
-    exit(1);
+const SignedType *SignedType::get(const IntegerType* ITy) {
+  if (ITy == Type::Int8Ty) {
+    if (!SByteTy)
+      SByteTy = new SignedType(IntegerType::get(8));
+    return SByteTy;
+  } else if (ITy == Type::Int16Ty) {
+    if (!SShortTy)
+      SShortTy = new SignedType(IntegerType::get(16));
+    return SShortTy;
+  } else if (ITy == Type::Int32Ty) {
+    if (!SIntTy)
+      SIntTy = new SignedType(IntegerType::get(32));
+    return SIntTy;
+  } else if (ITy == Type::Int64Ty) {
+    if (!SLongTy)
+      SLongTy = new SignedType(IntegerType::get(64));
+    return SLongTy;
+  } else
+    assert(0 && "Invalid integer type for SignedType::get");
+}
+
+static inline Signedness getSign(const Type *&Ty) {
+  if (const SignedType *STy = dyn_cast<SignedType>(Ty)) {
+    Ty = STy->getBaseType();
+    return Signed;
+  } else if (isa<IntegerType>(Ty))
+    return Unsigned;
+  return Signless;
+}
+
+static const Type*
+resolveTypeImpl(const Type* Ty, std::vector<const Type*>& TyStack)
+{
+  // Nothing to resolve if it isn't a derived type
+  if (!Ty->isDerivedType())
+    return Ty;
+
+  // Prevent infinite recursion for recursive types
+  for (std::vector<const Type*>::const_iterator I = TyStack.begin(), 
+       E = TyStack.end(); I != E; ++I)
+    if (Ty == *I)
+      return Ty;
+
+  // Okay, haven't seen this derived type yet, push it on the stack.
+  const Type* Result = Ty;
+  TyStack.push_back(Ty);
+
+  // Process the type
+  switch (Ty->getTypeID()) {
+    default: assert(0 && "Invalid derived type");
+    case Type::IntegerTyID:
+      break;
+    case Type::FunctionTyID: {
+      const FunctionType* FTy = cast<FunctionType>(Ty);
+      const Type* RetTy = resolveTypeImpl(FTy->getReturnType(), TyStack);
+      std::vector<const Type*> Types;
+      FunctionType::ParamAttrsList Attrs;
+      Attrs.push_back(FTy->getParamAttrs(0));
+      for (unsigned i = 0; i < FTy->getNumParams(); ++i) {
+        Types.push_back(resolveTypeImpl(FTy->getParamType(i), TyStack));
+        Attrs.push_back(FTy->getParamAttrs(i+1));
+      }
+      Result = FunctionType::get(RetTy, Types, FTy->isVarArg(), Attrs);
+      break;
+    }
+    case Type::StructTyID:
+    case Type::PackedStructTyID: {
+      const StructType *STy = cast<StructType>(Ty);
+      std::vector<const Type*> FieldTypes;
+      for (unsigned i = 0; i < STy->getNumElements(); ++i)
+        FieldTypes.push_back(resolveTypeImpl(STy->getElementType(i), TyStack));
+      Result = StructType::get(FieldTypes, STy->isPacked());
+      break;
+    }
+    case Type::ArrayTyID: {
+      const ArrayType *ATy = cast<ArrayType>(Ty);
+      uint64_t NElems = ATy->getNumElements();
+      const Type *ElemTy = resolveTypeImpl(ATy->getElementType(), TyStack);
+      Result = ArrayType::get(ElemTy, NElems);
+      break;
+    }
+    case Type::PointerTyID: {
+      const PointerType *PTy = cast<PointerType>(Ty);
+      const Type *ElemTy = resolveTypeImpl(PTy->getElementType(), TyStack);
+      Result = PointerType::get(ElemTy);
+      break;
+    }
+    case Type::PackedTyID: {
+      const PackedType *PTy = cast<PackedType>(Ty);
+      unsigned NElems = PTy->getNumElements();
+      const Type *ElemTy = resolveTypeImpl(PTy->getElementType(), TyStack);
+      Result = PackedType::get(ElemTy, NElems);
+      break;
+    }
   }
+  // Done with it, pop it off.
+  TyStack.pop_back();
+  return Result;
 }
 
-namespace { // Anonymous namespace to keep our implementation local
+static inline const Type* resolveType(const Type* Ty) {
+  if (!Ty)
+    return 0;
+  if (const SignedType* STy = dyn_cast<SignedType>(Ty))
+    return STy->getBaseType();
+  std::vector<const Type*> TyStack;
+  return resolveTypeImpl(Ty, TyStack);
+}
 
+std::istream* LexInput;
+static std::string CurFilename;
 
-/// This type is used to keep track of the signedness of values. Instead
-/// of creating llvm::Value directly, the parser will create Value which
-/// associates a Value* with a Signedness indication.
-struct Value {
-  std::string* val;
-  const Type* type;
-  bool constant;
-  bool isConstant() const { return constant; }
-  ~Value() { delete val; }
-};
+// This bool controls whether attributes are ever added to function declarations
+// definitions and calls.
+static bool AddAttributes = false;
 
+static Module *ParserResult;
+static bool ObsoleteVarArgs;
+static bool NewVarArgs;
+static BasicBlock *CurBB;
+static GlobalVariable *CurGV;
 
-/// This type is used to keep track of the signedness of the obsolete
-/// integer types. Instead of creating an llvm::Type directly, the Lexer will
-/// create instances of Type which retains the signedness indication so
-/// it can be used by the parser for upgrade decisions.
-/// For example if "uint" is encountered then the "first" field will be set 
-/// to "int32" and the "second" field will be set to "isUnsigned".  If the 
-/// type is not obsolete then "second" will be set to "isSignless".
-class Type {
-public:
-  static const Type* get(const std::string &newType, TypeIDs oldType);
-  static const Type* get(const std::string& newType, TypeIDs oldType, 
-                             const Type* eTy, const Type* rTy);
 
-  static const Type* get(const std::string& newType, TypeIDs oldType, 
-                             const Type *eTy, uint64_t elems);
 
-  static const Type* get(const std::string& newType, TypeIDs oldType, 
-                             TypeList* TL);
+// This contains info used when building the body of a function.  It is
+// destroyed when the function is completed.
+//
+typedef std::vector<Value *> ValueList;           // Numbered defs
 
-  static const Type* get(const std::string& newType, const Type* resTy, 
-                             TypeList* TL);
+typedef std::pair<std::string,const Type*> RenameMapKey;
+typedef std::map<RenameMapKey,std::string> RenameMapType;
 
-  const Type* resolve() const;
-  bool operator<(const Type& that) const;
+static void 
+ResolveDefinitions(std::map<const Type *,ValueList> &LateResolvers,
+                   std::map<const Type *,ValueList> *FutureLateResolvers = 0);
+
+static struct PerModuleInfo {
+  Module *CurrentModule;
+  std::map<const Type *, ValueList> Values; // Module level numbered definitions
+  std::map<const Type *,ValueList> LateResolveValues;
+  std::vector<PATypeHolder>    Types;
+  std::map<ValID, PATypeHolder> LateResolveTypes;
+  static Module::Endianness Endian;
+  static Module::PointerSize PointerSize;
+  RenameMapType RenameMap;
+
+  /// PlaceHolderInfo - When temporary placeholder objects are created, remember
+  /// how they were referenced and on which line of the input they came from so
+  /// that we can resolve them later and print error messages as appropriate.
+  std::map<Value*, std::pair<ValID, int> > PlaceHolderInfo;
+
+  // GlobalRefs - This maintains a mapping between <Type, ValID>'s and forward
+  // references to global values.  Global values may be referenced before they
+  // are defined, and if so, the temporary object that they represent is held
+  // here.  This is used for forward references of GlobalValues.
+  //
+  typedef std::map<std::pair<const PointerType *, ValID>, GlobalValue*> 
+    GlobalRefsType;
+  GlobalRefsType GlobalRefs;
+
+  void ModuleDone() {
+    // If we could not resolve some functions at function compilation time
+    // (calls to functions before they are defined), resolve them now...  Types
+    // are resolved when the constant pool has been completely parsed.
+    //
+    ResolveDefinitions(LateResolveValues);
+
+    // Check to make sure that all global value forward references have been
+    // resolved!
+    //
+    if (!GlobalRefs.empty()) {
+      std::string UndefinedReferences = "Unresolved global references exist:\n";
+
+      for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end();
+           I != E; ++I) {
+        UndefinedReferences += "  " + I->first.first->getDescription() + " " +
+                               I->first.second.getName() + "\n";
+      }
+      error(UndefinedReferences);
+      return;
+    }
 
-  bool sameNewTyAs(const Type* that) const {
-    return this->newTy == that->newTy;
-  }
+    if (CurrentModule->getDataLayout().empty()) {
+      std::string dataLayout;
+      if (Endian != Module::AnyEndianness)
+        dataLayout.append(Endian == Module::BigEndian ? "E" : "e");
+      if (PointerSize != Module::AnyPointerSize) {
+        if (!dataLayout.empty())
+          dataLayout += "-";
+        dataLayout.append(PointerSize == Module::Pointer64 ? 
+                          "p:64:64" : "p:32:32");
+      }
+      CurrentModule->setDataLayout(dataLayout);
+    }
 
-  bool sameOldTyAs(const Type* that) const;
+    Values.clear();         // Clear out function local definitions
+    Types.clear();
+    CurrentModule = 0;
+  }
+
+  // GetForwardRefForGlobal - Check to see if there is a forward reference
+  // for this global.  If so, remove it from the GlobalRefs map and return it.
+  // If not, just return null.
+  GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) {
+    // Check to see if there is a forward reference to this global variable...
+    // if there is, eliminate it and patch the reference to use the new def'n.
+    GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID));
+    GlobalValue *Ret = 0;
+    if (I != GlobalRefs.end()) {
+      Ret = I->second;
+      GlobalRefs.erase(I);
+    }
+    return Ret;
+  }
+  void setEndianness(Module::Endianness E) { Endian = E; }
+  void setPointerSize(Module::PointerSize sz) { PointerSize = sz; }
+} CurModule;
+
+Module::Endianness  PerModuleInfo::Endian = Module::AnyEndianness;
+Module::PointerSize PerModuleInfo::PointerSize = Module::AnyPointerSize;
+
+static struct PerFunctionInfo {
+  Function *CurrentFunction;     // Pointer to current function being created
+
+  std::map<const Type*, ValueList> Values; // Keep track of #'d definitions
+  std::map<const Type*, ValueList> LateResolveValues;
+  bool isDeclare;                   // Is this function a forward declararation?
+  GlobalValue::LinkageTypes Linkage;// Linkage for forward declaration.
+
+  /// BBForwardRefs - When we see forward references to basic blocks, keep
+  /// track of them here.
+  std::map<BasicBlock*, std::pair<ValID, int> > BBForwardRefs;
+  std::vector<BasicBlock*> NumberedBlocks;
+  RenameMapType RenameMap;
+  std::set<Value*> SignedValues;
+  unsigned NextBBNum;
 
-  TypeIDs getElementTy() const {
-    if (elemTy) {
-      return elemTy->oldTy;
-    }
-    return UnresolvedTy;
+  inline PerFunctionInfo() {
+    CurrentFunction = 0;
+    isDeclare = false;
+    Linkage = GlobalValue::ExternalLinkage;    
   }
 
-  unsigned getUpRefNum() const {
-    assert(oldTy == UpRefTy && "Can't getUpRefNum on non upreference");
-    return atoi(&((getNewTy().c_str())[1])); // skip the slash
+  inline void FunctionStart(Function *M) {
+    CurrentFunction = M;
+    NextBBNum = 0;
   }
 
-  typedef std::vector<const Type*> UpRefStack;
-  void getSignedness(unsigned &sNum, unsigned &uNum, UpRefStack& stk) const;
-  std::string makeUniqueName(const std::string& BaseName) const;
+  void FunctionDone() {
+    NumberedBlocks.clear();
 
-  const std::string& getNewTy() const { return newTy; }
-  const Type* getResultType() const { return resultTy; }
-  const Type* getElementType() const { return elemTy; }
+    // Any forward referenced blocks left?
+    if (!BBForwardRefs.empty()) {
+      error("Undefined reference to label " + 
+            BBForwardRefs.begin()->first->getName());
+      return;
+    }
 
-  const Type* getPointerType() const {
-    return get(newTy + "*", PointerTy, this, (Type*)0);
-  }
+    // Resolve all forward references now.
+    ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
 
-  bool isUnresolved() const { return oldTy == UnresolvedTy; }
-  bool isUpReference() const { return oldTy == UpRefTy; }
-  bool isVoid() const { return oldTy == VoidTy; }
-  bool isBool() const { return oldTy == BoolTy; }
-  bool isSigned() const {
-    return oldTy == SByteTy || oldTy == ShortTy || 
-           oldTy == IntTy || oldTy == LongTy;
+    Values.clear();         // Clear out function local definitions
+    RenameMap.clear();
+    SignedValues.clear();
+    CurrentFunction = 0;
+    isDeclare = false;
+    Linkage = GlobalValue::ExternalLinkage;
   }
+} CurFun;  // Info for the current function...
 
-  bool isUnsigned() const {
-    return oldTy == UByteTy || oldTy == UShortTy || 
-           oldTy == UIntTy || oldTy == ULongTy;
-  }
-  bool isSignless() const { return !isSigned() && !isUnsigned(); }
-  bool isInteger() const { return isSigned() || isUnsigned(); }
-  bool isIntegral() const { return oldTy == BoolTy || isInteger(); }
-  bool isFloatingPoint() const { return oldTy == DoubleTy || oldTy == FloatTy; }
-  bool isPacked() const { return oldTy == PackedTy; }
-  bool isPointer() const { return oldTy == PointerTy; }
-  bool isStruct() const { return oldTy == StructTy || oldTy == PackedStructTy; }
-  bool isArray() const { return oldTy == ArrayTy; }
-  bool isOther() const { 
-    return !isPacked() && !isPointer() && !isFloatingPoint() && !isIntegral(); }
-  bool isFunction() const { return oldTy == FunctionTy; }
-  bool isComposite() const {
-    return isStruct() || isPointer() || isArray() || isPacked();
-  }
+static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }
 
-  bool isAttributeCandidate() const {
-    return isIntegral() && getBitWidth() < 32;
-  }
 
-  bool isUnresolvedDeep() const;
+//===----------------------------------------------------------------------===//
+//               Code to handle definitions of all the types
+//===----------------------------------------------------------------------===//
 
-  unsigned getBitWidth() const;
+static int InsertValue(Value *V,
+                  std::map<const Type*,ValueList> &ValueTab = CurFun.Values) {
+  if (V->hasName()) return -1;           // Is this a numbered definition?
+
+  // Yes, insert the value into the value table...
+  ValueList &List = ValueTab[V->getType()];
+  List.push_back(V);
+  return List.size()-1;
+}
+
+static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
+  switch (D.Type) {
+  case ValID::NumberVal:               // Is it a numbered definition?
+    // Module constants occupy the lowest numbered slots...
+    if ((unsigned)D.Num < CurModule.Types.size()) {
+      return CurModule.Types[(unsigned)D.Num];
+    }
+    break;
+  case ValID::NameVal:                 // Is it a named definition?
+    if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
+      D.destroy();  // Free old strdup'd memory...
+      return N;
+    }
+    break;
+  default:
+    error("Internal parser error: Invalid symbol type reference");
+    return 0;
+  }
 
-  const Type* getIndexedType(const Value*  V) const;
+  // If we reached here, we referenced either a symbol that we don't know about
+  // or an id number that hasn't been read yet.  We may be referencing something
+  // forward, so just create an entry to be resolved later and get to it...
+  //
+  if (DoNotImprovise) return 0;  // Do we just want a null to be returned?
 
-  unsigned getNumStructElements() const { 
-    return (elements ? elements->size() : 0);
-  }
 
-  const Type* getElement(unsigned idx) const {
-    if (elements)
-      if (idx < elements->size())
-        return (*elements)[idx];
-    return 0;
+  if (inFunctionScope()) {
+    if (D.Type == ValID::NameVal) {
+      error("Reference to an undefined type: '" + D.getName() + "'");
+      return 0;
+    } else {
+      error("Reference to an undefined type: #" + itostr(D.Num));
+      return 0;
+    }
   }
 
-private:
-  Type() 
-    : newTy(), oldTy(UnresolvedTy), elemTy(0), resultTy(0), elements(0),
-      nelems(0) {
+  std::map<ValID, PATypeHolder>::iterator I =CurModule.LateResolveTypes.find(D);
+  if (I != CurModule.LateResolveTypes.end())
+    return I->second;
+
+  Type *Typ = OpaqueType::get();
+  CurModule.LateResolveTypes.insert(std::make_pair(D, Typ));
+  return Typ;
+ }
+
+// getExistingValue - Look up the value specified by the provided type and
+// the provided ValID.  If the value exists and has already been defined, return
+// it.  Otherwise return null.
+//
+static Value *getExistingValue(const Type *Ty, const ValID &D) {
+  if (isa<FunctionType>(Ty)) {
+    error("Functions are not values and must be referenced as pointers");
+  }
+
+  switch (D.Type) {
+  case ValID::NumberVal: {                 // Is it a numbered definition?
+    unsigned Num = (unsigned)D.Num;
+
+    // Module constants occupy the lowest numbered slots...
+    std::map<const Type*,ValueList>::iterator VI = CurModule.Values.find(Ty);
+    if (VI != CurModule.Values.end()) {
+      if (Num < VI->second.size())
+        return VI->second[Num];
+      Num -= VI->second.size();
+    }
+
+    // Make sure that our type is within bounds
+    VI = CurFun.Values.find(Ty);
+    if (VI == CurFun.Values.end()) return 0;
+
+    // Check that the number is within bounds...
+    if (VI->second.size() <= Num) return 0;
+
+    return VI->second[Num];
+  }
+
+  case ValID::NameVal: {                // Is it a named definition?
+    // Get the name out of the ID
+    std::string Name(D.Name);
+    Value* V = 0;
+    RenameMapKey Key = std::make_pair(Name, Ty);
+    if (inFunctionScope()) {
+      // See if the name was renamed
+      RenameMapType::const_iterator I = CurFun.RenameMap.find(Key);
+      std::string LookupName;
+      if (I != CurFun.RenameMap.end())
+        LookupName = I->second;
+      else
+        LookupName = Name;
+      SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
+      V = SymTab.lookup(Ty, LookupName);
+    }
+    if (!V) {
+      RenameMapType::const_iterator I = CurModule.RenameMap.find(Key);
+      std::string LookupName;
+      if (I != CurModule.RenameMap.end())
+        LookupName = I->second;
+      else
+        LookupName = Name;
+      V = CurModule.CurrentModule->getValueSymbolTable().lookup(Ty, LookupName);
+    }
+    if (V == 0) 
+      return 0;
+
+    D.destroy();  // Free old strdup'd memory...
+    return V;
   }
 
-  Type(const Type& that); // do not implement
-  Type& operator=(const Type& that); // do not implement
+  // Check to make sure that "Ty" is an integral type, and that our
+  // value will fit into the specified type...
+  case ValID::ConstSIntVal:    // Is it a constant pool reference??
+    if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
+      error("Signed integral constant '" + itostr(D.ConstPool64) + 
+            "' is invalid for type '" + Ty->getDescription() + "'");
+    }
+    return ConstantInt::get(Ty, D.ConstPool64);
+
+  case ValID::ConstUIntVal:     // Is it an unsigned const pool reference?
+    if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
+      if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64))
+        error("Integral constant '" + utostr(D.UConstPool64) + 
+              "' is invalid or out of range");
+      else     // This is really a signed reference.  Transmogrify.
+        return ConstantInt::get(Ty, D.ConstPool64);
+    } else
+      return ConstantInt::get(Ty, D.UConstPool64);
 
-  ~Type() { delete elements; }
+  case ValID::ConstFPVal:        // Is it a floating point const pool reference?
+    if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP))
+      error("FP constant invalid for type");
+    return ConstantFP::get(Ty, D.ConstPoolFP);
+
+  case ValID::ConstNullVal:      // Is it a null value?
+    if (!isa<PointerType>(Ty))
+      error("Cannot create a a non pointer null");
+    return ConstantPointerNull::get(cast<PointerType>(Ty));
+
+  case ValID::ConstUndefVal:      // Is it an undef value?
+    return UndefValue::get(Ty);
+
+  case ValID::ConstZeroVal:      // Is it a zero value?
+    return Constant::getNullValue(Ty);
+    
+  case ValID::ConstantVal:       // Fully resolved constant?
+    if (D.ConstantValue->getType() != Ty) 
+      error("Constant expression type different from required type");
+    return D.ConstantValue;
+
+  case ValID::InlineAsmVal: {    // Inline asm expression
+    const PointerType *PTy = dyn_cast<PointerType>(Ty);
+    const FunctionType *FTy =
+      PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
+    if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints))
+      error("Invalid type for asm constraint string");
+    InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
+                                   D.IAD->HasSideEffects);
+    D.destroy();   // Free InlineAsmDescriptor.
+    return IA;
+  }
+  default:
+    assert(0 && "Unhandled case");
+    return 0;
+  }   // End of switch
 
-  struct ltfunctor
-  {
-    bool operator()(const Type* X, const Type* Y) const {
-      assert(X && "Can't compare null pointer");
-      assert(Y && "Can't compare null pointer");
-      return *X < *Y;
-    }
-  };
+  assert(0 && "Unhandled case");
+  return 0;
+}
 
-  typedef std::set<const Type*, ltfunctor> TypeRegMap;
+// getVal - This function is identical to getExistingValue, except that if a
+// value is not already defined, it "improvises" by creating a placeholder var
+// that looks and acts just like the requested variable.  When the value is
+// defined later, all uses of the placeholder variable are replaced with the
+// real thing.
+//
+static Value *getVal(const Type *Ty, const ValID &ID) {
+  if (Ty == Type::LabelTy)
+    error("Cannot use a basic block here");
+
+  // See if the value has already been defined.
+  Value *V = getExistingValue(Ty, ID);
+  if (V) return V;
+
+  if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty))
+    error("Invalid use of a composite type");
+
+  // If we reached here, we referenced either a symbol that we don't know about
+  // or an id number that hasn't been read yet.  We may be referencing something
+  // forward, so just create an entry to be resolved later and get to it...
+  assert(!isa<SignedType>(Ty) && "Can't create value with SignedType");
+  V = new Argument(Ty);
+
+  // Remember where this forward reference came from.  FIXME, shouldn't we try
+  // to recycle these things??
+  CurModule.PlaceHolderInfo.insert(
+    std::make_pair(V, std::make_pair(ID, Upgradelineno-1)));
 
-  static const Type* add_new_type(Type* existing);
+  if (inFunctionScope())
+    InsertValue(V, CurFun.LateResolveValues);
+  else
+    InsertValue(V, CurModule.LateResolveValues);
+  return V;
+}
 
-  std::string newTy;
-  TypeIDs oldTy;
-  Type *elemTy;
-  Type *resultTy;
-  TypeList *elements;
-  uint64_t nelems;
-  static TypeRegMap registry;
-public:
-  typedef std::vector<const Type*> TypeVector;
-  typedef std::map<std::string,const Type*> TypeMap;
-  typedef std::map<const Type*,std::string> TypePlaneMap;
-  typedef std::map<std::string,TypePlaneMap> GlobalsTypeMap;
-  static TypeVector EnumeratedTypes;
-  static TypeMap NamedTypes;
-  static GlobalsTypeMap Globals;
-};
-
-Type::TypeRegMap     Type::registry;
-Type::TypeVector     Type::EnumeratedTypes;
-Type::TypeMap        Type::NamedTypes;
-Type::GlobalsTypeMap Type::Globals;
-
-const Type* Type::get(const std::string &newType, TypeIDs oldType) {
-  Type* Ty = new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = oldType;
-  return add_new_type(Ty);
-}
-
-const Type* Type::get(const std::string& newType, TypeIDs oldType, 
-                              const Type* eTy, const Type* rTy) {
-  Type* Ty= new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = oldType;
-  Ty->elemTy = const_cast<Type*>(eTy);
-  Ty->resultTy = const_cast<Type*>(rTy);
-  return add_new_type(Ty);
-}
-
-const Type* Type::get(const std::string& newType, TypeIDs oldType, 
-                              const Type *eTy, uint64_t elems) {
-  Type* Ty = new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = oldType;
-  Ty->elemTy = const_cast<Type*>(eTy);
-  Ty->nelems = elems;
-  return  add_new_type(Ty);
-}
-
-const Type* Type::get(const std::string& newType, TypeIDs oldType, 
-                              TypeList* TL) {
-  Type* Ty = new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = oldType;
-  Ty->elements = TL;
-  return add_new_type(Ty);
-}
-
-const Type* Type::get(const std::string& newType, const Type* resTy,
-                              TypeList* TL) {
-  Type* Ty = new Type();
-  Ty->newTy = newType;
-  Ty->oldTy = FunctionTy;
-  Ty->resultTy = const_cast<Type*>(resTy);
-  Ty->elements = TL;
-  return add_new_type(Ty);
-}
-
-const Type* Type::resolve() const {
-  if (isUnresolved()) {
-    if (getNewTy()[0] == '%' && isdigit(newTy[1])) {
-      unsigned ref = atoi(&((newTy.c_str())[1])); // skip the %
-      if (ref < EnumeratedTypes.size()) {
-        return EnumeratedTypes[ref];
-      } else {
-        std::string msg("Can't resolve numbered type: ");
-        msg += getNewTy();
-        yyerror(msg.c_str());
-      }
-    } else {
-      Type::TypeMap::iterator I = NamedTypes.find(newTy);
-      if (I != NamedTypes.end()) {
-        return I->second;
-      } else {
-        std::string msg("Cannot resolve type: ");
-        msg += getNewTy();
-        yyerror(msg.c_str());
-      }
-    }
+/// getBBVal - This is used for two purposes:
+///  * If isDefinition is true, a new basic block with the specified ID is being
+///    defined.
+///  * If isDefinition is true, this is a reference to a basic block, which may
+///    or may not be a forward reference.
+///
+static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {
+  assert(inFunctionScope() && "Can't get basic block at global scope");
+
+  std::string Name;
+  BasicBlock *BB = 0;
+  switch (ID.Type) {
+  default: 
+    error("Illegal label reference " + ID.getName());
+    break;
+  case ValID::NumberVal:                // Is it a numbered definition?
+    if (unsigned(ID.Num) >= CurFun.NumberedBlocks.size())
+      CurFun.NumberedBlocks.resize(ID.Num+1);
+    BB = CurFun.NumberedBlocks[ID.Num];
+    break;
+  case ValID::NameVal:                  // Is it a named definition?
+    Name = ID.Name;
+    if (Value *N = CurFun.CurrentFunction->
+                   getValueSymbolTable().lookup(Type::LabelTy, Name)) {
+      if (N->getType() != Type::LabelTy)
+        error("Name '" + Name + "' does not refer to a BasicBlock");
+      BB = cast<BasicBlock>(N);
+    }
+    break;
+  }
+
+  // See if the block has already been defined.
+  if (BB) {
+    // If this is the definition of the block, make sure the existing value was
+    // just a forward reference.  If it was a forward reference, there will be
+    // an entry for it in the PlaceHolderInfo map.
+    if (isDefinition && !CurFun.BBForwardRefs.erase(BB))
+      // The existing value was a definition, not a forward reference.
+      error("Redefinition of label " + ID.getName());
+
+    ID.destroy();                       // Free strdup'd memory.
+    return BB;
+  }
+
+  // Otherwise this block has not been seen before.
+  BB = new BasicBlock("", CurFun.CurrentFunction);
+  if (ID.Type == ValID::NameVal) {
+    BB->setName(ID.Name);
+  } else {
+    CurFun.NumberedBlocks[ID.Num] = BB;
   }
-  // otherwise its already resolved.
-  return this;
-}
 
-bool Type::operator<(const Type& that) const {
-  if (this == &that)
-    return false;
-  if (oldTy != that.oldTy)
-    return oldTy < that.oldTy;
-  switch (oldTy) {
-    case UpRefTy: {
-      unsigned thisUp = this->getUpRefNum();
-      unsigned thatUp = that.getUpRefNum();
-      return thisUp < thatUp;
-    }
-    case PackedTy:
-    case ArrayTy:
-      if (this->nelems != that.nelems)
-        return nelems < that.nelems;
-    case PointerTy: {
-      const Type* thisTy = this->elemTy;
-      const Type* thatTy = that.elemTy;
-      return *thisTy < *thatTy;
-    }
-    case FunctionTy: {
-      const Type* thisTy = this->resultTy;
-      const Type* thatTy = that.resultTy;
-      if (!thisTy->sameOldTyAs(thatTy))
-        return *thisTy < *thatTy;
-      /* FALL THROUGH */
-    }
-    case StructTy:
-    case PackedStructTy: {
-      if (elements->size() != that.elements->size())
-        return elements->size() < that.elements->size();
-      for (unsigned i = 0; i < elements->size(); i++) {
-        const Type* thisTy = (*this->elements)[i];
-        const Type* thatTy = (*that.elements)[i];
-        if (!thisTy->sameOldTyAs(thatTy))
-          return *thisTy < *thatTy;
-      }
-      break;
-    }
-    case UnresolvedTy:
-      return this->newTy < that.newTy;
-    default:
-      break;
+  // If this is not a definition, keep track of it so we can use it as a forward
+  // reference.
+  if (!isDefinition) {
+    // Remember where this forward reference came from.
+    CurFun.BBForwardRefs[BB] = std::make_pair(ID, Upgradelineno);
+  } else {
+    // The forward declaration could have been inserted anywhere in the
+    // function: insert it into the correct place now.
+    CurFun.CurrentFunction->getBasicBlockList().remove(BB);
+    CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
   }
-  return false; 
+  ID.destroy();
+  return BB;
 }
 
-bool Type::sameOldTyAs(const Type* that) const {
-  if (that == 0)
-    return false;
-  if ( this == that ) 
-    return true;
-  if (oldTy != that->oldTy)
-    return false;
-  switch (oldTy) {
-    case PackedTy:
-    case ArrayTy:
-      if (nelems != that->nelems)
-        return false;
-      /* FALL THROUGH */
-    case PointerTy: {
-      const Type* thisTy = this->elemTy;
-      const Type* thatTy = that->elemTy;
-      return thisTy->sameOldTyAs(thatTy);
-    }
-    case FunctionTy: {
-      const Type* thisTy = this->resultTy;
-      const Type* thatTy = that->resultTy;
-      if (!thisTy->sameOldTyAs(thatTy))
-        return false;
-      /* FALL THROUGH */
-    }
-    case StructTy:
-    case PackedStructTy: {
-      if (elements->size() != that->elements->size())
-        return false;
-      for (unsigned i = 0; i < elements->size(); i++) {
-        const Type* thisTy = (*this->elements)[i];
-        const Type* thatTy = (*that->elements)[i];
-        if (!thisTy->sameOldTyAs(thatTy))
-          return false;
+
+//===----------------------------------------------------------------------===//
+//              Code to handle forward references in instructions
+//===----------------------------------------------------------------------===//
+//
+// This code handles the late binding needed with statements that reference
+// values not defined yet... for example, a forward branch, or the PHI node for
+// a loop body.
+//
+// This keeps a table (CurFun.LateResolveValues) of all such forward references
+// and back patchs after we are done.
+//
+
+// ResolveDefinitions - If we could not resolve some defs at parsing
+// time (forward branches, phi functions for loops, etc...) resolve the
+// defs now...
+//
+static void 
+ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
+                   std::map<const Type*,ValueList> *FutureLateResolvers) {
+  // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
+  for (std::map<const Type*,ValueList>::iterator LRI = LateResolvers.begin(),
+         E = LateResolvers.end(); LRI != E; ++LRI) {
+    ValueList &List = LRI->second;
+    while (!List.empty()) {
+      Value *V = List.back();
+      List.pop_back();
+
+      std::map<Value*, std::pair<ValID, int> >::iterator PHI =
+        CurModule.PlaceHolderInfo.find(V);
+      assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error");
+
+      ValID &DID = PHI->second.first;
+
+      Value *TheRealValue = getExistingValue(LRI->first, DID);
+      if (TheRealValue) {
+        V->replaceAllUsesWith(TheRealValue);
+        delete V;
+        CurModule.PlaceHolderInfo.erase(PHI);
+      } else if (FutureLateResolvers) {
+        // Functions have their unresolved items forwarded to the module late
+        // resolver table
+        InsertValue(V, *FutureLateResolvers);
+      } else {
+        if (DID.Type == ValID::NameVal) {
+          error("Reference to an invalid definition: '" +DID.getName()+
+                "' of type '" + V->getType()->getDescription() + "'",
+                PHI->second.second);
+          return;
+        } else {
+          error("Reference to an invalid definition: #" +
+                itostr(DID.Num) + " of type '" + 
+                V->getType()->getDescription() + "'", PHI->second.second);
+          return;
+        }
       }
-      return true;
     }
-    case UnresolvedTy:
-      return this->newTy == that->newTy;
-    default:
-      return true; // for all others oldTy == that->oldTy is sufficient
   }
-  return true;
+
+  LateResolvers.clear();
 }
 
-bool Type::isUnresolvedDeep() const {
-  switch (oldTy) {
-    case UnresolvedTy: 
-      return true;
-    case PackedTy:
-    case ArrayTy:
-    case PointerTy:
-      return elemTy->isUnresolvedDeep();
-    case PackedStructTy:
-    case StructTy:
-      for (unsigned i = 0; i < elements->size(); i++)
-        if ((*elements)[i]->isUnresolvedDeep())
-          return true;
-      return false;
-    default:
-      return false;
+// ResolveTypeTo - A brand new type was just declared.  This means that (if
+// name is not null) things referencing Name can be resolved.  Otherwise, things
+// refering to the number can be resolved.  Do this now.
+//
+static void ResolveTypeTo(char *Name, const Type *ToTy) {
+  ValID D;
+  if (Name) D = ValID::create(Name);
+  else      D = ValID::create((int)CurModule.Types.size());
+
+  std::map<ValID, PATypeHolder>::iterator I =
+    CurModule.LateResolveTypes.find(D);
+  if (I != CurModule.LateResolveTypes.end()) {
+    ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy);
+    CurModule.LateResolveTypes.erase(I);
   }
 }
 
-unsigned Type::getBitWidth() const {
-  switch (oldTy) {
-    default:
-    case LabelTy:
-    case VoidTy : return 0;
-    case BoolTy : return 1;
-    case SByteTy: case UByteTy : return 8;
-    case ShortTy: case UShortTy : return 16;
-    case IntTy: case UIntTy: case FloatTy: return 32;
-    case LongTy: case ULongTy: case DoubleTy : return 64;
-    case PointerTy: return SizeOfPointer; // global var
-    case PackedTy: 
-    case ArrayTy: 
-      return nelems * elemTy->getBitWidth();
-    case StructTy:
-    case PackedStructTy: {
-      uint64_t size = 0;
-      for (unsigned i = 0; i < elements->size(); i++) {
-        size += (*elements)[i]->getBitWidth();
-      }
-      return size;
-    }
-  }
+static std::string makeNameUnique(const std::string& Name) {
+  static unsigned UniqueNameCounter = 1;
+  std::string Result(Name);
+  Result += ".upgrd." + llvm::utostr(UniqueNameCounter++);
+  return Result;
 }
 
-const Type* Type::getIndexedType(const Value*  V) const {
-  if (isStruct()) {
-    if (V->isConstant() && V->type->isInteger()) {
-      size_t pos = V->val->find(' ') + 1;
-      if (pos < V->val->size()) {
-        uint64_t idx = atoi(V->val->substr(pos).c_str());
-        return (*elements)[idx];
-      } else {
-        yyerror("Invalid value for constant integer");
-        return 0;
+// setValueName - Set the specified value to the name given.  The name may be
+// null potentially, in which case this is a noop.  The string passed in is
+// assumed to be a malloc'd string buffer, and is free'd by this function.
+//
+static void setValueName(Value *V, char *NameStr) {
+  if (NameStr) {
+    std::string Name(NameStr);      // Copy string
+    free(NameStr);                  // Free old string
+
+    if (V->getType() == Type::VoidTy) {
+      error("Can't assign name '" + Name + "' to value with void type");
+      return;
+    }
+
+    assert(!isa<SignedType>(V->getType()) && "Shouldn't have SignedType Value");
+    assert(inFunctionScope() && "Must be in function scope");
+
+    // Search the function's symbol table for an existing value of this name
+    Value* Existing = 0;
+    SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
+    SymbolTable::plane_const_iterator PI = ST.plane_begin(), PE =ST.plane_end();
+    for ( ; PI != PE; ++PI) {
+      SymbolTable::value_const_iterator VI = PI->second.find(Name);
+      if (VI != PI->second.end()) {
+        Existing = VI->second;
+        break;
       }
-    } else {
-      yyerror("Structure requires constant index");
-      return 0;
     }
+    if (Existing) {
+      if (Existing->getType() == V->getType()) {
+        // The type of the Existing value and the new one are the same. This
+        // is probably a type plane collapsing error. If the types involved
+        // are both integer, just rename it. Otherwise it 
+        // is a redefinition error.
+        if (!Existing->getType()->isInteger()) {
+          error("Redefinition of value named '" + Name + "' in the '" +
+                V->getType()->getDescription() + "' type plane");
+          return;
+        }
+      } 
+      // In LLVM 2.0 we don't allow names to be re-used for any values in a 
+      // function, regardless of Type. Previously re-use of names was okay as 
+      // long as they were distinct types. With type planes collapsing because
+      // of the signedness change and because of PR411, this can no longer be
+      // supported. We must search the entire symbol table for a conflicting
+      // name and make the name unique. No warning is needed as this can't 
+      // cause a problem.
+      std::string NewName = makeNameUnique(Name);
+      // We're changing the name but it will probably be used by other 
+      // instructions as operands later on. Consequently we have to retain
+      // a mapping of the renaming that we're doing.
+      RenameMapKey Key = std::make_pair(Name,V->getType());
+      CurFun.RenameMap[Key] = NewName;
+      Name = NewName;
+    }
+
+    // Set the name.
+    V->setName(Name);
   }
-  if (isArray() || isPacked() || isPointer())
-    return elemTy;
-  yyerror("Invalid type for getIndexedType");
-  return 0;
 }
 
-void Type::getSignedness(unsigned &sNum, unsigned &uNum, 
-                             UpRefStack& stack) const {
-  switch (oldTy) {
-    default:
-    case OpaqueTy: case LabelTy: case VoidTy: case BoolTy: 
-    case FloatTy : case DoubleTy: case UpRefTy:
-      return;
-    case SByteTy: case ShortTy: case LongTy: case IntTy: 
-      sNum++;
-      return;
-    case UByteTy: case UShortTy: case UIntTy: case ULongTy: 
-      uNum++;
-      return;
-    case PointerTy:
-    case PackedTy: 
-    case ArrayTy:
-      stack.push_back(this);
-      elemTy->getSignedness(sNum, uNum, stack);
-      return;
-    case StructTy:
-    case PackedStructTy: {
-      stack.push_back(this);
-      for (unsigned i = 0; i < elements->size(); i++) {
-        (*elements)[i]->getSignedness(sNum, uNum, stack);
+/// ParseGlobalVariable - Handle parsing of a global.  If Initializer is null,
+/// this is a declaration, otherwise it is a definition.
+static GlobalVariable *
+ParseGlobalVariable(char *NameStr,GlobalValue::LinkageTypes Linkage,
+                    bool isConstantGlobal, const Type *Ty,
+                    Constant *Initializer) {
+  if (isa<FunctionType>(Ty))
+    error("Cannot declare global vars of function type");
+
+  const PointerType *PTy = PointerType::get(Ty);
+
+  std::string Name;
+  if (NameStr) {
+    Name = NameStr;      // Copy string
+    free(NameStr);       // Free old string
+  }
+
+  // See if this global value was forward referenced.  If so, recycle the
+  // object.
+  ValID ID;
+  if (!Name.empty()) {
+    ID = ValID::create((char*)Name.c_str());
+  } else {
+    ID = ValID::create((int)CurModule.Values[PTy].size());
+  }
+
+  if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
+    // Move the global to the end of the list, from whereever it was
+    // previously inserted.
+    GlobalVariable *GV = cast<GlobalVariable>(FWGV);
+    CurModule.CurrentModule->getGlobalList().remove(GV);
+    CurModule.CurrentModule->getGlobalList().push_back(GV);
+    GV->setInitializer(Initializer);
+    GV->setLinkage(Linkage);
+    GV->setConstant(isConstantGlobal);
+    InsertValue(GV, CurModule.Values);
+    return GV;
+  }
+
+  // If this global has a name, check to see if there is already a definition
+  // of this global in the module and emit warnings if there are conflicts.
+  if (!Name.empty()) {
+    // The global has a name. See if there's an existing one of the same name.
+    if (CurModule.CurrentModule->getNamedGlobal(Name)) {
+      // We found an existing global ov the same name. This isn't allowed 
+      // in LLVM 2.0. Consequently, we must alter the name of the global so it
+      // can at least compile. This can happen because of type planes 
+      // There is alread a global of the same name which means there is a
+      // conflict. Let's see what we can do about it.
+      std::string NewName(makeNameUnique(Name));
+      if (Linkage == GlobalValue::InternalLinkage) {
+        // The linkage type is internal so just warn about the rename without
+        // invoking "scarey language" about linkage failures. GVars with
+        // InternalLinkage can be renamed at will.
+        warning("Global variable '" + Name + "' was renamed to '"+ 
+                NewName + "'");
+      } else {
+        // The linkage of this gval is external so we can't reliably rename 
+        // it because it could potentially create a linking problem.  
+        // However, we can't leave the name conflict in the output either or 
+        // it won't assemble with LLVM 2.0.  So, all we can do is rename 
+        // this one to something unique and emit a warning about the problem.
+        warning("Renaming global variable '" + Name + "' to '" + NewName + 
+                  "' may cause linkage errors");
       }
-      return;
-    }
-    case UnresolvedTy: {
-      const Type* Ty = this->resolve();
-      // Let's not recurse.
-      UpRefStack::const_iterator I = stack.begin(), E = stack.end();
-      for ( ; I != E && *I != Ty; ++I) 
-        ;
-      if (I == E)
-        Ty->getSignedness(sNum, uNum, stack);
-      return;
+
+      // Put the renaming in the global rename map
+      RenameMapKey Key = std::make_pair(Name,PointerType::get(Ty));
+      CurModule.RenameMap[Key] = NewName;
+
+      // Rename it
+      Name = NewName;
     }
   }
-}
 
-std::string AddSuffix(const std::string& Name, const std::string& Suffix) {
-  if (Name[Name.size()-1] == '"') {
-    std::string Result = Name;
-    Result.insert(Result.size()-1, Suffix);
-    return Result;
-  }
-  return Name + Suffix;
+  // Otherwise there is no existing GV to use, create one now.
+  GlobalVariable *GV =
+    new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
+                       CurModule.CurrentModule);
+  InsertValue(GV, CurModule.Values);
+  return GV;
 }
 
-std::string Type::makeUniqueName(const std::string& BaseName) const {
-  if (BaseName == "\"alloca point\"")
-    return BaseName;
-  switch (oldTy) {
-    default:
-      break;
-    case OpaqueTy: case LabelTy: case VoidTy: case BoolTy: case UpRefTy:
-    case FloatTy : case DoubleTy: case UnresolvedTy:
-      return BaseName;
-    case SByteTy: case ShortTy: case LongTy: case IntTy: 
-      return AddSuffix(BaseName, ".s");
-    case UByteTy: case UShortTy: case UIntTy: case ULongTy: 
-      return AddSuffix(BaseName, ".u");
-  }
-
-  unsigned uNum = 0, sNum = 0;
-  std::string Suffix;
-  switch (oldTy) {
-    case PointerTy:
-    case PackedTy: 
-    case ArrayTy: {
-      Type::UpRefStack stack;
-      elemTy->resolve()->getSignedness(sNum, uNum, stack);
-      break;
-    }
-    case StructTy:
-    case PackedStructTy: {
-      for (unsigned i = 0; i < elements->size(); i++) {
-        Type::UpRefStack stack;
-        (*elements)[i]->resolve()->getSignedness(sNum, uNum, stack);
-      }
-      break;
-    }
-    default:
-      assert(0 && "Invalid Type");
-      break;
+// setTypeName - Set the specified type to the name given.  The name may be
+// null potentially, in which case this is a noop.  The string passed in is
+// assumed to be a malloc'd string buffer, and is freed by this function.
+//
+// This function returns true if the type has already been defined, but is
+// allowed to be redefined in the specified context.  If the name is a new name
+// for the type plane, it is inserted and false is returned.
+static bool setTypeName(const Type *T, char *NameStr) {
+  assert(!inFunctionScope() && "Can't give types function-local names");
+  if (NameStr == 0) return false;
+ 
+  std::string Name(NameStr);      // Copy string
+  free(NameStr);                  // Free old string
+
+  // We don't allow assigning names to void type
+  if (T == Type::VoidTy) {
+    error("Can't assign name '" + Name + "' to the void type");
+    return false;
   }
 
-  if (sNum == 0 && uNum == 0)
-    return BaseName;
+  // Set the type name, checking for conflicts as we do so.
+  bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T);
 
-  switch (oldTy) {
-    default:             Suffix += ".nada"; break;
-    case PointerTy:      Suffix += ".pntr"; break;
-    case PackedTy:       Suffix += ".pckd"; break;
-    case ArrayTy:        Suffix += ".arry"; break;
-    case StructTy:       Suffix += ".strc"; break;
-    case PackedStructTy: Suffix += ".pstr"; break;
-  }
-
-  Suffix += ".s" + llvm::utostr(sNum);
-  Suffix += ".u" + llvm::utostr(uNum);
-  return AddSuffix(BaseName, Suffix);
-}
-
-Type& Type::operator=(const Type& that) {
-  oldTy = that.oldTy;
-  nelems = that.nelems;
-  newTy = that.newTy;
-  elemTy = that.elemTy;
-  resultTy = that.resultTy;
-  if (that.elements) {
-    elements = new TypeList(that.elements->size());
-    *elements = *that.elements;
-  } else {
-    elements = 0;
+  if (AlreadyExists) {   // Inserting a name that is already defined???
+    const Type *Existing = CurModule.CurrentModule->getTypeByName(Name);
+    assert(Existing && "Conflict but no matching type?");
+
+    // There is only one case where this is allowed: when we are refining an
+    // opaque type.  In this case, Existing will be an opaque type.
+    if (const OpaqueType *OpTy = dyn_cast<OpaqueType>(Existing)) {
+      // We ARE replacing an opaque type!
+      const_cast<OpaqueType*>(OpTy)->refineAbstractTypeTo(T);
+      return true;
+    }
+
+    // Otherwise, this is an attempt to redefine a type. That's okay if
+    // the redefinition is identical to the original. This will be so if
+    // Existing and T point to the same Type object. In this one case we
+    // allow the equivalent redefinition.
+    if (Existing == T) return true;  // Yes, it's equal.
+
+    // Any other kind of (non-equivalent) redefinition is an error.
+    error("Redefinition of type named '" + Name + "' in the '" +
+          T->getDescription() + "' type plane");
   }
-  return *this;
+
+  return false;
 }
 
-const Type* Type::add_new_type(Type* newTy) {
-  TypeRegMap::iterator I = registry.find(newTy);
-  if (I != registry.end()) {
-    delete newTy;
-    return *I;
-  }
-  registry.insert(newTy);
-  return newTy;
-}
-
-class Instruction {
-};
-
-/// This type is used to keep track of the signedness of constants.
-struct Constant {
-  std::string *cnst;
-  const Type *type;
-  ~Constant() { delete cnst; }
-};
-
-/// This variable provides a counter for unique names. It is used in various
-/// productions to ensure a unique name is generated.
-static uint64_t UniqueNameCounter = 1;
-
-// This is set when a DECLARE keyword is recognized so that subsequent parsing
-// of a function prototype can know if its a declaration or definition.
-static bool isDeclare = false;
-
-// This bool is used to communicate between the InstVal and Inst rules about
-// whether or not a cast should be deleted. When the flag is set, InstVal has
-// determined that the cast is a candidate. However, it can only be deleted if
-// the value being casted is the same value name as the instruction. The Inst
-// rule makes that comparison if the flag is set and comments out the
-// instruction if they match.
-static bool deleteUselessCastFlag = false;
-static std::string* deleteUselessCastName = 0;
+//===----------------------------------------------------------------------===//
+// Code for handling upreferences in type names...
+//
 
+// TypeContains - Returns true if Ty directly contains E in it.
+//
+static bool TypeContains(const Type *Ty, const Type *E) {
+  return std::find(Ty->subtype_begin(), Ty->subtype_end(),
+                   E) != Ty->subtype_end();
+}
+
+namespace {
+  struct UpRefRecord {
+    // NestingLevel - The number of nesting levels that need to be popped before
+    // this type is resolved.
+    unsigned NestingLevel;
+
+    // LastContainedTy - This is the type at the current binding level for the
+    // type.  Every time we reduce the nesting level, this gets updated.
+    const Type *LastContainedTy;
+
+    // UpRefTy - This is the actual opaque type that the upreference is
+    // represented with.
+    OpaqueType *UpRefTy;
+
+    UpRefRecord(unsigned NL, OpaqueType *URTy)
+      : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {}
+  };
+}
 
+// UpRefs - A list of the outstanding upreferences that need to be resolved.
+static std::vector<UpRefRecord> UpRefs;
+
+/// HandleUpRefs - Every time we finish a new layer of types, this function is
+/// called.  It loops through the UpRefs vector, which is a list of the
+/// currently active types.  For each type, if the up reference is contained in
+/// the newly completed type, we decrement the level count.  When the level
+/// count reaches zero, the upreferenced type is the type that is passed in:
+/// thus we can complete the cycle.
+///
+static PATypeHolder HandleUpRefs(const Type *ty) {
+  // If Ty isn't abstract, or if there are no up-references in it, then there is
+  // nothing to resolve here.
+  if (!ty->isAbstract() || UpRefs.empty()) return ty;
+  
+  PATypeHolder Ty(ty);
+  UR_OUT("Type '" << Ty->getDescription() <<
+         "' newly formed.  Resolving upreferences.\n" <<
+         UpRefs.size() << " upreferences active!\n");
+
+  // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
+  // to zero), we resolve them all together before we resolve them to Ty.  At
+  // the end of the loop, if there is anything to resolve to Ty, it will be in
+  // this variable.
+  OpaqueType *TypeToResolve = 0;
+
+  for (unsigned i = 0; i != UpRefs.size(); ++i) {
+    UR_OUT("  UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
+           << UpRefs[i].second->getDescription() << ") = "
+           << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n");
+    if (TypeContains(Ty, UpRefs[i].LastContainedTy)) {
+      // Decrement level of upreference
+      unsigned Level = --UpRefs[i].NestingLevel;
+      UpRefs[i].LastContainedTy = Ty;
+      UR_OUT("  Uplevel Ref Level = " << Level << "\n");
+      if (Level == 0) {                     // Upreference should be resolved!
+        if (!TypeToResolve) {
+          TypeToResolve = UpRefs[i].UpRefTy;
+        } else {
+          UR_OUT("  * Resolving upreference for "
+                 << UpRefs[i].second->getDescription() << "\n";
+                 std::string OldName = UpRefs[i].UpRefTy->getDescription());
+          UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
+          UR_OUT("  * Type '" << OldName << "' refined upreference to: "
+                 << (const void*)Ty << ", " << Ty->getDescription() << "\n");
+        }
+        UpRefs.erase(UpRefs.begin()+i);     // Remove from upreference list...
+        --i;                                // Do not skip the next element...
+      }
+    }
+  }
 
-const char* getCastOpcode(std::string& Source, const Type* SrcTy, 
-                          const Type* DstTy) {
-  unsigned SrcBits = SrcTy->getBitWidth();
-  unsigned DstBits = DstTy->getBitWidth();
-  const char* opcode = "bitcast";
-  // Run through the possibilities ...
-  if (DstTy->isIntegral()) {                        // Casting to integral
-    if (SrcTy->isIntegral()) {                      // Casting from integral
-      if (DstBits < SrcBits)
-        opcode = "trunc";
-      else if (DstBits > SrcBits) {                // its an extension
-        if (SrcTy->isSigned())
-          opcode ="sext";                          // signed -> SEXT
+  if (TypeToResolve) {
+    UR_OUT("  * Resolving upreference for "
+           << UpRefs[i].second->getDescription() << "\n";
+           std::string OldName = TypeToResolve->getDescription());
+    TypeToResolve->refineAbstractTypeTo(Ty);
+  }
+
+  return Ty;
+}
+
+static inline Instruction::TermOps 
+getTermOp(TermOps op) {
+  switch (op) {
+    default           : assert(0 && "Invalid OldTermOp");
+    case RetOp        : return Instruction::Ret;
+    case BrOp         : return Instruction::Br;
+    case SwitchOp     : return Instruction::Switch;
+    case InvokeOp     : return Instruction::Invoke;
+    case UnwindOp     : return Instruction::Unwind;
+    case UnreachableOp: return Instruction::Unreachable;
+  }
+}
+
+static inline Instruction::BinaryOps 
+getBinaryOp(BinaryOps op, const Type *Ty, Signedness Sign) {
+  switch (op) {
+    default     : assert(0 && "Invalid OldBinaryOps");
+    case SetEQ  : 
+    case SetNE  : 
+    case SetLE  :
+    case SetGE  :
+    case SetLT  :
+    case SetGT  : assert(0 && "Should use getCompareOp");
+    case AddOp  : return Instruction::Add;
+    case SubOp  : return Instruction::Sub;
+    case MulOp  : return Instruction::Mul;
+    case DivOp  : {
+      // This is an obsolete instruction so we must upgrade it based on the
+      // types of its operands.
+      bool isFP = Ty->isFloatingPoint();
+      if (const PackedType* PTy = dyn_cast<PackedType>(Ty))
+        // If its a packed type we want to use the element type
+        isFP = PTy->getElementType()->isFloatingPoint();
+      if (isFP)
+        return Instruction::FDiv;
+      else if (Sign == Signed)
+        return Instruction::SDiv;
+      return Instruction::UDiv;
+    }
+    case UDivOp : return Instruction::UDiv;
+    case SDivOp : return Instruction::SDiv;
+    case FDivOp : return Instruction::FDiv;
+    case RemOp  : {
+      // This is an obsolete instruction so we must upgrade it based on the
+      // types of its operands.
+      bool isFP = Ty->isFloatingPoint();
+      if (const PackedType* PTy = dyn_cast<PackedType>(Ty))
+        // If its a packed type we want to use the element type
+        isFP = PTy->getElementType()->isFloatingPoint();
+      // Select correct opcode
+      if (isFP)
+        return Instruction::FRem;
+      else if (Sign == Signed)
+        return Instruction::SRem;
+      return Instruction::URem;
+    }
+    case URemOp : return Instruction::URem;
+    case SRemOp : return Instruction::SRem;
+    case FRemOp : return Instruction::FRem;
+    case AndOp  : return Instruction::And;
+    case OrOp   : return Instruction::Or;
+    case XorOp  : return Instruction::Xor;
+  }
+}
+
+static inline Instruction::OtherOps 
+getCompareOp(BinaryOps op, unsigned short &predicate, const Type* &Ty,
+             Signedness Sign) {
+  bool isSigned = Sign == Signed;
+  bool isFP = Ty->isFloatingPoint();
+  switch (op) {
+    default     : assert(0 && "Invalid OldSetCC");
+    case SetEQ  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OEQ;
+        return Instruction::FCmp;
+      } else {
+        predicate = ICmpInst::ICMP_EQ;
+        return Instruction::ICmp;
+      }
+    case SetNE  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_UNE;
+        return Instruction::FCmp;
+      } else {
+        predicate = ICmpInst::ICMP_NE;
+        return Instruction::ICmp;
+      }
+    case SetLE  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OLE;
+        return Instruction::FCmp;
+      } else {
+        if (isSigned)
+          predicate = ICmpInst::ICMP_SLE;
         else
-          opcode = "zext";                         // unsigned -> ZEXT
+          predicate = ICmpInst::ICMP_ULE;
+        return Instruction::ICmp;
+      }
+    case SetGE  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OGE;
+        return Instruction::FCmp;
       } else {
-        opcode = "bitcast";                        // Same size, No-op cast
+        if (isSigned)
+          predicate = ICmpInst::ICMP_SGE;
+        else
+          predicate = ICmpInst::ICMP_UGE;
+        return Instruction::ICmp;
+      }
+    case SetLT  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OLT;
+        return Instruction::FCmp;
+      } else {
+        if (isSigned)
+          predicate = ICmpInst::ICMP_SLT;
+        else
+          predicate = ICmpInst::ICMP_ULT;
+        return Instruction::ICmp;
+      }
+    case SetGT  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OGT;
+        return Instruction::FCmp;
+      } else {
+        if (isSigned)
+          predicate = ICmpInst::ICMP_SGT;
+        else
+          predicate = ICmpInst::ICMP_UGT;
+        return Instruction::ICmp;
       }
-    } else if (SrcTy->isFloatingPoint()) {          // Casting from floating pt
-      if (DstTy->isSigned()) 
-        opcode = "fptosi";                         // FP -> sint
-      else
-        opcode = "fptoui";                         // FP -> uint 
-    } else if (SrcTy->isPacked()) {
-      assert(DstBits == SrcTy->getBitWidth() &&
-               "Casting packed to integer of different width");
-        opcode = "bitcast";                        // same size, no-op cast
-    } else {
-      assert(SrcTy->isPointer() &&
-             "Casting from a value that is not first-class type");
-      opcode = "ptrtoint";                         // ptr -> int
-    }
-  } else if (DstTy->isFloatingPoint()) {           // Casting to floating pt
-    if (SrcTy->isIntegral()) {                     // Casting from integral
-      if (SrcTy->isSigned())
-        opcode = "sitofp";                         // sint -> FP
-      else
-        opcode = "uitofp";                         // uint -> FP
-    } else if (SrcTy->isFloatingPoint()) {         // Casting from floating pt
-      if (DstBits < SrcBits) {
-        opcode = "fptrunc";                        // FP -> smaller FP
-      } else if (DstBits > SrcBits) {
-        opcode = "fpext";                          // FP -> larger FP
-      } else  {
-        opcode ="bitcast";                         // same size, no-op cast
-      }
-    } else if (SrcTy->isPacked()) {
-      assert(DstBits == SrcTy->getBitWidth() &&
-             "Casting packed to floating point of different width");
-        opcode = "bitcast";                        // same size, no-op cast
-    } else {
-      assert(0 && "Casting pointer or non-first class to float");
-    }
-  } else if (DstTy->isPacked()) {
-    if (SrcTy->isPacked()) {
-      assert(DstTy->getBitWidth() == SrcTy->getBitWidth() &&
-             "Casting packed to packed of different widths");
-      opcode = "bitcast";                          // packed -> packed
-    } else if (DstTy->getBitWidth() == SrcBits) {
-      opcode = "bitcast";                          // float/int -> packed
-    } else {
-      assert(!"Illegal cast to packed (wrong type or size)");
-    }
-  } else if (DstTy->isPointer()) {
-    if (SrcTy->isPointer()) {
-      opcode = "bitcast";                          // ptr -> ptr
-    } else if (SrcTy->isIntegral()) {
-      opcode = "inttoptr";                         // int -> ptr
-    } else {
-      assert(!"Casting invalid type to pointer");
-    }
-  } else {
-    assert(!"Casting to type that is not first-class");
   }
-  return opcode;
 }
 
-std::string getCastUpgrade(const std::string& Src, const Type* SrcTy,
-                           const Type* DstTy, bool isConst) {
-  std::string Result;
-  std::string Source = Src;
-  if (SrcTy->isFloatingPoint() && DstTy->isPointer()) {
-    // fp -> ptr cast is no longer supported but we must upgrade this
-    // by doing a double cast: fp -> int -> ptr
-    if (isConst)
-      Source = "i64 fptoui(" + Source + " to i64)";
-    else {
-      *O << "    %cast_upgrade" << UniqueNameCounter << " = fptoui " 
-         << Source << " to i64\n";
-      Source = "i64 %cast_upgrade" + llvm::utostr(UniqueNameCounter++);
-    }
-    // Update the SrcTy for the getCastOpcode call below
-    SrcTy = Type::get("i64", ULongTy);
-  } else if (DstTy->isBool()) {
-    // cast type %x to bool was previously defined as setne type %x, null
-    // The cast semantic is now to truncate, not compare so we must retain
-    // the original intent by replacing the cast with a setne
-    const char* comparator = SrcTy->isPointer() ? ", null" : 
-      (SrcTy->isFloatingPoint() ? ", 0.0" : 
-       (SrcTy->isBool() ? ", false" : ", 0"));
-    const char* compareOp = SrcTy->isFloatingPoint() ? "fcmp one " : "icmp ne ";
-    if (isConst) { 
-      Result = "(" + Source + comparator + ")";
-      Result = compareOp + Result;
-    } else
-      Result = compareOp + Source + comparator;
-    return Result; // skip cast processing below
+static inline Instruction::MemoryOps getMemoryOp(MemoryOps op) {
+  switch (op) {
+    default              : assert(0 && "Invalid OldMemoryOps");
+    case MallocOp        : return Instruction::Malloc;
+    case FreeOp          : return Instruction::Free;
+    case AllocaOp        : return Instruction::Alloca;
+    case LoadOp          : return Instruction::Load;
+    case StoreOp         : return Instruction::Store;
+    case GetElementPtrOp : return Instruction::GetElementPtr;
   }
-  SrcTy = SrcTy->resolve();
-  DstTy = DstTy->resolve();
-  std::string Opcode(getCastOpcode(Source, SrcTy, DstTy));
-  if (isConst)
-    Result += Opcode + "( " + Source + " to " + DstTy->getNewTy() + ")";
-  else
-    Result += Opcode + " " + Source + " to " + DstTy->getNewTy();
-  return Result;
 }
 
-const char* getDivRemOpcode(const std::string& opcode, const Type* TI) {
-  const char* op = opcode.c_str();
-  const Type* Ty = TI->resolve();
-  if (Ty->isPacked())
-    Ty = Ty->getElementType();
-  if (opcode == "div")
-    if (Ty->isFloatingPoint())
-      op = "fdiv";
-    else if (Ty->isUnsigned())
-      op = "udiv";
-    else if (Ty->isSigned())
-      op = "sdiv";
-    else
-      yyerror("Invalid type for div instruction");
-  else if (opcode == "rem")
-    if (Ty->isFloatingPoint())
-      op = "frem";
-    else if (Ty->isUnsigned())
-      op = "urem";
-    else if (Ty->isSigned())
-      op = "srem";
-    else
-      yyerror("Invalid type for rem instruction");
-  return op;
-}
-
-std::string getCompareOp(const std::string& setcc, const Type* TI) {
-  assert(setcc.length() == 5);
-  char cc1 = setcc[3];
-  char cc2 = setcc[4];
-  assert(cc1 == 'e' || cc1 == 'n' || cc1 == 'l' || cc1 == 'g');
-  assert(cc2 == 'q' || cc2 == 'e' || cc2 == 'e' || cc2 == 't');
-  std::string result("xcmp xxx");
-  result[6] = cc1;
-  result[7] = cc2;
-  if (TI->isFloatingPoint()) {
-    result[0] = 'f';
-    result[5] = 'o';
-    if (cc1 == 'n')
-      result[5] = 'u'; // NE maps to unordered
-    else
-      result[5] = 'o'; // everything else maps to ordered
-  } else if (TI->isIntegral() || TI->isPointer()) {
-    result[0] = 'i';
-    if ((cc1 == 'e' && cc2 == 'q') || (cc1 == 'n' && cc2 == 'e'))
-      result.erase(5,1);
-    else if (TI->isSigned())
-      result[5] = 's';
-    else if (TI->isUnsigned() || TI->isPointer() || TI->isBool())
-      result[5] = 'u';
-    else
-      yyerror("Invalid integral type for setcc");
-  }
-  return result;
+static inline Instruction::OtherOps 
+getOtherOp(OtherOps op, Signedness Sign) {
+  switch (op) {
+    default               : assert(0 && "Invalid OldOtherOps");
+    case PHIOp            : return Instruction::PHI;
+    case CallOp           : return Instruction::Call;
+    case ShlOp            : return Instruction::Shl;
+    case ShrOp            : 
+      if (Sign == Signed)
+        return Instruction::AShr;
+      return Instruction::LShr;
+    case SelectOp         : return Instruction::Select;
+    case UserOp1          : return Instruction::UserOp1;
+    case UserOp2          : return Instruction::UserOp2;
+    case VAArg            : return Instruction::VAArg;
+    case ExtractElementOp : return Instruction::ExtractElement;
+    case InsertElementOp  : return Instruction::InsertElement;
+    case ShuffleVectorOp  : return Instruction::ShuffleVector;
+    case ICmpOp           : return Instruction::ICmp;
+    case FCmpOp           : return Instruction::FCmp;
+    case LShrOp           : return Instruction::LShr;
+    case AShrOp           : return Instruction::AShr;
+  };
 }
 
-const Type* getFunctionReturnType(const Type* PFTy) {
-  PFTy = PFTy->resolve();
-  if (PFTy->isPointer()) {
-    const Type* ElemTy = PFTy->getElementType();
-    ElemTy = ElemTy->resolve();
-    if (ElemTy->isFunction())
-      return ElemTy->getResultType();
-  } else if (PFTy->isFunction()) {
-    return PFTy->getResultType();
-  }
-  return PFTy;
-}
-
-const Type* ResolveUpReference(const Type* Ty, 
-                                   Type::UpRefStack* stack) {
-  assert(Ty->isUpReference() && "Can't resolve a non-upreference");
-  unsigned upref = Ty->getUpRefNum();
-  assert(upref < stack->size() && "Invalid up reference");
-  return (*stack)[upref - stack->size() - 1];
-}
-
-const Type* getGEPIndexedType(const Type* PTy, ValueList* idxs) {
-  const Type* Result = PTy = PTy->resolve();
-  assert(PTy->isPointer() && "GEP Operand is not a pointer?");
-  Type::UpRefStack stack;
-  for (unsigned i = 0; i < idxs->size(); ++i) {
-    if (Result->isComposite()) {
-      Result = Result->getIndexedType((*idxs)[i]);
-      Result = Result->resolve();
-      stack.push_back(Result);
-    } else
-      yyerror("Invalid type for index");
-  }
-  // Resolve upreferences so we can return a more natural type
-  if (Result->isPointer()) {
-    if (Result->getElementType()->isUpReference()) {
-      stack.push_back(Result);
-      Result = ResolveUpReference(Result->getElementType(), &stack);
+static inline Value*
+getCast(CastOps op, Value *Src, Signedness SrcSign, const Type *DstTy, 
+        Signedness DstSign, bool ForceInstruction = false) {
+  Instruction::CastOps Opcode;
+  const Type* SrcTy = Src->getType();
+  if (op == CastOp) {
+    if (SrcTy->isFloatingPoint() && isa<PointerType>(DstTy)) {
+      // fp -> ptr cast is no longer supported but we must upgrade this
+      // by doing a double cast: fp -> int -> ptr
+      SrcTy = Type::Int64Ty;
+      Opcode = Instruction::IntToPtr;
+      if (isa<Constant>(Src)) {
+        Src = ConstantExpr::getCast(Instruction::FPToUI, 
+                                     cast<Constant>(Src), SrcTy);
+      } else {
+        std::string NewName(makeNameUnique(Src->getName()));
+        Src = new FPToUIInst(Src, SrcTy, NewName, CurBB);
+      }
+    } else if (isa<IntegerType>(DstTy) &&
+               cast<IntegerType>(DstTy)->getBitWidth() == 1) {
+      // cast type %x to bool was previously defined as setne type %x, null
+      // The cast semantic is now to truncate, not compare so we must retain
+      // the original intent by replacing the cast with a setne
+      Constant* Null = Constant::getNullValue(SrcTy);
+      Instruction::OtherOps Opcode = Instruction::ICmp;
+      unsigned short predicate = ICmpInst::ICMP_NE;
+      if (SrcTy->isFloatingPoint()) {
+        Opcode = Instruction::FCmp;
+        predicate = FCmpInst::FCMP_ONE;
+      } else if (!SrcTy->isInteger() && !isa<PointerType>(SrcTy)) {
+        error("Invalid cast to bool");
+      }
+      if (isa<Constant>(Src) && !ForceInstruction)
+        return ConstantExpr::getCompare(predicate, cast<Constant>(Src), Null);
+      else
+        return CmpInst::create(Opcode, predicate, Src, Null);
+    }
+    // Determine the opcode to use by calling CastInst::getCastOpcode
+    Opcode = 
+      CastInst::getCastOpcode(Src, SrcSign == Signed, DstTy, DstSign == Signed);
+
+  } else switch (op) {
+    default: assert(0 && "Invalid cast token");
+    case TruncOp:    Opcode = Instruction::Trunc; break;
+    case ZExtOp:     Opcode = Instruction::ZExt; break;
+    case SExtOp:     Opcode = Instruction::SExt; break;
+    case FPTruncOp:  Opcode = Instruction::FPTrunc; break;
+    case FPExtOp:    Opcode = Instruction::FPExt; break;
+    case FPToUIOp:   Opcode = Instruction::FPToUI; break;
+    case FPToSIOp:   Opcode = Instruction::FPToSI; break;
+    case UIToFPOp:   Opcode = Instruction::UIToFP; break;
+    case SIToFPOp:   Opcode = Instruction::SIToFP; break;
+    case PtrToIntOp: Opcode = Instruction::PtrToInt; break;
+    case IntToPtrOp: Opcode = Instruction::IntToPtr; break;
+    case BitCastOp:  Opcode = Instruction::BitCast; break;
+  }
+
+  if (isa<Constant>(Src) && !ForceInstruction)
+    return ConstantExpr::getCast(Opcode, cast<Constant>(Src), DstTy);
+  return CastInst::create(Opcode, Src, DstTy);
+}
+
+static Instruction *
+upgradeIntrinsicCall(const Type* RetTy, const ValID &ID, 
+                     std::vector<Value*>& Args) {
+
+  std::string Name = ID.Type == ValID::NameVal ? ID.Name : "";
+  if (Name == "llvm.isunordered.f32" || Name == "llvm.isunordered.f64") {
+    if (Args.size() != 2)
+      error("Invalid prototype for " + Name + " prototype");
+    return new FCmpInst(FCmpInst::FCMP_UNO, Args[0], Args[1]);
+  } else {
+    static unsigned upgradeCount = 1;
+    const Type* PtrTy = PointerType::get(Type::Int8Ty);
+    std::vector<const Type*> Params;
+    if (Name == "llvm.va_start" || Name == "llvm.va_end") {
+      if (Args.size() != 1)
+        error("Invalid prototype for " + Name + " prototype");
+      Params.push_back(PtrTy);
+      const FunctionType *FTy = FunctionType::get(Type::VoidTy, Params, false);
+      const PointerType *PFTy = PointerType::get(FTy);
+      Value* Func = getVal(PFTy, ID);
+      std::string InstName("va_upgrade");
+      InstName += llvm::utostr(upgradeCount++);
+      Args[0] = new BitCastInst(Args[0], PtrTy, InstName, CurBB);
+      return new CallInst(Func, Args);
+    } else if (Name == "llvm.va_copy") {
+      if (Args.size() != 2)
+        error("Invalid prototype for " + Name + " prototype");
+      Params.push_back(PtrTy);
+      Params.push_back(PtrTy);
+      const FunctionType *FTy = FunctionType::get(Type::VoidTy, Params, false);
+      const PointerType *PFTy = PointerType::get(FTy);
+      Value* Func = getVal(PFTy, ID);
+      std::string InstName0("va_upgrade");
+      InstName0 += llvm::utostr(upgradeCount++);
+      std::string InstName1("va_upgrade");
+      InstName1 += llvm::utostr(upgradeCount++);
+      Args[0] = new BitCastInst(Args[0], PtrTy, InstName0, CurBB);
+      Args[1] = new BitCastInst(Args[1], PtrTy, InstName1, CurBB);
+      return new CallInst(Func, Args);
     }
-  } else if (Result->isUpReference()) {
-    Result = ResolveUpReference(Result->getElementType(), &stack);
   }
-  return Result->getPointerType();
+  return 0;
 }
 
-// This function handles appending .u or .s to integer value names that
-// were previously unsigned or signed, respectively. This avoids name
-// collisions since the unsigned and signed type planes have collapsed
-// into a single signless type plane.
-std::string getUniqueName(const std::string *Name, const Type* Ty,
-                          bool isGlobal = false, bool isDef = false) {
+const Type* upgradeGEPIndices(const Type* PTy, 
+                       std::vector<ValueInfo> *Indices, 
+                       std::vector<Value*>    &VIndices, 
+                       std::vector<Constant*> *CIndices = 0) {
+  // Traverse the indices with a gep_type_iterator so we can build the list
+  // of constant and value indices for use later. Also perform upgrades
+  VIndices.clear();
+  if (CIndices) CIndices->clear();
+  for (unsigned i = 0, e = Indices->size(); i != e; ++i)
+    VIndices.push_back((*Indices)[i].V);
+  generic_gep_type_iterator<std::vector<Value*>::iterator>
+    GTI = gep_type_begin(PTy, VIndices.begin(),  VIndices.end()),
+    GTE = gep_type_end(PTy,  VIndices.begin(),  VIndices.end());
+  for (unsigned i = 0, e = Indices->size(); i != e && GTI != GTE; ++i, ++GTI) {
+    Value *Index = VIndices[i];
+    if (CIndices && !isa<Constant>(Index))
+      error("Indices to constant getelementptr must be constants");
+    // LLVM 1.2 and earlier used ubyte struct indices.  Convert any ubyte 
+    // struct indices to i32 struct indices with ZExt for compatibility.
+    else if (isa<StructType>(*GTI)) {        // Only change struct indices
+      if (ConstantInt *CUI = dyn_cast<ConstantInt>(Index))
+        if (CUI->getType()->getBitWidth() == 8)
+          Index = 
+            ConstantExpr::getCast(Instruction::ZExt, CUI, Type::Int32Ty);
+    } else {
+      // Make sure that unsigned SequentialType indices are zext'd to 
+      // 64-bits if they were smaller than that because LLVM 2.0 will sext 
+      // all indices for SequentialType elements. We must retain the same 
+      // semantic (zext) for unsigned types.
+      if (const IntegerType *Ity = dyn_cast<IntegerType>(Index->getType()))
+        if (Ity->getBitWidth() < 64 && (*Indices)[i].S == Unsigned)
+          if (CIndices)
+            Index = ConstantExpr::getCast(Instruction::ZExt, 
+              cast<Constant>(Index), Type::Int64Ty);
+          else
+            Index = CastInst::create(Instruction::ZExt, Index, Type::Int64Ty,
+              "gep_upgrade", CurBB);
+    }
+    // Add to the CIndices list, if requested.
+    if (CIndices)
+      CIndices->push_back(cast<Constant>(Index));
+  }
+
+  const Type *IdxTy =
+    GetElementPtrInst::getIndexedType(PTy, VIndices, true);
+    if (!IdxTy)
+      error("Index list invalid for constant getelementptr");
+  return IdxTy;
+}
 
-  // If its not a symbolic name, don't modify it, probably a constant val.
-  if ((*Name)[0] != '%' && (*Name)[0] != '"')
-    return *Name;
+Module* UpgradeAssembly(const std::string &infile, std::istream& in, 
+                              bool debug, bool addAttrs)
+{
+  Upgradelineno = 1; 
+  CurFilename = infile;
+  LexInput = ∈
+  yydebug = debug;
+  AddAttributes = addAttrs;
+  ObsoleteVarArgs = false;
+  NewVarArgs = false;
 
-  // If its a numeric reference, just leave it alone.
-  if (isdigit((*Name)[1]))
-    return *Name;
+  CurModule.CurrentModule = new Module(CurFilename);
 
-  // Resolve the type
-  Ty = Ty->resolve(); 
+  // Check to make sure the parser succeeded
+  if (yyparse()) {
+    if (ParserResult)
+      delete ParserResult;
+    std::cerr << "llvm-upgrade: parse failed.\n";
+    return 0;
+  }
 
-  // If its a global name, get its uniquified name, if any
-  Type::GlobalsTypeMap::iterator GI = Type::Globals.find(*Name);
-  if (GI != Type::Globals.end()) {
-    Type::TypePlaneMap::iterator TPI = GI->second.begin();
-    Type::TypePlaneMap::iterator TPE = GI->second.end();
-    for ( ; TPI != TPE ; ++TPI) {
-      if (TPI->first->sameNewTyAs(Ty)) 
-        return TPI->second;
-    }
+  // Check to make sure that parsing produced a result
+  if (!ParserResult) {
+    std::cerr << "llvm-upgrade: no parse result.\n";
+    return 0;
   }
 
-  if (isGlobal) {
-    // We didn't find a global name, but if its supposed to be global then all 
-    // we can do is return the name. This is probably a forward reference of a 
-    // global value that hasn't been defined yet. Since we have no definition
-    // we don't know its linkage class. Just assume its an external and the name
-    // shouldn't change.
-    return *Name;
+  // Reset ParserResult variable while saving its value for the result.
+  Module *Result = ParserResult;
+  ParserResult = 0;
+
+  //Not all functions use vaarg, so make a second check for ObsoleteVarArgs
+  {
+    Function* F;
+    if ((F = Result->getNamedFunction("llvm.va_start"))
+        && F->getFunctionType()->getNumParams() == 0)
+      ObsoleteVarArgs = true;
+    if((F = Result->getNamedFunction("llvm.va_copy"))
+       && F->getFunctionType()->getNumParams() == 1)
+      ObsoleteVarArgs = true;
   }
 
-  // Default the result to the current name
-  std::string Result = Ty->makeUniqueName(*Name);
+  if (ObsoleteVarArgs && NewVarArgs) {
+    error("This file is corrupt: it uses both new and old style varargs");
+    return 0;
+  }
 
-  return Result;
-}
+  if(ObsoleteVarArgs) {
+    if(Function* F = Result->getNamedFunction("llvm.va_start")) {
+      if (F->arg_size() != 0) {
+        error("Obsolete va_start takes 0 argument");
+        return 0;
+      }
+      
+      //foo = va_start()
+      // ->
+      //bar = alloca typeof(foo)
+      //va_start(bar)
+      //foo = load bar
+
+      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+      const Type* ArgTy = F->getFunctionType()->getReturnType();
+      const Type* ArgTyPtr = PointerType::get(ArgTy);
+      Function* NF = cast<Function>(Result->getOrInsertFunction(
+        "llvm.va_start", RetTy, ArgTyPtr, (Type *)0));
+
+      while (!F->use_empty()) {
+        CallInst* CI = cast<CallInst>(F->use_back());
+        AllocaInst* bar = new AllocaInst(ArgTy, 0, "vastart.fix.1", CI);
+        new CallInst(NF, bar, "", CI);
+        Value* foo = new LoadInst(bar, "vastart.fix.2", CI);
+        CI->replaceAllUsesWith(foo);
+        CI->getParent()->getInstList().erase(CI);
+      }
+      Result->getFunctionList().erase(F);
+    }
+    
+    if(Function* F = Result->getNamedFunction("llvm.va_end")) {
+      if(F->arg_size() != 1) {
+        error("Obsolete va_end takes 1 argument");
+        return 0;
+      }
 
-std::string getGlobalName(const std::string* Name, const std::string Linkage,
-                          const Type* Ty, bool isConstant) {
-  // Default to given name
-  std::string Result = *Name; 
-  // Look up the name in the Globals Map
-  Type::GlobalsTypeMap::iterator GI = Type::Globals.find(*Name);
-  // Did we see this global name before?
-  if (GI != Type::Globals.end()) {
-    if (Ty->isUnresolvedDeep()) {
-      // The Gval's type is unresolved. Consequently, we can't disambiguate it
-      // by type. We'll just change its name and emit a warning.
-      warning("Cannot disambiguate global value '" + *Name + 
-              "' because type '" + Ty->getNewTy() + "'is unresolved.\n");
-      Result = *Name + ".unique";
-      UniqueNameCounter++;
-      Result += llvm::utostr(UniqueNameCounter);
-      return Result;
-    } else {
-      Type::TypePlaneMap::iterator TPI = GI->second.find(Ty);
-      if (TPI != GI->second.end()) {
-        // We found an existing name of the same old type. This isn't allowed 
-        // in LLVM 2.0. Consequently, we must alter the name of the global so it
-        // can at least compile. References to the global will yield the first
-        // definition, which is okay. We also must warn about this.
-        Result = *Name + ".unique";
-        UniqueNameCounter++;
-        Result += llvm::utostr(UniqueNameCounter);
-        warning(std::string("Global variable '") + *Name + "' was renamed to '"+
-                Result + "'");
-      } else { 
-        // There isn't an existing definition for this name according to the
-        // old types. Now search the TypePlanMap for types with the same new
-        // name. 
-        Type::TypePlaneMap::iterator TPI = GI->second.begin();
-        Type::TypePlaneMap::iterator TPE = GI->second.end();
-        for ( ; TPI != TPE; ++TPI) {
-          if (TPI->first->sameNewTyAs(Ty)) {
-            // The new types are the same but the old types are different so 
-            // this is a global name collision resulting from type planes 
-            // collapsing. 
-            if (Linkage == "external" || Linkage == "dllimport" || 
-                Linkage == "extern_weak" || Linkage == "") {
-              // The linkage of this gval is external so we can't reliably 
-              // rename it because it could potentially create a linking 
-              // problem.  However, we can't leave the name conflict in the 
-              // output either or it won't assemble with LLVM 2.0.  So, all we 
-              // can do is rename this one to something unique and emit a 
-              // warning about the problem.
-              Result = *Name + ".unique";
-              UniqueNameCounter++;
-              Result += llvm::utostr(UniqueNameCounter);
-              warning("Renaming global value '" + *Name + "' to '" + Result + 
-                      "' may cause linkage errors.");
-              return Result;
-            } else {
-              // Its linkage is internal and its type is known so we can 
-              // disambiguate the name collision successfully based on the type.
-              Result = getUniqueName(Name, Ty);
-              TPI->second = Result;
-              return Result;
-            }
-          }
-        }
-        // We didn't find an entry in the type plane with the same new type and
-        // the old types differ so this is a new type plane for this global 
-        // variable. We just fall through to the logic below which inserts
-        // the global.
+      //vaend foo
+      // ->
+      //bar = alloca 1 of typeof(foo)
+      //vaend bar
+      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+      const Type* ArgTy = F->getFunctionType()->getParamType(0);
+      const Type* ArgTyPtr = PointerType::get(ArgTy);
+      Function* NF = cast<Function>(Result->getOrInsertFunction(
+        "llvm.va_end", RetTy, ArgTyPtr, (Type *)0));
+
+      while (!F->use_empty()) {
+        CallInst* CI = cast<CallInst>(F->use_back());
+        AllocaInst* bar = new AllocaInst(ArgTy, 0, "vaend.fix.1", CI);
+        new StoreInst(CI->getOperand(1), bar, CI);
+        new CallInst(NF, bar, "", CI);
+        CI->getParent()->getInstList().erase(CI);
       }
+      Result->getFunctionList().erase(F);
     }
-  }
 
-  // Its a new global name, if it is external we can't change it
-  if (isConstant || Linkage == "external" || Linkage == "dllimport" || 
-      Linkage == "extern_weak" || Linkage == "") {
-    Type::Globals[Result][Ty] = Result;
-    return Result;
+    if(Function* F = Result->getNamedFunction("llvm.va_copy")) {
+      if(F->arg_size() != 1) {
+        error("Obsolete va_copy takes 1 argument");
+        return 0;
+      }
+      //foo = vacopy(bar)
+      // ->
+      //a = alloca 1 of typeof(foo)
+      //b = alloca 1 of typeof(foo)
+      //store bar -> b
+      //vacopy(a, b)
+      //foo = load a
+      
+      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+      const Type* ArgTy = F->getFunctionType()->getReturnType();
+      const Type* ArgTyPtr = PointerType::get(ArgTy);
+      Function* NF = cast<Function>(Result->getOrInsertFunction(
+        "llvm.va_copy", RetTy, ArgTyPtr, ArgTyPtr, (Type *)0));
+
+      while (!F->use_empty()) {
+        CallInst* CI = cast<CallInst>(F->use_back());
+        AllocaInst* a = new AllocaInst(ArgTy, 0, "vacopy.fix.1", CI);
+        AllocaInst* b = new AllocaInst(ArgTy, 0, "vacopy.fix.2", CI);
+        new StoreInst(CI->getOperand(1), b, CI);
+        new CallInst(NF, a, b, "", CI);
+        Value* foo = new LoadInst(a, "vacopy.fix.3", CI);
+        CI->replaceAllUsesWith(foo);
+        CI->getParent()->getInstList().erase(CI);
+      }
+      Result->getFunctionList().erase(F);
+    }
   }
 
-  // Its a new global name, and it is internal, change the name to make it
-  // unique for its type.
-  // Result = getUniqueName(Name, Ty);
-  Type::Globals[*Name][Ty] = Result;
   return Result;
 }
 
-} // End anonymous namespace
+} // end llvm namespace
 
-// This function is used by the Lexer to create a Type. It can't be
-// in the anonymous namespace.
-const Type* getType(const std::string& newTy, TypeIDs oldTy) {
-  return Type::get(newTy, oldTy);
-}
+using namespace llvm;
 
 %}
 
-// %file-prefix="UpgradeParser"
-
 %union {
-  std::string*    String;
-  const Type*     Ty;
-  Value*          Val;
-  Constant*       Const;
-  ValueList*      ValList;
-  TypeList*       TypeVec;
-}
-
-%token <Ty>     VOID BOOL SBYTE UBYTE SHORT USHORT INT UINT LONG ULONG
-%token <Ty>     FLOAT DOUBLE LABEL 
-%token <String> OPAQUE ESINT64VAL EUINT64VAL SINTVAL UINTVAL FPVAL
-%token <String> NULL_TOK UNDEF ZEROINITIALIZER TRUETOK FALSETOK
-%token <String> TYPE VAR_ID LABELSTR STRINGCONSTANT
-%token <String> IMPLEMENTATION BEGINTOK ENDTOK
-%token <String> DECLARE GLOBAL CONSTANT SECTION VOLATILE
-%token <String> TO DOTDOTDOT CONST INTERNAL LINKONCE WEAK 
-%token <String> DLLIMPORT DLLEXPORT EXTERN_WEAK APPENDING
-%token <String> EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG
-%token <String> ALIGN UNINITIALIZED
-%token <String> DEPLIBS CALL TAIL ASM_TOK MODULE SIDEEFFECT
-%token <String> CC_TOK CCC_TOK CSRETCC_TOK FASTCC_TOK COLDCC_TOK
-%token <String> X86_STDCALLCC_TOK X86_FASTCALLCC_TOK
-%token <String> DATALAYOUT
-%token <String> RET BR SWITCH INVOKE EXCEPT UNWIND UNREACHABLE
-%token <String> ADD SUB MUL DIV UDIV SDIV FDIV REM UREM SREM FREM AND OR XOR
-%token <String> SETLE SETGE SETLT SETGT SETEQ SETNE  // Binary Comparators
-%token <String> ICMP FCMP EQ NE SLT SGT SLE SGE OEQ ONE OLT OGT OLE OGE 
-%token <String> ORD UNO UEQ UNE ULT UGT ULE UGE
-%token <String> MALLOC ALLOCA FREE LOAD STORE GETELEMENTPTR
-%token <String> PHI_TOK SELECT SHL SHR ASHR LSHR VAARG
-%token <String> EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR
-%token <String> CAST TRUNC ZEXT SEXT FPTRUNC FPEXT FPTOUI FPTOSI UITOFP SITOFP 
-%token <String> PTRTOINT INTTOPTR BITCAST
-
-%type <String> OptAssign OptLinkage OptCallingConv OptAlign OptCAlign 
-%type <String> SectionString OptSection GlobalVarAttributes GlobalVarAttribute
-%type <String> ConstExpr DefinitionList
-%type <String> ConstPool TargetDefinition LibrariesDefinition LibList OptName
-%type <String> ArgVal ArgListH ArgList FunctionHeaderH BEGIN FunctionHeader END
-%type <String> Function FunctionProto BasicBlock 
-%type <String> InstructionList BBTerminatorInst JumpTable Inst
-%type <String> OptTailCall OptVolatile Unwind
-%type <String> SymbolicValueRef OptSideEffect GlobalType
-%type <String> FnDeclareLinkage BasicBlockList BigOrLittle AsmBlock
-%type <String> Name ConstValueRef ConstVector External
-%type <String> ShiftOps SetCondOps LogicalOps ArithmeticOps CastOps
-%type <String> IPredicates FPredicates
-
-%type <ValList> ValueRefList ValueRefListE IndexList
-%type <TypeVec> TypeListI ArgTypeListI
-
-%type <Ty> IntType SIntType UIntType FPType TypesV Types 
-%type <Ty> PrimType UpRTypesV UpRTypes
-
-%type <String> IntVal EInt64Val 
-%type <Const>  ConstVal
+  llvm::Module                           *ModuleVal;
+  llvm::Function                         *FunctionVal;
+  std::pair<llvm::PATypeInfo, char*>     *ArgVal;
+  llvm::BasicBlock                       *BasicBlockVal;
+  llvm::TerminatorInst                   *TermInstVal;
+  llvm::InstrInfo                        InstVal;
+  llvm::ConstInfo                        ConstVal;
+  llvm::ValueInfo                        ValueVal;
+  llvm::PATypeInfo                       TypeVal;
+  llvm::TypeInfo                         PrimType;
+  llvm::PHIListInfo                      PHIList;
+  std::list<llvm::PATypeInfo>            *TypeList;
+  std::vector<llvm::ValueInfo>           *ValueList;
+  std::vector<llvm::ConstInfo>           *ConstVector;
+
+
+  std::vector<std::pair<llvm::PATypeInfo,char*> > *ArgList;
+  // Represent the RHS of PHI node
+  std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
+
+  llvm::GlobalValue::LinkageTypes         Linkage;
+  int64_t                           SInt64Val;
+  uint64_t                          UInt64Val;
+  int                               SIntVal;
+  unsigned                          UIntVal;
+  double                            FPVal;
+  bool                              BoolVal;
+
+  char                             *StrVal;   // This memory is strdup'd!
+  llvm::ValID                       ValIDVal; // strdup'd memory maybe!
+
+  llvm::BinaryOps                   BinaryOpVal;
+  llvm::TermOps                     TermOpVal;
+  llvm::MemoryOps                   MemOpVal;
+  llvm::OtherOps                    OtherOpVal;
+  llvm::CastOps                     CastOpVal;
+  llvm::ICmpInst::Predicate         IPred;
+  llvm::FCmpInst::Predicate         FPred;
+  llvm::Module::Endianness          Endianness;
+}
+
+%type <ModuleVal>     Module FunctionList
+%type <FunctionVal>   Function FunctionProto FunctionHeader BasicBlockList
+%type <BasicBlockVal> BasicBlock InstructionList
+%type <TermInstVal>   BBTerminatorInst
+%type <InstVal>       Inst InstVal MemoryInst
+%type <ConstVal>      ConstVal ConstExpr
+%type <ConstVector>   ConstVector
+%type <ArgList>       ArgList ArgListH
+%type <ArgVal>        ArgVal
+%type <PHIList>       PHIList
+%type <ValueList>     ValueRefList ValueRefListE  // For call param lists
+%type <ValueList>     IndexList                   // For GEP derived indices
+%type <TypeList>      TypeListI ArgTypeListI
+%type <JumpTable>     JumpTable
+%type <BoolVal>       GlobalType                  // GLOBAL or CONSTANT?
+%type <BoolVal>       OptVolatile                 // 'volatile' or not
+%type <BoolVal>       OptTailCall                 // TAIL CALL or plain CALL.
+%type <BoolVal>       OptSideEffect               // 'sideeffect' or not.
+%type <Linkage>       OptLinkage
+%type <Endianness>    BigOrLittle
+
+// ValueRef - Unresolved reference to a definition or BB
+%type <ValIDVal>      ValueRef ConstValueRef SymbolicValueRef
+%type <ValueVal>      ResolvedVal            // <type> <valref> pair
+// Tokens and types for handling constant integer values
+//
+// ESINT64VAL - A negative number within long long range
+%token <SInt64Val> ESINT64VAL
 
-%type <Val> ValueRef ResolvedVal InstVal PHIList MemoryInst
+// EUINT64VAL - A positive number within uns. long long range
+%token <UInt64Val> EUINT64VAL
+%type  <SInt64Val> EINT64VAL
+
+%token  <SIntVal>   SINTVAL   // Signed 32 bit ints...
+%token  <UIntVal>   UINTVAL   // Unsigned 32 bit ints...
+%type   <SIntVal>   INTVAL
+%token  <FPVal>     FPVAL     // Float or Double constant
+
+// Built in types...
+%type  <TypeVal> Types TypesV UpRTypes UpRTypesV
+%type  <PrimType> SIntType UIntType IntType FPType PrimType // Classifications
+%token <PrimType> VOID BOOL SBYTE UBYTE SHORT USHORT INT UINT LONG ULONG
+%token <PrimType> FLOAT DOUBLE TYPE LABEL
+
+%token <StrVal> VAR_ID LABELSTR STRINGCONSTANT
+%type  <StrVal> Name OptName OptAssign
+%type  <UIntVal> OptAlign OptCAlign
+%type <StrVal> OptSection SectionString
+
+%token IMPLEMENTATION ZEROINITIALIZER TRUETOK FALSETOK BEGINTOK ENDTOK
+%token DECLARE GLOBAL CONSTANT SECTION VOLATILE
+%token TO DOTDOTDOT NULL_TOK UNDEF CONST INTERNAL LINKONCE WEAK APPENDING
+%token DLLIMPORT DLLEXPORT EXTERN_WEAK
+%token OPAQUE NOT EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG ALIGN
+%token DEPLIBS CALL TAIL ASM_TOK MODULE SIDEEFFECT
+%token CC_TOK CCC_TOK CSRETCC_TOK FASTCC_TOK COLDCC_TOK
+%token X86_STDCALLCC_TOK X86_FASTCALLCC_TOK
+%token DATALAYOUT
+%type <UIntVal> OptCallingConv
+
+// Basic Block Terminating Operators
+%token <TermOpVal> RET BR SWITCH INVOKE UNREACHABLE
+%token UNWIND EXCEPT
+
+// Binary Operators
+%type  <BinaryOpVal> ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories
+%token <BinaryOpVal> ADD SUB MUL DIV UDIV SDIV FDIV REM UREM SREM FREM 
+%token <BinaryOpVal> AND OR XOR
+%token <BinaryOpVal> SETLE SETGE SETLT SETGT SETEQ SETNE  // Binary Comparators
+%token <OtherOpVal> ICMP FCMP
+
+// Memory Instructions
+%token <MemOpVal> MALLOC ALLOCA FREE LOAD STORE GETELEMENTPTR
+
+// Other Operators
+%type  <OtherOpVal> ShiftOps
+%token <OtherOpVal> PHI_TOK SELECT SHL SHR ASHR LSHR VAARG
+%token <OtherOpVal> EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR
+%token VAARG_old VANEXT_old //OBSOLETE
+
+%type  <IPred> IPredicates
+%type  <FPred> FPredicates
+%token  EQ NE SLT SGT SLE SGE ULT UGT ULE UGE 
+%token  OEQ ONE OLT OGT OLE OGE ORD UNO UEQ UNE
+
+%token <CastOpVal> CAST TRUNC ZEXT SEXT FPTRUNC FPEXT FPTOUI FPTOSI 
+%token <CastOpVal> UITOFP SITOFP PTRTOINT INTTOPTR BITCAST 
+%type  <CastOpVal> CastOps
 
 %start Module
 
 %%
 
 // Handle constant integer size restriction and conversion...
-IntVal : SINTVAL | UINTVAL ;
-EInt64Val : ESINT64VAL | EUINT64VAL;
+//
+INTVAL 
+  : SINTVAL;
+  | UINTVAL {
+    if ($1 > (uint32_t)INT32_MAX)     // Outside of my range!
+      error("Value too large for type");
+    $$ = (int32_t)$1;
+  }
+  ;
+
+EINT64VAL 
+  : ESINT64VAL;      // These have same type and can't cause problems...
+  | EUINT64VAL {
+    if ($1 > (uint64_t)INT64_MAX)     // Outside of my range!
+      error("Value too large for type");
+    $$ = (int64_t)$1;
+  };
 
 // Operations that are notably excluded from this list include:
 // RET, BR, & SWITCH because they end basic blocks and are treated specially.
-ArithmeticOps: ADD | SUB | MUL | DIV | UDIV | SDIV | FDIV 
-             | REM | UREM | SREM | FREM;
-LogicalOps   : AND | OR | XOR;
-SetCondOps   : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE;
-IPredicates  : EQ | NE | SLT | SGT | SLE | SGE | ULT | UGT | ULE | UGE;
-FPredicates  : OEQ | ONE | OLT | OGT | OLE | OGE | ORD | UNO | UEQ | UNE
-             | ULT | UGT | ULE | UGE | TRUETOK | FALSETOK;
-ShiftOps     : SHL | SHR | ASHR | LSHR;
-CastOps      : TRUNC | ZEXT | SEXT | FPTRUNC | FPEXT | FPTOUI | FPTOSI | 
-               UITOFP | SITOFP | PTRTOINT | INTTOPTR | BITCAST | CAST
-             ;
+//
+ArithmeticOps
+  : ADD | SUB | MUL | DIV | UDIV | SDIV | FDIV | REM | UREM | SREM | FREM
+  ;
+
+LogicalOps   
+  : AND | OR | XOR
+  ;
+
+SetCondOps   
+  : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE
+  ;
+
+IPredicates  
+  : EQ   { $$ = ICmpInst::ICMP_EQ; }  | NE   { $$ = ICmpInst::ICMP_NE; }
+  | SLT  { $$ = ICmpInst::ICMP_SLT; } | SGT  { $$ = ICmpInst::ICMP_SGT; }
+  | SLE  { $$ = ICmpInst::ICMP_SLE; } | SGE  { $$ = ICmpInst::ICMP_SGE; }
+  | ULT  { $$ = ICmpInst::ICMP_ULT; } | UGT  { $$ = ICmpInst::ICMP_UGT; }
+  | ULE  { $$ = ICmpInst::ICMP_ULE; } | UGE  { $$ = ICmpInst::ICMP_UGE; } 
+  ;
+
+FPredicates  
+  : OEQ  { $$ = FCmpInst::FCMP_OEQ; } | ONE  { $$ = FCmpInst::FCMP_ONE; }
+  | OLT  { $$ = FCmpInst::FCMP_OLT; } | OGT  { $$ = FCmpInst::FCMP_OGT; }
+  | OLE  { $$ = FCmpInst::FCMP_OLE; } | OGE  { $$ = FCmpInst::FCMP_OGE; }
+  | ORD  { $$ = FCmpInst::FCMP_ORD; } | UNO  { $$ = FCmpInst::FCMP_UNO; }
+  | UEQ  { $$ = FCmpInst::FCMP_UEQ; } | UNE  { $$ = FCmpInst::FCMP_UNE; }
+  | ULT  { $$ = FCmpInst::FCMP_ULT; } | UGT  { $$ = FCmpInst::FCMP_UGT; }
+  | ULE  { $$ = FCmpInst::FCMP_ULE; } | UGE  { $$ = FCmpInst::FCMP_UGE; }
+  | TRUETOK { $$ = FCmpInst::FCMP_TRUE; }
+  | FALSETOK { $$ = FCmpInst::FCMP_FALSE; }
+  ;
+ShiftOps  
+  : SHL | SHR | ASHR | LSHR
+  ;
+
+CastOps      
+  : TRUNC | ZEXT | SEXT | FPTRUNC | FPEXT | FPTOUI | FPTOSI 
+  | UITOFP | SITOFP | PTRTOINT | INTTOPTR | BITCAST | CAST
+  ;
 
 // These are some types that allow classification if we only want a particular 
 // thing... for example, only a signed, unsigned, or integral type.
-SIntType :  LONG |  INT |  SHORT | SBYTE;
-UIntType : ULONG | UINT | USHORT | UBYTE;
-IntType  : SIntType | UIntType;
-FPType   : FLOAT | DOUBLE;
+SIntType 
+  :  LONG |  INT |  SHORT | SBYTE
+  ;
+
+UIntType 
+  : ULONG | UINT | USHORT | UBYTE
+  ;
+
+IntType  
+  : SIntType | UIntType
+  ;
+
+FPType   
+  : FLOAT | DOUBLE
+  ;
 
 // OptAssign - Value producing statements have an optional assignment component
-OptAssign : Name '=' {
+OptAssign 
+  : Name '=' {
     $$ = $1;
   }
   | /*empty*/ {
-    $$ = new std::string(""); 
+    $$ = 0;
   };
 
 OptLinkage 
-  : INTERNAL | LINKONCE | WEAK | APPENDING | DLLIMPORT | DLLEXPORT 
-  | EXTERN_WEAK 
-  | /*empty*/   { $$ = new std::string(""); } ;
+  : INTERNAL    { $$ = GlobalValue::InternalLinkage; } 
+  | LINKONCE    { $$ = GlobalValue::LinkOnceLinkage; } 
+  | WEAK        { $$ = GlobalValue::WeakLinkage; } 
+  | APPENDING   { $$ = GlobalValue::AppendingLinkage; } 
+  | DLLIMPORT   { $$ = GlobalValue::DLLImportLinkage; } 
+  | DLLEXPORT   { $$ = GlobalValue::DLLExportLinkage; } 
+  | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; } 
+  | /*empty*/   { $$ = GlobalValue::ExternalLinkage; }
+  ;
 
 OptCallingConv 
-  : CCC_TOK | CSRETCC_TOK | FASTCC_TOK | COLDCC_TOK | X86_STDCALLCC_TOK 
-  | X86_FASTCALLCC_TOK 
-  | CC_TOK EUINT64VAL { 
-    *$1 += *$2; 
-    delete $2;
-    $$ = $1; 
-    }
-  | /*empty*/ { $$ = new std::string(""); } ;
+  : /*empty*/          { $$ = CallingConv::C; } 
+  | CCC_TOK            { $$ = CallingConv::C; } 
+  | CSRETCC_TOK        { $$ = CallingConv::CSRet; } 
+  | FASTCC_TOK         { $$ = CallingConv::Fast; } 
+  | COLDCC_TOK         { $$ = CallingConv::Cold; } 
+  | X86_STDCALLCC_TOK  { $$ = CallingConv::X86_StdCall; } 
+  | X86_FASTCALLCC_TOK { $$ = CallingConv::X86_FastCall; } 
+  | CC_TOK EUINT64VAL  {
+    if ((unsigned)$2 != $2)
+      error("Calling conv too large");
+    $$ = $2;
+  }
+  ;
 
 // OptAlign/OptCAlign - An optional alignment, and an optional alignment with
 // a comma before it.
 OptAlign 
-  : /*empty*/        { $$ = new std::string(); }
-  | ALIGN EUINT64VAL { *$1 += " " + *$2; delete $2; $$ = $1; };
+  : /*empty*/        { $$ = 0; } 
+  | ALIGN EUINT64VAL {
+    $$ = $2;
+    if ($$ != 0 && !isPowerOf2_32($$))
+      error("Alignment must be a power of two");
+  }
+  ;
 
 OptCAlign 
-  : /*empty*/            { $$ = new std::string(); } 
-  | ',' ALIGN EUINT64VAL { 
-    $2->insert(0, ", "); 
-    *$2 += " " + *$3;
-    delete $3;
-    $$ = $2;
-  };
+  : /*empty*/ { $$ = 0; } 
+  | ',' ALIGN EUINT64VAL {
+    $$ = $3;
+    if ($$ != 0 && !isPowerOf2_32($$))
+      error("Alignment must be a power of two");
+  }
+  ;
 
 SectionString 
-  : SECTION STRINGCONSTANT { 
-    *$1 += " " + *$2;
-    delete $2;
-    $$ = $1;
-  };
+  : SECTION STRINGCONSTANT {
+    for (unsigned i = 0, e = strlen($2); i != e; ++i)
+      if ($2[i] == '"' || $2[i] == '\\')
+        error("Invalid character in section name");
+    $$ = $2;
+  }
+  ;
 
-OptSection : /*empty*/     { $$ = new std::string(); } 
-           | SectionString;
+OptSection 
+  : /*empty*/ { $$ = 0; } 
+  | SectionString { $$ = $1; }
+  ;
 
+// GlobalVarAttributes - Used to pass the attributes string on a global.  CurGV
+// is set to be the global we are processing.
+//
 GlobalVarAttributes 
-    : /* empty */ { $$ = new std::string(); } 
-    | ',' GlobalVarAttribute GlobalVarAttributes  {
-      $2->insert(0, ", ");
-      if (!$3->empty())
-        *$2 += " " + *$3;
-      delete $3;
-      $$ = $2;
-    };
+  : /* empty */ {} 
+  | ',' GlobalVarAttribute GlobalVarAttributes {}
+  ;
 
-GlobalVarAttribute 
-    : SectionString 
-    | ALIGN EUINT64VAL {
-      *$1 += " " + *$2;
-      delete $2;
-      $$ = $1;
-    };
+GlobalVarAttribute
+  : SectionString {
+    CurGV->setSection($1);
+    free($1);
+  } 
+  | ALIGN EUINT64VAL {
+    if ($2 != 0 && !isPowerOf2_32($2))
+      error("Alignment must be a power of two");
+    CurGV->setAlignment($2);
+    
+  }
+  ;
 
 //===----------------------------------------------------------------------===//
 // Types includes all predefined types... except void, because it can only be
@@ -1130,112 +1778,164 @@
 //
 
 // TypesV includes all of 'Types', but it also includes the void type.
-TypesV    : Types    | VOID ;
-UpRTypesV : UpRTypes | VOID ; 
-Types     : UpRTypes ;
+TypesV    
+  : Types
+  | VOID { 
+    $$.T = new PATypeHolder($1.T); 
+    $$.S = Signless;
+  }
+  ;
+
+UpRTypesV 
+  : UpRTypes 
+  | VOID { 
+    $$.T = new PATypeHolder($1.T); 
+    $$.S = Signless;
+  }
+  ;
+
+Types
+  : UpRTypes {
+    if (!UpRefs.empty())
+      error("Invalid upreference in type: " + (*$1.T)->getDescription());
+    $$ = $1;
+  }
+  ;
+
+PrimType
+  : BOOL | SBYTE | UBYTE | SHORT  | USHORT | INT   | UINT 
+  | LONG | ULONG | FLOAT | DOUBLE | LABEL
+  ;
 
 // Derived types are added later...
-//
-PrimType : BOOL | SBYTE | UBYTE | SHORT  | USHORT | INT   | UINT ;
-PrimType : LONG | ULONG | FLOAT | DOUBLE | LABEL;
 UpRTypes 
-  : OPAQUE { 
-    $$ = Type::get(*$1, OpaqueTy);
-  } 
-  | SymbolicValueRef { 
-    $$ = Type::get(*$1, UnresolvedTy);
-  }
-  | PrimType { 
-    $$ = $1; 
+  : PrimType { 
+    $$.T = new PATypeHolder($1.T);
+    $$.S = $1.S;
+  }
+  | OPAQUE {
+    $$.T = new PATypeHolder(OpaqueType::get());
+    $$.S = Signless;
+  }
+  | SymbolicValueRef {            // Named types are also simple types...
+    const Type* tmp = getTypeVal($1);
+    $$.T = new PATypeHolder(tmp);
+    $$.S = Signless; // FIXME: what if its signed?
   }
   | '\\' EUINT64VAL {                   // Type UpReference
-    $2->insert(0, "\\");
-    $$ = Type::get(*$2, UpRefTy);
+    if ($2 > (uint64_t)~0U) 
+      error("Value out of range");
+    OpaqueType *OT = OpaqueType::get();        // Use temporary placeholder
+    UpRefs.push_back(UpRefRecord((unsigned)$2, OT));  // Add to vector...
+    $$.T = new PATypeHolder(OT);
+    $$.S = Signless;
+    UR_OUT("New Upreference!\n");
   }
   | UpRTypesV '(' ArgTypeListI ')' {           // Function derived type?
-    std::string newTy( $1->getNewTy() + "(");
-    for (unsigned i = 0; i < $3->size(); ++i) {
-      if (i != 0)
-        newTy +=  ", ";
-      if ((*$3)[i]->isVoid())
-        newTy += "...";
-      else
-        newTy += (*$3)[i]->getNewTy();
-    }
-    newTy += ")";
-    $$ = Type::get(newTy, $1, $3);
+    std::vector<const Type*> Params;
+    for (std::list<llvm::PATypeInfo>::iterator I = $3->begin(),
+           E = $3->end(); I != E; ++I) {
+      Params.push_back(I->T->get());
+      delete I->T;
+    }
+    bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
+    if (isVarArg) Params.pop_back();
+
+    $$.T = new PATypeHolder(HandleUpRefs(
+                           FunctionType::get($1.T->get(),Params,isVarArg)));
+    $$.S = $1.S;
+    delete $1.T;    // Delete the return type handle
+    delete $3;      // Delete the argument list
   }
   | '[' EUINT64VAL 'x' UpRTypes ']' {          // Sized array type?
-    uint64_t elems = atoi($2->c_str());
-    $2->insert(0,"[ ");
-    *$2 += " x " + $4->getNewTy() + " ]";
-    $$ = Type::get(*$2, ArrayTy, $4, elems);
+    $$.T = new PATypeHolder(HandleUpRefs(ArrayType::get($4.T->get(), 
+                                                        (unsigned)$2)));
+    $$.S = $4.S;
+    delete $4.T;
   }
   | '<' EUINT64VAL 'x' UpRTypes '>' {          // Packed array type?
-    uint64_t elems = atoi($2->c_str());
-    $2->insert(0,"< ");
-    *$2 += " x " + $4->getNewTy() + " >";
-    $$ = Type::get(*$2, PackedTy, $4, elems);
+     const llvm::Type* ElemTy = $4.T->get();
+     if ((unsigned)$2 != $2)
+        error("Unsigned result not equal to signed result");
+     if (!(ElemTy->isInteger() || ElemTy->isFloatingPoint()))
+        error("Elements of a PackedType must be integer or floating point");
+     if (!isPowerOf2_32($2))
+       error("PackedType length should be a power of 2");
+     $$.T = new PATypeHolder(HandleUpRefs(PackedType::get(ElemTy, 
+                                          (unsigned)$2)));
+     $$.S = $4.S;
+     delete $4.T;
   }
   | '{' TypeListI '}' {                        // Structure type?
-    std::string newTy("{");
-    for (unsigned i = 0; i < $2->size(); ++i) {
-      if (i != 0)
-        newTy +=  ", ";
-      newTy += (*$2)[i]->getNewTy();
-    }
-    newTy += "}";
-    $$ = Type::get(newTy, StructTy, $2);
+    std::vector<const Type*> Elements;
+    for (std::list<llvm::PATypeInfo>::iterator I = $2->begin(),
+           E = $2->end(); I != E; ++I)
+      Elements.push_back(I->T->get());
+    $$.T = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
+    $$.S = Signless;
+    delete $2;
   }
   | '{' '}' {                                  // Empty structure type?
-    $$ = Type::get("{}", StructTy, new TypeList());
+    $$.T = new PATypeHolder(StructType::get(std::vector<const Type*>()));
+    $$.S = Signless;
   }
   | '<' '{' TypeListI '}' '>' {                // Packed Structure type?
-    std::string newTy("<{");
-    for (unsigned i = 0; i < $3->size(); ++i) {
-      if (i != 0)
-        newTy +=  ", ";
-      newTy += (*$3)[i]->getNewTy();
+    std::vector<const Type*> Elements;
+    for (std::list<llvm::PATypeInfo>::iterator I = $3->begin(),
+           E = $3->end(); I != E; ++I) {
+      Elements.push_back(I->T->get());
+      delete I->T;
     }
-    newTy += "}>";
-    $$ = Type::get(newTy, PackedStructTy, $3);
+    $$.T = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
+    $$.S = Signless;
+    delete $3;
   }
   | '<' '{' '}' '>' {                          // Empty packed structure type?
-    $$ = Type::get("<{}>", PackedStructTy, new TypeList());
+    $$.T = new PATypeHolder(StructType::get(std::vector<const Type*>(),true));
+    $$.S = Signless;
   }
   | UpRTypes '*' {                             // Pointer type?
-    $$ = $1->getPointerType();
-  };
+    if ($1.T->get() == Type::LabelTy)
+      error("Cannot form a pointer to a basic block");
+    $$.T = new PATypeHolder(HandleUpRefs(PointerType::get($1.T->get())));
+    $$.S = $1.S;
+    delete $1.T;
+  }
+  ;
 
 // TypeList - Used for struct declarations and as a basis for function type 
 // declaration type lists
 //
 TypeListI 
   : UpRTypes {
-    $$ = new TypeList();
-    $$->push_back($1);
+    $$ = new std::list<PATypeInfo>();
+    $$->push_back($1); 
   }
   | TypeListI ',' UpRTypes {
-    $$ = $1;
-    $$->push_back($3);
-  };
+    ($$=$1)->push_back($3);
+  }
+  ;
 
 // ArgTypeList - List of types for a function type declaration...
 ArgTypeListI 
-  : TypeListI 
+  : TypeListI
   | TypeListI ',' DOTDOTDOT {
-    $$ = $1;
-    $$->push_back(Type::get("void",VoidTy));
-    delete $3;
+    PATypeInfo VoidTI;
+    VoidTI.T = new PATypeHolder(Type::VoidTy);
+    VoidTI.S = Signless;
+    ($$=$1)->push_back(VoidTI);
   }
   | DOTDOTDOT {
-    $$ = new TypeList();
-    $$->push_back(Type::get("void",VoidTy));
-    delete $1;
+    $$ = new std::list<PATypeInfo>();
+    PATypeInfo VoidTI;
+    VoidTI.T = new PATypeHolder(Type::VoidTy);
+    VoidTI.S = Signless;
+    $$->push_back(VoidTI);
   }
   | /*empty*/ {
-    $$ = new TypeList();
-  };
+    $$ = new std::list<PATypeInfo>();
+  }
+  ;
 
 // ConstVal - The various declarations that go into the constant pool.  This
 // production is used ONLY to represent constants that show up AFTER a 'const',
@@ -1243,215 +1943,429 @@
 // into other expressions (such as integers and constexprs) are handled by the
 // ResolvedVal, ValueRef and ConstValueRef productions.
 //
-ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " [ " + *$3 + " ]";
+ConstVal
+  : Types '[' ConstVector ']' { // Nonempty unsized arr
+    const ArrayType *ATy = dyn_cast<ArrayType>($1.T->get());
+    if (ATy == 0)
+      error("Cannot make array constant with type: '" + 
+            $1.T->get()->getDescription() + "'");
+    const Type *ETy = ATy->getElementType();
+    int NumElements = ATy->getNumElements();
+
+    // Verify that we have the correct size...
+    if (NumElements != -1 && NumElements != (int)$3->size())
+      error("Type mismatch: constant sized array initialized with " +
+            utostr($3->size()) +  " arguments, but has size of " + 
+            itostr(NumElements) + "");
+
+    // Verify all elements are correct type!
+    std::vector<Constant*> Elems;
+    for (unsigned i = 0; i < $3->size(); i++) {
+      Constant *C = (*$3)[i].C;
+      const Type* ValTy = C->getType();
+      if (ETy != ValTy)
+        error("Element #" + utostr(i) + " is not of type '" + 
+              ETy->getDescription() +"' as required!\nIt is of type '"+
+              ValTy->getDescription() + "'");
+      Elems.push_back(C);
+    }
+    $$.C = ConstantArray::get(ATy, Elems);
+    $$.S = $1.S;
+    delete $1.T; 
     delete $3;
   }
   | Types '[' ']' {
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += "[ ]";
+    const ArrayType *ATy = dyn_cast<ArrayType>($1.T->get());
+    if (ATy == 0)
+      error("Cannot make array constant with type: '" + 
+            $1.T->get()->getDescription() + "'");
+    int NumElements = ATy->getNumElements();
+    if (NumElements != -1 && NumElements != 0) 
+      error("Type mismatch: constant sized array initialized with 0"
+            " arguments, but has size of " + itostr(NumElements) +"");
+    $$.C = ConstantArray::get(ATy, std::vector<Constant*>());
+    $$.S = $1.S;
+    delete $1.T;
   }
   | Types 'c' STRINGCONSTANT {
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " c" + *$3;
-    delete $3;
+    const ArrayType *ATy = dyn_cast<ArrayType>($1.T->get());
+    if (ATy == 0)
+      error("Cannot make array constant with type: '" + 
+            $1.T->get()->getDescription() + "'");
+    int NumElements = ATy->getNumElements();
+    const Type *ETy = dyn_cast<IntegerType>(ATy->getElementType());
+    if (!ETy || cast<IntegerType>(ETy)->getBitWidth() != 8)
+      error("String arrays require type i8, not '" + ETy->getDescription() + 
+            "'");
+    char *EndStr = UnEscapeLexed($3, true);
+    if (NumElements != -1 && NumElements != (EndStr-$3))
+      error("Can't build string constant of size " + 
+            itostr((int)(EndStr-$3)) + " when array has size " + 
+            itostr(NumElements) + "");
+    std::vector<Constant*> Vals;
+    for (char *C = (char *)$3; C != (char *)EndStr; ++C)
+      Vals.push_back(ConstantInt::get(ETy, *C));
+    free($3);
+    $$.C = ConstantArray::get(ATy, Vals);
+    $$.S = $1.S;
+    delete $1.T;
   }
   | Types '<' ConstVector '>' { // Nonempty unsized arr
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " < " + *$3 + " >";
+    const PackedType *PTy = dyn_cast<PackedType>($1.T->get());
+    if (PTy == 0)
+      error("Cannot make packed constant with type: '" + 
+            $1.T->get()->getDescription() + "'");
+    const Type *ETy = PTy->getElementType();
+    int NumElements = PTy->getNumElements();
+    // Verify that we have the correct size...
+    if (NumElements != -1 && NumElements != (int)$3->size())
+      error("Type mismatch: constant sized packed initialized with " +
+            utostr($3->size()) +  " arguments, but has size of " + 
+            itostr(NumElements) + "");
+    // Verify all elements are correct type!
+    std::vector<Constant*> Elems;
+    for (unsigned i = 0; i < $3->size(); i++) {
+      Constant *C = (*$3)[i].C;
+      const Type* ValTy = C->getType();
+      if (ETy != ValTy)
+        error("Element #" + utostr(i) + " is not of type '" + 
+              ETy->getDescription() +"' as required!\nIt is of type '"+
+              ValTy->getDescription() + "'");
+      Elems.push_back(C);
+    }
+    $$.C = ConstantPacked::get(PTy, Elems);
+    $$.S = $1.S;
+    delete $1.T;
     delete $3;
   }
   | Types '{' ConstVector '}' {
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " { " + *$3 + " }";
+    const StructType *STy = dyn_cast<StructType>($1.T->get());
+    if (STy == 0)
+      error("Cannot make struct constant with type: '" + 
+            $1.T->get()->getDescription() + "'");
+    if ($3->size() != STy->getNumContainedTypes())
+      error("Illegal number of initializers for structure type");
+
+    // Check to ensure that constants are compatible with the type initializer!
+    std::vector<Constant*> Fields;
+    for (unsigned i = 0, e = $3->size(); i != e; ++i) {
+      Constant *C = (*$3)[i].C;
+      if (C->getType() != STy->getElementType(i))
+        error("Expected type '" + STy->getElementType(i)->getDescription() +
+              "' for element #" + utostr(i) + " of structure initializer");
+      Fields.push_back(C);
+    }
+    $$.C = ConstantStruct::get(STy, Fields);
+    $$.S = $1.S;
+    delete $1.T;
     delete $3;
   }
   | Types '{' '}' {
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " {}";
+    const StructType *STy = dyn_cast<StructType>($1.T->get());
+    if (STy == 0)
+      error("Cannot make struct constant with type: '" + 
+              $1.T->get()->getDescription() + "'");
+    if (STy->getNumContainedTypes() != 0)
+      error("Illegal number of initializers for structure type");
+    $$.C = ConstantStruct::get(STy, std::vector<Constant*>());
+    $$.S = $1.S;
+    delete $1.T;
+  }
+  | Types '<' '{' ConstVector '}' '>' {
+    const StructType *STy = dyn_cast<StructType>($1.T->get());
+    if (STy == 0)
+      error("Cannot make packed struct constant with type: '" + 
+            $1.T->get()->getDescription() + "'");
+    if ($4->size() != STy->getNumContainedTypes())
+      error("Illegal number of initializers for packed structure type");
+
+    // Check to ensure that constants are compatible with the type initializer!
+    std::vector<Constant*> Fields;
+    for (unsigned i = 0, e = $4->size(); i != e; ++i) {
+      Constant *C = (*$4)[i].C;
+      if (C->getType() != STy->getElementType(i))
+        error("Expected type '" + STy->getElementType(i)->getDescription() +
+              "' for element #" + utostr(i) + " of packed struct initializer");
+      Fields.push_back(C);
+    }
+    $$.C = ConstantStruct::get(STy, Fields);
+    $$.S = $1.S;
+    delete $1.T; 
+    delete $4;
+  }
+  | Types '<' '{' '}' '>' {
+    const StructType *STy = dyn_cast<StructType>($1.T->get());
+    if (STy == 0)
+      error("Cannot make packed struct constant with type: '" + 
+              $1.T->get()->getDescription() + "'");
+    if (STy->getNumContainedTypes() != 0)
+      error("Illegal number of initializers for packed structure type");
+    $$.C = ConstantStruct::get(STy, std::vector<Constant*>());
+    $$.S = $1.S;
+    delete $1.T;
   }
   | Types NULL_TOK {
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst +=  " " + *$2;
-    delete $2;
+    const PointerType *PTy = dyn_cast<PointerType>($1.T->get());
+    if (PTy == 0)
+      error("Cannot make null pointer constant with type: '" + 
+            $1.T->get()->getDescription() + "'");
+    $$.C = ConstantPointerNull::get(PTy);
+    $$.S = $1.S;
+    delete $1.T;
   }
   | Types UNDEF {
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + *$2;
-    delete $2;
+    $$.C = UndefValue::get($1.T->get());
+    $$.S = $1.S;
+    delete $1.T;
   }
   | Types SymbolicValueRef {
-    $$ = new Constant;
-    std::string Name = getUniqueName($2, $1->resolve(), true);
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + Name;
-    delete $2;
+    const PointerType *Ty = dyn_cast<PointerType>($1.T->get());
+    if (Ty == 0)
+      error("Global const reference must be a pointer type, not" +
+            $1.T->get()->getDescription());
+
+    // ConstExprs can exist in the body of a function, thus creating
+    // GlobalValues whenever they refer to a variable.  Because we are in
+    // the context of a function, getExistingValue will search the functions
+    // symbol table instead of the module symbol table for the global symbol,
+    // which throws things all off.  To get around this, we just tell
+    // getExistingValue that we are at global scope here.
+    //
+    Function *SavedCurFn = CurFun.CurrentFunction;
+    CurFun.CurrentFunction = 0;
+    Value *V = getExistingValue(Ty, $2);
+    CurFun.CurrentFunction = SavedCurFn;
+
+    // If this is an initializer for a constant pointer, which is referencing a
+    // (currently) undefined variable, create a stub now that shall be replaced
+    // in the future with the right type of variable.
+    //
+    if (V == 0) {
+      assert(isa<PointerType>(Ty) && "Globals may only be used as pointers");
+      const PointerType *PT = cast<PointerType>(Ty);
+
+      // First check to see if the forward references value is already created!
+      PerModuleInfo::GlobalRefsType::iterator I =
+        CurModule.GlobalRefs.find(std::make_pair(PT, $2));
+    
+      if (I != CurModule.GlobalRefs.end()) {
+        V = I->second;             // Placeholder already exists, use it...
+        $2.destroy();
+      } else {
+        std::string Name;
+        if ($2.Type == ValID::NameVal) Name = $2.Name;
+
+        // Create the forward referenced global.
+        GlobalValue *GV;
+        if (const FunctionType *FTy = 
+                 dyn_cast<FunctionType>(PT->getElementType())) {
+          GV = new Function(FTy, GlobalValue::ExternalLinkage, Name,
+                            CurModule.CurrentModule);
+        } else {
+          GV = new GlobalVariable(PT->getElementType(), false,
+                                  GlobalValue::ExternalLinkage, 0,
+                                  Name, CurModule.CurrentModule);
+        }
+
+        // Keep track of the fact that we have a forward ref to recycle it
+        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, $2), GV));
+        V = GV;
+      }
+    }
+    $$.C = cast<GlobalValue>(V);
+    $$.S = $1.S;
+    delete $1.T;            // Free the type handle
   }
   | Types ConstExpr {
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + *$2;
-    delete $2;
+    if ($1.T->get() != $2.C->getType())
+      error("Mismatched types for constant expression");
+    $$ = $2;
+    $$.S = $1.S;
+    delete $1.T;
   }
   | Types ZEROINITIALIZER {
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + *$2;
-    delete $2;
-  }
-  | SIntType EInt64Val {      // integral constants
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + *$2;
-    delete $2;
-  }
-  | UIntType EInt64Val {            // integral constants
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + *$2;
-    delete $2;
+    const Type *Ty = $1.T->get();
+    if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
+      error("Cannot create a null initialized value of this type");
+    $$.C = Constant::getNullValue(Ty);
+    $$.S = $1.S;
+    delete $1.T;
+  }
+  | SIntType EINT64VAL {      // integral constants
+    const Type *Ty = $1.T;
+    if (!ConstantInt::isValueValidForType(Ty, $2))
+      error("Constant value doesn't fit in type");
+    $$.C = ConstantInt::get(Ty, $2);
+    $$.S = Signed;
+  }
+  | UIntType EUINT64VAL {            // integral constants
+    const Type *Ty = $1.T;
+    if (!ConstantInt::isValueValidForType(Ty, $2))
+      error("Constant value doesn't fit in type");
+    $$.C = ConstantInt::get(Ty, $2);
+    $$.S = Unsigned;
   }
   | BOOL TRUETOK {                      // Boolean constants
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + *$2;
-    delete $2;
+    $$.C = ConstantInt::get(Type::Int1Ty, true);
+    $$.S = Unsigned;
   }
   | BOOL FALSETOK {                     // Boolean constants
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + *$2;
-    delete $2;
+    $$.C = ConstantInt::get(Type::Int1Ty, false);
+    $$.S = Unsigned;
   }
   | FPType FPVAL {                   // Float & Double constants
-    $$ = new Constant;
-    $$->type = $1;
-    $$->cnst = new std::string($1->getNewTy());
-    *$$->cnst += " " + *$2;
-    delete $2;
-  };
+    if (!ConstantFP::isValueValidForType($1.T, $2))
+      error("Floating point constant invalid for type");
+    $$.C = ConstantFP::get($1.T, $2);
+    $$.S = Signless;
+  }
+  ;
 
-ConstExpr: CastOps '(' ConstVal TO Types ')' {
-    std::string source = *$3->cnst;
-    const Type* SrcTy = $3->type->resolve();
-    const Type* DstTy = $5->resolve(); 
-    if (*$1 == "cast") {
-      // Call getCastUpgrade to upgrade the old cast
-      $$ = new std::string(getCastUpgrade(source, SrcTy, DstTy, true));
-    } else {
-      // Nothing to upgrade, just create the cast constant expr
-      $$ = new std::string(*$1);
-      *$$ += "( " + source + " to " + $5->getNewTy() + ")";
-    }
-    delete $1; delete $3; delete $4;
+ConstExpr
+  : CastOps '(' ConstVal TO Types ')' {
+    const Type* SrcTy = $3.C->getType();
+    const Type* DstTy = $5.T->get();
+    Signedness SrcSign = $3.S;
+    Signedness DstSign = $5.S;
+    if (!SrcTy->isFirstClassType())
+      error("cast constant expression from a non-primitive type: '" +
+            SrcTy->getDescription() + "'");
+    if (!DstTy->isFirstClassType())
+      error("cast constant expression to a non-primitive type: '" +
+            DstTy->getDescription() + "'");
+    $$.C = cast<Constant>(getCast($1, $3.C, SrcSign, DstTy, DstSign));
+    $$.S = DstSign;
+    delete $5.T;
   }
   | GETELEMENTPTR '(' ConstVal IndexList ')' {
-    *$1 += "(" + *$3->cnst;
-    for (unsigned i = 0; i < $4->size(); ++i) {
-      Value* V = (*$4)[i];
-      *$1 += ", " + *V->val;
-      delete V;
-    }
-    *$1 += ")";
-    $$ = $1;
-    delete $3;
+    const Type *Ty = $3.C->getType();
+    if (!isa<PointerType>(Ty))
+      error("GetElementPtr requires a pointer operand");
+
+    std::vector<Value*> VIndices;
+    std::vector<Constant*> CIndices;
+    upgradeGEPIndices($3.C->getType(), $4, VIndices, &CIndices);
+
     delete $4;
+    $$.C = ConstantExpr::getGetElementPtr($3.C, CIndices);
+    $$.S = Signless;
   }
   | SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
-    *$1 += "(" + *$3->cnst + "," + *$5->cnst + "," + *$7->cnst + ")";
-    delete $3; delete $5; delete $7;
-    $$ = $1;
+    if (!$3.C->getType()->isInteger() ||
+        cast<IntegerType>($3.C->getType())->getBitWidth() != 1)
+      error("Select condition must be bool type");
+    if ($5.C->getType() != $7.C->getType())
+      error("Select operand types must match");
+    $$.C = ConstantExpr::getSelect($3.C, $5.C, $7.C);
+    $$.S = Unsigned;
   }
   | ArithmeticOps '(' ConstVal ',' ConstVal ')' {
-    const char* op = getDivRemOpcode(*$1, $3->type); 
-    $$ = new std::string(op);
-    *$$ += "(" + *$3->cnst + "," + *$5->cnst + ")";
-    delete $1; delete $3; delete $5;
+    const Type *Ty = $3.C->getType();
+    if (Ty != $5.C->getType())
+      error("Binary operator types must match");
+    // First, make sure we're dealing with the right opcode by upgrading from
+    // obsolete versions.
+    Instruction::BinaryOps Opcode = getBinaryOp($1, Ty, $3.S);
+
+    // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs.
+    // To retain backward compatibility with these early compilers, we emit a
+    // cast to the appropriate integer type automatically if we are in the
+    // broken case.  See PR424 for more information.
+    if (!isa<PointerType>(Ty)) {
+      $$.C = ConstantExpr::get(Opcode, $3.C, $5.C);
+    } else {
+      const Type *IntPtrTy = 0;
+      switch (CurModule.CurrentModule->getPointerSize()) {
+      case Module::Pointer32: IntPtrTy = Type::Int32Ty; break;
+      case Module::Pointer64: IntPtrTy = Type::Int64Ty; break;
+      default: error("invalid pointer binary constant expr");
+      }
+      $$.C = ConstantExpr::get(Opcode, 
+             ConstantExpr::getCast(Instruction::PtrToInt, $3.C, IntPtrTy),
+             ConstantExpr::getCast(Instruction::PtrToInt, $5.C, IntPtrTy));
+      $$.C = ConstantExpr::getCast(Instruction::IntToPtr, $$.C, Ty);
+    }
+    $$.S = $3.S; 
   }
   | LogicalOps '(' ConstVal ',' ConstVal ')' {
-    *$1 += "(" + *$3->cnst + "," + *$5->cnst + ")";
-    delete $3; delete $5;
-    $$ = $1;
+    const Type* Ty = $3.C->getType();
+    if (Ty != $5.C->getType())
+      error("Logical operator types must match");
+    if (!Ty->isInteger()) {
+      if (!isa<PackedType>(Ty) || 
+          !cast<PackedType>(Ty)->getElementType()->isInteger())
+        error("Logical operator requires integer operands");
+    }
+    Instruction::BinaryOps Opcode = getBinaryOp($1, Ty, $3.S);
+    $$.C = ConstantExpr::get(Opcode, $3.C, $5.C);
+    $$.S = $3.S;
   }
   | SetCondOps '(' ConstVal ',' ConstVal ')' {
-    *$1 = getCompareOp(*$1, $3->type);
-    *$1 += "(" + *$3->cnst + "," + *$5->cnst + ")";
-    delete $3; delete $5;
-    $$ = $1;
+    const Type* Ty = $3.C->getType();
+    if (Ty != $5.C->getType())
+      error("setcc operand types must match");
+    unsigned short pred;
+    Instruction::OtherOps Opcode = getCompareOp($1, pred, Ty, $3.S);
+    $$.C = ConstantExpr::getCompare(Opcode, $3.C, $5.C);
+    $$.S = Unsigned;
   }
   | ICMP IPredicates '(' ConstVal ',' ConstVal ')' {
-    *$1 += " " + *$2 + " (" +  *$4->cnst + "," + *$6->cnst + ")";
-    delete $2; delete $4; delete $6;
-    $$ = $1;
+    if ($4.C->getType() != $6.C->getType()) 
+      error("icmp operand types must match");
+    $$.C = ConstantExpr::getCompare($2, $4.C, $6.C);
+    $$.S = Unsigned;
   }
   | FCMP FPredicates '(' ConstVal ',' ConstVal ')' {
-    *$1 += " " + *$2 + " (" + *$4->cnst + "," + *$6->cnst + ")";
-    delete $2; delete $4; delete $6;
-    $$ = $1;
+    if ($4.C->getType() != $6.C->getType()) 
+      error("fcmp operand types must match");
+    $$.C = ConstantExpr::getCompare($2, $4.C, $6.C);
+    $$.S = Unsigned;
   }
   | ShiftOps '(' ConstVal ',' ConstVal ')' {
-    const char* shiftop = $1->c_str();
-    if (*$1 == "shr")
-      shiftop = ($3->type->isUnsigned()) ? "lshr" : "ashr";
-    $$ = new std::string(shiftop);
-    *$$ += "(" + *$3->cnst + "," + *$5->cnst + ")";
-    delete $1; delete $3; delete $5;
+    if (!$5.C->getType()->isInteger() ||
+        cast<IntegerType>($5.C->getType())->getBitWidth() != 8)
+      error("Shift count for shift constant must be unsigned byte");
+    if (!$3.C->getType()->isInteger())
+      error("Shift constant expression requires integer operand");
+    $$.C = ConstantExpr::get(getOtherOp($1, $3.S), $3.C, $5.C);
+    $$.S = $3.S;
   }
   | EXTRACTELEMENT '(' ConstVal ',' ConstVal ')' {
-    *$1 += "(" + *$3->cnst + "," + *$5->cnst + ")";
-    delete $3; delete $5;
-    $$ = $1;
+    if (!ExtractElementInst::isValidOperands($3.C, $5.C))
+      error("Invalid extractelement operands");
+    $$.C = ConstantExpr::getExtractElement($3.C, $5.C);
+    $$.S = $3.S;
   }
   | INSERTELEMENT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
-    *$1 += "(" + *$3->cnst + "," + *$5->cnst + "," + *$7->cnst + ")";
-    delete $3; delete $5; delete $7;
-    $$ = $1;
+    if (!InsertElementInst::isValidOperands($3.C, $5.C, $7.C))
+      error("Invalid insertelement operands");
+    $$.C = ConstantExpr::getInsertElement($3.C, $5.C, $7.C);
+    $$.S = $3.S;
   }
   | SHUFFLEVECTOR '(' ConstVal ',' ConstVal ',' ConstVal ')' {
-    *$1 += "(" + *$3->cnst + "," + *$5->cnst + "," + *$7->cnst + ")";
-    delete $3; delete $5; delete $7;
-    $$ = $1;
-  };
+    if (!ShuffleVectorInst::isValidOperands($3.C, $5.C, $7.C))
+      error("Invalid shufflevector operands");
+    $$.C = ConstantExpr::getShuffleVector($3.C, $5.C, $7.C);
+    $$.S = $3.S;
+  }
+  ;
 
 
 // ConstVector - A list of comma separated constants.
-
 ConstVector 
-  : ConstVector ',' ConstVal {
-    *$1 += ", " + *$3->cnst;
-    delete $3;
-    $$ = $1;
+  : ConstVector ',' ConstVal { ($$ = $1)->push_back($3); }
+  | ConstVal {
+    $$ = new std::vector<ConstInfo>();
+    $$->push_back($1);
   }
-  | ConstVal { $$ = new std::string(*$1->cnst); delete $1; }
   ;
 
 
 // GlobalType - Match either GLOBAL or CONSTANT for global declarations...
-GlobalType : GLOBAL | CONSTANT ;
+GlobalType 
+  : GLOBAL { $$ = false; } 
+  | CONSTANT { $$ = true; }
+  ;
 
 
 //===----------------------------------------------------------------------===//
@@ -1461,819 +2375,1059 @@
 // Module rule: Capture the result of parsing the whole file into a result
 // variable...
 //
-Module : DefinitionList {
-};
+Module 
+  : FunctionList {
+    $$ = ParserResult = $1;
+    CurModule.ModuleDone();
+  }
+  ;
 
-// DefinitionList - Top level definitions
+// FunctionList - A list of functions, preceeded by a constant pool.
 //
-DefinitionList : DefinitionList Function {
-    $$ = 0;
-  } 
-  | DefinitionList FunctionProto {
-    *O << *$2 << '\n';
-    delete $2;
-    $$ = 0;
-  }
-  | DefinitionList MODULE ASM_TOK AsmBlock {
-    *O << "module asm " << ' ' << *$4 << '\n';
-    $$ = 0;
-  }  
-  | DefinitionList IMPLEMENTATION {
-    *O << "implementation\n";
-    $$ = 0;
+FunctionList 
+  : FunctionList Function { $$ = $1; CurFun.FunctionDone(); } 
+  | FunctionList FunctionProto { $$ = $1; }
+  | FunctionList MODULE ASM_TOK AsmBlock { $$ = $1; }  
+  | FunctionList IMPLEMENTATION { $$ = $1; }
+  | ConstPool {
+    $$ = CurModule.CurrentModule;
+    // Emit an error if there are any unresolved types left.
+    if (!CurModule.LateResolveTypes.empty()) {
+      const ValID &DID = CurModule.LateResolveTypes.begin()->first;
+      if (DID.Type == ValID::NameVal) {
+        error("Reference to an undefined type: '"+DID.getName() + "'");
+      } else {
+        error("Reference to an undefined type: #" + itostr(DID.Num));
+      }
+    }
   }
-  | ConstPool { $$ = 0; }
   ;
 
-External : EXTERNAL | UNINITIALIZED { $$ = $1; *$$ = "external"; } ;
-
 // ConstPool - Constants with optional names assigned to them.
-ConstPool : ConstPool OptAssign TYPE TypesV {
-    Type::EnumeratedTypes.push_back($4);
-    if (!$2->empty()) {
-      Type::NamedTypes[*$2] = $4;
-      *O << *$2 << " = ";
+ConstPool 
+  : ConstPool OptAssign TYPE TypesV {
+    // Eagerly resolve types.  This is not an optimization, this is a
+    // requirement that is due to the fact that we could have this:
+    //
+    // %list = type { %list * }
+    // %list = type { %list * }    ; repeated type decl
+    //
+    // If types are not resolved eagerly, then the two types will not be
+    // determined to be the same type!
+    //
+    const Type* Ty = $4.T->get();
+    ResolveTypeTo($2, Ty);
+
+    if (!setTypeName(Ty, $2) && !$2) {
+      // If this is a named type that is not a redefinition, add it to the slot
+      // table.
+      CurModule.Types.push_back(Ty);
     }
-    *O << "type " << $4->getNewTy() << '\n';
-    delete $2; delete $3;
-    $$ = 0;
+    delete $4.T;
   }
   | ConstPool FunctionProto {       // Function prototypes can be in const pool
-    *O << *$2 << '\n';
-    delete $2;
-    $$ = 0;
   }
   | ConstPool MODULE ASM_TOK AsmBlock {  // Asm blocks can be in the const pool
-    *O << *$2 << ' ' << *$3 << ' ' << *$4 << '\n';
-    delete $2; delete $3; delete $4; 
-    $$ = 0;
   }
-  | ConstPool OptAssign OptLinkage GlobalType ConstVal  GlobalVarAttributes {
-    if (!$2->empty()) {
-      std::string Name = getGlobalName($2,*$3, $5->type->getPointerType(),
-                                       *$4 == "constant");
-      *O << Name << " = ";
-    }
-    *O << *$3 << ' ' << *$4 << ' ' << *$5->cnst << ' ' << *$6 << '\n';
-    delete $2; delete $3; delete $4; delete $6; 
-    $$ = 0;
-  }
-  | ConstPool OptAssign External GlobalType Types  GlobalVarAttributes {
-    if (!$2->empty()) {
-      std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
-                                       *$4 == "constant");
-      *O << Name << " = ";
-    }
-    *O <<  *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
-    delete $2; delete $3; delete $4; delete $6;
-    $$ = 0;
-  }
-  | ConstPool OptAssign DLLIMPORT GlobalType Types GlobalVarAttributes {
-    if (!$2->empty()) {
-      std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
-                                       *$4 == "constant");
-      *O << Name << " = ";
-    }
-    *O << *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
-    delete $2; delete $3; delete $4; delete $6;
-    $$ = 0;
-  }
-  | ConstPool OptAssign EXTERN_WEAK GlobalType Types  GlobalVarAttributes {
-    if (!$2->empty()) {
-      std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
-                                       *$4 == "constant");
-      *O << Name << " = ";
-    }
-    *O << *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
-    delete $2; delete $3; delete $4; delete $6;
-    $$ = 0;
+  | ConstPool OptAssign OptLinkage GlobalType ConstVal {
+    if ($5.C == 0) 
+      error("Global value initializer is not a constant");
+    CurGV = ParseGlobalVariable($2, $3, $4, $5.C->getType(), $5.C);
+  } GlobalVarAttributes {
+    CurGV = 0;
+  }
+  | ConstPool OptAssign EXTERNAL GlobalType Types {
+    const Type *Ty = $5.T->get();
+    CurGV = ParseGlobalVariable($2, GlobalValue::ExternalLinkage, $4, Ty, 0);
+    delete $5.T;
+  } GlobalVarAttributes {
+    CurGV = 0;
+  }
+  | ConstPool OptAssign DLLIMPORT GlobalType Types {
+    const Type *Ty = $5.T->get();
+    CurGV = ParseGlobalVariable($2, GlobalValue::DLLImportLinkage, $4, Ty, 0);
+    delete $5.T;
+  } GlobalVarAttributes {
+    CurGV = 0;
+  }
+  | ConstPool OptAssign EXTERN_WEAK GlobalType Types {
+    const Type *Ty = $5.T->get();
+    CurGV = 
+      ParseGlobalVariable($2, GlobalValue::ExternalWeakLinkage, $4, Ty, 0);
+    delete $5.T;
+  } GlobalVarAttributes {
+    CurGV = 0;
   }
   | ConstPool TARGET TargetDefinition { 
-    *O << *$2 << ' ' << *$3 << '\n';
-    delete $2; delete $3;
-    $$ = 0;
   }
   | ConstPool DEPLIBS '=' LibrariesDefinition {
-    *O << *$2 << " = " << *$4 << '\n';
-    delete $2; delete $4;
-    $$ = 0;
   }
   | /* empty: end of list */ { 
-    $$ = 0;
-  };
+  }
+  ;
 
+AsmBlock 
+  : STRINGCONSTANT {
+    const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
+    char *EndStr = UnEscapeLexed($1, true);
+    std::string NewAsm($1, EndStr);
+    free($1);
 
-AsmBlock : STRINGCONSTANT ;
+    if (AsmSoFar.empty())
+      CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
+    else
+      CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
+  }
+  ;
 
-BigOrLittle : BIG | LITTLE ;
+BigOrLittle 
+  : BIG    { $$ = Module::BigEndian; };
+  | LITTLE { $$ = Module::LittleEndian; }
+  ;
 
 TargetDefinition 
   : ENDIAN '=' BigOrLittle {
-    *$1 += " = " + *$3;
-    delete $3;
-    $$ = $1;
+    CurModule.setEndianness($3);
   }
   | POINTERSIZE '=' EUINT64VAL {
-    *$1 += " = " + *$3;
-    if (*$3 == "64")
-      SizeOfPointer = 64;
-    delete $3;
-    $$ = $1;
+    if ($3 == 32)
+      CurModule.setPointerSize(Module::Pointer32);
+    else if ($3 == 64)
+      CurModule.setPointerSize(Module::Pointer64);
+    else
+      error("Invalid pointer size: '" + utostr($3) + "'");
   }
   | TRIPLE '=' STRINGCONSTANT {
-    *$1 += " = " + *$3;
-    delete $3;
-    $$ = $1;
+    CurModule.CurrentModule->setTargetTriple($3);
+    free($3);
   }
   | DATALAYOUT '=' STRINGCONSTANT {
-    *$1 += " = " + *$3;
-    delete $3;
-    $$ = $1;
-  };
+    CurModule.CurrentModule->setDataLayout($3);
+    free($3);
+  }
+  ;
 
 LibrariesDefinition 
-  : '[' LibList ']' {
-    $2->insert(0, "[ ");
-    *$2 += " ]";
-    $$ = $2;
-  };
+  : '[' LibList ']'
+  ;
 
 LibList 
   : LibList ',' STRINGCONSTANT {
-    *$1 += ", " + *$3;
-    delete $3;
-    $$ = $1;
+      CurModule.CurrentModule->addLibrary($3);
+      free($3);
   }
-  | STRINGCONSTANT 
-  | /* empty: end of list */ {
-    $$ = new std::string();
-  };
+  | STRINGCONSTANT {
+    CurModule.CurrentModule->addLibrary($1);
+    free($1);
+  }
+  | /* empty: end of list */ { }
+  ;
 
 //===----------------------------------------------------------------------===//
 //                       Rules to match Function Headers
 //===----------------------------------------------------------------------===//
 
-Name : VAR_ID | STRINGCONSTANT;
-OptName : Name | /*empty*/ { $$ = new std::string(); };
+Name 
+  : VAR_ID | STRINGCONSTANT
+  ;
+
+OptName 
+  : Name 
+  | /*empty*/ { $$ = 0; }
+  ;
 
-ArgVal : Types OptName {
-  $$ = new std::string($1->getNewTy());
-  if (!$2->empty()) {
-    std::string Name = getUniqueName($2, $1->resolve());
-    *$$ += " " + Name;
+ArgVal 
+  : Types OptName {
+    if ($1.T->get() == Type::VoidTy)
+      error("void typed arguments are invalid");
+    $$ = new std::pair<PATypeInfo, char*>($1, $2);
   }
-  delete $2;
-};
+  ;
 
-ArgListH : ArgListH ',' ArgVal {
-    *$1 += ", " + *$3;
+ArgListH 
+  : ArgListH ',' ArgVal {
+    $$ = $1;
+    $$->push_back(*$3);
     delete $3;
   }
   | ArgVal {
-    $$ = $1;
-  };
-
-ArgList : ArgListH {
-    $$ = $1;
+    $$ = new std::vector<std::pair<PATypeInfo,char*> >();
+    $$->push_back(*$1);
+    delete $1;
   }
+  ;
+
+ArgList 
+  : ArgListH { $$ = $1; }
   | ArgListH ',' DOTDOTDOT {
-    *$1 += ", ...";
     $$ = $1;
-    delete $3;
+    PATypeInfo VoidTI;
+    VoidTI.T = new PATypeHolder(Type::VoidTy);
+    VoidTI.S = Signless;
+    $$->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
   }
   | DOTDOTDOT {
-    $$ = $1;
+    $$ = new std::vector<std::pair<PATypeInfo,char*> >();
+    PATypeInfo VoidTI;
+    VoidTI.T = new PATypeHolder(Type::VoidTy);
+    VoidTI.S = Signless;
+    $$->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
   }
-  | /* empty */ { $$ = new std::string(); };
+  | /* empty */ { $$ = 0; }
+  ;
 
 FunctionHeaderH 
   : OptCallingConv TypesV Name '(' ArgList ')' OptSection OptAlign {
-    if (*$3 == "%llvm.va_start" || *$3 == "%llvm.va_end") {
-      *$5 = "i8*";
-    } else if (*$3 == "%llvm.va_copy") {
-      *$5 = "i8*, i8*";
-    }
-    if (!$1->empty()) {
-      *$1 += " ";
-    }
-    *$1 += $2->getNewTy() + " " + *$3 + "(" + *$5 + ")";
-    if (!$7->empty()) {
-      *$1 += " " + *$7;
+    UnEscapeLexed($3);
+    std::string FunctionName($3);
+    free($3);  // Free strdup'd memory!
+
+    const Type* RetTy = $2.T->get();
+    
+    if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
+      error("LLVM functions cannot return aggregate types");
+
+    std::vector<const Type*> ParamTypeList;
+
+    // In LLVM 2.0 the signatures of three varargs intrinsics changed to take
+    // i8*. We check here for those names and override the parameter list
+    // types to ensure the prototype is correct.
+    if (FunctionName == "llvm.va_start" || FunctionName == "llvm.va_end") {
+      ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+    } else if (FunctionName == "llvm.va_copy") {
+      ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+      ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+    } else if ($5) {   // If there are arguments...
+      for (std::vector<std::pair<PATypeInfo,char*> >::iterator 
+           I = $5->begin(), E = $5->end(); I != E; ++I) {
+        const Type *Ty = I->first.T->get();
+        ParamTypeList.push_back(Ty);
+      }
     }
-    if (!$8->empty()) {
-      *$1 += " " + *$8;
+
+    bool isVarArg = 
+      ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
+    if (isVarArg) ParamTypeList.pop_back();
+
+    const FunctionType *FT = FunctionType::get(RetTy, ParamTypeList, isVarArg);
+    const PointerType *PFT = PointerType::get(FT);
+    delete $2.T;
+
+    ValID ID;
+    if (!FunctionName.empty()) {
+      ID = ValID::create((char*)FunctionName.c_str());
+    } else {
+      ID = ValID::create((int)CurModule.Values[PFT].size());
     }
-    delete $3;
-    delete $5;
-    delete $7;
-    delete $8;
-    $$ = $1;
-  };
 
-BEGIN : BEGINTOK { $$ = new std::string("{"); delete $1; }
-  | '{' { $$ = new std::string ("{"); }
+    Function *Fn = 0;
+    // See if this function was forward referenced.  If so, recycle the object.
+    if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
+      // Move the function to the end of the list, from whereever it was 
+      // previously inserted.
+      Fn = cast<Function>(FWRef);
+      CurModule.CurrentModule->getFunctionList().remove(Fn);
+      CurModule.CurrentModule->getFunctionList().push_back(Fn);
+    } else if (!FunctionName.empty() &&     // Merge with an earlier prototype?
+               (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) {
+      // If this is the case, either we need to be a forward decl, or it needs 
+      // to be.
+      if (!CurFun.isDeclare && !Fn->isExternal())
+        error("Redefinition of function '" + FunctionName + "'");
+      
+      // Make sure to strip off any argument names so we can't get conflicts.
+      if (Fn->isExternal())
+        for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
+             AI != AE; ++AI)
+          AI->setName("");
+    } else  {  // Not already defined?
+      Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
+                        CurModule.CurrentModule);
+
+      InsertValue(Fn, CurModule.Values);
+    }
+
+    CurFun.FunctionStart(Fn);
+
+    if (CurFun.isDeclare) {
+      // If we have declaration, always overwrite linkage.  This will allow us 
+      // to correctly handle cases, when pointer to function is passed as 
+      // argument to another function.
+      Fn->setLinkage(CurFun.Linkage);
+    }
+    Fn->setCallingConv($1);
+    Fn->setAlignment($8);
+    if ($7) {
+      Fn->setSection($7);
+      free($7);
+    }
+
+    // Add all of the arguments we parsed to the function...
+    if ($5) {                     // Is null if empty...
+      if (isVarArg) {  // Nuke the last entry
+        assert($5->back().first.T->get() == Type::VoidTy && 
+               $5->back().second == 0 && "Not a varargs marker");
+        delete $5->back().first.T;
+        $5->pop_back();  // Delete the last entry
+      }
+      Function::arg_iterator ArgIt = Fn->arg_begin();
+      for (std::vector<std::pair<PATypeInfo,char*> >::iterator 
+           I = $5->begin(), E = $5->end(); I != E; ++I, ++ArgIt) {
+        delete I->first.T;                        // Delete the typeholder...
+        setValueName(ArgIt, I->second);           // Insert arg into symtab...
+        InsertValue(ArgIt);
+      }
+      delete $5;                     // We're now done with the argument list
+    }
+  }
+  ;
+
+BEGIN 
+  : BEGINTOK | '{'                // Allow BEGIN or '{' to start a function
   ;
 
 FunctionHeader 
   : OptLinkage FunctionHeaderH BEGIN {
-    *O << "define ";
-    if (!$1->empty()) {
-      *O << *$1 << ' ';
-    }
-    *O << *$2 << ' ' << *$3 << '\n';
-    delete $1; delete $2; delete $3;
-    $$ = 0;
+    $$ = CurFun.CurrentFunction;
+
+    // Make sure that we keep track of the linkage type even if there was a
+    // previous "declare".
+    $$->setLinkage($1);
   }
   ;
 
-END : ENDTOK { $$ = new std::string("}"); delete $1; }
-    | '}' { $$ = new std::string("}"); };
+END 
+  : ENDTOK | '}'                    // Allow end of '}' to end a function
+  ;
 
-Function : FunctionHeader BasicBlockList END {
-  if ($2)
-    *O << *$2;
-  *O << *$3 << "\n\n";
-  delete $1; delete $2; delete $3;
-  $$ = 0;
-};
+Function 
+  : BasicBlockList END {
+    $$ = $1;
+  };
 
 FnDeclareLinkage
-  : /*default*/ { $$ = new std::string(); }
-  | DLLIMPORT    
-  | EXTERN_WEAK 
+  : /*default*/ 
+  | DLLIMPORT   { CurFun.Linkage = GlobalValue::DLLImportLinkage; } 
+  | EXTERN_WEAK { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; }
   ;
   
 FunctionProto 
-  : DECLARE { isDeclare = true; } FnDeclareLinkage FunctionHeaderH { 
-    if (!$3->empty())
-      *$1 += " " + *$3;
-    *$1 += " " + *$4;
-    delete $3;
-    delete $4;
-    $$ = $1;
-    isDeclare = false;
-  };
+  : DECLARE { CurFun.isDeclare = true; } FnDeclareLinkage FunctionHeaderH {
+    $$ = CurFun.CurrentFunction;
+    CurFun.FunctionDone();
+    
+  }
+  ;
 
 //===----------------------------------------------------------------------===//
 //                        Rules to match Basic Blocks
 //===----------------------------------------------------------------------===//
 
-OptSideEffect : /* empty */ { $$ = new std::string(); }
-  | SIDEEFFECT;
+OptSideEffect 
+  : /* empty */ { $$ = false; }
+  | SIDEEFFECT { $$ = true; }
+  ;
 
 ConstValueRef 
-  : ESINT64VAL | EUINT64VAL | FPVAL | TRUETOK | FALSETOK | NULL_TOK | UNDEF
-  | ZEROINITIALIZER 
-  | '<' ConstVector '>' { 
-    $2->insert(0, "<");
-    *$2 += ">";
-    $$ = $2;
+    // A reference to a direct constant
+  : ESINT64VAL {    $$ = ValID::create($1); }
+  | EUINT64VAL { $$ = ValID::create($1); }
+  | FPVAL { $$ = ValID::create($1); } 
+  | TRUETOK { $$ = ValID::create(ConstantInt::get(Type::Int1Ty, true)); } 
+  | FALSETOK { $$ = ValID::create(ConstantInt::get(Type::Int1Ty, false)); }
+  | NULL_TOK { $$ = ValID::createNull(); }
+  | UNDEF { $$ = ValID::createUndef(); }
+  | ZEROINITIALIZER { $$ = ValID::createZeroInit(); }
+  | '<' ConstVector '>' { // Nonempty unsized packed vector
+    const Type *ETy = (*$2)[0].C->getType();
+    int NumElements = $2->size(); 
+    PackedType* pt = PackedType::get(ETy, NumElements);
+    PATypeHolder* PTy = new PATypeHolder(
+      HandleUpRefs(PackedType::get(ETy, NumElements)));
+    
+    // Verify all elements are correct type!
+    std::vector<Constant*> Elems;
+    for (unsigned i = 0; i < $2->size(); i++) {
+      Constant *C = (*$2)[i].C;
+      const Type *CTy = C->getType();
+      if (ETy != CTy)
+        error("Element #" + utostr(i) + " is not of type '" + 
+              ETy->getDescription() +"' as required!\nIt is of type '" +
+              CTy->getDescription() + "'");
+      Elems.push_back(C);
+    }
+    $$ = ValID::create(ConstantPacked::get(pt, Elems));
+    delete PTy; delete $2;
+  }
+  | ConstExpr {
+    $$ = ValID::create($1.C);
   }
-  | ConstExpr 
   | ASM_TOK OptSideEffect STRINGCONSTANT ',' STRINGCONSTANT {
-    if (!$2->empty()) {
-      *$1 += " " + *$2;
-    }
-    *$1 += " " + *$3 + ", " + *$5;
-    delete $2; delete $3; delete $5;
-    $$ = $1;
-  };
+    char *End = UnEscapeLexed($3, true);
+    std::string AsmStr = std::string($3, End);
+    End = UnEscapeLexed($5, true);
+    std::string Constraints = std::string($5, End);
+    $$ = ValID::createInlineAsm(AsmStr, Constraints, $2);
+    free($3);
+    free($5);
+  }
+  ;
 
-SymbolicValueRef : IntVal | Name ;
+// SymbolicValueRef - Reference to one of two ways of symbolically refering to
+// another value.
+//
+SymbolicValueRef 
+  : INTVAL {  $$ = ValID::create($1); }
+  | Name   {  $$ = ValID::create($1); }
+  ;
 
 // ValueRef - A reference to a definition... either constant or symbolic
 ValueRef 
-  : SymbolicValueRef {
-    $$ = new Value;
-    $$->val = $1;
-    $$->constant = false;
-    $$->type = 0;
-  }
-  | ConstValueRef {
-    $$ = new Value;
-    $$->val = $1;
-    $$->constant = true;
-    $$->type = 0;
-  }
+  : SymbolicValueRef | ConstValueRef
   ;
 
+
 // ResolvedVal - a <type> <value> pair.  This is used only in cases where the
 // type immediately preceeds the value reference, and allows complex constant
 // pool references (for things like: 'ret [2 x int] [ int 12, int 42]')
-ResolvedVal : Types ValueRef {
-    $1 = $1->resolve();
-    std::string Name = getUniqueName($2->val, $1);
-    $$ = $2;
-    delete $$->val;
-    $$->val = new std::string($1->getNewTy() + " " + Name);
-    $$->type = $1;
-  };
+ResolvedVal 
+  : Types ValueRef { 
+    const Type *Ty = $1.T->get();
+    $$.S = $1.S;
+    $$.V = getVal(Ty, $2); 
+    delete $1.T;
+  }
+  ;
 
-BasicBlockList : BasicBlockList BasicBlock {
-    $$ = 0;
+BasicBlockList 
+  : BasicBlockList BasicBlock {
+    $$ = $1;
   }
-  | BasicBlock { // Do not allow functions with 0 basic blocks   
-    $$ = 0;
+  | FunctionHeader BasicBlock { // Do not allow functions with 0 basic blocks   
+    $$ = $1;
   };
 
 
 // Basic blocks are terminated by branching instructions: 
 // br, br/cc, switch, ret
 //
-BasicBlock : InstructionList BBTerminatorInst  {
-    $$ = 0;
-  };
+BasicBlock 
+  : InstructionList OptAssign BBTerminatorInst  {
+    setValueName($3, $2);
+    InsertValue($3);
+    $1->getInstList().push_back($3);
+    InsertValue($1);
+    $$ = $1;
+  }
+  ;
 
-InstructionList : InstructionList Inst {
-    *O << "    " << *$2 << '\n';
-    delete $2;
-    $$ = 0;
+InstructionList
+  : InstructionList Inst {
+    if ($2.I)
+      $1->getInstList().push_back($2.I);
+    $$ = $1;
   }
   | /* empty */ {
-    $$ = 0;
+    $$ = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true);
+    // Make sure to move the basic block to the correct location in the
+    // function, instead of leaving it inserted wherever it was first
+    // referenced.
+    Function::BasicBlockListType &BBL = 
+      CurFun.CurrentFunction->getBasicBlockList();
+    BBL.splice(BBL.end(), BBL, $$);
   }
   | LABELSTR {
-    *O << *$1 << '\n';
-    delete $1;
-    $$ = 0;
-  };
+    $$ = CurBB = getBBVal(ValID::create($1), true);
+    // Make sure to move the basic block to the correct location in the
+    // function, instead of leaving it inserted wherever it was first
+    // referenced.
+    Function::BasicBlockListType &BBL = 
+      CurFun.CurrentFunction->getBasicBlockList();
+    BBL.splice(BBL.end(), BBL, $$);
+  }
+  ;
 
-Unwind : UNWIND | EXCEPT { $$ = $1; *$$ = "unwind"; } ;
+Unwind : UNWIND | EXCEPT;
 
-BBTerminatorInst : RET ResolvedVal {              // Return with a result...
-    *O << "    " << *$1 << ' ' << *$2->val << '\n';
-    delete $1; delete $2;
-    $$ = 0;
+BBTerminatorInst 
+  : RET ResolvedVal {              // Return with a result...
+    $$ = new ReturnInst($2.V);
   }
   | RET VOID {                                       // Return with no result...
-    *O << "    " << *$1 << ' ' << $2->getNewTy() << '\n';
-    delete $1;
-    $$ = 0;
+    $$ = new ReturnInst();
   }
   | BR LABEL ValueRef {                         // Unconditional Branch...
-    *O << "    " << *$1 << ' ' << $2->getNewTy() << ' ' << *$3->val << '\n';
-    delete $1; delete $3;
-    $$ = 0;
+    BasicBlock* tmpBB = getBBVal($3);
+    $$ = new BranchInst(tmpBB);
   }                                                  // Conditional Branch...
   | BR BOOL ValueRef ',' LABEL ValueRef ',' LABEL ValueRef {  
-    std::string Name = getUniqueName($3->val, $2);
-    *O << "    " << *$1 << ' ' << $2->getNewTy() << ' ' << Name << ", " 
-       << $5->getNewTy() << ' ' << *$6->val << ", " << $8->getNewTy() << ' ' 
-       << *$9->val << '\n';
-    delete $1; delete $3; delete $6; delete $9;
-    $$ = 0;
+    BasicBlock* tmpBBA = getBBVal($6);
+    BasicBlock* tmpBBB = getBBVal($9);
+    Value* tmpVal = getVal(Type::Int1Ty, $3);
+    $$ = new BranchInst(tmpBBA, tmpBBB, tmpVal);
   }
   | SWITCH IntType ValueRef ',' LABEL ValueRef '[' JumpTable ']' {
-    std::string Name = getUniqueName($3->val, $2);
-    *O << "    " << *$1 << ' ' << $2->getNewTy() << ' ' << Name << ", " 
-       << $5->getNewTy() << ' ' << *$6->val << " [" << *$8 << " ]\n";
-    delete $1; 
-    delete $3;
-    delete $6; 
+    Value* tmpVal = getVal($2.T, $3);
+    BasicBlock* tmpBB = getBBVal($6);
+    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, $8->size());
+    $$ = S;
+    std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = $8->begin(),
+      E = $8->end();
+    for (; I != E; ++I) {
+      if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
+          S->addCase(CI, I->second);
+      else
+        error("Switch case is constant, but not a simple integer");
+    }
     delete $8;
-    $$ = 0;
   }
   | SWITCH IntType ValueRef ',' LABEL ValueRef '[' ']' {
-    std::string Name = getUniqueName($3->val, $2);
-    *O << "    " << *$1 << ' ' << $2->getNewTy() << ' ' << Name << ", " 
-       << $5->getNewTy() << ' ' << *$6->val << "[]\n";
-    delete $1; 
-    delete $3; 
-    delete $6;
-    $$ = 0;
+    Value* tmpVal = getVal($2.T, $3);
+    BasicBlock* tmpBB = getBBVal($6);
+    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
+    $$ = S;
   }
-  | OptAssign INVOKE OptCallingConv TypesV ValueRef '(' ValueRefListE ')'
+  | INVOKE OptCallingConv TypesV ValueRef '(' ValueRefListE ')'
     TO LABEL ValueRef Unwind LABEL ValueRef {
-    const Type* ResTy = getFunctionReturnType($4);
-    *O << "    ";
-    if (!$1->empty()) {
-      std::string Name = getUniqueName($1, ResTy);
-      *O << Name << " = ";
-    }
-    *O << *$2 << ' ' << *$3 << ' ' << $4->getNewTy() << ' ' << *$5->val << " (";
-    for (unsigned i = 0; i < $7->size(); ++i) {
-      Value* V = (*$7)[i];
-      *O << *V->val;
-      if (i+1 < $7->size())
-        *O << ", ";
-      delete V;
-    }
-    *O << ") " << *$9 << ' ' << $10->getNewTy() << ' ' << *$11->val << ' ' 
-       << *$12 << ' ' << $13->getNewTy() << ' ' << *$14->val << '\n';
-    delete $1; delete $2; delete $3; delete $5; delete $7; 
-    delete $9; delete $11; delete $12; delete $14; 
-    $$ = 0;
+    const PointerType *PFTy;
+    const FunctionType *Ty;
+
+    if (!(PFTy = dyn_cast<PointerType>($3.T->get())) ||
+        !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
+      // Pull out the types of all of the arguments...
+      std::vector<const Type*> ParamTypes;
+      if ($6) {
+        for (std::vector<ValueInfo>::iterator I = $6->begin(), E = $6->end();
+             I != E; ++I)
+          ParamTypes.push_back((*I).V->getType());
+      }
+      bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
+      if (isVarArg) ParamTypes.pop_back();
+      Ty = FunctionType::get($3.T->get(), ParamTypes, isVarArg);
+      PFTy = PointerType::get(Ty);
+    }
+    Value *V = getVal(PFTy, $4);   // Get the function we're calling...
+    BasicBlock *Normal = getBBVal($10);
+    BasicBlock *Except = getBBVal($13);
+
+    // Create the call node...
+    if (!$6) {                                   // Has no arguments?
+      $$ = new InvokeInst(V, Normal, Except, std::vector<Value*>());
+    } else {                                     // Has arguments?
+      // Loop through FunctionType's arguments and ensure they are specified
+      // correctly!
+      //
+      FunctionType::param_iterator I = Ty->param_begin();
+      FunctionType::param_iterator E = Ty->param_end();
+      std::vector<ValueInfo>::iterator ArgI = $6->begin(), ArgE = $6->end();
+
+      std::vector<Value*> Args;
+      for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
+        if ((*ArgI).V->getType() != *I)
+          error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
+                (*I)->getDescription() + "'");
+        Args.push_back((*ArgI).V);
+      }
+
+      if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
+        error("Invalid number of parameters detected");
+
+      $$ = new InvokeInst(V, Normal, Except, Args);
+    }
+    cast<InvokeInst>($$)->setCallingConv($2);
+    delete $3.T;
+    delete $6;
   }
   | Unwind {
-    *O << "    " << *$1 << '\n';
-    delete $1;
-    $$ = 0;
+    $$ = new UnwindInst();
   }
   | UNREACHABLE {
-    *O << "    " << *$1 << '\n';
-    delete $1;
-    $$ = 0;
-  };
+    $$ = new UnreachableInst();
+  }
+  ;
 
-JumpTable : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
-    *$1 += " " + $2->getNewTy() + " " + *$3 + ", " + $5->getNewTy() + " " + 
-           *$6->val;
-    delete $3; delete $6;
+JumpTable 
+  : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
     $$ = $1;
+    Constant *V = cast<Constant>(getExistingValue($2.T, $3));
+    
+    if (V == 0)
+      error("May only switch on a constant pool value");
+
+    BasicBlock* tmpBB = getBBVal($6);
+    $$->push_back(std::make_pair(V, tmpBB));
   }
   | IntType ConstValueRef ',' LABEL ValueRef {
-    $2->insert(0, $1->getNewTy() + " " );
-    *$2 += ", " + $4->getNewTy() + " " + *$5->val;
-    delete $5;
-    $$ = $2;
-  };
+    $$ = new std::vector<std::pair<Constant*, BasicBlock*> >();
+    Constant *V = cast<Constant>(getExistingValue($1.T, $2));
+
+    if (V == 0)
+      error("May only switch on a constant pool value");
+
+    BasicBlock* tmpBB = getBBVal($5);
+    $$->push_back(std::make_pair(V, tmpBB)); 
+  }
+  ;
 
 Inst 
   : OptAssign InstVal {
-    if (!$1->empty()) {
-      // Get a unique name for this value, based on its type.
-      std::string Name = getUniqueName($1, $2->type);
-      *$1 = Name + " = ";
-      if (deleteUselessCastFlag && *deleteUselessCastName == Name) {
-        // don't actually delete it, just comment it out
-        $1->insert(0, "; USELSS BITCAST: "); 
-        delete deleteUselessCastName;
-      }
+    bool omit = false;
+    if ($1)
+      if (BitCastInst *BCI = dyn_cast<BitCastInst>($2.I))
+        if (BCI->getSrcTy() == BCI->getDestTy() && 
+            BCI->getOperand(0)->getName() == $1)
+          // This is a useless bit cast causing a name redefinition. It is
+          // a bit cast from a type to the same type of an operand with the
+          // same name as the name we would give this instruction. Since this
+          // instruction results in no code generation, it is safe to omit
+          // the instruction. This situation can occur because of collapsed
+          // type planes. For example:
+          //   %X = add int %Y, %Z
+          //   %X = cast int %Y to uint
+          // After upgrade, this looks like:
+          //   %X = add i32 %Y, %Z
+          //   %X = bitcast i32 to i32
+          // The bitcast is clearly useless so we omit it.
+          omit = true;
+    if (omit) {
+      $$.I = 0;
+      $$.S = Signless;
+    } else {
+      setValueName($2.I, $1);
+      InsertValue($2.I);
+      $$ = $2;
     }
-    *$1 += *$2->val;
-    delete $2;
-    deleteUselessCastFlag = false;
-    $$ = $1; 
   };
 
-PHIList 
-  : Types '[' ValueRef ',' ValueRef ']' {    // Used for PHI nodes
-    std::string Name = getUniqueName($3->val, $1);
-    Name.insert(0, $1->getNewTy() + "[");
-    Name += "," + *$5->val + "]";
-    $$ = new Value;
-    $$->val = new std::string(Name);
-    $$->type = $1;
-    delete $3; delete $5;
+PHIList : Types '[' ValueRef ',' ValueRef ']' {    // Used for PHI nodes
+    $$.P = new std::list<std::pair<Value*, BasicBlock*> >();
+    $$.S = $1.S;
+    Value* tmpVal = getVal($1.T->get(), $3);
+    BasicBlock* tmpBB = getBBVal($5);
+    $$.P->push_back(std::make_pair(tmpVal, tmpBB));
+    delete $1.T;
   }
   | PHIList ',' '[' ValueRef ',' ValueRef ']' {
-    std::string Name = getUniqueName($4->val, $1->type);
-    *$1->val += ", [" + Name + "," + *$6->val + "]";
-    delete $4; 
-    delete $6;
     $$ = $1;
-  };
-
+    Value* tmpVal = getVal($1.P->front().first->getType(), $4);
+    BasicBlock* tmpBB = getBBVal($6);
+    $1.P->push_back(std::make_pair(tmpVal, tmpBB));
+  }
+  ;
 
-ValueRefList 
-  : ResolvedVal {
-    $$ = new ValueList();
+ValueRefList : ResolvedVal {    // Used for call statements, and memory insts...
+    $$ = new std::vector<ValueInfo>();
     $$->push_back($1);
   }
   | ValueRefList ',' ResolvedVal {
     $$ = $1;
-    $$->push_back($3);
+    $1->push_back($3);
   };
 
 // ValueRefListE - Just like ValueRefList, except that it may also be empty!
 ValueRefListE 
-  : ValueRefList  { $$ = $1; }
-  | /*empty*/ { $$ = new ValueList(); }
+  : ValueRefList 
+  | /*empty*/ { $$ = 0; }
   ;
 
 OptTailCall 
   : TAIL CALL {
-    *$1 += " " + *$2;
-    delete $2;
-    $$ = $1;
+    $$ = true;
+  }
+  | CALL {
+    $$ = false;
   }
-  | CALL 
   ;
 
-InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
-    const char* op = getDivRemOpcode(*$1, $2); 
-    std::string Name1 = getUniqueName($3->val, $2);
-    std::string Name2 = getUniqueName($5->val, $2);
-    $$ = $3;
-    delete $$->val;
-    $$->val = new std::string(op);
-    *$$->val += " " + $2->getNewTy() + " " + Name1 + ", " + Name2;
-    $$->type = $2;
-    delete $1; delete $5;
+InstVal 
+  : ArithmeticOps Types ValueRef ',' ValueRef {
+    const Type* Ty = $2.T->get();
+    if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa<PackedType>(Ty))
+      error("Arithmetic operator requires integer, FP, or packed operands");
+    if (isa<PackedType>(Ty) && 
+        ($1 == URemOp || $1 == SRemOp || $1 == FRemOp || $1 == RemOp))
+      error("Remainder not supported on packed types");
+    // Upgrade the opcode from obsolete versions before we do anything with it.
+    Instruction::BinaryOps Opcode = getBinaryOp($1, Ty, $2.S);
+    Value* val1 = getVal(Ty, $3); 
+    Value* val2 = getVal(Ty, $5);
+    $$.I = BinaryOperator::create(Opcode, val1, val2);
+    if ($$.I == 0)
+      error("binary operator returned null");
+    $$.S = $2.S;
+    delete $2.T;
   }
   | LogicalOps Types ValueRef ',' ValueRef {
-    std::string Name1 = getUniqueName($3->val, $2);
-    std::string Name2 = getUniqueName($5->val, $2);
-    *$1 += " " + $2->getNewTy() + " " + Name1 + ", " + Name2;
-    $$ = $3;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = $2;
-    delete $5;
+    const Type *Ty = $2.T->get();
+    if (!Ty->isInteger()) {
+      if (!isa<PackedType>(Ty) ||
+          !cast<PackedType>(Ty)->getElementType()->isInteger())
+        error("Logical operator requires integral operands");
+    }
+    Instruction::BinaryOps Opcode = getBinaryOp($1, Ty, $2.S);
+    Value* tmpVal1 = getVal(Ty, $3);
+    Value* tmpVal2 = getVal(Ty, $5);
+    $$.I = BinaryOperator::create(Opcode, tmpVal1, tmpVal2);
+    if ($$.I == 0)
+      error("binary operator returned null");
+    $$.S = $2.S;
+    delete $2.T;
   }
   | SetCondOps Types ValueRef ',' ValueRef {
-    std::string Name1 = getUniqueName($3->val, $2);
-    std::string Name2 = getUniqueName($5->val, $2);
-    *$1 = getCompareOp(*$1, $2);
-    *$1 += " " + $2->getNewTy() + " " + Name1 + ", " + Name2;
-    $$ = $3;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = Type::get("i1",BoolTy);
-    delete $5;
+    const Type* Ty = $2.T->get();
+    if(isa<PackedType>(Ty))
+      error("PackedTypes currently not supported in setcc instructions");
+    unsigned short pred;
+    Instruction::OtherOps Opcode = getCompareOp($1, pred, Ty, $2.S);
+    Value* tmpVal1 = getVal(Ty, $3);
+    Value* tmpVal2 = getVal(Ty, $5);
+    $$.I = CmpInst::create(Opcode, pred, tmpVal1, tmpVal2);
+    if ($$.I == 0)
+      error("binary operator returned null");
+    $$.S = Unsigned;
+    delete $2.T;
   }
   | ICMP IPredicates Types ValueRef ',' ValueRef {
-    std::string Name1 = getUniqueName($4->val, $3);
-    std::string Name2 = getUniqueName($6->val, $3);
-    *$1 += " " + *$2 + " " + $3->getNewTy() + " " + Name1 + "," + Name2;
-    $$ = $4;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = Type::get("i1",BoolTy);
-    delete $2; delete $6;
+    const Type *Ty = $3.T->get();
+    if (isa<PackedType>(Ty)) 
+      error("PackedTypes currently not supported in icmp instructions");
+    else if (!Ty->isInteger() && !isa<PointerType>(Ty))
+      error("icmp requires integer or pointer typed operands");
+    Value* tmpVal1 = getVal(Ty, $4);
+    Value* tmpVal2 = getVal(Ty, $6);
+    $$.I = new ICmpInst($2, tmpVal1, tmpVal2);
+    $$.S = Unsigned;
+    delete $3.T;
   }
   | FCMP FPredicates Types ValueRef ',' ValueRef {
-    std::string Name1 = getUniqueName($4->val, $3);
-    std::string Name2 = getUniqueName($6->val, $3);
-    *$1 += " " + *$2 + " " + $3->getNewTy() + " " + Name1 + "," + Name2;
-    $$ = $4;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = Type::get("i1",BoolTy);
-    delete $2; delete $6;
+    const Type *Ty = $3.T->get();
+    if (isa<PackedType>(Ty))
+      error("PackedTypes currently not supported in fcmp instructions");
+    else if (!Ty->isFloatingPoint())
+      error("fcmp instruction requires floating point operands");
+    Value* tmpVal1 = getVal(Ty, $4);
+    Value* tmpVal2 = getVal(Ty, $6);
+    $$.I = new FCmpInst($2, tmpVal1, tmpVal2);
+    $$.S = Unsigned;
+    delete $3.T;
+  }
+  | NOT ResolvedVal {
+    warning("Use of obsolete 'not' instruction: Replacing with 'xor");
+    const Type *Ty = $2.V->getType();
+    Value *Ones = ConstantInt::getAllOnesValue(Ty);
+    if (Ones == 0)
+      error("Expected integral type for not instruction");
+    $$.I = BinaryOperator::create(Instruction::Xor, $2.V, Ones);
+    if ($$.I == 0)
+      error("Could not create a xor instruction");
+    $$.S = $2.S
   }
   | ShiftOps ResolvedVal ',' ResolvedVal {
-    const char* shiftop = $1->c_str();
-    if (*$1 == "shr")
-      shiftop = ($2->type->isUnsigned()) ? "lshr" : "ashr";
-    std::string *val = new std::string(shiftop);
-    *val += " " + *$2->val + ", " + *$4->val;
-    $$ = $2;
-    delete $$->val;
-    $$->val = val;
-    delete $1; delete $4;
+    if (!$4.V->getType()->isInteger() ||
+        cast<IntegerType>($4.V->getType())->getBitWidth() != 8)
+      error("Shift amount must be int8");
+    if (!$2.V->getType()->isInteger())
+      error("Shift constant expression requires integer operand");
+    $$.I = new ShiftInst(getOtherOp($1, $2.S), $2.V, $4.V);
+    $$.S = $2.S;
   }
   | CastOps ResolvedVal TO Types {
-    std::string source = *$2->val;
-    const Type* SrcTy = $2->type->resolve();
-    const Type* DstTy = $4->resolve();
-    $$ = $2;
-    delete $$->val;
-    $$->val = new std::string();
-    $$->type = DstTy;
-    if (*$1 == "cast") {
-      *$$->val += getCastUpgrade(source, SrcTy, DstTy, false);
-    } else {
-      *$$->val += *$1 + " " + source + " to " + DstTy->getNewTy();
-    }
-    // Check to see if this is a useless cast of a value to the same name
-    // and the same type. Such casts will probably cause redefinition errors
-    // when assembled and perform no code gen action so just remove them.
-    if (*$1 == "cast" || *$1 == "bitcast")
-      if (SrcTy->isInteger() && DstTy->isInteger() &&
-          SrcTy->getBitWidth() == DstTy->getBitWidth()) {
-        deleteUselessCastFlag = true; // Flag the "Inst" rule
-        deleteUselessCastName = new std::string(*$2->val); // save the name
-        size_t pos = deleteUselessCastName->find_first_of("%\"",0);
-        if (pos != std::string::npos) {
-          // remove the type portion before val
-          deleteUselessCastName->erase(0, pos);
-        }
-      }
-    delete $1; 
-    delete $3;
+    const Type *DstTy = $4.T->get();
+    if (!DstTy->isFirstClassType())
+      error("cast instruction to a non-primitive type: '" +
+            DstTy->getDescription() + "'");
+    $$.I = cast<Instruction>(getCast($1, $2.V, $2.S, DstTy, $4.S, true));
+    $$.S = $4.S;
+    delete $4.T;
   }
   | SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
-    *$1 += " " + *$2->val + ", " + *$4->val + ", " + *$6->val;
-    $$ = $2;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = $4->type;
-    delete $4;
-    delete $6;
+    if (!$2.V->getType()->isInteger() ||
+        cast<IntegerType>($2.V->getType())->getBitWidth() != 1)
+      error("select condition must be bool");
+    if ($4.V->getType() != $6.V->getType())
+      error("select value types should match");
+    $$.I = new SelectInst($2.V, $4.V, $6.V);
+    $$.S = $2.S;
   }
   | VAARG ResolvedVal ',' Types {
-    *$1 += " " + *$2->val + ", " + $4->getNewTy();
-    $$ = $2;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = $4;
+    const Type *Ty = $4.T->get();
+    NewVarArgs = true;
+    $$.I = new VAArgInst($2.V, Ty);
+    $$.S = $4.S;
+    delete $4.T;
+  }
+  | VAARG_old ResolvedVal ',' Types {
+    const Type* ArgTy = $2.V->getType();
+    const Type* DstTy = $4.T->get();
+    ObsoleteVarArgs = true;
+    Function* NF = cast<Function>(CurModule.CurrentModule->
+      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+
+    //b = vaarg a, t -> 
+    //foo = alloca 1 of t
+    //bar = vacopy a 
+    //store bar -> foo
+    //b = vaarg foo, t
+    AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix");
+    CurBB->getInstList().push_back(foo);
+    CallInst* bar = new CallInst(NF, $2.V);
+    CurBB->getInstList().push_back(bar);
+    CurBB->getInstList().push_back(new StoreInst(bar, foo));
+    $$.I = new VAArgInst(foo, DstTy);
+    $$.S = $4.S;
+    delete $4.T;
+  }
+  | VANEXT_old ResolvedVal ',' Types {
+    const Type* ArgTy = $2.V->getType();
+    const Type* DstTy = $4.T->get();
+    ObsoleteVarArgs = true;
+    Function* NF = cast<Function>(CurModule.CurrentModule->
+      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+
+    //b = vanext a, t ->
+    //foo = alloca 1 of t
+    //bar = vacopy a
+    //store bar -> foo
+    //tmp = vaarg foo, t
+    //b = load foo
+    AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix");
+    CurBB->getInstList().push_back(foo);
+    CallInst* bar = new CallInst(NF, $2.V);
+    CurBB->getInstList().push_back(bar);
+    CurBB->getInstList().push_back(new StoreInst(bar, foo));
+    Instruction* tmp = new VAArgInst(foo, DstTy);
+    CurBB->getInstList().push_back(tmp);
+    $$.I = new LoadInst(foo);
+    $$.S = $4.S;
+    delete $4.T;
   }
   | EXTRACTELEMENT ResolvedVal ',' ResolvedVal {
-    *$1 += " " + *$2->val + ", " + *$4->val;
-    $$ = $2;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = $$->type->resolve();
-    $$->type = $$->type->getElementType();
-    delete $4;
+    if (!ExtractElementInst::isValidOperands($2.V, $4.V))
+      error("Invalid extractelement operands");
+    $$.I = new ExtractElementInst($2.V, $4.V);
+    $$.S = $2.S;
   }
   | INSERTELEMENT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
-    *$1 += " " + *$2->val + ", " + *$4->val + ", " + *$6->val;
-    $$ = $2;
-    delete $$->val;
-    $$->val = $1;
-    delete $4; delete $6;
+    if (!InsertElementInst::isValidOperands($2.V, $4.V, $6.V))
+      error("Invalid insertelement operands");
+    $$.I = new InsertElementInst($2.V, $4.V, $6.V);
+    $$.S = $2.S;
   }
   | SHUFFLEVECTOR ResolvedVal ',' ResolvedVal ',' ResolvedVal {
-    *$1 += " " + *$2->val + ", " + *$4->val + ", " + *$6->val;
-    $$ = $2;
-    delete $$->val;
-    $$->val = $1;
-    delete $4; delete $6;
+    if (!ShuffleVectorInst::isValidOperands($2.V, $4.V, $6.V))
+      error("Invalid shufflevector operands");
+    $$.I = new ShuffleVectorInst($2.V, $4.V, $6.V);
+    $$.S = $2.S;
   }
   | PHI_TOK PHIList {
-    *$1 += " " + *$2->val;
-    $$ = $2;
-    delete $2->val;
-    $$->val = $1;
+    const Type *Ty = $2.P->front().first->getType();
+    if (!Ty->isFirstClassType())
+      error("PHI node operands must be of first class type");
+    PHINode *PHI = new PHINode(Ty);
+    PHI->reserveOperandSpace($2.P->size());
+    while ($2.P->begin() != $2.P->end()) {
+      if ($2.P->front().first->getType() != Ty) 
+        error("All elements of a PHI node must be of the same type");
+      PHI->addIncoming($2.P->front().first, $2.P->front().second);
+      $2.P->pop_front();
+    }
+    $$.I = PHI;
+    $$.S = $2.S;
+    delete $2.P;  // Free the list...
   }
   | OptTailCall OptCallingConv TypesV ValueRef '(' ValueRefListE ')'  {
-    // map llvm.isunordered to "fcmp uno" 
-    $$ = new Value;
-    if (*$4->val == "%llvm.isunordered.f32" ||
-        *$4->val == "%llvm.isunordered.f64") {
-      $$->val = new std::string( "fcmp uno " + *(*$6)[0]->val + ", ");
-      size_t pos = (*$6)[1]->val->find(' ');
-      assert(pos != std::string::npos && "no space?");
-      *$$->val += (*$6)[1]->val->substr(pos+1);
-      $$->type = Type::get("i1", BoolTy);
+
+    // Handle the short call syntax
+    const PointerType *PFTy;
+    const FunctionType *FTy;
+    if (!(PFTy = dyn_cast<PointerType>($3.T->get())) ||
+        !(FTy = dyn_cast<FunctionType>(PFTy->getElementType()))) {
+      // Pull out the types of all of the arguments...
+      std::vector<const Type*> ParamTypes;
+      if ($6) {
+        for (std::vector<ValueInfo>::iterator I = $6->begin(), E = $6->end();
+             I != E; ++I)
+          ParamTypes.push_back((*I).V->getType());
+      }
+
+      bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
+      if (isVarArg) ParamTypes.pop_back();
+
+      const Type *RetTy = $3.T->get();
+      if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
+        error("Functions cannot return aggregate types");
+
+      FTy = FunctionType::get(RetTy, ParamTypes, isVarArg);
+      PFTy = PointerType::get(FTy);
+    }
+
+    // First upgrade any intrinsic calls.
+    std::vector<Value*> Args;
+    if ($6)
+      for (unsigned i = 0, e = $6->size(); i < e; ++i) 
+        Args.push_back((*$6)[i].V);
+    Instruction *Inst = upgradeIntrinsicCall(FTy, $4, Args);
+
+    // If we got an upgraded intrinsic
+    if (Inst) {
+      $$.I = Inst;
+      $$.S = Signless;
     } else {
-      static unsigned upgradeCount = 1;
-      if (*$4->val == "%llvm.va_start" || *$4->val == "%llvm.va_end") {
-        if (!$6->empty()) {
-          std::string name("%va_upgrade");
-          name += llvm::utostr(upgradeCount++);
-          $1->insert(0, name + " = bitcast " + *(*$6)[0]->val + " to i8*\n    ");
-          *(*$6)[0]->val = "i8* " + name;
-          (*$6)[0]->type = Type::get("i8", UByteTy)->getPointerType();
-        }
-      } else if (*$4->val == "%llvm.va_copy") {
-        std::string name0("%va_upgrade");
-        name0 += llvm::utostr(upgradeCount++);
-        std::string name1("%va_upgrade");
-        name1 += llvm::utostr(upgradeCount++);
-        $1->insert(0, name0 + " = bitcast " + *(*$6)[0]->val + " to i8*\n    " +
-                      name1 + " = bitcast " + *(*$6)[1]->val + " to i8*\n    ");
-        *(*$6)[0]->val = "i8* " + name0;
-        (*$6)[0]->type = Type::get("i8", UByteTy)->getPointerType();
-        *(*$6)[1]->val = "i8* " + name1;
-        (*$6)[0]->type = Type::get("i8", UByteTy)->getPointerType();
-      }
-      if (!$2->empty())
-        *$1 += " " + *$2;
-      if (!$1->empty())
-        *$1 += " ";
-      *$1 += $3->getNewTy() + " " + *$4->val + "(";
-      for (unsigned i = 0; i < $6->size(); ++i) {
-        Value* V = (*$6)[i];
-        *$1 += *V->val;
-        if (i+1 < $6->size())
-          *$1 += ", ";
-        delete V;
+      // Get the function we're calling
+      Value *V = getVal(PFTy, $4);
+
+      // Check the argument values match
+      if (!$6) {                                   // Has no arguments?
+        // Make sure no arguments is a good thing!
+        if (FTy->getNumParams() != 0)
+          error("No arguments passed to a function that expects arguments");
+      } else {                                     // Has arguments?
+        // Loop through FunctionType's arguments and ensure they are specified
+        // correctly!
+        //
+        FunctionType::param_iterator I = FTy->param_begin();
+        FunctionType::param_iterator E = FTy->param_end();
+        std::vector<ValueInfo>::iterator ArgI = $6->begin(), ArgE = $6->end();
+
+        for (; ArgI != ArgE && I != E; ++ArgI, ++I)
+          if ((*ArgI).V->getType() != *I)
+            error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
+                  (*I)->getDescription() + "'");
+
+        if (I != E || (ArgI != ArgE && !FTy->isVarArg()))
+          error("Invalid number of parameters detected");
       }
-      *$1 += ")";
-      $$ = new Value;
-      $$->val = $1;
-      $$->type = getFunctionReturnType($3);
+
+      // Create the call instruction
+      CallInst *CI = new CallInst(V, Args);
+      CI->setTailCall($1);
+      CI->setCallingConv($2);
+      $$.I = CI;
+      $$.S = $3.S;
     }
-    delete $2; delete $4; delete $6;
+    delete $3.T;
+    delete $6;
+  }
+  | MemoryInst {
+    $$ = $1;
   }
-  | MemoryInst ;
+  ;
 
 
 // IndexList - List of indices for GEP based instructions...
 IndexList 
-  : ',' ValueRefList { $$ = $2; }
-  | /* empty */ {  $$ = new ValueList(); }
+  : ',' ValueRefList { $$ = $2; } 
+  | /* empty */ { $$ = new std::vector<ValueInfo>(); }
   ;
 
 OptVolatile 
-  : VOLATILE 
-  | /* empty */ { $$ = new std::string(); }
+  : VOLATILE { $$ = true; }
+  | /* empty */ { $$ = false; }
   ;
 
-MemoryInst : MALLOC Types OptCAlign {
-    *$1 += " " + $2->getNewTy();
-    if (!$3->empty())
-      *$1 += " " + *$3;
-    $$ = new Value;
-    $$->val = $1;
-    $$->type = $2->getPointerType();
-    delete $3;
+MemoryInst 
+  : MALLOC Types OptCAlign {
+    const Type *Ty = $2.T->get();
+    $$.S = $2.S;
+    $$.I = new MallocInst(Ty, 0, $3);
+    delete $2.T;
   }
   | MALLOC Types ',' UINT ValueRef OptCAlign {
-    std::string Name = getUniqueName($5->val, $4);
-    *$1 += " " + $2->getNewTy() + ", " + $4->getNewTy() + " " + Name;
-    if (!$6->empty())
-      *$1 += " " + *$6;
-    $$ = new Value;
-    $$->val = $1;
-    $$->type = $2->getPointerType();
-    delete $5; delete $6;
+    const Type *Ty = $2.T->get();
+    $$.S = $2.S;
+    $$.I = new MallocInst(Ty, getVal($4.T, $5), $6);
+    delete $2.T;
   }
   | ALLOCA Types OptCAlign {
-    *$1 += " " + $2->getNewTy();
-    if (!$3->empty())
-      *$1 += " " + *$3;
-    $$ = new Value;
-    $$->val = $1;
-    $$->type = $2->getPointerType();
-    delete $3;
+    const Type *Ty = $2.T->get();
+    $$.S = $2.S;
+    $$.I = new AllocaInst(Ty, 0, $3);
+    delete $2.T;
   }
   | ALLOCA Types ',' UINT ValueRef OptCAlign {
-    std::string Name = getUniqueName($5->val, $4);
-    *$1 += " " + $2->getNewTy() + ", " + $4->getNewTy() + " " + Name;
-    if (!$6->empty())
-      *$1 += " " + *$6;
-    $$ = $5;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = $2->getPointerType();
-    delete $6;
+    const Type *Ty = $2.T->get();
+    $$.S = $2.S;
+    $$.I = new AllocaInst(Ty, getVal($4.T, $5), $6);
+    delete $2.T;
   }
   | FREE ResolvedVal {
-    *$1 += " " + *$2->val;
-    $$ = $2;
-    delete $2->val;
-    $$->val = $1;
-    $$->type = Type::get("void", VoidTy); 
+    const Type *PTy = $2.V->getType();
+    if (!isa<PointerType>(PTy))
+      error("Trying to free nonpointer type '" + PTy->getDescription() + "'");
+    $$.I = new FreeInst($2.V);
+    $$.S = Signless;
   }
   | OptVolatile LOAD Types ValueRef {
-    std::string Name = getUniqueName($4->val, $3);
-    if (!$1->empty())
-      *$1 += " ";
-    *$1 += *$2 + " " + $3->getNewTy() + " " + Name;
-    $$ = $4;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = $3->getElementType();
-    delete $2;
+    const Type* Ty = $3.T->get();
+    $$.S = $3.S;
+    if (!isa<PointerType>(Ty))
+      error("Can't load from nonpointer type: " + Ty->getDescription());
+    if (!cast<PointerType>(Ty)->getElementType()->isFirstClassType())
+      error("Can't load from pointer of non-first-class type: " +
+                     Ty->getDescription());
+    Value* tmpVal = getVal(Ty, $4);
+    $$.I = new LoadInst(tmpVal, "", $1);
+    delete $3.T;
   }
   | OptVolatile STORE ResolvedVal ',' Types ValueRef {
-    std::string Name = getUniqueName($6->val, $5);
-    if (!$1->empty())
-      *$1 += " ";
-    *$1 += *$2 + " " + *$3->val + ", " + $5->getNewTy() + " " + Name;
-    $$ = $3;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = Type::get("void", VoidTy);
-    delete $2; delete $6;
+    const PointerType *PTy = dyn_cast<PointerType>($5.T->get());
+    if (!PTy)
+      error("Can't store to a nonpointer type: " + 
+             $5.T->get()->getDescription());
+    const Type *ElTy = PTy->getElementType();
+    if (ElTy != $3.V->getType())
+      error("Can't store '" + $3.V->getType()->getDescription() +
+            "' into space of type '" + ElTy->getDescription() + "'");
+    Value* tmpVal = getVal(PTy, $6);
+    $$.I = new StoreInst($3.V, tmpVal, $1);
+    $$.S = Signless;
+    delete $5.T;
   }
   | GETELEMENTPTR Types ValueRef IndexList {
-    std::string Name = getUniqueName($3->val, $2);
-    // Upgrade the indices
-    for (unsigned i = 0; i < $4->size(); ++i) {
-      Value* V = (*$4)[i];
-      if (V->type->isUnsigned() && !V->isConstant() && 
-          V->type->getBitWidth() < 64) {
-        *O << "    %gep_upgrade" << UniqueNameCounter << " = zext " << *V->val 
-           << " to i64\n";
-        *V->val = "i64 %gep_upgrade" + llvm::utostr(UniqueNameCounter++);
-        V->type = Type::get("i64",ULongTy);
-      }
-    }
-    *$1 += " " + $2->getNewTy() + " " + Name;
-    for (unsigned i = 0; i < $4->size(); ++i) {
-      Value* V = (*$4)[i];
-      *$1 += ", " + *V->val;
-    }
-    $$ = $3;
-    delete $$->val;
-    $$->val = $1;
-    $$->type = getGEPIndexedType($2,$4); 
-    for (unsigned i = 0; i < $4->size(); ++i)
-      delete (*$4)[i];
+    const Type* Ty = $2.T->get();
+    if (!isa<PointerType>(Ty))
+      error("getelementptr insn requires pointer operand");
+
+    std::vector<Value*> VIndices;
+    upgradeGEPIndices(Ty, $4, VIndices);
+
+    Value* tmpVal = getVal(Ty, $3);
+    $$.I = new GetElementPtrInst(tmpVal, VIndices);
+    $$.S = Signless;
+    delete $2.T;
     delete $4;
   };
 
+
 %%
 
 int yyerror(const char *ErrorMsg) {
   std::string where 
     = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
-                  + ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
-  std::string errMsg = where + "error: " + std::string(ErrorMsg) + 
-                       " while reading ";
-  if (yychar == YYEMPTY || yychar == 0)
-    errMsg += "end-of-file.";
-  else
-    errMsg += "token: '" + std::string(Upgradetext, Upgradeleng) + "'";
+                  + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": ";
+  std::string errMsg = where + "error: " + std::string(ErrorMsg);
+  if (yychar != YYEMPTY && yychar != 0)
+    errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
+              "'.";
   std::cerr << "llvm-upgrade: " << errMsg << '\n';
-  *O << "llvm-upgrade parse failed.\n";
+  std::cout << "llvm-upgrade: parse failed.\n";
   exit(1);
 }
 
 void warning(const std::string& ErrorMsg) {
   std::string where 
     = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
-                  + ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
-  std::string errMsg = where + "warning: " + std::string(ErrorMsg) + 
-                       " while reading ";
-  if (yychar == YYEMPTY || yychar == 0)
-    errMsg += "end-of-file.";
-  else
-    errMsg += "token: '" + std::string(Upgradetext, Upgradeleng) + "'";
+                  + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": ";
+  std::string errMsg = where + "warning: " + std::string(ErrorMsg);
+  if (yychar != YYEMPTY && yychar != 0)
+    errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
+              "'.";
   std::cerr << "llvm-upgrade: " << errMsg << '\n';
 }
+
+void error(const std::string& ErrorMsg, int LineNo) {
+  if (LineNo == -1) LineNo = Upgradelineno;
+  Upgradelineno = LineNo;
+  yyerror(ErrorMsg.c_str());
+}
+


Index: llvm/tools/llvm-upgrade/llvm-upgrade.cpp
diff -u llvm/tools/llvm-upgrade/llvm-upgrade.cpp:1.7 llvm/tools/llvm-upgrade/llvm-upgrade.cpp:1.8
--- llvm/tools/llvm-upgrade/llvm-upgrade.cpp:1.7	Fri Jan  5 11:19:32 2007
+++ llvm/tools/llvm-upgrade/llvm-upgrade.cpp	Fri Jan 26 02:19:09 2007
@@ -20,6 +20,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "UpgradeInternals.h"
+#include "llvm/Module.h"
+#include "llvm/Bytecode/Writer.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/Streams.h"
@@ -45,7 +47,11 @@
          cl::init(false));
 
 static cl::opt<bool>
-Debug("debug", cl::desc("Print debug output from yacc parser"),cl::Hidden,
+Debug("debug-upgrade-yacc", cl::desc("Print debug output from yacc parser"),
+      cl::Hidden, cl::init(false));
+
+static cl::opt<bool>
+EmitByteCode("emit-bytecode", cl::desc("Emit bytecode instead of assembly"),
     cl::init(false));
 
 int main(int argc, char **argv) {
@@ -119,7 +125,20 @@
       return 1;
     }
 
-    UpgradeAssembly(InputFilename, *In, *Out, Debug, AddAttrs);
+    Module *M = UpgradeAssembly(InputFilename, *In, Debug, AddAttrs);
+    if (!M) {
+      cerr << argv[0] << ": No module returned from assembly parsing\n";
+      if (!EmitByteCode)
+        *Out << argv[0] << ": parse failed.";
+      exit(1);
+    }
+
+    // Finally, print the module on the output stream.
+    if (EmitByteCode) {
+      OStream OS(*Out);
+      WriteBytecodeToFile(M, OS);
+    } else
+      M->print(Out);
 
   } catch (const std::string& caught_message) {
     cerr << argv[0] << ": " << caught_message << "\n";






More information about the llvm-commits mailing list