blob: 410aec381d15eee375513d31deaa1758f0346274 [file] [log] [blame]
Reid Spencer68a24bd2005-08-27 18:50:39 +00001
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002/* A Bison parser, made from /Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y
3 by GNU Bison version 1.28 */
Anton Korobeynikov43e3aad2006-09-14 18:25:26 +00004
Christopher Lamb2330e4d2007-04-21 08:16:25 +00005#define YYBISON 1 /* Identify Bison output. */
Anton Korobeynikov178a3522007-01-12 19:22:51 +00006
Reid Spencer68a24bd2005-08-27 18:50:39 +00007#define yyparse llvmAsmparse
Christopher Lamb2330e4d2007-04-21 08:16:25 +00008#define yylex llvmAsmlex
Reid Spencer68a24bd2005-08-27 18:50:39 +00009#define yyerror llvmAsmerror
Christopher Lamb2330e4d2007-04-21 08:16:25 +000010#define yylval llvmAsmlval
11#define yychar llvmAsmchar
Reid Spencer68a24bd2005-08-27 18:50:39 +000012#define yydebug llvmAsmdebug
13#define yynerrs llvmAsmnerrs
Christopher Lamb2330e4d2007-04-21 08:16:25 +000014#define ESINT64VAL 257
15#define EUINT64VAL 258
16#define ESAPINTVAL 259
17#define EUAPINTVAL 260
18#define LOCALVAL_ID 261
19#define GLOBALVAL_ID 262
20#define FPVAL 263
21#define VOID 264
22#define INTTYPE 265
23#define FLOAT 266
24#define DOUBLE 267
25#define LABEL 268
26#define TYPE 269
27#define LOCALVAR 270
28#define GLOBALVAR 271
29#define LABELSTR 272
30#define STRINGCONSTANT 273
31#define ATSTRINGCONSTANT 274
32#define ZEROINITIALIZER 275
33#define TRUETOK 276
34#define FALSETOK 277
35#define BEGINTOK 278
36#define ENDTOK 279
37#define DECLARE 280
38#define DEFINE 281
39#define GLOBAL 282
40#define CONSTANT 283
41#define SECTION 284
42#define VOLATILE 285
43#define THREAD_LOCAL 286
44#define TO 287
45#define DOTDOTDOT 288
46#define NULL_TOK 289
47#define UNDEF 290
48#define INTERNAL 291
49#define LINKONCE 292
50#define WEAK 293
51#define APPENDING 294
52#define DLLIMPORT 295
53#define DLLEXPORT 296
54#define EXTERN_WEAK 297
55#define OPAQUE 298
56#define EXTERNAL 299
57#define TARGET 300
58#define TRIPLE 301
59#define ALIGN 302
60#define DEPLIBS 303
61#define CALL 304
62#define TAIL 305
63#define ASM_TOK 306
64#define MODULE 307
65#define SIDEEFFECT 308
66#define CC_TOK 309
67#define CCC_TOK 310
68#define FASTCC_TOK 311
69#define COLDCC_TOK 312
70#define X86_STDCALLCC_TOK 313
71#define X86_FASTCALLCC_TOK 314
72#define DATALAYOUT 315
73#define RET 316
74#define BR 317
75#define SWITCH 318
76#define INVOKE 319
77#define UNWIND 320
78#define UNREACHABLE 321
79#define ADD 322
80#define SUB 323
81#define MUL 324
82#define UDIV 325
83#define SDIV 326
84#define FDIV 327
85#define UREM 328
86#define SREM 329
87#define FREM 330
88#define AND 331
89#define OR 332
90#define XOR 333
91#define SHL 334
92#define LSHR 335
93#define ASHR 336
94#define ICMP 337
95#define FCMP 338
96#define EQ 339
97#define NE 340
98#define SLT 341
99#define SGT 342
100#define SLE 343
101#define SGE 344
102#define ULT 345
103#define UGT 346
104#define ULE 347
105#define UGE 348
106#define OEQ 349
107#define ONE 350
108#define OLT 351
109#define OGT 352
110#define OLE 353
111#define OGE 354
112#define ORD 355
113#define UNO 356
114#define UEQ 357
115#define UNE 358
116#define MALLOC 359
117#define ALLOCA 360
118#define FREE 361
119#define LOAD 362
120#define STORE 363
121#define GETELEMENTPTR 364
122#define TRUNC 365
123#define ZEXT 366
124#define SEXT 367
125#define FPTRUNC 368
126#define FPEXT 369
127#define BITCAST 370
128#define UITOFP 371
129#define SITOFP 372
130#define FPTOUI 373
131#define FPTOSI 374
132#define INTTOPTR 375
133#define PTRTOINT 376
134#define PHI_TOK 377
135#define SELECT 378
136#define VAARG 379
137#define EXTRACTELEMENT 380
138#define INSERTELEMENT 381
139#define SHUFFLEVECTOR 382
140#define NORETURN 383
141#define INREG 384
142#define SRET 385
143#define NOUNWIND 386
144#define DEFAULT 387
145#define HIDDEN 388
Reid Spencer68a24bd2005-08-27 18:50:39 +0000146
Christopher Lamb2330e4d2007-04-21 08:16:25 +0000147#line 14 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
Reid Spencer68a24bd2005-08-27 18:50:39 +0000148
149#include "ParserInternals.h"
150#include "llvm/CallingConv.h"
Chris Lattner0e9c3762006-01-25 22:27:16 +0000151#include "llvm/InlineAsm.h"
Reid Spencer68a24bd2005-08-27 18:50:39 +0000152#include "llvm/Instructions.h"
153#include "llvm/Module.h"
Reid Spenceref9b9a72007-02-05 20:47:22 +0000154#include "llvm/ValueSymbolTable.h"
Reid Spencer68a24bd2005-08-27 18:50:39 +0000155#include "llvm/Support/GetElementPtrTypeIterator.h"
Reid Spencer14310612006-12-31 05:40:51 +0000156#include "llvm/Support/CommandLine.h"
Chris Lattnerf7469af2007-01-31 04:44:08 +0000157#include "llvm/ADT/SmallVector.h"
Reid Spencer68a24bd2005-08-27 18:50:39 +0000158#include "llvm/ADT/STLExtras.h"
Chris Lattner0019bbe2005-11-06 06:46:53 +0000159#include "llvm/Support/MathExtras.h"
Reid Spencer481169e2006-12-01 00:33:46 +0000160#include "llvm/Support/Streams.h"
Reid Spencer68a24bd2005-08-27 18:50:39 +0000161#include <algorithm>
Reid Spencer68a24bd2005-08-27 18:50:39 +0000162#include <list>
Chris Lattner8adde282007-02-11 21:40:10 +0000163#include <map>
Reid Spencer68a24bd2005-08-27 18:50:39 +0000164#include <utility>
Reid Spencer14310612006-12-31 05:40:51 +0000165#ifndef NDEBUG
166#define YYDEBUG 1
167#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +0000168
Reid Spencere4f47592006-08-18 17:32:55 +0000169// The following is a gross hack. In order to rid the libAsmParser library of
170// exceptions, we have to have a way of getting the yyparse function to go into
171// an error situation. So, whenever we want an error to occur, the GenerateError
172// function (see bottom of file) sets TriggerError. Then, at the end of each
173// production in the grammer we use CHECK_FOR_ERROR which will invoke YYERROR
174// (a goto) to put YACC in error state. Furthermore, several calls to
175// GenerateError are made from inside productions and they must simulate the
176// previous exception behavior by exiting the production immediately. We have
177// replaced these with the GEN_ERROR macro which calls GeneratError and then
178// immediately invokes YYERROR. This would be so much cleaner if it was a
179// recursive descent parser.
Reid Spencer61c83e02006-08-18 08:43:06 +0000180static bool TriggerError = false;
Reid Spencerf63697d2006-10-09 17:36:59 +0000181#define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYABORT; } }
Reid Spencer61c83e02006-08-18 08:43:06 +0000182#define GEN_ERROR(msg) { GenerateError(msg); YYERROR; }
183
Reid Spencer68a24bd2005-08-27 18:50:39 +0000184int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit
185int yylex(); // declaration" of xxx warnings.
186int yyparse();
187
188namespace llvm {
189 std::string CurFilename;
Reid Spencer14310612006-12-31 05:40:51 +0000190#if YYDEBUG
191static cl::opt<bool>
192Debug("debug-yacc", cl::desc("Print yacc debug state changes"),
193 cl::Hidden, cl::init(false));
194#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +0000195}
196using namespace llvm;
197
198static Module *ParserResult;
199
200// DEBUG_UPREFS - Define this symbol if you want to enable debugging output
201// relating to upreferences in the input stream.
202//
203//#define DEBUG_UPREFS 1
204#ifdef DEBUG_UPREFS
Bill Wendlinge8156192006-12-07 01:30:32 +0000205#define UR_OUT(X) cerr << X
Reid Spencer68a24bd2005-08-27 18:50:39 +0000206#else
207#define UR_OUT(X)
208#endif
209
210#define YYERROR_VERBOSE 1
211
Chris Lattnerb475c422005-11-12 18:22:38 +0000212static GlobalVariable *CurGV;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000213
214
215// This contains info used when building the body of a function. It is
216// destroyed when the function is completed.
217//
218typedef std::vector<Value *> ValueList; // Numbered defs
Reid Spencer14310612006-12-31 05:40:51 +0000219
Reid Spencer68a24bd2005-08-27 18:50:39 +0000220static void
Reid Spencer93c40032007-03-19 18:40:50 +0000221ResolveDefinitions(ValueList &LateResolvers, ValueList *FutureLateResolvers=0);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000222
223static struct PerModuleInfo {
224 Module *CurrentModule;
Reid Spencer93c40032007-03-19 18:40:50 +0000225 ValueList Values; // Module level numbered definitions
226 ValueList LateResolveValues;
Reid Spencer861d9d62006-11-28 07:29:44 +0000227 std::vector<PATypeHolder> Types;
228 std::map<ValID, PATypeHolder> LateResolveTypes;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000229
230 /// PlaceHolderInfo - When temporary placeholder objects are created, remember
Chris Lattner0ad19702006-06-21 16:53:00 +0000231 /// how they were referenced and on which line of the input they came from so
Reid Spencer68a24bd2005-08-27 18:50:39 +0000232 /// that we can resolve them later and print error messages as appropriate.
233 std::map<Value*, std::pair<ValID, int> > PlaceHolderInfo;
234
235 // GlobalRefs - This maintains a mapping between <Type, ValID>'s and forward
236 // references to global values. Global values may be referenced before they
237 // are defined, and if so, the temporary object that they represent is held
238 // here. This is used for forward references of GlobalValues.
239 //
240 typedef std::map<std::pair<const PointerType *,
241 ValID>, GlobalValue*> GlobalRefsType;
242 GlobalRefsType GlobalRefs;
243
244 void ModuleDone() {
245 // If we could not resolve some functions at function compilation time
246 // (calls to functions before they are defined), resolve them now... Types
247 // are resolved when the constant pool has been completely parsed.
248 //
249 ResolveDefinitions(LateResolveValues);
Reid Spencer5b7e7532006-09-28 19:28:24 +0000250 if (TriggerError)
251 return;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000252
253 // Check to make sure that all global value forward references have been
254 // resolved!
255 //
256 if (!GlobalRefs.empty()) {
257 std::string UndefinedReferences = "Unresolved global references exist:\n";
258
259 for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end();
260 I != E; ++I) {
261 UndefinedReferences += " " + I->first.first->getDescription() + " " +
262 I->first.second.getName() + "\n";
263 }
Reid Spencer61c83e02006-08-18 08:43:06 +0000264 GenerateError(UndefinedReferences);
Reid Spencer5b7e7532006-09-28 19:28:24 +0000265 return;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000266 }
267
268 Values.clear(); // Clear out function local definitions
269 Types.clear();
270 CurrentModule = 0;
271 }
272
Reid Spencer68a24bd2005-08-27 18:50:39 +0000273 // GetForwardRefForGlobal - Check to see if there is a forward reference
274 // for this global. If so, remove it from the GlobalRefs map and return it.
275 // If not, just return null.
276 GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) {
277 // Check to see if there is a forward reference to this global variable...
278 // if there is, eliminate it and patch the reference to use the new def'n.
279 GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID));
280 GlobalValue *Ret = 0;
281 if (I != GlobalRefs.end()) {
282 Ret = I->second;
283 GlobalRefs.erase(I);
284 }
285 return Ret;
286 }
Reid Spencer8c8a2dc2007-01-02 21:54:12 +0000287
288 bool TypeIsUnresolved(PATypeHolder* PATy) {
289 // If it isn't abstract, its resolved
290 const Type* Ty = PATy->get();
291 if (!Ty->isAbstract())
292 return false;
293 // Traverse the type looking for abstract types. If it isn't abstract then
294 // we don't need to traverse that leg of the type.
295 std::vector<const Type*> WorkList, SeenList;
296 WorkList.push_back(Ty);
297 while (!WorkList.empty()) {
298 const Type* Ty = WorkList.back();
299 SeenList.push_back(Ty);
300 WorkList.pop_back();
301 if (const OpaqueType* OpTy = dyn_cast<OpaqueType>(Ty)) {
302 // Check to see if this is an unresolved type
303 std::map<ValID, PATypeHolder>::iterator I = LateResolveTypes.begin();
304 std::map<ValID, PATypeHolder>::iterator E = LateResolveTypes.end();
305 for ( ; I != E; ++I) {
306 if (I->second.get() == OpTy)
307 return true;
308 }
309 } else if (const SequentialType* SeqTy = dyn_cast<SequentialType>(Ty)) {
310 const Type* TheTy = SeqTy->getElementType();
311 if (TheTy->isAbstract() && TheTy != Ty) {
312 std::vector<const Type*>::iterator I = SeenList.begin(),
313 E = SeenList.end();
314 for ( ; I != E; ++I)
315 if (*I == TheTy)
316 break;
317 if (I == E)
318 WorkList.push_back(TheTy);
319 }
320 } else if (const StructType* StrTy = dyn_cast<StructType>(Ty)) {
321 for (unsigned i = 0; i < StrTy->getNumElements(); ++i) {
322 const Type* TheTy = StrTy->getElementType(i);
323 if (TheTy->isAbstract() && TheTy != Ty) {
324 std::vector<const Type*>::iterator I = SeenList.begin(),
325 E = SeenList.end();
326 for ( ; I != E; ++I)
327 if (*I == TheTy)
328 break;
329 if (I == E)
330 WorkList.push_back(TheTy);
331 }
332 }
333 }
334 }
335 return false;
336 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000337} CurModule;
338
339static struct PerFunctionInfo {
340 Function *CurrentFunction; // Pointer to current function being created
341
Reid Spencer93c40032007-03-19 18:40:50 +0000342 ValueList Values; // Keep track of #'d definitions
343 unsigned NextValNum;
344 ValueList LateResolveValues;
Reid Spenceref9b9a72007-02-05 20:47:22 +0000345 bool isDeclare; // Is this function a forward declararation?
Anton Korobeynikov43e3aad2006-09-14 18:25:26 +0000346 GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration.
Anton Korobeynikov178a3522007-01-12 19:22:51 +0000347 GlobalValue::VisibilityTypes Visibility;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000348
349 /// BBForwardRefs - When we see forward references to basic blocks, keep
350 /// track of them here.
Reid Spencer93c40032007-03-19 18:40:50 +0000351 std::map<ValID, BasicBlock*> BBForwardRefs;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000352
353 inline PerFunctionInfo() {
354 CurrentFunction = 0;
355 isDeclare = false;
Anton Korobeynikov178a3522007-01-12 19:22:51 +0000356 Linkage = GlobalValue::ExternalLinkage;
357 Visibility = GlobalValue::DefaultVisibility;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000358 }
359
360 inline void FunctionStart(Function *M) {
361 CurrentFunction = M;
Reid Spencer93c40032007-03-19 18:40:50 +0000362 NextValNum = 0;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000363 }
364
365 void FunctionDone() {
Reid Spencer68a24bd2005-08-27 18:50:39 +0000366 // Any forward referenced blocks left?
Reid Spencer5b7e7532006-09-28 19:28:24 +0000367 if (!BBForwardRefs.empty()) {
Reid Spencer61c83e02006-08-18 08:43:06 +0000368 GenerateError("Undefined reference to label " +
Reid Spencer93c40032007-03-19 18:40:50 +0000369 BBForwardRefs.begin()->second->getName());
Reid Spencer5b7e7532006-09-28 19:28:24 +0000370 return;
371 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000372
373 // Resolve all forward references now.
374 ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
375
376 Values.clear(); // Clear out function local definitions
Reid Spencer93c40032007-03-19 18:40:50 +0000377 BBForwardRefs.clear();
Reid Spencer68a24bd2005-08-27 18:50:39 +0000378 CurrentFunction = 0;
379 isDeclare = false;
Anton Korobeynikov43e3aad2006-09-14 18:25:26 +0000380 Linkage = GlobalValue::ExternalLinkage;
Anton Korobeynikov178a3522007-01-12 19:22:51 +0000381 Visibility = GlobalValue::DefaultVisibility;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000382 }
383} CurFun; // Info for the current function...
384
385static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }
386
387
388//===----------------------------------------------------------------------===//
389// Code to handle definitions of all the types
390//===----------------------------------------------------------------------===//
391
Reid Spencer93c40032007-03-19 18:40:50 +0000392static void InsertValue(Value *V, ValueList &ValueTab = CurFun.Values) {
393 // Things that have names or are void typed don't get slot numbers
394 if (V->hasName() || (V->getType() == Type::VoidTy))
395 return;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000396
Reid Spencer93c40032007-03-19 18:40:50 +0000397 // In the case of function values, we have to allow for the forward reference
398 // of basic blocks, which are included in the numbering. Consequently, we keep
399 // track of the next insertion location with NextValNum. When a BB gets
400 // inserted, it could change the size of the CurFun.Values vector.
401 if (&ValueTab == &CurFun.Values) {
402 if (ValueTab.size() <= CurFun.NextValNum)
403 ValueTab.resize(CurFun.NextValNum+1);
404 ValueTab[CurFun.NextValNum++] = V;
405 return;
406 }
407 // For all other lists, its okay to just tack it on the back of the vector.
408 ValueTab.push_back(V);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000409}
410
411static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
412 switch (D.Type) {
Reid Spencer41dff5e2007-01-26 08:05:27 +0000413 case ValID::LocalID: // Is it a numbered definition?
Reid Spencer68a24bd2005-08-27 18:50:39 +0000414 // Module constants occupy the lowest numbered slots...
Reid Spencer41dff5e2007-01-26 08:05:27 +0000415 if (D.Num < CurModule.Types.size())
416 return CurModule.Types[D.Num];
Reid Spencer68a24bd2005-08-27 18:50:39 +0000417 break;
Reid Spencer41dff5e2007-01-26 08:05:27 +0000418 case ValID::LocalName: // Is it a named definition?
Reid Spencer68a24bd2005-08-27 18:50:39 +0000419 if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
420 D.destroy(); // Free old strdup'd memory...
421 return N;
422 }
423 break;
424 default:
Reid Spencerb5334b02007-02-05 10:18:06 +0000425 GenerateError("Internal parser error: Invalid symbol type reference");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000426 return 0;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000427 }
428
429 // If we reached here, we referenced either a symbol that we don't know about
430 // or an id number that hasn't been read yet. We may be referencing something
431 // forward, so just create an entry to be resolved later and get to it...
432 //
433 if (DoNotImprovise) return 0; // Do we just want a null to be returned?
434
435
436 if (inFunctionScope()) {
Reid Spencer41dff5e2007-01-26 08:05:27 +0000437 if (D.Type == ValID::LocalName) {
Reid Spencer61c83e02006-08-18 08:43:06 +0000438 GenerateError("Reference to an undefined type: '" + D.getName() + "'");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000439 return 0;
440 } else {
Reid Spencer41dff5e2007-01-26 08:05:27 +0000441 GenerateError("Reference to an undefined type: #" + utostr(D.Num));
Reid Spencer5b7e7532006-09-28 19:28:24 +0000442 return 0;
443 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000444 }
445
Reid Spencer861d9d62006-11-28 07:29:44 +0000446 std::map<ValID, PATypeHolder>::iterator I =CurModule.LateResolveTypes.find(D);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000447 if (I != CurModule.LateResolveTypes.end())
Reid Spencer861d9d62006-11-28 07:29:44 +0000448 return I->second;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000449
Reid Spencer861d9d62006-11-28 07:29:44 +0000450 Type *Typ = OpaqueType::get();
451 CurModule.LateResolveTypes.insert(std::make_pair(D, Typ));
452 return Typ;
Reid Spencera132e042006-12-03 05:46:11 +0000453 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000454
Reid Spencer93c40032007-03-19 18:40:50 +0000455// getExistingVal - Look up the value specified by the provided type and
Reid Spencer68a24bd2005-08-27 18:50:39 +0000456// the provided ValID. If the value exists and has already been defined, return
457// it. Otherwise return null.
458//
Reid Spencer93c40032007-03-19 18:40:50 +0000459static Value *getExistingVal(const Type *Ty, const ValID &D) {
Reid Spencer5b7e7532006-09-28 19:28:24 +0000460 if (isa<FunctionType>(Ty)) {
Reid Spencer61c83e02006-08-18 08:43:06 +0000461 GenerateError("Functions are not values and "
Reid Spencer68a24bd2005-08-27 18:50:39 +0000462 "must be referenced as pointers");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000463 return 0;
464 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000465
466 switch (D.Type) {
Reid Spencer41dff5e2007-01-26 08:05:27 +0000467 case ValID::LocalID: { // Is it a numbered definition?
Reid Spencer41dff5e2007-01-26 08:05:27 +0000468 // Check that the number is within bounds.
Reid Spencer93c40032007-03-19 18:40:50 +0000469 if (D.Num >= CurFun.Values.size())
470 return 0;
471 Value *Result = CurFun.Values[D.Num];
472 if (Ty != Result->getType()) {
473 GenerateError("Numbered value (%" + utostr(D.Num) + ") of type '" +
474 Result->getType()->getDescription() + "' does not match "
475 "expected type, '" + Ty->getDescription() + "'");
476 return 0;
477 }
478 return Result;
Reid Spencer41dff5e2007-01-26 08:05:27 +0000479 }
480 case ValID::GlobalID: { // Is it a numbered definition?
Reid Spencer93c40032007-03-19 18:40:50 +0000481 if (D.Num >= CurModule.Values.size())
Reid Spenceref9b9a72007-02-05 20:47:22 +0000482 return 0;
Reid Spencer93c40032007-03-19 18:40:50 +0000483 Value *Result = CurModule.Values[D.Num];
484 if (Ty != Result->getType()) {
485 GenerateError("Numbered value (@" + utostr(D.Num) + ") of type '" +
486 Result->getType()->getDescription() + "' does not match "
487 "expected type, '" + Ty->getDescription() + "'");
Reid Spenceref9b9a72007-02-05 20:47:22 +0000488 return 0;
Reid Spencer93c40032007-03-19 18:40:50 +0000489 }
490 return Result;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000491 }
Reid Spencer41dff5e2007-01-26 08:05:27 +0000492
493 case ValID::LocalName: { // Is it a named definition?
Reid Spenceref9b9a72007-02-05 20:47:22 +0000494 if (!inFunctionScope())
495 return 0;
496 ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
497 Value *N = SymTab.lookup(D.Name);
498 if (N == 0)
499 return 0;
500 if (N->getType() != Ty)
501 return 0;
Reid Spencer41dff5e2007-01-26 08:05:27 +0000502
503 D.destroy(); // Free old strdup'd memory...
504 return N;
505 }
506 case ValID::GlobalName: { // Is it a named definition?
Reid Spenceref9b9a72007-02-05 20:47:22 +0000507 ValueSymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable();
508 Value *N = SymTab.lookup(D.Name);
509 if (N == 0)
510 return 0;
511 if (N->getType() != Ty)
512 return 0;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000513
514 D.destroy(); // Free old strdup'd memory...
515 return N;
516 }
517
518 // Check to make sure that "Ty" is an integral type, and that our
519 // value will fit into the specified type...
520 case ValID::ConstSIntVal: // Is it a constant pool reference??
Reid Spencerb83eb642006-10-20 07:07:24 +0000521 if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
Reid Spencer61c83e02006-08-18 08:43:06 +0000522 GenerateError("Signed integral constant '" +
Reid Spencer68a24bd2005-08-27 18:50:39 +0000523 itostr(D.ConstPool64) + "' is invalid for type '" +
Reid Spencerb5334b02007-02-05 10:18:06 +0000524 Ty->getDescription() + "'");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000525 return 0;
526 }
Reid Spencer49d273e2007-03-19 20:40:51 +0000527 return ConstantInt::get(Ty, D.ConstPool64, true);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000528
529 case ValID::ConstUIntVal: // Is it an unsigned const pool reference?
Reid Spencerb83eb642006-10-20 07:07:24 +0000530 if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
531 if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
Reid Spencer61c83e02006-08-18 08:43:06 +0000532 GenerateError("Integral constant '" + utostr(D.UConstPool64) +
Reid Spencerb5334b02007-02-05 10:18:06 +0000533 "' is invalid or out of range");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000534 return 0;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000535 } else { // This is really a signed reference. Transmogrify.
Reid Spencer49d273e2007-03-19 20:40:51 +0000536 return ConstantInt::get(Ty, D.ConstPool64, true);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000537 }
538 } else {
Reid Spencerb83eb642006-10-20 07:07:24 +0000539 return ConstantInt::get(Ty, D.UConstPool64);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000540 }
541
542 case ValID::ConstFPVal: // Is it a floating point const pool reference?
Reid Spencer5b7e7532006-09-28 19:28:24 +0000543 if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) {
Reid Spencerb5334b02007-02-05 10:18:06 +0000544 GenerateError("FP constant invalid for type");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000545 return 0;
546 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000547 return ConstantFP::get(Ty, D.ConstPoolFP);
548
549 case ValID::ConstNullVal: // Is it a null value?
Reid Spencer5b7e7532006-09-28 19:28:24 +0000550 if (!isa<PointerType>(Ty)) {
Reid Spencerb5334b02007-02-05 10:18:06 +0000551 GenerateError("Cannot create a a non pointer null");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000552 return 0;
553 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000554 return ConstantPointerNull::get(cast<PointerType>(Ty));
555
556 case ValID::ConstUndefVal: // Is it an undef value?
557 return UndefValue::get(Ty);
558
Chris Lattner7aa61892005-12-21 17:53:23 +0000559 case ValID::ConstZeroVal: // Is it a zero value?
560 return Constant::getNullValue(Ty);
561
Reid Spencer68a24bd2005-08-27 18:50:39 +0000562 case ValID::ConstantVal: // Fully resolved constant?
Reid Spencer5b7e7532006-09-28 19:28:24 +0000563 if (D.ConstantValue->getType() != Ty) {
Reid Spencerb5334b02007-02-05 10:18:06 +0000564 GenerateError("Constant expression type different from required type");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000565 return 0;
566 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000567 return D.ConstantValue;
568
Chris Lattner0e9c3762006-01-25 22:27:16 +0000569 case ValID::InlineAsmVal: { // Inline asm expression
570 const PointerType *PTy = dyn_cast<PointerType>(Ty);
571 const FunctionType *FTy =
572 PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
Reid Spencer5b7e7532006-09-28 19:28:24 +0000573 if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) {
Reid Spencerb5334b02007-02-05 10:18:06 +0000574 GenerateError("Invalid type for asm constraint string");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000575 return 0;
576 }
Chris Lattner0e9c3762006-01-25 22:27:16 +0000577 InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
578 D.IAD->HasSideEffects);
579 D.destroy(); // Free InlineAsmDescriptor.
580 return IA;
581 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000582 default:
Reid Spencera9720f52007-02-05 17:04:00 +0000583 assert(0 && "Unhandled case!");
Reid Spencer68a24bd2005-08-27 18:50:39 +0000584 return 0;
585 } // End of switch
586
Reid Spencera9720f52007-02-05 17:04:00 +0000587 assert(0 && "Unhandled case!");
Reid Spencer68a24bd2005-08-27 18:50:39 +0000588 return 0;
589}
590
Reid Spencer93c40032007-03-19 18:40:50 +0000591// getVal - This function is identical to getExistingVal, except that if a
Reid Spencer68a24bd2005-08-27 18:50:39 +0000592// value is not already defined, it "improvises" by creating a placeholder var
593// that looks and acts just like the requested variable. When the value is
594// defined later, all uses of the placeholder variable are replaced with the
595// real thing.
596//
597static Value *getVal(const Type *Ty, const ValID &ID) {
Reid Spencer5b7e7532006-09-28 19:28:24 +0000598 if (Ty == Type::LabelTy) {
Reid Spencer61c83e02006-08-18 08:43:06 +0000599 GenerateError("Cannot use a basic block here");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000600 return 0;
601 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000602
603 // See if the value has already been defined.
Reid Spencer93c40032007-03-19 18:40:50 +0000604 Value *V = getExistingVal(Ty, ID);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000605 if (V) return V;
Reid Spencer5b7e7532006-09-28 19:28:24 +0000606 if (TriggerError) return 0;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000607
Reid Spencer5b7e7532006-09-28 19:28:24 +0000608 if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty)) {
Reid Spencerb5334b02007-02-05 10:18:06 +0000609 GenerateError("Invalid use of a composite type");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000610 return 0;
611 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000612
613 // If we reached here, we referenced either a symbol that we don't know about
614 // or an id number that hasn't been read yet. We may be referencing something
615 // forward, so just create an entry to be resolved later and get to it...
616 //
617 V = new Argument(Ty);
618
619 // Remember where this forward reference came from. FIXME, shouldn't we try
620 // to recycle these things??
621 CurModule.PlaceHolderInfo.insert(std::make_pair(V, std::make_pair(ID,
622 llvmAsmlineno)));
623
624 if (inFunctionScope())
625 InsertValue(V, CurFun.LateResolveValues);
626 else
627 InsertValue(V, CurModule.LateResolveValues);
628 return V;
629}
630
Reid Spencer93c40032007-03-19 18:40:50 +0000631/// defineBBVal - This is a definition of a new basic block with the specified
632/// identifier which must be the same as CurFun.NextValNum, if its numeric.
633static BasicBlock *defineBBVal(const ValID &ID) {
Reid Spencera9720f52007-02-05 17:04:00 +0000634 assert(inFunctionScope() && "Can't get basic block at global scope!");
Reid Spencer68a24bd2005-08-27 18:50:39 +0000635
Reid Spencer68a24bd2005-08-27 18:50:39 +0000636 BasicBlock *BB = 0;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000637
Reid Spencer93c40032007-03-19 18:40:50 +0000638 // First, see if this was forward referenced
Reid Spencer68a24bd2005-08-27 18:50:39 +0000639
Reid Spencer93c40032007-03-19 18:40:50 +0000640 std::map<ValID, BasicBlock*>::iterator BBI = CurFun.BBForwardRefs.find(ID);
641 if (BBI != CurFun.BBForwardRefs.end()) {
642 BB = BBI->second;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000643 // The forward declaration could have been inserted anywhere in the
644 // function: insert it into the correct place now.
645 CurFun.CurrentFunction->getBasicBlockList().remove(BB);
646 CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
Reid Spencer93c40032007-03-19 18:40:50 +0000647
Reid Spencer66728ef2007-03-20 01:13:36 +0000648 // We're about to erase the entry, save the key so we can clean it up.
649 ValID Tmp = BBI->first;
650
Reid Spencer93c40032007-03-19 18:40:50 +0000651 // Erase the forward ref from the map as its no longer "forward"
652 CurFun.BBForwardRefs.erase(ID);
653
Reid Spencer66728ef2007-03-20 01:13:36 +0000654 // The key has been removed from the map but so we don't want to leave
655 // strdup'd memory around so destroy it too.
656 Tmp.destroy();
657
Reid Spencer93c40032007-03-19 18:40:50 +0000658 // If its a numbered definition, bump the number and set the BB value.
659 if (ID.Type == ValID::LocalID) {
660 assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
661 InsertValue(BB);
662 }
663
664 ID.destroy();
665 return BB;
666 }
667
668 // We haven't seen this BB before and its first mention is a definition.
669 // Just create it and return it.
670 std::string Name (ID.Type == ValID::LocalName ? ID.Name : "");
671 BB = new BasicBlock(Name, CurFun.CurrentFunction);
672 if (ID.Type == ValID::LocalID) {
673 assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
674 InsertValue(BB);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000675 }
Reid Spencer93c40032007-03-19 18:40:50 +0000676
677 ID.destroy(); // Free strdup'd memory
678 return BB;
679}
680
681/// getBBVal - get an existing BB value or create a forward reference for it.
682///
683static BasicBlock *getBBVal(const ValID &ID) {
684 assert(inFunctionScope() && "Can't get basic block at global scope!");
685
686 BasicBlock *BB = 0;
687
688 std::map<ValID, BasicBlock*>::iterator BBI = CurFun.BBForwardRefs.find(ID);
689 if (BBI != CurFun.BBForwardRefs.end()) {
690 BB = BBI->second;
691 } if (ID.Type == ValID::LocalName) {
692 std::string Name = ID.Name;
693 Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name);
694 if (N)
695 if (N->getType()->getTypeID() == Type::LabelTyID)
696 BB = cast<BasicBlock>(N);
697 else
698 GenerateError("Reference to label '" + Name + "' is actually of type '"+
699 N->getType()->getDescription() + "'");
700 } else if (ID.Type == ValID::LocalID) {
701 if (ID.Num < CurFun.NextValNum && ID.Num < CurFun.Values.size()) {
702 if (CurFun.Values[ID.Num]->getType()->getTypeID() == Type::LabelTyID)
703 BB = cast<BasicBlock>(CurFun.Values[ID.Num]);
704 else
705 GenerateError("Reference to label '%" + utostr(ID.Num) +
706 "' is actually of type '"+
707 CurFun.Values[ID.Num]->getType()->getDescription() + "'");
708 }
709 } else {
710 GenerateError("Illegal label reference " + ID.getName());
711 return 0;
712 }
713
714 // If its already been defined, return it now.
715 if (BB) {
716 ID.destroy(); // Free strdup'd memory.
717 return BB;
718 }
719
720 // Otherwise, this block has not been seen before, create it.
721 std::string Name;
722 if (ID.Type == ValID::LocalName)
723 Name = ID.Name;
724 BB = new BasicBlock(Name, CurFun.CurrentFunction);
725
726 // Insert it in the forward refs map.
727 CurFun.BBForwardRefs[ID] = BB;
728
Reid Spencer68a24bd2005-08-27 18:50:39 +0000729 return BB;
730}
731
732
733//===----------------------------------------------------------------------===//
734// Code to handle forward references in instructions
735//===----------------------------------------------------------------------===//
736//
737// This code handles the late binding needed with statements that reference
738// values not defined yet... for example, a forward branch, or the PHI node for
739// a loop body.
740//
741// This keeps a table (CurFun.LateResolveValues) of all such forward references
742// and back patchs after we are done.
743//
744
745// ResolveDefinitions - If we could not resolve some defs at parsing
746// time (forward branches, phi functions for loops, etc...) resolve the
747// defs now...
748//
749static void
Reid Spencer93c40032007-03-19 18:40:50 +0000750ResolveDefinitions(ValueList &LateResolvers, ValueList *FutureLateResolvers) {
Reid Spencer68a24bd2005-08-27 18:50:39 +0000751 // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
Reid Spencer93c40032007-03-19 18:40:50 +0000752 while (!LateResolvers.empty()) {
753 Value *V = LateResolvers.back();
754 LateResolvers.pop_back();
Reid Spencer68a24bd2005-08-27 18:50:39 +0000755
Reid Spencer93c40032007-03-19 18:40:50 +0000756 std::map<Value*, std::pair<ValID, int> >::iterator PHI =
757 CurModule.PlaceHolderInfo.find(V);
758 assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!");
Reid Spencer68a24bd2005-08-27 18:50:39 +0000759
Reid Spencer93c40032007-03-19 18:40:50 +0000760 ValID &DID = PHI->second.first;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000761
Reid Spencer93c40032007-03-19 18:40:50 +0000762 Value *TheRealValue = getExistingVal(V->getType(), DID);
763 if (TriggerError)
764 return;
765 if (TheRealValue) {
766 V->replaceAllUsesWith(TheRealValue);
767 delete V;
768 CurModule.PlaceHolderInfo.erase(PHI);
769 } else if (FutureLateResolvers) {
770 // Functions have their unresolved items forwarded to the module late
771 // resolver table
772 InsertValue(V, *FutureLateResolvers);
773 } else {
774 if (DID.Type == ValID::LocalName || DID.Type == ValID::GlobalName) {
775 GenerateError("Reference to an invalid definition: '" +DID.getName()+
776 "' of type '" + V->getType()->getDescription() + "'",
777 PHI->second.second);
Reid Spencer5b7e7532006-09-28 19:28:24 +0000778 return;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000779 } else {
Reid Spencer93c40032007-03-19 18:40:50 +0000780 GenerateError("Reference to an invalid definition: #" +
781 itostr(DID.Num) + " of type '" +
782 V->getType()->getDescription() + "'",
783 PHI->second.second);
784 return;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000785 }
786 }
787 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000788 LateResolvers.clear();
789}
790
791// ResolveTypeTo - A brand new type was just declared. This means that (if
792// name is not null) things referencing Name can be resolved. Otherwise, things
793// refering to the number can be resolved. Do this now.
794//
795static void ResolveTypeTo(char *Name, const Type *ToTy) {
796 ValID D;
Reid Spencer41dff5e2007-01-26 08:05:27 +0000797 if (Name) D = ValID::createLocalName(Name);
798 else D = ValID::createLocalID(CurModule.Types.size());
Reid Spencer68a24bd2005-08-27 18:50:39 +0000799
Reid Spencer861d9d62006-11-28 07:29:44 +0000800 std::map<ValID, PATypeHolder>::iterator I =
Reid Spencer68a24bd2005-08-27 18:50:39 +0000801 CurModule.LateResolveTypes.find(D);
802 if (I != CurModule.LateResolveTypes.end()) {
Reid Spencer861d9d62006-11-28 07:29:44 +0000803 ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000804 CurModule.LateResolveTypes.erase(I);
805 }
806}
807
808// setValueName - Set the specified value to the name given. The name may be
809// null potentially, in which case this is a noop. The string passed in is
810// assumed to be a malloc'd string buffer, and is free'd by this function.
811//
812static void setValueName(Value *V, char *NameStr) {
Reid Spencer41dff5e2007-01-26 08:05:27 +0000813 if (!NameStr) return;
814 std::string Name(NameStr); // Copy string
815 free(NameStr); // Free old string
Reid Spencer68a24bd2005-08-27 18:50:39 +0000816
Reid Spencer41dff5e2007-01-26 08:05:27 +0000817 if (V->getType() == Type::VoidTy) {
Reid Spencerb5334b02007-02-05 10:18:06 +0000818 GenerateError("Can't assign name '" + Name+"' to value with void type");
Reid Spencer41dff5e2007-01-26 08:05:27 +0000819 return;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000820 }
Reid Spencer41dff5e2007-01-26 08:05:27 +0000821
Reid Spencera9720f52007-02-05 17:04:00 +0000822 assert(inFunctionScope() && "Must be in function scope!");
Reid Spenceref9b9a72007-02-05 20:47:22 +0000823 ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
824 if (ST.lookup(Name)) {
Reid Spencer41dff5e2007-01-26 08:05:27 +0000825 GenerateError("Redefinition of value '" + Name + "' of type '" +
Reid Spencerb5334b02007-02-05 10:18:06 +0000826 V->getType()->getDescription() + "'");
Reid Spencer41dff5e2007-01-26 08:05:27 +0000827 return;
828 }
829
830 // Set the name.
831 V->setName(Name);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000832}
833
834/// ParseGlobalVariable - Handle parsing of a global. If Initializer is null,
835/// this is a declaration, otherwise it is a definition.
Chris Lattnerb475c422005-11-12 18:22:38 +0000836static GlobalVariable *
Anton Korobeynikov178a3522007-01-12 19:22:51 +0000837ParseGlobalVariable(char *NameStr,
838 GlobalValue::LinkageTypes Linkage,
839 GlobalValue::VisibilityTypes Visibility,
Chris Lattnerb475c422005-11-12 18:22:38 +0000840 bool isConstantGlobal, const Type *Ty,
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +0000841 Constant *Initializer, bool IsThreadLocal) {
Reid Spencer5b7e7532006-09-28 19:28:24 +0000842 if (isa<FunctionType>(Ty)) {
Reid Spencerb5334b02007-02-05 10:18:06 +0000843 GenerateError("Cannot declare global vars of function type");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000844 return 0;
845 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000846
847 const PointerType *PTy = PointerType::get(Ty);
848
849 std::string Name;
850 if (NameStr) {
851 Name = NameStr; // Copy string
852 free(NameStr); // Free old string
853 }
854
855 // See if this global value was forward referenced. If so, recycle the
856 // object.
857 ValID ID;
858 if (!Name.empty()) {
Reid Spencer41dff5e2007-01-26 08:05:27 +0000859 ID = ValID::createGlobalName((char*)Name.c_str());
Reid Spencer68a24bd2005-08-27 18:50:39 +0000860 } else {
Reid Spencer93c40032007-03-19 18:40:50 +0000861 ID = ValID::createGlobalID(CurModule.Values.size());
Reid Spencer68a24bd2005-08-27 18:50:39 +0000862 }
863
864 if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
865 // Move the global to the end of the list, from whereever it was
866 // previously inserted.
867 GlobalVariable *GV = cast<GlobalVariable>(FWGV);
868 CurModule.CurrentModule->getGlobalList().remove(GV);
869 CurModule.CurrentModule->getGlobalList().push_back(GV);
870 GV->setInitializer(Initializer);
871 GV->setLinkage(Linkage);
Anton Korobeynikov178a3522007-01-12 19:22:51 +0000872 GV->setVisibility(Visibility);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000873 GV->setConstant(isConstantGlobal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +0000874 GV->setThreadLocal(IsThreadLocal);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000875 InsertValue(GV, CurModule.Values);
Chris Lattnerb475c422005-11-12 18:22:38 +0000876 return GV;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000877 }
878
Reid Spenceref9b9a72007-02-05 20:47:22 +0000879 // If this global has a name
Reid Spencer68a24bd2005-08-27 18:50:39 +0000880 if (!Name.empty()) {
Reid Spenceref9b9a72007-02-05 20:47:22 +0000881 // if the global we're parsing has an initializer (is a definition) and
882 // has external linkage.
883 if (Initializer && Linkage != GlobalValue::InternalLinkage)
884 // If there is already a global with external linkage with this name
885 if (CurModule.CurrentModule->getGlobalVariable(Name, false)) {
886 // If we allow this GVar to get created, it will be renamed in the
887 // symbol table because it conflicts with an existing GVar. We can't
888 // allow redefinition of GVars whose linking indicates that their name
889 // must stay the same. Issue the error.
890 GenerateError("Redefinition of global variable named '" + Name +
891 "' of type '" + Ty->getDescription() + "'");
892 return 0;
893 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000894 }
895
896 // Otherwise there is no existing GV to use, create one now.
897 GlobalVariable *GV =
898 new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +0000899 CurModule.CurrentModule, IsThreadLocal);
Anton Korobeynikov178a3522007-01-12 19:22:51 +0000900 GV->setVisibility(Visibility);
Reid Spencer68a24bd2005-08-27 18:50:39 +0000901 InsertValue(GV, CurModule.Values);
Chris Lattnerb475c422005-11-12 18:22:38 +0000902 return GV;
Reid Spencer68a24bd2005-08-27 18:50:39 +0000903}
904
905// setTypeName - Set the specified type to the name given. The name may be
906// null potentially, in which case this is a noop. The string passed in is
907// assumed to be a malloc'd string buffer, and is freed by this function.
908//
909// This function returns true if the type has already been defined, but is
910// allowed to be redefined in the specified context. If the name is a new name
911// for the type plane, it is inserted and false is returned.
912static bool setTypeName(const Type *T, char *NameStr) {
Reid Spencera9720f52007-02-05 17:04:00 +0000913 assert(!inFunctionScope() && "Can't give types function-local names!");
Reid Spencer68a24bd2005-08-27 18:50:39 +0000914 if (NameStr == 0) return false;
915
916 std::string Name(NameStr); // Copy string
917 free(NameStr); // Free old string
918
919 // We don't allow assigning names to void type
Reid Spencer5b7e7532006-09-28 19:28:24 +0000920 if (T == Type::VoidTy) {
Reid Spencerb5334b02007-02-05 10:18:06 +0000921 GenerateError("Can't assign name '" + Name + "' to the void type");
Reid Spencer5b7e7532006-09-28 19:28:24 +0000922 return false;
923 }
Reid Spencer68a24bd2005-08-27 18:50:39 +0000924
925 // Set the type name, checking for conflicts as we do so.
926 bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T);
927
928 if (AlreadyExists) { // Inserting a name that is already defined???
929 const Type *Existing = CurModule.CurrentModule->getTypeByName(Name);
Reid Spencera9720f52007-02-05 17:04:00 +0000930 assert(Existing && "Conflict but no matching type?!");
Reid Spencer68a24bd2005-08-27 18:50:39 +0000931
932 // There is only one case where this is allowed: when we are refining an
933 // opaque type. In this case, Existing will be an opaque type.
934 if (const OpaqueType *OpTy = dyn_cast<OpaqueType>(Existing)) {
935 // We ARE replacing an opaque type!
936 const_cast<OpaqueType*>(OpTy)->refineAbstractTypeTo(T);
937 return true;
938 }
939
940 // Otherwise, this is an attempt to redefine a type. That's okay if
941 // the redefinition is identical to the original. This will be so if
942 // Existing and T point to the same Type object. In this one case we
943 // allow the equivalent redefinition.
944 if (Existing == T) return true; // Yes, it's equal.
945
946 // Any other kind of (non-equivalent) redefinition is an error.
Reid Spencer63c34452007-01-05 21:51:07 +0000947 GenerateError("Redefinition of type named '" + Name + "' of type '" +
Reid Spencerb5334b02007-02-05 10:18:06 +0000948 T->getDescription() + "'");
Reid Spencer68a24bd2005-08-27 18:50:39 +0000949 }
950
951 return false;
952}
953
954//===----------------------------------------------------------------------===//
955// Code for handling upreferences in type names...
956//
957
958// TypeContains - Returns true if Ty directly contains E in it.
959//
960static bool TypeContains(const Type *Ty, const Type *E) {
961 return std::find(Ty->subtype_begin(), Ty->subtype_end(),
962 E) != Ty->subtype_end();
963}
964
965namespace {
966 struct UpRefRecord {
967 // NestingLevel - The number of nesting levels that need to be popped before
968 // this type is resolved.
969 unsigned NestingLevel;
970
971 // LastContainedTy - This is the type at the current binding level for the
972 // type. Every time we reduce the nesting level, this gets updated.
973 const Type *LastContainedTy;
974
975 // UpRefTy - This is the actual opaque type that the upreference is
976 // represented with.
977 OpaqueType *UpRefTy;
978
979 UpRefRecord(unsigned NL, OpaqueType *URTy)
980 : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {}
981 };
982}
983
984// UpRefs - A list of the outstanding upreferences that need to be resolved.
985static std::vector<UpRefRecord> UpRefs;
986
987/// HandleUpRefs - Every time we finish a new layer of types, this function is
988/// called. It loops through the UpRefs vector, which is a list of the
989/// currently active types. For each type, if the up reference is contained in
990/// the newly completed type, we decrement the level count. When the level
991/// count reaches zero, the upreferenced type is the type that is passed in:
992/// thus we can complete the cycle.
993///
994static PATypeHolder HandleUpRefs(const Type *ty) {
Chris Lattner224f84f2006-08-18 17:34:45 +0000995 // If Ty isn't abstract, or if there are no up-references in it, then there is
996 // nothing to resolve here.
997 if (!ty->isAbstract() || UpRefs.empty()) return ty;
998
Reid Spencer68a24bd2005-08-27 18:50:39 +0000999 PATypeHolder Ty(ty);
1000 UR_OUT("Type '" << Ty->getDescription() <<
1001 "' newly formed. Resolving upreferences.\n" <<
1002 UpRefs.size() << " upreferences active!\n");
1003
1004 // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
1005 // to zero), we resolve them all together before we resolve them to Ty. At
1006 // the end of the loop, if there is anything to resolve to Ty, it will be in
1007 // this variable.
1008 OpaqueType *TypeToResolve = 0;
1009
1010 for (unsigned i = 0; i != UpRefs.size(); ++i) {
1011 UR_OUT(" UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
1012 << UpRefs[i].second->getDescription() << ") = "
1013 << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n");
1014 if (TypeContains(Ty, UpRefs[i].LastContainedTy)) {
1015 // Decrement level of upreference
1016 unsigned Level = --UpRefs[i].NestingLevel;
1017 UpRefs[i].LastContainedTy = Ty;
1018 UR_OUT(" Uplevel Ref Level = " << Level << "\n");
1019 if (Level == 0) { // Upreference should be resolved!
1020 if (!TypeToResolve) {
1021 TypeToResolve = UpRefs[i].UpRefTy;
1022 } else {
1023 UR_OUT(" * Resolving upreference for "
1024 << UpRefs[i].second->getDescription() << "\n";
1025 std::string OldName = UpRefs[i].UpRefTy->getDescription());
1026 UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
1027 UR_OUT(" * Type '" << OldName << "' refined upreference to: "
1028 << (const void*)Ty << ", " << Ty->getDescription() << "\n");
1029 }
1030 UpRefs.erase(UpRefs.begin()+i); // Remove from upreference list...
1031 --i; // Do not skip the next element...
1032 }
1033 }
1034 }
1035
1036 if (TypeToResolve) {
1037 UR_OUT(" * Resolving upreference for "
1038 << UpRefs[i].second->getDescription() << "\n";
1039 std::string OldName = TypeToResolve->getDescription());
1040 TypeToResolve->refineAbstractTypeTo(Ty);
1041 }
1042
1043 return Ty;
1044}
1045
Reid Spencer68a24bd2005-08-27 18:50:39 +00001046//===----------------------------------------------------------------------===//
1047// RunVMAsmParser - Define an interface to this parser
1048//===----------------------------------------------------------------------===//
1049//
Reid Spencer14310612006-12-31 05:40:51 +00001050static Module* RunParser(Module * M);
1051
Reid Spencer68a24bd2005-08-27 18:50:39 +00001052Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
1053 set_scan_file(F);
1054
1055 CurFilename = Filename;
1056 return RunParser(new Module(CurFilename));
1057}
1058
1059Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
1060 set_scan_string(AsmString);
1061
1062 CurFilename = "from_memory";
1063 if (M == NULL) {
1064 return RunParser(new Module (CurFilename));
1065 } else {
1066 return RunParser(M);
1067 }
1068}
1069
1070
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001071#line 938 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
1072typedef union {
Reid Spencer68a24bd2005-08-27 18:50:39 +00001073 llvm::Module *ModuleVal;
1074 llvm::Function *FunctionVal;
Reid Spencer68a24bd2005-08-27 18:50:39 +00001075 llvm::BasicBlock *BasicBlockVal;
1076 llvm::TerminatorInst *TermInstVal;
1077 llvm::Instruction *InstVal;
Reid Spencera132e042006-12-03 05:46:11 +00001078 llvm::Constant *ConstVal;
Reid Spencer68a24bd2005-08-27 18:50:39 +00001079
Reid Spencera132e042006-12-03 05:46:11 +00001080 const llvm::Type *PrimType;
Reid Spencer14310612006-12-31 05:40:51 +00001081 std::list<llvm::PATypeHolder> *TypeList;
Reid Spencera132e042006-12-03 05:46:11 +00001082 llvm::PATypeHolder *TypeVal;
1083 llvm::Value *ValueVal;
Reid Spencera132e042006-12-03 05:46:11 +00001084 std::vector<llvm::Value*> *ValueList;
Reid Spencer14310612006-12-31 05:40:51 +00001085 llvm::ArgListType *ArgList;
1086 llvm::TypeWithAttrs TypeWithAttrs;
1087 llvm::TypeWithAttrsList *TypeWithAttrsList;
1088 llvm::ValueRefList *ValueRefList;
1089
Reid Spencer68a24bd2005-08-27 18:50:39 +00001090 // Represent the RHS of PHI node
Reid Spencera132e042006-12-03 05:46:11 +00001091 std::list<std::pair<llvm::Value*,
1092 llvm::BasicBlock*> > *PHIList;
Reid Spencer68a24bd2005-08-27 18:50:39 +00001093 std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
Reid Spencera132e042006-12-03 05:46:11 +00001094 std::vector<llvm::Constant*> *ConstVector;
Reid Spencer68a24bd2005-08-27 18:50:39 +00001095
1096 llvm::GlobalValue::LinkageTypes Linkage;
Anton Korobeynikov178a3522007-01-12 19:22:51 +00001097 llvm::GlobalValue::VisibilityTypes Visibility;
Reid Spencer7b5d4662007-04-09 06:16:21 +00001098 uint16_t ParamAttrs;
Reid Spencer38c91a92007-02-28 02:24:54 +00001099 llvm::APInt *APIntVal;
Reid Spencer68a24bd2005-08-27 18:50:39 +00001100 int64_t SInt64Val;
1101 uint64_t UInt64Val;
1102 int SIntVal;
1103 unsigned UIntVal;
1104 double FPVal;
1105 bool BoolVal;
1106
1107 char *StrVal; // This memory is strdup'd!
Reid Spencer1628cec2006-10-26 06:15:43 +00001108 llvm::ValID ValIDVal; // strdup'd memory maybe!
Reid Spencer68a24bd2005-08-27 18:50:39 +00001109
Reid Spencera132e042006-12-03 05:46:11 +00001110 llvm::Instruction::BinaryOps BinaryOpVal;
1111 llvm::Instruction::TermOps TermOpVal;
1112 llvm::Instruction::MemoryOps MemOpVal;
1113 llvm::Instruction::CastOps CastOpVal;
1114 llvm::Instruction::OtherOps OtherOpVal;
Reid Spencera132e042006-12-03 05:46:11 +00001115 llvm::ICmpInst::Predicate IPredicate;
1116 llvm::FCmpInst::Predicate FPredicate;
Reid Spencer7780acb2007-04-16 06:56:07 +00001117} YYSTYPE;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001118#include <stdio.h>
1119
1120#ifndef __cplusplus
1121#ifndef __STDC__
1122#define const
1123#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00001124#endif
1125
Reid Spencer41dff5e2007-01-26 08:05:27 +00001126
Reid Spencer68a24bd2005-08-27 18:50:39 +00001127
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001128#define YYFINAL 565
1129#define YYFLAG -32768
1130#define YYNTBASE 149
Reid Spencer68a24bd2005-08-27 18:50:39 +00001131
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001132#define YYTRANSLATE(x) ((unsigned)(x) <= 388 ? yytranslate[x] : 227)
Reid Spencer68a24bd2005-08-27 18:50:39 +00001133
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001134static const short yytranslate[] = { 0,
1135 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1136 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1137 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1138 2, 2, 2, 2, 2, 2, 2, 2, 2, 139,
1139 140, 137, 2, 136, 2, 2, 2, 2, 2, 2,
1140 2, 2, 2, 2, 2, 2, 2, 2, 2, 144,
1141 135, 145, 2, 2, 2, 2, 2, 2, 2, 2,
1142 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1143 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1144 141, 138, 143, 2, 2, 2, 2, 2, 148, 2,
1145 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1146 2, 2, 2, 2, 2, 2, 2, 2, 2, 142,
1147 2, 2, 146, 2, 147, 2, 2, 2, 2, 2,
1148 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1149 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1150 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1151 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1152 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1153 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1154 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1155 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1156 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1157 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1158 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1159 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1160 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
1161 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
1162 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
1163 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
1164 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
1165 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
1166 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
1167 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
1168 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
1169 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
1170 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
1171 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
1172 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
1173 127, 128, 129, 130, 131, 132, 133, 134
1174};
Reid Spencer41dff5e2007-01-26 08:05:27 +00001175
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001176#if YYDEBUG != 0
1177static const short yyprhs[] = { 0,
1178 0, 2, 4, 6, 8, 10, 12, 14, 16, 18,
1179 20, 22, 24, 26, 28, 30, 32, 34, 36, 38,
1180 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
1181 60, 62, 64, 66, 68, 70, 72, 74, 76, 78,
1182 80, 82, 84, 86, 88, 90, 92, 94, 96, 98,
1183 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
1184 119, 122, 123, 125, 127, 130, 131, 133, 135, 137,
1185 139, 141, 143, 145, 147, 148, 150, 151, 153, 155,
1186 156, 158, 160, 162, 164, 165, 167, 169, 171, 173,
1187 175, 178, 180, 182, 184, 186, 187, 190, 192, 194,
1188 196, 197, 200, 201, 204, 205, 209, 212, 213, 215,
1189 216, 220, 222, 225, 227, 229, 231, 233, 235, 237,
1190 240, 242, 245, 251, 257, 263, 269, 273, 276, 282,
1191 287, 290, 292, 294, 296, 300, 302, 306, 308, 309,
1192 311, 315, 320, 324, 328, 333, 338, 342, 349, 355,
1193 358, 361, 364, 367, 370, 373, 376, 379, 382, 385,
1194 388, 391, 398, 404, 413, 420, 427, 435, 443, 450,
1195 459, 468, 472, 474, 476, 478, 480, 481, 483, 484,
1196 486, 489, 490, 494, 495, 499, 503, 507, 511, 512,
1197 520, 521, 530, 531, 540, 543, 547, 549, 553, 557,
1198 561, 565, 567, 568, 574, 578, 580, 584, 586, 587,
1199 597, 599, 601, 606, 608, 610, 613, 617, 618, 620,
1200 622, 624, 626, 628, 630, 632, 634, 636, 640, 642,
1201 648, 650, 652, 654, 656, 658, 660, 663, 666, 669,
1202 673, 676, 677, 679, 682, 685, 689, 699, 709, 718,
1203 733, 735, 737, 744, 750, 753, 760, 768, 772, 778,
1204 779, 780, 784, 787, 789, 795, 801, 808, 815, 820,
1205 827, 832, 837, 844, 851, 854, 863, 865, 867, 868,
1206 872, 879, 883, 890, 893, 899, 907
1207};
Chris Lattner9d2fda62007-02-13 05:53:56 +00001208
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001209static const short yyrhs[] = { 68,
1210 0, 69, 0, 70, 0, 71, 0, 72, 0, 73,
1211 0, 74, 0, 75, 0, 76, 0, 80, 0, 81,
1212 0, 82, 0, 77, 0, 78, 0, 79, 0, 111,
1213 0, 112, 0, 113, 0, 114, 0, 115, 0, 116,
1214 0, 117, 0, 118, 0, 119, 0, 120, 0, 121,
1215 0, 122, 0, 85, 0, 86, 0, 87, 0, 88,
1216 0, 89, 0, 90, 0, 91, 0, 92, 0, 93,
1217 0, 94, 0, 95, 0, 96, 0, 97, 0, 98,
1218 0, 99, 0, 100, 0, 101, 0, 102, 0, 103,
1219 0, 104, 0, 91, 0, 92, 0, 93, 0, 94,
1220 0, 22, 0, 23, 0, 11, 0, 12, 0, 13,
1221 0, 16, 0, 19, 0, 156, 0, 0, 156, 135,
1222 0, 0, 17, 0, 20, 0, 159, 135, 0, 0,
1223 37, 0, 39, 0, 38, 0, 40, 0, 42, 0,
1224 41, 0, 43, 0, 45, 0, 0, 134, 0, 0,
1225 41, 0, 43, 0, 0, 37, 0, 38, 0, 39,
1226 0, 42, 0, 0, 56, 0, 57, 0, 58, 0,
1227 59, 0, 60, 0, 55, 4, 0, 112, 0, 113,
1228 0, 130, 0, 131, 0, 0, 168, 167, 0, 129,
1229 0, 132, 0, 167, 0, 0, 170, 169, 0, 0,
1230 48, 4, 0, 0, 136, 48, 4, 0, 30, 19,
1231 0, 0, 173, 0, 0, 136, 176, 175, 0, 173,
1232 0, 48, 4, 0, 11, 0, 12, 0, 13, 0,
1233 14, 0, 44, 0, 177, 0, 178, 137, 0, 211,
1234 0, 138, 4, 0, 178, 139, 182, 140, 170, 0,
1235 10, 139, 182, 140, 170, 0, 141, 4, 142, 178,
1236 143, 0, 144, 4, 142, 178, 145, 0, 146, 183,
1237 147, 0, 146, 147, 0, 144, 146, 183, 147, 145,
1238 0, 144, 146, 147, 145, 0, 178, 168, 0, 178,
1239 0, 10, 0, 179, 0, 181, 136, 179, 0, 181,
1240 0, 181, 136, 34, 0, 34, 0, 0, 178, 0,
1241 183, 136, 178, 0, 178, 141, 186, 143, 0, 178,
1242 141, 143, 0, 178, 148, 19, 0, 178, 144, 186,
1243 145, 0, 178, 146, 186, 147, 0, 178, 146, 147,
1244 0, 178, 144, 146, 186, 147, 145, 0, 178, 144,
1245 146, 147, 145, 0, 178, 35, 0, 178, 36, 0,
1246 178, 211, 0, 178, 185, 0, 178, 21, 0, 154,
1247 3, 0, 154, 5, 0, 154, 4, 0, 154, 6,
1248 0, 11, 22, 0, 11, 23, 0, 155, 9, 0,
1249 151, 139, 184, 33, 178, 140, 0, 110, 139, 184,
1250 222, 140, 0, 124, 139, 184, 136, 184, 136, 184,
1251 140, 0, 149, 139, 184, 136, 184, 140, 0, 150,
1252 139, 184, 136, 184, 140, 0, 83, 152, 139, 184,
1253 136, 184, 140, 0, 84, 153, 139, 184, 136, 184,
1254 140, 0, 126, 139, 184, 136, 184, 140, 0, 127,
1255 139, 184, 136, 184, 136, 184, 140, 0, 128, 139,
1256 184, 136, 184, 136, 184, 140, 0, 186, 136, 184,
1257 0, 184, 0, 28, 0, 29, 0, 32, 0, 0,
1258 190, 0, 0, 191, 0, 190, 191, 0, 0, 27,
1259 192, 207, 0, 0, 26, 193, 208, 0, 53, 52,
1260 197, 0, 158, 15, 178, 0, 158, 15, 10, 0,
1261 0, 160, 163, 188, 187, 184, 194, 175, 0, 0,
1262 160, 161, 163, 188, 187, 184, 195, 175, 0, 0,
1263 160, 162, 163, 188, 187, 178, 196, 175, 0, 46,
1264 198, 0, 49, 135, 199, 0, 19, 0, 47, 135,
1265 19, 0, 61, 135, 19, 0, 141, 200, 143, 0,
1266 200, 136, 19, 0, 19, 0, 0, 201, 136, 178,
1267 168, 157, 0, 178, 168, 157, 0, 201, 0, 201,
1268 136, 34, 0, 34, 0, 0, 166, 180, 159, 139,
1269 202, 140, 170, 174, 171, 0, 24, 0, 146, 0,
1270 165, 163, 203, 204, 0, 25, 0, 147, 0, 214,
1271 206, 0, 164, 163, 203, 0, 0, 54, 0, 3,
1272 0, 4, 0, 9, 0, 22, 0, 23, 0, 35,
1273 0, 36, 0, 21, 0, 144, 186, 145, 0, 185,
1274 0, 52, 209, 19, 136, 19, 0, 7, 0, 8,
1275 0, 156, 0, 159, 0, 211, 0, 210, 0, 178,
1276 212, 0, 214, 215, 0, 205, 215, 0, 216, 158,
1277 217, 0, 216, 219, 0, 0, 18, 0, 62, 213,
1278 0, 62, 10, 0, 63, 14, 212, 0, 63, 11,
1279 212, 136, 14, 212, 136, 14, 212, 0, 64, 154,
1280 212, 136, 14, 212, 141, 218, 143, 0, 64, 154,
1281 212, 136, 14, 212, 141, 143, 0, 65, 166, 180,
1282 212, 139, 221, 140, 170, 33, 14, 212, 66, 14,
1283 212, 0, 66, 0, 67, 0, 218, 154, 210, 136,
1284 14, 212, 0, 154, 210, 136, 14, 212, 0, 158,
1285 224, 0, 178, 141, 212, 136, 212, 143, 0, 220,
1286 136, 141, 212, 136, 212, 143, 0, 178, 212, 168,
1287 0, 221, 136, 178, 212, 168, 0, 0, 0, 222,
1288 136, 213, 0, 51, 50, 0, 50, 0, 149, 178,
1289 212, 136, 212, 0, 150, 178, 212, 136, 212, 0,
1290 83, 152, 178, 212, 136, 212, 0, 84, 153, 178,
1291 212, 136, 212, 0, 151, 213, 33, 178, 0, 124,
1292 213, 136, 213, 136, 213, 0, 125, 213, 136, 178,
1293 0, 126, 213, 136, 213, 0, 127, 213, 136, 213,
1294 136, 213, 0, 128, 213, 136, 213, 136, 213, 0,
1295 123, 220, 0, 223, 166, 180, 212, 139, 221, 140,
1296 170, 0, 226, 0, 31, 0, 0, 105, 178, 172,
1297 0, 105, 178, 136, 11, 212, 172, 0, 106, 178,
1298 172, 0, 106, 178, 136, 11, 212, 172, 0, 107,
1299 213, 0, 225, 108, 178, 212, 172, 0, 225, 109,
1300 213, 136, 178, 212, 172, 0, 110, 178, 212, 222,
1301 0
1302};
Chris Lattner9d2fda62007-02-13 05:53:56 +00001303
Anton Korobeynikov178a3522007-01-12 19:22:51 +00001304#endif
1305
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001306#if YYDEBUG != 0
1307static const short yyrline[] = { 0,
1308 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1094,
1309 1094, 1094, 1094, 1094, 1094, 1095, 1095, 1095, 1095, 1095,
1310 1095, 1095, 1096, 1096, 1096, 1096, 1096, 1099, 1099, 1100,
1311 1100, 1101, 1101, 1102, 1102, 1103, 1103, 1107, 1107, 1108,
1312 1108, 1109, 1109, 1110, 1110, 1111, 1111, 1112, 1112, 1113,
1313 1113, 1114, 1115, 1120, 1121, 1121, 1123, 1123, 1124, 1124,
1314 1128, 1132, 1137, 1137, 1139, 1143, 1149, 1150, 1151, 1152,
1315 1153, 1157, 1158, 1159, 1163, 1164, 1168, 1169, 1170, 1174,
1316 1175, 1176, 1177, 1178, 1181, 1181, 1182, 1183, 1184, 1185,
1317 1186, 1194, 1195, 1196, 1197, 1200, 1201, 1206, 1207, 1208,
1318 1211, 1212, 1219, 1219, 1226, 1226, 1235, 1243, 1243, 1249,
1319 1249, 1251, 1256, 1269, 1269, 1269, 1269, 1272, 1276, 1280,
1320 1287, 1292, 1300, 1326, 1353, 1358, 1370, 1380, 1384, 1394,
1321 1401, 1408, 1415, 1420, 1425, 1432, 1433, 1440, 1447, 1455,
1322 1461, 1473, 1501, 1517, 1546, 1574, 1599, 1618, 1644, 1664,
1323 1676, 1683, 1749, 1759, 1769, 1775, 1785, 1791, 1801, 1806,
1324 1811, 1819, 1831, 1853, 1861, 1867, 1878, 1883, 1888, 1894,
1325 1900, 1909, 1913, 1921, 1921, 1924, 1924, 1935, 1940, 1948,
1326 1949, 1953, 1953, 1957, 1957, 1960, 1963, 1987, 1998, 2005,
1327 2008, 2013, 2016, 2022, 2026, 2029, 2035, 2048, 2052, 2057,
1328 2059, 2064, 2069, 2078, 2088, 2099, 2103, 2112, 2121, 2126,
1329 2245, 2245, 2247, 2256, 2256, 2258, 2263, 2275, 2279, 2284,
1330 2288, 2292, 2296, 2300, 2304, 2308, 2312, 2316, 2341, 2345,
1331 2359, 2363, 2367, 2371, 2377, 2377, 2383, 2392, 2396, 2405,
1332 2414, 2423, 2427, 2432, 2436, 2440, 2445, 2455, 2474, 2483,
1333 2559, 2563, 2570, 2581, 2594, 2604, 2615, 2625, 2634, 2643,
1334 2646, 2647, 2654, 2658, 2663, 2684, 2701, 2715, 2729, 2741,
1335 2749, 2756, 2762, 2768, 2774, 2789, 2870, 2875, 2879, 2886,
1336 2893, 2901, 2908, 2916, 2924, 2938, 2955
1337};
1338#endif
1339
1340
1341#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
1342
1343static const char * const yytname[] = { "$","error","$undefined.","ESINT64VAL",
1344"EUINT64VAL","ESAPINTVAL","EUAPINTVAL","LOCALVAL_ID","GLOBALVAL_ID","FPVAL",
1345"VOID","INTTYPE","FLOAT","DOUBLE","LABEL","TYPE","LOCALVAR","GLOBALVAR","LABELSTR",
1346"STRINGCONSTANT","ATSTRINGCONSTANT","ZEROINITIALIZER","TRUETOK","FALSETOK","BEGINTOK",
1347"ENDTOK","DECLARE","DEFINE","GLOBAL","CONSTANT","SECTION","VOLATILE","THREAD_LOCAL",
1348"TO","DOTDOTDOT","NULL_TOK","UNDEF","INTERNAL","LINKONCE","WEAK","APPENDING",
1349"DLLIMPORT","DLLEXPORT","EXTERN_WEAK","OPAQUE","EXTERNAL","TARGET","TRIPLE",
1350"ALIGN","DEPLIBS","CALL","TAIL","ASM_TOK","MODULE","SIDEEFFECT","CC_TOK","CCC_TOK",
1351"FASTCC_TOK","COLDCC_TOK","X86_STDCALLCC_TOK","X86_FASTCALLCC_TOK","DATALAYOUT",
1352"RET","BR","SWITCH","INVOKE","UNWIND","UNREACHABLE","ADD","SUB","MUL","UDIV",
1353"SDIV","FDIV","UREM","SREM","FREM","AND","OR","XOR","SHL","LSHR","ASHR","ICMP",
1354"FCMP","EQ","NE","SLT","SGT","SLE","SGE","ULT","UGT","ULE","UGE","OEQ","ONE",
1355"OLT","OGT","OLE","OGE","ORD","UNO","UEQ","UNE","MALLOC","ALLOCA","FREE","LOAD",
1356"STORE","GETELEMENTPTR","TRUNC","ZEXT","SEXT","FPTRUNC","FPEXT","BITCAST","UITOFP",
1357"SITOFP","FPTOUI","FPTOSI","INTTOPTR","PTRTOINT","PHI_TOK","SELECT","VAARG",
1358"EXTRACTELEMENT","INSERTELEMENT","SHUFFLEVECTOR","NORETURN","INREG","SRET","NOUNWIND",
1359"DEFAULT","HIDDEN","'='","','","'*'","'\\\\'","'('","')'","'['","'x'","']'",
1360"'<'","'>'","'{'","'}'","'c'","ArithmeticOps","LogicalOps","CastOps","IPredicates",
1361"FPredicates","IntType","FPType","LocalName","OptLocalName","OptLocalAssign",
1362"GlobalName","OptGlobalAssign","GVInternalLinkage","GVExternalLinkage","GVVisibilityStyle",
1363"FunctionDeclareLinkage","FunctionDefineLinkage","OptCallingConv","ParamAttr",
1364"OptParamAttrs","FuncAttr","OptFuncAttrs","OptAlign","OptCAlign","SectionString",
1365"OptSection","GlobalVarAttributes","GlobalVarAttribute","PrimType","Types","ArgType",
1366"ResultTypes","ArgTypeList","ArgTypeListI","TypeListI","ConstVal","ConstExpr",
1367"ConstVector","GlobalType","ThreadLocal","Module","DefinitionList","Definition",
1368"@1","@2","@3","@4","@5","AsmBlock","TargetDefinition","LibrariesDefinition",
1369"LibList","ArgListH","ArgList","FunctionHeaderH","BEGIN","FunctionHeader","END",
1370"Function","FunctionProto","OptSideEffect","ConstValueRef","SymbolicValueRef",
1371"ValueRef","ResolvedVal","BasicBlockList","BasicBlock","InstructionList","BBTerminatorInst",
1372"JumpTable","Inst","PHIList","ValueRefList","IndexList","OptTailCall","InstVal",
1373"OptVolatile","MemoryInst", NULL
1374};
1375#endif
1376
1377static const short yyr1[] = { 0,
1378 149, 149, 149, 149, 149, 149, 149, 149, 149, 150,
1379 150, 150, 150, 150, 150, 151, 151, 151, 151, 151,
1380 151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
1381 152, 152, 152, 152, 152, 152, 152, 153, 153, 153,
1382 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
1383 153, 153, 153, 154, 155, 155, 156, 156, 157, 157,
1384 158, 158, 159, 159, 160, 160, 161, 161, 161, 161,
1385 161, 162, 162, 162, 163, 163, 164, 164, 164, 165,
1386 165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
1387 166, 167, 167, 167, 167, 168, 168, 169, 169, 169,
1388 170, 170, 171, 171, 172, 172, 173, 174, 174, 175,
1389 175, 176, 176, 177, 177, 177, 177, 178, 178, 178,
1390 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
1391 179, 180, 180, 181, 181, 182, 182, 182, 182, 183,
1392 183, 184, 184, 184, 184, 184, 184, 184, 184, 184,
1393 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
1394 184, 185, 185, 185, 185, 185, 185, 185, 185, 185,
1395 185, 186, 186, 187, 187, 188, 188, 189, 189, 190,
1396 190, 192, 191, 193, 191, 191, 191, 191, 194, 191,
1397 195, 191, 196, 191, 191, 191, 197, 198, 198, 199,
1398 200, 200, 200, 201, 201, 202, 202, 202, 202, 203,
1399 204, 204, 205, 206, 206, 207, 208, 209, 209, 210,
1400 210, 210, 210, 210, 210, 210, 210, 210, 210, 210,
1401 211, 211, 211, 211, 212, 212, 213, 214, 214, 215,
1402 216, 216, 216, 217, 217, 217, 217, 217, 217, 217,
1403 217, 217, 218, 218, 219, 220, 220, 221, 221, 221,
1404 222, 222, 223, 223, 224, 224, 224, 224, 224, 224,
1405 224, 224, 224, 224, 224, 224, 224, 225, 225, 226,
1406 226, 226, 226, 226, 226, 226, 226
1407};
1408
1409static const short yyr2[] = { 0,
1410 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1411 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1412 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1413 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1414 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1415 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1416 2, 0, 1, 1, 2, 0, 1, 1, 1, 1,
1417 1, 1, 1, 1, 0, 1, 0, 1, 1, 0,
1418 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
1419 2, 1, 1, 1, 1, 0, 2, 1, 1, 1,
1420 0, 2, 0, 2, 0, 3, 2, 0, 1, 0,
1421 3, 1, 2, 1, 1, 1, 1, 1, 1, 2,
1422 1, 2, 5, 5, 5, 5, 3, 2, 5, 4,
1423 2, 1, 1, 1, 3, 1, 3, 1, 0, 1,
1424 3, 4, 3, 3, 4, 4, 3, 6, 5, 2,
1425 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1426 2, 6, 5, 8, 6, 6, 7, 7, 6, 8,
1427 8, 3, 1, 1, 1, 1, 0, 1, 0, 1,
1428 2, 0, 3, 0, 3, 3, 3, 3, 0, 7,
1429 0, 8, 0, 8, 2, 3, 1, 3, 3, 3,
1430 3, 1, 0, 5, 3, 1, 3, 1, 0, 9,
1431 1, 1, 4, 1, 1, 2, 3, 0, 1, 1,
1432 1, 1, 1, 1, 1, 1, 1, 3, 1, 5,
1433 1, 1, 1, 1, 1, 1, 2, 2, 2, 3,
1434 2, 0, 1, 2, 2, 3, 9, 9, 8, 14,
1435 1, 1, 6, 5, 2, 6, 7, 3, 5, 0,
1436 0, 3, 2, 1, 5, 5, 6, 6, 4, 6,
1437 4, 4, 6, 6, 2, 8, 1, 1, 0, 3,
1438 6, 3, 6, 2, 5, 7, 4
1439};
1440
1441static const short yydefact[] = { 66,
1442 57, 63, 58, 64, 184, 182, 0, 0, 0, 0,
1443 0, 0, 75, 66, 180, 77, 80, 0, 0, 195,
1444 0, 0, 61, 0, 65, 67, 69, 68, 70, 72,
1445 71, 73, 74, 76, 75, 75, 177, 181, 78, 79,
1446 75, 185, 81, 82, 83, 84, 75, 242, 183, 242,
1447 0, 0, 203, 196, 197, 186, 231, 232, 188, 114,
1448 115, 116, 117, 118, 0, 0, 0, 0, 233, 234,
1449 119, 187, 121, 177, 177, 176, 0, 85, 85, 243,
1450 239, 62, 214, 215, 216, 238, 198, 199, 202, 0,
1451 139, 122, 0, 0, 0, 0, 128, 140, 0, 120,
1452 139, 0, 0, 174, 175, 0, 0, 86, 87, 88,
1453 89, 90, 0, 217, 0, 279, 241, 0, 200, 138,
1454 96, 134, 136, 0, 0, 0, 0, 0, 0, 127,
1455 0, 0, 0, 114, 115, 116, 0, 0, 0, 189,
1456 91, 133, 132, 0, 211, 212, 213, 278, 264, 0,
1457 0, 0, 0, 85, 251, 252, 1, 2, 3, 4,
1458 5, 6, 7, 8, 9, 13, 14, 15, 10, 11,
1459 12, 0, 0, 0, 0, 0, 0, 16, 17, 18,
1460 19, 20, 21, 22, 23, 24, 25, 26, 27, 0,
1461 0, 0, 0, 0, 0, 0, 0, 0, 240, 85,
1462 255, 0, 277, 201, 131, 0, 101, 0, 0, 130,
1463 0, 141, 101, 191, 193, 159, 160, 155, 157, 156,
1464 158, 161, 154, 150, 151, 0, 0, 0, 0, 0,
1465 0, 0, 0, 0, 0, 0, 0, 0, 0, 153,
1466 152, 110, 0, 263, 245, 0, 244, 0, 0, 54,
1467 0, 0, 28, 29, 30, 31, 32, 33, 34, 35,
1468 36, 37, 0, 52, 53, 48, 49, 50, 51, 38,
1469 39, 40, 41, 42, 43, 44, 45, 46, 47, 0,
1470 105, 105, 284, 0, 0, 275, 0, 0, 0, 0,
1471 0, 0, 0, 0, 0, 0, 0, 92, 93, 94,
1472 95, 97, 137, 135, 124, 125, 126, 129, 123, 110,
1473 110, 0, 0, 0, 0, 0, 0, 0, 143, 173,
1474 0, 0, 0, 147, 0, 144, 0, 0, 0, 0,
1475 190, 209, 220, 221, 222, 227, 223, 224, 225, 226,
1476 218, 0, 229, 236, 235, 237, 0, 246, 0, 0,
1477 0, 0, 0, 280, 0, 282, 261, 0, 0, 0,
1478 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1479 98, 99, 100, 102, 192, 194, 0, 0, 261, 0,
1480 0, 0, 0, 0, 142, 128, 140, 0, 145, 146,
1481 0, 0, 0, 0, 0, 112, 110, 208, 96, 206,
1482 0, 219, 0, 0, 0, 0, 0, 0, 0, 0,
1483 0, 0, 287, 0, 0, 0, 271, 272, 0, 0,
1484 0, 0, 269, 0, 105, 0, 0, 0, 0, 0,
1485 0, 0, 0, 172, 149, 0, 0, 0, 0, 107,
1486 113, 111, 60, 0, 101, 0, 228, 0, 0, 260,
1487 0, 0, 105, 106, 105, 0, 0, 0, 0, 0,
1488 0, 265, 266, 260, 0, 285, 0, 0, 0, 163,
1489 0, 0, 0, 0, 148, 0, 0, 0, 59, 205,
1490 207, 96, 108, 0, 0, 0, 0, 0, 267, 268,
1491 281, 283, 262, 0, 0, 270, 273, 274, 0, 105,
1492 0, 0, 0, 169, 0, 0, 165, 166, 162, 60,
1493 109, 103, 230, 0, 0, 96, 0, 101, 256, 0,
1494 101, 286, 167, 168, 0, 0, 0, 204, 0, 210,
1495 0, 249, 0, 0, 258, 0, 0, 257, 276, 164,
1496 170, 171, 104, 247, 0, 248, 0, 96, 0, 0,
1497 0, 259, 0, 0, 0, 0, 254, 0, 0, 253,
1498 0, 250, 0, 0, 0
1499};
1500
1501static const short yydefgoto[] = { 237,
1502 238, 239, 263, 280, 137, 138, 69, 480, 11, 70,
1503 13, 35, 36, 37, 41, 47, 113, 302, 205, 374,
1504 305, 530, 354, 396, 512, 331, 397, 71, 139, 122,
1505 144, 123, 124, 99, 320, 343, 321, 106, 77, 563,
1506 14, 15, 17, 16, 242, 310, 311, 56, 20, 54,
1507 90, 400, 401, 114, 147, 48, 85, 49, 42, 403,
1508 344, 73, 346, 247, 50, 81, 82, 199, 534, 117,
1509 286, 488, 413, 200, 201, 202, 203
1510};
1511
1512static const short yypact[] = { 593,
1513-32768,-32768,-32768,-32768,-32768,-32768, -1, -87, 11, -41,
1514 89, -13, 46, 1408,-32768, 185, 82, 13, 55,-32768,
1515 81, 211,-32768, 1122,-32768,-32768,-32768,-32768,-32768,-32768,
1516-32768,-32768,-32768,-32768, 98, 98, 206,-32768,-32768,-32768,
1517 98,-32768,-32768,-32768,-32768,-32768, 98, 235,-32768, 8,
1518 242, 251, 252,-32768,-32768,-32768,-32768,-32768, 128,-32768,
1519-32768,-32768,-32768,-32768, 272, 274, 4, 122,-32768,-32768,
1520-32768, 61,-32768, 206, 206,-32768, 183, 290, 290,-32768,
1521-32768, 121,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -92,
1522 979,-32768, 137, 139, 284, 128,-32768, 61, -70,-32768,
1523 979, 183, 183,-32768,-32768, 1136, 278,-32768,-32768,-32768,
1524-32768,-32768, 1178,-32768, -15, 1277,-32768, 264,-32768,-32768,
1525 61,-32768, 148, 153, 1192, 1192, 160, -66, 1192,-32768,
1526 162, 1136, 1192, 32, 297, 298, 215, 301, 761,-32768,
1527-32768, 128, 61, 145,-32768,-32768,-32768,-32768,-32768, 262,
1528 1234, 248, 304, 290,-32768,-32768,-32768,-32768,-32768,-32768,
1529-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
1530-32768, 157, 422, 1192, 1192, 1192, 1192,-32768,-32768,-32768,
1531-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1192,
1532 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192,-32768, 290,
1533-32768, -34,-32768,-32768, -33, 1019,-32768, 71, -22,-32768,
1534 173, 61,-32768,-32768, 61,-32768,-32768,-32768,-32768,-32768,
1535-32768,-32768,-32768,-32768,-32768, 157, 422, 180, 181, 182,
1536 184, 186, 1038, 1276, 448, 305, 187, 188, 191,-32768,
1537-32768, 193, 192,-32768, 128, 614,-32768, 740, 740,-32768,
1538 740, 1178,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
1539-32768,-32768, 1192,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
1540-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1192,
1541 88, 119,-32768, 614, 62, 197, 198, 199, 200, 207,
1542 217, 614, 614, 309, 1178, 1192, 1192,-32768,-32768,-32768,
1543-32768,-32768,-32768,-32768, -73,-32768,-32768,-32768, -73, 193,
1544 193, 212, 216, 1136, 1136, 1136, 1136, 1136,-32768,-32768,
1545 -44, 933, -69,-32768, -40,-32768, 1136, 1136, 1136, -5,
1546-32768, 1077,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
1547 300, 1136,-32768,-32768,-32768,-32768, 220,-32768, 221, 740,
1548 614, 614, 17,-32768, 23,-32768,-32768, 740, 218, 1192,
1549 1192, 1192, 1192, 1192, 222, 225, 1192, 740, 614, 226,
1550-32768,-32768,-32768,-32768,-32768,-32768, 1136, 1136,-32768, 227,
1551 229, 230, 231, 1136,-32768, 228, 761, -35,-32768,-32768,
1552 234, 236, 341, 356, 372,-32768, 193,-32768, 61, 241,
1553 238,-32768, 360, -36, 366, 367, 243, 253, 254, 740,
1554 387, 740, 256, 257, 740, 258, 61,-32768, 259, 266,
1555 740, 740, 61, 261, 269, 1192, 270, 271, -67, 1136,
1556 1136, 1136, 1136,-32768,-32768, 263, 1136, 1136, 1192,-32768,
1557-32768,-32768, 33, 1093,-32768, 273,-32768, 740, 740, 1192,
1558 740, 740, 269,-32768, 269, 1192, 740, 275, 1192, 1192,
1559 1192,-32768,-32768, 1192, 362,-32768, 614, 1136, 1136,-32768,
1560 279, 277, 288, 293,-32768, 280, 292, 42,-32768,-32768,
1561-32768, 61, 65, 395, 299, 308, 614, 7,-32768,-32768,
1562-32768,-32768,-32768, 291, 740,-32768,-32768,-32768, 73, 269,
1563 302, 306, 1136,-32768, 1136, 1136,-32768,-32768,-32768, 33,
1564-32768, 391,-32768, 426, 1,-32768, 1192,-32768,-32768, 307,
1565-32768,-32768,-32768,-32768, 311, 312, 313,-32768, 453,-32768,
1566 740,-32768, 890, 18, -33, 614, 75,-32768, -73,-32768,
1567-32768,-32768,-32768,-32768, 327,-32768, 890,-32768, 452, 455,
1568 337, -33, 740, 740, 460, 409,-32768, 740, 462,-32768,
1569 740,-32768, 477, 479,-32768
1570};
1571
1572static const short yypgoto[] = { 364,
1573 365, 368, 260, 255, -151,-32768, 0, -27, 403, 16,
1574-32768,-32768,-32768, 6,-32768,-32768, -139, -298, -389,-32768,
1575 -210,-32768, -269, 10,-32768, -279,-32768,-32768, -23, 281,
1576 -233,-32768, 389, 396, 70, -133, -217, 134, 190,-32768,
1577-32768, 481,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
1578-32768,-32768,-32768, 417,-32768,-32768,-32768,-32768,-32768,-32768,
1579 -483, -135, 120, -171,-32768, 447,-32768,-32768,-32768,-32768,
1580-32768, 34, 125,-32768,-32768,-32768,-32768
1581};
1582
1583
1584#define YYLAST 1461
1585
1586
1587static const short yytable[] = { 10,
1588 72, 251, 309, 241, 283, 240, 373, 94, 145, 443,
1589 373, 250, 356, 10, 252, 12, 323, 325, 350, 287,
1590 288, 289, 290, 291, 394, 80, 294, 410, 250, 12,
1591 375, 376, 83, 412, -54, -54, -54, -54, 298, 299,
1592 74, 75, 395, 118, 98, 18, 78, 21, 1, 545,
1593 119, 3, 79, 216, 217, 371, 300, 301, 372, 19,
1594 295, 368, 22, 551, 411, 129, 384, 121, 456, 129,
1595 411, 98, 470, 296, 297, 389, 130, 121, 298, 299,
1596 211, 10, 26, 27, 28, 29, 30, 31, 32, 143,
1597 33, 384, 510, 23, 394, 384, 300, 301, 385, 384,
1598 384, 208, 209, 24, 388, 212, 390, 549, 447, 215,
1599 345, 436, 345, 345, 100, 345, 101, 442, 43, 44,
1600 45, 25, 307, 46, 404, 370, 535, 246, 57, 58,
1601 146, 96, 60, 61, 62, 63, 1, 1, 2, 3,
1602 3, 4, 517, 532, 298, 299, 518, 51, 345, 95,
1603 281, 282, 246, 284, 84, 466, 345, 345, 552, 243,
1604 546, 2, 300, 301, 4, 64, 285, 246, 246, 246,
1605 246, 246, 292, 293, 246, 140, 298, 299, 100, 34,
1606 101, 509, 121, 491, 373, 492, 298, 299, 416, 52,
1607 418, 419, 420, 371, 300, 301, 372, 100, 100, 101,
1608 101, 214, 358, 371, 300, 301, 372, 100, 517, 101,
1609 104, 105, 521, 306, 345, 345, 345, 218, 219, 220,
1610 221, 53, 345, 353, 100, 39, 101, 40, 143, 55,
1611 522, 34, 345, 345, 483, 132, 133, 76, 373, 351,
1612 373, 253, 254, 255, 256, 257, 258, 259, 260, 261,
1613 262, 241, 80, 240, 355, 100, 352, 101, 248, 65,
1614 87, 249, 66, 102, 103, 67, 91, 68, 97, 88,
1615 89, 143, 369, 246, 345, 92, 345, 93, 125, 345,
1616 126, 141, 204, 206, 493, 345, 345, 496, 497, 498,
1617 57, 58, 207, 96, 60, 61, 62, 63, 387, 1,
1618 2, 213, 3, 4, 210, -55, -56, 537, 399, 222,
1619 539, 244, 345, 345, 250, 345, 345, 308, 314, 315,
1620 316, 345, 317, 326, 318, 327, 328, 64, 330, 329,
1621 332, 345, 359, 360, 361, 362, 246, 417, 246, 246,
1622 246, 367, 363, 423, 107, 108, 109, 110, 111, 112,
1623 377, 345, 364, 402, 378, 405, 406, 421, 415, 345,
1624 422, 426, 430, 533, 431, 432, 433, 347, 348, 437,
1625 349, 438, 435, 439, 440, 441, 444, 445, 446, 448,
1626 449, 450, 547, 379, 380, 381, 382, 383, 451, 452,
1627 454, 456, 457, 459, 460, 345, 391, 392, 393, 464,
1628 345, 461, 467, 357, 465, 468, 469, 475, 484, 411,
1629 495, 365, 366, 513, 503, 478, 504, 345, 345, 507,
1630 482, 65, 345, 505, 66, 345, 487, 67, 506, 68,
1631 127, 508, 246, 519, 514, 246, 246, 246, 529, 531,
1632 487, 523, 479, 264, 265, 524, 427, 428, 515, 538,
1633 540, 541, 542, 434, 57, 58, 543, 96, 134, 135,
1634 136, 63, 550, 1, 2, 553, 3, 4, 554, 407,
1635 408, 409, 555, 558, 559, 561, 564, 414, 565, 196,
1636 197, 313, 528, 198, 116, 312, 304, 424, 425, 131,
1637 128, 64, 511, 536, 38, 115, 86, 499, 0, 471,
1638 472, 473, 474, 429, 0, 0, 476, 477, 0, 479,
1639 0, 0, 266, 267, 268, 269, 270, 271, 272, 273,
1640 274, 275, 276, 277, 278, 279, 0, 0, 0, 453,
1641 0, 455, 0, 0, 458, 0, 0, 501, 502, 0,
1642 462, 463, 0, 0, 0, 0, 0, 0, 0, 0,
1643 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1644 0, 0, 0, 0, 0, 0, 0, 485, 486, 0,
1645 489, 490, 525, 0, 526, 527, 494, 0, 0, 0,
1646 0, 0, 0, 0, 0, 65, 500, 0, 66, 0,
1647 0, 67, -179, 68, 324, 0, 0, 0, 0, 0,
1648 0, 0, 0, 0, 0, 0, 516, -62, 1, 2,
1649 0, 3, 4, 0, 520, 0, 333, 334, 5, 6,
1650 57, 58, 335, 0, 0, 0, 0, 0, 0, 1,
1651 2, 0, 3, 4, 336, 337, 338, 0, 7, 0,
1652 0, 8, 0, 0, 0, 9, 0, 0, 339, 340,
1653 544, 0, 0, 0, 0, 548, 0, 0, 0, 0,
1654 0, 0, 0, 0, 0, 341, 0, 0, 0, 0,
1655 0, 0, 556, 557, 0, 0, 0, 560, 0, 0,
1656 562, 157, 158, 159, 160, 161, 162, 163, 164, 165,
1657 166, 167, 168, 169, 170, 171, 226, 227, 0, 0,
1658 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1659 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1660 0, 0, 0, 228, 178, 179, 180, 181, 182, 183,
1661 184, 185, 186, 187, 188, 189, 0, 229, 0, 230,
1662 231, 232, 333, 334, 0, 0, 57, 58, 335, 0,
1663 100, 0, 101, 0, 0, 1, 2, 342, 3, 4,
1664 336, 337, 338, 0, 0, 0, 0, 57, 58, 0,
1665 0, 0, 0, 0, 339, 340, 1, 2, 0, 3,
1666 4, 223, 0, 0, 0, 0, 0, 0, 0, 0,
1667 0, 341, 0, 0, 0, 224, 225, 0, 0, 0,
1668 0, 0, 0, 0, 0, 0, 0, 157, 158, 159,
1669 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
1670 170, 171, 226, 227, 0, 0, 0, 0, 157, 158,
1671 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
1672 169, 170, 171, 226, 227, 0, 0, 0, 0, 228,
1673 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
1674 188, 189, 0, 229, 0, 230, 231, 232, 0, 0,
1675 228, 178, 179, 180, 181, 182, 183, 184, 185, 186,
1676 187, 188, 189, 342, 229, 0, 230, 231, 232, 0,
1677 0, 0, 333, 334, 0, 0, 0, 100, 335, 101,
1678 0, 233, 0, 0, 234, 0, 235, 0, 236, 0,
1679 336, 337, 338, 0, 0, 0, 0, 0, 0, 0,
1680 0, 0, 0, 0, 339, 340, 0, 0, 0, 0,
1681 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,
1682 58, 341, 96, 134, 135, 136, 63, 0, 1, 2,
1683 0, 3, 4, 0, 0, 0, 0, 157, 158, 159,
1684 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
1685 170, 171, 226, 227, 0, 0, 64, 0, 0, 0,
1686 0, 0, 0, 0, 0, 57, 58, 0, 96, 60,
1687 61, 62, 63, 0, 1, 2, 0, 3, 4, 228,
1688 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
1689 188, 189, 120, 229, 0, 230, 231, 232, 0, 0,
1690 0, 0, 64, 0, 0, 57, 58, 0, 96, 60,
1691 61, 62, 63, 342, 1, 2, 0, 3, 4, 0,
1692 0, 0, 0, 0, 57, 58, 0, 96, 134, 135,
1693 136, 63, 303, 1, 2, 0, 3, 4, 0, 0,
1694 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,
1695 65, 0, 0, 66, 0, 0, 67, 0, 68, 386,
1696 0, 64, 0, 57, 58, 0, 96, 60, 61, 62,
1697 63, 0, 1, 2, 0, 3, 4, 0, 0, 57,
1698 58, 0, 96, 60, 61, 62, 63, 0, 1, 2,
1699 398, 3, 4, 0, 0, 0, 65, 0, 0, 66,
1700 64, 0, 67, 0, 68, 0, 481, 0, 57, 58,
1701 0, 59, 60, 61, 62, 63, 64, 1, 2, 0,
1702 3, 4, 57, 58, 0, 96, 134, 135, 136, 63,
1703 0, 1, 2, 0, 3, 4, 65, 0, 0, 66,
1704 0, 0, 67, 0, 68, 64, 0, 0, 0, 0,
1705 0, 0, 0, 0, 0, 65, 0, 0, 66, 64,
1706 319, 67, 0, 68, 57, 58, 0, 142, 60, 61,
1707 62, 63, 0, 1, 2, 0, 3, 4, 57, 58,
1708 0, 96, 60, 61, 62, 63, 0, 1, 2, 0,
1709 3, 4, 0, 0, 65, 0, 0, 66, 0, 0,
1710 67, 64, 68, 0, 0, 0, 0, 0, 0, 0,
1711 65, 0, 0, 66, 0, 64, 67, 0, 68, 0,
1712 57, 58, 0, 245, 60, 61, 62, 63, 0, 1,
1713 2, 0, 3, 4, 0, 0, 0, 0, 0, 65,
1714 0, 0, 66, 0, 0, 67, 0, 68, 0, 0,
1715 0, 0, 0, 65, 0, 0, 66, 64, 0, 67,
1716 0, 68, 57, 58, 0, 96, 134, 135, 136, 63,
1717 0, 1, 2, 0, 3, 4, 0, 0, 0, 0,
1718 0, 0, 0, 0, 0, 0, 0, 148, 0, 0,
1719 0, 0, 0, 0, 0, 65, 0, 0, 66, 64,
1720 0, 67, 0, 68, 0, 0, 149, 150, 0, 65,
1721 0, 0, 66, 0, 0, 67, 0, 68, 151, 152,
1722 153, 154, 155, 156, 157, 158, 159, 160, 161, 162,
1723 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
1724 173, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1725 0, 65, 0, 0, 66, 0, 0, 67, 0, 68,
1726 0, 174, 175, 176, 0, 0, 177, 178, 179, 180,
1727 181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
1728 191, 192, 193, 194, 195, 0, 0, -178, 0, 0,
1729 0, 0, 0, 65, 0, 0, 66, 0, 0, 67,
1730 0, 322, -62, 1, 2, 0, 3, 4, 0, 0,
1731 0, 0, 0, 5, 6, 0, 0, 0, 0, 0,
1732 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1733 0, 0, 0, 7, 0, 0, 8, 0, 0, 0,
1734 9
1735};
1736
1737static const short yycheck[] = { 0,
1738 24, 153, 213, 139, 176, 139, 305, 4, 24, 399,
1739 309, 11, 282, 14, 154, 0, 234, 235, 252, 191,
1740 192, 193, 194, 195, 30, 18, 198, 11, 11, 14,
1741 310, 311, 25, 11, 3, 4, 5, 6, 112, 113,
1742 35, 36, 48, 136, 68, 47, 41, 135, 16, 533,
1743 143, 19, 47, 22, 23, 129, 130, 131, 132, 61,
1744 200, 295, 52, 547, 48, 136, 136, 91, 136, 136,
1745 48, 95, 140, 108, 109, 145, 147, 101, 112, 113,
1746 147, 82, 37, 38, 39, 40, 41, 42, 43, 113,
1747 45, 136, 482, 135, 30, 136, 130, 131, 143, 136,
1748 136, 125, 126, 15, 322, 129, 147, 33, 145, 133,
1749 246, 147, 248, 249, 137, 251, 139, 397, 37, 38,
1750 39, 135, 145, 42, 342, 297, 516, 151, 7, 8,
1751 146, 10, 11, 12, 13, 14, 16, 16, 17, 19,
1752 19, 20, 136, 143, 112, 113, 140, 135, 284, 146,
1753 174, 175, 176, 177, 147, 425, 292, 293, 548, 144,
1754 143, 17, 130, 131, 20, 44, 190, 191, 192, 193,
1755 194, 195, 196, 197, 198, 106, 112, 113, 137, 134,
1756 139, 140, 206, 453, 483, 455, 112, 113, 360, 135,
1757 362, 363, 364, 129, 130, 131, 132, 137, 137, 139,
1758 139, 132, 141, 129, 130, 131, 132, 137, 136, 139,
1759 28, 29, 140, 143, 350, 351, 352, 3, 4, 5,
1760 6, 141, 358, 136, 137, 41, 139, 43, 252, 19,
1761 500, 134, 368, 369, 445, 102, 103, 32, 537, 263,
1762 539, 85, 86, 87, 88, 89, 90, 91, 92, 93,
1763 94, 387, 18, 387, 136, 137, 280, 139, 11, 138,
1764 19, 14, 141, 74, 75, 144, 139, 146, 147, 19,
1765 19, 295, 296, 297, 410, 4, 412, 4, 142, 415,
1766 142, 4, 19, 136, 456, 421, 422, 459, 460, 461,
1767 7, 8, 140, 10, 11, 12, 13, 14, 322, 16,
1768 17, 140, 19, 20, 145, 9, 9, 518, 332, 9,
1769 521, 50, 448, 449, 11, 451, 452, 145, 139, 139,
1770 139, 457, 139, 19, 139, 139, 139, 44, 136, 139,
1771 139, 467, 136, 136, 136, 136, 360, 361, 362, 363,
1772 364, 33, 136, 367, 55, 56, 57, 58, 59, 60,
1773 139, 487, 136, 54, 139, 136, 136, 136, 141, 495,
1774 136, 136, 136, 515, 136, 136, 136, 248, 249, 136,
1775 251, 136, 145, 33, 19, 4, 136, 140, 19, 14,
1776 14, 139, 534, 314, 315, 316, 317, 318, 136, 136,
1777 4, 136, 136, 136, 136, 531, 327, 328, 329, 139,
1778 536, 136, 426, 284, 136, 136, 136, 145, 136, 48,
1779 136, 292, 293, 19, 136, 439, 140, 553, 554, 140,
1780 444, 138, 558, 136, 141, 561, 450, 144, 136, 146,
1781 147, 140, 456, 143, 136, 459, 460, 461, 48, 14,
1782 464, 140, 443, 22, 23, 140, 377, 378, 141, 143,
1783 140, 140, 140, 384, 7, 8, 4, 10, 11, 12,
1784 13, 14, 136, 16, 17, 14, 19, 20, 14, 350,
1785 351, 352, 136, 14, 66, 14, 0, 358, 0, 116,
1786 116, 227, 510, 116, 82, 226, 206, 368, 369, 101,
1787 95, 44, 483, 517, 14, 79, 50, 464, -1, 430,
1788 431, 432, 433, 379, -1, -1, 437, 438, -1, 510,
1789 -1, -1, 91, 92, 93, 94, 95, 96, 97, 98,
1790 99, 100, 101, 102, 103, 104, -1, -1, -1, 410,
1791 -1, 412, -1, -1, 415, -1, -1, 468, 469, -1,
1792 421, 422, -1, -1, -1, -1, -1, -1, -1, -1,
1793 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1794 -1, -1, -1, -1, -1, -1, -1, 448, 449, -1,
1795 451, 452, 503, -1, 505, 506, 457, -1, -1, -1,
1796 -1, -1, -1, -1, -1, 138, 467, -1, 141, -1,
1797 -1, 144, 0, 146, 147, -1, -1, -1, -1, -1,
1798 -1, -1, -1, -1, -1, -1, 487, 15, 16, 17,
1799 -1, 19, 20, -1, 495, -1, 3, 4, 26, 27,
1800 7, 8, 9, -1, -1, -1, -1, -1, -1, 16,
1801 17, -1, 19, 20, 21, 22, 23, -1, 46, -1,
1802 -1, 49, -1, -1, -1, 53, -1, -1, 35, 36,
1803 531, -1, -1, -1, -1, 536, -1, -1, -1, -1,
1804 -1, -1, -1, -1, -1, 52, -1, -1, -1, -1,
1805 -1, -1, 553, 554, -1, -1, -1, 558, -1, -1,
1806 561, 68, 69, 70, 71, 72, 73, 74, 75, 76,
1807 77, 78, 79, 80, 81, 82, 83, 84, -1, -1,
1808 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1809 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1810 -1, -1, -1, 110, 111, 112, 113, 114, 115, 116,
1811 117, 118, 119, 120, 121, 122, -1, 124, -1, 126,
1812 127, 128, 3, 4, -1, -1, 7, 8, 9, -1,
1813 137, -1, 139, -1, -1, 16, 17, 144, 19, 20,
1814 21, 22, 23, -1, -1, -1, -1, 7, 8, -1,
1815 -1, -1, -1, -1, 35, 36, 16, 17, -1, 19,
1816 20, 21, -1, -1, -1, -1, -1, -1, -1, -1,
1817 -1, 52, -1, -1, -1, 35, 36, -1, -1, -1,
1818 -1, -1, -1, -1, -1, -1, -1, 68, 69, 70,
1819 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
1820 81, 82, 83, 84, -1, -1, -1, -1, 68, 69,
1821 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
1822 80, 81, 82, 83, 84, -1, -1, -1, -1, 110,
1823 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
1824 121, 122, -1, 124, -1, 126, 127, 128, -1, -1,
1825 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
1826 120, 121, 122, 144, 124, -1, 126, 127, 128, -1,
1827 -1, -1, 3, 4, -1, -1, -1, 137, 9, 139,
1828 -1, 141, -1, -1, 144, -1, 146, -1, 148, -1,
1829 21, 22, 23, -1, -1, -1, -1, -1, -1, -1,
1830 -1, -1, -1, -1, 35, 36, -1, -1, -1, -1,
1831 -1, -1, -1, -1, -1, -1, -1, -1, -1, 7,
1832 8, 52, 10, 11, 12, 13, 14, -1, 16, 17,
1833 -1, 19, 20, -1, -1, -1, -1, 68, 69, 70,
1834 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
1835 81, 82, 83, 84, -1, -1, 44, -1, -1, -1,
1836 -1, -1, -1, -1, -1, 7, 8, -1, 10, 11,
1837 12, 13, 14, -1, 16, 17, -1, 19, 20, 110,
1838 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
1839 121, 122, 34, 124, -1, 126, 127, 128, -1, -1,
1840 -1, -1, 44, -1, -1, 7, 8, -1, 10, 11,
1841 12, 13, 14, 144, 16, 17, -1, 19, 20, -1,
1842 -1, -1, -1, -1, 7, 8, -1, 10, 11, 12,
1843 13, 14, 34, 16, 17, -1, 19, 20, -1, -1,
1844 -1, -1, 44, -1, -1, -1, -1, -1, -1, -1,
1845 138, -1, -1, 141, -1, -1, 144, -1, 146, 147,
1846 -1, 44, -1, 7, 8, -1, 10, 11, 12, 13,
1847 14, -1, 16, 17, -1, 19, 20, -1, -1, 7,
1848 8, -1, 10, 11, 12, 13, 14, -1, 16, 17,
1849 34, 19, 20, -1, -1, -1, 138, -1, -1, 141,
1850 44, -1, 144, -1, 146, -1, 34, -1, 7, 8,
1851 -1, 10, 11, 12, 13, 14, 44, 16, 17, -1,
1852 19, 20, 7, 8, -1, 10, 11, 12, 13, 14,
1853 -1, 16, 17, -1, 19, 20, 138, -1, -1, 141,
1854 -1, -1, 144, -1, 146, 44, -1, -1, -1, -1,
1855 -1, -1, -1, -1, -1, 138, -1, -1, 141, 44,
1856 143, 144, -1, 146, 7, 8, -1, 10, 11, 12,
1857 13, 14, -1, 16, 17, -1, 19, 20, 7, 8,
1858 -1, 10, 11, 12, 13, 14, -1, 16, 17, -1,
1859 19, 20, -1, -1, 138, -1, -1, 141, -1, -1,
1860 144, 44, 146, -1, -1, -1, -1, -1, -1, -1,
1861 138, -1, -1, 141, -1, 44, 144, -1, 146, -1,
1862 7, 8, -1, 10, 11, 12, 13, 14, -1, 16,
1863 17, -1, 19, 20, -1, -1, -1, -1, -1, 138,
1864 -1, -1, 141, -1, -1, 144, -1, 146, -1, -1,
1865 -1, -1, -1, 138, -1, -1, 141, 44, -1, 144,
1866 -1, 146, 7, 8, -1, 10, 11, 12, 13, 14,
1867 -1, 16, 17, -1, 19, 20, -1, -1, -1, -1,
1868 -1, -1, -1, -1, -1, -1, -1, 31, -1, -1,
1869 -1, -1, -1, -1, -1, 138, -1, -1, 141, 44,
1870 -1, 144, -1, 146, -1, -1, 50, 51, -1, 138,
1871 -1, -1, 141, -1, -1, 144, -1, 146, 62, 63,
1872 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
1873 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
1874 84, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1875 -1, 138, -1, -1, 141, -1, -1, 144, -1, 146,
1876 -1, 105, 106, 107, -1, -1, 110, 111, 112, 113,
1877 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
1878 124, 125, 126, 127, 128, -1, -1, 0, -1, -1,
1879 -1, -1, -1, 138, -1, -1, 141, -1, -1, 144,
1880 -1, 146, 15, 16, 17, -1, 19, 20, -1, -1,
1881 -1, -1, -1, 26, 27, -1, -1, -1, -1, -1,
1882 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1883 -1, -1, -1, 46, -1, -1, 49, -1, -1, -1,
1884 53
1885};
1886/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
1887#line 3 "/usr/share/bison.simple"
1888/* This file comes from bison-1.28. */
1889
1890/* Skeleton output parser for bison,
1891 Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
1892
1893 This program is free software; you can redistribute it and/or modify
1894 it under the terms of the GNU General Public License as published by
1895 the Free Software Foundation; either version 2, or (at your option)
1896 any later version.
1897
1898 This program is distributed in the hope that it will be useful,
1899 but WITHOUT ANY WARRANTY; without even the implied warranty of
1900 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1901 GNU General Public License for more details.
1902
1903 You should have received a copy of the GNU General Public License
1904 along with this program; if not, write to the Free Software
1905 Foundation, Inc., 59 Temple Place - Suite 330,
1906 Boston, MA 02111-1307, USA. */
1907
1908/* As a special exception, when this file is copied by Bison into a
1909 Bison output file, you may use that output file without restriction.
1910 This special exception was added by the Free Software Foundation
1911 in version 1.24 of Bison. */
1912
1913/* This is the parser code that is written into each bison parser
1914 when the %semantic_parser declaration is not specified in the grammar.
1915 It was written by Richard Stallman by simplifying the hairy parser
1916 used when %semantic_parser is specified. */
1917
1918#ifndef YYSTACK_USE_ALLOCA
1919#ifdef alloca
1920#define YYSTACK_USE_ALLOCA
1921#else /* alloca not defined */
1922#ifdef __GNUC__
1923#define YYSTACK_USE_ALLOCA
1924#define alloca __builtin_alloca
1925#else /* not GNU C. */
1926#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
1927#define YYSTACK_USE_ALLOCA
1928#include <alloca.h>
1929#else /* not sparc */
1930/* We think this test detects Watcom and Microsoft C. */
1931/* This used to test MSDOS, but that is a bad idea
1932 since that symbol is in the user namespace. */
1933#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
1934#if 0 /* No need for malloc.h, which pollutes the namespace;
1935 instead, just don't use alloca. */
1936#include <malloc.h>
1937#endif
1938#else /* not MSDOS, or __TURBOC__ */
1939#if defined(_AIX)
1940/* I don't know what this was needed for, but it pollutes the namespace.
1941 So I turned it off. rms, 2 May 1997. */
1942/* #include <malloc.h> */
1943 #pragma alloca
1944#define YYSTACK_USE_ALLOCA
1945#else /* not MSDOS, or __TURBOC__, or _AIX */
1946#if 0
1947#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
1948 and on HPUX 10. Eventually we can turn this on. */
1949#define YYSTACK_USE_ALLOCA
1950#define alloca __builtin_alloca
1951#endif /* __hpux */
1952#endif
1953#endif /* not _AIX */
1954#endif /* not MSDOS, or __TURBOC__ */
1955#endif /* not sparc */
1956#endif /* not GNU C */
1957#endif /* alloca not defined */
1958#endif /* YYSTACK_USE_ALLOCA not defined */
1959
1960#ifdef YYSTACK_USE_ALLOCA
1961#define YYSTACK_ALLOC alloca
Reid Spencer7780acb2007-04-16 06:56:07 +00001962#else
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001963#define YYSTACK_ALLOC malloc
Reid Spencer7780acb2007-04-16 06:56:07 +00001964#endif
1965
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001966/* Note: there must be only one dollar sign in this file.
1967 It is replaced by the list of actions, each action
1968 as one case of the switch. */
Reid Spencer68a24bd2005-08-27 18:50:39 +00001969
1970#define yyerrok (yyerrstatus = 0)
1971#define yyclearin (yychar = YYEMPTY)
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001972#define YYEMPTY -2
Reid Spencer68a24bd2005-08-27 18:50:39 +00001973#define YYEOF 0
Reid Spencer68a24bd2005-08-27 18:50:39 +00001974#define YYACCEPT goto yyacceptlab
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001975#define YYABORT goto yyabortlab
1976#define YYERROR goto yyerrlab1
1977/* Like YYERROR except do call yyerror.
1978 This remains here temporarily to ease the
1979 transition to the new meaning of YYERROR, for GCC.
Reid Spencer68a24bd2005-08-27 18:50:39 +00001980 Once GCC version 2 has supplanted version 1, this can go. */
Reid Spencer68a24bd2005-08-27 18:50:39 +00001981#define YYFAIL goto yyerrlab
Reid Spencer68a24bd2005-08-27 18:50:39 +00001982#define YYRECOVERING() (!!yyerrstatus)
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001983#define YYBACKUP(token, value) \
Reid Spencer68a24bd2005-08-27 18:50:39 +00001984do \
1985 if (yychar == YYEMPTY && yylen == 1) \
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001986 { yychar = (token), yylval = (value); \
1987 yychar1 = YYTRANSLATE (yychar); \
Reid Spencer7780acb2007-04-16 06:56:07 +00001988 YYPOPSTACK; \
Reid Spencer68a24bd2005-08-27 18:50:39 +00001989 goto yybackup; \
1990 } \
1991 else \
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001992 { yyerror ("syntax error: cannot back up"); YYERROR; } \
Reid Spencer7780acb2007-04-16 06:56:07 +00001993while (0)
Anton Korobeynikov178a3522007-01-12 19:22:51 +00001994
Reid Spencer68a24bd2005-08-27 18:50:39 +00001995#define YYTERROR 1
1996#define YYERRCODE 256
1997
Christopher Lamb2330e4d2007-04-21 08:16:25 +00001998#ifndef YYPURE
1999#define YYLEX yylex()
Reid Spencer68a24bd2005-08-27 18:50:39 +00002000#endif
2001
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002002#ifdef YYPURE
2003#ifdef YYLSP_NEEDED
Reid Spencer41dff5e2007-01-26 08:05:27 +00002004#ifdef YYLEX_PARAM
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002005#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
Reid Spencer41dff5e2007-01-26 08:05:27 +00002006#else
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002007#define YYLEX yylex(&yylval, &yylloc)
2008#endif
2009#else /* not YYLSP_NEEDED */
2010#ifdef YYLEX_PARAM
2011#define YYLEX yylex(&yylval, YYLEX_PARAM)
2012#else
2013#define YYLEX yylex(&yylval)
2014#endif
2015#endif /* not YYLSP_NEEDED */
Chris Lattner32980692007-02-19 07:44:24 +00002016#endif
Reid Spencer38c91a92007-02-28 02:24:54 +00002017
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002018/* If nonreentrant, generate the variables here */
Reid Spencer38c91a92007-02-28 02:24:54 +00002019
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002020#ifndef YYPURE
Reid Spencer38c91a92007-02-28 02:24:54 +00002021
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002022int yychar; /* the lookahead symbol */
2023YYSTYPE yylval; /* the semantic value of the */
2024 /* lookahead symbol */
Reid Spencer38c91a92007-02-28 02:24:54 +00002025
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002026#ifdef YYLSP_NEEDED
2027YYLTYPE yylloc; /* location data for the lookahead */
2028 /* symbol */
Chris Lattner32980692007-02-19 07:44:24 +00002029#endif
Reid Spencer38c91a92007-02-28 02:24:54 +00002030
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002031int yynerrs; /* number of parse errors so far */
2032#endif /* not YYPURE */
Reid Spencer38c91a92007-02-28 02:24:54 +00002033
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002034#if YYDEBUG != 0
2035int yydebug; /* nonzero means print parse trace */
2036/* Since this is uninitialized, it does not stop multiple parsers
2037 from coexisting. */
Chris Lattner9d2fda62007-02-13 05:53:56 +00002038#endif
Reid Spencer9d6565a2007-02-15 02:26:10 +00002039
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002040/* YYINITDEPTH indicates the initial size of the parser's stacks */
Reid Spencer9d6565a2007-02-15 02:26:10 +00002041
Reid Spencer68a24bd2005-08-27 18:50:39 +00002042#ifndef YYINITDEPTH
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002043#define YYINITDEPTH 200
Reid Spencer68a24bd2005-08-27 18:50:39 +00002044#endif
2045
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002046/* YYMAXDEPTH is the maximum size the stacks can grow to
2047 (effective only if the built-in stack extension method is used). */
Reid Spencer68a24bd2005-08-27 18:50:39 +00002048
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002049#if YYMAXDEPTH == 0
2050#undef YYMAXDEPTH
2051#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002052
2053#ifndef YYMAXDEPTH
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002054#define YYMAXDEPTH 10000
Reid Spencer68a24bd2005-08-27 18:50:39 +00002055#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002056
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002057/* Define __yy_memcpy. Note that the size argument
2058 should be passed with type unsigned int, because that is what the non-GCC
2059 definitions require. With GCC, __builtin_memcpy takes an arg
2060 of type size_t, but it can handle unsigned int. */
Reid Spencer68a24bd2005-08-27 18:50:39 +00002061
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002062#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
2063#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
2064#else /* not GNU C or C++ */
2065#ifndef __cplusplus
Reid Spencer68a24bd2005-08-27 18:50:39 +00002066
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002067/* This is the most reliable way to avoid incompatibilities
2068 in available built-in functions on various systems. */
Reid Spencer7780acb2007-04-16 06:56:07 +00002069static void
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002070__yy_memcpy (to, from, count)
2071 char *to;
2072 char *from;
2073 unsigned int count;
2074{
2075 register char *f = from;
2076 register char *t = to;
2077 register int i = count;
2078
2079 while (i-- > 0)
2080 *t++ = *f++;
2081}
2082
2083#else /* __cplusplus */
2084
2085/* This is the most reliable way to avoid incompatibilities
2086 in available built-in functions on various systems. */
Reid Spencer7780acb2007-04-16 06:56:07 +00002087static void
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002088__yy_memcpy (char *to, char *from, unsigned int count)
2089{
2090 register char *t = to;
2091 register char *f = from;
2092 register int i = count;
2093
2094 while (i-- > 0)
2095 *t++ = *f++;
2096}
2097
Reid Spencer7780acb2007-04-16 06:56:07 +00002098#endif
Reid Spencer38c91a92007-02-28 02:24:54 +00002099#endif
Reid Spencer38c91a92007-02-28 02:24:54 +00002100
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002101#line 217 "/usr/share/bison.simple"
Reid Spencer38c91a92007-02-28 02:24:54 +00002102
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002103/* The user can define YYPARSE_PARAM as the name of an argument to be passed
2104 into yyparse. The argument should have type void *.
2105 It should actually point to an object.
2106 Grammar actions can access the variable by casting it
2107 to the proper pointer type. */
Reid Spencer38c91a92007-02-28 02:24:54 +00002108
2109#ifdef YYPARSE_PARAM
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002110#ifdef __cplusplus
2111#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
2112#define YYPARSE_PARAM_DECL
2113#else /* not __cplusplus */
2114#define YYPARSE_PARAM_ARG YYPARSE_PARAM
2115#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
2116#endif /* not __cplusplus */
2117#else /* not YYPARSE_PARAM */
2118#define YYPARSE_PARAM_ARG
2119#define YYPARSE_PARAM_DECL
2120#endif /* not YYPARSE_PARAM */
2121
2122/* Prevent warning if -Wstrict-prototypes. */
2123#ifdef __GNUC__
2124#ifdef YYPARSE_PARAM
2125int yyparse (void *);
2126#else
Reid Spencere812fb22006-01-19 01:21:04 +00002127int yyparse (void);
Reid Spencer38c91a92007-02-28 02:24:54 +00002128#endif
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002129#endif
Reid Spencer38c91a92007-02-28 02:24:54 +00002130
Reid Spencer38c91a92007-02-28 02:24:54 +00002131int
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002132yyparse(YYPARSE_PARAM_ARG)
2133 YYPARSE_PARAM_DECL
Reid Spencer38c91a92007-02-28 02:24:54 +00002134{
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002135 register int yystate;
2136 register int yyn;
2137 register short *yyssp;
2138 register YYSTYPE *yyvsp;
2139 int yyerrstatus; /* number of tokens to shift before error messages enabled */
2140 int yychar1 = 0; /* lookahead token as an internal (translated) token number */
Reid Spencer38c91a92007-02-28 02:24:54 +00002141
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002142 short yyssa[YYINITDEPTH]; /* the state stack */
2143 YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
Reid Spencer38c91a92007-02-28 02:24:54 +00002144
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002145 short *yyss = yyssa; /* refer to the stacks thru separate pointers */
2146 YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
Reid Spencer38c91a92007-02-28 02:24:54 +00002147
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002148#ifdef YYLSP_NEEDED
2149 YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
2150 YYLTYPE *yyls = yylsa;
2151 YYLTYPE *yylsp;
Reid Spencer38c91a92007-02-28 02:24:54 +00002152
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002153#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
2154#else
Reid Spencer7780acb2007-04-16 06:56:07 +00002155#define YYPOPSTACK (yyvsp--, yyssp--)
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002156#endif
Anton Korobeynikov178a3522007-01-12 19:22:51 +00002157
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002158 int yystacksize = YYINITDEPTH;
2159 int yyfree_stacks = 0;
Chris Lattner7d9801d2007-02-13 00:58:01 +00002160
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002161#ifdef YYPURE
2162 int yychar;
2163 YYSTYPE yylval;
2164 int yynerrs;
2165#ifdef YYLSP_NEEDED
2166 YYLTYPE yylloc;
2167#endif
2168#endif
Chris Lattner7d9801d2007-02-13 00:58:01 +00002169
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002170 YYSTYPE yyval; /* the variable used to return */
2171 /* semantic values from the action */
2172 /* routines */
Chris Lattner7d9801d2007-02-13 00:58:01 +00002173
Reid Spencer7780acb2007-04-16 06:56:07 +00002174 int yylen;
Chris Lattner7d9801d2007-02-13 00:58:01 +00002175
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002176#if YYDEBUG != 0
2177 if (yydebug)
2178 fprintf(stderr, "Starting parse\n");
2179#endif
Chris Lattner7d9801d2007-02-13 00:58:01 +00002180
Reid Spencer68a24bd2005-08-27 18:50:39 +00002181 yystate = 0;
2182 yyerrstatus = 0;
2183 yynerrs = 0;
2184 yychar = YYEMPTY; /* Cause a token to be read. */
2185
2186 /* Initialize stack pointers.
2187 Waste one element of value and location stack
2188 so that they stay on the same level as the state stack.
2189 The wasted elements are never initialized. */
2190
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002191 yyssp = yyss - 1;
Reid Spencer68a24bd2005-08-27 18:50:39 +00002192 yyvsp = yyvs;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002193#ifdef YYLSP_NEEDED
2194 yylsp = yyls;
2195#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002196
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002197/* Push a new state, which is found in yystate . */
2198/* In all cases, when you get here, the value and location stacks
2199 have just been pushed. so pushing a state here evens the stacks. */
2200yynewstate:
Jeff Cohen66c5fd62005-10-23 04:37:20 +00002201
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002202 *++yyssp = yystate;
Reid Spencer68a24bd2005-08-27 18:50:39 +00002203
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002204 if (yyssp >= yyss + yystacksize - 1)
Reid Spencer68a24bd2005-08-27 18:50:39 +00002205 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002206 /* Give user a chance to reallocate the stack */
2207 /* Use copies of these so that the &'s don't force the real ones into memory. */
2208 YYSTYPE *yyvs1 = yyvs;
2209 short *yyss1 = yyss;
2210#ifdef YYLSP_NEEDED
2211 YYLTYPE *yyls1 = yyls;
2212#endif
2213
Reid Spencer68a24bd2005-08-27 18:50:39 +00002214 /* Get the current used size of the three stacks, in elements. */
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002215 int size = yyssp - yyss + 1;
Reid Spencer68a24bd2005-08-27 18:50:39 +00002216
2217#ifdef yyoverflow
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002218 /* Each stack pointer address is followed by the size of
2219 the data in use in that stack, in bytes. */
2220#ifdef YYLSP_NEEDED
2221 /* This used to be a conditional around just the two extra args,
2222 but that might be undefined if yyoverflow is a macro. */
2223 yyoverflow("parser stack overflow",
2224 &yyss1, size * sizeof (*yyssp),
2225 &yyvs1, size * sizeof (*yyvsp),
2226 &yyls1, size * sizeof (*yylsp),
2227 &yystacksize);
2228#else
2229 yyoverflow("parser stack overflow",
2230 &yyss1, size * sizeof (*yyssp),
2231 &yyvs1, size * sizeof (*yyvsp),
2232 &yystacksize);
2233#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002234
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002235 yyss = yyss1; yyvs = yyvs1;
2236#ifdef YYLSP_NEEDED
2237 yyls = yyls1;
2238#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002239#else /* no yyoverflow */
Reid Spencer68a24bd2005-08-27 18:50:39 +00002240 /* Extend the stack our own way. */
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002241 if (yystacksize >= YYMAXDEPTH)
2242 {
2243 yyerror("parser stack overflow");
2244 if (yyfree_stacks)
2245 {
2246 free (yyss);
2247 free (yyvs);
2248#ifdef YYLSP_NEEDED
2249 free (yyls);
2250#endif
2251 }
2252 return 2;
2253 }
Reid Spencer68a24bd2005-08-27 18:50:39 +00002254 yystacksize *= 2;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002255 if (yystacksize > YYMAXDEPTH)
Reid Spencer68a24bd2005-08-27 18:50:39 +00002256 yystacksize = YYMAXDEPTH;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002257#ifndef YYSTACK_USE_ALLOCA
2258 yyfree_stacks = 1;
2259#endif
2260 yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
2261 __yy_memcpy ((char *)yyss, (char *)yyss1,
2262 size * (unsigned int) sizeof (*yyssp));
2263 yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
2264 __yy_memcpy ((char *)yyvs, (char *)yyvs1,
2265 size * (unsigned int) sizeof (*yyvsp));
2266#ifdef YYLSP_NEEDED
2267 yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
2268 __yy_memcpy ((char *)yyls, (char *)yyls1,
2269 size * (unsigned int) sizeof (*yylsp));
2270#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002271#endif /* no yyoverflow */
2272
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002273 yyssp = yyss + size - 1;
2274 yyvsp = yyvs + size - 1;
2275#ifdef YYLSP_NEEDED
2276 yylsp = yyls + size - 1;
2277#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002278
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002279#if YYDEBUG != 0
2280 if (yydebug)
2281 fprintf(stderr, "Stack size increased to %d\n", yystacksize);
2282#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002283
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002284 if (yyssp >= yyss + yystacksize - 1)
Reid Spencer68a24bd2005-08-27 18:50:39 +00002285 YYABORT;
2286 }
2287
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002288#if YYDEBUG != 0
2289 if (yydebug)
2290 fprintf(stderr, "Entering state %d\n", yystate);
2291#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002292
2293 goto yybackup;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002294 yybackup:
Reid Spencer68a24bd2005-08-27 18:50:39 +00002295
Reid Spencer7780acb2007-04-16 06:56:07 +00002296/* Do appropriate processing given the current state. */
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002297/* Read a lookahead token if we need one and don't already have one. */
Reid Spencer7780acb2007-04-16 06:56:07 +00002298/* yyresume: */
Andrew Lenharth6353e052006-12-08 18:07:09 +00002299
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002300 /* First try to decide what to do without reference to lookahead token. */
Reid Spencer7780acb2007-04-16 06:56:07 +00002301
Reid Spencer68a24bd2005-08-27 18:50:39 +00002302 yyn = yypact[yystate];
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002303 if (yyn == YYFLAG)
Reid Spencer68a24bd2005-08-27 18:50:39 +00002304 goto yydefault;
2305
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002306 /* Not known => get a lookahead token if don't already have one. */
Reid Spencer68a24bd2005-08-27 18:50:39 +00002307
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002308 /* yychar is either YYEMPTY or YYEOF
2309 or a valid token in external form. */
2310
Reid Spencer68a24bd2005-08-27 18:50:39 +00002311 if (yychar == YYEMPTY)
2312 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002313#if YYDEBUG != 0
2314 if (yydebug)
2315 fprintf(stderr, "Reading a token: ");
2316#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002317 yychar = YYLEX;
2318 }
2319
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002320 /* Convert token to internal form (in yychar1) for indexing tables with */
2321
2322 if (yychar <= 0) /* This means end of input. */
Reid Spencer68a24bd2005-08-27 18:50:39 +00002323 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002324 yychar1 = 0;
2325 yychar = YYEOF; /* Don't call YYLEX any more */
2326
2327#if YYDEBUG != 0
2328 if (yydebug)
2329 fprintf(stderr, "Now at end of input.\n");
2330#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002331 }
2332 else
2333 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002334 yychar1 = YYTRANSLATE(yychar);
2335
2336#if YYDEBUG != 0
2337 if (yydebug)
2338 {
2339 fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
2340 /* Give the individual parser a way to print the precise meaning
2341 of a token, for further debugging info. */
2342#ifdef YYPRINT
2343 YYPRINT (stderr, yychar, yylval);
2344#endif
2345 fprintf (stderr, ")\n");
2346 }
2347#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00002348 }
2349
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002350 yyn += yychar1;
2351 if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
Reid Spencer68a24bd2005-08-27 18:50:39 +00002352 goto yydefault;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002353
Reid Spencer68a24bd2005-08-27 18:50:39 +00002354 yyn = yytable[yyn];
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002355
2356 /* yyn is what to do for this token type in this state.
2357 Negative => reduce, -yyn is rule number.
2358 Positive => shift, yyn is new state.
2359 New state is final state => don't bother to shift,
2360 just return success.
2361 0, or most negative number => error. */
2362
2363 if (yyn < 0)
Reid Spencer68a24bd2005-08-27 18:50:39 +00002364 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002365 if (yyn == YYFLAG)
Reid Spencer68a24bd2005-08-27 18:50:39 +00002366 goto yyerrlab;
2367 yyn = -yyn;
2368 goto yyreduce;
2369 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002370 else if (yyn == 0)
2371 goto yyerrlab;
Reid Spencer68a24bd2005-08-27 18:50:39 +00002372
2373 if (yyn == YYFINAL)
2374 YYACCEPT;
2375
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002376 /* Shift the lookahead token. */
2377
2378#if YYDEBUG != 0
2379 if (yydebug)
2380 fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
2381#endif
Reid Spencer7780acb2007-04-16 06:56:07 +00002382
2383 /* Discard the token being shifted unless it is eof. */
2384 if (yychar != YYEOF)
2385 yychar = YYEMPTY;
2386
2387 *++yyvsp = yylval;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002388#ifdef YYLSP_NEEDED
2389 *++yylsp = yylloc;
2390#endif
Reid Spencer7780acb2007-04-16 06:56:07 +00002391
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002392 /* count tokens shifted since error; after three, turn off error status. */
2393 if (yyerrstatus) yyerrstatus--;
Chris Lattner9d2fda62007-02-13 05:53:56 +00002394
2395 yystate = yyn;
Reid Spencer68a24bd2005-08-27 18:50:39 +00002396 goto yynewstate;
2397
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002398/* Do the default action for the current state. */
Reid Spencer38c91a92007-02-28 02:24:54 +00002399yydefault:
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002400
Reid Spencer68a24bd2005-08-27 18:50:39 +00002401 yyn = yydefact[yystate];
2402 if (yyn == 0)
2403 goto yyerrlab;
Reid Spencer68a24bd2005-08-27 18:50:39 +00002404
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002405/* Do a reduction. yyn is the number of a rule to reduce with. */
Reid Spencer68a24bd2005-08-27 18:50:39 +00002406yyreduce:
Reid Spencer68a24bd2005-08-27 18:50:39 +00002407 yylen = yyr2[yyn];
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002408 if (yylen > 0)
2409 yyval = yyvsp[1-yylen]; /* implement default value of the action */
Reid Spencer68a24bd2005-08-27 18:50:39 +00002410
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002411#if YYDEBUG != 0
2412 if (yydebug)
Reid Spencer68a24bd2005-08-27 18:50:39 +00002413 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002414 int i;
Reid Spencer41dff5e2007-01-26 08:05:27 +00002415
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002416 fprintf (stderr, "Reducing via rule %d (line %d), ",
2417 yyn, yyrline[yyn]);
Reid Spencerb0fcf8f2007-01-17 02:48:45 +00002418
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002419 /* Print the symbols being reduced, and their result. */
2420 for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
2421 fprintf (stderr, "%s ", yytname[yyrhs[i]]);
2422 fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
2423 }
2424#endif
Reid Spencerb0fcf8f2007-01-17 02:48:45 +00002425
Reid Spencerb0fcf8f2007-01-17 02:48:45 +00002426
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002427 switch (yyn) {
Reid Spencerb0fcf8f2007-01-17 02:48:45 +00002428
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002429case 28:
2430#line 1099 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2431{ yyval.IPredicate = ICmpInst::ICMP_EQ; ;
2432 break;}
2433case 29:
2434#line 1099 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2435{ yyval.IPredicate = ICmpInst::ICMP_NE; ;
2436 break;}
2437case 30:
2438#line 1100 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2439{ yyval.IPredicate = ICmpInst::ICMP_SLT; ;
2440 break;}
2441case 31:
2442#line 1100 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2443{ yyval.IPredicate = ICmpInst::ICMP_SGT; ;
2444 break;}
2445case 32:
2446#line 1101 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2447{ yyval.IPredicate = ICmpInst::ICMP_SLE; ;
2448 break;}
2449case 33:
2450#line 1101 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2451{ yyval.IPredicate = ICmpInst::ICMP_SGE; ;
2452 break;}
2453case 34:
2454#line 1102 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2455{ yyval.IPredicate = ICmpInst::ICMP_ULT; ;
2456 break;}
2457case 35:
2458#line 1102 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2459{ yyval.IPredicate = ICmpInst::ICMP_UGT; ;
2460 break;}
2461case 36:
2462#line 1103 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2463{ yyval.IPredicate = ICmpInst::ICMP_ULE; ;
2464 break;}
2465case 37:
2466#line 1103 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2467{ yyval.IPredicate = ICmpInst::ICMP_UGE; ;
2468 break;}
2469case 38:
2470#line 1107 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2471{ yyval.FPredicate = FCmpInst::FCMP_OEQ; ;
2472 break;}
2473case 39:
2474#line 1107 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2475{ yyval.FPredicate = FCmpInst::FCMP_ONE; ;
2476 break;}
2477case 40:
2478#line 1108 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2479{ yyval.FPredicate = FCmpInst::FCMP_OLT; ;
2480 break;}
2481case 41:
2482#line 1108 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2483{ yyval.FPredicate = FCmpInst::FCMP_OGT; ;
2484 break;}
2485case 42:
2486#line 1109 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2487{ yyval.FPredicate = FCmpInst::FCMP_OLE; ;
2488 break;}
2489case 43:
2490#line 1109 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2491{ yyval.FPredicate = FCmpInst::FCMP_OGE; ;
2492 break;}
2493case 44:
2494#line 1110 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2495{ yyval.FPredicate = FCmpInst::FCMP_ORD; ;
2496 break;}
2497case 45:
2498#line 1110 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2499{ yyval.FPredicate = FCmpInst::FCMP_UNO; ;
2500 break;}
2501case 46:
2502#line 1111 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2503{ yyval.FPredicate = FCmpInst::FCMP_UEQ; ;
2504 break;}
2505case 47:
2506#line 1111 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2507{ yyval.FPredicate = FCmpInst::FCMP_UNE; ;
2508 break;}
2509case 48:
2510#line 1112 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2511{ yyval.FPredicate = FCmpInst::FCMP_ULT; ;
2512 break;}
2513case 49:
2514#line 1112 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2515{ yyval.FPredicate = FCmpInst::FCMP_UGT; ;
2516 break;}
2517case 50:
2518#line 1113 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2519{ yyval.FPredicate = FCmpInst::FCMP_ULE; ;
2520 break;}
2521case 51:
2522#line 1113 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2523{ yyval.FPredicate = FCmpInst::FCMP_UGE; ;
2524 break;}
2525case 52:
2526#line 1114 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2527{ yyval.FPredicate = FCmpInst::FCMP_TRUE; ;
2528 break;}
2529case 53:
2530#line 1115 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2531{ yyval.FPredicate = FCmpInst::FCMP_FALSE; ;
2532 break;}
2533case 60:
2534#line 1124 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2535{ yyval.StrVal = 0; ;
2536 break;}
2537case 61:
2538#line 1128 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2539{
2540 yyval.StrVal = yyvsp[-1].StrVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00002541 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002542 ;
2543 break;}
2544case 62:
2545#line 1132 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2546{
2547 yyval.StrVal = 0;
Reid Spencer41dff5e2007-01-26 08:05:27 +00002548 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002549 ;
2550 break;}
2551case 65:
2552#line 1139 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2553{
2554 yyval.StrVal = yyvsp[-1].StrVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00002555 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002556 ;
2557 break;}
2558case 66:
2559#line 1143 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2560{
2561 yyval.StrVal = 0;
Reid Spencer41dff5e2007-01-26 08:05:27 +00002562 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002563 ;
2564 break;}
2565case 67:
2566#line 1149 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2567{ yyval.Linkage = GlobalValue::InternalLinkage; ;
2568 break;}
2569case 68:
2570#line 1150 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2571{ yyval.Linkage = GlobalValue::WeakLinkage; ;
2572 break;}
2573case 69:
2574#line 1151 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2575{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
2576 break;}
2577case 70:
2578#line 1152 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2579{ yyval.Linkage = GlobalValue::AppendingLinkage; ;
2580 break;}
2581case 71:
2582#line 1153 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2583{ yyval.Linkage = GlobalValue::DLLExportLinkage; ;
2584 break;}
2585case 72:
2586#line 1157 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2587{ yyval.Linkage = GlobalValue::DLLImportLinkage; ;
2588 break;}
2589case 73:
2590#line 1158 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2591{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
2592 break;}
2593case 74:
2594#line 1159 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2595{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
2596 break;}
2597case 75:
2598#line 1163 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2599{ yyval.Visibility = GlobalValue::DefaultVisibility; ;
2600 break;}
2601case 76:
2602#line 1164 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2603{ yyval.Visibility = GlobalValue::HiddenVisibility; ;
2604 break;}
2605case 77:
2606#line 1168 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2607{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
2608 break;}
2609case 78:
2610#line 1169 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2611{ yyval.Linkage = GlobalValue::DLLImportLinkage; ;
2612 break;}
2613case 79:
2614#line 1170 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2615{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;
2616 break;}
2617case 80:
2618#line 1174 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2619{ yyval.Linkage = GlobalValue::ExternalLinkage; ;
2620 break;}
2621case 81:
2622#line 1175 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2623{ yyval.Linkage = GlobalValue::InternalLinkage; ;
2624 break;}
2625case 82:
2626#line 1176 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2627{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ;
2628 break;}
2629case 83:
2630#line 1177 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2631{ yyval.Linkage = GlobalValue::WeakLinkage; ;
2632 break;}
2633case 84:
2634#line 1178 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2635{ yyval.Linkage = GlobalValue::DLLExportLinkage; ;
2636 break;}
2637case 85:
2638#line 1181 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2639{ yyval.UIntVal = CallingConv::C; ;
2640 break;}
2641case 86:
2642#line 1182 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2643{ yyval.UIntVal = CallingConv::C; ;
2644 break;}
2645case 87:
2646#line 1183 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2647{ yyval.UIntVal = CallingConv::Fast; ;
2648 break;}
2649case 88:
2650#line 1184 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2651{ yyval.UIntVal = CallingConv::Cold; ;
2652 break;}
2653case 89:
2654#line 1185 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2655{ yyval.UIntVal = CallingConv::X86_StdCall; ;
2656 break;}
2657case 90:
2658#line 1186 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2659{ yyval.UIntVal = CallingConv::X86_FastCall; ;
2660 break;}
2661case 91:
2662#line 1187 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2663{
2664 if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val)
Reid Spencerb5334b02007-02-05 10:18:06 +00002665 GEN_ERROR("Calling conv too large");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002666 yyval.UIntVal = yyvsp[0].UInt64Val;
Reid Spencer41dff5e2007-01-26 08:05:27 +00002667 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002668 ;
2669 break;}
2670case 92:
2671#line 1194 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2672{ yyval.ParamAttrs = ParamAttr::ZExt; ;
2673 break;}
2674case 93:
2675#line 1195 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2676{ yyval.ParamAttrs = ParamAttr::SExt; ;
2677 break;}
2678case 94:
2679#line 1196 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2680{ yyval.ParamAttrs = ParamAttr::InReg; ;
2681 break;}
2682case 95:
2683#line 1197 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2684{ yyval.ParamAttrs = ParamAttr::StructRet; ;
2685 break;}
2686case 96:
2687#line 1200 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2688{ yyval.ParamAttrs = ParamAttr::None; ;
2689 break;}
2690case 97:
2691#line 1201 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2692{
2693 yyval.ParamAttrs = yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs;
2694 ;
2695 break;}
2696case 98:
2697#line 1206 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2698{ yyval.ParamAttrs = ParamAttr::NoReturn; ;
2699 break;}
2700case 99:
2701#line 1207 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2702{ yyval.ParamAttrs = ParamAttr::NoUnwind; ;
2703 break;}
2704case 101:
2705#line 1211 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2706{ yyval.ParamAttrs = ParamAttr::None; ;
2707 break;}
2708case 102:
2709#line 1212 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2710{
2711 yyval.ParamAttrs = yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs;
2712 ;
2713 break;}
2714case 103:
2715#line 1219 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2716{ yyval.UIntVal = 0; ;
2717 break;}
2718case 104:
2719#line 1220 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2720{
2721 yyval.UIntVal = yyvsp[0].UInt64Val;
2722 if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal))
Reid Spencerb5334b02007-02-05 10:18:06 +00002723 GEN_ERROR("Alignment must be a power of two");
Reid Spencer41dff5e2007-01-26 08:05:27 +00002724 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002725;
2726 break;}
2727case 105:
2728#line 1226 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2729{ yyval.UIntVal = 0; ;
2730 break;}
2731case 106:
2732#line 1227 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2733{
2734 yyval.UIntVal = yyvsp[0].UInt64Val;
2735 if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal))
Reid Spencer66728ef2007-03-20 01:13:36 +00002736 GEN_ERROR("Alignment must be a power of two");
2737 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002738;
2739 break;}
2740case 107:
2741#line 1235 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2742{
2743 for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i)
2744 if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\')
Reid Spencerb5334b02007-02-05 10:18:06 +00002745 GEN_ERROR("Invalid character in section name");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002746 yyval.StrVal = yyvsp[0].StrVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002747 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002748;
2749 break;}
2750case 108:
2751#line 1243 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2752{ yyval.StrVal = 0; ;
2753 break;}
2754case 109:
2755#line 1244 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2756{ yyval.StrVal = yyvsp[0].StrVal; ;
2757 break;}
2758case 110:
2759#line 1249 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2760{;
2761 break;}
2762case 111:
2763#line 1250 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2764{;
2765 break;}
2766case 112:
2767#line 1251 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2768{
2769 CurGV->setSection(yyvsp[0].StrVal);
2770 free(yyvsp[0].StrVal);
Reid Spencer6f407902007-01-13 05:00:46 +00002771 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002772 ;
2773 break;}
2774case 113:
2775#line 1256 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2776{
2777 if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val))
Reid Spencerb5334b02007-02-05 10:18:06 +00002778 GEN_ERROR("Alignment must be a power of two");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002779 CurGV->setAlignment(yyvsp[0].UInt64Val);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002780 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002781 ;
2782 break;}
2783case 118:
2784#line 1272 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2785{
2786 yyval.TypeVal = new PATypeHolder(OpaqueType::get());
Reid Spencer41dff5e2007-01-26 08:05:27 +00002787 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002788 ;
2789 break;}
2790case 119:
2791#line 1276 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2792{
2793 yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType);
Reid Spencer41dff5e2007-01-26 08:05:27 +00002794 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002795 ;
2796 break;}
2797case 120:
2798#line 1280 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2799{ // Pointer type?
2800 if (*yyvsp[-1].TypeVal == Type::LabelTy)
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002801 GEN_ERROR("Cannot form a pointer to a basic block");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002802 yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal)));
2803 delete yyvsp[-1].TypeVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002804 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002805 ;
2806 break;}
2807case 121:
2808#line 1287 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2809{ // Named types are also simple types...
2810 const Type* tmp = getTypeVal(yyvsp[0].ValIDVal);
Reid Spencer41dff5e2007-01-26 08:05:27 +00002811 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002812 yyval.TypeVal = new PATypeHolder(tmp);
2813 ;
2814 break;}
2815case 122:
2816#line 1292 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2817{ // Type UpReference
2818 if (yyvsp[0].UInt64Val > (uint64_t)~0U) GEN_ERROR("Value out of range");
Reid Spencer41dff5e2007-01-26 08:05:27 +00002819 OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002820 UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT)); // Add to vector...
2821 yyval.TypeVal = new PATypeHolder(OT);
Reid Spencer41dff5e2007-01-26 08:05:27 +00002822 UR_OUT("New Upreference!\n");
2823 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002824 ;
2825 break;}
2826case 123:
2827#line 1300 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2828{
Reid Spencer41dff5e2007-01-26 08:05:27 +00002829 std::vector<const Type*> Params;
Reid Spencer7b5d4662007-04-09 06:16:21 +00002830 ParamAttrsList Attrs;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002831 if (yyvsp[0].ParamAttrs != ParamAttr::None)
2832 Attrs.addAttributes(0, yyvsp[0].ParamAttrs);
Reid Spencer7b5d4662007-04-09 06:16:21 +00002833 unsigned index = 1;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002834 TypeWithAttrsList::iterator I = yyvsp[-2].TypeWithAttrsList->begin(), E = yyvsp[-2].TypeWithAttrsList->end();
Reid Spencer7b5d4662007-04-09 06:16:21 +00002835 for (; I != E; ++I, ++index) {
Reid Spencer66728ef2007-03-20 01:13:36 +00002836 const Type *Ty = I->Ty->get();
Reid Spencer66728ef2007-03-20 01:13:36 +00002837 Params.push_back(Ty);
2838 if (Ty != Type::VoidTy)
Reid Spencer18da0722007-04-11 02:44:20 +00002839 if (I->Attrs != ParamAttr::None)
Reid Spencer7b5d4662007-04-09 06:16:21 +00002840 Attrs.addAttributes(index, I->Attrs);
Reid Spencer41dff5e2007-01-26 08:05:27 +00002841 }
2842 bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
2843 if (isVarArg) Params.pop_back();
2844
Reid Spencer7b5d4662007-04-09 06:16:21 +00002845 ParamAttrsList *ActualAttrs = 0;
2846 if (!Attrs.empty())
2847 ActualAttrs = new ParamAttrsList(Attrs);
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002848 FunctionType *FT = FunctionType::get(*yyvsp[-4].TypeVal, Params, isVarArg, ActualAttrs);
2849 delete yyvsp[-2].TypeWithAttrsList; // Delete the argument list
2850 delete yyvsp[-4].TypeVal; // Delete the return type handle
2851 yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT));
Reid Spencere4d87aa2006-12-23 06:05:41 +00002852 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002853 ;
2854 break;}
2855case 124:
2856#line 1326 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2857{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002858 std::vector<const Type*> Params;
Reid Spencer7b5d4662007-04-09 06:16:21 +00002859 ParamAttrsList Attrs;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002860 if (yyvsp[0].ParamAttrs != ParamAttr::None)
2861 Attrs.addAttributes(0, yyvsp[0].ParamAttrs);
2862 TypeWithAttrsList::iterator I = yyvsp[-2].TypeWithAttrsList->begin(), E = yyvsp[-2].TypeWithAttrsList->end();
Reid Spencer7b5d4662007-04-09 06:16:21 +00002863 unsigned index = 1;
2864 for ( ; I != E; ++I, ++index) {
Reid Spencer66728ef2007-03-20 01:13:36 +00002865 const Type* Ty = I->Ty->get();
Reid Spencer66728ef2007-03-20 01:13:36 +00002866 Params.push_back(Ty);
2867 if (Ty != Type::VoidTy)
Reid Spencer18da0722007-04-11 02:44:20 +00002868 if (I->Attrs != ParamAttr::None)
Reid Spencer7b5d4662007-04-09 06:16:21 +00002869 Attrs.addAttributes(index, I->Attrs);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002870 }
2871 bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
2872 if (isVarArg) Params.pop_back();
2873
Reid Spencer7b5d4662007-04-09 06:16:21 +00002874 ParamAttrsList *ActualAttrs = 0;
2875 if (!Attrs.empty())
2876 ActualAttrs = new ParamAttrsList(Attrs);
2877
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002878 FunctionType *FT = FunctionType::get(yyvsp[-4].PrimType, Params, isVarArg, ActualAttrs);
2879 delete yyvsp[-2].TypeWithAttrsList; // Delete the argument list
2880 yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT));
Reid Spencer41dff5e2007-01-26 08:05:27 +00002881 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002882 ;
2883 break;}
2884case 125:
2885#line 1353 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2886{ // Sized array type?
2887 yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val)));
2888 delete yyvsp[-1].TypeVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00002889 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002890 ;
2891 break;}
2892case 126:
2893#line 1358 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2894{ // Vector type?
2895 const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get();
2896 if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val)
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002897 GEN_ERROR("Unsigned result not equal to signed result");
2898 if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger())
Reid Spencer9d6565a2007-02-15 02:26:10 +00002899 GEN_ERROR("Element type of a VectorType must be primitive");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002900 if (!isPowerOf2_32(yyvsp[-3].UInt64Val))
Reid Spencerb5334b02007-02-05 10:18:06 +00002901 GEN_ERROR("Vector length should be a power of 2");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002902 yyval.TypeVal = new PATypeHolder(HandleUpRefs(VectorType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val)));
2903 delete yyvsp[-1].TypeVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002904 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002905 ;
2906 break;}
2907case 127:
2908#line 1370 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2909{ // Structure type?
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002910 std::vector<const Type*> Elements;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002911 for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-1].TypeList->begin(),
2912 E = yyvsp[-1].TypeList->end(); I != E; ++I)
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002913 Elements.push_back(*I);
2914
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002915 yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
2916 delete yyvsp[-1].TypeList;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002917 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002918 ;
2919 break;}
2920case 128:
2921#line 1380 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2922{ // Empty structure type?
2923 yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>()));
Reid Spencer14310612006-12-31 05:40:51 +00002924 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002925 ;
2926 break;}
2927case 129:
2928#line 1384 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2929{
Reid Spencer41dff5e2007-01-26 08:05:27 +00002930 std::vector<const Type*> Elements;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002931 for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-2].TypeList->begin(),
2932 E = yyvsp[-2].TypeList->end(); I != E; ++I)
Reid Spencer41dff5e2007-01-26 08:05:27 +00002933 Elements.push_back(*I);
2934
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002935 yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
2936 delete yyvsp[-2].TypeList;
Reid Spencer14310612006-12-31 05:40:51 +00002937 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002938 ;
2939 break;}
2940case 130:
2941#line 1394 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2942{ // Empty structure type?
2943 yyval.TypeVal = new PATypeHolder(StructType::get(std::vector<const Type*>(), true));
Reid Spencer41dff5e2007-01-26 08:05:27 +00002944 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002945 ;
2946 break;}
2947case 131:
2948#line 1401 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2949{
2950 yyval.TypeWithAttrs.Ty = yyvsp[-1].TypeVal;
2951 yyval.TypeWithAttrs.Attrs = yyvsp[0].ParamAttrs;
2952 ;
2953 break;}
2954case 132:
2955#line 1408 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2956{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00002957 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002958 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
2959 if (!(*yyvsp[0].TypeVal)->isFirstClassType())
Reid Spencerb5334b02007-02-05 10:18:06 +00002960 GEN_ERROR("LLVM functions cannot return aggregate types");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002961 yyval.TypeVal = yyvsp[0].TypeVal;
2962 ;
2963 break;}
2964case 133:
2965#line 1415 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2966{
2967 yyval.TypeVal = new PATypeHolder(Type::VoidTy);
2968 ;
2969 break;}
2970case 134:
2971#line 1420 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2972{
2973 yyval.TypeWithAttrsList = new TypeWithAttrsList();
2974 yyval.TypeWithAttrsList->push_back(yyvsp[0].TypeWithAttrs);
Reid Spencer6f407902007-01-13 05:00:46 +00002975 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002976 ;
2977 break;}
2978case 135:
2979#line 1425 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2980{
2981 (yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList)->push_back(yyvsp[0].TypeWithAttrs);
Reid Spencer3da59db2006-11-27 01:05:10 +00002982 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002983 ;
2984 break;}
2985case 137:
2986#line 1433 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2987{
2988 yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList;
Reid Spencer18da0722007-04-11 02:44:20 +00002989 TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
Reid Spencer41dff5e2007-01-26 08:05:27 +00002990 TWA.Ty = new PATypeHolder(Type::VoidTy);
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002991 yyval.TypeWithAttrsList->push_back(TWA);
Reid Spencer41dff5e2007-01-26 08:05:27 +00002992 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00002993 ;
2994 break;}
2995case 138:
2996#line 1440 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
2997{
2998 yyval.TypeWithAttrsList = new TypeWithAttrsList;
Reid Spencer18da0722007-04-11 02:44:20 +00002999 TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003000 TWA.Ty = new PATypeHolder(Type::VoidTy);
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003001 yyval.TypeWithAttrsList->push_back(TWA);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003002 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003003 ;
3004 break;}
3005case 139:
3006#line 1447 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3007{
3008 yyval.TypeWithAttrsList = new TypeWithAttrsList();
Reid Spencer41dff5e2007-01-26 08:05:27 +00003009 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003010 ;
3011 break;}
3012case 140:
3013#line 1455 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3014{
3015 yyval.TypeList = new std::list<PATypeHolder>();
3016 yyval.TypeList->push_back(*yyvsp[0].TypeVal);
3017 delete yyvsp[0].TypeVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003018 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003019 ;
3020 break;}
3021case 141:
3022#line 1461 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3023{
3024 (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal);
3025 delete yyvsp[0].TypeVal;
Reid Spencer3da59db2006-11-27 01:05:10 +00003026 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003027 ;
3028 break;}
3029case 142:
3030#line 1473 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3031{ // Nonempty unsized arr
Reid Spencer14310612006-12-31 05:40:51 +00003032 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003033 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
3034 const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-3].TypeVal->get());
Reid Spencer68a24bd2005-08-27 18:50:39 +00003035 if (ATy == 0)
Reid Spencer61c83e02006-08-18 08:43:06 +00003036 GEN_ERROR("Cannot make array constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003037 (*yyvsp[-3].TypeVal)->getDescription() + "'");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003038 const Type *ETy = ATy->getElementType();
3039 int NumElements = ATy->getNumElements();
3040
3041 // Verify that we have the correct size...
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003042 if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003043 GEN_ERROR("Type mismatch: constant sized array initialized with " +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003044 utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " +
Reid Spencerb5334b02007-02-05 10:18:06 +00003045 itostr(NumElements) + "");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003046
3047 // Verify all elements are correct type!
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003048 for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
3049 if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003050 GEN_ERROR("Element #" + utostr(i) + " is not of type '" +
3051 ETy->getDescription() +"' as required!\nIt is of type '"+
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003052 (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003053 }
3054
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003055 yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector);
3056 delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003057 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003058 ;
3059 break;}
3060case 143:
3061#line 1501 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3062{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003063 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003064 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
3065 const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal->get());
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003066 if (ATy == 0)
3067 GEN_ERROR("Cannot make array constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003068 (*yyvsp[-2].TypeVal)->getDescription() + "'");
Reid Spencer68a24bd2005-08-27 18:50:39 +00003069
Andrew Lenharth6353e052006-12-08 18:07:09 +00003070 int NumElements = ATy->getNumElements();
3071 if (NumElements != -1 && NumElements != 0)
3072 GEN_ERROR("Type mismatch: constant sized array initialized with 0"
Reid Spencerb5334b02007-02-05 10:18:06 +00003073 " arguments, but has size of " + itostr(NumElements) +"");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003074 yyval.ConstVal = ConstantArray::get(ATy, std::vector<Constant*>());
3075 delete yyvsp[-2].TypeVal;
Reid Spencer61c83e02006-08-18 08:43:06 +00003076 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003077 ;
3078 break;}
3079case 144:
3080#line 1517 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3081{
Reid Spencer14310612006-12-31 05:40:51 +00003082 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003083 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
3084 const ArrayType *ATy = dyn_cast<ArrayType>(yyvsp[-2].TypeVal->get());
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003085 if (ATy == 0)
3086 GEN_ERROR("Cannot make array constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003087 (*yyvsp[-2].TypeVal)->getDescription() + "'");
Reid Spencer61c83e02006-08-18 08:43:06 +00003088
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003089 int NumElements = ATy->getNumElements();
3090 const Type *ETy = ATy->getElementType();
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003091 char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true);
3092 if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal))
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003093 GEN_ERROR("Can't build string constant of size " +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003094 itostr((int)(EndStr-yyvsp[0].StrVal)) +
Reid Spencerb5334b02007-02-05 10:18:06 +00003095 " when array has size " + itostr(NumElements) + "");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003096 std::vector<Constant*> Vals;
3097 if (ETy == Type::Int8Ty) {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003098 for (unsigned char *C = (unsigned char *)yyvsp[0].StrVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003099 C != (unsigned char*)EndStr; ++C)
3100 Vals.push_back(ConstantInt::get(ETy, *C));
3101 } else {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003102 free(yyvsp[0].StrVal);
Reid Spencerb5334b02007-02-05 10:18:06 +00003103 GEN_ERROR("Cannot build string arrays of non byte sized elements");
Andrew Lenharth6353e052006-12-08 18:07:09 +00003104 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003105 free(yyvsp[0].StrVal);
3106 yyval.ConstVal = ConstantArray::get(ATy, Vals);
3107 delete yyvsp[-2].TypeVal;
Reid Spencer61c83e02006-08-18 08:43:06 +00003108 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003109 ;
3110 break;}
3111case 145:
3112#line 1546 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3113{ // Nonempty unsized arr
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003114 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003115 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
3116 const VectorType *PTy = dyn_cast<VectorType>(yyvsp[-3].TypeVal->get());
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003117 if (PTy == 0)
3118 GEN_ERROR("Cannot make packed constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003119 (*yyvsp[-3].TypeVal)->getDescription() + "'");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003120 const Type *ETy = PTy->getElementType();
3121 int NumElements = PTy->getNumElements();
Reid Spencer41dff5e2007-01-26 08:05:27 +00003122
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003123 // Verify that we have the correct size...
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003124 if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size())
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003125 GEN_ERROR("Type mismatch: constant sized packed initialized with " +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003126 utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " +
Reid Spencerb5334b02007-02-05 10:18:06 +00003127 itostr(NumElements) + "");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003128
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003129 // Verify all elements are correct type!
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003130 for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
3131 if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003132 GEN_ERROR("Element #" + utostr(i) + " is not of type '" +
3133 ETy->getDescription() +"' as required!\nIt is of type '"+
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003134 (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003135 }
Reid Spencer41dff5e2007-01-26 08:05:27 +00003136
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003137 yyval.ConstVal = ConstantVector::get(PTy, *yyvsp[-1].ConstVector);
3138 delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003139 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003140 ;
3141 break;}
3142case 146:
3143#line 1574 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3144{
3145 const StructType *STy = dyn_cast<StructType>(yyvsp[-3].TypeVal->get());
Reid Spencer41dff5e2007-01-26 08:05:27 +00003146 if (STy == 0)
3147 GEN_ERROR("Cannot make struct constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003148 (*yyvsp[-3].TypeVal)->getDescription() + "'");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003149
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003150 if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes())
Reid Spencerb5334b02007-02-05 10:18:06 +00003151 GEN_ERROR("Illegal number of initializers for structure type");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003152
3153 // Check to ensure that constants are compatible with the type initializer!
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003154 for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i)
3155 if ((*yyvsp[-1].ConstVector)[i]->getType() != STy->getElementType(i))
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003156 GEN_ERROR("Expected type '" +
3157 STy->getElementType(i)->getDescription() +
3158 "' for element #" + utostr(i) +
Reid Spencerb5334b02007-02-05 10:18:06 +00003159 " of structure initializer");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003160
3161 // Check to ensure that Type is not packed
3162 if (STy->isPacked())
Chris Lattner32980692007-02-19 07:44:24 +00003163 GEN_ERROR("Unpacked Initializer to vector type '" + STy->getDescription() + "'");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003164
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003165 yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector);
3166 delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003167 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003168 ;
3169 break;}
3170case 147:
3171#line 1599 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3172{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003173 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003174 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
3175 const StructType *STy = dyn_cast<StructType>(yyvsp[-2].TypeVal->get());
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003176 if (STy == 0)
3177 GEN_ERROR("Cannot make struct constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003178 (*yyvsp[-2].TypeVal)->getDescription() + "'");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003179
3180 if (STy->getNumContainedTypes() != 0)
Reid Spencerb5334b02007-02-05 10:18:06 +00003181 GEN_ERROR("Illegal number of initializers for structure type");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003182
3183 // Check to ensure that Type is not packed
3184 if (STy->isPacked())
Chris Lattner32980692007-02-19 07:44:24 +00003185 GEN_ERROR("Unpacked Initializer to vector type '" + STy->getDescription() + "'");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003186
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003187 yyval.ConstVal = ConstantStruct::get(STy, std::vector<Constant*>());
3188 delete yyvsp[-2].TypeVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003189 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003190 ;
3191 break;}
3192case 148:
3193#line 1618 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3194{
3195 const StructType *STy = dyn_cast<StructType>(yyvsp[-5].TypeVal->get());
Reid Spencer41dff5e2007-01-26 08:05:27 +00003196 if (STy == 0)
3197 GEN_ERROR("Cannot make struct constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003198 (*yyvsp[-5].TypeVal)->getDescription() + "'");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003199
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003200 if (yyvsp[-2].ConstVector->size() != STy->getNumContainedTypes())
Reid Spencerb5334b02007-02-05 10:18:06 +00003201 GEN_ERROR("Illegal number of initializers for structure type");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003202
3203 // Check to ensure that constants are compatible with the type initializer!
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003204 for (unsigned i = 0, e = yyvsp[-2].ConstVector->size(); i != e; ++i)
3205 if ((*yyvsp[-2].ConstVector)[i]->getType() != STy->getElementType(i))
Reid Spencer41dff5e2007-01-26 08:05:27 +00003206 GEN_ERROR("Expected type '" +
3207 STy->getElementType(i)->getDescription() +
3208 "' for element #" + utostr(i) +
Reid Spencerb5334b02007-02-05 10:18:06 +00003209 " of structure initializer");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003210
3211 // Check to ensure that Type is packed
3212 if (!STy->isPacked())
Chris Lattner32980692007-02-19 07:44:24 +00003213 GEN_ERROR("Vector initializer to non-vector type '" +
3214 STy->getDescription() + "'");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003215
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003216 yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-2].ConstVector);
3217 delete yyvsp[-5].TypeVal; delete yyvsp[-2].ConstVector;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003218 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003219 ;
3220 break;}
3221case 149:
3222#line 1644 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3223{
Reid Spencer41dff5e2007-01-26 08:05:27 +00003224 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003225 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
3226 const StructType *STy = dyn_cast<StructType>(yyvsp[-4].TypeVal->get());
Reid Spencer41dff5e2007-01-26 08:05:27 +00003227 if (STy == 0)
3228 GEN_ERROR("Cannot make struct constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003229 (*yyvsp[-4].TypeVal)->getDescription() + "'");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003230
3231 if (STy->getNumContainedTypes() != 0)
Reid Spencerb5334b02007-02-05 10:18:06 +00003232 GEN_ERROR("Illegal number of initializers for structure type");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003233
3234 // Check to ensure that Type is packed
3235 if (!STy->isPacked())
Chris Lattner32980692007-02-19 07:44:24 +00003236 GEN_ERROR("Vector initializer to non-vector type '" +
3237 STy->getDescription() + "'");
Reid Spencer41dff5e2007-01-26 08:05:27 +00003238
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003239 yyval.ConstVal = ConstantStruct::get(STy, std::vector<Constant*>());
3240 delete yyvsp[-4].TypeVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003241 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003242 ;
3243 break;}
3244case 150:
3245#line 1664 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3246{
Reid Spencer41dff5e2007-01-26 08:05:27 +00003247 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003248 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
3249 const PointerType *PTy = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003250 if (PTy == 0)
3251 GEN_ERROR("Cannot make null pointer constant with type: '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003252 (*yyvsp[-1].TypeVal)->getDescription() + "'");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003253
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003254 yyval.ConstVal = ConstantPointerNull::get(PTy);
3255 delete yyvsp[-1].TypeVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003256 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003257 ;
3258 break;}
3259case 151:
3260#line 1676 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3261{
Reid Spencer41dff5e2007-01-26 08:05:27 +00003262 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003263 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
3264 yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get());
3265 delete yyvsp[-1].TypeVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003266 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003267 ;
3268 break;}
3269case 152:
3270#line 1683 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3271{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003272 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003273 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
3274 const PointerType *Ty = dyn_cast<PointerType>(yyvsp[-1].TypeVal->get());
Reid Spencer68a24bd2005-08-27 18:50:39 +00003275 if (Ty == 0)
Reid Spencerb5334b02007-02-05 10:18:06 +00003276 GEN_ERROR("Global const reference must be a pointer type");
Reid Spencer68a24bd2005-08-27 18:50:39 +00003277
3278 // ConstExprs can exist in the body of a function, thus creating
3279 // GlobalValues whenever they refer to a variable. Because we are in
Reid Spencer93c40032007-03-19 18:40:50 +00003280 // the context of a function, getExistingVal will search the functions
Reid Spencer68a24bd2005-08-27 18:50:39 +00003281 // symbol table instead of the module symbol table for the global symbol,
3282 // which throws things all off. To get around this, we just tell
Reid Spencer93c40032007-03-19 18:40:50 +00003283 // getExistingVal that we are at global scope here.
Reid Spencer68a24bd2005-08-27 18:50:39 +00003284 //
3285 Function *SavedCurFn = CurFun.CurrentFunction;
3286 CurFun.CurrentFunction = 0;
3287
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003288 Value *V = getExistingVal(Ty, yyvsp[0].ValIDVal);
Reid Spencer5b7e7532006-09-28 19:28:24 +00003289 CHECK_FOR_ERROR
Reid Spencer68a24bd2005-08-27 18:50:39 +00003290
3291 CurFun.CurrentFunction = SavedCurFn;
3292
3293 // If this is an initializer for a constant pointer, which is referencing a
3294 // (currently) undefined variable, create a stub now that shall be replaced
3295 // in the future with the right type of variable.
3296 //
3297 if (V == 0) {
Reid Spencera9720f52007-02-05 17:04:00 +00003298 assert(isa<PointerType>(Ty) && "Globals may only be used as pointers!");
Reid Spencer68a24bd2005-08-27 18:50:39 +00003299 const PointerType *PT = cast<PointerType>(Ty);
3300
3301 // First check to see if the forward references value is already created!
3302 PerModuleInfo::GlobalRefsType::iterator I =
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003303 CurModule.GlobalRefs.find(std::make_pair(PT, yyvsp[0].ValIDVal));
Reid Spencer68a24bd2005-08-27 18:50:39 +00003304
3305 if (I != CurModule.GlobalRefs.end()) {
3306 V = I->second; // Placeholder already exists, use it...
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003307 yyvsp[0].ValIDVal.destroy();
Reid Spencer68a24bd2005-08-27 18:50:39 +00003308 } else {
3309 std::string Name;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003310 if (yyvsp[0].ValIDVal.Type == ValID::GlobalName)
3311 Name = yyvsp[0].ValIDVal.Name;
3312 else if (yyvsp[0].ValIDVal.Type != ValID::GlobalID)
Reid Spencer41dff5e2007-01-26 08:05:27 +00003313 GEN_ERROR("Invalid reference to global");
Reid Spencer68a24bd2005-08-27 18:50:39 +00003314
3315 // Create the forward referenced global.
3316 GlobalValue *GV;
3317 if (const FunctionType *FTy =
3318 dyn_cast<FunctionType>(PT->getElementType())) {
3319 GV = new Function(FTy, GlobalValue::ExternalLinkage, Name,
3320 CurModule.CurrentModule);
3321 } else {
3322 GV = new GlobalVariable(PT->getElementType(), false,
3323 GlobalValue::ExternalLinkage, 0,
3324 Name, CurModule.CurrentModule);
3325 }
3326
3327 // Keep track of the fact that we have a forward ref to recycle it
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003328 CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, yyvsp[0].ValIDVal), GV));
Reid Spencer68a24bd2005-08-27 18:50:39 +00003329 V = GV;
3330 }
3331 }
3332
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003333 yyval.ConstVal = cast<GlobalValue>(V);
3334 delete yyvsp[-1].TypeVal; // Free the type handle
Reid Spencer61c83e02006-08-18 08:43:06 +00003335 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003336 ;
3337 break;}
3338case 153:
3339#line 1749 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3340{
Reid Spencer14310612006-12-31 05:40:51 +00003341 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003342 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
3343 if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType())
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003344 GEN_ERROR("Mismatched types for constant expression: " +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003345 (*yyvsp[-1].TypeVal)->getDescription() + " and " + yyvsp[0].ConstVal->getType()->getDescription());
3346 yyval.ConstVal = yyvsp[0].ConstVal;
3347 delete yyvsp[-1].TypeVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003348 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003349 ;
3350 break;}
3351case 154:
3352#line 1759 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3353{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003354 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003355 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
3356 const Type *Ty = yyvsp[-1].TypeVal->get();
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003357 if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
Reid Spencerb5334b02007-02-05 10:18:06 +00003358 GEN_ERROR("Cannot create a null initialized value of this type");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003359 yyval.ConstVal = Constant::getNullValue(Ty);
3360 delete yyvsp[-1].TypeVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003361 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003362 ;
3363 break;}
3364case 155:
3365#line 1769 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3366{ // integral constants
3367 if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val))
Reid Spencerb5334b02007-02-05 10:18:06 +00003368 GEN_ERROR("Constant value doesn't fit in type");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003369 yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val, true);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003370 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003371 ;
3372 break;}
3373case 156:
3374#line 1775 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3375{ // arbitrary precision integer constants
3376 uint32_t BitWidth = cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth();
3377 if (yyvsp[0].APIntVal->getBitWidth() > BitWidth) {
Reid Spencer38c91a92007-02-28 02:24:54 +00003378 GEN_ERROR("Constant value does not fit in type");
Reid Spencer10794272007-03-01 19:41:47 +00003379 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003380 yyvsp[0].APIntVal->sextOrTrunc(BitWidth);
3381 yyval.ConstVal = ConstantInt::get(*yyvsp[0].APIntVal);
3382 delete yyvsp[0].APIntVal;
Reid Spencer38c91a92007-02-28 02:24:54 +00003383 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003384 ;
3385 break;}
3386case 157:
3387#line 1785 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3388{ // integral constants
3389 if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val))
Reid Spencerb5334b02007-02-05 10:18:06 +00003390 GEN_ERROR("Constant value doesn't fit in type");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003391 yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val, false);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003392 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003393 ;
3394 break;}
3395case 158:
3396#line 1791 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3397{ // arbitrary precision integer constants
3398 uint32_t BitWidth = cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth();
3399 if (yyvsp[0].APIntVal->getBitWidth() > BitWidth) {
Reid Spencer38c91a92007-02-28 02:24:54 +00003400 GEN_ERROR("Constant value does not fit in type");
Reid Spencer10794272007-03-01 19:41:47 +00003401 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003402 yyvsp[0].APIntVal->zextOrTrunc(BitWidth);
3403 yyval.ConstVal = ConstantInt::get(*yyvsp[0].APIntVal);
3404 delete yyvsp[0].APIntVal;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003405 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003406 ;
3407 break;}
3408case 159:
3409#line 1801 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3410{ // Boolean constants
3411 assert(cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?");
3412 yyval.ConstVal = ConstantInt::getTrue();
Reid Spencer41dff5e2007-01-26 08:05:27 +00003413 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003414 ;
3415 break;}
3416case 160:
3417#line 1806 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3418{ // Boolean constants
3419 assert(cast<IntegerType>(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?");
3420 yyval.ConstVal = ConstantInt::getFalse();
Reid Spencer38c91a92007-02-28 02:24:54 +00003421 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003422 ;
3423 break;}
3424case 161:
3425#line 1811 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3426{ // Float & Double constants
3427 if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal))
Reid Spencerb5334b02007-02-05 10:18:06 +00003428 GEN_ERROR("Floating point constant invalid for type");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003429 yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal);
Reid Spencer6f407902007-01-13 05:00:46 +00003430 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003431 ;
3432 break;}
3433case 162:
3434#line 1819 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3435{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003436 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003437 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
3438 Constant *Val = yyvsp[-3].ConstVal;
3439 const Type *DestTy = yyvsp[-1].TypeVal->get();
3440 if (!CastInst::castIsValid(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy))
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003441 GEN_ERROR("invalid cast opcode for cast from '" +
3442 Val->getType()->getDescription() + "' to '" +
Reid Spencerb5334b02007-02-05 10:18:06 +00003443 DestTy->getDescription() + "'");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003444 yyval.ConstVal = ConstantExpr::getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy);
3445 delete yyvsp[-1].TypeVal;
3446 ;
3447 break;}
3448case 163:
3449#line 1831 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3450{
3451 if (!isa<PointerType>(yyvsp[-2].ConstVal->getType()))
Reid Spencerb5334b02007-02-05 10:18:06 +00003452 GEN_ERROR("GetElementPtr requires a pointer operand");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003453
3454 const Type *IdxTy =
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003455 GetElementPtrInst::getIndexedType(yyvsp[-2].ConstVal->getType(), &(*yyvsp[-1].ValueList)[0], yyvsp[-1].ValueList->size(),
Chris Lattner7d9801d2007-02-13 00:58:01 +00003456 true);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003457 if (!IdxTy)
Reid Spencerb5334b02007-02-05 10:18:06 +00003458 GEN_ERROR("Index list invalid for constant getelementptr");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003459
Chris Lattnerf7469af2007-01-31 04:44:08 +00003460 SmallVector<Constant*, 8> IdxVec;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003461 for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i)
3462 if (Constant *C = dyn_cast<Constant>((*yyvsp[-1].ValueList)[i]))
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003463 IdxVec.push_back(C);
3464 else
Reid Spencerb5334b02007-02-05 10:18:06 +00003465 GEN_ERROR("Indices to constant getelementptr must be constants");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003466
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003467 delete yyvsp[-1].ValueList;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003468
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003469 yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, &IdxVec[0], IdxVec.size());
Andrew Lenharth6353e052006-12-08 18:07:09 +00003470 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003471 ;
3472 break;}
3473case 164:
3474#line 1853 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3475{
3476 if (yyvsp[-5].ConstVal->getType() != Type::Int1Ty)
Reid Spencerb5334b02007-02-05 10:18:06 +00003477 GEN_ERROR("Select condition must be of boolean type");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003478 if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
Reid Spencerb5334b02007-02-05 10:18:06 +00003479 GEN_ERROR("Select operand types must match");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003480 yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003481 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003482 ;
3483 break;}
3484case 165:
3485#line 1861 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3486{
3487 if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
Reid Spencerb5334b02007-02-05 10:18:06 +00003488 GEN_ERROR("Binary operator types must match");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003489 CHECK_FOR_ERROR;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003490 yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
3491 ;
3492 break;}
3493case 166:
3494#line 1867 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3495{
3496 if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
Reid Spencerb5334b02007-02-05 10:18:06 +00003497 GEN_ERROR("Logical operator types must match");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003498 if (!yyvsp[-3].ConstVal->getType()->isInteger()) {
3499 if (Instruction::isShift(yyvsp[-5].BinaryOpVal) || !isa<VectorType>(yyvsp[-3].ConstVal->getType()) ||
3500 !cast<VectorType>(yyvsp[-3].ConstVal->getType())->getElementType()->isInteger())
Reid Spencerb5334b02007-02-05 10:18:06 +00003501 GEN_ERROR("Logical operator requires integral operands");
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003502 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003503 yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003504 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003505 ;
3506 break;}
3507case 167:
3508#line 1878 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3509{
3510 if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
Reid Spencerb5334b02007-02-05 10:18:06 +00003511 GEN_ERROR("icmp operand types must match");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003512 yyval.ConstVal = ConstantExpr::getICmp(yyvsp[-5].IPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
3513 ;
3514 break;}
3515case 168:
3516#line 1883 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3517{
3518 if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType())
Reid Spencerb5334b02007-02-05 10:18:06 +00003519 GEN_ERROR("fcmp operand types must match");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003520 yyval.ConstVal = ConstantExpr::getFCmp(yyvsp[-5].FPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
3521 ;
3522 break;}
3523case 169:
3524#line 1888 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3525{
3526 if (!ExtractElementInst::isValidOperands(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
Reid Spencerb5334b02007-02-05 10:18:06 +00003527 GEN_ERROR("Invalid extractelement operands");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003528 yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003529 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003530 ;
3531 break;}
3532case 170:
3533#line 1894 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3534{
3535 if (!InsertElementInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
Reid Spencerb5334b02007-02-05 10:18:06 +00003536 GEN_ERROR("Invalid insertelement operands");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003537 yyval.ConstVal = ConstantExpr::getInsertElement(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003538 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003539 ;
3540 break;}
3541case 171:
3542#line 1900 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3543{
3544 if (!ShuffleVectorInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal))
Reid Spencerb5334b02007-02-05 10:18:06 +00003545 GEN_ERROR("Invalid shufflevector operands");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003546 yyval.ConstVal = ConstantExpr::getShuffleVector(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003547 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003548 ;
3549 break;}
3550case 172:
3551#line 1909 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3552{
3553 (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003554 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003555 ;
3556 break;}
3557case 173:
3558#line 1913 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3559{
3560 yyval.ConstVector = new std::vector<Constant*>();
3561 yyval.ConstVector->push_back(yyvsp[0].ConstVal);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003562 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003563 ;
3564 break;}
3565case 174:
3566#line 1921 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3567{ yyval.BoolVal = false; ;
3568 break;}
3569case 175:
3570#line 1921 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3571{ yyval.BoolVal = true; ;
3572 break;}
3573case 176:
3574#line 1924 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3575{ yyval.BoolVal = true; ;
3576 break;}
3577case 177:
3578#line 1924 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3579{ yyval.BoolVal = false; ;
3580 break;}
3581case 178:
3582#line 1935 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3583{
3584 yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
Reid Spencer67d8ed92007-03-22 02:14:08 +00003585 CurModule.ModuleDone();
3586 CHECK_FOR_ERROR;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003587 ;
3588 break;}
3589case 179:
3590#line 1940 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3591{
3592 yyval.ModuleVal = ParserResult = CurModule.CurrentModule;
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003593 CurModule.ModuleDone();
3594 CHECK_FOR_ERROR;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003595 ;
3596 break;}
3597case 182:
3598#line 1953 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3599{ CurFun.isDeclare = false; ;
3600 break;}
3601case 183:
3602#line 1953 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3603{
Reid Spencer41dff5e2007-01-26 08:05:27 +00003604 CurFun.FunctionDone();
3605 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003606 ;
3607 break;}
3608case 184:
3609#line 1957 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3610{ CurFun.isDeclare = true; ;
3611 break;}
3612case 185:
3613#line 1957 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3614{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003615 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003616 ;
3617 break;}
3618case 186:
3619#line 1960 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3620{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003621 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003622 ;
3623 break;}
3624case 187:
3625#line 1963 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3626{
Reid Spencer14310612006-12-31 05:40:51 +00003627 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003628 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
Reid Spencer68a24bd2005-08-27 18:50:39 +00003629 // Eagerly resolve types. This is not an optimization, this is a
3630 // requirement that is due to the fact that we could have this:
3631 //
3632 // %list = type { %list * }
3633 // %list = type { %list * } ; repeated type decl
3634 //
3635 // If types are not resolved eagerly, then the two types will not be
3636 // determined to be the same type!
3637 //
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003638 ResolveTypeTo(yyvsp[-2].StrVal, *yyvsp[0].TypeVal);
Reid Spencer68a24bd2005-08-27 18:50:39 +00003639
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003640 if (!setTypeName(*yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) {
Reid Spencer5b7e7532006-09-28 19:28:24 +00003641 CHECK_FOR_ERROR
Reid Spencer68a24bd2005-08-27 18:50:39 +00003642 // If this is a named type that is not a redefinition, add it to the slot
3643 // table.
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003644 CurModule.Types.push_back(*yyvsp[0].TypeVal);
Reid Spencer68a24bd2005-08-27 18:50:39 +00003645 }
Reid Spencera132e042006-12-03 05:46:11 +00003646
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003647 delete yyvsp[0].TypeVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003648 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003649 ;
3650 break;}
3651case 188:
3652#line 1987 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3653{
3654 ResolveTypeTo(yyvsp[-2].StrVal, yyvsp[0].PrimType);
Reid Spencer38c91a92007-02-28 02:24:54 +00003655
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003656 if (!setTypeName(yyvsp[0].PrimType, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) {
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003657 CHECK_FOR_ERROR
3658 // If this is a named type that is not a redefinition, add it to the slot
3659 // table.
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003660 CurModule.Types.push_back(yyvsp[0].PrimType);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003661 }
3662 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003663 ;
3664 break;}
3665case 189:
3666#line 1998 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3667{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003668 /* "Externally Visible" Linkage */
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003669 if (yyvsp[0].ConstVal == 0)
Reid Spencerb5334b02007-02-05 10:18:06 +00003670 GEN_ERROR("Global value initializer is not a constant");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003671 CurGV = ParseGlobalVariable(yyvsp[-4].StrVal, GlobalValue::ExternalLinkage,
3672 yyvsp[-3].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal, yyvsp[-2].BoolVal);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003673 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003674 ;
3675 break;}
3676case 190:
3677#line 2005 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3678{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003679 CurGV = 0;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003680 ;
3681 break;}
3682case 191:
3683#line 2008 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3684{
3685 if (yyvsp[0].ConstVal == 0)
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003686 GEN_ERROR("Global value initializer is not a constant");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003687 CurGV = ParseGlobalVariable(yyvsp[-5].StrVal, yyvsp[-4].Linkage, yyvsp[-3].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal, yyvsp[-2].BoolVal);
Reid Spencer41dff5e2007-01-26 08:05:27 +00003688 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003689 ;
3690 break;}
3691case 192:
3692#line 2013 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3693{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003694 CurGV = 0;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003695 ;
3696 break;}
3697case 193:
3698#line 2016 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3699{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003700 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003701 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
3702 CurGV = ParseGlobalVariable(yyvsp[-5].StrVal, yyvsp[-4].Linkage, yyvsp[-3].Visibility, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0, yyvsp[-2].BoolVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003703 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003704 delete yyvsp[0].TypeVal;
3705 ;
3706 break;}
3707case 194:
3708#line 2022 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3709{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003710 CurGV = 0;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003711 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003712 ;
3713 break;}
3714case 195:
3715#line 2026 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3716{
Reid Spencer41dff5e2007-01-26 08:05:27 +00003717 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003718 ;
3719 break;}
3720case 196:
3721#line 2029 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3722{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003723 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003724 ;
3725 break;}
3726case 197:
3727#line 2035 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3728{
Chris Lattner66316012006-01-24 04:14:29 +00003729 const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003730 char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true);
3731 std::string NewAsm(yyvsp[0].StrVal, EndStr);
3732 free(yyvsp[0].StrVal);
Chris Lattner66316012006-01-24 04:14:29 +00003733
3734 if (AsmSoFar.empty())
3735 CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
3736 else
3737 CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
Reid Spencer61c83e02006-08-18 08:43:06 +00003738 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003739;
3740 break;}
3741case 198:
3742#line 2048 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3743{
3744 CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal);
3745 free(yyvsp[0].StrVal);
3746 ;
3747 break;}
3748case 199:
3749#line 2052 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3750{
3751 CurModule.CurrentModule->setDataLayout(yyvsp[0].StrVal);
3752 free(yyvsp[0].StrVal);
3753 ;
3754 break;}
3755case 201:
3756#line 2059 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3757{
3758 CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
3759 free(yyvsp[0].StrVal);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003760 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003761 ;
3762 break;}
3763case 202:
3764#line 2064 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3765{
3766 CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal);
3767 free(yyvsp[0].StrVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003768 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003769 ;
3770 break;}
3771case 203:
3772#line 2069 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3773{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003774 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003775 ;
3776 break;}
3777case 204:
3778#line 2078 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3779{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003780 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003781 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
3782 if (*yyvsp[-2].TypeVal == Type::VoidTy)
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003783 GEN_ERROR("void typed arguments are invalid");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003784 ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal;
3785 yyval.ArgList = yyvsp[-4].ArgList;
3786 yyvsp[-4].ArgList->push_back(E);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003787 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003788 ;
3789 break;}
3790case 205:
3791#line 2088 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3792{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003793 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003794 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
3795 if (*yyvsp[-2].TypeVal == Type::VoidTy)
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003796 GEN_ERROR("void typed arguments are invalid");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003797 ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal;
3798 yyval.ArgList = new ArgListType;
3799 yyval.ArgList->push_back(E);
Reid Spencer6f407902007-01-13 05:00:46 +00003800 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003801 ;
3802 break;}
3803case 206:
3804#line 2099 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3805{
3806 yyval.ArgList = yyvsp[0].ArgList;
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003807 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003808 ;
3809 break;}
3810case 207:
3811#line 2103 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3812{
3813 yyval.ArgList = yyvsp[-2].ArgList;
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003814 struct ArgListEntry E;
3815 E.Ty = new PATypeHolder(Type::VoidTy);
3816 E.Name = 0;
3817 E.Attrs = ParamAttr::None;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003818 yyval.ArgList->push_back(E);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00003819 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003820 ;
3821 break;}
3822case 208:
3823#line 2112 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3824{
3825 yyval.ArgList = new ArgListType;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003826 struct ArgListEntry E;
3827 E.Ty = new PATypeHolder(Type::VoidTy);
3828 E.Name = 0;
Reid Spencer18da0722007-04-11 02:44:20 +00003829 E.Attrs = ParamAttr::None;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003830 yyval.ArgList->push_back(E);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003831 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003832 ;
3833 break;}
3834case 209:
3835#line 2121 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3836{
3837 yyval.ArgList = 0;
Reid Spencer61c83e02006-08-18 08:43:06 +00003838 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003839 ;
3840 break;}
3841case 210:
3842#line 2127 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3843{
3844 UnEscapeLexed(yyvsp[-6].StrVal);
3845 std::string FunctionName(yyvsp[-6].StrVal);
3846 free(yyvsp[-6].StrVal); // Free strdup'd memory!
Reid Spencer68a24bd2005-08-27 18:50:39 +00003847
Reid Spencer8c8a2dc2007-01-02 21:54:12 +00003848 // Check the function result for abstractness if this is a define. We should
3849 // have no abstract types at this point
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003850 if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(yyvsp[-7].TypeVal))
3851 GEN_ERROR("Reference to abstract result: "+ yyvsp[-7].TypeVal->get()->getDescription());
Reid Spencer8c8a2dc2007-01-02 21:54:12 +00003852
Reid Spencer68a24bd2005-08-27 18:50:39 +00003853 std::vector<const Type*> ParamTypeList;
Reid Spencer7b5d4662007-04-09 06:16:21 +00003854 ParamAttrsList ParamAttrs;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003855 if (yyvsp[-2].ParamAttrs != ParamAttr::None)
3856 ParamAttrs.addAttributes(0, yyvsp[-2].ParamAttrs);
3857 if (yyvsp[-4].ArgList) { // If there are arguments...
Reid Spencer7b5d4662007-04-09 06:16:21 +00003858 unsigned index = 1;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003859 for (ArgListType::iterator I = yyvsp[-4].ArgList->begin(); I != yyvsp[-4].ArgList->end(); ++I, ++index) {
Reid Spencer14310612006-12-31 05:40:51 +00003860 const Type* Ty = I->Ty->get();
Reid Spencer8c8a2dc2007-01-02 21:54:12 +00003861 if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(I->Ty))
3862 GEN_ERROR("Reference to abstract argument: " + Ty->getDescription());
Reid Spencer14310612006-12-31 05:40:51 +00003863 ParamTypeList.push_back(Ty);
3864 if (Ty != Type::VoidTy)
Reid Spencer18da0722007-04-11 02:44:20 +00003865 if (I->Attrs != ParamAttr::None)
Reid Spencer7b5d4662007-04-09 06:16:21 +00003866 ParamAttrs.addAttributes(index, I->Attrs);
Reid Spencer14310612006-12-31 05:40:51 +00003867 }
Reid Spencer68a24bd2005-08-27 18:50:39 +00003868 }
3869
3870 bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
3871 if (isVarArg) ParamTypeList.pop_back();
3872
Reid Spencer7b5d4662007-04-09 06:16:21 +00003873 ParamAttrsList *ActualAttrs = 0;
3874 if (!ParamAttrs.empty())
3875 ActualAttrs = new ParamAttrsList(ParamAttrs);
3876
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003877 FunctionType *FT = FunctionType::get(*yyvsp[-7].TypeVal, ParamTypeList, isVarArg,
Reid Spencer7b5d4662007-04-09 06:16:21 +00003878 ActualAttrs);
Reid Spencer68a24bd2005-08-27 18:50:39 +00003879 const PointerType *PFT = PointerType::get(FT);
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003880 delete yyvsp[-7].TypeVal;
Reid Spencer68a24bd2005-08-27 18:50:39 +00003881
3882 ValID ID;
3883 if (!FunctionName.empty()) {
Reid Spencer41dff5e2007-01-26 08:05:27 +00003884 ID = ValID::createGlobalName((char*)FunctionName.c_str());
Reid Spencer68a24bd2005-08-27 18:50:39 +00003885 } else {
Reid Spencer93c40032007-03-19 18:40:50 +00003886 ID = ValID::createGlobalID(CurModule.Values.size());
Reid Spencer68a24bd2005-08-27 18:50:39 +00003887 }
3888
3889 Function *Fn = 0;
3890 // See if this function was forward referenced. If so, recycle the object.
3891 if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
3892 // Move the function to the end of the list, from whereever it was
3893 // previously inserted.
3894 Fn = cast<Function>(FWRef);
3895 CurModule.CurrentModule->getFunctionList().remove(Fn);
3896 CurModule.CurrentModule->getFunctionList().push_back(Fn);
3897 } else if (!FunctionName.empty() && // Merge with an earlier prototype?
Reid Spenceref9b9a72007-02-05 20:47:22 +00003898 (Fn = CurModule.CurrentModule->getFunction(FunctionName))) {
3899 if (Fn->getFunctionType() != FT ) {
3900 // The existing function doesn't have the same type. This is an overload
3901 // error.
3902 GEN_ERROR("Overload of function '" + FunctionName + "' not permitted.");
3903 } else if (!CurFun.isDeclare && !Fn->isDeclaration()) {
3904 // Neither the existing or the current function is a declaration and they
3905 // have the same name and same type. Clearly this is a redefinition.
Reid Spencerb5334b02007-02-05 10:18:06 +00003906 GEN_ERROR("Redefinition of function '" + FunctionName + "'");
Reid Spenceref9b9a72007-02-05 20:47:22 +00003907 } if (Fn->isDeclaration()) {
3908 // Make sure to strip off any argument names so we can't get conflicts.
Reid Spencer68a24bd2005-08-27 18:50:39 +00003909 for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
3910 AI != AE; ++AI)
3911 AI->setName("");
Reid Spenceref9b9a72007-02-05 20:47:22 +00003912 }
Reid Spencer68a24bd2005-08-27 18:50:39 +00003913 } else { // Not already defined?
3914 Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
3915 CurModule.CurrentModule);
Anton Korobeynikov43e3aad2006-09-14 18:25:26 +00003916
Reid Spencer68a24bd2005-08-27 18:50:39 +00003917 InsertValue(Fn, CurModule.Values);
3918 }
3919
3920 CurFun.FunctionStart(Fn);
Anton Korobeynikov93c2b372006-09-17 13:06:18 +00003921
3922 if (CurFun.isDeclare) {
3923 // If we have declaration, always overwrite linkage. This will allow us to
3924 // correctly handle cases, when pointer to function is passed as argument to
3925 // another function.
3926 Fn->setLinkage(CurFun.Linkage);
Anton Korobeynikov178a3522007-01-12 19:22:51 +00003927 Fn->setVisibility(CurFun.Visibility);
Anton Korobeynikov93c2b372006-09-17 13:06:18 +00003928 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003929 Fn->setCallingConv(yyvsp[-8].UIntVal);
3930 Fn->setAlignment(yyvsp[0].UIntVal);
3931 if (yyvsp[-1].StrVal) {
3932 Fn->setSection(yyvsp[-1].StrVal);
3933 free(yyvsp[-1].StrVal);
Chris Lattnere869eef2005-11-12 00:11:49 +00003934 }
Reid Spencer68a24bd2005-08-27 18:50:39 +00003935
3936 // Add all of the arguments we parsed to the function...
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003937 if (yyvsp[-4].ArgList) { // Is null if empty...
Reid Spencer68a24bd2005-08-27 18:50:39 +00003938 if (isVarArg) { // Nuke the last entry
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003939 assert(yyvsp[-4].ArgList->back().Ty->get() == Type::VoidTy && yyvsp[-4].ArgList->back().Name == 0 &&
Reid Spencera9720f52007-02-05 17:04:00 +00003940 "Not a varargs marker!");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003941 delete yyvsp[-4].ArgList->back().Ty;
3942 yyvsp[-4].ArgList->pop_back(); // Delete the last entry
Reid Spencer68a24bd2005-08-27 18:50:39 +00003943 }
3944 Function::arg_iterator ArgIt = Fn->arg_begin();
Reid Spenceref9b9a72007-02-05 20:47:22 +00003945 Function::arg_iterator ArgEnd = Fn->arg_end();
Reid Spencer14310612006-12-31 05:40:51 +00003946 unsigned Idx = 1;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003947 for (ArgListType::iterator I = yyvsp[-4].ArgList->begin();
3948 I != yyvsp[-4].ArgList->end() && ArgIt != ArgEnd; ++I, ++ArgIt) {
Reid Spencer14310612006-12-31 05:40:51 +00003949 delete I->Ty; // Delete the typeholder...
Reid Spenceref9b9a72007-02-05 20:47:22 +00003950 setValueName(ArgIt, I->Name); // Insert arg into symtab...
Reid Spencer5b7e7532006-09-28 19:28:24 +00003951 CHECK_FOR_ERROR
Reid Spencer68a24bd2005-08-27 18:50:39 +00003952 InsertValue(ArgIt);
Reid Spencer14310612006-12-31 05:40:51 +00003953 Idx++;
Reid Spencer68a24bd2005-08-27 18:50:39 +00003954 }
Reid Spencera132e042006-12-03 05:46:11 +00003955
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003956 delete yyvsp[-4].ArgList; // We're now done with the argument list
Reid Spencer68a24bd2005-08-27 18:50:39 +00003957 }
Reid Spencer61c83e02006-08-18 08:43:06 +00003958 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003959;
3960 break;}
3961case 213:
3962#line 2247 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3963{
3964 yyval.FunctionVal = CurFun.CurrentFunction;
Reid Spencer68a24bd2005-08-27 18:50:39 +00003965
3966 // Make sure that we keep track of the linkage type even if there was a
3967 // previous "declare".
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003968 yyval.FunctionVal->setLinkage(yyvsp[-3].Linkage);
3969 yyval.FunctionVal->setVisibility(yyvsp[-2].Visibility);
3970;
3971 break;}
3972case 216:
3973#line 2258 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3974{
3975 yyval.FunctionVal = yyvsp[-1].FunctionVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00003976 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003977;
3978 break;}
3979case 217:
3980#line 2263 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3981{
3982 CurFun.CurrentFunction->setLinkage(yyvsp[-2].Linkage);
3983 CurFun.CurrentFunction->setVisibility(yyvsp[-1].Visibility);
3984 yyval.FunctionVal = CurFun.CurrentFunction;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003985 CurFun.FunctionDone();
3986 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003987 ;
3988 break;}
3989case 218:
3990#line 2275 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3991{
3992 yyval.BoolVal = false;
Reid Spencer41dff5e2007-01-26 08:05:27 +00003993 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00003994 ;
3995 break;}
3996case 219:
3997#line 2279 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
3998{
3999 yyval.BoolVal = true;
Reid Spencer61c83e02006-08-18 08:43:06 +00004000 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004001 ;
4002 break;}
4003case 220:
4004#line 2284 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4005{ // A reference to a direct constant
4006 yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004007 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004008 ;
4009 break;}
4010case 221:
4011#line 2288 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4012{
4013 yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004014 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004015 ;
4016 break;}
4017case 222:
4018#line 2292 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4019{ // Perhaps it's an FP constant?
4020 yyval.ValIDVal = ValID::create(yyvsp[0].FPVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004021 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004022 ;
4023 break;}
4024case 223:
4025#line 2296 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4026{
4027 yyval.ValIDVal = ValID::create(ConstantInt::getTrue());
Reid Spencere4d87aa2006-12-23 06:05:41 +00004028 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004029 ;
4030 break;}
4031case 224:
4032#line 2300 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4033{
4034 yyval.ValIDVal = ValID::create(ConstantInt::getFalse());
Reid Spencere4d87aa2006-12-23 06:05:41 +00004035 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004036 ;
4037 break;}
4038case 225:
4039#line 2304 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4040{
4041 yyval.ValIDVal = ValID::createNull();
Zhou Sheng6b6b6ef2007-01-11 12:24:14 +00004042 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004043 ;
4044 break;}
4045case 226:
4046#line 2308 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4047{
4048 yyval.ValIDVal = ValID::createUndef();
Zhou Sheng6b6b6ef2007-01-11 12:24:14 +00004049 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004050 ;
4051 break;}
4052case 227:
4053#line 2312 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4054{ // A vector zero constant.
4055 yyval.ValIDVal = ValID::createZeroInit();
Reid Spencer61c83e02006-08-18 08:43:06 +00004056 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004057 ;
4058 break;}
4059case 228:
4060#line 2316 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4061{ // Nonempty unsized packed vector
4062 const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType();
4063 int NumElements = yyvsp[-1].ConstVector->size();
Reid Spencer68a24bd2005-08-27 18:50:39 +00004064
Reid Spencer9d6565a2007-02-15 02:26:10 +00004065 VectorType* pt = VectorType::get(ETy, NumElements);
Reid Spencer68a24bd2005-08-27 18:50:39 +00004066 PATypeHolder* PTy = new PATypeHolder(
Reid Spencera132e042006-12-03 05:46:11 +00004067 HandleUpRefs(
Reid Spencer9d6565a2007-02-15 02:26:10 +00004068 VectorType::get(
Reid Spencera132e042006-12-03 05:46:11 +00004069 ETy,
4070 NumElements)
4071 )
4072 );
Reid Spencer68a24bd2005-08-27 18:50:39 +00004073
4074 // Verify all elements are correct type!
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004075 for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) {
4076 if (ETy != (*yyvsp[-1].ConstVector)[i]->getType())
Reid Spencer61c83e02006-08-18 08:43:06 +00004077 GEN_ERROR("Element #" + utostr(i) + " is not of type '" +
Reid Spencer68a24bd2005-08-27 18:50:39 +00004078 ETy->getDescription() +"' as required!\nIt is of type '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004079 (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'.");
Reid Spencer68a24bd2005-08-27 18:50:39 +00004080 }
4081
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004082 yyval.ValIDVal = ValID::create(ConstantVector::get(pt, *yyvsp[-1].ConstVector));
4083 delete PTy; delete yyvsp[-1].ConstVector;
Reid Spencer832254e2007-02-02 02:16:23 +00004084 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004085 ;
4086 break;}
4087case 229:
4088#line 2341 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4089{
4090 yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal);
Reid Spencer832254e2007-02-02 02:16:23 +00004091 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004092 ;
4093 break;}
4094case 230:
4095#line 2345 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4096{
4097 char *End = UnEscapeLexed(yyvsp[-2].StrVal, true);
4098 std::string AsmStr = std::string(yyvsp[-2].StrVal, End);
4099 End = UnEscapeLexed(yyvsp[0].StrVal, true);
4100 std::string Constraints = std::string(yyvsp[0].StrVal, End);
4101 yyval.ValIDVal = ValID::createInlineAsm(AsmStr, Constraints, yyvsp[-3].BoolVal);
4102 free(yyvsp[-2].StrVal);
4103 free(yyvsp[0].StrVal);
Reid Spencer832254e2007-02-02 02:16:23 +00004104 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004105 ;
4106 break;}
4107case 231:
4108#line 2359 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4109{ // Is it an integer reference...?
4110 yyval.ValIDVal = ValID::createLocalID(yyvsp[0].UIntVal);
Reid Spencer832254e2007-02-02 02:16:23 +00004111 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004112 ;
4113 break;}
4114case 232:
4115#line 2363 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4116{
4117 yyval.ValIDVal = ValID::createGlobalID(yyvsp[0].UIntVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004118 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004119 ;
4120 break;}
4121case 233:
4122#line 2367 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4123{ // Is it a named reference...?
4124 yyval.ValIDVal = ValID::createLocalName(yyvsp[0].StrVal);
Reid Spencer832254e2007-02-02 02:16:23 +00004125 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004126 ;
4127 break;}
4128case 234:
4129#line 2371 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4130{ // Is it a named reference...?
4131 yyval.ValIDVal = ValID::createGlobalName(yyvsp[0].StrVal);
Reid Spencer832254e2007-02-02 02:16:23 +00004132 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004133 ;
4134 break;}
4135case 237:
4136#line 2383 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4137{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004138 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004139 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
4140 yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal);
4141 delete yyvsp[-1].TypeVal;
Reid Spencer832254e2007-02-02 02:16:23 +00004142 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004143 ;
4144 break;}
4145case 238:
4146#line 2392 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4147{
4148 yyval.FunctionVal = yyvsp[-1].FunctionVal;
Reid Spencer832254e2007-02-02 02:16:23 +00004149 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004150 ;
4151 break;}
4152case 239:
4153#line 2396 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4154{ // Do not allow functions with 0 basic blocks
4155 yyval.FunctionVal = yyvsp[-1].FunctionVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004156 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004157 ;
4158 break;}
4159case 240:
4160#line 2405 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4161{
4162 setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004163 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004164 InsertValue(yyvsp[0].TermInstVal);
4165 yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal);
4166 yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal;
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004167 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004168 ;
4169 break;}
4170case 241:
4171#line 2414 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4172{
4173 if (CastInst *CI1 = dyn_cast<CastInst>(yyvsp[0].InstVal))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004174 if (CastInst *CI2 = dyn_cast<CastInst>(CI1->getOperand(0)))
4175 if (CI2->getParent() == 0)
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004176 yyvsp[-1].BasicBlockVal->getInstList().push_back(CI2);
4177 yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal);
4178 yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal;
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004179 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004180 ;
4181 break;}
4182case 242:
4183#line 2423 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4184{ // Empty space between instruction lists
4185 yyval.BasicBlockVal = defineBBVal(ValID::createLocalID(CurFun.NextValNum));
4186 CHECK_FOR_ERROR
4187 ;
4188 break;}
4189case 243:
4190#line 2427 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4191{ // Labelled (named) basic block
4192 yyval.BasicBlockVal = defineBBVal(ValID::createLocalName(yyvsp[0].StrVal));
4193 CHECK_FOR_ERROR
4194 ;
4195 break;}
4196case 244:
4197#line 2432 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4198{ // Return with a result...
4199 yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal);
4200 CHECK_FOR_ERROR
4201 ;
4202 break;}
4203case 245:
4204#line 2436 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4205{ // Return with no result...
4206 yyval.TermInstVal = new ReturnInst();
4207 CHECK_FOR_ERROR
4208 ;
4209 break;}
4210case 246:
4211#line 2440 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4212{ // Unconditional Branch...
4213 BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
4214 CHECK_FOR_ERROR
4215 yyval.TermInstVal = new BranchInst(tmpBB);
4216 ;
4217 break;}
4218case 247:
4219#line 2445 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4220{
4221 assert(cast<IntegerType>(yyvsp[-7].PrimType)->getBitWidth() == 1 && "Not Bool?");
4222 BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal);
4223 CHECK_FOR_ERROR
4224 BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal);
4225 CHECK_FOR_ERROR
4226 Value* tmpVal = getVal(Type::Int1Ty, yyvsp[-6].ValIDVal);
4227 CHECK_FOR_ERROR
4228 yyval.TermInstVal = new BranchInst(tmpBBA, tmpBBB, tmpVal);
4229 ;
4230 break;}
4231case 248:
4232#line 2455 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4233{
4234 Value* tmpVal = getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal);
4235 CHECK_FOR_ERROR
4236 BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal);
4237 CHECK_FOR_ERROR
4238 SwitchInst *S = new SwitchInst(tmpVal, tmpBB, yyvsp[-1].JumpTable->size());
4239 yyval.TermInstVal = S;
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004240
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004241 std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = yyvsp[-1].JumpTable->begin(),
4242 E = yyvsp[-1].JumpTable->end();
Reid Spencer68a24bd2005-08-27 18:50:39 +00004243 for (; I != E; ++I) {
4244 if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
4245 S->addCase(CI, I->second);
4246 else
Reid Spencerb5334b02007-02-05 10:18:06 +00004247 GEN_ERROR("Switch case is constant, but not a simple integer");
Reid Spencer68a24bd2005-08-27 18:50:39 +00004248 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004249 delete yyvsp[-1].JumpTable;
Reid Spencer61c83e02006-08-18 08:43:06 +00004250 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004251 ;
4252 break;}
4253case 249:
4254#line 2474 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4255{
4256 Value* tmpVal = getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004257 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004258 BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004259 CHECK_FOR_ERROR
4260 SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004261 yyval.TermInstVal = S;
Reid Spencer61c83e02006-08-18 08:43:06 +00004262 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004263 ;
4264 break;}
4265case 250:
4266#line 2484 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4267{
Reid Spencer3822ff52006-11-08 06:47:33 +00004268
Reid Spencer14310612006-12-31 05:40:51 +00004269 // Handle the short syntax
4270 const PointerType *PFTy = 0;
4271 const FunctionType *Ty = 0;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004272 if (!(PFTy = dyn_cast<PointerType>(yyvsp[-11].TypeVal->get())) ||
Reid Spencer68a24bd2005-08-27 18:50:39 +00004273 !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
4274 // Pull out the types of all of the arguments...
4275 std::vector<const Type*> ParamTypes;
Reid Spencer7b5d4662007-04-09 06:16:21 +00004276 ParamAttrsList ParamAttrs;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004277 if (yyvsp[-6].ParamAttrs != ParamAttr::None)
4278 ParamAttrs.addAttributes(0, yyvsp[-6].ParamAttrs);
4279 ValueRefList::iterator I = yyvsp[-8].ValueRefList->begin(), E = yyvsp[-8].ValueRefList->end();
Reid Spencer7b5d4662007-04-09 06:16:21 +00004280 unsigned index = 1;
4281 for (; I != E; ++I, ++index) {
Reid Spencer14310612006-12-31 05:40:51 +00004282 const Type *Ty = I->Val->getType();
4283 if (Ty == Type::VoidTy)
4284 GEN_ERROR("Short call syntax cannot be used with varargs");
4285 ParamTypes.push_back(Ty);
Reid Spencer18da0722007-04-11 02:44:20 +00004286 if (I->Attrs != ParamAttr::None)
Reid Spencer7b5d4662007-04-09 06:16:21 +00004287 ParamAttrs.addAttributes(index, I->Attrs);
Reid Spencer68a24bd2005-08-27 18:50:39 +00004288 }
4289
Reid Spencer7b5d4662007-04-09 06:16:21 +00004290 ParamAttrsList *Attrs = 0;
4291 if (!ParamAttrs.empty())
4292 Attrs = new ParamAttrsList(ParamAttrs);
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004293 Ty = FunctionType::get(yyvsp[-11].TypeVal->get(), ParamTypes, false, Attrs);
Reid Spencer68a24bd2005-08-27 18:50:39 +00004294 PFTy = PointerType::get(Ty);
4295 }
4296
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004297 delete yyvsp[-11].TypeVal;
Reid Spencer66728ef2007-03-20 01:13:36 +00004298
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004299 Value *V = getVal(PFTy, yyvsp[-10].ValIDVal); // Get the function we're calling...
Andrew Lenharth6353e052006-12-08 18:07:09 +00004300 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004301 BasicBlock *Normal = getBBVal(yyvsp[-3].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004302 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004303 BasicBlock *Except = getBBVal(yyvsp[0].ValIDVal);
Reid Spencer5b7e7532006-09-28 19:28:24 +00004304 CHECK_FOR_ERROR
Reid Spencer68a24bd2005-08-27 18:50:39 +00004305
Reid Spencer14310612006-12-31 05:40:51 +00004306 // Check the arguments
4307 ValueList Args;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004308 if (yyvsp[-8].ValueRefList->empty()) { // Has no arguments?
Reid Spencer14310612006-12-31 05:40:51 +00004309 // Make sure no arguments is a good thing!
4310 if (Ty->getNumParams() != 0)
4311 GEN_ERROR("No arguments passed to a function that "
Reid Spencerb5334b02007-02-05 10:18:06 +00004312 "expects arguments");
Reid Spencer68a24bd2005-08-27 18:50:39 +00004313 } else { // Has arguments?
4314 // Loop through FunctionType's arguments and ensure they are specified
4315 // correctly!
Reid Spencer68a24bd2005-08-27 18:50:39 +00004316 FunctionType::param_iterator I = Ty->param_begin();
4317 FunctionType::param_iterator E = Ty->param_end();
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004318 ValueRefList::iterator ArgI = yyvsp[-8].ValueRefList->begin(), ArgE = yyvsp[-8].ValueRefList->end();
Reid Spencer68a24bd2005-08-27 18:50:39 +00004319
Reid Spencer14310612006-12-31 05:40:51 +00004320 for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
4321 if (ArgI->Val->getType() != *I)
4322 GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
Reid Spencerb5334b02007-02-05 10:18:06 +00004323 (*I)->getDescription() + "'");
Reid Spencer14310612006-12-31 05:40:51 +00004324 Args.push_back(ArgI->Val);
4325 }
Reid Spencer68a24bd2005-08-27 18:50:39 +00004326
Reid Spencer14310612006-12-31 05:40:51 +00004327 if (Ty->isVarArg()) {
4328 if (I == E)
4329 for (; ArgI != ArgE; ++ArgI)
4330 Args.push_back(ArgI->Val); // push the remaining varargs
4331 } else if (I != E || ArgI != ArgE)
Reid Spencerb5334b02007-02-05 10:18:06 +00004332 GEN_ERROR("Invalid number of parameters detected");
Reid Spencer68a24bd2005-08-27 18:50:39 +00004333 }
Reid Spencer14310612006-12-31 05:40:51 +00004334
4335 // Create the InvokeInst
Chris Lattner9d2fda62007-02-13 05:53:56 +00004336 InvokeInst *II = new InvokeInst(V, Normal, Except, &Args[0], Args.size());
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004337 II->setCallingConv(yyvsp[-12].UIntVal);
4338 yyval.TermInstVal = II;
4339 delete yyvsp[-8].ValueRefList;
Andrew Lenharth6353e052006-12-08 18:07:09 +00004340 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004341 ;
4342 break;}
4343case 251:
4344#line 2559 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4345{
4346 yyval.TermInstVal = new UnwindInst();
Andrew Lenharth6353e052006-12-08 18:07:09 +00004347 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004348 ;
4349 break;}
4350case 252:
4351#line 2563 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4352{
4353 yyval.TermInstVal = new UnreachableInst();
Andrew Lenharth6353e052006-12-08 18:07:09 +00004354 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004355 ;
4356 break;}
4357case 253:
4358#line 2570 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4359{
4360 yyval.JumpTable = yyvsp[-5].JumpTable;
4361 Constant *V = cast<Constant>(getExistingVal(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
Andrew Lenharth6353e052006-12-08 18:07:09 +00004362 CHECK_FOR_ERROR
4363 if (V == 0)
Reid Spencerb5334b02007-02-05 10:18:06 +00004364 GEN_ERROR("May only switch on a constant pool value");
Andrew Lenharth6353e052006-12-08 18:07:09 +00004365
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004366 BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004367 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004368 yyval.JumpTable->push_back(std::make_pair(V, tmpBB));
4369 ;
4370 break;}
4371case 254:
4372#line 2581 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4373{
4374 yyval.JumpTable = new std::vector<std::pair<Constant*, BasicBlock*> >();
4375 Constant *V = cast<Constant>(getExistingVal(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
Andrew Lenharth6353e052006-12-08 18:07:09 +00004376 CHECK_FOR_ERROR
4377
4378 if (V == 0)
Reid Spencerb5334b02007-02-05 10:18:06 +00004379 GEN_ERROR("May only switch on a constant pool value");
Andrew Lenharth6353e052006-12-08 18:07:09 +00004380
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004381 BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004382 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004383 yyval.JumpTable->push_back(std::make_pair(V, tmpBB));
4384 ;
4385 break;}
4386case 255:
4387#line 2594 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4388{
Reid Spenceref9b9a72007-02-05 20:47:22 +00004389 // Is this definition named?? if so, assign the name...
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004390 setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal);
Reid Spenceref9b9a72007-02-05 20:47:22 +00004391 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004392 InsertValue(yyvsp[0].InstVal);
4393 yyval.InstVal = yyvsp[0].InstVal;
Reid Spenceref9b9a72007-02-05 20:47:22 +00004394 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004395 ;
4396 break;}
4397case 256:
4398#line 2604 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4399{ // Used for PHI nodes
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004400 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004401 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-5].TypeVal)->getDescription());
4402 yyval.PHIList = new std::list<std::pair<Value*, BasicBlock*> >();
4403 Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004404 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004405 BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004406 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004407 yyval.PHIList->push_back(std::make_pair(tmpVal, tmpBB));
4408 delete yyvsp[-5].TypeVal;
4409 ;
4410 break;}
4411case 257:
4412#line 2615 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4413{
4414 yyval.PHIList = yyvsp[-6].PHIList;
4415 Value* tmpVal = getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal);
Reid Spencer6f407902007-01-13 05:00:46 +00004416 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004417 BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004418 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004419 yyvsp[-6].PHIList->push_back(std::make_pair(tmpVal, tmpBB));
4420 ;
4421 break;}
4422case 258:
4423#line 2625 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4424{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004425 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004426 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004427 // Used for call and invoke instructions
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004428 yyval.ValueRefList = new ValueRefList();
4429 ValueRefListEntry E; E.Attrs = yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-2].TypeVal->get(), yyvsp[-1].ValIDVal);
4430 yyval.ValueRefList->push_back(E);
4431 delete yyvsp[-2].TypeVal;
4432 ;
4433 break;}
4434case 259:
4435#line 2634 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4436{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004437 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004438 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
4439 yyval.ValueRefList = yyvsp[-4].ValueRefList;
4440 ValueRefListEntry E; E.Attrs = yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-2].TypeVal->get(), yyvsp[-1].ValIDVal);
4441 yyval.ValueRefList->push_back(E);
4442 delete yyvsp[-2].TypeVal;
Reid Spencer14310612006-12-31 05:40:51 +00004443 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004444 ;
4445 break;}
4446case 260:
4447#line 2643 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4448{ yyval.ValueRefList = new ValueRefList(); ;
4449 break;}
4450case 261:
4451#line 2646 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4452{ yyval.ValueList = new std::vector<Value*>(); ;
4453 break;}
4454case 262:
4455#line 2647 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4456{
4457 yyval.ValueList = yyvsp[-2].ValueList;
4458 yyval.ValueList->push_back(yyvsp[0].ValueVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004459 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004460 ;
4461 break;}
4462case 263:
4463#line 2654 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4464{
4465 yyval.BoolVal = true;
Reid Spencere4d87aa2006-12-23 06:05:41 +00004466 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004467 ;
4468 break;}
4469case 264:
4470#line 2658 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4471{
4472 yyval.BoolVal = false;
Reid Spencere4d87aa2006-12-23 06:05:41 +00004473 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004474 ;
4475 break;}
4476case 265:
4477#line 2663 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4478{
Reid Spencer14310612006-12-31 05:40:51 +00004479 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004480 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
4481 if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() &&
4482 !isa<VectorType>((*yyvsp[-3].TypeVal).get()))
Reid Spencere4d87aa2006-12-23 06:05:41 +00004483 GEN_ERROR(
Reid Spencerb5334b02007-02-05 10:18:06 +00004484 "Arithmetic operator requires integer, FP, or packed operands");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004485 if (isa<VectorType>((*yyvsp[-3].TypeVal).get()) &&
4486 (yyvsp[-4].BinaryOpVal == Instruction::URem ||
4487 yyvsp[-4].BinaryOpVal == Instruction::SRem ||
4488 yyvsp[-4].BinaryOpVal == Instruction::FRem))
Chris Lattner32980692007-02-19 07:44:24 +00004489 GEN_ERROR("Remainder not supported on vector types");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004490 Value* val1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004491 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004492 Value* val2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004493 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004494 yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, val1, val2);
4495 if (yyval.InstVal == 0)
Reid Spencerb5334b02007-02-05 10:18:06 +00004496 GEN_ERROR("binary operator returned null");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004497 delete yyvsp[-3].TypeVal;
4498 ;
4499 break;}
4500case 266:
4501#line 2684 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4502{
Reid Spencer14310612006-12-31 05:40:51 +00004503 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004504 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
4505 if (!(*yyvsp[-3].TypeVal)->isInteger()) {
4506 if (Instruction::isShift(yyvsp[-4].BinaryOpVal) || !isa<VectorType>(yyvsp[-3].TypeVal->get()) ||
4507 !cast<VectorType>(yyvsp[-3].TypeVal->get())->getElementType()->isInteger())
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004508 GEN_ERROR("Logical operator requires integral operands");
4509 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004510 Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004511 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004512 Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004513 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004514 yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2);
4515 if (yyval.InstVal == 0)
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004516 GEN_ERROR("binary operator returned null");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004517 delete yyvsp[-3].TypeVal;
4518 ;
4519 break;}
4520case 267:
4521#line 2701 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4522{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004523 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004524 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
4525 if (isa<VectorType>((*yyvsp[-3].TypeVal).get()))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004526 GEN_ERROR("Vector types not supported by icmp instruction");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004527 Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004528 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004529 Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004530 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004531 yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].IPredicate, tmpVal1, tmpVal2);
4532 if (yyval.InstVal == 0)
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004533 GEN_ERROR("icmp operator returned null");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004534 delete yyvsp[-3].TypeVal;
4535 ;
4536 break;}
4537case 268:
4538#line 2715 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4539{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004540 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004541 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription());
4542 if (isa<VectorType>((*yyvsp[-3].TypeVal).get()))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004543 GEN_ERROR("Vector types not supported by fcmp instruction");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004544 Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004545 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004546 Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004547 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004548 yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].FPredicate, tmpVal1, tmpVal2);
4549 if (yyval.InstVal == 0)
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004550 GEN_ERROR("fcmp operator returned null");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004551 delete yyvsp[-3].TypeVal;
4552 ;
4553 break;}
4554case 269:
4555#line 2729 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4556{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004557 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004558 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
4559 Value* Val = yyvsp[-2].ValueVal;
4560 const Type* DestTy = yyvsp[0].TypeVal->get();
4561 if (!CastInst::castIsValid(yyvsp[-3].CastOpVal, Val, DestTy))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004562 GEN_ERROR("invalid cast opcode for cast from '" +
4563 Val->getType()->getDescription() + "' to '" +
4564 DestTy->getDescription() + "'");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004565 yyval.InstVal = CastInst::create(yyvsp[-3].CastOpVal, Val, DestTy);
4566 delete yyvsp[0].TypeVal;
4567 ;
4568 break;}
4569case 270:
4570#line 2741 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4571{
4572 if (yyvsp[-4].ValueVal->getType() != Type::Int1Ty)
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004573 GEN_ERROR("select condition must be boolean");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004574 if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType())
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004575 GEN_ERROR("select value types should match");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004576 yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004577 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004578 ;
4579 break;}
4580case 271:
4581#line 2749 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4582{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004583 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004584 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription());
4585 yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal);
4586 delete yyvsp[0].TypeVal;
Andrew Lenharth6353e052006-12-08 18:07:09 +00004587 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004588 ;
4589 break;}
4590case 272:
4591#line 2756 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4592{
4593 if (!ExtractElementInst::isValidOperands(yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004594 GEN_ERROR("Invalid extractelement operands");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004595 yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
Reid Spencer61c83e02006-08-18 08:43:06 +00004596 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004597 ;
4598 break;}
4599case 273:
4600#line 2762 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4601{
4602 if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004603 GEN_ERROR("Invalid insertelement operands");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004604 yyval.InstVal = new InsertElementInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004605 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004606 ;
4607 break;}
4608case 274:
4609#line 2768 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4610{
4611 if (!ShuffleVectorInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004612 GEN_ERROR("Invalid shufflevector operands");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004613 yyval.InstVal = new ShuffleVectorInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004614 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004615 ;
4616 break;}
4617case 275:
4618#line 2774 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4619{
4620 const Type *Ty = yyvsp[0].PHIList->front().first->getType();
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004621 if (!Ty->isFirstClassType())
4622 GEN_ERROR("PHI node operands must be of first class type");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004623 yyval.InstVal = new PHINode(Ty);
4624 ((PHINode*)yyval.InstVal)->reserveOperandSpace(yyvsp[0].PHIList->size());
4625 while (yyvsp[0].PHIList->begin() != yyvsp[0].PHIList->end()) {
4626 if (yyvsp[0].PHIList->front().first->getType() != Ty)
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004627 GEN_ERROR("All elements of a PHI node must be of the same type");
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004628 cast<PHINode>(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second);
4629 yyvsp[0].PHIList->pop_front();
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004630 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004631 delete yyvsp[0].PHIList; // Free the list...
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004632 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004633 ;
4634 break;}
4635case 276:
4636#line 2790 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4637{
Reid Spencer14310612006-12-31 05:40:51 +00004638
4639 // Handle the short syntax
Andrew Lenharth6353e052006-12-08 18:07:09 +00004640 const PointerType *PFTy = 0;
4641 const FunctionType *Ty = 0;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004642 if (!(PFTy = dyn_cast<PointerType>(yyvsp[-5].TypeVal->get())) ||
Andrew Lenharth6353e052006-12-08 18:07:09 +00004643 !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
4644 // Pull out the types of all of the arguments...
4645 std::vector<const Type*> ParamTypes;
Reid Spencer7b5d4662007-04-09 06:16:21 +00004646 ParamAttrsList ParamAttrs;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004647 if (yyvsp[0].ParamAttrs != ParamAttr::None)
4648 ParamAttrs.addAttributes(0, yyvsp[0].ParamAttrs);
Reid Spencer7b5d4662007-04-09 06:16:21 +00004649 unsigned index = 1;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004650 ValueRefList::iterator I = yyvsp[-2].ValueRefList->begin(), E = yyvsp[-2].ValueRefList->end();
Reid Spencer7b5d4662007-04-09 06:16:21 +00004651 for (; I != E; ++I, ++index) {
Reid Spencer14310612006-12-31 05:40:51 +00004652 const Type *Ty = I->Val->getType();
4653 if (Ty == Type::VoidTy)
4654 GEN_ERROR("Short call syntax cannot be used with varargs");
4655 ParamTypes.push_back(Ty);
Reid Spencer18da0722007-04-11 02:44:20 +00004656 if (I->Attrs != ParamAttr::None)
Reid Spencer7b5d4662007-04-09 06:16:21 +00004657 ParamAttrs.addAttributes(index, I->Attrs);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004658 }
4659
Reid Spencer7b5d4662007-04-09 06:16:21 +00004660 ParamAttrsList *Attrs = 0;
4661 if (!ParamAttrs.empty())
4662 Attrs = new ParamAttrsList(ParamAttrs);
4663
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004664 Ty = FunctionType::get(yyvsp[-5].TypeVal->get(), ParamTypes, false, Attrs);
Andrew Lenharth6353e052006-12-08 18:07:09 +00004665 PFTy = PointerType::get(Ty);
4666 }
4667
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004668 Value *V = getVal(PFTy, yyvsp[-4].ValIDVal); // Get the function we're calling...
Andrew Lenharth6353e052006-12-08 18:07:09 +00004669 CHECK_FOR_ERROR
4670
Reid Spencer7780acb2007-04-16 06:56:07 +00004671 // Check for call to invalid intrinsic to avoid crashing later.
4672 if (Function *theF = dyn_cast<Function>(V)) {
Reid Spencered48de22007-04-16 22:02:23 +00004673 if (theF->hasName() && (theF->getValueName()->getKeyLength() >= 5) &&
Reid Spencer36fdde12007-04-16 20:35:38 +00004674 (0 == strncmp(theF->getValueName()->getKeyData(), "llvm.", 5)) &&
4675 !theF->getIntrinsicID(true))
Reid Spencer7780acb2007-04-16 06:56:07 +00004676 GEN_ERROR("Call to invalid LLVM intrinsic function '" +
4677 theF->getName() + "'");
4678 }
4679
Reid Spencer14310612006-12-31 05:40:51 +00004680 // Check the arguments
4681 ValueList Args;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004682 if (yyvsp[-2].ValueRefList->empty()) { // Has no arguments?
Andrew Lenharth6353e052006-12-08 18:07:09 +00004683 // Make sure no arguments is a good thing!
4684 if (Ty->getNumParams() != 0)
4685 GEN_ERROR("No arguments passed to a function that "
Reid Spencerb5334b02007-02-05 10:18:06 +00004686 "expects arguments");
Andrew Lenharth6353e052006-12-08 18:07:09 +00004687 } else { // Has arguments?
4688 // Loop through FunctionType's arguments and ensure they are specified
4689 // correctly!
4690 //
4691 FunctionType::param_iterator I = Ty->param_begin();
4692 FunctionType::param_iterator E = Ty->param_end();
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004693 ValueRefList::iterator ArgI = yyvsp[-2].ValueRefList->begin(), ArgE = yyvsp[-2].ValueRefList->end();
Andrew Lenharth6353e052006-12-08 18:07:09 +00004694
Reid Spencer14310612006-12-31 05:40:51 +00004695 for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
4696 if (ArgI->Val->getType() != *I)
4697 GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
Reid Spencerb5334b02007-02-05 10:18:06 +00004698 (*I)->getDescription() + "'");
Reid Spencer14310612006-12-31 05:40:51 +00004699 Args.push_back(ArgI->Val);
4700 }
4701 if (Ty->isVarArg()) {
4702 if (I == E)
4703 for (; ArgI != ArgE; ++ArgI)
4704 Args.push_back(ArgI->Val); // push the remaining varargs
4705 } else if (I != E || ArgI != ArgE)
Reid Spencerb5334b02007-02-05 10:18:06 +00004706 GEN_ERROR("Invalid number of parameters detected");
Andrew Lenharth6353e052006-12-08 18:07:09 +00004707 }
Reid Spencer14310612006-12-31 05:40:51 +00004708 // Create the call node
Chris Lattner9d2fda62007-02-13 05:53:56 +00004709 CallInst *CI = new CallInst(V, &Args[0], Args.size());
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004710 CI->setTailCall(yyvsp[-7].BoolVal);
4711 CI->setCallingConv(yyvsp[-6].UIntVal);
4712 yyval.InstVal = CI;
4713 delete yyvsp[-2].ValueRefList;
4714 delete yyvsp[-5].TypeVal;
Reid Spencere4d87aa2006-12-23 06:05:41 +00004715 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004716 ;
4717 break;}
4718case 277:
4719#line 2870 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4720{
4721 yyval.InstVal = yyvsp[0].InstVal;
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004722 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004723 ;
4724 break;}
4725case 278:
4726#line 2875 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4727{
4728 yyval.BoolVal = true;
Reid Spencere4d87aa2006-12-23 06:05:41 +00004729 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004730 ;
4731 break;}
4732case 279:
4733#line 2879 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4734{
4735 yyval.BoolVal = false;
Reid Spencere4d87aa2006-12-23 06:05:41 +00004736 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004737 ;
4738 break;}
4739case 280:
4740#line 2886 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4741{
Reid Spencer14310612006-12-31 05:40:51 +00004742 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004743 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
4744 yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal);
4745 delete yyvsp[-1].TypeVal;
Reid Spencer61c83e02006-08-18 08:43:06 +00004746 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004747 ;
4748 break;}
4749case 281:
4750#line 2893 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4751{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004752 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004753 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
4754 Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal);
Reid Spencer61c83e02006-08-18 08:43:06 +00004755 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004756 yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal);
4757 delete yyvsp[-4].TypeVal;
4758 ;
4759 break;}
4760case 282:
4761#line 2901 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4762{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004763 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004764 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription());
4765 yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal);
4766 delete yyvsp[-1].TypeVal;
Reid Spencer61c83e02006-08-18 08:43:06 +00004767 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004768 ;
4769 break;}
4770case 283:
4771#line 2908 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4772{
Reid Spencer14310612006-12-31 05:40:51 +00004773 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004774 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription());
4775 Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal);
Reid Spencer61c83e02006-08-18 08:43:06 +00004776 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004777 yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal);
4778 delete yyvsp[-4].TypeVal;
4779 ;
4780 break;}
4781case 284:
4782#line 2916 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4783{
4784 if (!isa<PointerType>(yyvsp[0].ValueVal->getType()))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004785 GEN_ERROR("Trying to free nonpointer type " +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004786 yyvsp[0].ValueVal->getType()->getDescription() + "");
4787 yyval.InstVal = new FreeInst(yyvsp[0].ValueVal);
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004788 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004789 ;
4790 break;}
4791case 285:
4792#line 2924 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4793{
Anton Korobeynikov9adeaa22007-01-28 13:37:39 +00004794 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004795 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
4796 if (!isa<PointerType>(yyvsp[-2].TypeVal->get()))
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004797 GEN_ERROR("Can't load from nonpointer type: " +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004798 (*yyvsp[-2].TypeVal)->getDescription());
4799 if (!cast<PointerType>(yyvsp[-2].TypeVal->get())->getElementType()->isFirstClassType())
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004800 GEN_ERROR("Can't load from pointer of non-first-class type: " +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004801 (*yyvsp[-2].TypeVal)->getDescription());
4802 Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004803 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004804 yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-4].BoolVal, yyvsp[0].UIntVal);
4805 delete yyvsp[-2].TypeVal;
4806 ;
4807 break;}
4808case 286:
4809#line 2938 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4810{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004811 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004812 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
4813 const PointerType *PT = dyn_cast<PointerType>(yyvsp[-2].TypeVal->get());
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004814 if (!PT)
4815 GEN_ERROR("Can't store to a nonpointer type: " +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004816 (*yyvsp[-2].TypeVal)->getDescription());
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004817 const Type *ElTy = PT->getElementType();
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004818 if (ElTy != yyvsp[-4].ValueVal->getType())
4819 GEN_ERROR("Can't store '" + yyvsp[-4].ValueVal->getType()->getDescription() +
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004820 "' into space of type '" + ElTy->getDescription() + "'");
4821
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004822 Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004823 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004824 yyval.InstVal = new StoreInst(yyvsp[-4].ValueVal, tmpVal, yyvsp[-6].BoolVal, yyvsp[0].UIntVal);
4825 delete yyvsp[-2].TypeVal;
4826 ;
4827 break;}
4828case 287:
4829#line 2955 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
4830{
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004831 if (!UpRefs.empty())
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004832 GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription());
4833 if (!isa<PointerType>(yyvsp[-2].TypeVal->get()))
Reid Spencerb5334b02007-02-05 10:18:06 +00004834 GEN_ERROR("getelementptr insn requires pointer operand");
Reid Spencer68a24bd2005-08-27 18:50:39 +00004835
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004836 if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, &(*yyvsp[0].ValueList)[0], yyvsp[0].ValueList->size(), true))
Reid Spencer61c83e02006-08-18 08:43:06 +00004837 GEN_ERROR("Invalid getelementptr indices for type '" +
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004838 (*yyvsp[-2].TypeVal)->getDescription()+ "'");
4839 Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal);
Reid Spencer61c83e02006-08-18 08:43:06 +00004840 CHECK_FOR_ERROR
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004841 yyval.InstVal = new GetElementPtrInst(tmpVal, &(*yyvsp[0].ValueList)[0], yyvsp[0].ValueList->size());
4842 delete yyvsp[-2].TypeVal;
4843 delete yyvsp[0].ValueList;
4844 ;
4845 break;}
4846}
4847 /* the action file gets copied in in place of this dollarsign */
4848#line 543 "/usr/share/bison.simple"
Reid Spencer7780acb2007-04-16 06:56:07 +00004849
4850 yyvsp -= yylen;
4851 yyssp -= yylen;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004852#ifdef YYLSP_NEEDED
4853 yylsp -= yylen;
4854#endif
Reid Spencer7780acb2007-04-16 06:56:07 +00004855
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004856#if YYDEBUG != 0
4857 if (yydebug)
4858 {
4859 short *ssp1 = yyss - 1;
4860 fprintf (stderr, "state stack now");
4861 while (ssp1 != yyssp)
4862 fprintf (stderr, " %d", *++ssp1);
4863 fprintf (stderr, "\n");
4864 }
4865#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00004866
4867 *++yyvsp = yyval;
4868
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004869#ifdef YYLSP_NEEDED
4870 yylsp++;
4871 if (yylen == 0)
4872 {
4873 yylsp->first_line = yylloc.first_line;
4874 yylsp->first_column = yylloc.first_column;
4875 yylsp->last_line = (yylsp-1)->last_line;
4876 yylsp->last_column = (yylsp-1)->last_column;
4877 yylsp->text = 0;
4878 }
4879 else
4880 {
4881 yylsp->last_line = (yylsp+yylen-1)->last_line;
4882 yylsp->last_column = (yylsp+yylen-1)->last_column;
4883 }
4884#endif
Reid Spencer68a24bd2005-08-27 18:50:39 +00004885
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004886 /* Now "shift" the result of the reduction.
4887 Determine what state that goes to,
4888 based on the state we popped back to
4889 and the rule number reduced by. */
Reid Spencer68a24bd2005-08-27 18:50:39 +00004890
4891 yyn = yyr1[yyn];
4892
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004893 yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
4894 if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
Reid Spencer68a24bd2005-08-27 18:50:39 +00004895 yystate = yytable[yystate];
4896 else
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004897 yystate = yydefgoto[yyn - YYNTBASE];
Reid Spencer68a24bd2005-08-27 18:50:39 +00004898
4899 goto yynewstate;
4900
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004901yyerrlab: /* here on detecting error */
Reid Spencer68a24bd2005-08-27 18:50:39 +00004902
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004903 if (! yyerrstatus)
4904 /* If not already recovering from an error, report this error. */
Reid Spencer68a24bd2005-08-27 18:50:39 +00004905 {
4906 ++yynerrs;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004907
4908#ifdef YYERROR_VERBOSE
Reid Spencer7780acb2007-04-16 06:56:07 +00004909 yyn = yypact[yystate];
Lauro Ramos Venancioc7635522007-04-12 18:32:50 +00004910
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004911 if (yyn > YYFLAG && yyn < YYLAST)
Reid Spencer7780acb2007-04-16 06:56:07 +00004912 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004913 int size = 0;
4914 char *msg;
4915 int x, count;
Reid Spencer7780acb2007-04-16 06:56:07 +00004916
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004917 count = 0;
4918 /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
4919 for (x = (yyn < 0 ? -yyn : 0);
4920 x < (sizeof(yytname) / sizeof(char *)); x++)
4921 if (yycheck[x + yyn] == x)
4922 size += strlen(yytname[x]) + 15, count++;
4923 msg = (char *) malloc(size + 15);
4924 if (msg != 0)
Reid Spencer7780acb2007-04-16 06:56:07 +00004925 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004926 strcpy(msg, "parse error");
4927
4928 if (count < 5)
Reid Spencer7780acb2007-04-16 06:56:07 +00004929 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004930 count = 0;
4931 for (x = (yyn < 0 ? -yyn : 0);
4932 x < (sizeof(yytname) / sizeof(char *)); x++)
4933 if (yycheck[x + yyn] == x)
4934 {
4935 strcat(msg, count == 0 ? ", expecting `" : " or `");
4936 strcat(msg, yytname[x]);
4937 strcat(msg, "'");
4938 count++;
4939 }
Reid Spencer7780acb2007-04-16 06:56:07 +00004940 }
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004941 yyerror(msg);
4942 free(msg);
Reid Spencer7780acb2007-04-16 06:56:07 +00004943 }
4944 else
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004945 yyerror ("parse error; also virtual memory exceeded");
Reid Spencer7780acb2007-04-16 06:56:07 +00004946 }
4947 else
4948#endif /* YYERROR_VERBOSE */
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004949 yyerror("parse error");
Reid Spencer68a24bd2005-08-27 18:50:39 +00004950 }
Reid Spencer41dff5e2007-01-26 08:05:27 +00004951
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004952 goto yyerrlab1;
4953yyerrlab1: /* here on error raised explicitly by an action */
Reid Spencer41dff5e2007-01-26 08:05:27 +00004954
4955 if (yyerrstatus == 3)
4956 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004957 /* if just tried and failed to reuse lookahead token after an error, discard it. */
Reid Spencer41dff5e2007-01-26 08:05:27 +00004958
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004959 /* return failure if at end of input */
4960 if (yychar == YYEOF)
Reid Spencer68a24bd2005-08-27 18:50:39 +00004961 YYABORT;
4962
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004963#if YYDEBUG != 0
4964 if (yydebug)
4965 fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
4966#endif
Reid Spencere4d87aa2006-12-23 06:05:41 +00004967
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004968 yychar = YYEMPTY;
Reid Spencer68a24bd2005-08-27 18:50:39 +00004969 }
4970
Christopher Lamb2330e4d2007-04-21 08:16:25 +00004971 /* Else will try to reuse lookahead token
4972 after shifting the error token. */
4973
4974 yyerrstatus = 3; /* Each real token shifted decrements this */
4975
4976 goto yyerrhandle;
4977
4978yyerrdefault: /* current state does not do anything special for the error token. */
4979
4980#if 0
4981 /* This is wrong; only states that explicitly want error tokens
4982 should shift them. */
4983 yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
4984 if (yyn) goto yydefault;
4985#endif
4986
4987yyerrpop: /* pop the current state because it cannot handle the error token */
4988
4989 if (yyssp == yyss) YYABORT;
4990 yyvsp--;
4991 yystate = *--yyssp;
4992#ifdef YYLSP_NEEDED
4993 yylsp--;
4994#endif
4995
4996#if YYDEBUG != 0
4997 if (yydebug)
4998 {
4999 short *ssp1 = yyss - 1;
5000 fprintf (stderr, "Error: state stack now");
5001 while (ssp1 != yyssp)
5002 fprintf (stderr, " %d", *++ssp1);
5003 fprintf (stderr, "\n");
5004 }
5005#endif
5006
5007yyerrhandle:
5008
5009 yyn = yypact[yystate];
5010 if (yyn == YYFLAG)
5011 goto yyerrdefault;
5012
5013 yyn += YYTERROR;
5014 if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
5015 goto yyerrdefault;
5016
5017 yyn = yytable[yyn];
5018 if (yyn < 0)
5019 {
5020 if (yyn == YYFLAG)
5021 goto yyerrpop;
5022 yyn = -yyn;
5023 goto yyreduce;
5024 }
5025 else if (yyn == 0)
5026 goto yyerrpop;
5027
Reid Spencer68a24bd2005-08-27 18:50:39 +00005028 if (yyn == YYFINAL)
5029 YYACCEPT;
5030
Christopher Lamb2330e4d2007-04-21 08:16:25 +00005031#if YYDEBUG != 0
5032 if (yydebug)
5033 fprintf(stderr, "Shifting error token, ");
5034#endif
5035
Reid Spencer68a24bd2005-08-27 18:50:39 +00005036 *++yyvsp = yylval;
Christopher Lamb2330e4d2007-04-21 08:16:25 +00005037#ifdef YYLSP_NEEDED
5038 *++yylsp = yylloc;
5039#endif
Reid Spencer41dff5e2007-01-26 08:05:27 +00005040
Reid Spencer68a24bd2005-08-27 18:50:39 +00005041 yystate = yyn;
5042 goto yynewstate;
5043
Christopher Lamb2330e4d2007-04-21 08:16:25 +00005044 yyacceptlab:
5045 /* YYACCEPT comes here. */
5046 if (yyfree_stacks)
Reid Spencer38c91a92007-02-28 02:24:54 +00005047 {
Christopher Lamb2330e4d2007-04-21 08:16:25 +00005048 free (yyss);
5049 free (yyvs);
5050#ifdef YYLSP_NEEDED
5051 free (yyls);
Reid Spencer38c91a92007-02-28 02:24:54 +00005052#endif
Christopher Lamb2330e4d2007-04-21 08:16:25 +00005053 }
5054 return 0;
5055
5056 yyabortlab:
5057 /* YYABORT comes here. */
5058 if (yyfree_stacks)
5059 {
5060 free (yyss);
5061 free (yyvs);
5062#ifdef YYLSP_NEEDED
5063 free (yyls);
5064#endif
5065 }
5066 return 1;
Reid Spencer68a24bd2005-08-27 18:50:39 +00005067}
Christopher Lamb2330e4d2007-04-21 08:16:25 +00005068#line 2972 "/Users/clamb/Documents/ageia/cvs/llvm/lib/AsmParser/llvmAsmParser.y"
Reid Spencer61c83e02006-08-18 08:43:06 +00005069
5070
Reid Spencer14310612006-12-31 05:40:51 +00005071// common code from the two 'RunVMAsmParser' functions
5072static Module* RunParser(Module * M) {
5073
5074 llvmAsmlineno = 1; // Reset the current line number...
5075 CurModule.CurrentModule = M;
5076#if YYDEBUG
5077 yydebug = Debug;
5078#endif
5079
5080 // Check to make sure the parser succeeded
5081 if (yyparse()) {
5082 if (ParserResult)
5083 delete ParserResult;
5084 return 0;
5085 }
5086
Reid Spencer0d60b5a2007-03-30 01:37:39 +00005087 // Emit an error if there are any unresolved types left.
5088 if (!CurModule.LateResolveTypes.empty()) {
5089 const ValID &DID = CurModule.LateResolveTypes.begin()->first;
5090 if (DID.Type == ValID::LocalName) {
5091 GenerateError("Undefined type remains at eof: '"+DID.getName() + "'");
5092 } else {
5093 GenerateError("Undefined type remains at eof: #" + itostr(DID.Num));
5094 }
5095 if (ParserResult)
5096 delete ParserResult;
5097 return 0;
5098 }
5099
5100 // Emit an error if there are any unresolved values left.
5101 if (!CurModule.LateResolveValues.empty()) {
5102 Value *V = CurModule.LateResolveValues.back();
5103 std::map<Value*, std::pair<ValID, int> >::iterator I =
5104 CurModule.PlaceHolderInfo.find(V);
5105
5106 if (I != CurModule.PlaceHolderInfo.end()) {
5107 ValID &DID = I->second.first;
5108 if (DID.Type == ValID::LocalName) {
5109 GenerateError("Undefined value remains at eof: "+DID.getName() + "'");
5110 } else {
5111 GenerateError("Undefined value remains at eof: #" + itostr(DID.Num));
5112 }
5113 if (ParserResult)
5114 delete ParserResult;
5115 return 0;
5116 }
5117 }
5118
Reid Spencer14310612006-12-31 05:40:51 +00005119 // Check to make sure that parsing produced a result
5120 if (!ParserResult)
5121 return 0;
5122
5123 // Reset ParserResult variable while saving its value for the result.
5124 Module *Result = ParserResult;
5125 ParserResult = 0;
5126
5127 return Result;
5128}
5129
Reid Spencer61c83e02006-08-18 08:43:06 +00005130void llvm::GenerateError(const std::string &message, int LineNo) {
5131 if (LineNo == -1) LineNo = llvmAsmlineno;
5132 // TODO: column number in exception
5133 if (TheParseError)
5134 TheParseError->setError(CurFilename, message, LineNo);
5135 TriggerError = 1;
5136}
Reid Spencer68a24bd2005-08-27 18:50:39 +00005137
5138int yyerror(const char *ErrorMsg) {
5139 std::string where
5140 = std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
5141 + ":" + utostr((unsigned) llvmAsmlineno) + ": ";
Reid Spenceref9b9a72007-02-05 20:47:22 +00005142 std::string errMsg = where + "error: " + std::string(ErrorMsg);
5143 if (yychar != YYEMPTY && yychar != 0)
5144 errMsg += " while reading token: '" + std::string(llvmAsmtext, llvmAsmleng)+
5145 "'";
Reid Spencer61c83e02006-08-18 08:43:06 +00005146 GenerateError(errMsg);
Reid Spencer68a24bd2005-08-27 18:50:39 +00005147 return 0;
5148}