diff --git a/include/llvm/System/Path.h b/include/llvm/System/Path.h
index 573edda..a595efb 100644
--- a/include/llvm/System/Path.h
+++ b/include/llvm/System/Path.h
@@ -559,6 +559,14 @@
       explicit PathWithStatus(const std::string& p) 
         : Path(p), status(), fsIsValid(false) {}
 
+      /// This constructor will accept a character range as a path.  No checking
+      /// is done on this path to determine if it is valid.  To determine
+      /// validity of the path, use the isValid method. 
+      /// @param p The path to assign.
+      /// @brief Construct a Path from a string.
+      explicit PathWithStatus(const char *StrStart, unsigned StrLen)
+        : Path(StrStart, StrLen), status(), fsIsValid(false) {}
+
       /// Makes a copy of \p that to \p this.
       /// @returns \p this
       /// @brief Assignment Operator
diff --git a/lib/AsmParser/llvmAsmParser.cpp.cvs b/lib/AsmParser/llvmAsmParser.cpp.cvs
index 9f92ce5..7a2cddc 100644
--- a/lib/AsmParser/llvmAsmParser.cpp.cvs
+++ b/lib/AsmParser/llvmAsmParser.cpp.cvs
@@ -1,7 +1,7 @@
-/* A Bison parser, made by GNU Bison 2.1.  */
+/* A Bison parser, made from /usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y, by GNU bison 1.75.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, 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,21 +34,16 @@
    USER NAME SPACE" below.  */
 
 /* Identify Bison output.  */
-#define YYBISON 1
-
-/* Bison version.  */
-#define YYBISON_VERSION "2.1"
-
-/* Skeleton name.  */
-#define YYSKELETON_NAME "yacc.c"
+#define YYBISON	1
 
 /* Pure parsers.  */
-#define YYPURE 0
+#define YYPURE	0
 
 /* Using locations.  */
 #define YYLSP_NEEDED 0
 
-/* Substitute the variable and function names.  */
+/* If NAME_PREFIX is specified substitute the variables and functions
+   names.  */
 #define yyparse llvmAsmparse
 #define yylex   llvmAsmlex
 #define yyerror llvmAsmerror
@@ -199,7 +194,6 @@
      HIDDEN = 390
    };
 #endif
-/* Tokens.  */
 #define ESINT64VAL 258
 #define EUINT64VAL 259
 #define ESAPINTVAL 260
@@ -338,7 +332,7 @@
 
 
 /* Copy the first part of user declarations.  */
-#line 14 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 14 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
 
 #include "ParserInternals.h"
 #include "llvm/CallingConv.h"
@@ -1293,14 +1287,9 @@
 # define YYERROR_VERBOSE 0
 #endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 955 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-typedef union YYSTYPE {
+#ifndef YYSTYPE
+#line 955 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+typedef union {
   llvm::Module                           *ModuleVal;
   llvm::Function                         *FunctionVal;
   llvm::BasicBlock                       *BasicBlockVal;
@@ -1345,61 +1334,44 @@
   llvm::Instruction::OtherOps       OtherOpVal;
   llvm::ICmpInst::Predicate         IPredicate;
   llvm::FCmpInst::Predicate         FPredicate;
-} YYSTYPE;
-/* Line 196 of yacc.c.  */
-#line 1351 "llvmAsmParser.tab.c"
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
+} yystype;
+/* Line 188 of /usr/local/share/bison/yacc.c.  */
+#line 1340 "llvmAsmParser.tab.c"
+# define YYSTYPE yystype
 # 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 219 of yacc.c.  */
-#line 1363 "llvmAsmParser.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
+/* Line 213 of /usr/local/share/bison/yacc.c.  */
+#line 1361 "llvmAsmParser.tab.c"
 
 #if ! defined (yyoverflow) || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
-# ifdef YYSTACK_USE_ALLOCA
-#  if YYSTACK_USE_ALLOCA
-#   ifdef __GNUC__
-#    define YYSTACK_ALLOC __builtin_alloca
-#   else
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
 #    define YYSTACK_ALLOC alloca
-#    if defined (__STDC__) || defined (__cplusplus)
-#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     define YYINCLUDED_STDLIB_H
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
 #    endif
 #   endif
 #  endif
@@ -1408,76 +1380,50 @@
 # ifdef YYSTACK_ALLOC
    /* Pacify GCC's `empty if-body' warning. */
 #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-    /* The OS might guarantee only one guard page at the bottom of the stack,
-       and a page size can be as small as 4096 bytes.  So we cannot safely
-       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
-       to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
-#  endif
 # else
-#  define YYSTACK_ALLOC YYMALLOC
-#  define YYSTACK_FREE YYFREE
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
 #  endif
-#  ifdef __cplusplus
-extern "C" {
-#  endif
-#  ifndef YYMALLOC
-#   define YYMALLOC malloc
-#   if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-#  ifndef YYFREE
-#   define YYFREE free
-#   if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-#  ifdef __cplusplus
-}
-#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
 # endif
 #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
 
 
 #if (! defined (yyoverflow) \
      && (! defined (__cplusplus) \
-	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+	 || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  short int yyss;
+  short yyss;
   YYSTYPE yyvs;
   };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAX (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 int) + sizeof (YYSTYPE))			\
-      + YYSTACK_GAP_MAXIMUM)
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))				\
+      + YYSTACK_GAP_MAX)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
-#  if defined (__GNUC__) && 1 < __GNUC__
+#  if 1 < __GNUC__
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
 #   define YYCOPY(To, From, Count)		\
       do					\
 	{					\
-	  YYSIZE_T yyi;				\
+	  register YYSIZE_T yyi;		\
 	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
+	    (To)[yyi] = (From)[yyi];	\
 	}					\
       while (0)
 #  endif
@@ -1494,7 +1440,7 @@
 	YYSIZE_T yynewbytes;						\
 	YYCOPY (&yyptr->Stack, Stack, yysize);				\
 	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;	\
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
     while (0)
@@ -1504,12 +1450,11 @@
 #if defined (__STDC__) || defined (__cplusplus)
    typedef signed char yysigned_char;
 #else
-   typedef short int yysigned_char;
+   typedef short yysigned_char;
 #endif
 
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  41
-/* YYLAST -- Last index in YYTABLE.  */
 #define YYLAST   1600
 
 /* YYNTOKENS -- Number of terminals. */
@@ -1525,8 +1470,8 @@
 #define YYUNDEFTOK  2
 #define YYMAXUTOK   390
 
-#define YYTRANSLATE(YYX)						\
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+#define YYTRANSLATE(X) \
+  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
 static const unsigned char yytranslate[] =
@@ -1576,7 +1521,7 @@
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-static const unsigned short int yyprhs[] =
+static const unsigned short yyprhs[] =
 {
        0,     0,     3,     5,     7,     9,    11,    13,    15,    17,
       19,    21,    23,    25,    27,    29,    31,    33,    35,    37,
@@ -1611,7 +1556,7 @@
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const short int yyrhs[] =
+static const short yyrhs[] =
 {
      194,     0,    -1,    69,    -1,    70,    -1,    71,    -1,    72,
       -1,    73,    -1,    74,    -1,    75,    -1,    76,    -1,    77,
@@ -1710,20 +1655,20 @@
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short int yyrline[] =
+static const unsigned short yyrline[] =
 {
        0,  1111,  1111,  1111,  1111,  1111,  1111,  1111,  1111,  1111,
     1111,  1112,  1112,  1112,  1112,  1112,  1112,  1113,  1113,  1113,
-    1113,  1113,  1113,  1114,  1114,  1114,  1114,  1114,  1114,  1117,
+    1113,  1113,  1113,  1113,  1114,  1114,  1114,  1114,  1114,  1117,
     1117,  1118,  1118,  1119,  1119,  1120,  1120,  1121,  1121,  1125,
     1125,  1126,  1126,  1127,  1127,  1128,  1128,  1129,  1129,  1130,
     1130,  1131,  1131,  1132,  1133,  1138,  1139,  1139,  1141,  1141,
     1142,  1142,  1146,  1150,  1155,  1155,  1157,  1158,  1163,  1169,
     1170,  1171,  1172,  1173,  1177,  1178,  1179,  1183,  1184,  1185,
     1189,  1190,  1191,  1195,  1196,  1197,  1198,  1199,  1203,  1204,
-    1205,  1208,  1209,  1210,  1211,  1212,  1213,  1214,  1221,  1222,
+    1205,  1208,  1208,  1209,  1210,  1211,  1212,  1213,  1221,  1222,
     1223,  1224,  1227,  1228,  1233,  1234,  1235,  1238,  1239,  1246,
-    1247,  1253,  1254,  1262,  1270,  1271,  1276,  1277,  1278,  1283,
+    1246,  1253,  1253,  1262,  1270,  1270,  1276,  1276,  1278,  1283,
     1296,  1296,  1296,  1296,  1299,  1303,  1307,  1314,  1319,  1327,
     1357,  1388,  1393,  1405,  1415,  1419,  1429,  1436,  1443,  1450,
     1455,  1460,  1467,  1468,  1475,  1482,  1490,  1496,  1508,  1536,
@@ -1745,58 +1690,58 @@
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[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", "ESINT64VAL", "EUINT64VAL", "ESAPINTVAL",
-  "EUAPINTVAL", "LOCALVAL_ID", "GLOBALVAL_ID", "FPVAL", "VOID", "INTTYPE",
-  "FLOAT", "DOUBLE", "LABEL", "TYPE", "LOCALVAR", "GLOBALVAR", "LABELSTR",
-  "STRINGCONSTANT", "ATSTRINGCONSTANT", "ZEROINITIALIZER", "TRUETOK",
-  "FALSETOK", "BEGINTOK", "ENDTOK", "DECLARE", "DEFINE", "GLOBAL",
-  "CONSTANT", "SECTION", "ALIAS", "VOLATILE", "THREAD_LOCAL", "TO",
-  "DOTDOTDOT", "NULL_TOK", "UNDEF", "INTERNAL", "LINKONCE", "WEAK",
-  "APPENDING", "DLLIMPORT", "DLLEXPORT", "EXTERN_WEAK", "OPAQUE",
-  "EXTERNAL", "TARGET", "TRIPLE", "ALIGN", "DEPLIBS", "CALL", "TAIL",
-  "ASM_TOK", "MODULE", "SIDEEFFECT", "CC_TOK", "CCC_TOK", "FASTCC_TOK",
-  "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT",
-  "RET", "BR", "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB",
-  "MUL", "UDIV", "SDIV", "FDIV", "UREM", "SREM", "FREM", "AND", "OR",
-  "XOR", "SHL", "LSHR", "ASHR", "ICMP", "FCMP", "EQ", "NE", "SLT", "SGT",
-  "SLE", "SGE", "ULT", "UGT", "ULE", "UGE", "OEQ", "ONE", "OLT", "OGT",
-  "OLE", "OGE", "ORD", "UNO", "UEQ", "UNE", "MALLOC", "ALLOCA", "FREE",
-  "LOAD", "STORE", "GETELEMENTPTR", "TRUNC", "ZEXT", "SEXT", "FPTRUNC",
-  "FPEXT", "BITCAST", "UITOFP", "SITOFP", "FPTOUI", "FPTOSI", "INTTOPTR",
-  "PTRTOINT", "PHI_TOK", "SELECT", "VAARG", "EXTRACTELEMENT",
-  "INSERTELEMENT", "SHUFFLEVECTOR", "NORETURN", "INREG", "SRET",
-  "NOUNWIND", "DEFAULT", "HIDDEN", "'='", "','", "'*'", "'\\\\'", "'('",
-  "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", "'}'", "'c'", "$accept",
-  "ArithmeticOps", "LogicalOps", "CastOps", "IPredicates", "FPredicates",
-  "IntType", "FPType", "LocalName", "OptLocalName", "OptLocalAssign",
-  "GlobalName", "OptGlobalAssign", "GlobalAssign", "GVInternalLinkage",
-  "GVExternalLinkage", "GVVisibilityStyle", "FunctionDeclareLinkage",
-  "FunctionDefineLinkage", "AliasLinkage", "OptCallingConv", "ParamAttr",
-  "OptParamAttrs", "FuncAttr", "OptFuncAttrs", "OptAlign", "OptCAlign",
-  "SectionString", "OptSection", "GlobalVarAttributes",
-  "GlobalVarAttribute", "PrimType", "Types", "ArgType", "ResultTypes",
-  "ArgTypeList", "ArgTypeListI", "TypeListI", "ConstVal", "ConstExpr",
-  "ConstVector", "GlobalType", "ThreadLocal", "AliaseeRef", "Module",
-  "DefinitionList", "Definition", "@1", "@2", "@3", "@4", "@5", "AsmBlock",
-  "TargetDefinition", "LibrariesDefinition", "LibList", "ArgListH",
-  "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader", "END",
-  "Function", "FunctionProto", "OptSideEffect", "ConstValueRef",
-  "SymbolicValueRef", "ValueRef", "ResolvedVal", "BasicBlockList",
-  "BasicBlock", "InstructionList", "BBTerminatorInst", "JumpTable", "Inst",
-  "PHIList", "ValueRefList", "IndexList", "OptTailCall", "InstVal",
-  "OptVolatile", "MemoryInst", 0
+  "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "ESAPINTVAL", 
+  "EUAPINTVAL", "LOCALVAL_ID", "GLOBALVAL_ID", "FPVAL", "VOID", "INTTYPE", 
+  "FLOAT", "DOUBLE", "LABEL", "TYPE", "LOCALVAR", "GLOBALVAR", "LABELSTR", 
+  "STRINGCONSTANT", "ATSTRINGCONSTANT", "ZEROINITIALIZER", "TRUETOK", 
+  "FALSETOK", "BEGINTOK", "ENDTOK", "DECLARE", "DEFINE", "GLOBAL", 
+  "CONSTANT", "SECTION", "ALIAS", "VOLATILE", "THREAD_LOCAL", "TO", 
+  "DOTDOTDOT", "NULL_TOK", "UNDEF", "INTERNAL", "LINKONCE", "WEAK", 
+  "APPENDING", "DLLIMPORT", "DLLEXPORT", "EXTERN_WEAK", "OPAQUE", 
+  "EXTERNAL", "TARGET", "TRIPLE", "ALIGN", "DEPLIBS", "CALL", "TAIL", 
+  "ASM_TOK", "MODULE", "SIDEEFFECT", "CC_TOK", "CCC_TOK", "FASTCC_TOK", 
+  "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT", 
+  "RET", "BR", "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB", 
+  "MUL", "UDIV", "SDIV", "FDIV", "UREM", "SREM", "FREM", "AND", "OR", 
+  "XOR", "SHL", "LSHR", "ASHR", "ICMP", "FCMP", "EQ", "NE", "SLT", "SGT", 
+  "SLE", "SGE", "ULT", "UGT", "ULE", "UGE", "OEQ", "ONE", "OLT", "OGT", 
+  "OLE", "OGE", "ORD", "UNO", "UEQ", "UNE", "MALLOC", "ALLOCA", "FREE", 
+  "LOAD", "STORE", "GETELEMENTPTR", "TRUNC", "ZEXT", "SEXT", "FPTRUNC", 
+  "FPEXT", "BITCAST", "UITOFP", "SITOFP", "FPTOUI", "FPTOSI", "INTTOPTR", 
+  "PTRTOINT", "PHI_TOK", "SELECT", "VAARG", "EXTRACTELEMENT", 
+  "INSERTELEMENT", "SHUFFLEVECTOR", "NORETURN", "INREG", "SRET", 
+  "NOUNWIND", "DEFAULT", "HIDDEN", "'='", "','", "'*'", "'\\\\'", "'('", 
+  "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", "'}'", "'c'", 
+  "$accept", "ArithmeticOps", "LogicalOps", "CastOps", "IPredicates", 
+  "FPredicates", "IntType", "FPType", "LocalName", "OptLocalName", 
+  "OptLocalAssign", "GlobalName", "OptGlobalAssign", "GlobalAssign", 
+  "GVInternalLinkage", "GVExternalLinkage", "GVVisibilityStyle", 
+  "FunctionDeclareLinkage", "FunctionDefineLinkage", "AliasLinkage", 
+  "OptCallingConv", "ParamAttr", "OptParamAttrs", "FuncAttr", 
+  "OptFuncAttrs", "OptAlign", "OptCAlign", "SectionString", "OptSection", 
+  "GlobalVarAttributes", "GlobalVarAttribute", "PrimType", "Types", 
+  "ArgType", "ResultTypes", "ArgTypeList", "ArgTypeListI", "TypeListI", 
+  "ConstVal", "ConstExpr", "ConstVector", "GlobalType", "ThreadLocal", 
+  "AliaseeRef", "Module", "DefinitionList", "Definition", "@1", "@2", 
+  "@3", "@4", "@5", "AsmBlock", "TargetDefinition", "LibrariesDefinition", 
+  "LibList", "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", 
+  "FunctionHeader", "END", "Function", "FunctionProto", "OptSideEffect", 
+  "ConstValueRef", "SymbolicValueRef", "ValueRef", "ResolvedVal", 
+  "BasicBlockList", "BasicBlock", "InstructionList", "BBTerminatorInst", 
+  "JumpTable", "Inst", "PHIList", "ValueRefList", "IndexList", 
+  "OptTailCall", "InstVal", "OptVolatile", "MemoryInst", 0
 };
 #endif
 
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
-static const unsigned short int yytoknum[] =
+static const unsigned short yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -1889,7 +1834,7 @@
 /* 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 int yydefact[] =
+static const unsigned short yydefact[] =
 {
       67,    58,    64,    59,    65,   192,   190,     0,     0,     0,
        0,     0,     0,    77,    66,     0,    67,   188,    80,    83,
@@ -1952,7 +1897,7 @@
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
-static const short int yydefgoto[] =
+static const short yydefgoto[] =
 {
       -1,   250,   251,   252,   276,   293,   150,   151,    73,   497,
       11,    74,    13,    14,    38,    39,    40,    45,    51,   111,
@@ -1968,7 +1913,7 @@
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
 #define YYPACT_NINF -472
-static const short int yypact[] =
+static const short yypact[] =
 {
       50,  -472,  -472,  -472,  -472,  -472,  -472,   -20,  -110,    93,
      -64,   160,    68,    14,  -472,   185,   203,  -472,    77,   199,
@@ -2031,7 +1976,7 @@
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const short int yypgoto[] =
+static const short yypgoto[] =
 {
     -472,   401,   404,   405,   292,   294,  -161,  -472,     0,     8,
      443,     9,  -472,  -472,  -472,  -472,    44,  -472,  -472,  -472,
@@ -2047,9 +1992,9 @@
 /* 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, syntax error.  */
+   If YYTABLE_NINF, parse error.  */
 #define YYTABLE_NINF -188
-static const short int yytable[] =
+static const short yytable[] =
 {
       10,    76,   253,   264,   322,   459,   228,   155,   263,    12,
       99,   387,   370,   254,   263,   387,    10,   156,   265,   296,
@@ -2214,7 +2159,7 @@
      206
 };
 
-static const short int yycheck[] =
+static const short yycheck[] =
 {
        0,    26,   152,   164,   224,   414,   145,   121,    11,     0,
        4,   318,   295,   152,    11,   322,    16,    24,   165,   187,
@@ -2443,15 +2388,30 @@
       14,    14,   137,   217,   217,    14,    67,   217,    14,   217
 };
 
+#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 yyerrorlab
-
+#define YYERROR		goto yyerrlab1
 
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
@@ -2467,71 +2427,34 @@
     {								\
       yychar = (Token);						\
       yylval = (Value);						\
-      yytoken = YYTRANSLATE (yychar);				\
+      yychar1 = YYTRANSLATE (yychar);				\
       YYPOPSTACK;						\
       goto yybackup;						\
     }								\
   else								\
-    {								\
-      yyerror (YY_("syntax error: cannot back up")); \
+    { 								\
+      yyerror ("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)				\
-    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)
+# 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;
 #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.  */
 
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
+#define YYLEX	yylex ()
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -2546,86 +2469,19 @@
   if (yydebug)					\
     YYFPRINTF Args;				\
 } while (0)
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
-do {								\
-  if (yydebug)							\
-    {								\
-      YYFPRINTF (stderr, "%s ", Title);				\
-      yysymprint (stderr,					\
-                  Type, Value);	\
-      YYFPRINTF (stderr, "\n");					\
-    }								\
+# define YYDSYMPRINT(Args)			\
+do {						\
+  if (yydebug)					\
+    yysymprint Args;				\
 } 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 YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
+# define YYDSYMPRINT(Args)
 #endif /* !YYDEBUG */
 
-
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef	YYINITDEPTH
 # define YYINITDEPTH 200
@@ -2635,9 +2491,13 @@
    if the built-in stack extension method is used).
 
    Do not make this value too large; the results are undefined if
-   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
    evaluated with infinite-precision integer arithmetic.  */
 
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
 #ifndef YYMAXDEPTH
 # define YYMAXDEPTH 10000
 #endif
@@ -2659,7 +2519,7 @@
      const char *yystr;
 #   endif
 {
-  const char *yys = yystr;
+  register const char *yys = yystr;
 
   while (*yys++ != '\0')
     continue;
@@ -2684,8 +2544,8 @@
      const char *yysrc;
 #   endif
 {
-  char *yyd = yydest;
-  const char *yys = yysrc;
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
 
   while ((*yyd++ = *yys++) != '\0')
     continue;
@@ -2695,186 +2555,124 @@
 #  endif
 # endif
 
-# 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 */
+#endif /* !YYERROR_VERBOSE */
 
 
 
 #if YYDEBUG
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
+/*-----------------------------.
+| Print this symbol on YYOUT.  |
+`-----------------------------*/
 
+static void
 #if defined (__STDC__) || defined (__cplusplus)
-static void
-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
 #else
-static void
-yysymprint (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
+yysymprint (yyout, yytype, yyvalue)
+    FILE* yyout;
     int yytype;
-    YYSTYPE *yyvaluep;
+    YYSTYPE yyvalue;
 #endif
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
+  (void) yyvalue;
 
   if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-
+    {
+      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
 # ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+      YYPRINT (yyout, yytoknum[yytype], yyvalue);
 # endif
+    }
+  else
+    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+
   switch (yytype)
     {
       default:
         break;
     }
-  YYFPRINTF (yyoutput, ")");
+  YYFPRINTF (yyout, ")");
 }
+#endif /* YYDEBUG. */
 
-#endif /* ! YYDEBUG */
+
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
+static void
 #if defined (__STDC__) || defined (__cplusplus)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+yydestruct (int yytype, YYSTYPE yyvalue)
 #else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
-    const char *yymsg;
+yydestruct (yytype, yyvalue)
     int yytype;
-    YYSTYPE *yyvaluep;
+    YYSTYPE yyvalue;
 #endif
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
-
-  if (!yymsg)
-    yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+  (void) yyvalue;
 
   switch (yytype)
     {
-
       default:
         break;
     }
 }
+
 
 
-/* Prevent warnings from -Wmissing-prototypes.  */
+/* 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.  */
 
 #ifdef YYPARSE_PARAM
 # if defined (__STDC__) || defined (__cplusplus)
-int yyparse (void *YYPARSE_PARAM);
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
 # else
-int yyparse ();
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
 # endif
-#else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#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
 int yyparse (void);
-#else
-int yyparse ();
+# endif
 #endif
-#endif /* ! YYPARSE_PARAM */
 
 
-
-/* The look-ahead symbol.  */
+/* The lookahead symbol.  */
 int yychar;
 
-/* The semantic value of the look-ahead symbol.  */
+/* The semantic value of the lookahead symbol.  */
 YYSTYPE yylval;
 
-/* Number of syntax errors so far.  */
+/* Number of parse 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 (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
 {
   
-  int yystate;
-  int yyn;
+  register int yystate;
+  register int yyn;
   int yyresult;
   /* Number of tokens to shift before error messages enabled.  */
   int yyerrstatus;
-  /* Look-ahead token as an internal (translated) token number.  */
-  int yytoken = 0;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
 
   /* Three stacks and their tools:
      `yyss': related to states,
@@ -2885,14 +2683,14 @@
      to reallocate them elsewhere.  */
 
   /* The state stack.  */
-  short int yyssa[YYINITDEPTH];
-  short int *yyss = yyssa;
-  short int *yyssp;
+  short	yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
 
   /* The semantic value stack.  */
   YYSTYPE yyvsa[YYINITDEPTH];
   YYSTYPE *yyvs = yyvsa;
-  YYSTYPE *yyvsp;
+  register YYSTYPE *yyvsp;
 
 
 
@@ -2938,7 +2736,7 @@
  yysetstate:
   *yyssp = yystate;
 
-  if (yyss + yystacksize - 1 <= yyssp)
+  if (yyssp >= yyss + yystacksize - 1)
     {
       /* Get the current used size of the three stacks, in elements.  */
       YYSIZE_T yysize = yyssp - yyss + 1;
@@ -2949,14 +2747,14 @@
 	   these so that the &'s don't force the real ones into
 	   memory.  */
 	YYSTYPE *yyvs1 = yyvs;
-	short int *yyss1 = yyss;
+	short *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 (YY_("memory exhausted"),
+	yyoverflow ("parser stack overflow",
 		    &yyss1, yysize * sizeof (*yyssp),
 		    &yyvs1, yysize * sizeof (*yyvsp),
 
@@ -2967,21 +2765,21 @@
       }
 #else /* no yyoverflow */
 # ifndef YYSTACK_RELOCATE
-      goto yyexhaustedlab;
+      goto yyoverflowlab;
 # else
       /* Extend the stack our own way.  */
-      if (YYMAXDEPTH <= yystacksize)
-	goto yyexhaustedlab;
+      if (yystacksize >= YYMAXDEPTH)
+	goto yyoverflowlab;
       yystacksize *= 2;
-      if (YYMAXDEPTH < yystacksize)
+      if (yystacksize > YYMAXDEPTH)
 	yystacksize = YYMAXDEPTH;
 
       {
-	short int *yyss1 = yyss;
+	short *yyss1 = yyss;
 	union yyalloc *yyptr =
 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 	if (! yyptr)
-	  goto yyexhaustedlab;
+	  goto yyoverflowlab;
 	YYSTACK_RELOCATE (yyss);
 	YYSTACK_RELOCATE (yyvs);
 
@@ -2999,7 +2797,7 @@
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 		  (unsigned long int) yystacksize));
 
-      if (yyss + yystacksize - 1 <= yyssp)
+      if (yyssp >= yyss + yystacksize - 1)
 	YYABORT;
     }
 
@@ -3013,39 +2811,50 @@
 yybackup:
 
 /* Do appropriate processing given the current state.  */
-/* Read a look-ahead token if we need one and don't already have one.  */
+/* Read a lookahead token if we need one and don't already have one.  */
 /* yyresume: */
 
-  /* First try to decide what to do without reference to look-ahead token.  */
+  /* First try to decide what to do without reference to lookahead token.  */
 
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
 
-  /* Not known => get a look-ahead token if don't already have one.  */
+  /* Not known => get a lookahead token if don't already have one.  */
 
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
       yychar = YYLEX;
     }
 
-  if (yychar <= YYEOF)
+  /* Convert token to internal form (in yychar1) for indexing tables with.  */
+
+  if (yychar <= 0)		/* This means end of input.  */
     {
-      yychar = yytoken = YYEOF;
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more.  */
+
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
   else
     {
-      yytoken = YYTRANSLATE (yychar);
-      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+      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"));
     }
 
-  /* If the proper action on seeing token YYTOKEN is to reduce or to
+  /* If the proper action on seeing token YYCHAR1 is to reduce or to
      detect an error, take that action.  */
-  yyn += yytoken;
-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+  yyn += yychar1;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
     goto yydefault;
   yyn = yytable[yyn];
   if (yyn <= 0)
@@ -3059,8 +2868,9 @@
   if (yyn == YYFINAL)
     YYACCEPT;
 
-  /* Shift the look-ahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+	      yychar, yytname[yychar1]));
 
   /* Discard the token being shifted unless it is eof.  */
   if (yychar != YYEOF)
@@ -3106,519 +2916,535 @@
   yyval = yyvsp[1-yylen];
 
 
-  YY_REDUCE_PRINT (yyn);
+
+#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
   switch (yyn)
     {
         case 29:
-#line 1117 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_EQ; ;}
+#line 1117 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_EQ; }
     break;
 
   case 30:
-#line 1117 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_NE; ;}
+#line 1117 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_NE; }
     break;
 
   case 31:
-#line 1118 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_SLT; ;}
+#line 1118 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_SLT; }
     break;
 
   case 32:
-#line 1118 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_SGT; ;}
+#line 1118 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_SGT; }
     break;
 
   case 33:
-#line 1119 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_SLE; ;}
+#line 1119 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_SLE; }
     break;
 
   case 34:
-#line 1119 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_SGE; ;}
+#line 1119 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_SGE; }
     break;
 
   case 35:
-#line 1120 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_ULT; ;}
+#line 1120 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_ULT; }
     break;
 
   case 36:
-#line 1120 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_UGT; ;}
+#line 1120 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_UGT; }
     break;
 
   case 37:
-#line 1121 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_ULE; ;}
+#line 1121 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_ULE; }
     break;
 
   case 38:
-#line 1121 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.IPredicate) = ICmpInst::ICMP_UGE; ;}
+#line 1121 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.IPredicate = ICmpInst::ICMP_UGE; }
     break;
 
   case 39:
-#line 1125 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_OEQ; ;}
+#line 1125 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_OEQ; }
     break;
 
   case 40:
-#line 1125 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_ONE; ;}
+#line 1125 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_ONE; }
     break;
 
   case 41:
-#line 1126 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_OLT; ;}
+#line 1126 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_OLT; }
     break;
 
   case 42:
-#line 1126 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_OGT; ;}
+#line 1126 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_OGT; }
     break;
 
   case 43:
-#line 1127 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_OLE; ;}
+#line 1127 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_OLE; }
     break;
 
   case 44:
-#line 1127 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_OGE; ;}
+#line 1127 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_OGE; }
     break;
 
   case 45:
-#line 1128 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_ORD; ;}
+#line 1128 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_ORD; }
     break;
 
   case 46:
-#line 1128 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_UNO; ;}
+#line 1128 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_UNO; }
     break;
 
   case 47:
-#line 1129 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_UEQ; ;}
+#line 1129 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_UEQ; }
     break;
 
   case 48:
-#line 1129 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_UNE; ;}
+#line 1129 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_UNE; }
     break;
 
   case 49:
-#line 1130 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_ULT; ;}
+#line 1130 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_ULT; }
     break;
 
   case 50:
-#line 1130 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_UGT; ;}
+#line 1130 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_UGT; }
     break;
 
   case 51:
-#line 1131 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_ULE; ;}
+#line 1131 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_ULE; }
     break;
 
   case 52:
-#line 1131 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_UGE; ;}
+#line 1131 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_UGE; }
     break;
 
   case 53:
-#line 1132 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_TRUE; ;}
+#line 1132 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_TRUE; }
     break;
 
   case 54:
-#line 1133 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.FPredicate) = FCmpInst::FCMP_FALSE; ;}
+#line 1133 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.FPredicate = FCmpInst::FCMP_FALSE; }
     break;
 
   case 61:
-#line 1142 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.StrVal) = 0; ;}
+#line 1142 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.StrVal = 0; }
     break;
 
   case 62:
-#line 1146 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1146 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.StrVal) = (yyvsp[-1].StrVal);
+    yyval.StrVal = yyvsp[-1].StrVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 63:
-#line 1150 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1150 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.StrVal) = 0;
+    yyval.StrVal = 0;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 67:
-#line 1158 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1158 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.StrVal) = 0;
+    yyval.StrVal = 0;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 68:
-#line 1163 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1163 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.StrVal) = (yyvsp[-1].StrVal);
+    yyval.StrVal = yyvsp[-1].StrVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 69:
-#line 1169 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
+#line 1169 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::InternalLinkage; }
     break;
 
   case 70:
-#line 1170 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
+#line 1170 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::WeakLinkage; }
     break;
 
   case 71:
-#line 1171 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
+#line 1171 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::LinkOnceLinkage; }
     break;
 
   case 72:
-#line 1172 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
+#line 1172 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::AppendingLinkage; }
     break;
 
   case 73:
-#line 1173 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
+#line 1173 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::DLLExportLinkage; }
     break;
 
   case 74:
-#line 1177 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
+#line 1177 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::DLLImportLinkage; }
     break;
 
   case 75:
-#line 1178 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
+#line 1178 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::ExternalWeakLinkage; }
     break;
 
   case 76:
-#line 1179 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
+#line 1179 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::ExternalLinkage; }
     break;
 
   case 77:
-#line 1183 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Visibility) = GlobalValue::DefaultVisibility; ;}
+#line 1183 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Visibility = GlobalValue::DefaultVisibility; }
     break;
 
   case 78:
-#line 1184 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Visibility) = GlobalValue::DefaultVisibility; ;}
+#line 1184 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Visibility = GlobalValue::DefaultVisibility; }
     break;
 
   case 79:
-#line 1185 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Visibility) = GlobalValue::HiddenVisibility;  ;}
+#line 1185 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Visibility = GlobalValue::HiddenVisibility;  }
     break;
 
   case 80:
-#line 1189 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
+#line 1189 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::ExternalLinkage; }
     break;
 
   case 81:
-#line 1190 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
+#line 1190 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::DLLImportLinkage; }
     break;
 
   case 82:
-#line 1191 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
+#line 1191 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::ExternalWeakLinkage; }
     break;
 
   case 83:
-#line 1195 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
+#line 1195 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::ExternalLinkage; }
     break;
 
   case 84:
-#line 1196 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
+#line 1196 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::InternalLinkage; }
     break;
 
   case 85:
-#line 1197 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
+#line 1197 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::LinkOnceLinkage; }
     break;
 
   case 86:
-#line 1198 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
+#line 1198 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::WeakLinkage; }
     break;
 
   case 87:
-#line 1199 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
+#line 1199 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::DLLExportLinkage; }
     break;
 
   case 88:
-#line 1203 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
+#line 1203 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::ExternalLinkage; }
     break;
 
   case 89:
-#line 1204 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
+#line 1204 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::WeakLinkage; }
     break;
 
   case 90:
-#line 1205 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
+#line 1205 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.Linkage = GlobalValue::InternalLinkage; }
     break;
 
   case 91:
-#line 1208 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.UIntVal) = CallingConv::C; ;}
+#line 1208 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.UIntVal = CallingConv::C; }
     break;
 
   case 92:
-#line 1209 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.UIntVal) = CallingConv::C; ;}
+#line 1209 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.UIntVal = CallingConv::C; }
     break;
 
   case 93:
-#line 1210 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.UIntVal) = CallingConv::Fast; ;}
+#line 1210 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.UIntVal = CallingConv::Fast; }
     break;
 
   case 94:
-#line 1211 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.UIntVal) = CallingConv::Cold; ;}
+#line 1211 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.UIntVal = CallingConv::Cold; }
     break;
 
   case 95:
-#line 1212 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.UIntVal) = CallingConv::X86_StdCall; ;}
+#line 1212 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.UIntVal = CallingConv::X86_StdCall; }
     break;
 
   case 96:
-#line 1213 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.UIntVal) = CallingConv::X86_FastCall; ;}
+#line 1213 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.UIntVal = CallingConv::X86_FastCall; }
     break;
 
   case 97:
-#line 1214 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1214 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-                   if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val))
+                   if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val)
                      GEN_ERROR("Calling conv too large");
-                   (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+                   yyval.UIntVal = yyvsp[0].UInt64Val;
                   CHECK_FOR_ERROR
-                 ;}
+                 }
     break;
 
   case 98:
-#line 1221 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ParamAttrs) = ParamAttr::ZExt;      ;}
+#line 1221 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ParamAttrs = ParamAttr::ZExt;      }
     break;
 
   case 99:
-#line 1222 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ParamAttrs) = ParamAttr::SExt;      ;}
+#line 1222 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ParamAttrs = ParamAttr::SExt;      }
     break;
 
   case 100:
-#line 1223 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ParamAttrs) = ParamAttr::InReg;     ;}
+#line 1223 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ParamAttrs = ParamAttr::InReg;     }
     break;
 
   case 101:
-#line 1224 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ParamAttrs) = ParamAttr::StructRet; ;}
+#line 1224 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ParamAttrs = ParamAttr::StructRet; }
     break;
 
   case 102:
-#line 1227 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ParamAttrs) = ParamAttr::None; ;}
+#line 1227 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ParamAttrs = ParamAttr::None; }
     break;
 
   case 103:
-#line 1228 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1228 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-                (yyval.ParamAttrs) = (yyvsp[-1].ParamAttrs) | (yyvsp[0].ParamAttrs);
-              ;}
+                yyval.ParamAttrs = yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs;
+              }
     break;
 
   case 104:
-#line 1233 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ParamAttrs) = ParamAttr::NoReturn; ;}
+#line 1233 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ParamAttrs = ParamAttr::NoReturn; }
     break;
 
   case 105:
-#line 1234 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ParamAttrs) = ParamAttr::NoUnwind; ;}
+#line 1234 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ParamAttrs = ParamAttr::NoUnwind; }
     break;
 
   case 107:
-#line 1238 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ParamAttrs) = ParamAttr::None; ;}
+#line 1238 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ParamAttrs = ParamAttr::None; }
     break;
 
   case 108:
-#line 1239 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1239 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-                (yyval.ParamAttrs) = (yyvsp[-1].ParamAttrs) | (yyvsp[0].ParamAttrs);
-              ;}
+                yyval.ParamAttrs = yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs;
+              }
     break;
 
   case 109:
-#line 1246 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.UIntVal) = 0; ;}
+#line 1246 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.UIntVal = 0; }
     break;
 
   case 110:
-#line 1247 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1247 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-  (yyval.UIntVal) = (yyvsp[0].UInt64Val);
-  if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
+  yyval.UIntVal = yyvsp[0].UInt64Val;
+  if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal))
     GEN_ERROR("Alignment must be a power of two");
   CHECK_FOR_ERROR
-;}
+}
     break;
 
   case 111:
-#line 1253 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.UIntVal) = 0; ;}
+#line 1253 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.UIntVal = 0; }
     break;
 
   case 112:
-#line 1254 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1254 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-  (yyval.UIntVal) = (yyvsp[0].UInt64Val);
-  if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
+  yyval.UIntVal = yyvsp[0].UInt64Val;
+  if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal))
     GEN_ERROR("Alignment must be a power of two");
   CHECK_FOR_ERROR
-;}
+}
     break;
 
   case 113:
-#line 1262 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1262 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-  for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i)
-    if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\')
+  for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i)
+    if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\')
       GEN_ERROR("Invalid character in section name");
-  (yyval.StrVal) = (yyvsp[0].StrVal);
+  yyval.StrVal = yyvsp[0].StrVal;
   CHECK_FOR_ERROR
-;}
+}
     break;
 
   case 114:
-#line 1270 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.StrVal) = 0; ;}
+#line 1270 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.StrVal = 0; }
     break;
 
   case 115:
-#line 1271 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.StrVal) = (yyvsp[0].StrVal); ;}
+#line 1271 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.StrVal = yyvsp[0].StrVal; }
     break;
 
   case 116:
-#line 1276 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    {;}
+#line 1276 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    {}
     break;
 
   case 117:
-#line 1277 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    {;}
+#line 1277 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    {}
     break;
 
   case 118:
-#line 1278 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1278 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    CurGV->setSection((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
+    CurGV->setSection(yyvsp[0].StrVal);
+    free(yyvsp[0].StrVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 119:
-#line 1283 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1283 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val)))
+    if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val))
       GEN_ERROR("Alignment must be a power of two");
-    CurGV->setAlignment((yyvsp[0].UInt64Val));
+    CurGV->setAlignment(yyvsp[0].UInt64Val);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 124:
-#line 1299 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1299 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeVal) = new PATypeHolder(OpaqueType::get());
+    yyval.TypeVal = new PATypeHolder(OpaqueType::get());
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 125:
-#line 1303 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1303 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType));
+    yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 126:
-#line 1307 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1307 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                             // Pointer type?
-    if (*(yyvsp[-1].TypeVal) == Type::LabelTy)
+    if (*yyvsp[-1].TypeVal == Type::LabelTy)
       GEN_ERROR("Cannot form a pointer to a basic block");
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PointerType::get(*(yyvsp[-1].TypeVal))));
-    delete (yyvsp[-1].TypeVal);
+    yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal)));
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 127:
-#line 1314 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1314 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {            // Named types are also simple types...
-    const Type* tmp = getTypeVal((yyvsp[0].ValIDVal));
+    const Type* tmp = getTypeVal(yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.TypeVal) = new PATypeHolder(tmp);
-  ;}
+    yyval.TypeVal = new PATypeHolder(tmp);
+  }
     break;
 
   case 128:
-#line 1319 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1319 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                   // Type UpReference
-    if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range");
+    if (yyvsp[0].UInt64Val > (uint64_t)~0U) GEN_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) = new PATypeHolder(OT);
+    UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT));  // Add to vector...
+    yyval.TypeVal = new PATypeHolder(OT);
     UR_OUT("New Upreference!\n");
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 129:
-#line 1327 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1327 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     std::vector<const Type*> Params;
     ParamAttrsVector Attrs;
-    if ((yyvsp[0].ParamAttrs) != ParamAttr::None) {
-      ParamAttrsWithIndex X; X.index = 0; X.attrs = (yyvsp[0].ParamAttrs);
+    if (yyvsp[0].ParamAttrs != ParamAttr::None) {
+      ParamAttrsWithIndex X; X.index = 0; X.attrs = yyvsp[0].ParamAttrs;
       Attrs.push_back(X);
     }
     unsigned index = 1;
-    TypeWithAttrsList::iterator I = (yyvsp[-2].TypeWithAttrsList)->begin(), E = (yyvsp[-2].TypeWithAttrsList)->end();
+    TypeWithAttrsList::iterator I = yyvsp[-2].TypeWithAttrsList->begin(), E = yyvsp[-2].TypeWithAttrsList->end();
     for (; I != E; ++I, ++index) {
       const Type *Ty = I->Ty->get();
       Params.push_back(Ty);
@@ -3634,24 +3460,24 @@
     ParamAttrsList *ActualAttrs = 0;
     if (!Attrs.empty())
       ActualAttrs = ParamAttrsList::get(Attrs);
-    FunctionType *FT = FunctionType::get(*(yyvsp[-4].TypeVal), Params, isVarArg, ActualAttrs);
-    delete (yyvsp[-2].TypeWithAttrsList);   // Delete the argument list
-    delete (yyvsp[-4].TypeVal);   // Delete the return type handle
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FT)); 
+    FunctionType *FT = FunctionType::get(*yyvsp[-4].TypeVal, Params, isVarArg, ActualAttrs);
+    delete yyvsp[-2].TypeWithAttrsList;   // Delete the argument list
+    delete yyvsp[-4].TypeVal;   // Delete the return type handle
+    yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); 
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 130:
-#line 1357 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1357 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     std::vector<const Type*> Params;
     ParamAttrsVector Attrs;
-    if ((yyvsp[0].ParamAttrs) != ParamAttr::None) {
-      ParamAttrsWithIndex X; X.index = 0; X.attrs = (yyvsp[0].ParamAttrs);
+    if (yyvsp[0].ParamAttrs != ParamAttr::None) {
+      ParamAttrsWithIndex X; X.index = 0; X.attrs = yyvsp[0].ParamAttrs;
       Attrs.push_back(X);
     }
-    TypeWithAttrsList::iterator I = (yyvsp[-2].TypeWithAttrsList)->begin(), E = (yyvsp[-2].TypeWithAttrsList)->end();
+    TypeWithAttrsList::iterator I = yyvsp[-2].TypeWithAttrsList->begin(), E = yyvsp[-2].TypeWithAttrsList->end();
     unsigned index = 1;
     for ( ; I != E; ++I, ++index) {
       const Type* Ty = I->Ty->get();
@@ -3669,305 +3495,305 @@
     if (!Attrs.empty())
       ActualAttrs = ParamAttrsList::get(Attrs);
 
-    FunctionType *FT = FunctionType::get((yyvsp[-4].PrimType), Params, isVarArg, ActualAttrs);
-    delete (yyvsp[-2].TypeWithAttrsList);      // Delete the argument list
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FT)); 
+    FunctionType *FT = FunctionType::get(yyvsp[-4].PrimType, Params, isVarArg, ActualAttrs);
+    delete yyvsp[-2].TypeWithAttrsList;      // Delete the argument list
+    yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); 
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 131:
-#line 1388 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1388 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {          // Sized array type?
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val))));
-    delete (yyvsp[-1].TypeVal);
+    yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val)));
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 132:
-#line 1393 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1393 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {          // Vector type?
-     const llvm::Type* ElemTy = (yyvsp[-1].TypeVal)->get();
-     if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val))
+     const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get();
+     if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val)
         GEN_ERROR("Unsigned result not equal to signed result");
      if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger())
         GEN_ERROR("Element type of a VectorType must be primitive");
-     if (!isPowerOf2_32((yyvsp[-3].UInt64Val)))
+     if (!isPowerOf2_32(yyvsp[-3].UInt64Val))
        GEN_ERROR("Vector length should be a power of 2");
-     (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(VectorType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val))));
-     delete (yyvsp[-1].TypeVal);
+     yyval.TypeVal = new PATypeHolder(HandleUpRefs(VectorType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val)));
+     delete yyvsp[-1].TypeVal;
      CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 133:
-#line 1405 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1405 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                        // Structure type?
     std::vector<const Type*> Elements;
-    for (std::list<llvm::PATypeHolder>::iterator I = (yyvsp[-1].TypeList)->begin(),
-           E = (yyvsp[-1].TypeList)->end(); I != E; ++I)
+    for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-1].TypeList->begin(),
+           E = yyvsp[-1].TypeList->end(); I != E; ++I)
       Elements.push_back(*I);
 
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
-    delete (yyvsp[-1].TypeList);
+    yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
+    delete yyvsp[-1].TypeList;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 134:
-#line 1415 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1415 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                                  // Empty structure type?
-    (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector<const Type*>()));
+    yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>()));
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 135:
-#line 1419 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1419 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     std::vector<const Type*> Elements;
-    for (std::list<llvm::PATypeHolder>::iterator I = (yyvsp[-2].TypeList)->begin(),
-           E = (yyvsp[-2].TypeList)->end(); I != E; ++I)
+    for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-2].TypeList->begin(),
+           E = yyvsp[-2].TypeList->end(); I != E; ++I)
       Elements.push_back(*I);
 
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
-    delete (yyvsp[-2].TypeList);
+    yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
+    delete yyvsp[-2].TypeList;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 136:
-#line 1429 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1429 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                         // Empty structure type?
-    (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector<const Type*>(), true));
+    yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>(), true));
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 137:
-#line 1436 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1436 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     { 
-    (yyval.TypeWithAttrs).Ty = (yyvsp[-1].TypeVal); 
-    (yyval.TypeWithAttrs).Attrs = (yyvsp[0].ParamAttrs); 
-  ;}
+    yyval.TypeWithAttrs.Ty = yyvsp[-1].TypeVal; 
+    yyval.TypeWithAttrs.Attrs = yyvsp[0].ParamAttrs; 
+  }
     break;
 
   case 138:
-#line 1443 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1443 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription());
-    if (!(*(yyvsp[0].TypeVal))->isFirstClassType())
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
+    if (!(*yyvsp[0].TypeVal)->isFirstClassType())
       GEN_ERROR("LLVM functions cannot return aggregate types");
-    (yyval.TypeVal) = (yyvsp[0].TypeVal);
-  ;}
+    yyval.TypeVal = yyvsp[0].TypeVal;
+  }
     break;
 
   case 139:
-#line 1450 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1450 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeVal) = new PATypeHolder(Type::VoidTy);
-  ;}
+    yyval.TypeVal = new PATypeHolder(Type::VoidTy);
+  }
     break;
 
   case 140:
-#line 1455 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1455 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeWithAttrsList) = new TypeWithAttrsList();
-    (yyval.TypeWithAttrsList)->push_back((yyvsp[0].TypeWithAttrs));
+    yyval.TypeWithAttrsList = new TypeWithAttrsList();
+    yyval.TypeWithAttrsList->push_back(yyvsp[0].TypeWithAttrs);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 141:
-#line 1460 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1460 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    ((yyval.TypeWithAttrsList)=(yyvsp[-2].TypeWithAttrsList))->push_back((yyvsp[0].TypeWithAttrs));
+    (yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList)->push_back(yyvsp[0].TypeWithAttrs);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 143:
-#line 1468 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1468 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeWithAttrsList)=(yyvsp[-2].TypeWithAttrsList);
+    yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList;
     TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
     TWA.Ty = new PATypeHolder(Type::VoidTy);
-    (yyval.TypeWithAttrsList)->push_back(TWA);
+    yyval.TypeWithAttrsList->push_back(TWA);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 144:
-#line 1475 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1475 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeWithAttrsList) = new TypeWithAttrsList;
+    yyval.TypeWithAttrsList = new TypeWithAttrsList;
     TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
     TWA.Ty = new PATypeHolder(Type::VoidTy);
-    (yyval.TypeWithAttrsList)->push_back(TWA);
+    yyval.TypeWithAttrsList->push_back(TWA);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 145:
-#line 1482 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1482 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeWithAttrsList) = new TypeWithAttrsList();
+    yyval.TypeWithAttrsList = new TypeWithAttrsList();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 146:
-#line 1490 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1490 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeList) = new std::list<PATypeHolder>();
-    (yyval.TypeList)->push_back(*(yyvsp[0].TypeVal)); 
-    delete (yyvsp[0].TypeVal);
+    yyval.TypeList = new std::list<PATypeHolder>();
+    yyval.TypeList->push_back(*yyvsp[0].TypeVal); 
+    delete yyvsp[0].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 147:
-#line 1496 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1496 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(*(yyvsp[0].TypeVal)); 
-    delete (yyvsp[0].TypeVal);
+    (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); 
+    delete yyvsp[0].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 148:
-#line 1508 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1508 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     { // Nonempty unsized arr
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription());
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-3].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
+    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-3].TypeVal->get());
     if (ATy == 0)
       GEN_ERROR("Cannot make array constant with type: '" + 
-                     (*(yyvsp[-3].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-3].TypeVal)->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())
+    if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
       GEN_ERROR("Type mismatch: constant sized array initialized with " +
-                     utostr((yyvsp[-1].ConstVector)->size()) +  " arguments, but has size of " + 
+                     utostr(yyvsp[-1].ConstVector->size()) +  " arguments, but has size of " + 
                      itostr(NumElements) + "");
 
     // Verify all elements are correct type!
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType())
+    for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
+      if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
                        ETy->getDescription() +"' as required!\nIt is of type '"+
-                       (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'.");
+                       (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
     }
 
-    (yyval.ConstVal) = ConstantArray::get(ATy, *(yyvsp[-1].ConstVector));
-    delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector);
+    yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector);
+    delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 149:
-#line 1536 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1536 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal->get());
     if (ATy == 0)
       GEN_ERROR("Cannot make array constant with type: '" + 
-                     (*(yyvsp[-2].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-2].TypeVal)->getDescription() + "'");
 
     int NumElements = ATy->getNumElements();
     if (NumElements != -1 && NumElements != 0) 
       GEN_ERROR("Type mismatch: constant sized array initialized with 0"
                      " arguments, but has size of " + itostr(NumElements) +"");
-    (yyval.ConstVal) = ConstantArray::get(ATy, std::vector<Constant*>());
-    delete (yyvsp[-2].TypeVal);
+    yyval.ConstVal = ConstantArray::get(ATy, std::vector<Constant*>());
+    delete yyvsp[-2].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 150:
-#line 1552 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1552 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal->get());
     if (ATy == 0)
       GEN_ERROR("Cannot make array constant with type: '" + 
-                     (*(yyvsp[-2].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-2].TypeVal)->getDescription() + "'");
 
     int NumElements = ATy->getNumElements();
     const Type *ETy = ATy->getElementType();
-    char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
-    if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal)))
+    char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true);
+    if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal))
       GEN_ERROR("Can't build string constant of size " + 
-                     itostr((int)(EndStr-(yyvsp[0].StrVal))) +
+                     itostr((int)(EndStr-yyvsp[0].StrVal)) +
                      " when array has size " + itostr(NumElements) + "");
     std::vector<Constant*> Vals;
     if (ETy == Type::Int8Ty) {
-      for (unsigned char *C = (unsigned char *)(yyvsp[0].StrVal); 
+      for (unsigned char *C = (unsigned char *)yyvsp[0].StrVal; 
         C != (unsigned char*)EndStr; ++C)
       Vals.push_back(ConstantInt::get(ETy, *C));
     } else {
-      free((yyvsp[0].StrVal));
+      free(yyvsp[0].StrVal);
       GEN_ERROR("Cannot build string arrays of non byte sized elements");
     }
-    free((yyvsp[0].StrVal));
-    (yyval.ConstVal) = ConstantArray::get(ATy, Vals);
-    delete (yyvsp[-2].TypeVal);
+    free(yyvsp[0].StrVal);
+    yyval.ConstVal = ConstantArray::get(ATy, Vals);
+    delete yyvsp[-2].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 151:
-#line 1581 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1581 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     { // Nonempty unsized arr
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription());
-    const VectorType *PTy = dyn_cast<VectorType>((yyvsp[-3].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
+    const VectorType *PTy = dyn_cast<VectorType>(yyvsp[-3].TypeVal->get());
     if (PTy == 0)
       GEN_ERROR("Cannot make packed constant with type: '" + 
-                     (*(yyvsp[-3].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-3].TypeVal)->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())
+    if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
       GEN_ERROR("Type mismatch: constant sized packed initialized with " +
-                     utostr((yyvsp[-1].ConstVector)->size()) +  " arguments, but has size of " + 
+                     utostr(yyvsp[-1].ConstVector->size()) +  " arguments, but has size of " + 
                      itostr(NumElements) + "");
 
     // Verify all elements are correct type!
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType())
+    for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
+      if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
            ETy->getDescription() +"' as required!\nIt is of type '"+
-           (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'.");
+           (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
     }
 
-    (yyval.ConstVal) = ConstantVector::get(PTy, *(yyvsp[-1].ConstVector));
-    delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector);
+    yyval.ConstVal = ConstantVector::get(PTy, *yyvsp[-1].ConstVector);
+    delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 152:
-#line 1609 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1609 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-3].TypeVal)->get());
+    const StructType *STy = dyn_cast<StructType>(yyvsp[-3].TypeVal->get());
     if (STy == 0)
       GEN_ERROR("Cannot make struct constant with type: '" + 
-                     (*(yyvsp[-3].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-3].TypeVal)->getDescription() + "'");
 
-    if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes())
+    if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes())
       GEN_ERROR("Illegal number of initializers for structure type");
 
     // Check to ensure that constants are compatible with the type initializer!
-    for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i)
-      if ((*(yyvsp[-1].ConstVector))[i]->getType() != STy->getElementType(i))
+    for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i)
+      if ((*yyvsp[-1].ConstVector)[i]->getType() != STy->getElementType(i))
         GEN_ERROR("Expected type '" +
                        STy->getElementType(i)->getDescription() +
                        "' for element #" + utostr(i) +
@@ -3978,21 +3804,21 @@
       GEN_ERROR("Unpacked Initializer to vector type '" +
                 STy->getDescription() + "'");
 
-    (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[-1].ConstVector));
-    delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector);
+    yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector);
+    delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 153:
-#line 1635 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1635 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-2].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    const StructType *STy = dyn_cast<StructType>(yyvsp[-2].TypeVal->get());
     if (STy == 0)
       GEN_ERROR("Cannot make struct constant with type: '" + 
-                     (*(yyvsp[-2].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-2].TypeVal)->getDescription() + "'");
 
     if (STy->getNumContainedTypes() != 0)
       GEN_ERROR("Illegal number of initializers for structure type");
@@ -4002,26 +3828,26 @@
       GEN_ERROR("Unpacked Initializer to vector type '" +
                 STy->getDescription() + "'");
 
-    (yyval.ConstVal) = ConstantStruct::get(STy, std::vector<Constant*>());
-    delete (yyvsp[-2].TypeVal);
+    yyval.ConstVal = ConstantStruct::get(STy, std::vector<Constant*>());
+    delete yyvsp[-2].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 154:
-#line 1655 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1655 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-5].TypeVal)->get());
+    const StructType *STy = dyn_cast<StructType>(yyvsp[-5].TypeVal->get());
     if (STy == 0)
       GEN_ERROR("Cannot make struct constant with type: '" + 
-                     (*(yyvsp[-5].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-5].TypeVal)->getDescription() + "'");
 
-    if ((yyvsp[-2].ConstVector)->size() != STy->getNumContainedTypes())
+    if (yyvsp[-2].ConstVector->size() != STy->getNumContainedTypes())
       GEN_ERROR("Illegal number of initializers for structure type");
 
     // Check to ensure that constants are compatible with the type initializer!
-    for (unsigned i = 0, e = (yyvsp[-2].ConstVector)->size(); i != e; ++i)
-      if ((*(yyvsp[-2].ConstVector))[i]->getType() != STy->getElementType(i))
+    for (unsigned i = 0, e = yyvsp[-2].ConstVector->size(); i != e; ++i)
+      if ((*yyvsp[-2].ConstVector)[i]->getType() != STy->getElementType(i))
         GEN_ERROR("Expected type '" +
                        STy->getElementType(i)->getDescription() +
                        "' for element #" + utostr(i) +
@@ -4032,21 +3858,21 @@
       GEN_ERROR("Vector initializer to non-vector type '" + 
                 STy->getDescription() + "'");
 
-    (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[-2].ConstVector));
-    delete (yyvsp[-5].TypeVal); delete (yyvsp[-2].ConstVector);
+    yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-2].ConstVector);
+    delete yyvsp[-5].TypeVal; delete yyvsp[-2].ConstVector;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 155:
-#line 1681 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1681 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription());
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-4].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
+    const StructType *STy = dyn_cast<StructType>(yyvsp[-4].TypeVal->get());
     if (STy == 0)
       GEN_ERROR("Cannot make struct constant with type: '" + 
-                     (*(yyvsp[-4].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-4].TypeVal)->getDescription() + "'");
 
     if (STy->getNumContainedTypes() != 0)
       GEN_ERROR("Illegal number of initializers for structure type");
@@ -4056,45 +3882,45 @@
       GEN_ERROR("Vector initializer to non-vector type '" + 
                 STy->getDescription() + "'");
 
-    (yyval.ConstVal) = ConstantStruct::get(STy, std::vector<Constant*>());
-    delete (yyvsp[-4].TypeVal);
+    yyval.ConstVal = ConstantStruct::get(STy, std::vector<Constant*>());
+    delete yyvsp[-4].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 156:
-#line 1701 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1701 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    const PointerType *PTy = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
     if (PTy == 0)
       GEN_ERROR("Cannot make null pointer constant with type: '" + 
-                     (*(yyvsp[-1].TypeVal))->getDescription() + "'");
+                     (*yyvsp[-1].TypeVal)->getDescription() + "'");
 
-    (yyval.ConstVal) = ConstantPointerNull::get(PTy);
-    delete (yyvsp[-1].TypeVal);
+    yyval.ConstVal = ConstantPointerNull::get(PTy);
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 157:
-#line 1713 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1713 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    (yyval.ConstVal) = UndefValue::get((yyvsp[-1].TypeVal)->get());
-    delete (yyvsp[-1].TypeVal);
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get());
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 158:
-#line 1720 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1720 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    const PointerType *Ty = dyn_cast<PointerType>((yyvsp[-1].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    const PointerType *Ty = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
     if (Ty == 0)
       GEN_ERROR("Global const reference must be a pointer type");
 
@@ -4108,7 +3934,7 @@
     Function *SavedCurFn = CurFun.CurrentFunction;
     CurFun.CurrentFunction = 0;
 
-    Value *V = getExistingVal(Ty, (yyvsp[0].ValIDVal));
+    Value *V = getExistingVal(Ty, yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
 
     CurFun.CurrentFunction = SavedCurFn;
@@ -4123,16 +3949,16 @@
 
       // 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)));
+        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();
+        yyvsp[0].ValIDVal.destroy();
       } else {
         std::string Name;
-        if ((yyvsp[0].ValIDVal).Type == ValID::GlobalName)
-          Name = (yyvsp[0].ValIDVal).Name;
-        else if ((yyvsp[0].ValIDVal).Type != ValID::GlobalID)
+        if (yyvsp[0].ValIDVal.Type == ValID::GlobalName)
+          Name = yyvsp[0].ValIDVal.Name;
+        else if (yyvsp[0].ValIDVal.Type != ValID::GlobalID)
           GEN_ERROR("Invalid reference to global");
 
         // Create the forward referenced global.
@@ -4148,371 +3974,371 @@
         }
 
         // 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));
+        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, yyvsp[0].ValIDVal), GV));
         V = GV;
       }
     }
 
-    (yyval.ConstVal) = cast<GlobalValue>(V);
-    delete (yyvsp[-1].TypeVal);            // Free the type handle
+    yyval.ConstVal = cast<GlobalValue>(V);
+    delete yyvsp[-1].TypeVal;            // Free the type handle
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 159:
-#line 1786 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1786 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    if ((yyvsp[-1].TypeVal)->get() != (yyvsp[0].ConstVal)->getType())
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType())
       GEN_ERROR("Mismatched types for constant expression: " + 
-        (*(yyvsp[-1].TypeVal))->getDescription() + " and " + (yyvsp[0].ConstVal)->getType()->getDescription());
-    (yyval.ConstVal) = (yyvsp[0].ConstVal);
-    delete (yyvsp[-1].TypeVal);
+        (*yyvsp[-1].TypeVal)->getDescription() + " and " + yyvsp[0].ConstVal->getType()->getDescription());
+    yyval.ConstVal = yyvsp[0].ConstVal;
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 160:
-#line 1796 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1796 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    const Type *Ty = (yyvsp[-1].TypeVal)->get();
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    const Type *Ty = yyvsp[-1].TypeVal->get();
     if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
       GEN_ERROR("Cannot create a null initialized value of this type");
-    (yyval.ConstVal) = Constant::getNullValue(Ty);
-    delete (yyvsp[-1].TypeVal);
+    yyval.ConstVal = Constant::getNullValue(Ty);
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 161:
-#line 1806 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1806 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {      // integral constants
-    if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val)))
+    if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val))
       GEN_ERROR("Constant value doesn't fit in type");
-    (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val), true);
+    yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val, true);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 162:
-#line 1812 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1812 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {      // arbitrary precision integer constants
-    uint32_t BitWidth = cast<IntegerType>((yyvsp[-1].PrimType))->getBitWidth();
-    if ((yyvsp[0].APIntVal)->getBitWidth() > BitWidth) {
+    uint32_t BitWidth = cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth();
+    if (yyvsp[0].APIntVal->getBitWidth() > BitWidth) {
       GEN_ERROR("Constant value does not fit in type");
     }
-    (yyvsp[0].APIntVal)->sextOrTrunc(BitWidth);
-    (yyval.ConstVal) = ConstantInt::get(*(yyvsp[0].APIntVal));
-    delete (yyvsp[0].APIntVal);
+    yyvsp[0].APIntVal->sextOrTrunc(BitWidth);
+    yyval.ConstVal = ConstantInt::get(*yyvsp[0].APIntVal);
+    delete yyvsp[0].APIntVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 163:
-#line 1822 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1822 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {      // integral constants
-    if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val)))
+    if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val))
       GEN_ERROR("Constant value doesn't fit in type");
-    (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val), false);
+    yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val, false);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 164:
-#line 1828 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1828 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {      // arbitrary precision integer constants
-    uint32_t BitWidth = cast<IntegerType>((yyvsp[-1].PrimType))->getBitWidth();
-    if ((yyvsp[0].APIntVal)->getBitWidth() > BitWidth) {
+    uint32_t BitWidth = cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth();
+    if (yyvsp[0].APIntVal->getBitWidth() > BitWidth) {
       GEN_ERROR("Constant value does not fit in type");
     } 
-    (yyvsp[0].APIntVal)->zextOrTrunc(BitWidth);
-    (yyval.ConstVal) = ConstantInt::get(*(yyvsp[0].APIntVal));
-    delete (yyvsp[0].APIntVal);
+    yyvsp[0].APIntVal->zextOrTrunc(BitWidth);
+    yyval.ConstVal = ConstantInt::get(*yyvsp[0].APIntVal);
+    delete yyvsp[0].APIntVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 165:
-#line 1838 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1838 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                      // Boolean constants
-    assert(cast<IntegerType>((yyvsp[-1].PrimType))->getBitWidth() == 1 && "Not Bool?");
-    (yyval.ConstVal) = ConstantInt::getTrue();
+    assert(cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?");
+    yyval.ConstVal = ConstantInt::getTrue();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 166:
-#line 1843 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1843 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                     // Boolean constants
-    assert(cast<IntegerType>((yyvsp[-1].PrimType))->getBitWidth() == 1 && "Not Bool?");
-    (yyval.ConstVal) = ConstantInt::getFalse();
+    assert(cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?");
+    yyval.ConstVal = ConstantInt::getFalse();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 167:
-#line 1848 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1848 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                   // Float & Double constants
-    if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].FPVal)))
+    if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal))
       GEN_ERROR("Floating point constant invalid for type");
-    (yyval.ConstVal) = ConstantFP::get((yyvsp[-1].PrimType), (yyvsp[0].FPVal));
+    yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 168:
-#line 1856 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1856 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    Constant *Val = (yyvsp[-3].ConstVal);
-    const Type *DestTy = (yyvsp[-1].TypeVal)->get();
-    if (!CastInst::castIsValid((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), DestTy))
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    Constant *Val = yyvsp[-3].ConstVal;
+    const Type *DestTy = yyvsp[-1].TypeVal->get();
+    if (!CastInst::castIsValid(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy))
       GEN_ERROR("invalid cast opcode for cast from '" +
                 Val->getType()->getDescription() + "' to '" +
                 DestTy->getDescription() + "'"); 
-    (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), DestTy);
-    delete (yyvsp[-1].TypeVal);
-  ;}
+    yyval.ConstVal = ConstantExpr::getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy);
+    delete yyvsp[-1].TypeVal;
+  }
     break;
 
   case 169:
-#line 1868 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1868 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!isa<PointerType>((yyvsp[-2].ConstVal)->getType()))
+    if (!isa<PointerType>(yyvsp[-2].ConstVal->getType()))
       GEN_ERROR("GetElementPtr requires a pointer operand");
 
     const Type *IdxTy =
-      GetElementPtrInst::getIndexedType((yyvsp[-2].ConstVal)->getType(), &(*(yyvsp[-1].ValueList))[0], (yyvsp[-1].ValueList)->size(),
+      GetElementPtrInst::getIndexedType(yyvsp[-2].ConstVal->getType(), &(*yyvsp[-1].ValueList)[0], yyvsp[-1].ValueList->size(),
                                         true);
     if (!IdxTy)
       GEN_ERROR("Index list invalid for constant getelementptr");
 
     SmallVector<Constant*, 8> IdxVec;
-    for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e; ++i)
-      if (Constant *C = dyn_cast<Constant>((*(yyvsp[-1].ValueList))[i]))
+    for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i)
+      if (Constant *C = dyn_cast<Constant>((*yyvsp[-1].ValueList)[i]))
         IdxVec.push_back(C);
       else
         GEN_ERROR("Indices to constant getelementptr must be constants");
 
-    delete (yyvsp[-1].ValueList);
+    delete yyvsp[-1].ValueList;
 
-    (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal), &IdxVec[0], IdxVec.size());
+    yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, &IdxVec[0], IdxVec.size());
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 170:
-#line 1890 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1890 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-5].ConstVal)->getType() != Type::Int1Ty)
+    if (yyvsp[-5].ConstVal->getType() != Type::Int1Ty)
       GEN_ERROR("Select condition must be of boolean type");
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
       GEN_ERROR("Select operand types must match");
-    (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 171:
-#line 1898 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1898 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
       GEN_ERROR("Binary operator types must match");
     CHECK_FOR_ERROR;
-    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
-  ;}
+    yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
+  }
     break;
 
   case 172:
-#line 1904 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1904 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
       GEN_ERROR("Logical operator types must match");
-    if (!(yyvsp[-3].ConstVal)->getType()->isInteger()) {
-      if (Instruction::isShift((yyvsp[-5].BinaryOpVal)) || !isa<VectorType>((yyvsp[-3].ConstVal)->getType()) || 
-          !cast<VectorType>((yyvsp[-3].ConstVal)->getType())->getElementType()->isInteger())
+    if (!yyvsp[-3].ConstVal->getType()->isInteger()) {
+      if (Instruction::isShift(yyvsp[-5].BinaryOpVal) || !isa<VectorType>(yyvsp[-3].ConstVal->getType()) || 
+          !cast<VectorType>(yyvsp[-3].ConstVal->getType())->getElementType()->isInteger())
         GEN_ERROR("Logical operator requires integral operands");
     }
-    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 173:
-#line 1915 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1915 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
       GEN_ERROR("icmp operand types must match");
-    (yyval.ConstVal) = ConstantExpr::getICmp((yyvsp[-5].IPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
-  ;}
+    yyval.ConstVal = ConstantExpr::getICmp(yyvsp[-5].IPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
+  }
     break;
 
   case 174:
-#line 1920 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1920 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
       GEN_ERROR("fcmp operand types must match");
-    (yyval.ConstVal) = ConstantExpr::getFCmp((yyvsp[-5].FPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
-  ;}
+    yyval.ConstVal = ConstantExpr::getFCmp(yyvsp[-5].FPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
+  }
     break;
 
   case 175:
-#line 1925 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1925 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
+    if (!ExtractElementInst::isValidOperands(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
       GEN_ERROR("Invalid extractelement operands");
-    (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 176:
-#line 1931 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1931 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
+    if (!InsertElementInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
       GEN_ERROR("Invalid insertelement operands");
-    (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    yyval.ConstVal = ConstantExpr::getInsertElement(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 177:
-#line 1937 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1937 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
+    if (!ShuffleVectorInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
       GEN_ERROR("Invalid shufflevector operands");
-    (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    yyval.ConstVal = ConstantExpr::getShuffleVector(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 178:
-#line 1946 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1946 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal));
+    (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 179:
-#line 1950 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1950 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ConstVector) = new std::vector<Constant*>();
-    (yyval.ConstVector)->push_back((yyvsp[0].ConstVal));
+    yyval.ConstVector = new std::vector<Constant*>();
+    yyval.ConstVector->push_back(yyvsp[0].ConstVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 180:
-#line 1958 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.BoolVal) = false; ;}
+#line 1958 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.BoolVal = false; }
     break;
 
   case 181:
-#line 1958 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.BoolVal) = true; ;}
+#line 1958 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.BoolVal = true; }
     break;
 
   case 182:
-#line 1961 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.BoolVal) = true; ;}
+#line 1961 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.BoolVal = true; }
     break;
 
   case 183:
-#line 1961 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.BoolVal) = false; ;}
+#line 1961 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.BoolVal = false; }
     break;
 
   case 184:
-#line 1964 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1964 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    const Type* VTy = (yyvsp[-1].TypeVal)->get();
-    Value *V = getVal(VTy, (yyvsp[0].ValIDVal));
+    const Type* VTy = yyvsp[-1].TypeVal->get();
+    Value *V = getVal(VTy, yyvsp[0].ValIDVal);
     GlobalValue* Aliasee = dyn_cast<GlobalValue>(V);
     if (!Aliasee)
       GEN_ERROR("Aliases can be created only to global values");
 
-    (yyval.ConstVal) = Aliasee;
+    yyval.ConstVal = Aliasee;
     CHECK_FOR_ERROR
-    delete (yyvsp[-1].TypeVal);
-   ;}
+    delete yyvsp[-1].TypeVal;
+   }
     break;
 
   case 185:
-#line 1975 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1975 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    Constant *Val = (yyvsp[-3].ConstVal);
-    const Type *DestTy = (yyvsp[-1].TypeVal)->get();
-    if (!CastInst::castIsValid((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), DestTy))
+    Constant *Val = yyvsp[-3].ConstVal;
+    const Type *DestTy = yyvsp[-1].TypeVal->get();
+    if (!CastInst::castIsValid(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy))
       GEN_ERROR("invalid cast opcode for cast from '" +
                 Val->getType()->getDescription() + "' to '" +
                 DestTy->getDescription() + "'");
     
-    (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), DestTy);
+    yyval.ConstVal = ConstantExpr::getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy);
     CHECK_FOR_ERROR
-    delete (yyvsp[-1].TypeVal);
-   ;}
+    delete yyvsp[-1].TypeVal;
+   }
     break;
 
   case 186:
-#line 1996 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 1996 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule;
+    yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
     CurModule.ModuleDone();
     CHECK_FOR_ERROR;
-  ;}
+  }
     break;
 
   case 187:
-#line 2001 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2001 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule;
+    yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
     CurModule.ModuleDone();
     CHECK_FOR_ERROR;
-  ;}
+  }
     break;
 
   case 190:
-#line 2014 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { CurFun.isDeclare = false; ;}
+#line 2014 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { CurFun.isDeclare = false; }
     break;
 
   case 191:
-#line 2014 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2014 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     CurFun.FunctionDone();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 192:
-#line 2018 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { CurFun.isDeclare = true; ;}
+#line 2018 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { CurFun.isDeclare = true; }
     break;
 
   case 193:
-#line 2018 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2018 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 194:
-#line 2021 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2021 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 195:
-#line 2024 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2024 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
     // Eagerly resolve types.  This is not an optimization, this is a
     // requirement that is due to the fact that we could have this:
     //
@@ -4522,271 +4348,271 @@
     // If types are not resolved eagerly, then the two types will not be
     // determined to be the same type!
     //
-    ResolveTypeTo((yyvsp[-2].StrVal), *(yyvsp[0].TypeVal));
+    ResolveTypeTo(yyvsp[-2].StrVal, *yyvsp[0].TypeVal);
 
-    if (!setTypeName(*(yyvsp[0].TypeVal), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) {
+    if (!setTypeName(*yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) {
       CHECK_FOR_ERROR
       // If this is a named type that is not a redefinition, add it to the slot
       // table.
-      CurModule.Types.push_back(*(yyvsp[0].TypeVal));
+      CurModule.Types.push_back(*yyvsp[0].TypeVal);
     }
 
-    delete (yyvsp[0].TypeVal);
+    delete yyvsp[0].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 196:
-#line 2048 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2048 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    ResolveTypeTo((yyvsp[-2].StrVal), (yyvsp[0].PrimType));
+    ResolveTypeTo(yyvsp[-2].StrVal, yyvsp[0].PrimType);
 
-    if (!setTypeName((yyvsp[0].PrimType), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) {
+    if (!setTypeName(yyvsp[0].PrimType, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) {
       CHECK_FOR_ERROR
       // If this is a named type that is not a redefinition, add it to the slot
       // table.
-      CurModule.Types.push_back((yyvsp[0].PrimType));
+      CurModule.Types.push_back(yyvsp[0].PrimType);
     }
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 197:
-#line 2059 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2059 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     { 
     /* "Externally Visible" Linkage */
-    if ((yyvsp[0].ConstVal) == 0) 
+    if (yyvsp[0].ConstVal == 0) 
       GEN_ERROR("Global value initializer is not a constant");
-    CurGV = ParseGlobalVariable((yyvsp[-4].StrVal), GlobalValue::ExternalLinkage,
-                                (yyvsp[-3].Visibility), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal), (yyvsp[-2].BoolVal));
+    CurGV = ParseGlobalVariable(yyvsp[-4].StrVal, GlobalValue::ExternalLinkage,
+                                yyvsp[-3].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal, yyvsp[-2].BoolVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 198:
-#line 2066 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2066 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     CurGV = 0;
-  ;}
+  }
     break;
 
   case 199:
-#line 2070 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2070 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[0].ConstVal) == 0) 
+    if (yyvsp[0].ConstVal == 0) 
       GEN_ERROR("Global value initializer is not a constant");
-    CurGV = ParseGlobalVariable((yyvsp[-5].StrVal), (yyvsp[-4].Linkage), (yyvsp[-3].Visibility), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal), (yyvsp[-2].BoolVal));
+    CurGV = ParseGlobalVariable(yyvsp[-5].StrVal, yyvsp[-4].Linkage, yyvsp[-3].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal, yyvsp[-2].BoolVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 200:
-#line 2075 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2075 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     CurGV = 0;
-  ;}
+  }
     break;
 
   case 201:
-#line 2079 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2079 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription());
-    CurGV = ParseGlobalVariable((yyvsp[-5].StrVal), (yyvsp[-4].Linkage), (yyvsp[-3].Visibility), (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0, (yyvsp[-2].BoolVal));
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
+    CurGV = ParseGlobalVariable(yyvsp[-5].StrVal, yyvsp[-4].Linkage, yyvsp[-3].Visibility, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0, yyvsp[-2].BoolVal);
     CHECK_FOR_ERROR
-    delete (yyvsp[0].TypeVal);
-  ;}
+    delete yyvsp[0].TypeVal;
+  }
     break;
 
   case 202:
-#line 2085 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2085 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     CurGV = 0;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 203:
-#line 2089 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2089 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    std::string Name((yyvsp[-4].StrVal));
+    std::string Name(yyvsp[-4].StrVal);
     if (Name.empty())
       GEN_ERROR("Alias name cannot be empty");
     
-    Constant* Aliasee = (yyvsp[0].ConstVal);
+    Constant* Aliasee = yyvsp[0].ConstVal;
     if (Aliasee == 0)
-      GEN_ERROR(std::string("Invalid aliasee for alias: ") + (yyvsp[-4].StrVal));
+      GEN_ERROR(std::string("Invalid aliasee for alias: ") + yyvsp[-4].StrVal);
 
-    GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), (yyvsp[-1].Linkage), Name, Aliasee,
+    GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), yyvsp[-1].Linkage, Name, Aliasee,
                                       CurModule.CurrentModule);
-    GA->setVisibility((yyvsp[-3].Visibility));
+    GA->setVisibility(yyvsp[-3].Visibility);
     InsertValue(GA, CurModule.Values);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 204:
-#line 2104 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2104 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     { 
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 205:
-#line 2107 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2107 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 206:
-#line 2113 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2113 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
   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));
+  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);
   CHECK_FOR_ERROR
-;}
+}
     break;
 
   case 207:
-#line 2126 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2126 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
-  ;}
+    CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal);
+    free(yyvsp[0].StrVal);
+  }
     break;
 
   case 208:
-#line 2130 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2130 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
-  ;}
+    CurModule.CurrentModule->setDataLayout(yyvsp[0].StrVal);
+    free(yyvsp[0].StrVal);
+  }
     break;
 
   case 210:
-#line 2137 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2137 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-          CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
-          free((yyvsp[0].StrVal));
+          CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
+          free(yyvsp[0].StrVal);
           CHECK_FOR_ERROR
-        ;}
+        }
     break;
 
   case 211:
-#line 2142 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2142 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-          CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
-          free((yyvsp[0].StrVal));
+          CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
+          free(yyvsp[0].StrVal);
           CHECK_FOR_ERROR
-        ;}
+        }
     break;
 
   case 212:
-#line 2147 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2147 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
           CHECK_FOR_ERROR
-        ;}
+        }
     break;
 
   case 213:
-#line 2156 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2156 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    if (*(yyvsp[-2].TypeVal) == Type::VoidTy)
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    if (*yyvsp[-2].TypeVal == Type::VoidTy)
       GEN_ERROR("void typed arguments are invalid");
-    ArgListEntry E; E.Attrs = (yyvsp[-1].ParamAttrs); E.Ty = (yyvsp[-2].TypeVal); E.Name = (yyvsp[0].StrVal);
-    (yyval.ArgList) = (yyvsp[-4].ArgList);
-    (yyvsp[-4].ArgList)->push_back(E);
+    ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal;
+    yyval.ArgList = yyvsp[-4].ArgList;
+    yyvsp[-4].ArgList->push_back(E);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 214:
-#line 2166 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2166 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    if (*(yyvsp[-2].TypeVal) == Type::VoidTy)
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    if (*yyvsp[-2].TypeVal == Type::VoidTy)
       GEN_ERROR("void typed arguments are invalid");
-    ArgListEntry E; E.Attrs = (yyvsp[-1].ParamAttrs); E.Ty = (yyvsp[-2].TypeVal); E.Name = (yyvsp[0].StrVal);
-    (yyval.ArgList) = new ArgListType;
-    (yyval.ArgList)->push_back(E);
+    ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal;
+    yyval.ArgList = new ArgListType;
+    yyval.ArgList->push_back(E);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 215:
-#line 2177 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2177 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ArgList) = (yyvsp[0].ArgList);
+    yyval.ArgList = yyvsp[0].ArgList;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 216:
-#line 2181 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2181 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ArgList) = (yyvsp[-2].ArgList);
+    yyval.ArgList = yyvsp[-2].ArgList;
     struct ArgListEntry E;
     E.Ty = new PATypeHolder(Type::VoidTy);
     E.Name = 0;
     E.Attrs = ParamAttr::None;
-    (yyval.ArgList)->push_back(E);
+    yyval.ArgList->push_back(E);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 217:
-#line 2190 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2190 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ArgList) = new ArgListType;
+    yyval.ArgList = new ArgListType;
     struct ArgListEntry E;
     E.Ty = new PATypeHolder(Type::VoidTy);
     E.Name = 0;
     E.Attrs = ParamAttr::None;
-    (yyval.ArgList)->push_back(E);
+    yyval.ArgList->push_back(E);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 218:
-#line 2199 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2199 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ArgList) = 0;
+    yyval.ArgList = 0;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 219:
-#line 2205 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2205 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-  UnEscapeLexed((yyvsp[-6].StrVal));
-  std::string FunctionName((yyvsp[-6].StrVal));
-  free((yyvsp[-6].StrVal));  // Free strdup'd memory!
+  UnEscapeLexed(yyvsp[-6].StrVal);
+  std::string FunctionName(yyvsp[-6].StrVal);
+  free(yyvsp[-6].StrVal);  // Free strdup'd memory!
   
   // Check the function result for abstractness if this is a define. We should
   // have no abstract types at this point
-  if (!CurFun.isDeclare && CurModule.TypeIsUnresolved((yyvsp[-7].TypeVal)))
-    GEN_ERROR("Reference to abstract result: "+ (yyvsp[-7].TypeVal)->get()->getDescription());
+  if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(yyvsp[-7].TypeVal))
+    GEN_ERROR("Reference to abstract result: "+ yyvsp[-7].TypeVal->get()->getDescription());
 
   std::vector<const Type*> ParamTypeList;
   ParamAttrsVector Attrs;
-  if ((yyvsp[-2].ParamAttrs) != ParamAttr::None) {
-    ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = (yyvsp[-2].ParamAttrs);
+  if (yyvsp[-2].ParamAttrs != ParamAttr::None) {
+    ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = yyvsp[-2].ParamAttrs;
     Attrs.push_back(PAWI);
   }
-  if ((yyvsp[-4].ArgList)) {   // If there are arguments...
+  if (yyvsp[-4].ArgList) {   // If there are arguments...
     unsigned index = 1;
-    for (ArgListType::iterator I = (yyvsp[-4].ArgList)->begin(); I != (yyvsp[-4].ArgList)->end(); ++I, ++index) {
+    for (ArgListType::iterator I = yyvsp[-4].ArgList->begin(); I != yyvsp[-4].ArgList->end(); ++I, ++index) {
       const Type* Ty = I->Ty->get();
       if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(I->Ty))
         GEN_ERROR("Reference to abstract argument: " + Ty->getDescription());
@@ -4806,9 +4632,9 @@
   if (!Attrs.empty())
     PAL = ParamAttrsList::get(Attrs);
 
-  FunctionType *FT = FunctionType::get(*(yyvsp[-7].TypeVal), ParamTypeList, isVarArg, PAL);
+  FunctionType *FT = FunctionType::get(*yyvsp[-7].TypeVal, ParamTypeList, isVarArg, PAL);
   const PointerType *PFT = PointerType::get(FT);
-  delete (yyvsp[-7].TypeVal);
+  delete yyvsp[-7].TypeVal;
 
   ValID ID;
   if (!FunctionName.empty()) {
@@ -4857,26 +4683,26 @@
     Fn->setLinkage(CurFun.Linkage);
     Fn->setVisibility(CurFun.Visibility);
   }
-  Fn->setCallingConv((yyvsp[-8].UIntVal));
-  Fn->setAlignment((yyvsp[0].UIntVal));
-  if ((yyvsp[-1].StrVal)) {
-    Fn->setSection((yyvsp[-1].StrVal));
-    free((yyvsp[-1].StrVal));
+  Fn->setCallingConv(yyvsp[-8].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[-4].ArgList)) {                     // Is null if empty...
+  if (yyvsp[-4].ArgList) {                     // Is null if empty...
     if (isVarArg) {  // Nuke the last entry
-      assert((yyvsp[-4].ArgList)->back().Ty->get() == Type::VoidTy && (yyvsp[-4].ArgList)->back().Name == 0 &&
+      assert(yyvsp[-4].ArgList->back().Ty->get() == Type::VoidTy && yyvsp[-4].ArgList->back().Name == 0 &&
              "Not a varargs marker!");
-      delete (yyvsp[-4].ArgList)->back().Ty;
-      (yyvsp[-4].ArgList)->pop_back();  // Delete the last entry
+      delete yyvsp[-4].ArgList->back().Ty;
+      yyvsp[-4].ArgList->pop_back();  // Delete the last entry
     }
     Function::arg_iterator ArgIt = Fn->arg_begin();
     Function::arg_iterator ArgEnd = Fn->arg_end();
     unsigned Idx = 1;
-    for (ArgListType::iterator I = (yyvsp[-4].ArgList)->begin(); 
-         I != (yyvsp[-4].ArgList)->end() && ArgIt != ArgEnd; ++I, ++ArgIt) {
+    for (ArgListType::iterator I = yyvsp[-4].ArgList->begin(); 
+         I != yyvsp[-4].ArgList->end() && ArgIt != ArgEnd; ++I, ++ArgIt) {
       delete I->Ty;                          // Delete the typeholder...
       setValueName(ArgIt, I->Name);          // Insert arg into symtab...
       CHECK_FOR_ERROR
@@ -4884,128 +4710,128 @@
       Idx++;
     }
 
-    delete (yyvsp[-4].ArgList);                     // We're now done with the argument list
+    delete yyvsp[-4].ArgList;                     // We're now done with the argument list
   }
   CHECK_FOR_ERROR
-;}
+}
     break;
 
   case 222:
-#line 2328 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2328 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-  (yyval.FunctionVal) = CurFun.CurrentFunction;
+  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[-3].Linkage));
-  (yyval.FunctionVal)->setVisibility((yyvsp[-2].Visibility));
-;}
+  yyval.FunctionVal->setLinkage(yyvsp[-3].Linkage);
+  yyval.FunctionVal->setVisibility(yyvsp[-2].Visibility);
+}
     break;
 
   case 225:
-#line 2339 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2339 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-  (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+  yyval.FunctionVal = yyvsp[-1].FunctionVal;
   CHECK_FOR_ERROR
-;}
+}
     break;
 
   case 226:
-#line 2344 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2344 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    CurFun.CurrentFunction->setLinkage((yyvsp[-2].Linkage));
-    CurFun.CurrentFunction->setVisibility((yyvsp[-1].Visibility));
-    (yyval.FunctionVal) = CurFun.CurrentFunction;
+    CurFun.CurrentFunction->setLinkage(yyvsp[-2].Linkage);
+    CurFun.CurrentFunction->setVisibility(yyvsp[-1].Visibility);
+    yyval.FunctionVal = CurFun.CurrentFunction;
     CurFun.FunctionDone();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 227:
-#line 2356 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2356 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.BoolVal) = false;
+    yyval.BoolVal = false;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 228:
-#line 2360 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2360 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.BoolVal) = true;
+    yyval.BoolVal = true;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 229:
-#line 2365 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2365 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {    // A reference to a direct constant
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val));
+    yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 230:
-#line 2369 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2369 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val));
+    yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 231:
-#line 2373 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2373 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                     // Perhaps it's an FP constant?
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal));
+    yyval.ValIDVal = ValID::create(yyvsp[0].FPVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 232:
-#line 2377 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2377 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::create(ConstantInt::getTrue());
+    yyval.ValIDVal = ValID::create(ConstantInt::getTrue());
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 233:
-#line 2381 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2381 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::create(ConstantInt::getFalse());
+    yyval.ValIDVal = ValID::create(ConstantInt::getFalse());
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 234:
-#line 2385 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2385 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::createNull();
+    yyval.ValIDVal = ValID::createNull();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 235:
-#line 2389 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2389 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::createUndef();
+    yyval.ValIDVal = ValID::createUndef();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 236:
-#line 2393 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2393 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {     // A vector zero constant.
-    (yyval.ValIDVal) = ValID::createZeroInit();
+    yyval.ValIDVal = ValID::createZeroInit();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 237:
-#line 2397 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2397 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     { // Nonempty unsized packed vector
-    const Type *ETy = (*(yyvsp[-1].ConstVector))[0]->getType();
-    int NumElements = (yyvsp[-1].ConstVector)->size(); 
+    const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType();
+    int NumElements = yyvsp[-1].ConstVector->size(); 
     
     VectorType* pt = VectorType::get(ETy, NumElements);
     PATypeHolder* PTy = new PATypeHolder(
@@ -5017,233 +4843,233 @@
                                          );
     
     // Verify all elements are correct type!
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType())
+    for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
+      if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
                      ETy->getDescription() +"' as required!\nIt is of type '" +
-                     (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'.");
+                     (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
     }
 
-    (yyval.ValIDVal) = ValID::create(ConstantVector::get(pt, *(yyvsp[-1].ConstVector)));
-    delete PTy; delete (yyvsp[-1].ConstVector);
+    yyval.ValIDVal = ValID::create(ConstantVector::get(pt, *yyvsp[-1].ConstVector));
+    delete PTy; delete yyvsp[-1].ConstVector;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 238:
-#line 2422 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2422 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal));
+    yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 239:
-#line 2426 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2426 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    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));
+    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);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 240:
-#line 2440 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2440 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {  // Is it an integer reference...?
-    (yyval.ValIDVal) = ValID::createLocalID((yyvsp[0].UIntVal));
+    yyval.ValIDVal = ValID::createLocalID(yyvsp[0].UIntVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 241:
-#line 2444 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2444 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::createGlobalID((yyvsp[0].UIntVal));
+    yyval.ValIDVal = ValID::createGlobalID(yyvsp[0].UIntVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 242:
-#line 2448 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2448 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                   // Is it a named reference...?
-    (yyval.ValIDVal) = ValID::createLocalName((yyvsp[0].StrVal));
+    yyval.ValIDVal = ValID::createLocalName(yyvsp[0].StrVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 243:
-#line 2452 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2452 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                   // Is it a named reference...?
-    (yyval.ValIDVal) = ValID::createGlobalName((yyvsp[0].StrVal));
+    yyval.ValIDVal = ValID::createGlobalName(yyvsp[0].StrVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 246:
-#line 2464 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2464 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    (yyval.ValueVal) = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); 
-    delete (yyvsp[-1].TypeVal);
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); 
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 247:
-#line 2473 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2473 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+    yyval.FunctionVal = yyvsp[-1].FunctionVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 248:
-#line 2477 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2477 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     { // Do not allow functions with 0 basic blocks   
-    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+    yyval.FunctionVal = yyvsp[-1].FunctionVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 249:
-#line 2486 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2486 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal));
+    setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal);
     CHECK_FOR_ERROR
-    InsertValue((yyvsp[0].TermInstVal));
-    (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal));
-    (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal);
+    InsertValue(yyvsp[0].TermInstVal);
+    yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal);
+    yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 250:
-#line 2495 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2495 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (CastInst *CI1 = dyn_cast<CastInst>((yyvsp[0].InstVal)))
+    if (CastInst *CI1 = dyn_cast<CastInst>(yyvsp[0].InstVal))
       if (CastInst *CI2 = dyn_cast<CastInst>(CI1->getOperand(0)))
         if (CI2->getParent() == 0)
-          (yyvsp[-1].BasicBlockVal)->getInstList().push_back(CI2);
-    (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal));
-    (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal);
+          yyvsp[-1].BasicBlockVal->getInstList().push_back(CI2);
+    yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal);
+    yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 251:
-#line 2504 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2504 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {          // Empty space between instruction lists
-    (yyval.BasicBlockVal) = defineBBVal(ValID::createLocalID(CurFun.NextValNum));
+    yyval.BasicBlockVal = defineBBVal(ValID::createLocalID(CurFun.NextValNum));
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 252:
-#line 2508 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2508 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {             // Labelled (named) basic block
-    (yyval.BasicBlockVal) = defineBBVal(ValID::createLocalName((yyvsp[0].StrVal)));
+    yyval.BasicBlockVal = defineBBVal(ValID::createLocalName(yyvsp[0].StrVal));
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 253:
-#line 2513 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2513 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {              // Return with a result...
-    (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal));
+    yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 254:
-#line 2517 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2517 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                                    // Return with no result...
-    (yyval.TermInstVal) = new ReturnInst();
+    yyval.TermInstVal = new ReturnInst();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 255:
-#line 2521 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2521 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {                           // Unconditional Branch...
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.TermInstVal) = new BranchInst(tmpBB);
-  ;}
+    yyval.TermInstVal = new BranchInst(tmpBB);
+  }
     break;
 
   case 256:
-#line 2526 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2526 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {  
-    assert(cast<IntegerType>((yyvsp[-7].PrimType))->getBitWidth() == 1 && "Not Bool?");
-    BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal));
+    assert(cast<IntegerType>(yyvsp[-7].PrimType)->getBitWidth() == 1 && "Not Bool?");
+    BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal);
     CHECK_FOR_ERROR
-    BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    Value* tmpVal = getVal(Type::Int1Ty, (yyvsp[-6].ValIDVal));
+    Value* tmpVal = getVal(Type::Int1Ty, yyvsp[-6].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal);
-  ;}
+    yyval.TermInstVal = new BranchInst(tmpBBA, tmpBBB, tmpVal);
+  }
     break;
 
   case 257:
-#line 2536 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2536 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    Value* tmpVal = getVal((yyvsp[-7].PrimType), (yyvsp[-6].ValIDVal));
+    Value* tmpVal = getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal);
     CHECK_FOR_ERROR
-    BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal));
+    BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal);
     CHECK_FOR_ERROR
-    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size());
-    (yyval.TermInstVal) = S;
+    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();
+    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
         GEN_ERROR("Switch case is constant, but not a simple integer");
     }
-    delete (yyvsp[-1].JumpTable);
+    delete yyvsp[-1].JumpTable;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 258:
-#line 2555 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2555 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    Value* tmpVal = getVal((yyvsp[-6].PrimType), (yyvsp[-5].ValIDVal));
+    Value* tmpVal = getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal);
     CHECK_FOR_ERROR
-    BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal));
+    BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal);
     CHECK_FOR_ERROR
     SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
-    (yyval.TermInstVal) = S;
+    yyval.TermInstVal = S;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 259:
-#line 2565 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2565 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
 
     // Handle the short syntax
     const PointerType *PFTy = 0;
     const FunctionType *Ty = 0;
-    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-11].TypeVal)->get())) ||
+    if (!(PFTy = dyn_cast<PointerType>(yyvsp[-11].TypeVal->get())) ||
         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
       // Pull out the types of all of the arguments...
       std::vector<const Type*> ParamTypes;
       ParamAttrsVector Attrs;
-      if ((yyvsp[-6].ParamAttrs) != ParamAttr::None) {
+      if (yyvsp[-6].ParamAttrs != ParamAttr::None) {
         ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = 8;
         Attrs.push_back(PAWI);
       }
-      ValueRefList::iterator I = (yyvsp[-8].ValueRefList)->begin(), E = (yyvsp[-8].ValueRefList)->end();
+      ValueRefList::iterator I = yyvsp[-8].ValueRefList->begin(), E = yyvsp[-8].ValueRefList->end();
       unsigned index = 1;
       for (; I != E; ++I, ++index) {
         const Type *Ty = I->Val->getType();
@@ -5259,22 +5085,22 @@
       ParamAttrsList *PAL = 0;
       if (!Attrs.empty())
         PAL = ParamAttrsList::get(Attrs);
-      Ty = FunctionType::get((yyvsp[-11].TypeVal)->get(), ParamTypes, false, PAL);
+      Ty = FunctionType::get(yyvsp[-11].TypeVal->get(), ParamTypes, false, PAL);
       PFTy = PointerType::get(Ty);
     }
 
-    delete (yyvsp[-11].TypeVal);
+    delete yyvsp[-11].TypeVal;
 
-    Value *V = getVal(PFTy, (yyvsp[-10].ValIDVal));   // Get the function we're calling...
+    Value *V = getVal(PFTy, yyvsp[-10].ValIDVal);   // Get the function we're calling...
     CHECK_FOR_ERROR
-    BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal));
+    BasicBlock *Normal = getBBVal(yyvsp[-3].ValIDVal);
     CHECK_FOR_ERROR
-    BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock *Except = getBBVal(yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
 
     // Check the arguments
     ValueList Args;
-    if ((yyvsp[-8].ValueRefList)->empty()) {                                   // Has no arguments?
+    if (yyvsp[-8].ValueRefList->empty()) {                                   // Has no arguments?
       // Make sure no arguments is a good thing!
       if (Ty->getNumParams() != 0)
         GEN_ERROR("No arguments passed to a function that "
@@ -5284,7 +5110,7 @@
       // correctly!
       FunctionType::param_iterator I = Ty->param_begin();
       FunctionType::param_iterator E = Ty->param_end();
-      ValueRefList::iterator ArgI = (yyvsp[-8].ValueRefList)->begin(), ArgE = (yyvsp[-8].ValueRefList)->end();
+      ValueRefList::iterator ArgI = yyvsp[-8].ValueRefList->begin(), ArgE = yyvsp[-8].ValueRefList->end();
 
       for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
         if (ArgI->Val->getType() != *I)
@@ -5303,348 +5129,348 @@
 
     // Create the InvokeInst
     InvokeInst *II = new InvokeInst(V, Normal, Except, &Args[0], Args.size());
-    II->setCallingConv((yyvsp[-12].UIntVal));
-    (yyval.TermInstVal) = II;
-    delete (yyvsp[-8].ValueRefList);
+    II->setCallingConv(yyvsp[-12].UIntVal);
+    yyval.TermInstVal = II;
+    delete yyvsp[-8].ValueRefList;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 260:
-#line 2644 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2644 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TermInstVal) = new UnwindInst();
+    yyval.TermInstVal = new UnwindInst();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 261:
-#line 2648 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2648 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TermInstVal) = new UnreachableInst();
+    yyval.TermInstVal = new UnreachableInst();
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 262:
-#line 2655 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2655 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.JumpTable) = (yyvsp[-5].JumpTable);
-    Constant *V = cast<Constant>(getExistingVal((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal)));
+    yyval.JumpTable = yyvsp[-5].JumpTable;
+    Constant *V = cast<Constant>(getExistingVal(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
     CHECK_FOR_ERROR
     if (V == 0)
       GEN_ERROR("May only switch on a constant pool value");
 
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB));
-  ;}
+    yyval.JumpTable->push_back(std::make_pair(V, tmpBB));
+  }
     break;
 
   case 263:
-#line 2666 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2666 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.JumpTable) = new std::vector<std::pair<Constant*, BasicBlock*> >();
-    Constant *V = cast<Constant>(getExistingVal((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal)));
+    yyval.JumpTable = new std::vector<std::pair<Constant*, BasicBlock*> >();
+    Constant *V = cast<Constant>(getExistingVal(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
     CHECK_FOR_ERROR
 
     if (V == 0)
       GEN_ERROR("May only switch on a constant pool value");
 
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); 
-  ;}
+    yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); 
+  }
     break;
 
   case 264:
-#line 2679 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2679 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     // Is this definition named?? if so, assign the name...
-    setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal));
+    setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal);
     CHECK_FOR_ERROR
-    InsertValue((yyvsp[0].InstVal));
-    (yyval.InstVal) = (yyvsp[0].InstVal);
+    InsertValue(yyvsp[0].InstVal);
+    yyval.InstVal = yyvsp[0].InstVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 265:
-#line 2689 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2689 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {    // Used for PHI nodes
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-5].TypeVal))->getDescription());
-    (yyval.PHIList) = new std::list<std::pair<Value*, BasicBlock*> >();
-    Value* tmpVal = getVal(*(yyvsp[-5].TypeVal), (yyvsp[-3].ValIDVal));
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-5].TypeVal)->getDescription());
+    yyval.PHIList = new std::list<std::pair<Value*, BasicBlock*> >();
+    Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal);
     CHECK_FOR_ERROR
-    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+    BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
-    delete (yyvsp[-5].TypeVal);
-  ;}
+    yyval.PHIList->push_back(std::make_pair(tmpVal, tmpBB));
+    delete yyvsp[-5].TypeVal;
+  }
     break;
 
   case 266:
-#line 2700 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2700 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.PHIList) = (yyvsp[-6].PHIList);
-    Value* tmpVal = getVal((yyvsp[-6].PHIList)->front().first->getType(), (yyvsp[-3].ValIDVal));
+    yyval.PHIList = yyvsp[-6].PHIList;
+    Value* tmpVal = getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal);
     CHECK_FOR_ERROR
-    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+    BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal);
     CHECK_FOR_ERROR
-    (yyvsp[-6].PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
-  ;}
+    yyvsp[-6].PHIList->push_back(std::make_pair(tmpVal, tmpBB));
+  }
     break;
 
   case 267:
-#line 2710 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2710 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {    
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
     // Used for call and invoke instructions
-    (yyval.ValueRefList) = new ValueRefList();
-    ValueRefListEntry E; E.Attrs = (yyvsp[0].ParamAttrs); E.Val = getVal((yyvsp[-2].TypeVal)->get(), (yyvsp[-1].ValIDVal));
-    (yyval.ValueRefList)->push_back(E);
-    delete (yyvsp[-2].TypeVal);
-  ;}
+    yyval.ValueRefList = new ValueRefList();
+    ValueRefListEntry E; E.Attrs = yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-2].TypeVal->get(), yyvsp[-1].ValIDVal);
+    yyval.ValueRefList->push_back(E);
+    delete yyvsp[-2].TypeVal;
+  }
     break;
 
   case 268:
-#line 2719 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2719 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    (yyval.ValueRefList) = (yyvsp[-4].ValueRefList);
-    ValueRefListEntry E; E.Attrs = (yyvsp[0].ParamAttrs); E.Val = getVal((yyvsp[-2].TypeVal)->get(), (yyvsp[-1].ValIDVal));
-    (yyval.ValueRefList)->push_back(E);
-    delete (yyvsp[-2].TypeVal);
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    yyval.ValueRefList = yyvsp[-4].ValueRefList;
+    ValueRefListEntry E; E.Attrs = yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-2].TypeVal->get(), yyvsp[-1].ValIDVal);
+    yyval.ValueRefList->push_back(E);
+    delete yyvsp[-2].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 269:
-#line 2728 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ValueRefList) = new ValueRefList(); ;}
+#line 2728 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ValueRefList = new ValueRefList(); }
     break;
 
   case 270:
-#line 2731 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.ValueList) = new std::vector<Value*>(); ;}
+#line 2731 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+    { yyval.ValueList = new std::vector<Value*>(); }
     break;
 
   case 271:
-#line 2732 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2732 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValueList) = (yyvsp[-2].ValueList);
-    (yyval.ValueList)->push_back((yyvsp[0].ValueVal));
+    yyval.ValueList = yyvsp[-2].ValueList;
+    yyval.ValueList->push_back(yyvsp[0].ValueVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 272:
-#line 2739 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2739 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.BoolVal) = true;
+    yyval.BoolVal = true;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 273:
-#line 2743 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2743 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.BoolVal) = false;
+    yyval.BoolVal = false;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 274:
-#line 2748 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2748 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription());
-    if (!(*(yyvsp[-3].TypeVal))->isInteger() && !(*(yyvsp[-3].TypeVal))->isFloatingPoint() && 
-        !isa<VectorType>((*(yyvsp[-3].TypeVal)).get()))
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
+    if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && 
+        !isa<VectorType>((*yyvsp[-3].TypeVal).get()))
       GEN_ERROR(
         "Arithmetic operator requires integer, FP, or packed operands");
-    if (isa<VectorType>((*(yyvsp[-3].TypeVal)).get()) && 
-        ((yyvsp[-4].BinaryOpVal) == Instruction::URem || 
-         (yyvsp[-4].BinaryOpVal) == Instruction::SRem ||
-         (yyvsp[-4].BinaryOpVal) == Instruction::FRem))
+    if (isa<VectorType>((*yyvsp[-3].TypeVal).get()) && 
+        (yyvsp[-4].BinaryOpVal == Instruction::URem || 
+         yyvsp[-4].BinaryOpVal == Instruction::SRem ||
+         yyvsp[-4].BinaryOpVal == Instruction::FRem))
       GEN_ERROR("Remainder not supported on vector types");
-    Value* val1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); 
+    Value* val1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); 
     CHECK_FOR_ERROR
-    Value* val2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* val2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), val1, val2);
-    if ((yyval.InstVal) == 0)
+    yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, val1, val2);
+    if (yyval.InstVal == 0)
       GEN_ERROR("binary operator returned null");
-    delete (yyvsp[-3].TypeVal);
-  ;}
+    delete yyvsp[-3].TypeVal;
+  }
     break;
 
   case 275:
-#line 2769 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2769 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription());
-    if (!(*(yyvsp[-3].TypeVal))->isInteger()) {
-      if (Instruction::isShift((yyvsp[-4].BinaryOpVal)) || !isa<VectorType>((yyvsp[-3].TypeVal)->get()) ||
-          !cast<VectorType>((yyvsp[-3].TypeVal)->get())->getElementType()->isInteger())
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
+    if (!(*yyvsp[-3].TypeVal)->isInteger()) {
+      if (Instruction::isShift(yyvsp[-4].BinaryOpVal) || !isa<VectorType>(yyvsp[-3].TypeVal->get()) ||
+          !cast<VectorType>(yyvsp[-3].TypeVal->get())->getElementType()->isInteger())
         GEN_ERROR("Logical operator requires integral operands");
     }
-    Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal));
+    Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
     CHECK_FOR_ERROR
-    Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2);
-    if ((yyval.InstVal) == 0)
+    yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2);
+    if (yyval.InstVal == 0)
       GEN_ERROR("binary operator returned null");
-    delete (yyvsp[-3].TypeVal);
-  ;}
+    delete yyvsp[-3].TypeVal;
+  }
     break;
 
   case 276:
-#line 2786 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2786 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription());
-    if (isa<VectorType>((*(yyvsp[-3].TypeVal)).get()))
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
+    if (isa<VectorType>((*yyvsp[-3].TypeVal).get()))
       GEN_ERROR("Vector types not supported by icmp instruction");
-    Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal));
+    Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
     CHECK_FOR_ERROR
-    Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].IPredicate), tmpVal1, tmpVal2);
-    if ((yyval.InstVal) == 0)
+    yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].IPredicate, tmpVal1, tmpVal2);
+    if (yyval.InstVal == 0)
       GEN_ERROR("icmp operator returned null");
-    delete (yyvsp[-3].TypeVal);
-  ;}
+    delete yyvsp[-3].TypeVal;
+  }
     break;
 
   case 277:
-#line 2800 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2800 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription());
-    if (isa<VectorType>((*(yyvsp[-3].TypeVal)).get()))
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
+    if (isa<VectorType>((*yyvsp[-3].TypeVal).get()))
       GEN_ERROR("Vector types not supported by fcmp instruction");
-    Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal));
+    Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
     CHECK_FOR_ERROR
-    Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].FPredicate), tmpVal1, tmpVal2);
-    if ((yyval.InstVal) == 0)
+    yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].FPredicate, tmpVal1, tmpVal2);
+    if (yyval.InstVal == 0)
       GEN_ERROR("fcmp operator returned null");
-    delete (yyvsp[-3].TypeVal);
-  ;}
+    delete yyvsp[-3].TypeVal;
+  }
     break;
 
   case 278:
-#line 2814 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2814 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription());
-    Value* Val = (yyvsp[-2].ValueVal);
-    const Type* DestTy = (yyvsp[0].TypeVal)->get();
-    if (!CastInst::castIsValid((yyvsp[-3].CastOpVal), Val, DestTy))
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
+    Value* Val = yyvsp[-2].ValueVal;
+    const Type* DestTy = yyvsp[0].TypeVal->get();
+    if (!CastInst::castIsValid(yyvsp[-3].CastOpVal, Val, DestTy))
       GEN_ERROR("invalid cast opcode for cast from '" +
                 Val->getType()->getDescription() + "' to '" +
                 DestTy->getDescription() + "'"); 
-    (yyval.InstVal) = CastInst::create((yyvsp[-3].CastOpVal), Val, DestTy);
-    delete (yyvsp[0].TypeVal);
-  ;}
+    yyval.InstVal = CastInst::create(yyvsp[-3].CastOpVal, Val, DestTy);
+    delete yyvsp[0].TypeVal;
+  }
     break;
 
   case 279:
-#line 2826 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2826 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-4].ValueVal)->getType() != Type::Int1Ty)
+    if (yyvsp[-4].ValueVal->getType() != Type::Int1Ty)
       GEN_ERROR("select condition must be boolean");
-    if ((yyvsp[-2].ValueVal)->getType() != (yyvsp[0].ValueVal)->getType())
+    if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType())
       GEN_ERROR("select value types should match");
-    (yyval.InstVal) = new SelectInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 280:
-#line 2834 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2834 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription());
-    (yyval.InstVal) = new VAArgInst((yyvsp[-2].ValueVal), *(yyvsp[0].TypeVal));
-    delete (yyvsp[0].TypeVal);
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
+    yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal);
+    delete yyvsp[0].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 281:
-#line 2841 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2841 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
+    if (!ExtractElementInst::isValidOperands(yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
       GEN_ERROR("Invalid extractelement operands");
-    (yyval.InstVal) = new ExtractElementInst((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 282:
-#line 2847 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2847 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
+    if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
       GEN_ERROR("Invalid insertelement operands");
-    (yyval.InstVal) = new InsertElementInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    yyval.InstVal = new InsertElementInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 283:
-#line 2853 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2853 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
+    if (!ShuffleVectorInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
       GEN_ERROR("Invalid shufflevector operands");
-    (yyval.InstVal) = new ShuffleVectorInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    yyval.InstVal = new ShuffleVectorInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 284:
-#line 2859 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2859 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    const Type *Ty = (yyvsp[0].PHIList)->front().first->getType();
+    const Type *Ty = yyvsp[0].PHIList->front().first->getType();
     if (!Ty->isFirstClassType())
       GEN_ERROR("PHI node operands must be of first class type");
-    (yyval.InstVal) = new PHINode(Ty);
-    ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[0].PHIList)->size());
-    while ((yyvsp[0].PHIList)->begin() != (yyvsp[0].PHIList)->end()) {
-      if ((yyvsp[0].PHIList)->front().first->getType() != Ty) 
+    yyval.InstVal = new PHINode(Ty);
+    ((PHINode*)yyval.InstVal)->reserveOperandSpace(yyvsp[0].PHIList->size());
+    while (yyvsp[0].PHIList->begin() != yyvsp[0].PHIList->end()) {
+      if (yyvsp[0].PHIList->front().first->getType() != Ty) 
         GEN_ERROR("All elements of a PHI node must be of the same type");
-      cast<PHINode>((yyval.InstVal))->addIncoming((yyvsp[0].PHIList)->front().first, (yyvsp[0].PHIList)->front().second);
-      (yyvsp[0].PHIList)->pop_front();
+      cast<PHINode>(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second);
+      yyvsp[0].PHIList->pop_front();
     }
-    delete (yyvsp[0].PHIList);  // Free the list...
+    delete yyvsp[0].PHIList;  // Free the list...
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 285:
-#line 2875 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2875 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
 
     // Handle the short syntax
     const PointerType *PFTy = 0;
     const FunctionType *Ty = 0;
-    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-5].TypeVal)->get())) ||
+    if (!(PFTy = dyn_cast<PointerType>(yyvsp[-5].TypeVal->get())) ||
         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
       // Pull out the types of all of the arguments...
       std::vector<const Type*> ParamTypes;
       ParamAttrsVector Attrs;
-      if ((yyvsp[0].ParamAttrs) != ParamAttr::None) {
-        ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = (yyvsp[0].ParamAttrs);
+      if (yyvsp[0].ParamAttrs != ParamAttr::None) {
+        ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = yyvsp[0].ParamAttrs;
         Attrs.push_back(PAWI);
       }
       unsigned index = 1;
-      ValueRefList::iterator I = (yyvsp[-2].ValueRefList)->begin(), E = (yyvsp[-2].ValueRefList)->end();
+      ValueRefList::iterator I = yyvsp[-2].ValueRefList->begin(), E = yyvsp[-2].ValueRefList->end();
       for (; I != E; ++I, ++index) {
         const Type *Ty = I->Val->getType();
         if (Ty == Type::VoidTy)
@@ -5660,11 +5486,11 @@
       if (!Attrs.empty())
         PAL = ParamAttrsList::get(Attrs);
 
-      Ty = FunctionType::get((yyvsp[-5].TypeVal)->get(), ParamTypes, false, PAL);
+      Ty = FunctionType::get(yyvsp[-5].TypeVal->get(), ParamTypes, false, PAL);
       PFTy = PointerType::get(Ty);
     }
 
-    Value *V = getVal(PFTy, (yyvsp[-4].ValIDVal));   // Get the function we're calling...
+    Value *V = getVal(PFTy, yyvsp[-4].ValIDVal);   // Get the function we're calling...
     CHECK_FOR_ERROR
 
     // Check for call to invalid intrinsic to avoid crashing later.
@@ -5678,7 +5504,7 @@
 
     // Check the arguments 
     ValueList Args;
-    if ((yyvsp[-2].ValueRefList)->empty()) {                                   // Has no arguments?
+    if (yyvsp[-2].ValueRefList->empty()) {                                   // Has no arguments?
       // Make sure no arguments is a good thing!
       if (Ty->getNumParams() != 0)
         GEN_ERROR("No arguments passed to a function that "
@@ -5689,7 +5515,7 @@
       //
       FunctionType::param_iterator I = Ty->param_begin();
       FunctionType::param_iterator E = Ty->param_end();
-      ValueRefList::iterator ArgI = (yyvsp[-2].ValueRefList)->begin(), ArgE = (yyvsp[-2].ValueRefList)->end();
+      ValueRefList::iterator ArgI = yyvsp[-2].ValueRefList->begin(), ArgE = yyvsp[-2].ValueRefList->end();
 
       for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
         if (ArgI->Val->getType() != *I)
@@ -5706,166 +5532,174 @@
     }
     // Create the call node
     CallInst *CI = new CallInst(V, &Args[0], Args.size());
-    CI->setTailCall((yyvsp[-7].BoolVal));
-    CI->setCallingConv((yyvsp[-6].UIntVal));
-    (yyval.InstVal) = CI;
-    delete (yyvsp[-2].ValueRefList);
-    delete (yyvsp[-5].TypeVal);
+    CI->setTailCall(yyvsp[-7].BoolVal);
+    CI->setCallingConv(yyvsp[-6].UIntVal);
+    yyval.InstVal = CI;
+    delete yyvsp[-2].ValueRefList;
+    delete yyvsp[-5].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 286:
-#line 2959 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2959 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.InstVal) = (yyvsp[0].InstVal);
+    yyval.InstVal = yyvsp[0].InstVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 287:
-#line 2964 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2964 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.BoolVal) = true;
+    yyval.BoolVal = true;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 288:
-#line 2968 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2968 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.BoolVal) = false;
+    yyval.BoolVal = false;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 289:
-#line 2975 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2975 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    (yyval.InstVal) = new MallocInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal));
-    delete (yyvsp[-1].TypeVal);
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal);
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 290:
-#line 2982 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2982 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription());
-    Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal));
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
+    Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new MallocInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal));
-    delete (yyvsp[-4].TypeVal);
-  ;}
+    yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal);
+    delete yyvsp[-4].TypeVal;
+  }
     break;
 
   case 291:
-#line 2990 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2990 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription());
-    (yyval.InstVal) = new AllocaInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal));
-    delete (yyvsp[-1].TypeVal);
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
+    yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal);
+    delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 292:
-#line 2997 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 2997 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription());
-    Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal));
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
+    Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new AllocaInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal));
-    delete (yyvsp[-4].TypeVal);
-  ;}
+    yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal);
+    delete yyvsp[-4].TypeVal;
+  }
     break;
 
   case 293:
-#line 3005 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 3005 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!isa<PointerType>((yyvsp[0].ValueVal)->getType()))
+    if (!isa<PointerType>(yyvsp[0].ValueVal->getType()))
       GEN_ERROR("Trying to free nonpointer type " + 
-                     (yyvsp[0].ValueVal)->getType()->getDescription() + "");
-    (yyval.InstVal) = new FreeInst((yyvsp[0].ValueVal));
+                     yyvsp[0].ValueVal->getType()->getDescription() + "");
+    yyval.InstVal = new FreeInst(yyvsp[0].ValueVal);
     CHECK_FOR_ERROR
-  ;}
+  }
     break;
 
   case 294:
-#line 3013 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 3013 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    if (!isa<PointerType>((yyvsp[-2].TypeVal)->get()))
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    if (!isa<PointerType>(yyvsp[-2].TypeVal->get()))
       GEN_ERROR("Can't load from nonpointer type: " +
-                     (*(yyvsp[-2].TypeVal))->getDescription());
-    if (!cast<PointerType>((yyvsp[-2].TypeVal)->get())->getElementType()->isFirstClassType())
+                     (*yyvsp[-2].TypeVal)->getDescription());
+    if (!cast<PointerType>(yyvsp[-2].TypeVal->get())->getElementType()->isFirstClassType())
       GEN_ERROR("Can't load from pointer of non-first-class type: " +
-                     (*(yyvsp[-2].TypeVal))->getDescription());
-    Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal));
+                     (*yyvsp[-2].TypeVal)->getDescription());
+    Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[-4].BoolVal), (yyvsp[0].UIntVal));
-    delete (yyvsp[-2].TypeVal);
-  ;}
+    yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-4].BoolVal, yyvsp[0].UIntVal);
+    delete yyvsp[-2].TypeVal;
+  }
     break;
 
   case 295:
-#line 3027 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 3027 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    const PointerType *PT = dyn_cast<PointerType>((yyvsp[-2].TypeVal)->get());
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    const PointerType *PT = dyn_cast<PointerType>(yyvsp[-2].TypeVal->get());
     if (!PT)
       GEN_ERROR("Can't store to a nonpointer type: " +
-                     (*(yyvsp[-2].TypeVal))->getDescription());
+                     (*yyvsp[-2].TypeVal)->getDescription());
     const Type *ElTy = PT->getElementType();
-    if (ElTy != (yyvsp[-4].ValueVal)->getType())
-      GEN_ERROR("Can't store '" + (yyvsp[-4].ValueVal)->getType()->getDescription() +
+    if (ElTy != yyvsp[-4].ValueVal->getType())
+      GEN_ERROR("Can't store '" + yyvsp[-4].ValueVal->getType()->getDescription() +
                      "' into space of type '" + ElTy->getDescription() + "'");
 
-    Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal));
+    Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new StoreInst((yyvsp[-4].ValueVal), tmpVal, (yyvsp[-6].BoolVal), (yyvsp[0].UIntVal));
-    delete (yyvsp[-2].TypeVal);
-  ;}
+    yyval.InstVal = new StoreInst(yyvsp[-4].ValueVal, tmpVal, yyvsp[-6].BoolVal, yyvsp[0].UIntVal);
+    delete yyvsp[-2].TypeVal;
+  }
     break;
 
   case 296:
-#line 3044 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 3044 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription());
-    if (!isa<PointerType>((yyvsp[-2].TypeVal)->get()))
+      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
+    if (!isa<PointerType>(yyvsp[-2].TypeVal->get()))
       GEN_ERROR("getelementptr insn requires pointer operand");
 
-    if (!GetElementPtrInst::getIndexedType(*(yyvsp[-2].TypeVal), &(*(yyvsp[0].ValueList))[0], (yyvsp[0].ValueList)->size(), true))
+    if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, &(*yyvsp[0].ValueList)[0], yyvsp[0].ValueList->size(), true))
       GEN_ERROR("Invalid getelementptr indices for type '" +
-                     (*(yyvsp[-2].TypeVal))->getDescription()+ "'");
-    Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal));
+                     (*yyvsp[-2].TypeVal)->getDescription()+ "'");
+    Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new GetElementPtrInst(tmpVal, &(*(yyvsp[0].ValueList))[0], (yyvsp[0].ValueList)->size());
-    delete (yyvsp[-2].TypeVal); 
-    delete (yyvsp[0].ValueList);
-  ;}
+    yyval.InstVal = new GetElementPtrInst(tmpVal, &(*yyvsp[0].ValueList)[0], yyvsp[0].ValueList->size());
+    delete yyvsp[-2].TypeVal; 
+    delete yyvsp[0].ValueList;
+  }
     break;
 
 
-      default: break;
     }
 
-/* Line 1126 of yacc.c.  */
-#line 5863 "llvmAsmParser.tab.c"
+/* Line 1016 of /usr/local/share/bison/yacc.c.  */
+#line 5688 "llvmAsmParser.tab.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
 
 
-  YY_STACK_PRINT (yyss, yyssp);
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+	YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
 
   *++yyvsp = yyval;
 
@@ -5898,153 +5732,90 @@
 
       if (YYPACT_NINF < yyn && yyn < YYLAST)
 	{
+	  YYSIZE_T yysize = 0;
 	  int yytype = YYTRANSLATE (yychar);
-	  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;
+	  char *yymsg;
+	  int yyx, yycount;
 
-#if 0
-	  /* This is so xgettext sees the translatable formats that are
-	     constructed on the fly.  */
-	  YY_("syntax error, unexpected %s");
-	  YY_("syntax error, unexpected %s, expecting %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-#endif
-	  char *yyfmt;
-	  char const *yyf;
-	  static char const yyunexpected[] = "syntax error, unexpected %s";
-	  static char const yyexpecting[] = ", expecting %s";
-	  static char const yyor[] = " or %s";
-	  char yyformat[sizeof yyunexpected
-			+ sizeof yyexpecting - 1
-			+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-			   * (sizeof yyor - 1))];
-	  char const *yyprefix = yyexpecting;
-
+	  yycount = 0;
 	  /* Start YYX at -YYN if negative to avoid negative indexes in
 	     YYCHECK.  */
-	  int yyxbegin = yyn < 0 ? -yyn : 0;
-
-	  /* Stay within bounds of both yycheck and yytname.  */
-	  int yychecklim = YYLAST - yyn;
-	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-	  int yycount = 1;
-
-	  yyarg[0] = yytname[yytype];
-	  yyfmt = yystpcpy (yyformat, yyunexpected);
-
-	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	  for (yyx = yyn < 0 ? -yyn : 0;
+	       yyx < (int) (sizeof (yytname) / sizeof (char *)); 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)
+	      yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+	  yysize += yystrlen ("parse error, unexpected ") + 1;
+	  yysize += yystrlen (yytname[yytype]);
+	  yymsg = (char *) YYSTACK_ALLOC (yysize);
+	  if (yymsg != 0)
 	    {
-	      /* 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))
+	      char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+	      yyp = yystpcpy (yyp, yytname[yytype]);
+
+	      if (yycount < 5)
 		{
-		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		    {
-		      yyp += yytnamerr (yyp, yyarg[yyi++]);
-		      yyf += 2;
-		    }
-		  else
-		    {
-		      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++;
+		      }
 		}
 	      yyerror (yymsg);
 	      YYSTACK_FREE (yymsg);
 	    }
 	  else
-	    {
-	      yyerror (YY_("syntax error"));
-	      goto yyexhaustedlab;
-	    }
+	    yyerror ("parse error; also virtual memory exhausted");
 	}
       else
 #endif /* YYERROR_VERBOSE */
-	yyerror (YY_("syntax error"));
+	yyerror ("parse error");
     }
+  goto yyerrlab1;
 
 
-
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
   if (yyerrstatus == 3)
     {
-      /* If just tried and failed to reuse look-ahead token after an
+      /* If just tried and failed to reuse lookahead token after an
 	 error, discard it.  */
 
-      if (yychar <= YYEOF)
+      /* Return failure if at end of input.  */
+      if (yychar == YYEOF)
         {
-	  /* Return failure if at end of input.  */
-	  if (yychar == YYEOF)
-	    YYABORT;
+	  /* 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;
         }
-      else
-	{
-	  yydestruct ("Error: discarding", yytoken, &yylval);
-	  yychar = YYEMPTY;
-	}
+
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+		  yychar, yytname[yychar1]));
+      yydestruct (yychar1, yylval);
+      yychar = YYEMPTY;
     }
 
-  /* Else will try to reuse look-ahead token after shifting the error
+  /* Else will try to reuse lookahead token after shifting the error
      token.  */
-  goto yyerrlab1;
 
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR.  |
-`---------------------------------------------------*/
-yyerrorlab:
-
-  /* Pacify compilers like GCC when the user code never invokes
-     YYERROR and the label yyerrorlab therefore never appears in user
-     code.  */
-  if (0)
-     goto yyerrorlab;
-
-yyvsp -= yylen;
-  yyssp -= yylen;
-  yystate = *yyssp;
-  goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR.  |
-`-------------------------------------------------------------*/
-yyerrlab1:
   yyerrstatus = 3;	/* Each real token shifted decrements this.  */
 
   for (;;)
@@ -6065,22 +5836,36 @@
       if (yyssp == yyss)
 	YYABORT;
 
+      YYDPRINTF ((stderr, "Error: popping "));
+      YYDSYMPRINT ((stderr,
+		    yystos[*yyssp], *yyvsp));
+      YYDPRINTF ((stderr, "\n"));
 
-      yydestruct ("Error: popping", yystos[yystate], yyvsp);
-      YYPOPSTACK;
-      yystate = *yyssp;
-      YY_STACK_PRINT (yyss, yyssp);
+      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
     }
 
   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;
 
@@ -6100,25 +5885,16 @@
   goto yyreturn;
 
 #ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here.  |
-`-------------------------------------------------*/
-yyexhaustedlab:
-  yyerror (YY_("memory exhausted"));
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
   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);
@@ -6127,7 +5903,7 @@
 }
 
 
-#line 3061 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
+#line 3061 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
 
 
 // common code from the two 'RunVMAsmParser' functions
diff --git a/lib/AsmParser/llvmAsmParser.h.cvs b/lib/AsmParser/llvmAsmParser.h.cvs
index 1346dec..bd861e5 100644
--- a/lib/AsmParser/llvmAsmParser.h.cvs
+++ b/lib/AsmParser/llvmAsmParser.h.cvs
@@ -1,7 +1,7 @@
-/* A Bison parser, made by GNU Bison 2.1.  */
+/* A Bison parser, made from /usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y, by GNU bison 1.75.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 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,14 +15,17 @@
 
    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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 /* As a special exception, when this file is copied by Bison into a
    Bison output file, you may use that output file without restriction.
    This special exception was added by the Free Software Foundation
    in version 1.24 of Bison.  */
 
+#ifndef BISON_LLVMASMPARSER_TAB_H
+# define BISON_LLVMASMPARSER_TAB_H
+
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
@@ -164,7 +167,6 @@
      HIDDEN = 390
    };
 #endif
-/* Tokens.  */
 #define ESINT64VAL 258
 #define EUINT64VAL 259
 #define ESAPINTVAL 260
@@ -302,9 +304,9 @@
 
 
 
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 955 "/proj/llvm/llvm-2/lib/AsmParser/llvmAsmParser.y"
-typedef union YYSTYPE {
+#ifndef YYSTYPE
+#line 955 "/usr/home/jeffc/llvm/lib/AsmParser/llvmAsmParser.y"
+typedef union {
   llvm::Module                           *ModuleVal;
   llvm::Function                         *FunctionVal;
   llvm::BasicBlock                       *BasicBlockVal;
@@ -349,15 +351,14 @@
   llvm::Instruction::OtherOps       OtherOpVal;
   llvm::ICmpInst::Predicate         IPredicate;
   llvm::FCmpInst::Predicate         FPredicate;
-} YYSTYPE;
-/* Line 1447 of yacc.c.  */
-#line 355 "llvmAsmParser.tab.h"
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
+} yystype;
+/* Line 1237 of /usr/local/share/bison/yacc.c.  */
+#line 357 "llvmAsmParser.tab.h"
+# define YYSTYPE yystype
 #endif
 
 extern YYSTYPE llvmAsmlval;
 
 
+#endif /* not BISON_LLVMASMPARSER_TAB_H */
 
diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp
index 3c1ee90..9603535 100644
--- a/lib/Support/MemoryBuffer.cpp
+++ b/lib/Support/MemoryBuffer.cpp
@@ -159,7 +159,7 @@
 
 MemoryBuffer *MemoryBuffer::getFile(const char *FilenameStart, unsigned FnSize,
                                     int64_t FileSize) {
-  sys::PathWithStatus P(std::string(FilenameStart, FnSize));
+  sys::PathWithStatus P(FilenameStart, FnSize);
 #if 1
   return new MemoryBufferMMapFile(P);
 #else
