mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36350 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			5168 lines
		
	
	
		
			196 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			5168 lines
		
	
	
		
			196 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | ||
| /*  A Bison parser, made from /Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y
 | ||
|     by GNU Bison version 1.28  */
 | ||
| 
 | ||
| #define YYBISON 1  /* Identify Bison output.  */
 | ||
| 
 | ||
| #define yyparse llvmAsmparse
 | ||
| #define yylex llvmAsmlex
 | ||
| #define yyerror llvmAsmerror
 | ||
| #define yylval llvmAsmlval
 | ||
| #define yychar llvmAsmchar
 | ||
| #define yydebug llvmAsmdebug
 | ||
| #define yynerrs llvmAsmnerrs
 | ||
| #define	ESINT64VAL	257
 | ||
| #define	EUINT64VAL	258
 | ||
| #define	ESAPINTVAL	259
 | ||
| #define	EUAPINTVAL	260
 | ||
| #define	LOCALVAL_ID	261
 | ||
| #define	GLOBALVAL_ID	262
 | ||
| #define	FPVAL	263
 | ||
| #define	VOID	264
 | ||
| #define	INTTYPE	265
 | ||
| #define	FLOAT	266
 | ||
| #define	DOUBLE	267
 | ||
| #define	LABEL	268
 | ||
| #define	TYPE	269
 | ||
| #define	LOCALVAR	270
 | ||
| #define	GLOBALVAR	271
 | ||
| #define	LABELSTR	272
 | ||
| #define	STRINGCONSTANT	273
 | ||
| #define	ATSTRINGCONSTANT	274
 | ||
| #define	ZEROINITIALIZER	275
 | ||
| #define	TRUETOK	276
 | ||
| #define	FALSETOK	277
 | ||
| #define	BEGINTOK	278
 | ||
| #define	ENDTOK	279
 | ||
| #define	DECLARE	280
 | ||
| #define	DEFINE	281
 | ||
| #define	GLOBAL	282
 | ||
| #define	CONSTANT	283
 | ||
| #define	SECTION	284
 | ||
| #define	VOLATILE	285
 | ||
| #define	THREAD_LOCAL	286
 | ||
| #define	TO	287
 | ||
| #define	DOTDOTDOT	288
 | ||
| #define	NULL_TOK	289
 | ||
| #define	UNDEF	290
 | ||
| #define	INTERNAL	291
 | ||
| #define	LINKONCE	292
 | ||
| #define	WEAK	293
 | ||
| #define	APPENDING	294
 | ||
| #define	DLLIMPORT	295
 | ||
| #define	DLLEXPORT	296
 | ||
| #define	EXTERN_WEAK	297
 | ||
| #define	OPAQUE	298
 | ||
| #define	EXTERNAL	299
 | ||
| #define	TARGET	300
 | ||
| #define	TRIPLE	301
 | ||
| #define	ALIGN	302
 | ||
| #define	DEPLIBS	303
 | ||
| #define	CALL	304
 | ||
| #define	TAIL	305
 | ||
| #define	ASM_TOK	306
 | ||
| #define	MODULE	307
 | ||
| #define	SIDEEFFECT	308
 | ||
| #define	CC_TOK	309
 | ||
| #define	CCC_TOK	310
 | ||
| #define	FASTCC_TOK	311
 | ||
| #define	COLDCC_TOK	312
 | ||
| #define	X86_STDCALLCC_TOK	313
 | ||
| #define	X86_FASTCALLCC_TOK	314
 | ||
| #define	DATALAYOUT	315
 | ||
| #define	RET	316
 | ||
| #define	BR	317
 | ||
| #define	SWITCH	318
 | ||
| #define	INVOKE	319
 | ||
| #define	UNWIND	320
 | ||
| #define	UNREACHABLE	321
 | ||
| #define	ADD	322
 | ||
| #define	SUB	323
 | ||
| #define	MUL	324
 | ||
| #define	UDIV	325
 | ||
| #define	SDIV	326
 | ||
| #define	FDIV	327
 | ||
| #define	UREM	328
 | ||
| #define	SREM	329
 | ||
| #define	FREM	330
 | ||
| #define	AND	331
 | ||
| #define	OR	332
 | ||
| #define	XOR	333
 | ||
| #define	SHL	334
 | ||
| #define	LSHR	335
 | ||
| #define	ASHR	336
 | ||
| #define	ICMP	337
 | ||
| #define	FCMP	338
 | ||
| #define	EQ	339
 | ||
| #define	NE	340
 | ||
| #define	SLT	341
 | ||
| #define	SGT	342
 | ||
| #define	SLE	343
 | ||
| #define	SGE	344
 | ||
| #define	ULT	345
 | ||
| #define	UGT	346
 | ||
| #define	ULE	347
 | ||
| #define	UGE	348
 | ||
| #define	OEQ	349
 | ||
| #define	ONE	350
 | ||
| #define	OLT	351
 | ||
| #define	OGT	352
 | ||
| #define	OLE	353
 | ||
| #define	OGE	354
 | ||
| #define	ORD	355
 | ||
| #define	UNO	356
 | ||
| #define	UEQ	357
 | ||
| #define	UNE	358
 | ||
| #define	MALLOC	359
 | ||
| #define	ALLOCA	360
 | ||
| #define	FREE	361
 | ||
| #define	LOAD	362
 | ||
| #define	STORE	363
 | ||
| #define	GETELEMENTPTR	364
 | ||
| #define	TRUNC	365
 | ||
| #define	ZEXT	366
 | ||
| #define	SEXT	367
 | ||
| #define	FPTRUNC	368
 | ||
| #define	FPEXT	369
 | ||
| #define	BITCAST	370
 | ||
| #define	UITOFP	371
 | ||
| #define	SITOFP	372
 | ||
| #define	FPTOUI	373
 | ||
| #define	FPTOSI	374
 | ||
| #define	INTTOPTR	375
 | ||
| #define	PTRTOINT	376
 | ||
| #define	PHI_TOK	377
 | ||
| #define	SELECT	378
 | ||
| #define	VAARG	379
 | ||
| #define	EXTRACTELEMENT	380
 | ||
| #define	INSERTELEMENT	381
 | ||
| #define	SHUFFLEVECTOR	382
 | ||
| #define	NORETURN	383
 | ||
| #define	INREG	384
 | ||
| #define	SRET	385
 | ||
| #define	NOUNWIND	386
 | ||
| #define	DEFAULT	387
 | ||
| #define	HIDDEN	388
 | ||
| 
 | ||
| #line 14 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| 
 | ||
| #include "ParserInternals.h"
 | ||
| #include "llvm/CallingConv.h"
 | ||
| #include "llvm/InlineAsm.h"
 | ||
| #include "llvm/Instructions.h"
 | ||
| #include "llvm/Module.h"
 | ||
| #include "llvm/ValueSymbolTable.h"
 | ||
| #include "llvm/Support/GetElementPtrTypeIterator.h"
 | ||
| #include "llvm/Support/CommandLine.h"
 | ||
| #include "llvm/ADT/SmallVector.h"
 | ||
| #include "llvm/ADT/STLExtras.h"
 | ||
| #include "llvm/Support/MathExtras.h"
 | ||
| #include "llvm/Support/Streams.h"
 | ||
| #include <algorithm>
 | ||
| #include <list>
 | ||
| #include <map>
 | ||
| #include <utility>
 | ||
| #ifndef NDEBUG
 | ||
| #define YYDEBUG 1
 | ||
| #endif
 | ||
| 
 | ||
| // The following is a gross hack. In order to rid the libAsmParser library of
 | ||
| // exceptions, we have to have a way of getting the yyparse function to go into
 | ||
| // an error situation. So, whenever we want an error to occur, the GenerateError
 | ||
| // function (see bottom of file) sets TriggerError. Then, at the end of each 
 | ||
| // production in the grammer we use CHECK_FOR_ERROR which will invoke YYERROR 
 | ||
| // (a goto) to put YACC in error state. Furthermore, several calls to 
 | ||
| // GenerateError are made from inside productions and they must simulate the
 | ||
| // previous exception behavior by exiting the production immediately. We have
 | ||
| // replaced these with the GEN_ERROR macro which calls GeneratError and then
 | ||
| // immediately invokes YYERROR. This would be so much cleaner if it was a 
 | ||
| // recursive descent parser.
 | ||
| static bool TriggerError = false;
 | ||
| #define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYABORT; } }
 | ||
| #define GEN_ERROR(msg) { GenerateError(msg); YYERROR; }
 | ||
| 
 | ||
| int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit
 | ||
| int yylex();                       // declaration" of xxx warnings.
 | ||
| int yyparse();
 | ||
| 
 | ||
| namespace llvm {
 | ||
|   std::string CurFilename;
 | ||
| #if YYDEBUG
 | ||
| static cl::opt<bool>
 | ||
| Debug("debug-yacc", cl::desc("Print yacc debug state changes"), 
 | ||
|       cl::Hidden, cl::init(false));
 | ||
| #endif
 | ||
| }
 | ||
| using namespace llvm;
 | ||
| 
 | ||
| static Module *ParserResult;
 | ||
| 
 | ||
| // DEBUG_UPREFS - Define this symbol if you want to enable debugging output
 | ||
| // relating to upreferences in the input stream.
 | ||
| //
 | ||
| //#define DEBUG_UPREFS 1
 | ||
| #ifdef DEBUG_UPREFS
 | ||
| #define UR_OUT(X) cerr << X
 | ||
| #else
 | ||
| #define UR_OUT(X)
 | ||
| #endif
 | ||
| 
 | ||
| #define YYERROR_VERBOSE 1
 | ||
| 
 | ||
| static GlobalVariable *CurGV;
 | ||
| 
 | ||
| 
 | ||
| // This contains info used when building the body of a function.  It is
 | ||
| // destroyed when the function is completed.
 | ||
| //
 | ||
| typedef std::vector<Value *> ValueList;           // Numbered defs
 | ||
| 
 | ||
| static void 
 | ||
| ResolveDefinitions(ValueList &LateResolvers, ValueList *FutureLateResolvers=0);
 | ||
| 
 | ||
| static struct PerModuleInfo {
 | ||
|   Module *CurrentModule;
 | ||
|   ValueList Values; // Module level numbered definitions
 | ||
|   ValueList LateResolveValues;
 | ||
|   std::vector<PATypeHolder>    Types;
 | ||
|   std::map<ValID, PATypeHolder> LateResolveTypes;
 | ||
| 
 | ||
|   /// PlaceHolderInfo - When temporary placeholder objects are created, remember
 | ||
|   /// how they were referenced and on which line of the input they came from so
 | ||
|   /// that we can resolve them later and print error messages as appropriate.
 | ||
|   std::map<Value*, std::pair<ValID, int> > PlaceHolderInfo;
 | ||
| 
 | ||
|   // GlobalRefs - This maintains a mapping between <Type, ValID>'s and forward
 | ||
|   // references to global values.  Global values may be referenced before they
 | ||
|   // are defined, and if so, the temporary object that they represent is held
 | ||
|   // here.  This is used for forward references of GlobalValues.
 | ||
|   //
 | ||
|   typedef std::map<std::pair<const PointerType *,
 | ||
|                              ValID>, GlobalValue*> GlobalRefsType;
 | ||
|   GlobalRefsType GlobalRefs;
 | ||
| 
 | ||
|   void ModuleDone() {
 | ||
|     // If we could not resolve some functions at function compilation time
 | ||
|     // (calls to functions before they are defined), resolve them now...  Types
 | ||
|     // are resolved when the constant pool has been completely parsed.
 | ||
|     //
 | ||
|     ResolveDefinitions(LateResolveValues);
 | ||
|     if (TriggerError)
 | ||
|       return;
 | ||
| 
 | ||
|     // Check to make sure that all global value forward references have been
 | ||
|     // resolved!
 | ||
|     //
 | ||
|     if (!GlobalRefs.empty()) {
 | ||
|       std::string UndefinedReferences = "Unresolved global references exist:\n";
 | ||
| 
 | ||
|       for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end();
 | ||
|            I != E; ++I) {
 | ||
|         UndefinedReferences += "  " + I->first.first->getDescription() + " " +
 | ||
|                                I->first.second.getName() + "\n";
 | ||
|       }
 | ||
|       GenerateError(UndefinedReferences);
 | ||
|       return;
 | ||
|     }
 | ||
| 
 | ||
|     Values.clear();         // Clear out function local definitions
 | ||
|     Types.clear();
 | ||
|     CurrentModule = 0;
 | ||
|   }
 | ||
| 
 | ||
|   // GetForwardRefForGlobal - Check to see if there is a forward reference
 | ||
|   // for this global.  If so, remove it from the GlobalRefs map and return it.
 | ||
|   // If not, just return null.
 | ||
|   GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) {
 | ||
|     // Check to see if there is a forward reference to this global variable...
 | ||
|     // if there is, eliminate it and patch the reference to use the new def'n.
 | ||
|     GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID));
 | ||
|     GlobalValue *Ret = 0;
 | ||
|     if (I != GlobalRefs.end()) {
 | ||
|       Ret = I->second;
 | ||
|       GlobalRefs.erase(I);
 | ||
|     }
 | ||
|     return Ret;
 | ||
|   }
 | ||
| 
 | ||
|   bool TypeIsUnresolved(PATypeHolder* PATy) {
 | ||
|     // If it isn't abstract, its resolved
 | ||
|     const Type* Ty = PATy->get();
 | ||
|     if (!Ty->isAbstract())
 | ||
|       return false;
 | ||
|     // Traverse the type looking for abstract types. If it isn't abstract then
 | ||
|     // we don't need to traverse that leg of the type. 
 | ||
|     std::vector<const Type*> WorkList, SeenList;
 | ||
|     WorkList.push_back(Ty);
 | ||
|     while (!WorkList.empty()) {
 | ||
|       const Type* Ty = WorkList.back();
 | ||
|       SeenList.push_back(Ty);
 | ||
|       WorkList.pop_back();
 | ||
|       if (const OpaqueType* OpTy = dyn_cast<OpaqueType>(Ty)) {
 | ||
|         // Check to see if this is an unresolved type
 | ||
|         std::map<ValID, PATypeHolder>::iterator I = LateResolveTypes.begin();
 | ||
|         std::map<ValID, PATypeHolder>::iterator E = LateResolveTypes.end();
 | ||
|         for ( ; I != E; ++I) {
 | ||
|           if (I->second.get() == OpTy)
 | ||
|             return true;
 | ||
|         }
 | ||
|       } else if (const SequentialType* SeqTy = dyn_cast<SequentialType>(Ty)) {
 | ||
|         const Type* TheTy = SeqTy->getElementType();
 | ||
|         if (TheTy->isAbstract() && TheTy != Ty) {
 | ||
|           std::vector<const Type*>::iterator I = SeenList.begin(), 
 | ||
|                                              E = SeenList.end();
 | ||
|           for ( ; I != E; ++I)
 | ||
|             if (*I == TheTy)
 | ||
|               break;
 | ||
|           if (I == E)
 | ||
|             WorkList.push_back(TheTy);
 | ||
|         }
 | ||
|       } else if (const StructType* StrTy = dyn_cast<StructType>(Ty)) {
 | ||
|         for (unsigned i = 0; i < StrTy->getNumElements(); ++i) {
 | ||
|           const Type* TheTy = StrTy->getElementType(i);
 | ||
|           if (TheTy->isAbstract() && TheTy != Ty) {
 | ||
|             std::vector<const Type*>::iterator I = SeenList.begin(), 
 | ||
|                                                E = SeenList.end();
 | ||
|             for ( ; I != E; ++I)
 | ||
|               if (*I == TheTy)
 | ||
|                 break;
 | ||
|             if (I == E)
 | ||
|               WorkList.push_back(TheTy);
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|     return false;
 | ||
|   }
 | ||
| } CurModule;
 | ||
| 
 | ||
| static struct PerFunctionInfo {
 | ||
|   Function *CurrentFunction;     // Pointer to current function being created
 | ||
| 
 | ||
|   ValueList Values; // Keep track of #'d definitions
 | ||
|   unsigned NextValNum;
 | ||
|   ValueList LateResolveValues;
 | ||
|   bool isDeclare;                   // Is this function a forward declararation?
 | ||
|   GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration.
 | ||
|   GlobalValue::VisibilityTypes Visibility;
 | ||
| 
 | ||
|   /// BBForwardRefs - When we see forward references to basic blocks, keep
 | ||
|   /// track of them here.
 | ||
|   std::map<ValID, BasicBlock*> BBForwardRefs;
 | ||
| 
 | ||
|   inline PerFunctionInfo() {
 | ||
|     CurrentFunction = 0;
 | ||
|     isDeclare = false;
 | ||
|     Linkage = GlobalValue::ExternalLinkage;
 | ||
|     Visibility = GlobalValue::DefaultVisibility;
 | ||
|   }
 | ||
| 
 | ||
|   inline void FunctionStart(Function *M) {
 | ||
|     CurrentFunction = M;
 | ||
|     NextValNum = 0;
 | ||
|   }
 | ||
| 
 | ||
|   void FunctionDone() {
 | ||
|     // Any forward referenced blocks left?
 | ||
|     if (!BBForwardRefs.empty()) {
 | ||
|       GenerateError("Undefined reference to label " +
 | ||
|                      BBForwardRefs.begin()->second->getName());
 | ||
|       return;
 | ||
|     }
 | ||
| 
 | ||
|     // Resolve all forward references now.
 | ||
|     ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
 | ||
| 
 | ||
|     Values.clear();         // Clear out function local definitions
 | ||
|     BBForwardRefs.clear();
 | ||
|     CurrentFunction = 0;
 | ||
|     isDeclare = false;
 | ||
|     Linkage = GlobalValue::ExternalLinkage;
 | ||
|     Visibility = GlobalValue::DefaultVisibility;
 | ||
|   }
 | ||
| } CurFun;  // Info for the current function...
 | ||
| 
 | ||
| static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }
 | ||
| 
 | ||
| 
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| //               Code to handle definitions of all the types
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| 
 | ||
| static void InsertValue(Value *V, ValueList &ValueTab = CurFun.Values) {
 | ||
|   // Things that have names or are void typed don't get slot numbers
 | ||
|   if (V->hasName() || (V->getType() == Type::VoidTy))
 | ||
|     return;
 | ||
| 
 | ||
|   // In the case of function values, we have to allow for the forward reference
 | ||
|   // of basic blocks, which are included in the numbering. Consequently, we keep
 | ||
|   // track of the next insertion location with NextValNum. When a BB gets 
 | ||
|   // inserted, it could change the size of the CurFun.Values vector.
 | ||
|   if (&ValueTab == &CurFun.Values) {
 | ||
|     if (ValueTab.size() <= CurFun.NextValNum)
 | ||
|       ValueTab.resize(CurFun.NextValNum+1);
 | ||
|     ValueTab[CurFun.NextValNum++] = V;
 | ||
|     return;
 | ||
|   } 
 | ||
|   // For all other lists, its okay to just tack it on the back of the vector.
 | ||
|   ValueTab.push_back(V);
 | ||
| }
 | ||
| 
 | ||
| static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
 | ||
|   switch (D.Type) {
 | ||
|   case ValID::LocalID:               // Is it a numbered definition?
 | ||
|     // Module constants occupy the lowest numbered slots...
 | ||
|     if (D.Num < CurModule.Types.size())
 | ||
|       return CurModule.Types[D.Num];
 | ||
|     break;
 | ||
|   case ValID::LocalName:                 // Is it a named definition?
 | ||
|     if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
 | ||
|       D.destroy();  // Free old strdup'd memory...
 | ||
|       return N;
 | ||
|     }
 | ||
|     break;
 | ||
|   default:
 | ||
|     GenerateError("Internal parser error: Invalid symbol type reference");
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   // If we reached here, we referenced either a symbol that we don't know about
 | ||
|   // or an id number that hasn't been read yet.  We may be referencing something
 | ||
|   // forward, so just create an entry to be resolved later and get to it...
 | ||
|   //
 | ||
|   if (DoNotImprovise) return 0;  // Do we just want a null to be returned?
 | ||
| 
 | ||
| 
 | ||
|   if (inFunctionScope()) {
 | ||
|     if (D.Type == ValID::LocalName) {
 | ||
|       GenerateError("Reference to an undefined type: '" + D.getName() + "'");
 | ||
|       return 0;
 | ||
|     } else {
 | ||
|       GenerateError("Reference to an undefined type: #" + utostr(D.Num));
 | ||
|       return 0;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   std::map<ValID, PATypeHolder>::iterator I =CurModule.LateResolveTypes.find(D);
 | ||
|   if (I != CurModule.LateResolveTypes.end())
 | ||
|     return I->second;
 | ||
| 
 | ||
|   Type *Typ = OpaqueType::get();
 | ||
|   CurModule.LateResolveTypes.insert(std::make_pair(D, Typ));
 | ||
|   return Typ;
 | ||
|  }
 | ||
| 
 | ||
| // getExistingVal - Look up the value specified by the provided type and
 | ||
| // the provided ValID.  If the value exists and has already been defined, return
 | ||
| // it.  Otherwise return null.
 | ||
| //
 | ||
| static Value *getExistingVal(const Type *Ty, const ValID &D) {
 | ||
|   if (isa<FunctionType>(Ty)) {
 | ||
|     GenerateError("Functions are not values and "
 | ||
|                    "must be referenced as pointers");
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   switch (D.Type) {
 | ||
|   case ValID::LocalID: {                 // Is it a numbered definition?
 | ||
|     // Check that the number is within bounds.
 | ||
|     if (D.Num >= CurFun.Values.size()) 
 | ||
|       return 0;
 | ||
|     Value *Result = CurFun.Values[D.Num];
 | ||
|     if (Ty != Result->getType()) {
 | ||
|       GenerateError("Numbered value (%" + utostr(D.Num) + ") of type '" +
 | ||
|                     Result->getType()->getDescription() + "' does not match " 
 | ||
|                     "expected type, '" + Ty->getDescription() + "'");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return Result;
 | ||
|   }
 | ||
|   case ValID::GlobalID: {                 // Is it a numbered definition?
 | ||
|     if (D.Num >= CurModule.Values.size()) 
 | ||
|       return 0;
 | ||
|     Value *Result = CurModule.Values[D.Num];
 | ||
|     if (Ty != Result->getType()) {
 | ||
|       GenerateError("Numbered value (@" + utostr(D.Num) + ") of type '" +
 | ||
|                     Result->getType()->getDescription() + "' does not match " 
 | ||
|                     "expected type, '" + Ty->getDescription() + "'");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return Result;
 | ||
|   }
 | ||
|     
 | ||
|   case ValID::LocalName: {                // Is it a named definition?
 | ||
|     if (!inFunctionScope()) 
 | ||
|       return 0;
 | ||
|     ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
 | ||
|     Value *N = SymTab.lookup(D.Name);
 | ||
|     if (N == 0) 
 | ||
|       return 0;
 | ||
|     if (N->getType() != Ty)
 | ||
|       return 0;
 | ||
|     
 | ||
|     D.destroy();  // Free old strdup'd memory...
 | ||
|     return N;
 | ||
|   }
 | ||
|   case ValID::GlobalName: {                // Is it a named definition?
 | ||
|     ValueSymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable();
 | ||
|     Value *N = SymTab.lookup(D.Name);
 | ||
|     if (N == 0) 
 | ||
|       return 0;
 | ||
|     if (N->getType() != Ty)
 | ||
|       return 0;
 | ||
| 
 | ||
|     D.destroy();  // Free old strdup'd memory...
 | ||
|     return N;
 | ||
|   }
 | ||
| 
 | ||
|   // Check to make sure that "Ty" is an integral type, and that our
 | ||
|   // value will fit into the specified type...
 | ||
|   case ValID::ConstSIntVal:    // Is it a constant pool reference??
 | ||
|     if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
 | ||
|       GenerateError("Signed integral constant '" +
 | ||
|                      itostr(D.ConstPool64) + "' is invalid for type '" +
 | ||
|                      Ty->getDescription() + "'");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return ConstantInt::get(Ty, D.ConstPool64, true);
 | ||
| 
 | ||
|   case ValID::ConstUIntVal:     // Is it an unsigned const pool reference?
 | ||
|     if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
 | ||
|       if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
 | ||
|         GenerateError("Integral constant '" + utostr(D.UConstPool64) +
 | ||
|                        "' is invalid or out of range");
 | ||
|         return 0;
 | ||
|       } else {     // This is really a signed reference.  Transmogrify.
 | ||
|         return ConstantInt::get(Ty, D.ConstPool64, true);
 | ||
|       }
 | ||
|     } else {
 | ||
|       return ConstantInt::get(Ty, D.UConstPool64);
 | ||
|     }
 | ||
| 
 | ||
|   case ValID::ConstFPVal:        // Is it a floating point const pool reference?
 | ||
|     if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) {
 | ||
|       GenerateError("FP constant invalid for type");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return ConstantFP::get(Ty, D.ConstPoolFP);
 | ||
| 
 | ||
|   case ValID::ConstNullVal:      // Is it a null value?
 | ||
|     if (!isa<PointerType>(Ty)) {
 | ||
|       GenerateError("Cannot create a a non pointer null");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return ConstantPointerNull::get(cast<PointerType>(Ty));
 | ||
| 
 | ||
|   case ValID::ConstUndefVal:      // Is it an undef value?
 | ||
|     return UndefValue::get(Ty);
 | ||
| 
 | ||
|   case ValID::ConstZeroVal:      // Is it a zero value?
 | ||
|     return Constant::getNullValue(Ty);
 | ||
|     
 | ||
|   case ValID::ConstantVal:       // Fully resolved constant?
 | ||
|     if (D.ConstantValue->getType() != Ty) {
 | ||
|       GenerateError("Constant expression type different from required type");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return D.ConstantValue;
 | ||
| 
 | ||
|   case ValID::InlineAsmVal: {    // Inline asm expression
 | ||
|     const PointerType *PTy = dyn_cast<PointerType>(Ty);
 | ||
|     const FunctionType *FTy =
 | ||
|       PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
 | ||
|     if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) {
 | ||
|       GenerateError("Invalid type for asm constraint string");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
 | ||
|                                    D.IAD->HasSideEffects);
 | ||
|     D.destroy();   // Free InlineAsmDescriptor.
 | ||
|     return IA;
 | ||
|   }
 | ||
|   default:
 | ||
|     assert(0 && "Unhandled case!");
 | ||
|     return 0;
 | ||
|   }   // End of switch
 | ||
| 
 | ||
|   assert(0 && "Unhandled case!");
 | ||
|   return 0;
 | ||
| }
 | ||
| 
 | ||
| // getVal - This function is identical to getExistingVal, except that if a
 | ||
| // value is not already defined, it "improvises" by creating a placeholder var
 | ||
| // that looks and acts just like the requested variable.  When the value is
 | ||
| // defined later, all uses of the placeholder variable are replaced with the
 | ||
| // real thing.
 | ||
| //
 | ||
| static Value *getVal(const Type *Ty, const ValID &ID) {
 | ||
|   if (Ty == Type::LabelTy) {
 | ||
|     GenerateError("Cannot use a basic block here");
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   // See if the value has already been defined.
 | ||
|   Value *V = getExistingVal(Ty, ID);
 | ||
|   if (V) return V;
 | ||
|   if (TriggerError) return 0;
 | ||
| 
 | ||
|   if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty)) {
 | ||
|     GenerateError("Invalid use of a composite type");
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   // If we reached here, we referenced either a symbol that we don't know about
 | ||
|   // or an id number that hasn't been read yet.  We may be referencing something
 | ||
|   // forward, so just create an entry to be resolved later and get to it...
 | ||
|   //
 | ||
|   V = new Argument(Ty);
 | ||
| 
 | ||
|   // Remember where this forward reference came from.  FIXME, shouldn't we try
 | ||
|   // to recycle these things??
 | ||
|   CurModule.PlaceHolderInfo.insert(std::make_pair(V, std::make_pair(ID,
 | ||
|                                                                llvmAsmlineno)));
 | ||
| 
 | ||
|   if (inFunctionScope())
 | ||
|     InsertValue(V, CurFun.LateResolveValues);
 | ||
|   else
 | ||
|     InsertValue(V, CurModule.LateResolveValues);
 | ||
|   return V;
 | ||
| }
 | ||
| 
 | ||
| /// defineBBVal - This is a definition of a new basic block with the specified
 | ||
| /// identifier which must be the same as CurFun.NextValNum, if its numeric.
 | ||
| static BasicBlock *defineBBVal(const ValID &ID) {
 | ||
|   assert(inFunctionScope() && "Can't get basic block at global scope!");
 | ||
| 
 | ||
|   BasicBlock *BB = 0;
 | ||
| 
 | ||
|   // First, see if this was forward referenced
 | ||
| 
 | ||
|   std::map<ValID, BasicBlock*>::iterator BBI = CurFun.BBForwardRefs.find(ID);
 | ||
|   if (BBI != CurFun.BBForwardRefs.end()) {
 | ||
|     BB = BBI->second;
 | ||
|     // The forward declaration could have been inserted anywhere in the
 | ||
|     // function: insert it into the correct place now.
 | ||
|     CurFun.CurrentFunction->getBasicBlockList().remove(BB);
 | ||
|     CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
 | ||
| 
 | ||
|     // We're about to erase the entry, save the key so we can clean it up.
 | ||
|     ValID Tmp = BBI->first;
 | ||
| 
 | ||
|     // Erase the forward ref from the map as its no longer "forward"
 | ||
|     CurFun.BBForwardRefs.erase(ID);
 | ||
| 
 | ||
|     // The key has been removed from the map but so we don't want to leave 
 | ||
|     // strdup'd memory around so destroy it too.
 | ||
|     Tmp.destroy();
 | ||
| 
 | ||
|     // If its a numbered definition, bump the number and set the BB value.
 | ||
|     if (ID.Type == ValID::LocalID) {
 | ||
|       assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
 | ||
|       InsertValue(BB);
 | ||
|     }
 | ||
| 
 | ||
|     ID.destroy();
 | ||
|     return BB;
 | ||
|   } 
 | ||
|   
 | ||
|   // We haven't seen this BB before and its first mention is a definition. 
 | ||
|   // Just create it and return it.
 | ||
|   std::string Name (ID.Type == ValID::LocalName ? ID.Name : "");
 | ||
|   BB = new BasicBlock(Name, CurFun.CurrentFunction);
 | ||
|   if (ID.Type == ValID::LocalID) {
 | ||
|     assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
 | ||
|     InsertValue(BB);
 | ||
|   }
 | ||
| 
 | ||
|   ID.destroy(); // Free strdup'd memory
 | ||
|   return BB;
 | ||
| }
 | ||
| 
 | ||
| /// getBBVal - get an existing BB value or create a forward reference for it.
 | ||
| /// 
 | ||
| static BasicBlock *getBBVal(const ValID &ID) {
 | ||
|   assert(inFunctionScope() && "Can't get basic block at global scope!");
 | ||
| 
 | ||
|   BasicBlock *BB =  0;
 | ||
| 
 | ||
|   std::map<ValID, BasicBlock*>::iterator BBI = CurFun.BBForwardRefs.find(ID);
 | ||
|   if (BBI != CurFun.BBForwardRefs.end()) {
 | ||
|     BB = BBI->second;
 | ||
|   } if (ID.Type == ValID::LocalName) {
 | ||
|     std::string Name = ID.Name;
 | ||
|     Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name);
 | ||
|     if (N)
 | ||
|       if (N->getType()->getTypeID() == Type::LabelTyID)
 | ||
|         BB = cast<BasicBlock>(N);
 | ||
|       else
 | ||
|         GenerateError("Reference to label '" + Name + "' is actually of type '"+
 | ||
|           N->getType()->getDescription() + "'");
 | ||
|   } else if (ID.Type == ValID::LocalID) {
 | ||
|     if (ID.Num < CurFun.NextValNum && ID.Num < CurFun.Values.size()) {
 | ||
|       if (CurFun.Values[ID.Num]->getType()->getTypeID() == Type::LabelTyID)
 | ||
|         BB = cast<BasicBlock>(CurFun.Values[ID.Num]);
 | ||
|       else
 | ||
|         GenerateError("Reference to label '%" + utostr(ID.Num) + 
 | ||
|           "' is actually of type '"+ 
 | ||
|           CurFun.Values[ID.Num]->getType()->getDescription() + "'");
 | ||
|     }
 | ||
|   } else {
 | ||
|     GenerateError("Illegal label reference " + ID.getName());
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   // If its already been defined, return it now.
 | ||
|   if (BB) {
 | ||
|     ID.destroy(); // Free strdup'd memory.
 | ||
|     return BB;
 | ||
|   }
 | ||
| 
 | ||
|   // Otherwise, this block has not been seen before, create it.
 | ||
|   std::string Name;
 | ||
|   if (ID.Type == ValID::LocalName)
 | ||
|     Name = ID.Name;
 | ||
|   BB = new BasicBlock(Name, CurFun.CurrentFunction);
 | ||
| 
 | ||
|   // Insert it in the forward refs map.
 | ||
|   CurFun.BBForwardRefs[ID] = BB;
 | ||
| 
 | ||
|   return BB;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| //              Code to handle forward references in instructions
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| //
 | ||
| // This code handles the late binding needed with statements that reference
 | ||
| // values not defined yet... for example, a forward branch, or the PHI node for
 | ||
| // a loop body.
 | ||
| //
 | ||
| // This keeps a table (CurFun.LateResolveValues) of all such forward references
 | ||
| // and back patchs after we are done.
 | ||
| //
 | ||
| 
 | ||
| // ResolveDefinitions - If we could not resolve some defs at parsing
 | ||
| // time (forward branches, phi functions for loops, etc...) resolve the
 | ||
| // defs now...
 | ||
| //
 | ||
| static void 
 | ||
| ResolveDefinitions(ValueList &LateResolvers, ValueList *FutureLateResolvers) {
 | ||
|   // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
 | ||
|   while (!LateResolvers.empty()) {
 | ||
|     Value *V = LateResolvers.back();
 | ||
|     LateResolvers.pop_back();
 | ||
| 
 | ||
|     std::map<Value*, std::pair<ValID, int> >::iterator PHI =
 | ||
|       CurModule.PlaceHolderInfo.find(V);
 | ||
|     assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!");
 | ||
| 
 | ||
|     ValID &DID = PHI->second.first;
 | ||
| 
 | ||
|     Value *TheRealValue = getExistingVal(V->getType(), DID);
 | ||
|     if (TriggerError)
 | ||
|       return;
 | ||
|     if (TheRealValue) {
 | ||
|       V->replaceAllUsesWith(TheRealValue);
 | ||
|       delete V;
 | ||
|       CurModule.PlaceHolderInfo.erase(PHI);
 | ||
|     } else if (FutureLateResolvers) {
 | ||
|       // Functions have their unresolved items forwarded to the module late
 | ||
|       // resolver table
 | ||
|       InsertValue(V, *FutureLateResolvers);
 | ||
|     } else {
 | ||
|       if (DID.Type == ValID::LocalName || DID.Type == ValID::GlobalName) {
 | ||
|         GenerateError("Reference to an invalid definition: '" +DID.getName()+
 | ||
|                        "' of type '" + V->getType()->getDescription() + "'",
 | ||
|                        PHI->second.second);
 | ||
|         return;
 | ||
|       } else {
 | ||
|         GenerateError("Reference to an invalid definition: #" +
 | ||
|                        itostr(DID.Num) + " of type '" +
 | ||
|                        V->getType()->getDescription() + "'",
 | ||
|                        PHI->second.second);
 | ||
|         return;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
|   LateResolvers.clear();
 | ||
| }
 | ||
| 
 | ||
| // ResolveTypeTo - A brand new type was just declared.  This means that (if
 | ||
| // name is not null) things referencing Name can be resolved.  Otherwise, things
 | ||
| // refering to the number can be resolved.  Do this now.
 | ||
| //
 | ||
| static void ResolveTypeTo(char *Name, const Type *ToTy) {
 | ||
|   ValID D;
 | ||
|   if (Name) D = ValID::createLocalName(Name);
 | ||
|   else      D = ValID::createLocalID(CurModule.Types.size());
 | ||
| 
 | ||
|   std::map<ValID, PATypeHolder>::iterator I =
 | ||
|     CurModule.LateResolveTypes.find(D);
 | ||
|   if (I != CurModule.LateResolveTypes.end()) {
 | ||
|     ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy);
 | ||
|     CurModule.LateResolveTypes.erase(I);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| // setValueName - Set the specified value to the name given.  The name may be
 | ||
| // null potentially, in which case this is a noop.  The string passed in is
 | ||
| // assumed to be a malloc'd string buffer, and is free'd by this function.
 | ||
| //
 | ||
| static void setValueName(Value *V, char *NameStr) {
 | ||
|   if (!NameStr) return;
 | ||
|   std::string Name(NameStr);      // Copy string
 | ||
|   free(NameStr);                  // Free old string
 | ||
| 
 | ||
|   if (V->getType() == Type::VoidTy) {
 | ||
|     GenerateError("Can't assign name '" + Name+"' to value with void type");
 | ||
|     return;
 | ||
|   }
 | ||
| 
 | ||
|   assert(inFunctionScope() && "Must be in function scope!");
 | ||
|   ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
 | ||
|   if (ST.lookup(Name)) {
 | ||
|     GenerateError("Redefinition of value '" + Name + "' of type '" +
 | ||
|                    V->getType()->getDescription() + "'");
 | ||
|     return;
 | ||
|   }
 | ||
| 
 | ||
|   // Set the name.
 | ||
|   V->setName(Name);
 | ||
| }
 | ||
| 
 | ||
| /// ParseGlobalVariable - Handle parsing of a global.  If Initializer is null,
 | ||
| /// this is a declaration, otherwise it is a definition.
 | ||
| static GlobalVariable *
 | ||
| ParseGlobalVariable(char *NameStr,
 | ||
|                     GlobalValue::LinkageTypes Linkage,
 | ||
|                     GlobalValue::VisibilityTypes Visibility,
 | ||
|                     bool isConstantGlobal, const Type *Ty,
 | ||
|                     Constant *Initializer, bool IsThreadLocal) {
 | ||
|   if (isa<FunctionType>(Ty)) {
 | ||
|     GenerateError("Cannot declare global vars of function type");
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   const PointerType *PTy = PointerType::get(Ty);
 | ||
| 
 | ||
|   std::string Name;
 | ||
|   if (NameStr) {
 | ||
|     Name = NameStr;      // Copy string
 | ||
|     free(NameStr);       // Free old string
 | ||
|   }
 | ||
| 
 | ||
|   // See if this global value was forward referenced.  If so, recycle the
 | ||
|   // object.
 | ||
|   ValID ID;
 | ||
|   if (!Name.empty()) {
 | ||
|     ID = ValID::createGlobalName((char*)Name.c_str());
 | ||
|   } else {
 | ||
|     ID = ValID::createGlobalID(CurModule.Values.size());
 | ||
|   }
 | ||
| 
 | ||
|   if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
 | ||
|     // Move the global to the end of the list, from whereever it was
 | ||
|     // previously inserted.
 | ||
|     GlobalVariable *GV = cast<GlobalVariable>(FWGV);
 | ||
|     CurModule.CurrentModule->getGlobalList().remove(GV);
 | ||
|     CurModule.CurrentModule->getGlobalList().push_back(GV);
 | ||
|     GV->setInitializer(Initializer);
 | ||
|     GV->setLinkage(Linkage);
 | ||
|     GV->setVisibility(Visibility);
 | ||
|     GV->setConstant(isConstantGlobal);
 | ||
|     GV->setThreadLocal(IsThreadLocal);
 | ||
|     InsertValue(GV, CurModule.Values);
 | ||
|     return GV;
 | ||
|   }
 | ||
| 
 | ||
|   // If this global has a name
 | ||
|   if (!Name.empty()) {
 | ||
|     // if the global we're parsing has an initializer (is a definition) and
 | ||
|     // has external linkage.
 | ||
|     if (Initializer && Linkage != GlobalValue::InternalLinkage)
 | ||
|       // If there is already a global with external linkage with this name
 | ||
|       if (CurModule.CurrentModule->getGlobalVariable(Name, false)) {
 | ||
|         // If we allow this GVar to get created, it will be renamed in the
 | ||
|         // symbol table because it conflicts with an existing GVar. We can't
 | ||
|         // allow redefinition of GVars whose linking indicates that their name
 | ||
|         // must stay the same. Issue the error.
 | ||
|         GenerateError("Redefinition of global variable named '" + Name +
 | ||
|                        "' of type '" + Ty->getDescription() + "'");
 | ||
|         return 0;
 | ||
|       }
 | ||
|   }
 | ||
| 
 | ||
|   // Otherwise there is no existing GV to use, create one now.
 | ||
|   GlobalVariable *GV =
 | ||
|     new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
 | ||
|                        CurModule.CurrentModule, IsThreadLocal);
 | ||
|   GV->setVisibility(Visibility);
 | ||
|   InsertValue(GV, CurModule.Values);
 | ||
|   return GV;
 | ||
| }
 | ||
| 
 | ||
| // setTypeName - Set the specified type to the name given.  The name may be
 | ||
| // null potentially, in which case this is a noop.  The string passed in is
 | ||
| // assumed to be a malloc'd string buffer, and is freed by this function.
 | ||
| //
 | ||
| // This function returns true if the type has already been defined, but is
 | ||
| // allowed to be redefined in the specified context.  If the name is a new name
 | ||
| // for the type plane, it is inserted and false is returned.
 | ||
| static bool setTypeName(const Type *T, char *NameStr) {
 | ||
|   assert(!inFunctionScope() && "Can't give types function-local names!");
 | ||
|   if (NameStr == 0) return false;
 | ||
|  
 | ||
|   std::string Name(NameStr);      // Copy string
 | ||
|   free(NameStr);                  // Free old string
 | ||
| 
 | ||
|   // We don't allow assigning names to void type
 | ||
|   if (T == Type::VoidTy) {
 | ||
|     GenerateError("Can't assign name '" + Name + "' to the void type");
 | ||
|     return false;
 | ||
|   }
 | ||
| 
 | ||
|   // Set the type name, checking for conflicts as we do so.
 | ||
|   bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T);
 | ||
| 
 | ||
|   if (AlreadyExists) {   // Inserting a name that is already defined???
 | ||
|     const Type *Existing = CurModule.CurrentModule->getTypeByName(Name);
 | ||
|     assert(Existing && "Conflict but no matching type?!");
 | ||
| 
 | ||
|     // There is only one case where this is allowed: when we are refining an
 | ||
|     // opaque type.  In this case, Existing will be an opaque type.
 | ||
|     if (const OpaqueType *OpTy = dyn_cast<OpaqueType>(Existing)) {
 | ||
|       // We ARE replacing an opaque type!
 | ||
|       const_cast<OpaqueType*>(OpTy)->refineAbstractTypeTo(T);
 | ||
|       return true;
 | ||
|     }
 | ||
| 
 | ||
|     // Otherwise, this is an attempt to redefine a type. That's okay if
 | ||
|     // the redefinition is identical to the original. This will be so if
 | ||
|     // Existing and T point to the same Type object. In this one case we
 | ||
|     // allow the equivalent redefinition.
 | ||
|     if (Existing == T) return true;  // Yes, it's equal.
 | ||
| 
 | ||
|     // Any other kind of (non-equivalent) redefinition is an error.
 | ||
|     GenerateError("Redefinition of type named '" + Name + "' of type '" +
 | ||
|                    T->getDescription() + "'");
 | ||
|   }
 | ||
| 
 | ||
|   return false;
 | ||
| }
 | ||
| 
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| // Code for handling upreferences in type names...
 | ||
| //
 | ||
| 
 | ||
| // TypeContains - Returns true if Ty directly contains E in it.
 | ||
| //
 | ||
| static bool TypeContains(const Type *Ty, const Type *E) {
 | ||
|   return std::find(Ty->subtype_begin(), Ty->subtype_end(),
 | ||
|                    E) != Ty->subtype_end();
 | ||
| }
 | ||
| 
 | ||
| namespace {
 | ||
|   struct UpRefRecord {
 | ||
|     // NestingLevel - The number of nesting levels that need to be popped before
 | ||
|     // this type is resolved.
 | ||
|     unsigned NestingLevel;
 | ||
| 
 | ||
|     // LastContainedTy - This is the type at the current binding level for the
 | ||
|     // type.  Every time we reduce the nesting level, this gets updated.
 | ||
|     const Type *LastContainedTy;
 | ||
| 
 | ||
|     // UpRefTy - This is the actual opaque type that the upreference is
 | ||
|     // represented with.
 | ||
|     OpaqueType *UpRefTy;
 | ||
| 
 | ||
|     UpRefRecord(unsigned NL, OpaqueType *URTy)
 | ||
|       : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {}
 | ||
|   };
 | ||
| }
 | ||
| 
 | ||
| // UpRefs - A list of the outstanding upreferences that need to be resolved.
 | ||
| static std::vector<UpRefRecord> UpRefs;
 | ||
| 
 | ||
| /// HandleUpRefs - Every time we finish a new layer of types, this function is
 | ||
| /// called.  It loops through the UpRefs vector, which is a list of the
 | ||
| /// currently active types.  For each type, if the up reference is contained in
 | ||
| /// the newly completed type, we decrement the level count.  When the level
 | ||
| /// count reaches zero, the upreferenced type is the type that is passed in:
 | ||
| /// thus we can complete the cycle.
 | ||
| ///
 | ||
| static PATypeHolder HandleUpRefs(const Type *ty) {
 | ||
|   // If Ty isn't abstract, or if there are no up-references in it, then there is
 | ||
|   // nothing to resolve here.
 | ||
|   if (!ty->isAbstract() || UpRefs.empty()) return ty;
 | ||
|   
 | ||
|   PATypeHolder Ty(ty);
 | ||
|   UR_OUT("Type '" << Ty->getDescription() <<
 | ||
|          "' newly formed.  Resolving upreferences.\n" <<
 | ||
|          UpRefs.size() << " upreferences active!\n");
 | ||
| 
 | ||
|   // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
 | ||
|   // to zero), we resolve them all together before we resolve them to Ty.  At
 | ||
|   // the end of the loop, if there is anything to resolve to Ty, it will be in
 | ||
|   // this variable.
 | ||
|   OpaqueType *TypeToResolve = 0;
 | ||
| 
 | ||
|   for (unsigned i = 0; i != UpRefs.size(); ++i) {
 | ||
|     UR_OUT("  UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
 | ||
|            << UpRefs[i].second->getDescription() << ") = "
 | ||
|            << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n");
 | ||
|     if (TypeContains(Ty, UpRefs[i].LastContainedTy)) {
 | ||
|       // Decrement level of upreference
 | ||
|       unsigned Level = --UpRefs[i].NestingLevel;
 | ||
|       UpRefs[i].LastContainedTy = Ty;
 | ||
|       UR_OUT("  Uplevel Ref Level = " << Level << "\n");
 | ||
|       if (Level == 0) {                     // Upreference should be resolved!
 | ||
|         if (!TypeToResolve) {
 | ||
|           TypeToResolve = UpRefs[i].UpRefTy;
 | ||
|         } else {
 | ||
|           UR_OUT("  * Resolving upreference for "
 | ||
|                  << UpRefs[i].second->getDescription() << "\n";
 | ||
|                  std::string OldName = UpRefs[i].UpRefTy->getDescription());
 | ||
|           UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
 | ||
|           UR_OUT("  * Type '" << OldName << "' refined upreference to: "
 | ||
|                  << (const void*)Ty << ", " << Ty->getDescription() << "\n");
 | ||
|         }
 | ||
|         UpRefs.erase(UpRefs.begin()+i);     // Remove from upreference list...
 | ||
|         --i;                                // Do not skip the next element...
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   if (TypeToResolve) {
 | ||
|     UR_OUT("  * Resolving upreference for "
 | ||
|            << UpRefs[i].second->getDescription() << "\n";
 | ||
|            std::string OldName = TypeToResolve->getDescription());
 | ||
|     TypeToResolve->refineAbstractTypeTo(Ty);
 | ||
|   }
 | ||
| 
 | ||
|   return Ty;
 | ||
| }
 | ||
| 
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| //            RunVMAsmParser - Define an interface to this parser
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| //
 | ||
| static Module* RunParser(Module * M);
 | ||
| 
 | ||
| Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
 | ||
|   set_scan_file(F);
 | ||
| 
 | ||
|   CurFilename = Filename;
 | ||
|   return RunParser(new Module(CurFilename));
 | ||
| }
 | ||
| 
 | ||
| Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
 | ||
|   set_scan_string(AsmString);
 | ||
| 
 | ||
|   CurFilename = "from_memory";
 | ||
|   if (M == NULL) {
 | ||
|     return RunParser(new Module (CurFilename));
 | ||
|   } else {
 | ||
|     return RunParser(M);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| #line 938 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| typedef union {
 | ||
|   llvm::Module                           *ModuleVal;
 | ||
|   llvm::Function                         *FunctionVal;
 | ||
|   llvm::BasicBlock                       *BasicBlockVal;
 | ||
|   llvm::TerminatorInst                   *TermInstVal;
 | ||
|   llvm::Instruction                      *InstVal;
 | ||
|   llvm::Constant                         *ConstVal;
 | ||
| 
 | ||
|   const llvm::Type                       *PrimType;
 | ||
|   std::list<llvm::PATypeHolder>          *TypeList;
 | ||
|   llvm::PATypeHolder                     *TypeVal;
 | ||
|   llvm::Value                            *ValueVal;
 | ||
|   std::vector<llvm::Value*>              *ValueList;
 | ||
|   llvm::ArgListType                      *ArgList;
 | ||
|   llvm::TypeWithAttrs                     TypeWithAttrs;
 | ||
|   llvm::TypeWithAttrsList                *TypeWithAttrsList;
 | ||
|   llvm::ValueRefList                     *ValueRefList;
 | ||
| 
 | ||
|   // Represent the RHS of PHI node
 | ||
|   std::list<std::pair<llvm::Value*,
 | ||
|                       llvm::BasicBlock*> > *PHIList;
 | ||
|   std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
 | ||
|   std::vector<llvm::Constant*>           *ConstVector;
 | ||
| 
 | ||
|   llvm::GlobalValue::LinkageTypes         Linkage;
 | ||
|   llvm::GlobalValue::VisibilityTypes      Visibility;
 | ||
|   uint16_t                          ParamAttrs;
 | ||
|   llvm::APInt                       *APIntVal;
 | ||
|   int64_t                           SInt64Val;
 | ||
|   uint64_t                          UInt64Val;
 | ||
|   int                               SIntVal;
 | ||
|   unsigned                          UIntVal;
 | ||
|   double                            FPVal;
 | ||
|   bool                              BoolVal;
 | ||
| 
 | ||
|   char                             *StrVal;   // This memory is strdup'd!
 | ||
|   llvm::ValID                       ValIDVal; // strdup'd memory maybe!
 | ||
| 
 | ||
|   llvm::Instruction::BinaryOps      BinaryOpVal;
 | ||
|   llvm::Instruction::TermOps        TermOpVal;
 | ||
|   llvm::Instruction::MemoryOps      MemOpVal;
 | ||
|   llvm::Instruction::CastOps        CastOpVal;
 | ||
|   llvm::Instruction::OtherOps       OtherOpVal;
 | ||
|   llvm::ICmpInst::Predicate         IPredicate;
 | ||
|   llvm::FCmpInst::Predicate         FPredicate;
 | ||
| } YYSTYPE;
 | ||
| #include <stdio.h>
 | ||
| 
 | ||
| #ifndef __cplusplus
 | ||
| #ifndef __STDC__
 | ||
| #define const
 | ||
| #endif
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| #define	YYFINAL		565
 | ||
| #define	YYFLAG		-32768
 | ||
| #define	YYNTBASE	149
 | ||
| 
 | ||
| #define YYTRANSLATE(x) ((unsigned)(x) <= 388 ? yytranslate[x] : 227)
 | ||
| 
 | ||
| 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,   139,
 | ||
|    140,   137,     2,   136,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,   144,
 | ||
|    135,   145,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|    141,   138,   143,     2,     2,     2,     2,     2,   148,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,   142,
 | ||
|      2,     2,   146,     2,   147,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     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
 | ||
| };
 | ||
| 
 | ||
| #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,
 | ||
|    119,   122,   123,   125,   127,   130,   131,   133,   135,   137,
 | ||
|    139,   141,   143,   145,   147,   148,   150,   151,   153,   155,
 | ||
|    156,   158,   160,   162,   164,   165,   167,   169,   171,   173,
 | ||
|    175,   178,   180,   182,   184,   186,   187,   190,   192,   194,
 | ||
|    196,   197,   200,   201,   204,   205,   209,   212,   213,   215,
 | ||
|    216,   220,   222,   225,   227,   229,   231,   233,   235,   237,
 | ||
|    240,   242,   245,   251,   257,   263,   269,   273,   276,   282,
 | ||
|    287,   290,   292,   294,   296,   300,   302,   306,   308,   309,
 | ||
|    311,   315,   320,   324,   328,   333,   338,   342,   349,   355,
 | ||
|    358,   361,   364,   367,   370,   373,   376,   379,   382,   385,
 | ||
|    388,   391,   398,   404,   413,   420,   427,   435,   443,   450,
 | ||
|    459,   468,   472,   474,   476,   478,   480,   481,   483,   484,
 | ||
|    486,   489,   490,   494,   495,   499,   503,   507,   511,   512,
 | ||
|    520,   521,   530,   531,   540,   543,   547,   549,   553,   557,
 | ||
|    561,   565,   567,   568,   574,   578,   580,   584,   586,   587,
 | ||
|    597,   599,   601,   606,   608,   610,   613,   617,   618,   620,
 | ||
|    622,   624,   626,   628,   630,   632,   634,   636,   640,   642,
 | ||
|    648,   650,   652,   654,   656,   658,   660,   663,   666,   669,
 | ||
|    673,   676,   677,   679,   682,   685,   689,   699,   709,   718,
 | ||
|    733,   735,   737,   744,   750,   753,   760,   768,   772,   778,
 | ||
|    779,   780,   784,   787,   789,   795,   801,   808,   815,   820,
 | ||
|    827,   832,   837,   844,   851,   854,   863,   865,   867,   868,
 | ||
|    872,   879,   883,   890,   893,   899,   907
 | ||
| };
 | ||
| 
 | ||
| static const short yyrhs[] = {    68,
 | ||
|      0,    69,     0,    70,     0,    71,     0,    72,     0,    73,
 | ||
|      0,    74,     0,    75,     0,    76,     0,    80,     0,    81,
 | ||
|      0,    82,     0,    77,     0,    78,     0,    79,     0,   111,
 | ||
|      0,   112,     0,   113,     0,   114,     0,   115,     0,   116,
 | ||
|      0,   117,     0,   118,     0,   119,     0,   120,     0,   121,
 | ||
|      0,   122,     0,    85,     0,    86,     0,    87,     0,    88,
 | ||
|      0,    89,     0,    90,     0,    91,     0,    92,     0,    93,
 | ||
|      0,    94,     0,    95,     0,    96,     0,    97,     0,    98,
 | ||
|      0,    99,     0,   100,     0,   101,     0,   102,     0,   103,
 | ||
|      0,   104,     0,    91,     0,    92,     0,    93,     0,    94,
 | ||
|      0,    22,     0,    23,     0,    11,     0,    12,     0,    13,
 | ||
|      0,    16,     0,    19,     0,   156,     0,     0,   156,   135,
 | ||
|      0,     0,    17,     0,    20,     0,   159,   135,     0,     0,
 | ||
|     37,     0,    39,     0,    38,     0,    40,     0,    42,     0,
 | ||
|     41,     0,    43,     0,    45,     0,     0,   134,     0,     0,
 | ||
|     41,     0,    43,     0,     0,    37,     0,    38,     0,    39,
 | ||
|      0,    42,     0,     0,    56,     0,    57,     0,    58,     0,
 | ||
|     59,     0,    60,     0,    55,     4,     0,   112,     0,   113,
 | ||
|      0,   130,     0,   131,     0,     0,   168,   167,     0,   129,
 | ||
|      0,   132,     0,   167,     0,     0,   170,   169,     0,     0,
 | ||
|     48,     4,     0,     0,   136,    48,     4,     0,    30,    19,
 | ||
|      0,     0,   173,     0,     0,   136,   176,   175,     0,   173,
 | ||
|      0,    48,     4,     0,    11,     0,    12,     0,    13,     0,
 | ||
|     14,     0,    44,     0,   177,     0,   178,   137,     0,   211,
 | ||
|      0,   138,     4,     0,   178,   139,   182,   140,   170,     0,
 | ||
|     10,   139,   182,   140,   170,     0,   141,     4,   142,   178,
 | ||
|    143,     0,   144,     4,   142,   178,   145,     0,   146,   183,
 | ||
|    147,     0,   146,   147,     0,   144,   146,   183,   147,   145,
 | ||
|      0,   144,   146,   147,   145,     0,   178,   168,     0,   178,
 | ||
|      0,    10,     0,   179,     0,   181,   136,   179,     0,   181,
 | ||
|      0,   181,   136,    34,     0,    34,     0,     0,   178,     0,
 | ||
|    183,   136,   178,     0,   178,   141,   186,   143,     0,   178,
 | ||
|    141,   143,     0,   178,   148,    19,     0,   178,   144,   186,
 | ||
|    145,     0,   178,   146,   186,   147,     0,   178,   146,   147,
 | ||
|      0,   178,   144,   146,   186,   147,   145,     0,   178,   144,
 | ||
|    146,   147,   145,     0,   178,    35,     0,   178,    36,     0,
 | ||
|    178,   211,     0,   178,   185,     0,   178,    21,     0,   154,
 | ||
|      3,     0,   154,     5,     0,   154,     4,     0,   154,     6,
 | ||
|      0,    11,    22,     0,    11,    23,     0,   155,     9,     0,
 | ||
|    151,   139,   184,    33,   178,   140,     0,   110,   139,   184,
 | ||
|    222,   140,     0,   124,   139,   184,   136,   184,   136,   184,
 | ||
|    140,     0,   149,   139,   184,   136,   184,   140,     0,   150,
 | ||
|    139,   184,   136,   184,   140,     0,    83,   152,   139,   184,
 | ||
|    136,   184,   140,     0,    84,   153,   139,   184,   136,   184,
 | ||
|    140,     0,   126,   139,   184,   136,   184,   140,     0,   127,
 | ||
|    139,   184,   136,   184,   136,   184,   140,     0,   128,   139,
 | ||
|    184,   136,   184,   136,   184,   140,     0,   186,   136,   184,
 | ||
|      0,   184,     0,    28,     0,    29,     0,    32,     0,     0,
 | ||
|    190,     0,     0,   191,     0,   190,   191,     0,     0,    27,
 | ||
|    192,   207,     0,     0,    26,   193,   208,     0,    53,    52,
 | ||
|    197,     0,   158,    15,   178,     0,   158,    15,    10,     0,
 | ||
|      0,   160,   163,   188,   187,   184,   194,   175,     0,     0,
 | ||
|    160,   161,   163,   188,   187,   184,   195,   175,     0,     0,
 | ||
|    160,   162,   163,   188,   187,   178,   196,   175,     0,    46,
 | ||
|    198,     0,    49,   135,   199,     0,    19,     0,    47,   135,
 | ||
|     19,     0,    61,   135,    19,     0,   141,   200,   143,     0,
 | ||
|    200,   136,    19,     0,    19,     0,     0,   201,   136,   178,
 | ||
|    168,   157,     0,   178,   168,   157,     0,   201,     0,   201,
 | ||
|    136,    34,     0,    34,     0,     0,   166,   180,   159,   139,
 | ||
|    202,   140,   170,   174,   171,     0,    24,     0,   146,     0,
 | ||
|    165,   163,   203,   204,     0,    25,     0,   147,     0,   214,
 | ||
|    206,     0,   164,   163,   203,     0,     0,    54,     0,     3,
 | ||
|      0,     4,     0,     9,     0,    22,     0,    23,     0,    35,
 | ||
|      0,    36,     0,    21,     0,   144,   186,   145,     0,   185,
 | ||
|      0,    52,   209,    19,   136,    19,     0,     7,     0,     8,
 | ||
|      0,   156,     0,   159,     0,   211,     0,   210,     0,   178,
 | ||
|    212,     0,   214,   215,     0,   205,   215,     0,   216,   158,
 | ||
|    217,     0,   216,   219,     0,     0,    18,     0,    62,   213,
 | ||
|      0,    62,    10,     0,    63,    14,   212,     0,    63,    11,
 | ||
|    212,   136,    14,   212,   136,    14,   212,     0,    64,   154,
 | ||
|    212,   136,    14,   212,   141,   218,   143,     0,    64,   154,
 | ||
|    212,   136,    14,   212,   141,   143,     0,    65,   166,   180,
 | ||
|    212,   139,   221,   140,   170,    33,    14,   212,    66,    14,
 | ||
|    212,     0,    66,     0,    67,     0,   218,   154,   210,   136,
 | ||
|     14,   212,     0,   154,   210,   136,    14,   212,     0,   158,
 | ||
|    224,     0,   178,   141,   212,   136,   212,   143,     0,   220,
 | ||
|    136,   141,   212,   136,   212,   143,     0,   178,   212,   168,
 | ||
|      0,   221,   136,   178,   212,   168,     0,     0,     0,   222,
 | ||
|    136,   213,     0,    51,    50,     0,    50,     0,   149,   178,
 | ||
|    212,   136,   212,     0,   150,   178,   212,   136,   212,     0,
 | ||
|     83,   152,   178,   212,   136,   212,     0,    84,   153,   178,
 | ||
|    212,   136,   212,     0,   151,   213,    33,   178,     0,   124,
 | ||
|    213,   136,   213,   136,   213,     0,   125,   213,   136,   178,
 | ||
|      0,   126,   213,   136,   213,     0,   127,   213,   136,   213,
 | ||
|    136,   213,     0,   128,   213,   136,   213,   136,   213,     0,
 | ||
|    123,   220,     0,   223,   166,   180,   212,   139,   221,   140,
 | ||
|    170,     0,   226,     0,    31,     0,     0,   105,   178,   172,
 | ||
|      0,   105,   178,   136,    11,   212,   172,     0,   106,   178,
 | ||
|    172,     0,   106,   178,   136,    11,   212,   172,     0,   107,
 | ||
|    213,     0,   225,   108,   178,   212,   172,     0,   225,   109,
 | ||
|    213,   136,   178,   212,   172,     0,   110,   178,   212,   222,
 | ||
|      0
 | ||
| };
 | ||
| 
 | ||
| #endif
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
| static const short yyrline[] = { 0,
 | ||
|   1093,  1093,  1093,  1093,  1093,  1093,  1093,  1093,  1093,  1094,
 | ||
|   1094,  1094,  1094,  1094,  1094,  1095,  1095,  1095,  1095,  1095,
 | ||
|   1095,  1095,  1096,  1096,  1096,  1096,  1096,  1099,  1099,  1100,
 | ||
|   1100,  1101,  1101,  1102,  1102,  1103,  1103,  1107,  1107,  1108,
 | ||
|   1108,  1109,  1109,  1110,  1110,  1111,  1111,  1112,  1112,  1113,
 | ||
|   1113,  1114,  1115,  1120,  1121,  1121,  1123,  1123,  1124,  1124,
 | ||
|   1128,  1132,  1137,  1137,  1139,  1143,  1149,  1150,  1151,  1152,
 | ||
|   1153,  1157,  1158,  1159,  1163,  1164,  1168,  1169,  1170,  1174,
 | ||
|   1175,  1176,  1177,  1178,  1181,  1181,  1182,  1183,  1184,  1185,
 | ||
|   1186,  1194,  1195,  1196,  1197,  1200,  1201,  1206,  1207,  1208,
 | ||
|   1211,  1212,  1219,  1219,  1226,  1226,  1235,  1243,  1243,  1249,
 | ||
|   1249,  1251,  1256,  1269,  1269,  1269,  1269,  1272,  1276,  1280,
 | ||
|   1287,  1292,  1300,  1330,  1361,  1366,  1378,  1388,  1392,  1402,
 | ||
|   1409,  1416,  1423,  1428,  1433,  1440,  1441,  1448,  1455,  1463,
 | ||
|   1469,  1481,  1509,  1525,  1554,  1582,  1607,  1626,  1652,  1672,
 | ||
|   1684,  1691,  1757,  1767,  1777,  1783,  1793,  1799,  1809,  1814,
 | ||
|   1819,  1827,  1839,  1861,  1869,  1875,  1886,  1891,  1896,  1902,
 | ||
|   1908,  1917,  1921,  1929,  1929,  1932,  1932,  1943,  1948,  1956,
 | ||
|   1957,  1961,  1961,  1965,  1965,  1968,  1971,  1995,  2006,  2013,
 | ||
|   2016,  2021,  2024,  2030,  2034,  2037,  2043,  2056,  2060,  2065,
 | ||
|   2067,  2072,  2077,  2086,  2096,  2107,  2111,  2120,  2129,  2134,
 | ||
|   2256,  2256,  2258,  2267,  2267,  2269,  2274,  2286,  2290,  2295,
 | ||
|   2299,  2303,  2307,  2311,  2315,  2319,  2323,  2327,  2352,  2356,
 | ||
|   2370,  2374,  2378,  2382,  2388,  2388,  2394,  2403,  2407,  2416,
 | ||
|   2425,  2434,  2438,  2443,  2447,  2451,  2456,  2466,  2485,  2494,
 | ||
|   2574,  2578,  2585,  2596,  2609,  2619,  2630,  2640,  2649,  2658,
 | ||
|   2661,  2662,  2669,  2673,  2678,  2699,  2716,  2730,  2744,  2756,
 | ||
|   2764,  2771,  2777,  2783,  2789,  2804,  2889,  2894,  2898,  2905,
 | ||
|   2912,  2920,  2927,  2935,  2943,  2957,  2974
 | ||
| };
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| #if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
 | ||
| 
 | ||
| static const char * const yytname[] = {   "$","error","$undefined.","ESINT64VAL",
 | ||
| "EUINT64VAL","ESAPINTVAL","EUAPINTVAL","LOCALVAL_ID","GLOBALVAL_ID","FPVAL",
 | ||
| "VOID","INTTYPE","FLOAT","DOUBLE","LABEL","TYPE","LOCALVAR","GLOBALVAR","LABELSTR",
 | ||
| "STRINGCONSTANT","ATSTRINGCONSTANT","ZEROINITIALIZER","TRUETOK","FALSETOK","BEGINTOK",
 | ||
| "ENDTOK","DECLARE","DEFINE","GLOBAL","CONSTANT","SECTION","VOLATILE","THREAD_LOCAL",
 | ||
| "TO","DOTDOTDOT","NULL_TOK","UNDEF","INTERNAL","LINKONCE","WEAK","APPENDING",
 | ||
| "DLLIMPORT","DLLEXPORT","EXTERN_WEAK","OPAQUE","EXTERNAL","TARGET","TRIPLE",
 | ||
| "ALIGN","DEPLIBS","CALL","TAIL","ASM_TOK","MODULE","SIDEEFFECT","CC_TOK","CCC_TOK",
 | ||
| "FASTCC_TOK","COLDCC_TOK","X86_STDCALLCC_TOK","X86_FASTCALLCC_TOK","DATALAYOUT",
 | ||
| "RET","BR","SWITCH","INVOKE","UNWIND","UNREACHABLE","ADD","SUB","MUL","UDIV",
 | ||
| "SDIV","FDIV","UREM","SREM","FREM","AND","OR","XOR","SHL","LSHR","ASHR","ICMP",
 | ||
| "FCMP","EQ","NE","SLT","SGT","SLE","SGE","ULT","UGT","ULE","UGE","OEQ","ONE",
 | ||
| "OLT","OGT","OLE","OGE","ORD","UNO","UEQ","UNE","MALLOC","ALLOCA","FREE","LOAD",
 | ||
| "STORE","GETELEMENTPTR","TRUNC","ZEXT","SEXT","FPTRUNC","FPEXT","BITCAST","UITOFP",
 | ||
| "SITOFP","FPTOUI","FPTOSI","INTTOPTR","PTRTOINT","PHI_TOK","SELECT","VAARG",
 | ||
| "EXTRACTELEMENT","INSERTELEMENT","SHUFFLEVECTOR","NORETURN","INREG","SRET","NOUNWIND",
 | ||
| "DEFAULT","HIDDEN","'='","','","'*'","'\\\\'","'('","')'","'['","'x'","']'",
 | ||
| "'<'","'>'","'{'","'}'","'c'","ArithmeticOps","LogicalOps","CastOps","IPredicates",
 | ||
| "FPredicates","IntType","FPType","LocalName","OptLocalName","OptLocalAssign",
 | ||
| "GlobalName","OptGlobalAssign","GVInternalLinkage","GVExternalLinkage","GVVisibilityStyle",
 | ||
| "FunctionDeclareLinkage","FunctionDefineLinkage","OptCallingConv","ParamAttr",
 | ||
| "OptParamAttrs","FuncAttr","OptFuncAttrs","OptAlign","OptCAlign","SectionString",
 | ||
| "OptSection","GlobalVarAttributes","GlobalVarAttribute","PrimType","Types","ArgType",
 | ||
| "ResultTypes","ArgTypeList","ArgTypeListI","TypeListI","ConstVal","ConstExpr",
 | ||
| "ConstVector","GlobalType","ThreadLocal","Module","DefinitionList","Definition",
 | ||
| "@1","@2","@3","@4","@5","AsmBlock","TargetDefinition","LibrariesDefinition",
 | ||
| "LibList","ArgListH","ArgList","FunctionHeaderH","BEGIN","FunctionHeader","END",
 | ||
| "Function","FunctionProto","OptSideEffect","ConstValueRef","SymbolicValueRef",
 | ||
| "ValueRef","ResolvedVal","BasicBlockList","BasicBlock","InstructionList","BBTerminatorInst",
 | ||
| "JumpTable","Inst","PHIList","ValueRefList","IndexList","OptTailCall","InstVal",
 | ||
| "OptVolatile","MemoryInst", NULL
 | ||
| };
 | ||
| #endif
 | ||
| 
 | ||
| static const short yyr1[] = {     0,
 | ||
|    149,   149,   149,   149,   149,   149,   149,   149,   149,   150,
 | ||
|    150,   150,   150,   150,   150,   151,   151,   151,   151,   151,
 | ||
|    151,   151,   151,   151,   151,   151,   151,   152,   152,   152,
 | ||
|    152,   152,   152,   152,   152,   152,   152,   153,   153,   153,
 | ||
|    153,   153,   153,   153,   153,   153,   153,   153,   153,   153,
 | ||
|    153,   153,   153,   154,   155,   155,   156,   156,   157,   157,
 | ||
|    158,   158,   159,   159,   160,   160,   161,   161,   161,   161,
 | ||
|    161,   162,   162,   162,   163,   163,   164,   164,   164,   165,
 | ||
|    165,   165,   165,   165,   166,   166,   166,   166,   166,   166,
 | ||
|    166,   167,   167,   167,   167,   168,   168,   169,   169,   169,
 | ||
|    170,   170,   171,   171,   172,   172,   173,   174,   174,   175,
 | ||
|    175,   176,   176,   177,   177,   177,   177,   178,   178,   178,
 | ||
|    178,   178,   178,   178,   178,   178,   178,   178,   178,   178,
 | ||
|    179,   180,   180,   181,   181,   182,   182,   182,   182,   183,
 | ||
|    183,   184,   184,   184,   184,   184,   184,   184,   184,   184,
 | ||
|    184,   184,   184,   184,   184,   184,   184,   184,   184,   184,
 | ||
|    184,   185,   185,   185,   185,   185,   185,   185,   185,   185,
 | ||
|    185,   186,   186,   187,   187,   188,   188,   189,   189,   190,
 | ||
|    190,   192,   191,   193,   191,   191,   191,   191,   194,   191,
 | ||
|    195,   191,   196,   191,   191,   191,   197,   198,   198,   199,
 | ||
|    200,   200,   200,   201,   201,   202,   202,   202,   202,   203,
 | ||
|    204,   204,   205,   206,   206,   207,   208,   209,   209,   210,
 | ||
|    210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
 | ||
|    211,   211,   211,   211,   212,   212,   213,   214,   214,   215,
 | ||
|    216,   216,   216,   217,   217,   217,   217,   217,   217,   217,
 | ||
|    217,   217,   218,   218,   219,   220,   220,   221,   221,   221,
 | ||
|    222,   222,   223,   223,   224,   224,   224,   224,   224,   224,
 | ||
|    224,   224,   224,   224,   224,   224,   224,   225,   225,   226,
 | ||
|    226,   226,   226,   226,   226,   226,   226
 | ||
| };
 | ||
| 
 | ||
| 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,     0,
 | ||
|      2,     0,     1,     1,     2,     0,     1,     1,     1,     1,
 | ||
|      1,     1,     1,     1,     0,     1,     0,     1,     1,     0,
 | ||
|      1,     1,     1,     1,     0,     1,     1,     1,     1,     1,
 | ||
|      2,     1,     1,     1,     1,     0,     2,     1,     1,     1,
 | ||
|      0,     2,     0,     2,     0,     3,     2,     0,     1,     0,
 | ||
|      3,     1,     2,     1,     1,     1,     1,     1,     1,     2,
 | ||
|      1,     2,     5,     5,     5,     5,     3,     2,     5,     4,
 | ||
|      2,     1,     1,     1,     3,     1,     3,     1,     0,     1,
 | ||
|      3,     4,     3,     3,     4,     4,     3,     6,     5,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     6,     5,     8,     6,     6,     7,     7,     6,     8,
 | ||
|      8,     3,     1,     1,     1,     1,     0,     1,     0,     1,
 | ||
|      2,     0,     3,     0,     3,     3,     3,     3,     0,     7,
 | ||
|      0,     8,     0,     8,     2,     3,     1,     3,     3,     3,
 | ||
|      3,     1,     0,     5,     3,     1,     3,     1,     0,     9,
 | ||
|      1,     1,     4,     1,     1,     2,     3,     0,     1,     1,
 | ||
|      1,     1,     1,     1,     1,     1,     1,     3,     1,     5,
 | ||
|      1,     1,     1,     1,     1,     1,     2,     2,     2,     3,
 | ||
|      2,     0,     1,     2,     2,     3,     9,     9,     8,    14,
 | ||
|      1,     1,     6,     5,     2,     6,     7,     3,     5,     0,
 | ||
|      0,     3,     2,     1,     5,     5,     6,     6,     4,     6,
 | ||
|      4,     4,     6,     6,     2,     8,     1,     1,     0,     3,
 | ||
|      6,     3,     6,     2,     5,     7,     4
 | ||
| };
 | ||
| 
 | ||
| static const short yydefact[] = {    66,
 | ||
|     57,    63,    58,    64,   184,   182,     0,     0,     0,     0,
 | ||
|      0,     0,    75,    66,   180,    77,    80,     0,     0,   195,
 | ||
|      0,     0,    61,     0,    65,    67,    69,    68,    70,    72,
 | ||
|     71,    73,    74,    76,    75,    75,   177,   181,    78,    79,
 | ||
|     75,   185,    81,    82,    83,    84,    75,   242,   183,   242,
 | ||
|      0,     0,   203,   196,   197,   186,   231,   232,   188,   114,
 | ||
|    115,   116,   117,   118,     0,     0,     0,     0,   233,   234,
 | ||
|    119,   187,   121,   177,   177,   176,     0,    85,    85,   243,
 | ||
|    239,    62,   214,   215,   216,   238,   198,   199,   202,     0,
 | ||
|    139,   122,     0,     0,     0,     0,   128,   140,     0,   120,
 | ||
|    139,     0,     0,   174,   175,     0,     0,    86,    87,    88,
 | ||
|     89,    90,     0,   217,     0,   279,   241,     0,   200,   138,
 | ||
|     96,   134,   136,     0,     0,     0,     0,     0,     0,   127,
 | ||
|      0,     0,     0,   114,   115,   116,     0,     0,     0,   189,
 | ||
|     91,   133,   132,     0,   211,   212,   213,   278,   264,     0,
 | ||
|      0,     0,     0,    85,   251,   252,     1,     2,     3,     4,
 | ||
|      5,     6,     7,     8,     9,    13,    14,    15,    10,    11,
 | ||
|     12,     0,     0,     0,     0,     0,     0,    16,    17,    18,
 | ||
|     19,    20,    21,    22,    23,    24,    25,    26,    27,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,   240,    85,
 | ||
|    255,     0,   277,   201,   131,     0,   101,     0,     0,   130,
 | ||
|      0,   141,   101,   191,   193,   159,   160,   155,   157,   156,
 | ||
|    158,   161,   154,   150,   151,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,   153,
 | ||
|    152,   110,     0,   263,   245,     0,   244,     0,     0,    54,
 | ||
|      0,     0,    28,    29,    30,    31,    32,    33,    34,    35,
 | ||
|     36,    37,     0,    52,    53,    48,    49,    50,    51,    38,
 | ||
|     39,    40,    41,    42,    43,    44,    45,    46,    47,     0,
 | ||
|    105,   105,   284,     0,     0,   275,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,    92,    93,    94,
 | ||
|     95,    97,   137,   135,   124,   125,   126,   129,   123,   110,
 | ||
|    110,     0,     0,     0,     0,     0,     0,     0,   143,   173,
 | ||
|      0,     0,     0,   147,     0,   144,     0,     0,     0,     0,
 | ||
|    190,   209,   220,   221,   222,   227,   223,   224,   225,   226,
 | ||
|    218,     0,   229,   236,   235,   237,     0,   246,     0,     0,
 | ||
|      0,     0,     0,   280,     0,   282,   261,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|     98,    99,   100,   102,   192,   194,     0,     0,   261,     0,
 | ||
|      0,     0,     0,     0,   142,   128,   140,     0,   145,   146,
 | ||
|      0,     0,     0,     0,     0,   112,   110,   208,    96,   206,
 | ||
|      0,   219,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,   287,     0,     0,     0,   271,   272,     0,     0,
 | ||
|      0,     0,   269,     0,   105,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,   172,   149,     0,     0,     0,     0,   107,
 | ||
|    113,   111,    60,     0,   101,     0,   228,     0,     0,   260,
 | ||
|      0,     0,   105,   106,   105,     0,     0,     0,     0,     0,
 | ||
|      0,   265,   266,   260,     0,   285,     0,     0,     0,   163,
 | ||
|      0,     0,     0,     0,   148,     0,     0,     0,    59,   205,
 | ||
|    207,    96,   108,     0,     0,     0,     0,     0,   267,   268,
 | ||
|    281,   283,   262,     0,     0,   270,   273,   274,     0,   105,
 | ||
|      0,     0,     0,   169,     0,     0,   165,   166,   162,    60,
 | ||
|    109,   103,   230,     0,     0,    96,     0,   101,   256,     0,
 | ||
|    101,   286,   167,   168,     0,     0,     0,   204,     0,   210,
 | ||
|      0,   249,     0,     0,   258,     0,     0,   257,   276,   164,
 | ||
|    170,   171,   104,   247,     0,   248,     0,    96,     0,     0,
 | ||
|      0,   259,     0,     0,     0,     0,   254,     0,     0,   253,
 | ||
|      0,   250,     0,     0,     0
 | ||
| };
 | ||
| 
 | ||
| static const short yydefgoto[] = {   237,
 | ||
|    238,   239,   263,   280,   137,   138,    69,   480,    11,    70,
 | ||
|     13,    35,    36,    37,    41,    47,   113,   302,   205,   374,
 | ||
|    305,   530,   354,   396,   512,   331,   397,    71,   139,   122,
 | ||
|    144,   123,   124,    99,   320,   343,   321,   106,    77,   563,
 | ||
|     14,    15,    17,    16,   242,   310,   311,    56,    20,    54,
 | ||
|     90,   400,   401,   114,   147,    48,    85,    49,    42,   403,
 | ||
|    344,    73,   346,   247,    50,    81,    82,   199,   534,   117,
 | ||
|    286,   488,   413,   200,   201,   202,   203
 | ||
| };
 | ||
| 
 | ||
| static const short yypact[] = {   593,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,    -1,   -87,    11,   -41,
 | ||
|     89,   -13,    46,  1408,-32768,   185,    82,    13,    55,-32768,
 | ||
|     81,   211,-32768,  1122,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,    98,    98,   206,-32768,-32768,-32768,
 | ||
|     98,-32768,-32768,-32768,-32768,-32768,    98,   235,-32768,     8,
 | ||
|    242,   251,   252,-32768,-32768,-32768,-32768,-32768,   128,-32768,
 | ||
| -32768,-32768,-32768,-32768,   272,   274,     4,   122,-32768,-32768,
 | ||
| -32768,    61,-32768,   206,   206,-32768,   183,   290,   290,-32768,
 | ||
| -32768,   121,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   -92,
 | ||
|    979,-32768,   137,   139,   284,   128,-32768,    61,   -70,-32768,
 | ||
|    979,   183,   183,-32768,-32768,  1136,   278,-32768,-32768,-32768,
 | ||
| -32768,-32768,  1178,-32768,   -15,  1277,-32768,   264,-32768,-32768,
 | ||
|     61,-32768,   148,   153,  1192,  1192,   160,   -66,  1192,-32768,
 | ||
|    162,  1136,  1192,    32,   297,   298,   215,   301,   761,-32768,
 | ||
| -32768,   128,    61,   145,-32768,-32768,-32768,-32768,-32768,   262,
 | ||
|   1234,   248,   304,   290,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,   157,   422,  1192,  1192,  1192,  1192,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1192,
 | ||
|   1192,  1192,  1192,  1192,  1192,  1192,  1192,  1192,-32768,   290,
 | ||
| -32768,   -34,-32768,-32768,   -33,  1019,-32768,    71,   -22,-32768,
 | ||
|    173,    61,-32768,-32768,    61,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,   157,   422,   180,   181,   182,
 | ||
|    184,   186,  1038,  1276,   448,   305,   187,   188,   191,-32768,
 | ||
| -32768,   193,   192,-32768,   128,   614,-32768,   740,   740,-32768,
 | ||
|    740,  1178,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,  1192,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1192,
 | ||
|     88,   119,-32768,   614,    62,   197,   198,   199,   200,   207,
 | ||
|    217,   614,   614,   309,  1178,  1192,  1192,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,   -73,-32768,-32768,-32768,   -73,   193,
 | ||
|    193,   212,   216,  1136,  1136,  1136,  1136,  1136,-32768,-32768,
 | ||
|    -44,   933,   -69,-32768,   -40,-32768,  1136,  1136,  1136,    -5,
 | ||
| -32768,  1077,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
|    300,  1136,-32768,-32768,-32768,-32768,   220,-32768,   221,   740,
 | ||
|    614,   614,    17,-32768,    23,-32768,-32768,   740,   218,  1192,
 | ||
|   1192,  1192,  1192,  1192,   222,   225,  1192,   740,   614,   226,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,  1136,  1136,-32768,   227,
 | ||
|    229,   230,   231,  1136,-32768,   228,   761,   -35,-32768,-32768,
 | ||
|    234,   236,   341,   356,   372,-32768,   193,-32768,    61,   241,
 | ||
|    238,-32768,   360,   -36,   366,   367,   243,   253,   254,   740,
 | ||
|    387,   740,   256,   257,   740,   258,    61,-32768,   259,   266,
 | ||
|    740,   740,    61,   261,   269,  1192,   270,   271,   -67,  1136,
 | ||
|   1136,  1136,  1136,-32768,-32768,   263,  1136,  1136,  1192,-32768,
 | ||
| -32768,-32768,    33,  1093,-32768,   273,-32768,   740,   740,  1192,
 | ||
|    740,   740,   269,-32768,   269,  1192,   740,   275,  1192,  1192,
 | ||
|   1192,-32768,-32768,  1192,   362,-32768,   614,  1136,  1136,-32768,
 | ||
|    279,   277,   288,   293,-32768,   280,   292,    42,-32768,-32768,
 | ||
| -32768,    61,    65,   395,   299,   308,   614,     7,-32768,-32768,
 | ||
| -32768,-32768,-32768,   291,   740,-32768,-32768,-32768,    73,   269,
 | ||
|    302,   306,  1136,-32768,  1136,  1136,-32768,-32768,-32768,    33,
 | ||
| -32768,   391,-32768,   426,     1,-32768,  1192,-32768,-32768,   307,
 | ||
| -32768,-32768,-32768,-32768,   311,   312,   313,-32768,   453,-32768,
 | ||
|    740,-32768,   890,    18,   -33,   614,    75,-32768,   -73,-32768,
 | ||
| -32768,-32768,-32768,-32768,   327,-32768,   890,-32768,   452,   455,
 | ||
|    337,   -33,   740,   740,   460,   409,-32768,   740,   462,-32768,
 | ||
|    740,-32768,   477,   479,-32768
 | ||
| };
 | ||
| 
 | ||
| static const short yypgoto[] = {   364,
 | ||
|    365,   368,   260,   255,  -151,-32768,     0,   -27,   403,    16,
 | ||
| -32768,-32768,-32768,     6,-32768,-32768,  -139,  -298,  -389,-32768,
 | ||
|   -210,-32768,  -269,    10,-32768,  -279,-32768,-32768,   -23,   281,
 | ||
|   -233,-32768,   389,   396,    70,  -133,  -217,   134,   190,-32768,
 | ||
| -32768,   481,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,   417,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
|   -483,  -135,   120,  -171,-32768,   447,-32768,-32768,-32768,-32768,
 | ||
| -32768,    34,   125,-32768,-32768,-32768,-32768
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| #define	YYLAST		1461
 | ||
| 
 | ||
| 
 | ||
| static const short yytable[] = {    10,
 | ||
|     72,   251,   309,   241,   283,   240,   373,    94,   145,   443,
 | ||
|    373,   250,   356,    10,   252,    12,   323,   325,   350,   287,
 | ||
|    288,   289,   290,   291,   394,    80,   294,   410,   250,    12,
 | ||
|    375,   376,    83,   412,   -54,   -54,   -54,   -54,   298,   299,
 | ||
|     74,    75,   395,   118,    98,    18,    78,    21,     1,   545,
 | ||
|    119,     3,    79,   216,   217,   371,   300,   301,   372,    19,
 | ||
|    295,   368,    22,   551,   411,   129,   384,   121,   456,   129,
 | ||
|    411,    98,   470,   296,   297,   389,   130,   121,   298,   299,
 | ||
|    211,    10,    26,    27,    28,    29,    30,    31,    32,   143,
 | ||
|     33,   384,   510,    23,   394,   384,   300,   301,   385,   384,
 | ||
|    384,   208,   209,    24,   388,   212,   390,   549,   447,   215,
 | ||
|    345,   436,   345,   345,   100,   345,   101,   442,    43,    44,
 | ||
|     45,    25,   307,    46,   404,   370,   535,   246,    57,    58,
 | ||
|    146,    96,    60,    61,    62,    63,     1,     1,     2,     3,
 | ||
|      3,     4,   517,   532,   298,   299,   518,    51,   345,    95,
 | ||
|    281,   282,   246,   284,    84,   466,   345,   345,   552,   243,
 | ||
|    546,     2,   300,   301,     4,    64,   285,   246,   246,   246,
 | ||
|    246,   246,   292,   293,   246,   140,   298,   299,   100,    34,
 | ||
|    101,   509,   121,   491,   373,   492,   298,   299,   416,    52,
 | ||
|    418,   419,   420,   371,   300,   301,   372,   100,   100,   101,
 | ||
|    101,   214,   358,   371,   300,   301,   372,   100,   517,   101,
 | ||
|    104,   105,   521,   306,   345,   345,   345,   218,   219,   220,
 | ||
|    221,    53,   345,   353,   100,    39,   101,    40,   143,    55,
 | ||
|    522,    34,   345,   345,   483,   132,   133,    76,   373,   351,
 | ||
|    373,   253,   254,   255,   256,   257,   258,   259,   260,   261,
 | ||
|    262,   241,    80,   240,   355,   100,   352,   101,   248,    65,
 | ||
|     87,   249,    66,   102,   103,    67,    91,    68,    97,    88,
 | ||
|     89,   143,   369,   246,   345,    92,   345,    93,   125,   345,
 | ||
|    126,   141,   204,   206,   493,   345,   345,   496,   497,   498,
 | ||
|     57,    58,   207,    96,    60,    61,    62,    63,   387,     1,
 | ||
|      2,   213,     3,     4,   210,   -55,   -56,   537,   399,   222,
 | ||
|    539,   244,   345,   345,   250,   345,   345,   308,   314,   315,
 | ||
|    316,   345,   317,   326,   318,   327,   328,    64,   330,   329,
 | ||
|    332,   345,   359,   360,   361,   362,   246,   417,   246,   246,
 | ||
|    246,   367,   363,   423,   107,   108,   109,   110,   111,   112,
 | ||
|    377,   345,   364,   402,   378,   405,   406,   421,   415,   345,
 | ||
|    422,   426,   430,   533,   431,   432,   433,   347,   348,   437,
 | ||
|    349,   438,   435,   439,   440,   441,   444,   445,   446,   448,
 | ||
|    449,   450,   547,   379,   380,   381,   382,   383,   451,   452,
 | ||
|    454,   456,   457,   459,   460,   345,   391,   392,   393,   464,
 | ||
|    345,   461,   467,   357,   465,   468,   469,   475,   484,   411,
 | ||
|    495,   365,   366,   513,   503,   478,   504,   345,   345,   507,
 | ||
|    482,    65,   345,   505,    66,   345,   487,    67,   506,    68,
 | ||
|    127,   508,   246,   519,   514,   246,   246,   246,   529,   531,
 | ||
|    487,   523,   479,   264,   265,   524,   427,   428,   515,   538,
 | ||
|    540,   541,   542,   434,    57,    58,   543,    96,   134,   135,
 | ||
|    136,    63,   550,     1,     2,   553,     3,     4,   554,   407,
 | ||
|    408,   409,   555,   558,   559,   561,   564,   414,   565,   196,
 | ||
|    197,   313,   528,   198,   116,   312,   304,   424,   425,   131,
 | ||
|    128,    64,   511,   536,    38,   115,    86,   499,     0,   471,
 | ||
|    472,   473,   474,   429,     0,     0,   476,   477,     0,   479,
 | ||
|      0,     0,   266,   267,   268,   269,   270,   271,   272,   273,
 | ||
|    274,   275,   276,   277,   278,   279,     0,     0,     0,   453,
 | ||
|      0,   455,     0,     0,   458,     0,     0,   501,   502,     0,
 | ||
|    462,   463,     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,   485,   486,     0,
 | ||
|    489,   490,   525,     0,   526,   527,   494,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,    65,   500,     0,    66,     0,
 | ||
|      0,    67,  -179,    68,   324,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,   516,   -62,     1,     2,
 | ||
|      0,     3,     4,     0,   520,     0,   333,   334,     5,     6,
 | ||
|     57,    58,   335,     0,     0,     0,     0,     0,     0,     1,
 | ||
|      2,     0,     3,     4,   336,   337,   338,     0,     7,     0,
 | ||
|      0,     8,     0,     0,     0,     9,     0,     0,   339,   340,
 | ||
|    544,     0,     0,     0,     0,   548,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,   341,     0,     0,     0,     0,
 | ||
|      0,     0,   556,   557,     0,     0,     0,   560,     0,     0,
 | ||
|    562,   157,   158,   159,   160,   161,   162,   163,   164,   165,
 | ||
|    166,   167,   168,   169,   170,   171,   226,   227,     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,   228,   178,   179,   180,   181,   182,   183,
 | ||
|    184,   185,   186,   187,   188,   189,     0,   229,     0,   230,
 | ||
|    231,   232,   333,   334,     0,     0,    57,    58,   335,     0,
 | ||
|    100,     0,   101,     0,     0,     1,     2,   342,     3,     4,
 | ||
|    336,   337,   338,     0,     0,     0,     0,    57,    58,     0,
 | ||
|      0,     0,     0,     0,   339,   340,     1,     2,     0,     3,
 | ||
|      4,   223,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,   341,     0,     0,     0,   224,   225,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,   157,   158,   159,
 | ||
|    160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
 | ||
|    170,   171,   226,   227,     0,     0,     0,     0,   157,   158,
 | ||
|    159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
 | ||
|    169,   170,   171,   226,   227,     0,     0,     0,     0,   228,
 | ||
|    178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
 | ||
|    188,   189,     0,   229,     0,   230,   231,   232,     0,     0,
 | ||
|    228,   178,   179,   180,   181,   182,   183,   184,   185,   186,
 | ||
|    187,   188,   189,   342,   229,     0,   230,   231,   232,     0,
 | ||
|      0,     0,   333,   334,     0,     0,     0,   100,   335,   101,
 | ||
|      0,   233,     0,     0,   234,     0,   235,     0,   236,     0,
 | ||
|    336,   337,   338,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,   339,   340,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,    57,
 | ||
|     58,   341,    96,   134,   135,   136,    63,     0,     1,     2,
 | ||
|      0,     3,     4,     0,     0,     0,     0,   157,   158,   159,
 | ||
|    160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
 | ||
|    170,   171,   226,   227,     0,     0,    64,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,    57,    58,     0,    96,    60,
 | ||
|     61,    62,    63,     0,     1,     2,     0,     3,     4,   228,
 | ||
|    178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
 | ||
|    188,   189,   120,   229,     0,   230,   231,   232,     0,     0,
 | ||
|      0,     0,    64,     0,     0,    57,    58,     0,    96,    60,
 | ||
|     61,    62,    63,   342,     1,     2,     0,     3,     4,     0,
 | ||
|      0,     0,     0,     0,    57,    58,     0,    96,   134,   135,
 | ||
|    136,    63,   303,     1,     2,     0,     3,     4,     0,     0,
 | ||
|      0,     0,    64,     0,     0,     0,     0,     0,     0,     0,
 | ||
|     65,     0,     0,    66,     0,     0,    67,     0,    68,   386,
 | ||
|      0,    64,     0,    57,    58,     0,    96,    60,    61,    62,
 | ||
|     63,     0,     1,     2,     0,     3,     4,     0,     0,    57,
 | ||
|     58,     0,    96,    60,    61,    62,    63,     0,     1,     2,
 | ||
|    398,     3,     4,     0,     0,     0,    65,     0,     0,    66,
 | ||
|     64,     0,    67,     0,    68,     0,   481,     0,    57,    58,
 | ||
|      0,    59,    60,    61,    62,    63,    64,     1,     2,     0,
 | ||
|      3,     4,    57,    58,     0,    96,   134,   135,   136,    63,
 | ||
|      0,     1,     2,     0,     3,     4,    65,     0,     0,    66,
 | ||
|      0,     0,    67,     0,    68,    64,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,    65,     0,     0,    66,    64,
 | ||
|    319,    67,     0,    68,    57,    58,     0,   142,    60,    61,
 | ||
|     62,    63,     0,     1,     2,     0,     3,     4,    57,    58,
 | ||
|      0,    96,    60,    61,    62,    63,     0,     1,     2,     0,
 | ||
|      3,     4,     0,     0,    65,     0,     0,    66,     0,     0,
 | ||
|     67,    64,    68,     0,     0,     0,     0,     0,     0,     0,
 | ||
|     65,     0,     0,    66,     0,    64,    67,     0,    68,     0,
 | ||
|     57,    58,     0,   245,    60,    61,    62,    63,     0,     1,
 | ||
|      2,     0,     3,     4,     0,     0,     0,     0,     0,    65,
 | ||
|      0,     0,    66,     0,     0,    67,     0,    68,     0,     0,
 | ||
|      0,     0,     0,    65,     0,     0,    66,    64,     0,    67,
 | ||
|      0,    68,    57,    58,     0,    96,   134,   135,   136,    63,
 | ||
|      0,     1,     2,     0,     3,     4,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,   148,     0,     0,
 | ||
|      0,     0,     0,     0,     0,    65,     0,     0,    66,    64,
 | ||
|      0,    67,     0,    68,     0,     0,   149,   150,     0,    65,
 | ||
|      0,     0,    66,     0,     0,    67,     0,    68,   151,   152,
 | ||
|    153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
 | ||
|    163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
 | ||
|    173,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,    65,     0,     0,    66,     0,     0,    67,     0,    68,
 | ||
|      0,   174,   175,   176,     0,     0,   177,   178,   179,   180,
 | ||
|    181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
 | ||
|    191,   192,   193,   194,   195,     0,     0,  -178,     0,     0,
 | ||
|      0,     0,     0,    65,     0,     0,    66,     0,     0,    67,
 | ||
|      0,   322,   -62,     1,     2,     0,     3,     4,     0,     0,
 | ||
|      0,     0,     0,     5,     6,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     7,     0,     0,     8,     0,     0,     0,
 | ||
|      9
 | ||
| };
 | ||
| 
 | ||
| static const short yycheck[] = {     0,
 | ||
|     24,   153,   213,   139,   176,   139,   305,     4,    24,   399,
 | ||
|    309,    11,   282,    14,   154,     0,   234,   235,   252,   191,
 | ||
|    192,   193,   194,   195,    30,    18,   198,    11,    11,    14,
 | ||
|    310,   311,    25,    11,     3,     4,     5,     6,   112,   113,
 | ||
|     35,    36,    48,   136,    68,    47,    41,   135,    16,   533,
 | ||
|    143,    19,    47,    22,    23,   129,   130,   131,   132,    61,
 | ||
|    200,   295,    52,   547,    48,   136,   136,    91,   136,   136,
 | ||
|     48,    95,   140,   108,   109,   145,   147,   101,   112,   113,
 | ||
|    147,    82,    37,    38,    39,    40,    41,    42,    43,   113,
 | ||
|     45,   136,   482,   135,    30,   136,   130,   131,   143,   136,
 | ||
|    136,   125,   126,    15,   322,   129,   147,    33,   145,   133,
 | ||
|    246,   147,   248,   249,   137,   251,   139,   397,    37,    38,
 | ||
|     39,   135,   145,    42,   342,   297,   516,   151,     7,     8,
 | ||
|    146,    10,    11,    12,    13,    14,    16,    16,    17,    19,
 | ||
|     19,    20,   136,   143,   112,   113,   140,   135,   284,   146,
 | ||
|    174,   175,   176,   177,   147,   425,   292,   293,   548,   144,
 | ||
|    143,    17,   130,   131,    20,    44,   190,   191,   192,   193,
 | ||
|    194,   195,   196,   197,   198,   106,   112,   113,   137,   134,
 | ||
|    139,   140,   206,   453,   483,   455,   112,   113,   360,   135,
 | ||
|    362,   363,   364,   129,   130,   131,   132,   137,   137,   139,
 | ||
|    139,   132,   141,   129,   130,   131,   132,   137,   136,   139,
 | ||
|     28,    29,   140,   143,   350,   351,   352,     3,     4,     5,
 | ||
|      6,   141,   358,   136,   137,    41,   139,    43,   252,    19,
 | ||
|    500,   134,   368,   369,   445,   102,   103,    32,   537,   263,
 | ||
|    539,    85,    86,    87,    88,    89,    90,    91,    92,    93,
 | ||
|     94,   387,    18,   387,   136,   137,   280,   139,    11,   138,
 | ||
|     19,    14,   141,    74,    75,   144,   139,   146,   147,    19,
 | ||
|     19,   295,   296,   297,   410,     4,   412,     4,   142,   415,
 | ||
|    142,     4,    19,   136,   456,   421,   422,   459,   460,   461,
 | ||
|      7,     8,   140,    10,    11,    12,    13,    14,   322,    16,
 | ||
|     17,   140,    19,    20,   145,     9,     9,   518,   332,     9,
 | ||
|    521,    50,   448,   449,    11,   451,   452,   145,   139,   139,
 | ||
|    139,   457,   139,    19,   139,   139,   139,    44,   136,   139,
 | ||
|    139,   467,   136,   136,   136,   136,   360,   361,   362,   363,
 | ||
|    364,    33,   136,   367,    55,    56,    57,    58,    59,    60,
 | ||
|    139,   487,   136,    54,   139,   136,   136,   136,   141,   495,
 | ||
|    136,   136,   136,   515,   136,   136,   136,   248,   249,   136,
 | ||
|    251,   136,   145,    33,    19,     4,   136,   140,    19,    14,
 | ||
|     14,   139,   534,   314,   315,   316,   317,   318,   136,   136,
 | ||
|      4,   136,   136,   136,   136,   531,   327,   328,   329,   139,
 | ||
|    536,   136,   426,   284,   136,   136,   136,   145,   136,    48,
 | ||
|    136,   292,   293,    19,   136,   439,   140,   553,   554,   140,
 | ||
|    444,   138,   558,   136,   141,   561,   450,   144,   136,   146,
 | ||
|    147,   140,   456,   143,   136,   459,   460,   461,    48,    14,
 | ||
|    464,   140,   443,    22,    23,   140,   377,   378,   141,   143,
 | ||
|    140,   140,   140,   384,     7,     8,     4,    10,    11,    12,
 | ||
|     13,    14,   136,    16,    17,    14,    19,    20,    14,   350,
 | ||
|    351,   352,   136,    14,    66,    14,     0,   358,     0,   116,
 | ||
|    116,   227,   510,   116,    82,   226,   206,   368,   369,   101,
 | ||
|     95,    44,   483,   517,    14,    79,    50,   464,    -1,   430,
 | ||
|    431,   432,   433,   379,    -1,    -1,   437,   438,    -1,   510,
 | ||
|     -1,    -1,    91,    92,    93,    94,    95,    96,    97,    98,
 | ||
|     99,   100,   101,   102,   103,   104,    -1,    -1,    -1,   410,
 | ||
|     -1,   412,    -1,    -1,   415,    -1,    -1,   468,   469,    -1,
 | ||
|    421,   422,    -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,   448,   449,    -1,
 | ||
|    451,   452,   503,    -1,   505,   506,   457,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,   138,   467,    -1,   141,    -1,
 | ||
|     -1,   144,     0,   146,   147,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,   487,    15,    16,    17,
 | ||
|     -1,    19,    20,    -1,   495,    -1,     3,     4,    26,    27,
 | ||
|      7,     8,     9,    -1,    -1,    -1,    -1,    -1,    -1,    16,
 | ||
|     17,    -1,    19,    20,    21,    22,    23,    -1,    46,    -1,
 | ||
|     -1,    49,    -1,    -1,    -1,    53,    -1,    -1,    35,    36,
 | ||
|    531,    -1,    -1,    -1,    -1,   536,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,   553,   554,    -1,    -1,    -1,   558,    -1,    -1,
 | ||
|    561,    68,    69,    70,    71,    72,    73,    74,    75,    76,
 | ||
|     77,    78,    79,    80,    81,    82,    83,    84,    -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,   110,   111,   112,   113,   114,   115,   116,
 | ||
|    117,   118,   119,   120,   121,   122,    -1,   124,    -1,   126,
 | ||
|    127,   128,     3,     4,    -1,    -1,     7,     8,     9,    -1,
 | ||
|    137,    -1,   139,    -1,    -1,    16,    17,   144,    19,    20,
 | ||
|     21,    22,    23,    -1,    -1,    -1,    -1,     7,     8,    -1,
 | ||
|     -1,    -1,    -1,    -1,    35,    36,    16,    17,    -1,    19,
 | ||
|     20,    21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    52,    -1,    -1,    -1,    35,    36,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    68,    69,    70,
 | ||
|     71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
 | ||
|     81,    82,    83,    84,    -1,    -1,    -1,    -1,    68,    69,
 | ||
|     70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
 | ||
|     80,    81,    82,    83,    84,    -1,    -1,    -1,    -1,   110,
 | ||
|    111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
 | ||
|    121,   122,    -1,   124,    -1,   126,   127,   128,    -1,    -1,
 | ||
|    110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
 | ||
|    120,   121,   122,   144,   124,    -1,   126,   127,   128,    -1,
 | ||
|     -1,    -1,     3,     4,    -1,    -1,    -1,   137,     9,   139,
 | ||
|     -1,   141,    -1,    -1,   144,    -1,   146,    -1,   148,    -1,
 | ||
|     21,    22,    23,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    35,    36,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     7,
 | ||
|      8,    52,    10,    11,    12,    13,    14,    -1,    16,    17,
 | ||
|     -1,    19,    20,    -1,    -1,    -1,    -1,    68,    69,    70,
 | ||
|     71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
 | ||
|     81,    82,    83,    84,    -1,    -1,    44,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,     7,     8,    -1,    10,    11,
 | ||
|     12,    13,    14,    -1,    16,    17,    -1,    19,    20,   110,
 | ||
|    111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
 | ||
|    121,   122,    34,   124,    -1,   126,   127,   128,    -1,    -1,
 | ||
|     -1,    -1,    44,    -1,    -1,     7,     8,    -1,    10,    11,
 | ||
|     12,    13,    14,   144,    16,    17,    -1,    19,    20,    -1,
 | ||
|     -1,    -1,    -1,    -1,     7,     8,    -1,    10,    11,    12,
 | ||
|     13,    14,    34,    16,    17,    -1,    19,    20,    -1,    -1,
 | ||
|     -1,    -1,    44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|    138,    -1,    -1,   141,    -1,    -1,   144,    -1,   146,   147,
 | ||
|     -1,    44,    -1,     7,     8,    -1,    10,    11,    12,    13,
 | ||
|     14,    -1,    16,    17,    -1,    19,    20,    -1,    -1,     7,
 | ||
|      8,    -1,    10,    11,    12,    13,    14,    -1,    16,    17,
 | ||
|     34,    19,    20,    -1,    -1,    -1,   138,    -1,    -1,   141,
 | ||
|     44,    -1,   144,    -1,   146,    -1,    34,    -1,     7,     8,
 | ||
|     -1,    10,    11,    12,    13,    14,    44,    16,    17,    -1,
 | ||
|     19,    20,     7,     8,    -1,    10,    11,    12,    13,    14,
 | ||
|     -1,    16,    17,    -1,    19,    20,   138,    -1,    -1,   141,
 | ||
|     -1,    -1,   144,    -1,   146,    44,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,   138,    -1,    -1,   141,    44,
 | ||
|    143,   144,    -1,   146,     7,     8,    -1,    10,    11,    12,
 | ||
|     13,    14,    -1,    16,    17,    -1,    19,    20,     7,     8,
 | ||
|     -1,    10,    11,    12,    13,    14,    -1,    16,    17,    -1,
 | ||
|     19,    20,    -1,    -1,   138,    -1,    -1,   141,    -1,    -1,
 | ||
|    144,    44,   146,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|    138,    -1,    -1,   141,    -1,    44,   144,    -1,   146,    -1,
 | ||
|      7,     8,    -1,    10,    11,    12,    13,    14,    -1,    16,
 | ||
|     17,    -1,    19,    20,    -1,    -1,    -1,    -1,    -1,   138,
 | ||
|     -1,    -1,   141,    -1,    -1,   144,    -1,   146,    -1,    -1,
 | ||
|     -1,    -1,    -1,   138,    -1,    -1,   141,    44,    -1,   144,
 | ||
|     -1,   146,     7,     8,    -1,    10,    11,    12,    13,    14,
 | ||
|     -1,    16,    17,    -1,    19,    20,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,   138,    -1,    -1,   141,    44,
 | ||
|     -1,   144,    -1,   146,    -1,    -1,    50,    51,    -1,   138,
 | ||
|     -1,    -1,   141,    -1,    -1,   144,    -1,   146,    62,    63,
 | ||
|     64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
 | ||
|     74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
 | ||
|     84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,   138,    -1,    -1,   141,    -1,    -1,   144,    -1,   146,
 | ||
|     -1,   105,   106,   107,    -1,    -1,   110,   111,   112,   113,
 | ||
|    114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
 | ||
|    124,   125,   126,   127,   128,    -1,    -1,     0,    -1,    -1,
 | ||
|     -1,    -1,    -1,   138,    -1,    -1,   141,    -1,    -1,   144,
 | ||
|     -1,   146,    15,    16,    17,    -1,    19,    20,    -1,    -1,
 | ||
|     -1,    -1,    -1,    26,    27,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    46,    -1,    -1,    49,    -1,    -1,    -1,
 | ||
|     53
 | ||
| };
 | ||
| /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 | ||
| #line 3 "/usr/share/bison.simple"
 | ||
| /* This file comes from bison-1.28.  */
 | ||
| 
 | ||
| /* Skeleton output parser for bison,
 | ||
|    Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
 | ||
| 
 | ||
|    This program is free software; you can redistribute it and/or modify
 | ||
|    it under the terms of the GNU General Public License as published by
 | ||
|    the Free Software Foundation; either version 2, or (at your option)
 | ||
|    any later version.
 | ||
| 
 | ||
|    This program is distributed in the hope that it will be useful,
 | ||
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||
|    GNU General Public License for more details.
 | ||
| 
 | ||
|    You should have received a copy of the GNU General Public License
 | ||
|    along with this program; if not, write to the Free Software
 | ||
|    Foundation, Inc., 59 Temple Place - Suite 330,
 | ||
|    Boston, MA 02111-1307, USA.  */
 | ||
| 
 | ||
| /* As a special exception, when this file is copied by Bison into a
 | ||
|    Bison output file, you may use that output file without restriction.
 | ||
|    This special exception was added by the Free Software Foundation
 | ||
|    in version 1.24 of Bison.  */
 | ||
| 
 | ||
| /* This is the parser code that is written into each bison parser
 | ||
|   when the %semantic_parser declaration is not specified in the grammar.
 | ||
|   It was written by Richard Stallman by simplifying the hairy parser
 | ||
|   used when %semantic_parser is specified.  */
 | ||
| 
 | ||
| #ifndef YYSTACK_USE_ALLOCA
 | ||
| #ifdef alloca
 | ||
| #define YYSTACK_USE_ALLOCA
 | ||
| #else /* alloca not defined */
 | ||
| #ifdef __GNUC__
 | ||
| #define YYSTACK_USE_ALLOCA
 | ||
| #define alloca __builtin_alloca
 | ||
| #else /* not GNU C.  */
 | ||
| #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
 | ||
| #define YYSTACK_USE_ALLOCA
 | ||
| #include <alloca.h>
 | ||
| #else /* not sparc */
 | ||
| /* We think this test detects Watcom and Microsoft C.  */
 | ||
| /* This used to test MSDOS, but that is a bad idea
 | ||
|    since that symbol is in the user namespace.  */
 | ||
| #if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
 | ||
| #if 0 /* No need for malloc.h, which pollutes the namespace;
 | ||
| 	 instead, just don't use alloca.  */
 | ||
| #include <malloc.h>
 | ||
| #endif
 | ||
| #else /* not MSDOS, or __TURBOC__ */
 | ||
| #if defined(_AIX)
 | ||
| /* I don't know what this was needed for, but it pollutes the namespace.
 | ||
|    So I turned it off.   rms, 2 May 1997.  */
 | ||
| /* #include <malloc.h>  */
 | ||
|  #pragma alloca
 | ||
| #define YYSTACK_USE_ALLOCA
 | ||
| #else /* not MSDOS, or __TURBOC__, or _AIX */
 | ||
| #if 0
 | ||
| #ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
 | ||
| 		 and on HPUX 10.  Eventually we can turn this on.  */
 | ||
| #define YYSTACK_USE_ALLOCA
 | ||
| #define alloca __builtin_alloca
 | ||
| #endif /* __hpux */
 | ||
| #endif
 | ||
| #endif /* not _AIX */
 | ||
| #endif /* not MSDOS, or __TURBOC__ */
 | ||
| #endif /* not sparc */
 | ||
| #endif /* not GNU C */
 | ||
| #endif /* alloca not defined */
 | ||
| #endif /* YYSTACK_USE_ALLOCA not defined */
 | ||
| 
 | ||
| #ifdef YYSTACK_USE_ALLOCA
 | ||
| #define YYSTACK_ALLOC alloca
 | ||
| #else
 | ||
| #define YYSTACK_ALLOC malloc
 | ||
| #endif
 | ||
| 
 | ||
| /* Note: there must be only one dollar sign in this file.
 | ||
|    It is replaced by the list of actions, each action
 | ||
|    as one case of the switch.  */
 | ||
| 
 | ||
| #define yyerrok		(yyerrstatus = 0)
 | ||
| #define yyclearin	(yychar = YYEMPTY)
 | ||
| #define YYEMPTY		-2
 | ||
| #define YYEOF		0
 | ||
| #define YYACCEPT	goto yyacceptlab
 | ||
| #define YYABORT 	goto yyabortlab
 | ||
| #define YYERROR		goto yyerrlab1
 | ||
| /* Like YYERROR except do call yyerror.
 | ||
|    This remains here temporarily to ease the
 | ||
|    transition to the new meaning of YYERROR, for GCC.
 | ||
|    Once GCC version 2 has supplanted version 1, this can go.  */
 | ||
| #define YYFAIL		goto yyerrlab
 | ||
| #define YYRECOVERING()  (!!yyerrstatus)
 | ||
| #define YYBACKUP(token, value) \
 | ||
| do								\
 | ||
|   if (yychar == YYEMPTY && yylen == 1)				\
 | ||
|     { yychar = (token), yylval = (value);			\
 | ||
|       yychar1 = YYTRANSLATE (yychar);				\
 | ||
|       YYPOPSTACK;						\
 | ||
|       goto yybackup;						\
 | ||
|     }								\
 | ||
|   else								\
 | ||
|     { yyerror ("syntax error: cannot back up"); YYERROR; }	\
 | ||
| while (0)
 | ||
| 
 | ||
| #define YYTERROR	1
 | ||
| #define YYERRCODE	256
 | ||
| 
 | ||
| #ifndef YYPURE
 | ||
| #define YYLEX		yylex()
 | ||
| #endif
 | ||
| 
 | ||
| #ifdef YYPURE
 | ||
| #ifdef YYLSP_NEEDED
 | ||
| #ifdef YYLEX_PARAM
 | ||
| #define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
 | ||
| #else
 | ||
| #define YYLEX		yylex(&yylval, &yylloc)
 | ||
| #endif
 | ||
| #else /* not YYLSP_NEEDED */
 | ||
| #ifdef YYLEX_PARAM
 | ||
| #define YYLEX		yylex(&yylval, YYLEX_PARAM)
 | ||
| #else
 | ||
| #define YYLEX		yylex(&yylval)
 | ||
| #endif
 | ||
| #endif /* not YYLSP_NEEDED */
 | ||
| #endif
 | ||
| 
 | ||
| /* If nonreentrant, generate the variables here */
 | ||
| 
 | ||
| #ifndef YYPURE
 | ||
| 
 | ||
| int	yychar;			/*  the lookahead symbol		*/
 | ||
| YYSTYPE	yylval;			/*  the semantic value of the		*/
 | ||
| 				/*  lookahead symbol			*/
 | ||
| 
 | ||
| #ifdef YYLSP_NEEDED
 | ||
| YYLTYPE yylloc;			/*  location data for the lookahead	*/
 | ||
| 				/*  symbol				*/
 | ||
| #endif
 | ||
| 
 | ||
| int yynerrs;			/*  number of parse errors so far       */
 | ||
| #endif  /* not YYPURE */
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
| int yydebug;			/*  nonzero means print parse trace	*/
 | ||
| /* Since this is uninitialized, it does not stop multiple parsers
 | ||
|    from coexisting.  */
 | ||
| #endif
 | ||
| 
 | ||
| /*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
 | ||
| 
 | ||
| #ifndef	YYINITDEPTH
 | ||
| #define YYINITDEPTH 200
 | ||
| #endif
 | ||
| 
 | ||
| /*  YYMAXDEPTH is the maximum size the stacks can grow to
 | ||
|     (effective only if the built-in stack extension method is used).  */
 | ||
| 
 | ||
| #if YYMAXDEPTH == 0
 | ||
| #undef YYMAXDEPTH
 | ||
| #endif
 | ||
| 
 | ||
| #ifndef YYMAXDEPTH
 | ||
| #define YYMAXDEPTH 10000
 | ||
| #endif
 | ||
| 
 | ||
| /* Define __yy_memcpy.  Note that the size argument
 | ||
|    should be passed with type unsigned int, because that is what the non-GCC
 | ||
|    definitions require.  With GCC, __builtin_memcpy takes an arg
 | ||
|    of type size_t, but it can handle unsigned int.  */
 | ||
| 
 | ||
| #if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
 | ||
| #define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
 | ||
| #else				/* not GNU C or C++ */
 | ||
| #ifndef __cplusplus
 | ||
| 
 | ||
| /* This is the most reliable way to avoid incompatibilities
 | ||
|    in available built-in functions on various systems.  */
 | ||
| static void
 | ||
| __yy_memcpy (to, from, count)
 | ||
|      char *to;
 | ||
|      char *from;
 | ||
|      unsigned int count;
 | ||
| {
 | ||
|   register char *f = from;
 | ||
|   register char *t = to;
 | ||
|   register int i = count;
 | ||
| 
 | ||
|   while (i-- > 0)
 | ||
|     *t++ = *f++;
 | ||
| }
 | ||
| 
 | ||
| #else /* __cplusplus */
 | ||
| 
 | ||
| /* This is the most reliable way to avoid incompatibilities
 | ||
|    in available built-in functions on various systems.  */
 | ||
| static void
 | ||
| __yy_memcpy (char *to, char *from, unsigned int count)
 | ||
| {
 | ||
|   register char *t = to;
 | ||
|   register char *f = from;
 | ||
|   register int i = count;
 | ||
| 
 | ||
|   while (i-- > 0)
 | ||
|     *t++ = *f++;
 | ||
| }
 | ||
| 
 | ||
| #endif
 | ||
| #endif
 | ||
| 
 | ||
| #line 217 "/usr/share/bison.simple"
 | ||
| 
 | ||
| /* The user can define YYPARSE_PARAM as the name of an argument to be passed
 | ||
|    into yyparse.  The argument should have type void *.
 | ||
|    It should actually point to an object.
 | ||
|    Grammar actions can access the variable by casting it
 | ||
|    to the proper pointer type.  */
 | ||
| 
 | ||
| #ifdef YYPARSE_PARAM
 | ||
| #ifdef __cplusplus
 | ||
| #define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
 | ||
| #define YYPARSE_PARAM_DECL
 | ||
| #else /* not __cplusplus */
 | ||
| #define YYPARSE_PARAM_ARG YYPARSE_PARAM
 | ||
| #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
 | ||
| #endif /* not __cplusplus */
 | ||
| #else /* not YYPARSE_PARAM */
 | ||
| #define YYPARSE_PARAM_ARG
 | ||
| #define YYPARSE_PARAM_DECL
 | ||
| #endif /* not YYPARSE_PARAM */
 | ||
| 
 | ||
| /* Prevent warning if -Wstrict-prototypes.  */
 | ||
| #ifdef __GNUC__
 | ||
| #ifdef YYPARSE_PARAM
 | ||
| int yyparse (void *);
 | ||
| #else
 | ||
| int yyparse (void);
 | ||
| #endif
 | ||
| #endif
 | ||
| 
 | ||
| int
 | ||
| yyparse(YYPARSE_PARAM_ARG)
 | ||
|      YYPARSE_PARAM_DECL
 | ||
| {
 | ||
|   register int yystate;
 | ||
|   register int yyn;
 | ||
|   register short *yyssp;
 | ||
|   register YYSTYPE *yyvsp;
 | ||
|   int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
 | ||
|   int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
 | ||
| 
 | ||
|   short	yyssa[YYINITDEPTH];	/*  the state stack			*/
 | ||
|   YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
 | ||
| 
 | ||
|   short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
 | ||
|   YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
 | ||
| 
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|   YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
 | ||
|   YYLTYPE *yyls = yylsa;
 | ||
|   YYLTYPE *yylsp;
 | ||
| 
 | ||
| #define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
 | ||
| #else
 | ||
| #define YYPOPSTACK   (yyvsp--, yyssp--)
 | ||
| #endif
 | ||
| 
 | ||
|   int yystacksize = YYINITDEPTH;
 | ||
|   int yyfree_stacks = 0;
 | ||
| 
 | ||
| #ifdef YYPURE
 | ||
|   int yychar;
 | ||
|   YYSTYPE yylval;
 | ||
|   int yynerrs;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|   YYLTYPE yylloc;
 | ||
| #endif
 | ||
| #endif
 | ||
| 
 | ||
|   YYSTYPE yyval;		/*  the variable used to return		*/
 | ||
| 				/*  semantic values from the action	*/
 | ||
| 				/*  routines				*/
 | ||
| 
 | ||
|   int yylen;
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|   if (yydebug)
 | ||
|     fprintf(stderr, "Starting parse\n");
 | ||
| #endif
 | ||
| 
 | ||
|   yystate = 0;
 | ||
|   yyerrstatus = 0;
 | ||
|   yynerrs = 0;
 | ||
|   yychar = YYEMPTY;		/* Cause a token to be read.  */
 | ||
| 
 | ||
|   /* Initialize stack pointers.
 | ||
|      Waste one element of value and location stack
 | ||
|      so that they stay on the same level as the state stack.
 | ||
|      The wasted elements are never initialized.  */
 | ||
| 
 | ||
|   yyssp = yyss - 1;
 | ||
|   yyvsp = yyvs;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|   yylsp = yyls;
 | ||
| #endif
 | ||
| 
 | ||
| /* Push a new state, which is found in  yystate  .  */
 | ||
| /* In all cases, when you get here, the value and location stacks
 | ||
|    have just been pushed. so pushing a state here evens the stacks.  */
 | ||
| yynewstate:
 | ||
| 
 | ||
|   *++yyssp = yystate;
 | ||
| 
 | ||
|   if (yyssp >= yyss + yystacksize - 1)
 | ||
|     {
 | ||
|       /* Give user a chance to reallocate the stack */
 | ||
|       /* Use copies of these so that the &'s don't force the real ones into memory. */
 | ||
|       YYSTYPE *yyvs1 = yyvs;
 | ||
|       short *yyss1 = yyss;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|       YYLTYPE *yyls1 = yyls;
 | ||
| #endif
 | ||
| 
 | ||
|       /* Get the current used size of the three stacks, in elements.  */
 | ||
|       int size = yyssp - yyss + 1;
 | ||
| 
 | ||
| #ifdef yyoverflow
 | ||
|       /* Each stack pointer address is followed by the size of
 | ||
| 	 the data in use in that stack, in bytes.  */
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|       /* This used to be a conditional around just the two extra args,
 | ||
| 	 but that might be undefined if yyoverflow is a macro.  */
 | ||
|       yyoverflow("parser stack overflow",
 | ||
| 		 &yyss1, size * sizeof (*yyssp),
 | ||
| 		 &yyvs1, size * sizeof (*yyvsp),
 | ||
| 		 &yyls1, size * sizeof (*yylsp),
 | ||
| 		 &yystacksize);
 | ||
| #else
 | ||
|       yyoverflow("parser stack overflow",
 | ||
| 		 &yyss1, size * sizeof (*yyssp),
 | ||
| 		 &yyvs1, size * sizeof (*yyvsp),
 | ||
| 		 &yystacksize);
 | ||
| #endif
 | ||
| 
 | ||
|       yyss = yyss1; yyvs = yyvs1;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|       yyls = yyls1;
 | ||
| #endif
 | ||
| #else /* no yyoverflow */
 | ||
|       /* Extend the stack our own way.  */
 | ||
|       if (yystacksize >= YYMAXDEPTH)
 | ||
| 	{
 | ||
| 	  yyerror("parser stack overflow");
 | ||
| 	  if (yyfree_stacks)
 | ||
| 	    {
 | ||
| 	      free (yyss);
 | ||
| 	      free (yyvs);
 | ||
| #ifdef YYLSP_NEEDED
 | ||
| 	      free (yyls);
 | ||
| #endif
 | ||
| 	    }
 | ||
| 	  return 2;
 | ||
| 	}
 | ||
|       yystacksize *= 2;
 | ||
|       if (yystacksize > YYMAXDEPTH)
 | ||
| 	yystacksize = YYMAXDEPTH;
 | ||
| #ifndef YYSTACK_USE_ALLOCA
 | ||
|       yyfree_stacks = 1;
 | ||
| #endif
 | ||
|       yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
 | ||
|       __yy_memcpy ((char *)yyss, (char *)yyss1,
 | ||
| 		   size * (unsigned int) sizeof (*yyssp));
 | ||
|       yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
 | ||
|       __yy_memcpy ((char *)yyvs, (char *)yyvs1,
 | ||
| 		   size * (unsigned int) sizeof (*yyvsp));
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|       yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
 | ||
|       __yy_memcpy ((char *)yyls, (char *)yyls1,
 | ||
| 		   size * (unsigned int) sizeof (*yylsp));
 | ||
| #endif
 | ||
| #endif /* no yyoverflow */
 | ||
| 
 | ||
|       yyssp = yyss + size - 1;
 | ||
|       yyvsp = yyvs + size - 1;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|       yylsp = yyls + size - 1;
 | ||
| #endif
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|       if (yydebug)
 | ||
| 	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
 | ||
| #endif
 | ||
| 
 | ||
|       if (yyssp >= yyss + yystacksize - 1)
 | ||
| 	YYABORT;
 | ||
|     }
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|   if (yydebug)
 | ||
|     fprintf(stderr, "Entering state %d\n", yystate);
 | ||
| #endif
 | ||
| 
 | ||
|   goto yybackup;
 | ||
|  yybackup:
 | ||
| 
 | ||
| /* Do appropriate processing given the current state.  */
 | ||
| /* Read a lookahead token if we need one and don't already have one.  */
 | ||
| /* yyresume: */
 | ||
| 
 | ||
|   /* First try to decide what to do without reference to lookahead token.  */
 | ||
| 
 | ||
|   yyn = yypact[yystate];
 | ||
|   if (yyn == YYFLAG)
 | ||
|     goto yydefault;
 | ||
| 
 | ||
|   /* Not known => get a lookahead token if don't already have one.  */
 | ||
| 
 | ||
|   /* yychar is either YYEMPTY or YYEOF
 | ||
|      or a valid token in external form.  */
 | ||
| 
 | ||
|   if (yychar == YYEMPTY)
 | ||
|     {
 | ||
| #if YYDEBUG != 0
 | ||
|       if (yydebug)
 | ||
| 	fprintf(stderr, "Reading a token: ");
 | ||
| #endif
 | ||
|       yychar = YYLEX;
 | ||
|     }
 | ||
| 
 | ||
|   /* Convert token to internal form (in yychar1) for indexing tables with */
 | ||
| 
 | ||
|   if (yychar <= 0)		/* This means end of input. */
 | ||
|     {
 | ||
|       yychar1 = 0;
 | ||
|       yychar = YYEOF;		/* Don't call YYLEX any more */
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|       if (yydebug)
 | ||
| 	fprintf(stderr, "Now at end of input.\n");
 | ||
| #endif
 | ||
|     }
 | ||
|   else
 | ||
|     {
 | ||
|       yychar1 = YYTRANSLATE(yychar);
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|       if (yydebug)
 | ||
| 	{
 | ||
| 	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
 | ||
| 	  /* Give the individual parser a way to print the precise meaning
 | ||
| 	     of a token, for further debugging info.  */
 | ||
| #ifdef YYPRINT
 | ||
| 	  YYPRINT (stderr, yychar, yylval);
 | ||
| #endif
 | ||
| 	  fprintf (stderr, ")\n");
 | ||
| 	}
 | ||
| #endif
 | ||
|     }
 | ||
| 
 | ||
|   yyn += yychar1;
 | ||
|   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
 | ||
|     goto yydefault;
 | ||
| 
 | ||
|   yyn = yytable[yyn];
 | ||
| 
 | ||
|   /* yyn is what to do for this token type in this state.
 | ||
|      Negative => reduce, -yyn is rule number.
 | ||
|      Positive => shift, yyn is new state.
 | ||
|        New state is final state => don't bother to shift,
 | ||
|        just return success.
 | ||
|      0, or most negative number => error.  */
 | ||
| 
 | ||
|   if (yyn < 0)
 | ||
|     {
 | ||
|       if (yyn == YYFLAG)
 | ||
| 	goto yyerrlab;
 | ||
|       yyn = -yyn;
 | ||
|       goto yyreduce;
 | ||
|     }
 | ||
|   else if (yyn == 0)
 | ||
|     goto yyerrlab;
 | ||
| 
 | ||
|   if (yyn == YYFINAL)
 | ||
|     YYACCEPT;
 | ||
| 
 | ||
|   /* Shift the lookahead token.  */
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|   if (yydebug)
 | ||
|     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
 | ||
| #endif
 | ||
| 
 | ||
|   /* Discard the token being shifted unless it is eof.  */
 | ||
|   if (yychar != YYEOF)
 | ||
|     yychar = YYEMPTY;
 | ||
| 
 | ||
|   *++yyvsp = yylval;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|   *++yylsp = yylloc;
 | ||
| #endif
 | ||
| 
 | ||
|   /* count tokens shifted since error; after three, turn off error status.  */
 | ||
|   if (yyerrstatus) yyerrstatus--;
 | ||
| 
 | ||
|   yystate = yyn;
 | ||
|   goto yynewstate;
 | ||
| 
 | ||
| /* Do the default action for the current state.  */
 | ||
| yydefault:
 | ||
| 
 | ||
|   yyn = yydefact[yystate];
 | ||
|   if (yyn == 0)
 | ||
|     goto yyerrlab;
 | ||
| 
 | ||
| /* Do a reduction.  yyn is the number of a rule to reduce with.  */
 | ||
| yyreduce:
 | ||
|   yylen = yyr2[yyn];
 | ||
|   if (yylen > 0)
 | ||
|     yyval = yyvsp[1-yylen]; /* implement default value of the action */
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|   if (yydebug)
 | ||
|     {
 | ||
|       int i;
 | ||
| 
 | ||
|       fprintf (stderr, "Reducing via rule %d (line %d), ",
 | ||
| 	       yyn, yyrline[yyn]);
 | ||
| 
 | ||
|       /* Print the symbols being reduced, and their result.  */
 | ||
|       for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
 | ||
| 	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
 | ||
|       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
 | ||
|     }
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
|   switch (yyn) {
 | ||
| 
 | ||
| case 28:
 | ||
| #line 1099 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_EQ; ;
 | ||
|     break;}
 | ||
| case 29:
 | ||
| #line 1099 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_NE; ;
 | ||
|     break;}
 | ||
| case 30:
 | ||
| #line 1100 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_SLT; ;
 | ||
|     break;}
 | ||
| case 31:
 | ||
| #line 1100 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_SGT; ;
 | ||
|     break;}
 | ||
| case 32:
 | ||
| #line 1101 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_SLE; ;
 | ||
|     break;}
 | ||
| case 33:
 | ||
| #line 1101 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_SGE; ;
 | ||
|     break;}
 | ||
| case 34:
 | ||
| #line 1102 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_ULT; ;
 | ||
|     break;}
 | ||
| case 35:
 | ||
| #line 1102 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_UGT; ;
 | ||
|     break;}
 | ||
| case 36:
 | ||
| #line 1103 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_ULE; ;
 | ||
|     break;}
 | ||
| case 37:
 | ||
| #line 1103 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_UGE; ;
 | ||
|     break;}
 | ||
| case 38:
 | ||
| #line 1107 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OEQ; ;
 | ||
|     break;}
 | ||
| case 39:
 | ||
| #line 1107 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_ONE; ;
 | ||
|     break;}
 | ||
| case 40:
 | ||
| #line 1108 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OLT; ;
 | ||
|     break;}
 | ||
| case 41:
 | ||
| #line 1108 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OGT; ;
 | ||
|     break;}
 | ||
| case 42:
 | ||
| #line 1109 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OLE; ;
 | ||
|     break;}
 | ||
| case 43:
 | ||
| #line 1109 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OGE; ;
 | ||
|     break;}
 | ||
| case 44:
 | ||
| #line 1110 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_ORD; ;
 | ||
|     break;}
 | ||
| case 45:
 | ||
| #line 1110 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UNO; ;
 | ||
|     break;}
 | ||
| case 46:
 | ||
| #line 1111 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UEQ; ;
 | ||
|     break;}
 | ||
| case 47:
 | ||
| #line 1111 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UNE; ;
 | ||
|     break;}
 | ||
| case 48:
 | ||
| #line 1112 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_ULT; ;
 | ||
|     break;}
 | ||
| case 49:
 | ||
| #line 1112 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UGT; ;
 | ||
|     break;}
 | ||
| case 50:
 | ||
| #line 1113 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_ULE; ;
 | ||
|     break;}
 | ||
| case 51:
 | ||
| #line 1113 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UGE; ;
 | ||
|     break;}
 | ||
| case 52:
 | ||
| #line 1114 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_TRUE; ;
 | ||
|     break;}
 | ||
| case 53:
 | ||
| #line 1115 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_FALSE; ;
 | ||
|     break;}
 | ||
| case 60:
 | ||
| #line 1124 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.StrVal = 0; ;
 | ||
|     break;}
 | ||
| case 61:
 | ||
| #line 1128 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.StrVal = yyvsp[-1].StrVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 62:
 | ||
| #line 1132 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.StrVal = 0;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 65:
 | ||
| #line 1139 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.StrVal = yyvsp[-1].StrVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 66:
 | ||
| #line 1143 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.StrVal = 0;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 67:
 | ||
| #line 1149 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::InternalLinkage; ;
 | ||
|     break;}
 | ||
| case 68:
 | ||
| #line 1150 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::WeakLinkage; ;
 | ||
|     break;}
 | ||
| case 69:
 | ||
| #line 1151 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
 | ||
|     break;}
 | ||
| case 70:
 | ||
| #line 1152 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::AppendingLinkage; ;
 | ||
|     break;}
 | ||
| case 71:
 | ||
| #line 1153 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::DLLExportLinkage; ;
 | ||
|     break;}
 | ||
| case 72:
 | ||
| #line 1157 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::DLLImportLinkage; ;
 | ||
|     break;}
 | ||
| case 73:
 | ||
| #line 1158 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
 | ||
|     break;}
 | ||
| case 74:
 | ||
| #line 1159 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalLinkage; ;
 | ||
|     break;}
 | ||
| case 75:
 | ||
| #line 1163 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Visibility = GlobalValue::DefaultVisibility; ;
 | ||
|     break;}
 | ||
| case 76:
 | ||
| #line 1164 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Visibility = GlobalValue::HiddenVisibility;  ;
 | ||
|     break;}
 | ||
| case 77:
 | ||
| #line 1168 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalLinkage; ;
 | ||
|     break;}
 | ||
| case 78:
 | ||
| #line 1169 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::DLLImportLinkage; ;
 | ||
|     break;}
 | ||
| case 79:
 | ||
| #line 1170 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
 | ||
|     break;}
 | ||
| case 80:
 | ||
| #line 1174 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalLinkage; ;
 | ||
|     break;}
 | ||
| case 81:
 | ||
| #line 1175 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::InternalLinkage; ;
 | ||
|     break;}
 | ||
| case 82:
 | ||
| #line 1176 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
 | ||
|     break;}
 | ||
| case 83:
 | ||
| #line 1177 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::WeakLinkage; ;
 | ||
|     break;}
 | ||
| case 84:
 | ||
| #line 1178 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::DLLExportLinkage; ;
 | ||
|     break;}
 | ||
| case 85:
 | ||
| #line 1181 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::C; ;
 | ||
|     break;}
 | ||
| case 86:
 | ||
| #line 1182 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::C; ;
 | ||
|     break;}
 | ||
| case 87:
 | ||
| #line 1183 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::Fast; ;
 | ||
|     break;}
 | ||
| case 88:
 | ||
| #line 1184 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::Cold; ;
 | ||
|     break;}
 | ||
| case 89:
 | ||
| #line 1185 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::X86_StdCall; ;
 | ||
|     break;}
 | ||
| case 90:
 | ||
| #line 1186 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::X86_FastCall; ;
 | ||
|     break;}
 | ||
| case 91:
 | ||
| #line 1187 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|                    if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val)
 | ||
|                      GEN_ERROR("Calling conv too large");
 | ||
|                    yyval.UIntVal = yyvsp[0].UInt64Val;
 | ||
|                   CHECK_FOR_ERROR
 | ||
|                  ;
 | ||
|     break;}
 | ||
| case 92:
 | ||
| #line 1194 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = ParamAttr::ZExt;      ;
 | ||
|     break;}
 | ||
| case 93:
 | ||
| #line 1195 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = ParamAttr::SExt;      ;
 | ||
|     break;}
 | ||
| case 94:
 | ||
| #line 1196 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = ParamAttr::InReg;     ;
 | ||
|     break;}
 | ||
| case 95:
 | ||
| #line 1197 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = ParamAttr::StructRet; ;
 | ||
|     break;}
 | ||
| case 96:
 | ||
| #line 1200 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = ParamAttr::None; ;
 | ||
|     break;}
 | ||
| case 97:
 | ||
| #line 1201 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|                 yyval.ParamAttrs = yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs;
 | ||
|               ;
 | ||
|     break;}
 | ||
| case 98:
 | ||
| #line 1206 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = ParamAttr::NoReturn; ;
 | ||
|     break;}
 | ||
| case 99:
 | ||
| #line 1207 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = ParamAttr::NoUnwind; ;
 | ||
|     break;}
 | ||
| case 101:
 | ||
| #line 1211 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = ParamAttr::None; ;
 | ||
|     break;}
 | ||
| case 102:
 | ||
| #line 1212 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|                 yyval.ParamAttrs = yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs;
 | ||
|               ;
 | ||
|     break;}
 | ||
| case 103:
 | ||
| #line 1219 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = 0; ;
 | ||
|     break;}
 | ||
| case 104:
 | ||
| #line 1220 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|   yyval.UIntVal = yyvsp[0].UInt64Val;
 | ||
|   if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal))
 | ||
|     GEN_ERROR("Alignment must be a power of two");
 | ||
|   CHECK_FOR_ERROR
 | ||
| ;
 | ||
|     break;}
 | ||
| case 105:
 | ||
| #line 1226 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = 0; ;
 | ||
|     break;}
 | ||
| case 106:
 | ||
| #line 1227 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|   yyval.UIntVal = yyvsp[0].UInt64Val;
 | ||
|   if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal))
 | ||
|     GEN_ERROR("Alignment must be a power of two");
 | ||
|   CHECK_FOR_ERROR
 | ||
| ;
 | ||
|     break;}
 | ||
| case 107:
 | ||
| #line 1235 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|   for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i)
 | ||
|     if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\')
 | ||
|       GEN_ERROR("Invalid character in section name");
 | ||
|   yyval.StrVal = yyvsp[0].StrVal;
 | ||
|   CHECK_FOR_ERROR
 | ||
| ;
 | ||
|     break;}
 | ||
| case 108:
 | ||
| #line 1243 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.StrVal = 0; ;
 | ||
|     break;}
 | ||
| case 109:
 | ||
| #line 1244 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.StrVal = yyvsp[0].StrVal; ;
 | ||
|     break;}
 | ||
| case 110:
 | ||
| #line 1249 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {;
 | ||
|     break;}
 | ||
| case 111:
 | ||
| #line 1250 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {;
 | ||
|     break;}
 | ||
| case 112:
 | ||
| #line 1251 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurGV->setSection(yyvsp[0].StrVal);
 | ||
|     free(yyvsp[0].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 113:
 | ||
| #line 1256 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val))
 | ||
|       GEN_ERROR("Alignment must be a power of two");
 | ||
|     CurGV->setAlignment(yyvsp[0].UInt64Val);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 118:
 | ||
| #line 1272 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeVal = new PATypeHolder(OpaqueType::get());
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 119:
 | ||
| #line 1276 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 120:
 | ||
| #line 1280 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                             // Pointer type?
 | ||
|     if (*yyvsp[-1].TypeVal == Type::LabelTy)
 | ||
|       GEN_ERROR("Cannot form a pointer to a basic block");
 | ||
|     yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal)));
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 121:
 | ||
| #line 1287 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {            // Named types are also simple types...
 | ||
|     const Type* tmp = getTypeVal(yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.TypeVal = new PATypeHolder(tmp);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 122:
 | ||
| #line 1292 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                   // Type UpReference
 | ||
|     if (yyvsp[0].UInt64Val > (uint64_t)~0U) GEN_ERROR("Value out of range");
 | ||
|     OpaqueType *OT = OpaqueType::get();        // Use temporary placeholder
 | ||
|     UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT));  // Add to vector...
 | ||
|     yyval.TypeVal = new PATypeHolder(OT);
 | ||
|     UR_OUT("New Upreference!\n");
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 123:
 | ||
| #line 1300 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     std::vector<const Type*> Params;
 | ||
|     ParamAttrsVector Attrs;
 | ||
|     if (yyvsp[0].ParamAttrs != ParamAttr::None) {
 | ||
|       ParamAttrsWithIndex X; X.index = 0; X.attrs = yyvsp[0].ParamAttrs;
 | ||
|       Attrs.push_back(X);
 | ||
|     }
 | ||
|     unsigned index = 1;
 | ||
|     TypeWithAttrsList::iterator I = yyvsp[-2].TypeWithAttrsList->begin(), E = yyvsp[-2].TypeWithAttrsList->end();
 | ||
|     for (; I != E; ++I, ++index) {
 | ||
|       const Type *Ty = I->Ty->get();
 | ||
|       Params.push_back(Ty);
 | ||
|       if (Ty != Type::VoidTy)
 | ||
|         if (I->Attrs != ParamAttr::None) {
 | ||
|           ParamAttrsWithIndex X; X.index = index; X.attrs = I->Attrs;
 | ||
|           Attrs.push_back(X);
 | ||
|         }
 | ||
|     }
 | ||
|     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
 | ||
|     if (isVarArg) Params.pop_back();
 | ||
| 
 | ||
|     ParamAttrsList *ActualAttrs = 0;
 | ||
|     if (!Attrs.empty())
 | ||
|       ActualAttrs = ParamAttrsList::get(Attrs);
 | ||
|     FunctionType *FT = FunctionType::get(*yyvsp[-4].TypeVal, Params, isVarArg, ActualAttrs);
 | ||
|     delete yyvsp[-2].TypeWithAttrsList;   // Delete the argument list
 | ||
|     delete yyvsp[-4].TypeVal;   // Delete the return type handle
 | ||
|     yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); 
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 124:
 | ||
| #line 1330 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     std::vector<const Type*> Params;
 | ||
|     ParamAttrsVector Attrs;
 | ||
|     if (yyvsp[0].ParamAttrs != ParamAttr::None) {
 | ||
|       ParamAttrsWithIndex X; X.index = 0; X.attrs = yyvsp[0].ParamAttrs;
 | ||
|       Attrs.push_back(X);
 | ||
|     }
 | ||
|     TypeWithAttrsList::iterator I = yyvsp[-2].TypeWithAttrsList->begin(), E = yyvsp[-2].TypeWithAttrsList->end();
 | ||
|     unsigned index = 1;
 | ||
|     for ( ; I != E; ++I, ++index) {
 | ||
|       const Type* Ty = I->Ty->get();
 | ||
|       Params.push_back(Ty);
 | ||
|       if (Ty != Type::VoidTy)
 | ||
|         if (I->Attrs != ParamAttr::None) {
 | ||
|           ParamAttrsWithIndex X; X.index = index; X.attrs = I->Attrs;
 | ||
|           Attrs.push_back(X);
 | ||
|         }
 | ||
|     }
 | ||
|     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
 | ||
|     if (isVarArg) Params.pop_back();
 | ||
| 
 | ||
|     ParamAttrsList *ActualAttrs = 0;
 | ||
|     if (!Attrs.empty())
 | ||
|       ActualAttrs = ParamAttrsList::get(Attrs);
 | ||
| 
 | ||
|     FunctionType *FT = FunctionType::get(yyvsp[-4].PrimType, Params, isVarArg, ActualAttrs);
 | ||
|     delete yyvsp[-2].TypeWithAttrsList;      // Delete the argument list
 | ||
|     yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); 
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 125:
 | ||
| #line 1361 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {          // Sized array type?
 | ||
|     yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val)));
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 126:
 | ||
| #line 1366 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {          // Vector type?
 | ||
|      const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get();
 | ||
|      if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val)
 | ||
|         GEN_ERROR("Unsigned result not equal to signed result");
 | ||
|      if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger())
 | ||
|         GEN_ERROR("Element type of a VectorType must be primitive");
 | ||
|      if (!isPowerOf2_32(yyvsp[-3].UInt64Val))
 | ||
|        GEN_ERROR("Vector length should be a power of 2");
 | ||
|      yyval.TypeVal = new PATypeHolder(HandleUpRefs(VectorType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val)));
 | ||
|      delete yyvsp[-1].TypeVal;
 | ||
|      CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 127:
 | ||
| #line 1378 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                        // Structure type?
 | ||
|     std::vector<const Type*> Elements;
 | ||
|     for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-1].TypeList->begin(),
 | ||
|            E = yyvsp[-1].TypeList->end(); I != E; ++I)
 | ||
|       Elements.push_back(*I);
 | ||
| 
 | ||
|     yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
 | ||
|     delete yyvsp[-1].TypeList;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 128:
 | ||
| #line 1388 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                                  // Empty structure type?
 | ||
|     yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>()));
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 129:
 | ||
| #line 1392 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     std::vector<const Type*> Elements;
 | ||
|     for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-2].TypeList->begin(),
 | ||
|            E = yyvsp[-2].TypeList->end(); I != E; ++I)
 | ||
|       Elements.push_back(*I);
 | ||
| 
 | ||
|     yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
 | ||
|     delete yyvsp[-2].TypeList;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 130:
 | ||
| #line 1402 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                         // Empty structure type?
 | ||
|     yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>(), true));
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 131:
 | ||
| #line 1409 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { 
 | ||
|     yyval.TypeWithAttrs.Ty = yyvsp[-1].TypeVal; 
 | ||
|     yyval.TypeWithAttrs.Attrs = yyvsp[0].ParamAttrs; 
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 132:
 | ||
| #line 1416 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
 | ||
|     if (!(*yyvsp[0].TypeVal)->isFirstClassType())
 | ||
|       GEN_ERROR("LLVM functions cannot return aggregate types");
 | ||
|     yyval.TypeVal = yyvsp[0].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 133:
 | ||
| #line 1423 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeVal = new PATypeHolder(Type::VoidTy);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 134:
 | ||
| #line 1428 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeWithAttrsList = new TypeWithAttrsList();
 | ||
|     yyval.TypeWithAttrsList->push_back(yyvsp[0].TypeWithAttrs);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 135:
 | ||
| #line 1433 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     (yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList)->push_back(yyvsp[0].TypeWithAttrs);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 137:
 | ||
| #line 1441 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList;
 | ||
|     TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
 | ||
|     TWA.Ty = new PATypeHolder(Type::VoidTy);
 | ||
|     yyval.TypeWithAttrsList->push_back(TWA);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 138:
 | ||
| #line 1448 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeWithAttrsList = new TypeWithAttrsList;
 | ||
|     TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
 | ||
|     TWA.Ty = new PATypeHolder(Type::VoidTy);
 | ||
|     yyval.TypeWithAttrsList->push_back(TWA);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 139:
 | ||
| #line 1455 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeWithAttrsList = new TypeWithAttrsList();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 140:
 | ||
| #line 1463 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeList = new std::list<PATypeHolder>();
 | ||
|     yyval.TypeList->push_back(*yyvsp[0].TypeVal); 
 | ||
|     delete yyvsp[0].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 141:
 | ||
| #line 1469 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); 
 | ||
|     delete yyvsp[0].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 142:
 | ||
| #line 1481 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { // Nonempty unsized arr
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
 | ||
|     const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-3].TypeVal->get());
 | ||
|     if (ATy == 0)
 | ||
|       GEN_ERROR("Cannot make array constant with type: '" + 
 | ||
|                      (*yyvsp[-3].TypeVal)->getDescription() + "'");
 | ||
|     const Type *ETy = ATy->getElementType();
 | ||
|     int NumElements = ATy->getNumElements();
 | ||
| 
 | ||
|     // Verify that we have the correct size...
 | ||
|     if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
 | ||
|       GEN_ERROR("Type mismatch: constant sized array initialized with " +
 | ||
|                      utostr(yyvsp[-1].ConstVector->size()) +  " arguments, but has size of " + 
 | ||
|                      itostr(NumElements) + "");
 | ||
| 
 | ||
|     // Verify all elements are correct type!
 | ||
|     for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
 | ||
|       if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
 | ||
|         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
 | ||
|                        ETy->getDescription() +"' as required!\nIt is of type '"+
 | ||
|                        (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
 | ||
|     }
 | ||
| 
 | ||
|     yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector);
 | ||
|     delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 143:
 | ||
| #line 1509 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal->get());
 | ||
|     if (ATy == 0)
 | ||
|       GEN_ERROR("Cannot make array constant with type: '" + 
 | ||
|                      (*yyvsp[-2].TypeVal)->getDescription() + "'");
 | ||
| 
 | ||
|     int NumElements = ATy->getNumElements();
 | ||
|     if (NumElements != -1 && NumElements != 0) 
 | ||
|       GEN_ERROR("Type mismatch: constant sized array initialized with 0"
 | ||
|                      " arguments, but has size of " + itostr(NumElements) +"");
 | ||
|     yyval.ConstVal = ConstantArray::get(ATy, std::vector<Constant*>());
 | ||
|     delete yyvsp[-2].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 144:
 | ||
| #line 1525 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal->get());
 | ||
|     if (ATy == 0)
 | ||
|       GEN_ERROR("Cannot make array constant with type: '" + 
 | ||
|                      (*yyvsp[-2].TypeVal)->getDescription() + "'");
 | ||
| 
 | ||
|     int NumElements = ATy->getNumElements();
 | ||
|     const Type *ETy = ATy->getElementType();
 | ||
|     char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true);
 | ||
|     if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal))
 | ||
|       GEN_ERROR("Can't build string constant of size " + 
 | ||
|                      itostr((int)(EndStr-yyvsp[0].StrVal)) +
 | ||
|                      " when array has size " + itostr(NumElements) + "");
 | ||
|     std::vector<Constant*> Vals;
 | ||
|     if (ETy == Type::Int8Ty) {
 | ||
|       for (unsigned char *C = (unsigned char *)yyvsp[0].StrVal; 
 | ||
|         C != (unsigned char*)EndStr; ++C)
 | ||
|       Vals.push_back(ConstantInt::get(ETy, *C));
 | ||
|     } else {
 | ||
|       free(yyvsp[0].StrVal);
 | ||
|       GEN_ERROR("Cannot build string arrays of non byte sized elements");
 | ||
|     }
 | ||
|     free(yyvsp[0].StrVal);
 | ||
|     yyval.ConstVal = ConstantArray::get(ATy, Vals);
 | ||
|     delete yyvsp[-2].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 145:
 | ||
| #line 1554 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { // Nonempty unsized arr
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
 | ||
|     const VectorType *PTy = dyn_cast<VectorType>(yyvsp[-3].TypeVal->get());
 | ||
|     if (PTy == 0)
 | ||
|       GEN_ERROR("Cannot make packed constant with type: '" + 
 | ||
|                      (*yyvsp[-3].TypeVal)->getDescription() + "'");
 | ||
|     const Type *ETy = PTy->getElementType();
 | ||
|     int NumElements = PTy->getNumElements();
 | ||
| 
 | ||
|     // Verify that we have the correct size...
 | ||
|     if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
 | ||
|       GEN_ERROR("Type mismatch: constant sized packed initialized with " +
 | ||
|                      utostr(yyvsp[-1].ConstVector->size()) +  " arguments, but has size of " + 
 | ||
|                      itostr(NumElements) + "");
 | ||
| 
 | ||
|     // Verify all elements are correct type!
 | ||
|     for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
 | ||
|       if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
 | ||
|         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
 | ||
|            ETy->getDescription() +"' as required!\nIt is of type '"+
 | ||
|            (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
 | ||
|     }
 | ||
| 
 | ||
|     yyval.ConstVal = ConstantVector::get(PTy, *yyvsp[-1].ConstVector);
 | ||
|     delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 146:
 | ||
| #line 1582 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     const StructType *STy = dyn_cast<StructType>(yyvsp[-3].TypeVal->get());
 | ||
|     if (STy == 0)
 | ||
|       GEN_ERROR("Cannot make struct constant with type: '" + 
 | ||
|                      (*yyvsp[-3].TypeVal)->getDescription() + "'");
 | ||
| 
 | ||
|     if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes())
 | ||
|       GEN_ERROR("Illegal number of initializers for structure type");
 | ||
| 
 | ||
|     // Check to ensure that constants are compatible with the type initializer!
 | ||
|     for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i)
 | ||
|       if ((*yyvsp[-1].ConstVector)[i]->getType() != STy->getElementType(i))
 | ||
|         GEN_ERROR("Expected type '" +
 | ||
|                        STy->getElementType(i)->getDescription() +
 | ||
|                        "' for element #" + utostr(i) +
 | ||
|                        " of structure initializer");
 | ||
| 
 | ||
|     // Check to ensure that Type is not packed
 | ||
|     if (STy->isPacked())
 | ||
|       GEN_ERROR("Unpacked Initializer to vector type '" + STy->getDescription() + "'");
 | ||
| 
 | ||
|     yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector);
 | ||
|     delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 147:
 | ||
| #line 1607 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     const StructType *STy = dyn_cast<StructType>(yyvsp[-2].TypeVal->get());
 | ||
|     if (STy == 0)
 | ||
|       GEN_ERROR("Cannot make struct constant with type: '" + 
 | ||
|                      (*yyvsp[-2].TypeVal)->getDescription() + "'");
 | ||
| 
 | ||
|     if (STy->getNumContainedTypes() != 0)
 | ||
|       GEN_ERROR("Illegal number of initializers for structure type");
 | ||
| 
 | ||
|     // Check to ensure that Type is not packed
 | ||
|     if (STy->isPacked())
 | ||
|       GEN_ERROR("Unpacked Initializer to vector type '" + STy->getDescription() + "'");
 | ||
| 
 | ||
|     yyval.ConstVal = ConstantStruct::get(STy, std::vector<Constant*>());
 | ||
|     delete yyvsp[-2].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 148:
 | ||
| #line 1626 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     const StructType *STy = dyn_cast<StructType>(yyvsp[-5].TypeVal->get());
 | ||
|     if (STy == 0)
 | ||
|       GEN_ERROR("Cannot make struct constant with type: '" + 
 | ||
|                      (*yyvsp[-5].TypeVal)->getDescription() + "'");
 | ||
| 
 | ||
|     if (yyvsp[-2].ConstVector->size() != STy->getNumContainedTypes())
 | ||
|       GEN_ERROR("Illegal number of initializers for structure type");
 | ||
| 
 | ||
|     // Check to ensure that constants are compatible with the type initializer!
 | ||
|     for (unsigned i = 0, e = yyvsp[-2].ConstVector->size(); i != e; ++i)
 | ||
|       if ((*yyvsp[-2].ConstVector)[i]->getType() != STy->getElementType(i))
 | ||
|         GEN_ERROR("Expected type '" +
 | ||
|                        STy->getElementType(i)->getDescription() +
 | ||
|                        "' for element #" + utostr(i) +
 | ||
|                        " of structure initializer");
 | ||
| 
 | ||
|     // Check to ensure that Type is packed
 | ||
|     if (!STy->isPacked())
 | ||
|       GEN_ERROR("Vector initializer to non-vector type '" + 
 | ||
|                 STy->getDescription() + "'");
 | ||
| 
 | ||
|     yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-2].ConstVector);
 | ||
|     delete yyvsp[-5].TypeVal; delete yyvsp[-2].ConstVector;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 149:
 | ||
| #line 1652 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
 | ||
|     const StructType *STy = dyn_cast<StructType>(yyvsp[-4].TypeVal->get());
 | ||
|     if (STy == 0)
 | ||
|       GEN_ERROR("Cannot make struct constant with type: '" + 
 | ||
|                      (*yyvsp[-4].TypeVal)->getDescription() + "'");
 | ||
| 
 | ||
|     if (STy->getNumContainedTypes() != 0)
 | ||
|       GEN_ERROR("Illegal number of initializers for structure type");
 | ||
| 
 | ||
|     // Check to ensure that Type is packed
 | ||
|     if (!STy->isPacked())
 | ||
|       GEN_ERROR("Vector initializer to non-vector type '" + 
 | ||
|                 STy->getDescription() + "'");
 | ||
| 
 | ||
|     yyval.ConstVal = ConstantStruct::get(STy, std::vector<Constant*>());
 | ||
|     delete yyvsp[-4].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 150:
 | ||
| #line 1672 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     const PointerType *PTy = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
 | ||
|     if (PTy == 0)
 | ||
|       GEN_ERROR("Cannot make null pointer constant with type: '" + 
 | ||
|                      (*yyvsp[-1].TypeVal)->getDescription() + "'");
 | ||
| 
 | ||
|     yyval.ConstVal = ConstantPointerNull::get(PTy);
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 151:
 | ||
| #line 1684 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get());
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 152:
 | ||
| #line 1691 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     const PointerType *Ty = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
 | ||
|     if (Ty == 0)
 | ||
|       GEN_ERROR("Global const reference must be a pointer type");
 | ||
| 
 | ||
|     // ConstExprs can exist in the body of a function, thus creating
 | ||
|     // GlobalValues whenever they refer to a variable.  Because we are in
 | ||
|     // the context of a function, getExistingVal will search the functions
 | ||
|     // symbol table instead of the module symbol table for the global symbol,
 | ||
|     // which throws things all off.  To get around this, we just tell
 | ||
|     // getExistingVal that we are at global scope here.
 | ||
|     //
 | ||
|     Function *SavedCurFn = CurFun.CurrentFunction;
 | ||
|     CurFun.CurrentFunction = 0;
 | ||
| 
 | ||
|     Value *V = getExistingVal(Ty, yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
| 
 | ||
|     CurFun.CurrentFunction = SavedCurFn;
 | ||
| 
 | ||
|     // If this is an initializer for a constant pointer, which is referencing a
 | ||
|     // (currently) undefined variable, create a stub now that shall be replaced
 | ||
|     // in the future with the right type of variable.
 | ||
|     //
 | ||
|     if (V == 0) {
 | ||
|       assert(isa<PointerType>(Ty) && "Globals may only be used as pointers!");
 | ||
|       const PointerType *PT = cast<PointerType>(Ty);
 | ||
| 
 | ||
|       // First check to see if the forward references value is already created!
 | ||
|       PerModuleInfo::GlobalRefsType::iterator I =
 | ||
|         CurModule.GlobalRefs.find(std::make_pair(PT, yyvsp[0].ValIDVal));
 | ||
|     
 | ||
|       if (I != CurModule.GlobalRefs.end()) {
 | ||
|         V = I->second;             // Placeholder already exists, use it...
 | ||
|         yyvsp[0].ValIDVal.destroy();
 | ||
|       } else {
 | ||
|         std::string Name;
 | ||
|         if (yyvsp[0].ValIDVal.Type == ValID::GlobalName)
 | ||
|           Name = yyvsp[0].ValIDVal.Name;
 | ||
|         else if (yyvsp[0].ValIDVal.Type != ValID::GlobalID)
 | ||
|           GEN_ERROR("Invalid reference to global");
 | ||
| 
 | ||
|         // Create the forward referenced global.
 | ||
|         GlobalValue *GV;
 | ||
|         if (const FunctionType *FTy = 
 | ||
|                  dyn_cast<FunctionType>(PT->getElementType())) {
 | ||
|           GV = new Function(FTy, GlobalValue::ExternalLinkage, Name,
 | ||
|                             CurModule.CurrentModule);
 | ||
|         } else {
 | ||
|           GV = new GlobalVariable(PT->getElementType(), false,
 | ||
|                                   GlobalValue::ExternalLinkage, 0,
 | ||
|                                   Name, CurModule.CurrentModule);
 | ||
|         }
 | ||
| 
 | ||
|         // Keep track of the fact that we have a forward ref to recycle it
 | ||
|         CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, yyvsp[0].ValIDVal), GV));
 | ||
|         V = GV;
 | ||
|       }
 | ||
|     }
 | ||
| 
 | ||
|     yyval.ConstVal = cast<GlobalValue>(V);
 | ||
|     delete yyvsp[-1].TypeVal;            // Free the type handle
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 153:
 | ||
| #line 1757 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType())
 | ||
|       GEN_ERROR("Mismatched types for constant expression: " + 
 | ||
|         (*yyvsp[-1].TypeVal)->getDescription() + " and " + yyvsp[0].ConstVal->getType()->getDescription());
 | ||
|     yyval.ConstVal = yyvsp[0].ConstVal;
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 154:
 | ||
| #line 1767 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     const Type *Ty = yyvsp[-1].TypeVal->get();
 | ||
|     if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
 | ||
|       GEN_ERROR("Cannot create a null initialized value of this type");
 | ||
|     yyval.ConstVal = Constant::getNullValue(Ty);
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 155:
 | ||
| #line 1777 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {      // integral constants
 | ||
|     if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val))
 | ||
|       GEN_ERROR("Constant value doesn't fit in type");
 | ||
|     yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val, true);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 156:
 | ||
| #line 1783 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {      // arbitrary precision integer constants
 | ||
|     uint32_t BitWidth = cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth();
 | ||
|     if (yyvsp[0].APIntVal->getBitWidth() > BitWidth) {
 | ||
|       GEN_ERROR("Constant value does not fit in type");
 | ||
|     }
 | ||
|     yyvsp[0].APIntVal->sextOrTrunc(BitWidth);
 | ||
|     yyval.ConstVal = ConstantInt::get(*yyvsp[0].APIntVal);
 | ||
|     delete yyvsp[0].APIntVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 157:
 | ||
| #line 1793 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {      // integral constants
 | ||
|     if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val))
 | ||
|       GEN_ERROR("Constant value doesn't fit in type");
 | ||
|     yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val, false);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 158:
 | ||
| #line 1799 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {      // arbitrary precision integer constants
 | ||
|     uint32_t BitWidth = cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth();
 | ||
|     if (yyvsp[0].APIntVal->getBitWidth() > BitWidth) {
 | ||
|       GEN_ERROR("Constant value does not fit in type");
 | ||
|     } 
 | ||
|     yyvsp[0].APIntVal->zextOrTrunc(BitWidth);
 | ||
|     yyval.ConstVal = ConstantInt::get(*yyvsp[0].APIntVal);
 | ||
|     delete yyvsp[0].APIntVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 159:
 | ||
| #line 1809 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                      // Boolean constants
 | ||
|     assert(cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?");
 | ||
|     yyval.ConstVal = ConstantInt::getTrue();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 160:
 | ||
| #line 1814 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                     // Boolean constants
 | ||
|     assert(cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?");
 | ||
|     yyval.ConstVal = ConstantInt::getFalse();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 161:
 | ||
| #line 1819 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                   // Float & Double constants
 | ||
|     if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal))
 | ||
|       GEN_ERROR("Floating point constant invalid for type");
 | ||
|     yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 162:
 | ||
| #line 1827 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     Constant *Val = yyvsp[-3].ConstVal;
 | ||
|     const Type *DestTy = yyvsp[-1].TypeVal->get();
 | ||
|     if (!CastInst::castIsValid(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy))
 | ||
|       GEN_ERROR("invalid cast opcode for cast from '" +
 | ||
|                 Val->getType()->getDescription() + "' to '" +
 | ||
|                 DestTy->getDescription() + "'"); 
 | ||
|     yyval.ConstVal = ConstantExpr::getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy);
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 163:
 | ||
| #line 1839 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!isa<PointerType>(yyvsp[-2].ConstVal->getType()))
 | ||
|       GEN_ERROR("GetElementPtr requires a pointer operand");
 | ||
| 
 | ||
|     const Type *IdxTy =
 | ||
|       GetElementPtrInst::getIndexedType(yyvsp[-2].ConstVal->getType(), &(*yyvsp[-1].ValueList)[0], yyvsp[-1].ValueList->size(),
 | ||
|                                         true);
 | ||
|     if (!IdxTy)
 | ||
|       GEN_ERROR("Index list invalid for constant getelementptr");
 | ||
| 
 | ||
|     SmallVector<Constant*, 8> IdxVec;
 | ||
|     for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i)
 | ||
|       if (Constant *C = dyn_cast<Constant>((*yyvsp[-1].ValueList)[i]))
 | ||
|         IdxVec.push_back(C);
 | ||
|       else
 | ||
|         GEN_ERROR("Indices to constant getelementptr must be constants");
 | ||
| 
 | ||
|     delete yyvsp[-1].ValueList;
 | ||
| 
 | ||
|     yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, &IdxVec[0], IdxVec.size());
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 164:
 | ||
| #line 1861 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[-5].ConstVal->getType() != Type::Int1Ty)
 | ||
|       GEN_ERROR("Select condition must be of boolean type");
 | ||
|     if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
 | ||
|       GEN_ERROR("Select operand types must match");
 | ||
|     yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 165:
 | ||
| #line 1869 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
 | ||
|       GEN_ERROR("Binary operator types must match");
 | ||
|     CHECK_FOR_ERROR;
 | ||
|     yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 166:
 | ||
| #line 1875 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
 | ||
|       GEN_ERROR("Logical operator types must match");
 | ||
|     if (!yyvsp[-3].ConstVal->getType()->isInteger()) {
 | ||
|       if (Instruction::isShift(yyvsp[-5].BinaryOpVal) || !isa<VectorType>(yyvsp[-3].ConstVal->getType()) || 
 | ||
|           !cast<VectorType>(yyvsp[-3].ConstVal->getType())->getElementType()->isInteger())
 | ||
|         GEN_ERROR("Logical operator requires integral operands");
 | ||
|     }
 | ||
|     yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 167:
 | ||
| #line 1886 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
 | ||
|       GEN_ERROR("icmp operand types must match");
 | ||
|     yyval.ConstVal = ConstantExpr::getICmp(yyvsp[-5].IPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 168:
 | ||
| #line 1891 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
 | ||
|       GEN_ERROR("fcmp operand types must match");
 | ||
|     yyval.ConstVal = ConstantExpr::getFCmp(yyvsp[-5].FPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 169:
 | ||
| #line 1896 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!ExtractElementInst::isValidOperands(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
 | ||
|       GEN_ERROR("Invalid extractelement operands");
 | ||
|     yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 170:
 | ||
| #line 1902 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!InsertElementInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
 | ||
|       GEN_ERROR("Invalid insertelement operands");
 | ||
|     yyval.ConstVal = ConstantExpr::getInsertElement(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 171:
 | ||
| #line 1908 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!ShuffleVectorInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
 | ||
|       GEN_ERROR("Invalid shufflevector operands");
 | ||
|     yyval.ConstVal = ConstantExpr::getShuffleVector(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 172:
 | ||
| #line 1917 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 173:
 | ||
| #line 1921 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ConstVector = new std::vector<Constant*>();
 | ||
|     yyval.ConstVector->push_back(yyvsp[0].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 174:
 | ||
| #line 1929 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.BoolVal = false; ;
 | ||
|     break;}
 | ||
| case 175:
 | ||
| #line 1929 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.BoolVal = true; ;
 | ||
|     break;}
 | ||
| case 176:
 | ||
| #line 1932 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.BoolVal = true; ;
 | ||
|     break;}
 | ||
| case 177:
 | ||
| #line 1932 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.BoolVal = false; ;
 | ||
|     break;}
 | ||
| case 178:
 | ||
| #line 1943 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
 | ||
|     CurModule.ModuleDone();
 | ||
|     CHECK_FOR_ERROR;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 179:
 | ||
| #line 1948 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
 | ||
|     CurModule.ModuleDone();
 | ||
|     CHECK_FOR_ERROR;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 182:
 | ||
| #line 1961 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { CurFun.isDeclare = false; ;
 | ||
|     break;}
 | ||
| case 183:
 | ||
| #line 1961 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurFun.FunctionDone();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 184:
 | ||
| #line 1965 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { CurFun.isDeclare = true; ;
 | ||
|     break;}
 | ||
| case 185:
 | ||
| #line 1965 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 186:
 | ||
| #line 1968 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 187:
 | ||
| #line 1971 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
 | ||
|     // Eagerly resolve types.  This is not an optimization, this is a
 | ||
|     // requirement that is due to the fact that we could have this:
 | ||
|     //
 | ||
|     // %list = type { %list * }
 | ||
|     // %list = type { %list * }    ; repeated type decl
 | ||
|     //
 | ||
|     // If types are not resolved eagerly, then the two types will not be
 | ||
|     // determined to be the same type!
 | ||
|     //
 | ||
|     ResolveTypeTo(yyvsp[-2].StrVal, *yyvsp[0].TypeVal);
 | ||
| 
 | ||
|     if (!setTypeName(*yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) {
 | ||
|       CHECK_FOR_ERROR
 | ||
|       // If this is a named type that is not a redefinition, add it to the slot
 | ||
|       // table.
 | ||
|       CurModule.Types.push_back(*yyvsp[0].TypeVal);
 | ||
|     }
 | ||
| 
 | ||
|     delete yyvsp[0].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 188:
 | ||
| #line 1995 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     ResolveTypeTo(yyvsp[-2].StrVal, yyvsp[0].PrimType);
 | ||
| 
 | ||
|     if (!setTypeName(yyvsp[0].PrimType, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) {
 | ||
|       CHECK_FOR_ERROR
 | ||
|       // If this is a named type that is not a redefinition, add it to the slot
 | ||
|       // table.
 | ||
|       CurModule.Types.push_back(yyvsp[0].PrimType);
 | ||
|     }
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 189:
 | ||
| #line 2006 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { 
 | ||
|     /* "Externally Visible" Linkage */
 | ||
|     if (yyvsp[0].ConstVal == 0) 
 | ||
|       GEN_ERROR("Global value initializer is not a constant");
 | ||
|     CurGV = ParseGlobalVariable(yyvsp[-4].StrVal, GlobalValue::ExternalLinkage,
 | ||
|                                 yyvsp[-3].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal, yyvsp[-2].BoolVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 190:
 | ||
| #line 2013 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurGV = 0;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 191:
 | ||
| #line 2016 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[0].ConstVal == 0) 
 | ||
|       GEN_ERROR("Global value initializer is not a constant");
 | ||
|     CurGV = ParseGlobalVariable(yyvsp[-5].StrVal, yyvsp[-4].Linkage, yyvsp[-3].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal, yyvsp[-2].BoolVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 192:
 | ||
| #line 2021 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurGV = 0;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 193:
 | ||
| #line 2024 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
 | ||
|     CurGV = ParseGlobalVariable(yyvsp[-5].StrVal, yyvsp[-4].Linkage, yyvsp[-3].Visibility, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0, yyvsp[-2].BoolVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     delete yyvsp[0].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 194:
 | ||
| #line 2030 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurGV = 0;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 195:
 | ||
| #line 2034 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { 
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 196:
 | ||
| #line 2037 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 197:
 | ||
| #line 2043 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|   const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
 | ||
|   char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true);
 | ||
|   std::string NewAsm(yyvsp[0].StrVal, EndStr);
 | ||
|   free(yyvsp[0].StrVal);
 | ||
| 
 | ||
|   if (AsmSoFar.empty())
 | ||
|     CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
 | ||
|   else
 | ||
|     CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
 | ||
|   CHECK_FOR_ERROR
 | ||
| ;
 | ||
|     break;}
 | ||
| case 198:
 | ||
| #line 2056 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal);
 | ||
|     free(yyvsp[0].StrVal);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 199:
 | ||
| #line 2060 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurModule.CurrentModule->setDataLayout(yyvsp[0].StrVal);
 | ||
|     free(yyvsp[0].StrVal);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 201:
 | ||
| #line 2067 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|           CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
 | ||
|           free(yyvsp[0].StrVal);
 | ||
|           CHECK_FOR_ERROR
 | ||
|         ;
 | ||
|     break;}
 | ||
| case 202:
 | ||
| #line 2072 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|           CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
 | ||
|           free(yyvsp[0].StrVal);
 | ||
|           CHECK_FOR_ERROR
 | ||
|         ;
 | ||
|     break;}
 | ||
| case 203:
 | ||
| #line 2077 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|           CHECK_FOR_ERROR
 | ||
|         ;
 | ||
|     break;}
 | ||
| case 204:
 | ||
| #line 2086 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     if (*yyvsp[-2].TypeVal == Type::VoidTy)
 | ||
|       GEN_ERROR("void typed arguments are invalid");
 | ||
|     ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal;
 | ||
|     yyval.ArgList = yyvsp[-4].ArgList;
 | ||
|     yyvsp[-4].ArgList->push_back(E);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 205:
 | ||
| #line 2096 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     if (*yyvsp[-2].TypeVal == Type::VoidTy)
 | ||
|       GEN_ERROR("void typed arguments are invalid");
 | ||
|     ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal;
 | ||
|     yyval.ArgList = new ArgListType;
 | ||
|     yyval.ArgList->push_back(E);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 206:
 | ||
| #line 2107 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ArgList = yyvsp[0].ArgList;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 207:
 | ||
| #line 2111 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ArgList = yyvsp[-2].ArgList;
 | ||
|     struct ArgListEntry E;
 | ||
|     E.Ty = new PATypeHolder(Type::VoidTy);
 | ||
|     E.Name = 0;
 | ||
|     E.Attrs = ParamAttr::None;
 | ||
|     yyval.ArgList->push_back(E);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 208:
 | ||
| #line 2120 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ArgList = new ArgListType;
 | ||
|     struct ArgListEntry E;
 | ||
|     E.Ty = new PATypeHolder(Type::VoidTy);
 | ||
|     E.Name = 0;
 | ||
|     E.Attrs = ParamAttr::None;
 | ||
|     yyval.ArgList->push_back(E);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 209:
 | ||
| #line 2129 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ArgList = 0;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 210:
 | ||
| #line 2135 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|   UnEscapeLexed(yyvsp[-6].StrVal);
 | ||
|   std::string FunctionName(yyvsp[-6].StrVal);
 | ||
|   free(yyvsp[-6].StrVal);  // Free strdup'd memory!
 | ||
|   
 | ||
|   // Check the function result for abstractness if this is a define. We should
 | ||
|   // have no abstract types at this point
 | ||
|   if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(yyvsp[-7].TypeVal))
 | ||
|     GEN_ERROR("Reference to abstract result: "+ yyvsp[-7].TypeVal->get()->getDescription());
 | ||
| 
 | ||
|   std::vector<const Type*> ParamTypeList;
 | ||
|   ParamAttrsVector Attrs;
 | ||
|   if (yyvsp[-2].ParamAttrs != ParamAttr::None) {
 | ||
|     ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = yyvsp[-2].ParamAttrs;
 | ||
|     Attrs.push_back(PAWI);
 | ||
|   }
 | ||
|   if (yyvsp[-4].ArgList) {   // If there are arguments...
 | ||
|     unsigned index = 1;
 | ||
|     for (ArgListType::iterator I = yyvsp[-4].ArgList->begin(); I != yyvsp[-4].ArgList->end(); ++I, ++index) {
 | ||
|       const Type* Ty = I->Ty->get();
 | ||
|       if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(I->Ty))
 | ||
|         GEN_ERROR("Reference to abstract argument: " + Ty->getDescription());
 | ||
|       ParamTypeList.push_back(Ty);
 | ||
|       if (Ty != Type::VoidTy)
 | ||
|         if (I->Attrs != ParamAttr::None) {
 | ||
|           ParamAttrsWithIndex PAWI; PAWI.index = index; PAWI.attrs = I->Attrs;
 | ||
|           Attrs.push_back(PAWI);
 | ||
|         }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
 | ||
|   if (isVarArg) ParamTypeList.pop_back();
 | ||
| 
 | ||
|   ParamAttrsList *PAL = 0;
 | ||
|   if (!Attrs.empty())
 | ||
|     PAL = ParamAttrsList::get(Attrs);
 | ||
| 
 | ||
|   FunctionType *FT = FunctionType::get(*yyvsp[-7].TypeVal, ParamTypeList, isVarArg, PAL);
 | ||
|   const PointerType *PFT = PointerType::get(FT);
 | ||
|   delete yyvsp[-7].TypeVal;
 | ||
| 
 | ||
|   ValID ID;
 | ||
|   if (!FunctionName.empty()) {
 | ||
|     ID = ValID::createGlobalName((char*)FunctionName.c_str());
 | ||
|   } else {
 | ||
|     ID = ValID::createGlobalID(CurModule.Values.size());
 | ||
|   }
 | ||
| 
 | ||
|   Function *Fn = 0;
 | ||
|   // See if this function was forward referenced.  If so, recycle the object.
 | ||
|   if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
 | ||
|     // Move the function to the end of the list, from whereever it was 
 | ||
|     // previously inserted.
 | ||
|     Fn = cast<Function>(FWRef);
 | ||
|     CurModule.CurrentModule->getFunctionList().remove(Fn);
 | ||
|     CurModule.CurrentModule->getFunctionList().push_back(Fn);
 | ||
|   } else if (!FunctionName.empty() &&     // Merge with an earlier prototype?
 | ||
|              (Fn = CurModule.CurrentModule->getFunction(FunctionName))) {
 | ||
|     if (Fn->getFunctionType() != FT ) {
 | ||
|       // The existing function doesn't have the same type. This is an overload
 | ||
|       // error.
 | ||
|       GEN_ERROR("Overload of function '" + FunctionName + "' not permitted.");
 | ||
|     } else if (!CurFun.isDeclare && !Fn->isDeclaration()) {
 | ||
|       // Neither the existing or the current function is a declaration and they
 | ||
|       // have the same name and same type. Clearly this is a redefinition.
 | ||
|       GEN_ERROR("Redefinition of function '" + FunctionName + "'");
 | ||
|     } if (Fn->isDeclaration()) {
 | ||
|       // Make sure to strip off any argument names so we can't get conflicts.
 | ||
|       for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
 | ||
|            AI != AE; ++AI)
 | ||
|         AI->setName("");
 | ||
|     }
 | ||
|   } else  {  // Not already defined?
 | ||
|     Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
 | ||
|                       CurModule.CurrentModule);
 | ||
| 
 | ||
|     InsertValue(Fn, CurModule.Values);
 | ||
|   }
 | ||
| 
 | ||
|   CurFun.FunctionStart(Fn);
 | ||
| 
 | ||
|   if (CurFun.isDeclare) {
 | ||
|     // If we have declaration, always overwrite linkage.  This will allow us to
 | ||
|     // correctly handle cases, when pointer to function is passed as argument to
 | ||
|     // another function.
 | ||
|     Fn->setLinkage(CurFun.Linkage);
 | ||
|     Fn->setVisibility(CurFun.Visibility);
 | ||
|   }
 | ||
|   Fn->setCallingConv(yyvsp[-8].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[-4].ArgList) {                     // Is null if empty...
 | ||
|     if (isVarArg) {  // Nuke the last entry
 | ||
|       assert(yyvsp[-4].ArgList->back().Ty->get() == Type::VoidTy && yyvsp[-4].ArgList->back().Name == 0 &&
 | ||
|              "Not a varargs marker!");
 | ||
|       delete yyvsp[-4].ArgList->back().Ty;
 | ||
|       yyvsp[-4].ArgList->pop_back();  // Delete the last entry
 | ||
|     }
 | ||
|     Function::arg_iterator ArgIt = Fn->arg_begin();
 | ||
|     Function::arg_iterator ArgEnd = Fn->arg_end();
 | ||
|     unsigned Idx = 1;
 | ||
|     for (ArgListType::iterator I = yyvsp[-4].ArgList->begin(); 
 | ||
|          I != yyvsp[-4].ArgList->end() && ArgIt != ArgEnd; ++I, ++ArgIt) {
 | ||
|       delete I->Ty;                          // Delete the typeholder...
 | ||
|       setValueName(ArgIt, I->Name);          // Insert arg into symtab...
 | ||
|       CHECK_FOR_ERROR
 | ||
|       InsertValue(ArgIt);
 | ||
|       Idx++;
 | ||
|     }
 | ||
| 
 | ||
|     delete yyvsp[-4].ArgList;                     // We're now done with the argument list
 | ||
|   }
 | ||
|   CHECK_FOR_ERROR
 | ||
| ;
 | ||
|     break;}
 | ||
| case 213:
 | ||
| #line 2258 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|   yyval.FunctionVal = CurFun.CurrentFunction;
 | ||
| 
 | ||
|   // Make sure that we keep track of the linkage type even if there was a
 | ||
|   // previous "declare".
 | ||
|   yyval.FunctionVal->setLinkage(yyvsp[-3].Linkage);
 | ||
|   yyval.FunctionVal->setVisibility(yyvsp[-2].Visibility);
 | ||
| ;
 | ||
|     break;}
 | ||
| case 216:
 | ||
| #line 2269 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|   yyval.FunctionVal = yyvsp[-1].FunctionVal;
 | ||
|   CHECK_FOR_ERROR
 | ||
| ;
 | ||
|     break;}
 | ||
| case 217:
 | ||
| #line 2274 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurFun.CurrentFunction->setLinkage(yyvsp[-2].Linkage);
 | ||
|     CurFun.CurrentFunction->setVisibility(yyvsp[-1].Visibility);
 | ||
|     yyval.FunctionVal = CurFun.CurrentFunction;
 | ||
|     CurFun.FunctionDone();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 218:
 | ||
| #line 2286 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = false;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 219:
 | ||
| #line 2290 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = true;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 220:
 | ||
| #line 2295 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {    // A reference to a direct constant
 | ||
|     yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 221:
 | ||
| #line 2299 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 222:
 | ||
| #line 2303 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                     // Perhaps it's an FP constant?
 | ||
|     yyval.ValIDVal = ValID::create(yyvsp[0].FPVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 223:
 | ||
| #line 2307 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::create(ConstantInt::getTrue());
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 224:
 | ||
| #line 2311 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::create(ConstantInt::getFalse());
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 225:
 | ||
| #line 2315 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::createNull();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 226:
 | ||
| #line 2319 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::createUndef();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 227:
 | ||
| #line 2323 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {     // A vector zero constant.
 | ||
|     yyval.ValIDVal = ValID::createZeroInit();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 228:
 | ||
| #line 2327 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { // Nonempty unsized packed vector
 | ||
|     const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType();
 | ||
|     int NumElements = yyvsp[-1].ConstVector->size(); 
 | ||
|     
 | ||
|     VectorType* pt = VectorType::get(ETy, NumElements);
 | ||
|     PATypeHolder* PTy = new PATypeHolder(
 | ||
|                                          HandleUpRefs(
 | ||
|                                             VectorType::get(
 | ||
|                                                 ETy, 
 | ||
|                                                 NumElements)
 | ||
|                                             )
 | ||
|                                          );
 | ||
|     
 | ||
|     // Verify all elements are correct type!
 | ||
|     for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
 | ||
|       if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
 | ||
|         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
 | ||
|                      ETy->getDescription() +"' as required!\nIt is of type '" +
 | ||
|                      (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
 | ||
|     }
 | ||
| 
 | ||
|     yyval.ValIDVal = ValID::create(ConstantVector::get(pt, *yyvsp[-1].ConstVector));
 | ||
|     delete PTy; delete yyvsp[-1].ConstVector;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 229:
 | ||
| #line 2352 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 230:
 | ||
| #line 2356 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     char *End = UnEscapeLexed(yyvsp[-2].StrVal, true);
 | ||
|     std::string AsmStr = std::string(yyvsp[-2].StrVal, End);
 | ||
|     End = UnEscapeLexed(yyvsp[0].StrVal, true);
 | ||
|     std::string Constraints = std::string(yyvsp[0].StrVal, End);
 | ||
|     yyval.ValIDVal = ValID::createInlineAsm(AsmStr, Constraints, yyvsp[-3].BoolVal);
 | ||
|     free(yyvsp[-2].StrVal);
 | ||
|     free(yyvsp[0].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 231:
 | ||
| #line 2370 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {  // Is it an integer reference...?
 | ||
|     yyval.ValIDVal = ValID::createLocalID(yyvsp[0].UIntVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 232:
 | ||
| #line 2374 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::createGlobalID(yyvsp[0].UIntVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 233:
 | ||
| #line 2378 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                   // Is it a named reference...?
 | ||
|     yyval.ValIDVal = ValID::createLocalName(yyvsp[0].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 234:
 | ||
| #line 2382 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                   // Is it a named reference...?
 | ||
|     yyval.ValIDVal = ValID::createGlobalName(yyvsp[0].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 237:
 | ||
| #line 2394 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); 
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 238:
 | ||
| #line 2403 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.FunctionVal = yyvsp[-1].FunctionVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 239:
 | ||
| #line 2407 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { // Do not allow functions with 0 basic blocks   
 | ||
|     yyval.FunctionVal = yyvsp[-1].FunctionVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 240:
 | ||
| #line 2416 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     InsertValue(yyvsp[0].TermInstVal);
 | ||
|     yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal);
 | ||
|     yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 241:
 | ||
| #line 2425 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (CastInst *CI1 = dyn_cast<CastInst>(yyvsp[0].InstVal))
 | ||
|       if (CastInst *CI2 = dyn_cast<CastInst>(CI1->getOperand(0)))
 | ||
|         if (CI2->getParent() == 0)
 | ||
|           yyvsp[-1].BasicBlockVal->getInstList().push_back(CI2);
 | ||
|     yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal);
 | ||
|     yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 242:
 | ||
| #line 2434 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {          // Empty space between instruction lists
 | ||
|     yyval.BasicBlockVal = defineBBVal(ValID::createLocalID(CurFun.NextValNum));
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 243:
 | ||
| #line 2438 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {             // Labelled (named) basic block
 | ||
|     yyval.BasicBlockVal = defineBBVal(ValID::createLocalName(yyvsp[0].StrVal));
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 244:
 | ||
| #line 2443 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {              // Return with a result...
 | ||
|     yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 245:
 | ||
| #line 2447 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                                    // Return with no result...
 | ||
|     yyval.TermInstVal = new ReturnInst();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 246:
 | ||
| #line 2451 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                           // Unconditional Branch...
 | ||
|     BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.TermInstVal = new BranchInst(tmpBB);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 247:
 | ||
| #line 2456 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {  
 | ||
|     assert(cast<IntegerType>(yyvsp[-7].PrimType)->getBitWidth() == 1 && "Not Bool?");
 | ||
|     BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     Value* tmpVal = getVal(Type::Int1Ty, yyvsp[-6].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.TermInstVal = new BranchInst(tmpBBA, tmpBBB, tmpVal);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 248:
 | ||
| #line 2466 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     Value* tmpVal = getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     SwitchInst *S = new SwitchInst(tmpVal, tmpBB, yyvsp[-1].JumpTable->size());
 | ||
|     yyval.TermInstVal = S;
 | ||
| 
 | ||
|     std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = yyvsp[-1].JumpTable->begin(),
 | ||
|       E = yyvsp[-1].JumpTable->end();
 | ||
|     for (; I != E; ++I) {
 | ||
|       if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
 | ||
|           S->addCase(CI, I->second);
 | ||
|       else
 | ||
|         GEN_ERROR("Switch case is constant, but not a simple integer");
 | ||
|     }
 | ||
|     delete yyvsp[-1].JumpTable;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 249:
 | ||
| #line 2485 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     Value* tmpVal = getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
 | ||
|     yyval.TermInstVal = S;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 250:
 | ||
| #line 2495 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
| 
 | ||
|     // Handle the short syntax
 | ||
|     const PointerType *PFTy = 0;
 | ||
|     const FunctionType *Ty = 0;
 | ||
|     if (!(PFTy = dyn_cast<PointerType>(yyvsp[-11].TypeVal->get())) ||
 | ||
|         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
 | ||
|       // Pull out the types of all of the arguments...
 | ||
|       std::vector<const Type*> ParamTypes;
 | ||
|       ParamAttrsVector Attrs;
 | ||
|       if (yyvsp[-6].ParamAttrs != ParamAttr::None) {
 | ||
|         ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = 8;
 | ||
|         Attrs.push_back(PAWI);
 | ||
|       }
 | ||
|       ValueRefList::iterator I = yyvsp[-8].ValueRefList->begin(), E = yyvsp[-8].ValueRefList->end();
 | ||
|       unsigned index = 1;
 | ||
|       for (; I != E; ++I, ++index) {
 | ||
|         const Type *Ty = I->Val->getType();
 | ||
|         if (Ty == Type::VoidTy)
 | ||
|           GEN_ERROR("Short call syntax cannot be used with varargs");
 | ||
|         ParamTypes.push_back(Ty);
 | ||
|         if (I->Attrs != ParamAttr::None) {
 | ||
|           ParamAttrsWithIndex PAWI; PAWI.index = index; PAWI.attrs = I->Attrs;
 | ||
|           Attrs.push_back(PAWI);
 | ||
|         }
 | ||
|       }
 | ||
| 
 | ||
|       ParamAttrsList *PAL = 0;
 | ||
|       if (!Attrs.empty())
 | ||
|         PAL = ParamAttrsList::get(Attrs);
 | ||
|       Ty = FunctionType::get(yyvsp[-11].TypeVal->get(), ParamTypes, false, PAL);
 | ||
|       PFTy = PointerType::get(Ty);
 | ||
|     }
 | ||
| 
 | ||
|     delete yyvsp[-11].TypeVal;
 | ||
| 
 | ||
|     Value *V = getVal(PFTy, yyvsp[-10].ValIDVal);   // Get the function we're calling...
 | ||
|     CHECK_FOR_ERROR
 | ||
|     BasicBlock *Normal = getBBVal(yyvsp[-3].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     BasicBlock *Except = getBBVal(yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
| 
 | ||
|     // Check the arguments
 | ||
|     ValueList Args;
 | ||
|     if (yyvsp[-8].ValueRefList->empty()) {                                   // Has no arguments?
 | ||
|       // Make sure no arguments is a good thing!
 | ||
|       if (Ty->getNumParams() != 0)
 | ||
|         GEN_ERROR("No arguments passed to a function that "
 | ||
|                        "expects arguments");
 | ||
|     } else {                                     // Has arguments?
 | ||
|       // Loop through FunctionType's arguments and ensure they are specified
 | ||
|       // correctly!
 | ||
|       FunctionType::param_iterator I = Ty->param_begin();
 | ||
|       FunctionType::param_iterator E = Ty->param_end();
 | ||
|       ValueRefList::iterator ArgI = yyvsp[-8].ValueRefList->begin(), ArgE = yyvsp[-8].ValueRefList->end();
 | ||
| 
 | ||
|       for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
 | ||
|         if (ArgI->Val->getType() != *I)
 | ||
|           GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
 | ||
|                          (*I)->getDescription() + "'");
 | ||
|         Args.push_back(ArgI->Val);
 | ||
|       }
 | ||
| 
 | ||
|       if (Ty->isVarArg()) {
 | ||
|         if (I == E)
 | ||
|           for (; ArgI != ArgE; ++ArgI)
 | ||
|             Args.push_back(ArgI->Val); // push the remaining varargs
 | ||
|       } else if (I != E || ArgI != ArgE)
 | ||
|         GEN_ERROR("Invalid number of parameters detected");
 | ||
|     }
 | ||
| 
 | ||
|     // Create the InvokeInst
 | ||
|     InvokeInst *II = new InvokeInst(V, Normal, Except, &Args[0], Args.size());
 | ||
|     II->setCallingConv(yyvsp[-12].UIntVal);
 | ||
|     yyval.TermInstVal = II;
 | ||
|     delete yyvsp[-8].ValueRefList;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 251:
 | ||
| #line 2574 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TermInstVal = new UnwindInst();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 252:
 | ||
| #line 2578 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TermInstVal = new UnreachableInst();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 253:
 | ||
| #line 2585 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.JumpTable = yyvsp[-5].JumpTable;
 | ||
|     Constant *V = cast<Constant>(getExistingVal(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
 | ||
|     CHECK_FOR_ERROR
 | ||
|     if (V == 0)
 | ||
|       GEN_ERROR("May only switch on a constant pool value");
 | ||
| 
 | ||
|     BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.JumpTable->push_back(std::make_pair(V, tmpBB));
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 254:
 | ||
| #line 2596 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.JumpTable = new std::vector<std::pair<Constant*, BasicBlock*> >();
 | ||
|     Constant *V = cast<Constant>(getExistingVal(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
 | ||
|     CHECK_FOR_ERROR
 | ||
| 
 | ||
|     if (V == 0)
 | ||
|       GEN_ERROR("May only switch on a constant pool value");
 | ||
| 
 | ||
|     BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); 
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 255:
 | ||
| #line 2609 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     // Is this definition named?? if so, assign the name...
 | ||
|     setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     InsertValue(yyvsp[0].InstVal);
 | ||
|     yyval.InstVal = yyvsp[0].InstVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 256:
 | ||
| #line 2619 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {    // Used for PHI nodes
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-5].TypeVal)->getDescription());
 | ||
|     yyval.PHIList = new std::list<std::pair<Value*, BasicBlock*> >();
 | ||
|     Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.PHIList->push_back(std::make_pair(tmpVal, tmpBB));
 | ||
|     delete yyvsp[-5].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 257:
 | ||
| #line 2630 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.PHIList = yyvsp[-6].PHIList;
 | ||
|     Value* tmpVal = getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyvsp[-6].PHIList->push_back(std::make_pair(tmpVal, tmpBB));
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 258:
 | ||
| #line 2640 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {    
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     // Used for call and invoke instructions
 | ||
|     yyval.ValueRefList = new ValueRefList();
 | ||
|     ValueRefListEntry E; E.Attrs = yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-2].TypeVal->get(), yyvsp[-1].ValIDVal);
 | ||
|     yyval.ValueRefList->push_back(E);
 | ||
|     delete yyvsp[-2].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 259:
 | ||
| #line 2649 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     yyval.ValueRefList = yyvsp[-4].ValueRefList;
 | ||
|     ValueRefListEntry E; E.Attrs = yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-2].TypeVal->get(), yyvsp[-1].ValIDVal);
 | ||
|     yyval.ValueRefList->push_back(E);
 | ||
|     delete yyvsp[-2].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 260:
 | ||
| #line 2658 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ValueRefList = new ValueRefList(); ;
 | ||
|     break;}
 | ||
| case 261:
 | ||
| #line 2661 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ValueList = new std::vector<Value*>(); ;
 | ||
|     break;}
 | ||
| case 262:
 | ||
| #line 2662 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValueList = yyvsp[-2].ValueList;
 | ||
|     yyval.ValueList->push_back(yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 263:
 | ||
| #line 2669 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = true;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 264:
 | ||
| #line 2673 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = false;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 265:
 | ||
| #line 2678 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
 | ||
|     if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && 
 | ||
|         !isa<VectorType>((*yyvsp[-3].TypeVal).get()))
 | ||
|       GEN_ERROR(
 | ||
|         "Arithmetic operator requires integer, FP, or packed operands");
 | ||
|     if (isa<VectorType>((*yyvsp[-3].TypeVal).get()) && 
 | ||
|         (yyvsp[-4].BinaryOpVal == Instruction::URem || 
 | ||
|          yyvsp[-4].BinaryOpVal == Instruction::SRem ||
 | ||
|          yyvsp[-4].BinaryOpVal == Instruction::FRem))
 | ||
|       GEN_ERROR("Remainder not supported on vector types");
 | ||
|     Value* val1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); 
 | ||
|     CHECK_FOR_ERROR
 | ||
|     Value* val2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, val1, val2);
 | ||
|     if (yyval.InstVal == 0)
 | ||
|       GEN_ERROR("binary operator returned null");
 | ||
|     delete yyvsp[-3].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 266:
 | ||
| #line 2699 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
 | ||
|     if (!(*yyvsp[-3].TypeVal)->isInteger()) {
 | ||
|       if (Instruction::isShift(yyvsp[-4].BinaryOpVal) || !isa<VectorType>(yyvsp[-3].TypeVal->get()) ||
 | ||
|           !cast<VectorType>(yyvsp[-3].TypeVal->get())->getElementType()->isInteger())
 | ||
|         GEN_ERROR("Logical operator requires integral operands");
 | ||
|     }
 | ||
|     Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2);
 | ||
|     if (yyval.InstVal == 0)
 | ||
|       GEN_ERROR("binary operator returned null");
 | ||
|     delete yyvsp[-3].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 267:
 | ||
| #line 2716 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
 | ||
|     if (isa<VectorType>((*yyvsp[-3].TypeVal).get()))
 | ||
|       GEN_ERROR("Vector types not supported by icmp instruction");
 | ||
|     Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].IPredicate, tmpVal1, tmpVal2);
 | ||
|     if (yyval.InstVal == 0)
 | ||
|       GEN_ERROR("icmp operator returned null");
 | ||
|     delete yyvsp[-3].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 268:
 | ||
| #line 2730 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
 | ||
|     if (isa<VectorType>((*yyvsp[-3].TypeVal).get()))
 | ||
|       GEN_ERROR("Vector types not supported by fcmp instruction");
 | ||
|     Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].FPredicate, tmpVal1, tmpVal2);
 | ||
|     if (yyval.InstVal == 0)
 | ||
|       GEN_ERROR("fcmp operator returned null");
 | ||
|     delete yyvsp[-3].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 269:
 | ||
| #line 2744 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
 | ||
|     Value* Val = yyvsp[-2].ValueVal;
 | ||
|     const Type* DestTy = yyvsp[0].TypeVal->get();
 | ||
|     if (!CastInst::castIsValid(yyvsp[-3].CastOpVal, Val, DestTy))
 | ||
|       GEN_ERROR("invalid cast opcode for cast from '" +
 | ||
|                 Val->getType()->getDescription() + "' to '" +
 | ||
|                 DestTy->getDescription() + "'"); 
 | ||
|     yyval.InstVal = CastInst::create(yyvsp[-3].CastOpVal, Val, DestTy);
 | ||
|     delete yyvsp[0].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 270:
 | ||
| #line 2756 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[-4].ValueVal->getType() != Type::Int1Ty)
 | ||
|       GEN_ERROR("select condition must be boolean");
 | ||
|     if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType())
 | ||
|       GEN_ERROR("select value types should match");
 | ||
|     yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 271:
 | ||
| #line 2764 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
 | ||
|     yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal);
 | ||
|     delete yyvsp[0].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 272:
 | ||
| #line 2771 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!ExtractElementInst::isValidOperands(yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
 | ||
|       GEN_ERROR("Invalid extractelement operands");
 | ||
|     yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 273:
 | ||
| #line 2777 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
 | ||
|       GEN_ERROR("Invalid insertelement operands");
 | ||
|     yyval.InstVal = new InsertElementInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 274:
 | ||
| #line 2783 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!ShuffleVectorInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
 | ||
|       GEN_ERROR("Invalid shufflevector operands");
 | ||
|     yyval.InstVal = new ShuffleVectorInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 275:
 | ||
| #line 2789 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     const Type *Ty = yyvsp[0].PHIList->front().first->getType();
 | ||
|     if (!Ty->isFirstClassType())
 | ||
|       GEN_ERROR("PHI node operands must be of first class type");
 | ||
|     yyval.InstVal = new PHINode(Ty);
 | ||
|     ((PHINode*)yyval.InstVal)->reserveOperandSpace(yyvsp[0].PHIList->size());
 | ||
|     while (yyvsp[0].PHIList->begin() != yyvsp[0].PHIList->end()) {
 | ||
|       if (yyvsp[0].PHIList->front().first->getType() != Ty) 
 | ||
|         GEN_ERROR("All elements of a PHI node must be of the same type");
 | ||
|       cast<PHINode>(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second);
 | ||
|       yyvsp[0].PHIList->pop_front();
 | ||
|     }
 | ||
|     delete yyvsp[0].PHIList;  // Free the list...
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 276:
 | ||
| #line 2805 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
| 
 | ||
|     // Handle the short syntax
 | ||
|     const PointerType *PFTy = 0;
 | ||
|     const FunctionType *Ty = 0;
 | ||
|     if (!(PFTy = dyn_cast<PointerType>(yyvsp[-5].TypeVal->get())) ||
 | ||
|         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
 | ||
|       // Pull out the types of all of the arguments...
 | ||
|       std::vector<const Type*> ParamTypes;
 | ||
|       ParamAttrsVector Attrs;
 | ||
|       if (yyvsp[0].ParamAttrs != ParamAttr::None) {
 | ||
|         ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = yyvsp[0].ParamAttrs;
 | ||
|         Attrs.push_back(PAWI);
 | ||
|       }
 | ||
|       unsigned index = 1;
 | ||
|       ValueRefList::iterator I = yyvsp[-2].ValueRefList->begin(), E = yyvsp[-2].ValueRefList->end();
 | ||
|       for (; I != E; ++I, ++index) {
 | ||
|         const Type *Ty = I->Val->getType();
 | ||
|         if (Ty == Type::VoidTy)
 | ||
|           GEN_ERROR("Short call syntax cannot be used with varargs");
 | ||
|         ParamTypes.push_back(Ty);
 | ||
|         if (I->Attrs != ParamAttr::None) {
 | ||
|           ParamAttrsWithIndex PAWI; PAWI.index = index; PAWI.attrs = I->Attrs;
 | ||
|           Attrs.push_back(PAWI);
 | ||
|         }
 | ||
|       }
 | ||
| 
 | ||
|       ParamAttrsList *PAL = 0;
 | ||
|       if (!Attrs.empty())
 | ||
|         PAL = ParamAttrsList::get(Attrs);
 | ||
| 
 | ||
|       Ty = FunctionType::get(yyvsp[-5].TypeVal->get(), ParamTypes, false, PAL);
 | ||
|       PFTy = PointerType::get(Ty);
 | ||
|     }
 | ||
| 
 | ||
|     Value *V = getVal(PFTy, yyvsp[-4].ValIDVal);   // Get the function we're calling...
 | ||
|     CHECK_FOR_ERROR
 | ||
| 
 | ||
|     // Check for call to invalid intrinsic to avoid crashing later.
 | ||
|     if (Function *theF = dyn_cast<Function>(V)) {
 | ||
|       if (theF->hasName() && (theF->getValueName()->getKeyLength() >= 5) &&
 | ||
|           (0 == strncmp(theF->getValueName()->getKeyData(), "llvm.", 5)) &&
 | ||
|           !theF->getIntrinsicID(true))
 | ||
|         GEN_ERROR("Call to invalid LLVM intrinsic function '" +
 | ||
|                   theF->getName() + "'");
 | ||
|     }
 | ||
| 
 | ||
|     // Check the arguments 
 | ||
|     ValueList Args;
 | ||
|     if (yyvsp[-2].ValueRefList->empty()) {                                   // Has no arguments?
 | ||
|       // Make sure no arguments is a good thing!
 | ||
|       if (Ty->getNumParams() != 0)
 | ||
|         GEN_ERROR("No arguments passed to a function that "
 | ||
|                        "expects arguments");
 | ||
|     } else {                                     // Has arguments?
 | ||
|       // Loop through FunctionType's arguments and ensure they are specified
 | ||
|       // correctly!
 | ||
|       //
 | ||
|       FunctionType::param_iterator I = Ty->param_begin();
 | ||
|       FunctionType::param_iterator E = Ty->param_end();
 | ||
|       ValueRefList::iterator ArgI = yyvsp[-2].ValueRefList->begin(), ArgE = yyvsp[-2].ValueRefList->end();
 | ||
| 
 | ||
|       for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
 | ||
|         if (ArgI->Val->getType() != *I)
 | ||
|           GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
 | ||
|                          (*I)->getDescription() + "'");
 | ||
|         Args.push_back(ArgI->Val);
 | ||
|       }
 | ||
|       if (Ty->isVarArg()) {
 | ||
|         if (I == E)
 | ||
|           for (; ArgI != ArgE; ++ArgI)
 | ||
|             Args.push_back(ArgI->Val); // push the remaining varargs
 | ||
|       } else if (I != E || ArgI != ArgE)
 | ||
|         GEN_ERROR("Invalid number of parameters detected");
 | ||
|     }
 | ||
|     // Create the call node
 | ||
|     CallInst *CI = new CallInst(V, &Args[0], Args.size());
 | ||
|     CI->setTailCall(yyvsp[-7].BoolVal);
 | ||
|     CI->setCallingConv(yyvsp[-6].UIntVal);
 | ||
|     yyval.InstVal = CI;
 | ||
|     delete yyvsp[-2].ValueRefList;
 | ||
|     delete yyvsp[-5].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 277:
 | ||
| #line 2889 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.InstVal = yyvsp[0].InstVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 278:
 | ||
| #line 2894 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = true;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 279:
 | ||
| #line 2898 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = false;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 280:
 | ||
| #line 2905 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal);
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 281:
 | ||
| #line 2912 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
 | ||
|     Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal);
 | ||
|     delete yyvsp[-4].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 282:
 | ||
| #line 2920 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal);
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 283:
 | ||
| #line 2927 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
 | ||
|     Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal);
 | ||
|     delete yyvsp[-4].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 284:
 | ||
| #line 2935 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!isa<PointerType>(yyvsp[0].ValueVal->getType()))
 | ||
|       GEN_ERROR("Trying to free nonpointer type " + 
 | ||
|                      yyvsp[0].ValueVal->getType()->getDescription() + "");
 | ||
|     yyval.InstVal = new FreeInst(yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 285:
 | ||
| #line 2943 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     if (!isa<PointerType>(yyvsp[-2].TypeVal->get()))
 | ||
|       GEN_ERROR("Can't load from nonpointer type: " +
 | ||
|                      (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     if (!cast<PointerType>(yyvsp[-2].TypeVal->get())->getElementType()->isFirstClassType())
 | ||
|       GEN_ERROR("Can't load from pointer of non-first-class type: " +
 | ||
|                      (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-4].BoolVal, yyvsp[0].UIntVal);
 | ||
|     delete yyvsp[-2].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 286:
 | ||
| #line 2957 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     const PointerType *PT = dyn_cast<PointerType>(yyvsp[-2].TypeVal->get());
 | ||
|     if (!PT)
 | ||
|       GEN_ERROR("Can't store to a nonpointer type: " +
 | ||
|                      (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     const Type *ElTy = PT->getElementType();
 | ||
|     if (ElTy != yyvsp[-4].ValueVal->getType())
 | ||
|       GEN_ERROR("Can't store '" + yyvsp[-4].ValueVal->getType()->getDescription() +
 | ||
|                      "' into space of type '" + ElTy->getDescription() + "'");
 | ||
| 
 | ||
|     Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = new StoreInst(yyvsp[-4].ValueVal, tmpVal, yyvsp[-6].BoolVal, yyvsp[0].UIntVal);
 | ||
|     delete yyvsp[-2].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 287:
 | ||
| #line 2974 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
 | ||
|     if (!isa<PointerType>(yyvsp[-2].TypeVal->get()))
 | ||
|       GEN_ERROR("getelementptr insn requires pointer operand");
 | ||
| 
 | ||
|     if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, &(*yyvsp[0].ValueList)[0], yyvsp[0].ValueList->size(), true))
 | ||
|       GEN_ERROR("Invalid getelementptr indices for type '" +
 | ||
|                      (*yyvsp[-2].TypeVal)->getDescription()+ "'");
 | ||
|     Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = new GetElementPtrInst(tmpVal, &(*yyvsp[0].ValueList)[0], yyvsp[0].ValueList->size());
 | ||
|     delete yyvsp[-2].TypeVal; 
 | ||
|     delete yyvsp[0].ValueList;
 | ||
|   ;
 | ||
|     break;}
 | ||
| }
 | ||
|    /* the action file gets copied in in place of this dollarsign */
 | ||
| #line 543 "/usr/share/bison.simple"
 | ||
| 
 | ||
|   yyvsp -= yylen;
 | ||
|   yyssp -= yylen;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|   yylsp -= yylen;
 | ||
| #endif
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|   if (yydebug)
 | ||
|     {
 | ||
|       short *ssp1 = yyss - 1;
 | ||
|       fprintf (stderr, "state stack now");
 | ||
|       while (ssp1 != yyssp)
 | ||
| 	fprintf (stderr, " %d", *++ssp1);
 | ||
|       fprintf (stderr, "\n");
 | ||
|     }
 | ||
| #endif
 | ||
| 
 | ||
|   *++yyvsp = yyval;
 | ||
| 
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|   yylsp++;
 | ||
|   if (yylen == 0)
 | ||
|     {
 | ||
|       yylsp->first_line = yylloc.first_line;
 | ||
|       yylsp->first_column = yylloc.first_column;
 | ||
|       yylsp->last_line = (yylsp-1)->last_line;
 | ||
|       yylsp->last_column = (yylsp-1)->last_column;
 | ||
|       yylsp->text = 0;
 | ||
|     }
 | ||
|   else
 | ||
|     {
 | ||
|       yylsp->last_line = (yylsp+yylen-1)->last_line;
 | ||
|       yylsp->last_column = (yylsp+yylen-1)->last_column;
 | ||
|     }
 | ||
| #endif
 | ||
| 
 | ||
|   /* Now "shift" the result of the reduction.
 | ||
|      Determine what state that goes to,
 | ||
|      based on the state we popped back to
 | ||
|      and the rule number reduced by.  */
 | ||
| 
 | ||
|   yyn = yyr1[yyn];
 | ||
| 
 | ||
|   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
 | ||
|   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
 | ||
|     yystate = yytable[yystate];
 | ||
|   else
 | ||
|     yystate = yydefgoto[yyn - YYNTBASE];
 | ||
| 
 | ||
|   goto yynewstate;
 | ||
| 
 | ||
| yyerrlab:   /* here on detecting error */
 | ||
| 
 | ||
|   if (! yyerrstatus)
 | ||
|     /* If not already recovering from an error, report this error.  */
 | ||
|     {
 | ||
|       ++yynerrs;
 | ||
| 
 | ||
| #ifdef YYERROR_VERBOSE
 | ||
|       yyn = yypact[yystate];
 | ||
| 
 | ||
|       if (yyn > YYFLAG && yyn < YYLAST)
 | ||
| 	{
 | ||
| 	  int size = 0;
 | ||
| 	  char *msg;
 | ||
| 	  int x, count;
 | ||
| 
 | ||
| 	  count = 0;
 | ||
| 	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
 | ||
| 	  for (x = (yyn < 0 ? -yyn : 0);
 | ||
| 	       x < (sizeof(yytname) / sizeof(char *)); x++)
 | ||
| 	    if (yycheck[x + yyn] == x)
 | ||
| 	      size += strlen(yytname[x]) + 15, count++;
 | ||
| 	  msg = (char *) malloc(size + 15);
 | ||
| 	  if (msg != 0)
 | ||
| 	    {
 | ||
| 	      strcpy(msg, "parse error");
 | ||
| 
 | ||
| 	      if (count < 5)
 | ||
| 		{
 | ||
| 		  count = 0;
 | ||
| 		  for (x = (yyn < 0 ? -yyn : 0);
 | ||
| 		       x < (sizeof(yytname) / sizeof(char *)); x++)
 | ||
| 		    if (yycheck[x + yyn] == x)
 | ||
| 		      {
 | ||
| 			strcat(msg, count == 0 ? ", expecting `" : " or `");
 | ||
| 			strcat(msg, yytname[x]);
 | ||
| 			strcat(msg, "'");
 | ||
| 			count++;
 | ||
| 		      }
 | ||
| 		}
 | ||
| 	      yyerror(msg);
 | ||
| 	      free(msg);
 | ||
| 	    }
 | ||
| 	  else
 | ||
| 	    yyerror ("parse error; also virtual memory exceeded");
 | ||
| 	}
 | ||
|       else
 | ||
| #endif /* YYERROR_VERBOSE */
 | ||
| 	yyerror("parse error");
 | ||
|     }
 | ||
| 
 | ||
|   goto yyerrlab1;
 | ||
| yyerrlab1:   /* here on error raised explicitly by an action */
 | ||
| 
 | ||
|   if (yyerrstatus == 3)
 | ||
|     {
 | ||
|       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
 | ||
| 
 | ||
|       /* return failure if at end of input */
 | ||
|       if (yychar == YYEOF)
 | ||
| 	YYABORT;
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|       if (yydebug)
 | ||
| 	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
 | ||
| #endif
 | ||
| 
 | ||
|       yychar = YYEMPTY;
 | ||
|     }
 | ||
| 
 | ||
|   /* Else will try to reuse lookahead token
 | ||
|      after shifting the error token.  */
 | ||
| 
 | ||
|   yyerrstatus = 3;		/* Each real token shifted decrements this */
 | ||
| 
 | ||
|   goto yyerrhandle;
 | ||
| 
 | ||
| yyerrdefault:  /* current state does not do anything special for the error token. */
 | ||
| 
 | ||
| #if 0
 | ||
|   /* This is wrong; only states that explicitly want error tokens
 | ||
|      should shift them.  */
 | ||
|   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
 | ||
|   if (yyn) goto yydefault;
 | ||
| #endif
 | ||
| 
 | ||
| yyerrpop:   /* pop the current state because it cannot handle the error token */
 | ||
| 
 | ||
|   if (yyssp == yyss) YYABORT;
 | ||
|   yyvsp--;
 | ||
|   yystate = *--yyssp;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|   yylsp--;
 | ||
| #endif
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|   if (yydebug)
 | ||
|     {
 | ||
|       short *ssp1 = yyss - 1;
 | ||
|       fprintf (stderr, "Error: state stack now");
 | ||
|       while (ssp1 != yyssp)
 | ||
| 	fprintf (stderr, " %d", *++ssp1);
 | ||
|       fprintf (stderr, "\n");
 | ||
|     }
 | ||
| #endif
 | ||
| 
 | ||
| yyerrhandle:
 | ||
| 
 | ||
|   yyn = yypact[yystate];
 | ||
|   if (yyn == YYFLAG)
 | ||
|     goto yyerrdefault;
 | ||
| 
 | ||
|   yyn += YYTERROR;
 | ||
|   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
 | ||
|     goto yyerrdefault;
 | ||
| 
 | ||
|   yyn = yytable[yyn];
 | ||
|   if (yyn < 0)
 | ||
|     {
 | ||
|       if (yyn == YYFLAG)
 | ||
| 	goto yyerrpop;
 | ||
|       yyn = -yyn;
 | ||
|       goto yyreduce;
 | ||
|     }
 | ||
|   else if (yyn == 0)
 | ||
|     goto yyerrpop;
 | ||
| 
 | ||
|   if (yyn == YYFINAL)
 | ||
|     YYACCEPT;
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
|   if (yydebug)
 | ||
|     fprintf(stderr, "Shifting error token, ");
 | ||
| #endif
 | ||
| 
 | ||
|   *++yyvsp = yylval;
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|   *++yylsp = yylloc;
 | ||
| #endif
 | ||
| 
 | ||
|   yystate = yyn;
 | ||
|   goto yynewstate;
 | ||
| 
 | ||
|  yyacceptlab:
 | ||
|   /* YYACCEPT comes here.  */
 | ||
|   if (yyfree_stacks)
 | ||
|     {
 | ||
|       free (yyss);
 | ||
|       free (yyvs);
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|       free (yyls);
 | ||
| #endif
 | ||
|     }
 | ||
|   return 0;
 | ||
| 
 | ||
|  yyabortlab:
 | ||
|   /* YYABORT comes here.  */
 | ||
|   if (yyfree_stacks)
 | ||
|     {
 | ||
|       free (yyss);
 | ||
|       free (yyvs);
 | ||
| #ifdef YYLSP_NEEDED
 | ||
|       free (yyls);
 | ||
| #endif
 | ||
|     }
 | ||
|   return 1;
 | ||
| }
 | ||
| #line 2991 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| 
 | ||
| 
 | ||
| // common code from the two 'RunVMAsmParser' functions
 | ||
| static Module* RunParser(Module * M) {
 | ||
| 
 | ||
|   llvmAsmlineno = 1;      // Reset the current line number...
 | ||
|   CurModule.CurrentModule = M;
 | ||
| #if YYDEBUG
 | ||
|   yydebug = Debug;
 | ||
| #endif
 | ||
| 
 | ||
|   // Check to make sure the parser succeeded
 | ||
|   if (yyparse()) {
 | ||
|     if (ParserResult)
 | ||
|       delete ParserResult;
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   // Emit an error if there are any unresolved types left.
 | ||
|   if (!CurModule.LateResolveTypes.empty()) {
 | ||
|     const ValID &DID = CurModule.LateResolveTypes.begin()->first;
 | ||
|     if (DID.Type == ValID::LocalName) {
 | ||
|       GenerateError("Undefined type remains at eof: '"+DID.getName() + "'");
 | ||
|     } else {
 | ||
|       GenerateError("Undefined type remains at eof: #" + itostr(DID.Num));
 | ||
|     }
 | ||
|     if (ParserResult)
 | ||
|       delete ParserResult;
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   // Emit an error if there are any unresolved values left.
 | ||
|   if (!CurModule.LateResolveValues.empty()) {
 | ||
|     Value *V = CurModule.LateResolveValues.back();
 | ||
|     std::map<Value*, std::pair<ValID, int> >::iterator I =
 | ||
|       CurModule.PlaceHolderInfo.find(V);
 | ||
| 
 | ||
|     if (I != CurModule.PlaceHolderInfo.end()) {
 | ||
|       ValID &DID = I->second.first;
 | ||
|       if (DID.Type == ValID::LocalName) {
 | ||
|         GenerateError("Undefined value remains at eof: "+DID.getName() + "'");
 | ||
|       } else {
 | ||
|         GenerateError("Undefined value remains at eof: #" + itostr(DID.Num));
 | ||
|       }
 | ||
|       if (ParserResult)
 | ||
|         delete ParserResult;
 | ||
|       return 0;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   // Check to make sure that parsing produced a result
 | ||
|   if (!ParserResult)
 | ||
|     return 0;
 | ||
| 
 | ||
|   // Reset ParserResult variable while saving its value for the result.
 | ||
|   Module *Result = ParserResult;
 | ||
|   ParserResult = 0;
 | ||
| 
 | ||
|   return Result;
 | ||
| }
 | ||
| 
 | ||
| void llvm::GenerateError(const std::string &message, int LineNo) {
 | ||
|   if (LineNo == -1) LineNo = llvmAsmlineno;
 | ||
|   // TODO: column number in exception
 | ||
|   if (TheParseError)
 | ||
|     TheParseError->setError(CurFilename, message, LineNo);
 | ||
|   TriggerError = 1;
 | ||
| }
 | ||
| 
 | ||
| int yyerror(const char *ErrorMsg) {
 | ||
|   std::string where 
 | ||
|     = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
 | ||
|                   + ":" + utostr((unsigned) llvmAsmlineno) + ": ";
 | ||
|   std::string errMsg = where + "error: " + std::string(ErrorMsg);
 | ||
|   if (yychar != YYEMPTY && yychar != 0)
 | ||
|     errMsg += " while reading token: '" + std::string(llvmAsmtext, llvmAsmleng)+
 | ||
|               "'";
 | ||
|   GenerateError(errMsg);
 | ||
|   return 0;
 | ||
| }
 |