Regenerate.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33532 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/llvm-upgrade/UpgradeParser.cpp.cvs b/tools/llvm-upgrade/UpgradeParser.cpp.cvs
index b65ac10..acaeade 100644
--- a/tools/llvm-upgrade/UpgradeParser.cpp.cvs
+++ b/tools/llvm-upgrade/UpgradeParser.cpp.cvs
@@ -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;
 
+int yyerror(const char*);
+static void warning(const std::string& WarningMsg);
+
+namespace llvm {
+
+
+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 );
+}
+
+SignedType::SignedType(const IntegerType* ITy) 
+  : IntegerType(ITy->getBitWidth()), base_type(ITy)
+{
+}
+
+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;
+}
+
+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;
-static std::ostream *O = 0;
-std::istream* LexInput = 0;
-unsigned SizeOfPointer = 32;
-
 
 // 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);
+static Module *ParserResult;
+static bool ObsoleteVarArgs;
+static bool NewVarArgs;
+static BasicBlock *CurBB;
+static GlobalVariable *CurGV;
 
-void UpgradeAssembly(const std::string &infile, std::istream& in, 
-                     std::ostream &out, bool debug, bool addAttrs)
+
+
+// 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;
+    }
+
+    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);
+    }
+
+    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;    
+  }
+
+  inline void FunctionStart(Function *M) {
+    CurrentFunction = M;
+    NextBBNum = 0;
+  }
+
+  void FunctionDone() {
+    NumberedBlocks.clear();
+
+    // Any forward referenced blocks left?
+    if (!BBForwardRefs.empty()) {
+      error("Undefined reference to label " + 
+            BBForwardRefs.begin()->first->getName());
+      return;
+    }
+
+    // Resolve all forward references now.
+    ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
+
+    Values.clear();         // Clear out function local definitions
+    RenameMap.clear();
+    SignedValues.clear();
+    CurrentFunction = 0;
+    isDeclare = false;
+    Linkage = GlobalValue::ExternalLinkage;
+  }
+} CurFun;  // Info for the current function...
+
+static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }
+
+
+//===----------------------------------------------------------------------===//
+//               Code to handle definitions of all the types
+//===----------------------------------------------------------------------===//
+
+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;
+  }
+
+  // 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?
+
+
+  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;
+    }
+  }
+
+  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;
+  }
+
+  // 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);
+
+  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
+
+  assert(0 && "Unhandled case");
+  return 0;
+}
+
+// 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)));
+
+  if (inFunctionScope())
+    InsertValue(V, CurFun.LateResolveValues);
+  else
+    InsertValue(V, CurModule.LateResolveValues);
+  return V;
+}
+
+/// 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;
+  }
+
+  // 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);
+  }
+  ID.destroy();
+  return BB;
+}
+
+
+//===----------------------------------------------------------------------===//
+//              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;
+        }
+      }
+    }
+  }
+
+  LateResolvers.clear();
+}
+
+// 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);
+  }
+}
+
+static std::string makeNameUnique(const std::string& Name) {
+  static unsigned UniqueNameCounter = 1;
+  std::string Result(Name);
+  Result += ".upgrd." + llvm::utostr(UniqueNameCounter++);
+  return Result;
+}
+
+// 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;
+      }
+    }
+    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);
+  }
+}
+
+/// 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");
+      }
+
+      // 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;
+    }
+  }
+
+  // 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;
+}
+
+// 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;
+}
+
+//===----------------------------------------------------------------------===//
+// 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...
+      }
+    }
+  }
+
+  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
+          predicate = ICmpInst::ICMP_ULE;
+        return Instruction::ICmp;
+      }
+    case SetGE  : 
+      if (isFP) {
+        predicate = FCmpInst::FCMP_OGE;
+        return Instruction::FCmp;
+      } else {
+        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;
+      }
+  }
+}
+
+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;
+  }
+}
+
+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;
+  };
+}
+
+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);
+    }
+  }
+  return 0;
+}
+
+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;
+}
+
+Module* UpgradeAssembly(const std::string &infile, std::istream& in, 
+                              bool debug, bool addAttrs)
 {
   Upgradelineno = 1; 
   CurFilename = infile;
   LexInput = &in;
   yydebug = debug;
   AddAttributes = addAttrs;
-  O = &out;
+  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";
-    out << "llvm-upgrade: parse failed.\n";
-    exit(1);
-  }
-}
-
-namespace { // Anonymous namespace to keep our implementation local
-
-
-/// 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 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);
-
-  static const Type* get(const std::string& newType, const Type* resTy, 
-                             TypeList* TL);
-
-  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;
-
-  TypeIDs getElementTy() const {
-    if (elemTy) {
-      return elemTy->oldTy;
-    }
-    return UnresolvedTy;
-  }
-
-  unsigned getUpRefNum() const {
-    assert(oldTy == UpRefTy && "Can't getUpRefNum on non upreference");
-    return atoi(&((getNewTy().c_str())[1])); // skip the slash
-  }
-
-  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; }
-
-  const Type* getPointerType() const {
-    return get(newTy + "*", PointerTy, this, (Type*)0);
-  }
-
-  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;
-  }
-
-  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();
-  }
-
-  bool isAttributeCandidate() const {
-    return isIntegral() && getBitWidth() < 32;
-  }
-
-  bool isUnresolvedDeep() const;
-
-  unsigned getBitWidth() const;
-
-  const Type* getIndexedType(const Value*  V) const;
-
-  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;
   }
 
-private:
-  Type() 
-    : newTy(), oldTy(UnresolvedTy), elemTy(0), resultTy(0), elements(0),
-      nelems(0) {
+  // Check to make sure that parsing produced a result
+  if (!ParserResult) {
+    std::cerr << "llvm-upgrade: no parse result.\n";
+    return 0;
   }
 
-  Type(const Type& that); // do not implement
-  Type& operator=(const Type& that); // do not implement
+  // Reset ParserResult variable while saving its value for the result.
+  Module *Result = ParserResult;
+  ParserResult = 0;
 
-  ~Type() { delete elements; }
-
-  struct ltfunctor
+  //Not all functions use vaarg, so make a second check for ObsoleteVarArgs
   {
-    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;
-    }
-  };
-
-  typedef std::set<const Type*, ltfunctor> TypeRegMap;
-
-  static const Type* add_new_type(Type* existing);
-
-  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());
-      }
-    }
+    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;
   }
-  // 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 (ObsoleteVarArgs && NewVarArgs) {
+    error("This file is corrupt: it uses both new and old style varargs");
+    return 0;
   }
-  return false; 
-}
 
-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
-  }
-  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;
-  }
-}
-
-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;
-    }
-  }
-}
-
-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");
+  if(ObsoleteVarArgs) {
+    if(Function* F = Result->getNamedFunction("llvm.va_start")) {
+      if (F->arg_size() != 0) {
+        error("Obsolete va_start takes 0 argument");
         return 0;
       }
-    } else {
-      yyerror("Structure requires constant index");
-      return 0;
-    }
-  }
-  if (isArray() || isPacked() || isPointer())
-    return elemTy;
-  yyerror("Invalid type for getIndexedType");
-  return 0;
-}
+      
+      //foo = va_start()
+      // ->
+      //bar = alloca typeof(foo)
+      //va_start(bar)
+      //foo = load bar
 
-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);
+      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);
       }
-      return;
+      Result->getFunctionList().erase(F);
     }
-    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;
-    }
-  }
-}
-
-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;
-}
-
-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);
+    
+    if(Function* F = Result->getNamedFunction("llvm.va_end")) {
+      if(F->arg_size() != 1) {
+        error("Obsolete va_end takes 1 argument");
+        return 0;
       }
-      break;
-    }
-    default:
-      assert(0 && "Invalid Type");
-      break;
-  }
 
-  if (sNum == 0 && uNum == 0)
-    return BaseName;
+      //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));
 
-  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;
-  }
-  return *this;
-}
-
-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;
-
-
-
-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
-        else
-          opcode = "zext";                         // unsigned -> ZEXT
-      } else {
-        opcode = "bitcast";                        // Same size, No-op cast
+      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);
       }
-    } 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
+      Result->getFunctionList().erase(F);
     }
-  } 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
+
+    if(Function* F = Result->getNamedFunction("llvm.va_copy")) {
+      if(F->arg_size() != 1) {
+        error("Obsolete va_copy takes 1 argument");
+        return 0;
       }
-    } 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;
-}
+      //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));
 
-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
-  }
-  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;
-}
-
-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);
-    }
-  } else if (Result->isUpReference()) {
-    Result = ResolveUpReference(Result->getElementType(), &stack);
-  }
-  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;
+      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);
     }
   }
 
-  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;
-  }
-
-  // Default the result to the current name
-  std::string Result = Ty->makeUniqueName(*Name);
-
   return Result;
 }
 
-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.
-      }
-    }
-  }
+} // end llvm namespace
 
-  // 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;
-  }
-
-  // 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
-
-// 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
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+#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
 
-#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
-#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)
-# else
-#  if defined (__STDC__) || defined (__cplusplus)
-#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#   define YYSIZE_T size_t
+#  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
-#  define YYSTACK_ALLOC malloc
-#  define YYSTACK_FREE free
+# else
+#  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
 # 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,   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,   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,     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
+       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,
+     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,   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,     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,    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,
-       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
+     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,     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,
-      -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,    -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,
-      -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,   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,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   121,   122,   123,    -1,    -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,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149
+     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,    -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,
+     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,    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,   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.  */
+  /* Not known => get a look-ahead token if don't already have one.  */
 
-  /* yychar is either YYEMPTY or YYEOF
-     or a valid token in external form.  */
-
+  /* 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();
+    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;
     }
-    newTy += ")";
-    yyval.Ty = Type::get(newTy, yyvsp[-3].Ty, yyvsp[-1].TypeVec);
-  }
+    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();
+    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;
     }
-    newTy += "}>";
-    yyval.Ty = Type::get(newTy, PackedStructTy, yyvsp[-2].TypeVec);
-  }
+    (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 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 1464 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-}
+#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 << " = ";
+    // 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);
     }
-    *O << "type " << yyvsp[0].Ty->getNewTy() << '\n';
-    delete yyvsp[-2].String; delete yyvsp[-1].String;
-    yyval.String = 0;
-  }
+    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 197:
+#line 2463 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+  ;}
     break;
 
   case 198:
-#line 1571 "/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 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 204:
+#line 2500 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal));
+    free((yyvsp[0].StrVal));
+  ;}
     break;
 
   case 205:
-#line 1608 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2504 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
     {
-    yyval.String = new std::string();
-  }
+    CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal));
+    free((yyvsp[0].StrVal));
+  ;}
+    break;
+
+  case 207:
+#line 2515 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+      CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
+      free((yyvsp[0].StrVal));
+  ;}
+    break;
+
+  case 208:
+#line 2519 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
+    free((yyvsp[0].StrVal));
+  ;}
     break;
 
   case 209:
-#line 1617 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
-    break;
-
-  case 210:
-#line 1619 "/usr/home/jeffc/llvm/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;
-}
-    break;
-
-  case 211:
-#line 1628 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    *yyvsp[-2].String += ", " + *yyvsp[0].String;
-    delete yyvsp[0].String;
-  }
-    break;
-
-  case 212:
-#line 1632 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    {
-    yyval.String = yyvsp[0].String;
-  }
+#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; }
-    break;
-
-  case 222:
-#line 1690 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string("}"); }
-    break;
-
-  case 223:
-#line 1692 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2580 "/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;
-}
+    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 1701 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+#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 1707 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { isDeclare = 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;
-  }
+#line 2704 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+  ;}
     break;
 
   case 229:
-#line 1721 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-    { yyval.String = new std::string(); }
+#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 231:
+#line 2715 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { CurFun.isDeclare = true; ;}
+    break;
+
+  case 232:
+#line 2715 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {
+    (yyval.FunctionVal) = CurFun.CurrentFunction;
+    CurFun.FunctionDone();
+    
+  ;}
+    break;
+
+  case 233:
+#line 2727 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.BoolVal) = false; ;}
+    break;
+
+  case 234:
+#line 2728 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.BoolVal) = true; ;}
+    break;
+
+  case 235:
+#line 2733 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+    {    (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); ;}
+    break;
+
+  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;
+#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);
     }
-    *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;
-  }
+    (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"
+  case 274:
+#line 3022 "/proj/llvm/llvm-1/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;
-  }
+    (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;
 
-	  yycount = 0;
+#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;
+
 	  /* 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++)
-	    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)
-	    {
-	      char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
-	      yyp = yystpcpy (yyp, yytname[yytype]);
+	  int yyxbegin = yyn < 0 ? -yyn : 0;
 
-	      if (yycount < 5)
+	  /* 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)
+	      {
+		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)
+	    {
+	      /* 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"));
     }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse look-ahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+        {
+	  /* Return failure if at end of input.  */
+	  if (yychar == YYEOF)
+	    YYABORT;
+        }
+      else
+	{
+	  yydestruct ("Error: discarding", yytoken, &yylval);
+	  yychar = YYEMPTY;
+	}
+    }
+
+  /* Else will try to reuse look-ahead token after shifting the error
+     token.  */
   goto yyerrlab1;
 
 
-/*----------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action.  |
-`----------------------------------------------------*/
+/*---------------------------------------------------.
+| 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:
-  if (yyerrstatus == 3)
-    {
-      /* If just tried and failed to reuse lookahead token after an
-	 error, discard it.  */
-
-      /* Return failure if at end of input.  */
-      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;
-        }
-
-      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
-		  yychar, yytname[yychar1]));
-      yydestruct (yychar1, yylval);
-      yychar = YYEMPTY;
-    }
-
-  /* Else will try to reuse lookahead token after shifting the error
-     token.  */
-
   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());
+}
+
+