
/*  A Bison parser, made from /Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y
    by GNU Bison version 1.28  */

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

#define yyparse llvmAsmparse
#define yylex llvmAsmlex
#define yyerror llvmAsmerror
#define yylval llvmAsmlval
#define yychar llvmAsmchar
#define yydebug llvmAsmdebug
#define yynerrs llvmAsmnerrs
#define	ESINT64VAL	257
#define	EUINT64VAL	258
#define	ESAPINTVAL	259
#define	EUAPINTVAL	260
#define	LOCALVAL_ID	261
#define	GLOBALVAL_ID	262
#define	FPVAL	263
#define	VOID	264
#define	INTTYPE	265
#define	FLOAT	266
#define	DOUBLE	267
#define	X86_FP80	268
#define	FP128	269
#define	PPC_FP128	270
#define	LABEL	271
#define	TYPE	272
#define	LOCALVAR	273
#define	GLOBALVAR	274
#define	LABELSTR	275
#define	STRINGCONSTANT	276
#define	ATSTRINGCONSTANT	277
#define	PCTSTRINGCONSTANT	278
#define	ZEROINITIALIZER	279
#define	TRUETOK	280
#define	FALSETOK	281
#define	BEGINTOK	282
#define	ENDTOK	283
#define	DECLARE	284
#define	DEFINE	285
#define	GLOBAL	286
#define	CONSTANT	287
#define	SECTION	288
#define	ALIAS	289
#define	VOLATILE	290
#define	THREAD_LOCAL	291
#define	TO	292
#define	DOTDOTDOT	293
#define	NULL_TOK	294
#define	UNDEF	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	EXTERNAL	304
#define	TARGET	305
#define	TRIPLE	306
#define	ALIGN	307
#define	ADDRSPACE	308
#define	DEPLIBS	309
#define	CALL	310
#define	TAIL	311
#define	ASM_TOK	312
#define	MODULE	313
#define	SIDEEFFECT	314
#define	CC_TOK	315
#define	CCC_TOK	316
#define	FASTCC_TOK	317
#define	COLDCC_TOK	318
#define	X86_STDCALLCC_TOK	319
#define	X86_FASTCALLCC_TOK	320
#define	DATALAYOUT	321
#define	UNWINDS	322
#define	RET	323
#define	BR	324
#define	SWITCH	325
#define	INVOKE	326
#define	UNWIND	327
#define	UNREACHABLE	328
#define	ADD	329
#define	SUB	330
#define	MUL	331
#define	UDIV	332
#define	SDIV	333
#define	FDIV	334
#define	UREM	335
#define	SREM	336
#define	FREM	337
#define	AND	338
#define	OR	339
#define	XOR	340
#define	SHL	341
#define	LSHR	342
#define	ASHR	343
#define	ICMP	344
#define	FCMP	345
#define	EQ	346
#define	NE	347
#define	SLT	348
#define	SGT	349
#define	SLE	350
#define	SGE	351
#define	ULT	352
#define	UGT	353
#define	ULE	354
#define	UGE	355
#define	OEQ	356
#define	ONE	357
#define	OLT	358
#define	OGT	359
#define	OLE	360
#define	OGE	361
#define	ORD	362
#define	UNO	363
#define	UEQ	364
#define	UNE	365
#define	MALLOC	366
#define	ALLOCA	367
#define	FREE	368
#define	LOAD	369
#define	STORE	370
#define	GETELEMENTPTR	371
#define	TRUNC	372
#define	ZEXT	373
#define	SEXT	374
#define	FPTRUNC	375
#define	FPEXT	376
#define	BITCAST	377
#define	UITOFP	378
#define	SITOFP	379
#define	FPTOUI	380
#define	FPTOSI	381
#define	INTTOPTR	382
#define	PTRTOINT	383
#define	PHI_TOK	384
#define	SELECT	385
#define	VAARG	386
#define	EXTRACTELEMENT	387
#define	INSERTELEMENT	388
#define	SHUFFLEVECTOR	389
#define	GETRESULT	390
#define	SIGNEXT	391
#define	ZEROEXT	392
#define	NORETURN	393
#define	INREG	394
#define	SRET	395
#define	NOUNWIND	396
#define	NOALIAS	397
#define	BYVAL	398
#define	NEST	399
#define	READNONE	400
#define	READONLY	401
#define	GC	402
#define	DEFAULT	403
#define	HIDDEN	404
#define	PROTECTED	405

#line 14 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"

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

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

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

static Module *ParserResult;

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

#define YYERROR_VERBOSE 1

static GlobalVariable *CurGV;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

  case ValID::ConstFPVal:        // Is it a floating point const pool reference?
    if (!Ty->isFloatingPoint() ||
        !ConstantFP::isValueValidForType(Ty, *D.ConstPoolFP)) {
      GenerateError("FP constant invalid for type");
      return 0;
    }
    // Lexer has no type info, so builds all float and double  FP constants 
    // as double.  Fix this here.  Long double does not need this.
    if (&D.ConstPoolFP->getSemantics() == &APFloat::IEEEdouble &&
        Ty==Type::FloatTy)
      D.ConstPoolFP->convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven);
    return ConstantFP::get(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 getExistingVal, except that if a
// value is not already defined, it "improvises" by creating a placeholder var
// that looks and acts just like the requested variable.  When the value is
// defined later, all uses of the placeholder variable are replaced with the
// real thing.
//
static Value *getVal(const Type *Ty, const ValID &ID) {
  if (Ty == Type::LabelTy) {
    GenerateError("Cannot use a basic block here");
    return 0;
  }

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

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

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

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

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

  BasicBlock *BB = 0;

  // First, see if this was forward referenced

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

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

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

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

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

  ID.destroy();
  BB->setUnwindDest(unwindDest);
  return BB;
}

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

  BasicBlock *BB =  0;

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

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

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

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

  return BB;
}


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

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

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

    ValID &DID = PHI->second.first;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  return false;
}

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

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

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

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

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

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

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

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

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

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

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

  return Ty;
}

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

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


#line 950 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
typedef union {
  llvm::Module                           *ModuleVal;
  llvm::Function                         *FunctionVal;
  llvm::BasicBlock                       *BasicBlockVal;
  llvm::TerminatorInst                   *TermInstVal;
  llvm::Instruction                      *InstVal;
  llvm::Constant                         *ConstVal;

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

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

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

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

  llvm::Instruction::BinaryOps      BinaryOpVal;
  llvm::Instruction::TermOps        TermOpVal;
  llvm::Instruction::MemoryOps      MemOpVal;
  llvm::Instruction::CastOps        CastOpVal;
  llvm::Instruction::OtherOps       OtherOpVal;
  llvm::ICmpInst::Predicate         IPredicate;
  llvm::FCmpInst::Predicate         FPredicate;
} YYSTYPE;
#include <stdio.h>

#ifndef __cplusplus
#ifndef __STDC__
#define const
#endif
#endif



#define	YYFINAL		635
#define	YYFLAG		-32768
#define	YYNTBASE	166

#define YYTRANSLATE(x) ((unsigned)(x) <= 405 ? yytranslate[x] : 250)

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

#if YYDEBUG != 0
static const short yyprhs[] = {     0,
     0,     2,     4,     6,     8,    10,    12,    14,    16,    18,
    20,    22,    24,    26,    28,    30,    32,    34,    36,    38,
    40,    42,    44,    46,    48,    50,    52,    54,    56,    58,
    60,    62,    64,    66,    68,    70,    72,    74,    76,    78,
    80,    82,    84,    86,    88,    90,    92,    94,    96,    98,
   100,   102,   104,   106,   108,   110,   112,   114,   116,   118,
   120,   122,   124,   126,   127,   132,   133,   136,   137,   139,
   141,   143,   144,   147,   149,   151,   153,   155,   157,   159,
   161,   163,   164,   166,   168,   170,   171,   173,   175,   176,
   178,   180,   182,   184,   185,   187,   189,   190,   192,   194,
   196,   198,   200,   203,   205,   207,   209,   211,   213,   215,
   217,   219,   221,   224,   225,   228,   230,   232,   234,   236,
   238,   240,   241,   244,   245,   248,   249,   252,   253,   257,
   260,   261,   263,   264,   268,   270,   273,   275,   277,   279,
   281,   283,   285,   287,   289,   291,   295,   297,   300,   306,
   312,   318,   324,   328,   331,   337,   342,   345,   347,   349,
   351,   355,   357,   361,   363,   364,   366,   370,   375,   379,
   383,   388,   393,   397,   404,   410,   413,   416,   419,   422,
   425,   428,   431,   434,   437,   440,   443,   446,   453,   459,
   468,   475,   482,   490,   498,   505,   514,   523,   527,   529,
   531,   533,   535,   536,   539,   546,   548,   549,   551,   554,
   555,   559,   560,   564,   568,   572,   576,   577,   586,   587,
   597,   598,   608,   614,   617,   621,   623,   627,   631,   635,
   639,   641,   642,   648,   652,   654,   658,   660,   661,   672,
   674,   676,   681,   683,   685,   688,   692,   693,   695,   697,
   699,   701,   703,   705,   707,   709,   711,   715,   717,   723,
   725,   727,   729,   731,   733,   735,   738,   740,   744,   747,
   750,   754,   757,   758,   762,   764,   769,   772,   775,   779,
   789,   799,   808,   823,   825,   827,   834,   840,   843,   850,
   858,   863,   868,   875,   882,   883,   884,   888,   891,   893,
   899,   905,   912,   919,   924,   931,   936,   941,   948,   955,
   958,   967,   969,   971,   972,   976,   983,   987,   994,   997,
  1003,  1011,  1017
};

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

#endif

#if YYDEBUG != 0
static const short yyrline[] = { 0,
  1112,  1112,  1112,  1112,  1112,  1112,  1112,  1112,  1112,  1113,
  1113,  1113,  1113,  1113,  1113,  1114,  1114,  1114,  1114,  1114,
  1114,  1114,  1115,  1115,  1115,  1115,  1115,  1118,  1118,  1119,
  1119,  1120,  1120,  1121,  1121,  1122,  1122,  1126,  1126,  1127,
  1127,  1128,  1128,  1129,  1129,  1130,  1130,  1131,  1131,  1132,
  1132,  1133,  1134,  1139,  1140,  1140,  1140,  1140,  1140,  1142,
  1142,  1142,  1143,  1143,  1145,  1146,  1150,  1154,  1159,  1159,
  1161,  1162,  1167,  1173,  1174,  1175,  1176,  1177,  1181,  1182,
  1183,  1187,  1188,  1189,  1190,  1194,  1195,  1196,  1200,  1201,
  1202,  1203,  1204,  1208,  1209,  1210,  1213,  1213,  1214,  1215,
  1216,  1217,  1218,  1226,  1227,  1228,  1229,  1230,  1231,  1232,
  1233,  1234,  1235,  1239,  1240,  1245,  1246,  1247,  1248,  1249,
  1250,  1253,  1254,  1259,  1260,  1267,  1267,  1274,  1274,  1284,
  1292,  1292,  1298,  1298,  1300,  1305,  1318,  1318,  1318,  1318,
  1318,  1318,  1318,  1321,  1325,  1329,  1336,  1341,  1349,  1379,
  1404,  1409,  1419,  1429,  1433,  1443,  1450,  1459,  1466,  1471,
  1476,  1483,  1484,  1491,  1498,  1506,  1512,  1524,  1552,  1568,
  1595,  1623,  1649,  1669,  1695,  1715,  1727,  1734,  1800,  1810,
  1820,  1826,  1836,  1842,  1852,  1857,  1862,  1875,  1887,  1909,
  1917,  1923,  1934,  1939,  1944,  1950,  1956,  1965,  1969,  1977,
  1977,  1980,  1980,  1983,  1995,  2016,  2021,  2029,  2030,  2034,
  2034,  2038,  2038,  2041,  2044,  2068,  2079,  2087,  2090,  2096,
  2099,  2106,  2110,  2150,  2153,  2159,  2169,  2173,  2178,  2180,
  2185,  2190,  2199,  2209,  2220,  2224,  2233,  2242,  2247,  2373,
  2373,  2375,  2384,  2384,  2386,  2391,  2403,  2407,  2412,  2416,
  2420,  2424,  2428,  2432,  2436,  2440,  2444,  2469,  2473,  2483,
  2487,  2491,  2496,  2503,  2503,  2509,  2518,  2523,  2528,  2532,
  2541,  2550,  2559,  2563,  2567,  2572,  2578,  2586,  2590,  2595,
  2605,  2624,  2633,  2714,  2718,  2725,  2736,  2749,  2759,  2770,
  2780,  2791,  2799,  2809,  2816,  2819,  2820,  2827,  2831,  2836,
  2852,  2869,  2883,  2897,  2909,  2917,  2924,  2930,  2936,  2942,
  2957,  3043,  3048,  3052,  3059,  3066,  3074,  3081,  3089,  3097,
  3111,  3128,  3136
};
#endif


#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)

static const char * const yytname[] = {   "$","error","$undefined.","ESINT64VAL",
"EUINT64VAL","ESAPINTVAL","EUAPINTVAL","LOCALVAL_ID","GLOBALVAL_ID","FPVAL",
"VOID","INTTYPE","FLOAT","DOUBLE","X86_FP80","FP128","PPC_FP128","LABEL","TYPE",
"LOCALVAR","GLOBALVAR","LABELSTR","STRINGCONSTANT","ATSTRINGCONSTANT","PCTSTRINGCONSTANT",
"ZEROINITIALIZER","TRUETOK","FALSETOK","BEGINTOK","ENDTOK","DECLARE","DEFINE",
"GLOBAL","CONSTANT","SECTION","ALIAS","VOLATILE","THREAD_LOCAL","TO","DOTDOTDOT",
"NULL_TOK","UNDEF","INTERNAL","LINKONCE","WEAK","APPENDING","DLLIMPORT","DLLEXPORT",
"EXTERN_WEAK","OPAQUE","EXTERNAL","TARGET","TRIPLE","ALIGN","ADDRSPACE","DEPLIBS",
"CALL","TAIL","ASM_TOK","MODULE","SIDEEFFECT","CC_TOK","CCC_TOK","FASTCC_TOK",
"COLDCC_TOK","X86_STDCALLCC_TOK","X86_FASTCALLCC_TOK","DATALAYOUT","UNWINDS",
"RET","BR","SWITCH","INVOKE","UNWIND","UNREACHABLE","ADD","SUB","MUL","UDIV",
"SDIV","FDIV","UREM","SREM","FREM","AND","OR","XOR","SHL","LSHR","ASHR","ICMP",
"FCMP","EQ","NE","SLT","SGT","SLE","SGE","ULT","UGT","ULE","UGE","OEQ","ONE",
"OLT","OGT","OLE","OGE","ORD","UNO","UEQ","UNE","MALLOC","ALLOCA","FREE","LOAD",
"STORE","GETELEMENTPTR","TRUNC","ZEXT","SEXT","FPTRUNC","FPEXT","BITCAST","UITOFP",
"SITOFP","FPTOUI","FPTOSI","INTTOPTR","PTRTOINT","PHI_TOK","SELECT","VAARG",
"EXTRACTELEMENT","INSERTELEMENT","SHUFFLEVECTOR","GETRESULT","SIGNEXT","ZEROEXT",
"NORETURN","INREG","SRET","NOUNWIND","NOALIAS","BYVAL","NEST","READNONE","READONLY",
"GC","DEFAULT","HIDDEN","PROTECTED","'('","')'","'='","','","'*'","'\\\\'","'['",
"'x'","']'","'<'","'>'","'{'","'}'","'c'","ArithmeticOps","LogicalOps","CastOps",
"IPredicates","FPredicates","IntType","FPType","LocalName","OptLocalName","OptAddrSpace",
"OptLocalAssign","GlobalName","OptGlobalAssign","GlobalAssign","GVInternalLinkage",
"GVExternalLinkage","GVVisibilityStyle","FunctionDeclareLinkage","FunctionDefineLinkage",
"AliasLinkage","OptCallingConv","ParamAttr","OptParamAttrs","FuncAttr","OptFuncAttrs",
"OptGC","OptAlign","OptCAlign","SectionString","OptSection","GlobalVarAttributes",
"GlobalVarAttribute","PrimType","Types","ArgType","ResultTypes","ArgTypeList",
"ArgTypeListI","TypeListI","ConstVal","ConstExpr","ConstVector","GlobalType",
"ThreadLocal","AliaseeRef","Module","DefinitionList","Definition","@1","@2",
"@3","@4","@5","AsmBlock","TargetDefinition","LibrariesDefinition","LibList",
"ArgListH","ArgList","FunctionHeaderH","BEGIN","FunctionHeader","END","Function",
"FunctionProto","OptSideEffect","ConstValueRef","SymbolicValueRef","ValueRef",
"ResolvedVal","ReturnedVal","BasicBlockList","BasicBlock","InstructionList",
"BBTerminatorInst","JumpTable","Inst","PHIList","ParamList","IndexList","OptTailCall",
"InstVal","OptVolatile","MemoryInst", NULL
};
#endif

static const short yyr1[] = {     0,
   166,   166,   166,   166,   166,   166,   166,   166,   166,   167,
   167,   167,   167,   167,   167,   168,   168,   168,   168,   168,
   168,   168,   168,   168,   168,   168,   168,   169,   169,   169,
   169,   169,   169,   169,   169,   169,   169,   170,   170,   170,
   170,   170,   170,   170,   170,   170,   170,   170,   170,   170,
   170,   170,   170,   171,   172,   172,   172,   172,   172,   173,
   173,   173,   174,   174,   175,   175,   176,   176,   177,   177,
   178,   178,   179,   180,   180,   180,   180,   180,   181,   181,
   181,   182,   182,   182,   182,   183,   183,   183,   184,   184,
   184,   184,   184,   185,   185,   185,   186,   186,   186,   186,
   186,   186,   186,   187,   187,   187,   187,   187,   187,   187,
   187,   187,   187,   188,   188,   189,   189,   189,   189,   189,
   189,   190,   190,   191,   191,   192,   192,   193,   193,   194,
   195,   195,   196,   196,   197,   197,   198,   198,   198,   198,
   198,   198,   198,   199,   199,   199,   199,   199,   199,   199,
   199,   199,   199,   199,   199,   199,   200,   201,   201,   202,
   202,   203,   203,   203,   203,   204,   204,   205,   205,   205,
   205,   205,   205,   205,   205,   205,   205,   205,   205,   205,
   205,   205,   205,   205,   205,   205,   205,   206,   206,   206,
   206,   206,   206,   206,   206,   206,   206,   207,   207,   208,
   208,   209,   209,   210,   210,   211,   211,   212,   212,   214,
   213,   215,   213,   213,   213,   213,   216,   213,   217,   213,
   218,   213,   213,   213,   213,   219,   220,   220,   221,   222,
   222,   222,   223,   223,   224,   224,   224,   224,   225,   226,
   226,   227,   228,   228,   229,   230,   231,   231,   232,   232,
   232,   232,   232,   232,   232,   232,   232,   232,   232,   233,
   233,   233,   233,   234,   234,   235,   236,   236,   237,   237,
   238,   239,   239,   239,   239,   239,   240,   240,   240,   240,
   240,   240,   240,   240,   240,   241,   241,   242,   243,   243,
   244,   244,   244,   244,   244,   245,   245,   246,   246,   247,
   247,   247,   247,   247,   247,   247,   247,   247,   247,   247,
   247,   247,   248,   248,   249,   249,   249,   249,   249,   249,
   249,   249,   249
};

static const short yyr2[] = {     0,
     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     0,     4,     0,     2,     0,     1,     1,
     1,     0,     2,     1,     1,     1,     1,     1,     1,     1,
     1,     0,     1,     1,     1,     0,     1,     1,     0,     1,
     1,     1,     1,     0,     1,     1,     0,     1,     1,     1,
     1,     1,     2,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     2,     0,     2,     1,     1,     1,     1,     1,
     1,     0,     2,     0,     2,     0,     2,     0,     3,     2,
     0,     1,     0,     3,     1,     2,     1,     1,     1,     1,
     1,     1,     1,     1,     1,     3,     1,     2,     5,     5,
     5,     5,     3,     2,     5,     4,     2,     1,     1,     1,
     3,     1,     3,     1,     0,     1,     3,     4,     3,     3,
     4,     4,     3,     6,     5,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     6,     5,     8,
     6,     6,     7,     7,     6,     8,     8,     3,     1,     1,
     1,     1,     0,     2,     6,     1,     0,     1,     2,     0,
     3,     0,     3,     3,     3,     3,     0,     8,     0,     9,
     0,     9,     5,     2,     3,     1,     3,     3,     3,     3,
     1,     0,     5,     3,     1,     3,     1,     0,    10,     1,
     1,     4,     1,     1,     2,     3,     0,     1,     1,     1,
     1,     1,     1,     1,     1,     1,     3,     1,     5,     1,
     1,     1,     1,     1,     1,     2,     1,     3,     2,     2,
     3,     2,     0,     3,     1,     4,     2,     2,     3,     9,
     9,     8,    14,     1,     1,     6,     5,     2,     6,     7,
     4,     4,     6,     6,     0,     0,     3,     2,     1,     5,
     5,     6,     6,     4,     6,     4,     4,     6,     6,     2,
     8,     1,     1,     0,     3,     6,     3,     6,     2,     5,
     7,     5,     4
};

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

static const short yydefgoto[] = {   216,
   217,   218,   299,   316,   162,   163,    76,   537,   111,    12,
    77,    14,    15,    39,    40,    41,    45,    51,   116,   126,
   367,   254,   435,   370,   606,   587,   410,   494,   569,   446,
   495,    78,   164,   137,   154,   138,   139,   108,   322,   219,
   323,   119,    85,   155,   633,    16,    17,    19,    18,   386,
   436,   437,    60,    22,    58,    99,   449,   450,   127,   170,
    52,    94,    53,    46,   288,   220,    80,   222,   330,   331,
    54,    90,    91,   248,   594,   132,   344,   555,   454,   249,
   250,   251,   252
};

static const short yypact[] = {   504,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,   -13,  -126,   -26,
   -90,   107,   -69,   256,-32768,   633,-32768,   126,   205,    19,
    29,-32768,    31,   125,-32768,  1570,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   174,   174,
   190,-32768,-32768,-32768,   174,-32768,-32768,-32768,-32768,-32768,
   174,     1,-32768,    -2,   178,   202,   212,-32768,-32768,-32768,
-32768,-32768,    83,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,   251,   257,     8,    33,-32768,-32768,-32768,    74,-32768,
   223,   223,   253,-32768,    82,   255,   255,   200,   235,-32768,
   245,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   -88,  1124,
-32768,   128,   137,   813,    83,-32768,    74,   -65,   134,  1124,
   154,    82,    82,-32768,-32768,  1370,-32768,-32768,  1610,   307,
-32768,-32768,-32768,-32768,-32768,  1650,-32768,    -7,   289,   904,
  1865,-32768,   306,-32768,-32768,    74,-32768,   179,   176,  1690,
  1690,   177,   -55,  1690,-32768,   338,   198,-32768,  1610,  1690,
    83,   191,    74,   365,-32768,   342,   344,   345,   351,   361,
   372,   273,   373,  1180,   332,-32768,   162,-32768,-32768,-32768,
   904,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   323,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,   329,   489,   238,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
   239,   246,   250,   258,  1610,   261,   263,   264,-32768,-32768,
-32768,-32768,-32768,-32768,   341,  1730,   102,   392,   255,-32768,
-32768,   329,   489,  1690,  1690,  1690,  1690,  1690,  1690,  1690,
  1690,  1690,  1690,  1690,  1690,  1690,  1690,-32768,   255,-32768,
    45,-32768,-32768,   221,  1450,-32768,     7,   -29,-32768,   247,
    74,   265,-32768,   332,   -30,  1370,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1410,  1770,   853,
   386,-32768,-32768,-32768,   279,-32768,-32768,   395,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   280,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,   282,  1610,  1610,  1610,  1610,
  1610,-32768,   -67,  1610,  1610,  1610,-32768,    83,   764,-32768,
   285,   904,   904,-32768,   904,  1650,  1690,  1690,    43,    49,
-32768,   764,   -31,   288,   292,   293,   295,   296,   297,    51,
   764,   764,   397,  1650,  1690,  1690,   449,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   146,
-32768,-32768,-32768,-32768,   146,-32768,   154,   416,-32768,   -62,
  1078,   -10,-32768,   -15,-32768,   302,  1490,   303,  1610,  1610,
-32768,   304,   309,   312,   313,  1610,-32768,   314,   315,   423,
-32768,  1690,   316,-32768,   317,   904,   764,   764,    25,-32768,
    26,-32768,-32768,   904,   318,  1690,  1690,  1690,  1690,  1690,
   319,   320,   322,  1690,   904,   764,   325,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,   302,   302,  1690,-32768,   321,
  1033,   -11,-32768,-32768,    28,-32768,-32768,    74,   326,   331,
   456,   327,   330,   152,  1610,  1610,  1610,  1610,-32768,  1610,
  1610,  1690,-32768,   469,   470,   336,   335,   337,   904,   490,
   904,   340,   346,   904,   347,    74,-32768,   350,   354,   496,
   904,   904,    74,   362,   358,  1690,-32768,-32768,    23,-32768,
   355,   471,   502,-32768,   302,   113,  1530,-32768,-32768,  1610,
  1610,-32768,  1690,   364,   367,   370,   376,   379,   380,    54,
   904,   904,  1810,   904,   904,   358,-32768,   358,   904,   381,
  1690,  1690,  1690,-32768,-32768,-32768,  1810,   484,-32768,   764,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    74,    -8,
   385,   387,-32768,  1610,-32768,  1610,  1610,-32768,-32768,-32768,
   384,   383,   114,    74,   180,-32768,-32768,-32768,-32768,   382,
   904,-32768,-32768,-32768,   197,   358,   113,-32768,   493,-32768,
-32768,   390,   394,   398,   531,     3,   621,   621,-32768,  1850,
-32768,   393,-32768,-32768,-32768,   546,   406,-32768,-32768,-32768,
   904,-32768,  1321,     9,   405,   408,-32768,-32768,     4,   114,
    74,-32768,   146,-32768,   540,-32768,-32768,   409,-32768,  1321,
   221,   221,   548,   621,   621,-32768,   549,   413,   904,-32768,
-32768,   904,   552,   497,   221,   221,-32768,   904,   554,-32768,
   904,-32768,   572,   574,-32768
};

static const short yypgoto[] = {   445,
   446,   448,   348,   349,  -227,-32768,     0,    14,  -100,   492,
    13,-32768,-32768,-32768,-32768,    67,-32768,-32768,-32768,  -166,
-32768,  -443,-32768,  -257,-32768,-32768,  -337,    44,-32768,  -406,
-32768,-32768,   -24,   352,  -108,-32768,   491,   498,   -81,  -147,
  -245,    80,   127,   339,-32768,-32768,   587,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   517,-32768,
-32768,-32768,-32768,-32768,-32768,  -506,   -70,   104,  -232,-32768,
-32768,   555,-32768,-32768,-32768,-32768,-32768,    79,   195,-32768,
-32768,-32768,-32768
};


#define	YYLAST		2013


static const short yytable[] = {    11,
   335,    79,   412,   341,   496,   375,   345,   346,   347,   348,
   349,   103,    13,   334,   353,    11,   282,   167,    88,   334,
   168,    88,   109,   109,   109,   492,    92,    23,    13,   487,
   488,    24,   380,   382,   384,   469,   471,   165,    20,    61,
    62,   613,   105,    64,    65,    66,    67,    68,    69,    70,
   107,     1,     2,    21,     3,     4,     5,    61,    62,   221,
   109,   492,   336,    25,   284,    89,   133,   264,    89,     1,
     2,   134,     3,     4,     5,   136,   109,   470,   470,   107,
   493,    71,   354,   267,    27,   136,   608,   396,   535,   144,
    11,   153,   396,   283,   397,   567,   109,   439,   145,   144,
   221,   153,   109,   618,   109,    81,    82,   109,   260,   577,
   578,    86,   332,   117,   118,   257,   258,    87,   333,   261,
   110,   110,   110,   427,    26,   265,   414,   109,   429,   430,
   431,     1,   372,   432,     3,   442,     5,   433,   434,   396,
   429,   430,   431,   396,   396,   432,    59,   529,   444,   433,
   434,   443,   491,   611,   612,   169,   614,   615,   110,   355,
   356,    93,   592,   376,   377,   357,   371,  -143,   609,   463,
   104,    43,    55,    44,   110,   531,   625,   626,   558,   285,
   559,     2,    56,   475,     4,   477,   478,   479,    57,    72,
    73,   149,   150,    74,   110,    75,   106,   409,   -66,    96,
   110,   329,   110,   411,   -66,   110,   550,   112,   113,   339,
   340,   329,   342,   343,   329,   329,   329,   329,   329,   350,
   351,   352,   329,    97,    83,   110,    84,   406,   584,   -66,
   136,   358,   359,    98,   100,   391,   392,   393,   394,   395,
   540,   153,   398,   399,   400,   425,    47,    48,    49,   360,
   361,    50,   362,   363,   101,   364,   365,   366,   221,    84,
   102,   221,   221,     1,   221,  -143,     3,   129,     5,  -143,
   543,   221,   130,   357,   286,   270,   271,   272,   273,   421,
   221,   221,   429,   430,   431,   146,   140,   432,   562,   563,
   564,   433,   434,   282,   114,   141,   115,    28,    29,    30,
    31,    32,    33,    34,   502,    35,   503,   452,   453,   148,
   166,   153,   407,   408,   459,   120,   121,   122,   123,   124,
   125,   599,    36,    37,    38,   603,   171,   253,   256,   153,
   426,   329,   579,   255,   580,   221,   221,   221,   259,   358,
   359,   262,   266,   221,   -54,   -54,   -54,   -54,   593,   583,
   263,   580,   -55,   -56,   221,   221,   441,   360,   361,   -59,
   362,   363,   448,   364,   365,   366,   610,   268,   269,   -58,
   283,    61,    62,   504,   505,   506,   507,   329,   508,   509,
   -57,   274,   287,     1,     2,   109,     3,     4,     5,   317,
   318,   329,   476,   329,   329,   329,   327,   319,   221,   483,
   221,   320,   334,   221,    36,    37,    38,   385,   373,   321,
   221,   221,   324,   489,   325,   326,   388,   374,   541,   542,
   289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
   387,   389,   401,   390,   424,   403,   404,   510,   405,   402,
   221,   221,   415,   221,   221,   413,   416,   417,   221,   418,
   419,   420,   428,   438,   422,   423,   445,   451,   455,   221,
   462,   530,   572,   456,   573,   574,   457,   458,   460,   461,
   464,   465,   539,   480,   481,   474,   482,   499,   329,   486,
   497,   500,   490,   498,   501,   511,   512,   513,   554,   514,
   221,   515,   533,   517,   503,   536,   329,   329,   329,   524,
   519,   521,   554,  -207,   522,   534,   221,   221,   523,   466,
   467,   468,   528,   527,   300,   301,   532,   473,   544,   545,
   221,   -68,     1,     2,   546,     3,     4,     5,   484,   485,
   547,   548,   549,     6,     7,   561,   470,   570,   575,   571,
   576,   581,   588,   221,   221,   586,   589,   591,   221,   604,
   590,   221,   602,   605,     8,   601,   -17,   221,     9,   -18,
   221,   616,    10,   617,   619,   622,   536,   623,   628,   629,
   631,   634,   516,   635,   518,   245,   246,   520,   247,   337,
   585,   338,   131,   568,   525,   526,   302,   303,   304,   305,
   306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
   147,   143,    42,   128,   378,   565,   369,   472,    95,     0,
     0,     0,     0,     0,   551,   552,     0,   556,   557,     0,
     0,     0,   560,   172,   173,     0,     0,    61,    62,   174,
     0,     0,  -206,   566,     0,     0,     0,     0,     0,     1,
     2,     0,     3,     4,     5,   175,   176,   177,     0,     0,
   -68,     1,     2,     0,     3,     4,     5,     0,     0,     0,
   178,   179,     6,     7,   582,     0,     0,     0,     0,     0,
     0,     0,     0,   357,     0,     0,     0,     0,   180,     0,
   597,   598,     0,     8,     0,     0,     0,     9,     0,     0,
     0,    10,     0,     0,   607,   181,   182,   183,   184,   185,
   186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
   196,   197,     0,     0,     0,     0,     0,   620,   621,     0,
     0,     0,   624,     0,     0,   627,     0,     0,     0,     0,
     0,   630,     0,     0,   632,     0,     0,   198,   199,   595,
   596,   202,   203,   204,   205,   206,   207,   208,   209,   210,
     0,   211,     0,   212,   213,   214,     0,   360,   361,     0,
   362,   363,     0,   364,   365,   366,   172,   173,     0,     0,
    61,    62,   174,     0,     0,     0,     0,     0,     0,     0,
     0,   215,     1,     2,     0,     3,     4,     5,   175,   176,
   177,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,   178,   179,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,   109,     0,    61,
    62,   180,   105,    64,    65,    66,    67,    68,    69,    70,
     0,     1,     2,     0,     3,     4,     5,     0,   181,   182,
   183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
   193,   194,   195,   196,   197,     0,     0,     0,     0,    61,
    62,    71,   105,   156,   157,   158,   159,   160,   161,    70,
     0,     1,     2,     0,     3,     4,     5,     0,     0,     0,
   198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
   208,   209,   210,     0,   211,     0,   212,   213,   214,     0,
     0,    71,     0,     0,     0,     0,   172,   173,     0,     0,
    61,    62,   174,     0,     0,   110,     0,     0,     0,     0,
     0,     0,     1,     2,   215,     3,     4,     5,   175,   176,
   177,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,   178,   179,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,   180,     0,     0,     0,     0,     0,     0,     0,    72,
    73,     0,     0,    74,     0,    75,   142,     0,   181,   182,
   183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
   193,   194,   195,   196,   197,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,    72,
    73,     0,     0,    74,     0,    75,   383,     0,     0,     0,
   198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
   208,   209,   210,     0,   211,     0,   212,   213,   214,    61,
    62,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     1,     2,     0,     3,     4,     5,   275,     0,     0,
     0,     0,     0,     0,   215,     0,     0,     0,     0,     0,
     0,     0,   276,   277,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,    61,    62,   109,   105,   156,   157,
   158,   159,   160,   161,    70,     0,     1,     2,     0,     3,
     4,     5,     0,     0,     0,     0,     0,   181,   182,   183,
   184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
   194,   195,   196,   197,     0,     0,    71,     0,     0,     0,
    61,    62,     0,   105,    64,    65,    66,    67,    68,    69,
    70,     0,     1,     2,     0,     3,     4,     5,     0,   198,
   199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
   209,   210,   135,   211,     0,   212,   213,   214,     0,     0,
     0,     0,    71,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,   110,     0,    61,    62,   -66,     0,
   278,     0,     0,   279,     0,   280,     0,   281,     1,     2,
     0,     3,     4,     5,   275,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,   276,
   277,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,   109,    72,    73,     0,     0,    74,     0,
    75,   440,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,   181,   182,   183,   184,   185,   186,
   187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
   197,     0,     0,     0,     0,     0,     0,     0,     0,     0,
    72,    73,     0,     0,    74,     0,    75,     0,     0,     0,
     0,     0,     0,     0,     0,     0,   198,   199,   200,   201,
   202,   203,   204,   205,   206,   207,   208,   209,   210,     0,
   211,     0,   212,   213,   214,     0,     0,     0,     0,     0,
     0,     0,     0,   172,   173,     0,     0,     0,     0,   174,
     0,   110,     0,     0,     0,     0,     0,   278,     0,     0,
   279,     0,   280,     0,   281,   175,   176,   177,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
   178,   179,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    61,    62,   180,   151,
    64,    65,    66,    67,    68,    69,    70,     0,     1,     2,
     0,     3,     4,     5,     0,   181,   182,   183,   184,   185,
   186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
   196,   197,     0,     0,     0,     0,    61,    62,    71,   105,
   156,   157,   158,   159,   160,   161,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,   198,   199,   200,
   201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
     0,   211,     0,   212,   213,   214,    61,    62,    71,   105,
    64,    65,    66,    67,    68,    69,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,   215,     0,     0,     0,     0,     0,     0,   368,     0,
     0,     0,   152,     0,     0,     0,    61,    62,    71,   105,
    64,    65,    66,    67,    68,    69,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,   447,     0,
    74,     0,    75,     0,     0,     0,    61,    62,    71,   105,
    64,    65,    66,    67,    68,    69,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,   538,   379,
    74,     0,    75,     0,     0,     0,    61,    62,    71,    63,
    64,    65,    66,    67,    68,    69,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,    61,    62,    71,   105,
   156,   157,   158,   159,   160,   161,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,    61,    62,    71,   151,
    64,    65,    66,    67,    68,    69,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,    61,    62,    71,   105,
    64,    65,    66,    67,    68,    69,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,    61,    62,    71,   328,
    64,    65,    66,    67,    68,    69,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,    61,    62,    71,   105,
   156,   157,   158,   159,   160,   161,    70,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,    61,    62,    71,   105,
    64,    65,    66,    67,    68,    69,   553,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,    61,    62,    71,   105,
    64,    65,    66,    67,    68,    69,   600,     0,     1,     2,
     0,     3,     4,     5,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,     0,     0,    71,     0,
   223,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
   224,   225,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,   381,   226,   227,   228,   229,   230,   231,   181,
   182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
   192,   193,   194,   195,   232,   233,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75,     0,     0,     0,   234,   235,   236,     0,
     0,   237,   199,   200,   201,   202,   203,   204,   205,   206,
   207,   208,   209,   210,   238,   239,   240,   241,   242,   243,
   244,     0,     0,     0,     0,     0,    72,    73,     0,     0,
    74,     0,    75
};

static const short yycheck[] = {     0,
   228,    26,   340,   236,   448,   263,   239,   240,   241,   242,
   243,     4,     0,    11,   247,    16,   164,   126,    21,    11,
    28,    21,    54,    54,    54,    34,    29,   154,    16,   436,
   437,    58,   278,   279,   280,    11,    11,   119,    52,     7,
     8,    38,    10,    11,    12,    13,    14,    15,    16,    17,
    75,    19,    20,    67,    22,    23,    24,     7,     8,   130,
    54,    34,   229,   154,   165,    68,   155,   149,    68,    19,
    20,   160,    22,    23,    24,   100,    54,    53,    53,   104,
    53,    49,   249,   154,   154,   110,   593,   155,   495,   155,
    91,   116,   155,   164,   162,   539,    54,   160,   164,   155,
   171,   126,    54,   610,    54,    39,    40,    54,   164,   553,
   554,    45,    11,    32,    33,   140,   141,    51,    17,   144,
   152,   152,   152,   356,    18,   150,   158,    54,   137,   138,
   139,    19,   162,   142,    22,   381,    24,   146,   147,   155,
   137,   138,   139,   155,   155,   142,    22,   485,   164,   146,
   147,   162,   164,   597,   598,   163,   600,   601,   152,   115,
   116,   164,   160,   264,   265,    53,   160,    54,   160,   402,
   163,    46,   154,    48,   152,   153,   620,   621,   516,   167,
   518,    20,   154,   416,    23,   418,   419,   420,   158,   157,
   158,   112,   113,   161,   152,   163,   164,   155,   156,    22,
   152,   226,   152,   155,   156,   152,   153,    81,    82,   234,
   235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
   245,   246,   247,    22,    35,   152,    37,   336,   566,   156,
   255,   119,   120,    22,   152,   317,   318,   319,   320,   321,
   498,   266,   324,   325,   326,   354,    42,    43,    44,   137,
   138,    47,   140,   141,     4,   143,   144,   145,   329,    37,
     4,   332,   333,    19,   335,   152,    22,    68,    24,   156,
   503,   342,    38,    53,   171,     3,     4,     5,     6,   350,
   351,   352,   137,   138,   139,   152,   159,   142,   521,   522,
   523,   146,   147,   441,    42,   159,    44,    42,    43,    44,
    45,    46,    47,    48,   153,    50,   155,   389,   390,   156,
     4,   336,   337,   338,   396,    61,    62,    63,    64,    65,
    66,   579,   149,   150,   151,   583,    38,    22,   153,   354,
   355,   356,   153,   155,   155,   406,   407,   408,   162,   119,
   120,     4,   152,   414,     3,     4,     5,     6,   576,   153,
   153,   155,     9,     9,   425,   426,   381,   137,   138,     9,
   140,   141,   387,   143,   144,   145,   594,    26,    27,     9,
   441,     7,     8,   455,   456,   457,   458,   402,   460,   461,
     9,     9,    60,    19,    20,    54,    22,    23,    24,   152,
   152,   416,   417,   418,   419,   420,    56,   152,   469,   424,
   471,   152,    11,   474,   149,   150,   151,    22,   162,   152,
   481,   482,   152,   438,   152,   152,    22,   153,   500,   501,
    92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
   152,   152,   329,   152,    38,   332,   333,   462,   335,   155,
   511,   512,   155,   514,   515,   342,   155,   155,   519,   155,
   155,   155,     4,    38,   351,   352,   155,   155,   155,   530,
    38,   486,   544,   155,   546,   547,   155,   155,   155,   155,
   155,   155,   497,   155,   155,   158,   155,    22,   503,   155,
   155,   155,   162,   153,   155,    17,    17,   152,   513,   155,
   561,   155,    22,     4,   155,   496,   521,   522,   523,     4,
   155,   155,   527,     0,   155,     4,   577,   578,   155,   406,
   407,   408,   155,   152,    26,    27,   162,   414,   155,   153,
   591,    18,    19,    20,   155,    22,    23,    24,   425,   426,
   155,   153,   153,    30,    31,   155,    53,   153,   155,   153,
   158,   160,   153,   614,   615,    53,   153,    17,   619,     4,
   153,   622,   160,   148,    51,   580,   152,   628,    55,   152,
   631,    22,    59,   155,    17,    17,   567,   155,    17,    73,
    17,     0,   469,     0,   471,   131,   131,   474,   131,   232,
   567,   233,    91,   540,   481,   482,    98,    99,   100,   101,
   102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
   110,   104,    16,    87,   266,   527,   255,   413,    54,    -1,
    -1,    -1,    -1,    -1,   511,   512,    -1,   514,   515,    -1,
    -1,    -1,   519,     3,     4,    -1,    -1,     7,     8,     9,
    -1,    -1,     0,   530,    -1,    -1,    -1,    -1,    -1,    19,
    20,    -1,    22,    23,    24,    25,    26,    27,    -1,    -1,
    18,    19,    20,    -1,    22,    23,    24,    -1,    -1,    -1,
    40,    41,    30,    31,   561,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    53,    -1,    -1,    -1,    -1,    58,    -1,
   577,   578,    -1,    51,    -1,    -1,    -1,    55,    -1,    -1,
    -1,    59,    -1,    -1,   591,    75,    76,    77,    78,    79,
    80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
    90,    91,    -1,    -1,    -1,    -1,    -1,   614,   615,    -1,
    -1,    -1,   619,    -1,    -1,   622,    -1,    -1,    -1,    -1,
    -1,   628,    -1,    -1,   631,    -1,    -1,   117,   118,   119,
   120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
    -1,   131,    -1,   133,   134,   135,    -1,   137,   138,    -1,
   140,   141,    -1,   143,   144,   145,     3,     4,    -1,    -1,
     7,     8,     9,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,   161,    19,    20,    -1,    22,    23,    24,    25,    26,
    27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    40,    41,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    54,    -1,     7,
     8,    58,    10,    11,    12,    13,    14,    15,    16,    17,
    -1,    19,    20,    -1,    22,    23,    24,    -1,    75,    76,
    77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
    87,    88,    89,    90,    91,    -1,    -1,    -1,    -1,     7,
     8,    49,    10,    11,    12,    13,    14,    15,    16,    17,
    -1,    19,    20,    -1,    22,    23,    24,    -1,    -1,    -1,
   117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
   127,   128,   129,    -1,   131,    -1,   133,   134,   135,    -1,
    -1,    49,    -1,    -1,    -1,    -1,     3,     4,    -1,    -1,
     7,     8,     9,    -1,    -1,   152,    -1,    -1,    -1,    -1,
    -1,    -1,    19,    20,   161,    22,    23,    24,    25,    26,
    27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    40,    41,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    58,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   157,
   158,    -1,    -1,   161,    -1,   163,   164,    -1,    75,    76,
    77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
    87,    88,    89,    90,    91,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   157,
   158,    -1,    -1,   161,    -1,   163,   164,    -1,    -1,    -1,
   117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
   127,   128,   129,    -1,   131,    -1,   133,   134,   135,     7,
     8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    19,    20,    -1,    22,    23,    24,    25,    -1,    -1,
    -1,    -1,    -1,    -1,   161,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    40,    41,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,     7,     8,    54,    10,    11,    12,
    13,    14,    15,    16,    17,    -1,    19,    20,    -1,    22,
    23,    24,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,
    78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
    88,    89,    90,    91,    -1,    -1,    49,    -1,    -1,    -1,
     7,     8,    -1,    10,    11,    12,    13,    14,    15,    16,
    17,    -1,    19,    20,    -1,    22,    23,    24,    -1,   117,
   118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
   128,   129,    39,   131,    -1,   133,   134,   135,    -1,    -1,
    -1,    -1,    49,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,   152,    -1,     7,     8,   156,    -1,
   158,    -1,    -1,   161,    -1,   163,    -1,   165,    19,    20,
    -1,    22,    23,    24,    25,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    40,
    41,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    54,   157,   158,    -1,    -1,   161,    -1,
   163,   164,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,    80,
    81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
    91,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
   157,   158,    -1,    -1,   161,    -1,   163,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,   119,   120,
   121,   122,   123,   124,   125,   126,   127,   128,   129,    -1,
   131,    -1,   133,   134,   135,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,     3,     4,    -1,    -1,    -1,    -1,     9,
    -1,   152,    -1,    -1,    -1,    -1,    -1,   158,    -1,    -1,
   161,    -1,   163,    -1,   165,    25,    26,    27,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    40,    41,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,     7,     8,    58,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    75,    76,    77,    78,    79,
    80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
    90,    91,    -1,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,   117,   118,   119,
   120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
    -1,   131,    -1,   133,   134,   135,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,   161,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,
    -1,    -1,   123,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    39,    -1,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    39,   160,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,     7,     8,    49,    10,
    11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,    -1,    -1,    49,    -1,
    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    56,    57,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    69,    70,    71,    72,    73,    74,    75,
    76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
    86,    87,    88,    89,    90,    91,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163,    -1,    -1,    -1,   112,   113,   114,    -1,
    -1,   117,   118,   119,   120,   121,   122,   123,   124,   125,
   126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
   136,    -1,    -1,    -1,    -1,    -1,   157,   158,    -1,    -1,
   161,    -1,   163
};
/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
#line 3 "/usr/share/bison.simple"
/* This file comes from bison-1.28.  */

/* Skeleton output parser for bison,
   Copyright (C) 1984, 1989, 1990 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., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

/* As a special exception, when this file is copied by Bison into a
   Bison output file, you may use that output file without restriction.
   This special exception was added by the Free Software Foundation
   in version 1.24 of Bison.  */

/* This is the parser code that is written into each bison parser
  when the %semantic_parser declaration is not specified in the grammar.
  It was written by Richard Stallman by simplifying the hairy parser
  used when %semantic_parser is specified.  */

#ifndef YYSTACK_USE_ALLOCA
#ifdef alloca
#define YYSTACK_USE_ALLOCA
#else /* alloca not defined */
#ifdef __GNUC__
#define YYSTACK_USE_ALLOCA
#define alloca __builtin_alloca
#else /* not GNU C.  */
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
#define YYSTACK_USE_ALLOCA
#include <alloca.h>
#else /* not sparc */
/* We think this test detects Watcom and Microsoft C.  */
/* This used to test MSDOS, but that is a bad idea
   since that symbol is in the user namespace.  */
#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
#if 0 /* No need for malloc.h, which pollutes the namespace;
	 instead, just don't use alloca.  */
#include <malloc.h>
#endif
#else /* not MSDOS, or __TURBOC__ */
#if defined(_AIX)
/* I don't know what this was needed for, but it pollutes the namespace.
   So I turned it off.   rms, 2 May 1997.  */
/* #include <malloc.h>  */
 #pragma alloca
#define YYSTACK_USE_ALLOCA
#else /* not MSDOS, or __TURBOC__, or _AIX */
#if 0
#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
		 and on HPUX 10.  Eventually we can turn this on.  */
#define YYSTACK_USE_ALLOCA
#define alloca __builtin_alloca
#endif /* __hpux */
#endif
#endif /* not _AIX */
#endif /* not MSDOS, or __TURBOC__ */
#endif /* not sparc */
#endif /* not GNU C */
#endif /* alloca not defined */
#endif /* YYSTACK_USE_ALLOCA not defined */

#ifdef YYSTACK_USE_ALLOCA
#define YYSTACK_ALLOC alloca
#else
#define YYSTACK_ALLOC malloc
#endif

/* Note: there must be only one dollar sign in this file.
   It is replaced by the list of actions, each action
   as one case of the switch.  */

#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 yyerrlab1
/* 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);			\
      yychar1 = YYTRANSLATE (yychar);				\
      YYPOPSTACK;						\
      goto yybackup;						\
    }								\
  else								\
    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
while (0)

#define YYTERROR	1
#define YYERRCODE	256

#ifndef YYPURE
#define YYLEX		yylex()
#endif

#ifdef YYPURE
#ifdef YYLSP_NEEDED
#ifdef YYLEX_PARAM
#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
#else
#define YYLEX		yylex(&yylval, &yylloc)
#endif
#else /* not YYLSP_NEEDED */
#ifdef YYLEX_PARAM
#define YYLEX		yylex(&yylval, YYLEX_PARAM)
#else
#define YYLEX		yylex(&yylval)
#endif
#endif /* not YYLSP_NEEDED */
#endif

/* If nonreentrant, generate the variables here */

#ifndef YYPURE

int	yychar;			/*  the lookahead symbol		*/
YYSTYPE	yylval;			/*  the semantic value of the		*/
				/*  lookahead symbol			*/

#ifdef YYLSP_NEEDED
YYLTYPE yylloc;			/*  location data for the lookahead	*/
				/*  symbol				*/
#endif

int yynerrs;			/*  number of parse errors so far       */
#endif  /* not YYPURE */

#if YYDEBUG != 0
int yydebug;			/*  nonzero means print parse trace	*/
/* Since this is uninitialized, it does not stop multiple parsers
   from coexisting.  */
#endif

/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/

#ifndef	YYINITDEPTH
#define YYINITDEPTH 200
#endif

/*  YYMAXDEPTH is the maximum size the stacks can grow to
    (effective only if the built-in stack extension method is used).  */

#if YYMAXDEPTH == 0
#undef YYMAXDEPTH
#endif

#ifndef YYMAXDEPTH
#define YYMAXDEPTH 10000
#endif

/* Define __yy_memcpy.  Note that the size argument
   should be passed with type unsigned int, because that is what the non-GCC
   definitions require.  With GCC, __builtin_memcpy takes an arg
   of type size_t, but it can handle unsigned int.  */

#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
#else				/* not GNU C or C++ */
#ifndef __cplusplus

/* This is the most reliable way to avoid incompatibilities
   in available built-in functions on various systems.  */
static void
__yy_memcpy (to, from, count)
     char *to;
     char *from;
     unsigned int count;
{
  register char *f = from;
  register char *t = to;
  register int i = count;

  while (i-- > 0)
    *t++ = *f++;
}

#else /* __cplusplus */

/* This is the most reliable way to avoid incompatibilities
   in available built-in functions on various systems.  */
static void
__yy_memcpy (char *to, char *from, unsigned int count)
{
  register char *t = to;
  register char *f = from;
  register int i = count;

  while (i-- > 0)
    *t++ = *f++;
}

#endif
#endif

#line 217 "/usr/share/bison.simple"

/* The user can define YYPARSE_PARAM as the name of an argument to be passed
   into yyparse.  The argument should have type void *.
   It should actually point to an object.
   Grammar actions can access the variable by casting it
   to the proper pointer type.  */

#ifdef YYPARSE_PARAM
#ifdef __cplusplus
#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
#define YYPARSE_PARAM_DECL
#else /* not __cplusplus */
#define YYPARSE_PARAM_ARG YYPARSE_PARAM
#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
#endif /* not __cplusplus */
#else /* not YYPARSE_PARAM */
#define YYPARSE_PARAM_ARG
#define YYPARSE_PARAM_DECL
#endif /* not YYPARSE_PARAM */

/* Prevent warning if -Wstrict-prototypes.  */
#ifdef __GNUC__
#ifdef YYPARSE_PARAM
int yyparse (void *);
#else
int yyparse (void);
#endif
#endif

int
yyparse(YYPARSE_PARAM_ARG)
     YYPARSE_PARAM_DECL
{
  register int yystate;
  register int yyn;
  register short *yyssp;
  register YYSTYPE *yyvsp;
  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */

  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/

  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */

#ifdef YYLSP_NEEDED
  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
  YYLTYPE *yyls = yylsa;
  YYLTYPE *yylsp;

#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
#else
#define YYPOPSTACK   (yyvsp--, yyssp--)
#endif

  int yystacksize = YYINITDEPTH;
  int yyfree_stacks = 0;

#ifdef YYPURE
  int yychar;
  YYSTYPE yylval;
  int yynerrs;
#ifdef YYLSP_NEEDED
  YYLTYPE yylloc;
#endif
#endif

  YYSTYPE yyval;		/*  the variable used to return		*/
				/*  semantic values from the action	*/
				/*  routines				*/

  int yylen;

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Starting parse\n");
#endif

  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 - 1;
  yyvsp = yyvs;
#ifdef YYLSP_NEEDED
  yylsp = yyls;
#endif

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

  *++yyssp = yystate;

  if (yyssp >= yyss + yystacksize - 1)
    {
      /* 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 *yyss1 = yyss;
#ifdef YYLSP_NEEDED
      YYLTYPE *yyls1 = yyls;
#endif

      /* Get the current used size of the three stacks, in elements.  */
      int size = yyssp - yyss + 1;

#ifdef yyoverflow
      /* Each stack pointer address is followed by the size of
	 the data in use in that stack, in bytes.  */
#ifdef YYLSP_NEEDED
      /* This used to be a conditional around just the two extra args,
	 but that might be undefined if yyoverflow is a macro.  */
      yyoverflow("parser stack overflow",
		 &yyss1, size * sizeof (*yyssp),
		 &yyvs1, size * sizeof (*yyvsp),
		 &yyls1, size * sizeof (*yylsp),
		 &yystacksize);
#else
      yyoverflow("parser stack overflow",
		 &yyss1, size * sizeof (*yyssp),
		 &yyvs1, size * sizeof (*yyvsp),
		 &yystacksize);
#endif

      yyss = yyss1; yyvs = yyvs1;
#ifdef YYLSP_NEEDED
      yyls = yyls1;
#endif
#else /* no yyoverflow */
      /* Extend the stack our own way.  */
      if (yystacksize >= YYMAXDEPTH)
	{
	  yyerror("parser stack overflow");
	  if (yyfree_stacks)
	    {
	      free (yyss);
	      free (yyvs);
#ifdef YYLSP_NEEDED
	      free (yyls);
#endif
	    }
	  return 2;
	}
      yystacksize *= 2;
      if (yystacksize > YYMAXDEPTH)
	yystacksize = YYMAXDEPTH;
#ifndef YYSTACK_USE_ALLOCA
      yyfree_stacks = 1;
#endif
      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
      __yy_memcpy ((char *)yyss, (char *)yyss1,
		   size * (unsigned int) sizeof (*yyssp));
      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
		   size * (unsigned int) sizeof (*yyvsp));
#ifdef YYLSP_NEEDED
      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
      __yy_memcpy ((char *)yyls, (char *)yyls1,
		   size * (unsigned int) sizeof (*yylsp));
#endif
#endif /* no yyoverflow */

      yyssp = yyss + size - 1;
      yyvsp = yyvs + size - 1;
#ifdef YYLSP_NEEDED
      yylsp = yyls + size - 1;
#endif

#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
#endif

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

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Entering state %d\n", yystate);
#endif

  goto yybackup;
 yybackup:

/* Do appropriate processing given the current state.  */
/* Read a lookahead token if we need one and don't already have one.  */
/* yyresume: */

  /* First try to decide what to do without reference to lookahead token.  */

  yyn = yypact[yystate];
  if (yyn == YYFLAG)
    goto yydefault;

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

  /* yychar is either YYEMPTY or YYEOF
     or a valid token in external form.  */

  if (yychar == YYEMPTY)
    {
#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Reading a token: ");
#endif
      yychar = YYLEX;
    }

  /* Convert token to internal form (in yychar1) for indexing tables with */

  if (yychar <= 0)		/* This means end of input. */
    {
      yychar1 = 0;
      yychar = YYEOF;		/* Don't call YYLEX any more */

#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Now at end of input.\n");
#endif
    }
  else
    {
      yychar1 = YYTRANSLATE(yychar);

#if YYDEBUG != 0
      if (yydebug)
	{
	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
	  /* Give the individual parser a way to print the precise meaning
	     of a token, for further debugging info.  */
#ifdef YYPRINT
	  YYPRINT (stderr, yychar, yylval);
#endif
	  fprintf (stderr, ")\n");
	}
#endif
    }

  yyn += yychar1;
  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
    goto yydefault;

  yyn = yytable[yyn];

  /* yyn is what to do for this token type in this state.
     Negative => reduce, -yyn is rule number.
     Positive => shift, yyn is new state.
       New state is final state => don't bother to shift,
       just return success.
     0, or most negative number => error.  */

  if (yyn < 0)
    {
      if (yyn == YYFLAG)
	goto yyerrlab;
      yyn = -yyn;
      goto yyreduce;
    }
  else if (yyn == 0)
    goto yyerrlab;

  if (yyn == YYFINAL)
    YYACCEPT;

  /* Shift the lookahead token.  */

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
#endif

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

  *++yyvsp = yylval;
#ifdef YYLSP_NEEDED
  *++yylsp = yylloc;
#endif

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

  yystate = yyn;
  goto yynewstate;

/* Do the default action for the current state.  */
yydefault:

  yyn = yydefact[yystate];
  if (yyn == 0)
    goto yyerrlab;

/* Do a reduction.  yyn is the number of a rule to reduce with.  */
yyreduce:
  yylen = yyr2[yyn];
  if (yylen > 0)
    yyval = yyvsp[1-yylen]; /* implement default value of the action */

#if YYDEBUG != 0
  if (yydebug)
    {
      int i;

      fprintf (stderr, "Reducing via rule %d (line %d), ",
	       yyn, yyrline[yyn]);

      /* Print the symbols being reduced, and their result.  */
      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
    }
#endif


  switch (yyn) {

case 28:
#line 1118 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_EQ; ;
    break;}
case 29:
#line 1118 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_NE; ;
    break;}
case 30:
#line 1119 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_SLT; ;
    break;}
case 31:
#line 1119 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_SGT; ;
    break;}
case 32:
#line 1120 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_SLE; ;
    break;}
case 33:
#line 1120 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_SGE; ;
    break;}
case 34:
#line 1121 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_ULT; ;
    break;}
case 35:
#line 1121 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_UGT; ;
    break;}
case 36:
#line 1122 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_ULE; ;
    break;}
case 37:
#line 1122 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.IPredicate = ICmpInst::ICMP_UGE; ;
    break;}
case 38:
#line 1126 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_OEQ; ;
    break;}
case 39:
#line 1126 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_ONE; ;
    break;}
case 40:
#line 1127 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_OLT; ;
    break;}
case 41:
#line 1127 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_OGT; ;
    break;}
case 42:
#line 1128 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_OLE; ;
    break;}
case 43:
#line 1128 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_OGE; ;
    break;}
case 44:
#line 1129 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_ORD; ;
    break;}
case 45:
#line 1129 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_UNO; ;
    break;}
case 46:
#line 1130 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_UEQ; ;
    break;}
case 47:
#line 1130 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_UNE; ;
    break;}
case 48:
#line 1131 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_ULT; ;
    break;}
case 49:
#line 1131 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_UGT; ;
    break;}
case 50:
#line 1132 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_ULE; ;
    break;}
case 51:
#line 1132 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_UGE; ;
    break;}
case 52:
#line 1133 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_TRUE; ;
    break;}
case 53:
#line 1134 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.FPredicate = FCmpInst::FCMP_FALSE; ;
    break;}
case 64:
#line 1143 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.StrVal = 0; ;
    break;}
case 65:
#line 1145 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal=yyvsp[-1].UInt64Val; ;
    break;}
case 66:
#line 1146 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal=0; ;
    break;}
case 67:
#line 1150 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.StrVal = yyvsp[-1].StrVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 68:
#line 1154 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.StrVal = 0;
    CHECK_FOR_ERROR
  ;
    break;}
case 72:
#line 1162 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.StrVal = 0;
    CHECK_FOR_ERROR
  ;
    break;}
case 73:
#line 1167 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.StrVal = yyvsp[-1].StrVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 74:
#line 1173 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::InternalLinkage; ;
    break;}
case 75:
#line 1174 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::WeakLinkage; ;
    break;}
case 76:
#line 1175 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
    break;}
case 77:
#line 1176 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::AppendingLinkage; ;
    break;}
case 78:
#line 1177 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::DLLExportLinkage; ;
    break;}
case 79:
#line 1181 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::DLLImportLinkage; ;
    break;}
case 80:
#line 1182 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
    break;}
case 81:
#line 1183 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
    break;}
case 82:
#line 1187 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Visibility = GlobalValue::DefaultVisibility;   ;
    break;}
case 83:
#line 1188 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Visibility = GlobalValue::DefaultVisibility;   ;
    break;}
case 84:
#line 1189 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Visibility = GlobalValue::HiddenVisibility;    ;
    break;}
case 85:
#line 1190 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Visibility = GlobalValue::ProtectedVisibility; ;
    break;}
case 86:
#line 1194 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
    break;}
case 87:
#line 1195 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::DLLImportLinkage; ;
    break;}
case 88:
#line 1196 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
    break;}
case 89:
#line 1200 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
    break;}
case 90:
#line 1201 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::InternalLinkage; ;
    break;}
case 91:
#line 1202 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
    break;}
case 92:
#line 1203 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::WeakLinkage; ;
    break;}
case 93:
#line 1204 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::DLLExportLinkage; ;
    break;}
case 94:
#line 1208 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
    break;}
case 95:
#line 1209 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::WeakLinkage; ;
    break;}
case 96:
#line 1210 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.Linkage = GlobalValue::InternalLinkage; ;
    break;}
case 97:
#line 1213 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal = CallingConv::C; ;
    break;}
case 98:
#line 1214 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal = CallingConv::C; ;
    break;}
case 99:
#line 1215 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal = CallingConv::Fast; ;
    break;}
case 100:
#line 1216 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal = CallingConv::Cold; ;
    break;}
case 101:
#line 1217 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal = CallingConv::X86_StdCall; ;
    break;}
case 102:
#line 1218 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal = CallingConv::X86_FastCall; ;
    break;}
case 103:
#line 1219 "/Users/ggreif/llvm/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 104:
#line 1226 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::ZExt;      ;
    break;}
case 105:
#line 1227 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::ZExt;      ;
    break;}
case 106:
#line 1228 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::SExt;      ;
    break;}
case 107:
#line 1229 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::SExt;      ;
    break;}
case 108:
#line 1230 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::InReg;     ;
    break;}
case 109:
#line 1231 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::StructRet; ;
    break;}
case 110:
#line 1232 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::NoAlias;   ;
    break;}
case 111:
#line 1233 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::ByVal;     ;
    break;}
case 112:
#line 1234 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::Nest;      ;
    break;}
case 113:
#line 1235 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = 
                          ParamAttr::constructAlignmentFromInt(yyvsp[0].UInt64Val);    ;
    break;}
case 114:
#line 1239 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::None; ;
    break;}
case 115:
#line 1240 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
                yyval.ParamAttrs = yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs;
              ;
    break;}
case 116:
#line 1245 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::NoReturn; ;
    break;}
case 117:
#line 1246 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::NoUnwind; ;
    break;}
case 118:
#line 1247 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::ZExt;     ;
    break;}
case 119:
#line 1248 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::SExt;     ;
    break;}
case 120:
#line 1249 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::ReadNone; ;
    break;}
case 121:
#line 1250 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::ReadOnly; ;
    break;}
case 122:
#line 1253 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamAttrs = ParamAttr::None; ;
    break;}
case 123:
#line 1254 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
                yyval.ParamAttrs = yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs;
              ;
    break;}
case 124:
#line 1259 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.StrVal = 0; ;
    break;}
case 125:
#line 1260 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
                yyval.StrVal = yyvsp[0].StrVal;
              ;
    break;}
case 126:
#line 1267 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal = 0; ;
    break;}
case 127:
#line 1268 "/Users/ggreif/llvm/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 128:
#line 1274 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.UIntVal = 0; ;
    break;}
case 129:
#line 1275 "/Users/ggreif/llvm/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 130:
#line 1284 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
  for (unsigned i = 0, e = yyvsp[0].StrVal->length(); 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 131:
#line 1292 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.StrVal = 0; ;
    break;}
case 132:
#line 1293 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.StrVal = yyvsp[0].StrVal; ;
    break;}
case 133:
#line 1298 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{;
    break;}
case 134:
#line 1299 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{;
    break;}
case 135:
#line 1300 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CurGV->setSection(*yyvsp[0].StrVal);
    delete yyvsp[0].StrVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 136:
#line 1305 "/Users/ggreif/llvm/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 144:
#line 1321 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TypeVal = new PATypeHolder(OpaqueType::get());
    CHECK_FOR_ERROR
  ;
    break;}
case 145:
#line 1325 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType);
    CHECK_FOR_ERROR
  ;
    break;}
case 146:
#line 1329 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                             // Pointer type?
    if (*yyvsp[-2].TypeVal == Type::LabelTy)
      GEN_ERROR("Cannot form a pointer to a basic block");
    yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-2].TypeVal, yyvsp[-1].UIntVal)));
    delete yyvsp[-2].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 147:
#line 1336 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{            // Named types are also simple types...
    const Type* tmp = getTypeVal(yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    yyval.TypeVal = new PATypeHolder(tmp);
  ;
    break;}
case 148:
#line 1341 "/Users/ggreif/llvm/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 = new PATypeHolder(OT);
    UR_OUT("New Upreference!\n");
    CHECK_FOR_ERROR
  ;
    break;}
case 149:
#line 1349 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    // Allow but ignore attributes on function types; this permits auto-upgrade.
    // FIXME: remove in LLVM 3.0.
    const Type* RetTy = *yyvsp[-4].TypeVal;
    if (!(RetTy->isFirstClassType() || RetTy == Type::VoidTy ||
          isa<OpaqueType>(RetTy)))
      GEN_ERROR("LLVM Functions cannot return aggregates");

    std::vector<const Type*> Params;
    TypeWithAttrsList::iterator I = yyvsp[-2].TypeWithAttrsList->begin(), E = yyvsp[-2].TypeWithAttrsList->end();
    for (; I != E; ++I ) {
      const Type *Ty = I->Ty->get();
      Params.push_back(Ty);
    }

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

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

    CHECK_FOR_ERROR

    FunctionType *FT = FunctionType::get(RetTy, Params, isVarArg);
    delete yyvsp[-2].TypeWithAttrsList;   // Delete the argument list
    delete yyvsp[-4].TypeVal;   // Delete the return type handle
    yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); 
    CHECK_FOR_ERROR
  ;
    break;}
case 150:
#line 1379 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    // Allow but ignore attributes on function types; this permits auto-upgrade.
    // FIXME: remove in LLVM 3.0.
    std::vector<const Type*> Params;
    TypeWithAttrsList::iterator I = yyvsp[-2].TypeWithAttrsList->begin(), E = yyvsp[-2].TypeWithAttrsList->end();
    for ( ; I != E; ++I ) {
      const Type* Ty = I->Ty->get();
      Params.push_back(Ty);
    }

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

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

    CHECK_FOR_ERROR

    FunctionType *FT = FunctionType::get(yyvsp[-4].PrimType, Params, isVarArg);
    delete yyvsp[-2].TypeWithAttrsList;      // Delete the argument list
    yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); 
    CHECK_FOR_ERROR
  ;
    break;}
case 151:
#line 1404 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{          // Sized array type?
    yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val)));
    delete yyvsp[-1].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 152:
#line 1409 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{          // Vector type?
     const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get();
     if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val)
        GEN_ERROR("Unsigned result not equal to signed result");
     if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger())
        GEN_ERROR("Element type of a VectorType must be primitive");
     yyval.TypeVal = new PATypeHolder(HandleUpRefs(VectorType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val)));
     delete yyvsp[-1].TypeVal;
     CHECK_FOR_ERROR
  ;
    break;}
case 153:
#line 1419 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                        // Structure type?
    std::vector<const Type*> Elements;
    for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-1].TypeList->begin(),
           E = yyvsp[-1].TypeList->end(); I != E; ++I)
      Elements.push_back(*I);

    yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
    delete yyvsp[-1].TypeList;
    CHECK_FOR_ERROR
  ;
    break;}
case 154:
#line 1429 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                                  // Empty structure type?
    yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>()));
    CHECK_FOR_ERROR
  ;
    break;}
case 155:
#line 1433 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    std::vector<const Type*> Elements;
    for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-2].TypeList->begin(),
           E = yyvsp[-2].TypeList->end(); I != E; ++I)
      Elements.push_back(*I);

    yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
    delete yyvsp[-2].TypeList;
    CHECK_FOR_ERROR
  ;
    break;}
case 156:
#line 1443 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                         // Empty structure type?
    yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>(), true));
    CHECK_FOR_ERROR
  ;
    break;}
case 157:
#line 1450 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    // Allow but ignore attributes on function types; this permits auto-upgrade.
    // FIXME: remove in LLVM 3.0.
    yyval.TypeWithAttrs.Ty = yyvsp[-1].TypeVal; 
    yyval.TypeWithAttrs.Attrs = ParamAttr::None;
  ;
    break;}
case 158:
#line 1459 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
    if (!(*yyvsp[0].TypeVal)->isFirstClassType() && !isa<StructType>(yyvsp[0].TypeVal->get()))
      GEN_ERROR("LLVM functions cannot return aggregate types");
    yyval.TypeVal = yyvsp[0].TypeVal;
  ;
    break;}
case 159:
#line 1466 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TypeVal = new PATypeHolder(Type::VoidTy);
  ;
    break;}
case 160:
#line 1471 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TypeWithAttrsList = new TypeWithAttrsList();
    yyval.TypeWithAttrsList->push_back(yyvsp[0].TypeWithAttrs);
    CHECK_FOR_ERROR
  ;
    break;}
case 161:
#line 1476 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    (yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList)->push_back(yyvsp[0].TypeWithAttrs);
    CHECK_FOR_ERROR
  ;
    break;}
case 163:
#line 1484 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList;
    TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
    TWA.Ty = new PATypeHolder(Type::VoidTy);
    yyval.TypeWithAttrsList->push_back(TWA);
    CHECK_FOR_ERROR
  ;
    break;}
case 164:
#line 1491 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TypeWithAttrsList = new TypeWithAttrsList;
    TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
    TWA.Ty = new PATypeHolder(Type::VoidTy);
    yyval.TypeWithAttrsList->push_back(TWA);
    CHECK_FOR_ERROR
  ;
    break;}
case 165:
#line 1498 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TypeWithAttrsList = new TypeWithAttrsList();
    CHECK_FOR_ERROR
  ;
    break;}
case 166:
#line 1506 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TypeList = new std::list<PATypeHolder>();
    yyval.TypeList->push_back(*yyvsp[0].TypeVal); 
    delete yyvsp[0].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 167:
#line 1512 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); 
    delete yyvsp[0].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 168:
#line 1524 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ // Nonempty unsized arr
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-3].TypeVal->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     (*yyvsp[-3].TypeVal)->getDescription() + "'");
    const Type *ETy = ATy->getElementType();
    int NumElements = ATy->getNumElements();

    // Verify that we have the correct size...
    if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
      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; delete yyvsp[-1].ConstVector;
    CHECK_FOR_ERROR
  ;
    break;}
case 169:
#line 1552 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     (*yyvsp[-2].TypeVal)->getDescription() + "'");

    int NumElements = ATy->getNumElements();
    if (NumElements != -1 && NumElements != 0) 
      GEN_ERROR("Type mismatch: constant sized array initialized with 0"
                     " arguments, but has size of " + itostr(NumElements) +"");
    yyval.ConstVal = ConstantArray::get(ATy, std::vector<Constant*>());
    delete yyvsp[-2].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 170:
#line 1568 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal->get());
    if (ATy == 0)
      GEN_ERROR("Cannot make array constant with type: '" + 
                     (*yyvsp[-2].TypeVal)->getDescription() + "'");

    int NumElements = ATy->getNumElements();
    const Type *ETy = ATy->getElementType();
    if (NumElements != -1 && NumElements != int(yyvsp[0].StrVal->length()))
      GEN_ERROR("Can't build string constant of size " + 
                     itostr((int)(yyvsp[0].StrVal->length())) +
                     " when array has size " + itostr(NumElements) + "");
    std::vector<Constant*> Vals;
    if (ETy == Type::Int8Ty) {
      for (unsigned i = 0; i < yyvsp[0].StrVal->length(); ++i)
        Vals.push_back(ConstantInt::get(ETy, (*yyvsp[0].StrVal)[i]));
    } else {
      delete yyvsp[0].StrVal;
      GEN_ERROR("Cannot build string arrays of non byte sized elements");
    }
    delete yyvsp[0].StrVal;
    yyval.ConstVal = ConstantArray::get(ATy, Vals);
    delete yyvsp[-2].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 171:
#line 1595 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ // Nonempty unsized arr
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
    const VectorType *PTy = dyn_cast<VectorType>(yyvsp[-3].TypeVal->get());
    if (PTy == 0)
      GEN_ERROR("Cannot make packed constant with type: '" + 
                     (*yyvsp[-3].TypeVal)->getDescription() + "'");
    const Type *ETy = PTy->getElementType();
    int NumElements = PTy->getNumElements();

    // Verify that we have the correct size...
    if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
      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 = ConstantVector::get(PTy, *yyvsp[-1].ConstVector);
    delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
    CHECK_FOR_ERROR
  ;
    break;}
case 172:
#line 1623 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    const StructType *STy = dyn_cast<StructType>(yyvsp[-3].TypeVal->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (*yyvsp[-3].TypeVal)->getDescription() + "'");

    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");

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

    yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector);
    delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
    CHECK_FOR_ERROR
  ;
    break;}
case 173:
#line 1649 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
    const StructType *STy = dyn_cast<StructType>(yyvsp[-2].TypeVal->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (*yyvsp[-2].TypeVal)->getDescription() + "'");

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

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

    yyval.ConstVal = ConstantStruct::get(STy, std::vector<Constant*>());
    delete yyvsp[-2].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 174:
#line 1669 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    const StructType *STy = dyn_cast<StructType>(yyvsp[-5].TypeVal->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (*yyvsp[-5].TypeVal)->getDescription() + "'");

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

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

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

    yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-2].ConstVector);
    delete yyvsp[-5].TypeVal; delete yyvsp[-2].ConstVector;
    CHECK_FOR_ERROR
  ;
    break;}
case 175:
#line 1695 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
    const StructType *STy = dyn_cast<StructType>(yyvsp[-4].TypeVal->get());
    if (STy == 0)
      GEN_ERROR("Cannot make struct constant with type: '" + 
                     (*yyvsp[-4].TypeVal)->getDescription() + "'");

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

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

    yyval.ConstVal = ConstantStruct::get(STy, std::vector<Constant*>());
    delete yyvsp[-4].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 176:
#line 1715 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    const PointerType *PTy = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
    if (PTy == 0)
      GEN_ERROR("Cannot make null pointer constant with type: '" + 
                     (*yyvsp[-1].TypeVal)->getDescription() + "'");

    yyval.ConstVal = ConstantPointerNull::get(PTy);
    delete yyvsp[-1].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 177:
#line 1727 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get());
    delete yyvsp[-1].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 178:
#line 1734 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    const PointerType *Ty = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
    if (Ty == 0)
      GEN_ERROR("Global const reference must be a pointer type " + (*yyvsp[-1].TypeVal)->getDescription());

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

    Value *V = getExistingVal(Ty, yyvsp[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::GlobalName)
          Name = yyvsp[0].ValIDVal.getName();
        else if (yyvsp[0].ValIDVal.Type != ValID::GlobalID)
          GEN_ERROR("Invalid reference to global");

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

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

    yyval.ConstVal = cast<GlobalValue>(V);
    delete yyvsp[-1].TypeVal;            // Free the type handle
    CHECK_FOR_ERROR
  ;
    break;}
case 179:
#line 1800 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType())
      GEN_ERROR("Mismatched types for constant expression: " + 
        (*yyvsp[-1].TypeVal)->getDescription() + " and " + yyvsp[0].ConstVal->getType()->getDescription());
    yyval.ConstVal = yyvsp[0].ConstVal;
    delete yyvsp[-1].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 180:
#line 1810 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    const Type *Ty = yyvsp[-1].TypeVal->get();
    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;
    CHECK_FOR_ERROR
  ;
    break;}
case 181:
#line 1820 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{      // integral constants
    if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val))
      GEN_ERROR("Constant value doesn't fit in type");
    yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val, true);
    CHECK_FOR_ERROR
  ;
    break;}
case 182:
#line 1826 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{      // arbitrary precision integer constants
    uint32_t BitWidth = cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth();
    if (yyvsp[0].APIntVal->getBitWidth() > BitWidth) {
      GEN_ERROR("Constant value does not fit in type");
    }
    yyvsp[0].APIntVal->sextOrTrunc(BitWidth);
    yyval.ConstVal = ConstantInt::get(*yyvsp[0].APIntVal);
    delete yyvsp[0].APIntVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 183:
#line 1836 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{      // integral constants
    if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val))
      GEN_ERROR("Constant value doesn't fit in type");
    yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val, false);
    CHECK_FOR_ERROR
  ;
    break;}
case 184:
#line 1842 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{      // arbitrary precision integer constants
    uint32_t BitWidth = cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth();
    if (yyvsp[0].APIntVal->getBitWidth() > BitWidth) {
      GEN_ERROR("Constant value does not fit in type");
    } 
    yyvsp[0].APIntVal->zextOrTrunc(BitWidth);
    yyval.ConstVal = ConstantInt::get(*yyvsp[0].APIntVal);
    delete yyvsp[0].APIntVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 185:
#line 1852 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                      // Boolean constants
    assert(cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?");
    yyval.ConstVal = ConstantInt::getTrue();
    CHECK_FOR_ERROR
  ;
    break;}
case 186:
#line 1857 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                     // Boolean constants
    assert(cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?");
    yyval.ConstVal = ConstantInt::getFalse();
    CHECK_FOR_ERROR
  ;
    break;}
case 187:
#line 1862 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                   // Floating point constants
    if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, *yyvsp[0].FPVal))
      GEN_ERROR("Floating point constant invalid for type");
    // Lexer has no type info, so builds all float and double FP constants 
    // as double.  Fix this here.  Long double is done right.
    if (&yyvsp[0].FPVal->getSemantics()==&APFloat::IEEEdouble && yyvsp[-1].PrimType==Type::FloatTy)
      yyvsp[0].FPVal->convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven);
    yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, *yyvsp[0].FPVal);
    delete yyvsp[0].FPVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 188:
#line 1875 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    Constant *Val = yyvsp[-3].ConstVal;
    const Type *DestTy = yyvsp[-1].TypeVal->get();
    if (!CastInst::castIsValid(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy))
      GEN_ERROR("invalid cast opcode for cast from '" +
                Val->getType()->getDescription() + "' to '" +
                DestTy->getDescription() + "'"); 
    yyval.ConstVal = ConstantExpr::getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy);
    delete yyvsp[-1].TypeVal;
  ;
    break;}
case 189:
#line 1887 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!isa<PointerType>(yyvsp[-2].ConstVal->getType()))
      GEN_ERROR("GetElementPtr requires a pointer operand");

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

    SmallVector<Constant*, 8> IdxVec;
    for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i)
      if (Constant *C = dyn_cast<Constant>((*yyvsp[-1].ValueList)[i]))
        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[0], IdxVec.size());
    CHECK_FOR_ERROR
  ;
    break;}
case 190:
#line 1909 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (yyvsp[-5].ConstVal->getType() != Type::Int1Ty)
      GEN_ERROR("Select condition must be of boolean type");
    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
      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 191:
#line 1917 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
      GEN_ERROR("Binary operator types must match");
    CHECK_FOR_ERROR;
    yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
  ;
    break;}
case 192:
#line 1923 "/Users/ggreif/llvm/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()->isInteger()) {
      if (Instruction::isShift(yyvsp[-5].BinaryOpVal) || !isa<VectorType>(yyvsp[-3].ConstVal->getType()) || 
          !cast<VectorType>(yyvsp[-3].ConstVal->getType())->getElementType()->isInteger())
        GEN_ERROR("Logical operator requires integral operands");
    }
    yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 193:
#line 1934 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
      GEN_ERROR("icmp operand types must match");
    yyval.ConstVal = ConstantExpr::getICmp(yyvsp[-5].IPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
  ;
    break;}
case 194:
#line 1939 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
      GEN_ERROR("fcmp operand types must match");
    yyval.ConstVal = ConstantExpr::getFCmp(yyvsp[-5].FPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
  ;
    break;}
case 195:
#line 1944 "/Users/ggreif/llvm/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 196:
#line 1950 "/Users/ggreif/llvm/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 197:
#line 1956 "/Users/ggreif/llvm/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 198:
#line 1965 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 199:
#line 1969 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ConstVector = new std::vector<Constant*>();
    yyval.ConstVector->push_back(yyvsp[0].ConstVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 200:
#line 1977 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.BoolVal = false; ;
    break;}
case 201:
#line 1977 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.BoolVal = true; ;
    break;}
case 202:
#line 1980 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.BoolVal = true; ;
    break;}
case 203:
#line 1980 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.BoolVal = false; ;
    break;}
case 204:
#line 1983 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    const Type* VTy = yyvsp[-1].TypeVal->get();
    Value *V = getVal(VTy, yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    GlobalValue* Aliasee = dyn_cast<GlobalValue>(V);
    if (!Aliasee)
      GEN_ERROR("Aliases can be created only to global values");

    yyval.ConstVal = Aliasee;
    CHECK_FOR_ERROR
    delete yyvsp[-1].TypeVal;
   ;
    break;}
case 205:
#line 1995 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    Constant *Val = yyvsp[-3].ConstVal;
    const Type *DestTy = yyvsp[-1].TypeVal->get();
    if (!CastInst::castIsValid(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy))
      GEN_ERROR("invalid cast opcode for cast from '" +
                Val->getType()->getDescription() + "' to '" +
                DestTy->getDescription() + "'");
    
    yyval.ConstVal = ConstantExpr::getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy);
    CHECK_FOR_ERROR
    delete yyvsp[-1].TypeVal;
   ;
    break;}
case 206:
#line 2016 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
    CurModule.ModuleDone();
    CHECK_FOR_ERROR;
  ;
    break;}
case 207:
#line 2021 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
    CurModule.ModuleDone();
    CHECK_FOR_ERROR;
  ;
    break;}
case 210:
#line 2034 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ CurFun.isDeclare = false; ;
    break;}
case 211:
#line 2034 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CurFun.FunctionDone();
    CHECK_FOR_ERROR
  ;
    break;}
case 212:
#line 2038 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ CurFun.isDeclare = true; ;
    break;}
case 213:
#line 2038 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CHECK_FOR_ERROR
  ;
    break;}
case 214:
#line 2041 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CHECK_FOR_ERROR
  ;
    break;}
case 215:
#line 2044 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
    // Eagerly resolve types.  This is not an optimization, this is a
    // requirement that is due to the fact that we could have this:
    //
    // %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);

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

    delete yyvsp[0].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 216:
#line 2068 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    ResolveTypeTo(yyvsp[-2].StrVal, yyvsp[0].PrimType);

    if (!setTypeName(yyvsp[0].PrimType, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) {
      CHECK_FOR_ERROR
      // If this is a named type that is not a redefinition, add it to the slot
      // table.
      CurModule.Types.push_back(yyvsp[0].PrimType);
    }
    CHECK_FOR_ERROR
  ;
    break;}
case 217:
#line 2080 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ 
    /* "Externally Visible" Linkage */
    if (yyvsp[-1].ConstVal == 0) 
      GEN_ERROR("Global value initializer is not a constant");
    CurGV = ParseGlobalVariable(yyvsp[-5].StrVal, GlobalValue::ExternalLinkage,
                                yyvsp[-4].Visibility, yyvsp[-2].BoolVal, yyvsp[-1].ConstVal->getType(), yyvsp[-1].ConstVal, yyvsp[-3].BoolVal, yyvsp[0].UIntVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 218:
#line 2087 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CurGV = 0;
  ;
    break;}
case 219:
#line 2091 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (yyvsp[-1].ConstVal == 0) 
      GEN_ERROR("Global value initializer is not a constant");
    CurGV = ParseGlobalVariable(yyvsp[-6].StrVal, yyvsp[-5].Linkage, yyvsp[-4].Visibility, yyvsp[-2].BoolVal, yyvsp[-1].ConstVal->getType(), yyvsp[-1].ConstVal, yyvsp[-3].BoolVal, yyvsp[0].UIntVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 220:
#line 2096 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CurGV = 0;
  ;
    break;}
case 221:
#line 2100 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    CurGV = ParseGlobalVariable(yyvsp[-6].StrVal, yyvsp[-5].Linkage, yyvsp[-4].Visibility, yyvsp[-2].BoolVal, *yyvsp[-1].TypeVal, 0, yyvsp[-3].BoolVal, yyvsp[0].UIntVal);
    CHECK_FOR_ERROR
    delete yyvsp[-1].TypeVal;
  ;
    break;}
case 222:
#line 2106 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CurGV = 0;
    CHECK_FOR_ERROR
  ;
    break;}
case 223:
#line 2110 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    std::string Name;
    if (yyvsp[-4].StrVal) {
      Name = *yyvsp[-4].StrVal;
      delete yyvsp[-4].StrVal;
    }
    if (Name.empty())
      GEN_ERROR("Alias name cannot be empty");
    
    Constant* Aliasee = yyvsp[0].ConstVal;
    if (Aliasee == 0)
      GEN_ERROR(std::string("Invalid aliasee for alias: ") + Name);

    GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), yyvsp[-1].Linkage, Name, Aliasee,
                                      CurModule.CurrentModule);
    GA->setVisibility(yyvsp[-3].Visibility);
    InsertValue(GA, CurModule.Values);
    
    
    // If there was a forward reference of this alias, resolve it now.
    
    ValID ID;
    if (!Name.empty())
      ID = ValID::createGlobalName(Name);
    else
      ID = ValID::createGlobalID(CurModule.Values.size()-1);
    
    if (GlobalValue *FWGV =
          CurModule.GetForwardRefForGlobal(GA->getType(), ID)) {
      // Replace uses of the fwdref with the actual alias.
      FWGV->replaceAllUsesWith(GA);
      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(FWGV))
        GV->eraseFromParent();
      else
        cast<Function>(FWGV)->eraseFromParent();
    }
    ID.destroy();
    
    CHECK_FOR_ERROR
  ;
    break;}
case 224:
#line 2150 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ 
    CHECK_FOR_ERROR
  ;
    break;}
case 225:
#line 2153 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CHECK_FOR_ERROR
  ;
    break;}
case 226:
#line 2159 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
  const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
  if (AsmSoFar.empty())
    CurModule.CurrentModule->setModuleInlineAsm(*yyvsp[0].StrVal);
  else
    CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+*yyvsp[0].StrVal);
  delete yyvsp[0].StrVal;
  CHECK_FOR_ERROR
;
    break;}
case 227:
#line 2169 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CurModule.CurrentModule->setTargetTriple(*yyvsp[0].StrVal);
    delete yyvsp[0].StrVal;
  ;
    break;}
case 228:
#line 2173 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CurModule.CurrentModule->setDataLayout(*yyvsp[0].StrVal);
    delete yyvsp[0].StrVal;
  ;
    break;}
case 230:
#line 2180 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
          CurModule.CurrentModule->addLibrary(*yyvsp[0].StrVal);
          delete yyvsp[0].StrVal;
          CHECK_FOR_ERROR
        ;
    break;}
case 231:
#line 2185 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
          CurModule.CurrentModule->addLibrary(*yyvsp[0].StrVal);
          delete yyvsp[0].StrVal;
          CHECK_FOR_ERROR
        ;
    break;}
case 232:
#line 2190 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
          CHECK_FOR_ERROR
        ;
    break;}
case 233:
#line 2199 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
    if (*yyvsp[-2].TypeVal == Type::VoidTy)
      GEN_ERROR("void typed arguments are invalid");
    ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal;
    yyval.ArgList = yyvsp[-4].ArgList;
    yyvsp[-4].ArgList->push_back(E);
    CHECK_FOR_ERROR
  ;
    break;}
case 234:
#line 2209 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
    if (*yyvsp[-2].TypeVal == Type::VoidTy)
      GEN_ERROR("void typed arguments are invalid");
    ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal;
    yyval.ArgList = new ArgListType;
    yyval.ArgList->push_back(E);
    CHECK_FOR_ERROR
  ;
    break;}
case 235:
#line 2220 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ArgList = yyvsp[0].ArgList;
    CHECK_FOR_ERROR
  ;
    break;}
case 236:
#line 2224 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ArgList = yyvsp[-2].ArgList;
    struct ArgListEntry E;
    E.Ty = new PATypeHolder(Type::VoidTy);
    E.Name = 0;
    E.Attrs = ParamAttr::None;
    yyval.ArgList->push_back(E);
    CHECK_FOR_ERROR
  ;
    break;}
case 237:
#line 2233 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ArgList = new ArgListType;
    struct ArgListEntry E;
    E.Ty = new PATypeHolder(Type::VoidTy);
    E.Name = 0;
    E.Attrs = ParamAttr::None;
    yyval.ArgList->push_back(E);
    CHECK_FOR_ERROR
  ;
    break;}
case 238:
#line 2242 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ArgList = 0;
    CHECK_FOR_ERROR
  ;
    break;}
case 239:
#line 2248 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
  std::string FunctionName(*yyvsp[-7].StrVal);
  delete yyvsp[-7].StrVal;  // Free strdup'd memory!
  
  // Check the function result for abstractness if this is a define. We should
  // have no abstract types at this point
  if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(yyvsp[-8].TypeVal))
    GEN_ERROR("Reference to abstract result: "+ yyvsp[-8].TypeVal->get()->getDescription());

  std::vector<const Type*> ParamTypeList;
  SmallVector<ParamAttrsWithIndex, 8> Attrs;
  if (yyvsp[-3].ParamAttrs != ParamAttr::None)
    Attrs.push_back(ParamAttrsWithIndex::get(0, yyvsp[-3].ParamAttrs));
  if (yyvsp[-5].ArgList) {   // If there are arguments...
    unsigned index = 1;
    for (ArgListType::iterator I = yyvsp[-5].ArgList->begin(); I != yyvsp[-5].ArgList->end(); ++I, ++index) {
      const Type* Ty = I->Ty->get();
      if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(I->Ty))
        GEN_ERROR("Reference to abstract argument: " + Ty->getDescription());
      ParamTypeList.push_back(Ty);
      if (Ty != Type::VoidTy && I->Attrs != ParamAttr::None)
        Attrs.push_back(ParamAttrsWithIndex::get(index, I->Attrs));
    }
  }

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

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

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

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

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

  CurFun.FunctionStart(Fn);

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

  // Add all of the arguments we parsed to the function...
  if (yyvsp[-5].ArgList) {                     // Is null if empty...
    if (isVarArg) {  // Nuke the last entry
      assert(yyvsp[-5].ArgList->back().Ty->get() == Type::VoidTy && yyvsp[-5].ArgList->back().Name == 0 &&
             "Not a varargs marker!");
      delete yyvsp[-5].ArgList->back().Ty;
      yyvsp[-5].ArgList->pop_back();  // Delete the last entry
    }
    Function::arg_iterator ArgIt = Fn->arg_begin();
    Function::arg_iterator ArgEnd = Fn->arg_end();
    unsigned Idx = 1;
    for (ArgListType::iterator I = yyvsp[-5].ArgList->begin(); 
         I != yyvsp[-5].ArgList->end() && ArgIt != ArgEnd; ++I, ++ArgIt) {
      delete I->Ty;                          // Delete the typeholder...
      setValueName(ArgIt, I->Name);       // Insert arg into symtab...
      CHECK_FOR_ERROR
      InsertValue(ArgIt);
      Idx++;
    }

    delete yyvsp[-5].ArgList;                     // We're now done with the argument list
  }
  CHECK_FOR_ERROR
;
    break;}
case 242:
#line 2375 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
  yyval.FunctionVal = CurFun.CurrentFunction;

  // Make sure that we keep track of the linkage type even if there was a
  // previous "declare".
  yyval.FunctionVal->setLinkage(yyvsp[-3].Linkage);
  yyval.FunctionVal->setVisibility(yyvsp[-2].Visibility);
;
    break;}
case 245:
#line 2386 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
  yyval.FunctionVal = yyvsp[-1].FunctionVal;
  CHECK_FOR_ERROR
;
    break;}
case 246:
#line 2391 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    CurFun.CurrentFunction->setLinkage(yyvsp[-2].Linkage);
    CurFun.CurrentFunction->setVisibility(yyvsp[-1].Visibility);
    yyval.FunctionVal = CurFun.CurrentFunction;
    CurFun.FunctionDone();
    CHECK_FOR_ERROR
  ;
    break;}
case 247:
#line 2403 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.BoolVal = false;
    CHECK_FOR_ERROR
  ;
    break;}
case 248:
#line 2407 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.BoolVal = true;
    CHECK_FOR_ERROR
  ;
    break;}
case 249:
#line 2412 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{    // A reference to a direct constant
    yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val);
    CHECK_FOR_ERROR
  ;
    break;}
case 250:
#line 2416 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val);
    CHECK_FOR_ERROR
  ;
    break;}
case 251:
#line 2420 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                     // Perhaps it's an FP constant?
    yyval.ValIDVal = ValID::create(yyvsp[0].FPVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 252:
#line 2424 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValIDVal = ValID::create(ConstantInt::getTrue());
    CHECK_FOR_ERROR
  ;
    break;}
case 253:
#line 2428 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValIDVal = ValID::create(ConstantInt::getFalse());
    CHECK_FOR_ERROR
  ;
    break;}
case 254:
#line 2432 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValIDVal = ValID::createNull();
    CHECK_FOR_ERROR
  ;
    break;}
case 255:
#line 2436 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValIDVal = ValID::createUndef();
    CHECK_FOR_ERROR
  ;
    break;}
case 256:
#line 2440 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{     // A vector zero constant.
    yyval.ValIDVal = ValID::createZeroInit();
    CHECK_FOR_ERROR
  ;
    break;}
case 257:
#line 2444 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ // Nonempty unsized packed vector
    const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType();
    int NumElements = yyvsp[-1].ConstVector->size(); 
    
    VectorType* pt = VectorType::get(ETy, NumElements);
    PATypeHolder* PTy = new PATypeHolder(
                                         HandleUpRefs(
                                            VectorType::get(
                                                ETy, 
                                                NumElements)
                                            )
                                         );
    
    // Verify all elements are correct type!
    for (unsigned i = 0; i < yyvsp[-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(ConstantVector::get(pt, *yyvsp[-1].ConstVector));
    delete PTy; delete yyvsp[-1].ConstVector;
    CHECK_FOR_ERROR
  ;
    break;}
case 258:
#line 2469 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 259:
#line 2473 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValIDVal = ValID::createInlineAsm(*yyvsp[-2].StrVal, *yyvsp[0].StrVal, yyvsp[-3].BoolVal);
    delete yyvsp[-2].StrVal;
    delete yyvsp[0].StrVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 260:
#line 2483 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{  // Is it an integer reference...?
    yyval.ValIDVal = ValID::createLocalID(yyvsp[0].UIntVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 261:
#line 2487 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValIDVal = ValID::createGlobalID(yyvsp[0].UIntVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 262:
#line 2491 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                   // Is it a named reference...?
    yyval.ValIDVal = ValID::createLocalName(*yyvsp[0].StrVal);
    delete yyvsp[0].StrVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 263:
#line 2496 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                   // Is it a named reference...?
    yyval.ValIDVal = ValID::createGlobalName(*yyvsp[0].StrVal);
    delete yyvsp[0].StrVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 266:
#line 2509 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); 
    delete yyvsp[-1].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 267:
#line 2518 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValueList = new std::vector<Value *>();
    yyval.ValueList->push_back(yyvsp[0].ValueVal); 
    CHECK_FOR_ERROR
  ;
    break;}
case 268:
#line 2523 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    (yyval.ValueList=yyvsp[-2].ValueList)->push_back(yyvsp[0].ValueVal); 
    CHECK_FOR_ERROR
  ;
    break;}
case 269:
#line 2528 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.FunctionVal = yyvsp[-1].FunctionVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 270:
#line 2532 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ // Do not allow functions with 0 basic blocks   
    yyval.FunctionVal = yyvsp[-1].FunctionVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 271:
#line 2541 "/Users/ggreif/llvm/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);
    yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 272:
#line 2550 "/Users/ggreif/llvm/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 273:
#line 2559 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{          // Empty space between instruction lists
    yyval.BasicBlockVal = defineBBVal(ValID::createLocalID(CurFun.NextValNum), 0);
    CHECK_FOR_ERROR
  ;
    break;}
case 274:
#line 2563 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{   // Only the unwind to block
    yyval.BasicBlockVal = defineBBVal(ValID::createLocalID(CurFun.NextValNum), getBBVal(yyvsp[0].ValIDVal));
    CHECK_FOR_ERROR
  ;
    break;}
case 275:
#line 2567 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{             // Labelled (named) basic block
    yyval.BasicBlockVal = defineBBVal(ValID::createLocalName(*yyvsp[0].StrVal), 0);
    delete yyvsp[0].StrVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 276:
#line 2572 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.BasicBlockVal = defineBBVal(ValID::createLocalName(*yyvsp[-3].StrVal), getBBVal(yyvsp[0].ValIDVal));
    delete yyvsp[-3].StrVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 277:
#line 2579 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ // Return with a result...
    ValueList &VL = *yyvsp[0].ValueList;
    assert(!VL.empty() && "Invalid ret operands!");
    yyval.TermInstVal = ReturnInst::Create(&VL[0], VL.size());
    delete yyvsp[0].ValueList;
    CHECK_FOR_ERROR
  ;
    break;}
case 278:
#line 2586 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                                    // Return with no result...
    yyval.TermInstVal = ReturnInst::Create();
    CHECK_FOR_ERROR
  ;
    break;}
case 279:
#line 2590 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{                           // Unconditional Branch...
    BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    yyval.TermInstVal = BranchInst::Create(tmpBB);
  ;
    break;}
case 280:
#line 2595 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{  
    assert(cast<IntegerType>(yyvsp[-7].PrimType)->getBitWidth() == 1 && "Not Bool?");
    BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal);
    CHECK_FOR_ERROR
    BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    Value* tmpVal = getVal(Type::Int1Ty, yyvsp[-6].ValIDVal);
    CHECK_FOR_ERROR
    yyval.TermInstVal = BranchInst::Create(tmpBBA, tmpBBB, tmpVal);
  ;
    break;}
case 281:
#line 2605 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    Value* tmpVal = getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal);
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal);
    CHECK_FOR_ERROR
    SwitchInst *S = SwitchInst::Create(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 282:
#line 2624 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    Value* tmpVal = getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal);
    CHECK_FOR_ERROR
    BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal);
    CHECK_FOR_ERROR
    SwitchInst *S = SwitchInst::Create(tmpVal, tmpBB, 0);
    yyval.TermInstVal = S;
    CHECK_FOR_ERROR
  ;
    break;}
case 283:
#line 2634 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{

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

    delete yyvsp[-11].TypeVal;

    Value *V = getVal(PFTy, yyvsp[-10].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

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

    // Check the arguments
    ValueList Args;
    if (yyvsp[-8].ParamList->empty()) {                                   // Has no arguments?
      // Make sure no arguments is a good thing!
      if (Ty->getNumParams() != 0)
        GEN_ERROR("No arguments passed to a function that "
                       "expects arguments");
    } else {                                     // Has arguments?
      // Loop through FunctionType's arguments and ensure they are specified
      // correctly!
      FunctionType::param_iterator I = Ty->param_begin();
      FunctionType::param_iterator E = Ty->param_end();
      ParamList::iterator ArgI = yyvsp[-8].ParamList->begin(), ArgE = yyvsp[-8].ParamList->end();
      unsigned index = 1;

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

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

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

    // Create the InvokeInst
    InvokeInst *II = InvokeInst::Create(V, Normal, Except, Args.begin(),Args.end());
    II->setCallingConv(yyvsp[-12].UIntVal);
    II->setParamAttrs(PAL);
    yyval.TermInstVal = II;
    delete yyvsp[-8].ParamList;
    CHECK_FOR_ERROR
  ;
    break;}
case 284:
#line 2714 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TermInstVal = new UnwindInst();
    CHECK_FOR_ERROR
  ;
    break;}
case 285:
#line 2718 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.TermInstVal = new UnreachableInst();
    CHECK_FOR_ERROR
  ;
    break;}
case 286:
#line 2725 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.JumpTable = yyvsp[-5].JumpTable;
    Constant *V = cast<Constant>(getExistingVal(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
    CHECK_FOR_ERROR
    if (V == 0)
      GEN_ERROR("May only switch on a constant pool value");

    BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    yyval.JumpTable->push_back(std::make_pair(V, tmpBB));
  ;
    break;}
case 287:
#line 2736 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.JumpTable = new std::vector<std::pair<Constant*, BasicBlock*> >();
    Constant *V = cast<Constant>(getExistingVal(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
    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 288:
#line 2749 "/Users/ggreif/llvm/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 289:
#line 2759 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{    // Used for PHI nodes
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-5].TypeVal)->getDescription());
    yyval.PHIList = new std::list<std::pair<Value*, BasicBlock*> >();
    Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal);
    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;
  ;
    break;}
case 290:
#line 2770 "/Users/ggreif/llvm/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 291:
#line 2780 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    // FIXME: Remove trailing OptParamAttrs in LLVM 3.0, it was a mistake in 2.0
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
    // Used for call and invoke instructions
    yyval.ParamList = new ParamList();
    ParamListEntry E; E.Attrs = yyvsp[-2].ParamAttrs | yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-3].TypeVal->get(), yyvsp[-1].ValIDVal);
    yyval.ParamList->push_back(E);
    delete yyvsp[-3].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 292:
#line 2791 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    // FIXME: Remove trailing OptParamAttrs in LLVM 3.0, it was a mistake in 2.0
    // Labels are only valid in ASMs
    yyval.ParamList = new ParamList();
    ParamListEntry E; E.Attrs = yyvsp[-2].ParamAttrs | yyvsp[0].ParamAttrs; E.Val = getBBVal(yyvsp[-1].ValIDVal);
    yyval.ParamList->push_back(E);
    CHECK_FOR_ERROR
  ;
    break;}
case 293:
#line 2799 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    // FIXME: Remove trailing OptParamAttrs in LLVM 3.0, it was a mistake in 2.0
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
    yyval.ParamList = yyvsp[-5].ParamList;
    ParamListEntry E; E.Attrs = yyvsp[-2].ParamAttrs | yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-3].TypeVal->get(), yyvsp[-1].ValIDVal);
    yyval.ParamList->push_back(E);
    delete yyvsp[-3].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 294:
#line 2809 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    // FIXME: Remove trailing OptParamAttrs in LLVM 3.0, it was a mistake in 2.0
    yyval.ParamList = yyvsp[-5].ParamList;
    ParamListEntry E; E.Attrs = yyvsp[-2].ParamAttrs | yyvsp[0].ParamAttrs; E.Val = getBBVal(yyvsp[-1].ValIDVal);
    yyval.ParamList->push_back(E);
    CHECK_FOR_ERROR
  ;
    break;}
case 295:
#line 2816 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ParamList = new ParamList(); ;
    break;}
case 296:
#line 2819 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{ yyval.ValueList = new std::vector<Value*>(); ;
    break;}
case 297:
#line 2820 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.ValueList = yyvsp[-2].ValueList;
    yyval.ValueList->push_back(yyvsp[0].ValueVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 298:
#line 2827 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.BoolVal = true;
    CHECK_FOR_ERROR
  ;
    break;}
case 299:
#line 2831 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.BoolVal = false;
    CHECK_FOR_ERROR
  ;
    break;}
case 300:
#line 2836 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
    if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && 
        !isa<VectorType>((*yyvsp[-3].TypeVal).get()))
      GEN_ERROR(
        "Arithmetic operator requires integer, FP, or packed operands");
    Value* val1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); 
    CHECK_FOR_ERROR
    Value* val2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, val1, val2);
    if (yyval.InstVal == 0)
      GEN_ERROR("binary operator returned null");
    delete yyvsp[-3].TypeVal;
  ;
    break;}
case 301:
#line 2852 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
    if (!(*yyvsp[-3].TypeVal)->isInteger()) {
      if (Instruction::isShift(yyvsp[-4].BinaryOpVal) || !isa<VectorType>(yyvsp[-3].TypeVal->get()) ||
          !cast<VectorType>(yyvsp[-3].TypeVal->get())->getElementType()->isInteger())
        GEN_ERROR("Logical operator requires integral operands");
    }
    Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2);
    if (yyval.InstVal == 0)
      GEN_ERROR("binary operator returned null");
    delete yyvsp[-3].TypeVal;
  ;
    break;}
case 302:
#line 2869 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
    if (isa<VectorType>((*yyvsp[-3].TypeVal).get()))
      GEN_ERROR("Vector types not supported by icmp instruction");
    Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].IPredicate, tmpVal1, tmpVal2);
    if (yyval.InstVal == 0)
      GEN_ERROR("icmp operator returned null");
    delete yyvsp[-3].TypeVal;
  ;
    break;}
case 303:
#line 2883 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
    if (isa<VectorType>((*yyvsp[-3].TypeVal).get()))
      GEN_ERROR("Vector types not supported by fcmp instruction");
    Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
    CHECK_FOR_ERROR
    Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].FPredicate, tmpVal1, tmpVal2);
    if (yyval.InstVal == 0)
      GEN_ERROR("fcmp operator returned null");
    delete yyvsp[-3].TypeVal;
  ;
    break;}
case 304:
#line 2897 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
    Value* Val = yyvsp[-2].ValueVal;
    const Type* DestTy = yyvsp[0].TypeVal->get();
    if (!CastInst::castIsValid(yyvsp[-3].CastOpVal, Val, DestTy))
      GEN_ERROR("invalid cast opcode for cast from '" +
                Val->getType()->getDescription() + "' to '" +
                DestTy->getDescription() + "'"); 
    yyval.InstVal = CastInst::create(yyvsp[-3].CastOpVal, Val, DestTy);
    delete yyvsp[0].TypeVal;
  ;
    break;}
case 305:
#line 2909 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (yyvsp[-4].ValueVal->getType() != Type::Int1Ty)
      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 = SelectInst::Create(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 306:
#line 2917 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
    yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal);
    delete yyvsp[0].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 307:
#line 2924 "/Users/ggreif/llvm/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 308:
#line 2930 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
      GEN_ERROR("Invalid insertelement operands");
    yyval.InstVal = InsertElementInst::Create(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
    CHECK_FOR_ERROR
  ;
    break;}
case 309:
#line 2936 "/Users/ggreif/llvm/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 310:
#line 2942 "/Users/ggreif/llvm/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 = PHINode::Create(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 311:
#line 2958 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{

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

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

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

    // Set up the ParamAttrs for the function
    SmallVector<ParamAttrsWithIndex, 8> Attrs;
    if (yyvsp[0].ParamAttrs != ParamAttr::None)
      Attrs.push_back(ParamAttrsWithIndex::get(0, yyvsp[0].ParamAttrs));
    // Check the arguments 
    ValueList Args;
    if (yyvsp[-2].ParamList->empty()) {                                   // Has no arguments?
      // Make sure no arguments is a good thing!
      if (Ty->getNumParams() != 0)
        GEN_ERROR("No arguments passed to a function that "
                       "expects arguments");
    } else {                                     // Has arguments?
      // Loop through FunctionType's arguments and ensure they are specified
      // correctly.  Also, gather any parameter attributes.
      FunctionType::param_iterator I = Ty->param_begin();
      FunctionType::param_iterator E = Ty->param_end();
      ParamList::iterator ArgI = yyvsp[-2].ParamList->begin(), ArgE = yyvsp[-2].ParamList->end();
      unsigned index = 1;

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

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

    // Create the call node
    CallInst *CI = CallInst::Create(V, Args.begin(), Args.end());
    CI->setTailCall(yyvsp[-7].BoolVal);
    CI->setCallingConv(yyvsp[-6].UIntVal);
    CI->setParamAttrs(PAL);
    yyval.InstVal = CI;
    delete yyvsp[-2].ParamList;
    delete yyvsp[-5].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 312:
#line 3043 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.InstVal = yyvsp[0].InstVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 313:
#line 3048 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.BoolVal = true;
    CHECK_FOR_ERROR
  ;
    break;}
case 314:
#line 3052 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    yyval.BoolVal = false;
    CHECK_FOR_ERROR
  ;
    break;}
case 315:
#line 3059 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal);
    delete yyvsp[-1].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 316:
#line 3066 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
    Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal);
    delete yyvsp[-4].TypeVal;
  ;
    break;}
case 317:
#line 3074 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
    yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal);
    delete yyvsp[-1].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 318:
#line 3081 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
    Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal);
    delete yyvsp[-4].TypeVal;
  ;
    break;}
case 319:
#line 3089 "/Users/ggreif/llvm/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 320:
#line 3097 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
    if (!isa<PointerType>(yyvsp[-2].TypeVal->get()))
      GEN_ERROR("Can't load from nonpointer type: " +
                     (*yyvsp[-2].TypeVal)->getDescription());
    if (!cast<PointerType>(yyvsp[-2].TypeVal->get())->getElementType()->isFirstClassType())
      GEN_ERROR("Can't load from pointer of non-first-class type: " +
                     (*yyvsp[-2].TypeVal)->getDescription());
    Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-4].BoolVal, yyvsp[0].UIntVal);
    delete yyvsp[-2].TypeVal;
  ;
    break;}
case 321:
#line 3111 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
    const PointerType *PT = dyn_cast<PointerType>(yyvsp[-2].TypeVal->get());
    if (!PT)
      GEN_ERROR("Can't store to a nonpointer type: " +
                     (*yyvsp[-2].TypeVal)->getDescription());
    const Type *ElTy = PT->getElementType();
    if (ElTy != yyvsp[-4].ValueVal->getType())
      GEN_ERROR("Can't store '" + yyvsp[-4].ValueVal->getType()->getDescription() +
                     "' into space of type '" + ElTy->getDescription() + "'");

    Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = new StoreInst(yyvsp[-4].ValueVal, tmpVal, yyvsp[-6].BoolVal, yyvsp[0].UIntVal);
    delete yyvsp[-2].TypeVal;
  ;
    break;}
case 322:
#line 3128 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
  Value *TmpVal = getVal(yyvsp[-3].TypeVal->get(), yyvsp[-2].ValIDVal);
  if (!GetResultInst::isValidOperands(TmpVal, yyvsp[0].UInt64Val))
      GEN_ERROR("Invalid getresult operands");
    yyval.InstVal = new GetResultInst(TmpVal, yyvsp[0].UInt64Val);
    delete yyvsp[-3].TypeVal;
    CHECK_FOR_ERROR
  ;
    break;}
case 323:
#line 3136 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"
{
    if (!UpRefs.empty())
      GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
    if (!isa<PointerType>(yyvsp[-2].TypeVal->get()))
      GEN_ERROR("getelementptr insn requires pointer operand");

    if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, yyvsp[0].ValueList->begin(), yyvsp[0].ValueList->end(), true))
      GEN_ERROR("Invalid getelementptr indices for type '" +
                     (*yyvsp[-2].TypeVal)->getDescription()+ "'");
    Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
    CHECK_FOR_ERROR
    yyval.InstVal = GetElementPtrInst::Create(tmpVal, yyvsp[0].ValueList->begin(), yyvsp[0].ValueList->end());
    delete yyvsp[-2].TypeVal; 
    delete yyvsp[0].ValueList;
  ;
    break;}
}
   /* the action file gets copied in in place of this dollarsign */
#line 543 "/usr/share/bison.simple"

  yyvsp -= yylen;
  yyssp -= yylen;
#ifdef YYLSP_NEEDED
  yylsp -= yylen;
#endif

#if YYDEBUG != 0
  if (yydebug)
    {
      short *ssp1 = yyss - 1;
      fprintf (stderr, "state stack now");
      while (ssp1 != yyssp)
	fprintf (stderr, " %d", *++ssp1);
      fprintf (stderr, "\n");
    }
#endif

  *++yyvsp = yyval;

#ifdef YYLSP_NEEDED
  yylsp++;
  if (yylen == 0)
    {
      yylsp->first_line = yylloc.first_line;
      yylsp->first_column = yylloc.first_column;
      yylsp->last_line = (yylsp-1)->last_line;
      yylsp->last_column = (yylsp-1)->last_column;
      yylsp->text = 0;
    }
  else
    {
      yylsp->last_line = (yylsp+yylen-1)->last_line;
      yylsp->last_column = (yylsp+yylen-1)->last_column;
    }
#endif

  /* 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 - YYNTBASE] + *yyssp;
  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
    yystate = yytable[yystate];
  else
    yystate = yydefgoto[yyn - YYNTBASE];

  goto yynewstate;

yyerrlab:   /* here on detecting error */

  if (! yyerrstatus)
    /* If not already recovering from an error, report this error.  */
    {
      ++yynerrs;

#ifdef YYERROR_VERBOSE
      yyn = yypact[yystate];

      if (yyn > YYFLAG && yyn < YYLAST)
	{
	  int size = 0;
	  char *msg;
	  int x, count;

	  count = 0;
	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
	  for (x = (yyn < 0 ? -yyn : 0);
	       x < (sizeof(yytname) / sizeof(char *)); x++)
	    if (yycheck[x + yyn] == x)
	      size += strlen(yytname[x]) + 15, count++;
	  msg = (char *) malloc(size + 15);
	  if (msg != 0)
	    {
	      strcpy(msg, "parse error");

	      if (count < 5)
		{
		  count = 0;
		  for (x = (yyn < 0 ? -yyn : 0);
		       x < (sizeof(yytname) / sizeof(char *)); x++)
		    if (yycheck[x + yyn] == x)
		      {
			strcat(msg, count == 0 ? ", expecting `" : " or `");
			strcat(msg, yytname[x]);
			strcat(msg, "'");
			count++;
		      }
		}
	      yyerror(msg);
	      free(msg);
	    }
	  else
	    yyerror ("parse error; also virtual memory exceeded");
	}
      else
#endif /* YYERROR_VERBOSE */
	yyerror("parse error");
    }

  goto yyerrlab1;
yyerrlab1:   /* here on error raised explicitly by an action */

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

      /* return failure if at end of input */
      if (yychar == YYEOF)
	YYABORT;

#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
#endif

      yychar = YYEMPTY;
    }

  /* Else will try to reuse lookahead token
     after shifting the error token.  */

  yyerrstatus = 3;		/* Each real token shifted decrements this */

  goto yyerrhandle;

yyerrdefault:  /* current state does not do anything special for the error token. */

#if 0
  /* This is wrong; only states that explicitly want error tokens
     should shift them.  */
  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
  if (yyn) goto yydefault;
#endif

yyerrpop:   /* pop the current state because it cannot handle the error token */

  if (yyssp == yyss) YYABORT;
  yyvsp--;
  yystate = *--yyssp;
#ifdef YYLSP_NEEDED
  yylsp--;
#endif

#if YYDEBUG != 0
  if (yydebug)
    {
      short *ssp1 = yyss - 1;
      fprintf (stderr, "Error: state stack now");
      while (ssp1 != yyssp)
	fprintf (stderr, " %d", *++ssp1);
      fprintf (stderr, "\n");
    }
#endif

yyerrhandle:

  yyn = yypact[yystate];
  if (yyn == YYFLAG)
    goto yyerrdefault;

  yyn += YYTERROR;
  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
    goto yyerrdefault;

  yyn = yytable[yyn];
  if (yyn < 0)
    {
      if (yyn == YYFLAG)
	goto yyerrpop;
      yyn = -yyn;
      goto yyreduce;
    }
  else if (yyn == 0)
    goto yyerrpop;

  if (yyn == YYFINAL)
    YYACCEPT;

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Shifting error token, ");
#endif

  *++yyvsp = yylval;
#ifdef YYLSP_NEEDED
  *++yylsp = yylloc;
#endif

  yystate = yyn;
  goto yynewstate;

 yyacceptlab:
  /* YYACCEPT comes here.  */
  if (yyfree_stacks)
    {
      free (yyss);
      free (yyvs);
#ifdef YYLSP_NEEDED
      free (yyls);
#endif
    }
  return 0;

 yyabortlab:
  /* YYABORT comes here.  */
  if (yyfree_stacks)
    {
      free (yyss);
      free (yyvs);
#ifdef YYLSP_NEEDED
      free (yyls);
#endif
    }
  return 1;
}
#line 3153 "/Users/ggreif/llvm/lib/AsmParser/llvmAsmParser.y"


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

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

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

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

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

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

  return Result;
}

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

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