/* 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,
     SIGNEXT = 394,
     ZEROEXT = 395,
     NORETURN = 396,
     INREG = 397,
     SRET = 398,
     NOUNWIND = 399,
     NOALIAS = 400,
     BYVAL = 401,
     NEST = 402,
     READNONE = 403,
     READONLY = 404,
     GC = 405,
     DEFAULT = 406,
     HIDDEN = 407,
     PROTECTED = 408
   };
#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 SIGNEXT 394
#define ZEROEXT 395
#define NORETURN 396
#define INREG 397
#define SRET 398
#define NOUNWIND 399
#define NOALIAS 400
#define BYVAL 401
#define NEST 402
#define READNONE 403
#define READONLY 404
#define GC 405
#define DEFAULT 406
#define HIDDEN 407
#define PROTECTED 408




/* Copy the first part of user declarations.  */
#line 14 "/Users/malichus/Source/LLVM/src/svn/llvm/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 composite 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;
  }

  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 949 "/Users/malichus/Source/LLVM/src/svn/llvm/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;
  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 1392 "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 1405 "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   2040

/* YYNTOKENS -- Number of terminals.  */
#define YYNTOKENS  168
/* YYNNTS -- Number of nonterminals.  */
#define YYNNTS  85
/* YYNRULES -- Number of rules.  */
#define YYNRULES  327
/* YYNRULES -- Number of states.  */
#define YYNSTATES  656

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

#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,
     154,   155,   158,     2,   157,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     163,   156,   164,     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,   160,   159,   162,     2,     2,     2,     2,     2,   167,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     161,     2,     2,   165,     2,   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,     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
};

#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,   548,   550,   552,   554,   556,   557,   560,
     567,   569,   570,   572,   575,   576,   580,   581,   585,   589,
     593,   597,   598,   607,   608,   618,   619,   629,   635,   638,
     642,   644,   648,   652,   656,   660,   662,   663,   669,   673,
     675,   679,   681,   682,   693,   695,   697,   702,   704,   706,
     709,   713,   714,   716,   718,   720,   722,   724,   726,   728,
     730,   732,   736,   738,   744,   746,   748,   750,   752,   754,
     756,   759,   761,   765,   768,   771,   775,   778,   779,   781,
     784,   787,   791,   801,   811,   820,   835,   837,   839,   846,
     852,   855,   862,   870,   875,   880,   887,   894,   895,   896,
     900,   903,   905,   911,   917,   924,   931,   938,   945,   950,
     957,   962,   967,   974,   981,   984,   993,   995,   997,   998,
    1002,  1009,  1013,  1020,  1023,  1029,  1037,  1043
};

/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
static const yytype_int16 yyrhs[] =
{
     214,     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,   176,    -1,    -1,
      55,   154,     4,   155,    -1,    -1,   176,   156,    -1,    -1,
      20,    -1,    23,    -1,   182,    -1,    -1,   180,   156,    -1,
      42,    -1,    44,    -1,    43,    -1,    45,    -1,    47,    -1,
      49,    -1,    46,    -1,    48,    -1,    51,    -1,    -1,   151,
      -1,   152,    -1,   153,    -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,   140,    -1,
     121,    -1,   139,    -1,   122,    -1,   142,    -1,   143,    -1,
     145,    -1,   146,    -1,   147,    -1,    54,     4,    -1,    -1,
     191,   190,    -1,   141,    -1,   144,    -1,   140,    -1,   139,
      -1,   148,    -1,   149,    -1,    -1,   193,   192,    -1,    -1,
     150,    22,    -1,    -1,    54,     4,    -1,    -1,   157,    54,
       4,    -1,    34,    22,    -1,    -1,   197,    -1,    -1,   157,
     200,   199,    -1,   197,    -1,    54,     4,    -1,    11,    -1,
      12,    -1,    13,    -1,    16,    -1,    15,    -1,    14,    -1,
      17,    -1,    50,    -1,   201,    -1,   202,   178,   158,    -1,
     236,    -1,   159,     4,    -1,   202,   154,   206,   155,   193,
      -1,    10,   154,   206,   155,   193,    -1,   160,     4,   161,
     202,   162,    -1,   163,     4,   161,   202,   164,    -1,   165,
     207,   166,    -1,   165,   166,    -1,   163,   165,   207,   166,
     164,    -1,   163,   165,   166,   164,    -1,   202,   191,    -1,
     202,    -1,    10,    -1,   203,    -1,   205,   157,   203,    -1,
     205,    -1,   205,   157,    39,    -1,    39,    -1,    -1,   202,
      -1,   207,   157,   202,    -1,   202,   160,   210,   162,    -1,
     202,   160,   162,    -1,   202,   167,    22,    -1,   202,   163,
     210,   164,    -1,   202,   165,   210,   166,    -1,   202,   165,
     166,    -1,   202,   163,   165,   210,   166,   164,    -1,   202,
     163,   165,   166,   164,    -1,   202,    40,    -1,   202,    41,
      -1,   202,   236,    -1,   202,   209,    -1,   202,    25,    -1,
     174,     3,    -1,   174,     5,    -1,   174,     4,    -1,   174,
       6,    -1,    11,    26,    -1,    11,    27,    -1,   175,     9,
      -1,   171,   154,   208,    38,   202,   155,    -1,   119,   154,
     208,   248,   155,    -1,   133,   154,   208,   157,   208,   157,
     208,   155,    -1,   169,   154,   208,   157,   208,   155,    -1,
     170,   154,   208,   157,   208,   155,    -1,    90,   172,   154,
     208,   157,   208,   155,    -1,    91,   173,   154,   208,   157,
     208,   155,    -1,    92,   172,   154,   208,   157,   208,   155,
      -1,    93,   173,   154,   208,   157,   208,   155,    -1,   135,
     154,   208,   157,   208,   155,    -1,   136,   154,   208,   157,
     208,   157,   208,   155,    -1,   137,   154,   208,   157,   208,
     157,   208,   155,    -1,   210,   157,   208,    -1,   208,    -1,
      32,    -1,    33,    -1,    37,    -1,    -1,   204,   236,    -1,
     125,   154,   213,    38,   202,   155,    -1,   215,    -1,    -1,
     216,    -1,   215,   216,    -1,    -1,    31,   217,   232,    -1,
      -1,    30,   218,   233,    -1,    60,    59,   222,    -1,   179,
      18,   202,    -1,   179,    18,    10,    -1,    -1,   181,   185,
     212,   211,   208,   178,   219,   199,    -1,    -1,   181,   183,
     185,   212,   211,   208,   178,   220,   199,    -1,    -1,   181,
     184,   185,   212,   211,   202,   178,   221,   199,    -1,   181,
     185,    35,   188,   213,    -1,    52,   223,    -1,    56,   156,
     224,    -1,    22,    -1,    53,   156,    22,    -1,    68,   156,
      22,    -1,   160,   225,   162,    -1,   225,   157,    22,    -1,
      22,    -1,    -1,   226,   157,   202,   191,   177,    -1,   202,
     191,   177,    -1,   226,    -1,   226,   157,    39,    -1,    39,
      -1,    -1,   189,   204,   180,   154,   227,   155,   193,   198,
     195,   194,    -1,    28,    -1,   165,    -1,   187,   185,   228,
     229,    -1,    29,    -1,   166,    -1,   240,   231,    -1,   186,
     185,   228,    -1,    -1,    61,    -1,     3,    -1,     4,    -1,
       9,    -1,    26,    -1,    27,    -1,    40,    -1,    41,    -1,
      25,    -1,   163,   210,   164,    -1,   209,    -1,    59,   234,
      22,   157,    22,    -1,     7,    -1,     8,    -1,   176,    -1,
     180,    -1,   236,    -1,   235,    -1,   202,   237,    -1,   238,
      -1,   239,   157,   238,    -1,   240,   241,    -1,   230,   241,
      -1,   242,   179,   243,    -1,   242,   245,    -1,    -1,    21,
      -1,    69,   239,    -1,    69,    10,    -1,    70,    17,   237,
      -1,    70,    11,   237,   157,    17,   237,   157,    17,   237,
      -1,    71,   174,   237,   157,    17,   237,   160,   244,   162,
      -1,    71,   174,   237,   157,    17,   237,   160,   162,    -1,
      72,   189,   204,   237,   154,   247,   155,   193,    38,    17,
     237,    73,    17,   237,    -1,    73,    -1,    74,    -1,   244,
     174,   235,   157,    17,   237,    -1,   174,   235,   157,    17,
     237,    -1,   179,   250,    -1,   202,   160,   237,   157,   237,
     162,    -1,   246,   157,   160,   237,   157,   237,   162,    -1,
     202,   191,   237,   191,    -1,    17,   191,   237,   191,    -1,
     247,   157,   202,   191,   237,   191,    -1,   247,   157,    17,
     191,   237,   191,    -1,    -1,    -1,   248,   157,   238,    -1,
      58,    57,    -1,    57,    -1,   169,   202,   237,   157,   237,
      -1,   170,   202,   237,   157,   237,    -1,    90,   172,   202,
     237,   157,   237,    -1,    91,   173,   202,   237,   157,   237,
      -1,    92,   172,   202,   237,   157,   237,    -1,    93,   173,
     202,   237,   157,   237,    -1,   171,   238,    38,   202,    -1,
     133,   238,   157,   238,   157,   238,    -1,   134,   238,   157,
     202,    -1,   135,   238,   157,   238,    -1,   136,   238,   157,
     238,   157,   238,    -1,   137,   238,   157,   238,   157,   238,
      -1,   132,   246,    -1,   249,   189,   204,   237,   154,   247,
     155,   193,    -1,   252,    -1,    36,    -1,    -1,   114,   202,
     196,    -1,   114,   202,   157,    11,   237,   196,    -1,   115,
     202,   196,    -1,   115,   202,   157,    11,   237,   196,    -1,
     116,   238,    -1,   251,   117,   202,   237,   196,    -1,   251,
     118,   238,   157,   202,   237,   196,    -1,   138,   202,   237,
     157,     4,    -1,   119,   202,   237,   248,    -1
};

/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
static const yytype_uint16 yyrline[] =
{
       0,  1111,  1111,  1111,  1111,  1111,  1111,  1111,  1111,  1111,
    1111,  1112,  1112,  1112,  1112,  1112,  1112,  1113,  1113,  1113,
    1113,  1113,  1113,  1114,  1114,  1114,  1114,  1114,  1114,  1117,
    1117,  1118,  1118,  1119,  1119,  1120,  1120,  1121,  1121,  1125,
    1125,  1126,  1126,  1127,  1127,  1128,  1128,  1129,  1129,  1130,
    1130,  1131,  1131,  1132,  1133,  1138,  1139,  1139,  1139,  1139,
    1139,  1141,  1141,  1141,  1142,  1142,  1144,  1145,  1149,  1153,
    1158,  1158,  1160,  1161,  1166,  1172,  1173,  1174,  1175,  1176,
    1177,  1181,  1182,  1183,  1187,  1188,  1189,  1190,  1194,  1195,
    1196,  1200,  1201,  1202,  1203,  1204,  1208,  1209,  1210,  1213,
    1214,  1215,  1216,  1217,  1218,  1219,  1226,  1227,  1228,  1229,
    1230,  1231,  1232,  1233,  1234,  1235,  1239,  1240,  1245,  1246,
    1247,  1248,  1249,  1250,  1253,  1254,  1259,  1260,  1267,  1268,
    1274,  1275,  1284,  1292,  1293,  1298,  1299,  1300,  1305,  1318,
    1318,  1318,  1318,  1318,  1318,  1318,  1321,  1325,  1329,  1336,
    1341,  1349,  1378,  1403,  1408,  1418,  1428,  1432,  1442,  1449,
    1458,  1465,  1470,  1475,  1482,  1483,  1490,  1497,  1505,  1511,
    1523,  1551,  1567,  1594,  1622,  1648,  1668,  1694,  1714,  1726,
    1733,  1799,  1809,  1819,  1825,  1835,  1841,  1851,  1856,  1861,
    1874,  1886,  1907,  1915,  1921,  1932,  1937,  1942,  1947,  1952,
    1958,  1964,  1973,  1977,  1985,  1985,  1988,  1988,  1991,  2003,
    2024,  2029,  2037,  2038,  2042,  2042,  2046,  2046,  2049,  2052,
    2076,  2088,  2087,  2099,  2098,  2108,  2107,  2118,  2158,  2161,
    2167,  2177,  2181,  2186,  2188,  2193,  2198,  2207,  2217,  2228,
    2232,  2241,  2250,  2255,  2384,  2384,  2386,  2395,  2395,  2397,
    2402,  2414,  2418,  2423,  2427,  2431,  2435,  2439,  2443,  2447,
    2451,  2455,  2480,  2484,  2494,  2498,  2502,  2507,  2514,  2514,
    2520,  2529,  2534,  2539,  2543,  2552,  2561,  2570,  2574,  2582,
    2589,  2593,  2598,  2608,  2627,  2636,  2722,  2726,  2733,  2744,
    2757,  2767,  2778,  2788,  2799,  2807,  2817,  2824,  2827,  2828,
    2835,  2839,  2844,  2860,  2877,  2891,  2905,  2919,  2933,  2945,
    2953,  2960,  2966,  2972,  2978,  2993,  3083,  3088,  3092,  3099,
    3106,  3114,  3121,  3129,  3137,  3151,  3168,  3176
};
#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", "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", "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,    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,   168,   169,   169,   169,   169,   169,   169,   169,   169,
     169,   170,   170,   170,   170,   170,   170,   171,   171,   171,
     171,   171,   171,   171,   171,   171,   171,   171,   171,   172,
     172,   172,   172,   172,   172,   172,   172,   172,   172,   173,
     173,   173,   173,   173,   173,   173,   173,   173,   173,   173,
     173,   173,   173,   173,   173,   174,   175,   175,   175,   175,
     175,   176,   176,   176,   177,   177,   178,   178,   179,   179,
     180,   180,   181,   181,   182,   183,   183,   183,   183,   183,
     183,   184,   184,   184,   185,   185,   185,   185,   186,   186,
     186,   187,   187,   187,   187,   187,   188,   188,   188,   189,
     189,   189,   189,   189,   189,   189,   190,   190,   190,   190,
     190,   190,   190,   190,   190,   190,   191,   191,   192,   192,
     192,   192,   192,   192,   193,   193,   194,   194,   195,   195,
     196,   196,   197,   198,   198,   199,   199,   200,   200,   201,
     201,   201,   201,   201,   201,   201,   202,   202,   202,   202,
     202,   202,   202,   202,   202,   202,   202,   202,   202,   203,
     204,   204,   205,   205,   206,   206,   206,   206,   207,   207,
     208,   208,   208,   208,   208,   208,   208,   208,   208,   208,
     208,   208,   208,   208,   208,   208,   208,   208,   208,   208,
     209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
     209,   209,   210,   210,   211,   211,   212,   212,   213,   213,
     214,   214,   215,   215,   217,   216,   218,   216,   216,   216,
     216,   219,   216,   220,   216,   221,   216,   216,   216,   216,
     222,   223,   223,   224,   225,   225,   225,   226,   226,   227,
     227,   227,   227,   228,   229,   229,   230,   231,   231,   232,
     233,   234,   234,   235,   235,   235,   235,   235,   235,   235,
     235,   235,   235,   235,   236,   236,   236,   236,   237,   237,
     238,   239,   239,   240,   240,   241,   242,   242,   242,   243,
     243,   243,   243,   243,   243,   243,   243,   243,   244,   244,
     245,   246,   246,   247,   247,   247,   247,   247,   248,   248,
     249,   249,   250,   250,   250,   250,   250,   250,   250,   250,
     250,   250,   250,   250,   250,   250,   250,   251,   251,   252,
     252,   252,   252,   252,   252,   252,   252,   252
};

/* 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,     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,     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,     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
};

/* 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,   216,   214,     0,     0,
       0,     0,     0,     0,    84,    72,     0,    73,   212,    88,
      91,     0,     0,   228,     0,     0,    68,     0,    74,    75,
      77,    76,    78,    81,    79,    82,    80,    83,    85,    86,
      87,    84,    84,   207,     1,   213,    89,    90,    84,   217,
      92,    93,    94,    95,    84,   277,   215,   277,     0,     0,
     236,   229,   230,   218,   264,   265,   220,   139,   140,   141,
     144,   143,   142,   145,   146,     0,     0,     0,     0,   266,
     267,   147,   219,   149,   207,   207,    96,   206,     0,    99,
      99,   278,   274,    69,   247,   248,   249,   273,   231,   232,
     235,     0,   167,   150,     0,     0,     0,     0,   156,   168,
       0,     0,   167,     0,     0,     0,    98,    97,     0,   204,
     205,     0,     0,   100,   101,   102,   103,   104,     0,   250,
       0,   318,   276,     0,   233,   166,   116,   162,   164,     0,
       0,     0,     0,     0,     0,   155,     0,     0,   148,     0,
       0,   161,     0,   160,     0,   227,   139,   140,   141,   144,
     143,   142,     0,     0,    67,    67,   105,     0,   244,   245,
     246,   317,   301,     0,     0,     0,     0,    99,   286,   287,
       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,   275,    99,   290,     0,   316,
     234,   159,     0,   124,    67,    67,   158,     0,   169,     0,
     124,    67,    67,     0,   208,   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,   181,   180,   221,     0,   300,   280,    67,   271,   279,
       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,   323,    67,    67,
     314,     0,     0,     0,     0,     0,    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,   223,   225,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,   171,   203,     0,     0,     0,   175,
       0,   172,     0,     0,     0,   135,   242,   253,   254,   255,
     260,   256,   257,   258,   259,   251,     0,   262,   269,   268,
     270,     0,     0,   281,     0,     0,    67,    67,    67,    67,
       0,   319,     0,   321,   298,     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,   298,     0,     0,     0,     0,     0,
     170,   156,   168,     0,   173,   174,     0,     0,     0,     0,
     222,   241,   116,   239,     0,   252,     0,     0,   272,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,   327,
       0,     0,     0,   310,   311,     0,     0,     0,     0,     0,
     308,     0,   130,     0,   224,   226,    67,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   202,   177,     0,     0,
       0,     0,     0,     0,   137,   135,    65,     0,   124,     0,
     261,     0,     0,   297,     0,     0,     0,     0,   130,   131,
     130,     0,     0,     0,     0,     0,     0,   326,   302,   303,
     297,     0,   324,    67,   209,     0,     0,     0,     0,   191,
       0,     0,     0,     0,   176,     0,     0,    67,   132,   138,
     136,    64,   238,   240,   116,   133,     0,     0,     0,   116,
     116,     0,   304,   305,   306,   307,   320,   322,   299,     0,
       0,   309,   312,   313,     0,   130,     0,     0,     0,     0,
       0,   199,     0,     0,   193,   194,   190,    65,   134,   128,
     263,     0,     0,     0,     0,   124,     0,   291,     0,   124,
     325,   195,   196,   197,   198,     0,     0,     0,   237,     0,
     126,     0,   284,     0,     0,   107,   109,   116,   116,     0,
     116,   116,   292,   315,   192,   200,   201,   129,     0,   243,
     282,     0,   283,     0,   294,   293,     0,     0,     0,   127,
       0,     0,     0,   116,   116,     0,     0,     0,   296,   295,
     289,     0,     0,   288,     0,   285
};

/* YYDEFGOTO[NTERM-NUM].  */
static const yytype_int16 yydefgoto[] =
{
      -1,   268,   269,   270,   295,   312,   162,   163,    79,   552,
     113,    12,    80,    14,    15,    41,    42,    43,    48,    54,
     118,   128,   343,   231,   426,   346,   629,   610,   401,   504,
     589,   450,   505,    81,   164,   137,   154,   138,   139,   110,
     365,   387,   366,   121,    88,   155,    16,    17,    18,    20,
      19,   375,   427,   428,    63,    23,    61,   101,   453,   454,
     129,   170,    55,    96,    56,    49,   456,   388,    83,   390,
     278,   279,    57,    92,    93,   225,   614,   132,   320,   561,
     469,   226,   227,   228,   229
};

/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
   STATE-NUM.  */
#define YYPACT_NINF -560
static const yytype_int16 yypact[] =
{
     590,  -560,  -560,  -560,  -560,  -560,  -560,  -560,     9,  -119,
      23,   -66,    80,   -43,    -1,  -560,   132,   897,  -560,   131,
     219,    16,    43,  -560,    48,   203,  -560,  1564,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,
    -560,    -6,    -6,   230,  -560,  -560,  -560,  -560,    -6,  -560,
    -560,  -560,  -560,  -560,    -6,   211,  -560,   -10,   223,   234,
     246,  -560,  -560,  -560,  -560,  -560,   119,  -560,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,   289,   296,     2,   227,  -560,
    -560,  -560,     3,  -560,   266,   266,   247,  -560,    34,   121,
     121,  -560,  -560,   233,  -560,  -560,  -560,  -560,  -560,  -560,
    -560,    67,  1400,  -560,   146,   151,   830,   119,  -560,     3,
    -102,   171,  1400,   159,    34,    34,  -560,  -560,  1441,  -560,
    -560,  1682,   322,  -560,  -560,  -560,  -560,  -560,  1723,  -560,
     -16,  1902,  -560,   306,  -560,  -560,     3,  -560,   172,   176,
    1741,  1741,   168,  -101,  1741,  -560,   332,   182,  -560,  1682,
    1741,   119,   184,     3,   252,  -560,   102,   335,   339,   340,
     343,   345,   106,   346,  1164,   303,  -560,   213,  -560,  -560,
    -560,  -560,  -560,   302,  1764,    52,   349,   121,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,   591,   440,   591,   440,  1741,
    1741,  1741,  1741,  -560,  -560,  -560,  -560,  -560,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,  1741,  1741,  1741,  1741,  1741,
    1741,  1741,  1741,  1741,  1741,  -560,   121,  -560,    36,  -560,
    -560,   200,  1461,  -560,   -20,   -37,  -560,   198,     3,   215,
    -560,   303,     4,  1441,  -560,  -560,  -560,  -560,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,   591,   440,   591,   440,   217,
     218,   220,   222,   224,  1482,  1782,  1061,   351,   225,   226,
     237,  -560,  -560,  -560,   240,  -560,   119,   742,  -560,   231,
     884,   884,  -560,   884,  1723,  -560,  -560,  -560,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,  1741,  -560,  -560,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,
    -560,  -560,  1741,  1741,  1741,   -21,    24,  -560,   742,   -35,
     238,   241,   249,   254,   255,   256,   742,   742,   742,   366,
    1723,  1741,  1741,   373,  -560,  -560,  -560,  -560,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,  -560,   175,  -560,  -560,  -560,
    -560,   175,  -560,   159,   371,   260,   261,   262,   263,  1682,
    1682,  1682,  1682,  1682,  -560,  -560,    91,  1105,   -96,  -560,
     -69,  -560,  1682,  1682,  1682,   264,  1502,  -560,  -560,  -560,
    -560,  -560,  -560,  -560,  -560,   359,  1682,  -560,  -560,  -560,
    -560,  1741,   265,  -560,   267,   884,   742,   742,   742,   742,
      21,  -560,    40,  -560,  -560,   884,   272,  1741,  1741,  1741,
    1741,  1741,   268,   269,   270,  1741,   884,   742,   276,  -560,
    -560,  -560,  -560,  -560,  -560,  -560,  -560,   264,   264,  1741,
    1682,  1682,  1682,  1682,  -560,   277,   280,   281,   282,  1682,
    -560,   259,  1015,   -62,  -560,  -560,   287,   290,   408,    19,
    -560,  -560,     3,   291,   294,  -560,   428,   -61,  -560,   434,
     435,   299,   297,   301,   304,   305,   884,   452,   884,   307,
     308,   884,   311,     3,  -560,   312,   313,   455,   884,   884,
       3,   309,   319,  1741,  -560,  -560,   -15,   320,   325,   326,
     327,   137,  1682,  1682,  1682,  1682,  -560,  -560,   321,  1682,
    1682,  1741,   438,   482,  -560,   264,   386,  1523,  -560,   334,
    -560,   884,   884,  1805,   884,   884,   884,   884,   319,  -560,
     319,  1741,   884,   336,  1741,  1741,  1741,  -560,  -560,  -560,
    1805,   443,  -560,   742,  -560,  1682,  1682,  1682,  1682,  -560,
     337,   347,   344,   348,  -560,   354,   355,    15,  -560,  -560,
    -560,  -560,  -560,  -560,     3,   -18,   470,   356,   352,     5,
       3,   156,  -560,  -560,  -560,  -560,  -560,  -560,  -560,   341,
     884,  -560,  -560,  -560,   163,   319,   360,   362,   365,   369,
    1682,  -560,  1682,  1682,  -560,  -560,  -560,   386,  -560,   457,
    -560,   497,    -7,   577,   577,  -560,  1846,  -560,   372,  -560,
    -560,  -560,  -560,  -560,  -560,   380,   382,   383,  -560,   517,
     404,   884,  -560,  1307,    -2,   401,   402,  -560,  -560,    82,
       5,     3,  -560,   175,  -560,  -560,  -560,  -560,   540,  -560,
    -560,   406,  -560,  1307,   200,   200,   547,   577,   577,  -560,
     548,   409,   884,  -560,  -560,   884,   551,   496,   200,   200,
    -560,   884,   554,  -560,   884,  -560
};

/* YYPGOTO[NTERM-NUM].  */
static const yytype_int16 yypgoto[] =
{
    -560,   441,   442,   444,  -174,  -167,  -173,  -560,     0,   -13,
    -141,   483,    13,  -560,  -560,  -560,  -560,    30,  -560,  -560,
    -560,  -139,  -560,  -416,  -560,  -238,  -560,  -560,  -311,    22,
    -560,  -406,  -560,  -560,   -26,   350,  -120,  -560,   471,   485,
     -64,  -157,  -251,   100,   194,   363,  -560,  -560,   571,  -560,
    -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,  -560,
     499,  -560,  -560,  -560,  -560,  -560,  -560,  -559,  -115,   162,
    -191,  -560,  -560,   535,  -560,  -560,  -560,  -560,  -560,    63,
     160,  -560,  -560,  -560,  -560
};

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

static const yytype_int16 yycheck[] =
{
       0,    27,   240,   176,    11,   316,     4,   164,   128,    11,
     201,    21,    28,     0,   265,   266,    34,    17,    55,    29,
      55,   427,   428,   197,   165,   216,   217,   218,   219,   220,
      17,   198,    11,   224,    55,    55,   452,   156,   177,   154,
      55,    42,    43,    44,    45,    46,    47,    48,    49,   164,
      51,    11,    78,    34,   613,   157,   157,   121,    55,    55,
      55,   157,    53,    11,   166,   166,    32,    33,   164,    17,
      55,    41,    42,    54,   633,    54,   102,    68,    48,    55,
     106,   255,    59,   257,    54,   149,   112,   226,   157,   256,
     156,   258,   118,    93,    54,   157,   157,   166,    18,   505,
     241,   242,   128,   164,   166,     3,     4,     5,     6,     3,
       4,     5,     6,   156,   140,   141,   367,   154,   144,   154,
      38,   139,   140,   141,   150,   160,   144,   164,    26,    27,
     148,   149,     0,   154,   154,   386,   157,   158,   554,   154,
     155,   332,   162,   559,   560,   151,   152,   153,   174,   165,
     151,   152,   153,   117,   118,   162,   166,   154,   154,   154,
     162,   158,   277,   158,   284,   280,   281,   165,   283,   154,
     155,   482,   156,   199,   200,   201,   202,    46,   154,    48,
     167,   157,   158,    62,    63,    64,    65,    66,    67,   215,
     216,   217,   218,   219,   220,   221,   222,   223,   224,   156,
     391,   617,   618,   318,   620,   621,   232,   518,   160,   520,
     330,   326,   327,   328,   114,   115,   407,   243,   409,   410,
     411,   139,   140,   141,   157,    22,   144,   643,   644,   162,
     148,   149,    21,    20,     7,     8,    23,    10,    11,    12,
      13,    14,    15,    16,    17,    22,    19,    20,   157,    22,
      23,    24,    19,   162,    54,    22,    22,    24,   284,     7,
       8,    42,    43,    44,   575,    35,    47,    37,    22,   295,
     508,    19,    20,   154,    22,    23,    24,    50,    84,    85,
     395,   396,   397,   398,   399,   442,   312,   313,   314,    42,
     405,    44,   155,     4,   157,   359,   360,   361,   362,   363,
       4,   416,   417,    37,   330,   331,   332,   161,   372,   373,
     374,   155,   161,   157,   139,   140,   141,   158,   155,   144,
     157,   121,   122,   148,   149,   154,     4,   442,    22,   157,
     521,   155,   164,   524,   525,   526,     4,   155,   154,   139,
     140,   367,   142,   143,     9,   145,   146,   147,     9,     9,
     376,   466,     9,   468,     9,     9,   471,   595,    55,    57,
      11,   599,   164,   478,   479,   391,   430,   431,   432,   433,
     155,   154,   154,    22,   154,   439,   154,     4,   154,   154,
     154,   407,   408,   409,   410,   411,   159,   160,   157,   415,
     163,   154,   165,   166,   154,   157,   511,   512,   157,   514,
     515,   516,   517,   429,    38,    19,   157,   522,    22,    38,
      24,   157,   157,   157,   154,   154,   154,   154,   533,   592,
      61,   157,   157,   164,   157,   157,   157,   157,   492,   493,
     494,   495,   160,   157,   157,   499,   500,   157,   157,   157,
      54,   614,   280,   281,   157,   283,    38,   157,   157,   155,
      22,    17,    17,   154,   157,   570,     4,   483,   157,     4,
      22,   157,   157,   154,   157,   157,    26,    27,   157,   157,
     157,   535,   536,   537,   538,   501,   157,   157,   593,   594,
     318,   507,   157,   157,   157,   164,     4,   513,   326,   327,
     328,   157,    22,   157,   157,   521,   611,    54,   524,   525,
     526,   157,   155,   162,   530,   157,   506,   121,   122,   155,
     155,    54,   160,   157,    17,   155,   580,   155,   582,   583,
     155,     4,   637,   638,   155,   139,   140,   642,   142,   143,
     645,   145,   146,   147,   162,   155,   651,   155,   155,   654,
     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
     110,   111,   112,   113,   150,   154,   154,   395,   396,   397,
     398,   399,    22,   157,    17,    17,   157,   405,    17,    73,
     596,    17,   131,   131,   587,   131,    93,   555,   416,   417,
       3,     4,   232,   112,     7,     8,     9,   587,    17,    90,
       0,   106,    57,   530,   434,    -1,    19,    20,    -1,    22,
      23,    24,    25,    26,    27,    -1,   243,    -1,    18,    19,
      20,    -1,    22,    23,    24,    -1,    -1,    40,    41,    -1,
      30,    31,    -1,    -1,    -1,    -1,    -1,    -1,   466,    -1,
     468,    54,    -1,   471,    -1,    -1,    59,    -1,    -1,    -1,
     478,   479,    52,    -1,    -1,    -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,    -1,   511,   512,    -1,   514,   515,   516,   517,
      -1,    -1,    -1,    -1,   522,    94,    95,    96,    97,    98,
      99,   100,   101,   102,   103,   533,   119,   120,   121,   122,
     123,   124,   125,   126,   127,   128,   129,   130,   131,    -1,
     133,    -1,   135,   136,   137,    -1,   139,   140,    -1,   142,
     143,    -1,   145,   146,   147,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   570,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     163,    -1,    -1,    -1,    -1,     3,     4,    -1,    -1,     7,
       8,     9,    -1,    -1,    -1,   593,   594,    -1,    -1,    -1,
      -1,    19,    20,    -1,    22,    23,    24,    25,    26,    27,
      -1,    -1,    -1,   611,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    40,    41,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    -1,   637,
     638,    59,    -1,    -1,   642,    -1,    -1,   645,    -1,    -1,
      -1,    -1,    -1,   651,    -1,    -1,   654,    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,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,    -1,
      -1,     7,     8,     9,    -1,    -1,   154,     0,    -1,    -1,
      -1,    -1,    -1,    19,    20,   163,    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,    -1,
      -1,    -1,    -1,    59,    -1,    -1,    -1,    -1,    -1,    52,
      -1,    -1,    -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,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   159,
     160,    -1,    -1,   163,    -1,   165,   166,    -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,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    19,    20,    -1,    22,    23,    24,
      25,    -1,    -1,    -1,    -1,    -1,    -1,   163,    -1,    -1,
      -1,    -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,     7,     8,    -1,    10,    11,    12,    13,    14,
      15,    16,    17,    -1,    19,    20,    -1,    22,    23,    24,
      -1,    -1,    -1,    -1,   119,   120,   121,   122,   123,   124,
     125,   126,   127,   128,   129,   130,   131,    -1,   133,    -1,
     135,   136,   137,    -1,    -1,    50,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   154,
      -1,     7,     8,   158,    -1,   160,    -1,    -1,   163,    -1,
     165,    -1,   167,    19,    20,    -1,    22,    23,    24,    25,
      -1,    -1,    -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,    55,
     159,   160,    -1,    -1,   163,    -1,   165,   166,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -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,
      -1,    -1,    -1,    -1,   159,   160,    -1,    -1,   163,    -1,
     165,   166,    -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,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       3,     4,    -1,    -1,    -1,    -1,     9,    -1,   154,    -1,
      -1,    -1,    -1,    -1,   160,    -1,    -1,   163,    -1,   165,
      -1,   167,    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,    -1,    -1,    -1,    -1,    -1,    -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,    -1,    -1,    -1,    -1,     7,     8,    -1,
      10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
      20,    -1,    22,    23,    24,    -1,   119,   120,   121,   122,
     123,   124,   125,   126,   127,   128,   129,   130,   131,    39,
     133,    -1,   135,   136,   137,    -1,    -1,    -1,     7,     8,
      50,    10,    11,    12,    13,    14,    15,    16,    17,    -1,
      19,    20,    -1,    22,    23,    24,    -1,    -1,     7,     8,
     163,    10,    11,    12,    13,    14,    15,    16,    17,    -1,
      19,    20,    -1,    22,    23,    24,    -1,    -1,    -1,     7,
       8,    50,    10,    11,    12,    13,    14,    15,    16,    17,
      39,    19,    20,    -1,    22,    23,    24,    -1,    -1,     7,
       8,    50,    10,    11,    12,    13,    14,    15,    16,    17,
      -1,    19,    20,    -1,    22,    23,    24,    -1,    -1,    -1,
       7,     8,    50,    10,    11,    12,    13,    14,    15,    16,
      17,    39,    19,    20,    -1,    22,    23,    24,    -1,    -1,
      -1,    -1,    50,    -1,    -1,    -1,    -1,    -1,    -1,   159,
     160,    -1,    39,   163,    -1,   165,   125,    -1,    -1,    -1,
      -1,     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,    -1,    -1,    -1,    -1,
     159,   160,    -1,    -1,   163,    -1,   165,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    50,    -1,    -1,    -1,    -1,    -1,
     159,   160,    -1,    -1,   163,    -1,   165,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   159,   160,    -1,   162,   163,    -1,   165,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   159,   160,    -1,    -1,   163,    -1,   165,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   159,   160,    -1,    -1,   163,    -1,   165,     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,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   159,   160,    -1,    -1,   163,    -1,   165,
       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,     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,     7,     8,    50,    10,    11,    12,    13,    14,
      15,    16,    17,    -1,    19,    20,    -1,    22,    23,    24,
      -1,    -1,    50,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   159,   160,    -1,    -1,   163,    -1,   165,    -1,    -1,
      -1,    -1,    -1,     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,    -1,    -1,
      -1,    -1,   159,   160,    -1,    -1,   163,    -1,   165,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    -1,    -1,
     159,   160,    -1,    -1,   163,    -1,   165,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   159,   160,    -1,    -1,   163,    -1,   165,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,
      -1,   159,   160,    -1,    -1,   163,    -1,   165,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    57,
      58,    -1,    -1,    -1,   159,   160,    -1,    -1,   163,    -1,
     165,    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,   159,   160,    -1,    -1,   163,
      -1,   165,    -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
};

/* 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,   176,   179,   180,   181,   182,   214,   215,   216,   218,
     217,    53,    68,   223,   156,    59,   156,    18,   156,    42,
      43,    44,    45,    46,    47,    48,    49,    51,   151,   152,
     153,   183,   184,   185,     0,   216,    46,    48,   186,   233,
      42,    43,    44,    47,   187,   230,   232,   240,   156,   156,
     160,   224,    22,   222,     7,     8,    10,    11,    12,    13,
      14,    15,    16,    17,    50,   159,   160,   163,   165,   176,
     180,   201,   202,   236,   185,   185,    35,    37,   212,   185,
     185,    21,   241,   242,    29,   166,   231,   241,    22,    22,
      22,   225,   154,     4,     4,     4,   165,    10,   166,   202,
     207,    55,   154,   178,   212,   212,    42,    44,   188,    32,
      33,   211,    62,    63,    64,    65,    66,    67,   189,   228,
     228,   179,   245,   157,   162,    39,   202,   203,   205,   206,
     161,   161,   166,   207,   157,   166,   154,   206,   158,   211,
     211,    10,   125,   202,   204,   213,    11,    12,    13,    14,
      15,    16,   174,   175,   202,   208,     4,   204,    28,   165,
     229,    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,   169,   170,   171,   243,   249,   250,   251,   252,
      22,   191,   157,   155,   202,   202,   164,   166,   202,     4,
     155,   208,   202,   154,   236,    26,    27,     3,     4,     5,
       6,     9,    25,    40,    41,    90,    91,    92,    93,   119,
     133,   135,   136,   137,   160,   163,   165,   167,   169,   170,
     171,   209,   236,   178,   180,    57,    10,   202,   238,   239,
      11,    17,    11,   174,   189,    94,    95,    96,    97,    98,
      99,   100,   101,   102,   103,   172,    26,    27,   100,   101,
     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
     112,   113,   173,   172,   173,   202,   202,   238,   202,   202,
     246,   238,   238,   238,   238,   238,   202,   202,   202,   238,
     189,   117,   118,    54,   121,   122,   139,   140,   142,   143,
     145,   146,   147,   190,    39,   203,   193,   162,   164,   164,
     155,   193,   178,   178,   213,   172,   173,   172,   173,   154,
     154,   154,   154,   154,   162,   208,   210,   165,   210,   166,
     210,    22,   154,   154,   154,   219,   154,     3,     4,     9,
      25,    26,    27,    40,    41,    59,   163,   209,   235,   236,
     237,   157,   237,   237,   237,   204,   202,   202,   202,   202,
     157,   196,   157,   196,   237,   160,   157,   157,   157,   157,
     157,   157,   237,   237,   237,    38,   204,   202,   238,     4,
     139,   140,   141,   144,   148,   149,   192,   220,   221,    38,
     154,   154,   154,   154,   208,   208,   208,   208,   208,   157,
     162,   166,   202,   210,   164,   166,   208,   208,   208,   157,
     199,    39,   202,   226,   227,    61,   234,   210,   238,   157,
     157,   237,   237,   237,   237,   237,    11,    54,    11,   248,
     237,   160,   238,   202,   238,   238,   238,   157,   157,   157,
     202,   237,   237,   157,   199,   199,   202,   208,   208,   208,
     208,   248,   157,   157,   157,   157,   208,   164,   166,   157,
     157,    38,    34,    54,   197,   200,   191,   157,   155,    22,
     164,    17,    17,   154,   157,   157,   157,   157,   237,     4,
     237,   157,   157,   237,   157,   157,   157,     4,   237,   237,
     154,   157,   196,   202,   155,   157,   157,   157,   157,   155,
     208,   208,   208,   208,   164,   208,   208,   202,    22,     4,
     199,   176,   177,    39,   202,   193,   157,   237,   237,    17,
     202,   247,   237,   237,   237,   237,   196,   196,   238,   237,
     157,   238,   238,   238,   247,   237,   208,   208,   208,   208,
     157,   155,   157,   157,   155,   155,   155,   191,   197,   198,
      22,   157,   160,   191,   191,   155,   157,   162,   237,   155,
     196,   155,   155,   155,   155,   208,   208,   208,   177,    54,
     195,    17,   162,   174,   244,   121,   122,   237,   237,   193,
      17,   202,   162,   193,   155,   155,   155,     4,   150,   194,
     237,   235,   162,   174,   191,   191,    38,   191,   191,    22,
     157,   235,    17,   237,   237,    17,   157,   237,   191,   191,
     237,    17,    73,   237,    17,   237
};

#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 1117 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_EQ; ;}
    break;

  case 30:
#line 1117 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_NE; ;}
    break;

  case 31:
#line 1118 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_SLT; ;}
    break;

  case 32:
#line 1118 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_SGT; ;}
    break;

  case 33:
#line 1119 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_SLE; ;}
    break;

  case 34:
#line 1119 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_SGE; ;}
    break;

  case 35:
#line 1120 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_ULT; ;}
    break;

  case 36:
#line 1120 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_UGT; ;}
    break;

  case 37:
#line 1121 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_ULE; ;}
    break;

  case 38:
#line 1121 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.IPredicate) = ICmpInst::ICMP_UGE; ;}
    break;

  case 39:
#line 1125 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OEQ; ;}
    break;

  case 40:
#line 1125 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_ONE; ;}
    break;

  case 41:
#line 1126 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OLT; ;}
    break;

  case 42:
#line 1126 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OGT; ;}
    break;

  case 43:
#line 1127 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OLE; ;}
    break;

  case 44:
#line 1127 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_OGE; ;}
    break;

  case 45:
#line 1128 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_ORD; ;}
    break;

  case 46:
#line 1128 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UNO; ;}
    break;

  case 47:
#line 1129 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UEQ; ;}
    break;

  case 48:
#line 1129 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UNE; ;}
    break;

  case 49:
#line 1130 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_ULT; ;}
    break;

  case 50:
#line 1130 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UGT; ;}
    break;

  case 51:
#line 1131 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_ULE; ;}
    break;

  case 52:
#line 1131 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_UGE; ;}
    break;

  case 53:
#line 1132 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_TRUE; ;}
    break;

  case 54:
#line 1133 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.FPredicate) = FCmpInst::FCMP_FALSE; ;}
    break;

  case 65:
#line 1142 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = 0; ;}
    break;

  case 66:
#line 1144 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal)=(yyvsp[(3) - (4)].UInt64Val); ;}
    break;

  case 67:
#line 1145 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal)=0; ;}
    break;

  case 68:
#line 1149 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = (yyvsp[(1) - (2)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 69:
#line 1153 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 73:
#line 1161 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 74:
#line 1166 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = (yyvsp[(1) - (2)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 75:
#line 1172 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
    break;

  case 76:
#line 1173 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
    break;

  case 77:
#line 1174 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
    break;

  case 78:
#line 1175 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
    break;

  case 79:
#line 1176 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
    break;

  case 80:
#line 1177 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::CommonLinkage; ;}
    break;

  case 81:
#line 1181 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
    break;

  case 82:
#line 1182 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
    break;

  case 83:
#line 1183 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 84:
#line 1187 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Visibility) = GlobalValue::DefaultVisibility;   ;}
    break;

  case 85:
#line 1188 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Visibility) = GlobalValue::DefaultVisibility;   ;}
    break;

  case 86:
#line 1189 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Visibility) = GlobalValue::HiddenVisibility;    ;}
    break;

  case 87:
#line 1190 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Visibility) = GlobalValue::ProtectedVisibility; ;}
    break;

  case 88:
#line 1194 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 89:
#line 1195 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
    break;

  case 90:
#line 1196 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
    break;

  case 91:
#line 1200 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 92:
#line 1201 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
    break;

  case 93:
#line 1202 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
    break;

  case 94:
#line 1203 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
    break;

  case 95:
#line 1204 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
    break;

  case 96:
#line 1208 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 97:
#line 1209 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
    break;

  case 98:
#line 1210 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
    break;

  case 99:
#line 1213 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::C; ;}
    break;

  case 100:
#line 1214 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::C; ;}
    break;

  case 101:
#line 1215 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::Fast; ;}
    break;

  case 102:
#line 1216 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::Cold; ;}
    break;

  case 103:
#line 1217 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::X86_StdCall; ;}
    break;

  case 104:
#line 1218 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::X86_FastCall; ;}
    break;

  case 105:
#line 1219 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1226 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ZExt;      ;}
    break;

  case 107:
#line 1227 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ZExt;      ;}
    break;

  case 108:
#line 1228 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::SExt;      ;}
    break;

  case 109:
#line 1229 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::SExt;      ;}
    break;

  case 110:
#line 1230 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::InReg;     ;}
    break;

  case 111:
#line 1231 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::StructRet; ;}
    break;

  case 112:
#line 1232 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::NoAlias;   ;}
    break;

  case 113:
#line 1233 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ByVal;     ;}
    break;

  case 114:
#line 1234 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::Nest;      ;}
    break;

  case 115:
#line 1235 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = 
                          ParamAttr::constructAlignmentFromInt((yyvsp[(2) - (2)].UInt64Val));    ;}
    break;

  case 116:
#line 1239 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::None; ;}
    break;

  case 117:
#line 1240 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
                (yyval.ParamAttrs) = (yyvsp[(1) - (2)].ParamAttrs) | (yyvsp[(2) - (2)].ParamAttrs);
              ;}
    break;

  case 118:
#line 1245 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::NoReturn; ;}
    break;

  case 119:
#line 1246 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::NoUnwind; ;}
    break;

  case 120:
#line 1247 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ZExt;     ;}
    break;

  case 121:
#line 1248 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::SExt;     ;}
    break;

  case 122:
#line 1249 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ReadNone; ;}
    break;

  case 123:
#line 1250 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::ReadOnly; ;}
    break;

  case 124:
#line 1253 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamAttrs) = ParamAttr::None; ;}
    break;

  case 125:
#line 1254 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
                (yyval.ParamAttrs) = (yyvsp[(1) - (2)].ParamAttrs) | (yyvsp[(2) - (2)].ParamAttrs);
              ;}
    break;

  case 126:
#line 1259 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = 0; ;}
    break;

  case 127:
#line 1260 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
                (yyval.StrVal) = (yyvsp[(2) - (2)].StrVal);
              ;}
    break;

  case 128:
#line 1267 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = 0; ;}
    break;

  case 129:
#line 1268 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1274 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = 0; ;}
    break;

  case 131:
#line 1275 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1284 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1292 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = 0; ;}
    break;

  case 134:
#line 1293 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = (yyvsp[(1) - (1)].StrVal); ;}
    break;

  case 135:
#line 1298 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {;}
    break;

  case 136:
#line 1299 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {;}
    break;

  case 137:
#line 1300 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV->setSection(*(yyvsp[(1) - (1)].StrVal));
    delete (yyvsp[(1) - (1)].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 138:
#line 1305 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1321 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeVal) = new PATypeHolder(OpaqueType::get());
    CHECK_FOR_ERROR
  ;}
    break;

  case 147:
#line 1325 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeVal) = new PATypeHolder((yyvsp[(1) - (1)].PrimType));
    CHECK_FOR_ERROR
  ;}
    break;

  case 148:
#line 1329 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1336 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1341 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1349 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1378 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1403 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {          // Sized array type?
    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[(4) - (5)].TypeVal), (unsigned)(yyvsp[(2) - (5)].UInt64Val))));
    delete (yyvsp[(4) - (5)].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 154:
#line 1408 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1418 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1428 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {                                  // Empty structure type?
    (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector<const Type*>()));
    CHECK_FOR_ERROR
  ;}
    break;

  case 157:
#line 1432 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1442 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1449 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1458 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1465 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeVal) = new PATypeHolder(Type::VoidTy);
  ;}
    break;

  case 162:
#line 1470 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeWithAttrsList) = new TypeWithAttrsList();
    (yyval.TypeWithAttrsList)->push_back((yyvsp[(1) - (1)].TypeWithAttrs));
    CHECK_FOR_ERROR
  ;}
    break;

  case 163:
#line 1475 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.TypeWithAttrsList)=(yyvsp[(1) - (3)].TypeWithAttrsList))->push_back((yyvsp[(3) - (3)].TypeWithAttrs));
    CHECK_FOR_ERROR
  ;}
    break;

  case 165:
#line 1483 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1490 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1497 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeWithAttrsList) = new TypeWithAttrsList();
    CHECK_FOR_ERROR
  ;}
    break;

  case 168:
#line 1505 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1511 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1523 "/Users/malichus/Source/LLVM/src/svn/llvm/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();
    int NumElements = ATy->getNumElements();

    // Verify that we have the correct size...
    if (NumElements != -1 && NumElements != (int)(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 " + 
                     itostr(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 1551 "/Users/malichus/Source/LLVM/src/svn/llvm/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() + "'");

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

  case 172:
#line 1567 "/Users/malichus/Source/LLVM/src/svn/llvm/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() + "'");

    int NumElements = ATy->getNumElements();
    const Type *ETy = ATy->getElementType();
    if (NumElements != -1 && NumElements != int((yyvsp[(3) - (3)].StrVal)->length()))
      GEN_ERROR("Can't build string constant of size " + 
                     itostr((int)((yyvsp[(3) - (3)].StrVal)->length())) +
                     " when array has size " + itostr(NumElements) + "");
    std::vector<Constant*> Vals;
    if (ETy == Type::Int8Ty) {
      for (unsigned 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 1594 "/Users/malichus/Source/LLVM/src/svn/llvm/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();
    int NumElements = PTy->getNumElements();

    // Verify that we have the correct size...
    if (NumElements != -1 && NumElements != (int)(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 " + 
                     itostr(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 1622 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1648 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1668 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1694 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1714 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1726 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1733 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1799 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1809 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1819 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1825 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1835 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1841 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1851 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {                      // Boolean constants
    assert(cast<IntegerType>((yyvsp[(1) - (2)].PrimType))->getBitWidth() == 1 && "Not Bool?");
    (yyval.ConstVal) = ConstantInt::getTrue();
    CHECK_FOR_ERROR
  ;}
    break;

  case 188:
#line 1856 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {                     // Boolean constants
    assert(cast<IntegerType>((yyvsp[(1) - (2)].PrimType))->getBitWidth() == 1 && "Not Bool?");
    (yyval.ConstVal) = ConstantInt::getFalse();
    CHECK_FOR_ERROR
  ;}
    break;

  case 189:
#line 1861 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1874 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1886 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1907 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1915 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1921 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1932 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1937 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1942 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1947 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1952 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1958 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1964 "/Users/malichus/Source/LLVM/src/svn/llvm/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 1973 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.ConstVector) = (yyvsp[(1) - (3)].ConstVector))->push_back((yyvsp[(3) - (3)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 203:
#line 1977 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ConstVector) = new std::vector<Constant*>();
    (yyval.ConstVector)->push_back((yyvsp[(1) - (1)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 204:
#line 1985 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = false; ;}
    break;

  case 205:
#line 1985 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = true; ;}
    break;

  case 206:
#line 1988 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = true; ;}
    break;

  case 207:
#line 1988 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = false; ;}
    break;

  case 208:
#line 1991 "/Users/malichus/Source/LLVM/src/svn/llvm/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 209:
#line 2003 "/Users/malichus/Source/LLVM/src/svn/llvm/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 210:
#line 2024 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule;
    CurModule.ModuleDone();
    CHECK_FOR_ERROR;
  ;}
    break;

  case 211:
#line 2029 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule;
    CurModule.ModuleDone();
    CHECK_FOR_ERROR;
  ;}
    break;

  case 214:
#line 2042 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { CurFun.isDeclare = false; ;}
    break;

  case 215:
#line 2042 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CurFun.FunctionDone();
    CHECK_FOR_ERROR
  ;}
    break;

  case 216:
#line 2046 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { CurFun.isDeclare = true; ;}
    break;

  case 217:
#line 2046 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CHECK_FOR_ERROR
  ;}
    break;

  case 218:
#line 2049 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CHECK_FOR_ERROR
  ;}
    break;

  case 219:
#line 2052 "/Users/malichus/Source/LLVM/src/svn/llvm/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 220:
#line 2076 "/Users/malichus/Source/LLVM/src/svn/llvm/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 221:
#line 2088 "/Users/malichus/Source/LLVM/src/svn/llvm/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 222:
#line 2095 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
  ;}
    break;

  case 223:
#line 2099 "/Users/malichus/Source/LLVM/src/svn/llvm/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 224:
#line 2104 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
  ;}
    break;

  case 225:
#line 2108 "/Users/malichus/Source/LLVM/src/svn/llvm/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 226:
#line 2114 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 227:
#line 2118 "/Users/malichus/Source/LLVM/src/svn/llvm/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 228:
#line 2158 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { 
    CHECK_FOR_ERROR
  ;}
    break;

  case 229:
#line 2161 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CHECK_FOR_ERROR
  ;}
    break;

  case 230:
#line 2167 "/Users/malichus/Source/LLVM/src/svn/llvm/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 231:
#line 2177 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CurModule.CurrentModule->setTargetTriple(*(yyvsp[(3) - (3)].StrVal));
    delete (yyvsp[(3) - (3)].StrVal);
  ;}
    break;

  case 232:
#line 2181 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    CurModule.CurrentModule->setDataLayout(*(yyvsp[(3) - (3)].StrVal));
    delete (yyvsp[(3) - (3)].StrVal);
  ;}
    break;

  case 234:
#line 2188 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
          CurModule.CurrentModule->addLibrary(*(yyvsp[(3) - (3)].StrVal));
          delete (yyvsp[(3) - (3)].StrVal);
          CHECK_FOR_ERROR
        ;}
    break;

  case 235:
#line 2193 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
          CurModule.CurrentModule->addLibrary(*(yyvsp[(1) - (1)].StrVal));
          delete (yyvsp[(1) - (1)].StrVal);
          CHECK_FOR_ERROR
        ;}
    break;

  case 236:
#line 2198 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
          CHECK_FOR_ERROR
        ;}
    break;

  case 237:
#line 2207 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(3) - (5)].TypeVal))->getDescription());
    if (*(yyvsp[(3) - (5)].TypeVal) == Type::VoidTy)
      GEN_ERROR("void typed arguments are invalid");
    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 238:
#line 2217 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (3)].TypeVal))->getDescription());
    if (*(yyvsp[(1) - (3)].TypeVal) == Type::VoidTy)
      GEN_ERROR("void typed arguments are invalid");
    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 239:
#line 2228 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = (yyvsp[(1) - (1)].ArgList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 240:
#line 2232 "/Users/malichus/Source/LLVM/src/svn/llvm/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 241:
#line 2241 "/Users/malichus/Source/LLVM/src/svn/llvm/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 242:
#line 2250 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 243:
#line 2256 "/Users/malichus/Source/LLVM/src/svn/llvm/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 246:
#line 2386 "/Users/malichus/Source/LLVM/src/svn/llvm/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 249:
#line 2397 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
  CHECK_FOR_ERROR
;}
    break;

  case 250:
#line 2402 "/Users/malichus/Source/LLVM/src/svn/llvm/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 251:
#line 2414 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 252:
#line 2418 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 253:
#line 2423 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {    // A reference to a direct constant
    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].SInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 254:
#line 2427 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].UInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 255:
#line 2431 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {                     // Perhaps it's an FP constant?
    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].FPVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 256:
#line 2435 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create(ConstantInt::getTrue());
    CHECK_FOR_ERROR
  ;}
    break;

  case 257:
#line 2439 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create(ConstantInt::getFalse());
    CHECK_FOR_ERROR
  ;}
    break;

  case 258:
#line 2443 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createNull();
    CHECK_FOR_ERROR
  ;}
    break;

  case 259:
#line 2447 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createUndef();
    CHECK_FOR_ERROR
  ;}
    break;

  case 260:
#line 2451 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {     // A vector zero constant.
    (yyval.ValIDVal) = ValID::createZeroInit();
    CHECK_FOR_ERROR
  ;}
    break;

  case 261:
#line 2455 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { // Nonempty unsized packed vector
    const Type *ETy = (*(yyvsp[(2) - (3)].ConstVector))[0]->getType();
    int NumElements = (yyvsp[(2) - (3)].ConstVector)->size(); 
    
    VectorType* pt = VectorType::get(ETy, NumElements);
    PATypeHolder* PTy = new PATypeHolder(
                                         HandleUpRefs(
                                            VectorType::get(
                                                ETy, 
                                                NumElements)
                                            )
                                         );
    
    // 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 262:
#line 2480 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 263:
#line 2484 "/Users/malichus/Source/LLVM/src/svn/llvm/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 264:
#line 2494 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {  // Is it an integer reference...?
    (yyval.ValIDVal) = ValID::createLocalID((yyvsp[(1) - (1)].UIntVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 265:
#line 2498 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createGlobalID((yyvsp[(1) - (1)].UIntVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 266:
#line 2502 "/Users/malichus/Source/LLVM/src/svn/llvm/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 267:
#line 2507 "/Users/malichus/Source/LLVM/src/svn/llvm/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 270:
#line 2520 "/Users/malichus/Source/LLVM/src/svn/llvm/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 271:
#line 2529 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValueList) = new std::vector<Value *>();
    (yyval.ValueList)->push_back((yyvsp[(1) - (1)].ValueVal)); 
    CHECK_FOR_ERROR
  ;}
    break;

  case 272:
#line 2534 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.ValueList)=(yyvsp[(1) - (3)].ValueList))->push_back((yyvsp[(3) - (3)].ValueVal)); 
    CHECK_FOR_ERROR
  ;}
    break;

  case 273:
#line 2539 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 274:
#line 2543 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { // Do not allow functions with 0 basic blocks   
    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 275:
#line 2552 "/Users/malichus/Source/LLVM/src/svn/llvm/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 276:
#line 2561 "/Users/malichus/Source/LLVM/src/svn/llvm/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 277:
#line 2570 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {          // Empty space between instruction lists
    (yyval.BasicBlockVal) = defineBBVal(ValID::createLocalID(CurFun.NextValNum));
    CHECK_FOR_ERROR
  ;}
    break;

  case 278:
#line 2574 "/Users/malichus/Source/LLVM/src/svn/llvm/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 279:
#line 2582 "/Users/malichus/Source/LLVM/src/svn/llvm/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 280:
#line 2589 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {                                    // Return with no result...
    (yyval.TermInstVal) = ReturnInst::Create();
    CHECK_FOR_ERROR
  ;}
    break;

  case 281:
#line 2593 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {                           // Unconditional Branch...
    BasicBlock* tmpBB = getBBVal((yyvsp[(3) - (3)].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.TermInstVal) = BranchInst::Create(tmpBB);
  ;}
    break;

  case 282:
#line 2598 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {  
    assert(cast<IntegerType>((yyvsp[(2) - (9)].PrimType))->getBitWidth() == 1 && "Not Bool?");
    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 283:
#line 2608 "/Users/malichus/Source/LLVM/src/svn/llvm/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 284:
#line 2627 "/Users/malichus/Source/LLVM/src/svn/llvm/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 285:
#line 2637 "/Users/malichus/Source/LLVM/src/svn/llvm/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 286:
#line 2722 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TermInstVal) = new UnwindInst();
    CHECK_FOR_ERROR
  ;}
    break;

  case 287:
#line 2726 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TermInstVal) = new UnreachableInst();
    CHECK_FOR_ERROR
  ;}
    break;

  case 288:
#line 2733 "/Users/malichus/Source/LLVM/src/svn/llvm/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 289:
#line 2744 "/Users/malichus/Source/LLVM/src/svn/llvm/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 290:
#line 2757 "/Users/malichus/Source/LLVM/src/svn/llvm/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 291:
#line 2767 "/Users/malichus/Source/LLVM/src/svn/llvm/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 292:
#line 2778 "/Users/malichus/Source/LLVM/src/svn/llvm/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 293:
#line 2788 "/Users/malichus/Source/LLVM/src/svn/llvm/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 294:
#line 2799 "/Users/malichus/Source/LLVM/src/svn/llvm/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 295:
#line 2807 "/Users/malichus/Source/LLVM/src/svn/llvm/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 296:
#line 2817 "/Users/malichus/Source/LLVM/src/svn/llvm/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 297:
#line 2824 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ParamList) = new ParamList(); ;}
    break;

  case 298:
#line 2827 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ValueList) = new std::vector<Value*>(); ;}
    break;

  case 299:
#line 2828 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValueList) = (yyvsp[(1) - (3)].ValueList);
    (yyval.ValueList)->push_back((yyvsp[(3) - (3)].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 300:
#line 2835 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 301:
#line 2839 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 302:
#line 2844 "/Users/malichus/Source/LLVM/src/svn/llvm/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 303:
#line 2860 "/Users/malichus/Source/LLVM/src/svn/llvm/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 304:
#line 2877 "/Users/malichus/Source/LLVM/src/svn/llvm/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 305:
#line 2891 "/Users/malichus/Source/LLVM/src/svn/llvm/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 306:
#line 2905 "/Users/malichus/Source/LLVM/src/svn/llvm/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 307:
#line 2919 "/Users/malichus/Source/LLVM/src/svn/llvm/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 308:
#line 2933 "/Users/malichus/Source/LLVM/src/svn/llvm/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 309:
#line 2945 "/Users/malichus/Source/LLVM/src/svn/llvm/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 310:
#line 2953 "/Users/malichus/Source/LLVM/src/svn/llvm/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 311:
#line 2960 "/Users/malichus/Source/LLVM/src/svn/llvm/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 312:
#line 2966 "/Users/malichus/Source/LLVM/src/svn/llvm/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 313:
#line 2972 "/Users/malichus/Source/LLVM/src/svn/llvm/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 314:
#line 2978 "/Users/malichus/Source/LLVM/src/svn/llvm/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 315:
#line 2994 "/Users/malichus/Source/LLVM/src/svn/llvm/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 316:
#line 3083 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.InstVal) = (yyvsp[(1) - (1)].InstVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 317:
#line 3088 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 318:
#line 3092 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 319:
#line 3099 "/Users/malichus/Source/LLVM/src/svn/llvm/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 320:
#line 3106 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (6)].TypeVal))->getDescription());
    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 321:
#line 3114 "/Users/malichus/Source/LLVM/src/svn/llvm/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 322:
#line 3121 "/Users/malichus/Source/LLVM/src/svn/llvm/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(2) - (6)].TypeVal))->getDescription());
    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 323:
#line 3129 "/Users/malichus/Source/LLVM/src/svn/llvm/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 324:
#line 3137 "/Users/malichus/Source/LLVM/src/svn/llvm/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 325:
#line 3151 "/Users/malichus/Source/LLVM/src/svn/llvm/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 326:
#line 3168 "/Users/malichus/Source/LLVM/src/svn/llvm/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 327:
#line 3176 "/Users/malichus/Source/LLVM/src/svn/llvm/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;


/* Line 1267 of yacc.c.  */
#line 6479 "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 3193 "/Users/malichus/Source/LLVM/src/svn/llvm/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;
}

