For PR1195:
[oota-llvm.git] / lib / AsmParser / llvmAsmParser.y
1 //===-- llvmAsmParser.y - Parser for llvm assembly files --------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file implements the bison parser for LLVM assembly languages files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 %{
15 #include "ParserInternals.h"
16 #include "llvm/CallingConv.h"
17 #include "llvm/InlineAsm.h"
18 #include "llvm/Instructions.h"
19 #include "llvm/Module.h"
20 #include "llvm/ValueSymbolTable.h"
21 #include "llvm/Support/GetElementPtrTypeIterator.h"
22 #include "llvm/Support/CommandLine.h"
23 #include "llvm/ADT/SmallVector.h"
24 #include "llvm/ADT/STLExtras.h"
25 #include "llvm/Support/MathExtras.h"
26 #include "llvm/Support/Streams.h"
27 #include <algorithm>
28 #include <list>
29 #include <map>
30 #include <utility>
31 #ifndef NDEBUG
32 #define YYDEBUG 1
33 #endif
34
35 // The following is a gross hack. In order to rid the libAsmParser library of
36 // exceptions, we have to have a way of getting the yyparse function to go into
37 // an error situation. So, whenever we want an error to occur, the GenerateError
38 // function (see bottom of file) sets TriggerError. Then, at the end of each 
39 // production in the grammer we use CHECK_FOR_ERROR which will invoke YYERROR 
40 // (a goto) to put YACC in error state. Furthermore, several calls to 
41 // GenerateError are made from inside productions and they must simulate the
42 // previous exception behavior by exiting the production immediately. We have
43 // replaced these with the GEN_ERROR macro which calls GeneratError and then
44 // immediately invokes YYERROR. This would be so much cleaner if it was a 
45 // recursive descent parser.
46 static bool TriggerError = false;
47 #define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYABORT; } }
48 #define GEN_ERROR(msg) { GenerateError(msg); YYERROR; }
49
50 int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit
51 int yylex();                       // declaration" of xxx warnings.
52 int yyparse();
53
54 namespace llvm {
55   std::string CurFilename;
56 #if YYDEBUG
57 static cl::opt<bool>
58 Debug("debug-yacc", cl::desc("Print yacc debug state changes"), 
59       cl::Hidden, cl::init(false));
60 #endif
61 }
62 using namespace llvm;
63
64 static Module *ParserResult;
65
66 // DEBUG_UPREFS - Define this symbol if you want to enable debugging output
67 // relating to upreferences in the input stream.
68 //
69 //#define DEBUG_UPREFS 1
70 #ifdef DEBUG_UPREFS
71 #define UR_OUT(X) cerr << X
72 #else
73 #define UR_OUT(X)
74 #endif
75
76 #define YYERROR_VERBOSE 1
77
78 static GlobalVariable *CurGV;
79
80
81 // This contains info used when building the body of a function.  It is
82 // destroyed when the function is completed.
83 //
84 typedef std::vector<Value *> ValueList;           // Numbered defs
85
86 static void 
87 ResolveDefinitions(std::map<const Type *,ValueList> &LateResolvers,
88                    std::map<const Type *,ValueList> *FutureLateResolvers = 0);
89
90 static struct PerModuleInfo {
91   Module *CurrentModule;
92   std::map<const Type *, ValueList> Values; // Module level numbered definitions
93   std::map<const Type *,ValueList> LateResolveValues;
94   std::vector<PATypeHolder>    Types;
95   std::map<ValID, PATypeHolder> LateResolveTypes;
96
97   /// PlaceHolderInfo - When temporary placeholder objects are created, remember
98   /// how they were referenced and on which line of the input they came from so
99   /// that we can resolve them later and print error messages as appropriate.
100   std::map<Value*, std::pair<ValID, int> > PlaceHolderInfo;
101
102   // GlobalRefs - This maintains a mapping between <Type, ValID>'s and forward
103   // references to global values.  Global values may be referenced before they
104   // are defined, and if so, the temporary object that they represent is held
105   // here.  This is used for forward references of GlobalValues.
106   //
107   typedef std::map<std::pair<const PointerType *,
108                              ValID>, GlobalValue*> GlobalRefsType;
109   GlobalRefsType GlobalRefs;
110
111   void ModuleDone() {
112     // If we could not resolve some functions at function compilation time
113     // (calls to functions before they are defined), resolve them now...  Types
114     // are resolved when the constant pool has been completely parsed.
115     //
116     ResolveDefinitions(LateResolveValues);
117     if (TriggerError)
118       return;
119
120     // Check to make sure that all global value forward references have been
121     // resolved!
122     //
123     if (!GlobalRefs.empty()) {
124       std::string UndefinedReferences = "Unresolved global references exist:\n";
125
126       for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end();
127            I != E; ++I) {
128         UndefinedReferences += "  " + I->first.first->getDescription() + " " +
129                                I->first.second.getName() + "\n";
130       }
131       GenerateError(UndefinedReferences);
132       return;
133     }
134
135     Values.clear();         // Clear out function local definitions
136     Types.clear();
137     CurrentModule = 0;
138   }
139
140   // GetForwardRefForGlobal - Check to see if there is a forward reference
141   // for this global.  If so, remove it from the GlobalRefs map and return it.
142   // If not, just return null.
143   GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) {
144     // Check to see if there is a forward reference to this global variable...
145     // if there is, eliminate it and patch the reference to use the new def'n.
146     GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID));
147     GlobalValue *Ret = 0;
148     if (I != GlobalRefs.end()) {
149       Ret = I->second;
150       GlobalRefs.erase(I);
151     }
152     return Ret;
153   }
154
155   bool TypeIsUnresolved(PATypeHolder* PATy) {
156     // If it isn't abstract, its resolved
157     const Type* Ty = PATy->get();
158     if (!Ty->isAbstract())
159       return false;
160     // Traverse the type looking for abstract types. If it isn't abstract then
161     // we don't need to traverse that leg of the type. 
162     std::vector<const Type*> WorkList, SeenList;
163     WorkList.push_back(Ty);
164     while (!WorkList.empty()) {
165       const Type* Ty = WorkList.back();
166       SeenList.push_back(Ty);
167       WorkList.pop_back();
168       if (const OpaqueType* OpTy = dyn_cast<OpaqueType>(Ty)) {
169         // Check to see if this is an unresolved type
170         std::map<ValID, PATypeHolder>::iterator I = LateResolveTypes.begin();
171         std::map<ValID, PATypeHolder>::iterator E = LateResolveTypes.end();
172         for ( ; I != E; ++I) {
173           if (I->second.get() == OpTy)
174             return true;
175         }
176       } else if (const SequentialType* SeqTy = dyn_cast<SequentialType>(Ty)) {
177         const Type* TheTy = SeqTy->getElementType();
178         if (TheTy->isAbstract() && TheTy != Ty) {
179           std::vector<const Type*>::iterator I = SeenList.begin(), 
180                                              E = SeenList.end();
181           for ( ; I != E; ++I)
182             if (*I == TheTy)
183               break;
184           if (I == E)
185             WorkList.push_back(TheTy);
186         }
187       } else if (const StructType* StrTy = dyn_cast<StructType>(Ty)) {
188         for (unsigned i = 0; i < StrTy->getNumElements(); ++i) {
189           const Type* TheTy = StrTy->getElementType(i);
190           if (TheTy->isAbstract() && TheTy != Ty) {
191             std::vector<const Type*>::iterator I = SeenList.begin(), 
192                                                E = SeenList.end();
193             for ( ; I != E; ++I)
194               if (*I == TheTy)
195                 break;
196             if (I == E)
197               WorkList.push_back(TheTy);
198           }
199         }
200       }
201     }
202     return false;
203   }
204
205
206 } CurModule;
207
208 static struct PerFunctionInfo {
209   Function *CurrentFunction;     // Pointer to current function being created
210
211   std::map<const Type*, ValueList> Values; // Keep track of #'d definitions
212   std::map<const Type*, ValueList> LateResolveValues;
213   bool isDeclare;                   // Is this function a forward declararation?
214   GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration.
215   GlobalValue::VisibilityTypes Visibility;
216
217   /// BBForwardRefs - When we see forward references to basic blocks, keep
218   /// track of them here.
219   std::map<BasicBlock*, std::pair<ValID, int> > BBForwardRefs;
220   std::vector<BasicBlock*> NumberedBlocks;
221   unsigned NextBBNum;
222
223   inline PerFunctionInfo() {
224     CurrentFunction = 0;
225     isDeclare = false;
226     Linkage = GlobalValue::ExternalLinkage;
227     Visibility = GlobalValue::DefaultVisibility;
228   }
229
230   inline void FunctionStart(Function *M) {
231     CurrentFunction = M;
232     NextBBNum = 0;
233   }
234
235   void FunctionDone() {
236     NumberedBlocks.clear();
237
238     // Any forward referenced blocks left?
239     if (!BBForwardRefs.empty()) {
240       GenerateError("Undefined reference to label " +
241                      BBForwardRefs.begin()->first->getName());
242       return;
243     }
244
245     // Resolve all forward references now.
246     ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
247
248     Values.clear();         // Clear out function local definitions
249     CurrentFunction = 0;
250     isDeclare = false;
251     Linkage = GlobalValue::ExternalLinkage;
252     Visibility = GlobalValue::DefaultVisibility;
253   }
254 } CurFun;  // Info for the current function...
255
256 static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }
257
258
259 //===----------------------------------------------------------------------===//
260 //               Code to handle definitions of all the types
261 //===----------------------------------------------------------------------===//
262
263 static int InsertValue(Value *V,
264                   std::map<const Type*,ValueList> &ValueTab = CurFun.Values) {
265   if (V->hasName()) return -1;           // Is this a numbered definition?
266
267   // Yes, insert the value into the value table...
268   ValueList &List = ValueTab[V->getType()];
269   List.push_back(V);
270   return List.size()-1;
271 }
272
273 static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
274   switch (D.Type) {
275   case ValID::LocalID:               // Is it a numbered definition?
276     // Module constants occupy the lowest numbered slots...
277     if (D.Num < CurModule.Types.size())
278       return CurModule.Types[D.Num];
279     break;
280   case ValID::LocalName:                 // Is it a named definition?
281     if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
282       D.destroy();  // Free old strdup'd memory...
283       return N;
284     }
285     break;
286   default:
287     GenerateError("Internal parser error: Invalid symbol type reference");
288     return 0;
289   }
290
291   // If we reached here, we referenced either a symbol that we don't know about
292   // or an id number that hasn't been read yet.  We may be referencing something
293   // forward, so just create an entry to be resolved later and get to it...
294   //
295   if (DoNotImprovise) return 0;  // Do we just want a null to be returned?
296
297
298   if (inFunctionScope()) {
299     if (D.Type == ValID::LocalName) {
300       GenerateError("Reference to an undefined type: '" + D.getName() + "'");
301       return 0;
302     } else {
303       GenerateError("Reference to an undefined type: #" + utostr(D.Num));
304       return 0;
305     }
306   }
307
308   std::map<ValID, PATypeHolder>::iterator I =CurModule.LateResolveTypes.find(D);
309   if (I != CurModule.LateResolveTypes.end())
310     return I->second;
311
312   Type *Typ = OpaqueType::get();
313   CurModule.LateResolveTypes.insert(std::make_pair(D, Typ));
314   return Typ;
315  }
316
317 // getValNonImprovising - Look up the value specified by the provided type and
318 // the provided ValID.  If the value exists and has already been defined, return
319 // it.  Otherwise return null.
320 //
321 static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
322   if (isa<FunctionType>(Ty)) {
323     GenerateError("Functions are not values and "
324                    "must be referenced as pointers");
325     return 0;
326   }
327
328   switch (D.Type) {
329   case ValID::LocalID: {                 // Is it a numbered definition?
330     // Module constants occupy the lowest numbered slots.
331     std::map<const Type*,ValueList>::iterator VI = CurFun.Values.find(Ty);
332     // Make sure that our type is within bounds.
333     if (VI == CurFun.Values.end()) return 0;
334
335     // Check that the number is within bounds.
336     if (D.Num >= VI->second.size()) return 0;
337
338     return VI->second[D.Num];
339   }
340   case ValID::GlobalID: {                 // Is it a numbered definition?
341     unsigned Num = D.Num;
342     
343     // Module constants occupy the lowest numbered slots...
344     std::map<const Type*,ValueList>::iterator VI = CurModule.Values.find(Ty);
345     if (VI == CurModule.Values.end()) 
346       return 0;
347     if (D.Num >= VI->second.size()) 
348       return 0;
349     return VI->second[Num];
350   }
351     
352   case ValID::LocalName: {                // Is it a named definition?
353     if (!inFunctionScope()) 
354       return 0;
355     ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
356     Value *N = SymTab.lookup(D.Name);
357     if (N == 0) 
358       return 0;
359     if (N->getType() != Ty)
360       return 0;
361     
362     D.destroy();  // Free old strdup'd memory...
363     return N;
364   }
365   case ValID::GlobalName: {                // Is it a named definition?
366     ValueSymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable();
367     Value *N = SymTab.lookup(D.Name);
368     if (N == 0) 
369       return 0;
370     if (N->getType() != Ty)
371       return 0;
372
373     D.destroy();  // Free old strdup'd memory...
374     return N;
375   }
376
377   // Check to make sure that "Ty" is an integral type, and that our
378   // value will fit into the specified type...
379   case ValID::ConstSIntVal:    // Is it a constant pool reference??
380     if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
381       GenerateError("Signed integral constant '" +
382                      itostr(D.ConstPool64) + "' is invalid for type '" +
383                      Ty->getDescription() + "'");
384       return 0;
385     }
386     return ConstantInt::get(Ty, D.ConstPool64);
387
388   case ValID::ConstUIntVal:     // Is it an unsigned const pool reference?
389     if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
390       if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
391         GenerateError("Integral constant '" + utostr(D.UConstPool64) +
392                        "' is invalid or out of range");
393         return 0;
394       } else {     // This is really a signed reference.  Transmogrify.
395         return ConstantInt::get(Ty, D.ConstPool64);
396       }
397     } else {
398       return ConstantInt::get(Ty, D.UConstPool64);
399     }
400
401   case ValID::ConstFPVal:        // Is it a floating point const pool reference?
402     if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) {
403       GenerateError("FP constant invalid for type");
404       return 0;
405     }
406     return ConstantFP::get(Ty, D.ConstPoolFP);
407
408   case ValID::ConstNullVal:      // Is it a null value?
409     if (!isa<PointerType>(Ty)) {
410       GenerateError("Cannot create a a non pointer null");
411       return 0;
412     }
413     return ConstantPointerNull::get(cast<PointerType>(Ty));
414
415   case ValID::ConstUndefVal:      // Is it an undef value?
416     return UndefValue::get(Ty);
417
418   case ValID::ConstZeroVal:      // Is it a zero value?
419     return Constant::getNullValue(Ty);
420     
421   case ValID::ConstantVal:       // Fully resolved constant?
422     if (D.ConstantValue->getType() != Ty) {
423       GenerateError("Constant expression type different from required type");
424       return 0;
425     }
426     return D.ConstantValue;
427
428   case ValID::InlineAsmVal: {    // Inline asm expression
429     const PointerType *PTy = dyn_cast<PointerType>(Ty);
430     const FunctionType *FTy =
431       PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
432     if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) {
433       GenerateError("Invalid type for asm constraint string");
434       return 0;
435     }
436     InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
437                                    D.IAD->HasSideEffects);
438     D.destroy();   // Free InlineAsmDescriptor.
439     return IA;
440   }
441   default:
442     assert(0 && "Unhandled case!");
443     return 0;
444   }   // End of switch
445
446   assert(0 && "Unhandled case!");
447   return 0;
448 }
449
450 // getVal - This function is identical to getValNonImprovising, except that if a
451 // value is not already defined, it "improvises" by creating a placeholder var
452 // that looks and acts just like the requested variable.  When the value is
453 // defined later, all uses of the placeholder variable are replaced with the
454 // real thing.
455 //
456 static Value *getVal(const Type *Ty, const ValID &ID) {
457   if (Ty == Type::LabelTy) {
458     GenerateError("Cannot use a basic block here");
459     return 0;
460   }
461
462   // See if the value has already been defined.
463   Value *V = getValNonImprovising(Ty, ID);
464   if (V) return V;
465   if (TriggerError) return 0;
466
467   if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty)) {
468     GenerateError("Invalid use of a composite type");
469     return 0;
470   }
471
472   // If we reached here, we referenced either a symbol that we don't know about
473   // or an id number that hasn't been read yet.  We may be referencing something
474   // forward, so just create an entry to be resolved later and get to it...
475   //
476   V = new Argument(Ty);
477
478   // Remember where this forward reference came from.  FIXME, shouldn't we try
479   // to recycle these things??
480   CurModule.PlaceHolderInfo.insert(std::make_pair(V, std::make_pair(ID,
481                                                                llvmAsmlineno)));
482
483   if (inFunctionScope())
484     InsertValue(V, CurFun.LateResolveValues);
485   else
486     InsertValue(V, CurModule.LateResolveValues);
487   return V;
488 }
489
490 /// getBBVal - This is used for two purposes:
491 ///  * If isDefinition is true, a new basic block with the specified ID is being
492 ///    defined.
493 ///  * If isDefinition is true, this is a reference to a basic block, which may
494 ///    or may not be a forward reference.
495 ///
496 static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {
497   assert(inFunctionScope() && "Can't get basic block at global scope!");
498
499   std::string Name;
500   BasicBlock *BB = 0;
501   switch (ID.Type) {
502   default: 
503     GenerateError("Illegal label reference " + ID.getName());
504     return 0;
505   case ValID::LocalID:                // Is it a numbered definition?
506     if (ID.Num >= CurFun.NumberedBlocks.size())
507       CurFun.NumberedBlocks.resize(ID.Num+1);
508     BB = CurFun.NumberedBlocks[ID.Num];
509     break;
510   case ValID::LocalName:                  // Is it a named definition?
511     Name = ID.Name;
512     Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name);
513     if (N && N->getType()->getTypeID() == Type::LabelTyID)
514       BB = cast<BasicBlock>(N);
515     break;
516   }
517
518   // See if the block has already been defined.
519   if (BB) {
520     // If this is the definition of the block, make sure the existing value was
521     // just a forward reference.  If it was a forward reference, there will be
522     // an entry for it in the PlaceHolderInfo map.
523     if (isDefinition && !CurFun.BBForwardRefs.erase(BB)) {
524       // The existing value was a definition, not a forward reference.
525       GenerateError("Redefinition of label " + ID.getName());
526       return 0;
527     }
528
529     ID.destroy();                       // Free strdup'd memory.
530     return BB;
531   }
532
533   // Otherwise this block has not been seen before.
534   BB = new BasicBlock("", CurFun.CurrentFunction);
535   if (ID.Type == ValID::LocalName) {
536     BB->setName(ID.Name);
537   } else {
538     CurFun.NumberedBlocks[ID.Num] = BB;
539   }
540
541   // If this is not a definition, keep track of it so we can use it as a forward
542   // reference.
543   if (!isDefinition) {
544     // Remember where this forward reference came from.
545     CurFun.BBForwardRefs[BB] = std::make_pair(ID, llvmAsmlineno);
546   } else {
547     // The forward declaration could have been inserted anywhere in the
548     // function: insert it into the correct place now.
549     CurFun.CurrentFunction->getBasicBlockList().remove(BB);
550     CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
551   }
552   ID.destroy();
553   return BB;
554 }
555
556
557 //===----------------------------------------------------------------------===//
558 //              Code to handle forward references in instructions
559 //===----------------------------------------------------------------------===//
560 //
561 // This code handles the late binding needed with statements that reference
562 // values not defined yet... for example, a forward branch, or the PHI node for
563 // a loop body.
564 //
565 // This keeps a table (CurFun.LateResolveValues) of all such forward references
566 // and back patchs after we are done.
567 //
568
569 // ResolveDefinitions - If we could not resolve some defs at parsing
570 // time (forward branches, phi functions for loops, etc...) resolve the
571 // defs now...
572 //
573 static void 
574 ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
575                    std::map<const Type*,ValueList> *FutureLateResolvers) {
576   // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
577   for (std::map<const Type*,ValueList>::iterator LRI = LateResolvers.begin(),
578          E = LateResolvers.end(); LRI != E; ++LRI) {
579     ValueList &List = LRI->second;
580     while (!List.empty()) {
581       Value *V = List.back();
582       List.pop_back();
583
584       std::map<Value*, std::pair<ValID, int> >::iterator PHI =
585         CurModule.PlaceHolderInfo.find(V);
586       assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!");
587
588       ValID &DID = PHI->second.first;
589
590       Value *TheRealValue = getValNonImprovising(LRI->first, DID);
591       if (TriggerError)
592         return;
593       if (TheRealValue) {
594         V->replaceAllUsesWith(TheRealValue);
595         delete V;
596         CurModule.PlaceHolderInfo.erase(PHI);
597       } else if (FutureLateResolvers) {
598         // Functions have their unresolved items forwarded to the module late
599         // resolver table
600         InsertValue(V, *FutureLateResolvers);
601       } else {
602         if (DID.Type == ValID::LocalName || DID.Type == ValID::GlobalName) {
603           GenerateError("Reference to an invalid definition: '" +DID.getName()+
604                          "' of type '" + V->getType()->getDescription() + "'",
605                          PHI->second.second);
606           return;
607         } else {
608           GenerateError("Reference to an invalid definition: #" +
609                          itostr(DID.Num) + " of type '" +
610                          V->getType()->getDescription() + "'",
611                          PHI->second.second);
612           return;
613         }
614       }
615     }
616   }
617
618   LateResolvers.clear();
619 }
620
621 // ResolveTypeTo - A brand new type was just declared.  This means that (if
622 // name is not null) things referencing Name can be resolved.  Otherwise, things
623 // refering to the number can be resolved.  Do this now.
624 //
625 static void ResolveTypeTo(char *Name, const Type *ToTy) {
626   ValID D;
627   if (Name) D = ValID::createLocalName(Name);
628   else      D = ValID::createLocalID(CurModule.Types.size());
629
630   std::map<ValID, PATypeHolder>::iterator I =
631     CurModule.LateResolveTypes.find(D);
632   if (I != CurModule.LateResolveTypes.end()) {
633     ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy);
634     CurModule.LateResolveTypes.erase(I);
635   }
636 }
637
638 // setValueName - Set the specified value to the name given.  The name may be
639 // null potentially, in which case this is a noop.  The string passed in is
640 // assumed to be a malloc'd string buffer, and is free'd by this function.
641 //
642 static void setValueName(Value *V, char *NameStr) {
643   if (!NameStr) return;
644   std::string Name(NameStr);      // Copy string
645   free(NameStr);                  // Free old string
646
647   if (V->getType() == Type::VoidTy) {
648     GenerateError("Can't assign name '" + Name+"' to value with void type");
649     return;
650   }
651
652   assert(inFunctionScope() && "Must be in function scope!");
653   ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
654   if (ST.lookup(Name)) {
655     GenerateError("Redefinition of value '" + Name + "' of type '" +
656                    V->getType()->getDescription() + "'");
657     return;
658   }
659
660   // Set the name.
661   V->setName(Name);
662 }
663
664 /// ParseGlobalVariable - Handle parsing of a global.  If Initializer is null,
665 /// this is a declaration, otherwise it is a definition.
666 static GlobalVariable *
667 ParseGlobalVariable(char *NameStr,
668                     GlobalValue::LinkageTypes Linkage,
669                     GlobalValue::VisibilityTypes Visibility,
670                     bool isConstantGlobal, const Type *Ty,
671                     Constant *Initializer) {
672   if (isa<FunctionType>(Ty)) {
673     GenerateError("Cannot declare global vars of function type");
674     return 0;
675   }
676
677   const PointerType *PTy = PointerType::get(Ty);
678
679   std::string Name;
680   if (NameStr) {
681     Name = NameStr;      // Copy string
682     free(NameStr);       // Free old string
683   }
684
685   // See if this global value was forward referenced.  If so, recycle the
686   // object.
687   ValID ID;
688   if (!Name.empty()) {
689     ID = ValID::createGlobalName((char*)Name.c_str());
690   } else {
691     ID = ValID::createGlobalID(CurModule.Values[PTy].size());
692   }
693
694   if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
695     // Move the global to the end of the list, from whereever it was
696     // previously inserted.
697     GlobalVariable *GV = cast<GlobalVariable>(FWGV);
698     CurModule.CurrentModule->getGlobalList().remove(GV);
699     CurModule.CurrentModule->getGlobalList().push_back(GV);
700     GV->setInitializer(Initializer);
701     GV->setLinkage(Linkage);
702     GV->setVisibility(Visibility);
703     GV->setConstant(isConstantGlobal);
704     InsertValue(GV, CurModule.Values);
705     return GV;
706   }
707
708   // If this global has a name
709   if (!Name.empty()) {
710     // if the global we're parsing has an initializer (is a definition) and
711     // has external linkage.
712     if (Initializer && Linkage != GlobalValue::InternalLinkage)
713       // If there is already a global with external linkage with this name
714       if (CurModule.CurrentModule->getGlobalVariable(Name, false)) {
715         // If we allow this GVar to get created, it will be renamed in the
716         // symbol table because it conflicts with an existing GVar. We can't
717         // allow redefinition of GVars whose linking indicates that their name
718         // must stay the same. Issue the error.
719         GenerateError("Redefinition of global variable named '" + Name +
720                        "' of type '" + Ty->getDescription() + "'");
721         return 0;
722       }
723   }
724
725   // Otherwise there is no existing GV to use, create one now.
726   GlobalVariable *GV =
727     new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
728                        CurModule.CurrentModule);
729   GV->setVisibility(Visibility);
730   InsertValue(GV, CurModule.Values);
731   return GV;
732 }
733
734 // setTypeName - Set the specified type to the name given.  The name may be
735 // null potentially, in which case this is a noop.  The string passed in is
736 // assumed to be a malloc'd string buffer, and is freed by this function.
737 //
738 // This function returns true if the type has already been defined, but is
739 // allowed to be redefined in the specified context.  If the name is a new name
740 // for the type plane, it is inserted and false is returned.
741 static bool setTypeName(const Type *T, char *NameStr) {
742   assert(!inFunctionScope() && "Can't give types function-local names!");
743   if (NameStr == 0) return false;
744  
745   std::string Name(NameStr);      // Copy string
746   free(NameStr);                  // Free old string
747
748   // We don't allow assigning names to void type
749   if (T == Type::VoidTy) {
750     GenerateError("Can't assign name '" + Name + "' to the void type");
751     return false;
752   }
753
754   // Set the type name, checking for conflicts as we do so.
755   bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T);
756
757   if (AlreadyExists) {   // Inserting a name that is already defined???
758     const Type *Existing = CurModule.CurrentModule->getTypeByName(Name);
759     assert(Existing && "Conflict but no matching type?!");
760
761     // There is only one case where this is allowed: when we are refining an
762     // opaque type.  In this case, Existing will be an opaque type.
763     if (const OpaqueType *OpTy = dyn_cast<OpaqueType>(Existing)) {
764       // We ARE replacing an opaque type!
765       const_cast<OpaqueType*>(OpTy)->refineAbstractTypeTo(T);
766       return true;
767     }
768
769     // Otherwise, this is an attempt to redefine a type. That's okay if
770     // the redefinition is identical to the original. This will be so if
771     // Existing and T point to the same Type object. In this one case we
772     // allow the equivalent redefinition.
773     if (Existing == T) return true;  // Yes, it's equal.
774
775     // Any other kind of (non-equivalent) redefinition is an error.
776     GenerateError("Redefinition of type named '" + Name + "' of type '" +
777                    T->getDescription() + "'");
778   }
779
780   return false;
781 }
782
783 //===----------------------------------------------------------------------===//
784 // Code for handling upreferences in type names...
785 //
786
787 // TypeContains - Returns true if Ty directly contains E in it.
788 //
789 static bool TypeContains(const Type *Ty, const Type *E) {
790   return std::find(Ty->subtype_begin(), Ty->subtype_end(),
791                    E) != Ty->subtype_end();
792 }
793
794 namespace {
795   struct UpRefRecord {
796     // NestingLevel - The number of nesting levels that need to be popped before
797     // this type is resolved.
798     unsigned NestingLevel;
799
800     // LastContainedTy - This is the type at the current binding level for the
801     // type.  Every time we reduce the nesting level, this gets updated.
802     const Type *LastContainedTy;
803
804     // UpRefTy - This is the actual opaque type that the upreference is
805     // represented with.
806     OpaqueType *UpRefTy;
807
808     UpRefRecord(unsigned NL, OpaqueType *URTy)
809       : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {}
810   };
811 }
812
813 // UpRefs - A list of the outstanding upreferences that need to be resolved.
814 static std::vector<UpRefRecord> UpRefs;
815
816 /// HandleUpRefs - Every time we finish a new layer of types, this function is
817 /// called.  It loops through the UpRefs vector, which is a list of the
818 /// currently active types.  For each type, if the up reference is contained in
819 /// the newly completed type, we decrement the level count.  When the level
820 /// count reaches zero, the upreferenced type is the type that is passed in:
821 /// thus we can complete the cycle.
822 ///
823 static PATypeHolder HandleUpRefs(const Type *ty) {
824   // If Ty isn't abstract, or if there are no up-references in it, then there is
825   // nothing to resolve here.
826   if (!ty->isAbstract() || UpRefs.empty()) return ty;
827   
828   PATypeHolder Ty(ty);
829   UR_OUT("Type '" << Ty->getDescription() <<
830          "' newly formed.  Resolving upreferences.\n" <<
831          UpRefs.size() << " upreferences active!\n");
832
833   // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
834   // to zero), we resolve them all together before we resolve them to Ty.  At
835   // the end of the loop, if there is anything to resolve to Ty, it will be in
836   // this variable.
837   OpaqueType *TypeToResolve = 0;
838
839   for (unsigned i = 0; i != UpRefs.size(); ++i) {
840     UR_OUT("  UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
841            << UpRefs[i].second->getDescription() << ") = "
842            << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n");
843     if (TypeContains(Ty, UpRefs[i].LastContainedTy)) {
844       // Decrement level of upreference
845       unsigned Level = --UpRefs[i].NestingLevel;
846       UpRefs[i].LastContainedTy = Ty;
847       UR_OUT("  Uplevel Ref Level = " << Level << "\n");
848       if (Level == 0) {                     // Upreference should be resolved!
849         if (!TypeToResolve) {
850           TypeToResolve = UpRefs[i].UpRefTy;
851         } else {
852           UR_OUT("  * Resolving upreference for "
853                  << UpRefs[i].second->getDescription() << "\n";
854                  std::string OldName = UpRefs[i].UpRefTy->getDescription());
855           UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
856           UR_OUT("  * Type '" << OldName << "' refined upreference to: "
857                  << (const void*)Ty << ", " << Ty->getDescription() << "\n");
858         }
859         UpRefs.erase(UpRefs.begin()+i);     // Remove from upreference list...
860         --i;                                // Do not skip the next element...
861       }
862     }
863   }
864
865   if (TypeToResolve) {
866     UR_OUT("  * Resolving upreference for "
867            << UpRefs[i].second->getDescription() << "\n";
868            std::string OldName = TypeToResolve->getDescription());
869     TypeToResolve->refineAbstractTypeTo(Ty);
870   }
871
872   return Ty;
873 }
874
875 //===----------------------------------------------------------------------===//
876 //            RunVMAsmParser - Define an interface to this parser
877 //===----------------------------------------------------------------------===//
878 //
879 static Module* RunParser(Module * M);
880
881 Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
882   set_scan_file(F);
883
884   CurFilename = Filename;
885   return RunParser(new Module(CurFilename));
886 }
887
888 Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
889   set_scan_string(AsmString);
890
891   CurFilename = "from_memory";
892   if (M == NULL) {
893     return RunParser(new Module (CurFilename));
894   } else {
895     return RunParser(M);
896   }
897 }
898
899 %}
900
901 %union {
902   llvm::Module                           *ModuleVal;
903   llvm::Function                         *FunctionVal;
904   llvm::BasicBlock                       *BasicBlockVal;
905   llvm::TerminatorInst                   *TermInstVal;
906   llvm::Instruction                      *InstVal;
907   llvm::Constant                         *ConstVal;
908
909   const llvm::Type                       *PrimType;
910   std::list<llvm::PATypeHolder>          *TypeList;
911   llvm::PATypeHolder                     *TypeVal;
912   llvm::Value                            *ValueVal;
913   std::vector<llvm::Value*>              *ValueList;
914   llvm::ArgListType                      *ArgList;
915   llvm::TypeWithAttrs                     TypeWithAttrs;
916   llvm::TypeWithAttrsList                *TypeWithAttrsList;
917   llvm::ValueRefList                     *ValueRefList;
918
919   // Represent the RHS of PHI node
920   std::list<std::pair<llvm::Value*,
921                       llvm::BasicBlock*> > *PHIList;
922   std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
923   std::vector<llvm::Constant*>           *ConstVector;
924
925   llvm::GlobalValue::LinkageTypes         Linkage;
926   llvm::GlobalValue::VisibilityTypes      Visibility;
927   llvm::FunctionType::ParameterAttributes ParamAttrs;
928   int64_t                           SInt64Val;
929   uint64_t                          UInt64Val;
930   int                               SIntVal;
931   unsigned                          UIntVal;
932   double                            FPVal;
933   bool                              BoolVal;
934
935   char                             *StrVal;   // This memory is strdup'd!
936   llvm::ValID                       ValIDVal; // strdup'd memory maybe!
937
938   llvm::Instruction::BinaryOps      BinaryOpVal;
939   llvm::Instruction::TermOps        TermOpVal;
940   llvm::Instruction::MemoryOps      MemOpVal;
941   llvm::Instruction::CastOps        CastOpVal;
942   llvm::Instruction::OtherOps       OtherOpVal;
943   llvm::ICmpInst::Predicate         IPredicate;
944   llvm::FCmpInst::Predicate         FPredicate;
945 }
946
947 %type <ModuleVal>     Module 
948 %type <FunctionVal>   Function FunctionProto FunctionHeader BasicBlockList
949 %type <BasicBlockVal> BasicBlock InstructionList
950 %type <TermInstVal>   BBTerminatorInst
951 %type <InstVal>       Inst InstVal MemoryInst
952 %type <ConstVal>      ConstVal ConstExpr
953 %type <ConstVector>   ConstVector
954 %type <ArgList>       ArgList ArgListH
955 %type <PHIList>       PHIList
956 %type <ValueRefList>  ValueRefList      // For call param lists & GEP indices
957 %type <ValueList>     IndexList         // For GEP indices
958 %type <TypeList>      TypeListI 
959 %type <TypeWithAttrsList> ArgTypeList ArgTypeListI
960 %type <TypeWithAttrs> ArgType
961 %type <JumpTable>     JumpTable
962 %type <BoolVal>       GlobalType                  // GLOBAL or CONSTANT?
963 %type <BoolVal>       OptVolatile                 // 'volatile' or not
964 %type <BoolVal>       OptTailCall                 // TAIL CALL or plain CALL.
965 %type <BoolVal>       OptSideEffect               // 'sideeffect' or not.
966 %type <Linkage>       GVInternalLinkage GVExternalLinkage
967 %type <Linkage>       FunctionDefineLinkage FunctionDeclareLinkage
968 %type <Visibility>    GVVisibilityStyle
969
970 // ValueRef - Unresolved reference to a definition or BB
971 %type <ValIDVal>      ValueRef ConstValueRef SymbolicValueRef
972 %type <ValueVal>      ResolvedVal            // <type> <valref> pair
973 // Tokens and types for handling constant integer values
974 //
975 // ESINT64VAL - A negative number within long long range
976 %token <SInt64Val> ESINT64VAL
977
978 // EUINT64VAL - A positive number within uns. long long range
979 %token <UInt64Val> EUINT64VAL
980
981 %token  <UIntVal>   LOCALVAL_ID GLOBALVAL_ID  // %123 @123
982 %token  <FPVal>     FPVAL     // Float or Double constant
983
984 // Built in types...
985 %type  <TypeVal> Types ResultTypes
986 %type  <PrimType> IntType FPType PrimType           // Classifications
987 %token <PrimType> VOID INTTYPE 
988 %token <PrimType> FLOAT DOUBLE LABEL
989 %token TYPE
990
991 %token<StrVal> LOCALVAR GLOBALVAR LABELSTR STRINGCONSTANT ATSTRINGCONSTANT
992 %type <StrVal> LocalName OptLocalName OptLocalAssign
993 %type <StrVal> GlobalName OptGlobalAssign
994 %type <UIntVal> OptAlign OptCAlign
995 %type <StrVal> OptSection SectionString
996
997 %token IMPLEMENTATION ZEROINITIALIZER TRUETOK FALSETOK BEGINTOK ENDTOK
998 %token DECLARE DEFINE GLOBAL CONSTANT SECTION VOLATILE
999 %token TO DOTDOTDOT NULL_TOK UNDEF INTERNAL LINKONCE WEAK APPENDING
1000 %token DLLIMPORT DLLEXPORT EXTERN_WEAK
1001 %token OPAQUE EXTERNAL TARGET TRIPLE ALIGN
1002 %token DEPLIBS CALL TAIL ASM_TOK MODULE SIDEEFFECT
1003 %token CC_TOK CCC_TOK FASTCC_TOK COLDCC_TOK X86_STDCALLCC_TOK X86_FASTCALLCC_TOK
1004 %token DATALAYOUT
1005 %type <UIntVal> OptCallingConv
1006 %type <ParamAttrs> OptParamAttrs ParamAttr 
1007 %type <ParamAttrs> OptFuncAttrs  FuncAttr
1008
1009 // Basic Block Terminating Operators
1010 %token <TermOpVal> RET BR SWITCH INVOKE UNWIND UNREACHABLE
1011
1012 // Binary Operators
1013 %type  <BinaryOpVal> ArithmeticOps LogicalOps // Binops Subcatagories
1014 %token <BinaryOpVal> ADD SUB MUL UDIV SDIV FDIV UREM SREM FREM AND OR XOR
1015 %token <BinaryOpVal> SHL LSHR ASHR
1016
1017 %token <OtherOpVal> ICMP FCMP
1018 %type  <IPredicate> IPredicates
1019 %type  <FPredicate> FPredicates
1020 %token  EQ NE SLT SGT SLE SGE ULT UGT ULE UGE 
1021 %token  OEQ ONE OLT OGT OLE OGE ORD UNO UEQ UNE
1022
1023 // Memory Instructions
1024 %token <MemOpVal> MALLOC ALLOCA FREE LOAD STORE GETELEMENTPTR
1025
1026 // Cast Operators
1027 %type <CastOpVal> CastOps
1028 %token <CastOpVal> TRUNC ZEXT SEXT FPTRUNC FPEXT BITCAST
1029 %token <CastOpVal> UITOFP SITOFP FPTOUI FPTOSI INTTOPTR PTRTOINT
1030
1031 // Other Operators
1032 %token <OtherOpVal> PHI_TOK SELECT VAARG
1033 %token <OtherOpVal> EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR
1034
1035 // Function Attributes
1036 %token NORETURN INREG SRET
1037
1038 // Visibility Styles
1039 %token DEFAULT HIDDEN
1040
1041 %start Module
1042 %%
1043
1044
1045 // Operations that are notably excluded from this list include:
1046 // RET, BR, & SWITCH because they end basic blocks and are treated specially.
1047 //
1048 ArithmeticOps: ADD | SUB | MUL | UDIV | SDIV | FDIV | UREM | SREM | FREM;
1049 LogicalOps   : SHL | LSHR | ASHR | AND | OR | XOR;
1050 CastOps      : TRUNC | ZEXT | SEXT | FPTRUNC | FPEXT | BITCAST | 
1051                UITOFP | SITOFP | FPTOUI | FPTOSI | INTTOPTR | PTRTOINT;
1052
1053 IPredicates  
1054   : EQ   { $$ = ICmpInst::ICMP_EQ; }  | NE   { $$ = ICmpInst::ICMP_NE; }
1055   | SLT  { $$ = ICmpInst::ICMP_SLT; } | SGT  { $$ = ICmpInst::ICMP_SGT; }
1056   | SLE  { $$ = ICmpInst::ICMP_SLE; } | SGE  { $$ = ICmpInst::ICMP_SGE; }
1057   | ULT  { $$ = ICmpInst::ICMP_ULT; } | UGT  { $$ = ICmpInst::ICMP_UGT; }
1058   | ULE  { $$ = ICmpInst::ICMP_ULE; } | UGE  { $$ = ICmpInst::ICMP_UGE; } 
1059   ;
1060
1061 FPredicates  
1062   : OEQ  { $$ = FCmpInst::FCMP_OEQ; } | ONE  { $$ = FCmpInst::FCMP_ONE; }
1063   | OLT  { $$ = FCmpInst::FCMP_OLT; } | OGT  { $$ = FCmpInst::FCMP_OGT; }
1064   | OLE  { $$ = FCmpInst::FCMP_OLE; } | OGE  { $$ = FCmpInst::FCMP_OGE; }
1065   | ORD  { $$ = FCmpInst::FCMP_ORD; } | UNO  { $$ = FCmpInst::FCMP_UNO; }
1066   | UEQ  { $$ = FCmpInst::FCMP_UEQ; } | UNE  { $$ = FCmpInst::FCMP_UNE; }
1067   | ULT  { $$ = FCmpInst::FCMP_ULT; } | UGT  { $$ = FCmpInst::FCMP_UGT; }
1068   | ULE  { $$ = FCmpInst::FCMP_ULE; } | UGE  { $$ = FCmpInst::FCMP_UGE; }
1069   | TRUETOK { $$ = FCmpInst::FCMP_TRUE; }
1070   | FALSETOK { $$ = FCmpInst::FCMP_FALSE; }
1071   ;
1072
1073 // These are some types that allow classification if we only want a particular 
1074 // thing... for example, only a signed, unsigned, or integral type.
1075 IntType :  INTTYPE;
1076 FPType   : FLOAT | DOUBLE;
1077
1078 LocalName : LOCALVAR | STRINGCONSTANT;
1079 OptLocalName : LocalName | /*empty*/ { $$ = 0; };
1080
1081 /// OptLocalAssign - Value producing statements have an optional assignment
1082 /// component.
1083 OptLocalAssign : LocalName '=' {
1084     $$ = $1;
1085     CHECK_FOR_ERROR
1086   }
1087   | /*empty*/ {
1088     $$ = 0;
1089     CHECK_FOR_ERROR
1090   };
1091
1092 GlobalName : GLOBALVAR | ATSTRINGCONSTANT;
1093
1094 OptGlobalAssign : GlobalName '=' {
1095     $$ = $1;
1096     CHECK_FOR_ERROR
1097   }
1098   | /*empty*/ {
1099     $$ = 0;
1100     CHECK_FOR_ERROR
1101   };
1102
1103 GVInternalLinkage 
1104   : INTERNAL    { $$ = GlobalValue::InternalLinkage; } 
1105   | WEAK        { $$ = GlobalValue::WeakLinkage; } 
1106   | LINKONCE    { $$ = GlobalValue::LinkOnceLinkage; }
1107   | APPENDING   { $$ = GlobalValue::AppendingLinkage; }
1108   | DLLEXPORT   { $$ = GlobalValue::DLLExportLinkage; } 
1109   ;
1110
1111 GVExternalLinkage
1112   : DLLIMPORT   { $$ = GlobalValue::DLLImportLinkage; }
1113   | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; }
1114   | EXTERNAL    { $$ = GlobalValue::ExternalLinkage; }
1115   ;
1116
1117 GVVisibilityStyle
1118   : /*empty*/ { $$ = GlobalValue::DefaultVisibility; }
1119   | HIDDEN    { $$ = GlobalValue::HiddenVisibility;  }
1120   ;
1121
1122 FunctionDeclareLinkage
1123   : /*empty*/   { $$ = GlobalValue::ExternalLinkage; }
1124   | DLLIMPORT   { $$ = GlobalValue::DLLImportLinkage; } 
1125   | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; }
1126   ;
1127   
1128 FunctionDefineLinkage 
1129   : /*empty*/   { $$ = GlobalValue::ExternalLinkage; }
1130   | INTERNAL    { $$ = GlobalValue::InternalLinkage; }
1131   | LINKONCE    { $$ = GlobalValue::LinkOnceLinkage; }
1132   | WEAK        { $$ = GlobalValue::WeakLinkage; }
1133   | DLLEXPORT   { $$ = GlobalValue::DLLExportLinkage; } 
1134   ; 
1135
1136 OptCallingConv : /*empty*/          { $$ = CallingConv::C; } |
1137                  CCC_TOK            { $$ = CallingConv::C; } |
1138                  FASTCC_TOK         { $$ = CallingConv::Fast; } |
1139                  COLDCC_TOK         { $$ = CallingConv::Cold; } |
1140                  X86_STDCALLCC_TOK  { $$ = CallingConv::X86_StdCall; } |
1141                  X86_FASTCALLCC_TOK { $$ = CallingConv::X86_FastCall; } |
1142                  CC_TOK EUINT64VAL  {
1143                    if ((unsigned)$2 != $2)
1144                      GEN_ERROR("Calling conv too large");
1145                    $$ = $2;
1146                   CHECK_FOR_ERROR
1147                  };
1148
1149 ParamAttr     : ZEXT  { $$ = FunctionType::ZExtAttribute;      }
1150               | SEXT  { $$ = FunctionType::SExtAttribute;      }
1151               | INREG { $$ = FunctionType::InRegAttribute;     }
1152               | SRET  { $$ = FunctionType::StructRetAttribute; }
1153               ;
1154
1155 OptParamAttrs : /* empty */  { $$ = FunctionType::NoAttributeSet; }
1156               | OptParamAttrs ParamAttr {
1157                 $$ = FunctionType::ParameterAttributes($1 | $2);
1158               }
1159               ;
1160
1161 FuncAttr      : NORETURN { $$ = FunctionType::NoReturnAttribute; }
1162               | ParamAttr
1163               ;
1164
1165 OptFuncAttrs  : /* empty */ { $$ = FunctionType::NoAttributeSet; }
1166               | OptFuncAttrs FuncAttr {
1167                 $$ = FunctionType::ParameterAttributes($1 | $2);
1168               }
1169               ;
1170
1171 // OptAlign/OptCAlign - An optional alignment, and an optional alignment with
1172 // a comma before it.
1173 OptAlign : /*empty*/        { $$ = 0; } |
1174            ALIGN EUINT64VAL {
1175   $$ = $2;
1176   if ($$ != 0 && !isPowerOf2_32($$))
1177     GEN_ERROR("Alignment must be a power of two");
1178   CHECK_FOR_ERROR
1179 };
1180 OptCAlign : /*empty*/            { $$ = 0; } |
1181             ',' ALIGN EUINT64VAL {
1182   $$ = $3;
1183   if ($$ != 0 && !isPowerOf2_32($$))
1184     GEN_ERROR("Alignment must be a power of two");
1185   CHECK_FOR_ERROR
1186 };
1187
1188
1189 SectionString : SECTION STRINGCONSTANT {
1190   for (unsigned i = 0, e = strlen($2); i != e; ++i)
1191     if ($2[i] == '"' || $2[i] == '\\')
1192       GEN_ERROR("Invalid character in section name");
1193   $$ = $2;
1194   CHECK_FOR_ERROR
1195 };
1196
1197 OptSection : /*empty*/ { $$ = 0; } |
1198              SectionString { $$ = $1; };
1199
1200 // GlobalVarAttributes - Used to pass the attributes string on a global.  CurGV
1201 // is set to be the global we are processing.
1202 //
1203 GlobalVarAttributes : /* empty */ {} |
1204                      ',' GlobalVarAttribute GlobalVarAttributes {};
1205 GlobalVarAttribute : SectionString {
1206     CurGV->setSection($1);
1207     free($1);
1208     CHECK_FOR_ERROR
1209   } 
1210   | ALIGN EUINT64VAL {
1211     if ($2 != 0 && !isPowerOf2_32($2))
1212       GEN_ERROR("Alignment must be a power of two");
1213     CurGV->setAlignment($2);
1214     CHECK_FOR_ERROR
1215   };
1216
1217 //===----------------------------------------------------------------------===//
1218 // Types includes all predefined types... except void, because it can only be
1219 // used in specific contexts (function returning void for example).  
1220
1221 // Derived types are added later...
1222 //
1223 PrimType : INTTYPE | FLOAT | DOUBLE | LABEL ;
1224
1225 Types 
1226   : OPAQUE {
1227     $$ = new PATypeHolder(OpaqueType::get());
1228     CHECK_FOR_ERROR
1229   }
1230   | PrimType {
1231     $$ = new PATypeHolder($1);
1232     CHECK_FOR_ERROR
1233   }
1234   | Types '*' {                             // Pointer type?
1235     if (*$1 == Type::LabelTy)
1236       GEN_ERROR("Cannot form a pointer to a basic block");
1237     $$ = new PATypeHolder(HandleUpRefs(PointerType::get(*$1)));
1238     delete $1;
1239     CHECK_FOR_ERROR
1240   }
1241   | SymbolicValueRef {            // Named types are also simple types...
1242     const Type* tmp = getTypeVal($1);
1243     CHECK_FOR_ERROR
1244     $$ = new PATypeHolder(tmp);
1245   }
1246   | '\\' EUINT64VAL {                   // Type UpReference
1247     if ($2 > (uint64_t)~0U) GEN_ERROR("Value out of range");
1248     OpaqueType *OT = OpaqueType::get();        // Use temporary placeholder
1249     UpRefs.push_back(UpRefRecord((unsigned)$2, OT));  // Add to vector...
1250     $$ = new PATypeHolder(OT);
1251     UR_OUT("New Upreference!\n");
1252     CHECK_FOR_ERROR
1253   }
1254   | Types '(' ArgTypeListI ')' OptFuncAttrs {
1255     std::vector<const Type*> Params;
1256     std::vector<FunctionType::ParameterAttributes> Attrs;
1257     Attrs.push_back($5);
1258     for (TypeWithAttrsList::iterator I=$3->begin(), E=$3->end(); I != E; ++I) {
1259       Params.push_back(I->Ty->get());
1260       if (I->Ty->get() != Type::VoidTy)
1261         Attrs.push_back(I->Attrs);
1262     }
1263     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
1264     if (isVarArg) Params.pop_back();
1265
1266     FunctionType *FT = FunctionType::get(*$1, Params, isVarArg, Attrs);
1267     delete $3;   // Delete the argument list
1268     delete $1;   // Delete the return type handle
1269     $$ = new PATypeHolder(HandleUpRefs(FT)); 
1270     CHECK_FOR_ERROR
1271   }
1272   | VOID '(' ArgTypeListI ')' OptFuncAttrs {
1273     std::vector<const Type*> Params;
1274     std::vector<FunctionType::ParameterAttributes> Attrs;
1275     Attrs.push_back($5);
1276     for (TypeWithAttrsList::iterator I=$3->begin(), E=$3->end(); I != E; ++I) {
1277       Params.push_back(I->Ty->get());
1278       if (I->Ty->get() != Type::VoidTy)
1279         Attrs.push_back(I->Attrs);
1280     }
1281     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
1282     if (isVarArg) Params.pop_back();
1283
1284     FunctionType *FT = FunctionType::get($1, Params, isVarArg, Attrs);
1285     delete $3;      // Delete the argument list
1286     $$ = new PATypeHolder(HandleUpRefs(FT)); 
1287     CHECK_FOR_ERROR
1288   }
1289
1290   | '[' EUINT64VAL 'x' Types ']' {          // Sized array type?
1291     $$ = new PATypeHolder(HandleUpRefs(ArrayType::get(*$4, (unsigned)$2)));
1292     delete $4;
1293     CHECK_FOR_ERROR
1294   }
1295   | '<' EUINT64VAL 'x' Types '>' {          // Packed array type?
1296      const llvm::Type* ElemTy = $4->get();
1297      if ((unsigned)$2 != $2)
1298         GEN_ERROR("Unsigned result not equal to signed result");
1299      if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger())
1300         GEN_ERROR("Element type of a VectorType must be primitive");
1301      if (!isPowerOf2_32($2))
1302        GEN_ERROR("Vector length should be a power of 2");
1303      $$ = new PATypeHolder(HandleUpRefs(VectorType::get(*$4, (unsigned)$2)));
1304      delete $4;
1305      CHECK_FOR_ERROR
1306   }
1307   | '{' TypeListI '}' {                        // Structure type?
1308     std::vector<const Type*> Elements;
1309     for (std::list<llvm::PATypeHolder>::iterator I = $2->begin(),
1310            E = $2->end(); I != E; ++I)
1311       Elements.push_back(*I);
1312
1313     $$ = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
1314     delete $2;
1315     CHECK_FOR_ERROR
1316   }
1317   | '{' '}' {                                  // Empty structure type?
1318     $$ = new PATypeHolder(StructType::get(std::vector<const Type*>()));
1319     CHECK_FOR_ERROR
1320   }
1321   | '<' '{' TypeListI '}' '>' {
1322     std::vector<const Type*> Elements;
1323     for (std::list<llvm::PATypeHolder>::iterator I = $3->begin(),
1324            E = $3->end(); I != E; ++I)
1325       Elements.push_back(*I);
1326
1327     $$ = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
1328     delete $3;
1329     CHECK_FOR_ERROR
1330   }
1331   | '<' '{' '}' '>' {                         // Empty structure type?
1332     $$ = new PATypeHolder(StructType::get(std::vector<const Type*>(), true));
1333     CHECK_FOR_ERROR
1334   }
1335   ;
1336
1337 ArgType 
1338   : Types OptParamAttrs { 
1339     $$.Ty = $1; 
1340     $$.Attrs = $2; 
1341   }
1342   ;
1343
1344 ResultTypes
1345   : Types {
1346     if (!UpRefs.empty())
1347       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1348     if (!(*$1)->isFirstClassType())
1349       GEN_ERROR("LLVM functions cannot return aggregate types");
1350     $$ = $1;
1351   }
1352   | VOID {
1353     $$ = new PATypeHolder(Type::VoidTy);
1354   }
1355   ;
1356
1357 ArgTypeList : ArgType {
1358     $$ = new TypeWithAttrsList();
1359     $$->push_back($1);
1360     CHECK_FOR_ERROR
1361   }
1362   | ArgTypeList ',' ArgType {
1363     ($$=$1)->push_back($3);
1364     CHECK_FOR_ERROR
1365   }
1366   ;
1367
1368 ArgTypeListI 
1369   : ArgTypeList
1370   | ArgTypeList ',' DOTDOTDOT {
1371     $$=$1;
1372     TypeWithAttrs TWA; TWA.Attrs = FunctionType::NoAttributeSet;
1373     TWA.Ty = new PATypeHolder(Type::VoidTy);
1374     $$->push_back(TWA);
1375     CHECK_FOR_ERROR
1376   }
1377   | DOTDOTDOT {
1378     $$ = new TypeWithAttrsList;
1379     TypeWithAttrs TWA; TWA.Attrs = FunctionType::NoAttributeSet;
1380     TWA.Ty = new PATypeHolder(Type::VoidTy);
1381     $$->push_back(TWA);
1382     CHECK_FOR_ERROR
1383   }
1384   | /*empty*/ {
1385     $$ = new TypeWithAttrsList();
1386     CHECK_FOR_ERROR
1387   };
1388
1389 // TypeList - Used for struct declarations and as a basis for function type 
1390 // declaration type lists
1391 //
1392 TypeListI : Types {
1393     $$ = new std::list<PATypeHolder>();
1394     $$->push_back(*$1); delete $1;
1395     CHECK_FOR_ERROR
1396   }
1397   | TypeListI ',' Types {
1398     ($$=$1)->push_back(*$3); delete $3;
1399     CHECK_FOR_ERROR
1400   };
1401
1402 // ConstVal - The various declarations that go into the constant pool.  This
1403 // production is used ONLY to represent constants that show up AFTER a 'const',
1404 // 'constant' or 'global' token at global scope.  Constants that can be inlined
1405 // into other expressions (such as integers and constexprs) are handled by the
1406 // ResolvedVal, ValueRef and ConstValueRef productions.
1407 //
1408 ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
1409     if (!UpRefs.empty())
1410       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1411     const ArrayType *ATy = dyn_cast<ArrayType>($1->get());
1412     if (ATy == 0)
1413       GEN_ERROR("Cannot make array constant with type: '" + 
1414                      (*$1)->getDescription() + "'");
1415     const Type *ETy = ATy->getElementType();
1416     int NumElements = ATy->getNumElements();
1417
1418     // Verify that we have the correct size...
1419     if (NumElements != -1 && NumElements != (int)$3->size())
1420       GEN_ERROR("Type mismatch: constant sized array initialized with " +
1421                      utostr($3->size()) +  " arguments, but has size of " + 
1422                      itostr(NumElements) + "");
1423
1424     // Verify all elements are correct type!
1425     for (unsigned i = 0; i < $3->size(); i++) {
1426       if (ETy != (*$3)[i]->getType())
1427         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
1428                        ETy->getDescription() +"' as required!\nIt is of type '"+
1429                        (*$3)[i]->getType()->getDescription() + "'.");
1430     }
1431
1432     $$ = ConstantArray::get(ATy, *$3);
1433     delete $1; delete $3;
1434     CHECK_FOR_ERROR
1435   }
1436   | Types '[' ']' {
1437     if (!UpRefs.empty())
1438       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1439     const ArrayType *ATy = dyn_cast<ArrayType>($1->get());
1440     if (ATy == 0)
1441       GEN_ERROR("Cannot make array constant with type: '" + 
1442                      (*$1)->getDescription() + "'");
1443
1444     int NumElements = ATy->getNumElements();
1445     if (NumElements != -1 && NumElements != 0) 
1446       GEN_ERROR("Type mismatch: constant sized array initialized with 0"
1447                      " arguments, but has size of " + itostr(NumElements) +"");
1448     $$ = ConstantArray::get(ATy, std::vector<Constant*>());
1449     delete $1;
1450     CHECK_FOR_ERROR
1451   }
1452   | Types 'c' STRINGCONSTANT {
1453     if (!UpRefs.empty())
1454       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1455     const ArrayType *ATy = dyn_cast<ArrayType>($1->get());
1456     if (ATy == 0)
1457       GEN_ERROR("Cannot make array constant with type: '" + 
1458                      (*$1)->getDescription() + "'");
1459
1460     int NumElements = ATy->getNumElements();
1461     const Type *ETy = ATy->getElementType();
1462     char *EndStr = UnEscapeLexed($3, true);
1463     if (NumElements != -1 && NumElements != (EndStr-$3))
1464       GEN_ERROR("Can't build string constant of size " + 
1465                      itostr((int)(EndStr-$3)) +
1466                      " when array has size " + itostr(NumElements) + "");
1467     std::vector<Constant*> Vals;
1468     if (ETy == Type::Int8Ty) {
1469       for (unsigned char *C = (unsigned char *)$3; 
1470         C != (unsigned char*)EndStr; ++C)
1471       Vals.push_back(ConstantInt::get(ETy, *C));
1472     } else {
1473       free($3);
1474       GEN_ERROR("Cannot build string arrays of non byte sized elements");
1475     }
1476     free($3);
1477     $$ = ConstantArray::get(ATy, Vals);
1478     delete $1;
1479     CHECK_FOR_ERROR
1480   }
1481   | Types '<' ConstVector '>' { // Nonempty unsized arr
1482     if (!UpRefs.empty())
1483       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1484     const VectorType *PTy = dyn_cast<VectorType>($1->get());
1485     if (PTy == 0)
1486       GEN_ERROR("Cannot make packed constant with type: '" + 
1487                      (*$1)->getDescription() + "'");
1488     const Type *ETy = PTy->getElementType();
1489     int NumElements = PTy->getNumElements();
1490
1491     // Verify that we have the correct size...
1492     if (NumElements != -1 && NumElements != (int)$3->size())
1493       GEN_ERROR("Type mismatch: constant sized packed initialized with " +
1494                      utostr($3->size()) +  " arguments, but has size of " + 
1495                      itostr(NumElements) + "");
1496
1497     // Verify all elements are correct type!
1498     for (unsigned i = 0; i < $3->size(); i++) {
1499       if (ETy != (*$3)[i]->getType())
1500         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
1501            ETy->getDescription() +"' as required!\nIt is of type '"+
1502            (*$3)[i]->getType()->getDescription() + "'.");
1503     }
1504
1505     $$ = ConstantVector::get(PTy, *$3);
1506     delete $1; delete $3;
1507     CHECK_FOR_ERROR
1508   }
1509   | Types '{' ConstVector '}' {
1510     const StructType *STy = dyn_cast<StructType>($1->get());
1511     if (STy == 0)
1512       GEN_ERROR("Cannot make struct constant with type: '" + 
1513                      (*$1)->getDescription() + "'");
1514
1515     if ($3->size() != STy->getNumContainedTypes())
1516       GEN_ERROR("Illegal number of initializers for structure type");
1517
1518     // Check to ensure that constants are compatible with the type initializer!
1519     for (unsigned i = 0, e = $3->size(); i != e; ++i)
1520       if ((*$3)[i]->getType() != STy->getElementType(i))
1521         GEN_ERROR("Expected type '" +
1522                        STy->getElementType(i)->getDescription() +
1523                        "' for element #" + utostr(i) +
1524                        " of structure initializer");
1525
1526     // Check to ensure that Type is not packed
1527     if (STy->isPacked())
1528       GEN_ERROR("Unpacked Initializer to packed type '" + STy->getDescription() + "'");
1529
1530     $$ = ConstantStruct::get(STy, *$3);
1531     delete $1; delete $3;
1532     CHECK_FOR_ERROR
1533   }
1534   | Types '{' '}' {
1535     if (!UpRefs.empty())
1536       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1537     const StructType *STy = dyn_cast<StructType>($1->get());
1538     if (STy == 0)
1539       GEN_ERROR("Cannot make struct constant with type: '" + 
1540                      (*$1)->getDescription() + "'");
1541
1542     if (STy->getNumContainedTypes() != 0)
1543       GEN_ERROR("Illegal number of initializers for structure type");
1544
1545     // Check to ensure that Type is not packed
1546     if (STy->isPacked())
1547       GEN_ERROR("Unpacked Initializer to packed type '" + STy->getDescription() + "'");
1548
1549     $$ = ConstantStruct::get(STy, std::vector<Constant*>());
1550     delete $1;
1551     CHECK_FOR_ERROR
1552   }
1553   | Types '<' '{' ConstVector '}' '>' {
1554     const StructType *STy = dyn_cast<StructType>($1->get());
1555     if (STy == 0)
1556       GEN_ERROR("Cannot make struct constant with type: '" + 
1557                      (*$1)->getDescription() + "'");
1558
1559     if ($4->size() != STy->getNumContainedTypes())
1560       GEN_ERROR("Illegal number of initializers for structure type");
1561
1562     // Check to ensure that constants are compatible with the type initializer!
1563     for (unsigned i = 0, e = $4->size(); i != e; ++i)
1564       if ((*$4)[i]->getType() != STy->getElementType(i))
1565         GEN_ERROR("Expected type '" +
1566                        STy->getElementType(i)->getDescription() +
1567                        "' for element #" + utostr(i) +
1568                        " of structure initializer");
1569
1570     // Check to ensure that Type is packed
1571     if (!STy->isPacked())
1572       GEN_ERROR("Packed Initializer to unpacked type '" + STy->getDescription() + "'");
1573
1574     $$ = ConstantStruct::get(STy, *$4);
1575     delete $1; delete $4;
1576     CHECK_FOR_ERROR
1577   }
1578   | Types '<' '{' '}' '>' {
1579     if (!UpRefs.empty())
1580       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1581     const StructType *STy = dyn_cast<StructType>($1->get());
1582     if (STy == 0)
1583       GEN_ERROR("Cannot make struct constant with type: '" + 
1584                      (*$1)->getDescription() + "'");
1585
1586     if (STy->getNumContainedTypes() != 0)
1587       GEN_ERROR("Illegal number of initializers for structure type");
1588
1589     // Check to ensure that Type is packed
1590     if (!STy->isPacked())
1591       GEN_ERROR("Packed Initializer to unpacked type '" + STy->getDescription() + "'");
1592
1593     $$ = ConstantStruct::get(STy, std::vector<Constant*>());
1594     delete $1;
1595     CHECK_FOR_ERROR
1596   }
1597   | Types NULL_TOK {
1598     if (!UpRefs.empty())
1599       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1600     const PointerType *PTy = dyn_cast<PointerType>($1->get());
1601     if (PTy == 0)
1602       GEN_ERROR("Cannot make null pointer constant with type: '" + 
1603                      (*$1)->getDescription() + "'");
1604
1605     $$ = ConstantPointerNull::get(PTy);
1606     delete $1;
1607     CHECK_FOR_ERROR
1608   }
1609   | Types UNDEF {
1610     if (!UpRefs.empty())
1611       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1612     $$ = UndefValue::get($1->get());
1613     delete $1;
1614     CHECK_FOR_ERROR
1615   }
1616   | Types SymbolicValueRef {
1617     if (!UpRefs.empty())
1618       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1619     const PointerType *Ty = dyn_cast<PointerType>($1->get());
1620     if (Ty == 0)
1621       GEN_ERROR("Global const reference must be a pointer type");
1622
1623     // ConstExprs can exist in the body of a function, thus creating
1624     // GlobalValues whenever they refer to a variable.  Because we are in
1625     // the context of a function, getValNonImprovising will search the functions
1626     // symbol table instead of the module symbol table for the global symbol,
1627     // which throws things all off.  To get around this, we just tell
1628     // getValNonImprovising that we are at global scope here.
1629     //
1630     Function *SavedCurFn = CurFun.CurrentFunction;
1631     CurFun.CurrentFunction = 0;
1632
1633     Value *V = getValNonImprovising(Ty, $2);
1634     CHECK_FOR_ERROR
1635
1636     CurFun.CurrentFunction = SavedCurFn;
1637
1638     // If this is an initializer for a constant pointer, which is referencing a
1639     // (currently) undefined variable, create a stub now that shall be replaced
1640     // in the future with the right type of variable.
1641     //
1642     if (V == 0) {
1643       assert(isa<PointerType>(Ty) && "Globals may only be used as pointers!");
1644       const PointerType *PT = cast<PointerType>(Ty);
1645
1646       // First check to see if the forward references value is already created!
1647       PerModuleInfo::GlobalRefsType::iterator I =
1648         CurModule.GlobalRefs.find(std::make_pair(PT, $2));
1649     
1650       if (I != CurModule.GlobalRefs.end()) {
1651         V = I->second;             // Placeholder already exists, use it...
1652         $2.destroy();
1653       } else {
1654         std::string Name;
1655         if ($2.Type == ValID::GlobalName)
1656           Name = $2.Name;
1657         else if ($2.Type != ValID::GlobalID)
1658           GEN_ERROR("Invalid reference to global");
1659
1660         // Create the forward referenced global.
1661         GlobalValue *GV;
1662         if (const FunctionType *FTy = 
1663                  dyn_cast<FunctionType>(PT->getElementType())) {
1664           GV = new Function(FTy, GlobalValue::ExternalLinkage, Name,
1665                             CurModule.CurrentModule);
1666         } else {
1667           GV = new GlobalVariable(PT->getElementType(), false,
1668                                   GlobalValue::ExternalLinkage, 0,
1669                                   Name, CurModule.CurrentModule);
1670         }
1671
1672         // Keep track of the fact that we have a forward ref to recycle it
1673         CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, $2), GV));
1674         V = GV;
1675       }
1676     }
1677
1678     $$ = cast<GlobalValue>(V);
1679     delete $1;            // Free the type handle
1680     CHECK_FOR_ERROR
1681   }
1682   | Types ConstExpr {
1683     if (!UpRefs.empty())
1684       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1685     if ($1->get() != $2->getType())
1686       GEN_ERROR("Mismatched types for constant expression: " + 
1687         (*$1)->getDescription() + " and " + $2->getType()->getDescription());
1688     $$ = $2;
1689     delete $1;
1690     CHECK_FOR_ERROR
1691   }
1692   | Types ZEROINITIALIZER {
1693     if (!UpRefs.empty())
1694       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
1695     const Type *Ty = $1->get();
1696     if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
1697       GEN_ERROR("Cannot create a null initialized value of this type");
1698     $$ = Constant::getNullValue(Ty);
1699     delete $1;
1700     CHECK_FOR_ERROR
1701   }
1702   | IntType ESINT64VAL {      // integral constants
1703     if (!ConstantInt::isValueValidForType($1, $2))
1704       GEN_ERROR("Constant value doesn't fit in type");
1705     $$ = ConstantInt::get($1, $2);
1706     CHECK_FOR_ERROR
1707   }
1708   | IntType EUINT64VAL {      // integral constants
1709     if (!ConstantInt::isValueValidForType($1, $2))
1710       GEN_ERROR("Constant value doesn't fit in type");
1711     $$ = ConstantInt::get($1, $2);
1712     CHECK_FOR_ERROR
1713   }
1714   | INTTYPE TRUETOK {                      // Boolean constants
1715     assert(cast<IntegerType>($1)->getBitWidth() == 1 && "Not Bool?");
1716     $$ = ConstantInt::getTrue();
1717     CHECK_FOR_ERROR
1718   }
1719   | INTTYPE FALSETOK {                     // Boolean constants
1720     assert(cast<IntegerType>($1)->getBitWidth() == 1 && "Not Bool?");
1721     $$ = ConstantInt::getFalse();
1722     CHECK_FOR_ERROR
1723   }
1724   | FPType FPVAL {                   // Float & Double constants
1725     if (!ConstantFP::isValueValidForType($1, $2))
1726       GEN_ERROR("Floating point constant invalid for type");
1727     $$ = ConstantFP::get($1, $2);
1728     CHECK_FOR_ERROR
1729   };
1730
1731
1732 ConstExpr: CastOps '(' ConstVal TO Types ')' {
1733     if (!UpRefs.empty())
1734       GEN_ERROR("Invalid upreference in type: " + (*$5)->getDescription());
1735     Constant *Val = $3;
1736     const Type *DestTy = $5->get();
1737     if (!CastInst::castIsValid($1, $3, DestTy))
1738       GEN_ERROR("invalid cast opcode for cast from '" +
1739                 Val->getType()->getDescription() + "' to '" +
1740                 DestTy->getDescription() + "'"); 
1741     $$ = ConstantExpr::getCast($1, $3, DestTy);
1742     delete $5;
1743   }
1744   | GETELEMENTPTR '(' ConstVal IndexList ')' {
1745     if (!isa<PointerType>($3->getType()))
1746       GEN_ERROR("GetElementPtr requires a pointer operand");
1747
1748     const Type *IdxTy =
1749       GetElementPtrInst::getIndexedType($3->getType(), &(*$4)[0], $4->size(),
1750                                         true);
1751     if (!IdxTy)
1752       GEN_ERROR("Index list invalid for constant getelementptr");
1753
1754     SmallVector<Constant*, 8> IdxVec;
1755     for (unsigned i = 0, e = $4->size(); i != e; ++i)
1756       if (Constant *C = dyn_cast<Constant>((*$4)[i]))
1757         IdxVec.push_back(C);
1758       else
1759         GEN_ERROR("Indices to constant getelementptr must be constants");
1760
1761     delete $4;
1762
1763     $$ = ConstantExpr::getGetElementPtr($3, &IdxVec[0], IdxVec.size());
1764     CHECK_FOR_ERROR
1765   }
1766   | SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
1767     if ($3->getType() != Type::Int1Ty)
1768       GEN_ERROR("Select condition must be of boolean type");
1769     if ($5->getType() != $7->getType())
1770       GEN_ERROR("Select operand types must match");
1771     $$ = ConstantExpr::getSelect($3, $5, $7);
1772     CHECK_FOR_ERROR
1773   }
1774   | ArithmeticOps '(' ConstVal ',' ConstVal ')' {
1775     if ($3->getType() != $5->getType())
1776       GEN_ERROR("Binary operator types must match");
1777     CHECK_FOR_ERROR;
1778     $$ = ConstantExpr::get($1, $3, $5);
1779   }
1780   | LogicalOps '(' ConstVal ',' ConstVal ')' {
1781     if ($3->getType() != $5->getType())
1782       GEN_ERROR("Logical operator types must match");
1783     if (!$3->getType()->isInteger()) {
1784       if (Instruction::isShift($1) || !isa<VectorType>($3->getType()) || 
1785           !cast<VectorType>($3->getType())->getElementType()->isInteger())
1786         GEN_ERROR("Logical operator requires integral operands");
1787     }
1788     $$ = ConstantExpr::get($1, $3, $5);
1789     CHECK_FOR_ERROR
1790   }
1791   | ICMP IPredicates '(' ConstVal ',' ConstVal ')' {
1792     if ($4->getType() != $6->getType())
1793       GEN_ERROR("icmp operand types must match");
1794     $$ = ConstantExpr::getICmp($2, $4, $6);
1795   }
1796   | FCMP FPredicates '(' ConstVal ',' ConstVal ')' {
1797     if ($4->getType() != $6->getType())
1798       GEN_ERROR("fcmp operand types must match");
1799     $$ = ConstantExpr::getFCmp($2, $4, $6);
1800   }
1801   | EXTRACTELEMENT '(' ConstVal ',' ConstVal ')' {
1802     if (!ExtractElementInst::isValidOperands($3, $5))
1803       GEN_ERROR("Invalid extractelement operands");
1804     $$ = ConstantExpr::getExtractElement($3, $5);
1805     CHECK_FOR_ERROR
1806   }
1807   | INSERTELEMENT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
1808     if (!InsertElementInst::isValidOperands($3, $5, $7))
1809       GEN_ERROR("Invalid insertelement operands");
1810     $$ = ConstantExpr::getInsertElement($3, $5, $7);
1811     CHECK_FOR_ERROR
1812   }
1813   | SHUFFLEVECTOR '(' ConstVal ',' ConstVal ',' ConstVal ')' {
1814     if (!ShuffleVectorInst::isValidOperands($3, $5, $7))
1815       GEN_ERROR("Invalid shufflevector operands");
1816     $$ = ConstantExpr::getShuffleVector($3, $5, $7);
1817     CHECK_FOR_ERROR
1818   };
1819
1820
1821 // ConstVector - A list of comma separated constants.
1822 ConstVector : ConstVector ',' ConstVal {
1823     ($$ = $1)->push_back($3);
1824     CHECK_FOR_ERROR
1825   }
1826   | ConstVal {
1827     $$ = new std::vector<Constant*>();
1828     $$->push_back($1);
1829     CHECK_FOR_ERROR
1830   };
1831
1832
1833 // GlobalType - Match either GLOBAL or CONSTANT for global declarations...
1834 GlobalType : GLOBAL { $$ = false; } | CONSTANT { $$ = true; };
1835
1836
1837 //===----------------------------------------------------------------------===//
1838 //                             Rules to match Modules
1839 //===----------------------------------------------------------------------===//
1840
1841 // Module rule: Capture the result of parsing the whole file into a result
1842 // variable...
1843 //
1844 Module 
1845   : DefinitionList {
1846     $$ = ParserResult = CurModule.CurrentModule;
1847     CurModule.ModuleDone();
1848     CHECK_FOR_ERROR;
1849   }
1850   | /*empty*/ {
1851     $$ = ParserResult = CurModule.CurrentModule;
1852     CurModule.ModuleDone();
1853     CHECK_FOR_ERROR;
1854   }
1855   ;
1856
1857 DefinitionList
1858   : Definition
1859   | DefinitionList Definition
1860   ;
1861
1862 Definition 
1863   : DEFINE { CurFun.isDeclare = false; } Function {
1864     CurFun.FunctionDone();
1865     CHECK_FOR_ERROR
1866   }
1867   | DECLARE { CurFun.isDeclare = true; } FunctionProto {
1868     CHECK_FOR_ERROR
1869   }
1870   | MODULE ASM_TOK AsmBlock {
1871     CHECK_FOR_ERROR
1872   }  
1873   | IMPLEMENTATION {
1874     // Emit an error if there are any unresolved types left.
1875     if (!CurModule.LateResolveTypes.empty()) {
1876       const ValID &DID = CurModule.LateResolveTypes.begin()->first;
1877       if (DID.Type == ValID::LocalName) {
1878         GEN_ERROR("Reference to an undefined type: '"+DID.getName() + "'");
1879       } else {
1880         GEN_ERROR("Reference to an undefined type: #" + itostr(DID.Num));
1881       }
1882     }
1883     CHECK_FOR_ERROR
1884   }
1885   | OptLocalAssign TYPE Types {
1886     if (!UpRefs.empty())
1887       GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription());
1888     // Eagerly resolve types.  This is not an optimization, this is a
1889     // requirement that is due to the fact that we could have this:
1890     //
1891     // %list = type { %list * }
1892     // %list = type { %list * }    ; repeated type decl
1893     //
1894     // If types are not resolved eagerly, then the two types will not be
1895     // determined to be the same type!
1896     //
1897     ResolveTypeTo($1, *$3);
1898
1899     if (!setTypeName(*$3, $1) && !$1) {
1900       CHECK_FOR_ERROR
1901       // If this is a named type that is not a redefinition, add it to the slot
1902       // table.
1903       CurModule.Types.push_back(*$3);
1904     }
1905
1906     delete $3;
1907     CHECK_FOR_ERROR
1908   }
1909   | OptLocalAssign TYPE VOID {
1910     ResolveTypeTo($1, $3);
1911
1912     if (!setTypeName($3, $1) && !$1) {
1913       CHECK_FOR_ERROR
1914       // If this is a named type that is not a redefinition, add it to the slot
1915       // table.
1916       CurModule.Types.push_back($3);
1917     }
1918     CHECK_FOR_ERROR
1919   }
1920   | OptGlobalAssign GVVisibilityStyle GlobalType ConstVal { 
1921     /* "Externally Visible" Linkage */
1922     if ($4 == 0) 
1923       GEN_ERROR("Global value initializer is not a constant");
1924     CurGV = ParseGlobalVariable($1, GlobalValue::ExternalLinkage,
1925                                 $2, $3, $4->getType(), $4);
1926     CHECK_FOR_ERROR
1927   } GlobalVarAttributes {
1928     CurGV = 0;
1929   }
1930   | OptGlobalAssign GVInternalLinkage GVVisibilityStyle GlobalType ConstVal {
1931     if ($5 == 0) 
1932       GEN_ERROR("Global value initializer is not a constant");
1933     CurGV = ParseGlobalVariable($1, $2, $3, $4, $5->getType(), $5);
1934     CHECK_FOR_ERROR
1935   } GlobalVarAttributes {
1936     CurGV = 0;
1937   }
1938   | OptGlobalAssign GVExternalLinkage GVVisibilityStyle GlobalType Types {
1939     if (!UpRefs.empty())
1940       GEN_ERROR("Invalid upreference in type: " + (*$5)->getDescription());
1941     CurGV = ParseGlobalVariable($1, $2, $3, $4, *$5, 0);
1942     CHECK_FOR_ERROR
1943     delete $5;
1944   } GlobalVarAttributes {
1945     CurGV = 0;
1946     CHECK_FOR_ERROR
1947   }
1948   | TARGET TargetDefinition { 
1949     CHECK_FOR_ERROR
1950   }
1951   | DEPLIBS '=' LibrariesDefinition {
1952     CHECK_FOR_ERROR
1953   }
1954   ;
1955
1956
1957 AsmBlock : STRINGCONSTANT {
1958   const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
1959   char *EndStr = UnEscapeLexed($1, true);
1960   std::string NewAsm($1, EndStr);
1961   free($1);
1962
1963   if (AsmSoFar.empty())
1964     CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
1965   else
1966     CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
1967   CHECK_FOR_ERROR
1968 };
1969
1970 TargetDefinition : TRIPLE '=' STRINGCONSTANT {
1971     CurModule.CurrentModule->setTargetTriple($3);
1972     free($3);
1973   }
1974   | DATALAYOUT '=' STRINGCONSTANT {
1975     CurModule.CurrentModule->setDataLayout($3);
1976     free($3);
1977   };
1978
1979 LibrariesDefinition : '[' LibList ']';
1980
1981 LibList : LibList ',' STRINGCONSTANT {
1982           CurModule.CurrentModule->addLibrary($3);
1983           free($3);
1984           CHECK_FOR_ERROR
1985         }
1986         | STRINGCONSTANT {
1987           CurModule.CurrentModule->addLibrary($1);
1988           free($1);
1989           CHECK_FOR_ERROR
1990         }
1991         | /* empty: end of list */ {
1992           CHECK_FOR_ERROR
1993         }
1994         ;
1995
1996 //===----------------------------------------------------------------------===//
1997 //                       Rules to match Function Headers
1998 //===----------------------------------------------------------------------===//
1999
2000 ArgListH : ArgListH ',' Types OptParamAttrs OptLocalName {
2001     if (!UpRefs.empty())
2002       GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription());
2003     if (*$3 == Type::VoidTy)
2004       GEN_ERROR("void typed arguments are invalid");
2005     ArgListEntry E; E.Attrs = $4; E.Ty = $3; E.Name = $5;
2006     $$ = $1;
2007     $1->push_back(E);
2008     CHECK_FOR_ERROR
2009   }
2010   | Types OptParamAttrs OptLocalName {
2011     if (!UpRefs.empty())
2012       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
2013     if (*$1 == Type::VoidTy)
2014       GEN_ERROR("void typed arguments are invalid");
2015     ArgListEntry E; E.Attrs = $2; E.Ty = $1; E.Name = $3;
2016     $$ = new ArgListType;
2017     $$->push_back(E);
2018     CHECK_FOR_ERROR
2019   };
2020
2021 ArgList : ArgListH {
2022     $$ = $1;
2023     CHECK_FOR_ERROR
2024   }
2025   | ArgListH ',' DOTDOTDOT {
2026     $$ = $1;
2027     struct ArgListEntry E;
2028     E.Ty = new PATypeHolder(Type::VoidTy);
2029     E.Name = 0;
2030     E.Attrs = FunctionType::NoAttributeSet;
2031     $$->push_back(E);
2032     CHECK_FOR_ERROR
2033   }
2034   | DOTDOTDOT {
2035     $$ = new ArgListType;
2036     struct ArgListEntry E;
2037     E.Ty = new PATypeHolder(Type::VoidTy);
2038     E.Name = 0;
2039     E.Attrs = FunctionType::NoAttributeSet;
2040     $$->push_back(E);
2041     CHECK_FOR_ERROR
2042   }
2043   | /* empty */ {
2044     $$ = 0;
2045     CHECK_FOR_ERROR
2046   };
2047
2048 FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')' 
2049                   OptFuncAttrs OptSection OptAlign {
2050   UnEscapeLexed($3);
2051   std::string FunctionName($3);
2052   free($3);  // Free strdup'd memory!
2053   
2054   // Check the function result for abstractness if this is a define. We should
2055   // have no abstract types at this point
2056   if (!CurFun.isDeclare && CurModule.TypeIsUnresolved($2))
2057     GEN_ERROR("Reference to abstract result: "+ $2->get()->getDescription());
2058
2059   std::vector<const Type*> ParamTypeList;
2060   std::vector<FunctionType::ParameterAttributes> ParamAttrs;
2061   ParamAttrs.push_back($7);
2062   if ($5) {   // If there are arguments...
2063     for (ArgListType::iterator I = $5->begin(); I != $5->end(); ++I) {
2064       const Type* Ty = I->Ty->get();
2065       if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(I->Ty))
2066         GEN_ERROR("Reference to abstract argument: " + Ty->getDescription());
2067       ParamTypeList.push_back(Ty);
2068       if (Ty != Type::VoidTy)
2069         ParamAttrs.push_back(I->Attrs);
2070     }
2071   }
2072
2073   bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
2074   if (isVarArg) ParamTypeList.pop_back();
2075
2076   FunctionType *FT = FunctionType::get(*$2, ParamTypeList, isVarArg,
2077                                        ParamAttrs);
2078   const PointerType *PFT = PointerType::get(FT);
2079   delete $2;
2080
2081   ValID ID;
2082   if (!FunctionName.empty()) {
2083     ID = ValID::createGlobalName((char*)FunctionName.c_str());
2084   } else {
2085     ID = ValID::createGlobalID(CurModule.Values[PFT].size());
2086   }
2087
2088   Function *Fn = 0;
2089   // See if this function was forward referenced.  If so, recycle the object.
2090   if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
2091     // Move the function to the end of the list, from whereever it was 
2092     // previously inserted.
2093     Fn = cast<Function>(FWRef);
2094     CurModule.CurrentModule->getFunctionList().remove(Fn);
2095     CurModule.CurrentModule->getFunctionList().push_back(Fn);
2096   } else if (!FunctionName.empty() &&     // Merge with an earlier prototype?
2097              (Fn = CurModule.CurrentModule->getFunction(FunctionName))) {
2098     if (Fn->getFunctionType() != FT ) {
2099       // The existing function doesn't have the same type. This is an overload
2100       // error.
2101       GEN_ERROR("Overload of function '" + FunctionName + "' not permitted.");
2102     } else if (!CurFun.isDeclare && !Fn->isDeclaration()) {
2103       // Neither the existing or the current function is a declaration and they
2104       // have the same name and same type. Clearly this is a redefinition.
2105       GEN_ERROR("Redefinition of function '" + FunctionName + "'");
2106     } if (Fn->isDeclaration()) {
2107       // Make sure to strip off any argument names so we can't get conflicts.
2108       for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
2109            AI != AE; ++AI)
2110         AI->setName("");
2111     }
2112   } else  {  // Not already defined?
2113     Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
2114                       CurModule.CurrentModule);
2115
2116     InsertValue(Fn, CurModule.Values);
2117   }
2118
2119   CurFun.FunctionStart(Fn);
2120
2121   if (CurFun.isDeclare) {
2122     // If we have declaration, always overwrite linkage.  This will allow us to
2123     // correctly handle cases, when pointer to function is passed as argument to
2124     // another function.
2125     Fn->setLinkage(CurFun.Linkage);
2126     Fn->setVisibility(CurFun.Visibility);
2127   }
2128   Fn->setCallingConv($1);
2129   Fn->setAlignment($9);
2130   if ($8) {
2131     Fn->setSection($8);
2132     free($8);
2133   }
2134
2135   // Add all of the arguments we parsed to the function...
2136   if ($5) {                     // Is null if empty...
2137     if (isVarArg) {  // Nuke the last entry
2138       assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0 &&
2139              "Not a varargs marker!");
2140       delete $5->back().Ty;
2141       $5->pop_back();  // Delete the last entry
2142     }
2143     Function::arg_iterator ArgIt = Fn->arg_begin();
2144     Function::arg_iterator ArgEnd = Fn->arg_end();
2145     unsigned Idx = 1;
2146     for (ArgListType::iterator I = $5->begin(); 
2147          I != $5->end() && ArgIt != ArgEnd; ++I, ++ArgIt) {
2148       delete I->Ty;                          // Delete the typeholder...
2149       setValueName(ArgIt, I->Name);          // Insert arg into symtab...
2150       CHECK_FOR_ERROR
2151       InsertValue(ArgIt);
2152       Idx++;
2153     }
2154
2155     delete $5;                     // We're now done with the argument list
2156   }
2157   CHECK_FOR_ERROR
2158 };
2159
2160 BEGIN : BEGINTOK | '{';                // Allow BEGIN or '{' to start a function
2161
2162 FunctionHeader : FunctionDefineLinkage GVVisibilityStyle FunctionHeaderH BEGIN {
2163   $$ = CurFun.CurrentFunction;
2164
2165   // Make sure that we keep track of the linkage type even if there was a
2166   // previous "declare".
2167   $$->setLinkage($1);
2168   $$->setVisibility($2);
2169 };
2170
2171 END : ENDTOK | '}';                    // Allow end of '}' to end a function
2172
2173 Function : BasicBlockList END {
2174   $$ = $1;
2175   CHECK_FOR_ERROR
2176 };
2177
2178 FunctionProto : FunctionDeclareLinkage GVVisibilityStyle FunctionHeaderH {
2179     CurFun.CurrentFunction->setLinkage($1);
2180     CurFun.CurrentFunction->setVisibility($2);
2181     $$ = CurFun.CurrentFunction;
2182     CurFun.FunctionDone();
2183     CHECK_FOR_ERROR
2184   };
2185
2186 //===----------------------------------------------------------------------===//
2187 //                        Rules to match Basic Blocks
2188 //===----------------------------------------------------------------------===//
2189
2190 OptSideEffect : /* empty */ {
2191     $$ = false;
2192     CHECK_FOR_ERROR
2193   }
2194   | SIDEEFFECT {
2195     $$ = true;
2196     CHECK_FOR_ERROR
2197   };
2198
2199 ConstValueRef : ESINT64VAL {    // A reference to a direct constant
2200     $$ = ValID::create($1);
2201     CHECK_FOR_ERROR
2202   }
2203   | EUINT64VAL {
2204     $$ = ValID::create($1);
2205     CHECK_FOR_ERROR
2206   }
2207   | FPVAL {                     // Perhaps it's an FP constant?
2208     $$ = ValID::create($1);
2209     CHECK_FOR_ERROR
2210   }
2211   | TRUETOK {
2212     $$ = ValID::create(ConstantInt::getTrue());
2213     CHECK_FOR_ERROR
2214   } 
2215   | FALSETOK {
2216     $$ = ValID::create(ConstantInt::getFalse());
2217     CHECK_FOR_ERROR
2218   }
2219   | NULL_TOK {
2220     $$ = ValID::createNull();
2221     CHECK_FOR_ERROR
2222   }
2223   | UNDEF {
2224     $$ = ValID::createUndef();
2225     CHECK_FOR_ERROR
2226   }
2227   | ZEROINITIALIZER {     // A vector zero constant.
2228     $$ = ValID::createZeroInit();
2229     CHECK_FOR_ERROR
2230   }
2231   | '<' ConstVector '>' { // Nonempty unsized packed vector
2232     const Type *ETy = (*$2)[0]->getType();
2233     int NumElements = $2->size(); 
2234     
2235     VectorType* pt = VectorType::get(ETy, NumElements);
2236     PATypeHolder* PTy = new PATypeHolder(
2237                                          HandleUpRefs(
2238                                             VectorType::get(
2239                                                 ETy, 
2240                                                 NumElements)
2241                                             )
2242                                          );
2243     
2244     // Verify all elements are correct type!
2245     for (unsigned i = 0; i < $2->size(); i++) {
2246       if (ETy != (*$2)[i]->getType())
2247         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
2248                      ETy->getDescription() +"' as required!\nIt is of type '" +
2249                      (*$2)[i]->getType()->getDescription() + "'.");
2250     }
2251
2252     $$ = ValID::create(ConstantVector::get(pt, *$2));
2253     delete PTy; delete $2;
2254     CHECK_FOR_ERROR
2255   }
2256   | ConstExpr {
2257     $$ = ValID::create($1);
2258     CHECK_FOR_ERROR
2259   }
2260   | ASM_TOK OptSideEffect STRINGCONSTANT ',' STRINGCONSTANT {
2261     char *End = UnEscapeLexed($3, true);
2262     std::string AsmStr = std::string($3, End);
2263     End = UnEscapeLexed($5, true);
2264     std::string Constraints = std::string($5, End);
2265     $$ = ValID::createInlineAsm(AsmStr, Constraints, $2);
2266     free($3);
2267     free($5);
2268     CHECK_FOR_ERROR
2269   };
2270
2271 // SymbolicValueRef - Reference to one of two ways of symbolically refering to
2272 // another value.
2273 //
2274 SymbolicValueRef : LOCALVAL_ID {  // Is it an integer reference...?
2275     $$ = ValID::createLocalID($1);
2276     CHECK_FOR_ERROR
2277   }
2278   | GLOBALVAL_ID {
2279     $$ = ValID::createGlobalID($1);
2280     CHECK_FOR_ERROR
2281   }
2282   | LocalName {                   // Is it a named reference...?
2283     $$ = ValID::createLocalName($1);
2284     CHECK_FOR_ERROR
2285   }
2286   | GlobalName {                   // Is it a named reference...?
2287     $$ = ValID::createGlobalName($1);
2288     CHECK_FOR_ERROR
2289   };
2290
2291 // ValueRef - A reference to a definition... either constant or symbolic
2292 ValueRef : SymbolicValueRef | ConstValueRef;
2293
2294
2295 // ResolvedVal - a <type> <value> pair.  This is used only in cases where the
2296 // type immediately preceeds the value reference, and allows complex constant
2297 // pool references (for things like: 'ret [2 x int] [ int 12, int 42]')
2298 ResolvedVal : Types ValueRef {
2299     if (!UpRefs.empty())
2300       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
2301     $$ = getVal(*$1, $2); 
2302     delete $1;
2303     CHECK_FOR_ERROR
2304   }
2305   ;
2306
2307 BasicBlockList : BasicBlockList BasicBlock {
2308     $$ = $1;
2309     CHECK_FOR_ERROR
2310   }
2311   | FunctionHeader BasicBlock { // Do not allow functions with 0 basic blocks   
2312     $$ = $1;
2313     CHECK_FOR_ERROR
2314   };
2315
2316
2317 // Basic blocks are terminated by branching instructions: 
2318 // br, br/cc, switch, ret
2319 //
2320 BasicBlock : InstructionList OptLocalAssign BBTerminatorInst  {
2321     setValueName($3, $2);
2322     CHECK_FOR_ERROR
2323     InsertValue($3);
2324     $1->getInstList().push_back($3);
2325     InsertValue($1);
2326     $$ = $1;
2327     CHECK_FOR_ERROR
2328   };
2329
2330 InstructionList : InstructionList Inst {
2331     if (CastInst *CI1 = dyn_cast<CastInst>($2))
2332       if (CastInst *CI2 = dyn_cast<CastInst>(CI1->getOperand(0)))
2333         if (CI2->getParent() == 0)
2334           $1->getInstList().push_back(CI2);
2335     $1->getInstList().push_back($2);
2336     $$ = $1;
2337     CHECK_FOR_ERROR
2338   }
2339   | /* empty */ {
2340     $$ = getBBVal(ValID::createLocalID(CurFun.NextBBNum++), true);
2341     CHECK_FOR_ERROR
2342
2343     // Make sure to move the basic block to the correct location in the
2344     // function, instead of leaving it inserted wherever it was first
2345     // referenced.
2346     Function::BasicBlockListType &BBL = 
2347       CurFun.CurrentFunction->getBasicBlockList();
2348     BBL.splice(BBL.end(), BBL, $$);
2349     CHECK_FOR_ERROR
2350   }
2351   | LABELSTR {
2352     $$ = getBBVal(ValID::createLocalName($1), true);
2353     CHECK_FOR_ERROR
2354
2355     // Make sure to move the basic block to the correct location in the
2356     // function, instead of leaving it inserted wherever it was first
2357     // referenced.
2358     Function::BasicBlockListType &BBL = 
2359       CurFun.CurrentFunction->getBasicBlockList();
2360     BBL.splice(BBL.end(), BBL, $$);
2361     CHECK_FOR_ERROR
2362   };
2363
2364 BBTerminatorInst : RET ResolvedVal {              // Return with a result...
2365     $$ = new ReturnInst($2);
2366     CHECK_FOR_ERROR
2367   }
2368   | RET VOID {                                       // Return with no result...
2369     $$ = new ReturnInst();
2370     CHECK_FOR_ERROR
2371   }
2372   | BR LABEL ValueRef {                         // Unconditional Branch...
2373     BasicBlock* tmpBB = getBBVal($3);
2374     CHECK_FOR_ERROR
2375     $$ = new BranchInst(tmpBB);
2376   }                                                  // Conditional Branch...
2377   | BR INTTYPE ValueRef ',' LABEL ValueRef ',' LABEL ValueRef {  
2378     assert(cast<IntegerType>($2)->getBitWidth() == 1 && "Not Bool?");
2379     BasicBlock* tmpBBA = getBBVal($6);
2380     CHECK_FOR_ERROR
2381     BasicBlock* tmpBBB = getBBVal($9);
2382     CHECK_FOR_ERROR
2383     Value* tmpVal = getVal(Type::Int1Ty, $3);
2384     CHECK_FOR_ERROR
2385     $$ = new BranchInst(tmpBBA, tmpBBB, tmpVal);
2386   }
2387   | SWITCH IntType ValueRef ',' LABEL ValueRef '[' JumpTable ']' {
2388     Value* tmpVal = getVal($2, $3);
2389     CHECK_FOR_ERROR
2390     BasicBlock* tmpBB = getBBVal($6);
2391     CHECK_FOR_ERROR
2392     SwitchInst *S = new SwitchInst(tmpVal, tmpBB, $8->size());
2393     $$ = S;
2394
2395     std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = $8->begin(),
2396       E = $8->end();
2397     for (; I != E; ++I) {
2398       if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
2399           S->addCase(CI, I->second);
2400       else
2401         GEN_ERROR("Switch case is constant, but not a simple integer");
2402     }
2403     delete $8;
2404     CHECK_FOR_ERROR
2405   }
2406   | SWITCH IntType ValueRef ',' LABEL ValueRef '[' ']' {
2407     Value* tmpVal = getVal($2, $3);
2408     CHECK_FOR_ERROR
2409     BasicBlock* tmpBB = getBBVal($6);
2410     CHECK_FOR_ERROR
2411     SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
2412     $$ = S;
2413     CHECK_FOR_ERROR
2414   }
2415   | INVOKE OptCallingConv ResultTypes ValueRef '(' ValueRefList ')' OptFuncAttrs
2416     TO LABEL ValueRef UNWIND LABEL ValueRef {
2417
2418     // Handle the short syntax
2419     const PointerType *PFTy = 0;
2420     const FunctionType *Ty = 0;
2421     if (!(PFTy = dyn_cast<PointerType>($3->get())) ||
2422         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
2423       // Pull out the types of all of the arguments...
2424       std::vector<const Type*> ParamTypes;
2425       FunctionType::ParamAttrsList ParamAttrs;
2426       ParamAttrs.push_back($8);
2427       for (ValueRefList::iterator I = $6->begin(), E = $6->end(); I != E; ++I) {
2428         const Type *Ty = I->Val->getType();
2429         if (Ty == Type::VoidTy)
2430           GEN_ERROR("Short call syntax cannot be used with varargs");
2431         ParamTypes.push_back(Ty);
2432         ParamAttrs.push_back(I->Attrs);
2433       }
2434
2435       Ty = FunctionType::get($3->get(), ParamTypes, false, ParamAttrs);
2436       PFTy = PointerType::get(Ty);
2437     }
2438
2439     Value *V = getVal(PFTy, $4);   // Get the function we're calling...
2440     CHECK_FOR_ERROR
2441     BasicBlock *Normal = getBBVal($11);
2442     CHECK_FOR_ERROR
2443     BasicBlock *Except = getBBVal($14);
2444     CHECK_FOR_ERROR
2445
2446     // Check the arguments
2447     ValueList Args;
2448     if ($6->empty()) {                                   // Has no arguments?
2449       // Make sure no arguments is a good thing!
2450       if (Ty->getNumParams() != 0)
2451         GEN_ERROR("No arguments passed to a function that "
2452                        "expects arguments");
2453     } else {                                     // Has arguments?
2454       // Loop through FunctionType's arguments and ensure they are specified
2455       // correctly!
2456       FunctionType::param_iterator I = Ty->param_begin();
2457       FunctionType::param_iterator E = Ty->param_end();
2458       ValueRefList::iterator ArgI = $6->begin(), ArgE = $6->end();
2459
2460       for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
2461         if (ArgI->Val->getType() != *I)
2462           GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
2463                          (*I)->getDescription() + "'");
2464         Args.push_back(ArgI->Val);
2465       }
2466
2467       if (Ty->isVarArg()) {
2468         if (I == E)
2469           for (; ArgI != ArgE; ++ArgI)
2470             Args.push_back(ArgI->Val); // push the remaining varargs
2471       } else if (I != E || ArgI != ArgE)
2472         GEN_ERROR("Invalid number of parameters detected");
2473     }
2474
2475     // Create the InvokeInst
2476     InvokeInst *II = new InvokeInst(V, Normal, Except, &Args[0], Args.size());
2477     II->setCallingConv($2);
2478     $$ = II;
2479     delete $6;
2480     CHECK_FOR_ERROR
2481   }
2482   | UNWIND {
2483     $$ = new UnwindInst();
2484     CHECK_FOR_ERROR
2485   }
2486   | UNREACHABLE {
2487     $$ = new UnreachableInst();
2488     CHECK_FOR_ERROR
2489   };
2490
2491
2492
2493 JumpTable : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
2494     $$ = $1;
2495     Constant *V = cast<Constant>(getValNonImprovising($2, $3));
2496     CHECK_FOR_ERROR
2497     if (V == 0)
2498       GEN_ERROR("May only switch on a constant pool value");
2499
2500     BasicBlock* tmpBB = getBBVal($6);
2501     CHECK_FOR_ERROR
2502     $$->push_back(std::make_pair(V, tmpBB));
2503   }
2504   | IntType ConstValueRef ',' LABEL ValueRef {
2505     $$ = new std::vector<std::pair<Constant*, BasicBlock*> >();
2506     Constant *V = cast<Constant>(getValNonImprovising($1, $2));
2507     CHECK_FOR_ERROR
2508
2509     if (V == 0)
2510       GEN_ERROR("May only switch on a constant pool value");
2511
2512     BasicBlock* tmpBB = getBBVal($5);
2513     CHECK_FOR_ERROR
2514     $$->push_back(std::make_pair(V, tmpBB)); 
2515   };
2516
2517 Inst : OptLocalAssign InstVal {
2518     // Is this definition named?? if so, assign the name...
2519     setValueName($2, $1);
2520     CHECK_FOR_ERROR
2521     InsertValue($2);
2522     $$ = $2;
2523     CHECK_FOR_ERROR
2524   };
2525
2526
2527 PHIList : Types '[' ValueRef ',' ValueRef ']' {    // Used for PHI nodes
2528     if (!UpRefs.empty())
2529       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
2530     $$ = new std::list<std::pair<Value*, BasicBlock*> >();
2531     Value* tmpVal = getVal(*$1, $3);
2532     CHECK_FOR_ERROR
2533     BasicBlock* tmpBB = getBBVal($5);
2534     CHECK_FOR_ERROR
2535     $$->push_back(std::make_pair(tmpVal, tmpBB));
2536     delete $1;
2537   }
2538   | PHIList ',' '[' ValueRef ',' ValueRef ']' {
2539     $$ = $1;
2540     Value* tmpVal = getVal($1->front().first->getType(), $4);
2541     CHECK_FOR_ERROR
2542     BasicBlock* tmpBB = getBBVal($6);
2543     CHECK_FOR_ERROR
2544     $1->push_back(std::make_pair(tmpVal, tmpBB));
2545   };
2546
2547
2548 ValueRefList : Types ValueRef OptParamAttrs {    
2549     if (!UpRefs.empty())
2550       GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
2551     // Used for call and invoke instructions
2552     $$ = new ValueRefList();
2553     ValueRefListEntry E; E.Attrs = $3; E.Val = getVal($1->get(), $2);
2554     $$->push_back(E);
2555   }
2556   | ValueRefList ',' Types ValueRef OptParamAttrs {
2557     if (!UpRefs.empty())
2558       GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription());
2559     $$ = $1;
2560     ValueRefListEntry E; E.Attrs = $5; E.Val = getVal($3->get(), $4);
2561     $$->push_back(E);
2562     CHECK_FOR_ERROR
2563   }
2564   | /*empty*/ { $$ = new ValueRefList(); };
2565
2566 IndexList       // Used for gep instructions and constant expressions
2567   : /*empty*/ { $$ = new std::vector<Value*>(); }
2568   | IndexList ',' ResolvedVal {
2569     $$ = $1;
2570     $$->push_back($3);
2571     CHECK_FOR_ERROR
2572   }
2573   ;
2574
2575 OptTailCall : TAIL CALL {
2576     $$ = true;
2577     CHECK_FOR_ERROR
2578   }
2579   | CALL {
2580     $$ = false;
2581     CHECK_FOR_ERROR
2582   };
2583
2584 InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
2585     if (!UpRefs.empty())
2586       GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription());
2587     if (!(*$2)->isInteger() && !(*$2)->isFloatingPoint() && 
2588         !isa<VectorType>((*$2).get()))
2589       GEN_ERROR(
2590         "Arithmetic operator requires integer, FP, or packed operands");
2591     if (isa<VectorType>((*$2).get()) && 
2592         ($1 == Instruction::URem || 
2593          $1 == Instruction::SRem ||
2594          $1 == Instruction::FRem))
2595       GEN_ERROR("Remainder not supported on packed types");
2596     Value* val1 = getVal(*$2, $3); 
2597     CHECK_FOR_ERROR
2598     Value* val2 = getVal(*$2, $5);
2599     CHECK_FOR_ERROR
2600     $$ = BinaryOperator::create($1, val1, val2);
2601     if ($$ == 0)
2602       GEN_ERROR("binary operator returned null");
2603     delete $2;
2604   }
2605   | LogicalOps Types ValueRef ',' ValueRef {
2606     if (!UpRefs.empty())
2607       GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription());
2608     if (!(*$2)->isInteger()) {
2609       if (Instruction::isShift($1) || !isa<VectorType>($2->get()) ||
2610           !cast<VectorType>($2->get())->getElementType()->isInteger())
2611         GEN_ERROR("Logical operator requires integral operands");
2612     }
2613     Value* tmpVal1 = getVal(*$2, $3);
2614     CHECK_FOR_ERROR
2615     Value* tmpVal2 = getVal(*$2, $5);
2616     CHECK_FOR_ERROR
2617     $$ = BinaryOperator::create($1, tmpVal1, tmpVal2);
2618     if ($$ == 0)
2619       GEN_ERROR("binary operator returned null");
2620     delete $2;
2621   }
2622   | ICMP IPredicates Types ValueRef ',' ValueRef  {
2623     if (!UpRefs.empty())
2624       GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription());
2625     if (isa<VectorType>((*$3).get()))
2626       GEN_ERROR("Packed types not supported by icmp instruction");
2627     Value* tmpVal1 = getVal(*$3, $4);
2628     CHECK_FOR_ERROR
2629     Value* tmpVal2 = getVal(*$3, $6);
2630     CHECK_FOR_ERROR
2631     $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2);
2632     if ($$ == 0)
2633       GEN_ERROR("icmp operator returned null");
2634   }
2635   | FCMP FPredicates Types ValueRef ',' ValueRef  {
2636     if (!UpRefs.empty())
2637       GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription());
2638     if (isa<VectorType>((*$3).get()))
2639       GEN_ERROR("Packed types not supported by fcmp instruction");
2640     Value* tmpVal1 = getVal(*$3, $4);
2641     CHECK_FOR_ERROR
2642     Value* tmpVal2 = getVal(*$3, $6);
2643     CHECK_FOR_ERROR
2644     $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2);
2645     if ($$ == 0)
2646       GEN_ERROR("fcmp operator returned null");
2647   }
2648   | CastOps ResolvedVal TO Types {
2649     if (!UpRefs.empty())
2650       GEN_ERROR("Invalid upreference in type: " + (*$4)->getDescription());
2651     Value* Val = $2;
2652     const Type* DestTy = $4->get();
2653     if (!CastInst::castIsValid($1, Val, DestTy))
2654       GEN_ERROR("invalid cast opcode for cast from '" +
2655                 Val->getType()->getDescription() + "' to '" +
2656                 DestTy->getDescription() + "'"); 
2657     $$ = CastInst::create($1, Val, DestTy);
2658     delete $4;
2659   }
2660   | SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
2661     if ($2->getType() != Type::Int1Ty)
2662       GEN_ERROR("select condition must be boolean");
2663     if ($4->getType() != $6->getType())
2664       GEN_ERROR("select value types should match");
2665     $$ = new SelectInst($2, $4, $6);
2666     CHECK_FOR_ERROR
2667   }
2668   | VAARG ResolvedVal ',' Types {
2669     if (!UpRefs.empty())
2670       GEN_ERROR("Invalid upreference in type: " + (*$4)->getDescription());
2671     $$ = new VAArgInst($2, *$4);
2672     delete $4;
2673     CHECK_FOR_ERROR
2674   }
2675   | EXTRACTELEMENT ResolvedVal ',' ResolvedVal {
2676     if (!ExtractElementInst::isValidOperands($2, $4))
2677       GEN_ERROR("Invalid extractelement operands");
2678     $$ = new ExtractElementInst($2, $4);
2679     CHECK_FOR_ERROR
2680   }
2681   | INSERTELEMENT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
2682     if (!InsertElementInst::isValidOperands($2, $4, $6))
2683       GEN_ERROR("Invalid insertelement operands");
2684     $$ = new InsertElementInst($2, $4, $6);
2685     CHECK_FOR_ERROR
2686   }
2687   | SHUFFLEVECTOR ResolvedVal ',' ResolvedVal ',' ResolvedVal {
2688     if (!ShuffleVectorInst::isValidOperands($2, $4, $6))
2689       GEN_ERROR("Invalid shufflevector operands");
2690     $$ = new ShuffleVectorInst($2, $4, $6);
2691     CHECK_FOR_ERROR
2692   }
2693   | PHI_TOK PHIList {
2694     const Type *Ty = $2->front().first->getType();
2695     if (!Ty->isFirstClassType())
2696       GEN_ERROR("PHI node operands must be of first class type");
2697     $$ = new PHINode(Ty);
2698     ((PHINode*)$$)->reserveOperandSpace($2->size());
2699     while ($2->begin() != $2->end()) {
2700       if ($2->front().first->getType() != Ty) 
2701         GEN_ERROR("All elements of a PHI node must be of the same type");
2702       cast<PHINode>($$)->addIncoming($2->front().first, $2->front().second);
2703       $2->pop_front();
2704     }
2705     delete $2;  // Free the list...
2706     CHECK_FOR_ERROR
2707   }
2708   | OptTailCall OptCallingConv ResultTypes ValueRef '(' ValueRefList ')' 
2709     OptFuncAttrs {
2710
2711     // Handle the short syntax
2712     const PointerType *PFTy = 0;
2713     const FunctionType *Ty = 0;
2714     if (!(PFTy = dyn_cast<PointerType>($3->get())) ||
2715         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
2716       // Pull out the types of all of the arguments...
2717       std::vector<const Type*> ParamTypes;
2718       FunctionType::ParamAttrsList ParamAttrs;
2719       ParamAttrs.push_back($8);
2720       for (ValueRefList::iterator I = $6->begin(), E = $6->end(); I != E; ++I) {
2721         const Type *Ty = I->Val->getType();
2722         if (Ty == Type::VoidTy)
2723           GEN_ERROR("Short call syntax cannot be used with varargs");
2724         ParamTypes.push_back(Ty);
2725         ParamAttrs.push_back(I->Attrs);
2726       }
2727
2728       Ty = FunctionType::get($3->get(), ParamTypes, false, ParamAttrs);
2729       PFTy = PointerType::get(Ty);
2730     }
2731
2732     Value *V = getVal(PFTy, $4);   // Get the function we're calling...
2733     CHECK_FOR_ERROR
2734
2735     // Check the arguments 
2736     ValueList Args;
2737     if ($6->empty()) {                                   // Has no arguments?
2738       // Make sure no arguments is a good thing!
2739       if (Ty->getNumParams() != 0)
2740         GEN_ERROR("No arguments passed to a function that "
2741                        "expects arguments");
2742     } else {                                     // Has arguments?
2743       // Loop through FunctionType's arguments and ensure they are specified
2744       // correctly!
2745       //
2746       FunctionType::param_iterator I = Ty->param_begin();
2747       FunctionType::param_iterator E = Ty->param_end();
2748       ValueRefList::iterator ArgI = $6->begin(), ArgE = $6->end();
2749
2750       for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
2751         if (ArgI->Val->getType() != *I)
2752           GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
2753                          (*I)->getDescription() + "'");
2754         Args.push_back(ArgI->Val);
2755       }
2756       if (Ty->isVarArg()) {
2757         if (I == E)
2758           for (; ArgI != ArgE; ++ArgI)
2759             Args.push_back(ArgI->Val); // push the remaining varargs
2760       } else if (I != E || ArgI != ArgE)
2761         GEN_ERROR("Invalid number of parameters detected");
2762     }
2763     // Create the call node
2764     CallInst *CI = new CallInst(V, &Args[0], Args.size());
2765     CI->setTailCall($1);
2766     CI->setCallingConv($2);
2767     $$ = CI;
2768     delete $6;
2769     delete $3;
2770     CHECK_FOR_ERROR
2771   }
2772   | MemoryInst {
2773     $$ = $1;
2774     CHECK_FOR_ERROR
2775   };
2776
2777 OptVolatile : VOLATILE {
2778     $$ = true;
2779     CHECK_FOR_ERROR
2780   }
2781   | /* empty */ {
2782     $$ = false;
2783     CHECK_FOR_ERROR
2784   };
2785
2786
2787
2788 MemoryInst : MALLOC Types OptCAlign {
2789     if (!UpRefs.empty())
2790       GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription());
2791     $$ = new MallocInst(*$2, 0, $3);
2792     delete $2;
2793     CHECK_FOR_ERROR
2794   }
2795   | MALLOC Types ',' INTTYPE ValueRef OptCAlign {
2796     if (!UpRefs.empty())
2797       GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription());
2798     Value* tmpVal = getVal($4, $5);
2799     CHECK_FOR_ERROR
2800     $$ = new MallocInst(*$2, tmpVal, $6);
2801     delete $2;
2802   }
2803   | ALLOCA Types OptCAlign {
2804     if (!UpRefs.empty())
2805       GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription());
2806     $$ = new AllocaInst(*$2, 0, $3);
2807     delete $2;
2808     CHECK_FOR_ERROR
2809   }
2810   | ALLOCA Types ',' INTTYPE ValueRef OptCAlign {
2811     if (!UpRefs.empty())
2812       GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription());
2813     Value* tmpVal = getVal($4, $5);
2814     CHECK_FOR_ERROR
2815     $$ = new AllocaInst(*$2, tmpVal, $6);
2816     delete $2;
2817   }
2818   | FREE ResolvedVal {
2819     if (!isa<PointerType>($2->getType()))
2820       GEN_ERROR("Trying to free nonpointer type " + 
2821                      $2->getType()->getDescription() + "");
2822     $$ = new FreeInst($2);
2823     CHECK_FOR_ERROR
2824   }
2825
2826   | OptVolatile LOAD Types ValueRef {
2827     if (!UpRefs.empty())
2828       GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription());
2829     if (!isa<PointerType>($3->get()))
2830       GEN_ERROR("Can't load from nonpointer type: " +
2831                      (*$3)->getDescription());
2832     if (!cast<PointerType>($3->get())->getElementType()->isFirstClassType())
2833       GEN_ERROR("Can't load from pointer of non-first-class type: " +
2834                      (*$3)->getDescription());
2835     Value* tmpVal = getVal(*$3, $4);
2836     CHECK_FOR_ERROR
2837     $$ = new LoadInst(tmpVal, "", $1);
2838     delete $3;
2839   }
2840   | OptVolatile STORE ResolvedVal ',' Types ValueRef {
2841     if (!UpRefs.empty())
2842       GEN_ERROR("Invalid upreference in type: " + (*$5)->getDescription());
2843     const PointerType *PT = dyn_cast<PointerType>($5->get());
2844     if (!PT)
2845       GEN_ERROR("Can't store to a nonpointer type: " +
2846                      (*$5)->getDescription());
2847     const Type *ElTy = PT->getElementType();
2848     if (ElTy != $3->getType())
2849       GEN_ERROR("Can't store '" + $3->getType()->getDescription() +
2850                      "' into space of type '" + ElTy->getDescription() + "'");
2851
2852     Value* tmpVal = getVal(*$5, $6);
2853     CHECK_FOR_ERROR
2854     $$ = new StoreInst($3, tmpVal, $1);
2855     delete $5;
2856   }
2857   | GETELEMENTPTR Types ValueRef IndexList {
2858     if (!UpRefs.empty())
2859       GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription());
2860     if (!isa<PointerType>($2->get()))
2861       GEN_ERROR("getelementptr insn requires pointer operand");
2862
2863     if (!GetElementPtrInst::getIndexedType(*$2, &(*$4)[0], $4->size(), true))
2864       GEN_ERROR("Invalid getelementptr indices for type '" +
2865                      (*$2)->getDescription()+ "'");
2866     Value* tmpVal = getVal(*$2, $3);
2867     CHECK_FOR_ERROR
2868     $$ = new GetElementPtrInst(tmpVal, &(*$4)[0], $4->size());
2869     delete $2; 
2870     delete $4;
2871   };
2872
2873
2874 %%
2875
2876 // common code from the two 'RunVMAsmParser' functions
2877 static Module* RunParser(Module * M) {
2878
2879   llvmAsmlineno = 1;      // Reset the current line number...
2880   CurModule.CurrentModule = M;
2881 #if YYDEBUG
2882   yydebug = Debug;
2883 #endif
2884
2885   // Check to make sure the parser succeeded
2886   if (yyparse()) {
2887     if (ParserResult)
2888       delete ParserResult;
2889     return 0;
2890   }
2891
2892   // Check to make sure that parsing produced a result
2893   if (!ParserResult)
2894     return 0;
2895
2896   // Reset ParserResult variable while saving its value for the result.
2897   Module *Result = ParserResult;
2898   ParserResult = 0;
2899
2900   return Result;
2901 }
2902
2903 void llvm::GenerateError(const std::string &message, int LineNo) {
2904   if (LineNo == -1) LineNo = llvmAsmlineno;
2905   // TODO: column number in exception
2906   if (TheParseError)
2907     TheParseError->setError(CurFilename, message, LineNo);
2908   TriggerError = 1;
2909 }
2910
2911 int yyerror(const char *ErrorMsg) {
2912   std::string where 
2913     = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
2914                   + ":" + utostr((unsigned) llvmAsmlineno) + ": ";
2915   std::string errMsg = where + "error: " + std::string(ErrorMsg);
2916   if (yychar != YYEMPTY && yychar != 0)
2917     errMsg += " while reading token: '" + std::string(llvmAsmtext, llvmAsmleng)+
2918               "'";
2919   GenerateError(errMsg);
2920   return 0;
2921 }