
/*  A Bison parser, made from /Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y
    by GNU Bison version 1.28  */

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

#define yyparse Upgradeparse
#define yylex Upgradelex
#define yyerror Upgradeerror
#define yylval Upgradelval
#define yychar Upgradechar
#define yydebug Upgradedebug
#define yynerrs Upgradenerrs
#define	ESINT64VAL	257
#define	EUINT64VAL	258
#define	SINTVAL	259
#define	UINTVAL	260
#define	FPVAL	261
#define	VOID	262
#define	BOOL	263
#define	SBYTE	264
#define	UBYTE	265
#define	SHORT	266
#define	USHORT	267
#define	INT	268
#define	UINT	269
#define	LONG	270
#define	ULONG	271
#define	FLOAT	272
#define	DOUBLE	273
#define	TYPE	274
#define	LABEL	275
#define	VAR_ID	276
#define	LABELSTR	277
#define	STRINGCONSTANT	278
#define	IMPLEMENTATION	279
#define	ZEROINITIALIZER	280
#define	TRUETOK	281
#define	FALSETOK	282
#define	BEGINTOK	283
#define	ENDTOK	284
#define	DECLARE	285
#define	GLOBAL	286
#define	CONSTANT	287
#define	SECTION	288
#define	VOLATILE	289
#define	TO	290
#define	DOTDOTDOT	291
#define	NULL_TOK	292
#define	UNDEF	293
#define	CONST	294
#define	INTERNAL	295
#define	LINKONCE	296
#define	WEAK	297
#define	APPENDING	298
#define	DLLIMPORT	299
#define	DLLEXPORT	300
#define	EXTERN_WEAK	301
#define	OPAQUE	302
#define	NOT	303
#define	EXTERNAL	304
#define	TARGET	305
#define	TRIPLE	306
#define	ENDIAN	307
#define	POINTERSIZE	308
#define	LITTLE	309
#define	BIG	310
#define	ALIGN	311
#define	DEPLIBS	312
#define	CALL	313
#define	TAIL	314
#define	ASM_TOK	315
#define	MODULE	316
#define	SIDEEFFECT	317
#define	CC_TOK	318
#define	CCC_TOK	319
#define	CSRETCC_TOK	320
#define	FASTCC_TOK	321
#define	COLDCC_TOK	322
#define	X86_STDCALLCC_TOK	323
#define	X86_FASTCALLCC_TOK	324
#define	DATALAYOUT	325
#define	RET	326
#define	BR	327
#define	SWITCH	328
#define	INVOKE	329
#define	UNREACHABLE	330
#define	UNWIND	331
#define	EXCEPT	332
#define	ADD	333
#define	SUB	334
#define	MUL	335
#define	DIV	336
#define	UDIV	337
#define	SDIV	338
#define	FDIV	339
#define	REM	340
#define	UREM	341
#define	SREM	342
#define	FREM	343
#define	AND	344
#define	OR	345
#define	XOR	346
#define	SHL	347
#define	SHR	348
#define	ASHR	349
#define	LSHR	350
#define	SETLE	351
#define	SETGE	352
#define	SETLT	353
#define	SETGT	354
#define	SETEQ	355
#define	SETNE	356
#define	ICMP	357
#define	FCMP	358
#define	MALLOC	359
#define	ALLOCA	360
#define	FREE	361
#define	LOAD	362
#define	STORE	363
#define	GETELEMENTPTR	364
#define	PHI_TOK	365
#define	SELECT	366
#define	VAARG	367
#define	EXTRACTELEMENT	368
#define	INSERTELEMENT	369
#define	SHUFFLEVECTOR	370
#define	VAARG_old	371
#define	VANEXT_old	372
#define	EQ	373
#define	NE	374
#define	SLT	375
#define	SGT	376
#define	SLE	377
#define	SGE	378
#define	ULT	379
#define	UGT	380
#define	ULE	381
#define	UGE	382
#define	OEQ	383
#define	ONE	384
#define	OLT	385
#define	OGT	386
#define	OLE	387
#define	OGE	388
#define	ORD	389
#define	UNO	390
#define	UEQ	391
#define	UNE	392
#define	CAST	393
#define	TRUNC	394
#define	ZEXT	395
#define	SEXT	396
#define	FPTRUNC	397
#define	FPEXT	398
#define	FPTOUI	399
#define	FPTOSI	400
#define	UITOFP	401
#define	SITOFP	402
#define	PTRTOINT	403
#define	INTTOPTR	404
#define	BITCAST	405

#line 14 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"

#include "UpgradeInternals.h"
#include "llvm/CallingConv.h"
#include "llvm/InlineAsm.h"
#include "llvm/Instructions.h"
#include "llvm/Module.h"
#include "llvm/ParameterAttributes.h"
#include "llvm/ValueSymbolTable.h"
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/MathExtras.h"
#include <algorithm>
#include <iostream>
#include <map>
#include <list>
#include <utility>

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

#define YYERROR_VERBOSE 1
#define YYINCLUDED_STDLIB_H
#define YYDEBUG 1

int yylex();
int yyparse();

int yyerror(const char*);
static void warning(const std::string& WarningMsg);

namespace llvm {

std::istream* LexInput;
static std::string CurFilename;

// This bool controls whether attributes are ever added to function declarations
// definitions and calls.
static bool AddAttributes = false;

static Module *ParserResult;
static bool ObsoleteVarArgs;
static bool NewVarArgs;
static BasicBlock *CurBB;
static GlobalVariable *CurGV;
static unsigned lastCallingConv;

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

typedef std::pair<std::string,TypeInfo> RenameMapKey;
typedef std::map<RenameMapKey,std::string> RenameMapType;

static void 
ResolveDefinitions(std::map<const Type *,ValueList> &LateResolvers,
                   std::map<const Type *,ValueList> *FutureLateResolvers = 0);

static struct PerModuleInfo {
  Module *CurrentModule;
  std::map<const Type *, ValueList> Values; // Module level numbered definitions
  std::map<const Type *,ValueList> LateResolveValues;
  std::vector<PATypeHolder> Types;
  std::vector<Signedness> TypeSigns;
  std::map<std::string,Signedness> NamedTypeSigns;
  std::map<std::string,Signedness> NamedValueSigns;
  std::map<ValID, PATypeHolder> LateResolveTypes;
  static Module::Endianness Endian;
  static Module::PointerSize PointerSize;
  RenameMapType RenameMap;

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

    // 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";
      }
      error(UndefinedReferences);
      return;
    }

    if (CurrentModule->getDataLayout().empty()) {
      std::string dataLayout;
      if (Endian != Module::AnyEndianness)
        dataLayout.append(Endian == Module::BigEndian ? "E" : "e");
      if (PointerSize != Module::AnyPointerSize) {
        if (!dataLayout.empty())
          dataLayout += "-";
        dataLayout.append(PointerSize == Module::Pointer64 ? 
                          "p:64:64" : "p:32:32");
      }
      CurrentModule->setDataLayout(dataLayout);
    }

    Values.clear();         // Clear out function local definitions
    Types.clear();
    TypeSigns.clear();
    NamedTypeSigns.clear();
    NamedValueSigns.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;
  }
  void setEndianness(Module::Endianness E) { Endian = E; }
  void setPointerSize(Module::PointerSize sz) { PointerSize = sz; }
} CurModule;

Module::Endianness  PerModuleInfo::Endian = Module::AnyEndianness;
Module::PointerSize PerModuleInfo::PointerSize = Module::AnyPointerSize;

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

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

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

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

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

  void FunctionDone() {
    NumberedBlocks.clear();

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

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

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

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

/// This function is just a utility to make a Key value for the rename map.
/// The Key is a combination of the name, type, Signedness of the original 
/// value (global/function). This just constructs the key and ensures that
/// named Signedness values are resolved to the actual Signedness.
/// @brief Make a key for the RenameMaps
static RenameMapKey makeRenameMapKey(const std::string &Name, const Type* Ty, 
                                     const Signedness &Sign) {
  TypeInfo TI; 
  TI.T = Ty; 
  if (Sign.isNamed())
    // Don't allow Named Signedness nodes because they won't match. The actual
    // Signedness must be looked up in the NamedTypeSigns map.
    TI.S.copy(CurModule.NamedTypeSigns[Sign.getName()]);
  else
    TI.S.copy(Sign);
  return std::make_pair(Name, TI);
}


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

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

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

static const Type *getType(const ValID &D, bool DoNotImprovise = false) {
  switch (D.Type) {
  case ValID::NumberVal:               // Is it a numbered definition?
    // Module constants occupy the lowest numbered slots...
    if ((unsigned)D.Num < CurModule.Types.size()) {
      return CurModule.Types[(unsigned)D.Num];
    }
    break;
  case ValID::NameVal:                 // Is it a named definition?
    if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
      return N;
    }
    break;
  default:
    error("Internal parser error: Invalid symbol type reference");
    return 0;
  }

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

  if (inFunctionScope()) {
    if (D.Type == ValID::NameVal) {
      error("Reference to an undefined type: '" + D.getName() + "'");
      return 0;
    } else {
      error("Reference to an undefined type: #" + itostr(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;
}

/// This is like the getType method except that instead of looking up the type
/// for a given ID, it looks up that type's sign.
/// @brief Get the signedness of a referenced type
static Signedness getTypeSign(const ValID &D) {
  switch (D.Type) {
  case ValID::NumberVal:               // Is it a numbered definition?
    // Module constants occupy the lowest numbered slots...
    if ((unsigned)D.Num < CurModule.TypeSigns.size()) {
      return CurModule.TypeSigns[(unsigned)D.Num];
    }
    break;
  case ValID::NameVal: {               // Is it a named definition?
    std::map<std::string,Signedness>::const_iterator I = 
      CurModule.NamedTypeSigns.find(D.Name);
    if (I != CurModule.NamedTypeSigns.end())
      return I->second;
    // Perhaps its a named forward .. just cache the name
    Signedness S;
    S.makeNamed(D.Name);
    return S;
  }
  default: 
    break;
  }
  // If we don't find it, its signless
  Signedness S;
  S.makeSignless();
  return S;
}

/// This function is analagous to getElementType in LLVM. It provides the same
/// function except that it looks up the Signedness instead of the type. This is
/// used when processing GEP instructions that need to extract the type of an
/// indexed struct/array/ptr member. 
/// @brief Look up an element's sign.
static Signedness getElementSign(const ValueInfo& VI, 
                                 const std::vector<Value*> &Indices) {
  const Type *Ptr = VI.V->getType();
  assert(isa<PointerType>(Ptr) && "Need pointer type");

  unsigned CurIdx = 0;
  Signedness S(VI.S);
  while (const CompositeType *CT = dyn_cast<CompositeType>(Ptr)) {
    if (CurIdx == Indices.size())
      break;

    Value *Index = Indices[CurIdx++];
    assert(!isa<PointerType>(CT) || CurIdx == 1 && "Invalid type");
    Ptr = CT->getTypeAtIndex(Index);
    if (const Type* Ty = Ptr->getForwardedType())
      Ptr = Ty;
    assert(S.isComposite() && "Bad Signedness type");
    if (isa<StructType>(CT)) {
      S = S.get(cast<ConstantInt>(Index)->getZExtValue());
    } else {
      S = S.get(0UL);
    }
    if (S.isNamed())
      S = CurModule.NamedTypeSigns[S.getName()];
  }
  Signedness Result;
  Result.makeComposite(S);
  return Result;
}

/// This function just translates a ConstantInfo into a ValueInfo and calls
/// getElementSign(ValueInfo,...). Its just a convenience.
/// @brief ConstantInfo version of getElementSign.
static Signedness getElementSign(const ConstInfo& CI, 
                                 const std::vector<Constant*> &Indices) {
  ValueInfo VI;
  VI.V = CI.C;
  VI.S.copy(CI.S);
  std::vector<Value*> Idx;
  for (unsigned i = 0; i < Indices.size(); ++i)
    Idx.push_back(Indices[i]);
  Signedness result = getElementSign(VI, Idx);
  VI.destroy();
  return result;
}

/// This function determines if two function types differ only in their use of
/// the sret parameter attribute in the first argument. If they are identical 
/// in all other respects, it returns true. Otherwise, it returns false.
static bool FuncTysDifferOnlyBySRet(const FunctionType *F1, 
                                    const FunctionType *F2) {
  if (F1->getReturnType() != F2->getReturnType() ||
      F1->getNumParams() != F2->getNumParams())
    return false;
  const ParamAttrsList *PAL1 = F1->getParamAttrs();
  const ParamAttrsList *PAL2 = F2->getParamAttrs();
  if (PAL1 && !PAL2 || PAL2 && !PAL1)
    return false;
  if (PAL1 && PAL2 && ((PAL1->size() != PAL2->size()) ||
      (PAL1->getParamAttrs(0) != PAL2->getParamAttrs(0)))) 
    return false;
  unsigned SRetMask = ~unsigned(ParamAttr::StructRet);
  for (unsigned i = 0; i < F1->getNumParams(); ++i) {
    if (F1->getParamType(i) != F2->getParamType(i) || (PAL1 && PAL2 &&
        (unsigned(PAL1->getParamAttrs(i+1)) & SRetMask !=
         unsigned(PAL2->getParamAttrs(i+1)) & SRetMask)))
      return false;
  }
  return true;
}

/// This function determines if the type of V and Ty differ only by the SRet
/// parameter attribute. This is a more generalized case of
/// FuncTysDIfferOnlyBySRet since it doesn't require FunctionType arguments.
static bool TypesDifferOnlyBySRet(Value *V, const Type* Ty) {
  if (V->getType() == Ty)
    return true;
  const PointerType *PF1 = dyn_cast<PointerType>(Ty);
  const PointerType *PF2 = dyn_cast<PointerType>(V->getType());
  if (PF1 && PF2) {
    const FunctionType* FT1 = dyn_cast<FunctionType>(PF1->getElementType());
    const FunctionType* FT2 = dyn_cast<FunctionType>(PF2->getElementType());
    if (FT1 && FT2)
      return FuncTysDifferOnlyBySRet(FT1, FT2);
  }
  return false;
}

// The upgrade of csretcc to sret param attribute may have caused a function 
// to not be found because the param attribute changed the type of the called 
// function. This helper function, used in getExistingValue, detects that
// situation and bitcasts the function to the correct type.
static Value* handleSRetFuncTypeMerge(Value *V, const Type* Ty) {
  // Handle degenerate cases
  if (!V)
    return 0;
  if (V->getType() == Ty)
    return V;

  const PointerType *PF1 = dyn_cast<PointerType>(Ty);
  const PointerType *PF2 = dyn_cast<PointerType>(V->getType());
  if (PF1 && PF2) {
    const FunctionType *FT1 = dyn_cast<FunctionType>(PF1->getElementType());
    const FunctionType *FT2 = dyn_cast<FunctionType>(PF2->getElementType());
    if (FT1 && FT2 && FuncTysDifferOnlyBySRet(FT1, FT2)) {
      const ParamAttrsList *PAL2 = FT2->getParamAttrs();
      if (PAL2 && PAL2->paramHasAttr(1, ParamAttr::StructRet))
        return V;
      else if (Constant *C = dyn_cast<Constant>(V))
        return ConstantExpr::getBitCast(C, PF1);
      else
        return new BitCastInst(V, PF1, "upgrd.cast", CurBB);
    }
      
  }
  return 0;
}

// getExistingValue - 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 *getExistingValue(const Type *Ty, const ValID &D) {
  if (isa<FunctionType>(Ty)) {
    error("Functions are not values and must be referenced as pointers");
  }

  switch (D.Type) {
  case ValID::NumberVal: {                 // Is it a numbered definition?
    unsigned Num = (unsigned)D.Num;

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

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

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

    return VI->second[Num];
  }

  case ValID::NameVal: {                // Is it a named definition?
    // Get the name out of the ID
    RenameMapKey Key = makeRenameMapKey(D.Name, Ty, D.S);
    Value *V = 0;
    if (inFunctionScope()) {
      // See if the name was renamed
      RenameMapType::const_iterator I = CurFun.RenameMap.find(Key);
      std::string LookupName;
      if (I != CurFun.RenameMap.end())
        LookupName = I->second;
      else
        LookupName = D.Name;
      ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
      V = SymTab.lookup(LookupName);
      if (V && V->getType() != Ty)
        V = handleSRetFuncTypeMerge(V, Ty);
      assert((!V || TypesDifferOnlyBySRet(V, Ty)) && "Found wrong type");
    }
    if (!V) {
      RenameMapType::const_iterator I = CurModule.RenameMap.find(Key);
      std::string LookupName;
      if (I != CurModule.RenameMap.end())
        LookupName = I->second;
      else
        LookupName = D.Name;
      V = CurModule.CurrentModule->getValueSymbolTable().lookup(LookupName);
      if (V && V->getType() != Ty)
        V = handleSRetFuncTypeMerge(V, Ty);
      assert((!V || TypesDifferOnlyBySRet(V, Ty)) && "Found wrong type");
    }
    if (!V) 
      return 0;

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

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

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

  case ValID::ConstFPVal:        // Is it a floating point const pool reference?
    if (!ConstantFP::isValueValidForType(Ty, *D.ConstPoolFP))
      error("FP constant invalid for type");
    // Lexer has no type info, so builds all FP constants as double.
    // Fix this here.
    if (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))
      error("Cannot create a a non pointer null");
    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) 
      error("Constant expression type different from required type");
    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))
      error("Invalid type for asm constraint string");
    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 getExistingValue, 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)
    error("Cannot use a basic block here");

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

  if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty))
    error("Invalid use of a composite type");

  // If we reached here, we referenced either a symbol that we don't know about
  // or an id number that hasn't been read yet.  We may be referencing something
  // forward, so just create an entry to be resolved later and get to it...
  V = new Argument(Ty);

  // Remember where this forward reference came from.  FIXME, shouldn't we try
  // to recycle these things??
  CurModule.PlaceHolderInfo.insert(
    std::make_pair(V, std::make_pair(ID, Upgradelineno)));

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

/// @brief This just makes any name given to it unique, up to MAX_UINT times.
static std::string makeNameUnique(const std::string& Name) {
  static unsigned UniqueNameCounter = 1;
  std::string Result(Name);
  Result += ".upgrd." + llvm::utostr(UniqueNameCounter++);
  return Result;
}

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

  std::string Name;
  BasicBlock *BB = 0;
  switch (ID.Type) {
  default: 
    error("Illegal label reference " + ID.getName());
    break;
  case ValID::NumberVal:                // Is it a numbered definition?
    if (unsigned(ID.Num) >= CurFun.NumberedBlocks.size())
      CurFun.NumberedBlocks.resize(ID.Num+1);
    BB = CurFun.NumberedBlocks[ID.Num];
    break;
  case ValID::NameVal:                  // Is it a named definition?
    Name = ID.Name;
    if (Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name)) {
      if (N->getType() != Type::LabelTy) {
        // Register names didn't use to conflict with basic block names
        // because of type planes. Now they all have to be unique. So, we just
        // rename the register and treat this name as if no basic block
        // had been found.
        RenameMapKey Key = makeRenameMapKey(ID.Name, N->getType(), ID.S);
        N->setName(makeNameUnique(N->getName()));
        CurModule.RenameMap[Key] = N->getName();
        BB = 0;
      } else {
        BB = cast<BasicBlock>(N);
      }
    }
    break;
  }

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

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

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

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


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

// ResolveDefinitions - If we could not resolve some defs at parsing
// time (forward branches, phi functions for loops, etc...) resolve the
// defs now...
//
static void 
ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
                   std::map<const Type*,ValueList> *FutureLateResolvers) {

  // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
  for (std::map<const Type*,ValueList>::iterator LRI = LateResolvers.begin(),
         E = LateResolvers.end(); LRI != E; ++LRI) {
    const Type* Ty = LRI->first;
    ValueList &List = LRI->second;
    while (!List.empty()) {
      Value *V = List.back();
      List.pop_back();

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

      ValID &DID = PHI->second.first;

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

  LateResolvers.clear();
}

/// This function is used for type resolution and upref handling. When a type
/// becomes concrete, this function is called to adjust the signedness for the
/// concrete type.
static void ResolveTypeSign(const Type* oldTy, const Signedness &Sign) {
  std::string TyName = CurModule.CurrentModule->getTypeName(oldTy);
  if (!TyName.empty())
    CurModule.NamedTypeSigns[TyName] = Sign;
}

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

  if (Name)
    CurModule.NamedTypeSigns[Name] = Sign;

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

/// This is the implementation portion of TypeHasInteger. It traverses the
/// type given, avoiding recursive types, and returns true as soon as it finds
/// an integer type. If no integer type is found, it returns false.
static bool TypeHasIntegerI(const Type *Ty, std::vector<const Type*> Stack) {
  // Handle some easy cases
  if (Ty->isPrimitiveType() || (Ty->getTypeID() == Type::OpaqueTyID))
    return false;
  if (Ty->isInteger())
    return true;
  if (const SequentialType *STy = dyn_cast<SequentialType>(Ty))
    return STy->getElementType()->isInteger();

  // Avoid type structure recursion
  for (std::vector<const Type*>::iterator I = Stack.begin(), E = Stack.end();
       I != E; ++I)
    if (Ty == *I)
      return false;

  // Push us on the type stack
  Stack.push_back(Ty);

  if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
    if (TypeHasIntegerI(FTy->getReturnType(), Stack)) 
      return true;
    FunctionType::param_iterator I = FTy->param_begin();
    FunctionType::param_iterator E = FTy->param_end();
    for (; I != E; ++I)
      if (TypeHasIntegerI(*I, Stack))
        return true;
    return false;
  } else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
    StructType::element_iterator I = STy->element_begin();
    StructType::element_iterator E = STy->element_end();
    for (; I != E; ++I) {
      if (TypeHasIntegerI(*I, Stack))
        return true;
    }
    return false;
  }
  // There shouldn't be anything else, but its definitely not integer
  assert(0 && "What type is this?");
  return false;
}

/// This is the interface to TypeHasIntegerI. It just provides the type stack,
/// to avoid recursion, and then calls TypeHasIntegerI.
static inline bool TypeHasInteger(const Type *Ty) {
  std::vector<const Type*> TyStack;
  return TypeHasIntegerI(Ty, TyStack);
}

// 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(const ValueInfo &V, char *NameStr) {
  if (NameStr) {
    std::string Name(NameStr);      // Copy string
    free(NameStr);                  // Free old string

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

    assert(inFunctionScope() && "Must be in function scope");

    // Search the function's symbol table for an existing value of this name
    ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
    Value* Existing = ST.lookup(Name);
    if (Existing) {
      // An existing value of the same name was found. This might have happened
      // because of the integer type planes collapsing in LLVM 2.0. 
      if (Existing->getType() == V.V->getType() &&
          !TypeHasInteger(Existing->getType())) {
        // If the type does not contain any integers in them then this can't be
        // a type plane collapsing issue. It truly is a redefinition and we 
        // should error out as the assembly is invalid.
        error("Redefinition of value named '" + Name + "' of type '" +
              V.V->getType()->getDescription() + "'");
        return;
      } 
      // In LLVM 2.0 we don't allow names to be re-used for any values in a 
      // function, regardless of Type. Previously re-use of names was okay as 
      // long as they were distinct types. With type planes collapsing because
      // of the signedness change and because of PR411, this can no longer be
      // supported. We must search the entire symbol table for a conflicting
      // name and make the name unique. No warning is needed as this can't 
      // cause a problem.
      std::string NewName = makeNameUnique(Name);
      // We're changing the name but it will probably be used by other 
      // instructions as operands later on. Consequently we have to retain
      // a mapping of the renaming that we're doing.
      RenameMapKey Key = makeRenameMapKey(Name, V.V->getType(), V.S);
      CurFun.RenameMap[Key] = NewName;
      Name = NewName;
    }

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

/// ParseGlobalVariable - Handle parsing of a global.  If Initializer is null,
/// this is a declaration, otherwise it is a definition.
static GlobalVariable *
ParseGlobalVariable(char *NameStr,GlobalValue::LinkageTypes Linkage,
                    bool isConstantGlobal, const Type *Ty,
                    Constant *Initializer,
                    const Signedness &Sign) {
  if (isa<FunctionType>(Ty))
    error("Cannot declare global vars of function type");

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

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

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

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

  // If this global has a name, check to see if there is already a definition
  // of this global in the module and emit warnings if there are conflicts.
  if (!Name.empty()) {
    // The global has a name. See if there's an existing one of the same name.
    if (CurModule.CurrentModule->getNamedGlobal(Name) ||
        CurModule.CurrentModule->getFunction(Name)) {
      // We found an existing global of the same name. This isn't allowed 
      // in LLVM 2.0. Consequently, we must alter the name of the global so it
      // can at least compile. This can happen because of type planes 
      // There is alread a global of the same name which means there is a
      // conflict. Let's see what we can do about it.
      std::string NewName(makeNameUnique(Name));
      if (Linkage != GlobalValue::InternalLinkage) {
        // The linkage of this gval is external so we can't reliably rename 
        // it because it could potentially create a linking problem.  
        // However, we can't leave the name conflict in the output either or 
        // it won't assemble with LLVM 2.0.  So, all we can do is rename 
        // this one to something unique and emit a warning about the problem.
        warning("Renaming global variable '" + Name + "' to '" + NewName + 
                  "' may cause linkage errors");
      }

      // Put the renaming in the global rename map
      RenameMapKey Key = makeRenameMapKey(Name, PointerType::get(Ty), ID.S);
      CurModule.RenameMap[Key] = NewName;

      // Rename it
      Name = NewName;
    }
  }

  // Otherwise there is no existing GV to use, create one now.
  GlobalVariable *GV =
    new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
                       CurModule.CurrentModule);
  InsertValue(GV, CurModule.Values);
  // Remember the sign of this global.
  CurModule.NamedValueSigns[Name] = ID.S;
  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 PATypeInfo& TI, char *NameStr) {
  assert(!inFunctionScope() && "Can't give types function-local names");
  if (NameStr == 0) return false;
 
  std::string Name(NameStr);      // Copy string
  free(NameStr);                  // Free old string

  const Type* Ty = TI.PAT->get();

  // We don't allow assigning names to void type
  if (Ty == Type::VoidTy) {
    error("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, Ty);

  // Save the sign information for later use 
  CurModule.NamedTypeSigns[Name] = TI.S;

  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(Ty);
      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 == Ty) return true;  // Yes, it's equal.

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

  return false;
}

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

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

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

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

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

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

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

/// HandleUpRefs - Every time we finish a new layer of types, this function is
/// called.  It loops through the UpRefs vector, which is a list of the
/// currently active types.  For each type, if the up reference is contained in
/// the newly completed type, we decrement the level count.  When the level
/// count reaches zero, the upreferenced type is the type that is passed in:
/// thus we can complete the cycle.
///
static PATypeHolder HandleUpRefs(const Type *ty, const Signedness& Sign) {
  // 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;

  unsigned i = 0;
  for (; i != UpRefs.size(); ++i) {
    UR_OUT("  UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
           << UpRefs[i].UpRefTy->getDescription() << ") = "
           << (TypeContains(Ty, UpRefs[i].UpRefTy) ? "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].UpRefTy->getDescription() << "\n";
          std::string OldName = UpRefs[i].UpRefTy->getDescription());
          ResolveTypeSign(UpRefs[i].UpRefTy, Sign);
          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].UpRefTy->getDescription() << "\n";
           std::string OldName = TypeToResolve->getDescription());
    ResolveTypeSign(TypeToResolve, Sign);
    TypeToResolve->refineAbstractTypeTo(Ty);
  }

  return Ty;
}

bool Signedness::operator<(const Signedness &that) const {
  if (isNamed()) {
    if (that.isNamed()) 
      return *(this->name) < *(that.name);
    else
      return CurModule.NamedTypeSigns[*name] < that;
  } else if (that.isNamed()) {
    return *this < CurModule.NamedTypeSigns[*that.name];
  }

  if (isComposite() && that.isComposite()) {
    if (sv->size() == that.sv->size()) {
      SignVector::const_iterator thisI = sv->begin(), thisE = sv->end();
      SignVector::const_iterator thatI = that.sv->begin(), 
                                 thatE = that.sv->end();
      for (; thisI != thisE; ++thisI, ++thatI) {
        if (*thisI < *thatI)
          return true;
        else if (!(*thisI == *thatI))
          return false;
      }
      return false;
    }
    return sv->size() < that.sv->size();
  }  
  return kind < that.kind;
}

bool Signedness::operator==(const Signedness &that) const {
  if (isNamed())
    if (that.isNamed())
      return *(this->name) == *(that.name);
    else 
      return CurModule.NamedTypeSigns[*(this->name)] == that;
  else if (that.isNamed())
    return *this == CurModule.NamedTypeSigns[*(that.name)];
  if (isComposite() && that.isComposite()) {
    if (sv->size() == that.sv->size()) {
      SignVector::const_iterator thisI = sv->begin(), thisE = sv->end();
      SignVector::const_iterator thatI = that.sv->begin(), 
                                 thatE = that.sv->end();
      for (; thisI != thisE; ++thisI, ++thatI) {
        if (!(*thisI == *thatI))
          return false;
      }
      return true;
    }
    return false;
  }
  return kind == that.kind;
}

void Signedness::copy(const Signedness &that) {
  if (that.isNamed()) {
    kind = Named;
    name = new std::string(*that.name);
  } else if (that.isComposite()) {
    kind = Composite;
    sv = new SignVector();
    *sv = *that.sv;
  } else {
    kind = that.kind;
    sv = 0;
  }
}

void Signedness::destroy() {
  if (isNamed()) {
    delete name;
  } else if (isComposite()) {
    delete sv;
  } 
}

#ifndef NDEBUG
void Signedness::dump() const {
  if (isComposite()) {
    if (sv->size() == 1) {
      (*sv)[0].dump();
      std::cerr << "*";
    } else {
      std::cerr << "{ " ;
      for (unsigned i = 0; i < sv->size(); ++i) {
        if (i != 0)
          std::cerr << ", ";
        (*sv)[i].dump();
      }
      std::cerr << "} " ;
    }
  } else if (isNamed()) {
    std::cerr << *name;
  } else if (isSigned()) {
    std::cerr << "S";
  } else if (isUnsigned()) {
    std::cerr << "U";
  } else
    std::cerr << ".";
}
#endif

static inline Instruction::TermOps 
getTermOp(TermOps op) {
  switch (op) {
    default           : assert(0 && "Invalid OldTermOp");
    case RetOp        : return Instruction::Ret;
    case BrOp         : return Instruction::Br;
    case SwitchOp     : return Instruction::Switch;
    case InvokeOp     : return Instruction::Invoke;
    case UnwindOp     : return Instruction::Unwind;
    case UnreachableOp: return Instruction::Unreachable;
  }
}

static inline Instruction::BinaryOps 
getBinaryOp(BinaryOps op, const Type *Ty, const Signedness& Sign) {
  switch (op) {
    default     : assert(0 && "Invalid OldBinaryOps");
    case SetEQ  : 
    case SetNE  : 
    case SetLE  :
    case SetGE  :
    case SetLT  :
    case SetGT  : assert(0 && "Should use getCompareOp");
    case AddOp  : return Instruction::Add;
    case SubOp  : return Instruction::Sub;
    case MulOp  : return Instruction::Mul;
    case DivOp  : {
      // This is an obsolete instruction so we must upgrade it based on the
      // types of its operands.
      bool isFP = Ty->isFloatingPoint();
      if (const VectorType* PTy = dyn_cast<VectorType>(Ty))
        // If its a vector type we want to use the element type
        isFP = PTy->getElementType()->isFloatingPoint();
      if (isFP)
        return Instruction::FDiv;
      else if (Sign.isSigned())
        return Instruction::SDiv;
      return Instruction::UDiv;
    }
    case UDivOp : return Instruction::UDiv;
    case SDivOp : return Instruction::SDiv;
    case FDivOp : return Instruction::FDiv;
    case RemOp  : {
      // This is an obsolete instruction so we must upgrade it based on the
      // types of its operands.
      bool isFP = Ty->isFloatingPoint();
      if (const VectorType* PTy = dyn_cast<VectorType>(Ty))
        // If its a vector type we want to use the element type
        isFP = PTy->getElementType()->isFloatingPoint();
      // Select correct opcode
      if (isFP)
        return Instruction::FRem;
      else if (Sign.isSigned())
        return Instruction::SRem;
      return Instruction::URem;
    }
    case URemOp : return Instruction::URem;
    case SRemOp : return Instruction::SRem;
    case FRemOp : return Instruction::FRem;
    case LShrOp : return Instruction::LShr;
    case AShrOp : return Instruction::AShr;
    case ShlOp  : return Instruction::Shl;
    case ShrOp  : 
      if (Sign.isSigned())
        return Instruction::AShr;
      return Instruction::LShr;
    case AndOp  : return Instruction::And;
    case OrOp   : return Instruction::Or;
    case XorOp  : return Instruction::Xor;
  }
}

static inline Instruction::OtherOps 
getCompareOp(BinaryOps op, unsigned short &predicate, const Type* &Ty,
             const Signedness &Sign) {
  bool isSigned = Sign.isSigned();
  bool isFP = Ty->isFloatingPoint();
  switch (op) {
    default     : assert(0 && "Invalid OldSetCC");
    case SetEQ  : 
      if (isFP) {
        predicate = FCmpInst::FCMP_OEQ;
        return Instruction::FCmp;
      } else {
        predicate = ICmpInst::ICMP_EQ;
        return Instruction::ICmp;
      }
    case SetNE  : 
      if (isFP) {
        predicate = FCmpInst::FCMP_UNE;
        return Instruction::FCmp;
      } else {
        predicate = ICmpInst::ICMP_NE;
        return Instruction::ICmp;
      }
    case SetLE  : 
      if (isFP) {
        predicate = FCmpInst::FCMP_OLE;
        return Instruction::FCmp;
      } else {
        if (isSigned)
          predicate = ICmpInst::ICMP_SLE;
        else
          predicate = ICmpInst::ICMP_ULE;
        return Instruction::ICmp;
      }
    case SetGE  : 
      if (isFP) {
        predicate = FCmpInst::FCMP_OGE;
        return Instruction::FCmp;
      } else {
        if (isSigned)
          predicate = ICmpInst::ICMP_SGE;
        else
          predicate = ICmpInst::ICMP_UGE;
        return Instruction::ICmp;
      }
    case SetLT  : 
      if (isFP) {
        predicate = FCmpInst::FCMP_OLT;
        return Instruction::FCmp;
      } else {
        if (isSigned)
          predicate = ICmpInst::ICMP_SLT;
        else
          predicate = ICmpInst::ICMP_ULT;
        return Instruction::ICmp;
      }
    case SetGT  : 
      if (isFP) {
        predicate = FCmpInst::FCMP_OGT;
        return Instruction::FCmp;
      } else {
        if (isSigned)
          predicate = ICmpInst::ICMP_SGT;
        else
          predicate = ICmpInst::ICMP_UGT;
        return Instruction::ICmp;
      }
  }
}

static inline Instruction::MemoryOps getMemoryOp(MemoryOps op) {
  switch (op) {
    default              : assert(0 && "Invalid OldMemoryOps");
    case MallocOp        : return Instruction::Malloc;
    case FreeOp          : return Instruction::Free;
    case AllocaOp        : return Instruction::Alloca;
    case LoadOp          : return Instruction::Load;
    case StoreOp         : return Instruction::Store;
    case GetElementPtrOp : return Instruction::GetElementPtr;
  }
}

static inline Instruction::OtherOps 
getOtherOp(OtherOps op, const Signedness &Sign) {
  switch (op) {
    default               : assert(0 && "Invalid OldOtherOps");
    case PHIOp            : return Instruction::PHI;
    case CallOp           : return Instruction::Call;
    case SelectOp         : return Instruction::Select;
    case UserOp1          : return Instruction::UserOp1;
    case UserOp2          : return Instruction::UserOp2;
    case VAArg            : return Instruction::VAArg;
    case ExtractElementOp : return Instruction::ExtractElement;
    case InsertElementOp  : return Instruction::InsertElement;
    case ShuffleVectorOp  : return Instruction::ShuffleVector;
    case ICmpOp           : return Instruction::ICmp;
    case FCmpOp           : return Instruction::FCmp;
  };
}

static inline Value*
getCast(CastOps op, Value *Src, const Signedness &SrcSign, const Type *DstTy, 
        const Signedness &DstSign, bool ForceInstruction = false) {
  Instruction::CastOps Opcode;
  const Type* SrcTy = Src->getType();
  if (op == CastOp) {
    if (SrcTy->isFloatingPoint() && isa<PointerType>(DstTy)) {
      // fp -> ptr cast is no longer supported but we must upgrade this
      // by doing a double cast: fp -> int -> ptr
      SrcTy = Type::Int64Ty;
      Opcode = Instruction::IntToPtr;
      if (isa<Constant>(Src)) {
        Src = ConstantExpr::getCast(Instruction::FPToUI, 
                                     cast<Constant>(Src), SrcTy);
      } else {
        std::string NewName(makeNameUnique(Src->getName()));
        Src = new FPToUIInst(Src, SrcTy, NewName, CurBB);
      }
    } else if (isa<IntegerType>(DstTy) &&
               cast<IntegerType>(DstTy)->getBitWidth() == 1) {
      // cast type %x to bool was previously defined as setne type %x, null
      // The cast semantic is now to truncate, not compare so we must retain
      // the original intent by replacing the cast with a setne
      Constant* Null = Constant::getNullValue(SrcTy);
      Instruction::OtherOps Opcode = Instruction::ICmp;
      unsigned short predicate = ICmpInst::ICMP_NE;
      if (SrcTy->isFloatingPoint()) {
        Opcode = Instruction::FCmp;
        predicate = FCmpInst::FCMP_ONE;
      } else if (!SrcTy->isInteger() && !isa<PointerType>(SrcTy)) {
        error("Invalid cast to bool");
      }
      if (isa<Constant>(Src) && !ForceInstruction)
        return ConstantExpr::getCompare(predicate, cast<Constant>(Src), Null);
      else
        return CmpInst::create(Opcode, predicate, Src, Null);
    }
    // Determine the opcode to use by calling CastInst::getCastOpcode
    Opcode = 
      CastInst::getCastOpcode(Src, SrcSign.isSigned(), DstTy, 
                              DstSign.isSigned());

  } else switch (op) {
    default: assert(0 && "Invalid cast token");
    case TruncOp:    Opcode = Instruction::Trunc; break;
    case ZExtOp:     Opcode = Instruction::ZExt; break;
    case SExtOp:     Opcode = Instruction::SExt; break;
    case FPTruncOp:  Opcode = Instruction::FPTrunc; break;
    case FPExtOp:    Opcode = Instruction::FPExt; break;
    case FPToUIOp:   Opcode = Instruction::FPToUI; break;
    case FPToSIOp:   Opcode = Instruction::FPToSI; break;
    case UIToFPOp:   Opcode = Instruction::UIToFP; break;
    case SIToFPOp:   Opcode = Instruction::SIToFP; break;
    case PtrToIntOp: Opcode = Instruction::PtrToInt; break;
    case IntToPtrOp: Opcode = Instruction::IntToPtr; break;
    case BitCastOp:  Opcode = Instruction::BitCast; break;
  }

  if (isa<Constant>(Src) && !ForceInstruction)
    return ConstantExpr::getCast(Opcode, cast<Constant>(Src), DstTy);
  return CastInst::create(Opcode, Src, DstTy);
}

static Instruction *
upgradeIntrinsicCall(const Type* RetTy, const ValID &ID, 
                     std::vector<Value*>& Args) {

  std::string Name = ID.Type == ValID::NameVal ? ID.Name : "";
  if (Name.length() <= 5 || Name[0] != 'l' || Name[1] != 'l' || 
      Name[2] != 'v' || Name[3] != 'm' || Name[4] != '.')
    return 0;

  switch (Name[5]) {
    case 'i':
      if (Name == "llvm.isunordered.f32" || Name == "llvm.isunordered.f64") {
        if (Args.size() != 2)
          error("Invalid prototype for " + Name);
        return new FCmpInst(FCmpInst::FCMP_UNO, Args[0], Args[1]);
      }
      break;

    case 'v' : {
      const Type* PtrTy = PointerType::get(Type::Int8Ty);
      std::vector<const Type*> Params;
      if (Name == "llvm.va_start" || Name == "llvm.va_end") {
        if (Args.size() != 1)
          error("Invalid prototype for " + Name + " prototype");
        Params.push_back(PtrTy);
        const FunctionType *FTy = 
          FunctionType::get(Type::VoidTy, Params, false);
        const PointerType *PFTy = PointerType::get(FTy);
        Value* Func = getVal(PFTy, ID);
        Args[0] = new BitCastInst(Args[0], PtrTy, makeNameUnique("va"), CurBB);
        return new CallInst(Func, Args.begin(), Args.end());
      } else if (Name == "llvm.va_copy") {
        if (Args.size() != 2)
          error("Invalid prototype for " + Name + " prototype");
        Params.push_back(PtrTy);
        Params.push_back(PtrTy);
        const FunctionType *FTy = 
          FunctionType::get(Type::VoidTy, Params, false);
        const PointerType *PFTy = PointerType::get(FTy);
        Value* Func = getVal(PFTy, ID);
        std::string InstName0(makeNameUnique("va0"));
        std::string InstName1(makeNameUnique("va1"));
        Args[0] = new BitCastInst(Args[0], PtrTy, InstName0, CurBB);
        Args[1] = new BitCastInst(Args[1], PtrTy, InstName1, CurBB);
        return new CallInst(Func, Args.begin(), Args.end());
      }
    }
  }
  return 0;
}

const Type* upgradeGEPCEIndices(const Type* PTy, 
                                std::vector<ValueInfo> *Indices, 
                                std::vector<Constant*> &Result) {
  const Type *Ty = PTy;
  Result.clear();
  for (unsigned i = 0, e = Indices->size(); i != e ; ++i) {
    Constant *Index = cast<Constant>((*Indices)[i].V);

    if (ConstantInt *CI = dyn_cast<ConstantInt>(Index)) {
      // LLVM 1.2 and earlier used ubyte struct indices.  Convert any ubyte 
      // struct indices to i32 struct indices with ZExt for compatibility.
      if (CI->getBitWidth() < 32)
        Index = ConstantExpr::getCast(Instruction::ZExt, CI, Type::Int32Ty);
    }
    
    if (isa<SequentialType>(Ty)) {
      // Make sure that unsigned SequentialType indices are zext'd to 
      // 64-bits if they were smaller than that because LLVM 2.0 will sext 
      // all indices for SequentialType elements. We must retain the same 
      // semantic (zext) for unsigned types.
      if (const IntegerType *Ity = dyn_cast<IntegerType>(Index->getType())) {
        if (Ity->getBitWidth() < 64 && (*Indices)[i].S.isUnsigned()) {
          Index = ConstantExpr::getCast(Instruction::ZExt, Index,Type::Int64Ty);
        }
      }
    }
    Result.push_back(Index);
    Ty = GetElementPtrInst::getIndexedType(PTy, Result.begin(), 
                                           Result.end(),true);
    if (!Ty)
      error("Index list invalid for constant getelementptr");
  }
  return Ty;
}

const Type* upgradeGEPInstIndices(const Type* PTy, 
                                  std::vector<ValueInfo> *Indices, 
                                  std::vector<Value*>    &Result) {
  const Type *Ty = PTy;
  Result.clear();
  for (unsigned i = 0, e = Indices->size(); i != e ; ++i) {
    Value *Index = (*Indices)[i].V;

    if (ConstantInt *CI = dyn_cast<ConstantInt>(Index)) {
      // LLVM 1.2 and earlier used ubyte struct indices.  Convert any ubyte 
      // struct indices to i32 struct indices with ZExt for compatibility.
      if (CI->getBitWidth() < 32)
        Index = ConstantExpr::getCast(Instruction::ZExt, CI, Type::Int32Ty);
    }
    

    if (isa<StructType>(Ty)) {        // Only change struct indices
      if (!isa<Constant>(Index)) {
        error("Invalid non-constant structure index");
        return 0;
      }
    } else {
      // Make sure that unsigned SequentialType indices are zext'd to 
      // 64-bits if they were smaller than that because LLVM 2.0 will sext 
      // all indices for SequentialType elements. We must retain the same 
      // semantic (zext) for unsigned types.
      if (const IntegerType *Ity = dyn_cast<IntegerType>(Index->getType())) {
        if (Ity->getBitWidth() < 64 && (*Indices)[i].S.isUnsigned()) {
          if (isa<Constant>(Index))
            Index = ConstantExpr::getCast(Instruction::ZExt, 
              cast<Constant>(Index), Type::Int64Ty);
          else
            Index = CastInst::create(Instruction::ZExt, Index, Type::Int64Ty,
              makeNameUnique("gep"), CurBB);
        }
      }
    }
    Result.push_back(Index);
    Ty = GetElementPtrInst::getIndexedType(PTy, Result.begin(),
                                           Result.end(),true);
    if (!Ty)
      error("Index list invalid for constant getelementptr");
  }
  return Ty;
}

unsigned upgradeCallingConv(unsigned CC) {
  switch (CC) {
    case OldCallingConv::C           : return CallingConv::C;
    case OldCallingConv::CSRet       : return CallingConv::C;
    case OldCallingConv::Fast        : return CallingConv::Fast;
    case OldCallingConv::Cold        : return CallingConv::Cold;
    case OldCallingConv::X86_StdCall : return CallingConv::X86_StdCall;
    case OldCallingConv::X86_FastCall: return CallingConv::X86_FastCall;
    default:
      return CC;
  }
}

Module* UpgradeAssembly(const std::string &infile, std::istream& in, 
                              bool debug, bool addAttrs)
{
  Upgradelineno = 1; 
  CurFilename = infile;
  LexInput = &in;
  yydebug = debug;
  AddAttributes = addAttrs;
  ObsoleteVarArgs = false;
  NewVarArgs = false;

  CurModule.CurrentModule = new Module(CurFilename);

  // Check to make sure the parser succeeded
  if (yyparse()) {
    if (ParserResult)
      delete ParserResult;
    std::cerr << "llvm-upgrade: parse failed.\n";
    return 0;
  }

  // Check to make sure that parsing produced a result
  if (!ParserResult) {
    std::cerr << "llvm-upgrade: no parse result.\n";
    return 0;
  }

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

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

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

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

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

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

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

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

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

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

  return Result;
}

} // end llvm namespace

using namespace llvm;


#line 1754 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
typedef union {
  llvm::Module                           *ModuleVal;
  llvm::Function                         *FunctionVal;
  std::pair<llvm::PATypeInfo, char*>     *ArgVal;
  llvm::BasicBlock                       *BasicBlockVal;
  llvm::TermInstInfo                     TermInstVal;
  llvm::InstrInfo                        InstVal;
  llvm::ConstInfo                        ConstVal;
  llvm::ValueInfo                        ValueVal;
  llvm::PATypeInfo                       TypeVal;
  llvm::TypeInfo                         PrimType;
  llvm::PHIListInfo                      PHIList;
  std::list<llvm::PATypeInfo>            *TypeList;
  std::vector<llvm::ValueInfo>           *ValueList;
  std::vector<llvm::ConstInfo>           *ConstVector;


  std::vector<std::pair<llvm::PATypeInfo,char*> > *ArgList;
  // Represent the RHS of PHI node
  std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;

  llvm::GlobalValue::LinkageTypes         Linkage;
  int64_t                           SInt64Val;
  uint64_t                          UInt64Val;
  int                               SIntVal;
  unsigned                          UIntVal;
  llvm::APFloat                    *FPVal;
  bool                              BoolVal;

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

  llvm::BinaryOps                   BinaryOpVal;
  llvm::TermOps                     TermOpVal;
  llvm::MemoryOps                   MemOpVal;
  llvm::OtherOps                    OtherOpVal;
  llvm::CastOps                     CastOpVal;
  llvm::ICmpInst::Predicate         IPred;
  llvm::FCmpInst::Predicate         FPred;
  llvm::Module::Endianness          Endianness;
} YYSTYPE;
#include <stdio.h>

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



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

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

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,   155,
   156,   164,     2,   153,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,   160,
   152,   161,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
   157,   154,   159,     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,   158,
     2,     2,   162,     2,   163,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     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,   128,   130,   132,   134,   136,   138,
   140,   142,   144,   146,   148,   150,   152,   154,   156,   158,
   161,   162,   164,   166,   168,   170,   172,   174,   176,   177,
   178,   180,   182,   184,   186,   188,   190,   193,   194,   197,
   198,   202,   205,   206,   208,   209,   213,   215,   218,   220,
   222,   224,   226,   228,   230,   232,   234,   236,   238,   240,
   242,   244,   246,   248,   250,   252,   254,   256,   258,   261,
   266,   272,   278,   282,   285,   291,   296,   299,   301,   305,
   307,   311,   313,   314,   319,   323,   327,   332,   337,   341,
   348,   354,   357,   360,   363,   366,   369,   372,   375,   378,
   381,   384,   391,   397,   406,   413,   420,   427,   435,   443,
   450,   457,   466,   475,   479,   481,   483,   485,   487,   490,
   493,   498,   501,   503,   508,   511,   516,   517,   525,   526,
   534,   535,   543,   544,   552,   556,   561,   562,   564,   566,
   568,   572,   576,   580,   584,   588,   592,   594,   595,   597,
   599,   601,   602,   605,   609,   611,   613,   617,   619,   620,
   629,   631,   633,   634,   639,   641,   643,   646,   647,   649,
   651,   652,   653,   659,   660,   662,   664,   666,   668,   670,
   672,   674,   676,   678,   682,   684,   690,   692,   694,   696,
   698,   701,   704,   707,   711,   714,   715,   717,   719,   721,
   724,   727,   731,   741,   751,   760,   774,   776,   778,   785,
   791,   794,   801,   809,   811,   815,   817,   818,   821,   823,
   829,   835,   841,   848,   855,   858,   863,   868,   875,   880,
   885,   890,   895,   902,   909,   912,   920,   922,   925,   926,
   928,   929,   933,   940,   944,   951,   954,   959,   966
};

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

#endif

#if YYDEBUG != 0
static const short yyrline[] = { 0,
  1894,  1895,  1903,  1904,  1914,  1914,  1914,  1914,  1914,  1914,
  1914,  1914,  1914,  1914,  1914,  1918,  1918,  1918,  1922,  1922,
  1922,  1922,  1922,  1922,  1926,  1926,  1927,  1927,  1928,  1928,
  1929,  1929,  1930,  1930,  1934,  1934,  1935,  1935,  1936,  1936,
  1937,  1937,  1938,  1938,  1939,  1939,  1940,  1940,  1941,  1942,
  1945,  1945,  1945,  1945,  1949,  1949,  1949,  1949,  1949,  1949,
  1949,  1950,  1950,  1950,  1950,  1950,  1950,  1956,  1956,  1956,
  1956,  1960,  1960,  1960,  1960,  1964,  1964,  1968,  1968,  1973,
  1976,  1981,  1982,  1983,  1984,  1985,  1986,  1987,  1988,  1992,
  1993,  1994,  1995,  1996,  1997,  1998,  1999,  2009,  2010,  2018,
  2019,  2027,  2036,  2037,  2044,  2045,  2049,  2053,  2069,  2070,
  2077,  2078,  2085,  2093,  2093,  2093,  2093,  2093,  2093,  2093,
  2094,  2094,  2094,  2094,  2094,  2099,  2103,  2107,  2112,  2121,
  2148,  2154,  2167,  2178,  2182,  2195,  2199,  2213,  2217,  2224,
  2225,  2231,  2238,  2250,  2280,  2293,  2316,  2344,  2366,  2377,
  2399,  2410,  2419,  2424,  2483,  2490,  2498,  2505,  2512,  2516,
  2520,  2534,  2549,  2561,  2570,  2598,  2611,  2620,  2626,  2632,
  2643,  2649,  2655,  2666,  2667,  2676,  2677,  2689,  2698,  2699,
  2700,  2701,  2702,  2718,  2738,  2740,  2742,  2746,  2749,  2754,
  2757,  2762,  2765,  2771,  2774,  2776,  2778,  2783,  2797,  2798,
  2802,  2805,  2813,  2817,  2824,  2828,  2832,  2836,  2844,  2844,
  2848,  2849,  2853,  2861,  2866,  2874,  2875,  2882,  2889,  2893,
  3083,  3083,  3087,  3087,  3097,  3097,  3101,  3106,  3107,  3108,
  3112,  3113,  3113,  3125,  3126,  3131,  3132,  3133,  3134,  3138,
  3142,  3143,  3144,  3145,  3166,  3170,  3184,  3185,  3190,  3190,
  3198,  3208,  3211,  3220,  3231,  3236,  3245,  3256,  3256,  3259,
  3263,  3267,  3272,  3282,  3300,  3309,  3383,  3387,  3394,  3406,
  3421,  3451,  3461,  3471,  3475,  3482,  3483,  3487,  3490,  3496,
  3515,  3533,  3549,  3563,  3577,  3588,  3606,  3615,  3624,  3631,
  3652,  3676,  3682,  3688,  3694,  3710,  3803,  3811,  3812,  3816,
  3817,  3821,  3827,  3834,  3840,  3847,  3854,  3867,  3893
};
#endif


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

static const char * const yytname[] = {   "$","error","$undefined.","ESINT64VAL",
"EUINT64VAL","SINTVAL","UINTVAL","FPVAL","VOID","BOOL","SBYTE","UBYTE","SHORT",
"USHORT","INT","UINT","LONG","ULONG","FLOAT","DOUBLE","TYPE","LABEL","VAR_ID",
"LABELSTR","STRINGCONSTANT","IMPLEMENTATION","ZEROINITIALIZER","TRUETOK","FALSETOK",
"BEGINTOK","ENDTOK","DECLARE","GLOBAL","CONSTANT","SECTION","VOLATILE","TO",
"DOTDOTDOT","NULL_TOK","UNDEF","CONST","INTERNAL","LINKONCE","WEAK","APPENDING",
"DLLIMPORT","DLLEXPORT","EXTERN_WEAK","OPAQUE","NOT","EXTERNAL","TARGET","TRIPLE",
"ENDIAN","POINTERSIZE","LITTLE","BIG","ALIGN","DEPLIBS","CALL","TAIL","ASM_TOK",
"MODULE","SIDEEFFECT","CC_TOK","CCC_TOK","CSRETCC_TOK","FASTCC_TOK","COLDCC_TOK",
"X86_STDCALLCC_TOK","X86_FASTCALLCC_TOK","DATALAYOUT","RET","BR","SWITCH","INVOKE",
"UNREACHABLE","UNWIND","EXCEPT","ADD","SUB","MUL","DIV","UDIV","SDIV","FDIV",
"REM","UREM","SREM","FREM","AND","OR","XOR","SHL","SHR","ASHR","LSHR","SETLE",
"SETGE","SETLT","SETGT","SETEQ","SETNE","ICMP","FCMP","MALLOC","ALLOCA","FREE",
"LOAD","STORE","GETELEMENTPTR","PHI_TOK","SELECT","VAARG","EXTRACTELEMENT","INSERTELEMENT",
"SHUFFLEVECTOR","VAARG_old","VANEXT_old","EQ","NE","SLT","SGT","SLE","SGE","ULT",
"UGT","ULE","UGE","OEQ","ONE","OLT","OGT","OLE","OGE","ORD","UNO","UEQ","UNE",
"CAST","TRUNC","ZEXT","SEXT","FPTRUNC","FPEXT","FPTOUI","FPTOSI","UITOFP","SITOFP",
"PTRTOINT","INTTOPTR","BITCAST","'='","','","'\\\\'","'('","')'","'['","'x'",
"']'","'<'","'>'","'{'","'}'","'*'","'c'","INTVAL","EINT64VAL","ArithmeticOps",
"LogicalOps","SetCondOps","IPredicates","FPredicates","ShiftOps","CastOps","SIntType",
"UIntType","IntType","FPType","OptAssign","OptLinkage","OptCallingConv","OptAlign",
"OptCAlign","SectionString","OptSection","GlobalVarAttributes","GlobalVarAttribute",
"TypesV","UpRTypesV","Types","PrimType","UpRTypes","TypeListI","ArgTypeListI",
"ConstVal","ConstExpr","ConstVector","GlobalType","Module","FunctionList","ConstPool",
"@1","@2","@3","@4","AsmBlock","BigOrLittle","TargetDefinition","LibrariesDefinition",
"LibList","Name","OptName","ArgVal","ArgListH","ArgList","FunctionHeaderH","BEGIN",
"FunctionHeader","@5","END","Function","FnDeclareLinkage","FunctionProto","@6",
"@7","OptSideEffect","ConstValueRef","SymbolicValueRef","ValueRef","ResolvedVal",
"BasicBlockList","BasicBlock","InstructionList","Unwind","BBTerminatorInst",
"JumpTable","Inst","PHIList","ValueRefList","ValueRefListE","OptTailCall","InstVal",
"IndexList","OptVolatile","MemoryInst", NULL
};
#endif

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

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,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     1,     1,     1,     1,     1,     1,     2,
     0,     1,     1,     1,     1,     1,     1,     1,     0,     0,
     1,     1,     1,     1,     1,     1,     2,     0,     2,     0,
     3,     2,     0,     1,     0,     3,     1,     2,     1,     1,
     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     1,     1,     1,     1,     1,     2,     4,
     5,     5,     3,     2,     5,     4,     2,     1,     3,     1,
     3,     1,     0,     4,     3,     3,     4,     4,     3,     6,
     5,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     6,     5,     8,     6,     6,     6,     7,     7,     6,
     6,     8,     8,     3,     1,     1,     1,     1,     2,     2,
     4,     2,     1,     4,     2,     4,     0,     7,     0,     7,
     0,     7,     0,     7,     3,     4,     0,     1,     1,     1,
     3,     3,     3,     3,     3,     3,     1,     0,     1,     1,
     1,     0,     2,     3,     1,     1,     3,     1,     0,     8,
     1,     1,     0,     4,     1,     1,     2,     0,     1,     1,
     0,     0,     5,     0,     1,     1,     1,     1,     1,     1,
     1,     1,     1,     3,     1,     5,     1,     1,     1,     1,
     2,     2,     2,     3,     2,     0,     1,     1,     1,     2,
     2,     3,     9,     9,     8,    13,     1,     1,     6,     5,
     2,     6,     7,     1,     3,     1,     0,     2,     1,     5,
     5,     5,     6,     6,     2,     4,     4,     6,     4,     4,
     4,     4,     6,     6,     2,     7,     1,     2,     0,     1,
     0,     3,     6,     3,     6,     2,     4,     6,     4
};

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

static const short yydefgoto[] = {    92,
   310,   327,   328,   329,   253,   270,   330,   331,   217,   218,
   241,   219,    23,    13,    61,   553,   357,   452,   520,   387,
   453,    93,    94,   220,    96,    97,   200,   302,   398,   346,
   399,   102,   604,     1,     2,   334,   305,   303,   304,    53,
   188,    40,    70,   192,    98,   474,   413,   414,   415,    62,
   111,    14,    28,    34,    15,    51,    16,    26,   106,   417,
   347,    99,   349,   487,    17,    30,    31,   179,   180,   577,
    64,   276,   524,   525,   181,   182,   428,   183,   184
};

static const short yypact[] = {-32768,
   239,   567,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,   -46,-32768,    55,-32768,-32768,   -14,-32768,-32768,    48,
    -6,   104,   161,    19,-32768,   -34,   155,   249,-32768,-32768,
    98,-32768,-32768,-32768,-32768,    33,    43,    49,    57,-32768,
    59,   155,  1265,   150,   150,   150,   150,-32768,-32768,-32768,
-32768,-32768,-32768,   214,-32768,-32768,-32768,-32768,-32768,-32768,
  1265,   -19,  1479,-32768,   196,   157,   224,   206,   212,-32768,
-32768,-32768,-32768,    87,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,   241,   247,     4,
    15,-32768,-32768,   108,-32768,-32768,    12,-32768,-32768,-32768,
-32768,  1306,  1306,  1306,  1326,   249,-32768,    98,-32768,-32768,
-32768,-32768,  1306,-32768,   194,  1367,   116,   177,   249,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,   355,   429,  1306,  1306,
  1306,  1306,  1306,  1306,  1306,  1306,  1306,  1306,  1306,  1306,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,  1306,  1306,  1306,  1306,  1306,-32768,-32768,
   249,-32768,   106,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,   -32,-32768,   103,   110,    75,-32768,-32768,    12,   -81,
  1046,-32768,-32768,-32768,-32768,   197,   230,   265,   237,   267,
   240,   268,   246,   270,   269,   271,   254,   273,   272,   566,
-32768,-32768,   120,   766,-32768,-32768,    87,-32768,   766,   766,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
   766,  1265,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,  1306,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1306,
   136,   137,-32768,   766,   134,   146,   147,   149,   152,   158,
   174,   176,   179,   766,   766,   766,   180,   262,  1265,  1306,
  1306,   279,-32768,  1306,  1306,   173,   -27,  1306,-32768,-32768,
   184,   183,   187,   187,   187,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768,   355,   429,   186,   188,   189,
   190,   191,  1087,  1387,   529,   311,   192,   193,   198,   199,
   202,-32768,-32768,   187,  1107,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,   286,  1326,-32768,-32768,-32768,-32768,   205,
-32768,   207,   766,   766,   766,     7,-32768,    20,-32768,   208,
   766,   209,  1306,  1306,  1306,  1306,  1306,  1306,  1306,   210,
   216,   217,  1306,  1306,   766,   766,   218,-32768,   -12,     9,
-32768,   204,    12,  1148,-32768,     8,-32768,-32768,-32768,   220,
   221,  1326,  1326,  1326,  1326,  1326,-32768,-32768,    -8,   741,
   -82,-32768,    -9,-32768,  1326,  1326,  1326,  1326,  1326,-32768,
-32768,    98,-32768,   219,   203,-32768,   343,   -13,   356,   357,
   228,   226,   233,   766,   383,   766,  1306,-32768,   235,   766,
   236,-32768,-32768,   243,   244,-32768,-32768,   766,   766,   766,
-32768,-32768,   238,-32768,  1306,-32768,-32768,-32768,-32768,   366,
   394,-32768,   187,  1326,  1326,   208,   250,   251,   252,   258,
  1326,-32768,   256,   -25,    11,-32768,-32768,   259,   266,   274,
   278,   363,-32768,-32768,  1205,   387,   280,-32768,   766,   766,
  1306,   766,   766,   281,-32768,   281,-32768,   282,   766,   283,
  1306,  1306,  1306,-32768,-32768,-32768,  1306,   766,-32768,-32768,
-32768,   284,   290,   288,  1326,  1326,  1326,  1326,-32768,-32768,
   263,  1326,  1326,  1326,  1326,  1306,-32768,-32768,-32768,   368,
   376,   293,   294,   282,   291,-32768,-32768,   369,-32768,-32768,
  1306,   264,   766,-32768,-32768,-32768,   296,-32768,  1326,  1326,
-32768,   300,   299,   305,   306,-32768,   308,   310,   313,   314,
   315,   457,-32768,-32768,   441,    41,   436,-32768,-32768,   325,
-32768,   329,   331,  1326,-32768,  1326,  1326,-32768,-32768,-32768,
-32768,-32768,-32768,   766,-32768,   893,   145,   468,-32768,-32768,
-32768,   334,   335,   336,-32768,   340,-32768,   893,   766,-32768,
-32768,-32768,   473,   342,   182,   766,   475,   479,-32768,   766,
   766,-32768,-32768,   502,   503,-32768
};

static const short yypgoto[] = {-32768,
-32768,   443,   444,   446,   195,   200,   447,   451,  -117,  -114,
  -539,-32768,   484,   481,  -105,-32768,  -265,    40,-32768,  -236,
-32768,   -58,-32768,   -43,-32768,   -72,   -33,-32768,   -99,   298,
  -250,    58,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   480,
-32768,-32768,-32768,-32768,    10,-32768,    46,-32768,-32768,   417,
-32768,-32768,-32768,-32768,-32768,-32768,   522,-32768,-32768,-32768,
  -526,   144,   -88,  -111,-32768,   508,-32768,   -69,-32768,-32768,
-32768,-32768,   100,    31,-32768,-32768,    73,-32768,-32768
};


#define	YYLAST		1630


static const short yytable[] = {    95,
   239,   225,   108,   240,   228,   221,   359,   195,    29,   109,
    49,    24,    50,   242,    27,    32,   576,    95,   199,    72,
    73,   424,   197,    75,    76,    77,    78,    79,    80,    81,
    82,    83,    84,    85,   426,    86,    18,   588,    19,   273,
    24,   450,   277,   278,   279,   280,   281,   282,   283,   586,
   231,   232,   233,   234,   235,   236,   237,   238,   203,   204,
   205,   594,    87,   425,   451,   287,   288,   388,   389,   224,
   461,   298,   224,   401,   403,   289,   425,    29,   466,    72,
    73,   299,   197,    75,    76,    77,    78,    79,    80,    81,
    82,    83,    84,    85,   418,    86,    18,   410,    19,    36,
    37,    38,   103,   104,   105,   271,   272,   224,   274,   275,
   224,   224,   224,   224,   224,   224,   224,   223,    39,    18,
   292,    19,    87,   199,   229,   298,   293,  -138,   199,  -111,
   284,   285,   286,   224,   224,   382,   230,  -138,   202,   461,
   350,   351,   110,   461,   461,    41,   446,   478,    33,   465,
   462,   202,   352,   467,   231,   232,   233,   234,   235,   236,
   237,   238,   297,   461,    42,   196,  -111,   301,    88,   447,
    48,    89,   202,   511,    90,   202,    91,   198,    52,   377,
    43,   100,   101,   353,    65,   360,   231,   232,   233,   234,
   235,   236,   237,   238,    66,   370,   371,   372,    95,   575,
    67,     5,     6,     7,     8,    44,    10,    45,    68,   354,
    46,   186,   187,   290,   291,    69,   501,   107,   529,   185,
   530,   379,   380,   306,   307,   383,   355,   189,    88,   190,
   375,    89,   -71,   -71,    90,   191,    91,   296,  -178,   -70,
   -70,  -112,   -69,   -69,   193,    95,   376,   224,   -68,   -68,
   194,   431,   226,   433,   434,   435,   308,   309,   121,   122,
   294,   441,   201,     3,   421,   422,   423,   295,   -75,     4,
   -74,   -73,   429,   -72,   335,   -78,   311,   -79,   312,     5,
     6,     7,     8,     9,    10,    11,   443,   444,   356,   358,
   361,   412,   456,   457,   458,   459,   460,   374,   362,   363,
    12,   364,   378,   587,   365,   468,   469,   470,   471,   472,
   366,   383,    54,    55,    56,    57,    58,    59,    60,   224,
   432,   224,   224,   224,   436,   437,   367,   464,   368,   224,
   442,   369,   373,   381,   404,   484,   384,   486,   385,   386,
   392,   490,   393,   394,   395,   396,   405,   406,   416,   494,
   495,   496,   407,   408,   502,   503,   409,   419,   476,   420,
   427,   509,   438,   333,   448,   430,   477,   348,   439,   440,
   445,   475,   348,   348,   454,   455,   479,   480,   482,   534,
   535,   536,   481,   224,   348,   483,   485,   489,   491,   499,
   522,   523,   497,   526,   527,   492,   493,   500,   516,   554,
   532,   498,   505,   506,   507,   542,   543,   544,   545,   538,
   508,   512,   547,   548,   549,   550,   510,   348,   513,   558,
   450,   473,   559,   546,   552,   425,   514,   348,   348,   348,
   515,   412,   521,   528,   531,   533,   539,   224,   239,   562,
   563,   240,   540,   541,   560,   555,   557,   224,   224,   224,
   556,   561,   564,   224,   565,   254,   255,   566,   567,   239,
   573,   574,   240,   568,   582,   569,   583,   584,   570,   571,
   572,   578,   551,   243,   244,   245,   246,   247,   248,   249,
   250,   251,   252,   579,   580,   585,   581,   224,   589,   590,
   591,   592,   593,   596,   597,   600,   348,   348,   348,   601,
   595,   605,   606,    47,   348,   174,   175,   599,   176,   177,
   390,   602,   603,   178,    63,   519,   391,   332,   348,   348,
   518,    71,   222,    25,    35,   598,   488,   537,   504,     0,
     0,     0,     0,    72,    73,     0,   197,   206,   207,   208,
   209,   210,   211,   212,   213,   214,   215,   216,     0,    86,
    18,     0,    19,   256,   257,   258,   259,   260,   261,   262,
   263,   264,   265,   266,   267,   268,   269,   348,     0,   348,
    72,    73,     0,   348,     0,     0,    87,     0,     0,     0,
     0,   348,   348,   348,     0,     0,   -81,    18,    18,    19,
    19,   313,     0,     0,     0,     0,     0,     4,   -81,   -81,
     0,     0,     0,   314,   315,     0,     0,   -81,   -81,   -81,
   -81,   -81,   -81,   -81,     0,     0,   -81,    20,     0,     0,
     0,     0,   348,   348,    21,   348,   348,     0,    22,     0,
     0,     0,   348,     0,     0,     0,     0,     0,     0,     0,
     0,   348,     0,     0,   123,   124,   125,   126,   127,   128,
   129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
   139,   140,   141,   142,   143,   144,   145,   146,   316,   317,
     0,     0,     0,     0,     0,   318,   348,   319,     0,   320,
   321,   322,    88,     0,     0,    89,     0,     0,    90,     0,
    91,   402,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,   161,   162,   163,   164,   165,   166,
   167,   168,   169,   170,   171,   172,   173,   348,     0,     0,
     0,     0,   323,     0,     0,   324,     0,   325,     0,     0,
   326,     0,   348,     0,     0,     0,     0,     0,     0,   348,
     0,     0,     0,   348,   348,    72,    73,     0,   197,   206,
   207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
     0,    86,    18,     0,    19,     0,     0,     0,   336,   337,
    72,    73,   338,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,    18,    87,    19,
     0,   339,   340,   341,     0,     0,     0,     0,     0,     0,
     0,     0,     0,   342,   343,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,   344,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,   123,   124,   125,   126,   127,   128,
   129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
   139,   140,   141,   142,   143,   144,   145,   146,   316,   317,
     0,     0,     0,     0,     0,   318,     0,   319,     0,   320,
   321,   322,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,    88,   336,   337,    89,     0,   338,
    90,     0,    91,   463,   161,   162,   163,   164,   165,   166,
   167,   168,   169,   170,   171,   172,   173,     0,   339,   340,
   341,     0,     0,     0,     0,   345,     0,     0,     0,     0,
   342,   343,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,   344,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,   123,   124,   125,   126,   127,   128,   129,   130,   131,
   132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
   142,   143,   144,   145,   146,   316,   317,     0,     0,     0,
     0,     0,   318,     0,   319,     0,   320,   321,   322,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,   161,   162,   163,   164,   165,   166,   167,   168,   169,
   170,   171,   172,   173,     0,     0,     0,     0,     0,     0,
    72,    73,   345,   197,    75,    76,    77,    78,    79,    80,
    81,    82,    83,    84,    85,     0,    86,    18,     0,    19,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,   300,     0,     0,     0,     0,     0,     0,     0,
     0,    72,    73,    87,   197,   206,   207,   208,   209,   210,
   211,   212,   213,   214,   215,   216,     0,    86,    18,     0,
    19,    72,    73,     0,   197,    75,    76,    77,    78,    79,
    80,    81,    82,    83,    84,    85,     0,    86,    18,     0,
    19,     0,     0,     0,    87,     0,     0,     0,     0,     0,
     0,     0,     0,   411,     0,     0,     0,     0,     0,     0,
     0,     0,    72,    73,    87,   197,    75,    76,    77,    78,
    79,    80,    81,    82,    83,    84,    85,     0,    86,    18,
     0,    19,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,   449,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,    87,     0,     0,     0,    88,
     0,     0,    89,     0,     0,    90,     0,    91,     0,    72,
    73,     0,   197,    75,    76,    77,    78,    79,    80,    81,
    82,    83,    84,    85,     0,    86,    18,     0,    19,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
    88,   517,     0,    89,     0,   397,    90,     0,    91,     0,
     0,     0,    87,     0,     0,     0,     0,     0,     0,     0,
    88,     0,     0,    89,     0,     0,    90,     0,    91,    72,
    73,     0,    74,    75,    76,    77,    78,    79,    80,    81,
    82,    83,    84,    85,     0,    86,    18,     0,    19,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,    88,     0,     0,    89,     0,     0,    90,     0,    91,
    72,    73,    87,   197,    75,    76,    77,    78,    79,    80,
    81,    82,    83,    84,    85,     0,    86,    18,     0,    19,
    72,    73,     0,   197,   206,   207,   208,   209,   210,   211,
   212,   213,   214,   215,   216,     0,    86,    18,     0,    19,
     0,     0,     0,    87,     0,     0,     0,     0,    88,     0,
     0,    89,     0,     0,    90,     0,    91,     0,     0,     0,
     0,    72,    73,    87,   227,    75,    76,    77,    78,    79,
    80,    81,    82,    83,    84,    85,     0,    86,    18,     0,
    19,    72,    73,     0,   197,   206,   207,   208,   209,   210,
   211,   212,   213,   214,   215,   216,     0,    86,    18,     0,
    19,     0,     0,     0,    87,     0,     0,     0,    88,     0,
     0,    89,     0,     0,    90,     0,    91,     0,     0,     0,
     0,     0,     0,     0,    87,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,    88,
     0,     0,    89,     0,     0,    90,     0,    91,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,    88,
     0,     0,    89,     0,     0,    90,     0,    91,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,   112,     0,     0,     0,     0,     0,     0,
    88,     0,     0,    89,     0,     0,    90,   113,    91,     0,
     0,     0,     0,     0,     0,     0,     0,   114,   115,     0,
    88,     0,     0,    89,     0,     0,    90,     0,   400,     0,
   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,     0,     0,   152,   153,
   154,   155,   156,   157,   158,   159,   160,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,   161,   162,   163,
   164,   165,   166,   167,   168,   169,   170,   171,   172,   173
};

static const short yycheck[] = {    43,
   118,   113,    61,   118,   116,   105,   272,     4,    23,    29,
    45,     2,    47,   119,    61,    30,   556,    61,    91,     5,
     6,    15,     8,     9,    10,    11,    12,    13,    14,    15,
    16,    17,    18,    19,    15,    21,    22,   577,    24,   151,
    31,    34,   154,   155,   156,   157,   158,   159,   160,   576,
    10,    11,    12,    13,    14,    15,    16,    17,   102,   103,
   104,   588,    48,    57,    57,   177,   178,   304,   305,   113,
   153,   153,   116,   324,   325,   181,    57,    23,   161,     5,
     6,   163,     8,     9,    10,    11,    12,    13,    14,    15,
    16,    17,    18,    19,   345,    21,    22,   334,    24,    52,
    53,    54,    45,    46,    47,   149,   150,   151,   152,   153,
   154,   155,   156,   157,   158,   159,   160,   108,    71,    22,
   153,    24,    48,   196,     9,   153,   159,   153,   201,   155,
   174,   175,   176,   177,   178,   163,    21,   163,   164,   153,
   229,   230,   162,   153,   153,   152,   159,   161,   163,   400,
   159,   164,   241,   163,    10,    11,    12,    13,    14,    15,
    16,    17,   196,   153,    61,   162,   155,   201,   154,   161,
   152,   157,   164,   163,   160,   164,   162,   163,    24,   291,
    20,    32,    33,   242,   152,   274,    10,    11,    12,    13,
    14,    15,    16,    17,   152,   284,   285,   286,   242,   159,
   152,    41,    42,    43,    44,    45,    46,    47,   152,   253,
    50,    55,    56,   108,   109,   157,   453,     4,   484,    24,
   486,   294,   295,    27,    28,   298,   270,     4,   154,    24,
   289,   157,     3,     4,   160,    24,   162,   163,     0,     3,
     4,   155,     3,     4,     4,   289,   290,   291,     3,     4,
     4,   363,    59,   365,   366,   367,     3,     4,    77,    78,
   158,   373,   155,    25,   353,   354,   355,   158,     4,    31,
     4,     4,   361,     4,   155,     7,     4,     7,     7,    41,
    42,    43,    44,    45,    46,    47,   375,   376,   153,   153,
   157,   335,   392,   393,   394,   395,   396,    36,   153,   153,
    62,   153,    24,   159,   153,   405,   406,   407,   408,   409,
   153,   384,    64,    65,    66,    67,    68,    69,    70,   363,
   364,   365,   366,   367,   368,   369,   153,   400,   153,   373,
   374,   153,   153,   161,    24,   424,   153,   426,   156,   153,
   155,   430,   155,   155,   155,   155,   155,   155,    63,   438,
   439,   440,   155,   155,   454,   455,   155,   153,   156,   153,
   153,   461,   153,   220,   161,   157,    24,   224,   153,   153,
   153,   153,   229,   230,   155,   155,    21,    21,   153,   491,
   492,   493,   155,   427,   241,   153,     4,   153,   153,    24,
   479,   480,   155,   482,   483,   153,   153,     4,    36,    24,
   489,   445,   153,   153,   153,   505,   506,   507,   508,   498,
   153,   153,   512,   513,   514,   515,   161,   274,   153,   531,
    34,   412,   159,   161,    57,    57,   153,   284,   285,   286,
   153,   475,   153,   153,   153,   153,   153,   481,   556,   539,
   540,   556,   153,   156,   533,   153,   156,   491,   492,   493,
   157,   156,   153,   497,   156,    27,    28,   153,   153,   577,
     4,    21,   577,   156,   564,   156,   566,   567,   156,   156,
   156,    36,   516,   119,   120,   121,   122,   123,   124,   125,
   126,   127,   128,   159,   156,   574,   156,   531,    21,   156,
   156,   156,   153,    21,   153,    21,   353,   354,   355,    21,
   589,     0,     0,    23,   361,    63,    63,   596,    63,    63,
   316,   600,   601,    63,    31,   476,   317,   220,   375,   376,
   475,    42,   106,     2,    17,   595,   427,   497,   456,    -1,
    -1,    -1,    -1,     5,     6,    -1,     8,     9,    10,    11,
    12,    13,    14,    15,    16,    17,    18,    19,    -1,    21,
    22,    -1,    24,   125,   126,   127,   128,   129,   130,   131,
   132,   133,   134,   135,   136,   137,   138,   424,    -1,   426,
     5,     6,    -1,   430,    -1,    -1,    48,    -1,    -1,    -1,
    -1,   438,   439,   440,    -1,    -1,    20,    22,    22,    24,
    24,    26,    -1,    -1,    -1,    -1,    -1,    31,    32,    33,
    -1,    -1,    -1,    38,    39,    -1,    -1,    41,    42,    43,
    44,    45,    46,    47,    -1,    -1,    50,    51,    -1,    -1,
    -1,    -1,   479,   480,    58,   482,   483,    -1,    62,    -1,
    -1,    -1,   489,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,   498,    -1,    -1,    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,
    -1,    -1,    -1,    -1,    -1,   110,   533,   112,    -1,   114,
   115,   116,   154,    -1,    -1,   157,    -1,    -1,   160,    -1,
   162,   163,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,   139,   140,   141,   142,   143,   144,
   145,   146,   147,   148,   149,   150,   151,   574,    -1,    -1,
    -1,    -1,   157,    -1,    -1,   160,    -1,   162,    -1,    -1,
   165,    -1,   589,    -1,    -1,    -1,    -1,    -1,    -1,   596,
    -1,    -1,    -1,   600,   601,     5,     6,    -1,     8,     9,
    10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
    -1,    21,    22,    -1,    24,    -1,    -1,    -1,     3,     4,
     5,     6,     7,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    22,    48,    24,
    -1,    26,    27,    28,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    38,    39,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    61,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    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,
    -1,    -1,    -1,    -1,    -1,   110,    -1,   112,    -1,   114,
   115,   116,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,   154,     3,     4,   157,    -1,     7,
   160,    -1,   162,   163,   139,   140,   141,   142,   143,   144,
   145,   146,   147,   148,   149,   150,   151,    -1,    26,    27,
    28,    -1,    -1,    -1,    -1,   160,    -1,    -1,    -1,    -1,
    38,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    61,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    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,    -1,    -1,    -1,
    -1,    -1,   110,    -1,   112,    -1,   114,   115,   116,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,   139,   140,   141,   142,   143,   144,   145,   146,   147,
   148,   149,   150,   151,    -1,    -1,    -1,    -1,    -1,    -1,
     5,     6,   160,     8,     9,    10,    11,    12,    13,    14,
    15,    16,    17,    18,    19,    -1,    21,    22,    -1,    24,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    37,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,     5,     6,    48,     8,     9,    10,    11,    12,    13,
    14,    15,    16,    17,    18,    19,    -1,    21,    22,    -1,
    24,     5,     6,    -1,     8,     9,    10,    11,    12,    13,
    14,    15,    16,    17,    18,    19,    -1,    21,    22,    -1,
    24,    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    37,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,     5,     6,    48,     8,     9,    10,    11,    12,
    13,    14,    15,    16,    17,    18,    19,    -1,    21,    22,
    -1,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    37,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,   154,
    -1,    -1,   157,    -1,    -1,   160,    -1,   162,    -1,     5,
     6,    -1,     8,     9,    10,    11,    12,    13,    14,    15,
    16,    17,    18,    19,    -1,    21,    22,    -1,    24,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
   154,    37,    -1,   157,    -1,   159,   160,    -1,   162,    -1,
    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
   154,    -1,    -1,   157,    -1,    -1,   160,    -1,   162,     5,
     6,    -1,     8,     9,    10,    11,    12,    13,    14,    15,
    16,    17,    18,    19,    -1,    21,    22,    -1,    24,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,   154,    -1,    -1,   157,    -1,    -1,   160,    -1,   162,
     5,     6,    48,     8,     9,    10,    11,    12,    13,    14,
    15,    16,    17,    18,    19,    -1,    21,    22,    -1,    24,
     5,     6,    -1,     8,     9,    10,    11,    12,    13,    14,
    15,    16,    17,    18,    19,    -1,    21,    22,    -1,    24,
    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,   154,    -1,
    -1,   157,    -1,    -1,   160,    -1,   162,    -1,    -1,    -1,
    -1,     5,     6,    48,     8,     9,    10,    11,    12,    13,
    14,    15,    16,    17,    18,    19,    -1,    21,    22,    -1,
    24,     5,     6,    -1,     8,     9,    10,    11,    12,    13,
    14,    15,    16,    17,    18,    19,    -1,    21,    22,    -1,
    24,    -1,    -1,    -1,    48,    -1,    -1,    -1,   154,    -1,
    -1,   157,    -1,    -1,   160,    -1,   162,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   154,
    -1,    -1,   157,    -1,    -1,   160,    -1,   162,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   154,
    -1,    -1,   157,    -1,    -1,   160,    -1,   162,    -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,    35,    -1,    -1,    -1,    -1,    -1,    -1,
   154,    -1,    -1,   157,    -1,    -1,   160,    49,   162,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    59,    60,    -1,
   154,    -1,    -1,   157,    -1,    -1,   160,    -1,   162,    -1,
    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,    -1,    -1,   110,   111,
   112,   113,   114,   115,   116,   117,   118,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    -1,    -1,   139,   140,   141,
   142,   143,   144,   145,   146,   147,   148,   149,   150,   151
};
/* -*-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 2:
#line 1895 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX)     // Outside of my range!
      error("Value too large for type");
    yyval.SIntVal = (int32_t)yyvsp[0].UIntVal;
  ;
    break;}
case 4:
#line 1904 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX)     // Outside of my range!
      error("Value too large for type");
    yyval.SInt64Val = (int64_t)yyvsp[0].UInt64Val;
  ;
    break;}
case 25:
#line 1926 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_EQ; ;
    break;}
case 26:
#line 1926 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_NE; ;
    break;}
case 27:
#line 1927 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_SLT; ;
    break;}
case 28:
#line 1927 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_SGT; ;
    break;}
case 29:
#line 1928 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_SLE; ;
    break;}
case 30:
#line 1928 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_SGE; ;
    break;}
case 31:
#line 1929 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_ULT; ;
    break;}
case 32:
#line 1929 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_UGT; ;
    break;}
case 33:
#line 1930 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_ULE; ;
    break;}
case 34:
#line 1930 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.IPred = ICmpInst::ICMP_UGE; ;
    break;}
case 35:
#line 1934 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_OEQ; ;
    break;}
case 36:
#line 1934 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_ONE; ;
    break;}
case 37:
#line 1935 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_OLT; ;
    break;}
case 38:
#line 1935 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_OGT; ;
    break;}
case 39:
#line 1936 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_OLE; ;
    break;}
case 40:
#line 1936 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_OGE; ;
    break;}
case 41:
#line 1937 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_ORD; ;
    break;}
case 42:
#line 1937 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_UNO; ;
    break;}
case 43:
#line 1938 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_UEQ; ;
    break;}
case 44:
#line 1938 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_UNE; ;
    break;}
case 45:
#line 1939 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_ULT; ;
    break;}
case 46:
#line 1939 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_UGT; ;
    break;}
case 47:
#line 1940 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_ULE; ;
    break;}
case 48:
#line 1940 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_UGE; ;
    break;}
case 49:
#line 1941 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_TRUE; ;
    break;}
case 50:
#line 1942 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.FPred = FCmpInst::FCMP_FALSE; ;
    break;}
case 80:
#line 1973 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.StrVal = yyvsp[-1].StrVal;
  ;
    break;}
case 81:
#line 1976 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.StrVal = 0;
  ;
    break;}
case 82:
#line 1981 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::InternalLinkage; ;
    break;}
case 83:
#line 1982 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
    break;}
case 84:
#line 1983 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::WeakLinkage; ;
    break;}
case 85:
#line 1984 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::AppendingLinkage; ;
    break;}
case 86:
#line 1985 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::DLLImportLinkage; ;
    break;}
case 87:
#line 1986 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::DLLExportLinkage; ;
    break;}
case 88:
#line 1987 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
    break;}
case 89:
#line 1988 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
    break;}
case 90:
#line 1992 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = lastCallingConv = OldCallingConv::C; ;
    break;}
case 91:
#line 1993 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = lastCallingConv = OldCallingConv::C; ;
    break;}
case 92:
#line 1994 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = lastCallingConv = OldCallingConv::CSRet; ;
    break;}
case 93:
#line 1995 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = lastCallingConv = OldCallingConv::Fast; ;
    break;}
case 94:
#line 1996 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = lastCallingConv = OldCallingConv::Cold; ;
    break;}
case 95:
#line 1997 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = lastCallingConv = OldCallingConv::X86_StdCall; ;
    break;}
case 96:
#line 1998 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = lastCallingConv = OldCallingConv::X86_FastCall; ;
    break;}
case 97:
#line 1999 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val)
      error("Calling conv too large");
    yyval.UIntVal = lastCallingConv = yyvsp[0].UInt64Val;
  ;
    break;}
case 98:
#line 2009 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = 0; ;
    break;}
case 99:
#line 2010 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.UIntVal = yyvsp[0].UInt64Val;
    if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal))
      error("Alignment must be a power of two");
  ;
    break;}
case 100:
#line 2018 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.UIntVal = 0; ;
    break;}
case 101:
#line 2019 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.UIntVal = yyvsp[0].UInt64Val;
    if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal))
      error("Alignment must be a power of two");
  ;
    break;}
case 102:
#line 2027 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i)
      if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\')
        error("Invalid character in section name");
    yyval.StrVal = yyvsp[0].StrVal;
  ;
    break;}
case 103:
#line 2036 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.StrVal = 0; ;
    break;}
case 104:
#line 2037 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.StrVal = yyvsp[0].StrVal; ;
    break;}
case 105:
#line 2044 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{;
    break;}
case 106:
#line 2045 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{;
    break;}
case 107:
#line 2049 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurGV->setSection(yyvsp[0].StrVal);
    free(yyvsp[0].StrVal);
  ;
    break;}
case 108:
#line 2053 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val))
      error("Alignment must be a power of two");
    CurGV->setAlignment(yyvsp[0].UInt64Val);
    
  ;
    break;}
case 110:
#line 2070 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ 
    yyval.TypeVal.PAT = new PATypeHolder(yyvsp[0].PrimType.T); 
    yyval.TypeVal.S.makeSignless();
  ;
    break;}
case 112:
#line 2078 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ 
    yyval.TypeVal.PAT = new PATypeHolder(yyvsp[0].PrimType.T); 
    yyval.TypeVal.S.makeSignless();
  ;
    break;}
case 113:
#line 2085 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!UpRefs.empty())
      error("Invalid upreference in type: " + (*yyvsp[0].TypeVal.PAT)->getDescription());
    yyval.TypeVal = yyvsp[0].TypeVal;
  ;
    break;}
case 126:
#line 2099 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ 
    yyval.TypeVal.PAT = new PATypeHolder(yyvsp[0].PrimType.T);
    yyval.TypeVal.S.copy(yyvsp[0].PrimType.S);
  ;
    break;}
case 127:
#line 2103 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.TypeVal.PAT = new PATypeHolder(OpaqueType::get());
    yyval.TypeVal.S.makeSignless();
  ;
    break;}
case 128:
#line 2107 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{            // Named types are also simple types...
    yyval.TypeVal.S.copy(getTypeSign(yyvsp[0].ValIDVal));
    const Type* tmp = getType(yyvsp[0].ValIDVal);
    yyval.TypeVal.PAT = new PATypeHolder(tmp);
  ;
    break;}
case 129:
#line 2112 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                   // Type UpReference
    if (yyvsp[0].UInt64Val > (uint64_t)~0U) 
      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.PAT = new PATypeHolder(OT);
    yyval.TypeVal.S.makeSignless();
    UR_OUT("New Upreference!\n");
  ;
    break;}
case 130:
#line 2121 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{           // Function derived type?
    yyval.TypeVal.S.makeComposite(yyvsp[-3].TypeVal.S);
    std::vector<const Type*> Params;
    for (std::list<llvm::PATypeInfo>::iterator I = yyvsp[-1].TypeList->begin(),
           E = yyvsp[-1].TypeList->end(); I != E; ++I) {
      Params.push_back(I->PAT->get());
      yyval.TypeVal.S.add(I->S);
    }
    bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
    if (isVarArg) Params.pop_back();

    ParamAttrsList *PAL = 0;
    if (lastCallingConv == OldCallingConv::CSRet) {
      ParamAttrsVector Attrs;
      ParamAttrsWithIndex PAWI;
      PAWI.index = 1;  PAWI.attrs = ParamAttr::StructRet; // first arg
      Attrs.push_back(PAWI);
      PAL = ParamAttrsList::get(Attrs);
    }

    const FunctionType *FTy =
      FunctionType::get(yyvsp[-3].TypeVal.PAT->get(), Params, isVarArg, PAL);

    yyval.TypeVal.PAT = new PATypeHolder( HandleUpRefs(FTy, yyval.TypeVal.S) );
    delete yyvsp[-3].TypeVal.PAT;  // Delete the return type handle
    delete yyvsp[-1].TypeList;      // Delete the argument list
  ;
    break;}
case 131:
#line 2148 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{          // Sized array type?
    yyval.TypeVal.S.makeComposite(yyvsp[-1].TypeVal.S);
    yyval.TypeVal.PAT = new PATypeHolder(HandleUpRefs(ArrayType::get(yyvsp[-1].TypeVal.PAT->get(), 
                                           (unsigned)yyvsp[-3].UInt64Val), yyval.TypeVal.S));
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 132:
#line 2154 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{          // Vector type?
    const llvm::Type* ElemTy = yyvsp[-1].TypeVal.PAT->get();
    if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val)
       error("Unsigned result not equal to signed result");
    if (!(ElemTy->isInteger() || ElemTy->isFloatingPoint()))
       error("Elements of a VectorType must be integer or floating point");
    if (!isPowerOf2_32(yyvsp[-3].UInt64Val))
      error("VectorType length should be a power of 2");
    yyval.TypeVal.S.makeComposite(yyvsp[-1].TypeVal.S);
    yyval.TypeVal.PAT = new PATypeHolder(HandleUpRefs(VectorType::get(ElemTy, 
                                         (unsigned)yyvsp[-3].UInt64Val), yyval.TypeVal.S));
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 133:
#line 2167 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                        // Structure type?
    std::vector<const Type*> Elements;
    yyval.TypeVal.S.makeComposite();
    for (std::list<llvm::PATypeInfo>::iterator I = yyvsp[-1].TypeList->begin(),
           E = yyvsp[-1].TypeList->end(); I != E; ++I) {
      Elements.push_back(I->PAT->get());
      yyval.TypeVal.S.add(I->S);
    }
    yyval.TypeVal.PAT = new PATypeHolder(HandleUpRefs(StructType::get(Elements), yyval.TypeVal.S));
    delete yyvsp[-1].TypeList;
  ;
    break;}
case 134:
#line 2178 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                                  // Empty structure type?
    yyval.TypeVal.PAT = new PATypeHolder(StructType::get(std::vector<const Type*>()));
    yyval.TypeVal.S.makeComposite();
  ;
    break;}
case 135:
#line 2182 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                // Packed Structure type?
    yyval.TypeVal.S.makeComposite();
    std::vector<const Type*> Elements;
    for (std::list<llvm::PATypeInfo>::iterator I = yyvsp[-2].TypeList->begin(),
           E = yyvsp[-2].TypeList->end(); I != E; ++I) {
      Elements.push_back(I->PAT->get());
      yyval.TypeVal.S.add(I->S);
      delete I->PAT;
    }
    yyval.TypeVal.PAT = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true), 
                                           yyval.TypeVal.S));
    delete yyvsp[-2].TypeList;
  ;
    break;}
case 136:
#line 2195 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                          // Empty packed structure type?
    yyval.TypeVal.PAT = new PATypeHolder(StructType::get(std::vector<const Type*>(),true));
    yyval.TypeVal.S.makeComposite();
  ;
    break;}
case 137:
#line 2199 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                             // Pointer type?
    if (yyvsp[-1].TypeVal.PAT->get() == Type::LabelTy)
      error("Cannot form a pointer to a basic block");
    yyval.TypeVal.S.makeComposite(yyvsp[-1].TypeVal.S);
    yyval.TypeVal.PAT = new PATypeHolder(HandleUpRefs(PointerType::get(yyvsp[-1].TypeVal.PAT->get()),
                                           yyval.TypeVal.S));
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 138:
#line 2213 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.TypeList = new std::list<PATypeInfo>();
    yyval.TypeList->push_back(yyvsp[0].TypeVal); 
  ;
    break;}
case 139:
#line 2217 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    (yyval.TypeList=yyvsp[-2].TypeList)->push_back(yyvsp[0].TypeVal);
  ;
    break;}
case 141:
#line 2225 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    PATypeInfo VoidTI;
    VoidTI.PAT = new PATypeHolder(Type::VoidTy);
    VoidTI.S.makeSignless();
    (yyval.TypeList=yyvsp[-2].TypeList)->push_back(VoidTI);
  ;
    break;}
case 142:
#line 2231 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.TypeList = new std::list<PATypeInfo>();
    PATypeInfo VoidTI;
    VoidTI.PAT = new PATypeHolder(Type::VoidTy);
    VoidTI.S.makeSignless();
    yyval.TypeList->push_back(VoidTI);
  ;
    break;}
case 143:
#line 2238 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.TypeList = new std::list<PATypeInfo>();
  ;
    break;}
case 144:
#line 2250 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ // Nonempty unsized arr
    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-3].TypeVal.PAT->get());
    if (ATy == 0)
      error("Cannot make array constant with type: '" + 
            yyvsp[-3].TypeVal.PAT->get()->getDescription() + "'");
    const Type *ETy = ATy->getElementType();
    int NumElements = ATy->getNumElements();

    // Verify that we have the correct size...
    if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
      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!
    std::vector<Constant*> Elems;
    for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
      Constant *C = (*yyvsp[-1].ConstVector)[i].C;
      const Type* ValTy = C->getType();
      if (ETy != ValTy)
        error("Element #" + utostr(i) + " is not of type '" + 
              ETy->getDescription() +"' as required!\nIt is of type '"+
              ValTy->getDescription() + "'");
      Elems.push_back(C);
    }
    yyval.ConstVal.C = ConstantArray::get(ATy, Elems);
    yyval.ConstVal.S.copy(yyvsp[-3].TypeVal.S);
    delete yyvsp[-3].TypeVal.PAT; 
    delete yyvsp[-1].ConstVector;
  ;
    break;}
case 145:
#line 2280 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal.PAT->get());
    if (ATy == 0)
      error("Cannot make array constant with type: '" + 
            yyvsp[-2].TypeVal.PAT->get()->getDescription() + "'");
    int NumElements = ATy->getNumElements();
    if (NumElements != -1 && NumElements != 0) 
      error("Type mismatch: constant sized array initialized with 0"
            " arguments, but has size of " + itostr(NumElements) +"");
    yyval.ConstVal.C = ConstantArray::get(ATy, std::vector<Constant*>());
    yyval.ConstVal.S.copy(yyvsp[-2].TypeVal.S);
    delete yyvsp[-2].TypeVal.PAT;
  ;
    break;}
case 146:
#line 2293 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal.PAT->get());
    if (ATy == 0)
      error("Cannot make array constant with type: '" + 
            yyvsp[-2].TypeVal.PAT->get()->getDescription() + "'");
    int NumElements = ATy->getNumElements();
    const Type *ETy = dyn_cast<IntegerType>(ATy->getElementType());
    if (!ETy || cast<IntegerType>(ETy)->getBitWidth() != 8)
      error("String arrays require type i8, not '" + ETy->getDescription() + 
            "'");
    char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true);
    if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal))
      error("Can't build string constant of size " + 
            itostr((int)(EndStr-yyvsp[0].StrVal)) + " when array has size " + 
            itostr(NumElements) + "");
    std::vector<Constant*> Vals;
    for (char *C = (char *)yyvsp[0].StrVal; C != (char *)EndStr; ++C)
      Vals.push_back(ConstantInt::get(ETy, *C));
    free(yyvsp[0].StrVal);
    yyval.ConstVal.C = ConstantArray::get(ATy, Vals);
    yyval.ConstVal.S.copy(yyvsp[-2].TypeVal.S);
    delete yyvsp[-2].TypeVal.PAT;
  ;
    break;}
case 147:
#line 2316 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ // Nonempty unsized arr
    const VectorType *PTy = dyn_cast<VectorType>(yyvsp[-3].TypeVal.PAT->get());
    if (PTy == 0)
      error("Cannot make packed constant with type: '" + 
            yyvsp[-3].TypeVal.PAT->get()->getDescription() + "'");
    const Type *ETy = PTy->getElementType();
    int NumElements = PTy->getNumElements();
    // Verify that we have the correct size...
    if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
      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!
    std::vector<Constant*> Elems;
    for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
      Constant *C = (*yyvsp[-1].ConstVector)[i].C;
      const Type* ValTy = C->getType();
      if (ETy != ValTy)
        error("Element #" + utostr(i) + " is not of type '" + 
              ETy->getDescription() +"' as required!\nIt is of type '"+
              ValTy->getDescription() + "'");
      Elems.push_back(C);
    }
    yyval.ConstVal.C = ConstantVector::get(PTy, Elems);
    yyval.ConstVal.S.copy(yyvsp[-3].TypeVal.S);
    delete yyvsp[-3].TypeVal.PAT;
    delete yyvsp[-1].ConstVector;
  ;
    break;}
case 148:
#line 2344 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const StructType *STy = dyn_cast<StructType>(yyvsp[-3].TypeVal.PAT->get());
    if (STy == 0)
      error("Cannot make struct constant with type: '" + 
            yyvsp[-3].TypeVal.PAT->get()->getDescription() + "'");
    if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes())
      error("Illegal number of initializers for structure type");

    // Check to ensure that constants are compatible with the type initializer!
    std::vector<Constant*> Fields;
    for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i) {
      Constant *C = (*yyvsp[-1].ConstVector)[i].C;
      if (C->getType() != STy->getElementType(i))
        error("Expected type '" + STy->getElementType(i)->getDescription() +
              "' for element #" + utostr(i) + " of structure initializer");
      Fields.push_back(C);
    }
    yyval.ConstVal.C = ConstantStruct::get(STy, Fields);
    yyval.ConstVal.S.copy(yyvsp[-3].TypeVal.S);
    delete yyvsp[-3].TypeVal.PAT;
    delete yyvsp[-1].ConstVector;
  ;
    break;}
case 149:
#line 2366 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const StructType *STy = dyn_cast<StructType>(yyvsp[-2].TypeVal.PAT->get());
    if (STy == 0)
      error("Cannot make struct constant with type: '" + 
              yyvsp[-2].TypeVal.PAT->get()->getDescription() + "'");
    if (STy->getNumContainedTypes() != 0)
      error("Illegal number of initializers for structure type");
    yyval.ConstVal.C = ConstantStruct::get(STy, std::vector<Constant*>());
    yyval.ConstVal.S.copy(yyvsp[-2].TypeVal.S);
    delete yyvsp[-2].TypeVal.PAT;
  ;
    break;}
case 150:
#line 2377 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const StructType *STy = dyn_cast<StructType>(yyvsp[-5].TypeVal.PAT->get());
    if (STy == 0)
      error("Cannot make packed struct constant with type: '" + 
            yyvsp[-5].TypeVal.PAT->get()->getDescription() + "'");
    if (yyvsp[-2].ConstVector->size() != STy->getNumContainedTypes())
      error("Illegal number of initializers for packed structure type");

    // Check to ensure that constants are compatible with the type initializer!
    std::vector<Constant*> Fields;
    for (unsigned i = 0, e = yyvsp[-2].ConstVector->size(); i != e; ++i) {
      Constant *C = (*yyvsp[-2].ConstVector)[i].C;
      if (C->getType() != STy->getElementType(i))
        error("Expected type '" + STy->getElementType(i)->getDescription() +
              "' for element #" + utostr(i) + " of packed struct initializer");
      Fields.push_back(C);
    }
    yyval.ConstVal.C = ConstantStruct::get(STy, Fields);
    yyval.ConstVal.S.copy(yyvsp[-5].TypeVal.S);
    delete yyvsp[-5].TypeVal.PAT; 
    delete yyvsp[-2].ConstVector;
  ;
    break;}
case 151:
#line 2399 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const StructType *STy = dyn_cast<StructType>(yyvsp[-4].TypeVal.PAT->get());
    if (STy == 0)
      error("Cannot make packed struct constant with type: '" + 
              yyvsp[-4].TypeVal.PAT->get()->getDescription() + "'");
    if (STy->getNumContainedTypes() != 0)
      error("Illegal number of initializers for packed structure type");
    yyval.ConstVal.C = ConstantStruct::get(STy, std::vector<Constant*>());
    yyval.ConstVal.S.copy(yyvsp[-4].TypeVal.S);
    delete yyvsp[-4].TypeVal.PAT;
  ;
    break;}
case 152:
#line 2410 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const PointerType *PTy = dyn_cast<PointerType>(yyvsp[-1].TypeVal.PAT->get());
    if (PTy == 0)
      error("Cannot make null pointer constant with type: '" + 
            yyvsp[-1].TypeVal.PAT->get()->getDescription() + "'");
    yyval.ConstVal.C = ConstantPointerNull::get(PTy);
    yyval.ConstVal.S.copy(yyvsp[-1].TypeVal.S);
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 153:
#line 2419 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ConstVal.C = UndefValue::get(yyvsp[-1].TypeVal.PAT->get());
    yyval.ConstVal.S.copy(yyvsp[-1].TypeVal.S);
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 154:
#line 2424 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const PointerType *Ty = dyn_cast<PointerType>(yyvsp[-1].TypeVal.PAT->get());
    if (Ty == 0)
      error("Global const reference must be a pointer type, not" +
            yyvsp[-1].TypeVal.PAT->get()->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, getExistingValue 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
    // getExistingValue that we are at global scope here.
    //
    Function *SavedCurFn = CurFun.CurrentFunction;
    CurFun.CurrentFunction = 0;
    yyvsp[0].ValIDVal.S.copy(yyvsp[-1].TypeVal.S);
    Value *V = getExistingValue(Ty, yyvsp[0].ValIDVal);
    CurFun.CurrentFunction = SavedCurFn;

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

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

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

        // Keep track of the fact that we have a forward ref to recycle it
        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, yyvsp[0].ValIDVal), GV));
        V = GV;
      }
    }
    yyval.ConstVal.C = cast<GlobalValue>(V);
    yyval.ConstVal.S.copy(yyvsp[-1].TypeVal.S);
    delete yyvsp[-1].TypeVal.PAT;            // Free the type handle
  ;
    break;}
case 155:
#line 2483 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[-1].TypeVal.PAT->get() != yyvsp[0].ConstVal.C->getType())
      error("Mismatched types for constant expression");
    yyval.ConstVal = yyvsp[0].ConstVal;
    yyval.ConstVal.S.copy(yyvsp[-1].TypeVal.S);
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 156:
#line 2490 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[-1].TypeVal.PAT->get();
    if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
      error("Cannot create a null initialized value of this type");
    yyval.ConstVal.C = Constant::getNullValue(Ty);
    yyval.ConstVal.S.copy(yyvsp[-1].TypeVal.S);
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 157:
#line 2498 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{      // integral constants
    const Type *Ty = yyvsp[-1].PrimType.T;
    if (!ConstantInt::isValueValidForType(Ty, yyvsp[0].SInt64Val))
      error("Constant value doesn't fit in type");
    yyval.ConstVal.C = ConstantInt::get(Ty, yyvsp[0].SInt64Val);
    yyval.ConstVal.S.makeSigned();
  ;
    break;}
case 158:
#line 2505 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{            // integral constants
    const Type *Ty = yyvsp[-1].PrimType.T;
    if (!ConstantInt::isValueValidForType(Ty, yyvsp[0].UInt64Val))
      error("Constant value doesn't fit in type");
    yyval.ConstVal.C = ConstantInt::get(Ty, yyvsp[0].UInt64Val);
    yyval.ConstVal.S.makeUnsigned();
  ;
    break;}
case 159:
#line 2512 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                      // Boolean constants
    yyval.ConstVal.C = ConstantInt::get(Type::Int1Ty, true);
    yyval.ConstVal.S.makeUnsigned();
  ;
    break;}
case 160:
#line 2516 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                     // Boolean constants
    yyval.ConstVal.C = ConstantInt::get(Type::Int1Ty, false);
    yyval.ConstVal.S.makeUnsigned();
  ;
    break;}
case 161:
#line 2520 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                   // Float & Double constants
    if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType.T, *yyvsp[0].FPVal))
      error("Floating point constant invalid for type");
    // Lexer has no type info, so builds all FP constants as double.
    // Fix this here.
    if (yyvsp[-1].PrimType.T==Type::FloatTy)
      yyvsp[0].FPVal->convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven);
    yyval.ConstVal.C = ConstantFP::get(yyvsp[-1].PrimType.T, *yyvsp[0].FPVal);
    delete yyvsp[0].FPVal;
    yyval.ConstVal.S.makeSignless();
  ;
    break;}
case 162:
#line 2534 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type* SrcTy = yyvsp[-3].ConstVal.C->getType();
    const Type* DstTy = yyvsp[-1].TypeVal.PAT->get();
    Signedness SrcSign(yyvsp[-3].ConstVal.S);
    Signedness DstSign(yyvsp[-1].TypeVal.S);
    if (!SrcTy->isFirstClassType())
      error("cast constant expression from a non-primitive type: '" +
            SrcTy->getDescription() + "'");
    if (!DstTy->isFirstClassType())
      error("cast constant expression to a non-primitive type: '" +
            DstTy->getDescription() + "'");
    yyval.ConstVal.C = cast<Constant>(getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal.C, SrcSign, DstTy, DstSign));
    yyval.ConstVal.S.copy(DstSign);
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 163:
#line 2549 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[-2].ConstVal.C->getType();
    if (!isa<PointerType>(Ty))
      error("GetElementPtr requires a pointer operand");

    std::vector<Constant*> CIndices;
    upgradeGEPCEIndices(yyvsp[-2].ConstVal.C->getType(), yyvsp[-1].ValueList, CIndices);

    delete yyvsp[-1].ValueList;
    yyval.ConstVal.C = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal.C, &CIndices[0], CIndices.size());
    yyval.ConstVal.S.copy(getElementSign(yyvsp[-2].ConstVal, CIndices));
  ;
    break;}
case 164:
#line 2561 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!yyvsp[-5].ConstVal.C->getType()->isInteger() ||
        cast<IntegerType>(yyvsp[-5].ConstVal.C->getType())->getBitWidth() != 1)
      error("Select condition must be bool type");
    if (yyvsp[-3].ConstVal.C->getType() != yyvsp[-1].ConstVal.C->getType())
      error("Select operand types must match");
    yyval.ConstVal.C = ConstantExpr::getSelect(yyvsp[-5].ConstVal.C, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    yyval.ConstVal.S.copy(yyvsp[-3].ConstVal.S);
  ;
    break;}
case 165:
#line 2570 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[-3].ConstVal.C->getType();
    if (Ty != yyvsp[-1].ConstVal.C->getType())
      error("Binary operator types must match");
    // First, make sure we're dealing with the right opcode by upgrading from
    // obsolete versions.
    Instruction::BinaryOps Opcode = getBinaryOp(yyvsp[-5].BinaryOpVal, Ty, yyvsp[-3].ConstVal.S);

    // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs.
    // To retain backward compatibility with these early compilers, we emit a
    // cast to the appropriate integer type automatically if we are in the
    // broken case.  See PR424 for more information.
    if (!isa<PointerType>(Ty)) {
      yyval.ConstVal.C = ConstantExpr::get(Opcode, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    } else {
      const Type *IntPtrTy = 0;
      switch (CurModule.CurrentModule->getPointerSize()) {
      case Module::Pointer32: IntPtrTy = Type::Int32Ty; break;
      case Module::Pointer64: IntPtrTy = Type::Int64Ty; break;
      default: error("invalid pointer binary constant expr");
      }
      yyval.ConstVal.C = ConstantExpr::get(Opcode, 
             ConstantExpr::getCast(Instruction::PtrToInt, yyvsp[-3].ConstVal.C, IntPtrTy),
             ConstantExpr::getCast(Instruction::PtrToInt, yyvsp[-1].ConstVal.C, IntPtrTy));
      yyval.ConstVal.C = ConstantExpr::getCast(Instruction::IntToPtr, yyval.ConstVal.C, Ty);
    }
    yyval.ConstVal.S.copy(yyvsp[-3].ConstVal.S); 
  ;
    break;}
case 166:
#line 2598 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type* Ty = yyvsp[-3].ConstVal.C->getType();
    if (Ty != yyvsp[-1].ConstVal.C->getType())
      error("Logical operator types must match");
    if (!Ty->isInteger()) {
      if (!isa<VectorType>(Ty) || 
          !cast<VectorType>(Ty)->getElementType()->isInteger())
        error("Logical operator requires integer operands");
    }
    Instruction::BinaryOps Opcode = getBinaryOp(yyvsp[-5].BinaryOpVal, Ty, yyvsp[-3].ConstVal.S);
    yyval.ConstVal.C = ConstantExpr::get(Opcode, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    yyval.ConstVal.S.copy(yyvsp[-3].ConstVal.S);
  ;
    break;}
case 167:
#line 2611 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type* Ty = yyvsp[-3].ConstVal.C->getType();
    if (Ty != yyvsp[-1].ConstVal.C->getType())
      error("setcc operand types must match");
    unsigned short pred;
    Instruction::OtherOps Opcode = getCompareOp(yyvsp[-5].BinaryOpVal, pred, Ty, yyvsp[-3].ConstVal.S);
    yyval.ConstVal.C = ConstantExpr::getCompare(Opcode, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    yyval.ConstVal.S.makeUnsigned();
  ;
    break;}
case 168:
#line 2620 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[-3].ConstVal.C->getType() != yyvsp[-1].ConstVal.C->getType()) 
      error("icmp operand types must match");
    yyval.ConstVal.C = ConstantExpr::getCompare(yyvsp[-5].IPred, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    yyval.ConstVal.S.makeUnsigned();
  ;
    break;}
case 169:
#line 2626 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[-3].ConstVal.C->getType() != yyvsp[-1].ConstVal.C->getType()) 
      error("fcmp operand types must match");
    yyval.ConstVal.C = ConstantExpr::getCompare(yyvsp[-5].FPred, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    yyval.ConstVal.S.makeUnsigned();
  ;
    break;}
case 170:
#line 2632 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!yyvsp[-1].ConstVal.C->getType()->isInteger() ||
        cast<IntegerType>(yyvsp[-1].ConstVal.C->getType())->getBitWidth() != 8)
      error("Shift count for shift constant must be unsigned byte");
    const Type* Ty = yyvsp[-3].ConstVal.C->getType();
    if (!yyvsp[-3].ConstVal.C->getType()->isInteger())
      error("Shift constant expression requires integer operand");
    Constant *ShiftAmt = ConstantExpr::getZExt(yyvsp[-1].ConstVal.C, Ty);
    yyval.ConstVal.C = ConstantExpr::get(getBinaryOp(yyvsp[-5].BinaryOpVal, Ty, yyvsp[-3].ConstVal.S), yyvsp[-3].ConstVal.C, ShiftAmt);
    yyval.ConstVal.S.copy(yyvsp[-3].ConstVal.S);
  ;
    break;}
case 171:
#line 2643 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!ExtractElementInst::isValidOperands(yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C))
      error("Invalid extractelement operands");
    yyval.ConstVal.C = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    yyval.ConstVal.S.copy(yyvsp[-3].ConstVal.S.get(0));
  ;
    break;}
case 172:
#line 2649 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!InsertElementInst::isValidOperands(yyvsp[-5].ConstVal.C, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C))
      error("Invalid insertelement operands");
    yyval.ConstVal.C = ConstantExpr::getInsertElement(yyvsp[-5].ConstVal.C, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    yyval.ConstVal.S.copy(yyvsp[-5].ConstVal.S);
  ;
    break;}
case 173:
#line 2655 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!ShuffleVectorInst::isValidOperands(yyvsp[-5].ConstVal.C, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C))
      error("Invalid shufflevector operands");
    yyval.ConstVal.C = ConstantExpr::getShuffleVector(yyvsp[-5].ConstVal.C, yyvsp[-3].ConstVal.C, yyvsp[-1].ConstVal.C);
    yyval.ConstVal.S.copy(yyvsp[-5].ConstVal.S);
  ;
    break;}
case 174:
#line 2666 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); ;
    break;}
case 175:
#line 2667 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ConstVector = new std::vector<ConstInfo>();
    yyval.ConstVector->push_back(yyvsp[0].ConstVal);
  ;
    break;}
case 176:
#line 2676 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.BoolVal = false; ;
    break;}
case 177:
#line 2677 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.BoolVal = true; ;
    break;}
case 178:
#line 2689 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal;
    CurModule.ModuleDone();
  ;
    break;}
case 179:
#line 2698 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ModuleVal = yyvsp[-1].ModuleVal; CurFun.FunctionDone(); ;
    break;}
case 180:
#line 2699 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ModuleVal = yyvsp[-1].ModuleVal; ;
    break;}
case 181:
#line 2700 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ModuleVal = yyvsp[-3].ModuleVal; ;
    break;}
case 182:
#line 2701 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ModuleVal = yyvsp[-1].ModuleVal; ;
    break;}
case 183:
#line 2702 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ModuleVal = CurModule.CurrentModule;
    // Emit an error if there are any unresolved types left.
    if (!CurModule.LateResolveTypes.empty()) {
      const ValID &DID = CurModule.LateResolveTypes.begin()->first;
      if (DID.Type == ValID::NameVal) {
        error("Reference to an undefined type: '"+DID.getName() + "'");
      } else {
        error("Reference to an undefined type: #" + itostr(DID.Num));
      }
    }
  ;
    break;}
case 184:
#line 2718 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    // Eagerly resolve types.  This is not an optimization, this is a
    // requirement that is due to the fact that we could have this:
    //
    // %list = type { %list * }
    // %list = type { %list * }    ; repeated type decl
    //
    // If types are not resolved eagerly, then the two types will not be
    // determined to be the same type!
    //
    ResolveTypeTo(yyvsp[-2].StrVal, yyvsp[0].TypeVal.PAT->get(), yyvsp[0].TypeVal.S);

    if (!setTypeName(yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) {
      // If this is a numbered type that is not a redefinition, add it to the 
      // slot table.
      CurModule.Types.push_back(yyvsp[0].TypeVal.PAT->get());
      CurModule.TypeSigns.push_back(yyvsp[0].TypeVal.S);
    }
    delete yyvsp[0].TypeVal.PAT;
  ;
    break;}
case 185:
#line 2738 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{       // Function prototypes can be in const pool
  ;
    break;}
case 186:
#line 2740 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{  // Asm blocks can be in the const pool
  ;
    break;}
case 187:
#line 2742 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[0].ConstVal.C == 0) 
      error("Global value initializer is not a constant");
    CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal.C->getType(), yyvsp[0].ConstVal.C, yyvsp[0].ConstVal.S);
  ;
    break;}
case 188:
#line 2746 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurGV = 0;
  ;
    break;}
case 189:
#line 2749 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[0].TypeVal.PAT->get();
    CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, Ty, 0,
                                yyvsp[0].TypeVal.S);
    delete yyvsp[0].TypeVal.PAT;
  ;
    break;}
case 190:
#line 2754 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurGV = 0;
  ;
    break;}
case 191:
#line 2757 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[0].TypeVal.PAT->get();
    CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::DLLImportLinkage, yyvsp[-1].BoolVal, Ty, 0,
                                yyvsp[0].TypeVal.S);
    delete yyvsp[0].TypeVal.PAT;
  ;
    break;}
case 192:
#line 2762 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurGV = 0;
  ;
    break;}
case 193:
#line 2765 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[0].TypeVal.PAT->get();
    CurGV = 
      ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalWeakLinkage, yyvsp[-1].BoolVal, Ty, 0, 
                          yyvsp[0].TypeVal.S);
    delete yyvsp[0].TypeVal.PAT;
  ;
    break;}
case 194:
#line 2771 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurGV = 0;
  ;
    break;}
case 195:
#line 2774 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ 
  ;
    break;}
case 196:
#line 2776 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
  ;
    break;}
case 197:
#line 2778 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ 
  ;
    break;}
case 198:
#line 2783 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
    char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true);
    std::string NewAsm(yyvsp[0].StrVal, EndStr);
    free(yyvsp[0].StrVal);

    if (AsmSoFar.empty())
      CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
    else
      CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
  ;
    break;}
case 199:
#line 2797 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Endianness = Module::BigEndian; ;
    break;}
case 200:
#line 2798 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Endianness = Module::LittleEndian; ;
    break;}
case 201:
#line 2802 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurModule.setEndianness(yyvsp[0].Endianness);
  ;
    break;}
case 202:
#line 2805 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[0].UInt64Val == 32)
      CurModule.setPointerSize(Module::Pointer32);
    else if (yyvsp[0].UInt64Val == 64)
      CurModule.setPointerSize(Module::Pointer64);
    else
      error("Invalid pointer size: '" + utostr(yyvsp[0].UInt64Val) + "'");
  ;
    break;}
case 203:
#line 2813 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal);
    free(yyvsp[0].StrVal);
  ;
    break;}
case 204:
#line 2817 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurModule.CurrentModule->setDataLayout(yyvsp[0].StrVal);
    free(yyvsp[0].StrVal);
  ;
    break;}
case 206:
#line 2828 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
      CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
      free(yyvsp[0].StrVal);
  ;
    break;}
case 207:
#line 2832 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
    free(yyvsp[0].StrVal);
  ;
    break;}
case 208:
#line 2836 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ ;
    break;}
case 212:
#line 2849 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.StrVal = 0; ;
    break;}
case 213:
#line 2853 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[-1].TypeVal.PAT->get() == Type::VoidTy)
      error("void typed arguments are invalid");
    yyval.ArgVal = new std::pair<PATypeInfo, char*>(yyvsp[-1].TypeVal, yyvsp[0].StrVal);
  ;
    break;}
case 214:
#line 2861 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ArgList = yyvsp[-2].ArgList;
    yyval.ArgList->push_back(*yyvsp[0].ArgVal);
    delete yyvsp[0].ArgVal;
  ;
    break;}
case 215:
#line 2866 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ArgList = new std::vector<std::pair<PATypeInfo,char*> >();
    yyval.ArgList->push_back(*yyvsp[0].ArgVal);
    delete yyvsp[0].ArgVal;
  ;
    break;}
case 216:
#line 2874 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ArgList = yyvsp[0].ArgList; ;
    break;}
case 217:
#line 2875 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ArgList = yyvsp[-2].ArgList;
    PATypeInfo VoidTI;
    VoidTI.PAT = new PATypeHolder(Type::VoidTy);
    VoidTI.S.makeSignless();
    yyval.ArgList->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
  ;
    break;}
case 218:
#line 2882 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ArgList = new std::vector<std::pair<PATypeInfo,char*> >();
    PATypeInfo VoidTI;
    VoidTI.PAT = new PATypeHolder(Type::VoidTy);
    VoidTI.S.makeSignless();
    yyval.ArgList->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
  ;
    break;}
case 219:
#line 2889 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ArgList = 0; ;
    break;}
case 220:
#line 2893 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    UnEscapeLexed(yyvsp[-5].StrVal);
    std::string FunctionName(yyvsp[-5].StrVal);
    free(yyvsp[-5].StrVal);  // Free strdup'd memory!

    const Type* RetTy = yyvsp[-6].TypeVal.PAT->get();
    
    if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
      error("LLVM functions cannot return aggregate types");

    Signedness FTySign;
    FTySign.makeComposite(yyvsp[-6].TypeVal.S);
    std::vector<const Type*> ParamTyList;

    // In LLVM 2.0 the signatures of three varargs intrinsics changed to take
    // i8*. We check here for those names and override the parameter list
    // types to ensure the prototype is correct.
    if (FunctionName == "llvm.va_start" || FunctionName == "llvm.va_end") {
      ParamTyList.push_back(PointerType::get(Type::Int8Ty));
    } else if (FunctionName == "llvm.va_copy") {
      ParamTyList.push_back(PointerType::get(Type::Int8Ty));
      ParamTyList.push_back(PointerType::get(Type::Int8Ty));
    } else if (yyvsp[-3].ArgList) {   // If there are arguments...
      for (std::vector<std::pair<PATypeInfo,char*> >::iterator 
           I = yyvsp[-3].ArgList->begin(), E = yyvsp[-3].ArgList->end(); I != E; ++I) {
        const Type *Ty = I->first.PAT->get();
        ParamTyList.push_back(Ty);
        FTySign.add(I->first.S);
      }
    }

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

    // Convert the CSRet calling convention into the corresponding parameter
    // attribute.
    ParamAttrsList *PAL = 0;
    if (yyvsp[-7].UIntVal == OldCallingConv::CSRet) {
      ParamAttrsVector Attrs;
      ParamAttrsWithIndex PAWI;
      PAWI.index = 1;  PAWI.attrs = ParamAttr::StructRet; // first arg
      Attrs.push_back(PAWI);
      PAL = ParamAttrsList::get(Attrs);
    }

    const FunctionType *FT = 
      FunctionType::get(RetTy, ParamTyList, isVarArg, PAL);
    const PointerType *PFT = PointerType::get(FT);
    delete yyvsp[-6].TypeVal.PAT;

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

    Function *Fn = 0;
    Module* M = CurModule.CurrentModule;

    // 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);
      M->getFunctionList().remove(Fn);
      M->getFunctionList().push_back(Fn);
    } else if (!FunctionName.empty()) {
      GlobalValue *Conflict = M->getFunction(FunctionName);
      if (!Conflict)
        Conflict = M->getNamedGlobal(FunctionName);
      if (Conflict && PFT == Conflict->getType()) {
        if (!CurFun.isDeclare && !Conflict->isDeclaration()) {
          // We have two function definitions that conflict, same type, same
          // name. We should really check to make sure that this is the result
          // of integer type planes collapsing and generate an error if it is
          // not, but we'll just rename on the assumption that it is. However,
          // let's do it intelligently and rename the internal linkage one
          // if there is one.
          std::string NewName(makeNameUnique(FunctionName));
          if (Conflict->hasInternalLinkage()) {
            Conflict->setName(NewName);
            RenameMapKey Key = 
              makeRenameMapKey(FunctionName, Conflict->getType(), ID.S);
            CurModule.RenameMap[Key] = NewName;
            Fn = new Function(FT, CurFun.Linkage, FunctionName, M);
            InsertValue(Fn, CurModule.Values);
          } else {
            Fn = new Function(FT, CurFun.Linkage, NewName, M);
            InsertValue(Fn, CurModule.Values);
            RenameMapKey Key = 
              makeRenameMapKey(FunctionName, PFT, ID.S);
            CurModule.RenameMap[Key] = NewName;
          }
        } else {
          // If they are not both definitions, then just use the function we
          // found since the types are the same.
          Fn = cast<Function>(Conflict);

          // Make sure to strip off any argument names so we can't get 
          // conflicts.
          if (Fn->isDeclaration())
            for (Function::arg_iterator AI = Fn->arg_begin(), 
                 AE = Fn->arg_end(); AI != AE; ++AI)
              AI->setName("");
        }
      } else if (Conflict) {
        // We have two globals with the same name and different types. 
        // Previously, this was permitted because the symbol table had 
        // "type planes" and names only needed to be distinct within a 
        // type plane. After PR411 was fixed, this is no loner the case. 
        // To resolve this we must rename one of the two. 
        if (Conflict->hasInternalLinkage()) {
          // We can safely rename the Conflict.
          RenameMapKey Key = 
            makeRenameMapKey(Conflict->getName(), Conflict->getType(), 
              CurModule.NamedValueSigns[Conflict->getName()]);
          Conflict->setName(makeNameUnique(Conflict->getName()));
          CurModule.RenameMap[Key] = Conflict->getName();
          Fn = new Function(FT, CurFun.Linkage, FunctionName, M);
          InsertValue(Fn, CurModule.Values);
        } else { 
          // We can't quietly rename either of these things, but we must
          // rename one of them. Only if the function's linkage is internal can
          // we forgo a warning message about the renamed function. 
          std::string NewName = makeNameUnique(FunctionName);
          if (CurFun.Linkage != GlobalValue::InternalLinkage) {
            warning("Renaming function '" + FunctionName + "' as '" + NewName +
                    "' may cause linkage errors");
          }
          // Elect to rename the thing we're now defining.
          Fn = new Function(FT, CurFun.Linkage, NewName, M);
          InsertValue(Fn, CurModule.Values);
          RenameMapKey Key = makeRenameMapKey(FunctionName, PFT, ID.S);
          CurModule.RenameMap[Key] = NewName;
        } 
      } else {
        // There's no conflict, just define the function
        Fn = new Function(FT, CurFun.Linkage, FunctionName, M);
        InsertValue(Fn, CurModule.Values);
      }
    } else {
      // There's no conflict, just define the function
      Fn = new Function(FT, CurFun.Linkage, FunctionName, M);
      InsertValue(Fn, CurModule.Values);
    }


    CurFun.FunctionStart(Fn);

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

    // Add all of the arguments we parsed to the function...
    if (yyvsp[-3].ArgList) {                     // Is null if empty...
      if (isVarArg) {  // Nuke the last entry
        assert(yyvsp[-3].ArgList->back().first.PAT->get() == Type::VoidTy && 
               yyvsp[-3].ArgList->back().second == 0 && "Not a varargs marker");
        delete yyvsp[-3].ArgList->back().first.PAT;
        yyvsp[-3].ArgList->pop_back();  // Delete the last entry
      }
      Function::arg_iterator ArgIt = Fn->arg_begin();
      Function::arg_iterator ArgEnd = Fn->arg_end();
      std::vector<std::pair<PATypeInfo,char*> >::iterator I = yyvsp[-3].ArgList->begin();
      std::vector<std::pair<PATypeInfo,char*> >::iterator E = yyvsp[-3].ArgList->end();
      for ( ; I != E && ArgIt != ArgEnd; ++I, ++ArgIt) {
        delete I->first.PAT;                      // Delete the typeholder...
        ValueInfo VI; VI.V = ArgIt; VI.S.copy(I->first.S); 
        setValueName(VI, I->second);           // Insert arg into symtab...
        InsertValue(ArgIt);
      }
      delete yyvsp[-3].ArgList;                     // We're now done with the argument list
    }
    lastCallingConv = OldCallingConv::C;
  ;
    break;}
case 223:
#line 3087 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ CurFun.Linkage = yyvsp[0].Linkage; ;
    break;}
case 224:
#line 3087 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.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);
  ;
    break;}
case 227:
#line 3101 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.FunctionVal = yyvsp[-1].FunctionVal;
  ;
    break;}
case 228:
#line 3106 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
    break;}
case 229:
#line 3107 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::DLLImportLinkage; ;
    break;}
case 230:
#line 3108 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
    break;}
case 231:
#line 3112 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ CurFun.isDeclare = true; ;
    break;}
case 232:
#line 3113 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ CurFun.Linkage = yyvsp[0].Linkage; ;
    break;}
case 233:
#line 3113 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.FunctionVal = CurFun.CurrentFunction;
    CurFun.FunctionDone();
    
  ;
    break;}
case 234:
#line 3125 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.BoolVal = false; ;
    break;}
case 235:
#line 3126 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.BoolVal = true; ;
    break;}
case 236:
#line 3131 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); ;
    break;}
case 237:
#line 3132 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); ;
    break;}
case 238:
#line 3133 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); ;
    break;}
case 239:
#line 3134 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ 
    yyval.ValIDVal = ValID::create(ConstantInt::get(Type::Int1Ty, true));
    yyval.ValIDVal.S.makeUnsigned();
  ;
    break;}
case 240:
#line 3138 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ 
    yyval.ValIDVal = ValID::create(ConstantInt::get(Type::Int1Ty, false)); 
    yyval.ValIDVal.S.makeUnsigned();
  ;
    break;}
case 241:
#line 3142 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValIDVal = ValID::createNull(); ;
    break;}
case 242:
#line 3143 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValIDVal = ValID::createUndef(); ;
    break;}
case 243:
#line 3144 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValIDVal = ValID::createZeroInit(); ;
    break;}
case 244:
#line 3145 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ // Nonempty unsized packed vector
    const Type *ETy = (*yyvsp[-1].ConstVector)[0].C->getType();
    int NumElements = yyvsp[-1].ConstVector->size(); 
    VectorType* pt = VectorType::get(ETy, NumElements);
    yyval.ValIDVal.S.makeComposite((*yyvsp[-1].ConstVector)[0].S);
    PATypeHolder* PTy = new PATypeHolder(HandleUpRefs(pt, yyval.ValIDVal.S));
    
    // Verify all elements are correct type!
    std::vector<Constant*> Elems;
    for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
      Constant *C = (*yyvsp[-1].ConstVector)[i].C;
      const Type *CTy = C->getType();
      if (ETy != CTy)
        error("Element #" + utostr(i) + " is not of type '" + 
              ETy->getDescription() +"' as required!\nIt is of type '" +
              CTy->getDescription() + "'");
      Elems.push_back(C);
    }
    yyval.ValIDVal = ValID::create(ConstantVector::get(pt, Elems));
    delete PTy; delete yyvsp[-1].ConstVector;
  ;
    break;}
case 245:
#line 3166 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal.C);
    yyval.ValIDVal.S.copy(yyvsp[0].ConstVal.S);
  ;
    break;}
case 246:
#line 3170 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    char *End = UnEscapeLexed(yyvsp[-2].StrVal, true);
    std::string AsmStr = std::string(yyvsp[-2].StrVal, End);
    End = UnEscapeLexed(yyvsp[0].StrVal, true);
    std::string Constraints = std::string(yyvsp[0].StrVal, End);
    yyval.ValIDVal = ValID::createInlineAsm(AsmStr, Constraints, yyvsp[-3].BoolVal);
    free(yyvsp[-2].StrVal);
    free(yyvsp[0].StrVal);
  ;
    break;}
case 247:
#line 3184 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{  yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); yyval.ValIDVal.S.makeSignless(); ;
    break;}
case 248:
#line 3185 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{  yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); yyval.ValIDVal.S.makeSignless(); ;
    break;}
case 251:
#line 3198 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ 
    const Type *Ty = yyvsp[-1].TypeVal.PAT->get();
    yyvsp[0].ValIDVal.S.copy(yyvsp[-1].TypeVal.S);
    yyval.ValueVal.V = getVal(Ty, yyvsp[0].ValIDVal); 
    yyval.ValueVal.S.copy(yyvsp[-1].TypeVal.S);
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 252:
#line 3208 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.FunctionVal = yyvsp[-1].FunctionVal;
  ;
    break;}
case 253:
#line 3211 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ // Do not allow functions with 0 basic blocks   
    yyval.FunctionVal = yyvsp[-1].FunctionVal;
  ;
    break;}
case 254:
#line 3220 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    ValueInfo VI; VI.V = yyvsp[0].TermInstVal.TI; VI.S.copy(yyvsp[0].TermInstVal.S);
    setValueName(VI, yyvsp[-1].StrVal);
    InsertValue(yyvsp[0].TermInstVal.TI);
    yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal.TI);
    InsertValue(yyvsp[-2].BasicBlockVal);
    yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal;
  ;
    break;}
case 255:
#line 3231 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (yyvsp[0].InstVal.I)
      yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal.I);
    yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal;
  ;
    break;}
case 256:
#line 3236 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.BasicBlockVal = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++),true);
    // Make sure to move the basic block to the correct location in the
    // function, instead of leaving it inserted wherever it was first
    // referenced.
    Function::BasicBlockListType &BBL = 
      CurFun.CurrentFunction->getBasicBlockList();
    BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal);
  ;
    break;}
case 257:
#line 3245 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.BasicBlockVal = CurBB = getBBVal(ValID::create(yyvsp[0].StrVal), true);
    // Make sure to move the basic block to the correct location in the
    // function, instead of leaving it inserted wherever it was first
    // referenced.
    Function::BasicBlockListType &BBL = 
      CurFun.CurrentFunction->getBasicBlockList();
    BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal);
  ;
    break;}
case 260:
#line 3259 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{              // Return with a result...
    yyval.TermInstVal.TI = new ReturnInst(yyvsp[0].ValueVal.V);
    yyval.TermInstVal.S.makeSignless();
  ;
    break;}
case 261:
#line 3263 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                                       // Return with no result...
    yyval.TermInstVal.TI = new ReturnInst();
    yyval.TermInstVal.S.makeSignless();
  ;
    break;}
case 262:
#line 3267 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{                         // Unconditional Branch...
    BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
    yyval.TermInstVal.TI = new BranchInst(tmpBB);
    yyval.TermInstVal.S.makeSignless();
  ;
    break;}
case 263:
#line 3272 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{  
    yyvsp[-3].ValIDVal.S.makeSignless();
    yyvsp[0].ValIDVal.S.makeSignless();
    BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal);
    BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal);
    yyvsp[-6].ValIDVal.S.makeUnsigned();
    Value* tmpVal = getVal(Type::Int1Ty, yyvsp[-6].ValIDVal);
    yyval.TermInstVal.TI = new BranchInst(tmpBBA, tmpBBB, tmpVal);
    yyval.TermInstVal.S.makeSignless();
  ;
    break;}
case 264:
#line 3282 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[-6].ValIDVal.S.copy(yyvsp[-7].PrimType.S);
    Value* tmpVal = getVal(yyvsp[-7].PrimType.T, yyvsp[-6].ValIDVal);
    yyvsp[-3].ValIDVal.S.makeSignless();
    BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal);
    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, yyvsp[-1].JumpTable->size());
    yyval.TermInstVal.TI = S;
    yyval.TermInstVal.S.makeSignless();
    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
        error("Switch case is constant, but not a simple integer");
    }
    delete yyvsp[-1].JumpTable;
  ;
    break;}
case 265:
#line 3300 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[-5].ValIDVal.S.copy(yyvsp[-6].PrimType.S);
    Value* tmpVal = getVal(yyvsp[-6].PrimType.T, yyvsp[-5].ValIDVal);
    yyvsp[-2].ValIDVal.S.makeSignless();
    BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal);
    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
    yyval.TermInstVal.TI = S;
    yyval.TermInstVal.S.makeSignless();
  ;
    break;}
case 266:
#line 3310 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const PointerType *PFTy;
    const FunctionType *Ty;
    Signedness FTySign;

    if (!(PFTy = dyn_cast<PointerType>(yyvsp[-10].TypeVal.PAT->get())) ||
        !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
      // Pull out the types of all of the arguments...
      std::vector<const Type*> ParamTypes;
      FTySign.makeComposite(yyvsp[-10].TypeVal.S);
      if (yyvsp[-7].ValueList) {
        for (std::vector<ValueInfo>::iterator I = yyvsp[-7].ValueList->begin(), E = yyvsp[-7].ValueList->end();
             I != E; ++I) {
          ParamTypes.push_back((*I).V->getType());
          FTySign.add(I->S);
        }
      }
      ParamAttrsList *PAL = 0;
      if (yyvsp[-11].UIntVal == OldCallingConv::CSRet) {
        ParamAttrsVector Attrs;
        ParamAttrsWithIndex PAWI;
        PAWI.index = 1;  PAWI.attrs = ParamAttr::StructRet; // first arg
        Attrs.push_back(PAWI);
        PAL = ParamAttrsList::get(Attrs);
      }
      bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
      if (isVarArg) ParamTypes.pop_back();
      Ty = FunctionType::get(yyvsp[-10].TypeVal.PAT->get(), ParamTypes, isVarArg, PAL);
      PFTy = PointerType::get(Ty);
      yyval.TermInstVal.S.copy(yyvsp[-10].TypeVal.S);
    } else {
      FTySign = yyvsp[-10].TypeVal.S;
      // Get the signedness of the result type. $3 is the pointer to the
      // function type so we get the 0th element to extract the function type,
      // and then the 0th element again to get the result type.
      yyval.TermInstVal.S.copy(yyvsp[-10].TypeVal.S.get(0).get(0)); 
    }

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

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

      std::vector<Value*> Args;
      for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
        if ((*ArgI).V->getType() != *I)
          error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
                (*I)->getDescription() + "'");
        Args.push_back((*ArgI).V);
      }

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

      yyval.TermInstVal.TI = new InvokeInst(V, Normal, Except, Args.begin(), Args.end());
    }
    cast<InvokeInst>(yyval.TermInstVal.TI)->setCallingConv(upgradeCallingConv(yyvsp[-11].UIntVal));
    delete yyvsp[-10].TypeVal.PAT;
    delete yyvsp[-7].ValueList;
    lastCallingConv = OldCallingConv::C;
  ;
    break;}
case 267:
#line 3383 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.TermInstVal.TI = new UnwindInst();
    yyval.TermInstVal.S.makeSignless();
  ;
    break;}
case 268:
#line 3387 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.TermInstVal.TI = new UnreachableInst();
    yyval.TermInstVal.S.makeSignless();
  ;
    break;}
case 269:
#line 3394 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.JumpTable = yyvsp[-5].JumpTable;
    yyvsp[-3].ValIDVal.S.copy(yyvsp[-4].PrimType.S);
    Constant *V = cast<Constant>(getExistingValue(yyvsp[-4].PrimType.T, yyvsp[-3].ValIDVal));
    
    if (V == 0)
      error("May only switch on a constant pool value");

    yyvsp[0].ValIDVal.S.makeSignless();
    BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
    yyval.JumpTable->push_back(std::make_pair(V, tmpBB));
  ;
    break;}
case 270:
#line 3406 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.JumpTable = new std::vector<std::pair<Constant*, BasicBlock*> >();
    yyvsp[-3].ValIDVal.S.copy(yyvsp[-4].PrimType.S);
    Constant *V = cast<Constant>(getExistingValue(yyvsp[-4].PrimType.T, yyvsp[-3].ValIDVal));

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

    yyvsp[0].ValIDVal.S.makeSignless();
    BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
    yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); 
  ;
    break;}
case 271:
#line 3421 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    bool omit = false;
    if (yyvsp[-1].StrVal)
      if (BitCastInst *BCI = dyn_cast<BitCastInst>(yyvsp[0].InstVal.I))
        if (BCI->getSrcTy() == BCI->getDestTy() && 
            BCI->getOperand(0)->getName() == yyvsp[-1].StrVal)
          // This is a useless bit cast causing a name redefinition. It is
          // a bit cast from a type to the same type of an operand with the
          // same name as the name we would give this instruction. Since this
          // instruction results in no code generation, it is safe to omit
          // the instruction. This situation can occur because of collapsed
          // type planes. For example:
          //   %X = add int %Y, %Z
          //   %X = cast int %Y to uint
          // After upgrade, this looks like:
          //   %X = add i32 %Y, %Z
          //   %X = bitcast i32 to i32
          // The bitcast is clearly useless so we omit it.
          omit = true;
    if (omit) {
      yyval.InstVal.I = 0;
      yyval.InstVal.S.makeSignless();
    } else {
      ValueInfo VI; VI.V = yyvsp[0].InstVal.I; VI.S.copy(yyvsp[0].InstVal.S);
      setValueName(VI, yyvsp[-1].StrVal);
      InsertValue(yyvsp[0].InstVal.I);
      yyval.InstVal = yyvsp[0].InstVal;
    }
  ;
    break;}
case 272:
#line 3451 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{    // Used for PHI nodes
    yyval.PHIList.P = new std::list<std::pair<Value*, BasicBlock*> >();
    yyval.PHIList.S.copy(yyvsp[-5].TypeVal.S);
    yyvsp[-3].ValIDVal.S.copy(yyvsp[-5].TypeVal.S);
    Value* tmpVal = getVal(yyvsp[-5].TypeVal.PAT->get(), yyvsp[-3].ValIDVal);
    yyvsp[-1].ValIDVal.S.makeSignless();
    BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal);
    yyval.PHIList.P->push_back(std::make_pair(tmpVal, tmpBB));
    delete yyvsp[-5].TypeVal.PAT;
  ;
    break;}
case 273:
#line 3461 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.PHIList = yyvsp[-6].PHIList;
    yyvsp[-3].ValIDVal.S.copy(yyvsp[-6].PHIList.S);
    Value* tmpVal = getVal(yyvsp[-6].PHIList.P->front().first->getType(), yyvsp[-3].ValIDVal);
    yyvsp[-1].ValIDVal.S.makeSignless();
    BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal);
    yyvsp[-6].PHIList.P->push_back(std::make_pair(tmpVal, tmpBB));
  ;
    break;}
case 274:
#line 3471 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{    // Used for call statements, and memory insts...
    yyval.ValueList = new std::vector<ValueInfo>();
    yyval.ValueList->push_back(yyvsp[0].ValueVal);
  ;
    break;}
case 275:
#line 3475 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.ValueList = yyvsp[-2].ValueList;
    yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal);
  ;
    break;}
case 277:
#line 3483 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValueList = 0; ;
    break;}
case 278:
#line 3487 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.BoolVal = true;
  ;
    break;}
case 279:
#line 3490 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.BoolVal = false;
  ;
    break;}
case 280:
#line 3496 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[-2].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    yyvsp[0].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    const Type* Ty = yyvsp[-3].TypeVal.PAT->get();
    if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa<VectorType>(Ty))
      error("Arithmetic operator requires integer, FP, or packed operands");
    if (isa<VectorType>(Ty) && 
        (yyvsp[-4].BinaryOpVal == URemOp || yyvsp[-4].BinaryOpVal == SRemOp || yyvsp[-4].BinaryOpVal == FRemOp || yyvsp[-4].BinaryOpVal == RemOp))
      error("Remainder not supported on vector types");
    // Upgrade the opcode from obsolete versions before we do anything with it.
    Instruction::BinaryOps Opcode = getBinaryOp(yyvsp[-4].BinaryOpVal, Ty, yyvsp[-3].TypeVal.S);
    Value* val1 = getVal(Ty, yyvsp[-2].ValIDVal); 
    Value* val2 = getVal(Ty, yyvsp[0].ValIDVal);
    yyval.InstVal.I = BinaryOperator::create(Opcode, val1, val2);
    if (yyval.InstVal.I == 0)
      error("binary operator returned null");
    yyval.InstVal.S.copy(yyvsp[-3].TypeVal.S);
    delete yyvsp[-3].TypeVal.PAT;
  ;
    break;}
case 281:
#line 3515 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[-2].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    yyvsp[0].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    const Type *Ty = yyvsp[-3].TypeVal.PAT->get();
    if (!Ty->isInteger()) {
      if (!isa<VectorType>(Ty) ||
          !cast<VectorType>(Ty)->getElementType()->isInteger())
        error("Logical operator requires integral operands");
    }
    Instruction::BinaryOps Opcode = getBinaryOp(yyvsp[-4].BinaryOpVal, Ty, yyvsp[-3].TypeVal.S);
    Value* tmpVal1 = getVal(Ty, yyvsp[-2].ValIDVal);
    Value* tmpVal2 = getVal(Ty, yyvsp[0].ValIDVal);
    yyval.InstVal.I = BinaryOperator::create(Opcode, tmpVal1, tmpVal2);
    if (yyval.InstVal.I == 0)
      error("binary operator returned null");
    yyval.InstVal.S.copy(yyvsp[-3].TypeVal.S);
    delete yyvsp[-3].TypeVal.PAT;
  ;
    break;}
case 282:
#line 3533 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[-2].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    yyvsp[0].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    const Type* Ty = yyvsp[-3].TypeVal.PAT->get();
    if(isa<VectorType>(Ty))
      error("VectorTypes currently not supported in setcc instructions");
    unsigned short pred;
    Instruction::OtherOps Opcode = getCompareOp(yyvsp[-4].BinaryOpVal, pred, Ty, yyvsp[-3].TypeVal.S);
    Value* tmpVal1 = getVal(Ty, yyvsp[-2].ValIDVal);
    Value* tmpVal2 = getVal(Ty, yyvsp[0].ValIDVal);
    yyval.InstVal.I = CmpInst::create(Opcode, pred, tmpVal1, tmpVal2);
    if (yyval.InstVal.I == 0)
      error("binary operator returned null");
    yyval.InstVal.S.makeUnsigned();
    delete yyvsp[-3].TypeVal.PAT;
  ;
    break;}
case 283:
#line 3549 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[-2].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    yyvsp[0].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    const Type *Ty = yyvsp[-3].TypeVal.PAT->get();
    if (isa<VectorType>(Ty)) 
      error("VectorTypes currently not supported in icmp instructions");
    else if (!Ty->isInteger() && !isa<PointerType>(Ty))
      error("icmp requires integer or pointer typed operands");
    Value* tmpVal1 = getVal(Ty, yyvsp[-2].ValIDVal);
    Value* tmpVal2 = getVal(Ty, yyvsp[0].ValIDVal);
    yyval.InstVal.I = new ICmpInst(yyvsp[-4].IPred, tmpVal1, tmpVal2);
    yyval.InstVal.S.makeUnsigned();
    delete yyvsp[-3].TypeVal.PAT;
  ;
    break;}
case 284:
#line 3563 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[-2].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    yyvsp[0].ValIDVal.S.copy(yyvsp[-3].TypeVal.S);
    const Type *Ty = yyvsp[-3].TypeVal.PAT->get();
    if (isa<VectorType>(Ty))
      error("VectorTypes currently not supported in fcmp instructions");
    else if (!Ty->isFloatingPoint())
      error("fcmp instruction requires floating point operands");
    Value* tmpVal1 = getVal(Ty, yyvsp[-2].ValIDVal);
    Value* tmpVal2 = getVal(Ty, yyvsp[0].ValIDVal);
    yyval.InstVal.I = new FCmpInst(yyvsp[-4].FPred, tmpVal1, tmpVal2);
    yyval.InstVal.S.makeUnsigned();
    delete yyvsp[-3].TypeVal.PAT;
  ;
    break;}
case 285:
#line 3577 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    warning("Use of obsolete 'not' instruction: Replacing with 'xor");
    const Type *Ty = yyvsp[0].ValueVal.V->getType();
    Value *Ones = ConstantInt::getAllOnesValue(Ty);
    if (Ones == 0)
      error("Expected integral type for not instruction");
    yyval.InstVal.I = BinaryOperator::create(Instruction::Xor, yyvsp[0].ValueVal.V, Ones);
    if (yyval.InstVal.I == 0)
      error("Could not create a xor instruction");
    yyval.InstVal.S.copy(yyvsp[0].ValueVal.S);
  ;
    break;}
case 286:
#line 3588 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!yyvsp[0].ValueVal.V->getType()->isInteger() ||
        cast<IntegerType>(yyvsp[0].ValueVal.V->getType())->getBitWidth() != 8)
      error("Shift amount must be int8");
    const Type* Ty = yyvsp[-2].ValueVal.V->getType();
    if (!Ty->isInteger())
      error("Shift constant expression requires integer operand");
    Value* ShiftAmt = 0;
    if (cast<IntegerType>(Ty)->getBitWidth() > Type::Int8Ty->getBitWidth())
      if (Constant *C = dyn_cast<Constant>(yyvsp[0].ValueVal.V))
        ShiftAmt = ConstantExpr::getZExt(C, Ty);
      else
        ShiftAmt = new ZExtInst(yyvsp[0].ValueVal.V, Ty, makeNameUnique("shift"), CurBB);
    else
      ShiftAmt = yyvsp[0].ValueVal.V;
    yyval.InstVal.I = BinaryOperator::create(getBinaryOp(yyvsp[-3].BinaryOpVal, Ty, yyvsp[-2].ValueVal.S), yyvsp[-2].ValueVal.V, ShiftAmt);
    yyval.InstVal.S.copy(yyvsp[-2].ValueVal.S);
  ;
    break;}
case 287:
#line 3606 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *DstTy = yyvsp[0].TypeVal.PAT->get();
    if (!DstTy->isFirstClassType())
      error("cast instruction to a non-primitive type: '" +
            DstTy->getDescription() + "'");
    yyval.InstVal.I = cast<Instruction>(getCast(yyvsp[-3].CastOpVal, yyvsp[-2].ValueVal.V, yyvsp[-2].ValueVal.S, DstTy, yyvsp[0].TypeVal.S, true));
    yyval.InstVal.S.copy(yyvsp[0].TypeVal.S);
    delete yyvsp[0].TypeVal.PAT;
  ;
    break;}
case 288:
#line 3615 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!yyvsp[-4].ValueVal.V->getType()->isInteger() ||
        cast<IntegerType>(yyvsp[-4].ValueVal.V->getType())->getBitWidth() != 1)
      error("select condition must be bool");
    if (yyvsp[-2].ValueVal.V->getType() != yyvsp[0].ValueVal.V->getType())
      error("select value types should match");
    yyval.InstVal.I = new SelectInst(yyvsp[-4].ValueVal.V, yyvsp[-2].ValueVal.V, yyvsp[0].ValueVal.V);
    yyval.InstVal.S.copy(yyvsp[-2].ValueVal.S);
  ;
    break;}
case 289:
#line 3624 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[0].TypeVal.PAT->get();
    NewVarArgs = true;
    yyval.InstVal.I = new VAArgInst(yyvsp[-2].ValueVal.V, Ty);
    yyval.InstVal.S.copy(yyvsp[0].TypeVal.S);
    delete yyvsp[0].TypeVal.PAT;
  ;
    break;}
case 290:
#line 3631 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type* ArgTy = yyvsp[-2].ValueVal.V->getType();
    const Type* DstTy = yyvsp[0].TypeVal.PAT->get();
    ObsoleteVarArgs = true;
    Function* NF = cast<Function>(CurModule.CurrentModule->
      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));

    //b = vaarg a, t -> 
    //foo = alloca 1 of t
    //bar = vacopy a 
    //store bar -> foo
    //b = vaarg foo, t
    AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix");
    CurBB->getInstList().push_back(foo);
    CallInst* bar = new CallInst(NF, yyvsp[-2].ValueVal.V);
    CurBB->getInstList().push_back(bar);
    CurBB->getInstList().push_back(new StoreInst(bar, foo));
    yyval.InstVal.I = new VAArgInst(foo, DstTy);
    yyval.InstVal.S.copy(yyvsp[0].TypeVal.S);
    delete yyvsp[0].TypeVal.PAT;
  ;
    break;}
case 291:
#line 3652 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type* ArgTy = yyvsp[-2].ValueVal.V->getType();
    const Type* DstTy = yyvsp[0].TypeVal.PAT->get();
    ObsoleteVarArgs = true;
    Function* NF = cast<Function>(CurModule.CurrentModule->
      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));

    //b = vanext a, t ->
    //foo = alloca 1 of t
    //bar = vacopy a
    //store bar -> foo
    //tmp = vaarg foo, t
    //b = load foo
    AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix");
    CurBB->getInstList().push_back(foo);
    CallInst* bar = new CallInst(NF, yyvsp[-2].ValueVal.V);
    CurBB->getInstList().push_back(bar);
    CurBB->getInstList().push_back(new StoreInst(bar, foo));
    Instruction* tmp = new VAArgInst(foo, DstTy);
    CurBB->getInstList().push_back(tmp);
    yyval.InstVal.I = new LoadInst(foo);
    yyval.InstVal.S.copy(yyvsp[0].TypeVal.S);
    delete yyvsp[0].TypeVal.PAT;
  ;
    break;}
case 292:
#line 3676 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!ExtractElementInst::isValidOperands(yyvsp[-2].ValueVal.V, yyvsp[0].ValueVal.V))
      error("Invalid extractelement operands");
    yyval.InstVal.I = new ExtractElementInst(yyvsp[-2].ValueVal.V, yyvsp[0].ValueVal.V);
    yyval.InstVal.S.copy(yyvsp[-2].ValueVal.S.get(0));
  ;
    break;}
case 293:
#line 3682 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal.V, yyvsp[-2].ValueVal.V, yyvsp[0].ValueVal.V))
      error("Invalid insertelement operands");
    yyval.InstVal.I = new InsertElementInst(yyvsp[-4].ValueVal.V, yyvsp[-2].ValueVal.V, yyvsp[0].ValueVal.V);
    yyval.InstVal.S.copy(yyvsp[-4].ValueVal.S);
  ;
    break;}
case 294:
#line 3688 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    if (!ShuffleVectorInst::isValidOperands(yyvsp[-4].ValueVal.V, yyvsp[-2].ValueVal.V, yyvsp[0].ValueVal.V))
      error("Invalid shufflevector operands");
    yyval.InstVal.I = new ShuffleVectorInst(yyvsp[-4].ValueVal.V, yyvsp[-2].ValueVal.V, yyvsp[0].ValueVal.V);
    yyval.InstVal.S.copy(yyvsp[-4].ValueVal.S);
  ;
    break;}
case 295:
#line 3694 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[0].PHIList.P->front().first->getType();
    if (!Ty->isFirstClassType())
      error("PHI node operands must be of first class type");
    PHINode *PHI = new PHINode(Ty);
    PHI->reserveOperandSpace(yyvsp[0].PHIList.P->size());
    while (yyvsp[0].PHIList.P->begin() != yyvsp[0].PHIList.P->end()) {
      if (yyvsp[0].PHIList.P->front().first->getType() != Ty) 
        error("All elements of a PHI node must be of the same type");
      PHI->addIncoming(yyvsp[0].PHIList.P->front().first, yyvsp[0].PHIList.P->front().second);
      yyvsp[0].PHIList.P->pop_front();
    }
    yyval.InstVal.I = PHI;
    yyval.InstVal.S.copy(yyvsp[0].PHIList.S);
    delete yyvsp[0].PHIList.P;  // Free the list...
  ;
    break;}
case 296:
#line 3710 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    // Handle the short call syntax
    const PointerType *PFTy;
    const FunctionType *FTy;
    Signedness FTySign;
    if (!(PFTy = dyn_cast<PointerType>(yyvsp[-4].TypeVal.PAT->get())) ||
        !(FTy = dyn_cast<FunctionType>(PFTy->getElementType()))) {
      // Pull out the types of all of the arguments...
      std::vector<const Type*> ParamTypes;
      FTySign.makeComposite(yyvsp[-4].TypeVal.S);
      if (yyvsp[-1].ValueList) {
        for (std::vector<ValueInfo>::iterator I = yyvsp[-1].ValueList->begin(), E = yyvsp[-1].ValueList->end();
             I != E; ++I) {
          ParamTypes.push_back((*I).V->getType());
          FTySign.add(I->S);
        }
      }

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

      const Type *RetTy = yyvsp[-4].TypeVal.PAT->get();
      if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
        error("Functions cannot return aggregate types");

      // Deal with CSRetCC
      ParamAttrsList *PAL = 0;
      if (yyvsp[-5].UIntVal == OldCallingConv::CSRet) {
        ParamAttrsVector Attrs;
        ParamAttrsWithIndex PAWI;
        PAWI.index = 1;  PAWI.attrs = ParamAttr::StructRet; // first arg
        Attrs.push_back(PAWI);
        PAL = ParamAttrsList::get(Attrs);
      }

      FTy = FunctionType::get(RetTy, ParamTypes, isVarArg, PAL);
      PFTy = PointerType::get(FTy);
      yyval.InstVal.S.copy(yyvsp[-4].TypeVal.S);
    } else {
      FTySign = yyvsp[-4].TypeVal.S;
      // Get the signedness of the result type. $3 is the pointer to the
      // function type so we get the 0th element to extract the function type,
      // and then the 0th element again to get the result type.
      yyval.InstVal.S.copy(yyvsp[-4].TypeVal.S.get(0).get(0)); 
    }
    yyvsp[-3].ValIDVal.S.makeComposite(FTySign);

    // First upgrade any intrinsic calls.
    std::vector<Value*> Args;
    if (yyvsp[-1].ValueList)
      for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i < e; ++i) 
        Args.push_back((*yyvsp[-1].ValueList)[i].V);
    Instruction *Inst = upgradeIntrinsicCall(FTy->getReturnType(), yyvsp[-3].ValIDVal, Args);

    // If we got an upgraded intrinsic
    if (Inst) {
      yyval.InstVal.I = Inst;
    } else {
      // Get the function we're calling
      Value *V = getVal(PFTy, yyvsp[-3].ValIDVal);

      // Check the argument values match
      if (!yyvsp[-1].ValueList) {                                   // Has no arguments?
        // Make sure no arguments is a good thing!
        if (FTy->getNumParams() != 0)
          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 = FTy->param_begin();
        FunctionType::param_iterator E = FTy->param_end();
        std::vector<ValueInfo>::iterator ArgI = yyvsp[-1].ValueList->begin(), ArgE = yyvsp[-1].ValueList->end();

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

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

      // Create the call instruction
      CallInst *CI = new CallInst(V, Args.begin(), Args.end());
      CI->setTailCall(yyvsp[-6].BoolVal);
      CI->setCallingConv(upgradeCallingConv(yyvsp[-5].UIntVal));
      yyval.InstVal.I = CI;
    }
    delete yyvsp[-4].TypeVal.PAT;
    delete yyvsp[-1].ValueList;
    lastCallingConv = OldCallingConv::C;
  ;
    break;}
case 297:
#line 3803 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyval.InstVal = yyvsp[0].InstVal;
  ;
    break;}
case 298:
#line 3811 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValueList = yyvsp[0].ValueList; ;
    break;}
case 299:
#line 3812 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.ValueList = new std::vector<ValueInfo>(); ;
    break;}
case 300:
#line 3816 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.BoolVal = true; ;
    break;}
case 301:
#line 3817 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{ yyval.BoolVal = false; ;
    break;}
case 302:
#line 3821 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[-1].TypeVal.PAT->get();
    yyval.InstVal.S.makeComposite(yyvsp[-1].TypeVal.S);
    yyval.InstVal.I = new MallocInst(Ty, 0, yyvsp[0].UIntVal);
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 303:
#line 3827 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[-4].TypeVal.PAT->get();
    yyvsp[-1].ValIDVal.S.makeUnsigned();
    yyval.InstVal.S.makeComposite(yyvsp[-4].TypeVal.S);
    yyval.InstVal.I = new MallocInst(Ty, getVal(yyvsp[-2].PrimType.T, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal);
    delete yyvsp[-4].TypeVal.PAT;
  ;
    break;}
case 304:
#line 3834 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[-1].TypeVal.PAT->get();
    yyval.InstVal.S.makeComposite(yyvsp[-1].TypeVal.S);
    yyval.InstVal.I = new AllocaInst(Ty, 0, yyvsp[0].UIntVal);
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 305:
#line 3840 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *Ty = yyvsp[-4].TypeVal.PAT->get();
    yyvsp[-1].ValIDVal.S.makeUnsigned();
    yyval.InstVal.S.makeComposite(yyvsp[-2].PrimType.S);
    yyval.InstVal.I = new AllocaInst(Ty, getVal(yyvsp[-2].PrimType.T, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal);
    delete yyvsp[-4].TypeVal.PAT;
  ;
    break;}
case 306:
#line 3847 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type *PTy = yyvsp[0].ValueVal.V->getType();
    if (!isa<PointerType>(PTy))
      error("Trying to free nonpointer type '" + PTy->getDescription() + "'");
    yyval.InstVal.I = new FreeInst(yyvsp[0].ValueVal.V);
    yyval.InstVal.S.makeSignless();
  ;
    break;}
case 307:
#line 3854 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    const Type* Ty = yyvsp[-1].TypeVal.PAT->get();
    yyvsp[0].ValIDVal.S.copy(yyvsp[-1].TypeVal.S);
    if (!isa<PointerType>(Ty))
      error("Can't load from nonpointer type: " + Ty->getDescription());
    if (!cast<PointerType>(Ty)->getElementType()->isFirstClassType())
      error("Can't load from pointer of non-first-class type: " +
                     Ty->getDescription());
    Value* tmpVal = getVal(Ty, yyvsp[0].ValIDVal);
    yyval.InstVal.I = new LoadInst(tmpVal, "", yyvsp[-3].BoolVal);
    yyval.InstVal.S.copy(yyvsp[-1].TypeVal.S.get(0));
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 308:
#line 3867 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[0].ValIDVal.S.copy(yyvsp[-1].TypeVal.S);
    const PointerType *PTy = dyn_cast<PointerType>(yyvsp[-1].TypeVal.PAT->get());
    if (!PTy)
      error("Can't store to a nonpointer type: " + 
             yyvsp[-1].TypeVal.PAT->get()->getDescription());
    const Type *ElTy = PTy->getElementType();
    Value *StoreVal = yyvsp[-3].ValueVal.V;
    Value* tmpVal = getVal(PTy, yyvsp[0].ValIDVal);
    if (ElTy != yyvsp[-3].ValueVal.V->getType()) {
      StoreVal = handleSRetFuncTypeMerge(yyvsp[-3].ValueVal.V, ElTy);
      if (!StoreVal)
        error("Can't store '" + yyvsp[-3].ValueVal.V->getType()->getDescription() +
              "' into space of type '" + ElTy->getDescription() + "'");
      else {
        PTy = PointerType::get(StoreVal->getType());
        if (Constant *C = dyn_cast<Constant>(tmpVal))
          tmpVal = ConstantExpr::getBitCast(C, PTy);
        else
          tmpVal = new BitCastInst(tmpVal, PTy, "upgrd.cast", CurBB);
      }
    }
    yyval.InstVal.I = new StoreInst(StoreVal, tmpVal, yyvsp[-5].BoolVal);
    yyval.InstVal.S.makeSignless();
    delete yyvsp[-1].TypeVal.PAT;
  ;
    break;}
case 309:
#line 3893 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"
{
    yyvsp[-1].ValIDVal.S.copy(yyvsp[-2].TypeVal.S);
    const Type* Ty = yyvsp[-2].TypeVal.PAT->get();
    if (!isa<PointerType>(Ty))
      error("getelementptr insn requires pointer operand");

    std::vector<Value*> VIndices;
    upgradeGEPInstIndices(Ty, yyvsp[0].ValueList, VIndices);

    Value* tmpVal = getVal(Ty, yyvsp[-1].ValIDVal);
    yyval.InstVal.I = new GetElementPtrInst(tmpVal, VIndices.begin(), VIndices.end());
    ValueInfo VI; VI.V = tmpVal; VI.S.copy(yyvsp[-2].TypeVal.S);
    yyval.InstVal.S.copy(getElementSign(VI, VIndices));
    delete yyvsp[-2].TypeVal.PAT;
    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 3911 "/Volumes/MacOS9/gcc/llvm/tools/llvm-upgrade/UpgradeParser.y"


int yyerror(const char *ErrorMsg) {
  std::string where 
    = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
                  + ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
  std::string errMsg = where + "error: " + std::string(ErrorMsg);
  if (yychar != YYEMPTY && yychar != 0)
    errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
              "'.";
  std::cerr << "llvm-upgrade: " << errMsg << '\n';
  std::cout << "llvm-upgrade: parse failed.\n";
  exit(1);
}

void warning(const std::string& ErrorMsg) {
  std::string where 
    = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
                  + ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
  std::string errMsg = where + "warning: " + std::string(ErrorMsg);
  if (yychar != YYEMPTY && yychar != 0)
    errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
              "'.";
  std::cerr << "llvm-upgrade: " << errMsg << '\n';
}

void error(const std::string& ErrorMsg, int LineNo) {
  if (LineNo == -1) LineNo = Upgradelineno;
  Upgradelineno = LineNo;
  yyerror(ErrorMsg.c_str());
}

