/* A Bison parser, made by GNU Bison 2.3.  */

/* Skeleton implementation for Bison's Yacc-like parsers in C

   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
   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
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   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.  */

/* As a special exception, you may create a larger work that contains
   part or all of the Bison parser skeleton and distribute that work
   under terms of your choice, so long as that work isn't itself a
   parser generator using the skeleton or a modified version thereof
   as a parser skeleton.  Alternatively, if you modify or redistribute
   the parser skeleton itself, you may (at your option) remove this
   special exception, which will cause the skeleton and the resulting
   Bison output files to be licensed under the GNU General Public
   License without this special exception.

   This special exception was added by the Free Software Foundation in
   version 2.2 of Bison.  */

/* C LALR(1) parser skeleton written by Richard Stallman, by
   simplifying the original so-called "semantic" parser.  */

/* All symbols defined below should begin with yy or YY, to avoid
   infringing on user name space.  This should be done even for local
   variables, as they might otherwise be expanded by user macros.
   There are some unavoidable exceptions within include files to
   define necessary library symbols; they are noted "INFRINGES ON
   USER NAME SPACE" below.  */

/* Identify Bison output.  */
#define YYBISON 1

/* Bison version.  */
#define YYBISON_VERSION "2.3"

/* Skeleton name.  */
#define YYSKELETON_NAME "yacc.c"

/* Pure parsers.  */
#define YYPURE 0

/* Using locations.  */
#define YYLSP_NEEDED 0

/* Substitute the variable and function names.  */
#define yyparse llvmAsmparse
#define yylex   llvmAsmlex
#define yyerror llvmAsmerror
#define yylval  llvmAsmlval
#define yychar  llvmAsmchar
#define yydebug llvmAsmdebug
#define yynerrs llvmAsmnerrs


/* Tokens.  */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
   /* Put the tokens into the symbol table, so that GDB and other debuggers
      know about them.  */
   enum yytokentype {
     ESINT64VAL = 258,
     EUINT64VAL = 259,
     ESAPINTVAL = 260,
     EUAPINTVAL = 261,
     LOCALVAL_ID = 262,
     GLOBALVAL_ID = 263,
     FPVAL = 264,
     VOID = 265,
     INTTYPE = 266,
     FLOAT = 267,
     DOUBLE = 268,
     X86_FP80 = 269,
     FP128 = 270,
     PPC_FP128 = 271,
     LABEL = 272,
     TYPE = 273,
     LOCALVAR = 274,
     GLOBALVAR = 275,
     LABELSTR = 276,
     STRINGCONSTANT = 277,
     ATSTRINGCONSTANT = 278,
     PCTSTRINGCONSTANT = 279,
     ZEROINITIALIZER = 280,
     TRUETOK = 281,
     FALSETOK = 282,
     BEGINTOK = 283,
     ENDTOK = 284,
     DECLARE = 285,
     DEFINE = 286,
     GLOBAL = 287,
     CONSTANT = 288,
     SECTION = 289,
     ALIAS = 290,
     VOLATILE = 291,
     THREAD_LOCAL = 292,
     TO = 293,
     DOTDOTDOT = 294,
     NULL_TOK = 295,
     UNDEF = 296,
     INTERNAL = 297,
     LINKONCE = 298,
     WEAK = 299,
     APPENDING = 300,
     DLLIMPORT = 301,
     DLLEXPORT = 302,
     EXTERN_WEAK = 303,
     COMMON = 304,
     OPAQUE = 305,
     EXTERNAL = 306,
     TARGET = 307,
     TRIPLE = 308,
     ALIGN = 309,
     ADDRSPACE = 310,
     DEPLIBS = 311,
     CALL = 312,
     TAIL = 313,
     ASM_TOK = 314,
     MODULE = 315,
     SIDEEFFECT = 316,
     CC_TOK = 317,
     CCC_TOK = 318,
     FASTCC_TOK = 319,
     COLDCC_TOK = 320,
     X86_STDCALLCC_TOK = 321,
     X86_FASTCALLCC_TOK = 322,
     DATALAYOUT = 323,
     RET = 324,
     BR = 325,
     SWITCH = 326,
     INVOKE = 327,
     UNWIND = 328,
     UNREACHABLE = 329,
     ADD = 330,
     SUB = 331,
     MUL = 332,
     UDIV = 333,
     SDIV = 334,
     FDIV = 335,
     UREM = 336,
     SREM = 337,
     FREM = 338,
     AND = 339,
     OR = 340,
     XOR = 341,
     SHL = 342,
     LSHR = 343,
     ASHR = 344,
     ICMP = 345,
     FCMP = 346,
     VICMP = 347,
     VFCMP = 348,
     EQ = 349,
     NE = 350,
     SLT = 351,
     SGT = 352,
     SLE = 353,
     SGE = 354,
     ULT = 355,
     UGT = 356,
     ULE = 357,
     UGE = 358,
     OEQ = 359,
     ONE = 360,
     OLT = 361,
     OGT = 362,
     OLE = 363,
     OGE = 364,
     ORD = 365,
     UNO = 366,
     UEQ = 367,
     UNE = 368,
     MALLOC = 369,
     ALLOCA = 370,
     FREE = 371,
     LOAD = 372,
     STORE = 373,
     GETELEMENTPTR = 374,
     TRUNC = 375,
     ZEXT = 376,
     SEXT = 377,
     FPTRUNC = 378,
     FPEXT = 379,
     BITCAST = 380,
     UITOFP = 381,
     SITOFP = 382,
     FPTOUI = 383,
     FPTOSI = 384,
     INTTOPTR = 385,
     PTRTOINT = 386,
     PHI_TOK = 387,
     SELECT = 388,
     VAARG = 389,
     EXTRACTELEMENT = 390,
     INSERTELEMENT = 391,
     SHUFFLEVECTOR = 392,
     GETRESULT = 393,
     EXTRACTVALUE = 394,
     INSERTVALUE = 395,
     SIGNEXT = 396,
     ZEROEXT = 397,
     NORETURN = 398,
     INREG = 399,
     SRET = 400,
     NOUNWIND = 401,
     NOALIAS = 402,
     BYVAL = 403,
     NEST = 404,
     READNONE = 405,
     READONLY = 406,
     GC = 407,
     DEFAULT = 408,
     HIDDEN = 409,
     PROTECTED = 410
   };
#endif
/* Tokens.  */
#define ESINT64VAL 258
#define EUINT64VAL 259
#define ESAPINTVAL 260
#define EUAPINTVAL 261
#define LOCALVAL_ID 262
#define GLOBALVAL_ID 263
#define FPVAL 264
#define VOID 265
#define INTTYPE 266
#define FLOAT 267
#define DOUBLE 268
#define X86_FP80 269
#define FP128 270
#define PPC_FP128 271
#define LABEL 272
#define TYPE 273
#define LOCALVAR 274
#define GLOBALVAR 275
#define LABELSTR 276
#define STRINGCONSTANT 277
#define ATSTRINGCONSTANT 278
#define PCTSTRINGCONSTANT 279
#define ZEROINITIALIZER 280
#define TRUETOK 281
#define FALSETOK 282
#define BEGINTOK 283
#define ENDTOK 284
#define DECLARE 285
#define DEFINE 286
#define GLOBAL 287
#define CONSTANT 288
#define SECTION 289
#define ALIAS 290
#define VOLATILE 291
#define THREAD_LOCAL 292
#define TO 293
#define DOTDOTDOT 294
#define NULL_TOK 295
#define UNDEF 296
#define INTERNAL 297
#define LINKONCE 298
#define WEAK 299
#define APPENDING 300
#define DLLIMPORT 301
#define DLLEXPORT 302
#define EXTERN_WEAK 303
#define COMMON 304
#define OPAQUE 305
#define EXTERNAL 306
#define TARGET 307
#define TRIPLE 308
#define ALIGN 309
#define ADDRSPACE 310
#define DEPLIBS 311
#define CALL 312
#define TAIL 313
#define ASM_TOK 314
#define MODULE 315
#define SIDEEFFECT 316
#define CC_TOK 317
#define CCC_TOK 318
#define FASTCC_TOK 319
#define COLDCC_TOK 320
#define X86_STDCALLCC_TOK 321
#define X86_FASTCALLCC_TOK 322
#define DATALAYOUT 323
#define RET 324
#define BR 325
#define SWITCH 326
#define INVOKE 327
#define UNWIND 328
#define UNREACHABLE 329
#define ADD 330
#define SUB 331
#define MUL 332
#define UDIV 333
#define SDIV 334
#define FDIV 335
#define UREM 336
#define SREM 337
#define FREM 338
#define AND 339
#define OR 340
#define XOR 341
#define SHL 342
#define LSHR 343
#define ASHR 344
#define ICMP 345
#define FCMP 346
#define VICMP 347
#define VFCMP 348
#define EQ 349
#define NE 350
#define SLT 351
#define SGT 352
#define SLE 353
#define SGE 354
#define ULT 355
#define UGT 356
#define ULE 357
#define UGE 358
#define OEQ 359
#define ONE 360
#define OLT 361
#define OGT 362
#define OLE 363
#define OGE 364
#define ORD 365
#define UNO 366
#define UEQ 367
#define UNE 368
#define MALLOC 369
#define ALLOCA 370
#define FREE 371
#define LOAD 372
#define STORE 373
#define GETELEMENTPTR 374
#define TRUNC 375
#define ZEXT 376
#define SEXT 377
#define FPTRUNC 378
#define FPEXT 379
#define BITCAST 380
#define UITOFP 381
#define SITOFP 382
#define FPTOUI 383
#define FPTOSI 384
#define INTTOPTR 385
#define PTRTOINT 386
#define PHI_TOK 387
#define SELECT 388
#define VAARG 389
#define EXTRACTELEMENT 390
#define INSERTELEMENT 391
#define SHUFFLEVECTOR 392
#define GETRESULT 393
#define EXTRACTVALUE 394
#define INSERTVALUE 395
#define SIGNEXT 396
#define ZEROEXT 397
#define NORETURN 398
#define INREG 399
#define SRET 400
#define NOUNWIND 401
#define NOALIAS 402
#define BYVAL 403
#define NEST 404
#define READNONE 405
#define READONLY 406
#define GC 407
#define DEFAULT 408
#define HIDDEN 409
#define PROTECTED 410




/* Copy the first part of user declarations.  */
#line 14 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"

#include "ParserInternals.h"
#include "llvm/CallingConv.h"
#include "llvm/InlineAsm.h"
#include "llvm/Instructions.h"
#include "llvm/Module.h"
#include "llvm/ValueSymbolTable.h"
#include "llvm/AutoUpgrade.h"
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Streams.h"
#include <algorithm>
#include <list>
#include <map>
#include <utility>

// The following is a gross hack. In order to rid the libAsmParser library of
// exceptions, we have to have a way of getting the yyparse function to go into
// an error situation. So, whenever we want an error to occur, the GenerateError
// function (see bottom of file) sets TriggerError. Then, at the end of each 
// production in the grammer we use CHECK_FOR_ERROR which will invoke YYERROR 
// (a goto) to put YACC in error state. Furthermore, several calls to 
// GenerateError are made from inside productions and they must simulate the
// previous exception behavior by exiting the production immediately. We have
// replaced these with the GEN_ERROR macro which calls GeneratError and then
// immediately invokes YYERROR. This would be so much cleaner if it was a 
// recursive descent parser.
static bool TriggerError = false;
#define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYABORT; } }
#define GEN_ERROR(msg) { GenerateError(msg); YYERROR; }

int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit
int yylex();                       // declaration" of xxx warnings.
int yyparse();
using namespace llvm;

static Module *ParserResult;

// DEBUG_UPREFS - Define this symbol if you want to enable debugging output
// relating to upreferences in the input stream.
//
//#define DEBUG_UPREFS 1
#ifdef DEBUG_UPREFS
#define UR_OUT(X) cerr << X
#else
#define UR_OUT(X)
#endif

#define YYERROR_VERBOSE 1

static GlobalVariable *CurGV;


// This contains info used when building the body of a function.  It is
// destroyed when the function is completed.
//
typedef std::vector<Value *> ValueList;           // Numbered defs

static void 
ResolveDefinitions(ValueList &LateResolvers, ValueList *FutureLateResolvers=0);

static struct PerModuleInfo {
  Module *CurrentModule;
  ValueList Values; // Module level numbered definitions
  ValueList LateResolveValues;
  std::vector<PATypeHolder>    Types;
  std::map<ValID, PATypeHolder> LateResolveTypes;

  /// PlaceHolderInfo - When temporary placeholder objects are created, remember
  /// how they were referenced and on which line of the input they came from so
  /// that we can resolve them later and print error messages as appropriate.
  std::map<Value*, std::pair<ValID, int> > PlaceHolderInfo;

  // GlobalRefs - This maintains a mapping between <Type, ValID>'s and forward
  // references to global values.  Global values may be referenced before they
  // are defined, and if so, the temporary object that they represent is held
  // here.  This is used for forward references of GlobalValues.
  //
  typedef std::map<std::pair<const PointerType *,
                             ValID>, GlobalValue*> GlobalRefsType;
  GlobalRefsType GlobalRefs;

  void ModuleDone() {
    // If we could not resolve some functions at function compilation time
    // (calls to functions before they are defined), resolve them now...  Types
    // are resolved when the constant pool has been completely parsed.
    //
    ResolveDefinitions(LateResolveValues);
    if (TriggerError)
      return;

    // Check to make sure that all global value forward references have been
    // resolved!
    //
    if (!GlobalRefs.empty()) {
      std::string UndefinedReferences = "Unresolved global references exist:\n";

      for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end();
           I != E; ++I) {
        UndefinedReferences += "  " + I->first.first->getDescription() + " " +
                               I->first.second.getName() + "\n";
      }
      GenerateError(UndefinedReferences);
      return;
    }

    // Look for intrinsic functions and CallInst that need to be upgraded
    for (Module::iterator FI = CurrentModule->begin(),
         FE = CurrentModule->end(); FI != FE; )
      UpgradeCallsToIntrinsic(FI++); // must be post-increment, as we remove

    Values.clear();         // Clear out function local definitions
    Types.clear();
    CurrentModule = 0;
  }

  // GetForwardRefForGlobal - Check to see if there is a forward reference
  // for this global.  If so, remove it from the GlobalRefs map and return it.
  // If not, just return null.
  GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) {
    // Check to see if there is a forward reference to this global variable...
    // if there is, eliminate it and patch the reference to use the new def'n.
    GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID));
    GlobalValue *Ret = 0;
    if (I != GlobalRefs.end()) {
      Ret = I->second;
      GlobalRefs.erase(I);
    }
    return Ret;
  }

  bool TypeIsUnresolved(PATypeHolder* PATy) {
    // If it isn't abstract, its resolved
    const Type* Ty = PATy->get();
    if (!Ty->isAbstract())
      return false;
    // Traverse the type looking for abstract types. If it isn't abstract then
    // we don't need to traverse that leg of the type. 
    std::vector<const Type*> WorkList, SeenList;
    WorkList.push_back(Ty);
    while (!WorkList.empty()) {
      const Type* Ty = WorkList.back();
      SeenList.push_back(Ty);
      WorkList.pop_back();
      if (const OpaqueType* OpTy = dyn_cast<OpaqueType>(Ty)) {
        // Check to see if this is an unresolved type
        std::map<ValID, PATypeHolder>::iterator I = LateResolveTypes.begin();
        std::map<ValID, PATypeHolder>::iterator E = LateResolveTypes.end();
        for ( ; I != E; ++I) {
          if (I->second.get() == OpTy)
            return true;
        }
      } else if (const SequentialType* SeqTy = dyn_cast<SequentialType>(Ty)) {
        const Type* TheTy = SeqTy->getElementType();
        if (TheTy->isAbstract() && TheTy != Ty) {
          std::vector<const Type*>::iterator I = SeenList.begin(), 
                                             E = SeenList.end();
          for ( ; I != E; ++I)
            if (*I == TheTy)
              break;
          if (I == E)
            WorkList.push_back(TheTy);
        }
      } else if (const StructType* StrTy = dyn_cast<StructType>(Ty)) {
        for (unsigned i = 0; i < StrTy->getNumElements(); ++i) {
          const Type* TheTy = StrTy->getElementType(i);
          if (TheTy->isAbstract() && TheTy != Ty) {
            std::vector<const Type*>::iterator I = SeenList.begin(), 
                                               E = SeenList.end();
            for ( ; I != E; ++I)
              if (*I == TheTy)
                break;
            if (I == E)
              WorkList.push_back(TheTy);
          }
        }
      }
    }
    return false;
  }
} CurModule;

static struct PerFunctionInfo {
  Function *CurrentFunction;     // Pointer to current function being created

  ValueList Values; // Keep track of #'d definitions
  unsigned NextValNum;
  ValueList LateResolveValues;
  bool isDeclare;                   // Is this function a forward declararation?
  GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration.
  GlobalValue::VisibilityTypes Visibility;

  /// BBForwardRefs - When we see forward references to basic blocks, keep
  /// track of them here.
  std::map<ValID, BasicBlock*> BBForwardRefs;

  inline PerFunctionInfo() {
    CurrentFunction = 0;
    isDeclare = false;
    Linkage = GlobalValue::ExternalLinkage;
    Visibility = GlobalValue::DefaultVisibility;
  }

  inline void FunctionStart(Function *M) {
    CurrentFunction = M;
    NextValNum = 0;
  }

  void FunctionDone() {
    // Any forward referenced blocks left?
    if (!BBForwardRefs.empty()) {
      GenerateError("Undefined reference to label " +
                     BBForwardRefs.begin()->second->getName());
      return;
    }

    // Resolve all forward references now.
    ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);

    Values.clear();         // Clear out function local definitions
    BBForwardRefs.clear();
    CurrentFunction = 0;
    isDeclare = false;
    Linkage = GlobalValue::ExternalLinkage;
    Visibility = GlobalValue::DefaultVisibility;
  }
} CurFun;  // Info for the current function...

static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }


//===----------------------------------------------------------------------===//
//               Code to handle definitions of all the types
//===----------------------------------------------------------------------===//

static void InsertValue(Value *V, ValueList &ValueTab = CurFun.Values) {
  // Things that have names or are void typed don't get slot numbers
  if (V->hasName() || (V->getType() == Type::VoidTy))
    return;

  // In the case of function values, we have to allow for the forward reference
  // of basic blocks, which are included in the numbering. Consequently, we keep
  // track of the next insertion location with NextValNum. When a BB gets 
  // inserted, it could change the size of the CurFun.Values vector.
  if (&ValueTab == &CurFun.Values) {
    if (ValueTab.size() <= CurFun.NextValNum)
      ValueTab.resize(CurFun.NextValNum+1);
    ValueTab[CurFun.NextValNum++] = V;
    return;
  } 
  // For all other lists, its okay to just tack it on the back of the vector.
  ValueTab.push_back(V);
}

static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
  switch (D.Type) {
  case ValID::LocalID:               // Is it a numbered definition?
    // Module constants occupy the lowest numbered slots...
    if (D.Num < CurModule.Types.size())
      return CurModule.Types[D.Num];
    break;
  case ValID::LocalName:                 // Is it a named definition?
    if (const Type *N = CurModule.CurrentModule->getTypeByName(D.getName())) {
      D.destroy();  // Free old strdup'd memory...
      return N;
    }
    break;
  default:
    GenerateError("Internal parser error: Invalid symbol type reference");
    return 0;
  }

  // If we reached here, we referenced either a symbol that we don't know about
  // or an id number that hasn't been read yet.  We may be referencing something
  // forward, so just create an entry to be resolved later and get to it...
  //
  if (DoNotImprovise) return 0;  // Do we just want a null to be returned?


  if (inFunctionScope()) {
    if (D.Type == ValID::LocalName) {
      GenerateError("Reference to an undefined type: '" + D.getName() + "'");
      return 0;
    } else {
      GenerateError("Reference to an undefined type: #" + utostr(D.Num));
      return 0;
    }
  }

  std::map<ValID, PATypeHolder>::iterator I =CurModule.LateResolveTypes.find(D);
  if (I != CurModule.LateResolveTypes.end())
    return I->second;

  Type *Typ = OpaqueType::get();
  CurModule.LateResolveTypes.insert(std::make_pair(D, Typ));
  return Typ;
 }

// getExistingVal - Look up the value specified by the provided type and
// the provided ValID.  If the value exists and has already been defined, return
// it.  Otherwise return null.
//
static Value *getExistingVal(const Type *Ty, const ValID &D) {
  if (isa<FunctionType>(Ty)) {
    GenerateError("Functions are not values and "
                   "must be referenced as pointers");
    return 0;
  }

  switch (D.Type) {
  case ValID::LocalID: {                 // Is it a numbered definition?
    // Check that the number is within bounds.
    if (D.Num >= CurFun.Values.size()) 
      return 0;
    Value *Result = CurFun.Values[D.Num];
    if (Ty != Result->getType()) {
      GenerateError("Numbered value (%" + utostr(D.Num) + ") of type '" +
                    Result->getType()->getDescription() + "' does not match " 
                    "expected type, '" + Ty->getDescription() + "'");
      return 0;
    }
    return Result;
  }
  case ValID::GlobalID: {                 // Is it a numbered definition?
    if (D.Num >= CurModule.Values.size()) 
      return 0;
    Value *Result = CurModule.Values[D.Num];
    if (Ty != Result->getType()) {
      GenerateError("Numbered value (@" + utostr(D.Num) + ") of type '" +
                    Result->getType()->getDescription() + "' does not match " 
                    "expected type, '" + Ty->getDescription() + "'");
      return 0;
    }
    return Result;
  }
    
  case ValID::LocalName: {                // Is it a named definition?
    if (!inFunctionScope()) 
      return 0;
    ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
    Value *N = SymTab.lookup(D.getName());
    if (N == 0) 
      return 0;
    if (N->getType() != Ty)
      return 0;
    
    D.destroy();  // Free old strdup'd memory...
    return N;
  }
  case ValID::GlobalName: {                // Is it a named definition?
    ValueSymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable();
    Value *N = SymTab.lookup(D.getName());
    if (N == 0) 
      return 0;
    if (N->getType() != Ty)
      return 0;

    D.destroy();  // Free old strdup'd memory...
    return N;
  }

  // Check to make sure that "Ty" is an integral type, and that our
  // value will fit into the specified type...
  case ValID::ConstSIntVal:    // Is it a constant pool reference??
    if (!isa<IntegerType>(Ty) ||
        !ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
      GenerateError("Signed integral constant '" +
                     itostr(D.ConstPool64) + "' is invalid for type '" +
                     Ty->getDescription() + "'");
      return 0;
    }
    return ConstantInt::get(Ty, D.ConstPool64, true);

  case ValID::ConstUIntVal:     // Is it an unsigned const pool reference?
    if (isa<IntegerType>(Ty) &&
        ConstantInt::isValueValidForType(Ty, D.UConstPool64))
      return ConstantInt::get(Ty, D.UConstPool64);

    if (!isa<IntegerType>(Ty) ||
        !ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
      GenerateError("Integral constant '" + utostr(D.UConstPool64) +
                    "' is invalid or out of range for type '" +
                    Ty->getDescription() + "'");
      return 0;
    }
    // This is really a signed reference.  Transmogrify.
    return ConstantInt::get(Ty, D.ConstPool64, true);

  case ValID::ConstFPVal:        // Is it a floating point const pool reference?
    if (!Ty->isFloatingPoint() ||
        !ConstantFP::isValueValidForType(Ty, *D.ConstPoolFP)) {
      GenerateError("FP constant invalid for type");
      return 0;
    }
    // Lexer has no type info, so builds all float and double FP constants 
    // as double.  Fix this here.  Long double does not need this.
    if (&D.ConstPoolFP->getSemantics() == &APFloat::IEEEdouble &&
        Ty==Type::FloatTy)
      D.ConstPoolFP->convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven);
    return ConstantFP::get(*D.ConstPoolFP);

  case ValID::ConstNullVal:      // Is it a null value?
    if (!isa<PointerType>(Ty)) {
      GenerateError("Cannot create a a non pointer null");
      return 0;
    }
    return ConstantPointerNull::get(cast<PointerType>(Ty));

  case ValID::ConstUndefVal:      // Is it an undef value?
    return UndefValue::get(Ty);

  case ValID::ConstZeroVal:      // Is it a zero value?
    return Constant::getNullValue(Ty);
    
  case ValID::ConstantVal:       // Fully resolved constant?
    if (D.ConstantValue->getType() != Ty) {
      GenerateError("Constant expression type different from required type");
      return 0;
    }
    return D.ConstantValue;

  case ValID::InlineAsmVal: {    // Inline asm expression
    const PointerType *PTy = dyn_cast<PointerType>(Ty);
    const FunctionType *FTy =
      PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
    if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) {
      GenerateError("Invalid type for asm constraint string");
      return 0;
    }
    InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
                                   D.IAD->HasSideEffects);
    D.destroy();   // Free InlineAsmDescriptor.
    return IA;
  }
  default:
    assert(0 && "Unhandled case!");
    return 0;
  }   // End of switch

  assert(0 && "Unhandled case!");
  return 0;
}

// getVal - This function is identical to getExistingVal, except that if a
// value is not already defined, it "improvises" by creating a placeholder var
// that looks and acts just like the requested variable.  When the value is
// defined later, all uses of the placeholder variable are replaced with the
// real thing.
//
static Value *getVal(const Type *Ty, const ValID &ID) {
  if (Ty == Type::LabelTy) {
    GenerateError("Cannot use a basic block here");
    return 0;
  }

  // See if the value has already been defined.
  Value *V = getExistingVal(Ty, ID);
  if (V) return V;
  if (TriggerError) return 0;

  if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty)) {
    GenerateError("Invalid use of a non-first-class type");
    return 0;
  }

  // If we reached here, we referenced either a symbol that we don't know about
  // or an id number that hasn't been read yet.  We may be referencing something
  // forward, so just create an entry to be resolved later and get to it...
  //
  switch (ID.Type) {
  case ValID::GlobalName:
  case ValID::GlobalID: {
   const PointerType *PTy = dyn_cast<PointerType>(Ty);
   if (!PTy) {
     GenerateError("Invalid type for reference to global" );
     return 0;
   }
   const Type* ElTy = PTy->getElementType();
   if (const FunctionType *FTy = dyn_cast<FunctionType>(ElTy))
     V = Function::Create(FTy, GlobalValue::ExternalLinkage);
   else
     V = new GlobalVariable(ElTy, false, GlobalValue::ExternalLinkage, 0, "",
                            (Module*)0, false, PTy->getAddressSpace());
   break;
  }
  default:
   V = new Argument(Ty);
  }
  
  // Remember where this forward reference came from.  FIXME, shouldn't we try
  // to recycle these things??
  CurModule.PlaceHolderInfo.insert(std::make_pair(V, std::make_pair(ID,
                                                              LLLgetLineNo())));

  if (inFunctionScope())
    InsertValue(V, CurFun.LateResolveValues);
  else
    InsertValue(V, CurModule.LateResolveValues);
  return V;
}

/// defineBBVal - This is a definition of a new basic block with the specified
/// identifier which must be the same as CurFun.NextValNum, if its numeric.
static BasicBlock *defineBBVal(const ValID &ID) {
  assert(inFunctionScope() && "Can't get basic block at global scope!");

  BasicBlock *BB = 0;

  // First, see if this was forward referenced

  std::map<ValID, BasicBlock*>::iterator BBI = CurFun.BBForwardRefs.find(ID);
  if (BBI != CurFun.BBForwardRefs.end()) {
    BB = BBI->second;
    // The forward declaration could have been inserted anywhere in the
    // function: insert it into the correct place now.
    CurFun.CurrentFunction->getBasicBlockList().remove(BB);
    CurFun.CurrentFunction->getBasicBlockList().push_back(BB);

    // We're about to erase the entry, save the key so we can clean it up.
    ValID Tmp = BBI->first;

    // Erase the forward ref from the map as its no longer "forward"
    CurFun.BBForwardRefs.erase(ID);

    // The key has been removed from the map but so we don't want to leave 
    // strdup'd memory around so destroy it too.
    Tmp.destroy();

    // If its a numbered definition, bump the number and set the BB value.
    if (ID.Type == ValID::LocalID) {
      assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
      InsertValue(BB);
    }
  } else { 
    // We haven't seen this BB before and its first mention is a definition. 
    // Just create it and return it.
    std::string Name (ID.Type == ValID::LocalName ? ID.getName() : "");
    BB = BasicBlock::Create(Name, CurFun.CurrentFunction);
    if (ID.Type == ValID::LocalID) {
      assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
      InsertValue(BB);
    }
  }

  ID.destroy();
  return BB;
}

/// getBBVal - get an existing BB value or create a forward reference for it.
/// 
static BasicBlock *getBBVal(const ValID &ID) {
  assert(inFunctionScope() && "Can't get basic block at global scope!");

  BasicBlock *BB =  0;

  std::map<ValID, BasicBlock*>::iterator BBI = CurFun.BBForwardRefs.find(ID);
  if (BBI != CurFun.BBForwardRefs.end()) {
    BB = BBI->second;
  } if (ID.Type == ValID::LocalName) {
    std::string Name = ID.getName();
    Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name);
    if (N) {
      if (N->getType()->getTypeID() == Type::LabelTyID)
        BB = cast<BasicBlock>(N);
      else
        GenerateError("Reference to label '" + Name + "' is actually of type '"+
          N->getType()->getDescription() + "'");
    }
  } else if (ID.Type == ValID::LocalID) {
    if (ID.Num < CurFun.NextValNum && ID.Num < CurFun.Values.size()) {
      if (CurFun.Values[ID.Num]->getType()->getTypeID() == Type::LabelTyID)
        BB = cast<BasicBlock>(CurFun.Values[ID.Num]);
      else
        GenerateError("Reference to label '%" + utostr(ID.Num) + 
          "' is actually of type '"+ 
          CurFun.Values[ID.Num]->getType()->getDescription() + "'");
    }
  } else {
    GenerateError("Illegal label reference " + ID.getName());
    return 0;
  }

  // If its already been defined, return it now.
  if (BB) {
    ID.destroy(); // Free strdup'd memory.
    return BB;
  }

  // Otherwise, this block has not been seen before, create it.
  std::string Name;
  if (ID.Type == ValID::LocalName)
    Name = ID.getName();
  BB = BasicBlock::Create(Name, CurFun.CurrentFunction);

  // Insert it in the forward refs map.
  CurFun.BBForwardRefs[ID] = BB;

  return BB;
}


//===----------------------------------------------------------------------===//
//              Code to handle forward references in instructions
//===----------------------------------------------------------------------===//
//
// This code handles the late binding needed with statements that reference
// values not defined yet... for example, a forward branch, or the PHI node for
// a loop body.
//
// This keeps a table (CurFun.LateResolveValues) of all such forward references
// and back patchs after we are done.
//

// ResolveDefinitions - If we could not resolve some defs at parsing
// time (forward branches, phi functions for loops, etc...) resolve the
// defs now...
//
static void 
ResolveDefinitions(ValueList &LateResolvers, ValueList *FutureLateResolvers) {
  // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
  while (!LateResolvers.empty()) {
    Value *V = LateResolvers.back();
    LateResolvers.pop_back();

    std::map<Value*, std::pair<ValID, int> >::iterator PHI =
      CurModule.PlaceHolderInfo.find(V);
    assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!");

    ValID &DID = PHI->second.first;

    Value *TheRealValue = getExistingVal(V->getType(), DID);
    if (TriggerError)
      return;
    if (TheRealValue) {
      V->replaceAllUsesWith(TheRealValue);
      delete V;
      CurModule.PlaceHolderInfo.erase(PHI);
    } else if (FutureLateResolvers) {
      // Functions have their unresolved items forwarded to the module late
      // resolver table
      InsertValue(V, *FutureLateResolvers);
    } else {
      if (DID.Type == ValID::LocalName || DID.Type == ValID::GlobalName) {
        GenerateError("Reference to an invalid definition: '" +DID.getName()+
                       "' of type '" + V->getType()->getDescription() + "'",
                       PHI->second.second);
        return;
      } else {
        GenerateError("Reference to an invalid definition: #" +
                       itostr(DID.Num) + " of type '" +
                       V->getType()->getDescription() + "'",
                       PHI->second.second);
        return;
      }
    }
  }
  LateResolvers.clear();
}

// ResolveTypeTo - A brand new type was just declared.  This means that (if
// name is not null) things referencing Name can be resolved.  Otherwise, things
// refering to the number can be resolved.  Do this now.
//
static void ResolveTypeTo(std::string *Name, const Type *ToTy) {
  ValID D;
  if (Name)
    D = ValID::createLocalName(*Name);
  else      
    D = ValID::createLocalID(CurModule.Types.size());

  std::map<ValID, PATypeHolder>::iterator I =
    CurModule.LateResolveTypes.find(D);
  if (I != CurModule.LateResolveTypes.end()) {
    ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy);
    CurModule.LateResolveTypes.erase(I);
  }
}

// setValueName - Set the specified value to the name given.  The name may be
// null potentially, in which case this is a noop.  The string passed in is
// assumed to be a malloc'd string buffer, and is free'd by this function.
//
static void setValueName(Value *V, std::string *NameStr) {
  if (!NameStr) return;
  std::string Name(*NameStr);      // Copy string
  delete NameStr;                  // Free old string

  if (V->getType() == Type::VoidTy) {
    GenerateError("Can't assign name '" + Name+"' to value with void type");
    return;
  }

  assert(inFunctionScope() && "Must be in function scope!");
  ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
  if (ST.lookup(Name)) {
    GenerateError("Redefinition of value '" + Name + "' of type '" +
                   V->getType()->getDescription() + "'");
    return;
  }

  // Set the name.
  V->setName(Name);
}

/// ParseGlobalVariable - Handle parsing of a global.  If Initializer is null,
/// this is a declaration, otherwise it is a definition.
static GlobalVariable *
ParseGlobalVariable(std::string *NameStr,
                    GlobalValue::LinkageTypes Linkage,
                    GlobalValue::VisibilityTypes Visibility,
                    bool isConstantGlobal, const Type *Ty,
                    Constant *Initializer, bool IsThreadLocal,
                    unsigned AddressSpace = 0) {
  if (isa<FunctionType>(Ty)) {
    GenerateError("Cannot declare global vars of function type");
    return 0;
  }
  if (Ty == Type::LabelTy) {
    GenerateError("Cannot declare global vars of label type");
    return 0;
  }

  const PointerType *PTy = PointerType::get(Ty, AddressSpace);

  std::string Name;
  if (NameStr) {
    Name = *NameStr;      // Copy string
    delete NameStr;       // Free old string
  }

  // See if this global value was forward referenced.  If so, recycle the
  // object.
  ValID ID;
  if (!Name.empty()) {
    ID = ValID::createGlobalName(Name);
  } else {
    ID = ValID::createGlobalID(CurModule.Values.size());
  }

  if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
    // Move the global to the end of the list, from whereever it was
    // previously inserted.
    GlobalVariable *GV = cast<GlobalVariable>(FWGV);
    CurModule.CurrentModule->getGlobalList().remove(GV);
    CurModule.CurrentModule->getGlobalList().push_back(GV);
    GV->setInitializer(Initializer);
    GV->setLinkage(Linkage);
    GV->setVisibility(Visibility);
    GV->setConstant(isConstantGlobal);
    GV->setThreadLocal(IsThreadLocal);
    InsertValue(GV, CurModule.Values);
    return GV;
  }

  // If this global has a name
  if (!Name.empty()) {
    // if the global we're parsing has an initializer (is a definition) and
    // has external linkage.
    if (Initializer && Linkage != GlobalValue::InternalLinkage)
      // If there is already a global with external linkage with this name
      if (CurModule.CurrentModule->getGlobalVariable(Name, false)) {
        // If we allow this GVar to get created, it will be renamed in the
        // symbol table because it conflicts with an existing GVar. We can't
        // allow redefinition of GVars whose linking indicates that their name
        // must stay the same. Issue the error.
        GenerateError("Redefinition of global variable named '" + Name +
                       "' of type '" + Ty->getDescription() + "'");
        return 0;
      }
  }

  // Otherwise there is no existing GV to use, create one now.
  GlobalVariable *GV =
    new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
                       CurModule.CurrentModule, IsThreadLocal, AddressSpace);
  GV->setVisibility(Visibility);
  InsertValue(GV, CurModule.Values);
  return GV;
}

// setTypeName - Set the specified type to the name given.  The name may be
// null potentially, in which case this is a noop.  The string passed in is
// assumed to be a malloc'd string buffer, and is freed by this function.
//
// This function returns true if the type has already been defined, but is
// allowed to be redefined in the specified context.  If the name is a new name
// for the type plane, it is inserted and false is returned.
static bool setTypeName(const Type *T, std::string *NameStr) {
  assert(!inFunctionScope() && "Can't give types function-local names!");
  if (NameStr == 0) return false;
 
  std::string Name(*NameStr);      // Copy string
  delete NameStr;                  // Free old string

  // We don't allow assigning names to void type
  if (T == Type::VoidTy) {
    GenerateError("Can't assign name '" + Name + "' to the void type");
    return false;
  }

  // Set the type name, checking for conflicts as we do so.
  bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T);

  if (AlreadyExists) {   // Inserting a name that is already defined???
    const Type *Existing = CurModule.CurrentModule->getTypeByName(Name);
    assert(Existing && "Conflict but no matching type?!");

    // There is only one case where this is allowed: when we are refining an
    // opaque type.  In this case, Existing will be an opaque type.
    if (const OpaqueType *OpTy = dyn_cast<OpaqueType>(Existing)) {
      // We ARE replacing an opaque type!
      const_cast<OpaqueType*>(OpTy)->refineAbstractTypeTo(T);
      return true;
    }

    // Otherwise, this is an attempt to redefine a type. That's okay if
    // the redefinition is identical to the original. This will be so if
    // Existing and T point to the same Type object. In this one case we
    // allow the equivalent redefinition.
    if (Existing == T) return true;  // Yes, it's equal.

    // Any other kind of (non-equivalent) redefinition is an error.
    GenerateError("Redefinition of type named '" + Name + "' of type '" +
                   T->getDescription() + "'");
  }

  return false;
}

//===----------------------------------------------------------------------===//
// Code for handling upreferences in type names...
//

// TypeContains - Returns true if Ty directly contains E in it.
//
static bool TypeContains(const Type *Ty, const Type *E) {
  return std::find(Ty->subtype_begin(), Ty->subtype_end(),
                   E) != Ty->subtype_end();
}

namespace {
  struct UpRefRecord {
    // NestingLevel - The number of nesting levels that need to be popped before
    // this type is resolved.
    unsigned NestingLevel;

    // LastContainedTy - This is the type at the current binding level for the
    // type.  Every time we reduce the nesting level, this gets updated.
    const Type *LastContainedTy;

    // UpRefTy - This is the actual opaque type that the upreference is
    // represented with.
    OpaqueType *UpRefTy;

    UpRefRecord(unsigned NL, OpaqueType *URTy)
      : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {}
  };
}

// UpRefs - A list of the outstanding upreferences that need to be resolved.
static std::vector<UpRefRecord> UpRefs;

/// HandleUpRefs - Every time we finish a new layer of types, this function is
/// called.  It loops through the UpRefs vector, which is a list of the
/// currently active types.  For each type, if the up reference is contained in
/// the newly completed type, we decrement the level count.  When the level
/// count reaches zero, the upreferenced type is the type that is passed in:
/// thus we can complete the cycle.
///
static PATypeHolder HandleUpRefs(const Type *ty) {
  // If Ty isn't abstract, or if there are no up-references in it, then there is
  // nothing to resolve here.
  if (!ty->isAbstract() || UpRefs.empty()) return ty;
  
  PATypeHolder Ty(ty);
  UR_OUT("Type '" << Ty->getDescription() <<
         "' newly formed.  Resolving upreferences.\n" <<
         UpRefs.size() << " upreferences active!\n");

  // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
  // to zero), we resolve them all together before we resolve them to Ty.  At
  // the end of the loop, if there is anything to resolve to Ty, it will be in
  // this variable.
  OpaqueType *TypeToResolve = 0;

  for (unsigned i = 0; i != UpRefs.size(); ++i) {
    UR_OUT("  UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
           << UpRefs[i].second->getDescription() << ") = "
           << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n");
    if (TypeContains(Ty, UpRefs[i].LastContainedTy)) {
      // Decrement level of upreference
      unsigned Level = --UpRefs[i].NestingLevel;
      UpRefs[i].LastContainedTy = Ty;
      UR_OUT("  Uplevel Ref Level = " << Level << "\n");
      if (Level == 0) {                     // Upreference should be resolved!
        if (!TypeToResolve) {
          TypeToResolve = UpRefs[i].UpRefTy;
        } else {
          UR_OUT("  * Resolving upreference for "
                 << UpRefs[i].second->getDescription() << "\n";
                 std::string OldName = UpRefs[i].UpRefTy->getDescription());
          UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
          UR_OUT("  * Type '" << OldName << "' refined upreference to: "
                 << (const void*)Ty << ", " << Ty->getDescription() << "\n");
        }
        UpRefs.erase(UpRefs.begin()+i);     // Remove from upreference list...
        --i;                                // Do not skip the next element...
      }
    }
  }

  if (TypeToResolve) {
    UR_OUT("  * Resolving upreference for "
           << UpRefs[i].second->getDescription() << "\n";
           std::string OldName = TypeToResolve->getDescription());
    TypeToResolve->refineAbstractTypeTo(Ty);
  }

  return Ty;
}

//===----------------------------------------------------------------------===//
//            RunVMAsmParser - Define an interface to this parser
//===----------------------------------------------------------------------===//
//
static Module* RunParser(Module * M);

Module *llvm::RunVMAsmParser(llvm::MemoryBuffer *MB) {
  InitLLLexer(MB);
  Module *M = RunParser(new Module(LLLgetFilename()));
  FreeLexer();
  return M;
}



/* Enabling traces.  */
#ifndef YYDEBUG
# define YYDEBUG 0
#endif

/* Enabling verbose error messages.  */
#ifdef YYERROR_VERBOSE
# undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1
#else
# define YYERROR_VERBOSE 0
#endif

/* Enabling the token table.  */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE 0
#endif

#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
#line 953 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
{
  llvm::Module                           *ModuleVal;
  llvm::Function                         *FunctionVal;
  llvm::BasicBlock                       *BasicBlockVal;
  llvm::TerminatorInst                   *TermInstVal;
  llvm::Instruction                      *InstVal;
  llvm::Constant                         *ConstVal;

  const llvm::Type                       *PrimType;
  std::list<llvm::PATypeHolder>          *TypeList;
  llvm::PATypeHolder                     *TypeVal;
  llvm::Value                            *ValueVal;
  std::vector<llvm::Value*>              *ValueList;
  std::vector<unsigned>                  *ConstantList;
  llvm::ArgListType                      *ArgList;
  llvm::TypeWithAttrs                     TypeWithAttrs;
  llvm::TypeWithAttrsList                *TypeWithAttrsList;
  llvm::ParamList                        *ParamList;

  // Represent the RHS of PHI node
  std::list<std::pair<llvm::Value*,
                      llvm::BasicBlock*> > *PHIList;
  std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
  std::vector<llvm::Constant*>           *ConstVector;

  llvm::GlobalValue::LinkageTypes         Linkage;
  llvm::GlobalValue::VisibilityTypes      Visibility;
  llvm::ParameterAttributes         ParamAttrs;
  llvm::APInt                       *APIntVal;
  int64_t                           SInt64Val;
  uint64_t                          UInt64Val;
  int                               SIntVal;
  unsigned                          UIntVal;
  llvm::APFloat                    *FPVal;
  bool                              BoolVal;

  std::string                      *StrVal;   // This memory must be deleted
  llvm::ValID                       ValIDVal;

  llvm::Instruction::BinaryOps      BinaryOpVal;
  llvm::Instruction::TermOps        TermOpVal;
  llvm::Instruction::MemoryOps      MemOpVal;
  llvm::Instruction::CastOps        CastOpVal;
  llvm::Instruction::OtherOps       OtherOpVal;
  llvm::ICmpInst::Predicate         IPredicate;
  llvm::FCmpInst::Predicate         FPredicate;
}
/* Line 193 of yacc.c.  */
#line 1401 "llvmAsmParser.tab.c"
	YYSTYPE;
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif



/* Copy the second part of user declarations.  */


/* Line 216 of yacc.c.  */
#line 1414 "llvmAsmParser.tab.c"

#ifdef short
# undef short
#endif

#ifdef YYTYPE_UINT8
typedef YYTYPE_UINT8 yytype_uint8;
#else
typedef unsigned char yytype_uint8;
#endif

#ifdef YYTYPE_INT8
typedef YYTYPE_INT8 yytype_int8;
#elif (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
typedef signed char yytype_int8;
#else
typedef short int yytype_int8;
#endif

#ifdef YYTYPE_UINT16
typedef YYTYPE_UINT16 yytype_uint16;
#else
typedef unsigned short int yytype_uint16;
#endif

#ifdef YYTYPE_INT16
typedef YYTYPE_INT16 yytype_int16;
#else
typedef short int yytype_int16;
#endif

#ifndef YYSIZE_T
# ifdef __SIZE_TYPE__
#  define YYSIZE_T __SIZE_TYPE__
# elif defined size_t
#  define YYSIZE_T size_t
# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
#  define YYSIZE_T size_t
# else
#  define YYSIZE_T unsigned int
# endif
#endif

#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)

#ifndef YY_
# if defined YYENABLE_NLS && 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

/* Suppress unused-variable warnings by "using" E.  */
#if ! defined lint || defined __GNUC__
# define YYUSE(e) ((void) (e))
#else
# define YYUSE(e) /* empty */
#endif

/* Identity function, used to suppress warnings about constant conditions.  */
#ifndef lint
# define YYID(n) (n)
#else
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static int
YYID (int i)
#else
static int
YYID (i)
    int i;
#endif
{
  return i;
}
#endif

#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
#   elif defined __BUILTIN_VA_ARG_INCR
#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
#   elif defined _AIX
#    define YYSTACK_ALLOC __alloca
#   elif defined _MSC_VER
#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
#    define alloca _alloca
#   else
#    define YYSTACK_ALLOC alloca
#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
#     ifndef _STDLIB_H
#      define _STDLIB_H 1
#     endif
#    endif
#   endif
#  endif
# endif

# ifdef YYSTACK_ALLOC
   /* Pacify GCC's `empty if-body' warning.  */
#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (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 2006 */
#  endif
# else
#  define YYSTACK_ALLOC YYMALLOC
#  define YYSTACK_FREE YYFREE
#  ifndef YYSTACK_ALLOC_MAXIMUM
#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
#  endif
#  if (defined __cplusplus && ! defined _STDLIB_H \
       && ! ((defined YYMALLOC || defined malloc) \
	     && (defined YYFREE || defined free)))
#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
#   ifndef _STDLIB_H
#    define _STDLIB_H 1
#   endif
#  endif
#  ifndef YYMALLOC
#   define YYMALLOC malloc
#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
#   endif
#  endif
#  ifndef YYFREE
#   define YYFREE free
#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
void free (void *); /* INFRINGES ON USER NAME SPACE */
#   endif
#  endif
# endif
#endif /* ! defined yyoverflow || YYERROR_VERBOSE */


#if (! defined yyoverflow \
     && (! defined __cplusplus \
	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))

/* A type that is properly aligned for any stack member.  */
union yyalloc
{
  yytype_int16 yyss;
  YYSTYPE yyvs;
  };

/* The size of the maximum gap between one aligned stack and the next.  */
# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)

/* The size of an array large to enough to hold all stacks, each with
   N elements.  */
# define YYSTACK_BYTES(N) \
     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
      + YYSTACK_GAP_MAXIMUM)

/* Copy COUNT objects from FROM to TO.  The source and destination do
   not overlap.  */
# ifndef YYCOPY
#  if defined __GNUC__ && 1 < __GNUC__
#   define YYCOPY(To, From, Count) \
      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
#  else
#   define YYCOPY(To, From, Count)		\
      do					\
	{					\
	  YYSIZE_T yyi;				\
	  for (yyi = 0; yyi < (Count); yyi++)	\
	    (To)[yyi] = (From)[yyi];		\
	}					\
      while (YYID (0))
#  endif
# endif

/* Relocate STACK from its old location to the new one.  The
   local variables YYSIZE and YYSTACKSIZE give the old and new number of
   elements in the stack, and YYPTR gives the new location of the
   stack.  Advance YYPTR to a properly aligned location for the next
   stack.  */
# define YYSTACK_RELOCATE(Stack)					\
    do									\
      {									\
	YYSIZE_T yynewbytes;						\
	YYCOPY (&yyptr->Stack, Stack, yysize);				\
	Stack = &yyptr->Stack;						\
	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
	yyptr += yynewbytes / sizeof (*yyptr);				\
      }									\
    while (YYID (0))

#endif

/* YYFINAL -- State number of the termination state.  */
#define YYFINAL  44
/* YYLAST -- Last index in YYTABLE.  */
#define YYLAST   2339

/* YYNTOKENS -- Number of terminals.  */
#define YYNTOKENS  170
/* YYNNTS -- Number of nonterminals.  */
#define YYNNTS  86
/* YYNRULES -- Number of rules.  */
#define YYNRULES  340
/* YYNRULES -- Number of states.  */
#define YYNSTATES  699

/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
#define YYUNDEFTOK  2
#define YYMAXUTOK   410

#define YYTRANSLATE(YYX)						\
  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)

/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
static const yytype_uint8 yytranslate[] =
{
       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     156,   157,   160,     2,   159,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     165,   158,   166,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,   162,   161,   164,     2,     2,     2,     2,     2,   169,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     163,     2,     2,   167,     2,   168,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
     155
};

#if YYDEBUG
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
   YYRHS.  */
static const yytype_uint16 yyprhs[] =
{
       0,     0,     3,     5,     7,     9,    11,    13,    15,    17,
      19,    21,    23,    25,    27,    29,    31,    33,    35,    37,
      39,    41,    43,    45,    47,    49,    51,    53,    55,    57,
      59,    61,    63,    65,    67,    69,    71,    73,    75,    77,
      79,    81,    83,    85,    87,    89,    91,    93,    95,    97,
      99,   101,   103,   105,   107,   109,   111,   113,   115,   117,
     119,   121,   123,   125,   127,   129,   130,   135,   136,   139,
     140,   142,   144,   146,   147,   150,   152,   154,   156,   158,
     160,   162,   164,   166,   168,   169,   171,   173,   175,   176,
     178,   180,   181,   183,   185,   187,   189,   190,   192,   194,
     195,   197,   199,   201,   203,   205,   208,   210,   212,   214,
     216,   218,   220,   222,   224,   226,   229,   230,   233,   235,
     237,   239,   241,   243,   245,   246,   249,   250,   253,   254,
     257,   258,   262,   265,   266,   268,   269,   273,   275,   278,
     280,   282,   284,   286,   288,   290,   292,   294,   296,   300,
     302,   305,   311,   317,   323,   329,   333,   336,   342,   347,
     350,   352,   354,   356,   360,   362,   366,   368,   369,   371,
     375,   380,   384,   388,   393,   398,   402,   409,   415,   418,
     421,   424,   427,   430,   433,   436,   439,   442,   445,   448,
     451,   458,   464,   473,   480,   487,   495,   503,   511,   519,
     526,   535,   544,   550,   558,   562,   564,   566,   568,   570,
     571,   574,   581,   583,   584,   586,   589,   590,   594,   595,
     599,   603,   607,   611,   612,   621,   622,   632,   633,   643,
     649,   652,   656,   658,   662,   666,   670,   674,   676,   677,
     683,   687,   689,   693,   695,   696,   707,   709,   711,   716,
     718,   720,   723,   727,   728,   730,   732,   734,   736,   738,
     740,   742,   744,   746,   750,   754,   757,   760,   764,   767,
     773,   778,   780,   786,   788,   790,   792,   794,   796,   798,
     801,   803,   807,   810,   813,   817,   820,   821,   823,   826,
     829,   833,   843,   853,   862,   877,   879,   881,   888,   894,
     897,   904,   912,   917,   922,   929,   936,   937,   938,   942,
     945,   949,   952,   954,   960,   966,   973,   980,   987,   994,
     999,  1006,  1011,  1016,  1023,  1030,  1033,  1042,  1044,  1046,
    1047,  1051,  1058,  1062,  1069,  1072,  1078,  1086,  1092,  1097,
    1102
};

/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
static const yytype_int16 yyrhs[] =
{
     216,     0,    -1,    75,    -1,    76,    -1,    77,    -1,    78,
      -1,    79,    -1,    80,    -1,    81,    -1,    82,    -1,    83,
      -1,    87,    -1,    88,    -1,    89,    -1,    84,    -1,    85,
      -1,    86,    -1,   120,    -1,   121,    -1,   122,    -1,   123,
      -1,   124,    -1,   125,    -1,   126,    -1,   127,    -1,   128,
      -1,   129,    -1,   130,    -1,   131,    -1,    94,    -1,    95,
      -1,    96,    -1,    97,    -1,    98,    -1,    99,    -1,   100,
      -1,   101,    -1,   102,    -1,   103,    -1,   104,    -1,   105,
      -1,   106,    -1,   107,    -1,   108,    -1,   109,    -1,   110,
      -1,   111,    -1,   112,    -1,   113,    -1,   100,    -1,   101,
      -1,   102,    -1,   103,    -1,    26,    -1,    27,    -1,    11,
      -1,    12,    -1,    13,    -1,    16,    -1,    15,    -1,    14,
      -1,    19,    -1,    22,    -1,    24,    -1,   178,    -1,    -1,
      55,   156,     4,   157,    -1,    -1,   178,   158,    -1,    -1,
      20,    -1,    23,    -1,   184,    -1,    -1,   182,   158,    -1,
      42,    -1,    44,    -1,    43,    -1,    45,    -1,    47,    -1,
      49,    -1,    46,    -1,    48,    -1,    51,    -1,    -1,   153,
      -1,   154,    -1,   155,    -1,    -1,    46,    -1,    48,    -1,
      -1,    42,    -1,    43,    -1,    44,    -1,    47,    -1,    -1,
      44,    -1,    42,    -1,    -1,    63,    -1,    64,    -1,    65,
      -1,    66,    -1,    67,    -1,    62,     4,    -1,   142,    -1,
     121,    -1,   141,    -1,   122,    -1,   144,    -1,   145,    -1,
     147,    -1,   148,    -1,   149,    -1,    54,     4,    -1,    -1,
     193,   192,    -1,   143,    -1,   146,    -1,   142,    -1,   141,
      -1,   150,    -1,   151,    -1,    -1,   195,   194,    -1,    -1,
     152,    22,    -1,    -1,    54,     4,    -1,    -1,   159,    54,
       4,    -1,    34,    22,    -1,    -1,   199,    -1,    -1,   159,
     202,   201,    -1,   199,    -1,    54,     4,    -1,    11,    -1,
      12,    -1,    13,    -1,    16,    -1,    15,    -1,    14,    -1,
      17,    -1,    50,    -1,   203,    -1,   204,   180,   160,    -1,
     238,    -1,   161,     4,    -1,   204,   156,   208,   157,   195,
      -1,    10,   156,   208,   157,   195,    -1,   162,     4,   163,
     204,   164,    -1,   165,     4,   163,   204,   166,    -1,   167,
     209,   168,    -1,   167,   168,    -1,   165,   167,   209,   168,
     166,    -1,   165,   167,   168,   166,    -1,   204,   193,    -1,
     204,    -1,    10,    -1,   205,    -1,   207,   159,   205,    -1,
     207,    -1,   207,   159,    39,    -1,    39,    -1,    -1,   204,
      -1,   209,   159,   204,    -1,   204,   162,   212,   164,    -1,
     204,   162,   164,    -1,   204,   169,    22,    -1,   204,   165,
     212,   166,    -1,   204,   167,   212,   168,    -1,   204,   167,
     168,    -1,   204,   165,   167,   212,   168,   166,    -1,   204,
     165,   167,   168,   166,    -1,   204,    40,    -1,   204,    41,
      -1,   204,   238,    -1,   204,   211,    -1,   204,    25,    -1,
     176,     3,    -1,   176,     5,    -1,   176,     4,    -1,   176,
       6,    -1,    11,    26,    -1,    11,    27,    -1,   177,     9,
      -1,   173,   156,   210,    38,   204,   157,    -1,   119,   156,
     210,   250,   157,    -1,   133,   156,   210,   159,   210,   159,
     210,   157,    -1,   171,   156,   210,   159,   210,   157,    -1,
     172,   156,   210,   159,   210,   157,    -1,    90,   174,   156,
     210,   159,   210,   157,    -1,    91,   175,   156,   210,   159,
     210,   157,    -1,    92,   174,   156,   210,   159,   210,   157,
      -1,    93,   175,   156,   210,   159,   210,   157,    -1,   135,
     156,   210,   159,   210,   157,    -1,   136,   156,   210,   159,
     210,   159,   210,   157,    -1,   137,   156,   210,   159,   210,
     159,   210,   157,    -1,   139,   156,   210,   251,   157,    -1,
     140,   156,   210,   159,   210,   251,   157,    -1,   212,   159,
     210,    -1,   210,    -1,    32,    -1,    33,    -1,    37,    -1,
      -1,   206,   238,    -1,   125,   156,   215,    38,   204,   157,
      -1,   217,    -1,    -1,   218,    -1,   217,   218,    -1,    -1,
      31,   219,   234,    -1,    -1,    30,   220,   235,    -1,    60,
      59,   224,    -1,   181,    18,   204,    -1,   181,    18,    10,
      -1,    -1,   183,   187,   214,   213,   210,   180,   221,   201,
      -1,    -1,   183,   185,   187,   214,   213,   210,   180,   222,
     201,    -1,    -1,   183,   186,   187,   214,   213,   204,   180,
     223,   201,    -1,   183,   187,    35,   190,   215,    -1,    52,
     225,    -1,    56,   158,   226,    -1,    22,    -1,    53,   158,
      22,    -1,    68,   158,    22,    -1,   162,   227,   164,    -1,
     227,   159,    22,    -1,    22,    -1,    -1,   228,   159,   204,
     193,   179,    -1,   204,   193,   179,    -1,   228,    -1,   228,
     159,    39,    -1,    39,    -1,    -1,   191,   206,   182,   156,
     229,   157,   195,   200,   197,   196,    -1,    28,    -1,   167,
      -1,   189,   187,   230,   231,    -1,    29,    -1,   168,    -1,
     242,   233,    -1,   188,   187,   230,    -1,    -1,    61,    -1,
       3,    -1,     4,    -1,     9,    -1,    26,    -1,    27,    -1,
      40,    -1,    41,    -1,    25,    -1,   165,   212,   166,    -1,
     162,   212,   164,    -1,   162,   164,    -1,   169,    22,    -1,
     167,   212,   168,    -1,   167,   168,    -1,   165,   167,   212,
     168,   166,    -1,   165,   167,   168,   166,    -1,   211,    -1,
      59,   236,    22,   159,    22,    -1,     7,    -1,     8,    -1,
     178,    -1,   182,    -1,   238,    -1,   237,    -1,   204,   239,
      -1,   240,    -1,   241,   159,   240,    -1,   242,   243,    -1,
     232,   243,    -1,   244,   181,   245,    -1,   244,   247,    -1,
      -1,    21,    -1,    69,   241,    -1,    69,    10,    -1,    70,
      17,   239,    -1,    70,    11,   239,   159,    17,   239,   159,
      17,   239,    -1,    71,   176,   239,   159,    17,   239,   162,
     246,   164,    -1,    71,   176,   239,   159,    17,   239,   162,
     164,    -1,    72,   191,   206,   239,   156,   249,   157,   195,
      38,    17,   239,    73,    17,   239,    -1,    73,    -1,    74,
      -1,   246,   176,   237,   159,    17,   239,    -1,   176,   237,
     159,    17,   239,    -1,   181,   253,    -1,   204,   162,   239,
     159,   239,   164,    -1,   248,   159,   162,   239,   159,   239,
     164,    -1,   204,   193,   239,   193,    -1,    17,   193,   239,
     193,    -1,   249,   159,   204,   193,   239,   193,    -1,   249,
     159,    17,   193,   239,   193,    -1,    -1,    -1,   250,   159,
     240,    -1,   159,     4,    -1,   251,   159,     4,    -1,    58,
      57,    -1,    57,    -1,   171,   204,   239,   159,   239,    -1,
     172,   204,   239,   159,   239,    -1,    90,   174,   204,   239,
     159,   239,    -1,    91,   175,   204,   239,   159,   239,    -1,
      92,   174,   204,   239,   159,   239,    -1,    93,   175,   204,
     239,   159,   239,    -1,   173,   240,    38,   204,    -1,   133,
     240,   159,   240,   159,   240,    -1,   134,   240,   159,   204,
      -1,   135,   240,   159,   240,    -1,   136,   240,   159,   240,
     159,   240,    -1,   137,   240,   159,   240,   159,   240,    -1,
     132,   248,    -1,   252,   191,   206,   239,   156,   249,   157,
     195,    -1,   255,    -1,    36,    -1,    -1,   114,   204,   198,
      -1,   114,   204,   159,    11,   239,   198,    -1,   115,   204,
     198,    -1,   115,   204,   159,    11,   239,   198,    -1,   116,
     240,    -1,   254,   117,   204,   239,   198,    -1,   254,   118,
     240,   159,   204,   239,   198,    -1,   138,   204,   239,   159,
       4,    -1,   119,   204,   239,   250,    -1,   139,   204,   239,
     251,    -1,   140,   204,   239,   159,   204,   239,   251,    -1
};

/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
static const yytype_uint16 yyrline[] =
{
       0,  1118,  1118,  1118,  1118,  1118,  1118,  1118,  1118,  1118,
    1118,  1119,  1119,  1119,  1119,  1119,  1119,  1120,  1120,  1120,
    1120,  1120,  1120,  1121,  1121,  1121,  1121,  1121,  1121,  1124,
    1124,  1125,  1125,  1126,  1126,  1127,  1127,  1128,  1128,  1132,
    1132,  1133,  1133,  1134,  1134,  1135,  1135,  1136,  1136,  1137,
    1137,  1138,  1138,  1139,  1140,  1145,  1146,  1146,  1146,  1146,
    1146,  1148,  1148,  1148,  1149,  1149,  1151,  1152,  1156,  1160,
    1165,  1165,  1167,  1168,  1173,  1179,  1180,  1181,  1182,  1183,
    1184,  1188,  1189,  1190,  1194,  1195,  1196,  1197,  1201,  1202,
    1203,  1207,  1208,  1209,  1210,  1211,  1215,  1216,  1217,  1220,
    1221,  1222,  1223,  1224,  1225,  1226,  1233,  1234,  1235,  1236,
    1237,  1238,  1239,  1240,  1241,  1242,  1246,  1247,  1252,  1253,
    1254,  1255,  1256,  1257,  1260,  1261,  1266,  1267,  1274,  1275,
    1281,  1282,  1291,  1299,  1300,  1305,  1306,  1307,  1312,  1325,
    1325,  1325,  1325,  1325,  1325,  1325,  1328,  1332,  1336,  1343,
    1348,  1356,  1385,  1410,  1415,  1425,  1435,  1439,  1449,  1456,
    1465,  1472,  1477,  1482,  1489,  1490,  1497,  1504,  1512,  1518,
    1530,  1558,  1574,  1601,  1629,  1655,  1675,  1701,  1721,  1733,
    1740,  1806,  1816,  1826,  1832,  1842,  1848,  1858,  1864,  1870,
    1883,  1895,  1916,  1924,  1930,  1941,  1946,  1951,  1956,  1961,
    1967,  1973,  1979,  1987,  1998,  2002,  2010,  2010,  2013,  2013,
    2016,  2028,  2049,  2054,  2062,  2063,  2067,  2067,  2071,  2071,
    2074,  2077,  2101,  2113,  2112,  2124,  2123,  2133,  2132,  2143,
    2183,  2186,  2192,  2202,  2206,  2211,  2213,  2218,  2223,  2232,
    2242,  2253,  2257,  2266,  2275,  2280,  2409,  2409,  2411,  2420,
    2420,  2422,  2427,  2439,  2443,  2448,  2452,  2456,  2460,  2464,
    2468,  2472,  2476,  2480,  2502,  2524,  2530,  2543,  2555,  2560,
    2572,  2578,  2582,  2592,  2596,  2600,  2605,  2612,  2612,  2618,
    2627,  2632,  2637,  2641,  2650,  2659,  2668,  2672,  2680,  2687,
    2691,  2696,  2707,  2726,  2735,  2821,  2825,  2832,  2843,  2856,
    2866,  2877,  2887,  2898,  2906,  2916,  2923,  2926,  2927,  2935,
    2941,  2950,  2954,  2959,  2975,  2992,  3006,  3020,  3034,  3048,
    3060,  3068,  3075,  3081,  3087,  3093,  3108,  3198,  3203,  3207,
    3214,  3221,  3231,  3238,  3248,  3256,  3270,  3287,  3295,  3310,
    3325
};
#endif

#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
static const char *const yytname[] =
{
  "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "ESAPINTVAL",
  "EUAPINTVAL", "LOCALVAL_ID", "GLOBALVAL_ID", "FPVAL", "VOID", "INTTYPE",
  "FLOAT", "DOUBLE", "X86_FP80", "FP128", "PPC_FP128", "LABEL", "TYPE",
  "LOCALVAR", "GLOBALVAR", "LABELSTR", "STRINGCONSTANT",
  "ATSTRINGCONSTANT", "PCTSTRINGCONSTANT", "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", "COMMON", "OPAQUE",
  "EXTERNAL", "TARGET", "TRIPLE", "ALIGN", "ADDRSPACE", "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", "VICMP",
  "VFCMP", "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",
  "GETRESULT", "EXTRACTVALUE", "INSERTVALUE", "SIGNEXT", "ZEROEXT",
  "NORETURN", "INREG", "SRET", "NOUNWIND", "NOALIAS", "BYVAL", "NEST",
  "READNONE", "READONLY", "GC", "DEFAULT", "HIDDEN", "PROTECTED", "'('",
  "')'", "'='", "','", "'*'", "'\\\\'", "'['", "'x'", "']'", "'<'", "'>'",
  "'{'", "'}'", "'c'", "$accept", "ArithmeticOps", "LogicalOps", "CastOps",
  "IPredicates", "FPredicates", "IntType", "FPType", "LocalName",
  "OptLocalName", "OptAddrSpace", "OptLocalAssign", "GlobalName",
  "OptGlobalAssign", "GlobalAssign", "GVInternalLinkage",
  "GVExternalLinkage", "GVVisibilityStyle", "FunctionDeclareLinkage",
  "FunctionDefineLinkage", "AliasLinkage", "OptCallingConv", "ParamAttr",
  "OptParamAttrs", "FuncAttr", "OptFuncAttrs", "OptGC", "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", "ReturnedVal",
  "BasicBlockList", "BasicBlock", "InstructionList", "BBTerminatorInst",
  "JumpTable", "Inst", "PHIList", "ParamList", "IndexList",
  "ConstantIndexList", "OptTailCall", "InstVal", "OptVolatile",
  "MemoryInst", 0
};
#endif

# ifdef YYPRINT
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
   token YYLEX-NUM.  */
static const yytype_uint16 yytoknum[] =
{
       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
     405,   406,   407,   408,   409,   410,    40,    41,    61,    44,
      42,    92,    91,   120,    93,    60,    62,   123,   125,    99
};
# endif

/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
static const yytype_uint8 yyr1[] =
{
       0,   170,   171,   171,   171,   171,   171,   171,   171,   171,
     171,   172,   172,   172,   172,   172,   172,   173,   173,   173,
     173,   173,   173,   173,   173,   173,   173,   173,   173,   174,
     174,   174,   174,   174,   174,   174,   174,   174,   174,   175,
     175,   175,   175,   175,   175,   175,   175,   175,   175,   175,
     175,   175,   175,   175,   175,   176,   177,   177,   177,   177,
     177,   178,   178,   178,   179,   179,   180,   180,   181,   181,
     182,   182,   183,   183,   184,   185,   185,   185,   185,   185,
     185,   186,   186,   186,   187,   187,   187,   187,   188,   188,
     188,   189,   189,   189,   189,   189,   190,   190,   190,   191,
     191,   191,   191,   191,   191,   191,   192,   192,   192,   192,
     192,   192,   192,   192,   192,   192,   193,   193,   194,   194,
     194,   194,   194,   194,   195,   195,   196,   196,   197,   197,
     198,   198,   199,   200,   200,   201,   201,   202,   202,   203,
     203,   203,   203,   203,   203,   203,   204,   204,   204,   204,
     204,   204,   204,   204,   204,   204,   204,   204,   204,   205,
     206,   206,   207,   207,   208,   208,   208,   208,   209,   209,
     210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
     210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
     211,   211,   211,   211,   211,   211,   211,   211,   211,   211,
     211,   211,   211,   211,   212,   212,   213,   213,   214,   214,
     215,   215,   216,   216,   217,   217,   219,   218,   220,   218,
     218,   218,   218,   221,   218,   222,   218,   223,   218,   218,
     218,   218,   224,   225,   225,   226,   227,   227,   227,   228,
     228,   229,   229,   229,   229,   230,   231,   231,   232,   233,
     233,   234,   235,   236,   236,   237,   237,   237,   237,   237,
     237,   237,   237,   237,   237,   237,   237,   237,   237,   237,
     237,   237,   237,   238,   238,   238,   238,   239,   239,   240,
     241,   241,   242,   242,   243,   244,   244,   244,   245,   245,
     245,   245,   245,   245,   245,   245,   245,   246,   246,   247,
     248,   248,   249,   249,   249,   249,   249,   250,   250,   251,
     251,   252,   252,   253,   253,   253,   253,   253,   253,   253,
     253,   253,   253,   253,   253,   253,   253,   253,   254,   254,
     255,   255,   255,   255,   255,   255,   255,   255,   255,   255,
     255
};

/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
static const yytype_uint8 yyr2[] =
{
       0,     2,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     1,     0,     4,     0,     2,     0,
       1,     1,     1,     0,     2,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     0,     1,     1,     1,     0,     1,
       1,     0,     1,     1,     1,     1,     0,     1,     1,     0,
       1,     1,     1,     1,     1,     2,     1,     1,     1,     1,
       1,     1,     1,     1,     1,     2,     0,     2,     1,     1,
       1,     1,     1,     1,     0,     2,     0,     2,     0,     2,
       0,     3,     2,     0,     1,     0,     3,     1,     2,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     3,     1,
       2,     5,     5,     5,     5,     3,     2,     5,     4,     2,
       1,     1,     1,     3,     1,     3,     1,     0,     1,     3,
       4,     3,     3,     4,     4,     3,     6,     5,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       6,     5,     8,     6,     6,     7,     7,     7,     7,     6,
       8,     8,     5,     7,     3,     1,     1,     1,     1,     0,
       2,     6,     1,     0,     1,     2,     0,     3,     0,     3,
       3,     3,     3,     0,     8,     0,     9,     0,     9,     5,
       2,     3,     1,     3,     3,     3,     3,     1,     0,     5,
       3,     1,     3,     1,     0,    10,     1,     1,     4,     1,
       1,     2,     3,     0,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     3,     3,     2,     2,     3,     2,     5,
       4,     1,     5,     1,     1,     1,     1,     1,     1,     2,
       1,     3,     2,     2,     3,     2,     0,     1,     2,     2,
       3,     9,     9,     8,    14,     1,     1,     6,     5,     2,
       6,     7,     4,     4,     6,     6,     0,     0,     3,     2,
       3,     2,     1,     5,     5,     6,     6,     6,     6,     4,
       6,     4,     4,     6,     6,     2,     8,     1,     1,     0,
       3,     6,     3,     6,     2,     5,     7,     5,     4,     4,
       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 yytype_uint16 yydefact[] =
{
      73,    61,    70,    62,    71,    63,   218,   216,     0,     0,
       0,     0,     0,     0,    84,    72,     0,    73,   214,    88,
      91,     0,     0,   230,     0,     0,    68,     0,    74,    75,
      77,    76,    78,    81,    79,    82,    80,    83,    85,    86,
      87,    84,    84,   209,     1,   215,    89,    90,    84,   219,
      92,    93,    94,    95,    84,   286,   217,   286,     0,     0,
     238,   231,   232,   220,   273,   274,   222,   139,   140,   141,
     144,   143,   142,   145,   146,     0,     0,     0,     0,   275,
     276,   147,   221,   149,   209,   209,    96,   208,     0,    99,
      99,   287,   283,    69,   249,   250,   251,   282,   233,   234,
     237,     0,   167,   150,     0,     0,     0,     0,   156,   168,
       0,     0,   167,     0,     0,     0,    98,    97,     0,   206,
     207,     0,     0,   100,   101,   102,   103,   104,     0,   252,
       0,   329,   285,     0,   235,   166,   116,   162,   164,     0,
       0,     0,     0,     0,     0,   155,     0,     0,   148,     0,
       0,   161,     0,   160,     0,   229,   139,   140,   141,   144,
     143,   142,     0,     0,    67,    67,   105,     0,   246,   247,
     248,   328,   312,     0,     0,     0,     0,    99,   295,   296,
       2,     3,     4,     5,     6,     7,     8,     9,    10,    14,
      15,    16,    11,    12,    13,     0,     0,     0,     0,     0,
       0,     0,     0,    17,    18,    19,    20,    21,    22,    23,
      24,    25,    26,    27,    28,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   284,    99,   299,
       0,   327,   236,   159,     0,   124,    67,    67,   158,     0,
     169,     0,   124,    67,    67,     0,   210,   187,   188,   183,
     185,   184,   186,   189,   182,   178,   179,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   181,   180,   223,     0,   311,
     289,    67,   280,   288,     0,     0,    55,     0,     0,    29,
      30,    31,    32,    33,    34,    35,    36,    37,    38,     0,
      53,    54,    49,    50,    51,    52,    39,    40,    41,    42,
      43,    44,    45,    46,    47,    48,     0,     0,     0,   130,
     130,   334,    67,    67,   325,     0,     0,     0,     0,     0,
      67,    67,    67,    67,    67,     0,     0,     0,     0,     0,
     107,   109,   108,   106,   110,   111,   112,   113,   114,   117,
     165,   163,   152,   153,   154,   157,    66,   151,   225,   227,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   171,   205,     0,     0,     0,   175,     0,   172,
       0,     0,     0,   135,   244,   255,   256,   257,   262,   258,
     259,   260,   261,   253,     0,     0,     0,     0,   271,   278,
     277,   279,     0,     0,   290,     0,     0,    67,    67,    67,
      67,     0,   330,     0,   332,   307,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      67,     0,   115,   121,   120,   118,   119,   122,   123,   125,
     135,   135,     0,     0,     0,     0,     0,   307,     0,     0,
       0,     0,     0,     0,     0,   170,   156,   168,     0,   173,
     174,     0,     0,     0,     0,   224,   243,   116,   241,     0,
     254,     0,   265,     0,     0,     0,   268,     0,   266,   281,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     338,     0,     0,     0,   321,   322,     0,     0,     0,     0,
     339,     0,     0,     0,   319,     0,   130,     0,   226,   228,
      67,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   204,   177,     0,     0,     0,     0,     0,     0,
     137,   135,    65,     0,   124,     0,   264,   156,     0,   263,
     267,     0,     0,   306,     0,     0,     0,     0,   130,   131,
     130,     0,     0,     0,     0,     0,     0,   337,   309,     0,
      67,   313,   314,   306,     0,   335,    67,   211,     0,     0,
       0,     0,   191,     0,     0,     0,     0,   202,     0,   176,
       0,     0,    67,   132,   138,   136,    64,   240,   242,   116,
     133,     0,   270,     0,     0,     0,   116,   116,     0,   315,
     316,   317,   318,   331,   333,   308,     0,     0,   320,   323,
     324,   310,     0,     0,   130,     0,     0,     0,     0,     0,
     199,     0,     0,     0,   193,   194,   190,    65,   134,   128,
     272,   269,     0,     0,     0,     0,   124,     0,   300,     0,
     340,   124,   336,   195,   196,   197,   198,     0,     0,     0,
     203,   239,     0,   126,     0,   293,     0,     0,   107,   109,
     116,   116,     0,   116,   116,   301,   326,   192,   200,   201,
     129,     0,   245,   291,     0,   292,     0,   303,   302,     0,
       0,     0,   127,     0,     0,     0,   116,   116,     0,     0,
       0,   305,   304,   298,     0,     0,   297,     0,   294
};

/* YYDEFGOTO[NTERM-NUM].  */
static const yytype_int16 yydefgoto[] =
{
      -1,   272,   273,   274,   299,   316,   162,   163,    79,   587,
     113,    12,    80,    14,    15,    41,    42,    43,    48,    54,
     118,   128,   349,   233,   439,   352,   672,   653,   412,   530,
     629,   465,   531,    81,   164,   137,   154,   138,   139,   110,
     373,   398,   374,   121,    88,   155,    16,    17,    18,    20,
      19,   383,   440,   441,    63,    23,    61,   101,   468,   469,
     129,   170,    55,    96,    56,    49,   471,   399,    83,   401,
     282,   283,    57,    92,    93,   227,   657,   132,   324,   598,
     490,   500,   228,   229,   230,   231
};

/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
   STATE-NUM.  */
#define YYPACT_NINF -622
static const yytype_int16 yypact[] =
{
     805,  -622,  -622,  -622,  -622,  -622,  -622,  -622,    -6,  -112,
      23,   -97,    91,   -94,    24,  -622,   126,  1385,  -622,   135,
     257,    48,    77,  -622,     3,   216,  -622,  1807,  -622,  -622,
    -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,
    -622,    49,    49,   187,  -622,  -622,  -622,  -622,    49,  -622,
    -622,  -622,  -622,  -622,    49,   218,  -622,    16,   220,   239,
     243,  -622,  -622,  -622,  -622,  -622,   110,  -622,  -622,  -622,
    -622,  -622,  -622,  -622,  -622,   267,   271,     1,   691,  -622,
    -622,  -622,   -28,  -622,   246,   246,   206,  -622,    46,   215,
     215,  -622,  -622,   343,  -622,  -622,  -622,  -622,  -622,  -622,
    -622,   -59,  1537,  -622,   121,   130,   880,   110,  -622,   -28,
    -110,   138,  1537,   142,    46,    46,  -622,  -622,  1555,  -622,
    -622,  1830,   302,  -622,  -622,  -622,  -622,  -622,  1848,  -622,
     -14,  2199,  -622,   293,  -622,  -622,   -28,  -622,   160,   165,
    1877,  1877,   168,  -103,  1877,  -622,   334,   189,  -622,  1830,
    1877,   110,   191,   -28,   221,  -622,    85,   341,   342,   345,
     354,   355,   323,   360,  1373,   315,  -622,    28,  -622,  -622,
    -622,  -622,  -622,   316,  1921,    42,   361,   215,  -622,  -622,
    -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,
    -622,  -622,  -622,  -622,  -622,   393,   529,   393,   529,  1877,
    1877,  1877,  1877,  -622,  -622,  -622,  -622,  -622,  -622,  -622,
    -622,  -622,  -622,  -622,  -622,  1877,  1877,  1877,  1877,  1877,
    1877,  1877,  1877,  1877,  1877,  1877,  1877,  -622,   215,  -622,
      70,  -622,  -622,   176,  1578,  -622,   -39,   -46,  -622,   208,
     -28,   223,  -622,   315,     5,  1555,  -622,  -622,  -622,  -622,
    -622,  -622,  -622,  -622,  -622,  -622,  -622,   393,   529,   393,
     529,   219,   227,   228,   234,   235,   241,   242,  1596,  2009,
     993,   356,   244,   245,   251,  -622,  -622,  -622,   254,  -622,
     110,   792,  -622,   240,   943,   943,  -622,   943,  1848,  -622,
    -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  1877,
    -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,
    -622,  -622,  -622,  -622,  -622,  -622,  1877,  1877,  1877,    26,
      58,  -622,   792,   -35,   252,   256,   258,   259,   260,   263,
     792,   792,   792,   792,   792,   389,  1848,  1877,  1877,   375,
    -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,
    -622,  -622,   202,  -622,  -622,  -622,  -622,   202,  -622,   142,
     390,   273,   274,   276,   277,  1830,  1830,  1830,  1830,  1830,
    1830,  1830,  -622,  -622,    57,  1268,   -82,  -622,   -64,  -622,
    1830,  1830,  1830,   275,  1628,  -622,  -622,  -622,  -622,  -622,
    -622,  -622,  -622,   374,  1757,  2041,  1313,   414,  -622,  -622,
    -622,  -622,  1877,   278,  -622,   279,   943,   792,   792,   792,
     792,    31,  -622,    33,  -622,  -622,   943,   280,  1877,  1877,
    1877,  1877,  1877,   281,   282,   284,   285,   287,  1877,   943,
     792,   288,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,
     275,   275,  1877,  1830,  1830,  1830,  1830,  -622,   290,   291,
     292,   294,   282,   295,  1830,  -622,   286,  1222,   -62,  -622,
    -622,   301,   307,   429,    20,  -622,  -622,   -28,   309,   312,
    -622,   448,  -622,    87,  1508,   -10,  -622,   -61,  -622,  -622,
     455,   456,   318,   317,   319,   320,   321,   943,   473,   943,
     338,   339,   943,   340,   -28,  -622,   344,   346,   478,   496,
     351,  1877,   943,   943,   -28,   348,   352,  1877,  -622,  -622,
      -5,   353,   357,   359,   362,   115,  1830,  1830,  1830,  1830,
     146,  1830,  -622,  -622,   336,  1830,  1830,  1877,   493,   515,
    -622,   275,   530,  1789,  -622,   363,  -622,   358,   -60,  -622,
    -622,   943,   943,  2082,   943,   943,   943,   943,   352,  -622,
     352,  1877,   943,   364,  1877,  1877,  1877,  -622,  -622,   516,
     792,  -622,  -622,  2082,   472,  -622,   792,  -622,  1830,  1830,
    1830,  1830,  -622,   368,   377,   372,   376,  -622,   282,  -622,
     379,   381,     2,  -622,  -622,  -622,  -622,  -622,  -622,   -28,
       4,   517,  -622,   380,   382,   378,   -16,   -28,   157,  -622,
    -622,  -622,  -622,  -622,  -622,  -622,   384,   943,  -622,  -622,
    -622,  -622,   282,   178,   352,   386,   388,   394,   396,  1830,
    -622,  1830,  1830,   198,  -622,  -622,  -622,   530,  -622,   507,
    -622,  -622,   533,    -7,   641,   641,  -622,  2100,  -622,   398,
     351,  -622,  -622,  -622,  -622,  -622,  -622,   406,   408,   409,
    -622,  -622,   564,   417,   943,  -622,  1088,     7,   415,   416,
    -622,  -622,   -12,   -16,   -28,  -622,   202,  -622,  -622,  -622,
    -622,   548,  -622,  -622,   418,  -622,  1088,   176,   176,   557,
     641,   641,  -622,   558,   419,   943,  -622,  -622,   943,   562,
     508,   176,   176,  -622,   943,   563,  -622,   943,  -622
};

/* YYPGOTO[NTERM-NUM].  */
static const yytype_int16 yypgoto[] =
{
    -622,   451,   452,   454,  -163,  -157,  -174,  -622,     0,   -41,
    -102,   494,    13,  -622,  -622,  -622,  -622,   222,  -622,  -622,
    -622,  -145,  -622,  -427,  -622,  -227,  -622,  -622,  -301,    -2,
    -622,  -412,  -622,  -622,   -26,   369,  -116,  -622,   477,   484,
    -113,  -161,  -259,     8,   147,   347,  -622,  -622,   574,  -622,
    -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,  -622,
     503,  -622,  -622,  -622,  -622,  -622,  -622,  -621,  -121,    55,
    -195,  -622,  -622,   537,  -622,  -622,  -622,  -622,  -622,    32,
     151,  -445,  -622,  -622,  -622,  -622
};

/* 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.  */
#define YYTABLE_NINF -214
static const yytype_int16 yytable[] =
{
      11,    82,   287,   275,   286,   105,   321,   520,   165,   111,
     376,   378,   167,    13,   168,   357,   111,    11,   286,   414,
     111,   325,   326,   327,   328,   329,   679,   111,   508,   509,
      13,   335,   288,   246,   317,   674,   243,    91,   528,  -145,
     532,   318,   487,   276,   489,    94,    24,    21,     2,   144,
     111,     4,   109,   284,   528,   684,   144,   111,   145,   285,
     111,    26,    22,   277,    28,   239,    29,    30,    31,    32,
      33,    34,    35,    36,   529,    37,   136,   454,   119,   120,
     109,   111,    25,   336,   459,   488,   136,   488,   -55,   -55,
     -55,   -55,   153,    11,   361,   454,   363,   454,   454,   454,
     133,   362,   153,   364,   460,   134,   524,   540,   593,    27,
     112,   247,   248,   111,   236,   237,   458,   112,   240,   585,
     354,   112,   149,   150,   244,   353,    44,   416,   112,   433,
     434,   435,   -67,   623,   436,   473,   475,   477,   437,   438,
    -145,   358,   359,   431,  -145,   433,   434,   435,   281,   454,
     436,   112,   567,   169,   437,   438,   539,   655,   112,   626,
     400,   112,   627,   400,   400,    60,   400,   640,   106,   634,
     635,   675,   406,   319,   320,   281,   322,    38,    39,    40,
     278,    46,   112,    47,    95,   411,   -67,   337,   338,   323,
     281,   281,   281,   281,   281,   330,   331,   332,   333,   334,
     281,   400,    38,    39,    40,   565,    58,   479,   136,   400,
     400,   400,   400,   400,   112,   538,   454,   413,   -67,   153,
     429,   455,    86,   493,    87,   495,   496,   497,    64,    65,
     339,   114,   115,   677,   678,    59,   680,   681,    62,    91,
       1,     2,    98,     3,     4,     5,   454,   603,   116,   604,
     117,   536,   447,   448,   449,   450,   451,   452,   453,   691,
     692,    99,   153,    84,    85,   100,   102,   461,   462,   463,
      89,   103,   572,   407,   551,   104,    90,   122,   123,   124,
     125,   126,   127,    87,   140,   400,   400,   400,   400,   400,
     408,   409,   410,   141,   146,   400,   275,   340,   341,    50,
      51,    52,   148,   577,    53,   559,   166,   590,   400,   400,
     153,   430,   281,   642,   636,   232,   637,   342,   343,   234,
     344,   345,   235,   346,   347,   348,   249,   250,   251,   252,
     511,   512,   513,   514,   238,   641,   276,   637,   241,   403,
     404,   522,   405,   433,   434,   435,   242,   245,   436,   457,
     -56,   -57,   437,   438,   -60,   650,   605,   559,   467,   608,
     609,   610,     1,   -59,   -58,     3,   400,     5,   400,   253,
     111,   400,   286,   279,   355,   365,   281,   415,   379,   432,
     356,   400,   400,   366,   367,   423,   424,   425,   426,   427,
     368,   369,   281,   494,   281,   281,   281,   370,   371,   402,
     380,   381,   504,   573,   574,   575,   576,   382,   578,   662,
     384,   417,   580,   581,   666,   418,   510,   419,   420,   421,
     400,   400,   422,   400,   400,   400,   400,   428,   442,   443,
     444,   400,   445,   446,   464,   470,   478,   480,   481,   400,
     498,   499,   492,   501,   502,   400,   503,   507,   457,   516,
     517,   518,   523,   519,   521,   615,   616,   617,   618,   656,
     525,   482,   483,   484,   485,   486,   526,   527,   533,   534,
     535,   491,   541,   542,   543,   560,   544,   549,   545,   546,
     547,   566,   557,   676,   505,   506,   400,   289,   290,   291,
     292,   293,   294,   295,   296,   297,   298,   551,   552,   554,
     558,   582,   579,   555,   563,   556,   647,   589,   648,   649,
     559,   564,   568,   400,   400,   583,   569,   597,   570,   584,
     611,   571,   591,   607,   592,   281,   488,   619,   281,   281,
     281,   621,   586,   400,   620,   622,   624,   597,   625,   630,
     633,   632,   548,   643,   550,   644,   631,   553,   638,     1,
     654,   645,     3,   646,     5,   300,   301,   561,   562,   400,
     400,   652,   665,   667,   400,   668,   669,   400,   670,   671,
     682,   -18,   -19,   400,   685,   688,   400,   683,   689,   694,
     697,   695,   224,   225,   339,   226,   651,   131,   628,   147,
     143,    45,   360,   130,    97,   613,   594,   595,   515,   599,
     600,   601,   602,   351,     0,     0,     0,   606,     0,     0,
       0,   664,     0,     0,     0,   612,     0,     0,     0,     0,
       0,   614,     0,     0,     0,     0,     0,   586,     0,   302,
     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
     313,   314,   315,     0,   385,   386,     0,     0,    64,    65,
     387,   340,   341,     0,     0,     0,     0,     0,     0,     0,
       1,     2,   639,     3,     4,     5,   388,   389,   390,     0,
       0,   342,   343,     0,   344,   345,     0,   346,   347,   348,
       0,   391,   392,     0,     0,     0,     0,     0,     0,   660,
     661,     0,     0,     0,     0,   339,     0,     0,    64,    65,
     393,   107,    67,    68,    69,    70,    71,    72,    73,   673,
       1,     2,     0,     3,     4,     5,   180,   181,   182,   183,
     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
     194,   257,   258,   259,   260,   686,   687,     0,     0,     0,
     690,    74,     0,   693,     0,     0,     0,     0,     0,   696,
       0,     0,   698,     0,     0,     0,     0,     0,     0,     0,
     261,   203,   658,   659,   206,   207,   208,   209,   210,   211,
     212,   213,   214,     0,   262,     0,   263,   264,   265,     0,
     266,   267,   342,   343,     0,   344,   345,     0,   346,   347,
     348,     0,     0,     0,     0,   385,   386,     0,     0,    64,
      65,   387,     0,   394,     0,  -213,   395,     0,   396,     0,
     397,     1,     2,     0,     3,     4,     5,   388,   389,   390,
       0,     0,     0,   -69,     1,     2,     0,     3,     4,     5,
       0,     0,   391,   392,     0,     6,     7,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   111,     0,     0,
       0,   393,    75,    76,     0,     0,    77,     8,    78,   108,
       0,     9,     0,     0,     0,    10,     0,   180,   181,   182,
     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
     193,   194,   257,   258,   259,   260,     0,    64,    65,     0,
     107,    67,    68,    69,    70,    71,    72,    73,     0,     1,
       2,     0,     3,     4,     5,     0,     0,     0,     0,     0,
       0,   261,   203,   204,   205,   206,   207,   208,   209,   210,
     211,   212,   213,   214,     0,   262,     0,   263,   264,   265,
      74,   266,   267,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   385,   386,   112,     0,
      64,    65,   387,     0,   394,     0,     0,   395,     0,   396,
       0,   397,     1,     2,     0,     3,     4,     5,   388,   389,
     390,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,   391,   392,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      64,    65,   393,   107,   156,   157,   158,   159,   160,   161,
      73,     0,     1,     2,     0,     3,     4,     5,   180,   181,
     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
     192,   193,   194,   257,   258,   259,   260,     0,     0,     0,
       0,    75,    76,    74,     0,    77,     0,    78,   142,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   261,   203,   204,   205,   206,   207,   208,   209,
     210,   211,   212,   213,   214,     0,   262,     0,   263,   264,
     265,     0,   266,   267,     0,     0,     0,     0,     0,     0,
       0,   385,   386,     0,     0,     0,     0,   387,     0,     0,
       0,     0,     0,     0,     0,   394,     0,     0,   395,     0,
     396,     0,   397,   388,   389,   390,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,   391,   392,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   393,     0,     0,
       0,     0,     0,     0,    75,    76,     0,     0,    77,     0,
      78,   377,     0,   180,   181,   182,   183,   184,   185,   186,
     187,   188,   189,   190,   191,   192,   193,   194,   257,   258,
     259,   260,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   261,   203,   204,
     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
       0,   262,     0,   263,   264,   265,     0,   266,   267,    64,
      65,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     1,     2,     0,     3,     4,     5,   254,     0,     0,
     394,     0,     0,   395,     0,   396,     0,   397,     0,     0,
       0,     0,   255,   256,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,    64,    65,   111,   107,   156,
     157,   158,   159,   160,   161,    73,     0,     1,     2,     0,
       3,     4,     5,     0,     0,     0,     0,   180,   181,   182,
     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
     193,   194,   257,   258,   259,   260,     0,     0,    74,     0,
      64,    65,     0,   107,   156,   157,   158,   159,   160,   161,
      73,     0,     1,     2,     0,     3,     4,     5,     0,     0,
       0,   261,   203,   204,   205,   206,   207,   208,   209,   210,
     211,   212,   213,   214,     0,   262,     0,   263,   264,   265,
       0,   266,   267,    74,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,   112,     0,
      64,    65,   -67,     0,   268,  -212,     0,   269,     0,   270,
       0,   271,     1,     2,     0,     3,     4,     5,   254,     0,
       0,     0,     0,   -69,     1,     2,     0,     3,     4,     5,
       0,     0,     0,   255,   256,     6,     7,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,   111,    75,
      76,     0,     0,    77,     0,    78,   456,     8,     0,     0,
       0,     9,     0,     0,     0,    10,     0,     0,   180,   181,
     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
     192,   193,   194,   257,   258,   259,   260,     0,     0,     0,
       0,     0,     0,     0,    75,    76,     0,     0,    77,     0,
      78,   476,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   261,   203,   204,   205,   206,   207,   208,   209,
     210,   211,   212,   213,   214,     0,   262,     0,   263,   264,
     265,     0,   266,   267,     0,    64,    65,     0,   107,   156,
     157,   158,   159,   160,   161,    73,     0,     1,     2,   112,
       3,     4,     5,     0,     0,   268,     0,     0,   269,     0,
     270,     0,   271,     0,    64,    65,     0,   107,    67,    68,
      69,    70,    71,    72,    73,     0,     1,     2,    74,     3,
       4,     5,    64,    65,     0,   151,    67,    68,    69,    70,
      71,    72,    73,     0,     1,     2,   135,     3,     4,     5,
       0,     0,     0,     0,     0,    64,    65,    74,   107,    67,
      68,    69,    70,    71,    72,    73,     0,     1,     2,     0,
       3,     4,     5,    64,    65,    74,   107,   156,   157,   158,
     159,   160,   161,    73,     0,     1,     2,   350,     3,     4,
       5,     0,     0,     0,     0,     0,     0,     0,    74,     0,
       0,     0,     0,     0,     0,    64,    65,     0,   107,    67,
      68,    69,    70,    71,    72,    73,    74,     1,     2,     0,
       3,     4,     5,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   466,     0,    75,
      76,     0,     0,    77,     0,    78,   537,     0,    74,     0,
     152,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,    75,    76,
       0,     0,    77,     0,    78,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,    75,    76,     0,     0,
      77,     0,    78,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,    75,
      76,     0,     0,    77,     0,    78,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,    75,    76,     0,
     372,    77,     0,    78,    64,    65,     0,   107,   156,   157,
     158,   159,   160,   161,    73,     0,     1,     2,     0,     3,
       4,     5,     0,     0,     0,     0,     0,     0,     0,    75,
      76,     0,     0,    77,     0,    78,    64,    65,     0,   107,
      67,    68,    69,    70,    71,    72,    73,    74,     1,     2,
       0,     3,     4,     5,    64,    65,     0,    66,    67,    68,
      69,    70,    71,    72,    73,     0,     1,     2,   588,     3,
       4,     5,     0,     0,     0,     0,     0,    64,    65,    74,
     107,   156,   157,   158,   159,   160,   161,    73,     0,     1,
       2,     0,     3,     4,     5,    64,    65,    74,   151,    67,
      68,    69,    70,    71,    72,    73,     0,     1,     2,     0,
       3,     4,     5,     0,     0,     0,     0,     0,     0,     0,
      74,     0,     0,     0,    64,    65,     0,   107,    67,    68,
      69,    70,    71,    72,    73,     0,     1,     2,    74,     3,
       4,     5,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,    75,    76,
       0,   472,    77,     0,    78,     0,     0,    74,    64,    65,
       0,   280,    67,    68,    69,    70,    71,    72,    73,     0,
       1,     2,     0,     3,     4,     5,     0,     0,     0,     0,
      75,    76,     0,     0,    77,     0,    78,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,    75,    76,
       0,    74,    77,     0,    78,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,    75,    76,     0,     0,    77,     0,    78,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,    75,
      76,     0,     0,    77,     0,    78,    64,    65,     0,   107,
     156,   157,   158,   159,   160,   161,    73,     0,     1,     2,
       0,     3,     4,     5,     0,     0,     0,     0,    75,    76,
       0,     0,    77,     0,    78,     0,     0,     0,    64,    65,
       0,   107,   156,   157,   158,   159,   160,   161,    73,    74,
       1,     2,     0,     3,     4,     5,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,    75,    76,     0,     0,    77,     0,    78,    64,
      65,    74,   107,    67,    68,    69,    70,    71,    72,   596,
       0,     1,     2,     0,     3,     4,     5,    64,    65,     0,
     107,    67,    68,    69,    70,    71,    72,   663,     0,     1,
       2,     0,     3,     4,     5,     0,     0,     0,     0,     0,
       0,     0,    74,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      74,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      75,    76,     0,     0,    77,     0,   375,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,    75,    76,     0,     0,    77,     0,   474,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   171,     0,     0,     0,     0,
       0,     0,     0,    75,    76,     0,     0,    77,     0,    78,
       0,     0,     0,     0,     0,     0,   172,   173,     0,     0,
       0,    75,    76,     0,     0,    77,     0,    78,   174,   175,
     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
     196,   197,   198,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,   199,   200,   201,     0,     0,   202,   203,
     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
     214,   215,   216,   217,   218,   219,   220,   221,   222,   223
};

static const yytype_int16 yycheck[] =
{
       0,    27,   176,   164,    11,     4,   201,   452,   121,    55,
     269,   270,   128,     0,    28,   242,    55,    17,    11,   320,
      55,   216,   217,   218,   219,   220,    38,    55,   440,   441,
      17,   226,   177,   154,   197,   656,   149,    21,    34,    55,
     467,   198,    11,   164,    11,    29,   158,    53,    20,   159,
      55,    23,    78,    11,    34,   676,   159,    55,   168,    17,
      55,   158,    68,   165,   158,   168,    42,    43,    44,    45,
      46,    47,    48,    49,    54,    51,   102,   159,    32,    33,
     106,    55,    59,   228,   166,    54,   112,    54,     3,     4,
       5,     6,   118,    93,   257,   159,   259,   159,   159,   159,
     159,   258,   128,   260,   168,   164,   168,   168,   168,    18,
     156,    26,    27,    55,   140,   141,   375,   156,   144,   531,
     166,   156,   114,   115,   150,   164,     0,   162,   156,   141,
     142,   143,   160,   578,   146,   394,   395,   396,   150,   151,
     156,   243,   244,   338,   160,   141,   142,   143,   174,   159,
     146,   156,   157,   167,   150,   151,   166,   164,   156,   157,
     281,   156,   589,   284,   285,   162,   287,   612,   167,   596,
     597,   164,   288,   199,   200,   201,   202,   153,   154,   155,
     167,    46,   156,    48,   168,   159,   160,   117,   118,   215,
     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
     226,   322,   153,   154,   155,   506,   158,   402,   234,   330,
     331,   332,   333,   334,   156,   474,   159,   159,   160,   245,
     336,   164,    35,   418,    37,   420,   421,   422,     7,     8,
      54,    84,    85,   660,   661,   158,   663,   664,    22,    21,
      19,    20,    22,    22,    23,    24,   159,   548,    42,   550,
      44,   164,   365,   366,   367,   368,   369,   370,   371,   686,
     687,    22,   288,    41,    42,    22,   156,   380,   381,   382,
      48,     4,   157,   299,   159,     4,    54,    62,    63,    64,
      65,    66,    67,    37,   163,   406,   407,   408,   409,   410,
     316,   317,   318,   163,   156,   416,   457,   121,   122,    42,
      43,    44,   160,   157,    47,   159,     4,   534,   429,   430,
     336,   337,   338,   614,   157,    22,   159,   141,   142,   159,
     144,   145,   157,   147,   148,   149,     3,     4,     5,     6,
     443,   444,   445,   446,   166,   157,   457,   159,     4,   284,
     285,   454,   287,   141,   142,   143,   157,   156,   146,   375,
       9,     9,   150,   151,     9,   157,   551,   159,   384,   554,
     555,   556,    19,     9,     9,    22,   487,    24,   489,     9,
      55,   492,    11,    57,   166,   156,   402,   322,    22,     4,
     157,   502,   503,   156,   156,   330,   331,   332,   333,   334,
     156,   156,   418,   419,   420,   421,   422,   156,   156,   159,
     156,   156,   428,   516,   517,   518,   519,   156,   521,   636,
     156,   159,   525,   526,   641,   159,   442,   159,   159,   159,
     541,   542,   159,   544,   545,   546,   547,    38,    38,   156,
     156,   552,   156,   156,   159,    61,    22,   159,   159,   560,
     159,   159,   162,   159,   159,   566,   159,   159,   474,   159,
     159,   159,   166,   159,   159,   568,   569,   570,   571,   633,
     159,   406,   407,   408,   409,   410,   159,    38,   159,   157,
      22,   416,    17,    17,   156,   501,   159,     4,   159,   159,
     159,   507,     4,   657,   429,   430,   607,    94,    95,    96,
      97,    98,    99,   100,   101,   102,   103,   159,   159,   159,
       4,   527,   166,   159,   156,   159,   619,   533,   621,   622,
     159,   159,   159,   634,   635,    22,   159,   543,   159,     4,
       4,   159,   159,   159,   166,   551,    54,   159,   554,   555,
     556,   159,   532,   654,   157,   159,   157,   563,   157,    22,
     162,   159,   487,   157,   489,   157,   166,   492,   164,    19,
      17,   157,    22,   157,    24,    26,    27,   502,   503,   680,
     681,    54,   164,   157,   685,   157,   157,   688,     4,   152,
      22,   156,   156,   694,    17,    17,   697,   159,   159,    17,
      17,    73,   131,   131,    54,   131,   627,    93,   590,   112,
     106,    17,   245,    90,    57,   563,   541,   542,   447,   544,
     545,   546,   547,   234,    -1,    -1,    -1,   552,    -1,    -1,
      -1,   637,    -1,    -1,    -1,   560,    -1,    -1,    -1,    -1,
      -1,   566,    -1,    -1,    -1,    -1,    -1,   627,    -1,   100,
     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
     111,   112,   113,    -1,     3,     4,    -1,    -1,     7,     8,
       9,   121,   122,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      19,    20,   607,    22,    23,    24,    25,    26,    27,    -1,
      -1,   141,   142,    -1,   144,   145,    -1,   147,   148,   149,
      -1,    40,    41,    -1,    -1,    -1,    -1,    -1,    -1,   634,
     635,    -1,    -1,    -1,    -1,    54,    -1,    -1,     7,     8,
      59,    10,    11,    12,    13,    14,    15,    16,    17,   654,
      19,    20,    -1,    22,    23,    24,    75,    76,    77,    78,
      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
      89,    90,    91,    92,    93,   680,   681,    -1,    -1,    -1,
     685,    50,    -1,   688,    -1,    -1,    -1,    -1,    -1,   694,
      -1,    -1,   697,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
     129,   130,   131,    -1,   133,    -1,   135,   136,   137,    -1,
     139,   140,   141,   142,    -1,   144,   145,    -1,   147,   148,
     149,    -1,    -1,    -1,    -1,     3,     4,    -1,    -1,     7,
       8,     9,    -1,   162,    -1,     0,   165,    -1,   167,    -1,
     169,    19,    20,    -1,    22,    23,    24,    25,    26,    27,
      -1,    -1,    -1,    18,    19,    20,    -1,    22,    23,    24,
      -1,    -1,    40,    41,    -1,    30,    31,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    -1,    -1,
      -1,    59,   161,   162,    -1,    -1,   165,    52,   167,   168,
      -1,    56,    -1,    -1,    -1,    60,    -1,    75,    76,    77,
      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
      88,    89,    90,    91,    92,    93,    -1,     7,     8,    -1,
      10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
      20,    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,
      -1,   119,   120,   121,   122,   123,   124,   125,   126,   127,
     128,   129,   130,   131,    -1,   133,    -1,   135,   136,   137,
      50,   139,   140,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,     3,     4,   156,    -1,
       7,     8,     9,    -1,   162,    -1,    -1,   165,    -1,   167,
      -1,   169,    19,    20,    -1,    22,    23,    24,    25,    26,
      27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    40,    41,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       7,     8,    59,    10,    11,    12,    13,    14,    15,    16,
      17,    -1,    19,    20,    -1,    22,    23,    24,    75,    76,
      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
      87,    88,    89,    90,    91,    92,    93,    -1,    -1,    -1,
      -1,   161,   162,    50,    -1,   165,    -1,   167,   168,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   119,   120,   121,   122,   123,   124,   125,   126,
     127,   128,   129,   130,   131,    -1,   133,    -1,   135,   136,
     137,    -1,   139,   140,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,     3,     4,    -1,    -1,    -1,    -1,     9,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,   162,    -1,    -1,   165,    -1,
     167,    -1,   169,    25,    26,    27,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    40,    41,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    59,    -1,    -1,
      -1,    -1,    -1,    -1,   161,   162,    -1,    -1,   165,    -1,
     167,   168,    -1,    75,    76,    77,    78,    79,    80,    81,
      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
      92,    93,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,   121,
     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
      -1,   133,    -1,   135,   136,   137,    -1,   139,   140,     7,
       8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    19,    20,    -1,    22,    23,    24,    25,    -1,    -1,
     162,    -1,    -1,   165,    -1,   167,    -1,   169,    -1,    -1,
      -1,    -1,    40,    41,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,     7,     8,    55,    10,    11,
      12,    13,    14,    15,    16,    17,    -1,    19,    20,    -1,
      22,    23,    24,    -1,    -1,    -1,    -1,    75,    76,    77,
      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
      88,    89,    90,    91,    92,    93,    -1,    -1,    50,    -1,
       7,     8,    -1,    10,    11,    12,    13,    14,    15,    16,
      17,    -1,    19,    20,    -1,    22,    23,    24,    -1,    -1,
      -1,   119,   120,   121,   122,   123,   124,   125,   126,   127,
     128,   129,   130,   131,    -1,   133,    -1,   135,   136,   137,
      -1,   139,   140,    50,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   156,    -1,
       7,     8,   160,    -1,   162,     0,    -1,   165,    -1,   167,
      -1,   169,    19,    20,    -1,    22,    23,    24,    25,    -1,
      -1,    -1,    -1,    18,    19,    20,    -1,    22,    23,    24,
      -1,    -1,    -1,    40,    41,    30,    31,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,   161,
     162,    -1,    -1,   165,    -1,   167,   168,    52,    -1,    -1,
      -1,    56,    -1,    -1,    -1,    60,    -1,    -1,    75,    76,
      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
      87,    88,    89,    90,    91,    92,    93,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,   161,   162,    -1,    -1,   165,    -1,
     167,   168,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   119,   120,   121,   122,   123,   124,   125,   126,
     127,   128,   129,   130,   131,    -1,   133,    -1,   135,   136,
     137,    -1,   139,   140,    -1,     7,     8,    -1,    10,    11,
      12,    13,    14,    15,    16,    17,    -1,    19,    20,   156,
      22,    23,    24,    -1,    -1,   162,    -1,    -1,   165,    -1,
     167,    -1,   169,    -1,     7,     8,    -1,    10,    11,    12,
      13,    14,    15,    16,    17,    -1,    19,    20,    50,    22,
      23,    24,     7,     8,    -1,    10,    11,    12,    13,    14,
      15,    16,    17,    -1,    19,    20,    39,    22,    23,    24,
      -1,    -1,    -1,    -1,    -1,     7,     8,    50,    10,    11,
      12,    13,    14,    15,    16,    17,    -1,    19,    20,    -1,
      22,    23,    24,     7,     8,    50,    10,    11,    12,    13,
      14,    15,    16,    17,    -1,    19,    20,    39,    22,    23,
      24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,
      -1,    -1,    -1,    -1,    -1,     7,     8,    -1,    10,    11,
      12,    13,    14,    15,    16,    17,    50,    19,    20,    -1,
      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,   161,
     162,    -1,    -1,   165,    -1,   167,   168,    -1,    50,    -1,
     125,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   161,   162,
      -1,    -1,   165,    -1,   167,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,   161,   162,    -1,    -1,
     165,    -1,   167,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   161,
     162,    -1,    -1,   165,    -1,   167,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,   161,   162,    -1,
     164,   165,    -1,   167,     7,     8,    -1,    10,    11,    12,
      13,    14,    15,    16,    17,    -1,    19,    20,    -1,    22,
      23,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   161,
     162,    -1,    -1,   165,    -1,   167,     7,     8,    -1,    10,
      11,    12,    13,    14,    15,    16,    17,    50,    19,    20,
      -1,    22,    23,    24,     7,     8,    -1,    10,    11,    12,
      13,    14,    15,    16,    17,    -1,    19,    20,    39,    22,
      23,    24,    -1,    -1,    -1,    -1,    -1,     7,     8,    50,
      10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
      20,    -1,    22,    23,    24,     7,     8,    50,    10,    11,
      12,    13,    14,    15,    16,    17,    -1,    19,    20,    -1,
      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      50,    -1,    -1,    -1,     7,     8,    -1,    10,    11,    12,
      13,    14,    15,    16,    17,    -1,    19,    20,    50,    22,
      23,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   161,   162,
      -1,   164,   165,    -1,   167,    -1,    -1,    50,     7,     8,
      -1,    10,    11,    12,    13,    14,    15,    16,    17,    -1,
      19,    20,    -1,    22,    23,    24,    -1,    -1,    -1,    -1,
     161,   162,    -1,    -1,   165,    -1,   167,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   161,   162,
      -1,    50,   165,    -1,   167,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   161,   162,    -1,    -1,   165,    -1,   167,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   161,
     162,    -1,    -1,   165,    -1,   167,     7,     8,    -1,    10,
      11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
      -1,    22,    23,    24,    -1,    -1,    -1,    -1,   161,   162,
      -1,    -1,   165,    -1,   167,    -1,    -1,    -1,     7,     8,
      -1,    10,    11,    12,    13,    14,    15,    16,    17,    50,
      19,    20,    -1,    22,    23,    24,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   161,   162,    -1,    -1,   165,    -1,   167,     7,
       8,    50,    10,    11,    12,    13,    14,    15,    16,    17,
      -1,    19,    20,    -1,    22,    23,    24,     7,     8,    -1,
      10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
      20,    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    50,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      50,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     161,   162,    -1,    -1,   165,    -1,   167,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   161,   162,    -1,    -1,   165,    -1,   167,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   161,   162,    -1,    -1,   165,    -1,   167,
      -1,    -1,    -1,    -1,    -1,    -1,    57,    58,    -1,    -1,
      -1,   161,   162,    -1,    -1,   165,    -1,   167,    69,    70,
      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
      91,    92,    93,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   114,   115,   116,    -1,    -1,   119,   120,
     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
     131,   132,   133,   134,   135,   136,   137,   138,   139,   140
};

/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
   symbol of state STATE-NUM.  */
static const yytype_uint8 yystos[] =
{
       0,    19,    20,    22,    23,    24,    30,    31,    52,    56,
      60,   178,   181,   182,   183,   184,   216,   217,   218,   220,
     219,    53,    68,   225,   158,    59,   158,    18,   158,    42,
      43,    44,    45,    46,    47,    48,    49,    51,   153,   154,
     155,   185,   186,   187,     0,   218,    46,    48,   188,   235,
      42,    43,    44,    47,   189,   232,   234,   242,   158,   158,
     162,   226,    22,   224,     7,     8,    10,    11,    12,    13,
      14,    15,    16,    17,    50,   161,   162,   165,   167,   178,
     182,   203,   204,   238,   187,   187,    35,    37,   214,   187,
     187,    21,   243,   244,    29,   168,   233,   243,    22,    22,
      22,   227,   156,     4,     4,     4,   167,    10,   168,   204,
     209,    55,   156,   180,   214,   214,    42,    44,   190,    32,
      33,   213,    62,    63,    64,    65,    66,    67,   191,   230,
     230,   181,   247,   159,   164,    39,   204,   205,   207,   208,
     163,   163,   168,   209,   159,   168,   156,   208,   160,   213,
     213,    10,   125,   204,   206,   215,    11,    12,    13,    14,
      15,    16,   176,   177,   204,   210,     4,   206,    28,   167,
     231,    36,    57,    58,    69,    70,    71,    72,    73,    74,
      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
      85,    86,    87,    88,    89,    90,    91,    92,    93,   114,
     115,   116,   119,   120,   121,   122,   123,   124,   125,   126,
     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
     137,   138,   139,   140,   171,   172,   173,   245,   252,   253,
     254,   255,    22,   193,   159,   157,   204,   204,   166,   168,
     204,     4,   157,   210,   204,   156,   238,    26,    27,     3,
       4,     5,     6,     9,    25,    40,    41,    90,    91,    92,
      93,   119,   133,   135,   136,   137,   139,   140,   162,   165,
     167,   169,   171,   172,   173,   211,   238,   180,   182,    57,
      10,   204,   240,   241,    11,    17,    11,   176,   191,    94,
      95,    96,    97,    98,    99,   100,   101,   102,   103,   174,
      26,    27,   100,   101,   102,   103,   104,   105,   106,   107,
     108,   109,   110,   111,   112,   113,   175,   174,   175,   204,
     204,   240,   204,   204,   248,   240,   240,   240,   240,   240,
     204,   204,   204,   204,   204,   240,   191,   117,   118,    54,
     121,   122,   141,   142,   144,   145,   147,   148,   149,   192,
      39,   205,   195,   164,   166,   166,   157,   195,   180,   180,
     215,   174,   175,   174,   175,   156,   156,   156,   156,   156,
     156,   156,   164,   210,   212,   167,   212,   168,   212,    22,
     156,   156,   156,   221,   156,     3,     4,     9,    25,    26,
      27,    40,    41,    59,   162,   165,   167,   169,   211,   237,
     238,   239,   159,   239,   239,   239,   206,   204,   204,   204,
     204,   159,   198,   159,   198,   239,   162,   159,   159,   159,
     159,   159,   159,   239,   239,   239,   239,   239,    38,   206,
     204,   240,     4,   141,   142,   143,   146,   150,   151,   194,
     222,   223,    38,   156,   156,   156,   156,   210,   210,   210,
     210,   210,   210,   210,   159,   164,   168,   204,   212,   166,
     168,   210,   210,   210,   159,   201,    39,   204,   228,   229,
      61,   236,   164,   212,   167,   212,   168,   212,    22,   240,
     159,   159,   239,   239,   239,   239,   239,    11,    54,    11,
     250,   239,   162,   240,   204,   240,   240,   240,   159,   159,
     251,   159,   159,   159,   204,   239,   239,   159,   201,   201,
     204,   210,   210,   210,   210,   250,   159,   159,   159,   159,
     251,   159,   210,   166,   168,   159,   159,    38,    34,    54,
     199,   202,   193,   159,   157,    22,   164,   168,   212,   166,
     168,    17,    17,   156,   159,   159,   159,   159,   239,     4,
     239,   159,   159,   239,   159,   159,   159,     4,     4,   159,
     204,   239,   239,   156,   159,   198,   204,   157,   159,   159,
     159,   159,   157,   210,   210,   210,   210,   157,   210,   166,
     210,   210,   204,    22,     4,   201,   178,   179,    39,   204,
     195,   159,   166,   168,   239,   239,    17,   204,   249,   239,
     239,   239,   239,   198,   198,   240,   239,   159,   240,   240,
     240,     4,   239,   249,   239,   210,   210,   210,   210,   159,
     157,   159,   159,   251,   157,   157,   157,   193,   199,   200,
      22,   166,   159,   162,   193,   193,   157,   159,   164,   239,
     251,   157,   198,   157,   157,   157,   157,   210,   210,   210,
     157,   179,    54,   197,    17,   164,   176,   246,   121,   122,
     239,   239,   195,    17,   204,   164,   195,   157,   157,   157,
       4,   152,   196,   239,   237,   164,   176,   193,   193,    38,
     193,   193,    22,   159,   237,    17,   239,   239,    17,   159,
     239,   193,   193,   239,    17,    73,   239,    17,   239
};

#define yyerrok		(yyerrstatus = 0)
#define yyclearin	(yychar = YYEMPTY)
#define YYEMPTY		(-2)
#define YYEOF		0

#define YYACCEPT	goto yyacceptlab
#define YYABORT		goto yyabortlab
#define YYERROR		goto yyerrorlab


/* Like YYERROR except do call yyerror.  This remains here temporarily
   to ease the transition to the new meaning of YYERROR, for GCC.
   Once GCC version 2 has supplanted version 1, this can go.  */

#define YYFAIL		goto yyerrlab

#define YYRECOVERING()  (!!yyerrstatus)

#define YYBACKUP(Token, Value)					\
do								\
  if (yychar == YYEMPTY && yylen == 1)				\
    {								\
      yychar = (Token);						\
      yylval = (Value);						\
      yytoken = YYTRANSLATE (yychar);				\
      YYPOPSTACK (1);						\
      goto yybackup;						\
    }								\
  else								\
    {								\
      yyerror (YY_("syntax error: cannot back up")); \
      YYERROR;							\
    }								\
while (YYID (0))


#define YYTERROR	1
#define YYERRCODE	256


/* 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 (YYID (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 (YYID (0))
#endif


/* YY_LOCATION_PRINT -- Print the location on the stream.
   This macro was not mandated originally: define only if we know
   we won't break user code: when these are the locations we know.  */

#ifndef YY_LOCATION_PRINT
# if defined YYLTYPE_IS_TRIVIAL && 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

/* Enable debugging if requested.  */
#if YYDEBUG

# ifndef YYFPRINTF
#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
#  define YYFPRINTF fprintf
# endif

# define YYDPRINTF(Args)			\
do {						\
  if (yydebug)					\
    YYFPRINTF Args;				\
} while (YYID (0))

# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
do {									  \
  if (yydebug)								  \
    {									  \
      YYFPRINTF (stderr, "%s ", Title);					  \
      yy_symbol_print (stderr,						  \
		  Type, Value); \
      YYFPRINTF (stderr, "\n");						  \
    }									  \
} while (YYID (0))


/*--------------------------------.
| Print this symbol on YYOUTPUT.  |
`--------------------------------*/

/*ARGSUSED*/
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static void
yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
#else
static void
yy_symbol_value_print (yyoutput, yytype, yyvaluep)
    FILE *yyoutput;
    int yytype;
    YYSTYPE const * const yyvaluep;
#endif
{
  if (!yyvaluep)
    return;
# ifdef YYPRINT
  if (yytype < YYNTOKENS)
    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
# else
  YYUSE (yyoutput);
# endif
  switch (yytype)
    {
      default:
	break;
    }
}


/*--------------------------------.
| Print this symbol on YYOUTPUT.  |
`--------------------------------*/

#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static void
yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
#else
static void
yy_symbol_print (yyoutput, yytype, yyvaluep)
    FILE *yyoutput;
    int yytype;
    YYSTYPE const * const yyvaluep;
#endif
{
  if (yytype < YYNTOKENS)
    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
  else
    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);

  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
  YYFPRINTF (yyoutput, ")");
}

/*------------------------------------------------------------------.
| yy_stack_print -- Print the state stack from its BOTTOM up to its |
| TOP (included).                                                   |
`------------------------------------------------------------------*/

#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static void
yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
#else
static void
yy_stack_print (bottom, top)
    yytype_int16 *bottom;
    yytype_int16 *top;
#endif
{
  YYFPRINTF (stderr, "Stack now");
  for (; 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 (YYID (0))


/*------------------------------------------------.
| Report that the YYRULE is going to be reduced.  |
`------------------------------------------------*/

#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static void
yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
#else
static void
yy_reduce_print (yyvsp, yyrule)
    YYSTYPE *yyvsp;
    int yyrule;
#endif
{
  int yynrhs = yyr2[yyrule];
  int yyi;
  unsigned long int yylno = yyrline[yyrule];
  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
	     yyrule - 1, yylno);
  /* The symbols being reduced.  */
  for (yyi = 0; yyi < yynrhs; yyi++)
    {
      fprintf (stderr, "   $%d = ", yyi + 1);
      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
		       &(yyvsp[(yyi + 1) - (yynrhs)])
		       		       );
      fprintf (stderr, "\n");
    }
}

# define YY_REDUCE_PRINT(Rule)		\
do {					\
  if (yydebug)				\
    yy_reduce_print (yyvsp, Rule); \
} while (YYID (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)
#endif /* !YYDEBUG */


/* YYINITDEPTH -- initial size of the parser's stacks.  */
#ifndef	YYINITDEPTH
# define YYINITDEPTH 200
#endif

/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
   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)
   evaluated with infinite-precision integer arithmetic.  */

#ifndef YYMAXDEPTH
# define YYMAXDEPTH 10000
#endif



#if YYERROR_VERBOSE

# ifndef yystrlen
#  if defined __GLIBC__ && defined _STRING_H
#   define yystrlen strlen
#  else
/* Return the length of YYSTR.  */
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static YYSIZE_T
yystrlen (const char *yystr)
#else
static YYSIZE_T
yystrlen (yystr)
    const char *yystr;
#endif
{
  YYSIZE_T yylen;
  for (yylen = 0; yystr[yylen]; yylen++)
    continue;
  return yylen;
}
#  endif
# endif

# ifndef yystpcpy
#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
#   define yystpcpy stpcpy
#  else
/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
   YYDEST.  */
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static char *
yystpcpy (char *yydest, const char *yysrc)
#else
static char *
yystpcpy (yydest, yysrc)
    char *yydest;
    const char *yysrc;
#endif
{
  char *yyd = yydest;
  const char *yys = yysrc;

  while ((*yyd++ = *yys++) != '\0')
    continue;

  return yyd - 1;
}
#  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 == '"')
    {
      YYSIZE_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

/* Copy into YYRESULT an error message about the unexpected token
   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
   including the terminating null byte.  If YYRESULT is null, do not
   copy anything; just return the number of bytes that would be
   copied.  As a special case, return 0 if an ordinary "syntax error"
   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
   size calculation.  */
static YYSIZE_T
yysyntax_error (char *yyresult, int yystate, int yychar)
{
  int yyn = yypact[yystate];

  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
    return 0;
  else
    {
      int yytype = YYTRANSLATE (yychar);
      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
      YYSIZE_T yysize = yysize0;
      YYSIZE_T yysize1;
      int yysize_overflow = 0;
      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
      int yyx;

# if 0
      /* This is so xgettext sees the translatable formats that are
	 constructed on the fly.  */
      YY_("syntax error, unexpected %s");
      YY_("syntax error, unexpected %s, expecting %s");
      YY_("syntax error, unexpected %s, expecting %s or %s");
      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
# endif
      char *yyfmt;
      char const *yyf;
      static char const yyunexpected[] = "syntax error, unexpected %s";
      static char const yyexpecting[] = ", expecting %s";
      static char const yyor[] = " or %s";
      char yyformat[sizeof yyunexpected
		    + sizeof yyexpecting - 1
		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
		       * (sizeof yyor - 1))];
      char const *yyprefix = yyexpecting;

      /* 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 + 1;
      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
      int yycount = 1;

      yyarg[0] = yytname[yytype];
      yyfmt = yystpcpy (yyformat, yyunexpected);

      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
	  {
	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
	      {
		yycount = 1;
		yysize = yysize0;
		yyformat[sizeof yyunexpected - 1] = '\0';
		break;
	      }
	    yyarg[yycount++] = yytname[yyx];
	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
	    yysize_overflow |= (yysize1 < yysize);
	    yysize = yysize1;
	    yyfmt = yystpcpy (yyfmt, yyprefix);
	    yyprefix = yyor;
	  }

      yyf = YY_(yyformat);
      yysize1 = yysize + yystrlen (yyf);
      yysize_overflow |= (yysize1 < yysize);
      yysize = yysize1;

      if (yysize_overflow)
	return YYSIZE_MAXIMUM;

      if (yyresult)
	{
	  /* 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 = yyresult;
	  int yyi = 0;
	  while ((*yyp = *yyf) != '\0')
	    {
	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
		{
		  yyp += yytnamerr (yyp, yyarg[yyi++]);
		  yyf += 2;
		}
	      else
		{
		  yyp++;
		  yyf++;
		}
	    }
	}
      return yysize;
    }
}
#endif /* YYERROR_VERBOSE */


/*-----------------------------------------------.
| Release the memory associated to this symbol.  |
`-----------------------------------------------*/

/*ARGSUSED*/
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static void
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
#else
static void
yydestruct (yymsg, yytype, yyvaluep)
    const char *yymsg;
    int yytype;
    YYSTYPE *yyvaluep;
#endif
{
  YYUSE (yyvaluep);

  if (!yymsg)
    yymsg = "Deleting";
  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);

  switch (yytype)
    {

      default:
	break;
    }
}


/* Prevent warnings from -Wmissing-prototypes.  */

#ifdef YYPARSE_PARAM
#if defined __STDC__ || defined __cplusplus
int yyparse (void *YYPARSE_PARAM);
#else
int yyparse ();
#endif
#else /* ! YYPARSE_PARAM */
#if defined __STDC__ || defined __cplusplus
int yyparse (void);
#else
int yyparse ();
#endif
#endif /* ! YYPARSE_PARAM */



/* The look-ahead symbol.  */
int yychar;

/* The semantic value of the look-ahead symbol.  */
YYSTYPE yylval;

/* Number of syntax errors so far.  */
int yynerrs;



/*----------.
| yyparse.  |
`----------*/

#ifdef YYPARSE_PARAM
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
int
yyparse (void *YYPARSE_PARAM)
#else
int
yyparse (YYPARSE_PARAM)
    void *YYPARSE_PARAM;
#endif
#else /* ! YYPARSE_PARAM */
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
int
yyparse (void)
#else
int
yyparse ()

#endif
#endif
{
  
  int yystate;
  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;
#if YYERROR_VERBOSE
  /* Buffer for error messages, and its allocated size.  */
  char yymsgbuf[128];
  char *yymsg = yymsgbuf;
  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
#endif

  /* Three stacks and their tools:
     `yyss': related to states,
     `yyvs': related to semantic values,
     `yyls': related to locations.

     Refer to the stacks thru separate pointers, to allow yyoverflow
     to reallocate them elsewhere.  */

  /* The state stack.  */
  yytype_int16 yyssa[YYINITDEPTH];
  yytype_int16 *yyss = yyssa;
  yytype_int16 *yyssp;

  /* The semantic value stack.  */
  YYSTYPE yyvsa[YYINITDEPTH];
  YYSTYPE *yyvs = yyvsa;
  YYSTYPE *yyvsp;



#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))

  YYSIZE_T yystacksize = YYINITDEPTH;

  /* The variables used to return semantic value and location from the
     action routines.  */
  YYSTYPE yyval;


  /* The number of symbols on the RHS of the reduced rule.
     Keep to zero when no symbol should be popped.  */
  int yylen = 0;

  YYDPRINTF ((stderr, "Starting parse\n"));

  yystate = 0;
  yyerrstatus = 0;
  yynerrs = 0;
  yychar = YYEMPTY;		/* Cause a token to be read.  */

  /* Initialize stack pointers.
     Waste one element of value and location stack
     so that they stay on the same level as the state stack.
     The wasted elements are never initialized.  */

  yyssp = yyss;
  yyvsp = yyvs;

  goto yysetstate;

/*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate.  |
`------------------------------------------------------------*/
 yynewstate:
  /* In all cases, when you get here, the value and location stacks
     have just been pushed.  So pushing a state here evens the stacks.  */
  yyssp++;

 yysetstate:
  *yyssp = yystate;

  if (yyss + yystacksize - 1 <= yyssp)
    {
      /* Get the current used size of the three stacks, in elements.  */
      YYSIZE_T yysize = yyssp - yyss + 1;

#ifdef yyoverflow
      {
	/* Give user a chance to reallocate the stack.  Use copies of
	   these so that the &'s don't force the real ones into
	   memory.  */
	YYSTYPE *yyvs1 = yyvs;
	yytype_int16 *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"),
		    &yyss1, yysize * sizeof (*yyssp),
		    &yyvs1, yysize * sizeof (*yyvsp),

		    &yystacksize);

	yyss = yyss1;
	yyvs = yyvs1;
      }
#else /* no yyoverflow */
# ifndef YYSTACK_RELOCATE
      goto yyexhaustedlab;
# else
      /* Extend the stack our own way.  */
      if (YYMAXDEPTH <= yystacksize)
	goto yyexhaustedlab;
      yystacksize *= 2;
      if (YYMAXDEPTH < yystacksize)
	yystacksize = YYMAXDEPTH;

      {
	yytype_int16 *yyss1 = yyss;
	union yyalloc *yyptr =
	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
	if (! yyptr)
	  goto yyexhaustedlab;
	YYSTACK_RELOCATE (yyss);
	YYSTACK_RELOCATE (yyvs);

#  undef YYSTACK_RELOCATE
	if (yyss1 != yyssa)
	  YYSTACK_FREE (yyss1);
      }
# endif
#endif /* no yyoverflow */

      yyssp = yyss + yysize - 1;
      yyvsp = yyvs + yysize - 1;


      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
		  (unsigned long int) yystacksize));

      if (yyss + yystacksize - 1 <= yyssp)
	YYABORT;
    }

  YYDPRINTF ((stderr, "Entering state %d\n", yystate));

  goto yybackup;

/*-----------.
| yybackup.  |
`-----------*/
yybackup:

  /* Do appropriate processing given the current state.  Read a
     look-ahead token if we need one and don't already have one.  */

  /* First try to decide what to do without reference to look-ahead token.  */
  yyn = yypact[yystate];
  if (yyn == YYPACT_NINF)
    goto yydefault;

  /* Not known => get a look-ahead token if don't already have one.  */

  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
  if (yychar == YYEMPTY)
    {
      YYDPRINTF ((stderr, "Reading a token: "));
      yychar = YYLEX;
    }

  if (yychar <= YYEOF)
    {
      yychar = yytoken = YYEOF;
      YYDPRINTF ((stderr, "Now at end of input.\n"));
    }
  else
    {
      yytoken = YYTRANSLATE (yychar);
      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
    }

  /* If the proper action on seeing token YYTOKEN is to reduce or to
     detect an error, take that action.  */
  yyn += yytoken;
  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
    goto yydefault;
  yyn = yytable[yyn];
  if (yyn <= 0)
    {
      if (yyn == 0 || yyn == YYTABLE_NINF)
	goto yyerrlab;
      yyn = -yyn;
      goto yyreduce;
    }

  if (yyn == YYFINAL)
    YYACCEPT;

  /* Count tokens shifted since error; after three, turn off error
     status.  */
  if (yyerrstatus)
    yyerrstatus--;

  /* Shift the look-ahead token.  */
  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);

  /* Discard the shifted token unless it is eof.  */
  if (yychar != YYEOF)
    yychar = YYEMPTY;

  yystate = yyn;
  *++yyvsp = yylval;

  goto yynewstate;


/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state.  |
`-----------------------------------------------------------*/
yydefault:
  yyn = yydefact[yystate];
  if (yyn == 0)
    goto yyerrlab;
  goto yyreduce;


/*-----------------------------.
| yyreduce -- Do a reduction.  |
`-----------------------------*/
yyreduce:
  /* yyn is the number of a rule to reduce with.  */
  yylen = yyr2[yyn];

  /* If YYLEN is nonzero, implement the default value of the action:
     `$$ = $1'.

     Otherwise, the following line sets YYVAL to garbage.
     This behavior is undocumented and Bison
     users should not rely upon it.  Assigning to YYVAL
     unconditionally makes the parser a bit smaller, and it avoids a
     GCC warning that YYVAL may be used uninitialized.  */
  yyval = yyvsp[1-yylen];


  YY_REDUCE_PRINT (yyn);
  switch (yyn)
    {
        case 29:
#line 1124 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_EQ; ;}
    break;

  case 30:
#line 1124 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_NE; ;}
    break;

  case 31:
#line 1125 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_SLT; ;}
    break;

  case 32:
#line 1125 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_SGT; ;}
    break;

  case 33:
#line 1126 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_SLE; ;}
    break;

  case 34:
#line 1126 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_SGE; ;}
    break;

  case 35:
#line 1127 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_ULT; ;}
    break;

  case 36:
#line 1127 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_UGT; ;}
    break;

  case 37:
#line 1128 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_ULE; ;}
    break;

  case 38:
#line 1128 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_UGE; ;}
    break;

  case 39:
#line 1132 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OEQ; ;}
    break;

  case 40:
#line 1132 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_ONE; ;}
    break;

  case 41:
#line 1133 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OLT; ;}
    break;

  case 42:
#line 1133 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OGT; ;}
    break;

  case 43:
#line 1134 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OLE; ;}
    break;

  case 44:
#line 1134 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OGE; ;}
    break;

  case 45:
#line 1135 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_ORD; ;}
    break;

  case 46:
#line 1135 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UNO; ;}
    break;

  case 47:
#line 1136 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UEQ; ;}
    break;

  case 48:
#line 1136 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UNE; ;}
    break;

  case 49:
#line 1137 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_ULT; ;}
    break;

  case 50:
#line 1137 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UGT; ;}
    break;

  case 51:
#line 1138 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_ULE; ;}
    break;

  case 52:
#line 1138 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UGE; ;}
    break;

  case 53:
#line 1139 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_TRUE; ;}
    break;

  case 54:
#line 1140 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_FALSE; ;}
    break;

  case 65:
#line 1149 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = 0; ;}
    break;

  case 66:
#line 1151 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal)=(yyvsp[(3) - (4)].UInt64Val); ;}
    break;

  case 67:
#line 1152 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal)=0; ;}
    break;

  case 68:
#line 1156 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = (yyvsp[(1) - (2)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 69:
#line 1160 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 73:
#line 1168 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 74:
#line 1173 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = (yyvsp[(1) - (2)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 75:
#line 1179 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
    break;

  case 76:
#line 1180 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
    break;

  case 77:
#line 1181 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
    break;

  case 78:
#line 1182 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
    break;

  case 79:
#line 1183 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
    break;

  case 80:
#line 1184 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::CommonLinkage; ;}
    break;

  case 81:
#line 1188 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
    break;

  case 82:
#line 1189 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
    break;

  case 83:
#line 1190 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 84:
#line 1194 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Visibility) = GlobalValue::DefaultVisibility;   ;}
    break;

  case 85:
#line 1195 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Visibility) = GlobalValue::DefaultVisibility;   ;}
    break;

  case 86:
#line 1196 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Visibility) = GlobalValue::HiddenVisibility;    ;}
    break;

  case 87:
#line 1197 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Visibility) = GlobalValue::ProtectedVisibility; ;}
    break;

  case 88:
#line 1201 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 89:
#line 1202 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
    break;

  case 90:
#line 1203 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
    break;

  case 91:
#line 1207 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 92:
#line 1208 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
    break;

  case 93:
#line 1209 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
    break;

  case 94:
#line 1210 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
    break;

  case 95:
#line 1211 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
    break;

  case 96:
#line 1215 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 97:
#line 1216 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
    break;

  case 98:
#line 1217 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
    break;

  case 99:
#line 1220 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::C; ;}
    break;

  case 100:
#line 1221 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::C; ;}
    break;

  case 101:
#line 1222 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::Fast; ;}
    break;

  case 102:
#line 1223 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::Cold; ;}
    break;

  case 103:
#line 1224 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::X86_StdCall; ;}
    break;

  case 104:
#line 1225 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::X86_FastCall; ;}
    break;

  case 105:
#line 1226 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
                   if ((unsigned)(yyvsp[(2) - (2)].UInt64Val) != (yyvsp[(2) - (2)].UInt64Val))
                     GEN_ERROR("Calling conv too large");
                   (yyval.UIntVal) = (yyvsp[(2) - (2)].UInt64Val);
                  CHECK_FOR_ERROR
                 ;}
    break;

  case 106:
#line 1233 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ZExt;      ;}
    break;

  case 107:
#line 1234 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ZExt;      ;}
    break;

  case 108:
#line 1235 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::SExt;      ;}
    break;

  case 109:
#line 1236 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::SExt;      ;}
    break;

  case 110:
#line 1237 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::InReg;     ;}
    break;

  case 111:
#line 1238 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::StructRet; ;}
    break;

  case 112:
#line 1239 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::NoAlias;   ;}
    break;

  case 113:
#line 1240 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ByVal;     ;}
    break;

  case 114:
#line 1241 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::Nest;      ;}
    break;

  case 115:
#line 1242 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = 
                          ParamAttr::constructAlignmentFromInt((yyvsp[(2) - (2)].UInt64Val));    ;}
    break;

  case 116:
#line 1246 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::None; ;}
    break;

  case 117:
#line 1247 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
                (yyval.ParamAttrs) = (yyvsp[(1) - (2)].ParamAttrs) | (yyvsp[(2) - (2)].ParamAttrs);
              ;}
    break;

  case 118:
#line 1252 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::NoReturn; ;}
    break;

  case 119:
#line 1253 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::NoUnwind; ;}
    break;

  case 120:
#line 1254 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ZExt;     ;}
    break;

  case 121:
#line 1255 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::SExt;     ;}
    break;

  case 122:
#line 1256 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ReadNone; ;}
    break;

  case 123:
#line 1257 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ReadOnly; ;}
    break;

  case 124:
#line 1260 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::None; ;}
    break;

  case 125:
#line 1261 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
                (yyval.ParamAttrs) = (yyvsp[(1) - (2)].ParamAttrs) | (yyvsp[(2) - (2)].ParamAttrs);
              ;}
    break;

  case 126:
#line 1266 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = 0; ;}
    break;

  case 127:
#line 1267 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
                (yyval.StrVal) = (yyvsp[(2) - (2)].StrVal);
              ;}
    break;

  case 128:
#line 1274 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = 0; ;}
    break;

  case 129:
#line 1275 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.UIntVal) = (yyvsp[(2) - (2)].UInt64Val);
  if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
    GEN_ERROR("Alignment must be a power of two");
  CHECK_FOR_ERROR
;}
    break;

  case 130:
#line 1281 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = 0; ;}
    break;

  case 131:
#line 1282 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.UIntVal) = (yyvsp[(3) - (3)].UInt64Val);
  if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
    GEN_ERROR("Alignment must be a power of two");
  CHECK_FOR_ERROR
;}
    break;

  case 132:
#line 1291 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
  for (unsigned i = 0, e = (yyvsp[(2) - (2)].StrVal)->length(); i != e; ++i)
    if ((*(yyvsp[(2) - (2)].StrVal))[i] == '"' || (*(yyvsp[(2) - (2)].StrVal))[i] == '\\')
      GEN_ERROR("Invalid character in section name");
  (yyval.StrVal) = (yyvsp[(2) - (2)].StrVal);
  CHECK_FOR_ERROR
;}
    break;

  case 133:
#line 1299 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = 0; ;}
    break;

  case 134:
#line 1300 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = (yyvsp[(1) - (1)].StrVal); ;}
    break;

  case 135:
#line 1305 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {;}
    break;

  case 136:
#line 1306 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {;}
    break;

  case 137:
#line 1307 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV->setSection(*(yyvsp[(1) - (1)].StrVal));
    delete (yyvsp[(1) - (1)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 138:
#line 1312 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(2) - (2)].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[(2) - (2)].UInt64Val)))
      GEN_ERROR("Alignment must be a power of two");
    CurGV->setAlignment((yyvsp[(2) - (2)].UInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 146:
#line 1328 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeVal) = new PATypeHolder(OpaqueType::get());
    CHECK_FOR_ERROR
  ;}
    break;

  case 147:
#line 1332 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeVal) = new PATypeHolder((yyvsp[(1) - (1)].PrimType));
    CHECK_FOR_ERROR
  ;}
    break;

  case 148:
#line 1336 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                             // Pointer type?
    if (*(yyvsp[(1) - (3)].TypeVal) == Type::LabelTy)
      GEN_ERROR("Cannot form a pointer to a basic block");
    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PointerType::get(*(yyvsp[(1) - (3)].TypeVal), (yyvsp[(2) - (3)].UIntVal))));
    delete (yyvsp[(1) - (3)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 149:
#line 1343 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {            // Named types are also simple types...
    const Type* tmp = getTypeVal((yyvsp[(1) - (1)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.TypeVal) = new PATypeHolder(tmp);
  ;}
    break;

  case 150:
#line 1348 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                   // Type UpReference
    if ((yyvsp[(2) - (2)].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range");
    OpaqueType *OT = OpaqueType::get();        // Use temporary placeholder
    UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[(2) - (2)].UInt64Val), OT));  // Add to vector...
    (yyval.TypeVal) = new PATypeHolder(OT);
    UR_OUT("New Upreference!\n");
    CHECK_FOR_ERROR
  ;}
    break;

  case 151:
#line 1356 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // Allow but ignore attributes on function types; this permits auto-upgrade.
    // FIXME: remove in LLVM 3.0.
    const Type *RetTy = *(yyvsp[(1) - (5)].TypeVal);
    if (!FunctionType::isValidReturnType(RetTy))
      GEN_ERROR("Invalid result type for LLVM function");
      
    std::vector<const Type*> Params;
    TypeWithAttrsList::iterator I = (yyvsp[(3) - (5)].TypeWithAttrsList)->begin(), E = (yyvsp[(3) - (5)].TypeWithAttrsList)->end();
    for (; I != E; ++I ) {
      const Type *Ty = I->Ty->get();
      Params.push_back(Ty);
    }

    bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
    if (isVarArg) Params.pop_back();

    for (unsigned i = 0; i != Params.size(); ++i)
      if (!(Params[i]->isFirstClassType() || isa<OpaqueType>(Params[i])))
        GEN_ERROR("Function arguments must be value types!");

    CHECK_FOR_ERROR

    FunctionType *FT = FunctionType::get(RetTy, Params, isVarArg);
    delete (yyvsp[(3) - (5)].TypeWithAttrsList);   // Delete the argument list
    delete (yyvsp[(1) - (5)].TypeVal);   // Delete the return type handle
    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FT)); 
    CHECK_FOR_ERROR
  ;}
    break;

  case 152:
#line 1385 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // Allow but ignore attributes on function types; this permits auto-upgrade.
    // FIXME: remove in LLVM 3.0.
    std::vector<const Type*> Params;
    TypeWithAttrsList::iterator I = (yyvsp[(3) - (5)].TypeWithAttrsList)->begin(), E = (yyvsp[(3) - (5)].TypeWithAttrsList)->end();
    for ( ; I != E; ++I ) {
      const Type* Ty = I->Ty->get();
      Params.push_back(Ty);
    }

    bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
    if (isVarArg) Params.pop_back();

    for (unsigned i = 0; i != Params.size(); ++i)
      if (!(Params[i]->isFirstClassType() || isa<OpaqueType>(Params[i])))
        GEN_ERROR("Function arguments must be value types!");

    CHECK_FOR_ERROR

    FunctionType *FT = FunctionType::get((yyvsp[(1) - (5)].PrimType), Params, isVarArg);
    delete (yyvsp[(3) - (5)].TypeWithAttrsList);      // Delete the argument list
    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FT)); 
    CHECK_FOR_ERROR
  ;}
    break;

  case 153:
#line 1410 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {          // Sized array type?
    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[(4) - (5)].TypeVal), (yyvsp[(2) - (5)].UInt64Val))));
    delete (yyvsp[(4) - (5)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 154:
#line 1415 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {          // Vector type?
     const llvm::Type* ElemTy = (yyvsp[(4) - (5)].TypeVal)->get();
     if ((unsigned)(yyvsp[(2) - (5)].UInt64Val) != (yyvsp[(2) - (5)].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");
     (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(VectorType::get(*(yyvsp[(4) - (5)].TypeVal), (unsigned)(yyvsp[(2) - (5)].UInt64Val))));
     delete (yyvsp[(4) - (5)].TypeVal);
     CHECK_FOR_ERROR
  ;}
    break;

  case 155:
#line 1425 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                        // Structure type?
    std::vector<const Type*> Elements;
    for (std::list<llvm::PATypeHolder>::iterator I = (yyvsp[(2) - (3)].TypeList)->begin(),
           E = (yyvsp[(2) - (3)].TypeList)->end(); I != E; ++I)
      Elements.push_back(*I);

    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
    delete (yyvsp[(2) - (3)].TypeList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 156:
#line 1435 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                                  // Empty structure type?
    (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector<const Type*>()));
    CHECK_FOR_ERROR
  ;}
    break;

  case 157:
#line 1439 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    std::vector<const Type*> Elements;
    for (std::list<llvm::PATypeHolder>::iterator I = (yyvsp[(3) - (5)].TypeList)->begin(),
           E = (yyvsp[(3) - (5)].TypeList)->end(); I != E; ++I)
      Elements.push_back(*I);

    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
    delete (yyvsp[(3) - (5)].TypeList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 158:
#line 1449 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                         // Empty structure type?
    (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector<const Type*>(), true));
    CHECK_FOR_ERROR
  ;}
    break;

  case 159:
#line 1456 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // Allow but ignore attributes on function types; this permits auto-upgrade.
    // FIXME: remove in LLVM 3.0.
    (yyval.TypeWithAttrs).Ty = (yyvsp[(1) - (2)].TypeVal); 
    (yyval.TypeWithAttrs).Attrs = ParamAttr::None;
  ;}
    break;

  case 160:
#line 1465 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (1)].TypeVal))->getDescription());
    if (!(*(yyvsp[(1) - (1)].TypeVal))->isFirstClassType() && !isa<StructType>((yyvsp[(1) - (1)].TypeVal)->get()))
      GEN_ERROR("LLVM functions cannot return aggregate types");
    (yyval.TypeVal) = (yyvsp[(1) - (1)].TypeVal);
  ;}
    break;

  case 161:
#line 1472 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeVal) = new PATypeHolder(Type::VoidTy);
  ;}
    break;

  case 162:
#line 1477 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeWithAttrsList) = new TypeWithAttrsList();
    (yyval.TypeWithAttrsList)->push_back((yyvsp[(1) - (1)].TypeWithAttrs));
    CHECK_FOR_ERROR
  ;}
    break;

  case 163:
#line 1482 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.TypeWithAttrsList)=(yyvsp[(1) - (3)].TypeWithAttrsList))->push_back((yyvsp[(3) - (3)].TypeWithAttrs));
    CHECK_FOR_ERROR
  ;}
    break;

  case 165:
#line 1490 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeWithAttrsList)=(yyvsp[(1) - (3)].TypeWithAttrsList);
    TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
    TWA.Ty = new PATypeHolder(Type::VoidTy);
    (yyval.TypeWithAttrsList)->push_back(TWA);
    CHECK_FOR_ERROR
  ;}
    break;

  case 166:
#line 1497 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeWithAttrsList) = new TypeWithAttrsList;
    TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
    TWA.Ty = new PATypeHolder(Type::VoidTy);
    (yyval.TypeWithAttrsList)->push_back(TWA);
    CHECK_FOR_ERROR
  ;}
    break;

  case 167:
#line 1504 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeWithAttrsList) = new TypeWithAttrsList();
    CHECK_FOR_ERROR
  ;}
    break;

  case 168:
#line 1512 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeList) = new std::list<PATypeHolder>();
    (yyval.TypeList)->push_back(*(yyvsp[(1) - (1)].TypeVal)); 
    delete (yyvsp[(1) - (1)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 169:
#line 1518 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.TypeList)=(yyvsp[(1) - (3)].TypeList))->push_back(*(yyvsp[(3) - (3)].TypeVal)); 
    delete (yyvsp[(3) - (3)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 170:
#line 1530 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { // Nonempty unsized arr
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (4)].TypeVal))->getDescription());
    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (4)].TypeVal)->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     (*(yyvsp[(1) - (4)].TypeVal))->getDescription() + "'");
    const Type *ETy = ATy->getElementType();
    uint64_t NumElements = ATy->getNumElements();

    // Verify that we have the correct size...
    if (NumElements != uint64_t(-1) && NumElements != (yyvsp[(3) - (4)].ConstVector)->size())
      GEN_ERROR("Type mismatch: constant sized array initialized with " +
                     utostr((yyvsp[(3) - (4)].ConstVector)->size()) +  " arguments, but has size of " + 
                     utostr(NumElements) + "");

    // Verify all elements are correct type!
    for (unsigned i = 0; i < (yyvsp[(3) - (4)].ConstVector)->size(); i++) {
      if (ETy != (*(yyvsp[(3) - (4)].ConstVector))[i]->getType())
        GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
                       ETy->getDescription() +"' as required!\nIt is of type '"+
                       (*(yyvsp[(3) - (4)].ConstVector))[i]->getType()->getDescription() + "'.");
    }

    (yyval.ConstVal) = ConstantArray::get(ATy, *(yyvsp[(3) - (4)].ConstVector));
    delete (yyvsp[(1) - (4)].TypeVal); delete (yyvsp[(3) - (4)].ConstVector);
    CHECK_FOR_ERROR
  ;}
    break;

  case 171:
#line 1558 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (3)].TypeVal))->getDescription());
    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (3)].TypeVal)->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     (*(yyvsp[(1) - (3)].TypeVal))->getDescription() + "'");

    uint64_t NumElements = ATy->getNumElements();
    if (NumElements != uint64_t(-1) && NumElements != 0) 
      GEN_ERROR("Type mismatch: constant sized array initialized with 0"
                     " arguments, but has size of " + utostr(NumElements) +"");
    (yyval.ConstVal) = ConstantArray::get(ATy, std::vector<Constant*>());
    delete (yyvsp[(1) - (3)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 172:
#line 1574 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (3)].TypeVal))->getDescription());
    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (3)].TypeVal)->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     (*(yyvsp[(1) - (3)].TypeVal))->getDescription() + "'");

    uint64_t NumElements = ATy->getNumElements();
    const Type *ETy = ATy->getElementType();
    if (NumElements != uint64_t(-1) && NumElements != (yyvsp[(3) - (3)].StrVal)->length())
      GEN_ERROR("Can't build string constant of size " + 
                     utostr((yyvsp[(3) - (3)].StrVal)->length()) +
                     " when array has size " + utostr(NumElements) + "");
    std::vector<Constant*> Vals;
    if (ETy == Type::Int8Ty) {
      for (uint64_t i = 0; i < (yyvsp[(3) - (3)].StrVal)->length(); ++i)
        Vals.push_back(ConstantInt::get(ETy, (*(yyvsp[(3) - (3)].StrVal))[i]));
    } else {
      delete (yyvsp[(3) - (3)].StrVal);
      GEN_ERROR("Cannot build string arrays of non byte sized elements");
    }
    delete (yyvsp[(3) - (3)].StrVal);
    (yyval.ConstVal) = ConstantArray::get(ATy, Vals);
    delete (yyvsp[(1) - (3)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 173:
#line 1601 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { // Nonempty unsized arr
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (4)].TypeVal))->getDescription());
    const VectorType *PTy = dyn_cast<VectorType>((yyvsp[(1) - (4)].TypeVal)->get());
    if (PTy == 0)
      GEN_ERROR("Cannot make packed constant with type: '" + 
                     (*(yyvsp[(1) - (4)].TypeVal))->getDescription() + "'");
    const Type *ETy = PTy->getElementType();
    unsigned NumElements = PTy->getNumElements();

    // Verify that we have the correct size...
    if (NumElements != unsigned(-1) && NumElements != (unsigned)(yyvsp[(3) - (4)].ConstVector)->size())
      GEN_ERROR("Type mismatch: constant sized packed initialized with " +
                     utostr((yyvsp[(3) - (4)].ConstVector)->size()) +  " arguments, but has size of " + 
                     utostr(NumElements) + "");

    // Verify all elements are correct type!
    for (unsigned i = 0; i < (yyvsp[(3) - (4)].ConstVector)->size(); i++) {
      if (ETy != (*(yyvsp[(3) - (4)].ConstVector))[i]->getType())
        GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
           ETy->getDescription() +"' as required!\nIt is of type '"+
           (*(yyvsp[(3) - (4)].ConstVector))[i]->getType()->getDescription() + "'.");
    }

    (yyval.ConstVal) = ConstantVector::get(PTy, *(yyvsp[(3) - (4)].ConstVector));
    delete (yyvsp[(1) - (4)].TypeVal); delete (yyvsp[(3) - (4)].ConstVector);
    CHECK_FOR_ERROR
  ;}
    break;

  case 174:
#line 1629 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (4)].TypeVal)->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (*(yyvsp[(1) - (4)].TypeVal))->getDescription() + "'");

    if ((yyvsp[(3) - (4)].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[(3) - (4)].ConstVector)->size(); i != e; ++i)
      if ((*(yyvsp[(3) - (4)].ConstVector))[i]->getType() != STy->getElementType(i))
        GEN_ERROR("Expected type '" +
                       STy->getElementType(i)->getDescription() +
                       "' for element #" + utostr(i) +
                       " of structure initializer");

    // Check to ensure that Type is not packed
    if (STy->isPacked())
      GEN_ERROR("Unpacked Initializer to vector type '" +
                STy->getDescription() + "'");

    (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[(3) - (4)].ConstVector));
    delete (yyvsp[(1) - (4)].TypeVal); delete (yyvsp[(3) - (4)].ConstVector);
    CHECK_FOR_ERROR
  ;}
    break;

  case 175:
#line 1655 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (3)].TypeVal))->getDescription());
    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (3)].TypeVal)->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (*(yyvsp[(1) - (3)].TypeVal))->getDescription() + "'");

    if (STy->getNumContainedTypes() != 0)
      GEN_ERROR("Illegal number of initializers for structure type");

    // Check to ensure that Type is not packed
    if (STy->isPacked())
      GEN_ERROR("Unpacked Initializer to vector type '" +
                STy->getDescription() + "'");

    (yyval.ConstVal) = ConstantStruct::get(STy, std::vector<Constant*>());
    delete (yyvsp[(1) - (3)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 176:
#line 1675 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (6)].TypeVal)->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (*(yyvsp[(1) - (6)].TypeVal))->getDescription() + "'");

    if ((yyvsp[(4) - (6)].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[(4) - (6)].ConstVector)->size(); i != e; ++i)
      if ((*(yyvsp[(4) - (6)].ConstVector))[i]->getType() != STy->getElementType(i))
        GEN_ERROR("Expected type '" +
                       STy->getElementType(i)->getDescription() +
                       "' for element #" + utostr(i) +
                       " of structure initializer");

    // Check to ensure that Type is packed
    if (!STy->isPacked())
      GEN_ERROR("Vector initializer to non-vector type '" + 
                STy->getDescription() + "'");

    (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[(4) - (6)].ConstVector));
    delete (yyvsp[(1) - (6)].TypeVal); delete (yyvsp[(4) - (6)].ConstVector);
    CHECK_FOR_ERROR
  ;}
    break;

  case 177:
#line 1701 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (5)].TypeVal))->getDescription());
    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (5)].TypeVal)->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (*(yyvsp[(1) - (5)].TypeVal))->getDescription() + "'");

    if (STy->getNumContainedTypes() != 0)
      GEN_ERROR("Illegal number of initializers for structure type");

    // Check to ensure that Type is packed
    if (!STy->isPacked())
      GEN_ERROR("Vector initializer to non-vector type '" + 
                STy->getDescription() + "'");

    (yyval.ConstVal) = ConstantStruct::get(STy, std::vector<Constant*>());
    delete (yyvsp[(1) - (5)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 178:
#line 1721 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (2)].TypeVal))->getDescription());
    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[(1) - (2)].TypeVal)->get());
    if (PTy == 0)
      GEN_ERROR("Cannot make null pointer constant with type: '" + 
                     (*(yyvsp[(1) - (2)].TypeVal))->getDescription() + "'");

    (yyval.ConstVal) = ConstantPointerNull::get(PTy);
    delete (yyvsp[(1) - (2)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 179:
#line 1733 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (2)].TypeVal))->getDescription());
    (yyval.ConstVal) = UndefValue::get((yyvsp[(1) - (2)].TypeVal)->get());
    delete (yyvsp[(1) - (2)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 180:
#line 1740 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (2)].TypeVal))->getDescription());
    const PointerType *Ty = dyn_cast<PointerType>((yyvsp[(1) - (2)].TypeVal)->get());
    if (Ty == 0)
      GEN_ERROR("Global const reference must be a pointer type " + (*(yyvsp[(1) - (2)].TypeVal))->getDescription());

    // ConstExprs can exist in the body of a function, thus creating
    // GlobalValues whenever they refer to a variable.  Because we are in
    // the context of a function, getExistingVal will search the functions
    // symbol table instead of the module symbol table for the global symbol,
    // which throws things all off.  To get around this, we just tell
    // getExistingVal that we are at global scope here.
    //
    Function *SavedCurFn = CurFun.CurrentFunction;
    CurFun.CurrentFunction = 0;

    Value *V = getExistingVal(Ty, (yyvsp[(2) - (2)].ValIDVal));
    CHECK_FOR_ERROR

    CurFun.CurrentFunction = SavedCurFn;

    // If this is an initializer for a constant pointer, which is referencing a
    // (currently) undefined variable, create a stub now that shall be replaced
    // in the future with the right type of variable.
    //
    if (V == 0) {
      assert(isa<PointerType>(Ty) && "Globals may only be used as pointers!");
      const PointerType *PT = cast<PointerType>(Ty);

      // First check to see if the forward references value is already created!
      PerModuleInfo::GlobalRefsType::iterator I =
        CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[(2) - (2)].ValIDVal)));
    
      if (I != CurModule.GlobalRefs.end()) {
        V = I->second;             // Placeholder already exists, use it...
        (yyvsp[(2) - (2)].ValIDVal).destroy();
      } else {
        std::string Name;
        if ((yyvsp[(2) - (2)].ValIDVal).Type == ValID::GlobalName)
          Name = (yyvsp[(2) - (2)].ValIDVal).getName();
        else if ((yyvsp[(2) - (2)].ValIDVal).Type != ValID::GlobalID)
          GEN_ERROR("Invalid reference to global");

        // Create the forward referenced global.
        GlobalValue *GV;
        if (const FunctionType *FTy = 
                 dyn_cast<FunctionType>(PT->getElementType())) {
          GV = Function::Create(FTy, GlobalValue::ExternalWeakLinkage, Name,
                                CurModule.CurrentModule);
        } else {
          GV = new GlobalVariable(PT->getElementType(), false,
                                  GlobalValue::ExternalWeakLinkage, 0,
                                  Name, CurModule.CurrentModule);
        }

        // Keep track of the fact that we have a forward ref to recycle it
        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[(2) - (2)].ValIDVal)), GV));
        V = GV;
      }
    }

    (yyval.ConstVal) = cast<GlobalValue>(V);
    delete (yyvsp[(1) - (2)].TypeVal);            // Free the type handle
    CHECK_FOR_ERROR
  ;}
    break;

  case 181:
#line 1806 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (2)].TypeVal))->getDescription());
    if ((yyvsp[(1) - (2)].TypeVal)->get() != (yyvsp[(2) - (2)].ConstVal)->getType())
      GEN_ERROR("Mismatched types for constant expression: " + 
        (*(yyvsp[(1) - (2)].TypeVal))->getDescription() + " and " + (yyvsp[(2) - (2)].ConstVal)->getType()->getDescription());
    (yyval.ConstVal) = (yyvsp[(2) - (2)].ConstVal);
    delete (yyvsp[(1) - (2)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 182:
#line 1816 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (2)].TypeVal))->getDescription());
    const Type *Ty = (yyvsp[(1) - (2)].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) - (2)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 183:
#line 1826 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {      // integral constants
    if (!ConstantInt::isValueValidForType((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].SInt64Val)))
      GEN_ERROR("Constant value doesn't fit in type");
    (yyval.ConstVal) = ConstantInt::get((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].SInt64Val), true);
    CHECK_FOR_ERROR
  ;}
    break;

  case 184:
#line 1832 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {      // arbitrary precision integer constants
    uint32_t BitWidth = cast<IntegerType>((yyvsp[(1) - (2)].PrimType))->getBitWidth();
    if ((yyvsp[(2) - (2)].APIntVal)->getBitWidth() > BitWidth) {
      GEN_ERROR("Constant value does not fit in type");
    }
    (yyvsp[(2) - (2)].APIntVal)->sextOrTrunc(BitWidth);
    (yyval.ConstVal) = ConstantInt::get(*(yyvsp[(2) - (2)].APIntVal));
    delete (yyvsp[(2) - (2)].APIntVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 185:
#line 1842 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {      // integral constants
    if (!ConstantInt::isValueValidForType((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].UInt64Val)))
      GEN_ERROR("Constant value doesn't fit in type");
    (yyval.ConstVal) = ConstantInt::get((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].UInt64Val), false);
    CHECK_FOR_ERROR
  ;}
    break;

  case 186:
#line 1848 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {      // arbitrary precision integer constants
    uint32_t BitWidth = cast<IntegerType>((yyvsp[(1) - (2)].PrimType))->getBitWidth();
    if ((yyvsp[(2) - (2)].APIntVal)->getBitWidth() > BitWidth) {
      GEN_ERROR("Constant value does not fit in type");
    } 
    (yyvsp[(2) - (2)].APIntVal)->zextOrTrunc(BitWidth);
    (yyval.ConstVal) = ConstantInt::get(*(yyvsp[(2) - (2)].APIntVal));
    delete (yyvsp[(2) - (2)].APIntVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 187:
#line 1858 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                      // Boolean constants
    if (cast<IntegerType>((yyvsp[(1) - (2)].PrimType))->getBitWidth() != 1)
      GEN_ERROR("Constant true must have type i1");
    (yyval.ConstVal) = ConstantInt::getTrue();
    CHECK_FOR_ERROR
  ;}
    break;

  case 188:
#line 1864 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                     // Boolean constants
    if (cast<IntegerType>((yyvsp[(1) - (2)].PrimType))->getBitWidth() != 1)
      GEN_ERROR("Constant false must have type i1");
    (yyval.ConstVal) = ConstantInt::getFalse();
    CHECK_FOR_ERROR
  ;}
    break;

  case 189:
#line 1870 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                   // Floating point constants
    if (!ConstantFP::isValueValidForType((yyvsp[(1) - (2)].PrimType), *(yyvsp[(2) - (2)].FPVal)))
      GEN_ERROR("Floating point constant invalid for type");
    // Lexer has no type info, so builds all float and double FP constants 
    // as double.  Fix this here.  Long double is done right.
    if (&(yyvsp[(2) - (2)].FPVal)->getSemantics()==&APFloat::IEEEdouble && (yyvsp[(1) - (2)].PrimType)==Type::FloatTy)
      (yyvsp[(2) - (2)].FPVal)->convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven);
    (yyval.ConstVal) = ConstantFP::get(*(yyvsp[(2) - (2)].FPVal));
    delete (yyvsp[(2) - (2)].FPVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 190:
#line 1883 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(5) - (6)].TypeVal))->getDescription());
    Constant *Val = (yyvsp[(3) - (6)].ConstVal);
    const Type *DestTy = (yyvsp[(5) - (6)].TypeVal)->get();
    if (!CastInst::castIsValid((yyvsp[(1) - (6)].CastOpVal), (yyvsp[(3) - (6)].ConstVal), DestTy))
      GEN_ERROR("invalid cast opcode for cast from '" +
                Val->getType()->getDescription() + "' to '" +
                DestTy->getDescription() + "'"); 
    (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[(1) - (6)].CastOpVal), (yyvsp[(3) - (6)].ConstVal), DestTy);
    delete (yyvsp[(5) - (6)].TypeVal);
  ;}
    break;

  case 191:
#line 1895 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!isa<PointerType>((yyvsp[(3) - (5)].ConstVal)->getType()))
      GEN_ERROR("GetElementPtr requires a pointer operand");

    const Type *IdxTy =
      GetElementPtrInst::getIndexedType((yyvsp[(3) - (5)].ConstVal)->getType(), (yyvsp[(4) - (5)].ValueList)->begin(), (yyvsp[(4) - (5)].ValueList)->end());
    if (!IdxTy)
      GEN_ERROR("Index list invalid for constant getelementptr");

    SmallVector<Constant*, 8> IdxVec;
    for (unsigned i = 0, e = (yyvsp[(4) - (5)].ValueList)->size(); i != e; ++i)
      if (Constant *C = dyn_cast<Constant>((*(yyvsp[(4) - (5)].ValueList))[i]))
        IdxVec.push_back(C);
      else
        GEN_ERROR("Indices to constant getelementptr must be constants");

    delete (yyvsp[(4) - (5)].ValueList);

    (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[(3) - (5)].ConstVal), &IdxVec[0], IdxVec.size());
    CHECK_FOR_ERROR
  ;}
    break;

  case 192:
#line 1916 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(3) - (8)].ConstVal)->getType() != Type::Int1Ty)
      GEN_ERROR("Select condition must be of boolean type");
    if ((yyvsp[(5) - (8)].ConstVal)->getType() != (yyvsp[(7) - (8)].ConstVal)->getType())
      GEN_ERROR("Select operand types must match");
    (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 193:
#line 1924 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(3) - (6)].ConstVal)->getType() != (yyvsp[(5) - (6)].ConstVal)->getType())
      GEN_ERROR("Binary operator types must match");
    CHECK_FOR_ERROR;
    (yyval.ConstVal) = ConstantExpr::get((yyvsp[(1) - (6)].BinaryOpVal), (yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal));
  ;}
    break;

  case 194:
#line 1930 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(3) - (6)].ConstVal)->getType() != (yyvsp[(5) - (6)].ConstVal)->getType())
      GEN_ERROR("Logical operator types must match");
    if (!(yyvsp[(3) - (6)].ConstVal)->getType()->isInteger()) {
      if (Instruction::isShift((yyvsp[(1) - (6)].BinaryOpVal)) || !isa<VectorType>((yyvsp[(3) - (6)].ConstVal)->getType()) || 
          !cast<VectorType>((yyvsp[(3) - (6)].ConstVal)->getType())->getElementType()->isInteger())
        GEN_ERROR("Logical operator requires integral operands");
    }
    (yyval.ConstVal) = ConstantExpr::get((yyvsp[(1) - (6)].BinaryOpVal), (yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 195:
#line 1941 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(4) - (7)].ConstVal)->getType() != (yyvsp[(6) - (7)].ConstVal)->getType())
      GEN_ERROR("icmp operand types must match");
    (yyval.ConstVal) = ConstantExpr::getICmp((yyvsp[(2) - (7)].IPredicate), (yyvsp[(4) - (7)].ConstVal), (yyvsp[(6) - (7)].ConstVal));
  ;}
    break;

  case 196:
#line 1946 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(4) - (7)].ConstVal)->getType() != (yyvsp[(6) - (7)].ConstVal)->getType())
      GEN_ERROR("fcmp operand types must match");
    (yyval.ConstVal) = ConstantExpr::getFCmp((yyvsp[(2) - (7)].FPredicate), (yyvsp[(4) - (7)].ConstVal), (yyvsp[(6) - (7)].ConstVal));
  ;}
    break;

  case 197:
#line 1951 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(4) - (7)].ConstVal)->getType() != (yyvsp[(6) - (7)].ConstVal)->getType())
      GEN_ERROR("vicmp operand types must match");
    (yyval.ConstVal) = ConstantExpr::getVICmp((yyvsp[(2) - (7)].IPredicate), (yyvsp[(4) - (7)].ConstVal), (yyvsp[(6) - (7)].ConstVal));
  ;}
    break;

  case 198:
#line 1956 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(4) - (7)].ConstVal)->getType() != (yyvsp[(6) - (7)].ConstVal)->getType())
      GEN_ERROR("vfcmp operand types must match");
    (yyval.ConstVal) = ConstantExpr::getVFCmp((yyvsp[(2) - (7)].FPredicate), (yyvsp[(4) - (7)].ConstVal), (yyvsp[(6) - (7)].ConstVal));
  ;}
    break;

  case 199:
#line 1961 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!ExtractElementInst::isValidOperands((yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal)))
      GEN_ERROR("Invalid extractelement operands");
    (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 200:
#line 1967 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!InsertElementInst::isValidOperands((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal)))
      GEN_ERROR("Invalid insertelement operands");
    (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 201:
#line 1973 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!ShuffleVectorInst::isValidOperands((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal)))
      GEN_ERROR("Invalid shufflevector operands");
    (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 202:
#line 1979 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!isa<StructType>((yyvsp[(3) - (5)].ConstVal)->getType()) && !isa<ArrayType>((yyvsp[(3) - (5)].ConstVal)->getType()))
      GEN_ERROR("ExtractValue requires an aggregate operand");

    (yyval.ConstVal) = ConstantExpr::getExtractValue((yyvsp[(3) - (5)].ConstVal), &(*(yyvsp[(4) - (5)].ConstantList))[0], (yyvsp[(4) - (5)].ConstantList)->size());
    delete (yyvsp[(4) - (5)].ConstantList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 203:
#line 1987 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!isa<StructType>((yyvsp[(3) - (7)].ConstVal)->getType()) && !isa<ArrayType>((yyvsp[(3) - (7)].ConstVal)->getType()))
      GEN_ERROR("InsertValue requires an aggregate operand");

    (yyval.ConstVal) = ConstantExpr::getInsertValue((yyvsp[(3) - (7)].ConstVal), (yyvsp[(5) - (7)].ConstVal), &(*(yyvsp[(6) - (7)].ConstantList))[0], (yyvsp[(6) - (7)].ConstantList)->size());
    delete (yyvsp[(6) - (7)].ConstantList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 204:
#line 1998 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.ConstVector) = (yyvsp[(1) - (3)].ConstVector))->push_back((yyvsp[(3) - (3)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 205:
#line 2002 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ConstVector) = new std::vector<Constant*>();
    (yyval.ConstVector)->push_back((yyvsp[(1) - (1)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 206:
#line 2010 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = false; ;}
    break;

  case 207:
#line 2010 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = true; ;}
    break;

  case 208:
#line 2013 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = true; ;}
    break;

  case 209:
#line 2013 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = false; ;}
    break;

  case 210:
#line 2016 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    const Type* VTy = (yyvsp[(1) - (2)].TypeVal)->get();
    Value *V = getVal(VTy, (yyvsp[(2) - (2)].ValIDVal));
    CHECK_FOR_ERROR
    GlobalValue* Aliasee = dyn_cast<GlobalValue>(V);
    if (!Aliasee)
      GEN_ERROR("Aliases can be created only to global values");

    (yyval.ConstVal) = Aliasee;
    CHECK_FOR_ERROR
    delete (yyvsp[(1) - (2)].TypeVal);
   ;}
    break;

  case 211:
#line 2028 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    Constant *Val = (yyvsp[(3) - (6)].ConstVal);
    const Type *DestTy = (yyvsp[(5) - (6)].TypeVal)->get();
    if (!CastInst::castIsValid((yyvsp[(1) - (6)].CastOpVal), (yyvsp[(3) - (6)].ConstVal), DestTy))
      GEN_ERROR("invalid cast opcode for cast from '" +
                Val->getType()->getDescription() + "' to '" +
                DestTy->getDescription() + "'");
    
    (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[(1) - (6)].CastOpVal), (yyvsp[(3) - (6)].ConstVal), DestTy);
    CHECK_FOR_ERROR
    delete (yyvsp[(5) - (6)].TypeVal);
   ;}
    break;

  case 212:
#line 2049 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule;
    CurModule.ModuleDone();
    CHECK_FOR_ERROR;
  ;}
    break;

  case 213:
#line 2054 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule;
    CurModule.ModuleDone();
    CHECK_FOR_ERROR;
  ;}
    break;

  case 216:
#line 2067 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { CurFun.isDeclare = false; ;}
    break;

  case 217:
#line 2067 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CurFun.FunctionDone();
    CHECK_FOR_ERROR
  ;}
    break;

  case 218:
#line 2071 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { CurFun.isDeclare = true; ;}
    break;

  case 219:
#line 2071 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CHECK_FOR_ERROR
  ;}
    break;

  case 220:
#line 2074 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CHECK_FOR_ERROR
  ;}
    break;

  case 221:
#line 2077 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (3)].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:
    //
    // %list = type { %list * }
    // %list = type { %list * }    ; repeated type decl
    //
    // If types are not resolved eagerly, then the two types will not be
    // determined to be the same type!
    //
    ResolveTypeTo((yyvsp[(1) - (3)].StrVal), *(yyvsp[(3) - (3)].TypeVal));

    if (!setTypeName(*(yyvsp[(3) - (3)].TypeVal), (yyvsp[(1) - (3)].StrVal)) && !(yyvsp[(1) - (3)].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[(3) - (3)].TypeVal));
    }

    delete (yyvsp[(3) - (3)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 222:
#line 2101 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    ResolveTypeTo((yyvsp[(1) - (3)].StrVal), (yyvsp[(3) - (3)].PrimType));

    if (!setTypeName((yyvsp[(3) - (3)].PrimType), (yyvsp[(1) - (3)].StrVal)) && !(yyvsp[(1) - (3)].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[(3) - (3)].PrimType));
    }
    CHECK_FOR_ERROR
  ;}
    break;

  case 223:
#line 2113 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { 
    /* "Externally Visible" Linkage */
    if ((yyvsp[(5) - (6)].ConstVal) == 0) 
      GEN_ERROR("Global value initializer is not a constant");
    CurGV = ParseGlobalVariable((yyvsp[(1) - (6)].StrVal), GlobalValue::ExternalLinkage,
                                (yyvsp[(2) - (6)].Visibility), (yyvsp[(4) - (6)].BoolVal), (yyvsp[(5) - (6)].ConstVal)->getType(), (yyvsp[(5) - (6)].ConstVal), (yyvsp[(3) - (6)].BoolVal), (yyvsp[(6) - (6)].UIntVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 224:
#line 2120 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
  ;}
    break;

  case 225:
#line 2124 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(6) - (7)].ConstVal) == 0) 
      GEN_ERROR("Global value initializer is not a constant");
    CurGV = ParseGlobalVariable((yyvsp[(1) - (7)].StrVal), (yyvsp[(2) - (7)].Linkage), (yyvsp[(3) - (7)].Visibility), (yyvsp[(5) - (7)].BoolVal), (yyvsp[(6) - (7)].ConstVal)->getType(), (yyvsp[(6) - (7)].ConstVal), (yyvsp[(4) - (7)].BoolVal), (yyvsp[(7) - (7)].UIntVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 226:
#line 2129 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
  ;}
    break;

  case 227:
#line 2133 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(6) - (7)].TypeVal))->getDescription());
    CurGV = ParseGlobalVariable((yyvsp[(1) - (7)].StrVal), (yyvsp[(2) - (7)].Linkage), (yyvsp[(3) - (7)].Visibility), (yyvsp[(5) - (7)].BoolVal), *(yyvsp[(6) - (7)].TypeVal), 0, (yyvsp[(4) - (7)].BoolVal), (yyvsp[(7) - (7)].UIntVal));
    CHECK_FOR_ERROR
    delete (yyvsp[(6) - (7)].TypeVal);
  ;}
    break;

  case 228:
#line 2139 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 229:
#line 2143 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    std::string Name;
    if ((yyvsp[(1) - (5)].StrVal)) {
      Name = *(yyvsp[(1) - (5)].StrVal);
      delete (yyvsp[(1) - (5)].StrVal);
    }
    if (Name.empty())
      GEN_ERROR("Alias name cannot be empty");
    
    Constant* Aliasee = (yyvsp[(5) - (5)].ConstVal);
    if (Aliasee == 0)
      GEN_ERROR(std::string("Invalid aliasee for alias: ") + Name);

    GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), (yyvsp[(4) - (5)].Linkage), Name, Aliasee,
                                      CurModule.CurrentModule);
    GA->setVisibility((yyvsp[(2) - (5)].Visibility));
    InsertValue(GA, CurModule.Values);
    
    
    // If there was a forward reference of this alias, resolve it now.
    
    ValID ID;
    if (!Name.empty())
      ID = ValID::createGlobalName(Name);
    else
      ID = ValID::createGlobalID(CurModule.Values.size()-1);
    
    if (GlobalValue *FWGV =
          CurModule.GetForwardRefForGlobal(GA->getType(), ID)) {
      // Replace uses of the fwdref with the actual alias.
      FWGV->replaceAllUsesWith(GA);
      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(FWGV))
        GV->eraseFromParent();
      else
        cast<Function>(FWGV)->eraseFromParent();
    }
    ID.destroy();
    
    CHECK_FOR_ERROR
  ;}
    break;

  case 230:
#line 2183 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { 
    CHECK_FOR_ERROR
  ;}
    break;

  case 231:
#line 2186 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CHECK_FOR_ERROR
  ;}
    break;

  case 232:
#line 2192 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
  const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
  if (AsmSoFar.empty())
    CurModule.CurrentModule->setModuleInlineAsm(*(yyvsp[(1) - (1)].StrVal));
  else
    CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+*(yyvsp[(1) - (1)].StrVal));
  delete (yyvsp[(1) - (1)].StrVal);
  CHECK_FOR_ERROR
;}
    break;

  case 233:
#line 2202 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CurModule.CurrentModule->setTargetTriple(*(yyvsp[(3) - (3)].StrVal));
    delete (yyvsp[(3) - (3)].StrVal);
  ;}
    break;

  case 234:
#line 2206 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CurModule.CurrentModule->setDataLayout(*(yyvsp[(3) - (3)].StrVal));
    delete (yyvsp[(3) - (3)].StrVal);
  ;}
    break;

  case 236:
#line 2213 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
          CurModule.CurrentModule->addLibrary(*(yyvsp[(3) - (3)].StrVal));
          delete (yyvsp[(3) - (3)].StrVal);
          CHECK_FOR_ERROR
        ;}
    break;

  case 237:
#line 2218 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
          CurModule.CurrentModule->addLibrary(*(yyvsp[(1) - (1)].StrVal));
          delete (yyvsp[(1) - (1)].StrVal);
          CHECK_FOR_ERROR
        ;}
    break;

  case 238:
#line 2223 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
          CHECK_FOR_ERROR
        ;}
    break;

  case 239:
#line 2232 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (5)].TypeVal))->getDescription());
    if (!(*(yyvsp[(3) - (5)].TypeVal))->isFirstClassType())
      GEN_ERROR("Argument types must be first-class");
    ArgListEntry E; E.Attrs = (yyvsp[(4) - (5)].ParamAttrs); E.Ty = (yyvsp[(3) - (5)].TypeVal); E.Name = (yyvsp[(5) - (5)].StrVal);
    (yyval.ArgList) = (yyvsp[(1) - (5)].ArgList);
    (yyvsp[(1) - (5)].ArgList)->push_back(E);
    CHECK_FOR_ERROR
  ;}
    break;

  case 240:
#line 2242 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (3)].TypeVal))->getDescription());
    if (!(*(yyvsp[(1) - (3)].TypeVal))->isFirstClassType())
      GEN_ERROR("Argument types must be first-class");
    ArgListEntry E; E.Attrs = (yyvsp[(2) - (3)].ParamAttrs); E.Ty = (yyvsp[(1) - (3)].TypeVal); E.Name = (yyvsp[(3) - (3)].StrVal);
    (yyval.ArgList) = new ArgListType;
    (yyval.ArgList)->push_back(E);
    CHECK_FOR_ERROR
  ;}
    break;

  case 241:
#line 2253 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = (yyvsp[(1) - (1)].ArgList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 242:
#line 2257 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = (yyvsp[(1) - (3)].ArgList);
    struct ArgListEntry E;
    E.Ty = new PATypeHolder(Type::VoidTy);
    E.Name = 0;
    E.Attrs = ParamAttr::None;
    (yyval.ArgList)->push_back(E);
    CHECK_FOR_ERROR
  ;}
    break;

  case 243:
#line 2266 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (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);
    CHECK_FOR_ERROR
  ;}
    break;

  case 244:
#line 2275 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 245:
#line 2281 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
  std::string FunctionName(*(yyvsp[(3) - (10)].StrVal));
  delete (yyvsp[(3) - (10)].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[(2) - (10)].TypeVal)))
    GEN_ERROR("Reference to abstract result: "+ (yyvsp[(2) - (10)].TypeVal)->get()->getDescription());

  if (!FunctionType::isValidReturnType(*(yyvsp[(2) - (10)].TypeVal)))
    GEN_ERROR("Invalid result type for LLVM function");
    
  std::vector<const Type*> ParamTypeList;
  SmallVector<ParamAttrsWithIndex, 8> Attrs;
  if ((yyvsp[(7) - (10)].ParamAttrs) != ParamAttr::None)
    Attrs.push_back(ParamAttrsWithIndex::get(0, (yyvsp[(7) - (10)].ParamAttrs)));
  if ((yyvsp[(5) - (10)].ArgList)) {   // If there are arguments...
    unsigned index = 1;
    for (ArgListType::iterator I = (yyvsp[(5) - (10)].ArgList)->begin(); I != (yyvsp[(5) - (10)].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());
      ParamTypeList.push_back(Ty);
      if (Ty != Type::VoidTy && I->Attrs != ParamAttr::None)
        Attrs.push_back(ParamAttrsWithIndex::get(index, I->Attrs));
    }
  }

  bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
  if (isVarArg) ParamTypeList.pop_back();

  PAListPtr PAL;
  if (!Attrs.empty())
    PAL = PAListPtr::get(Attrs.begin(), Attrs.end());

  FunctionType *FT = FunctionType::get(*(yyvsp[(2) - (10)].TypeVal), ParamTypeList, isVarArg);
  const PointerType *PFT = PointerType::getUnqual(FT);
  delete (yyvsp[(2) - (10)].TypeVal);

  ValID ID;
  if (!FunctionName.empty()) {
    ID = ValID::createGlobalName((char*)FunctionName.c_str());
  } else {
    ID = ValID::createGlobalID(CurModule.Values.size());
  }

  Function *Fn = 0;
  // See if this function was forward referenced.  If so, recycle the object.
  if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
    // Move the function to the end of the list, from whereever it was 
    // previously inserted.
    Fn = cast<Function>(FWRef);
    assert(Fn->getParamAttrs().isEmpty() &&
           "Forward reference has parameter attributes!");
    CurModule.CurrentModule->getFunctionList().remove(Fn);
    CurModule.CurrentModule->getFunctionList().push_back(Fn);
  } else if (!FunctionName.empty() &&     // Merge with an earlier prototype?
             (Fn = CurModule.CurrentModule->getFunction(FunctionName))) {
    if (Fn->getFunctionType() != FT ) {
      // The existing function doesn't have the same type. This is an overload
      // error.
      GEN_ERROR("Overload of function '" + FunctionName + "' not permitted.");
    } else if (Fn->getParamAttrs() != PAL) {
      // The existing function doesn't have the same parameter attributes.
      // This is an overload error.
      GEN_ERROR("Overload of function '" + FunctionName + "' not permitted.");
    } else if (!CurFun.isDeclare && !Fn->isDeclaration()) {
      // Neither the existing or the current function is a declaration and they
      // have the same name and same type. Clearly this is a redefinition.
      GEN_ERROR("Redefinition of function '" + FunctionName + "'");
    } else if (Fn->isDeclaration()) {
      // Make sure to strip off any argument names so we can't get conflicts.
      for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
           AI != AE; ++AI)
        AI->setName("");
    }
  } else  {  // Not already defined?
    Fn = Function::Create(FT, GlobalValue::ExternalWeakLinkage, FunctionName,
                          CurModule.CurrentModule);
    InsertValue(Fn, CurModule.Values);
  }

  CurFun.FunctionStart(Fn);

  if (CurFun.isDeclare) {
    // If we have declaration, always overwrite linkage.  This will allow us to
    // correctly handle cases, when pointer to function is passed as argument to
    // another function.
    Fn->setLinkage(CurFun.Linkage);
    Fn->setVisibility(CurFun.Visibility);
  }
  Fn->setCallingConv((yyvsp[(1) - (10)].UIntVal));
  Fn->setParamAttrs(PAL);
  Fn->setAlignment((yyvsp[(9) - (10)].UIntVal));
  if ((yyvsp[(8) - (10)].StrVal)) {
    Fn->setSection(*(yyvsp[(8) - (10)].StrVal));
    delete (yyvsp[(8) - (10)].StrVal);
  }
  if ((yyvsp[(10) - (10)].StrVal)) {
    Fn->setCollector((yyvsp[(10) - (10)].StrVal)->c_str());
    delete (yyvsp[(10) - (10)].StrVal);
  }

  // Add all of the arguments we parsed to the function...
  if ((yyvsp[(5) - (10)].ArgList)) {                     // Is null if empty...
    if (isVarArg) {  // Nuke the last entry
      assert((yyvsp[(5) - (10)].ArgList)->back().Ty->get() == Type::VoidTy && (yyvsp[(5) - (10)].ArgList)->back().Name == 0 &&
             "Not a varargs marker!");
      delete (yyvsp[(5) - (10)].ArgList)->back().Ty;
      (yyvsp[(5) - (10)].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[(5) - (10)].ArgList)->begin(); 
         I != (yyvsp[(5) - (10)].ArgList)->end() && ArgIt != ArgEnd; ++I, ++ArgIt) {
      delete I->Ty;                          // Delete the typeholder...
      setValueName(ArgIt, I->Name);       // Insert arg into symtab...
      CHECK_FOR_ERROR
      InsertValue(ArgIt);
      Idx++;
    }

    delete (yyvsp[(5) - (10)].ArgList);                     // We're now done with the argument list
  }
  CHECK_FOR_ERROR
;}
    break;

  case 248:
#line 2411 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.FunctionVal) = CurFun.CurrentFunction;

  // Make sure that we keep track of the linkage type even if there was a
  // previous "declare".
  (yyval.FunctionVal)->setLinkage((yyvsp[(1) - (4)].Linkage));
  (yyval.FunctionVal)->setVisibility((yyvsp[(2) - (4)].Visibility));
;}
    break;

  case 251:
#line 2422 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
  CHECK_FOR_ERROR
;}
    break;

  case 252:
#line 2427 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    CurFun.CurrentFunction->setLinkage((yyvsp[(1) - (3)].Linkage));
    CurFun.CurrentFunction->setVisibility((yyvsp[(2) - (3)].Visibility));
    (yyval.FunctionVal) = CurFun.CurrentFunction;
    CurFun.FunctionDone();
    CHECK_FOR_ERROR
  ;}
    break;

  case 253:
#line 2439 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 254:
#line 2443 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 255:
#line 2448 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {    // A reference to a direct constant
    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].SInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 256:
#line 2452 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].UInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 257:
#line 2456 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                     // Perhaps it's an FP constant?
    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].FPVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 258:
#line 2460 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create(ConstantInt::getTrue());
    CHECK_FOR_ERROR
  ;}
    break;

  case 259:
#line 2464 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create(ConstantInt::getFalse());
    CHECK_FOR_ERROR
  ;}
    break;

  case 260:
#line 2468 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createNull();
    CHECK_FOR_ERROR
  ;}
    break;

  case 261:
#line 2472 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createUndef();
    CHECK_FOR_ERROR
  ;}
    break;

  case 262:
#line 2476 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {     // A vector zero constant.
    (yyval.ValIDVal) = ValID::createZeroInit();
    CHECK_FOR_ERROR
  ;}
    break;

  case 263:
#line 2480 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { // Nonempty unsized packed vector
    const Type *ETy = (*(yyvsp[(2) - (3)].ConstVector))[0]->getType();
    unsigned NumElements = (yyvsp[(2) - (3)].ConstVector)->size(); 

    if (!ETy->isInteger() && !ETy->isFloatingPoint())
      GEN_ERROR("Invalid vector element type: " + ETy->getDescription());
    
    VectorType* pt = VectorType::get(ETy, NumElements);
    PATypeHolder* PTy = new PATypeHolder(HandleUpRefs(pt));
    
    // Verify all elements are correct type!
    for (unsigned i = 0; i < (yyvsp[(2) - (3)].ConstVector)->size(); i++) {
      if (ETy != (*(yyvsp[(2) - (3)].ConstVector))[i]->getType())
        GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
                     ETy->getDescription() +"' as required!\nIt is of type '" +
                     (*(yyvsp[(2) - (3)].ConstVector))[i]->getType()->getDescription() + "'.");
    }

    (yyval.ValIDVal) = ValID::create(ConstantVector::get(pt, *(yyvsp[(2) - (3)].ConstVector)));
    delete PTy; delete (yyvsp[(2) - (3)].ConstVector);
    CHECK_FOR_ERROR
  ;}
    break;

  case 264:
#line 2502 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { // Nonempty unsized arr
    const Type *ETy = (*(yyvsp[(2) - (3)].ConstVector))[0]->getType();
    uint64_t NumElements = (yyvsp[(2) - (3)].ConstVector)->size(); 

    if (!ETy->isFirstClassType())
      GEN_ERROR("Invalid array element type: " + ETy->getDescription());

    ArrayType *ATy = ArrayType::get(ETy, NumElements);
    PATypeHolder* PTy = new PATypeHolder(HandleUpRefs(ATy));

    // Verify all elements are correct type!
    for (unsigned i = 0; i < (yyvsp[(2) - (3)].ConstVector)->size(); i++) {
      if (ETy != (*(yyvsp[(2) - (3)].ConstVector))[i]->getType())
        GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
                       ETy->getDescription() +"' as required!\nIt is of type '"+
                       (*(yyvsp[(2) - (3)].ConstVector))[i]->getType()->getDescription() + "'.");
    }

    (yyval.ValIDVal) = ValID::create(ConstantArray::get(ATy, *(yyvsp[(2) - (3)].ConstVector)));
    delete PTy; delete (yyvsp[(2) - (3)].ConstVector);
    CHECK_FOR_ERROR
  ;}
    break;

  case 265:
#line 2524 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // Use undef instead of an array because it's inconvenient to determine
    // the element type at this point, there being no elements to examine.
    (yyval.ValIDVal) = ValID::createUndef();
    CHECK_FOR_ERROR
  ;}
    break;

  case 266:
#line 2530 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    uint64_t NumElements = (yyvsp[(2) - (2)].StrVal)->length();
    const Type *ETy = Type::Int8Ty;

    ArrayType *ATy = ArrayType::get(ETy, NumElements);

    std::vector<Constant*> Vals;
    for (unsigned i = 0; i < (yyvsp[(2) - (2)].StrVal)->length(); ++i)
      Vals.push_back(ConstantInt::get(ETy, (*(yyvsp[(2) - (2)].StrVal))[i]));
    delete (yyvsp[(2) - (2)].StrVal);
    (yyval.ValIDVal) = ValID::create(ConstantArray::get(ATy, Vals));
    CHECK_FOR_ERROR
  ;}
    break;

  case 267:
#line 2543 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    std::vector<const Type*> Elements((yyvsp[(2) - (3)].ConstVector)->size());
    for (unsigned i = 0, e = (yyvsp[(2) - (3)].ConstVector)->size(); i != e; ++i)
      Elements[i] = (*(yyvsp[(2) - (3)].ConstVector))[i]->getType();

    const StructType *STy = StructType::get(Elements);
    PATypeHolder* PTy = new PATypeHolder(HandleUpRefs(STy));

    (yyval.ValIDVal) = ValID::create(ConstantStruct::get(STy, *(yyvsp[(2) - (3)].ConstVector)));
    delete PTy; delete (yyvsp[(2) - (3)].ConstVector);
    CHECK_FOR_ERROR
  ;}
    break;

  case 268:
#line 2555 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    const StructType *STy = StructType::get(std::vector<const Type*>());
    (yyval.ValIDVal) = ValID::create(ConstantStruct::get(STy, std::vector<Constant*>()));
    CHECK_FOR_ERROR
  ;}
    break;

  case 269:
#line 2560 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    std::vector<const Type*> Elements((yyvsp[(3) - (5)].ConstVector)->size());
    for (unsigned i = 0, e = (yyvsp[(3) - (5)].ConstVector)->size(); i != e; ++i)
      Elements[i] = (*(yyvsp[(3) - (5)].ConstVector))[i]->getType();

    const StructType *STy = StructType::get(Elements, /*isPacked=*/true);
    PATypeHolder* PTy = new PATypeHolder(HandleUpRefs(STy));

    (yyval.ValIDVal) = ValID::create(ConstantStruct::get(STy, *(yyvsp[(3) - (5)].ConstVector)));
    delete PTy; delete (yyvsp[(3) - (5)].ConstVector);
    CHECK_FOR_ERROR
  ;}
    break;

  case 270:
#line 2572 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    const StructType *STy = StructType::get(std::vector<const Type*>(),
                                            /*isPacked=*/true);
    (yyval.ValIDVal) = ValID::create(ConstantStruct::get(STy, std::vector<Constant*>()));
    CHECK_FOR_ERROR
  ;}
    break;

  case 271:
#line 2578 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 272:
#line 2582 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createInlineAsm(*(yyvsp[(3) - (5)].StrVal), *(yyvsp[(5) - (5)].StrVal), (yyvsp[(2) - (5)].BoolVal));
    delete (yyvsp[(3) - (5)].StrVal);
    delete (yyvsp[(5) - (5)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 273:
#line 2592 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {  // Is it an integer reference...?
    (yyval.ValIDVal) = ValID::createLocalID((yyvsp[(1) - (1)].UIntVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 274:
#line 2596 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createGlobalID((yyvsp[(1) - (1)].UIntVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 275:
#line 2600 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                   // Is it a named reference...?
    (yyval.ValIDVal) = ValID::createLocalName(*(yyvsp[(1) - (1)].StrVal));
    delete (yyvsp[(1) - (1)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 276:
#line 2605 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                   // Is it a named reference...?
    (yyval.ValIDVal) = ValID::createGlobalName(*(yyvsp[(1) - (1)].StrVal));
    delete (yyvsp[(1) - (1)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 279:
#line 2618 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (2)].TypeVal))->getDescription());
    (yyval.ValueVal) = getVal(*(yyvsp[(1) - (2)].TypeVal), (yyvsp[(2) - (2)].ValIDVal)); 
    delete (yyvsp[(1) - (2)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 280:
#line 2627 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValueList) = new std::vector<Value *>();
    (yyval.ValueList)->push_back((yyvsp[(1) - (1)].ValueVal)); 
    CHECK_FOR_ERROR
  ;}
    break;

  case 281:
#line 2632 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.ValueList)=(yyvsp[(1) - (3)].ValueList))->push_back((yyvsp[(3) - (3)].ValueVal)); 
    CHECK_FOR_ERROR
  ;}
    break;

  case 282:
#line 2637 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 283:
#line 2641 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { // Do not allow functions with 0 basic blocks   
    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 284:
#line 2650 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    setValueName((yyvsp[(3) - (3)].TermInstVal), (yyvsp[(2) - (3)].StrVal));
    CHECK_FOR_ERROR
    InsertValue((yyvsp[(3) - (3)].TermInstVal));
    (yyvsp[(1) - (3)].BasicBlockVal)->getInstList().push_back((yyvsp[(3) - (3)].TermInstVal));
    (yyval.BasicBlockVal) = (yyvsp[(1) - (3)].BasicBlockVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 285:
#line 2659 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (CastInst *CI1 = dyn_cast<CastInst>((yyvsp[(2) - (2)].InstVal)))
      if (CastInst *CI2 = dyn_cast<CastInst>(CI1->getOperand(0)))
        if (CI2->getParent() == 0)
          (yyvsp[(1) - (2)].BasicBlockVal)->getInstList().push_back(CI2);
    (yyvsp[(1) - (2)].BasicBlockVal)->getInstList().push_back((yyvsp[(2) - (2)].InstVal));
    (yyval.BasicBlockVal) = (yyvsp[(1) - (2)].BasicBlockVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 286:
#line 2668 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {          // Empty space between instruction lists
    (yyval.BasicBlockVal) = defineBBVal(ValID::createLocalID(CurFun.NextValNum));
    CHECK_FOR_ERROR
  ;}
    break;

  case 287:
#line 2672 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {             // Labelled (named) basic block
    (yyval.BasicBlockVal) = defineBBVal(ValID::createLocalName(*(yyvsp[(1) - (1)].StrVal)));
    delete (yyvsp[(1) - (1)].StrVal);
    CHECK_FOR_ERROR

  ;}
    break;

  case 288:
#line 2680 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { // Return with a result...
    ValueList &VL = *(yyvsp[(2) - (2)].ValueList);
    assert(!VL.empty() && "Invalid ret operands!");
    (yyval.TermInstVal) = ReturnInst::Create(&VL[0], VL.size());
    delete (yyvsp[(2) - (2)].ValueList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 289:
#line 2687 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                                    // Return with no result...
    (yyval.TermInstVal) = ReturnInst::Create();
    CHECK_FOR_ERROR
  ;}
    break;

  case 290:
#line 2691 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {                           // Unconditional Branch...
    BasicBlock* tmpBB = getBBVal((yyvsp[(3) - (3)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.TermInstVal) = BranchInst::Create(tmpBB);
  ;}
    break;

  case 291:
#line 2696 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {  
    if (cast<IntegerType>((yyvsp[(2) - (9)].PrimType))->getBitWidth() != 1)
      GEN_ERROR("Branch condition must have type i1");
    BasicBlock* tmpBBA = getBBVal((yyvsp[(6) - (9)].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBBB = getBBVal((yyvsp[(9) - (9)].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal = getVal(Type::Int1Ty, (yyvsp[(3) - (9)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.TermInstVal) = BranchInst::Create(tmpBBA, tmpBBB, tmpVal);
  ;}
    break;

  case 292:
#line 2707 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    Value* tmpVal = getVal((yyvsp[(2) - (9)].PrimType), (yyvsp[(3) - (9)].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (9)].ValIDVal));
    CHECK_FOR_ERROR
    SwitchInst *S = SwitchInst::Create(tmpVal, tmpBB, (yyvsp[(8) - (9)].JumpTable)->size());
    (yyval.TermInstVal) = S;

    std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[(8) - (9)].JumpTable)->begin(),
      E = (yyvsp[(8) - (9)].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[(8) - (9)].JumpTable);
    CHECK_FOR_ERROR
  ;}
    break;

  case 293:
#line 2726 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    Value* tmpVal = getVal((yyvsp[(2) - (8)].PrimType), (yyvsp[(3) - (8)].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (8)].ValIDVal));
    CHECK_FOR_ERROR
    SwitchInst *S = SwitchInst::Create(tmpVal, tmpBB, 0);
    (yyval.TermInstVal) = S;
    CHECK_FOR_ERROR
  ;}
    break;

  case 294:
#line 2736 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {

    // Handle the short syntax
    const PointerType *PFTy = 0;
    const FunctionType *Ty = 0;
    if (!(PFTy = dyn_cast<PointerType>((yyvsp[(3) - (14)].TypeVal)->get())) ||
        !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
      // Pull out the types of all of the arguments...
      std::vector<const Type*> ParamTypes;
      ParamList::iterator I = (yyvsp[(6) - (14)].ParamList)->begin(), E = (yyvsp[(6) - (14)].ParamList)->end();
      for (; I != E; ++I) {
        const Type *Ty = I->Val->getType();
        if (Ty == Type::VoidTy)
          GEN_ERROR("Short call syntax cannot be used with varargs");
        ParamTypes.push_back(Ty);
      }
      
      if (!FunctionType::isValidReturnType(*(yyvsp[(3) - (14)].TypeVal)))
        GEN_ERROR("Invalid result type for LLVM function");

      Ty = FunctionType::get((yyvsp[(3) - (14)].TypeVal)->get(), ParamTypes, false);
      PFTy = PointerType::getUnqual(Ty);
    }

    delete (yyvsp[(3) - (14)].TypeVal);

    Value *V = getVal(PFTy, (yyvsp[(4) - (14)].ValIDVal));   // Get the function we're calling...
    CHECK_FOR_ERROR
    BasicBlock *Normal = getBBVal((yyvsp[(11) - (14)].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock *Except = getBBVal((yyvsp[(14) - (14)].ValIDVal));
    CHECK_FOR_ERROR

    SmallVector<ParamAttrsWithIndex, 8> Attrs;
    if ((yyvsp[(8) - (14)].ParamAttrs) != ParamAttr::None)
      Attrs.push_back(ParamAttrsWithIndex::get(0, (yyvsp[(8) - (14)].ParamAttrs)));

    // Check the arguments
    ValueList Args;
    if ((yyvsp[(6) - (14)].ParamList)->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 "
                       "expects arguments");
    } else {                                     // Has arguments?
      // Loop through FunctionType's arguments and ensure they are specified
      // correctly!
      FunctionType::param_iterator I = Ty->param_begin();
      FunctionType::param_iterator E = Ty->param_end();
      ParamList::iterator ArgI = (yyvsp[(6) - (14)].ParamList)->begin(), ArgE = (yyvsp[(6) - (14)].ParamList)->end();
      unsigned index = 1;

      for (; ArgI != ArgE && I != E; ++ArgI, ++I, ++index) {
        if (ArgI->Val->getType() != *I)
          GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
                         (*I)->getDescription() + "'");
        Args.push_back(ArgI->Val);
        if (ArgI->Attrs != ParamAttr::None)
          Attrs.push_back(ParamAttrsWithIndex::get(index, ArgI->Attrs));
      }

      if (Ty->isVarArg()) {
        if (I == E)
          for (; ArgI != ArgE; ++ArgI, ++index) {
            Args.push_back(ArgI->Val); // push the remaining varargs
            if (ArgI->Attrs != ParamAttr::None)
              Attrs.push_back(ParamAttrsWithIndex::get(index, ArgI->Attrs));
          }
      } else if (I != E || ArgI != ArgE)
        GEN_ERROR("Invalid number of parameters detected");
    }

    PAListPtr PAL;
    if (!Attrs.empty())
      PAL = PAListPtr::get(Attrs.begin(), Attrs.end());

    // Create the InvokeInst
    InvokeInst *II = InvokeInst::Create(V, Normal, Except,
                                        Args.begin(), Args.end());
    II->setCallingConv((yyvsp[(2) - (14)].UIntVal));
    II->setParamAttrs(PAL);
    (yyval.TermInstVal) = II;
    delete (yyvsp[(6) - (14)].ParamList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 295:
#line 2821 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TermInstVal) = new UnwindInst();
    CHECK_FOR_ERROR
  ;}
    break;

  case 296:
#line 2825 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TermInstVal) = new UnreachableInst();
    CHECK_FOR_ERROR
  ;}
    break;

  case 297:
#line 2832 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.JumpTable) = (yyvsp[(1) - (6)].JumpTable);
    Constant *V = cast<Constant>(getExistingVal((yyvsp[(2) - (6)].PrimType), (yyvsp[(3) - (6)].ValIDVal)));
    CHECK_FOR_ERROR
    if (V == 0)
      GEN_ERROR("May only switch on a constant pool value");

    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB));
  ;}
    break;

  case 298:
#line 2843 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.JumpTable) = new std::vector<std::pair<Constant*, BasicBlock*> >();
    Constant *V = cast<Constant>(getExistingVal((yyvsp[(1) - (5)].PrimType), (yyvsp[(2) - (5)].ValIDVal)));
    CHECK_FOR_ERROR

    if (V == 0)
      GEN_ERROR("May only switch on a constant pool value");

    BasicBlock* tmpBB = getBBVal((yyvsp[(5) - (5)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); 
  ;}
    break;

  case 299:
#line 2856 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // Is this definition named?? if so, assign the name...
    setValueName((yyvsp[(2) - (2)].InstVal), (yyvsp[(1) - (2)].StrVal));
    CHECK_FOR_ERROR
    InsertValue((yyvsp[(2) - (2)].InstVal));
    (yyval.InstVal) = (yyvsp[(2) - (2)].InstVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 300:
#line 2866 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {    // Used for PHI nodes
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (6)].TypeVal))->getDescription());
    (yyval.PHIList) = new std::list<std::pair<Value*, BasicBlock*> >();
    Value* tmpVal = getVal(*(yyvsp[(1) - (6)].TypeVal), (yyvsp[(3) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal((yyvsp[(5) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
    delete (yyvsp[(1) - (6)].TypeVal);
  ;}
    break;

  case 301:
#line 2877 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.PHIList) = (yyvsp[(1) - (7)].PHIList);
    Value* tmpVal = getVal((yyvsp[(1) - (7)].PHIList)->front().first->getType(), (yyvsp[(4) - (7)].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (7)].ValIDVal));
    CHECK_FOR_ERROR
    (yyvsp[(1) - (7)].PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
  ;}
    break;

  case 302:
#line 2887 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // FIXME: Remove trailing OptParamAttrs in LLVM 3.0, it was a mistake in 2.0
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (4)].TypeVal))->getDescription());
    // Used for call and invoke instructions
    (yyval.ParamList) = new ParamList();
    ParamListEntry E; E.Attrs = (yyvsp[(2) - (4)].ParamAttrs) | (yyvsp[(4) - (4)].ParamAttrs); E.Val = getVal((yyvsp[(1) - (4)].TypeVal)->get(), (yyvsp[(3) - (4)].ValIDVal));
    (yyval.ParamList)->push_back(E);
    delete (yyvsp[(1) - (4)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 303:
#line 2898 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // FIXME: Remove trailing OptParamAttrs in LLVM 3.0, it was a mistake in 2.0
    // Labels are only valid in ASMs
    (yyval.ParamList) = new ParamList();
    ParamListEntry E; E.Attrs = (yyvsp[(2) - (4)].ParamAttrs) | (yyvsp[(4) - (4)].ParamAttrs); E.Val = getBBVal((yyvsp[(3) - (4)].ValIDVal));
    (yyval.ParamList)->push_back(E);
    CHECK_FOR_ERROR
  ;}
    break;

  case 304:
#line 2906 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // FIXME: Remove trailing OptParamAttrs in LLVM 3.0, it was a mistake in 2.0
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (6)].TypeVal))->getDescription());
    (yyval.ParamList) = (yyvsp[(1) - (6)].ParamList);
    ParamListEntry E; E.Attrs = (yyvsp[(4) - (6)].ParamAttrs) | (yyvsp[(6) - (6)].ParamAttrs); E.Val = getVal((yyvsp[(3) - (6)].TypeVal)->get(), (yyvsp[(5) - (6)].ValIDVal));
    (yyval.ParamList)->push_back(E);
    delete (yyvsp[(3) - (6)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 305:
#line 2916 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    // FIXME: Remove trailing OptParamAttrs in LLVM 3.0, it was a mistake in 2.0
    (yyval.ParamList) = (yyvsp[(1) - (6)].ParamList);
    ParamListEntry E; E.Attrs = (yyvsp[(4) - (6)].ParamAttrs) | (yyvsp[(6) - (6)].ParamAttrs); E.Val = getBBVal((yyvsp[(5) - (6)].ValIDVal));
    (yyval.ParamList)->push_back(E);
    CHECK_FOR_ERROR
  ;}
    break;

  case 306:
#line 2923 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamList) = new ParamList(); ;}
    break;

  case 307:
#line 2926 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ValueList) = new std::vector<Value*>(); ;}
    break;

  case 308:
#line 2927 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValueList) = (yyvsp[(1) - (3)].ValueList);
    (yyval.ValueList)->push_back((yyvsp[(3) - (3)].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 309:
#line 2935 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ConstantList) = new std::vector<unsigned>();
    if ((unsigned)(yyvsp[(2) - (2)].UInt64Val) != (yyvsp[(2) - (2)].UInt64Val))
      GEN_ERROR("Index " + utostr((yyvsp[(2) - (2)].UInt64Val)) + " is not valid for insertvalue or extractvalue.");
    (yyval.ConstantList)->push_back((yyvsp[(2) - (2)].UInt64Val));
  ;}
    break;

  case 310:
#line 2941 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ConstantList) = (yyvsp[(1) - (3)].ConstantList);
    if ((unsigned)(yyvsp[(3) - (3)].UInt64Val) != (yyvsp[(3) - (3)].UInt64Val))
      GEN_ERROR("Index " + utostr((yyvsp[(3) - (3)].UInt64Val)) + " is not valid for insertvalue or extractvalue.");
    (yyval.ConstantList)->push_back((yyvsp[(3) - (3)].UInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 311:
#line 2950 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 312:
#line 2954 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 313:
#line 2959 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (5)].TypeVal))->getDescription());
    if (!(*(yyvsp[(2) - (5)].TypeVal))->isInteger() && !(*(yyvsp[(2) - (5)].TypeVal))->isFloatingPoint() && 
        !isa<VectorType>((*(yyvsp[(2) - (5)].TypeVal)).get()))
      GEN_ERROR(
        "Arithmetic operator requires integer, FP, or packed operands");
    Value* val1 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(3) - (5)].ValIDVal)); 
    CHECK_FOR_ERROR
    Value* val2 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(5) - (5)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = BinaryOperator::Create((yyvsp[(1) - (5)].BinaryOpVal), val1, val2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("binary operator returned null");
    delete (yyvsp[(2) - (5)].TypeVal);
  ;}
    break;

  case 314:
#line 2975 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (5)].TypeVal))->getDescription());
    if (!(*(yyvsp[(2) - (5)].TypeVal))->isInteger()) {
      if (Instruction::isShift((yyvsp[(1) - (5)].BinaryOpVal)) || !isa<VectorType>((yyvsp[(2) - (5)].TypeVal)->get()) ||
          !cast<VectorType>((yyvsp[(2) - (5)].TypeVal)->get())->getElementType()->isInteger())
        GEN_ERROR("Logical operator requires integral operands");
    }
    Value* tmpVal1 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(3) - (5)].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(5) - (5)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = BinaryOperator::Create((yyvsp[(1) - (5)].BinaryOpVal), tmpVal1, tmpVal2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("binary operator returned null");
    delete (yyvsp[(2) - (5)].TypeVal);
  ;}
    break;

  case 315:
#line 2992 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (6)].TypeVal))->getDescription());
    if (isa<VectorType>((*(yyvsp[(3) - (6)].TypeVal)).get()))
      GEN_ERROR("Vector types not supported by icmp instruction");
    Value* tmpVal1 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(4) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(6) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = CmpInst::Create((yyvsp[(1) - (6)].OtherOpVal), (yyvsp[(2) - (6)].IPredicate), tmpVal1, tmpVal2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("icmp operator returned null");
    delete (yyvsp[(3) - (6)].TypeVal);
  ;}
    break;

  case 316:
#line 3006 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (6)].TypeVal))->getDescription());
    if (isa<VectorType>((*(yyvsp[(3) - (6)].TypeVal)).get()))
      GEN_ERROR("Vector types not supported by fcmp instruction");
    Value* tmpVal1 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(4) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(6) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = CmpInst::Create((yyvsp[(1) - (6)].OtherOpVal), (yyvsp[(2) - (6)].FPredicate), tmpVal1, tmpVal2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("fcmp operator returned null");
    delete (yyvsp[(3) - (6)].TypeVal);
  ;}
    break;

  case 317:
#line 3020 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (6)].TypeVal))->getDescription());
    if (!isa<VectorType>((*(yyvsp[(3) - (6)].TypeVal)).get()))
      GEN_ERROR("Scalar types not supported by vicmp instruction");
    Value* tmpVal1 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(4) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(6) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = CmpInst::Create((yyvsp[(1) - (6)].OtherOpVal), (yyvsp[(2) - (6)].IPredicate), tmpVal1, tmpVal2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("icmp operator returned null");
    delete (yyvsp[(3) - (6)].TypeVal);
  ;}
    break;

  case 318:
#line 3034 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (6)].TypeVal))->getDescription());
    if (!isa<VectorType>((*(yyvsp[(3) - (6)].TypeVal)).get()))
      GEN_ERROR("Scalar types not supported by vfcmp instruction");
    Value* tmpVal1 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(4) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(6) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = CmpInst::Create((yyvsp[(1) - (6)].OtherOpVal), (yyvsp[(2) - (6)].FPredicate), tmpVal1, tmpVal2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("fcmp operator returned null");
    delete (yyvsp[(3) - (6)].TypeVal);
  ;}
    break;

  case 319:
#line 3048 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(4) - (4)].TypeVal))->getDescription());
    Value* Val = (yyvsp[(2) - (4)].ValueVal);
    const Type* DestTy = (yyvsp[(4) - (4)].TypeVal)->get();
    if (!CastInst::castIsValid((yyvsp[(1) - (4)].CastOpVal), Val, DestTy))
      GEN_ERROR("invalid cast opcode for cast from '" +
                Val->getType()->getDescription() + "' to '" +
                DestTy->getDescription() + "'"); 
    (yyval.InstVal) = CastInst::Create((yyvsp[(1) - (4)].CastOpVal), Val, DestTy);
    delete (yyvsp[(4) - (4)].TypeVal);
  ;}
    break;

  case 320:
#line 3060 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[(2) - (6)].ValueVal)->getType() != Type::Int1Ty)
      GEN_ERROR("select condition must be boolean");
    if ((yyvsp[(4) - (6)].ValueVal)->getType() != (yyvsp[(6) - (6)].ValueVal)->getType())
      GEN_ERROR("select value types should match");
    (yyval.InstVal) = SelectInst::Create((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 321:
#line 3068 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(4) - (4)].TypeVal))->getDescription());
    (yyval.InstVal) = new VAArgInst((yyvsp[(2) - (4)].ValueVal), *(yyvsp[(4) - (4)].TypeVal));
    delete (yyvsp[(4) - (4)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 322:
#line 3075 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!ExtractElementInst::isValidOperands((yyvsp[(2) - (4)].ValueVal), (yyvsp[(4) - (4)].ValueVal)))
      GEN_ERROR("Invalid extractelement operands");
    (yyval.InstVal) = new ExtractElementInst((yyvsp[(2) - (4)].ValueVal), (yyvsp[(4) - (4)].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 323:
#line 3081 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!InsertElementInst::isValidOperands((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal)))
      GEN_ERROR("Invalid insertelement operands");
    (yyval.InstVal) = InsertElementInst::Create((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 324:
#line 3087 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!ShuffleVectorInst::isValidOperands((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal)))
      GEN_ERROR("Invalid shufflevector operands");
    (yyval.InstVal) = new ShuffleVectorInst((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 325:
#line 3093 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    const Type *Ty = (yyvsp[(2) - (2)].PHIList)->front().first->getType();
    if (!Ty->isFirstClassType())
      GEN_ERROR("PHI node operands must be of first class type");
    (yyval.InstVal) = PHINode::Create(Ty);
    ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[(2) - (2)].PHIList)->size());
    while ((yyvsp[(2) - (2)].PHIList)->begin() != (yyvsp[(2) - (2)].PHIList)->end()) {
      if ((yyvsp[(2) - (2)].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[(2) - (2)].PHIList)->front().first, (yyvsp[(2) - (2)].PHIList)->front().second);
      (yyvsp[(2) - (2)].PHIList)->pop_front();
    }
    delete (yyvsp[(2) - (2)].PHIList);  // Free the list...
    CHECK_FOR_ERROR
  ;}
    break;

  case 326:
#line 3109 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {

    // Handle the short syntax
    const PointerType *PFTy = 0;
    const FunctionType *Ty = 0;
    if (!(PFTy = dyn_cast<PointerType>((yyvsp[(3) - (8)].TypeVal)->get())) ||
        !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
      // Pull out the types of all of the arguments...
      std::vector<const Type*> ParamTypes;
      ParamList::iterator I = (yyvsp[(6) - (8)].ParamList)->begin(), E = (yyvsp[(6) - (8)].ParamList)->end();
      for (; I != E; ++I) {
        const Type *Ty = I->Val->getType();
        if (Ty == Type::VoidTy)
          GEN_ERROR("Short call syntax cannot be used with varargs");
        ParamTypes.push_back(Ty);
      }

      if (!FunctionType::isValidReturnType(*(yyvsp[(3) - (8)].TypeVal)))
        GEN_ERROR("Invalid result type for LLVM function");

      Ty = FunctionType::get((yyvsp[(3) - (8)].TypeVal)->get(), ParamTypes, false);
      PFTy = PointerType::getUnqual(Ty);
    }

    Value *V = getVal(PFTy, (yyvsp[(4) - (8)].ValIDVal));   // Get the function we're calling...
    CHECK_FOR_ERROR

    // Check for call to invalid intrinsic to avoid crashing later.
    if (Function *theF = dyn_cast<Function>(V)) {
      if (theF->hasName() && (theF->getValueName()->getKeyLength() >= 5) &&
          (0 == strncmp(theF->getValueName()->getKeyData(), "llvm.", 5)) &&
          !theF->getIntrinsicID(true))
        GEN_ERROR("Call to invalid LLVM intrinsic function '" +
                  theF->getName() + "'");
    }

    // Set up the ParamAttrs for the function
    SmallVector<ParamAttrsWithIndex, 8> Attrs;
    if ((yyvsp[(8) - (8)].ParamAttrs) != ParamAttr::None)
      Attrs.push_back(ParamAttrsWithIndex::get(0, (yyvsp[(8) - (8)].ParamAttrs)));
    // Check the arguments 
    ValueList Args;
    if ((yyvsp[(6) - (8)].ParamList)->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 "
                       "expects arguments");
    } else {                                     // Has arguments?
      // Loop through FunctionType's arguments and ensure they are specified
      // correctly.  Also, gather any parameter attributes.
      FunctionType::param_iterator I = Ty->param_begin();
      FunctionType::param_iterator E = Ty->param_end();
      ParamList::iterator ArgI = (yyvsp[(6) - (8)].ParamList)->begin(), ArgE = (yyvsp[(6) - (8)].ParamList)->end();
      unsigned index = 1;

      for (; ArgI != ArgE && I != E; ++ArgI, ++I, ++index) {
        if (ArgI->Val->getType() != *I)
          GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
                         (*I)->getDescription() + "'");
        Args.push_back(ArgI->Val);
        if (ArgI->Attrs != ParamAttr::None)
          Attrs.push_back(ParamAttrsWithIndex::get(index, ArgI->Attrs));
      }
      if (Ty->isVarArg()) {
        if (I == E)
          for (; ArgI != ArgE; ++ArgI, ++index) {
            Args.push_back(ArgI->Val); // push the remaining varargs
            if (ArgI->Attrs != ParamAttr::None)
              Attrs.push_back(ParamAttrsWithIndex::get(index, ArgI->Attrs));
          }
      } else if (I != E || ArgI != ArgE)
        GEN_ERROR("Invalid number of parameters detected");
    }

    // Finish off the ParamAttrs and check them
    PAListPtr PAL;
    if (!Attrs.empty())
      PAL = PAListPtr::get(Attrs.begin(), Attrs.end());

    // Create the call node
    CallInst *CI = CallInst::Create(V, Args.begin(), Args.end());
    CI->setTailCall((yyvsp[(1) - (8)].BoolVal));
    CI->setCallingConv((yyvsp[(2) - (8)].UIntVal));
    CI->setParamAttrs(PAL);
    (yyval.InstVal) = CI;
    delete (yyvsp[(6) - (8)].ParamList);
    delete (yyvsp[(3) - (8)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 327:
#line 3198 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.InstVal) = (yyvsp[(1) - (1)].InstVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 328:
#line 3203 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 329:
#line 3207 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 330:
#line 3214 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (3)].TypeVal))->getDescription());
    (yyval.InstVal) = new MallocInst(*(yyvsp[(2) - (3)].TypeVal), 0, (yyvsp[(3) - (3)].UIntVal));
    delete (yyvsp[(2) - (3)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 331:
#line 3221 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (6)].TypeVal))->getDescription());
    if ((yyvsp[(4) - (6)].PrimType) != Type::Int32Ty)
      GEN_ERROR("Malloc array size is not a 32-bit integer!");
    Value* tmpVal = getVal((yyvsp[(4) - (6)].PrimType), (yyvsp[(5) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = new MallocInst(*(yyvsp[(2) - (6)].TypeVal), tmpVal, (yyvsp[(6) - (6)].UIntVal));
    delete (yyvsp[(2) - (6)].TypeVal);
  ;}
    break;

  case 332:
#line 3231 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (3)].TypeVal))->getDescription());
    (yyval.InstVal) = new AllocaInst(*(yyvsp[(2) - (3)].TypeVal), 0, (yyvsp[(3) - (3)].UIntVal));
    delete (yyvsp[(2) - (3)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 333:
#line 3238 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (6)].TypeVal))->getDescription());
    if ((yyvsp[(4) - (6)].PrimType) != Type::Int32Ty)
      GEN_ERROR("Alloca array size is not a 32-bit integer!");
    Value* tmpVal = getVal((yyvsp[(4) - (6)].PrimType), (yyvsp[(5) - (6)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = new AllocaInst(*(yyvsp[(2) - (6)].TypeVal), tmpVal, (yyvsp[(6) - (6)].UIntVal));
    delete (yyvsp[(2) - (6)].TypeVal);
  ;}
    break;

  case 334:
#line 3248 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!isa<PointerType>((yyvsp[(2) - (2)].ValueVal)->getType()))
      GEN_ERROR("Trying to free nonpointer type " + 
                     (yyvsp[(2) - (2)].ValueVal)->getType()->getDescription() + "");
    (yyval.InstVal) = new FreeInst((yyvsp[(2) - (2)].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 335:
#line 3256 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (5)].TypeVal))->getDescription());
    if (!isa<PointerType>((yyvsp[(3) - (5)].TypeVal)->get()))
      GEN_ERROR("Can't load from nonpointer type: " +
                     (*(yyvsp[(3) - (5)].TypeVal))->getDescription());
    if (!cast<PointerType>((yyvsp[(3) - (5)].TypeVal)->get())->getElementType()->isFirstClassType())
      GEN_ERROR("Can't load from pointer of non-first-class type: " +
                     (*(yyvsp[(3) - (5)].TypeVal))->getDescription());
    Value* tmpVal = getVal(*(yyvsp[(3) - (5)].TypeVal), (yyvsp[(4) - (5)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[(1) - (5)].BoolVal), (yyvsp[(5) - (5)].UIntVal));
    delete (yyvsp[(3) - (5)].TypeVal);
  ;}
    break;

  case 336:
#line 3270 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(5) - (7)].TypeVal))->getDescription());
    const PointerType *PT = dyn_cast<PointerType>((yyvsp[(5) - (7)].TypeVal)->get());
    if (!PT)
      GEN_ERROR("Can't store to a nonpointer type: " +
                     (*(yyvsp[(5) - (7)].TypeVal))->getDescription());
    const Type *ElTy = PT->getElementType();
    if (ElTy != (yyvsp[(3) - (7)].ValueVal)->getType())
      GEN_ERROR("Can't store '" + (yyvsp[(3) - (7)].ValueVal)->getType()->getDescription() +
                     "' into space of type '" + ElTy->getDescription() + "'");

    Value* tmpVal = getVal(*(yyvsp[(5) - (7)].TypeVal), (yyvsp[(6) - (7)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = new StoreInst((yyvsp[(3) - (7)].ValueVal), tmpVal, (yyvsp[(1) - (7)].BoolVal), (yyvsp[(7) - (7)].UIntVal));
    delete (yyvsp[(5) - (7)].TypeVal);
  ;}
    break;

  case 337:
#line 3287 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
  Value *TmpVal = getVal((yyvsp[(2) - (5)].TypeVal)->get(), (yyvsp[(3) - (5)].ValIDVal));
  if (!GetResultInst::isValidOperands(TmpVal, (yyvsp[(5) - (5)].UInt64Val)))
      GEN_ERROR("Invalid getresult operands");
    (yyval.InstVal) = new GetResultInst(TmpVal, (yyvsp[(5) - (5)].UInt64Val));
    delete (yyvsp[(2) - (5)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 338:
#line 3295 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (4)].TypeVal))->getDescription());
    if (!isa<PointerType>((yyvsp[(2) - (4)].TypeVal)->get()))
      GEN_ERROR("getelementptr insn requires pointer operand");

    if (!GetElementPtrInst::getIndexedType(*(yyvsp[(2) - (4)].TypeVal), (yyvsp[(4) - (4)].ValueList)->begin(), (yyvsp[(4) - (4)].ValueList)->end()))
      GEN_ERROR("Invalid getelementptr indices for type '" +
                     (*(yyvsp[(2) - (4)].TypeVal))->getDescription()+ "'");
    Value* tmpVal = getVal(*(yyvsp[(2) - (4)].TypeVal), (yyvsp[(3) - (4)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = GetElementPtrInst::Create(tmpVal, (yyvsp[(4) - (4)].ValueList)->begin(), (yyvsp[(4) - (4)].ValueList)->end());
    delete (yyvsp[(2) - (4)].TypeVal); 
    delete (yyvsp[(4) - (4)].ValueList);
  ;}
    break;

  case 339:
#line 3310 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (4)].TypeVal))->getDescription());
    if (!isa<StructType>((yyvsp[(2) - (4)].TypeVal)->get()) && !isa<ArrayType>((yyvsp[(2) - (4)].TypeVal)->get()))
      GEN_ERROR("extractvalue insn requires an aggregate operand");

    if (!ExtractValueInst::getIndexedType(*(yyvsp[(2) - (4)].TypeVal), (yyvsp[(4) - (4)].ConstantList)->begin(), (yyvsp[(4) - (4)].ConstantList)->end()))
      GEN_ERROR("Invalid extractvalue indices for type '" +
                     (*(yyvsp[(2) - (4)].TypeVal))->getDescription()+ "'");
    Value* tmpVal = getVal(*(yyvsp[(2) - (4)].TypeVal), (yyvsp[(3) - (4)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = ExtractValueInst::Create(tmpVal, (yyvsp[(4) - (4)].ConstantList)->begin(), (yyvsp[(4) - (4)].ConstantList)->end());
    delete (yyvsp[(2) - (4)].TypeVal); 
    delete (yyvsp[(4) - (4)].ConstantList);
  ;}
    break;

  case 340:
#line 3325 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (7)].TypeVal))->getDescription());
    if (!isa<StructType>((yyvsp[(2) - (7)].TypeVal)->get()) && !isa<ArrayType>((yyvsp[(2) - (7)].TypeVal)->get()))
      GEN_ERROR("extractvalue insn requires an aggregate operand");

    if (ExtractValueInst::getIndexedType(*(yyvsp[(2) - (7)].TypeVal), (yyvsp[(7) - (7)].ConstantList)->begin(), (yyvsp[(7) - (7)].ConstantList)->end()) != (yyvsp[(5) - (7)].TypeVal)->get())
      GEN_ERROR("Invalid insertvalue indices for type '" +
                     (*(yyvsp[(2) - (7)].TypeVal))->getDescription()+ "'");
    Value* aggVal = getVal(*(yyvsp[(2) - (7)].TypeVal), (yyvsp[(3) - (7)].ValIDVal));
    Value* tmpVal = getVal(*(yyvsp[(5) - (7)].TypeVal), (yyvsp[(6) - (7)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = InsertValueInst::Create(aggVal, tmpVal, (yyvsp[(7) - (7)].ConstantList)->begin(), (yyvsp[(7) - (7)].ConstantList)->end());
    delete (yyvsp[(2) - (7)].TypeVal); 
    delete (yyvsp[(5) - (7)].TypeVal);
    delete (yyvsp[(7) - (7)].ConstantList);
  ;}
    break;


/* Line 1267 of yacc.c.  */
#line 6767 "llvmAsmParser.tab.c"
      default: break;
    }
  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);

  YYPOPSTACK (yylen);
  yylen = 0;
  YY_STACK_PRINT (yyss, yyssp);

  *++yyvsp = yyval;


  /* Now `shift' the result of the reduction.  Determine what state
     that goes to, based on the state we popped back to and the rule
     number reduced by.  */

  yyn = yyr1[yyn];

  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
    yystate = yytable[yystate];
  else
    yystate = yydefgoto[yyn - YYNTOKENS];

  goto yynewstate;


/*------------------------------------.
| yyerrlab -- here on detecting error |
`------------------------------------*/
yyerrlab:
  /* If not already recovering from an error, report this error.  */
  if (!yyerrstatus)
    {
      ++yynerrs;
#if ! YYERROR_VERBOSE
      yyerror (YY_("syntax error"));
#else
      {
	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
	  {
	    YYSIZE_T yyalloc = 2 * yysize;
	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
	    if (yymsg != yymsgbuf)
	      YYSTACK_FREE (yymsg);
	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
	    if (yymsg)
	      yymsg_alloc = yyalloc;
	    else
	      {
		yymsg = yymsgbuf;
		yymsg_alloc = sizeof yymsgbuf;
	      }
	  }

	if (0 < yysize && yysize <= yymsg_alloc)
	  {
	    (void) yysyntax_error (yymsg, yystate, yychar);
	    yyerror (yymsg);
	  }
	else
	  {
	    yyerror (YY_("syntax error"));
	    if (yysize != 0)
	      goto yyexhaustedlab;
	  }
      }
#endif
    }



  if (yyerrstatus == 3)
    {
      /* If just tried and failed to reuse look-ahead token after an
	 error, discard it.  */

      if (yychar <= YYEOF)
	{
	  /* Return failure if at end of input.  */
	  if (yychar == YYEOF)
	    YYABORT;
	}
      else
	{
	  yydestruct ("Error: discarding",
		      yytoken, &yylval);
	  yychar = YYEMPTY;
	}
    }

  /* Else will try to reuse look-ahead token after shifting the error
     token.  */
  goto yyerrlab1;


/*---------------------------------------------------.
| 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 (/*CONSTCOND*/ 0)
     goto yyerrorlab;

  /* Do not reclaim the symbols of the rule which action triggered
     this YYERROR.  */
  YYPOPSTACK (yylen);
  yylen = 0;
  YY_STACK_PRINT (yyss, yyssp);
  yystate = *yyssp;
  goto yyerrlab1;


/*-------------------------------------------------------------.
| yyerrlab1 -- common code for both syntax error and YYERROR.  |
`-------------------------------------------------------------*/
yyerrlab1:
  yyerrstatus = 3;	/* Each real token shifted decrements this.  */

  for (;;)
    {
      yyn = yypact[yystate];
      if (yyn != YYPACT_NINF)
	{
	  yyn += YYTERROR;
	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
	    {
	      yyn = yytable[yyn];
	      if (0 < yyn)
		break;
	    }
	}

      /* Pop the current state because it cannot handle the error token.  */
      if (yyssp == yyss)
	YYABORT;


      yydestruct ("Error: popping",
		  yystos[yystate], yyvsp);
      YYPOPSTACK (1);
      yystate = *yyssp;
      YY_STACK_PRINT (yyss, yyssp);
    }

  if (yyn == YYFINAL)
    YYACCEPT;

  *++yyvsp = yylval;


  /* Shift the error token.  */
  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);

  yystate = yyn;
  goto yynewstate;


/*-------------------------------------.
| yyacceptlab -- YYACCEPT comes here.  |
`-------------------------------------*/
yyacceptlab:
  yyresult = 0;
  goto yyreturn;

/*-----------------------------------.
| yyabortlab -- YYABORT comes here.  |
`-----------------------------------*/
yyabortlab:
  yyresult = 1;
  goto yyreturn;

#ifndef yyoverflow
/*-------------------------------------------------.
| yyexhaustedlab -- memory exhaustion comes here.  |
`-------------------------------------------------*/
yyexhaustedlab:
  yyerror (YY_("memory exhausted"));
  yyresult = 2;
  /* Fall through.  */
#endif

yyreturn:
  if (yychar != YYEOF && yychar != YYEMPTY)
     yydestruct ("Cleanup: discarding lookahead",
		 yytoken, &yylval);
  /* Do not reclaim the symbols of the rule which action triggered
     this YYABORT or YYACCEPT.  */
  YYPOPSTACK (yylen);
  YY_STACK_PRINT (yyss, yyssp);
  while (yyssp != yyss)
    {
      yydestruct ("Cleanup: popping",
		  yystos[*yyssp], yyvsp);
      YYPOPSTACK (1);
    }
#ifndef yyoverflow
  if (yyss != yyssa)
    YYSTACK_FREE (yyss);
#endif
#if YYERROR_VERBOSE
  if (yymsg != yymsgbuf)
    YYSTACK_FREE (yymsg);
#endif
  /* Make sure YYID is used.  */
  return YYID (yyresult);
}


#line 3344 "/Volumes/Data/Code/work/llvm2/lib/AsmParser/llvmAsmParser.y"


// common code from the two 'RunVMAsmParser' functions
static Module* RunParser(Module * M) {
  CurModule.CurrentModule = M;
  // Check to make sure the parser succeeded
  if (yyparse()) {
    if (ParserResult)
      delete ParserResult;
    return 0;
  }

  // Emit an error if there are any unresolved types left.
  if (!CurModule.LateResolveTypes.empty()) {
    const ValID &DID = CurModule.LateResolveTypes.begin()->first;
    if (DID.Type == ValID::LocalName) {
      GenerateError("Undefined type remains at eof: '"+DID.getName() + "'");
    } else {
      GenerateError("Undefined type remains at eof: #" + itostr(DID.Num));
    }
    if (ParserResult)
      delete ParserResult;
    return 0;
  }

  // Emit an error if there are any unresolved values left.
  if (!CurModule.LateResolveValues.empty()) {
    Value *V = CurModule.LateResolveValues.back();
    std::map<Value*, std::pair<ValID, int> >::iterator I =
      CurModule.PlaceHolderInfo.find(V);

    if (I != CurModule.PlaceHolderInfo.end()) {
      ValID &DID = I->second.first;
      if (DID.Type == ValID::LocalName) {
        GenerateError("Undefined value remains at eof: "+DID.getName() + "'");
      } else {
        GenerateError("Undefined value remains at eof: #" + itostr(DID.Num));
      }
      if (ParserResult)
        delete ParserResult;
      return 0;
    }
  }

  // Check to make sure that parsing produced a result
  if (!ParserResult)
    return 0;

  // Reset ParserResult variable while saving its value for the result.
  Module *Result = ParserResult;
  ParserResult = 0;

  return Result;
}

void llvm::GenerateError(const std::string &message, int LineNo) {
  if (LineNo == -1) LineNo = LLLgetLineNo();
  // TODO: column number in exception
  if (TheParseError)
    TheParseError->setError(LLLgetFilename(), message, LineNo);
  TriggerError = 1;
}

int yyerror(const char *ErrorMsg) {
  std::string where = LLLgetFilename() + ":" + utostr(LLLgetLineNo()) + ": ";
  std::string errMsg = where + "error: " + std::string(ErrorMsg);
  if (yychar != YYEMPTY && yychar != 0) {
    errMsg += " while reading token: '";
    errMsg += std::string(LLLgetTokenStart(), 
                          LLLgetTokenStart()+LLLgetTokenLength()) + "'";
  }
  GenerateError(errMsg);
  return 0;
}

