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

/* Skeleton parser for Yacc-like parsing with Bison,
   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   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, when this file is copied by Bison into a
   Bison output file, you may use that output file without restriction.
   This special exception was added by the Free Software Foundation
   in version 1.24 of Bison.  */

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

/* 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,
     SINTVAL = 260,
     UINTVAL = 261,
     FPVAL = 262,
     VOID = 263,
     BOOL = 264,
     SBYTE = 265,
     UBYTE = 266,
     SHORT = 267,
     USHORT = 268,
     INT = 269,
     UINT = 270,
     LONG = 271,
     ULONG = 272,
     FLOAT = 273,
     DOUBLE = 274,
     TYPE = 275,
     LABEL = 276,
     VAR_ID = 277,
     LABELSTR = 278,
     STRINGCONSTANT = 279,
     IMPLEMENTATION = 280,
     ZEROINITIALIZER = 281,
     TRUETOK = 282,
     FALSETOK = 283,
     BEGINTOK = 284,
     ENDTOK = 285,
     DECLARE = 286,
     GLOBAL = 287,
     CONSTANT = 288,
     SECTION = 289,
     VOLATILE = 290,
     TO = 291,
     DOTDOTDOT = 292,
     NULL_TOK = 293,
     UNDEF = 294,
     CONST = 295,
     INTERNAL = 296,
     LINKONCE = 297,
     WEAK = 298,
     APPENDING = 299,
     DLLIMPORT = 300,
     DLLEXPORT = 301,
     EXTERN_WEAK = 302,
     OPAQUE = 303,
     NOT = 304,
     EXTERNAL = 305,
     TARGET = 306,
     TRIPLE = 307,
     ENDIAN = 308,
     POINTERSIZE = 309,
     LITTLE = 310,
     BIG = 311,
     ALIGN = 312,
     DEPLIBS = 313,
     CALL = 314,
     TAIL = 315,
     ASM_TOK = 316,
     MODULE = 317,
     SIDEEFFECT = 318,
     CC_TOK = 319,
     CCC_TOK = 320,
     CSRETCC_TOK = 321,
     FASTCC_TOK = 322,
     COLDCC_TOK = 323,
     X86_STDCALLCC_TOK = 324,
     X86_FASTCALLCC_TOK = 325,
     DATALAYOUT = 326,
     RET = 327,
     BR = 328,
     SWITCH = 329,
     INVOKE = 330,
     UNWIND = 331,
     UNREACHABLE = 332,
     ADD = 333,
     SUB = 334,
     MUL = 335,
     UDIV = 336,
     SDIV = 337,
     FDIV = 338,
     UREM = 339,
     SREM = 340,
     FREM = 341,
     AND = 342,
     OR = 343,
     XOR = 344,
     SETLE = 345,
     SETGE = 346,
     SETLT = 347,
     SETGT = 348,
     SETEQ = 349,
     SETNE = 350,
     MALLOC = 351,
     ALLOCA = 352,
     FREE = 353,
     LOAD = 354,
     STORE = 355,
     GETELEMENTPTR = 356,
     TRUNC = 357,
     ZEXT = 358,
     SEXT = 359,
     FPTRUNC = 360,
     FPEXT = 361,
     BITCAST = 362,
     UITOFP = 363,
     SITOFP = 364,
     FPTOUI = 365,
     FPTOSI = 366,
     INTTOPTR = 367,
     PTRTOINT = 368,
     PHI_TOK = 369,
     SELECT = 370,
     SHL = 371,
     LSHR = 372,
     ASHR = 373,
     VAARG = 374,
     EXTRACTELEMENT = 375,
     INSERTELEMENT = 376,
     SHUFFLEVECTOR = 377,
     VAARG_old = 378,
     VANEXT_old = 379
   };
#endif
/* Tokens.  */
#define ESINT64VAL 258
#define EUINT64VAL 259
#define SINTVAL 260
#define UINTVAL 261
#define FPVAL 262
#define VOID 263
#define BOOL 264
#define SBYTE 265
#define UBYTE 266
#define SHORT 267
#define USHORT 268
#define INT 269
#define UINT 270
#define LONG 271
#define ULONG 272
#define FLOAT 273
#define DOUBLE 274
#define TYPE 275
#define LABEL 276
#define VAR_ID 277
#define LABELSTR 278
#define STRINGCONSTANT 279
#define IMPLEMENTATION 280
#define ZEROINITIALIZER 281
#define TRUETOK 282
#define FALSETOK 283
#define BEGINTOK 284
#define ENDTOK 285
#define DECLARE 286
#define GLOBAL 287
#define CONSTANT 288
#define SECTION 289
#define VOLATILE 290
#define TO 291
#define DOTDOTDOT 292
#define NULL_TOK 293
#define UNDEF 294
#define CONST 295
#define INTERNAL 296
#define LINKONCE 297
#define WEAK 298
#define APPENDING 299
#define DLLIMPORT 300
#define DLLEXPORT 301
#define EXTERN_WEAK 302
#define OPAQUE 303
#define NOT 304
#define EXTERNAL 305
#define TARGET 306
#define TRIPLE 307
#define ENDIAN 308
#define POINTERSIZE 309
#define LITTLE 310
#define BIG 311
#define ALIGN 312
#define DEPLIBS 313
#define CALL 314
#define TAIL 315
#define ASM_TOK 316
#define MODULE 317
#define SIDEEFFECT 318
#define CC_TOK 319
#define CCC_TOK 320
#define CSRETCC_TOK 321
#define FASTCC_TOK 322
#define COLDCC_TOK 323
#define X86_STDCALLCC_TOK 324
#define X86_FASTCALLCC_TOK 325
#define DATALAYOUT 326
#define RET 327
#define BR 328
#define SWITCH 329
#define INVOKE 330
#define UNWIND 331
#define UNREACHABLE 332
#define ADD 333
#define SUB 334
#define MUL 335
#define UDIV 336
#define SDIV 337
#define FDIV 338
#define UREM 339
#define SREM 340
#define FREM 341
#define AND 342
#define OR 343
#define XOR 344
#define SETLE 345
#define SETGE 346
#define SETLT 347
#define SETGT 348
#define SETEQ 349
#define SETNE 350
#define MALLOC 351
#define ALLOCA 352
#define FREE 353
#define LOAD 354
#define STORE 355
#define GETELEMENTPTR 356
#define TRUNC 357
#define ZEXT 358
#define SEXT 359
#define FPTRUNC 360
#define FPEXT 361
#define BITCAST 362
#define UITOFP 363
#define SITOFP 364
#define FPTOUI 365
#define FPTOSI 366
#define INTTOPTR 367
#define PTRTOINT 368
#define PHI_TOK 369
#define SELECT 370
#define SHL 371
#define LSHR 372
#define ASHR 373
#define VAARG 374
#define EXTRACTELEMENT 375
#define INSERTELEMENT 376
#define SHUFFLEVECTOR 377
#define VAARG_old 378
#define VANEXT_old 379




/* Copy the first part of user declarations.  */
#line 14 "/proj/llvm/llvm-1/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/SymbolTable.h"
#include "llvm/Assembly/AutoUpgrade.h"
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/MathExtras.h"
#include <algorithm>
#include <iostream>
#include <list>
#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();

namespace llvm {
  std::string CurFilename;
}
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) std::cerr << X
#else
#define UR_OUT(X)
#endif

#define YYERROR_VERBOSE 1

static bool ObsoleteVarArgs;
static bool NewVarArgs;
static BasicBlock *CurBB;
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(std::map<const Type *,ValueList> &LateResolvers,
                   std::map<const Type *,ValueList> *FutureLateResolvers = 0);

static struct PerModuleInfo {
  Module *CurrentModule;
  std::map<const Type *, ValueList> Values; // Module level numbered definitions
  std::map<const Type *,ValueList> LateResolveValues;
  std::vector<TypeInfo>    Types;
  std::map<ValID, TypeInfo> 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++);

    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;
  }
} CurModule;

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

  std::map<const Type*, ValueList> Values; // Keep track of #'d definitions
  std::map<const Type*, ValueList> LateResolveValues;
  bool isDeclare;                    // Is this function a forward declararation?
  GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration.

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

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

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

  void FunctionDone() {
    NumberedBlocks.clear();

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

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

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

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


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

static int InsertValue(Value *V,
                  std::map<const Type*,ValueList> &ValueTab = CurFun.Values) {
  if (V->hasName()) return -1;           // Is this a numbered definition?

  // Yes, insert the value into the value table...
  ValueList &List = ValueTab[V->getType()];
  List.push_back(V);
  return List.size()-1;
}

static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
  switch (D.Type) {
  case ValID::NumberVal:               // Is it a numbered definition?
    // Module constants occupy the lowest numbered slots...
    if ((unsigned)D.Num < CurModule.Types.size())
      return CurModule.Types[(unsigned)D.Num].type->get();
    break;
  case ValID::NameVal:                 // Is it a named definition?
    if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
      D.destroy();  // Free old strdup'd memory...
      return N;
    }
    break;
  default:
    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::NameVal) {
      GenerateError("Reference to an undefined type: '" + D.getName() + "'");
      return 0;
    } else {
      GenerateError("Reference to an undefined type: #" + itostr(D.Num));
      return 0;
    }
  }

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

  TypeInfo TI;
  TI.type = new PATypeHolder(OpaqueType::get());
  TI.signedness = isSignless;
  CurModule.LateResolveTypes.insert(std::make_pair(D, TI));
  return TI.type->get();
 }

static Value *lookupInSymbolTable(const Type *Ty, const std::string &Name) {
  SymbolTable &SymTab =
    inFunctionScope() ? CurFun.CurrentFunction->getSymbolTable() :
                        CurModule.CurrentModule->getSymbolTable();
  return SymTab.lookup(Ty, Name);
}

// getValNonImprovising - 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 *getValNonImprovising(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::NumberVal: {                 // Is it a numbered definition?
    unsigned Num = (unsigned)D.Num;

    // Module constants occupy the lowest numbered slots...
    std::map<const Type*,ValueList>::iterator VI = CurModule.Values.find(Ty);
    if (VI != CurModule.Values.end()) {
      if (Num < VI->second.size())
        return VI->second[Num];
      Num -= VI->second.size();
    }

    // Make sure that our type is within bounds
    VI = CurFun.Values.find(Ty);
    if (VI == CurFun.Values.end()) return 0;

    // Check that the number is within bounds...
    if (VI->second.size() <= Num) return 0;

    return VI->second[Num];
  }

  case ValID::NameVal: {                // Is it a named definition?
    Value *N = lookupInSymbolTable(Ty, std::string(D.Name));
    if (N == 0) 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 (!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);

  case ValID::ConstUIntVal:     // Is it an unsigned const pool reference?
    if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
      if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
        GenerateError("Integral constant '" + utostr(D.UConstPool64) +
                       "' is invalid or out of range!");
        return 0;
      } else {     // This is really a signed reference.  Transmogrify.
        return ConstantInt::get(Ty, D.ConstPool64);
      }
    } else {
      return ConstantInt::get(Ty, D.UConstPool64);
    }

  case ValID::ConstFPVal:        // Is it a floating point const pool reference?
    if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) {
      GenerateError("FP constant invalid for type!!");
      return 0;
    }
    return ConstantFP::get(Ty, 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 getValNonImprovising, 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 = getValNonImprovising(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...
  //
  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,
                                                               llvmAsmlineno)));

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

/// getBBVal - This is used for two purposes:
///  * If isDefinition is true, a new basic block with the specified ID is being
///    defined.
///  * If isDefinition is true, this is a reference to a basic block, which may
///    or may not be a forward reference.
///
static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {
  assert(inFunctionScope() && "Can't get basic block at global scope!");

  std::string Name;
  BasicBlock *BB = 0;
  switch (ID.Type) {
  default: 
    GenerateError("Illegal label reference " + ID.getName());
    return 0;
  case ValID::NumberVal:                // Is it a numbered definition?
    if (unsigned(ID.Num) >= CurFun.NumberedBlocks.size())
      CurFun.NumberedBlocks.resize(ID.Num+1);
    BB = CurFun.NumberedBlocks[ID.Num];
    break;
  case ValID::NameVal:                  // Is it a named definition?
    Name = ID.Name;
    if (Value *N = CurFun.CurrentFunction->
                   getSymbolTable().lookup(Type::LabelTy, Name))
      BB = cast<BasicBlock>(N);
    break;
  }

  // See if the block has already been defined.
  if (BB) {
    // If this is the definition of the block, make sure the existing value was
    // just a forward reference.  If it was a forward reference, there will be
    // an entry for it in the PlaceHolderInfo map.
    if (isDefinition && !CurFun.BBForwardRefs.erase(BB)) {
      // The existing value was a definition, not a forward reference.
      GenerateError("Redefinition of label " + ID.getName());
      return 0;
    }

    ID.destroy();                       // Free strdup'd memory.
    return BB;
  }

  // Otherwise this block has not been seen before.
  BB = new BasicBlock("", CurFun.CurrentFunction);
  if (ID.Type == ValID::NameVal) {
    BB->setName(ID.Name);
  } else {
    CurFun.NumberedBlocks[ID.Num] = BB;
  }

  // If this is not a definition, keep track of it so we can use it as a forward
  // reference.
  if (!isDefinition) {
    // Remember where this forward reference came from.
    CurFun.BBForwardRefs[BB] = std::make_pair(ID, llvmAsmlineno);
  } else {
    // The forward declaration could have been inserted anywhere in the
    // function: insert it into the correct place now.
    CurFun.CurrentFunction->getBasicBlockList().remove(BB);
    CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
  }
  ID.destroy();
  return BB;
}


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

// ResolveDefinitions - If we could not resolve some defs at parsing
// time (forward branches, phi functions for loops, etc...) resolve the
// defs now...
//
static void 
ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
                   std::map<const Type*,ValueList> *FutureLateResolvers) {
  // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
  for (std::map<const Type*,ValueList>::iterator LRI = LateResolvers.begin(),
         E = LateResolvers.end(); LRI != E; ++LRI) {
    ValueList &List = LRI->second;
    while (!List.empty()) {
      Value *V = List.back();
      List.pop_back();

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

      ValID &DID = PHI->second.first;

      Value *TheRealValue = getValNonImprovising(LRI->first, 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::NameVal) {
          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(char *Name, const Type *ToTy) {
  ValID D;
  if (Name) D = ValID::create(Name);
  else      D = ValID::create((int)CurModule.Types.size());

  std::map<ValID, TypeInfo>::iterator I =
    CurModule.LateResolveTypes.find(D);
  if (I != CurModule.LateResolveTypes.end()) {
    ((DerivedType*)I->second.type->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, char *NameStr) {
  if (NameStr) {
    std::string Name(NameStr);      // Copy string
    free(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!");
    SymbolTable &ST = CurFun.CurrentFunction->getSymbolTable();
    if (ST.lookup(V->getType(), Name)) {
      GenerateError("Redefinition of value named '" + Name + "' in the '" +
                     V->getType()->getDescription() + "' type plane!");
      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(char *NameStr,GlobalValue::LinkageTypes Linkage,
                    bool isConstantGlobal, const Type *Ty,
                    Constant *Initializer) {
  if (isa<FunctionType>(Ty)) {
    GenerateError("Cannot declare global vars of function type!");
    return 0;
  }

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

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

  // See if this global value was forward referenced.  If so, recycle the
  // object.
  ValID ID;
  if (!Name.empty()) {
    ID = ValID::create((char*)Name.c_str());
  } else {
    ID = ValID::create((int)CurModule.Values[PTy].size());
  }

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

  // If this global has a name, check to see if there is already a definition
  // of this global in the module.  If so, merge as appropriate.  Note that
  // this is really just a hack around problems in the CFE.  :(
  if (!Name.empty()) {
    // We are a simple redefinition of a value, check to see if it is defined
    // the same as the old one.
    if (GlobalVariable *EGV =
                CurModule.CurrentModule->getGlobalVariable(Name, Ty)) {
      // We are allowed to redefine a global variable in two circumstances:
      // 1. If at least one of the globals is uninitialized or
      // 2. If both initializers have the same value.
      //
      if (!EGV->hasInitializer() || !Initializer ||
          EGV->getInitializer() == Initializer) {

        // Make sure the existing global version gets the initializer!  Make
        // sure that it also gets marked const if the new version is.
        if (Initializer && !EGV->hasInitializer())
          EGV->setInitializer(Initializer);
        if (isConstantGlobal)
          EGV->setConstant(true);
        EGV->setLinkage(Linkage);
        return EGV;
      }

      GenerateError("Redefinition of global variable named '" + Name +
                     "' in the '" + Ty->getDescription() + "' type plane!");
      return 0;
    }
  }

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

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

  // We don't allow assigning names to void type
  if (T == Type::VoidTy) {
    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 + "' in the '" +
                   T->getDescription() + "' type plane!");
  }

  return false;
}

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

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

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

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

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

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

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

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

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

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

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

  return Ty;
}

/// This function is used to obtain the correct opcode for an instruction when 
/// an obsolete opcode is encountered. The OI parameter (OpcodeInfo) has both 
/// an opcode and an "obsolete" flag. These are generated by the lexer and 
/// the "obsolete" member will be true when the lexer encounters the token for
/// an obsolete opcode. For example, "div" was replaced by [usf]div but we need
/// to maintain backwards compatibility for asm files that still have the "div"
/// instruction. This function handles converting div -> [usf]div appropriately.
/// @brief Convert obsolete BinaryOps opcodes to new values
static void 
sanitizeOpcode(OpcodeInfo<Instruction::BinaryOps> &OI, const Type *Ty)
{
  // If its not obsolete, don't do anything
  if (!OI.obsolete) 
    return;

  // If its a packed type we want to use the element type
  if (const PackedType *PTy = dyn_cast<PackedType>(Ty))
    Ty = PTy->getElementType();

  // Depending on the opcode ..
  switch (OI.opcode) {
    default:
      GenerateError("Invalid obsolete opCode (check Lexer.l)");
      break;
    case Instruction::UDiv:
      // Handle cases where the opcode needs to change
      if (Ty->isFloatingPoint()) 
        OI.opcode = Instruction::FDiv;
      else if (Ty->isSigned())
        OI.opcode = Instruction::SDiv;
      break;
    case Instruction::URem:
      if (Ty->isFloatingPoint()) 
        OI.opcode = Instruction::FRem;
      else if (Ty->isSigned())
        OI.opcode = Instruction::SRem;
      break;
  }
  // Its not obsolete any more, we fixed it.
  OI.obsolete = false;
}

/// This function is similar to the previous overload of sanitizeOpcode but
/// operates on Instruction::OtherOps instead of Instruction::BinaryOps.
/// @brief Convert obsolete OtherOps opcodes to new values
static void 
sanitizeOpcode(OpcodeInfo<Instruction::OtherOps> &OI, const Type *Ty)
{
  // If its not obsolete, don't do anything
  if (!OI.obsolete) 
    return;

  switch (OI.opcode) {
  default:
    GenerateError("Invalid obsolete opcode (check Lexer.l)");
    break;
  case Instruction::LShr:
    if (Ty->isSigned())
      OI.opcode = Instruction::AShr;
    break;
  }
  // Its not obsolete any more, we fixed it.
  OI.obsolete = false;
}

// common code from the two 'RunVMAsmParser' functions
static Module* RunParser(Module * M) {

  llvmAsmlineno = 1;      // Reset the current line number...
  ObsoleteVarArgs = false;
  NewVarArgs = false;
  CurModule.CurrentModule = M;

  // Check to make sure the parser succeeded
  if (yyparse()) {
    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;

  //Not all functions use vaarg, so make a second check for ObsoleteVarArgs
  {
    Function* F;
    if ((F = Result->getNamedFunction("llvm.va_start"))
        && F->getFunctionType()->getNumParams() == 0)
      ObsoleteVarArgs = true;
    if((F = Result->getNamedFunction("llvm.va_copy"))
       && F->getFunctionType()->getNumParams() == 1)
      ObsoleteVarArgs = true;
  }

  if (ObsoleteVarArgs && NewVarArgs) {
    GenerateError(
      "This file is corrupt: it uses both new and old style varargs");
    return 0;
  }

  if(ObsoleteVarArgs) {
    if(Function* F = Result->getNamedFunction("llvm.va_start")) {
      if (F->arg_size() != 0) {
        GenerateError("Obsolete va_start takes 0 argument!");
        return 0;
      }
      
      //foo = va_start()
      // ->
      //bar = alloca typeof(foo)
      //va_start(bar)
      //foo = load bar

      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
      const Type* ArgTy = F->getFunctionType()->getReturnType();
      const Type* ArgTyPtr = PointerType::get(ArgTy);
      Function* NF = Result->getOrInsertFunction("llvm.va_start", 
                                                 RetTy, ArgTyPtr, (Type *)0);

      while (!F->use_empty()) {
        CallInst* CI = cast<CallInst>(F->use_back());
        AllocaInst* bar = new AllocaInst(ArgTy, 0, "vastart.fix.1", CI);
        new CallInst(NF, bar, "", CI);
        Value* foo = new LoadInst(bar, "vastart.fix.2", CI);
        CI->replaceAllUsesWith(foo);
        CI->getParent()->getInstList().erase(CI);
      }
      Result->getFunctionList().erase(F);
    }
    
    if(Function* F = Result->getNamedFunction("llvm.va_end")) {
      if(F->arg_size() != 1) {
        GenerateError("Obsolete va_end takes 1 argument!");
        return 0;
      }

      //vaend foo
      // ->
      //bar = alloca 1 of typeof(foo)
      //vaend bar
      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
      const Type* ArgTy = F->getFunctionType()->getParamType(0);
      const Type* ArgTyPtr = PointerType::get(ArgTy);
      Function* NF = Result->getOrInsertFunction("llvm.va_end", 
                                                 RetTy, ArgTyPtr, (Type *)0);

      while (!F->use_empty()) {
        CallInst* CI = cast<CallInst>(F->use_back());
        AllocaInst* bar = new AllocaInst(ArgTy, 0, "vaend.fix.1", CI);
        new StoreInst(CI->getOperand(1), bar, CI);
        new CallInst(NF, bar, "", CI);
        CI->getParent()->getInstList().erase(CI);
      }
      Result->getFunctionList().erase(F);
    }

    if(Function* F = Result->getNamedFunction("llvm.va_copy")) {
      if(F->arg_size() != 1) {
        GenerateError("Obsolete va_copy takes 1 argument!");
        return 0;
      }
      //foo = vacopy(bar)
      // ->
      //a = alloca 1 of typeof(foo)
      //b = alloca 1 of typeof(foo)
      //store bar -> b
      //vacopy(a, b)
      //foo = load a
      
      const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
      const Type* ArgTy = F->getFunctionType()->getReturnType();
      const Type* ArgTyPtr = PointerType::get(ArgTy);
      Function* NF = Result->getOrInsertFunction("llvm.va_copy", 
                                                 RetTy, ArgTyPtr, ArgTyPtr,
                                                 (Type *)0);

      while (!F->use_empty()) {
        CallInst* CI = cast<CallInst>(F->use_back());
        AllocaInst* a = new AllocaInst(ArgTy, 0, "vacopy.fix.1", CI);
        AllocaInst* b = new AllocaInst(ArgTy, 0, "vacopy.fix.2", CI);
        new StoreInst(CI->getOperand(1), b, CI);
        new CallInst(NF, a, b, "", CI);
        Value* foo = new LoadInst(a, "vacopy.fix.3", CI);
        CI->replaceAllUsesWith(foo);
        CI->getParent()->getInstList().erase(CI);
      }
      Result->getFunctionList().erase(F);
    }
  }

  return Result;
}

//===----------------------------------------------------------------------===//
//            RunVMAsmParser - Define an interface to this parser
//===----------------------------------------------------------------------===//
//
Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
  set_scan_file(F);

  CurFilename = Filename;
  return RunParser(new Module(CurFilename));
}

Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
  set_scan_string(AsmString);

  CurFilename = "from_memory";
  if (M == NULL) {
    return RunParser(new Module (CurFilename));
  } else {
    return RunParser(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)
#line 1040 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
typedef union YYSTYPE {
  llvm::Module                           *ModuleVal;
  llvm::Function                         *FunctionVal;
  std::pair<TypeInfo, char*>             *ArgVal;
  llvm::BasicBlock                       *BasicBlockVal;
  llvm::TerminatorInst                   *TermInstVal;
  llvm::Instruction                      *InstVal;
  llvm::Constant                         *ConstVal;

  TypeInfo                                TypeVal;
  llvm::Value                            *ValueVal;

  std::vector<std::pair<TypeInfo,char*> >*ArgList;
  std::vector<llvm::Value*>              *ValueList;
  std::list<TypeInfo>                    *TypeList;
  // 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;
  int64_t                           SInt64Val;
  uint64_t                          UInt64Val;
  int                               SIntVal;
  unsigned                          UIntVal;
  double                            FPVal;
  bool                              BoolVal;

  char                             *StrVal;   // This memory is strdup'd!
  llvm::ValID                       ValIDVal; // strdup'd memory maybe!

  BinaryOpInfo                      BinaryOpVal;
  TermOpInfo                        TermOpVal;
  MemOpInfo                         MemOpVal;
  CastOpInfo                        CastOpVal;
  OtherOpInfo                       OtherOpVal;
  llvm::Module::Endianness          Endianness;
} YYSTYPE;
/* Line 196 of yacc.c.  */
#line 1407 "llvmAsmParser.tab.c"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif



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


/* Line 219 of yacc.c.  */
#line 1419 "llvmAsmParser.tab.c"

#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
# define YYSIZE_T __SIZE_TYPE__
#endif
#if ! defined (YYSIZE_T) && defined (size_t)
# define YYSIZE_T size_t
#endif
#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
# define YYSIZE_T size_t
#endif
#if ! defined (YYSIZE_T)
# define YYSIZE_T unsigned int
#endif

#ifndef YY_
# if YYENABLE_NLS
#  if ENABLE_NLS
#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
#   define YY_(msgid) dgettext ("bison-runtime", msgid)
#  endif
# endif
# ifndef YY_
#  define YY_(msgid) msgid
# endif
#endif

#if ! defined (yyoverflow) || YYERROR_VERBOSE

/* The parser invokes alloca or malloc; define the necessary symbols.  */

# ifdef YYSTACK_USE_ALLOCA
#  if YYSTACK_USE_ALLOCA
#   ifdef __GNUC__
#    define YYSTACK_ALLOC __builtin_alloca
#   else
#    define YYSTACK_ALLOC alloca
#    if defined (__STDC__) || defined (__cplusplus)
#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
#     define YYINCLUDED_STDLIB_H
#    endif
#   endif
#  endif
# endif

# ifdef YYSTACK_ALLOC
   /* Pacify GCC's `empty if-body' warning. */
#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
#  ifndef YYSTACK_ALLOC_MAXIMUM
    /* The OS might guarantee only one guard page at the bottom of the stack,
       and a page size can be as small as 4096 bytes.  So we cannot safely
       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
       to allow for a few compiler-allocated temporary stack slots.  */
#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
#  endif
# else
#  define YYSTACK_ALLOC YYMALLOC
#  define YYSTACK_FREE YYFREE
#  ifndef YYSTACK_ALLOC_MAXIMUM
#   define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
#  endif
#  ifdef __cplusplus
extern "C" {
#  endif
#  ifndef YYMALLOC
#   define YYMALLOC malloc
#   if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
	&& (defined (__STDC__) || defined (__cplusplus)))
void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
#   endif
#  endif
#  ifndef YYFREE
#   define YYFREE free
#   if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
	&& (defined (__STDC__) || defined (__cplusplus)))
void free (void *); /* INFRINGES ON USER NAME SPACE */
#   endif
#  endif
#  ifdef __cplusplus
}
#  endif
# endif
#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */


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

/* A type that is properly aligned for any stack member.  */
union yyalloc
{
  short int 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 (short int) + 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 (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 (0)

#endif

#if defined (__STDC__) || defined (__cplusplus)
   typedef signed char yysigned_char;
#else
   typedef short int yysigned_char;
#endif

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

/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS  139
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS  76
/* YYNRULES -- Number of rules. */
#define YYNRULES  269
/* YYNRULES -- Number of states. */
#define YYNSTATES  534

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

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

/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
static const unsigned char 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,
     128,   129,   137,     2,   126,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     133,   125,   134,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,   130,   127,   132,     2,     2,     2,     2,     2,   138,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     131,     2,     2,   135,     2,   136,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     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
};

#if YYDEBUG
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
   YYRHS.  */
static const unsigned short int yyprhs[] =
{
       0,     0,     3,     5,     7,     9,    11,    13,    15,    17,
      19,    21,    23,    25,    27,    29,    31,    33,    35,    37,
      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,   104,   105,   107,   109,   111,   113,   115,   117,
     119,   120,   121,   123,   125,   127,   129,   131,   133,   136,
     137,   140,   141,   145,   148,   149,   151,   152,   156,   158,
     161,   163,   165,   167,   169,   171,   173,   175,   177,   179,
     181,   183,   185,   187,   189,   191,   193,   195,   197,   199,
     201,   203,   206,   211,   217,   223,   227,   230,   233,   235,
     239,   241,   245,   247,   248,   253,   257,   261,   266,   271,
     275,   278,   281,   284,   287,   290,   293,   296,   299,   302,
     305,   312,   318,   327,   334,   341,   348,   355,   362,   371,
     380,   384,   386,   388,   390,   392,   395,   398,   403,   406,
     408,   413,   416,   421,   422,   430,   431,   439,   440,   448,
     449,   457,   461,   466,   467,   469,   471,   473,   477,   481,
     485,   489,   493,   497,   499,   500,   502,   504,   506,   507,
     510,   514,   516,   518,   522,   524,   525,   534,   536,   538,
     542,   544,   546,   549,   550,   552,   554,   555,   560,   561,
     563,   565,   567,   569,   571,   573,   575,   577,   579,   583,
     585,   591,   593,   595,   597,   599,   602,   605,   608,   612,
     615,   616,   618,   621,   624,   628,   638,   648,   657,   671,
     673,   675,   682,   688,   691,   698,   706,   708,   712,   714,
     715,   718,   720,   726,   732,   738,   741,   746,   751,   758,
     763,   768,   773,   778,   785,   792,   795,   803,   805,   808,
     809,   811,   812,   816,   823,   827,   834,   837,   842,   849
};

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

/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
static const unsigned short int yyrline[] =
{
       0,  1168,  1168,  1169,  1177,  1178,  1188,  1188,  1188,  1188,
    1188,  1188,  1188,  1188,  1188,  1189,  1189,  1189,  1190,  1190,
    1190,  1190,  1190,  1190,  1191,  1191,  1191,  1191,  1191,  1191,
    1192,  1192,  1192,  1192,  1192,  1192,  1193,  1193,  1193,  1197,
    1197,  1197,  1197,  1198,  1198,  1198,  1198,  1199,  1199,  1200,
    1200,  1203,  1207,  1212,  1213,  1214,  1215,  1216,  1217,  1218,
    1219,  1221,  1222,  1223,  1224,  1225,  1226,  1227,  1228,  1237,
    1238,  1244,  1245,  1253,  1261,  1262,  1267,  1268,  1269,  1274,
    1288,  1288,  1292,  1292,  1297,  1308,  1308,  1308,  1308,  1308,
    1308,  1308,  1309,  1309,  1309,  1309,  1309,  1309,  1310,  1315,
    1319,  1328,  1337,  1352,  1359,  1373,  1384,  1389,  1401,  1406,
    1412,  1413,  1419,  1425,  1436,  1462,  1476,  1506,  1532,  1553,
    1566,  1576,  1581,  1642,  1649,  1658,  1664,  1670,  1674,  1678,
    1686,  1712,  1744,  1752,  1779,  1790,  1796,  1807,  1813,  1819,
    1828,  1832,  1840,  1840,  1850,  1858,  1863,  1867,  1871,  1875,
    1890,  1912,  1915,  1918,  1918,  1926,  1926,  1935,  1935,  1944,
    1944,  1954,  1957,  1960,  1964,  1977,  1978,  1980,  1984,  1993,
    1997,  2002,  2004,  2009,  2014,  2023,  2023,  2024,  2024,  2026,
    2033,  2039,  2046,  2050,  2058,  2066,  2071,  2165,  2165,  2167,
    2175,  2175,  2177,  2182,  2183,  2184,  2186,  2186,  2196,  2200,
    2205,  2209,  2213,  2217,  2221,  2225,  2229,  2233,  2237,  2257,
    2261,  2275,  2279,  2285,  2285,  2291,  2296,  2300,  2309,  2320,
    2329,  2341,  2354,  2358,  2362,  2367,  2376,  2395,  2404,  2460,
    2464,  2471,  2482,  2495,  2504,  2513,  2523,  2527,  2534,  2534,
    2536,  2540,  2545,  2567,  2582,  2596,  2609,  2620,  2646,  2654,
    2660,  2680,  2703,  2709,  2715,  2721,  2736,  2796,  2803,  2806,
    2811,  2815,  2822,  2827,  2833,  2838,  2844,  2852,  2864,  2879
};
#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", "SINTVAL",
  "UINTVAL", "FPVAL", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", "USHORT",
  "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "TYPE", "LABEL",
  "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION",
  "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK",
  "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO",
  "DOTDOTDOT", "NULL_TOK", "UNDEF", "CONST", "INTERNAL", "LINKONCE",
  "WEAK", "APPENDING", "DLLIMPORT", "DLLEXPORT", "EXTERN_WEAK", "OPAQUE",
  "NOT", "EXTERNAL", "TARGET", "TRIPLE", "ENDIAN", "POINTERSIZE", "LITTLE",
  "BIG", "ALIGN", "DEPLIBS", "CALL", "TAIL", "ASM_TOK", "MODULE",
  "SIDEEFFECT", "CC_TOK", "CCC_TOK", "CSRETCC_TOK", "FASTCC_TOK",
  "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT",
  "RET", "BR", "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB",
  "MUL", "UDIV", "SDIV", "FDIV", "UREM", "SREM", "FREM", "AND", "OR",
  "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ", "SETNE", "MALLOC",
  "ALLOCA", "FREE", "LOAD", "STORE", "GETELEMENTPTR", "TRUNC", "ZEXT",
  "SEXT", "FPTRUNC", "FPEXT", "BITCAST", "UITOFP", "SITOFP", "FPTOUI",
  "FPTOSI", "INTTOPTR", "PTRTOINT", "PHI_TOK", "SELECT", "SHL", "LSHR",
  "ASHR", "VAARG", "EXTRACTELEMENT", "INSERTELEMENT", "SHUFFLEVECTOR",
  "VAARG_old", "VANEXT_old", "'='", "','", "'\\\\'", "'('", "')'", "'['",
  "'x'", "']'", "'<'", "'>'", "'{'", "'}'", "'*'", "'c'", "$accept",
  "INTVAL", "EINT64VAL", "ArithmeticOps", "LogicalOps", "SetCondOps",
  "CastOps", "ShiftOps", "SIntType", "UIntType", "IntType", "FPType",
  "OptAssign", "OptLinkage", "OptCallingConv", "OptAlign", "OptCAlign",
  "SectionString", "OptSection", "GlobalVarAttributes",
  "GlobalVarAttribute", "TypesV", "UpRTypesV", "Types", "PrimType",
  "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", "ConstExpr",
  "ConstVector", "GlobalType", "Module", "FunctionList", "ConstPool", "@1",
  "@2", "@3", "@4", "AsmBlock", "BigOrLittle", "TargetDefinition",
  "LibrariesDefinition", "LibList", "Name", "OptName", "ArgVal",
  "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader",
  "END", "Function", "FnDeclareLinkage", "FunctionProto", "@5",
  "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef",
  "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList",
  "BBTerminatorInst", "JumpTable", "Inst", "PHIList", "ValueRefList",
  "ValueRefListE", "OptTailCall", "InstVal", "IndexList", "OptVolatile",
  "MemoryInst", 0
};
#endif

# ifdef YYPRINT
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
   token YYLEX-NUM.  */
static const unsigned short int yytoknum[] =
{
       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
     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,    61,    44,    92,    40,    41,
      91,   120,    93,    60,    62,   123,   125,    42,    99
};
# endif

/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
static const unsigned char yyr1[] =
{
       0,   139,   140,   140,   141,   141,   142,   142,   142,   142,
     142,   142,   142,   142,   142,   143,   143,   143,   144,   144,
     144,   144,   144,   144,   145,   145,   145,   145,   145,   145,
     145,   145,   145,   145,   145,   145,   146,   146,   146,   147,
     147,   147,   147,   148,   148,   148,   148,   149,   149,   150,
     150,   151,   151,   152,   152,   152,   152,   152,   152,   152,
     152,   153,   153,   153,   153,   153,   153,   153,   153,   154,
     154,   155,   155,   156,   157,   157,   158,   158,   159,   159,
     160,   160,   161,   161,   162,   163,   163,   163,   163,   163,
     163,   163,   163,   163,   163,   163,   163,   163,   164,   164,
     164,   164,   164,   164,   164,   164,   164,   164,   165,   165,
     166,   166,   166,   166,   167,   167,   167,   167,   167,   167,
     167,   167,   167,   167,   167,   167,   167,   167,   167,   167,
     168,   168,   168,   168,   168,   168,   168,   168,   168,   168,
     169,   169,   170,   170,   171,   172,   172,   172,   172,   172,
     173,   173,   173,   174,   173,   175,   173,   176,   173,   177,
     173,   173,   173,   173,   178,   179,   179,   180,   180,   180,
     180,   181,   182,   182,   182,   183,   183,   184,   184,   185,
     186,   186,   187,   187,   187,   187,   188,   189,   189,   190,
     191,   191,   192,   193,   193,   193,   195,   194,   196,   196,
     197,   197,   197,   197,   197,   197,   197,   197,   197,   197,
     197,   198,   198,   199,   199,   200,   201,   201,   202,   203,
     203,   203,   204,   204,   204,   204,   204,   204,   204,   204,
     204,   205,   205,   206,   207,   207,   208,   208,   209,   209,
     210,   210,   211,   211,   211,   211,   211,   211,   211,   211,
     211,   211,   211,   211,   211,   211,   211,   211,   212,   212,
     213,   213,   214,   214,   214,   214,   214,   214,   214,   214
};

/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
static const unsigned char 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,     2,     0,     1,     1,     1,     1,     1,     1,     1,
       0,     0,     1,     1,     1,     1,     1,     1,     2,     0,
       2,     0,     3,     2,     0,     1,     0,     3,     1,     2,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     2,     4,     5,     5,     3,     2,     2,     1,     3,
       1,     3,     1,     0,     4,     3,     3,     4,     4,     3,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       6,     5,     8,     6,     6,     6,     6,     6,     8,     8,
       3,     1,     1,     1,     1,     2,     2,     4,     2,     1,
       4,     2,     4,     0,     7,     0,     7,     0,     7,     0,
       7,     3,     4,     0,     1,     1,     1,     3,     3,     3,
       3,     3,     3,     1,     0,     1,     1,     1,     0,     2,
       3,     1,     1,     3,     1,     0,     8,     1,     1,     3,
       1,     1,     2,     0,     1,     1,     0,     4,     0,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     3,     1,
       5,     1,     1,     1,     1,     2,     2,     2,     3,     2,
       0,     1,     2,     2,     3,     9,     9,     8,    13,     1,
       1,     6,     5,     2,     6,     7,     1,     3,     1,     0,
       2,     1,     5,     5,     5,     2,     4,     4,     6,     4,
       4,     4,     4,     6,     6,     2,     7,     1,     2,     0,
       1,     0,     3,     6,     3,     6,     2,     4,     6,     4
};

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

/* YYDEFGOTO[NTERM-NUM]. */
static const short int yydefgoto[] =
{
      -1,    86,   273,   288,   289,   290,   291,   292,   211,   212,
     241,   213,    25,    15,    37,   461,   325,   406,   425,   348,
     407,    87,    88,   214,    90,    91,   120,   223,   357,   316,
     358,   109,     1,     2,     3,   295,   268,   266,   267,    63,
     192,    50,   104,   196,    92,   372,   301,   302,   303,    38,
      96,    16,    44,    17,    61,    18,    28,   377,   317,    93,
     319,   434,    19,    40,    41,   184,   509,    98,   248,   465,
     466,   185,   186,   386,   187,   188
};

/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
   STATE-NUM.  */
#define YYPACT_NINF -472
static const short int yypact[] =
{
    -472,    24,   395,   501,  -472,  -472,  -472,  -472,  -472,  -472,
    -472,  -472,  -472,  -472,   -13,   112,    46,  -472,  -472,   -11,
    -472,  -472,   -18,   -41,    45,    51,    -1,  -472,    40,   106,
     131,  -472,  -472,  -472,  -472,  -472,  -472,  1136,   -23,  -472,
    -472,    81,  -472,  -472,  -472,  -472,    30,    33,    49,    61,
    -472,    57,   106,  1136,    78,    78,    78,    78,  -472,  -472,
    -472,   112,  -472,  -472,  -472,  -472,  -472,    62,  -472,  -472,
    -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,
    -472,  -472,   185,   187,   188,   619,  -472,    81,    67,  -472,
    -472,   -71,  -472,  -472,  -472,  -472,  -472,  1286,  -472,   174,
      58,   196,   177,   178,  -472,  -472,  -472,  -472,  -472,  1177,
    1177,  1177,  1197,  -472,  -472,    72,    73,  -472,  -472,   -71,
     -89,    79,   151,  -472,  -472,  1177,  -472,   147,  1222,    12,
     218,   112,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,
    -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,
    -472,  -472,  1177,  1177,  1177,  1177,  -472,  -472,  -472,  -472,
    -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  1177,  1177,
    -472,  -472,  -472,  1177,  1177,  1177,  1177,  1177,  1177,  1177,
    1177,  1177,  1177,  1177,  -472,   112,  -472,   -55,  -472,  -472,
    -472,  -472,  -472,  -472,  -472,  -472,   -62,  -472,  -472,  -472,
      95,   123,   204,   125,   205,   130,   206,   149,   207,   208,
     210,   181,   209,   214,   488,  -472,  1177,  1177,  1177,  -472,
     944,  -472,    88,    93,   698,  -472,  -472,    62,  -472,   698,
     698,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,
    -472,   698,  1136,    97,   110,  -472,   698,   108,   113,   114,
     120,   121,   124,   126,   133,   136,   698,   698,   698,   213,
     139,  1136,  1177,  1177,   227,  -472,   140,   140,   140,  -472,
    -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,   141,
     142,   143,   145,   146,   985,  1197,   639,   243,   148,   154,
     155,   157,   165,  -472,  -472,   140,   -28,   -51,   -71,  -472,
      81,  -472,   153,   172,  1005,  -472,  -472,  -472,  -472,  -472,
    -472,  -472,  -472,  -472,   244,  1197,  -472,  -472,  -472,  -472,
     180,  -472,   182,   698,    -7,  -472,    -6,  -472,   183,   698,
     138,  1177,  1177,  1177,  1177,  1177,  1177,  1177,   184,   186,
     189,  1177,  1177,   698,   698,   190,  -472,   -17,  -472,  -472,
    -472,  1197,  1197,  1197,  1197,  1197,  -472,  -472,   -24,   -85,
    -472,   -80,  -472,  1197,  1197,  1197,  1197,  1197,  -472,  -472,
    -472,  -472,  -472,  1046,   277,  -472,  -472,   289,   -27,   293,
     296,   191,   698,   314,   698,  1177,  -472,   194,   698,   195,
    -472,  -472,   200,   201,  -472,  -472,   698,   698,   698,  -472,
    -472,   202,  -472,  1177,   298,   324,  -472,   140,   183,   203,
     211,   212,   224,  1197,  -472,  -472,  -472,   225,   226,   230,
     295,   232,  -472,  -472,  -472,   275,   233,  -472,   698,   698,
    1177,   235,  -472,   235,  -472,   239,   698,   241,  1177,  1177,
    1177,  -472,  -472,  -472,  1177,   698,  -472,  -472,  -472,   215,
    1197,  1197,  1197,  1197,  -472,  1197,  1197,  1197,  1177,  1197,
     329,  -472,   310,   242,   223,   239,   240,   278,  -472,  -472,
    1177,   238,   698,  -472,  -472,  -472,   247,  -472,  -472,   245,
     250,   246,   255,   254,   256,   257,   259,   262,  -472,  -472,
     318,    15,   337,  -472,  -472,   252,  -472,  1197,  -472,  1197,
    1197,  -472,  -472,  -472,  -472,  -472,   698,  -472,   818,    65,
     371,  -472,   265,   267,   268,  -472,   272,  -472,   818,   698,
    -472,  -472,  -472,   378,   274,   328,   698,   384,   385,  -472,
     698,   698,  -472,  -472
};

/* YYPGOTO[NTERM-NUM].  */
static const short int yypgoto[] =
{
    -472,  -472,  -472,   311,   312,   313,   315,   317,  -129,  -127,
    -471,  -472,   370,   392,  -120,  -472,  -237,    50,  -472,  -253,
    -472,   -49,  -472,   -37,  -472,   -67,   301,  -472,  -110,   220,
    -263,    64,  -472,  -472,  -472,  -472,  -472,  -472,  -472,   373,
    -472,  -472,  -472,  -472,     2,  -472,    70,  -472,  -472,   374,
    -472,  -472,  -472,  -472,  -472,   441,  -472,  -472,  -418,    34,
      31,  -115,  -472,   426,  -472,  -472,  -472,  -472,  -472,    63,
       3,  -472,  -472,    38,  -472,  -472
};

/* 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 -145
static const short int yytable[] =
{
      89,   239,   215,   240,   106,    26,    94,   327,   382,   384,
     225,   242,    39,   228,   349,   350,    89,   404,   119,    42,
     508,   229,   359,   361,     4,   231,   232,   233,   234,   235,
     236,   237,   238,   230,    46,    47,    48,   218,   518,   245,
     405,   413,   368,    26,   262,   263,   413,   219,    29,   415,
     383,   383,   378,    49,   249,   119,   416,   -82,   250,   251,
     252,   253,   254,   255,   264,   261,   123,   259,   260,    39,
     265,    53,   197,   198,   199,   231,   232,   233,   234,   235,
     236,   237,   238,   370,    51,    59,   123,    60,   224,   121,
     516,   224,     7,     8,     9,    10,    54,    12,    55,   413,
     524,    56,   413,    20,   369,    21,    52,   427,   414,   123,
     107,   108,    95,   190,   191,   243,   244,   224,   246,   110,
     111,   112,   269,   270,    58,    43,   -42,   -42,   -41,   -41,
      62,   247,   224,   -40,   -40,    64,   224,   224,   224,   224,
     224,   224,   256,   257,   258,   224,   224,   507,   345,   296,
     297,   298,   -39,   -39,   448,    99,    65,    66,   100,   117,
      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
      78,    79,    80,    20,   101,    21,    30,    31,    32,    33,
      34,    35,    36,   300,   271,   272,   102,   103,   221,   114,
     -83,   115,   116,   323,   468,   122,   469,   517,   189,    81,
     193,   194,   195,   216,   217,    89,   226,   220,   -46,   -45,
     -44,   -43,   343,   274,   304,   -49,   389,   -50,   391,   392,
     393,   275,   305,   324,    89,   344,   224,   400,   231,   232,
     233,   234,   235,   236,   237,   238,   326,   298,   329,   330,
     331,   408,   409,   410,   411,   412,   332,   333,   294,   341,
     334,   346,   335,   417,   418,   419,   420,   421,   318,   336,
     320,   321,   337,   318,   318,   342,   347,   362,   388,   351,
     352,   353,   322,   354,   355,   318,   363,   328,    82,   373,
     318,    83,   364,   365,    84,   366,    85,   338,   339,   340,
     318,   318,   318,   367,   224,   390,   224,   224,   224,   394,
     395,   374,   371,   454,   399,   224,   379,   376,   380,   385,
     396,   404,   397,   426,   428,   398,   403,   429,   432,   430,
     436,   438,   446,   473,   474,   475,   439,   440,   447,   450,
     444,   458,   460,   488,   489,   383,   300,   451,   452,   506,
     479,   480,   481,   482,   478,   483,   484,   485,   224,   487,
     453,   455,   456,   491,   381,   493,   457,   318,   459,   462,
     387,   467,   239,   318,   240,   470,   445,   472,   490,   492,
     494,   497,   499,   510,   401,   402,   496,   318,   318,   498,
     239,   500,   240,   501,   511,   502,   503,   512,   504,   513,
     514,   505,   519,   224,   520,  -144,   521,   522,   523,   526,
     527,   224,   224,   224,   528,   530,   531,   224,   179,   180,
     181,    97,   182,   431,   183,   433,   318,    57,   318,   437,
       5,   486,   318,   222,   424,   105,     6,   441,   442,   443,
     318,   318,   318,   224,   293,   113,     7,     8,     9,    10,
      11,    12,    13,   423,    27,    45,   449,   476,   435,     0,
       0,     0,     0,     0,     0,     0,     0,    14,     0,   463,
     464,     0,   318,   318,     0,     0,     0,   471,     0,     0,
     318,     0,     0,     0,     0,     0,   477,     0,     0,   318,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,    65,    66,     0,     0,     0,     0,     0,
       0,     0,     0,   495,     0,     0,   318,     0,     0,     0,
      20,     0,    21,     0,   276,     0,     0,     0,     0,     0,
       0,   -52,     0,    20,     0,    21,   277,   278,     0,     0,
       0,     0,     6,   -52,   -52,     0,     0,   515,     0,     0,
     318,     0,   -52,   -52,   -52,   -52,   -52,   -52,   -52,     0,
     525,   -52,    22,   318,     0,     0,     0,   529,     0,    23,
     318,   532,   533,    24,   318,   318,   134,   135,   136,   137,
     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
     148,   149,   150,   151,     0,     0,     0,     0,     0,   279,
     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
     166,   167,     0,   280,   170,   171,   172,     0,   281,   282,
     283,     0,     0,     0,     0,     0,     0,     0,   284,     0,
       0,   285,     0,   286,    65,    66,   287,   117,    68,    69,
      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
      80,    20,     0,    21,    65,    66,     0,   117,   200,   201,
     202,   203,   204,   205,   206,   207,   208,   209,   210,    79,
      80,    20,     0,    21,     0,     0,     0,    81,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,    81,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   306,   307,    65,    66,   308,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      20,     0,    21,     0,   309,   310,   311,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   312,   313,     0,     0,
       0,     0,     0,     0,     0,     0,    82,     0,     0,    83,
       0,     0,    84,     0,    85,   118,     0,     0,     0,   314,
       0,     0,     0,     0,     0,     0,    82,     0,     0,    83,
       0,     0,    84,     0,    85,   360,   134,   135,   136,   137,
     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
     148,   149,   150,   151,     0,     0,     0,     0,     0,   279,
     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
     166,   167,     0,   280,   170,   171,   172,     0,   281,   282,
     283,   306,   307,     0,     0,   308,     0,     0,     0,     0,
       0,   315,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,   309,   310,   311,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   312,   313,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,   314,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   134,   135,   136,   137,
     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
     148,   149,   150,   151,     0,     0,     0,     0,     0,   279,
     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
     166,   167,     0,   280,   170,   171,   172,     0,   281,   282,
     283,     0,     0,     0,     0,     0,     0,     0,     0,    65,
      66,   315,   117,    68,    69,    70,    71,    72,    73,    74,
      75,    76,    77,    78,    79,    80,    20,     0,    21,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   299,     0,     0,     0,     0,     0,     0,     0,     0,
      65,    66,    81,   117,   200,   201,   202,   203,   204,   205,
     206,   207,   208,   209,   210,    79,    80,    20,     0,    21,
      65,    66,     0,   117,    68,    69,    70,    71,    72,    73,
      74,    75,    76,    77,    78,    79,    80,    20,     0,    21,
       0,     0,     0,    81,     0,     0,     0,     0,     0,     0,
       0,     0,   375,     0,     0,     0,     0,     0,     0,     0,
       0,    65,    66,    81,   117,    68,    69,    70,    71,    72,
      73,    74,    75,    76,    77,    78,    79,    80,    20,     0,
      21,    82,     0,     0,    83,     0,     0,    84,     0,    85,
       0,     0,     0,   422,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,    81,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,    82,     0,     0,    83,     0,   356,    84,     0,
      85,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,    82,     0,     0,    83,     0,     0,    84,     0,
      85,    65,    66,     0,    67,    68,    69,    70,    71,    72,
      73,    74,    75,    76,    77,    78,    79,    80,    20,     0,
      21,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,    82,     0,     0,    83,     0,     0,    84,
       0,    85,    65,    66,    81,   117,    68,    69,    70,    71,
      72,    73,    74,    75,    76,    77,    78,    79,    80,    20,
       0,    21,    65,    66,     0,   117,   200,   201,   202,   203,
     204,   205,   206,   207,   208,   209,   210,    79,    80,    20,
       0,    21,     0,     0,     0,    81,     0,    65,    66,     0,
     227,    68,    69,    70,    71,    72,    73,    74,    75,    76,
      77,    78,    79,    80,    20,    81,    21,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,    82,     0,     0,    83,     0,     0,    84,
      81,    85,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,    82,     0,     0,    83,     0,     0,
      84,     0,    85,     0,     0,     0,     0,     0,     0,     0,
       0,   124,     0,     0,    82,     0,     0,    83,     0,     0,
      84,     0,    85,     0,     0,   125,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   126,   127,     0,     0,    82,
       0,     0,    83,     0,     0,    84,     0,    85,   128,   129,
     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
     150,   151,   152,   153,   154,     0,     0,   155,   156,   157,
     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
     178
};

static const short int yycheck[] =
{
      37,   130,   112,   130,    53,     3,    29,   244,    15,    15,
     125,   131,    23,   128,   267,   268,    53,    34,    85,    30,
     491,     9,   285,   286,     0,    10,    11,    12,    13,    14,
      15,    16,    17,    21,    52,    53,    54,   126,   509,   154,
      57,   126,   295,    41,    99,   100,   126,   136,    61,   134,
      57,    57,   315,    71,   169,   122,   136,   128,   173,   174,
     175,   176,   177,   178,   126,   185,   137,   182,   183,    23,
     132,    20,   109,   110,   111,    10,    11,    12,    13,    14,
      15,    16,    17,   134,   125,    45,   137,    47,   125,    87,
     508,   128,    41,    42,    43,    44,    45,    46,    47,   126,
     518,    50,   126,    22,   132,    24,    61,   134,   132,   137,
      32,    33,   135,    55,    56,   152,   153,   154,   155,    55,
      56,    57,    27,    28,   125,   136,     3,     4,     3,     4,
      24,   168,   169,     3,     4,     4,   173,   174,   175,   176,
     177,   178,   179,   180,   181,   182,   183,   132,   263,   216,
     217,   218,     3,     4,   407,   125,     5,     6,   125,     8,
       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
      19,    20,    21,    22,   125,    24,    64,    65,    66,    67,
      68,    69,    70,   220,     3,     4,   125,   130,    37,     4,
     128,     4,     4,   242,   431,   128,   433,   132,    24,    48,
       4,    24,    24,   131,   131,   242,    59,   128,     4,     4,
       4,     4,   261,     4,   126,     7,   331,     7,   333,   334,
     335,     7,   129,   126,   261,   262,   263,   342,    10,    11,
      12,    13,    14,    15,    16,    17,   126,   304,   130,   126,
     126,   351,   352,   353,   354,   355,   126,   126,   214,    36,
     126,    24,   126,   363,   364,   365,   366,   367,   224,   126,
     229,   230,   126,   229,   230,   126,   126,    24,   130,   128,
     128,   128,   241,   128,   128,   241,   128,   246,   127,   126,
     246,   130,   128,   128,   133,   128,   135,   256,   257,   258,
     256,   257,   258,   128,   331,   332,   333,   334,   335,   336,
     337,   129,   300,   413,   341,   342,   126,    63,   126,   126,
     126,    34,   126,    24,    21,   126,   126,    21,     4,   128,
     126,   126,    24,   438,   439,   440,   126,   126,     4,   126,
     128,    36,    57,     4,    24,    57,   373,   126,   126,    21,
     450,   451,   452,   453,   129,   455,   456,   457,   385,   459,
     126,   126,   126,   130,   323,   470,   126,   323,   126,   126,
     329,   126,   491,   329,   491,   126,   403,   126,   126,   129,
     132,   126,   126,    36,   343,   344,   129,   343,   344,   129,
     509,   126,   509,   129,   132,   129,   129,   497,   129,   499,
     500,   129,    21,   430,   129,     0,   129,   129,   126,    21,
     126,   438,   439,   440,    76,    21,    21,   444,    97,    97,
      97,    41,    97,   382,    97,   384,   382,    25,   384,   388,
      25,   458,   388,   122,   374,    52,    31,   396,   397,   398,
     396,   397,   398,   470,   214,    61,    41,    42,    43,    44,
      45,    46,    47,   373,     3,    19,   408,   444,   385,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    62,    -1,   428,
     429,    -1,   428,   429,    -1,    -1,    -1,   436,    -1,    -1,
     436,    -1,    -1,    -1,    -1,    -1,   445,    -1,    -1,   445,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,     5,     6,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   472,    -1,    -1,   472,    -1,    -1,    -1,
      22,    -1,    24,    -1,    26,    -1,    -1,    -1,    -1,    -1,
      -1,    20,    -1,    22,    -1,    24,    38,    39,    -1,    -1,
      -1,    -1,    31,    32,    33,    -1,    -1,   506,    -1,    -1,
     506,    -1,    41,    42,    43,    44,    45,    46,    47,    -1,
     519,    50,    51,   519,    -1,    -1,    -1,   526,    -1,    58,
     526,   530,   531,    62,   530,   531,    78,    79,    80,    81,
      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
      92,    93,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,
     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
     112,   113,    -1,   115,   116,   117,   118,    -1,   120,   121,
     122,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,    -1,
      -1,   133,    -1,   135,     5,     6,   138,     8,     9,    10,
      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
      21,    22,    -1,    24,     5,     6,    -1,     8,     9,    10,
      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
      21,    22,    -1,    24,    -1,    -1,    -1,    48,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,     3,     4,     5,     6,     7,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      22,    -1,    24,    -1,    26,    27,    28,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,   127,    -1,    -1,   130,
      -1,    -1,   133,    -1,   135,   136,    -1,    -1,    -1,    61,
      -1,    -1,    -1,    -1,    -1,    -1,   127,    -1,    -1,   130,
      -1,    -1,   133,    -1,   135,   136,    78,    79,    80,    81,
      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
      92,    93,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,
     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
     112,   113,    -1,   115,   116,   117,   118,    -1,   120,   121,
     122,     3,     4,    -1,    -1,     7,    -1,    -1,    -1,    -1,
      -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    26,    27,    28,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    78,    79,    80,    81,
      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
      92,    93,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,
     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
     112,   113,    -1,   115,   116,   117,   118,    -1,   120,   121,
     122,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     5,
       6,   133,     8,     9,    10,    11,    12,    13,    14,    15,
      16,    17,    18,    19,    20,    21,    22,    -1,    24,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    37,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       5,     6,    48,     8,     9,    10,    11,    12,    13,    14,
      15,    16,    17,    18,    19,    20,    21,    22,    -1,    24,
       5,     6,    -1,     8,     9,    10,    11,    12,    13,    14,
      15,    16,    17,    18,    19,    20,    21,    22,    -1,    24,
      -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    37,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,     5,     6,    48,     8,     9,    10,    11,    12,    13,
      14,    15,    16,    17,    18,    19,    20,    21,    22,    -1,
      24,   127,    -1,    -1,   130,    -1,    -1,   133,    -1,   135,
      -1,    -1,    -1,    37,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   127,    -1,    -1,   130,    -1,   132,   133,    -1,
     135,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   127,    -1,    -1,   130,    -1,    -1,   133,    -1,
     135,     5,     6,    -1,     8,     9,    10,    11,    12,    13,
      14,    15,    16,    17,    18,    19,    20,    21,    22,    -1,
      24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   127,    -1,    -1,   130,    -1,    -1,   133,
      -1,   135,     5,     6,    48,     8,     9,    10,    11,    12,
      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
      -1,    24,     5,     6,    -1,     8,     9,    10,    11,    12,
      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
      -1,    24,    -1,    -1,    -1,    48,    -1,     5,     6,    -1,
       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
      18,    19,    20,    21,    22,    48,    24,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   127,    -1,    -1,   130,    -1,    -1,   133,
      48,   135,    -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,   127,    -1,    -1,   130,    -1,    -1,
     133,    -1,   135,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    35,    -1,    -1,   127,    -1,    -1,   130,    -1,    -1,
     133,    -1,   135,    -1,    -1,    49,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    59,    60,    -1,    -1,   127,
      -1,    -1,   130,    -1,    -1,   133,    -1,   135,    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,    -1,    -1,   101,   102,   103,
     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
     124
};

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

#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;						\
      goto yybackup;						\
    }								\
  else								\
    {								\
      yyerror (YY_("syntax error: cannot back up")); \
      YYERROR;							\
    }								\
while (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 (N)								\
	{								\
	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
	}								\
      else								\
	{								\
	  (Current).first_line   = (Current).last_line   =		\
	    YYRHSLOC (Rhs, 0).last_line;				\
	  (Current).first_column = (Current).last_column =		\
	    YYRHSLOC (Rhs, 0).last_column;				\
	}								\
    while (0)
#endif


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

#ifndef YY_LOCATION_PRINT
# if YYLTYPE_IS_TRIVIAL
#  define YY_LOCATION_PRINT(File, Loc)			\
     fprintf (File, "%d.%d-%d.%d",			\
              (Loc).first_line, (Loc).first_column,	\
              (Loc).last_line,  (Loc).last_column)
# else
#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
# endif
#endif


/* YYLEX -- calling `yylex' with the right arguments.  */

#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 (0)

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

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

#if defined (__STDC__) || defined (__cplusplus)
static void
yy_stack_print (short int *bottom, short int *top)
#else
static void
yy_stack_print (bottom, top)
    short int *bottom;
    short int *top;
#endif
{
  YYFPRINTF (stderr, "Stack now");
  for (/* Nothing. */; bottom <= top; ++bottom)
    YYFPRINTF (stderr, " %d", *bottom);
  YYFPRINTF (stderr, "\n");
}

# define YY_STACK_PRINT(Bottom, Top)				\
do {								\
  if (yydebug)							\
    yy_stack_print ((Bottom), (Top));				\
} while (0)


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

#if defined (__STDC__) || defined (__cplusplus)
static void
yy_reduce_print (int yyrule)
#else
static void
yy_reduce_print (yyrule)
    int yyrule;
#endif
{
  int yyi;
  unsigned long int yylno = yyrline[yyrule];
  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
             yyrule - 1, yylno);
  /* Print the symbols being reduced, and their result.  */
  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
}

# define YY_REDUCE_PRINT(Rule)		\
do {					\
  if (yydebug)				\
    yy_reduce_print (Rule);		\
} while (0)

/* Nonzero means print parse trace.  It is left uninitialized so that
   multiple parsers can coexist.  */
int yydebug;
#else /* !YYDEBUG */
# define YYDPRINTF(Args)
# define 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.  */
static YYSIZE_T
#   if defined (__STDC__) || defined (__cplusplus)
yystrlen (const char *yystr)
#   else
yystrlen (yystr)
     const char *yystr;
#   endif
{
  const char *yys = yystr;

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

  return yys - yystr - 1;
}
#  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.  */
static char *
#   if defined (__STDC__) || defined (__cplusplus)
yystpcpy (char *yydest, const char *yysrc)
#   else
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 == '"')
    {
      size_t yyn = 0;
      char const *yyp = yystr;

      for (;;)
	switch (*++yyp)
	  {
	  case '\'':
	  case ',':
	    goto do_not_strip_quotes;

	  case '\\':
	    if (*++yyp != '\\')
	      goto do_not_strip_quotes;
	    /* Fall through.  */
	  default:
	    if (yyres)
	      yyres[yyn] = *yyp;
	    yyn++;
	    break;

	  case '"':
	    if (yyres)
	      yyres[yyn] = '\0';
	    return yyn;
	  }
    do_not_strip_quotes: ;
    }

  if (! yyres)
    return yystrlen (yystr);

  return yystpcpy (yyres, yystr) - yyres;
}
# endif

#endif /* YYERROR_VERBOSE */



#if YYDEBUG
/*--------------------------------.
| Print this symbol on YYOUTPUT.  |
`--------------------------------*/

#if defined (__STDC__) || defined (__cplusplus)
static void
yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
#else
static void
yysymprint (yyoutput, yytype, yyvaluep)
    FILE *yyoutput;
    int yytype;
    YYSTYPE *yyvaluep;
#endif
{
  /* Pacify ``unused variable'' warnings.  */
  (void) yyvaluep;

  if (yytype < YYNTOKENS)
    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
  else
    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);


# ifdef YYPRINT
  if (yytype < YYNTOKENS)
    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
# endif
  switch (yytype)
    {
      default:
        break;
    }
  YYFPRINTF (yyoutput, ")");
}

#endif /* ! YYDEBUG */
/*-----------------------------------------------.
| Release the memory associated to this symbol.  |
`-----------------------------------------------*/

#if defined (__STDC__) || defined (__cplusplus)
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
{
  /* Pacify ``unused variable'' warnings.  */
  (void) 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 (__cplusplus)
int yyparse (void *YYPARSE_PARAM)
# else
int yyparse (YYPARSE_PARAM)
  void *YYPARSE_PARAM;
# endif
#else /* ! YYPARSE_PARAM */
#if defined (__STDC__) || defined (__cplusplus)
int
yyparse (void)
#else
int
yyparse ()

#endif
#endif
{
  
  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;

  /* 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.  */
  short int yyssa[YYINITDEPTH];
  short int *yyss = yyssa;
  short int *yyssp;

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



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

  YYSIZE_T yystacksize = YYINITDEPTH;

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


  /* When reducing, the number of symbols on the RHS of the reduced
     rule.  */
  int yylen;

  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;
	short int *yyss1 = yyss;


	/* Each stack pointer address is followed by the size of the
	   data in use in that stack, in bytes.  This used to be a
	   conditional around just the two extra args, but that might
	   be undefined if yyoverflow is a macro.  */
	yyoverflow (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;

      {
	short int *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.  */
/* yyresume: */

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

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

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

  *++yyvsp = yylval;


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

  yystate = yyn;
  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 3:
#line 1169 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX)     // Outside of my range!
    GEN_ERROR("Value too large for type!");
  (yyval.SIntVal) = (int32_t)(yyvsp[0].UIntVal);
  CHECK_FOR_ERROR
;}
    break;

  case 5:
#line 1178 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  if ((yyvsp[0].UInt64Val) > (uint64_t)INT64_MAX)     // Outside of my range!
    GEN_ERROR("Value too large for type!");
  (yyval.SInt64Val) = (int64_t)(yyvsp[0].UInt64Val);
  CHECK_FOR_ERROR
;}
    break;

  case 51:
#line 1203 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = (yyvsp[-1].StrVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 52:
#line 1207 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.StrVal) = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 53:
#line 1212 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
    break;

  case 54:
#line 1213 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
    break;

  case 55:
#line 1214 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
    break;

  case 56:
#line 1215 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
    break;

  case 57:
#line 1216 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
    break;

  case 58:
#line 1217 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
    break;

  case 59:
#line 1218 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
    break;

  case 60:
#line 1219 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
    break;

  case 61:
#line 1221 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::C; ;}
    break;

  case 62:
#line 1222 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::C; ;}
    break;

  case 63:
#line 1223 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::CSRet; ;}
    break;

  case 64:
#line 1224 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::Fast; ;}
    break;

  case 65:
#line 1225 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::Cold; ;}
    break;

  case 66:
#line 1226 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::X86_StdCall; ;}
    break;

  case 67:
#line 1227 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = CallingConv::X86_FastCall; ;}
    break;

  case 68:
#line 1228 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
                   if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val))
                     GEN_ERROR("Calling conv too large!");
                   (yyval.UIntVal) = (yyvsp[0].UInt64Val);
                  CHECK_FOR_ERROR
                 ;}
    break;

  case 69:
#line 1237 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = 0; ;}
    break;

  case 70:
#line 1238 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.UIntVal) = (yyvsp[0].UInt64Val);
  if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
    GEN_ERROR("Alignment must be a power of two!");
  CHECK_FOR_ERROR
;}
    break;

  case 71:
#line 1244 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.UIntVal) = 0; ;}
    break;

  case 72:
#line 1245 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.UIntVal) = (yyvsp[0].UInt64Val);
  if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
    GEN_ERROR("Alignment must be a power of two!");
  CHECK_FOR_ERROR
;}
    break;

  case 73:
#line 1253 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i)
    if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\')
      GEN_ERROR("Invalid character in section name!");
  (yyval.StrVal) = (yyvsp[0].StrVal);
  CHECK_FOR_ERROR
;}
    break;

  case 74:
#line 1261 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = 0; ;}
    break;

  case 75:
#line 1262 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = (yyvsp[0].StrVal); ;}
    break;

  case 76:
#line 1267 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {;}
    break;

  case 77:
#line 1268 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {;}
    break;

  case 78:
#line 1269 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV->setSection((yyvsp[0].StrVal));
    free((yyvsp[0].StrVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 79:
#line 1274 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val)))
      GEN_ERROR("Alignment must be a power of two!");
    CurGV->setAlignment((yyvsp[0].UInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 81:
#line 1288 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { 
    (yyval.TypeVal).type = new PATypeHolder((yyvsp[0].TypeVal).type->get());
    (yyval.TypeVal).signedness = (yyvsp[0].TypeVal).signedness;
;}
    break;

  case 83:
#line 1292 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { 
    (yyval.TypeVal).type = new PATypeHolder((yyvsp[0].TypeVal).type->get()); 
    (yyval.TypeVal).signedness = (yyvsp[0].TypeVal).signedness;
;}
    break;

  case 84:
#line 1297 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + 
        ((yyvsp[0].TypeVal).type->get())->getDescription());
    (yyval.TypeVal) = (yyvsp[0].TypeVal);
    CHECK_FOR_ERROR
;}
    break;

  case 98:
#line 1310 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeVal).type = new PATypeHolder(OpaqueType::get());
    (yyval.TypeVal).signedness = isSignless;
    CHECK_FOR_ERROR
  ;}
    break;

  case 99:
#line 1315 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeVal) = (yyvsp[0].TypeVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 100:
#line 1319 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {            // Named types are also simple types...
  const Type* tmp = getTypeVal((yyvsp[0].ValIDVal));
  CHECK_FOR_ERROR
  (yyval.TypeVal).type = new PATypeHolder(tmp);
  (yyval.TypeVal).signedness = isSignless;
;}
    break;

  case 101:
#line 1328 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                   // Type UpReference
    if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range!");
    OpaqueType *OT = OpaqueType::get();        // Use temporary placeholder
    UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT));  // Add to vector...
    (yyval.TypeVal).type = new PATypeHolder(OT);
    (yyval.TypeVal).signedness = isSignless;
    UR_OUT("New Upreference!\n");
    CHECK_FOR_ERROR
  ;}
    break;

  case 102:
#line 1337 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {           // Function derived type?
    std::vector<const Type*> Params;
    for (std::list<TypeInfo>::iterator I = (yyvsp[-1].TypeList)->begin(),
           E = (yyvsp[-1].TypeList)->end(); I != E; ++I)
      Params.push_back(I->type->get());
    bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
    if (isVarArg) Params.pop_back();

    (yyval.TypeVal).type = new PATypeHolder(HandleUpRefs(
               FunctionType::get((yyvsp[-3].TypeVal).type->get(),Params,isVarArg)));
    (yyval.TypeVal).signedness = isSignless;
    delete (yyvsp[-1].TypeList);      // Delete the argument list
    delete (yyvsp[-3].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 103:
#line 1352 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {          // Sized array type?
    (yyval.TypeVal).type = new PATypeHolder(HandleUpRefs(
      ArrayType::get((yyvsp[-1].TypeVal).type->get(), (unsigned)(yyvsp[-3].UInt64Val))));
    (yyval.TypeVal).signedness = isSignless;
    delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 104:
#line 1359 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {          // Packed array type?
    const llvm::Type* ElemTy = (yyvsp[-1].TypeVal).type->get();
    if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val))
      GEN_ERROR("Unsigned result not equal to signed result");
    if (!ElemTy->isPrimitiveType())
      GEN_ERROR("Elemental type of a PackedType must be primitive");
    if (!isPowerOf2_32((yyvsp[-3].UInt64Val)))
      GEN_ERROR("Vector length should be a power of 2!");
    (yyval.TypeVal).type = new PATypeHolder(HandleUpRefs(
                PackedType::get((yyvsp[-1].TypeVal).type->get(), (unsigned)(yyvsp[-3].UInt64Val))));
    (yyval.TypeVal).signedness = isSignless;
    delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 105:
#line 1373 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                        // Structure type?
    std::vector<const Type*> Elements;
    for (std::list<TypeInfo>::iterator I = (yyvsp[-1].TypeList)->begin(),
           E = (yyvsp[-1].TypeList)->end(); I != E; ++I)
      Elements.push_back(I->type->get());

    (yyval.TypeVal).type = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
    (yyval.TypeVal).signedness = isSignless;
    delete (yyvsp[-1].TypeList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 106:
#line 1384 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                                  // Empty structure type?
    (yyval.TypeVal).type = new PATypeHolder(StructType::get(std::vector<const Type*>()));
    (yyval.TypeVal).signedness = isSignless;
    CHECK_FOR_ERROR
  ;}
    break;

  case 107:
#line 1389 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                             // Pointer type?
    if ((yyvsp[-1].TypeVal).type->get() == Type::LabelTy)
      GEN_ERROR("Cannot form a pointer to a basic block");
    (yyval.TypeVal).type = new PATypeHolder(HandleUpRefs(PointerType::get((yyvsp[-1].TypeVal).type->get())));
    (yyval.TypeVal).signedness = (yyvsp[-1].TypeVal).signedness;
    delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 108:
#line 1401 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeList) = new std::list<TypeInfo>();
    (yyval.TypeList)->push_back((yyvsp[0].TypeVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 109:
#line 1406 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back((yyvsp[0].TypeVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 111:
#line 1413 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    TypeInfo TI; 
    TI.type = new PATypeHolder(Type::VoidTy); TI.signedness = isSignless;
    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(TI);
    CHECK_FOR_ERROR
  ;}
    break;

  case 112:
#line 1419 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    TypeInfo TI; 
    TI.type = new PATypeHolder(Type::VoidTy); TI.signedness = isSignless;
    ((yyval.TypeList) = new std::list<TypeInfo>())->push_back(TI);
    CHECK_FOR_ERROR
  ;}
    break;

  case 113:
#line 1425 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TypeList) = new std::list<TypeInfo>();
    CHECK_FOR_ERROR
  ;}
    break;

  case 114:
#line 1436 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { // Nonempty unsized arr
    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-3].TypeVal).type->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     ((yyvsp[-3].TypeVal).type->get())->getDescription() + "'!");
    const Type *ETy = ATy->getElementType();
    int NumElements = ATy->getNumElements();

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

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

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

  case 115:
#line 1462 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal).type->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     ((yyvsp[-2].TypeVal).type->get())->getDescription() + "'!");

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

  case 116:
#line 1476 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal).type->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     ((yyvsp[-2].TypeVal).type->get())->getDescription() + "'!");

    int NumElements = ATy->getNumElements();
    const Type *ETy = ATy->getElementType();
    char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
    if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal)))
      GEN_ERROR("Can't build string constant of size " + 
                     itostr((int)(EndStr-(yyvsp[0].StrVal))) +
                     " when array has size " + itostr(NumElements) + "!");
    std::vector<Constant*> Vals;
    if (ETy == Type::SByteTy) {
      for (signed char *C = (signed char *)(yyvsp[0].StrVal); C != (signed char *)EndStr; ++C)
        Vals.push_back(ConstantInt::get(ETy, *C));
    } else if (ETy == Type::UByteTy) {
      for (unsigned char *C = (unsigned char *)(yyvsp[0].StrVal); 
           C != (unsigned char*)EndStr; ++C)
        Vals.push_back(ConstantInt::get(ETy, *C));
    } else {
      free((yyvsp[0].StrVal));
      GEN_ERROR("Cannot build string arrays of non byte sized elements!");
    }
    free((yyvsp[0].StrVal));
    (yyval.ConstVal) = ConstantArray::get(ATy, Vals);
    delete (yyvsp[-2].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 117:
#line 1506 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { // Nonempty unsized arr
    const PackedType *PTy = dyn_cast<PackedType>((yyvsp[-3].TypeVal).type->get());
    if (PTy == 0)
      GEN_ERROR("Cannot make packed constant with type: '" + 
                     (yyvsp[-3].TypeVal).type->get()->getDescription() + "'!");
    const Type *ETy = PTy->getElementType();
    int NumElements = PTy->getNumElements();

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

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

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

  case 118:
#line 1532 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const StructType *STy = dyn_cast<StructType>((yyvsp[-3].TypeVal).type->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (yyvsp[-3].TypeVal).type->get()->getDescription() + "'!");

    if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes())
      GEN_ERROR("Illegal number of initializers for structure type!");

    // Check to ensure that constants are compatible with the type initializer!
    for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i)
      if ((*(yyvsp[-1].ConstVector))[i]->getType() != STy->getElementType(i))
        GEN_ERROR("Expected type '" +
                       STy->getElementType(i)->getDescription() +
                       "' for element #" + utostr(i) +
                       " of structure initializer!");

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

  case 119:
#line 1553 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const StructType *STy = dyn_cast<StructType>((yyvsp[-2].TypeVal).type->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (yyvsp[-2].TypeVal).type->get()->getDescription() + "'!");

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

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

  case 120:
#line 1566 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal).type->get());
    if (PTy == 0)
      GEN_ERROR("Cannot make null pointer constant with type: '" + 
                     (yyvsp[-1].TypeVal).type->get()->getDescription() + "'!");

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

  case 121:
#line 1576 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ConstVal) = UndefValue::get((yyvsp[-1].TypeVal).type->get());
    delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 122:
#line 1581 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const PointerType *Ty = dyn_cast<PointerType>((yyvsp[-1].TypeVal).type->get());
    if (Ty == 0)
      GEN_ERROR("Global const reference must be a pointer type!");

    // 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, getValNonImprovising 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
    // getValNonImprovising that we are at global scope here.
    //
    Function *SavedCurFn = CurFun.CurrentFunction;
    CurFun.CurrentFunction = 0;

    Value *V = getValNonImprovising(Ty, (yyvsp[0].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[0].ValIDVal)));
    
      if (I != CurModule.GlobalRefs.end()) {
        V = I->second;             // Placeholder already exists, use it...
        (yyvsp[0].ValIDVal).destroy();
      } else {
        std::string Name;
        if ((yyvsp[0].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[0].ValIDVal).Name;

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

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

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

  case 123:
#line 1642 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[-1].TypeVal).type->get() != (yyvsp[0].ConstVal)->getType())
      GEN_ERROR("Mismatched types for constant expression!");
    (yyval.ConstVal) = (yyvsp[0].ConstVal);
    delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 124:
#line 1649 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const Type *Ty = (yyvsp[-1].TypeVal).type->get();
    if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
      GEN_ERROR("Cannot create a null initialized value of this type!");
    (yyval.ConstVal) = Constant::getNullValue(Ty);
    delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 125:
#line 1658 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {      // integral constants
    if (!ConstantInt::isValueValidForType((yyvsp[-1].TypeVal).type->get(), (yyvsp[0].SInt64Val)))
      GEN_ERROR("Constant value doesn't fit in type!");
    (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].TypeVal).type->get(), (yyvsp[0].SInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 126:
#line 1664 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {            // integral constants
    if (!ConstantInt::isValueValidForType((yyvsp[-1].TypeVal).type->get(), (yyvsp[0].UInt64Val)))
      GEN_ERROR("Constant value doesn't fit in type!");
    (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].TypeVal).type->get(), (yyvsp[0].UInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 127:
#line 1670 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                      // Boolean constants
    (yyval.ConstVal) = ConstantBool::getTrue();
    CHECK_FOR_ERROR
  ;}
    break;

  case 128:
#line 1674 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                     // Boolean constants
    (yyval.ConstVal) = ConstantBool::getFalse();
    CHECK_FOR_ERROR
  ;}
    break;

  case 129:
#line 1678 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                   // Float & Double constants
    if (!ConstantFP::isValueValidForType((yyvsp[-1].TypeVal).type->get(), (yyvsp[0].FPVal)))
      GEN_ERROR("Floating point constant invalid for type!!");
    (yyval.ConstVal) = ConstantFP::get((yyvsp[-1].TypeVal).type->get(), (yyvsp[0].FPVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 130:
#line 1686 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    Constant *Val = (yyvsp[-3].ConstVal);
    const Type *Ty = (yyvsp[-1].TypeVal).type->get();
    if (!Val->getType()->isFirstClassType())
      GEN_ERROR("cast constant expression from a non-primitive type: '" +
                     Val->getType()->getDescription() + "'!");
    if (!Ty->isFirstClassType())
      GEN_ERROR("cast constant expression to a non-primitive type: '" +
                Ty->getDescription() + "'!");
    if ((yyvsp[-5].CastOpVal).obsolete) {
      if (Ty == Type::BoolTy) {
        // The previous definition of cast to bool was a compare against zero. 
        // We have to retain that semantic so we do it here.
        (yyval.ConstVal) = ConstantExpr::get(Instruction::SetNE, Val, 
                               Constant::getNullValue(Val->getType()));
      } else if (Val->getType()->isFloatingPoint() && isa<PointerType>(Ty)) {
        Constant *CE = ConstantExpr::getFPToUI(Val, Type::ULongTy);
        (yyval.ConstVal) = ConstantExpr::getIntToPtr(CE, Ty);
      } else {
        (yyval.ConstVal) = ConstantExpr::getCast(Val, Ty);
      }
    } else {
      (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-5].CastOpVal).opcode, (yyvsp[-3].ConstVal), (yyvsp[-1].TypeVal).type->get());
    }
    delete (yyvsp[-1].TypeVal).type;
  ;}
    break;

  case 131:
#line 1712 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!isa<PointerType>((yyvsp[-2].ConstVal)->getType()))
      GEN_ERROR("GetElementPtr requires a pointer operand!");

    // LLVM 1.2 and earlier used ubyte struct indices.  Convert any ubyte struct
    // indices to uint struct indices for compatibility.
    generic_gep_type_iterator<std::vector<Value*>::iterator>
      GTI = gep_type_begin((yyvsp[-2].ConstVal)->getType(), (yyvsp[-1].ValueList)->begin(), (yyvsp[-1].ValueList)->end()),
      GTE = gep_type_end((yyvsp[-2].ConstVal)->getType(), (yyvsp[-1].ValueList)->begin(), (yyvsp[-1].ValueList)->end());
    for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e && GTI != GTE; ++i, ++GTI)
      if (isa<StructType>(*GTI))        // Only change struct indices
        if (ConstantInt *CUI = dyn_cast<ConstantInt>((*(yyvsp[-1].ValueList))[i]))
          if (CUI->getType() == Type::UByteTy)
            (*(yyvsp[-1].ValueList))[i] = ConstantExpr::getCast(CUI, Type::UIntTy);

    const Type *IdxTy =
      GetElementPtrInst::getIndexedType((yyvsp[-2].ConstVal)->getType(), *(yyvsp[-1].ValueList), true);
    if (!IdxTy)
      GEN_ERROR("Index list invalid for constant getelementptr!");

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

    delete (yyvsp[-1].ValueList);

    (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal), IdxVec);
    CHECK_FOR_ERROR
  ;}
    break;

  case 132:
#line 1744 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[-5].ConstVal)->getType() != Type::BoolTy)
      GEN_ERROR("Select condition must be of boolean type!");
    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
      GEN_ERROR("Select operand types must match!");
    (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 133:
#line 1752 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
      GEN_ERROR("Binary operator types must match!");
    // First, make sure we're dealing with the right opcode by upgrading from
    // obsolete versions.
    sanitizeOpcode((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal)->getType());
    CHECK_FOR_ERROR;

    // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs.
    // To retain backward compatibility with these early compilers, we emit a
    // cast to the appropriate integer type automatically if we are in the
    // broken case.  See PR424 for more information.
    if (!isa<PointerType>((yyvsp[-3].ConstVal)->getType())) {
      (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal).opcode, (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
    } else {
      const Type *IntPtrTy = 0;
      switch (CurModule.CurrentModule->getPointerSize()) {
      case Module::Pointer32: IntPtrTy = Type::IntTy; break;
      case Module::Pointer64: IntPtrTy = Type::LongTy; break;
      default: GEN_ERROR("invalid pointer binary constant expr!");
      }
      (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal).opcode, ConstantExpr::getCast((yyvsp[-3].ConstVal), IntPtrTy),
                             ConstantExpr::getCast((yyvsp[-1].ConstVal), IntPtrTy));
      (yyval.ConstVal) = ConstantExpr::getCast((yyval.ConstVal), (yyvsp[-3].ConstVal)->getType());
    }
    CHECK_FOR_ERROR
  ;}
    break;

  case 134:
#line 1779 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
      GEN_ERROR("Logical operator types must match!");
    if (!(yyvsp[-3].ConstVal)->getType()->isIntegral()) {
      if (!isa<PackedType>((yyvsp[-3].ConstVal)->getType()) || 
          !cast<PackedType>((yyvsp[-3].ConstVal)->getType())->getElementType()->isIntegral())
        GEN_ERROR("Logical operator requires integral operands!");
    }
    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal).opcode, (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 135:
#line 1790 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
      GEN_ERROR("setcc operand types must match!");
    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal).opcode, (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 136:
#line 1796 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[-1].ConstVal)->getType() != Type::UByteTy)
      GEN_ERROR("Shift count for shift constant must be unsigned byte!");
    if (!(yyvsp[-3].ConstVal)->getType()->isInteger())
      GEN_ERROR("Shift constant expression requires integer operand!");
    // Handle opcode upgrade situations
    sanitizeOpcode((yyvsp[-5].OtherOpVal), (yyvsp[-3].ConstVal)->getType());
    CHECK_FOR_ERROR;
    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].OtherOpVal).opcode, (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 137:
#line 1807 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
      GEN_ERROR("Invalid extractelement operands!");
    (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 138:
#line 1813 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
      GEN_ERROR("Invalid insertelement operands!");
    (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 139:
#line 1819 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
      GEN_ERROR("Invalid shufflevector operands!");
    (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 140:
#line 1828 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 141:
#line 1832 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ConstVector) = new std::vector<Constant*>();
    (yyval.ConstVector)->push_back((yyvsp[0].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 142:
#line 1840 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = false; ;}
    break;

  case 143:
#line 1840 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.BoolVal) = true; ;}
    break;

  case 144:
#line 1850 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal);
  CurModule.ModuleDone();
  CHECK_FOR_ERROR;
;}
    break;

  case 145:
#line 1858 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = (yyvsp[-1].ModuleVal);
    CurFun.FunctionDone();
    CHECK_FOR_ERROR
  ;}
    break;

  case 146:
#line 1863 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = (yyvsp[-1].ModuleVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 147:
#line 1867 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = (yyvsp[-3].ModuleVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 148:
#line 1871 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = (yyvsp[-1].ModuleVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 149:
#line 1875 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ModuleVal) = CurModule.CurrentModule;
    // Emit an error if there are any unresolved types left.
    if (!CurModule.LateResolveTypes.empty()) {
      const ValID &DID = CurModule.LateResolveTypes.begin()->first;
      if (DID.Type == ValID::NameVal) {
        GEN_ERROR("Reference to an undefined type: '"+DID.getName() + "'");
      } else {
        GEN_ERROR("Reference to an undefined type: #" + itostr(DID.Num));
      }
    }
    CHECK_FOR_ERROR
  ;}
    break;

  case 150:
#line 1890 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    // 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[-2].StrVal), (yyvsp[0].TypeVal).type->get());

    if (!setTypeName((yyvsp[0].TypeVal).type->get(), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) {
      CHECK_FOR_ERROR
      // If this is a named type that is not a redefinition, add it to the slot
      // table.
      CurModule.Types.push_back((yyvsp[0].TypeVal));
    } else {
      delete (yyvsp[0].TypeVal).type;
    }
    CHECK_FOR_ERROR
  ;}
    break;

  case 151:
#line 1912 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {       // Function prototypes can be in const pool
    CHECK_FOR_ERROR
  ;}
    break;

  case 152:
#line 1915 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {  // Asm blocks can be in the const pool
    CHECK_FOR_ERROR
  ;}
    break;

  case 153:
#line 1918 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[0].ConstVal) == 0) 
      GEN_ERROR("Global value initializer is not a constant!");
    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), (yyvsp[-2].Linkage), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 154:
#line 1923 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
  ;}
    break;

  case 155:
#line 1926 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal),
      (yyvsp[0].TypeVal).type->get(), 0);
    CHECK_FOR_ERROR
    delete (yyvsp[0].TypeVal).type;
  ;}
    break;

  case 156:
#line 1931 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 157:
#line 1935 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal),
      (yyvsp[0].TypeVal).type->get(), 0);
    CHECK_FOR_ERROR
    delete (yyvsp[0].TypeVal).type;
  ;}
    break;

  case 158:
#line 1940 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 159:
#line 1944 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 
      ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[-1].BoolVal),
        (yyvsp[0].TypeVal).type->get(), 0);
    CHECK_FOR_ERROR
    delete (yyvsp[0].TypeVal).type;
  ;}
    break;

  case 160:
#line 1950 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurGV = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 161:
#line 1954 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { 
    CHECK_FOR_ERROR
  ;}
    break;

  case 162:
#line 1957 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CHECK_FOR_ERROR
  ;}
    break;

  case 163:
#line 1960 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { 
  ;}
    break;

  case 164:
#line 1964 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
  char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
  std::string NewAsm((yyvsp[0].StrVal), EndStr);
  free((yyvsp[0].StrVal));

  if (AsmSoFar.empty())
    CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
  else
    CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
  CHECK_FOR_ERROR
;}
    break;

  case 165:
#line 1977 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Endianness) = Module::BigEndian; ;}
    break;

  case 166:
#line 1978 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.Endianness) = Module::LittleEndian; ;}
    break;

  case 167:
#line 1980 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurModule.CurrentModule->setEndianness((yyvsp[0].Endianness));
    CHECK_FOR_ERROR
  ;}
    break;

  case 168:
#line 1984 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[0].UInt64Val) == 32)
      CurModule.CurrentModule->setPointerSize(Module::Pointer32);
    else if ((yyvsp[0].UInt64Val) == 64)
      CurModule.CurrentModule->setPointerSize(Module::Pointer64);
    else
      GEN_ERROR("Invalid pointer size: '" + utostr((yyvsp[0].UInt64Val)) + "'!");
    CHECK_FOR_ERROR
  ;}
    break;

  case 169:
#line 1993 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal));
    free((yyvsp[0].StrVal));
  ;}
    break;

  case 170:
#line 1997 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal));
    free((yyvsp[0].StrVal));
  ;}
    break;

  case 172:
#line 2004 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
          CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
          free((yyvsp[0].StrVal));
          CHECK_FOR_ERROR
        ;}
    break;

  case 173:
#line 2009 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
          CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
          free((yyvsp[0].StrVal));
          CHECK_FOR_ERROR
        ;}
    break;

  case 174:
#line 2014 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
          CHECK_FOR_ERROR
        ;}
    break;

  case 178:
#line 2024 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.StrVal) = 0; ;}
    break;

  case 179:
#line 2026 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  if ((yyvsp[-1].TypeVal).type->get() == Type::VoidTy)
    GEN_ERROR("void typed arguments are invalid!");
  (yyval.ArgVal) = new std::pair<TypeInfo, char*>((yyvsp[-1].TypeVal), (yyvsp[0].StrVal));
  CHECK_FOR_ERROR
;}
    break;

  case 180:
#line 2033 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = (yyvsp[-2].ArgList);
    (yyvsp[-2].ArgList)->push_back(*(yyvsp[0].ArgVal));
    delete (yyvsp[0].ArgVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 181:
#line 2039 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = new std::vector<std::pair<TypeInfo,char*> >();
    (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal));
    delete (yyvsp[0].ArgVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 182:
#line 2046 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = (yyvsp[0].ArgList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 183:
#line 2050 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = (yyvsp[-2].ArgList);
    TypeInfo TI;
    TI.type = new PATypeHolder(Type::VoidTy);
    TI.signedness = isSignless;
    (yyval.ArgList)->push_back(std::pair<TypeInfo,char*>(TI,(char*)0));
    CHECK_FOR_ERROR
  ;}
    break;

  case 184:
#line 2058 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = new std::vector<std::pair<TypeInfo,char*> >();
    TypeInfo TI;
    TI.type = new PATypeHolder(Type::VoidTy);
    TI.signedness = isSignless;
    (yyval.ArgList)->push_back(std::make_pair(TI, (char*)0));
    CHECK_FOR_ERROR
  ;}
    break;

  case 185:
#line 2066 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ArgList) = 0;
    CHECK_FOR_ERROR
  ;}
    break;

  case 186:
#line 2072 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  UnEscapeLexed((yyvsp[-5].StrVal));
  std::string FunctionName((yyvsp[-5].StrVal));
  free((yyvsp[-5].StrVal));  // Free strdup'd memory!
  
  if (!((yyvsp[-6].TypeVal).type->get())->isFirstClassType() && (yyvsp[-6].TypeVal).type->get() != Type::VoidTy)
    GEN_ERROR("LLVM functions cannot return aggregate types!");

  std::vector<const Type*> ParamTypeList;
  if ((yyvsp[-3].ArgList)) {   // If there are arguments...
    for (std::vector<std::pair<TypeInfo,char*> >::iterator I = (yyvsp[-3].ArgList)->begin();
         I != (yyvsp[-3].ArgList)->end(); ++I)
      ParamTypeList.push_back(I->first.type->get());
  }

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

  const FunctionType *FT = FunctionType::get((yyvsp[-6].TypeVal).type->get(), ParamTypeList, 
    isVarArg);
  const PointerType *PFT = PointerType::get(FT);
  delete (yyvsp[-6].TypeVal).type;

  ValID ID;
  if (!FunctionName.empty()) {
    ID = ValID::create((char*)FunctionName.c_str());
  } else {
    ID = ValID::create((int)CurModule.Values[PFT].size());
  }

  Function *Fn = 0;
  // See if this function was forward referenced.  If so, recycle the object.
  if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
    // Move the function to the end of the list, from whereever it was 
    // previously inserted.
    Fn = cast<Function>(FWRef);
    CurModule.CurrentModule->getFunctionList().remove(Fn);
    CurModule.CurrentModule->getFunctionList().push_back(Fn);
  } else if (!FunctionName.empty() &&     // Merge with an earlier prototype?
             (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) {
    // If this is the case, either we need to be a forward decl, or it needs 
    // to be.
    if (!CurFun.isDeclare && !Fn->isExternal())
      GEN_ERROR("Redefinition of function '" + FunctionName + "'!");
    
    // Make sure to strip off any argument names so we can't get conflicts.
    if (Fn->isExternal())
      for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
           AI != AE; ++AI)
        AI->setName("");
  } else  {  // Not already defined?
    Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
                      CurModule.CurrentModule);

    InsertValue(Fn, CurModule.Values);
  }

  CurFun.FunctionStart(Fn);

  if (CurFun.isDeclare) {
    // If we have declaration, always overwrite linkage.  This will allow us to
    // correctly handle cases, when pointer to function is passed as argument to
    // another function.
    Fn->setLinkage(CurFun.Linkage);
  }
  Fn->setCallingConv((yyvsp[-7].UIntVal));
  Fn->setAlignment((yyvsp[0].UIntVal));
  if ((yyvsp[-1].StrVal)) {
    Fn->setSection((yyvsp[-1].StrVal));
    free((yyvsp[-1].StrVal));
  }

  // Add all of the arguments we parsed to the function...
  if ((yyvsp[-3].ArgList)) {                     // Is null if empty...
    if (isVarArg) {  // Nuke the last entry
      assert((yyvsp[-3].ArgList)->back().first.type->get() == Type::VoidTy && 
             (yyvsp[-3].ArgList)->back().second == 0 && "Not a varargs marker!");
      delete (yyvsp[-3].ArgList)->back().first.type;
      (yyvsp[-3].ArgList)->pop_back();  // Delete the last entry
    }
    Function::arg_iterator ArgIt = Fn->arg_begin();
    for (std::vector<std::pair<TypeInfo,char*> >::iterator I = (yyvsp[-3].ArgList)->begin();
         I != (yyvsp[-3].ArgList)->end(); ++I, ++ArgIt) {
      delete I->first.type;                     // Delete the typeholder...
      setValueName(ArgIt, I->second);           // Insert arg into symtab...
      CHECK_FOR_ERROR
      InsertValue(ArgIt);
    }
    delete (yyvsp[-3].ArgList);                     // We're now done with the argument list
  }
  CHECK_FOR_ERROR
;}
    break;

  case 189:
#line 2167 "/proj/llvm/llvm-1/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[-2].Linkage));
;}
    break;

  case 192:
#line 2177 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
  CHECK_FOR_ERROR
;}
    break;

  case 194:
#line 2183 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;}
    break;

  case 195:
#line 2184 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;}
    break;

  case 196:
#line 2186 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { CurFun.isDeclare = true; ;}
    break;

  case 197:
#line 2186 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.FunctionVal) = CurFun.CurrentFunction;
    CurFun.FunctionDone();
    CHECK_FOR_ERROR
  ;}
    break;

  case 198:
#line 2196 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 199:
#line 2200 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 200:
#line 2205 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {    // A reference to a direct constant
    (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 201:
#line 2209 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val));
    CHECK_FOR_ERROR
  ;}
    break;

  case 202:
#line 2213 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                     // Perhaps it's an FP constant?
    (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 203:
#line 2217 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create(ConstantBool::getTrue());
    CHECK_FOR_ERROR
  ;}
    break;

  case 204:
#line 2221 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create(ConstantBool::getFalse());
    CHECK_FOR_ERROR
  ;}
    break;

  case 205:
#line 2225 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createNull();
    CHECK_FOR_ERROR
  ;}
    break;

  case 206:
#line 2229 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::createUndef();
    CHECK_FOR_ERROR
  ;}
    break;

  case 207:
#line 2233 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {     // A vector zero constant.
    (yyval.ValIDVal) = ValID::createZeroInit();
    CHECK_FOR_ERROR
  ;}
    break;

  case 208:
#line 2237 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { // Nonempty unsized packed vector
    const Type *ETy = (*(yyvsp[-1].ConstVector))[0]->getType();
    int NumElements = (yyvsp[-1].ConstVector)->size(); 
    
    PackedType* pt = PackedType::get(ETy, NumElements);
    PATypeHolder* PTy = new PATypeHolder(
       HandleUpRefs(PackedType::get( ETy, NumElements)));
    
    // Verify all elements are correct type!
    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
      if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType())
        GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
                     ETy->getDescription() +"' as required!\nIt is of type '" +
                     (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'.");
    }

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

  case 209:
#line 2257 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 210:
#line 2261 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    char *End = UnEscapeLexed((yyvsp[-2].StrVal), true);
    std::string AsmStr = std::string((yyvsp[-2].StrVal), End);
    End = UnEscapeLexed((yyvsp[0].StrVal), true);
    std::string Constraints = std::string((yyvsp[0].StrVal), End);
    (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[-3].BoolVal));
    free((yyvsp[-2].StrVal));
    free((yyvsp[0].StrVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 211:
#line 2275 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {  // Is it an integer reference...?
    (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 212:
#line 2279 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                   // Is it a named reference...?
    (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 215:
#line 2291 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValueVal) = getVal((yyvsp[-1].TypeVal).type->get(), (yyvsp[0].ValIDVal)); delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 216:
#line 2296 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 217:
#line 2300 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { // Do not allow functions with 0 basic blocks   
    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 218:
#line 2309 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal));
    CHECK_FOR_ERROR
    InsertValue((yyvsp[0].TermInstVal));

    (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal));
    InsertValue((yyvsp[-2].BasicBlockVal));
    (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 219:
#line 2320 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (CastInst *CI1 = dyn_cast<CastInst>((yyvsp[0].InstVal)))
      if (CastInst *CI2 = dyn_cast<CastInst>(CI1->getOperand(0)))
        if (CI2->getParent() == 0)
          (yyvsp[-1].BasicBlockVal)->getInstList().push_back(CI2);
    (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal));
    (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 220:
#line 2329 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true);
    CHECK_FOR_ERROR

    // Make sure to move the basic block to the correct location in the
    // function, instead of leaving it inserted wherever it was first
    // referenced.
    Function::BasicBlockListType &BBL = 
      CurFun.CurrentFunction->getBasicBlockList();
    BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 221:
#line 2341 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[0].StrVal)), true);
    CHECK_FOR_ERROR

    // Make sure to move the basic block to the correct location in the
    // function, instead of leaving it inserted wherever it was first
    // referenced.
    Function::BasicBlockListType &BBL = 
      CurFun.CurrentFunction->getBasicBlockList();
    BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 222:
#line 2354 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {              // Return with a result...
    (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 223:
#line 2358 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                                       // Return with no result...
    (yyval.TermInstVal) = new ReturnInst();
    CHECK_FOR_ERROR
  ;}
    break;

  case 224:
#line 2362 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {                         // Unconditional Branch...
    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.TermInstVal) = new BranchInst(tmpBB);
  ;}
    break;

  case 225:
#line 2367 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {  
    BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal = getVal(Type::BoolTy, (yyvsp[-6].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal);
  ;}
    break;

  case 226:
#line 2376 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    Value* tmpVal = getVal((yyvsp[-7].TypeVal).type->get(), (yyvsp[-6].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal));
    CHECK_FOR_ERROR
    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size());
    (yyval.TermInstVal) = S;

    std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[-1].JumpTable)->begin(),
      E = (yyvsp[-1].JumpTable)->end();
    for (; I != E; ++I) {
      if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
          S->addCase(CI, I->second);
      else
        GEN_ERROR("Switch case is constant, but not a simple integer!");
    }
    delete (yyvsp[-1].JumpTable);
    CHECK_FOR_ERROR
  ;}
    break;

  case 227:
#line 2395 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    Value* tmpVal = getVal((yyvsp[-6].TypeVal).type->get(), (yyvsp[-5].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal));
    CHECK_FOR_ERROR
    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
    (yyval.TermInstVal) = S;
    CHECK_FOR_ERROR
  ;}
    break;

  case 228:
#line 2405 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const PointerType *PFTy;
    const FunctionType *Ty;

    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-10].TypeVal).type->get())) ||
        !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
      // Pull out the types of all of the arguments...
      std::vector<const Type*> ParamTypes;
      if ((yyvsp[-7].ValueList)) {
        for (std::vector<Value*>::iterator I = (yyvsp[-7].ValueList)->begin(), E = (yyvsp[-7].ValueList)->end();
             I != E; ++I)
          ParamTypes.push_back((*I)->getType());
      }

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

      Ty = FunctionType::get((yyvsp[-10].TypeVal).type->get(), ParamTypes, isVarArg);
      PFTy = PointerType::get(Ty);
    }

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

    // Create the call node...
    if (!(yyvsp[-7].ValueList)) {                                   // Has no arguments?
      (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector<Value*>());
    } else {                                     // Has arguments?
      // Loop through FunctionType's arguments and ensure they are specified
      // correctly!
      //
      FunctionType::param_iterator I = Ty->param_begin();
      FunctionType::param_iterator E = Ty->param_end();
      std::vector<Value*>::iterator ArgI = (yyvsp[-7].ValueList)->begin(), ArgE = (yyvsp[-7].ValueList)->end();

      for (; ArgI != ArgE && I != E; ++ArgI, ++I)
        if ((*ArgI)->getType() != *I)
          GEN_ERROR("Parameter " +(*ArgI)->getName()+ " is not of type '" +
                         (*I)->getDescription() + "'!");

      if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
        GEN_ERROR("Invalid number of parameters detected!");

      (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, *(yyvsp[-7].ValueList));
    }
    cast<InvokeInst>((yyval.TermInstVal))->setCallingConv((yyvsp[-11].UIntVal));
  
    delete (yyvsp[-10].TypeVal).type;
    delete (yyvsp[-7].ValueList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 229:
#line 2460 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TermInstVal) = new UnwindInst();
    CHECK_FOR_ERROR
  ;}
    break;

  case 230:
#line 2464 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.TermInstVal) = new UnreachableInst();
    CHECK_FOR_ERROR
  ;}
    break;

  case 231:
#line 2471 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.JumpTable) = (yyvsp[-5].JumpTable);
    Constant *V = cast<Constant>(getValNonImprovising((yyvsp[-4].TypeVal).type->get(), (yyvsp[-3].ValIDVal)));
    CHECK_FOR_ERROR
    if (V == 0)
      GEN_ERROR("May only switch on a constant pool value!");

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

  case 232:
#line 2482 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.JumpTable) = new std::vector<std::pair<Constant*, BasicBlock*> >();
    Constant *V = cast<Constant>(getValNonImprovising((yyvsp[-4].TypeVal).type->get(), (yyvsp[-3].ValIDVal)));
    CHECK_FOR_ERROR

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

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

  case 233:
#line 2495 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
  // Is this definition named?? if so, assign the name...
  setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal));
  CHECK_FOR_ERROR
  InsertValue((yyvsp[0].InstVal));
  (yyval.InstVal) = (yyvsp[0].InstVal);
  CHECK_FOR_ERROR
;}
    break;

  case 234:
#line 2504 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {    // Used for PHI nodes
    (yyval.PHIList) = new std::list<std::pair<Value*, BasicBlock*> >();
    Value* tmpVal = getVal((yyvsp[-5].TypeVal).type->get(), (yyvsp[-3].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
    delete (yyvsp[-5].TypeVal).type;
  ;}
    break;

  case 235:
#line 2513 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.PHIList) = (yyvsp[-6].PHIList);
    Value* tmpVal = getVal((yyvsp[-6].PHIList)->front().first->getType(), (yyvsp[-3].ValIDVal));
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
    CHECK_FOR_ERROR
    (yyvsp[-6].PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
  ;}
    break;

  case 236:
#line 2523 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {    // Used for call statements, and memory insts...
    (yyval.ValueList) = new std::vector<Value*>();
    (yyval.ValueList)->push_back((yyvsp[0].ValueVal));
  ;}
    break;

  case 237:
#line 2527 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.ValueList) = (yyvsp[-2].ValueList);
    (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 239:
#line 2534 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { (yyval.ValueList) = 0; ;}
    break;

  case 240:
#line 2536 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 241:
#line 2540 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 242:
#line 2545 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!(yyvsp[-3].TypeVal).type->get()->isInteger() && !(yyvsp[-3].TypeVal).type->get()->isFloatingPoint() && 
        !isa<PackedType>((yyvsp[-3].TypeVal).type->get()))
      GEN_ERROR(
        "Arithmetic operator requires integer, FP, or packed operands!");
    if (isa<PackedType>((yyvsp[-3].TypeVal).type->get()) && 
        ((yyvsp[-4].BinaryOpVal).opcode == Instruction::URem || 
         (yyvsp[-4].BinaryOpVal).opcode == Instruction::SRem ||
         (yyvsp[-4].BinaryOpVal).opcode == Instruction::FRem))
      GEN_ERROR("U/S/FRem not supported on packed types!");
    // Upgrade the opcode from obsolete versions before we do anything with it.
    sanitizeOpcode((yyvsp[-4].BinaryOpVal),(yyvsp[-3].TypeVal).type->get());
    CHECK_FOR_ERROR;
    Value* val1 = getVal((yyvsp[-3].TypeVal).type->get(), (yyvsp[-2].ValIDVal)); 
    CHECK_FOR_ERROR
    Value* val2 = getVal((yyvsp[-3].TypeVal).type->get(), (yyvsp[0].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal).opcode, val1, val2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("binary operator returned null!");
    delete (yyvsp[-3].TypeVal).type;
  ;}
    break;

  case 243:
#line 2567 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!(yyvsp[-3].TypeVal).type->get()->isIntegral()) {
      if (!isa<PackedType>((yyvsp[-3].TypeVal).type->get()) ||
          !cast<PackedType>((yyvsp[-3].TypeVal).type->get())->getElementType()->isIntegral())
        GEN_ERROR("Logical operator requires integral operands!");
    }
    Value* tmpVal1 = getVal((yyvsp[-3].TypeVal).type->get(), (yyvsp[-2].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal((yyvsp[-3].TypeVal).type->get(), (yyvsp[0].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal).opcode, tmpVal1, tmpVal2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("binary operator returned null!");
    delete (yyvsp[-3].TypeVal).type;
  ;}
    break;

  case 244:
#line 2582 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if(isa<PackedType>((yyvsp[-3].TypeVal).type->get())) {
      GEN_ERROR(
        "PackedTypes currently not supported in setcc instructions!");
    }
    Value* tmpVal1 = getVal((yyvsp[-3].TypeVal).type->get(), (yyvsp[-2].ValIDVal));
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal((yyvsp[-3].TypeVal).type->get(), (yyvsp[0].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = new SetCondInst((yyvsp[-4].BinaryOpVal).opcode, tmpVal1, tmpVal2);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("binary operator returned null!");
    delete (yyvsp[-3].TypeVal).type;
  ;}
    break;

  case 245:
#line 2596 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    std::cerr << "WARNING: Use of eliminated 'not' instruction:"
              << " Replacing with 'xor'.\n";

    Value *Ones = ConstantIntegral::getAllOnesValue((yyvsp[0].ValueVal)->getType());
    if (Ones == 0)
      GEN_ERROR("Expected integral type for not instruction!");

    (yyval.InstVal) = BinaryOperator::create(Instruction::Xor, (yyvsp[0].ValueVal), Ones);
    if ((yyval.InstVal) == 0)
      GEN_ERROR("Could not create a xor instruction!");
    CHECK_FOR_ERROR
  ;}
    break;

  case 246:
#line 2609 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[0].ValueVal)->getType() != Type::UByteTy)
      GEN_ERROR("Shift amount must be ubyte!");
    if (!(yyvsp[-2].ValueVal)->getType()->isInteger())
      GEN_ERROR("Shift constant expression requires integer operand!");
    // Handle opcode upgrade situations
    sanitizeOpcode((yyvsp[-3].OtherOpVal), (yyvsp[-2].ValueVal)->getType());
    CHECK_FOR_ERROR;
    (yyval.InstVal) = new ShiftInst((yyvsp[-3].OtherOpVal).opcode, (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 247:
#line 2620 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    Value* Val = (yyvsp[-2].ValueVal);
    const Type* Ty = (yyvsp[0].TypeVal).type->get();
    if (!Val->getType()->isFirstClassType())
      GEN_ERROR("cast from a non-primitive type: '" +
                Val->getType()->getDescription() + "'!");
    if (!Ty->isFirstClassType())
      GEN_ERROR("cast to a non-primitive type: '" + Ty->getDescription() +"'!");

    if ((yyvsp[-3].CastOpVal).obsolete) {
      if (Ty == Type::BoolTy) {
        // The previous definition of cast to bool was a compare against zero. 
        // We have to retain that semantic so we do it here.
        (yyval.InstVal) = new SetCondInst(Instruction::SetNE, (yyvsp[-2].ValueVal), 
                               Constant::getNullValue((yyvsp[-2].ValueVal)->getType()));
      } else if (Val->getType()->isFloatingPoint() && isa<PointerType>(Ty)) {
        CastInst *CI = new FPToUIInst(Val, Type::ULongTy);
        (yyval.InstVal) = new IntToPtrInst(CI, Ty);
      } else {
        (yyval.InstVal) = CastInst::createInferredCast(Val, Ty);
      }
    } else {
      (yyval.InstVal) = CastInst::create((yyvsp[-3].CastOpVal).opcode, (yyvsp[-2].ValueVal), (yyvsp[0].TypeVal).type->get());
    }
    delete (yyvsp[0].TypeVal).type;
  ;}
    break;

  case 248:
#line 2646 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if ((yyvsp[-4].ValueVal)->getType() != Type::BoolTy)
      GEN_ERROR("select condition must be boolean!");
    if ((yyvsp[-2].ValueVal)->getType() != (yyvsp[0].ValueVal)->getType())
      GEN_ERROR("select value types should match!");
    (yyval.InstVal) = new SelectInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 249:
#line 2654 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    NewVarArgs = true;
    (yyval.InstVal) = new VAArgInst((yyvsp[-2].ValueVal), (yyvsp[0].TypeVal).type->get());
    delete (yyvsp[0].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 250:
#line 2660 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    ObsoleteVarArgs = true;
    const Type* ArgTy = (yyvsp[-2].ValueVal)->getType();
    Function* NF = CurModule.CurrentModule->
      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0);

    //b = vaarg a, t -> 
    //foo = alloca 1 of t
    //bar = vacopy a 
    //store bar -> foo
    //b = vaarg foo, t
    AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix");
    CurBB->getInstList().push_back(foo);
    CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal));
    CurBB->getInstList().push_back(bar);
    CurBB->getInstList().push_back(new StoreInst(bar, foo));
    (yyval.InstVal) = new VAArgInst(foo, (yyvsp[0].TypeVal).type->get());
    delete (yyvsp[0].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 251:
#line 2680 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    ObsoleteVarArgs = true;
    const Type* ArgTy = (yyvsp[-2].ValueVal)->getType();
    Function* NF = CurModule.CurrentModule->
      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0);

    //b = vanext a, t ->
    //foo = alloca 1 of t
    //bar = vacopy a
    //store bar -> foo
    //tmp = vaarg foo, t
    //b = load foo
    AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix");
    CurBB->getInstList().push_back(foo);
    CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal));
    CurBB->getInstList().push_back(bar);
    CurBB->getInstList().push_back(new StoreInst(bar, foo));
    Instruction* tmp = new VAArgInst(foo, (yyvsp[0].TypeVal).type->get());
    CurBB->getInstList().push_back(tmp);
    (yyval.InstVal) = new LoadInst(foo);
    delete (yyvsp[0].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 252:
#line 2703 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
      GEN_ERROR("Invalid extractelement operands!");
    (yyval.InstVal) = new ExtractElementInst((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 253:
#line 2709 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
      GEN_ERROR("Invalid insertelement operands!");
    (yyval.InstVal) = new InsertElementInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 254:
#line 2715 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
      GEN_ERROR("Invalid shufflevector operands!");
    (yyval.InstVal) = new ShuffleVectorInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 255:
#line 2721 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const Type *Ty = (yyvsp[0].PHIList)->front().first->getType();
    if (!Ty->isFirstClassType())
      GEN_ERROR("PHI node operands must be of first class type!");
    (yyval.InstVal) = new PHINode(Ty);
    ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[0].PHIList)->size());
    while ((yyvsp[0].PHIList)->begin() != (yyvsp[0].PHIList)->end()) {
      if ((yyvsp[0].PHIList)->front().first->getType() != Ty) 
        GEN_ERROR("All elements of a PHI node must be of the same type!");
      cast<PHINode>((yyval.InstVal))->addIncoming((yyvsp[0].PHIList)->front().first, (yyvsp[0].PHIList)->front().second);
      (yyvsp[0].PHIList)->pop_front();
    }
    delete (yyvsp[0].PHIList);  // Free the list...
    CHECK_FOR_ERROR
  ;}
    break;

  case 256:
#line 2736 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const PointerType *PFTy = 0;
    const FunctionType *Ty = 0;

    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-4].TypeVal).type->get())) ||
        !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
      // Pull out the types of all of the arguments...
      std::vector<const Type*> ParamTypes;
      if ((yyvsp[-1].ValueList)) {
        for (std::vector<Value*>::iterator I = (yyvsp[-1].ValueList)->begin(), E = (yyvsp[-1].ValueList)->end();
             I != E; ++I)
          ParamTypes.push_back((*I)->getType());
      }

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

      if (!(yyvsp[-4].TypeVal).type->get()->isFirstClassType() && 
           (yyvsp[-4].TypeVal).type->get() != Type::VoidTy)
        GEN_ERROR("LLVM functions cannot return aggregate types!");

      Ty = FunctionType::get((yyvsp[-4].TypeVal).type->get(), ParamTypes, isVarArg);
      PFTy = PointerType::get(Ty);
    }

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

    // Create the call node...
    if (!(yyvsp[-1].ValueList)) {                                   // 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!");

      (yyval.InstVal) = new CallInst(V, std::vector<Value*>());
    } else {                                     // Has arguments?
      // Loop through FunctionType's arguments and ensure they are specified
      // correctly!
      //
      FunctionType::param_iterator I = Ty->param_begin();
      FunctionType::param_iterator E = Ty->param_end();
      std::vector<Value*>::iterator ArgI = (yyvsp[-1].ValueList)->begin(), ArgE = (yyvsp[-1].ValueList)->end();

      for (; ArgI != ArgE && I != E; ++ArgI, ++I)
        if ((*ArgI)->getType() != *I)
          GEN_ERROR("Parameter " +(*ArgI)->getName()+ " is not of type '" +
                         (*I)->getDescription() + "'!");

      if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
        GEN_ERROR("Invalid number of parameters detected!");

      (yyval.InstVal) = new CallInst(V, *(yyvsp[-1].ValueList));
    }
    cast<CallInst>((yyval.InstVal))->setTailCall((yyvsp[-6].BoolVal));
    cast<CallInst>((yyval.InstVal))->setCallingConv((yyvsp[-5].UIntVal));
    delete (yyvsp[-4].TypeVal).type;
    delete (yyvsp[-1].ValueList);
    CHECK_FOR_ERROR
  ;}
    break;

  case 257:
#line 2796 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.InstVal) = (yyvsp[0].InstVal);
    CHECK_FOR_ERROR
  ;}
    break;

  case 258:
#line 2803 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { 
    (yyval.ValueList) = (yyvsp[0].ValueList); 
    CHECK_FOR_ERROR
  ;}
    break;

  case 259:
#line 2806 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    { 
    (yyval.ValueList) = new std::vector<Value*>(); 
    CHECK_FOR_ERROR
  ;}
    break;

  case 260:
#line 2811 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = true;
    CHECK_FOR_ERROR
  ;}
    break;

  case 261:
#line 2815 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.BoolVal) = false;
    CHECK_FOR_ERROR
  ;}
    break;

  case 262:
#line 2822 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.InstVal) = new MallocInst((yyvsp[-1].TypeVal).type->get(), 0, (yyvsp[0].UIntVal));
    delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 263:
#line 2827 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    Value* tmpVal = getVal((yyvsp[-2].TypeVal).type->get(), (yyvsp[-1].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = new MallocInst((yyvsp[-4].TypeVal).type->get(), tmpVal, (yyvsp[0].UIntVal));
    delete (yyvsp[-4].TypeVal).type;
  ;}
    break;

  case 264:
#line 2833 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    (yyval.InstVal) = new AllocaInst((yyvsp[-1].TypeVal).type->get(), 0, (yyvsp[0].UIntVal));
    delete (yyvsp[-1].TypeVal).type;
    CHECK_FOR_ERROR
  ;}
    break;

  case 265:
#line 2838 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    Value* tmpVal = getVal((yyvsp[-2].TypeVal).type->get(), (yyvsp[-1].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = new AllocaInst((yyvsp[-4].TypeVal).type->get(), tmpVal, (yyvsp[0].UIntVal));
    delete (yyvsp[-4].TypeVal).type;
  ;}
    break;

  case 266:
#line 2844 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!isa<PointerType>((yyvsp[0].ValueVal)->getType()))
      GEN_ERROR("Trying to free nonpointer type " + 
                     (yyvsp[0].ValueVal)->getType()->getDescription() + "!");
    (yyval.InstVal) = new FreeInst((yyvsp[0].ValueVal));
    CHECK_FOR_ERROR
  ;}
    break;

  case 267:
#line 2852 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!isa<PointerType>((yyvsp[-1].TypeVal).type->get()))
      GEN_ERROR("Can't load from nonpointer type: " +
                     (yyvsp[-1].TypeVal).type->get()->getDescription());
    if (!cast<PointerType>((yyvsp[-1].TypeVal).type->get())->getElementType()->isFirstClassType())
      GEN_ERROR("Can't load from pointer of non-first-class type: " +
                     (yyvsp[-1].TypeVal).type->get()->getDescription());
    Value* tmpVal = getVal((yyvsp[-1].TypeVal).type->get(), (yyvsp[0].ValIDVal));
    CHECK_FOR_ERROR
    (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal));
    delete (yyvsp[-1].TypeVal).type;
  ;}
    break;

  case 268:
#line 2864 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    const PointerType *PT = dyn_cast<PointerType>((yyvsp[-1].TypeVal).type->get());
    if (!PT)
      GEN_ERROR("Can't store to a nonpointer type: " +
                     ((yyvsp[-1].TypeVal).type->get())->getDescription());
    const Type *ElTy = PT->getElementType();
    if (ElTy != (yyvsp[-3].ValueVal)->getType())
      GEN_ERROR("Can't store '" + (yyvsp[-3].ValueVal)->getType()->getDescription() +
                     "' into space of type '" + ElTy->getDescription() + "'!");

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

  case 269:
#line 2879 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
    {
    if (!isa<PointerType>((yyvsp[-2].TypeVal).type->get()))
      GEN_ERROR("getelementptr insn requires pointer operand!");

    // LLVM 1.2 and earlier used ubyte struct indices.  Convert any ubyte struct
    // indices to uint struct indices for compatibility.
    generic_gep_type_iterator<std::vector<Value*>::iterator>
      GTI = gep_type_begin((yyvsp[-2].TypeVal).type->get(), (yyvsp[0].ValueList)->begin(), (yyvsp[0].ValueList)->end()),
      GTE = gep_type_end((yyvsp[-2].TypeVal).type->get(), (yyvsp[0].ValueList)->begin(), (yyvsp[0].ValueList)->end());
    for (unsigned i = 0, e = (yyvsp[0].ValueList)->size(); i != e && GTI != GTE; ++i, ++GTI)
      if (isa<StructType>(*GTI))        // Only change struct indices
        if (ConstantInt *CUI = dyn_cast<ConstantInt>((*(yyvsp[0].ValueList))[i]))
          if (CUI->getType() == Type::UByteTy)
            (*(yyvsp[0].ValueList))[i] = ConstantExpr::getCast(CUI, Type::UIntTy);

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


      default: break;
    }

/* Line 1126 of yacc.c.  */
#line 5446 "llvmAsmParser.tab.c"

  yyvsp -= yylen;
  yyssp -= yylen;


  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
      yyn = yypact[yystate];

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

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

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

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

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

	  if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
	    yymsg = (char *) YYSTACK_ALLOC (yysize);
	  if (yymsg)
	    {
	      /* Avoid sprintf, as that infringes on the user's name space.
		 Don't have undefined behavior even if the translation
		 produced a string with the wrong number of "%s"s.  */
	      char *yyp = yymsg;
	      int yyi = 0;
	      while ((*yyp = *yyf))
		{
		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
		    {
		      yyp += yytnamerr (yyp, yyarg[yyi++]);
		      yyf += 2;
		    }
		  else
		    {
		      yyp++;
		      yyf++;
		    }
		}
	      yyerror (yymsg);
	      YYSTACK_FREE (yymsg);
	    }
	  else
	    {
	      yyerror (YY_("syntax error"));
	      goto yyexhaustedlab;
	    }
	}
      else
#endif /* YYERROR_VERBOSE */
	yyerror (YY_("syntax error"));
    }



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

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

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


/*---------------------------------------------------.
| yyerrorlab -- error raised explicitly by YYERROR.  |
`---------------------------------------------------*/
yyerrorlab:

  /* Pacify compilers like GCC when the user code never invokes
     YYERROR and the label yyerrorlab therefore never appears in user
     code.  */
  if (0)
     goto yyerrorlab;

yyvsp -= yylen;
  yyssp -= yylen;
  yystate = *yyssp;
  goto yyerrlab1;


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

  for (;;)
    {
      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;
      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);
  while (yyssp != yyss)
    {
      yydestruct ("Cleanup: popping",
		  yystos[*yyssp], yyvsp);
      YYPOPSTACK;
    }
#ifndef yyoverflow
  if (yyss != yyssa)
    YYSTACK_FREE (yyss);
#endif
  return yyresult;
}


#line 2905 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"


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

int yyerror(const char *ErrorMsg) {
  std::string where 
    = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
                  + ":" + utostr((unsigned) llvmAsmlineno) + ": ";
  std::string errMsg = std::string(ErrorMsg) + "\n" + where + " while reading ";
  if (yychar == YYEMPTY || yychar == 0)
    errMsg += "end-of-file.";
  else
    errMsg += "token: '" + std::string(llvmAsmtext, llvmAsmleng) + "'";
  GenerateError(errMsg);
  return 0;
}

