mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34419 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			5007 lines
		
	
	
		
			187 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			5007 lines
		
	
	
		
			187 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | ||
| /*  A Bison parser, made from /Users/sabre/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	LOCALVAL_ID	259
 | ||
| #define	GLOBALVAL_ID	260
 | ||
| #define	FPVAL	261
 | ||
| #define	VOID	262
 | ||
| #define	INTTYPE	263
 | ||
| #define	FLOAT	264
 | ||
| #define	DOUBLE	265
 | ||
| #define	LABEL	266
 | ||
| #define	TYPE	267
 | ||
| #define	LOCALVAR	268
 | ||
| #define	GLOBALVAR	269
 | ||
| #define	LABELSTR	270
 | ||
| #define	STRINGCONSTANT	271
 | ||
| #define	ATSTRINGCONSTANT	272
 | ||
| #define	IMPLEMENTATION	273
 | ||
| #define	ZEROINITIALIZER	274
 | ||
| #define	TRUETOK	275
 | ||
| #define	FALSETOK	276
 | ||
| #define	BEGINTOK	277
 | ||
| #define	ENDTOK	278
 | ||
| #define	DECLARE	279
 | ||
| #define	DEFINE	280
 | ||
| #define	GLOBAL	281
 | ||
| #define	CONSTANT	282
 | ||
| #define	SECTION	283
 | ||
| #define	VOLATILE	284
 | ||
| #define	TO	285
 | ||
| #define	DOTDOTDOT	286
 | ||
| #define	NULL_TOK	287
 | ||
| #define	UNDEF	288
 | ||
| #define	INTERNAL	289
 | ||
| #define	LINKONCE	290
 | ||
| #define	WEAK	291
 | ||
| #define	APPENDING	292
 | ||
| #define	DLLIMPORT	293
 | ||
| #define	DLLEXPORT	294
 | ||
| #define	EXTERN_WEAK	295
 | ||
| #define	OPAQUE	296
 | ||
| #define	EXTERNAL	297
 | ||
| #define	TARGET	298
 | ||
| #define	TRIPLE	299
 | ||
| #define	ALIGN	300
 | ||
| #define	DEPLIBS	301
 | ||
| #define	CALL	302
 | ||
| #define	TAIL	303
 | ||
| #define	ASM_TOK	304
 | ||
| #define	MODULE	305
 | ||
| #define	SIDEEFFECT	306
 | ||
| #define	CC_TOK	307
 | ||
| #define	CCC_TOK	308
 | ||
| #define	FASTCC_TOK	309
 | ||
| #define	COLDCC_TOK	310
 | ||
| #define	X86_STDCALLCC_TOK	311
 | ||
| #define	X86_FASTCALLCC_TOK	312
 | ||
| #define	DATALAYOUT	313
 | ||
| #define	RET	314
 | ||
| #define	BR	315
 | ||
| #define	SWITCH	316
 | ||
| #define	INVOKE	317
 | ||
| #define	UNWIND	318
 | ||
| #define	UNREACHABLE	319
 | ||
| #define	ADD	320
 | ||
| #define	SUB	321
 | ||
| #define	MUL	322
 | ||
| #define	UDIV	323
 | ||
| #define	SDIV	324
 | ||
| #define	FDIV	325
 | ||
| #define	UREM	326
 | ||
| #define	SREM	327
 | ||
| #define	FREM	328
 | ||
| #define	AND	329
 | ||
| #define	OR	330
 | ||
| #define	XOR	331
 | ||
| #define	SHL	332
 | ||
| #define	LSHR	333
 | ||
| #define	ASHR	334
 | ||
| #define	ICMP	335
 | ||
| #define	FCMP	336
 | ||
| #define	EQ	337
 | ||
| #define	NE	338
 | ||
| #define	SLT	339
 | ||
| #define	SGT	340
 | ||
| #define	SLE	341
 | ||
| #define	SGE	342
 | ||
| #define	ULT	343
 | ||
| #define	UGT	344
 | ||
| #define	ULE	345
 | ||
| #define	UGE	346
 | ||
| #define	OEQ	347
 | ||
| #define	ONE	348
 | ||
| #define	OLT	349
 | ||
| #define	OGT	350
 | ||
| #define	OLE	351
 | ||
| #define	OGE	352
 | ||
| #define	ORD	353
 | ||
| #define	UNO	354
 | ||
| #define	UEQ	355
 | ||
| #define	UNE	356
 | ||
| #define	MALLOC	357
 | ||
| #define	ALLOCA	358
 | ||
| #define	FREE	359
 | ||
| #define	LOAD	360
 | ||
| #define	STORE	361
 | ||
| #define	GETELEMENTPTR	362
 | ||
| #define	TRUNC	363
 | ||
| #define	ZEXT	364
 | ||
| #define	SEXT	365
 | ||
| #define	FPTRUNC	366
 | ||
| #define	FPEXT	367
 | ||
| #define	BITCAST	368
 | ||
| #define	UITOFP	369
 | ||
| #define	SITOFP	370
 | ||
| #define	FPTOUI	371
 | ||
| #define	FPTOSI	372
 | ||
| #define	INTTOPTR	373
 | ||
| #define	PTRTOINT	374
 | ||
| #define	PHI_TOK	375
 | ||
| #define	SELECT	376
 | ||
| #define	VAARG	377
 | ||
| #define	EXTRACTELEMENT	378
 | ||
| #define	INSERTELEMENT	379
 | ||
| #define	SHUFFLEVECTOR	380
 | ||
| #define	NORETURN	381
 | ||
| #define	INREG	382
 | ||
| #define	SRET	383
 | ||
| #define	DEFAULT	384
 | ||
| #define	HIDDEN	385
 | ||
| 
 | ||
| #line 14 "/Users/sabre/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(std::map<const Type *,ValueList> &LateResolvers,
 | ||
|                    std::map<const Type *,ValueList> *FutureLateResolvers = 0);
 | ||
| 
 | ||
| static struct PerModuleInfo {
 | ||
|   Module *CurrentModule;
 | ||
|   std::map<const Type *, ValueList> Values; // Module level numbered definitions
 | ||
|   std::map<const Type *,ValueList> LateResolveValues;
 | ||
|   std::vector<PATypeHolder>    Types;
 | ||
|   std::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
 | ||
| 
 | ||
|   std::map<const Type*, ValueList> Values; // Keep track of #'d definitions
 | ||
|   std::map<const Type*, ValueList> LateResolveValues;
 | ||
|   bool isDeclare;                   // Is this function a forward declararation?
 | ||
|   GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration.
 | ||
|   GlobalValue::VisibilityTypes Visibility;
 | ||
| 
 | ||
|   /// BBForwardRefs - When we see forward references to basic blocks, keep
 | ||
|   /// track of them here.
 | ||
|   std::map<BasicBlock*, std::pair<ValID, int> > BBForwardRefs;
 | ||
|   std::vector<BasicBlock*> NumberedBlocks;
 | ||
|   unsigned NextBBNum;
 | ||
| 
 | ||
|   inline PerFunctionInfo() {
 | ||
|     CurrentFunction = 0;
 | ||
|     isDeclare = false;
 | ||
|     Linkage = GlobalValue::ExternalLinkage;
 | ||
|     Visibility = GlobalValue::DefaultVisibility;
 | ||
|   }
 | ||
| 
 | ||
|   inline void FunctionStart(Function *M) {
 | ||
|     CurrentFunction = M;
 | ||
|     NextBBNum = 0;
 | ||
|   }
 | ||
| 
 | ||
|   void FunctionDone() {
 | ||
|     NumberedBlocks.clear();
 | ||
| 
 | ||
|     // Any forward referenced blocks left?
 | ||
|     if (!BBForwardRefs.empty()) {
 | ||
|       GenerateError("Undefined reference to label " +
 | ||
|                      BBForwardRefs.begin()->first->getName());
 | ||
|       return;
 | ||
|     }
 | ||
| 
 | ||
|     // Resolve all forward references now.
 | ||
|     ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
 | ||
| 
 | ||
|     Values.clear();         // Clear out function local definitions
 | ||
|     CurrentFunction = 0;
 | ||
|     isDeclare = false;
 | ||
|     Linkage = GlobalValue::ExternalLinkage;
 | ||
|     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 int InsertValue(Value *V,
 | ||
|                   std::map<const Type*,ValueList> &ValueTab = CurFun.Values) {
 | ||
|   if (V->hasName()) return -1;           // Is this a numbered definition?
 | ||
| 
 | ||
|   // Yes, insert the value into the value table...
 | ||
|   ValueList &List = ValueTab[V->getType()];
 | ||
|   List.push_back(V);
 | ||
|   return List.size()-1;
 | ||
| }
 | ||
| 
 | ||
| static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
 | ||
|   switch (D.Type) {
 | ||
|   case ValID::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;
 | ||
|  }
 | ||
| 
 | ||
| // getValNonImprovising - Look up the value specified by the provided type and
 | ||
| // the provided ValID.  If the value exists and has already been defined, return
 | ||
| // it.  Otherwise return null.
 | ||
| //
 | ||
| static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
 | ||
|   if (isa<FunctionType>(Ty)) {
 | ||
|     GenerateError("Functions are not values and "
 | ||
|                    "must be referenced as pointers");
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   switch (D.Type) {
 | ||
|   case ValID::LocalID: {                 // Is it a numbered definition?
 | ||
|     // Module constants occupy the lowest numbered slots.
 | ||
|     std::map<const Type*,ValueList>::iterator VI = CurFun.Values.find(Ty);
 | ||
|     // Make sure that our type is within bounds.
 | ||
|     if (VI == CurFun.Values.end()) return 0;
 | ||
| 
 | ||
|     // Check that the number is within bounds.
 | ||
|     if (D.Num >= VI->second.size()) return 0;
 | ||
| 
 | ||
|     return VI->second[D.Num];
 | ||
|   }
 | ||
|   case ValID::GlobalID: {                 // Is it a numbered definition?
 | ||
|     unsigned Num = D.Num;
 | ||
|     
 | ||
|     // Module constants occupy the lowest numbered slots...
 | ||
|     std::map<const Type*,ValueList>::iterator VI = CurModule.Values.find(Ty);
 | ||
|     if (VI == CurModule.Values.end()) 
 | ||
|       return 0;
 | ||
|     if (D.Num >= VI->second.size()) 
 | ||
|       return 0;
 | ||
|     return VI->second[Num];
 | ||
|   }
 | ||
|     
 | ||
|   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);
 | ||
| 
 | ||
|   case ValID::ConstUIntVal:     // Is it an unsigned const pool reference?
 | ||
|     if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
 | ||
|       if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
 | ||
|         GenerateError("Integral constant '" + utostr(D.UConstPool64) +
 | ||
|                        "' is invalid or out of range");
 | ||
|         return 0;
 | ||
|       } else {     // This is really a signed reference.  Transmogrify.
 | ||
|         return ConstantInt::get(Ty, D.ConstPool64);
 | ||
|       }
 | ||
|     } else {
 | ||
|       return ConstantInt::get(Ty, D.UConstPool64);
 | ||
|     }
 | ||
| 
 | ||
|   case ValID::ConstFPVal:        // Is it a floating point const pool reference?
 | ||
|     if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) {
 | ||
|       GenerateError("FP constant invalid for type");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return ConstantFP::get(Ty, D.ConstPoolFP);
 | ||
| 
 | ||
|   case ValID::ConstNullVal:      // Is it a null value?
 | ||
|     if (!isa<PointerType>(Ty)) {
 | ||
|       GenerateError("Cannot create a a non pointer null");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return ConstantPointerNull::get(cast<PointerType>(Ty));
 | ||
| 
 | ||
|   case ValID::ConstUndefVal:      // Is it an undef value?
 | ||
|     return UndefValue::get(Ty);
 | ||
| 
 | ||
|   case ValID::ConstZeroVal:      // Is it a zero value?
 | ||
|     return Constant::getNullValue(Ty);
 | ||
|     
 | ||
|   case ValID::ConstantVal:       // Fully resolved constant?
 | ||
|     if (D.ConstantValue->getType() != Ty) {
 | ||
|       GenerateError("Constant expression type different from required type");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     return D.ConstantValue;
 | ||
| 
 | ||
|   case ValID::InlineAsmVal: {    // Inline asm expression
 | ||
|     const PointerType *PTy = dyn_cast<PointerType>(Ty);
 | ||
|     const FunctionType *FTy =
 | ||
|       PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
 | ||
|     if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) {
 | ||
|       GenerateError("Invalid type for asm constraint string");
 | ||
|       return 0;
 | ||
|     }
 | ||
|     InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
 | ||
|                                    D.IAD->HasSideEffects);
 | ||
|     D.destroy();   // Free InlineAsmDescriptor.
 | ||
|     return IA;
 | ||
|   }
 | ||
|   default:
 | ||
|     assert(0 && "Unhandled case!");
 | ||
|     return 0;
 | ||
|   }   // End of switch
 | ||
| 
 | ||
|   assert(0 && "Unhandled case!");
 | ||
|   return 0;
 | ||
| }
 | ||
| 
 | ||
| // getVal - This function is identical to getValNonImprovising, except that if a
 | ||
| // value is not already defined, it "improvises" by creating a placeholder var
 | ||
| // that looks and acts just like the requested variable.  When the value is
 | ||
| // defined later, all uses of the placeholder variable are replaced with the
 | ||
| // real thing.
 | ||
| //
 | ||
| static Value *getVal(const Type *Ty, const ValID &ID) {
 | ||
|   if (Ty == Type::LabelTy) {
 | ||
|     GenerateError("Cannot use a basic block here");
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   // See if the value has already been defined.
 | ||
|   Value *V = getValNonImprovising(Ty, ID);
 | ||
|   if (V) return V;
 | ||
|   if (TriggerError) return 0;
 | ||
| 
 | ||
|   if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty)) {
 | ||
|     GenerateError("Invalid use of a composite type");
 | ||
|     return 0;
 | ||
|   }
 | ||
| 
 | ||
|   // If we reached here, we referenced either a symbol that we don't know about
 | ||
|   // or an id number that hasn't been read yet.  We may be referencing something
 | ||
|   // forward, so just create an entry to be resolved later and get to it...
 | ||
|   //
 | ||
|   V = new Argument(Ty);
 | ||
| 
 | ||
|   // Remember where this forward reference came from.  FIXME, shouldn't we try
 | ||
|   // to recycle these things??
 | ||
|   CurModule.PlaceHolderInfo.insert(std::make_pair(V, std::make_pair(ID,
 | ||
|                                                                llvmAsmlineno)));
 | ||
| 
 | ||
|   if (inFunctionScope())
 | ||
|     InsertValue(V, CurFun.LateResolveValues);
 | ||
|   else
 | ||
|     InsertValue(V, CurModule.LateResolveValues);
 | ||
|   return V;
 | ||
| }
 | ||
| 
 | ||
| /// getBBVal - This is used for two purposes:
 | ||
| ///  * If isDefinition is true, a new basic block with the specified ID is being
 | ||
| ///    defined.
 | ||
| ///  * If isDefinition is true, this is a reference to a basic block, which may
 | ||
| ///    or may not be a forward reference.
 | ||
| ///
 | ||
| static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {
 | ||
|   assert(inFunctionScope() && "Can't get basic block at global scope!");
 | ||
| 
 | ||
|   std::string Name;
 | ||
|   BasicBlock *BB = 0;
 | ||
|   switch (ID.Type) {
 | ||
|   default: 
 | ||
|     GenerateError("Illegal label reference " + ID.getName());
 | ||
|     return 0;
 | ||
|   case ValID::LocalID:                // Is it a numbered definition?
 | ||
|     if (ID.Num >= CurFun.NumberedBlocks.size())
 | ||
|       CurFun.NumberedBlocks.resize(ID.Num+1);
 | ||
|     BB = CurFun.NumberedBlocks[ID.Num];
 | ||
|     break;
 | ||
|   case ValID::LocalName:                  // Is it a named definition?
 | ||
|     Name = ID.Name;
 | ||
|     Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name);
 | ||
|     if (N && N->getType()->getTypeID() == Type::LabelTyID)
 | ||
|       BB = cast<BasicBlock>(N);
 | ||
|     break;
 | ||
|   }
 | ||
| 
 | ||
|   // See if the block has already been defined.
 | ||
|   if (BB) {
 | ||
|     // If this is the definition of the block, make sure the existing value was
 | ||
|     // just a forward reference.  If it was a forward reference, there will be
 | ||
|     // an entry for it in the PlaceHolderInfo map.
 | ||
|     if (isDefinition && !CurFun.BBForwardRefs.erase(BB)) {
 | ||
|       // The existing value was a definition, not a forward reference.
 | ||
|       GenerateError("Redefinition of label " + ID.getName());
 | ||
|       return 0;
 | ||
|     }
 | ||
| 
 | ||
|     ID.destroy();                       // Free strdup'd memory.
 | ||
|     return BB;
 | ||
|   }
 | ||
| 
 | ||
|   // Otherwise this block has not been seen before.
 | ||
|   BB = new BasicBlock("", CurFun.CurrentFunction);
 | ||
|   if (ID.Type == ValID::LocalName) {
 | ||
|     BB->setName(ID.Name);
 | ||
|   } else {
 | ||
|     CurFun.NumberedBlocks[ID.Num] = BB;
 | ||
|   }
 | ||
| 
 | ||
|   // If this is not a definition, keep track of it so we can use it as a forward
 | ||
|   // reference.
 | ||
|   if (!isDefinition) {
 | ||
|     // Remember where this forward reference came from.
 | ||
|     CurFun.BBForwardRefs[BB] = std::make_pair(ID, llvmAsmlineno);
 | ||
|   } else {
 | ||
|     // The forward declaration could have been inserted anywhere in the
 | ||
|     // function: insert it into the correct place now.
 | ||
|     CurFun.CurrentFunction->getBasicBlockList().remove(BB);
 | ||
|     CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
 | ||
|   }
 | ||
|   ID.destroy();
 | ||
|   return BB;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| //              Code to handle forward references in instructions
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| //
 | ||
| // This code handles the late binding needed with statements that reference
 | ||
| // values not defined yet... for example, a forward branch, or the PHI node for
 | ||
| // a loop body.
 | ||
| //
 | ||
| // This keeps a table (CurFun.LateResolveValues) of all such forward references
 | ||
| // and back patchs after we are done.
 | ||
| //
 | ||
| 
 | ||
| // ResolveDefinitions - If we could not resolve some defs at parsing
 | ||
| // time (forward branches, phi functions for loops, etc...) resolve the
 | ||
| // defs now...
 | ||
| //
 | ||
| static void 
 | ||
| ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
 | ||
|                    std::map<const Type*,ValueList> *FutureLateResolvers) {
 | ||
|   // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
 | ||
|   for (std::map<const Type*,ValueList>::iterator LRI = LateResolvers.begin(),
 | ||
|          E = LateResolvers.end(); LRI != E; ++LRI) {
 | ||
|     ValueList &List = LRI->second;
 | ||
|     while (!List.empty()) {
 | ||
|       Value *V = List.back();
 | ||
|       List.pop_back();
 | ||
| 
 | ||
|       std::map<Value*, std::pair<ValID, int> >::iterator PHI =
 | ||
|         CurModule.PlaceHolderInfo.find(V);
 | ||
|       assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!");
 | ||
| 
 | ||
|       ValID &DID = PHI->second.first;
 | ||
| 
 | ||
|       Value *TheRealValue = getValNonImprovising(LRI->first, DID);
 | ||
|       if (TriggerError)
 | ||
|         return;
 | ||
|       if (TheRealValue) {
 | ||
|         V->replaceAllUsesWith(TheRealValue);
 | ||
|         delete V;
 | ||
|         CurModule.PlaceHolderInfo.erase(PHI);
 | ||
|       } else if (FutureLateResolvers) {
 | ||
|         // Functions have their unresolved items forwarded to the module late
 | ||
|         // resolver table
 | ||
|         InsertValue(V, *FutureLateResolvers);
 | ||
|       } else {
 | ||
|         if (DID.Type == ValID::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) {
 | ||
|   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[PTy].size());
 | ||
|   }
 | ||
| 
 | ||
|   if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
 | ||
|     // Move the global to the end of the list, from whereever it was
 | ||
|     // previously inserted.
 | ||
|     GlobalVariable *GV = cast<GlobalVariable>(FWGV);
 | ||
|     CurModule.CurrentModule->getGlobalList().remove(GV);
 | ||
|     CurModule.CurrentModule->getGlobalList().push_back(GV);
 | ||
|     GV->setInitializer(Initializer);
 | ||
|     GV->setLinkage(Linkage);
 | ||
|     GV->setVisibility(Visibility);
 | ||
|     GV->setConstant(isConstantGlobal);
 | ||
|     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);
 | ||
|   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 901 "/Users/sabre/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;
 | ||
|   llvm::FunctionType::ParameterAttributes ParamAttrs;
 | ||
|   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		557
 | ||
| #define	YYFLAG		-32768
 | ||
| #define	YYNTBASE	146
 | ||
| 
 | ||
| #define YYTRANSLATE(x) ((unsigned)(x) <= 385 ? yytranslate[x] : 223)
 | ||
| 
 | ||
| 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,   136,
 | ||
|    137,   134,     2,   133,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,   141,
 | ||
|    132,   142,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|    138,   135,   140,     2,     2,     2,     2,     2,   145,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,   139,
 | ||
|      2,     2,   143,     2,   144,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 | ||
|      2,     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
 | ||
| };
 | ||
| 
 | ||
| #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,
 | ||
|    195,   198,   199,   202,   203,   207,   210,   211,   213,   214,
 | ||
|    218,   220,   223,   225,   227,   229,   231,   233,   235,   238,
 | ||
|    240,   243,   249,   255,   261,   267,   271,   274,   280,   285,
 | ||
|    288,   290,   292,   294,   298,   300,   304,   306,   307,   309,
 | ||
|    313,   318,   322,   326,   331,   336,   340,   347,   353,   356,
 | ||
|    359,   362,   365,   368,   371,   374,   377,   380,   383,   390,
 | ||
|    396,   405,   412,   419,   427,   435,   442,   451,   460,   464,
 | ||
|    466,   468,   470,   472,   473,   475,   478,   479,   483,   484,
 | ||
|    488,   492,   494,   498,   502,   503,   510,   511,   519,   520,
 | ||
|    528,   531,   535,   537,   541,   545,   549,   553,   555,   556,
 | ||
|    562,   566,   568,   572,   574,   575,   585,   587,   589,   594,
 | ||
|    596,   598,   601,   605,   606,   608,   610,   612,   614,   616,
 | ||
|    618,   620,   622,   624,   628,   630,   636,   638,   640,   642,
 | ||
|    644,   646,   648,   651,   654,   657,   661,   664,   665,   667,
 | ||
|    670,   673,   677,   687,   697,   706,   721,   723,   725,   732,
 | ||
|    738,   741,   748,   756,   760,   766,   767,   768,   772,   775,
 | ||
|    777,   783,   789,   796,   803,   808,   815,   820,   825,   832,
 | ||
|    839,   842,   851,   853,   855,   856,   860,   867,   871,   878,
 | ||
|    881,   886,   893
 | ||
| };
 | ||
| 
 | ||
| static const short yyrhs[] = {    66,
 | ||
|      0,    67,     0,    68,     0,    69,     0,    70,     0,    71,
 | ||
|      0,    72,     0,    73,     0,    74,     0,    78,     0,    79,
 | ||
|      0,    80,     0,    75,     0,    76,     0,    77,     0,   109,
 | ||
|      0,   110,     0,   111,     0,   112,     0,   113,     0,   114,
 | ||
|      0,   115,     0,   116,     0,   117,     0,   118,     0,   119,
 | ||
|      0,   120,     0,    83,     0,    84,     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,    89,     0,    90,     0,    91,     0,    92,
 | ||
|      0,    21,     0,    22,     0,     9,     0,    10,     0,    11,
 | ||
|      0,    14,     0,    17,     0,   153,     0,     0,   153,   132,
 | ||
|      0,     0,    15,     0,    18,     0,   156,   132,     0,     0,
 | ||
|     35,     0,    37,     0,    36,     0,    38,     0,    40,     0,
 | ||
|     39,     0,    41,     0,    43,     0,     0,   131,     0,     0,
 | ||
|     39,     0,    41,     0,     0,    35,     0,    36,     0,    37,
 | ||
|      0,    40,     0,     0,    54,     0,    55,     0,    56,     0,
 | ||
|     57,     0,    58,     0,    53,     4,     0,   110,     0,   111,
 | ||
|      0,   128,     0,   129,     0,     0,   165,   164,     0,   127,
 | ||
|      0,   164,     0,     0,   167,   166,     0,     0,    46,     4,
 | ||
|      0,     0,   133,    46,     4,     0,    29,    17,     0,     0,
 | ||
|    170,     0,     0,   133,   173,   172,     0,   170,     0,    46,
 | ||
|      4,     0,     9,     0,    10,     0,    11,     0,    12,     0,
 | ||
|     42,     0,   174,     0,   175,   134,     0,   207,     0,   135,
 | ||
|      4,     0,   175,   136,   179,   137,   167,     0,     8,   136,
 | ||
|    179,   137,   167,     0,   138,     4,   139,   175,   140,     0,
 | ||
|    141,     4,   139,   175,   142,     0,   143,   180,   144,     0,
 | ||
|    143,   144,     0,   141,   143,   180,   144,   142,     0,   141,
 | ||
|    143,   144,   142,     0,   175,   165,     0,   175,     0,     8,
 | ||
|      0,   176,     0,   178,   133,   176,     0,   178,     0,   178,
 | ||
|    133,    32,     0,    32,     0,     0,   175,     0,   180,   133,
 | ||
|    175,     0,   175,   138,   183,   140,     0,   175,   138,   140,
 | ||
|      0,   175,   145,    17,     0,   175,   141,   183,   142,     0,
 | ||
|    175,   143,   183,   144,     0,   175,   143,   144,     0,   175,
 | ||
|    141,   143,   183,   144,   142,     0,   175,   141,   143,   144,
 | ||
|    142,     0,   175,    33,     0,   175,    34,     0,   175,   207,
 | ||
|      0,   175,   182,     0,   175,    20,     0,   151,     3,     0,
 | ||
|    151,     4,     0,     9,    21,     0,     9,    22,     0,   152,
 | ||
|      7,     0,   148,   136,   181,    31,   175,   137,     0,   108,
 | ||
|    136,   181,   218,   137,     0,   122,   136,   181,   133,   181,
 | ||
|    133,   181,   137,     0,   146,   136,   181,   133,   181,   137,
 | ||
|      0,   147,   136,   181,   133,   181,   137,     0,    81,   149,
 | ||
|    136,   181,   133,   181,   137,     0,    82,   150,   136,   181,
 | ||
|    133,   181,   137,     0,   124,   136,   181,   133,   181,   137,
 | ||
|      0,   125,   136,   181,   133,   181,   133,   181,   137,     0,
 | ||
|    126,   136,   181,   133,   181,   133,   181,   137,     0,   183,
 | ||
|    133,   181,     0,   181,     0,    27,     0,    28,     0,   186,
 | ||
|      0,     0,   187,     0,   186,   187,     0,     0,    26,   188,
 | ||
|    203,     0,     0,    25,   189,   204,     0,    51,    50,   193,
 | ||
|      0,    19,     0,   155,    13,   175,     0,   155,    13,     8,
 | ||
|      0,     0,   157,   160,   184,   181,   190,   172,     0,     0,
 | ||
|    157,   158,   160,   184,   181,   191,   172,     0,     0,   157,
 | ||
|    159,   160,   184,   175,   192,   172,     0,    44,   194,     0,
 | ||
|     47,   132,   195,     0,    17,     0,    45,   132,    17,     0,
 | ||
|     59,   132,    17,     0,   138,   196,   140,     0,   196,   133,
 | ||
|     17,     0,    17,     0,     0,   197,   133,   175,   165,   154,
 | ||
|      0,   175,   165,   154,     0,   197,     0,   197,   133,    32,
 | ||
|      0,    32,     0,     0,   163,   177,   156,   136,   198,   137,
 | ||
|    167,   171,   168,     0,    23,     0,   143,     0,   162,   160,
 | ||
|    199,   200,     0,    24,     0,   144,     0,   210,   202,     0,
 | ||
|    161,   160,   199,     0,     0,    52,     0,     3,     0,     4,
 | ||
|      0,     7,     0,    21,     0,    22,     0,    33,     0,    34,
 | ||
|      0,    20,     0,   141,   183,   142,     0,   182,     0,    50,
 | ||
|    205,    17,   133,    17,     0,     5,     0,     6,     0,   153,
 | ||
|      0,   156,     0,   207,     0,   206,     0,   175,   208,     0,
 | ||
|    210,   211,     0,   201,   211,     0,   212,   155,   213,     0,
 | ||
|    212,   215,     0,     0,    16,     0,    60,   209,     0,    60,
 | ||
|      8,     0,    61,    12,   208,     0,    61,     9,   208,   133,
 | ||
|     12,   208,   133,    12,   208,     0,    62,   151,   208,   133,
 | ||
|     12,   208,   138,   214,   140,     0,    62,   151,   208,   133,
 | ||
|     12,   208,   138,   140,     0,    63,   163,   177,   208,   136,
 | ||
|    217,   137,   167,    31,    12,   208,    64,    12,   208,     0,
 | ||
|     64,     0,    65,     0,   214,   151,   206,   133,    12,   208,
 | ||
|      0,   151,   206,   133,    12,   208,     0,   155,   220,     0,
 | ||
|    175,   138,   208,   133,   208,   140,     0,   216,   133,   138,
 | ||
|    208,   133,   208,   140,     0,   175,   208,   165,     0,   217,
 | ||
|    133,   175,   208,   165,     0,     0,     0,   218,   133,   209,
 | ||
|      0,    49,    48,     0,    48,     0,   146,   175,   208,   133,
 | ||
|    208,     0,   147,   175,   208,   133,   208,     0,    81,   149,
 | ||
|    175,   208,   133,   208,     0,    82,   150,   175,   208,   133,
 | ||
|    208,     0,   148,   209,    31,   175,     0,   122,   209,   133,
 | ||
|    209,   133,   209,     0,   123,   209,   133,   175,     0,   124,
 | ||
|    209,   133,   209,     0,   125,   209,   133,   209,   133,   209,
 | ||
|      0,   126,   209,   133,   209,   133,   209,     0,   121,   216,
 | ||
|      0,   219,   163,   177,   208,   136,   217,   137,   167,     0,
 | ||
|    222,     0,    30,     0,     0,   103,   175,   169,     0,   103,
 | ||
|    175,   133,     9,   208,   169,     0,   104,   175,   169,     0,
 | ||
|    104,   175,   133,     9,   208,   169,     0,   105,   209,     0,
 | ||
|    221,   106,   175,   208,     0,   221,   107,   209,   133,   175,
 | ||
|    208,     0,   108,   175,   208,   218,     0
 | ||
| };
 | ||
| 
 | ||
| #endif
 | ||
| 
 | ||
| #if YYDEBUG != 0
 | ||
| static const short yyrline[] = { 0,
 | ||
|   1048,  1048,  1048,  1048,  1048,  1048,  1048,  1048,  1048,  1049,
 | ||
|   1049,  1049,  1049,  1049,  1049,  1050,  1050,  1050,  1050,  1050,
 | ||
|   1050,  1050,  1051,  1051,  1051,  1051,  1051,  1054,  1054,  1055,
 | ||
|   1055,  1056,  1056,  1057,  1057,  1058,  1058,  1062,  1062,  1063,
 | ||
|   1063,  1064,  1064,  1065,  1065,  1066,  1066,  1067,  1067,  1068,
 | ||
|   1068,  1069,  1070,  1075,  1076,  1076,  1078,  1078,  1079,  1079,
 | ||
|   1083,  1087,  1092,  1092,  1094,  1098,  1104,  1105,  1106,  1107,
 | ||
|   1108,  1112,  1113,  1114,  1118,  1119,  1123,  1124,  1125,  1129,
 | ||
|   1130,  1131,  1132,  1133,  1136,  1136,  1137,  1138,  1139,  1140,
 | ||
|   1141,  1149,  1150,  1151,  1152,  1155,  1156,  1161,  1162,  1165,
 | ||
|   1166,  1173,  1173,  1180,  1180,  1189,  1197,  1197,  1203,  1203,
 | ||
|   1205,  1210,  1223,  1223,  1223,  1223,  1226,  1230,  1234,  1241,
 | ||
|   1246,  1254,  1272,  1290,  1295,  1307,  1317,  1321,  1331,  1338,
 | ||
|   1345,  1352,  1357,  1362,  1369,  1370,  1377,  1384,  1392,  1397,
 | ||
|   1408,  1436,  1452,  1481,  1509,  1534,  1553,  1579,  1599,  1611,
 | ||
|   1618,  1684,  1694,  1704,  1710,  1716,  1721,  1726,  1734,  1746,
 | ||
|   1768,  1776,  1782,  1793,  1798,  1803,  1809,  1815,  1824,  1828,
 | ||
|   1836,  1836,  1847,  1852,  1860,  1861,  1865,  1865,  1869,  1869,
 | ||
|   1872,  1875,  1887,  1911,  1922,  1929,  1932,  1937,  1940,  1946,
 | ||
|   1950,  1953,  1959,  1972,  1976,  1981,  1983,  1988,  1993,  2002,
 | ||
|   2012,  2023,  2027,  2036,  2045,  2050,  2162,  2162,  2164,  2173,
 | ||
|   2173,  2175,  2180,  2192,  2196,  2201,  2205,  2209,  2213,  2217,
 | ||
|   2221,  2225,  2229,  2233,  2258,  2262,  2276,  2280,  2284,  2288,
 | ||
|   2294,  2294,  2300,  2309,  2313,  2322,  2332,  2341,  2353,  2366,
 | ||
|   2370,  2374,  2379,  2389,  2408,  2417,  2484,  2488,  2495,  2506,
 | ||
|   2519,  2529,  2540,  2550,  2558,  2566,  2569,  2570,  2577,  2581,
 | ||
|   2586,  2607,  2624,  2637,  2650,  2662,  2670,  2677,  2683,  2689,
 | ||
|   2695,  2710,  2774,  2779,  2783,  2790,  2797,  2805,  2812,  2820,
 | ||
|   2828,  2842,  2859
 | ||
| };
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| #if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
 | ||
| 
 | ||
| static const char * const yytname[] = {   "$","error","$undefined.","ESINT64VAL",
 | ||
| "EUINT64VAL","LOCALVAL_ID","GLOBALVAL_ID","FPVAL","VOID","INTTYPE","FLOAT","DOUBLE",
 | ||
| "LABEL","TYPE","LOCALVAR","GLOBALVAR","LABELSTR","STRINGCONSTANT","ATSTRINGCONSTANT",
 | ||
| "IMPLEMENTATION","ZEROINITIALIZER","TRUETOK","FALSETOK","BEGINTOK","ENDTOK",
 | ||
| "DECLARE","DEFINE","GLOBAL","CONSTANT","SECTION","VOLATILE","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","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","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,
 | ||
|    146,   146,   146,   146,   146,   146,   146,   146,   146,   147,
 | ||
|    147,   147,   147,   147,   147,   148,   148,   148,   148,   148,
 | ||
|    148,   148,   148,   148,   148,   148,   148,   149,   149,   149,
 | ||
|    149,   149,   149,   149,   149,   149,   149,   150,   150,   150,
 | ||
|    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
 | ||
|    150,   150,   150,   151,   152,   152,   153,   153,   154,   154,
 | ||
|    155,   155,   156,   156,   157,   157,   158,   158,   158,   158,
 | ||
|    158,   159,   159,   159,   160,   160,   161,   161,   161,   162,
 | ||
|    162,   162,   162,   162,   163,   163,   163,   163,   163,   163,
 | ||
|    163,   164,   164,   164,   164,   165,   165,   166,   166,   167,
 | ||
|    167,   168,   168,   169,   169,   170,   171,   171,   172,   172,
 | ||
|    173,   173,   174,   174,   174,   174,   175,   175,   175,   175,
 | ||
|    175,   175,   175,   175,   175,   175,   175,   175,   175,   176,
 | ||
|    177,   177,   178,   178,   179,   179,   179,   179,   180,   180,
 | ||
|    181,   181,   181,   181,   181,   181,   181,   181,   181,   181,
 | ||
|    181,   181,   181,   181,   181,   181,   181,   181,   182,   182,
 | ||
|    182,   182,   182,   182,   182,   182,   182,   182,   183,   183,
 | ||
|    184,   184,   185,   185,   186,   186,   188,   187,   189,   187,
 | ||
|    187,   187,   187,   187,   190,   187,   191,   187,   192,   187,
 | ||
|    187,   187,   193,   194,   194,   195,   196,   196,   196,   197,
 | ||
|    197,   198,   198,   198,   198,   199,   200,   200,   201,   202,
 | ||
|    202,   203,   204,   205,   205,   206,   206,   206,   206,   206,
 | ||
|    206,   206,   206,   206,   206,   206,   207,   207,   207,   207,
 | ||
|    208,   208,   209,   210,   210,   211,   212,   212,   212,   213,
 | ||
|    213,   213,   213,   213,   213,   213,   213,   213,   214,   214,
 | ||
|    215,   216,   216,   217,   217,   217,   218,   218,   219,   219,
 | ||
|    220,   220,   220,   220,   220,   220,   220,   220,   220,   220,
 | ||
|    220,   220,   220,   221,   221,   222,   222,   222,   222,   222,
 | ||
|    222,   222,   222
 | ||
| };
 | ||
| 
 | ||
| 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,     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,     6,     5,
 | ||
|      8,     6,     6,     7,     7,     6,     8,     8,     3,     1,
 | ||
|      1,     1,     1,     0,     1,     2,     0,     3,     0,     3,
 | ||
|      3,     1,     3,     3,     0,     6,     0,     7,     0,     7,
 | ||
|      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,
 | ||
|      4,     6,     4
 | ||
| };
 | ||
| 
 | ||
| static const short yydefact[] = {    66,
 | ||
|     57,    63,    58,    64,   182,   179,   177,     0,     0,     0,
 | ||
|      0,     0,     0,    75,    66,   175,    77,    80,     0,     0,
 | ||
|    191,     0,     0,    61,     0,    65,    67,    69,    68,    70,
 | ||
|     72,    71,    73,    74,    76,    75,    75,     0,   176,    78,
 | ||
|     79,    75,   180,    81,    82,    83,    84,    75,   238,   178,
 | ||
|    238,     0,     0,   199,   192,   193,   181,   227,   228,   184,
 | ||
|    113,   114,   115,   116,   117,     0,     0,     0,     0,   229,
 | ||
|    230,   118,   183,   120,     0,     0,   171,   172,     0,    85,
 | ||
|     85,   239,   235,    62,   210,   211,   212,   234,   194,   195,
 | ||
|    198,     0,   138,   121,     0,     0,     0,     0,   127,   139,
 | ||
|      0,   119,   138,     0,     0,   113,   114,   115,     0,     0,
 | ||
|      0,   185,     0,    86,    87,    88,    89,    90,     0,   213,
 | ||
|      0,   275,   237,     0,   196,   137,    96,   133,   135,     0,
 | ||
|      0,     0,     0,     0,     0,   126,     0,   187,   189,   156,
 | ||
|    157,   154,   155,   158,   153,   149,   150,     1,     2,     3,
 | ||
|      4,     5,     6,     7,     8,     9,    13,    14,    15,    10,
 | ||
|     11,    12,     0,     0,     0,    16,    17,    18,    19,    20,
 | ||
|     21,    22,    23,    24,    25,    26,    27,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,   152,   151,
 | ||
|    109,    91,   132,   131,     0,   207,   208,   209,   274,   260,
 | ||
|      0,     0,     0,     0,    85,   247,   248,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,   236,    85,   251,     0,   273,   197,   130,     0,
 | ||
|    100,     0,     0,   129,     0,   140,   100,   109,   109,    28,
 | ||
|     29,    30,    31,    32,    33,    34,    35,    36,    37,     0,
 | ||
|     52,    53,    48,    49,    50,    51,    38,    39,    40,    41,
 | ||
|     42,    43,    44,    45,    46,    47,     0,     0,     0,     0,
 | ||
|      0,     0,   142,   170,     0,     0,     0,   146,     0,   143,
 | ||
|      0,     0,     0,     0,   186,     0,   259,   241,     0,   240,
 | ||
|      0,     0,    54,     0,     0,     0,     0,   104,   104,   280,
 | ||
|      0,     0,   271,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,    92,    93,    94,    95,    97,   136,
 | ||
|    134,   123,   124,   125,   128,   122,   188,   190,     0,     0,
 | ||
|    257,     0,     0,     0,     0,     0,   141,   127,   139,     0,
 | ||
|    144,   145,     0,     0,     0,     0,     0,   111,   109,   205,
 | ||
|    216,   217,   218,   223,   219,   220,   221,   222,   214,     0,
 | ||
|    225,   232,   231,   233,     0,   242,     0,     0,     0,     0,
 | ||
|      0,   276,     0,   278,   257,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,    98,    99,
 | ||
|    101,     0,     0,     0,     0,     0,     0,     0,   169,   148,
 | ||
|      0,     0,     0,     0,   106,   112,   110,   204,    96,   202,
 | ||
|      0,   215,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,   283,     0,     0,     0,   267,   268,     0,     0,
 | ||
|      0,     0,   265,     0,   281,     0,     0,     0,     0,   160,
 | ||
|      0,     0,     0,     0,   147,     0,     0,     0,    60,     0,
 | ||
|    100,     0,   224,     0,     0,   256,     0,     0,   104,   105,
 | ||
|    104,     0,     0,     0,     0,     0,   261,   262,   256,     0,
 | ||
|      0,     0,   258,     0,   166,     0,     0,   162,   163,   159,
 | ||
|     59,   201,   203,    96,   107,     0,     0,     0,     0,     0,
 | ||
|    263,   264,     0,   277,   279,     0,     0,   266,   269,   270,
 | ||
|      0,   282,   164,   165,     0,     0,     0,    60,   108,   102,
 | ||
|    226,     0,     0,    96,     0,   100,   252,     0,   100,   161,
 | ||
|    167,   168,   200,     0,   206,     0,   245,     0,     0,   254,
 | ||
|      0,     0,   253,   272,   103,   243,     0,   244,     0,    96,
 | ||
|      0,     0,     0,   255,     0,     0,     0,     0,   250,     0,
 | ||
|      0,   249,     0,   246,     0,     0,     0
 | ||
| };
 | ||
| 
 | ||
| static const short yydefgoto[] = {   186,
 | ||
|    187,   188,   250,   267,   109,   110,    70,   482,    12,    71,
 | ||
|     14,    36,    37,    38,    42,    48,   119,   319,   229,   391,
 | ||
|    322,   525,   372,   348,   510,   285,   349,    72,   111,   128,
 | ||
|    195,   129,   130,   101,   274,   361,   275,    79,   555,    15,
 | ||
|     16,    18,    17,   191,   238,   239,    57,    21,    55,    92,
 | ||
|    410,   411,   120,   198,    49,    87,    50,    43,   413,   362,
 | ||
|     74,   364,   290,    51,    83,    84,   223,   529,   123,   303,
 | ||
|    490,   394,   224,   225,   226,   227
 | ||
| };
 | ||
| 
 | ||
| static const short yypact[] = {   438,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,    27,  -119,   -29,
 | ||
|    -84,    43,   -57,    -6,   525,-32768,   195,   140,   -38,   -27,
 | ||
| -32768,   -39,   112,-32768,   828,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,    32,    32,   227,-32768,-32768,
 | ||
| -32768,    32,-32768,-32768,-32768,-32768,-32768,    32,   119,-32768,
 | ||
|     -2,   188,   210,   213,-32768,-32768,-32768,-32768,-32768,    49,
 | ||
| -32768,-32768,-32768,-32768,-32768,   214,   245,     5,   104,-32768,
 | ||
| -32768,-32768,   110,-32768,   227,   227,-32768,-32768,  1043,   154,
 | ||
|    154,-32768,-32768,   109,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,   -89,  1085,-32768,   125,   139,   122,    49,-32768,   110,
 | ||
|    -55,-32768,  1085,  1043,  1188,    46,   249,   272,   266,   273,
 | ||
|    589,-32768,   279,-32768,-32768,-32768,-32768,-32768,  1204,-32768,
 | ||
|      2,  1327,-32768,   268,-32768,-32768,   110,-32768,   153,   150,
 | ||
|   1188,  1188,   149,   -53,  1188,-32768,   155,-32768,   110,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,   494,   943,   157,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,   158,   159,   163,
 | ||
|    164,   790,  1226,   495,   284,   166,   167,   169,-32768,-32768,
 | ||
|    173,-32768,    49,   110,    28,-32768,-32768,-32768,-32768,-32768,
 | ||
|    262,  1243,   142,   302,   154,-32768,-32768,   494,   943,  1188,
 | ||
|   1188,  1188,  1188,  1188,  1188,  1188,  1188,  1188,  1188,  1188,
 | ||
|   1188,  1188,-32768,   154,-32768,   168,-32768,-32768,   -58,  1124,
 | ||
| -32768,    25,    16,-32768,   170,   110,-32768,   173,   173,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   177,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,   181,  1043,  1043,  1043,
 | ||
|   1043,  1043,-32768,-32768,    20,   668,   -40,-32768,   -48,-32768,
 | ||
|   1043,  1043,  1043,    18,-32768,   182,-32768,    49,   747,-32768,
 | ||
|    872,   872,-32768,   872,  1204,  1188,  1188,    99,   117,-32768,
 | ||
|    747,    33,   186,   187,   191,   192,   198,   200,   747,   747,
 | ||
|    290,  1204,  1188,  1188,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,   -87,-32768,-32768,-32768,   -87,-32768,-32768,  1043,  1043,
 | ||
| -32768,   203,   204,   205,   209,  1043,-32768,   202,   589,   -43,
 | ||
| -32768,-32768,   216,   218,   312,   328,   342,-32768,   173,  1140,
 | ||
| -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   295,  1043,
 | ||
| -32768,-32768,-32768,-32768,   219,-32768,   229,   872,   747,   747,
 | ||
|      8,-32768,    17,-32768,-32768,   872,   225,  1188,  1188,  1188,
 | ||
|   1188,  1188,   231,   232,  1188,   872,   747,   233,-32768,-32768,
 | ||
| -32768,   234,   235,   -33,  1043,  1043,  1043,  1043,-32768,-32768,
 | ||
|    230,  1043,  1043,  1188,-32768,-32768,-32768,-32768,   110,   238,
 | ||
|    236,-32768,   357,   -36,   363,   364,   241,   246,   248,   872,
 | ||
|    374,   872,   251,   254,   872,   255,   110,-32768,   256,   258,
 | ||
|    872,   872,   110,   260,-32768,  1188,  1043,  1043,  1188,-32768,
 | ||
|    261,   263,   264,   270,-32768,   267,   276,    47,   130,  1159,
 | ||
| -32768,   274,-32768,   872,   872,  1188,   872,   872,   281,-32768,
 | ||
|    281,   872,   283,  1188,  1188,  1188,-32768,-32768,  1188,   747,
 | ||
|    282,   285,-32768,  1043,-32768,  1043,  1043,-32768,-32768,-32768,
 | ||
| -32768,-32768,-32768,   110,    45,   382,   287,   280,   747,   -13,
 | ||
| -32768,-32768,   355,-32768,-32768,   265,   872,-32768,-32768,-32768,
 | ||
|     29,-32768,-32768,-32768,   286,   291,   292,   130,-32768,   375,
 | ||
| -32768,   412,     1,-32768,  1188,-32768,-32768,   293,-32768,-32768,
 | ||
| -32768,-32768,-32768,   423,-32768,   872,-32768,   996,     9,   -58,
 | ||
|    747,   212,-32768,   -87,-32768,-32768,   297,-32768,   996,-32768,
 | ||
|    419,   422,   303,   -58,   872,   872,   425,   371,-32768,   872,
 | ||
|    427,-32768,   872,-32768,   443,   444,-32768
 | ||
| };
 | ||
| 
 | ||
| static const short yypgoto[] = {   324,
 | ||
|    325,   326,   242,   252,  -197,-32768,     0,   -50,   376,     4,
 | ||
| -32768,-32768,-32768,    40,-32768,-32768,  -167,  -306,  -397,-32768,
 | ||
|   -235,-32768,  -291,   -23,-32768,  -211,-32768,-32768,   -24,   237,
 | ||
|   -229,-32768,   362,   369,   -68,  -108,  -178,   201,-32768,-32768,
 | ||
|    453,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 | ||
| -32768,-32768,   391,-32768,-32768,-32768,-32768,-32768,-32768,  -436,
 | ||
|    -72,   101,  -157,-32768,   424,-32768,-32768,-32768,-32768,-32768,
 | ||
|      7,   105,-32768,-32768,-32768,-32768
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| #define	YYLAST		1453
 | ||
| 
 | ||
| 
 | ||
| static const short yytable[] = {    11,
 | ||
|     73,   326,   189,    13,   277,   279,   294,   374,    96,   293,
 | ||
|    112,   449,    22,    82,    11,   390,   420,   293,    13,   390,
 | ||
|     23,    85,   315,   316,   196,   422,   327,   328,    27,    28,
 | ||
|     29,    30,    31,    32,    33,   138,    34,   295,   190,   389,
 | ||
|    317,   318,     2,   124,   100,     4,   346,    24,   -54,   -54,
 | ||
|    125,   315,   316,   421,   300,    25,   312,   304,   305,   306,
 | ||
|    307,   308,   421,   347,   311,   368,   140,   141,   127,   317,
 | ||
|    318,    19,   100,   346,    26,    75,    76,   135,   127,   135,
 | ||
|    139,    80,   386,    11,   336,    20,   508,    81,   136,   336,
 | ||
|    235,   537,   336,    52,   194,   342,   336,   340,    54,   439,
 | ||
|    401,   341,   543,   440,    53,   453,   232,   233,    58,    59,
 | ||
|    236,    98,    61,    62,    63,    64,   530,     1,     2,   515,
 | ||
|      3,     4,     1,   516,    35,     3,    58,    59,    56,    98,
 | ||
|     61,    62,    63,    64,    82,     1,     2,   407,     3,     4,
 | ||
|    527,    86,   544,     1,   197,    65,     3,    97,   538,   102,
 | ||
|    291,   103,   336,   292,   315,   316,   388,   324,   102,   337,
 | ||
|    103,   515,    35,    65,   323,   519,   102,   494,   103,   495,
 | ||
|    376,   389,   317,   318,    44,    45,    46,   289,   390,    47,
 | ||
|    102,   414,   103,   480,    93,   298,   299,   289,   301,   302,
 | ||
|    289,   289,   289,   289,   289,   309,   310,   289,   286,   331,
 | ||
|    332,   333,   334,   335,    89,   127,   113,   114,   115,   116,
 | ||
|    117,   118,   343,   344,   345,   485,   363,    94,   363,   363,
 | ||
|    426,   363,   428,   429,   430,   390,    90,   390,   363,    91,
 | ||
|    189,   371,   102,    40,   103,    41,   363,   363,    66,   315,
 | ||
|    316,    67,   541,   102,    68,   103,    69,    99,    95,   373,
 | ||
|    102,   339,   103,    77,    78,   -55,    66,   317,   318,    67,
 | ||
|    392,   393,    68,   131,    69,   133,   190,   399,   142,   143,
 | ||
|    194,   369,   370,   313,   314,   104,   105,   132,   -56,   144,
 | ||
|    532,   473,   192,   534,   228,   230,   231,   194,   387,   289,
 | ||
|    234,   237,   268,   269,   270,   363,   363,   363,   271,   272,
 | ||
|    280,   281,   282,   363,   283,   284,   498,   499,   500,   287,
 | ||
|    293,   325,   329,   363,   363,   528,   330,   350,   377,   378,
 | ||
|    385,   315,   316,   379,   380,   409,   441,   442,   443,   444,
 | ||
|    381,   539,   382,   446,   447,   395,   396,   397,   389,   317,
 | ||
|    318,   398,   404,   400,   405,   406,   412,   363,   402,   363,
 | ||
|    403,   415,   363,   289,   427,   289,   289,   289,   363,   363,
 | ||
|    433,   416,   425,   431,   432,   436,   437,   438,   471,   472,
 | ||
|    450,   445,   451,   452,   454,   455,   456,   460,   457,   448,
 | ||
|    458,   363,   363,   439,   363,   363,   462,   464,   465,   363,
 | ||
|    466,   365,   366,   474,   367,   469,   476,   363,   511,   475,
 | ||
|    421,   375,   477,   478,   517,   505,   486,   506,   507,   383,
 | ||
|    384,   470,   479,   493,   289,   497,   363,   513,   503,   512,
 | ||
|    524,   504,   520,   526,   363,   484,   535,   521,   522,   542,
 | ||
|    545,   489,   533,   546,   551,   547,   550,  -174,   553,   289,
 | ||
|    289,   289,   556,   557,   489,   220,   221,   222,   481,   296,
 | ||
|    -62,     1,     2,   363,     3,     4,     5,   523,   363,   122,
 | ||
|    297,   509,     6,     7,   137,   134,   321,    39,   417,   418,
 | ||
|    419,   121,   363,   363,    88,   501,   424,   363,     0,   423,
 | ||
|    363,     8,     0,     0,     9,     0,   434,   435,    10,     0,
 | ||
|    531,     0,     0,     0,     0,     0,     0,     0,     0,    58,
 | ||
|     59,     0,    98,   106,   107,   108,    64,   481,     1,     2,
 | ||
|      0,     3,     4,     0,     0,     0,     0,     0,     0,     0,
 | ||
|    459,     0,   461,     0,  -173,   463,     0,     0,     0,     0,
 | ||
|      0,   467,   468,     0,     0,     0,    65,   -62,     1,     2,
 | ||
|      0,     3,     4,     5,     0,     0,     0,     0,     0,     6,
 | ||
|      7,     0,     0,     0,   487,   488,     0,   491,   492,     0,
 | ||
|      0,     0,   496,     0,     0,     0,     0,     0,     8,     0,
 | ||
|    502,     9,     0,     0,     0,    10,   240,   241,   242,   243,
 | ||
|    244,   245,   246,   247,   248,   249,     0,     0,     0,   514,
 | ||
|      0,     0,     0,    58,    59,     0,     0,   518,     0,     0,
 | ||
|      0,     0,     1,     2,     0,     3,     4,     0,   145,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,   146,   147,     0,     0,     0,   536,     0,     0,    66,
 | ||
|      0,   540,    67,     0,     0,    68,     0,    69,   278,     0,
 | ||
|      0,     0,     0,     0,     0,   548,   549,     0,     0,     0,
 | ||
|    552,     0,     0,   554,   148,   149,   150,   151,   152,   153,
 | ||
|    154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
 | ||
|    164,     0,    58,    59,     0,    98,   106,   107,   108,    64,
 | ||
|      0,     1,     2,     0,     3,     4,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,   165,   166,   167,   168,
 | ||
|    169,   170,   171,   172,   173,   174,   175,   176,   177,    65,
 | ||
|    178,     0,   179,   180,   181,     0,     0,     0,     0,     0,
 | ||
|      0,     0,   102,     0,   103,     0,   182,     0,     0,   183,
 | ||
|      0,   184,     0,   185,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,   351,
 | ||
|    352,    58,    59,   353,     0,     0,     0,     0,     0,     0,
 | ||
|      1,     2,     0,     3,     4,     0,   354,   355,   356,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,   357,
 | ||
|    358,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,    58,    59,   359,    98,   106,   107,
 | ||
|    108,    64,    66,     1,     2,    67,     3,     4,    68,     0,
 | ||
|     69,   338,   148,   149,   150,   151,   152,   153,   154,   155,
 | ||
|    156,   157,   158,   159,   160,   161,   162,   163,   164,     0,
 | ||
|      0,    65,    58,    59,     0,    60,    61,    62,    63,    64,
 | ||
|      0,     1,     2,     0,     3,     4,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,   165,   166,   167,   168,   169,   170,
 | ||
|    171,   172,   173,   174,   175,   176,   177,     0,   178,    65,
 | ||
|    179,   180,   181,     0,   351,   352,    58,    59,   353,     0,
 | ||
|    102,     0,   103,     0,     0,     1,     2,   360,     3,     4,
 | ||
|      0,   354,   355,   356,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,   357,   358,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,   359,     0,     0,    66,     0,     0,    67,     0,   273,
 | ||
|     68,     0,    69,     0,     0,     0,     0,   148,   149,   150,
 | ||
|    151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
 | ||
|    161,   162,   163,   164,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,    66,   251,   252,    67,     0,     0,    68,     0,
 | ||
|     69,     0,     0,     0,     0,     0,     0,     0,     0,   165,
 | ||
|    166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
 | ||
|    176,   177,     0,   178,     0,   179,   180,   181,   351,   352,
 | ||
|      0,     0,   353,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,   360,     0,     0,   354,   355,   356,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,   357,   358,
 | ||
|      0,   253,   254,   255,   256,   257,   258,   259,   260,   261,
 | ||
|    262,   263,   264,   265,   266,   359,     0,    58,    59,     0,
 | ||
|     98,   106,   107,   108,    64,     0,     1,     2,     0,     3,
 | ||
|      4,   148,   149,   150,   151,   152,   153,   154,   155,   156,
 | ||
|    157,   158,   159,   160,   161,   162,   163,   164,     0,     0,
 | ||
|      0,     0,     0,     0,    65,     0,     0,     0,     0,    58,
 | ||
|     59,     0,    98,    61,    62,    63,    64,     0,     1,     2,
 | ||
|      0,     3,     4,   165,   166,   167,   168,   169,   170,   171,
 | ||
|    172,   173,   174,   175,   176,   177,   126,   178,     0,   179,
 | ||
|    180,   181,     0,     0,     0,     0,    65,     0,    58,    59,
 | ||
|      0,    98,    61,    62,    63,    64,   360,     1,     2,     0,
 | ||
|      3,     4,     0,     0,    58,    59,     0,    98,    61,    62,
 | ||
|     63,    64,     0,     1,     2,   320,     3,     4,     0,     0,
 | ||
|      0,     0,     0,    58,    59,    65,    98,    61,    62,    63,
 | ||
|     64,   408,     1,     2,     0,     3,     4,    66,     0,     0,
 | ||
|     67,    65,     0,    68,     0,    69,     0,     0,     0,     0,
 | ||
|    483,     0,    58,    59,     0,    98,    61,    62,    63,    64,
 | ||
|     65,     1,     2,     0,     3,     4,     0,     0,    58,    59,
 | ||
|      0,   193,    61,    62,    63,    64,     0,     1,     2,    66,
 | ||
|      3,     4,    67,     0,     0,    68,     0,    69,     0,    65,
 | ||
|     58,    59,     0,    98,   106,   107,   108,    64,     0,     1,
 | ||
|      2,     0,     3,     4,     0,    65,     0,    58,    59,     0,
 | ||
|    288,    61,    62,    63,    64,     0,     1,     2,    66,     3,
 | ||
|      4,    67,     0,     0,    68,     0,    69,    65,     0,     0,
 | ||
|      0,     0,     0,     0,    66,     0,     0,    67,     0,     0,
 | ||
|     68,     0,    69,     0,    65,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,    66,     0,     0,    67,     0,     0,    68,
 | ||
|      0,    69,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,    66,     0,     0,    67,     0,     0,    68,     0,
 | ||
|     69,     0,     0,     0,     0,     0,     0,     0,    66,     0,
 | ||
|      0,    67,     0,     0,    68,     0,    69,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,   199,     0,     0,     0,
 | ||
|     66,     0,     0,    67,     0,     0,    68,     0,   276,     0,
 | ||
|      0,     0,     0,     0,   200,   201,     0,    66,     0,     0,
 | ||
|     67,     0,     0,    68,     0,    69,   202,   203,   204,   205,
 | ||
|    206,   207,   148,   149,   150,   151,   152,   153,   154,   155,
 | ||
|    156,   157,   158,   159,   160,   161,   162,   208,   209,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 | ||
|      0,     0,     0,     0,     0,     0,     0,     0,     0,   210,
 | ||
|    211,   212,     0,     0,   213,   166,   167,   168,   169,   170,
 | ||
|    171,   172,   173,   174,   175,   176,   177,   214,   215,   216,
 | ||
|    217,   218,   219
 | ||
| };
 | ||
| 
 | ||
| static const short yycheck[] = {     0,
 | ||
|     25,   237,   111,     0,   183,   184,   204,   299,     4,     9,
 | ||
|     79,   409,   132,    16,    15,   322,     9,     9,    15,   326,
 | ||
|     50,    24,   110,   111,    23,     9,   238,   239,    35,    36,
 | ||
|     37,    38,    39,    40,    41,   104,    43,   205,   111,   127,
 | ||
|    128,   129,    15,   133,    69,    18,    29,   132,     3,     4,
 | ||
|    140,   110,   111,    46,   212,    13,   224,   215,   216,   217,
 | ||
|    218,   219,    46,    46,   222,   295,    21,    22,    93,   128,
 | ||
|    129,    45,    97,    29,   132,    36,    37,   133,   103,   133,
 | ||
|    105,    42,   312,    84,   133,    59,   484,    48,   144,   133,
 | ||
|    144,   528,   133,   132,   119,   144,   133,   276,   138,   133,
 | ||
|    144,   142,   539,   137,   132,   142,   131,   132,     5,     6,
 | ||
|    135,     8,     9,    10,    11,    12,   514,    14,    15,   133,
 | ||
|     17,    18,    14,   137,   131,    17,     5,     6,    17,     8,
 | ||
|      9,    10,    11,    12,    16,    14,    15,   349,    17,    18,
 | ||
|    140,   144,   540,    14,   143,    42,    17,   143,   140,   134,
 | ||
|      9,   136,   133,    12,   110,   111,   314,   142,   134,   140,
 | ||
|    136,   133,   131,    42,   140,   137,   134,   459,   136,   461,
 | ||
|    138,   127,   128,   129,    35,    36,    37,   202,   485,    40,
 | ||
|    134,   360,   136,   137,   136,   210,   211,   212,   213,   214,
 | ||
|    215,   216,   217,   218,   219,   220,   221,   222,   195,   268,
 | ||
|    269,   270,   271,   272,    17,   230,    53,    54,    55,    56,
 | ||
|     57,    58,   281,   282,   283,   451,   289,     4,   291,   292,
 | ||
|    378,   294,   380,   381,   382,   532,    17,   534,   301,    17,
 | ||
|    339,   133,   134,    39,   136,    41,   309,   310,   135,   110,
 | ||
|    111,   138,    31,   134,   141,   136,   143,   144,     4,   133,
 | ||
|    134,   276,   136,    27,    28,     7,   135,   128,   129,   138,
 | ||
|    329,   330,   141,   139,   143,   144,   339,   336,     3,     4,
 | ||
|    295,   296,   297,   106,   107,    75,    76,   139,     7,     7,
 | ||
|    516,   439,     4,   519,    17,   133,   137,   312,   313,   314,
 | ||
|    142,   137,   136,   136,   136,   368,   369,   370,   136,   136,
 | ||
|     17,   136,   136,   376,   136,   133,   464,   465,   466,    48,
 | ||
|      9,   142,   136,   386,   387,   513,   136,   136,   133,   133,
 | ||
|     31,   110,   111,   133,   133,   350,   395,   396,   397,   398,
 | ||
|    133,   529,   133,   402,   403,   133,   133,   133,   127,   128,
 | ||
|    129,   133,    31,   142,    17,     4,    52,   420,   133,   422,
 | ||
|    133,   133,   425,   378,   379,   380,   381,   382,   431,   432,
 | ||
|    385,   133,   138,   133,   133,   133,   133,   133,   437,   438,
 | ||
|    133,   142,   137,    17,    12,    12,   136,     4,   133,   404,
 | ||
|    133,   454,   455,   133,   457,   458,   133,   133,   133,   462,
 | ||
|    133,   291,   292,   133,   294,   136,   133,   470,    17,   137,
 | ||
|     46,   301,   133,   137,   140,   474,   133,   476,   477,   309,
 | ||
|    310,   436,   137,   133,   439,   133,   489,   138,   137,   133,
 | ||
|     46,   137,   137,    12,   497,   450,     4,   137,   137,   133,
 | ||
|     12,   456,   140,    12,    64,   133,    12,     0,    12,   464,
 | ||
|    465,   466,     0,     0,   469,   122,   122,   122,   449,   208,
 | ||
|     13,    14,    15,   526,    17,    18,    19,   508,   531,    84,
 | ||
|    209,   485,    25,    26,   103,    97,   230,    15,   368,   369,
 | ||
|    370,    81,   545,   546,    51,   469,   376,   550,    -1,   375,
 | ||
|    553,    44,    -1,    -1,    47,    -1,   386,   387,    51,    -1,
 | ||
|    515,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     5,
 | ||
|      6,    -1,     8,     9,    10,    11,    12,   508,    14,    15,
 | ||
|     -1,    17,    18,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|    420,    -1,   422,    -1,     0,   425,    -1,    -1,    -1,    -1,
 | ||
|     -1,   431,   432,    -1,    -1,    -1,    42,    13,    14,    15,
 | ||
|     -1,    17,    18,    19,    -1,    -1,    -1,    -1,    -1,    25,
 | ||
|     26,    -1,    -1,    -1,   454,   455,    -1,   457,   458,    -1,
 | ||
|     -1,    -1,   462,    -1,    -1,    -1,    -1,    -1,    44,    -1,
 | ||
|    470,    47,    -1,    -1,    -1,    51,    83,    84,    85,    86,
 | ||
|     87,    88,    89,    90,    91,    92,    -1,    -1,    -1,   489,
 | ||
|     -1,    -1,    -1,     5,     6,    -1,    -1,   497,    -1,    -1,
 | ||
|     -1,    -1,    14,    15,    -1,    17,    18,    -1,    20,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    33,    34,    -1,    -1,    -1,   526,    -1,    -1,   135,
 | ||
|     -1,   531,   138,    -1,    -1,   141,    -1,   143,   144,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,   545,   546,    -1,    -1,    -1,
 | ||
|    550,    -1,    -1,   553,    66,    67,    68,    69,    70,    71,
 | ||
|     72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
 | ||
|     82,    -1,     5,     6,    -1,     8,     9,    10,    11,    12,
 | ||
|     -1,    14,    15,    -1,    17,    18,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,   108,   109,   110,   111,
 | ||
|    112,   113,   114,   115,   116,   117,   118,   119,   120,    42,
 | ||
|    122,    -1,   124,   125,   126,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,   134,    -1,   136,    -1,   138,    -1,    -1,   141,
 | ||
|     -1,   143,    -1,   145,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
 | ||
|      4,     5,     6,     7,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     14,    15,    -1,    17,    18,    -1,    20,    21,    22,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    33,
 | ||
|     34,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,     5,     6,    50,     8,     9,    10,
 | ||
|     11,    12,   135,    14,    15,   138,    17,    18,   141,    -1,
 | ||
|    143,   144,    66,    67,    68,    69,    70,    71,    72,    73,
 | ||
|     74,    75,    76,    77,    78,    79,    80,    81,    82,    -1,
 | ||
|     -1,    42,     5,     6,    -1,     8,     9,    10,    11,    12,
 | ||
|     -1,    14,    15,    -1,    17,    18,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,   108,   109,   110,   111,   112,   113,
 | ||
|    114,   115,   116,   117,   118,   119,   120,    -1,   122,    42,
 | ||
|    124,   125,   126,    -1,     3,     4,     5,     6,     7,    -1,
 | ||
|    134,    -1,   136,    -1,    -1,    14,    15,   141,    17,    18,
 | ||
|     -1,    20,    21,    22,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    33,    34,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    50,    -1,    -1,   135,    -1,    -1,   138,    -1,   140,
 | ||
|    141,    -1,   143,    -1,    -1,    -1,    -1,    66,    67,    68,
 | ||
|     69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
 | ||
|     79,    80,    81,    82,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,   135,    21,    22,   138,    -1,    -1,   141,    -1,
 | ||
|    143,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   108,
 | ||
|    109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
 | ||
|    119,   120,    -1,   122,    -1,   124,   125,   126,     3,     4,
 | ||
|     -1,    -1,     7,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,   141,    -1,    -1,    20,    21,    22,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    33,    34,
 | ||
|     -1,    89,    90,    91,    92,    93,    94,    95,    96,    97,
 | ||
|     98,    99,   100,   101,   102,    50,    -1,     5,     6,    -1,
 | ||
|      8,     9,    10,    11,    12,    -1,    14,    15,    -1,    17,
 | ||
|     18,    66,    67,    68,    69,    70,    71,    72,    73,    74,
 | ||
|     75,    76,    77,    78,    79,    80,    81,    82,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    42,    -1,    -1,    -1,    -1,     5,
 | ||
|      6,    -1,     8,     9,    10,    11,    12,    -1,    14,    15,
 | ||
|     -1,    17,    18,   108,   109,   110,   111,   112,   113,   114,
 | ||
|    115,   116,   117,   118,   119,   120,    32,   122,    -1,   124,
 | ||
|    125,   126,    -1,    -1,    -1,    -1,    42,    -1,     5,     6,
 | ||
|     -1,     8,     9,    10,    11,    12,   141,    14,    15,    -1,
 | ||
|     17,    18,    -1,    -1,     5,     6,    -1,     8,     9,    10,
 | ||
|     11,    12,    -1,    14,    15,    32,    17,    18,    -1,    -1,
 | ||
|     -1,    -1,    -1,     5,     6,    42,     8,     9,    10,    11,
 | ||
|     12,    32,    14,    15,    -1,    17,    18,   135,    -1,    -1,
 | ||
|    138,    42,    -1,   141,    -1,   143,    -1,    -1,    -1,    -1,
 | ||
|     32,    -1,     5,     6,    -1,     8,     9,    10,    11,    12,
 | ||
|     42,    14,    15,    -1,    17,    18,    -1,    -1,     5,     6,
 | ||
|     -1,     8,     9,    10,    11,    12,    -1,    14,    15,   135,
 | ||
|     17,    18,   138,    -1,    -1,   141,    -1,   143,    -1,    42,
 | ||
|      5,     6,    -1,     8,     9,    10,    11,    12,    -1,    14,
 | ||
|     15,    -1,    17,    18,    -1,    42,    -1,     5,     6,    -1,
 | ||
|      8,     9,    10,    11,    12,    -1,    14,    15,   135,    17,
 | ||
|     18,   138,    -1,    -1,   141,    -1,   143,    42,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,   135,    -1,    -1,   138,    -1,    -1,
 | ||
|    141,    -1,   143,    -1,    42,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,   135,    -1,    -1,   138,    -1,    -1,   141,
 | ||
|     -1,   143,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,   135,    -1,    -1,   138,    -1,    -1,   141,    -1,
 | ||
|    143,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,    -1,
 | ||
|     -1,   138,    -1,    -1,   141,    -1,   143,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    30,    -1,    -1,    -1,
 | ||
|    135,    -1,    -1,   138,    -1,    -1,   141,    -1,   143,    -1,
 | ||
|     -1,    -1,    -1,    -1,    48,    49,    -1,   135,    -1,    -1,
 | ||
|    138,    -1,    -1,   141,    -1,   143,    60,    61,    62,    63,
 | ||
|     64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
 | ||
|     74,    75,    76,    77,    78,    79,    80,    81,    82,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 | ||
|     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   103,
 | ||
|    104,   105,    -1,    -1,   108,   109,   110,   111,   112,   113,
 | ||
|    114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
 | ||
|    124,   125,   126
 | ||
| };
 | ||
| /* -*-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 1054 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_EQ; ;
 | ||
|     break;}
 | ||
| case 29:
 | ||
| #line 1054 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_NE; ;
 | ||
|     break;}
 | ||
| case 30:
 | ||
| #line 1055 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_SLT; ;
 | ||
|     break;}
 | ||
| case 31:
 | ||
| #line 1055 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_SGT; ;
 | ||
|     break;}
 | ||
| case 32:
 | ||
| #line 1056 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_SLE; ;
 | ||
|     break;}
 | ||
| case 33:
 | ||
| #line 1056 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_SGE; ;
 | ||
|     break;}
 | ||
| case 34:
 | ||
| #line 1057 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_ULT; ;
 | ||
|     break;}
 | ||
| case 35:
 | ||
| #line 1057 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_UGT; ;
 | ||
|     break;}
 | ||
| case 36:
 | ||
| #line 1058 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_ULE; ;
 | ||
|     break;}
 | ||
| case 37:
 | ||
| #line 1058 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.IPredicate = ICmpInst::ICMP_UGE; ;
 | ||
|     break;}
 | ||
| case 38:
 | ||
| #line 1062 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OEQ; ;
 | ||
|     break;}
 | ||
| case 39:
 | ||
| #line 1062 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_ONE; ;
 | ||
|     break;}
 | ||
| case 40:
 | ||
| #line 1063 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OLT; ;
 | ||
|     break;}
 | ||
| case 41:
 | ||
| #line 1063 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OGT; ;
 | ||
|     break;}
 | ||
| case 42:
 | ||
| #line 1064 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OLE; ;
 | ||
|     break;}
 | ||
| case 43:
 | ||
| #line 1064 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_OGE; ;
 | ||
|     break;}
 | ||
| case 44:
 | ||
| #line 1065 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_ORD; ;
 | ||
|     break;}
 | ||
| case 45:
 | ||
| #line 1065 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UNO; ;
 | ||
|     break;}
 | ||
| case 46:
 | ||
| #line 1066 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UEQ; ;
 | ||
|     break;}
 | ||
| case 47:
 | ||
| #line 1066 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UNE; ;
 | ||
|     break;}
 | ||
| case 48:
 | ||
| #line 1067 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_ULT; ;
 | ||
|     break;}
 | ||
| case 49:
 | ||
| #line 1067 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UGT; ;
 | ||
|     break;}
 | ||
| case 50:
 | ||
| #line 1068 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_ULE; ;
 | ||
|     break;}
 | ||
| case 51:
 | ||
| #line 1068 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_UGE; ;
 | ||
|     break;}
 | ||
| case 52:
 | ||
| #line 1069 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_TRUE; ;
 | ||
|     break;}
 | ||
| case 53:
 | ||
| #line 1070 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.FPredicate = FCmpInst::FCMP_FALSE; ;
 | ||
|     break;}
 | ||
| case 60:
 | ||
| #line 1079 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.StrVal = 0; ;
 | ||
|     break;}
 | ||
| case 61:
 | ||
| #line 1083 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.StrVal = yyvsp[-1].StrVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 62:
 | ||
| #line 1087 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.StrVal = 0;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 65:
 | ||
| #line 1094 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.StrVal = yyvsp[-1].StrVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 66:
 | ||
| #line 1098 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.StrVal = 0;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 67:
 | ||
| #line 1104 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::InternalLinkage; ;
 | ||
|     break;}
 | ||
| case 68:
 | ||
| #line 1105 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::WeakLinkage; ;
 | ||
|     break;}
 | ||
| case 69:
 | ||
| #line 1106 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
 | ||
|     break;}
 | ||
| case 70:
 | ||
| #line 1107 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::AppendingLinkage; ;
 | ||
|     break;}
 | ||
| case 71:
 | ||
| #line 1108 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::DLLExportLinkage; ;
 | ||
|     break;}
 | ||
| case 72:
 | ||
| #line 1112 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::DLLImportLinkage; ;
 | ||
|     break;}
 | ||
| case 73:
 | ||
| #line 1113 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
 | ||
|     break;}
 | ||
| case 74:
 | ||
| #line 1114 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalLinkage; ;
 | ||
|     break;}
 | ||
| case 75:
 | ||
| #line 1118 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Visibility = GlobalValue::DefaultVisibility; ;
 | ||
|     break;}
 | ||
| case 76:
 | ||
| #line 1119 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Visibility = GlobalValue::HiddenVisibility;  ;
 | ||
|     break;}
 | ||
| case 77:
 | ||
| #line 1123 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalLinkage; ;
 | ||
|     break;}
 | ||
| case 78:
 | ||
| #line 1124 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::DLLImportLinkage; ;
 | ||
|     break;}
 | ||
| case 79:
 | ||
| #line 1125 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
 | ||
|     break;}
 | ||
| case 80:
 | ||
| #line 1129 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::ExternalLinkage; ;
 | ||
|     break;}
 | ||
| case 81:
 | ||
| #line 1130 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::InternalLinkage; ;
 | ||
|     break;}
 | ||
| case 82:
 | ||
| #line 1131 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
 | ||
|     break;}
 | ||
| case 83:
 | ||
| #line 1132 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::WeakLinkage; ;
 | ||
|     break;}
 | ||
| case 84:
 | ||
| #line 1133 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.Linkage = GlobalValue::DLLExportLinkage; ;
 | ||
|     break;}
 | ||
| case 85:
 | ||
| #line 1136 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::C; ;
 | ||
|     break;}
 | ||
| case 86:
 | ||
| #line 1137 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::C; ;
 | ||
|     break;}
 | ||
| case 87:
 | ||
| #line 1138 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::Fast; ;
 | ||
|     break;}
 | ||
| case 88:
 | ||
| #line 1139 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::Cold; ;
 | ||
|     break;}
 | ||
| case 89:
 | ||
| #line 1140 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::X86_StdCall; ;
 | ||
|     break;}
 | ||
| case 90:
 | ||
| #line 1141 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = CallingConv::X86_FastCall; ;
 | ||
|     break;}
 | ||
| case 91:
 | ||
| #line 1142 "/Users/sabre/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 1149 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = FunctionType::ZExtAttribute;      ;
 | ||
|     break;}
 | ||
| case 93:
 | ||
| #line 1150 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = FunctionType::SExtAttribute;      ;
 | ||
|     break;}
 | ||
| case 94:
 | ||
| #line 1151 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = FunctionType::InRegAttribute;     ;
 | ||
|     break;}
 | ||
| case 95:
 | ||
| #line 1152 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = FunctionType::StructRetAttribute; ;
 | ||
|     break;}
 | ||
| case 96:
 | ||
| #line 1155 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = FunctionType::NoAttributeSet; ;
 | ||
|     break;}
 | ||
| case 97:
 | ||
| #line 1156 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|                 yyval.ParamAttrs = FunctionType::ParameterAttributes(yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs);
 | ||
|               ;
 | ||
|     break;}
 | ||
| case 98:
 | ||
| #line 1161 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = FunctionType::NoReturnAttribute; ;
 | ||
|     break;}
 | ||
| case 100:
 | ||
| #line 1165 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ParamAttrs = FunctionType::NoAttributeSet; ;
 | ||
|     break;}
 | ||
| case 101:
 | ||
| #line 1166 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|                 yyval.ParamAttrs = FunctionType::ParameterAttributes(yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs);
 | ||
|               ;
 | ||
|     break;}
 | ||
| case 102:
 | ||
| #line 1173 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = 0; ;
 | ||
|     break;}
 | ||
| case 103:
 | ||
| #line 1174 "/Users/sabre/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 104:
 | ||
| #line 1180 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.UIntVal = 0; ;
 | ||
|     break;}
 | ||
| case 105:
 | ||
| #line 1181 "/Users/sabre/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 106:
 | ||
| #line 1189 "/Users/sabre/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 107:
 | ||
| #line 1197 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.StrVal = 0; ;
 | ||
|     break;}
 | ||
| case 108:
 | ||
| #line 1198 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.StrVal = yyvsp[0].StrVal; ;
 | ||
|     break;}
 | ||
| case 109:
 | ||
| #line 1203 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {;
 | ||
|     break;}
 | ||
| case 110:
 | ||
| #line 1204 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {;
 | ||
|     break;}
 | ||
| case 111:
 | ||
| #line 1205 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurGV->setSection(yyvsp[0].StrVal);
 | ||
|     free(yyvsp[0].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 112:
 | ||
| #line 1210 "/Users/sabre/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 117:
 | ||
| #line 1226 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeVal = new PATypeHolder(OpaqueType::get());
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 118:
 | ||
| #line 1230 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 119:
 | ||
| #line 1234 "/Users/sabre/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 120:
 | ||
| #line 1241 "/Users/sabre/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 121:
 | ||
| #line 1246 "/Users/sabre/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 122:
 | ||
| #line 1254 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     std::vector<const Type*> Params;
 | ||
|     std::vector<FunctionType::ParameterAttributes> Attrs;
 | ||
|     Attrs.push_back(yyvsp[0].ParamAttrs);
 | ||
|     for (TypeWithAttrsList::iterator I=yyvsp[-2].TypeWithAttrsList->begin(), E=yyvsp[-2].TypeWithAttrsList->end(); I != E; ++I) {
 | ||
|       Params.push_back(I->Ty->get());
 | ||
|       if (I->Ty->get() != Type::VoidTy)
 | ||
|         Attrs.push_back(I->Attrs);
 | ||
|     }
 | ||
|     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
 | ||
|     if (isVarArg) Params.pop_back();
 | ||
| 
 | ||
|     FunctionType *FT = FunctionType::get(*yyvsp[-4].TypeVal, Params, isVarArg, Attrs);
 | ||
|     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 123:
 | ||
| #line 1272 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     std::vector<const Type*> Params;
 | ||
|     std::vector<FunctionType::ParameterAttributes> Attrs;
 | ||
|     Attrs.push_back(yyvsp[0].ParamAttrs);
 | ||
|     for (TypeWithAttrsList::iterator I=yyvsp[-2].TypeWithAttrsList->begin(), E=yyvsp[-2].TypeWithAttrsList->end(); I != E; ++I) {
 | ||
|       Params.push_back(I->Ty->get());
 | ||
|       if (I->Ty->get() != Type::VoidTy)
 | ||
|         Attrs.push_back(I->Attrs);
 | ||
|     }
 | ||
|     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
 | ||
|     if (isVarArg) Params.pop_back();
 | ||
| 
 | ||
|     FunctionType *FT = FunctionType::get(yyvsp[-4].PrimType, Params, isVarArg, Attrs);
 | ||
|     delete yyvsp[-2].TypeWithAttrsList;      // Delete the argument list
 | ||
|     yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); 
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 124:
 | ||
| #line 1290 "/Users/sabre/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 125:
 | ||
| #line 1295 "/Users/sabre/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 126:
 | ||
| #line 1307 "/Users/sabre/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 127:
 | ||
| #line 1317 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                                  // Empty structure type?
 | ||
|     yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>()));
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 128:
 | ||
| #line 1321 "/Users/sabre/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 129:
 | ||
| #line 1331 "/Users/sabre/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 130:
 | ||
| #line 1338 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { 
 | ||
|     yyval.TypeWithAttrs.Ty = yyvsp[-1].TypeVal; 
 | ||
|     yyval.TypeWithAttrs.Attrs = yyvsp[0].ParamAttrs; 
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 131:
 | ||
| #line 1345 "/Users/sabre/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 132:
 | ||
| #line 1352 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeVal = new PATypeHolder(Type::VoidTy);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 133:
 | ||
| #line 1357 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeWithAttrsList = new TypeWithAttrsList();
 | ||
|     yyval.TypeWithAttrsList->push_back(yyvsp[0].TypeWithAttrs);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 134:
 | ||
| #line 1362 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     (yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList)->push_back(yyvsp[0].TypeWithAttrs);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 136:
 | ||
| #line 1370 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList;
 | ||
|     TypeWithAttrs TWA; TWA.Attrs = FunctionType::NoAttributeSet;
 | ||
|     TWA.Ty = new PATypeHolder(Type::VoidTy);
 | ||
|     yyval.TypeWithAttrsList->push_back(TWA);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 137:
 | ||
| #line 1377 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeWithAttrsList = new TypeWithAttrsList;
 | ||
|     TypeWithAttrs TWA; TWA.Attrs = FunctionType::NoAttributeSet;
 | ||
|     TWA.Ty = new PATypeHolder(Type::VoidTy);
 | ||
|     yyval.TypeWithAttrsList->push_back(TWA);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 138:
 | ||
| #line 1384 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TypeWithAttrsList = new TypeWithAttrsList();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 139:
 | ||
| #line 1392 "/Users/sabre/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 140:
 | ||
| #line 1397 "/Users/sabre/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 141:
 | ||
| #line 1408 "/Users/sabre/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 142:
 | ||
| #line 1436 "/Users/sabre/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 143:
 | ||
| #line 1452 "/Users/sabre/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 144:
 | ||
| #line 1481 "/Users/sabre/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 145:
 | ||
| #line 1509 "/Users/sabre/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 146:
 | ||
| #line 1534 "/Users/sabre/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 147:
 | ||
| #line 1553 "/Users/sabre/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 148:
 | ||
| #line 1579 "/Users/sabre/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 149:
 | ||
| #line 1599 "/Users/sabre/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 150:
 | ||
| #line 1611 "/Users/sabre/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 151:
 | ||
| #line 1618 "/Users/sabre/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, getValNonImprovising will search the functions
 | ||
|     // symbol table instead of the module symbol table for the global symbol,
 | ||
|     // which throws things all off.  To get around this, we just tell
 | ||
|     // getValNonImprovising that we are at global scope here.
 | ||
|     //
 | ||
|     Function *SavedCurFn = CurFun.CurrentFunction;
 | ||
|     CurFun.CurrentFunction = 0;
 | ||
| 
 | ||
|     Value *V = getValNonImprovising(Ty, yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
| 
 | ||
|     CurFun.CurrentFunction = SavedCurFn;
 | ||
| 
 | ||
|     // If this is an initializer for a constant pointer, which is referencing a
 | ||
|     // (currently) undefined variable, create a stub now that shall be replaced
 | ||
|     // in the future with the right type of variable.
 | ||
|     //
 | ||
|     if (V == 0) {
 | ||
|       assert(isa<PointerType>(Ty) && "Globals may only be used as pointers!");
 | ||
|       const PointerType *PT = cast<PointerType>(Ty);
 | ||
| 
 | ||
|       // First check to see if the forward references value is already created!
 | ||
|       PerModuleInfo::GlobalRefsType::iterator I =
 | ||
|         CurModule.GlobalRefs.find(std::make_pair(PT, yyvsp[0].ValIDVal));
 | ||
|     
 | ||
|       if (I != CurModule.GlobalRefs.end()) {
 | ||
|         V = I->second;             // Placeholder already exists, use it...
 | ||
|         yyvsp[0].ValIDVal.destroy();
 | ||
|       } else {
 | ||
|         std::string Name;
 | ||
|         if (yyvsp[0].ValIDVal.Type == ValID::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 152:
 | ||
| #line 1684 "/Users/sabre/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 153:
 | ||
| #line 1694 "/Users/sabre/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 154:
 | ||
| #line 1704 "/Users/sabre/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);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 155:
 | ||
| #line 1710 "/Users/sabre/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);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 156:
 | ||
| #line 1716 "/Users/sabre/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 157:
 | ||
| #line 1721 "/Users/sabre/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 158:
 | ||
| #line 1726 "/Users/sabre/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 159:
 | ||
| #line 1734 "/Users/sabre/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 160:
 | ||
| #line 1746 "/Users/sabre/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 161:
 | ||
| #line 1768 "/Users/sabre/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 162:
 | ||
| #line 1776 "/Users/sabre/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 163:
 | ||
| #line 1782 "/Users/sabre/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 164:
 | ||
| #line 1793 "/Users/sabre/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 165:
 | ||
| #line 1798 "/Users/sabre/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 166:
 | ||
| #line 1803 "/Users/sabre/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 167:
 | ||
| #line 1809 "/Users/sabre/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 168:
 | ||
| #line 1815 "/Users/sabre/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 169:
 | ||
| #line 1824 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 170:
 | ||
| #line 1828 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ConstVector = new std::vector<Constant*>();
 | ||
|     yyval.ConstVector->push_back(yyvsp[0].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 171:
 | ||
| #line 1836 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.BoolVal = false; ;
 | ||
|     break;}
 | ||
| case 172:
 | ||
| #line 1836 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.BoolVal = true; ;
 | ||
|     break;}
 | ||
| case 173:
 | ||
| #line 1847 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
 | ||
|     CurModule.ModuleDone();
 | ||
|     CHECK_FOR_ERROR;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 174:
 | ||
| #line 1852 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
 | ||
|     CurModule.ModuleDone();
 | ||
|     CHECK_FOR_ERROR;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 177:
 | ||
| #line 1865 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { CurFun.isDeclare = false; ;
 | ||
|     break;}
 | ||
| case 178:
 | ||
| #line 1865 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurFun.FunctionDone();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 179:
 | ||
| #line 1869 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { CurFun.isDeclare = true; ;
 | ||
|     break;}
 | ||
| case 180:
 | ||
| #line 1869 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 181:
 | ||
| #line 1872 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 182:
 | ||
| #line 1875 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     // 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) {
 | ||
|         GEN_ERROR("Reference to an undefined type: '"+DID.getName() + "'");
 | ||
|       } else {
 | ||
|         GEN_ERROR("Reference to an undefined type: #" + itostr(DID.Num));
 | ||
|       }
 | ||
|     }
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 183:
 | ||
| #line 1887 "/Users/sabre/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 184:
 | ||
| #line 1911 "/Users/sabre/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 185:
 | ||
| #line 1922 "/Users/sabre/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[-3].StrVal, GlobalValue::ExternalLinkage,
 | ||
|                                 yyvsp[-2].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 186:
 | ||
| #line 1929 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurGV = 0;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 187:
 | ||
| #line 1932 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (yyvsp[0].ConstVal == 0) 
 | ||
|       GEN_ERROR("Global value initializer is not a constant");
 | ||
|     CurGV = ParseGlobalVariable(yyvsp[-4].StrVal, yyvsp[-3].Linkage, yyvsp[-2].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 188:
 | ||
| #line 1937 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurGV = 0;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 189:
 | ||
| #line 1940 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
 | ||
|     CurGV = ParseGlobalVariable(yyvsp[-4].StrVal, yyvsp[-3].Linkage, yyvsp[-2].Visibility, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     delete yyvsp[0].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 190:
 | ||
| #line 1946 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurGV = 0;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 191:
 | ||
| #line 1950 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { 
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 192:
 | ||
| #line 1953 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 193:
 | ||
| #line 1959 "/Users/sabre/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 194:
 | ||
| #line 1972 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal);
 | ||
|     free(yyvsp[0].StrVal);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 195:
 | ||
| #line 1976 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     CurModule.CurrentModule->setDataLayout(yyvsp[0].StrVal);
 | ||
|     free(yyvsp[0].StrVal);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 197:
 | ||
| #line 1983 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|           CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
 | ||
|           free(yyvsp[0].StrVal);
 | ||
|           CHECK_FOR_ERROR
 | ||
|         ;
 | ||
|     break;}
 | ||
| case 198:
 | ||
| #line 1988 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|           CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
 | ||
|           free(yyvsp[0].StrVal);
 | ||
|           CHECK_FOR_ERROR
 | ||
|         ;
 | ||
|     break;}
 | ||
| case 199:
 | ||
| #line 1993 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|           CHECK_FOR_ERROR
 | ||
|         ;
 | ||
|     break;}
 | ||
| case 200:
 | ||
| #line 2002 "/Users/sabre/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 201:
 | ||
| #line 2012 "/Users/sabre/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 202:
 | ||
| #line 2023 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ArgList = yyvsp[0].ArgList;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 203:
 | ||
| #line 2027 "/Users/sabre/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 = FunctionType::NoAttributeSet;
 | ||
|     yyval.ArgList->push_back(E);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 204:
 | ||
| #line 2036 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ArgList = new ArgListType;
 | ||
|     struct ArgListEntry E;
 | ||
|     E.Ty = new PATypeHolder(Type::VoidTy);
 | ||
|     E.Name = 0;
 | ||
|     E.Attrs = FunctionType::NoAttributeSet;
 | ||
|     yyval.ArgList->push_back(E);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 205:
 | ||
| #line 2045 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ArgList = 0;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 206:
 | ||
| #line 2051 "/Users/sabre/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;
 | ||
|   std::vector<FunctionType::ParameterAttributes> ParamAttrs;
 | ||
|   ParamAttrs.push_back(yyvsp[-2].ParamAttrs);
 | ||
|   if (yyvsp[-4].ArgList) {   // If there are arguments...
 | ||
|     for (ArgListType::iterator I = yyvsp[-4].ArgList->begin(); I != yyvsp[-4].ArgList->end(); ++I) {
 | ||
|       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)
 | ||
|         ParamAttrs.push_back(I->Attrs);
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
 | ||
|   if (isVarArg) ParamTypeList.pop_back();
 | ||
| 
 | ||
|   FunctionType *FT = FunctionType::get(*yyvsp[-7].TypeVal, ParamTypeList, isVarArg,
 | ||
|                                        ParamAttrs);
 | ||
|   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[PFT].size());
 | ||
|   }
 | ||
| 
 | ||
|   Function *Fn = 0;
 | ||
|   // See if this function was forward referenced.  If so, recycle the object.
 | ||
|   if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
 | ||
|     // Move the function to the end of the list, from whereever it was 
 | ||
|     // previously inserted.
 | ||
|     Fn = cast<Function>(FWRef);
 | ||
|     CurModule.CurrentModule->getFunctionList().remove(Fn);
 | ||
|     CurModule.CurrentModule->getFunctionList().push_back(Fn);
 | ||
|   } else if (!FunctionName.empty() &&     // Merge with an earlier prototype?
 | ||
|              (Fn = CurModule.CurrentModule->getFunction(FunctionName))) {
 | ||
|     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 209:
 | ||
| #line 2164 "/Users/sabre/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 212:
 | ||
| #line 2175 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|   yyval.FunctionVal = yyvsp[-1].FunctionVal;
 | ||
|   CHECK_FOR_ERROR
 | ||
| ;
 | ||
|     break;}
 | ||
| case 213:
 | ||
| #line 2180 "/Users/sabre/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 214:
 | ||
| #line 2192 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = false;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 215:
 | ||
| #line 2196 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = true;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 216:
 | ||
| #line 2201 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {    // A reference to a direct constant
 | ||
|     yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 217:
 | ||
| #line 2205 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 218:
 | ||
| #line 2209 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                     // Perhaps it's an FP constant?
 | ||
|     yyval.ValIDVal = ValID::create(yyvsp[0].FPVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 219:
 | ||
| #line 2213 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::create(ConstantInt::getTrue());
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 220:
 | ||
| #line 2217 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::create(ConstantInt::getFalse());
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 221:
 | ||
| #line 2221 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::createNull();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 222:
 | ||
| #line 2225 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::createUndef();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 223:
 | ||
| #line 2229 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {     // A vector zero constant.
 | ||
|     yyval.ValIDVal = ValID::createZeroInit();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 224:
 | ||
| #line 2233 "/Users/sabre/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 225:
 | ||
| #line 2258 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 226:
 | ||
| #line 2262 "/Users/sabre/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 227:
 | ||
| #line 2276 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {  // Is it an integer reference...?
 | ||
|     yyval.ValIDVal = ValID::createLocalID(yyvsp[0].UIntVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 228:
 | ||
| #line 2280 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValIDVal = ValID::createGlobalID(yyvsp[0].UIntVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 229:
 | ||
| #line 2284 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                   // Is it a named reference...?
 | ||
|     yyval.ValIDVal = ValID::createLocalName(yyvsp[0].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 230:
 | ||
| #line 2288 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                   // Is it a named reference...?
 | ||
|     yyval.ValIDVal = ValID::createGlobalName(yyvsp[0].StrVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 233:
 | ||
| #line 2300 "/Users/sabre/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 234:
 | ||
| #line 2309 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.FunctionVal = yyvsp[-1].FunctionVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 235:
 | ||
| #line 2313 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { // Do not allow functions with 0 basic blocks   
 | ||
|     yyval.FunctionVal = yyvsp[-1].FunctionVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 236:
 | ||
| #line 2322 "/Users/sabre/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);
 | ||
|     InsertValue(yyvsp[-2].BasicBlockVal);
 | ||
|     yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 237:
 | ||
| #line 2332 "/Users/sabre/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 238:
 | ||
| #line 2341 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BasicBlockVal = getBBVal(ValID::createLocalID(CurFun.NextBBNum++), true);
 | ||
|     CHECK_FOR_ERROR
 | ||
| 
 | ||
|     // Make sure to move the basic block to the correct location in the
 | ||
|     // function, instead of leaving it inserted wherever it was first
 | ||
|     // referenced.
 | ||
|     Function::BasicBlockListType &BBL = 
 | ||
|       CurFun.CurrentFunction->getBasicBlockList();
 | ||
|     BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 239:
 | ||
| #line 2353 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BasicBlockVal = getBBVal(ValID::createLocalName(yyvsp[0].StrVal), true);
 | ||
|     CHECK_FOR_ERROR
 | ||
| 
 | ||
|     // Make sure to move the basic block to the correct location in the
 | ||
|     // function, instead of leaving it inserted wherever it was first
 | ||
|     // referenced.
 | ||
|     Function::BasicBlockListType &BBL = 
 | ||
|       CurFun.CurrentFunction->getBasicBlockList();
 | ||
|     BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 240:
 | ||
| #line 2366 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {              // Return with a result...
 | ||
|     yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 241:
 | ||
| #line 2370 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                                       // Return with no result...
 | ||
|     yyval.TermInstVal = new ReturnInst();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 242:
 | ||
| #line 2374 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {                         // Unconditional Branch...
 | ||
|     BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.TermInstVal = new BranchInst(tmpBB);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 243:
 | ||
| #line 2379 "/Users/sabre/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 244:
 | ||
| #line 2389 "/Users/sabre/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 245:
 | ||
| #line 2408 "/Users/sabre/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 246:
 | ||
| #line 2418 "/Users/sabre/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;
 | ||
|       FunctionType::ParamAttrsList ParamAttrs;
 | ||
|       ParamAttrs.push_back(yyvsp[-6].ParamAttrs);
 | ||
|       for (ValueRefList::iterator I = yyvsp[-8].ValueRefList->begin(), E = yyvsp[-8].ValueRefList->end(); I != E; ++I) {
 | ||
|         const Type *Ty = I->Val->getType();
 | ||
|         if (Ty == Type::VoidTy)
 | ||
|           GEN_ERROR("Short call syntax cannot be used with varargs");
 | ||
|         ParamTypes.push_back(Ty);
 | ||
|         ParamAttrs.push_back(I->Attrs);
 | ||
|       }
 | ||
| 
 | ||
|       Ty = FunctionType::get(yyvsp[-11].TypeVal->get(), ParamTypes, false, ParamAttrs);
 | ||
|       PFTy = PointerType::get(Ty);
 | ||
|     }
 | ||
| 
 | ||
|     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 247:
 | ||
| #line 2484 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TermInstVal = new UnwindInst();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 248:
 | ||
| #line 2488 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.TermInstVal = new UnreachableInst();
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 249:
 | ||
| #line 2495 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.JumpTable = yyvsp[-5].JumpTable;
 | ||
|     Constant *V = cast<Constant>(getValNonImprovising(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 250:
 | ||
| #line 2506 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.JumpTable = new std::vector<std::pair<Constant*, BasicBlock*> >();
 | ||
|     Constant *V = cast<Constant>(getValNonImprovising(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 251:
 | ||
| #line 2519 "/Users/sabre/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 252:
 | ||
| #line 2529 "/Users/sabre/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 253:
 | ||
| #line 2540 "/Users/sabre/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 254:
 | ||
| #line 2550 "/Users/sabre/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);
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 255:
 | ||
| #line 2558 "/Users/sabre/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);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 256:
 | ||
| #line 2566 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ValueRefList = new ValueRefList(); ;
 | ||
|     break;}
 | ||
| case 257:
 | ||
| #line 2569 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| { yyval.ValueList = new std::vector<Value*>(); ;
 | ||
|     break;}
 | ||
| case 258:
 | ||
| #line 2570 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.ValueList = yyvsp[-2].ValueList;
 | ||
|     yyval.ValueList->push_back(yyvsp[0].ValueVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 259:
 | ||
| #line 2577 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = true;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 260:
 | ||
| #line 2581 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = false;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 261:
 | ||
| #line 2586 "/Users/sabre/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 262:
 | ||
| #line 2607 "/Users/sabre/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 263:
 | ||
| #line 2624 "/Users/sabre/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");
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 264:
 | ||
| #line 2637 "/Users/sabre/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");
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 265:
 | ||
| #line 2650 "/Users/sabre/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 266:
 | ||
| #line 2662 "/Users/sabre/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 267:
 | ||
| #line 2670 "/Users/sabre/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 268:
 | ||
| #line 2677 "/Users/sabre/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 269:
 | ||
| #line 2683 "/Users/sabre/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 270:
 | ||
| #line 2689 "/Users/sabre/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 271:
 | ||
| #line 2695 "/Users/sabre/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 272:
 | ||
| #line 2711 "/Users/sabre/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;
 | ||
|       FunctionType::ParamAttrsList ParamAttrs;
 | ||
|       ParamAttrs.push_back(yyvsp[0].ParamAttrs);
 | ||
|       for (ValueRefList::iterator I = yyvsp[-2].ValueRefList->begin(), E = yyvsp[-2].ValueRefList->end(); I != E; ++I) {
 | ||
|         const Type *Ty = I->Val->getType();
 | ||
|         if (Ty == Type::VoidTy)
 | ||
|           GEN_ERROR("Short call syntax cannot be used with varargs");
 | ||
|         ParamTypes.push_back(Ty);
 | ||
|         ParamAttrs.push_back(I->Attrs);
 | ||
|       }
 | ||
| 
 | ||
|       Ty = FunctionType::get(yyvsp[-5].TypeVal->get(), ParamTypes, false, ParamAttrs);
 | ||
|       PFTy = PointerType::get(Ty);
 | ||
|     }
 | ||
| 
 | ||
|     Value *V = getVal(PFTy, yyvsp[-4].ValIDVal);   // Get the function we're calling...
 | ||
|     CHECK_FOR_ERROR
 | ||
| 
 | ||
|     // 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 273:
 | ||
| #line 2774 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.InstVal = yyvsp[0].InstVal;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 274:
 | ||
| #line 2779 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = true;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 275:
 | ||
| #line 2783 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     yyval.BoolVal = false;
 | ||
|     CHECK_FOR_ERROR
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 276:
 | ||
| #line 2790 "/Users/sabre/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 277:
 | ||
| #line 2797 "/Users/sabre/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 278:
 | ||
| #line 2805 "/Users/sabre/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 279:
 | ||
| #line 2812 "/Users/sabre/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 280:
 | ||
| #line 2820 "/Users/sabre/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 281:
 | ||
| #line 2828 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     if (!isa<PointerType>(yyvsp[-1].TypeVal->get()))
 | ||
|       GEN_ERROR("Can't load from nonpointer type: " +
 | ||
|                      (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     if (!cast<PointerType>(yyvsp[-1].TypeVal->get())->getElementType()->isFirstClassType())
 | ||
|       GEN_ERROR("Can't load from pointer of non-first-class type: " +
 | ||
|                      (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-3].BoolVal);
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 282:
 | ||
| #line 2842 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
 | ||
| {
 | ||
|     if (!UpRefs.empty())
 | ||
|       GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     const PointerType *PT = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
 | ||
|     if (!PT)
 | ||
|       GEN_ERROR("Can't store to a nonpointer type: " +
 | ||
|                      (*yyvsp[-1].TypeVal)->getDescription());
 | ||
|     const Type *ElTy = PT->getElementType();
 | ||
|     if (ElTy != yyvsp[-3].ValueVal->getType())
 | ||
|       GEN_ERROR("Can't store '" + yyvsp[-3].ValueVal->getType()->getDescription() +
 | ||
|                      "' into space of type '" + ElTy->getDescription() + "'");
 | ||
| 
 | ||
|     Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal);
 | ||
|     CHECK_FOR_ERROR
 | ||
|     yyval.InstVal = new StoreInst(yyvsp[-3].ValueVal, tmpVal, yyvsp[-5].BoolVal);
 | ||
|     delete yyvsp[-1].TypeVal;
 | ||
|   ;
 | ||
|     break;}
 | ||
| case 283:
 | ||
| #line 2859 "/Users/sabre/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 2876 "/Users/sabre/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;
 | ||
|   }
 | ||
| 
 | ||
|   // 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;
 | ||
| }
 |