Regenerate

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32908 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Spencer 2007-01-05 17:20:02 +00:00
parent bcdd54cf6f
commit 319a730353
8 changed files with 9495 additions and 6323 deletions

File diff suppressed because it is too large Load Diff

View File

@ -940,7 +940,7 @@ char *yytext;
#define YY_NEVER_INTERACTIVE 1
#line 28 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l"
#include "ParserInternals.h"
#include "UpgradeInternals.h"
#include "UpgradeParser.h"
#include <cctype>
#include <cstdlib>
@ -962,7 +962,7 @@ char *yytext;
return sym
#define RET_TY(sym,OldTY,NewTY,sign) \
Upgradelval.Type = new TypeInfo(NewTY, OldTY); \
Upgradelval.Type = TypeInfo::get(NewTY, OldTY); \
return sym
#define YY_NEVER_INTERACTIVE 1
@ -1196,7 +1196,7 @@ yy_match:
yy_find_action:
yy_current_state = *--yy_state_ptr;
yy_lp = yy_accept[yy_current_state];
find_rule: /* we branch to this label when backing up */
for ( ; ; ) /* until we find what rule we matched */
{
if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )

View File

@ -26,7 +26,7 @@
%{
#include "ParserInternals.h"
#include "UpgradeInternals.h"
#include "UpgradeParser.h"
#include <cctype>
#include <cstdlib>
@ -48,7 +48,7 @@
return sym
#define RET_TY(sym,OldTY,NewTY,sign) \
Upgradelval.Type = new TypeInfo(NewTY, OldTY); \
Upgradelval.Type = TypeInfo::get(NewTY, OldTY); \
return sym
#define YY_NEVER_INTERACTIVE 1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,159 +1,355 @@
typedef union {
/* A Bison parser, made by GNU Bison 2.1. */
/* Skeleton parser for Yacc-like parsing with Bison,
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
/* As a special exception, when this file is copied by Bison into a
Bison output file, you may use that output file without restriction.
This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
VOID = 258,
BOOL = 259,
SBYTE = 260,
UBYTE = 261,
SHORT = 262,
USHORT = 263,
INT = 264,
UINT = 265,
LONG = 266,
ULONG = 267,
FLOAT = 268,
DOUBLE = 269,
LABEL = 270,
OPAQUE = 271,
ESINT64VAL = 272,
EUINT64VAL = 273,
SINTVAL = 274,
UINTVAL = 275,
FPVAL = 276,
NULL_TOK = 277,
UNDEF = 278,
ZEROINITIALIZER = 279,
TRUETOK = 280,
FALSETOK = 281,
TYPE = 282,
VAR_ID = 283,
LABELSTR = 284,
STRINGCONSTANT = 285,
IMPLEMENTATION = 286,
BEGINTOK = 287,
ENDTOK = 288,
DECLARE = 289,
GLOBAL = 290,
CONSTANT = 291,
SECTION = 292,
VOLATILE = 293,
TO = 294,
DOTDOTDOT = 295,
CONST = 296,
INTERNAL = 297,
LINKONCE = 298,
WEAK = 299,
DLLIMPORT = 300,
DLLEXPORT = 301,
EXTERN_WEAK = 302,
APPENDING = 303,
NOT = 304,
EXTERNAL = 305,
TARGET = 306,
TRIPLE = 307,
ENDIAN = 308,
POINTERSIZE = 309,
LITTLE = 310,
BIG = 311,
ALIGN = 312,
UNINITIALIZED = 313,
DEPLIBS = 314,
CALL = 315,
TAIL = 316,
ASM_TOK = 317,
MODULE = 318,
SIDEEFFECT = 319,
CC_TOK = 320,
CCC_TOK = 321,
CSRETCC_TOK = 322,
FASTCC_TOK = 323,
COLDCC_TOK = 324,
X86_STDCALLCC_TOK = 325,
X86_FASTCALLCC_TOK = 326,
DATALAYOUT = 327,
RET = 328,
BR = 329,
SWITCH = 330,
INVOKE = 331,
EXCEPT = 332,
UNWIND = 333,
UNREACHABLE = 334,
ADD = 335,
SUB = 336,
MUL = 337,
DIV = 338,
UDIV = 339,
SDIV = 340,
FDIV = 341,
REM = 342,
UREM = 343,
SREM = 344,
FREM = 345,
AND = 346,
OR = 347,
XOR = 348,
SETLE = 349,
SETGE = 350,
SETLT = 351,
SETGT = 352,
SETEQ = 353,
SETNE = 354,
ICMP = 355,
FCMP = 356,
EQ = 357,
NE = 358,
SLT = 359,
SGT = 360,
SLE = 361,
SGE = 362,
OEQ = 363,
ONE = 364,
OLT = 365,
OGT = 366,
OLE = 367,
OGE = 368,
ORD = 369,
UNO = 370,
UEQ = 371,
UNE = 372,
ULT = 373,
UGT = 374,
ULE = 375,
UGE = 376,
MALLOC = 377,
ALLOCA = 378,
FREE = 379,
LOAD = 380,
STORE = 381,
GETELEMENTPTR = 382,
PHI_TOK = 383,
SELECT = 384,
SHL = 385,
SHR = 386,
ASHR = 387,
LSHR = 388,
VAARG = 389,
EXTRACTELEMENT = 390,
INSERTELEMENT = 391,
SHUFFLEVECTOR = 392,
CAST = 393,
TRUNC = 394,
ZEXT = 395,
SEXT = 396,
FPTRUNC = 397,
FPEXT = 398,
FPTOUI = 399,
FPTOSI = 400,
UITOFP = 401,
SITOFP = 402,
PTRTOINT = 403,
INTTOPTR = 404,
BITCAST = 405
};
#endif
/* Tokens. */
#define VOID 258
#define BOOL 259
#define SBYTE 260
#define UBYTE 261
#define SHORT 262
#define USHORT 263
#define INT 264
#define UINT 265
#define LONG 266
#define ULONG 267
#define FLOAT 268
#define DOUBLE 269
#define LABEL 270
#define OPAQUE 271
#define ESINT64VAL 272
#define EUINT64VAL 273
#define SINTVAL 274
#define UINTVAL 275
#define FPVAL 276
#define NULL_TOK 277
#define UNDEF 278
#define ZEROINITIALIZER 279
#define TRUETOK 280
#define FALSETOK 281
#define TYPE 282
#define VAR_ID 283
#define LABELSTR 284
#define STRINGCONSTANT 285
#define IMPLEMENTATION 286
#define BEGINTOK 287
#define ENDTOK 288
#define DECLARE 289
#define GLOBAL 290
#define CONSTANT 291
#define SECTION 292
#define VOLATILE 293
#define TO 294
#define DOTDOTDOT 295
#define CONST 296
#define INTERNAL 297
#define LINKONCE 298
#define WEAK 299
#define DLLIMPORT 300
#define DLLEXPORT 301
#define EXTERN_WEAK 302
#define APPENDING 303
#define NOT 304
#define EXTERNAL 305
#define TARGET 306
#define TRIPLE 307
#define ENDIAN 308
#define POINTERSIZE 309
#define LITTLE 310
#define BIG 311
#define ALIGN 312
#define UNINITIALIZED 313
#define DEPLIBS 314
#define CALL 315
#define TAIL 316
#define ASM_TOK 317
#define MODULE 318
#define SIDEEFFECT 319
#define CC_TOK 320
#define CCC_TOK 321
#define CSRETCC_TOK 322
#define FASTCC_TOK 323
#define COLDCC_TOK 324
#define X86_STDCALLCC_TOK 325
#define X86_FASTCALLCC_TOK 326
#define DATALAYOUT 327
#define RET 328
#define BR 329
#define SWITCH 330
#define INVOKE 331
#define EXCEPT 332
#define UNWIND 333
#define UNREACHABLE 334
#define ADD 335
#define SUB 336
#define MUL 337
#define DIV 338
#define UDIV 339
#define SDIV 340
#define FDIV 341
#define REM 342
#define UREM 343
#define SREM 344
#define FREM 345
#define AND 346
#define OR 347
#define XOR 348
#define SETLE 349
#define SETGE 350
#define SETLT 351
#define SETGT 352
#define SETEQ 353
#define SETNE 354
#define ICMP 355
#define FCMP 356
#define EQ 357
#define NE 358
#define SLT 359
#define SGT 360
#define SLE 361
#define SGE 362
#define OEQ 363
#define ONE 364
#define OLT 365
#define OGT 366
#define OLE 367
#define OGE 368
#define ORD 369
#define UNO 370
#define UEQ 371
#define UNE 372
#define ULT 373
#define UGT 374
#define ULE 375
#define UGE 376
#define MALLOC 377
#define ALLOCA 378
#define FREE 379
#define LOAD 380
#define STORE 381
#define GETELEMENTPTR 382
#define PHI_TOK 383
#define SELECT 384
#define SHL 385
#define SHR 386
#define ASHR 387
#define LSHR 388
#define VAARG 389
#define EXTRACTELEMENT 390
#define INSERTELEMENT 391
#define SHUFFLEVECTOR 392
#define CAST 393
#define TRUNC 394
#define ZEXT 395
#define SEXT 396
#define FPTRUNC 397
#define FPEXT 398
#define FPTOUI 399
#define FPTOSI 400
#define UITOFP 401
#define SITOFP 402
#define PTRTOINT 403
#define INTTOPTR 404
#define BITCAST 405
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
#line 742 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y"
typedef union YYSTYPE {
std::string* String;
TypeInfo* Type;
const TypeInfo* Type;
ValueInfo Value;
ConstInfo Const;
ValueList* ValList;
TypeList* TypeVec;
} YYSTYPE;
#define VOID 257
#define BOOL 258
#define SBYTE 259
#define UBYTE 260
#define SHORT 261
#define USHORT 262
#define INT 263
#define UINT 264
#define LONG 265
#define ULONG 266
#define FLOAT 267
#define DOUBLE 268
#define LABEL 269
#define OPAQUE 270
#define ESINT64VAL 271
#define EUINT64VAL 272
#define SINTVAL 273
#define UINTVAL 274
#define FPVAL 275
#define NULL_TOK 276
#define UNDEF 277
#define ZEROINITIALIZER 278
#define TRUETOK 279
#define FALSETOK 280
#define TYPE 281
#define VAR_ID 282
#define LABELSTR 283
#define STRINGCONSTANT 284
#define IMPLEMENTATION 285
#define BEGINTOK 286
#define ENDTOK 287
#define DECLARE 288
#define GLOBAL 289
#define CONSTANT 290
#define SECTION 291
#define VOLATILE 292
#define TO 293
#define DOTDOTDOT 294
#define CONST 295
#define INTERNAL 296
#define LINKONCE 297
#define WEAK 298
#define DLLIMPORT 299
#define DLLEXPORT 300
#define EXTERN_WEAK 301
#define APPENDING 302
#define NOT 303
#define EXTERNAL 304
#define TARGET 305
#define TRIPLE 306
#define ENDIAN 307
#define POINTERSIZE 308
#define LITTLE 309
#define BIG 310
#define ALIGN 311
#define UNINITIALIZED 312
#define DEPLIBS 313
#define CALL 314
#define TAIL 315
#define ASM_TOK 316
#define MODULE 317
#define SIDEEFFECT 318
#define CC_TOK 319
#define CCC_TOK 320
#define CSRETCC_TOK 321
#define FASTCC_TOK 322
#define COLDCC_TOK 323
#define X86_STDCALLCC_TOK 324
#define X86_FASTCALLCC_TOK 325
#define DATALAYOUT 326
#define RET 327
#define BR 328
#define SWITCH 329
#define INVOKE 330
#define EXCEPT 331
#define UNWIND 332
#define UNREACHABLE 333
#define ADD 334
#define SUB 335
#define MUL 336
#define DIV 337
#define UDIV 338
#define SDIV 339
#define FDIV 340
#define REM 341
#define UREM 342
#define SREM 343
#define FREM 344
#define AND 345
#define OR 346
#define XOR 347
#define SETLE 348
#define SETGE 349
#define SETLT 350
#define SETGT 351
#define SETEQ 352
#define SETNE 353
#define ICMP 354
#define FCMP 355
#define EQ 356
#define NE 357
#define SLT 358
#define SGT 359
#define SLE 360
#define SGE 361
#define OEQ 362
#define ONE 363
#define OLT 364
#define OGT 365
#define OLE 366
#define OGE 367
#define ORD 368
#define UNO 369
#define UEQ 370
#define UNE 371
#define ULT 372
#define UGT 373
#define ULE 374
#define UGE 375
#define MALLOC 376
#define ALLOCA 377
#define FREE 378
#define LOAD 379
#define STORE 380
#define GETELEMENTPTR 381
#define PHI_TOK 382
#define SELECT 383
#define SHL 384
#define SHR 385
#define ASHR 386
#define LSHR 387
#define VAARG 388
#define EXTRACTELEMENT 389
#define INSERTELEMENT 390
#define SHUFFLEVECTOR 391
#define CAST 392
#define TRUNC 393
#define ZEXT 394
#define SEXT 395
#define FPTRUNC 396
#define FPEXT 397
#define FPTOUI 398
#define FPTOSI 399
#define UITOFP 400
#define SITOFP 401
#define PTRTOINT 402
#define INTTOPTR 403
#define BITCAST 404
/* Line 1447 of yacc.c. */
#line 347 "UpgradeParser.tab.h"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif
extern YYSTYPE Upgradelval;

View File

@ -1,159 +1,355 @@
typedef union {
/* A Bison parser, made by GNU Bison 2.1. */
/* Skeleton parser for Yacc-like parsing with Bison,
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
/* As a special exception, when this file is copied by Bison into a
Bison output file, you may use that output file without restriction.
This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
VOID = 258,
BOOL = 259,
SBYTE = 260,
UBYTE = 261,
SHORT = 262,
USHORT = 263,
INT = 264,
UINT = 265,
LONG = 266,
ULONG = 267,
FLOAT = 268,
DOUBLE = 269,
LABEL = 270,
OPAQUE = 271,
ESINT64VAL = 272,
EUINT64VAL = 273,
SINTVAL = 274,
UINTVAL = 275,
FPVAL = 276,
NULL_TOK = 277,
UNDEF = 278,
ZEROINITIALIZER = 279,
TRUETOK = 280,
FALSETOK = 281,
TYPE = 282,
VAR_ID = 283,
LABELSTR = 284,
STRINGCONSTANT = 285,
IMPLEMENTATION = 286,
BEGINTOK = 287,
ENDTOK = 288,
DECLARE = 289,
GLOBAL = 290,
CONSTANT = 291,
SECTION = 292,
VOLATILE = 293,
TO = 294,
DOTDOTDOT = 295,
CONST = 296,
INTERNAL = 297,
LINKONCE = 298,
WEAK = 299,
DLLIMPORT = 300,
DLLEXPORT = 301,
EXTERN_WEAK = 302,
APPENDING = 303,
NOT = 304,
EXTERNAL = 305,
TARGET = 306,
TRIPLE = 307,
ENDIAN = 308,
POINTERSIZE = 309,
LITTLE = 310,
BIG = 311,
ALIGN = 312,
UNINITIALIZED = 313,
DEPLIBS = 314,
CALL = 315,
TAIL = 316,
ASM_TOK = 317,
MODULE = 318,
SIDEEFFECT = 319,
CC_TOK = 320,
CCC_TOK = 321,
CSRETCC_TOK = 322,
FASTCC_TOK = 323,
COLDCC_TOK = 324,
X86_STDCALLCC_TOK = 325,
X86_FASTCALLCC_TOK = 326,
DATALAYOUT = 327,
RET = 328,
BR = 329,
SWITCH = 330,
INVOKE = 331,
EXCEPT = 332,
UNWIND = 333,
UNREACHABLE = 334,
ADD = 335,
SUB = 336,
MUL = 337,
DIV = 338,
UDIV = 339,
SDIV = 340,
FDIV = 341,
REM = 342,
UREM = 343,
SREM = 344,
FREM = 345,
AND = 346,
OR = 347,
XOR = 348,
SETLE = 349,
SETGE = 350,
SETLT = 351,
SETGT = 352,
SETEQ = 353,
SETNE = 354,
ICMP = 355,
FCMP = 356,
EQ = 357,
NE = 358,
SLT = 359,
SGT = 360,
SLE = 361,
SGE = 362,
OEQ = 363,
ONE = 364,
OLT = 365,
OGT = 366,
OLE = 367,
OGE = 368,
ORD = 369,
UNO = 370,
UEQ = 371,
UNE = 372,
ULT = 373,
UGT = 374,
ULE = 375,
UGE = 376,
MALLOC = 377,
ALLOCA = 378,
FREE = 379,
LOAD = 380,
STORE = 381,
GETELEMENTPTR = 382,
PHI_TOK = 383,
SELECT = 384,
SHL = 385,
SHR = 386,
ASHR = 387,
LSHR = 388,
VAARG = 389,
EXTRACTELEMENT = 390,
INSERTELEMENT = 391,
SHUFFLEVECTOR = 392,
CAST = 393,
TRUNC = 394,
ZEXT = 395,
SEXT = 396,
FPTRUNC = 397,
FPEXT = 398,
FPTOUI = 399,
FPTOSI = 400,
UITOFP = 401,
SITOFP = 402,
PTRTOINT = 403,
INTTOPTR = 404,
BITCAST = 405
};
#endif
/* Tokens. */
#define VOID 258
#define BOOL 259
#define SBYTE 260
#define UBYTE 261
#define SHORT 262
#define USHORT 263
#define INT 264
#define UINT 265
#define LONG 266
#define ULONG 267
#define FLOAT 268
#define DOUBLE 269
#define LABEL 270
#define OPAQUE 271
#define ESINT64VAL 272
#define EUINT64VAL 273
#define SINTVAL 274
#define UINTVAL 275
#define FPVAL 276
#define NULL_TOK 277
#define UNDEF 278
#define ZEROINITIALIZER 279
#define TRUETOK 280
#define FALSETOK 281
#define TYPE 282
#define VAR_ID 283
#define LABELSTR 284
#define STRINGCONSTANT 285
#define IMPLEMENTATION 286
#define BEGINTOK 287
#define ENDTOK 288
#define DECLARE 289
#define GLOBAL 290
#define CONSTANT 291
#define SECTION 292
#define VOLATILE 293
#define TO 294
#define DOTDOTDOT 295
#define CONST 296
#define INTERNAL 297
#define LINKONCE 298
#define WEAK 299
#define DLLIMPORT 300
#define DLLEXPORT 301
#define EXTERN_WEAK 302
#define APPENDING 303
#define NOT 304
#define EXTERNAL 305
#define TARGET 306
#define TRIPLE 307
#define ENDIAN 308
#define POINTERSIZE 309
#define LITTLE 310
#define BIG 311
#define ALIGN 312
#define UNINITIALIZED 313
#define DEPLIBS 314
#define CALL 315
#define TAIL 316
#define ASM_TOK 317
#define MODULE 318
#define SIDEEFFECT 319
#define CC_TOK 320
#define CCC_TOK 321
#define CSRETCC_TOK 322
#define FASTCC_TOK 323
#define COLDCC_TOK 324
#define X86_STDCALLCC_TOK 325
#define X86_FASTCALLCC_TOK 326
#define DATALAYOUT 327
#define RET 328
#define BR 329
#define SWITCH 330
#define INVOKE 331
#define EXCEPT 332
#define UNWIND 333
#define UNREACHABLE 334
#define ADD 335
#define SUB 336
#define MUL 337
#define DIV 338
#define UDIV 339
#define SDIV 340
#define FDIV 341
#define REM 342
#define UREM 343
#define SREM 344
#define FREM 345
#define AND 346
#define OR 347
#define XOR 348
#define SETLE 349
#define SETGE 350
#define SETLT 351
#define SETGT 352
#define SETEQ 353
#define SETNE 354
#define ICMP 355
#define FCMP 356
#define EQ 357
#define NE 358
#define SLT 359
#define SGT 360
#define SLE 361
#define SGE 362
#define OEQ 363
#define ONE 364
#define OLT 365
#define OGT 366
#define OLE 367
#define OGE 368
#define ORD 369
#define UNO 370
#define UEQ 371
#define UNE 372
#define ULT 373
#define UGT 374
#define ULE 375
#define UGE 376
#define MALLOC 377
#define ALLOCA 378
#define FREE 379
#define LOAD 380
#define STORE 381
#define GETELEMENTPTR 382
#define PHI_TOK 383
#define SELECT 384
#define SHL 385
#define SHR 386
#define ASHR 387
#define LSHR 388
#define VAARG 389
#define EXTRACTELEMENT 390
#define INSERTELEMENT 391
#define SHUFFLEVECTOR 392
#define CAST 393
#define TRUNC 394
#define ZEXT 395
#define SEXT 396
#define FPTRUNC 397
#define FPEXT 398
#define FPTOUI 399
#define FPTOSI 400
#define UITOFP 401
#define SITOFP 402
#define PTRTOINT 403
#define INTTOPTR 404
#define BITCAST 405
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
#line 742 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y"
typedef union YYSTYPE {
std::string* String;
TypeInfo* Type;
const TypeInfo* Type;
ValueInfo Value;
ConstInfo Const;
ValueList* ValList;
TypeList* TypeVec;
} YYSTYPE;
#define VOID 257
#define BOOL 258
#define SBYTE 259
#define UBYTE 260
#define SHORT 261
#define USHORT 262
#define INT 263
#define UINT 264
#define LONG 265
#define ULONG 266
#define FLOAT 267
#define DOUBLE 268
#define LABEL 269
#define OPAQUE 270
#define ESINT64VAL 271
#define EUINT64VAL 272
#define SINTVAL 273
#define UINTVAL 274
#define FPVAL 275
#define NULL_TOK 276
#define UNDEF 277
#define ZEROINITIALIZER 278
#define TRUETOK 279
#define FALSETOK 280
#define TYPE 281
#define VAR_ID 282
#define LABELSTR 283
#define STRINGCONSTANT 284
#define IMPLEMENTATION 285
#define BEGINTOK 286
#define ENDTOK 287
#define DECLARE 288
#define GLOBAL 289
#define CONSTANT 290
#define SECTION 291
#define VOLATILE 292
#define TO 293
#define DOTDOTDOT 294
#define CONST 295
#define INTERNAL 296
#define LINKONCE 297
#define WEAK 298
#define DLLIMPORT 299
#define DLLEXPORT 300
#define EXTERN_WEAK 301
#define APPENDING 302
#define NOT 303
#define EXTERNAL 304
#define TARGET 305
#define TRIPLE 306
#define ENDIAN 307
#define POINTERSIZE 308
#define LITTLE 309
#define BIG 310
#define ALIGN 311
#define UNINITIALIZED 312
#define DEPLIBS 313
#define CALL 314
#define TAIL 315
#define ASM_TOK 316
#define MODULE 317
#define SIDEEFFECT 318
#define CC_TOK 319
#define CCC_TOK 320
#define CSRETCC_TOK 321
#define FASTCC_TOK 322
#define COLDCC_TOK 323
#define X86_STDCALLCC_TOK 324
#define X86_FASTCALLCC_TOK 325
#define DATALAYOUT 326
#define RET 327
#define BR 328
#define SWITCH 329
#define INVOKE 330
#define EXCEPT 331
#define UNWIND 332
#define UNREACHABLE 333
#define ADD 334
#define SUB 335
#define MUL 336
#define DIV 337
#define UDIV 338
#define SDIV 339
#define FDIV 340
#define REM 341
#define UREM 342
#define SREM 343
#define FREM 344
#define AND 345
#define OR 346
#define XOR 347
#define SETLE 348
#define SETGE 349
#define SETLT 350
#define SETGT 351
#define SETEQ 352
#define SETNE 353
#define ICMP 354
#define FCMP 355
#define EQ 356
#define NE 357
#define SLT 358
#define SGT 359
#define SLE 360
#define SGE 361
#define OEQ 362
#define ONE 363
#define OLT 364
#define OGT 365
#define OLE 366
#define OGE 367
#define ORD 368
#define UNO 369
#define UEQ 370
#define UNE 371
#define ULT 372
#define UGT 373
#define ULE 374
#define UGE 375
#define MALLOC 376
#define ALLOCA 377
#define FREE 378
#define LOAD 379
#define STORE 380
#define GETELEMENTPTR 381
#define PHI_TOK 382
#define SELECT 383
#define SHL 384
#define SHR 385
#define ASHR 386
#define LSHR 387
#define VAARG 388
#define EXTRACTELEMENT 389
#define INSERTELEMENT 390
#define SHUFFLEVECTOR 391
#define CAST 392
#define TRUNC 393
#define ZEXT 394
#define SEXT 395
#define FPTRUNC 396
#define FPEXT 397
#define FPTOUI 398
#define FPTOSI 399
#define UITOFP 400
#define SITOFP 401
#define PTRTOINT 402
#define INTTOPTR 403
#define BITCAST 404
/* Line 1447 of yacc.c. */
#line 347 "UpgradeParser.tab.h"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif
extern YYSTYPE Upgradelval;

View File

@ -12,7 +12,7 @@
//===----------------------------------------------------------------------===//
%{
#include "ParserInternals.h"
#include "UpgradeInternals.h"
#include <algorithm>
#include <map>
#include <utility>
@ -45,11 +45,15 @@ static bool AddAttributes = false;
static bool deleteUselessCastFlag = false;
static std::string* deleteUselessCastName = 0;
typedef std::vector<TypeInfo> TypeVector;
typedef std::vector<const TypeInfo*> TypeVector;
static TypeVector EnumeratedTypes;
typedef std::map<std::string,TypeInfo> TypeMap;
typedef std::map<std::string,const TypeInfo*> TypeMap;
static TypeMap NamedTypes;
static TypeMap Globals;
typedef std::map<const TypeInfo*,std::string> TypePlaneMap;
typedef std::map<std::string,TypePlaneMap> GlobalsTypeMap;
static GlobalsTypeMap Globals;
static void warning(const std::string& msg);
void destroy(ValueList* VL) {
while (!VL->empty()) {
@ -77,32 +81,261 @@ void UpgradeAssembly(const std::string &infile, std::istream& in,
}
}
TypeInfo* ResolveType(TypeInfo*& Ty) {
if (Ty->isUnresolved()) {
if (Ty->getNewTy()[0] == '%' && isdigit(Ty->getNewTy()[1])) {
unsigned ref = atoi(&((Ty->getNewTy().c_str())[1])); // skip the %
TypeInfo::TypeRegMap TypeInfo::registry;
const TypeInfo* TypeInfo::get(const std::string &newType, Types oldType) {
TypeInfo* Ty = new TypeInfo();
Ty->newTy = newType;
Ty->oldTy = oldType;
return add_new_type(Ty);
}
const TypeInfo* TypeInfo::get(const std::string& newType, Types oldType,
const TypeInfo* eTy, const TypeInfo* rTy) {
TypeInfo* Ty= new TypeInfo();
Ty->newTy = newType;
Ty->oldTy = oldType;
Ty->elemTy = const_cast<TypeInfo*>(eTy);
Ty->resultTy = const_cast<TypeInfo*>(rTy);
return add_new_type(Ty);
}
const TypeInfo* TypeInfo::get(const std::string& newType, Types oldType,
const TypeInfo *eTy, uint64_t elems) {
TypeInfo* Ty = new TypeInfo();
Ty->newTy = newType;
Ty->oldTy = oldType;
Ty->elemTy = const_cast<TypeInfo*>(eTy);
Ty->nelems = elems;
return add_new_type(Ty);
}
const TypeInfo* TypeInfo::get(const std::string& newType, Types oldType,
TypeList* TL) {
TypeInfo* Ty = new TypeInfo();
Ty->newTy = newType;
Ty->oldTy = oldType;
Ty->elements = TL;
return add_new_type(Ty);
}
const TypeInfo* TypeInfo::get(const std::string& newType, const TypeInfo* resTy,
TypeList* TL) {
TypeInfo* Ty = new TypeInfo();
Ty->newTy = newType;
Ty->oldTy = FunctionTy;
Ty->resultTy = const_cast<TypeInfo*>(resTy);
Ty->elements = TL;
return add_new_type(Ty);
}
const TypeInfo* TypeInfo::resolve() const {
if (isUnresolved()) {
if (getNewTy()[0] == '%' && isdigit(getNewTy()[1])) {
unsigned ref = atoi(&((getNewTy().c_str())[1])); // skip the %
if (ref < EnumeratedTypes.size()) {
Ty = &EnumeratedTypes[ref];
return Ty;
return EnumeratedTypes[ref];
} else {
std::string msg("Can't resolve numbered type: ");
msg += Ty->getNewTy();
msg += getNewTy();
yyerror(msg.c_str());
}
} else {
TypeMap::iterator I = NamedTypes.find(Ty->getNewTy());
TypeMap::iterator I = NamedTypes.find(getNewTy());
if (I != NamedTypes.end()) {
Ty = &I->second;
return Ty;
return I->second;
} else {
std::string msg("Cannot resolve type: ");
msg += Ty->getNewTy();
msg += getNewTy();
yyerror(msg.c_str());
}
}
}
// otherwise its already resolved.
return Ty;
return this;
}
bool TypeInfo::operator<(const TypeInfo& that) const {
if (this == &that)
return false;
if (oldTy != that.oldTy)
return oldTy < that.oldTy;
switch (oldTy) {
case UpRefTy: {
unsigned thisUp = this->getUpRefNum();
unsigned thatUp = that.getUpRefNum();
return thisUp < thatUp;
}
case PackedTy:
case ArrayTy:
if (this->nelems != that.nelems)
return nelems < that.nelems;
case PointerTy: {
const TypeInfo* thisTy = this->elemTy;
const TypeInfo* thatTy = that.elemTy;
return *thisTy < *thatTy;
}
case FunctionTy: {
const TypeInfo* thisTy = this->resultTy;
const TypeInfo* thatTy = that.resultTy;
if (!thisTy->sameOldTyAs(thatTy))
return *thisTy < *thatTy;
/* FALL THROUGH */
}
case StructTy:
case PackedStructTy: {
if (elements->size() != that.elements->size())
return elements->size() < that.elements->size();
for (unsigned i = 0; i < elements->size(); i++) {
const TypeInfo* thisTy = (*this->elements)[i];
const TypeInfo* thatTy = (*that.elements)[i];
if (!thisTy->sameOldTyAs(thatTy))
return *thisTy < *thatTy;
}
break;
}
case UnresolvedTy:
return this->newTy < that.newTy;
default:
break;
}
return false;
}
bool TypeInfo::sameOldTyAs(const TypeInfo* that) const {
if (that == 0)
return false;
if ( this == that )
return true;
if (oldTy != that->oldTy)
return false;
switch (oldTy) {
case PackedTy:
case ArrayTy:
if (nelems != that->nelems)
return false;
/* FALL THROUGH */
case PointerTy: {
const TypeInfo* thisTy = this->elemTy;
const TypeInfo* thatTy = that->elemTy;
return thisTy->sameOldTyAs(thatTy);
}
case FunctionTy: {
const TypeInfo* thisTy = this->resultTy;
const TypeInfo* thatTy = that->resultTy;
if (!thisTy->sameOldTyAs(thatTy))
return false;
/* FALL THROUGH */
}
case StructTy:
case PackedStructTy: {
if (elements->size() != that->elements->size())
return false;
for (unsigned i = 0; i < elements->size(); i++) {
const TypeInfo* thisTy = (*this->elements)[i];
const TypeInfo* thatTy = (*that->elements)[i];
if (!thisTy->sameOldTyAs(thatTy))
return false;
}
return true;
}
case UnresolvedTy:
return this->newTy == that->newTy;
default:
return true; // for all others oldTy == that->oldTy is sufficient
}
return true;
}
bool TypeInfo::isUnresolvedDeep() const {
switch (oldTy) {
case UnresolvedTy:
return true;
case PackedTy:
case ArrayTy:
case PointerTy:
return elemTy->isUnresolvedDeep();
case PackedStructTy:
case StructTy:
for (unsigned i = 0; i < elements->size(); i++)
if ((*elements)[i]->isUnresolvedDeep())
return true;
return false;
default:
return false;
}
}
unsigned TypeInfo::getBitWidth() const {
switch (oldTy) {
default:
case LabelTy:
case VoidTy : return 0;
case BoolTy : return 1;
case SByteTy: case UByteTy : return 8;
case ShortTy: case UShortTy : return 16;
case IntTy: case UIntTy: case FloatTy: return 32;
case LongTy: case ULongTy: case DoubleTy : return 64;
case PointerTy: return SizeOfPointer; // global var
case PackedTy:
case ArrayTy:
return nelems * elemTy->getBitWidth();
case StructTy:
case PackedStructTy: {
uint64_t size = 0;
for (unsigned i = 0; i < elements->size(); i++) {
size += (*elements)[i]->getBitWidth();
}
return size;
}
}
}
const TypeInfo* TypeInfo::getIndexedType(const ValueInfo& VI) const {
if (isStruct()) {
if (VI.isConstant() && VI.type->isInteger()) {
size_t pos = VI.val->find(' ') + 1;
if (pos < VI.val->size()) {
uint64_t idx = atoi(VI.val->substr(pos).c_str());
return (*elements)[idx];
} else {
yyerror("Invalid value for constant integer");
return 0;
}
} else {
yyerror("Structure requires constant index");
return 0;
}
}
if (isArray() || isPacked() || isPointer())
return elemTy;
yyerror("Invalid type for getIndexedType");
return 0;
}
TypeInfo& TypeInfo::operator=(const TypeInfo& that) {
oldTy = that.oldTy;
nelems = that.nelems;
newTy = that.newTy;
elemTy = that.elemTy;
resultTy = that.resultTy;
if (that.elements) {
elements = new TypeList(that.elements->size());
*elements = *that.elements;
} else {
elements = 0;
}
return *this;
}
const TypeInfo* TypeInfo::add_new_type(TypeInfo* newTy) {
TypeRegMap::iterator I = registry.find(newTy);
if (I != registry.end()) {
delete newTy;
return *I;
}
registry.insert(newTy);
return newTy;
}
static const char* getCastOpcode(
@ -183,8 +416,8 @@ static const char* getCastOpcode(
return opcode;
}
static std::string getCastUpgrade(const std::string& Src, TypeInfo* SrcTy,
TypeInfo* DstTy, bool isConst)
static std::string getCastUpgrade(const std::string& Src, const TypeInfo* SrcTy,
const TypeInfo* DstTy, bool isConst)
{
std::string Result;
std::string Source = Src;
@ -199,8 +432,7 @@ static std::string getCastUpgrade(const std::string& Src, TypeInfo* SrcTy,
Source = "i64 %cast_upgrade" + llvm::utostr(unique);
}
// Update the SrcTy for the getCastOpcode call below
delete SrcTy;
SrcTy = new TypeInfo("i64", ULongTy);
SrcTy = TypeInfo::get("i64", ULongTy);
} else if (DstTy->isBool()) {
// cast type %x to bool was previously defined as setne type %x, null
// The cast semantic is now to truncate, not compare so we must retain
@ -216,8 +448,8 @@ static std::string getCastUpgrade(const std::string& Src, TypeInfo* SrcTy,
Result = compareOp + Source + comparator;
return Result; // skip cast processing below
}
ResolveType(SrcTy);
ResolveType(DstTy);
SrcTy = SrcTy->resolve();
DstTy = DstTy->resolve();
std::string Opcode(getCastOpcode(Source, SrcTy, DstTy));
if (isConst)
Result += Opcode + "( " + Source + " to " + DstTy->getNewTy() + ")";
@ -226,9 +458,9 @@ static std::string getCastUpgrade(const std::string& Src, TypeInfo* SrcTy,
return Result;
}
const char* getDivRemOpcode(const std::string& opcode, TypeInfo* TI) {
const char* getDivRemOpcode(const std::string& opcode, const TypeInfo* TI) {
const char* op = opcode.c_str();
const TypeInfo* Ty = ResolveType(TI);
const TypeInfo* Ty = TI->resolve();
if (Ty->isPacked())
Ty = Ty->getElementType();
if (opcode == "div")
@ -283,35 +515,36 @@ getCompareOp(const std::string& setcc, const TypeInfo* TI) {
return result;
}
static TypeInfo* getFunctionReturnType(TypeInfo* PFTy) {
ResolveType(PFTy);
static const TypeInfo* getFunctionReturnType(const TypeInfo* PFTy) {
PFTy = PFTy->resolve();
if (PFTy->isPointer()) {
TypeInfo* ElemTy = PFTy->getElementType();
ResolveType(ElemTy);
const TypeInfo* ElemTy = PFTy->getElementType();
ElemTy = ElemTy->resolve();
if (ElemTy->isFunction())
return ElemTy->getResultType()->clone();
return ElemTy->getResultType();
} else if (PFTy->isFunction()) {
return PFTy->getResultType()->clone();
return PFTy->getResultType();
}
return PFTy->clone();
return PFTy;
}
typedef std::vector<TypeInfo*> UpRefStack;
static TypeInfo* ResolveUpReference(TypeInfo* Ty, UpRefStack* stack) {
typedef std::vector<const TypeInfo*> UpRefStack;
static const TypeInfo* ResolveUpReference(const TypeInfo* Ty,
UpRefStack* stack) {
assert(Ty->isUpReference() && "Can't resolve a non-upreference");
unsigned upref = atoi(&((Ty->getNewTy().c_str())[1])); // skip the slash
unsigned upref = Ty->getUpRefNum();
assert(upref < stack->size() && "Invalid up reference");
return (*stack)[upref - stack->size() - 1];
}
static TypeInfo* getGEPIndexedType(TypeInfo* PTy, ValueList* idxs) {
TypeInfo* Result = ResolveType(PTy);
static const TypeInfo* getGEPIndexedType(const TypeInfo* PTy, ValueList* idxs) {
const TypeInfo* Result = PTy = PTy->resolve();
assert(PTy->isPointer() && "GEP Operand is not a pointer?");
UpRefStack stack;
for (unsigned i = 0; i < idxs->size(); ++i) {
if (Result->isComposite()) {
Result = Result->getIndexedType((*idxs)[i]);
ResolveType(Result);
Result = Result->resolve();
stack.push_back(Result);
} else
yyerror("Invalid type for index");
@ -344,25 +577,47 @@ static std::string makeUniqueName(const std::string *Name, bool isSigned) {
// were previously unsigned or signed, respectively. This avoids name
// collisions since the unsigned and signed type planes have collapsed
// into a single signless type plane.
static std::string getUniqueName(const std::string *Name, TypeInfo* Ty) {
static std::string getUniqueName(const std::string *Name, const TypeInfo* Ty,
bool isGlobal = false) {
// If its not a symbolic name, don't modify it, probably a constant val.
if ((*Name)[0] != '%' && (*Name)[0] != '"')
return *Name;
// If its a numeric reference, just leave it alone.
if (isdigit((*Name)[1]))
return *Name;
// Resolve the type
ResolveType(Ty);
Ty = Ty->resolve();
// If its a global name, get its uniquified name, if any
GlobalsTypeMap::iterator GI = Globals.find(*Name);
if (GI != Globals.end()) {
TypePlaneMap::iterator TPI = GI->second.begin();
TypePlaneMap::iterator TPE = GI->second.end();
for ( ; TPI != TPE ; ++TPI) {
if (TPI->first->sameNewTyAs(Ty))
return TPI->second;
}
}
if (isGlobal) {
// We didn't find a global name, but if its supposed to be global then all
// we can do is return the name. This is probably a forward reference of a
// global value that hasn't been defined yet. Since we have no definition
// we don't know its linkage class. Just assume its an external and the name
// shouldn't change.
return *Name;
}
// Remove as many levels of pointer nesting that we have.
if (Ty->isPointer()) {
// Avoid infinite loops in recursive types
TypeInfo* Last = 0;
while (Ty->isPointer() && Last != Ty) {
const TypeInfo* Last = 0;
while (Ty->isPointer() && !Ty->sameOldTyAs(Last)) {
Last = Ty;
Ty = Ty->getElementType();
ResolveType(Ty);
Ty = Ty->getElementType()->resolve();
}
}
@ -381,7 +636,7 @@ static std::string getUniqueName(const std::string *Name, TypeInfo* Ty) {
// Scan the fields and count the signed and unsigned fields
int isSigned = 0;
for (unsigned i = 0; i < Ty->getNumStructElements(); ++i) {
TypeInfo* Tmp = Ty->getElement(i);
const TypeInfo* Tmp = Ty->getElement(i);
if (Tmp->isInteger())
if (Tmp->isSigned())
isSigned++;
@ -394,13 +649,99 @@ static std::string getUniqueName(const std::string *Name, TypeInfo* Ty) {
return Result;
}
static unsigned UniqueNameCounter = 0;
std::string getGlobalName(const std::string* Name, const std::string Linkage,
const TypeInfo* Ty, bool isConstant) {
// Default to given name
std::string Result = *Name;
// Look up the name in the Globals Map
GlobalsTypeMap::iterator GI = Globals.find(*Name);
// Did we see this global name before?
if (GI != Globals.end()) {
if (Ty->isUnresolvedDeep()) {
// The Gval's type is unresolved. Consequently, we can't disambiguate it
// by type. We'll just change its name and emit a warning.
warning("Cannot disambiguate global value '" + *Name +
"' because type '" + Ty->getNewTy() + "'is unresolved.\n");
Result = *Name + ".unique";
UniqueNameCounter++;
Result += llvm::utostr(UniqueNameCounter);
return Result;
} else {
TypePlaneMap::iterator TPI = GI->second.find(Ty);
if (TPI != GI->second.end()) {
// We found an existing name of the same old type. This isn't allowed
// in LLVM 2.0. Consequently, we must alter the name of the global so it
// can at least compile. References to the global will yield the first
// definition, which is okay. We also must warn about this.
Result = *Name + ".unique";
UniqueNameCounter++;
Result += llvm::utostr(UniqueNameCounter);
warning(std::string("Global variable '") + *Name + "' was renamed to '"+
Result + "'");
} else {
// There isn't an existing definition for this name according to the
// old types. Now search the TypePlanMap for types with the same new
// name.
TypePlaneMap::iterator TPI = GI->second.begin();
TypePlaneMap::iterator TPE = GI->second.end();
for ( ; TPI != TPE; ++TPI) {
if (TPI->first->sameNewTyAs(Ty)) {
// The new types are the same but the old types are different so
// this is a global name collision resulting from type planes
// collapsing.
if (Linkage == "external" || Linkage == "dllimport" ||
Linkage == "extern_weak" || Linkage == "") {
// The linkage of this gval is external so we can't reliably
// rename it because it could potentially create a linking
// problem. However, we can't leave the name conflict in the
// output either or it won't assemble with LLVM 2.0. So, all we
// can do is rename this one to something unique and emit a
// warning about the problem.
Result = *Name + ".unique";
UniqueNameCounter++;
Result += llvm::utostr(UniqueNameCounter);
warning("Renaming global value '" + *Name + "' to '" + Result +
"' may cause linkage errors.");
return Result;
} else {
// Its linkage is internal and its type is known so we can
// disambiguate the name collision successfully based on the type.
Result = getUniqueName(Name, Ty);
TPI->second = Result;
return Result;
}
}
}
// We didn't find an entry in the type plane with the same new type and
// the old types differ so this is a new type plane for this global
// variable. We just fall through to the logic below which inserts
// the global.
}
}
}
// Its a new global name, if it is external we can't change it
if (isConstant || Linkage == "external" || Linkage == "dllimport" ||
Linkage == "extern_weak" || Linkage == "") {
Globals[Result][Ty] = Result;
return Result;
}
// Its a new global name, and it is internal, change the name to make it
// unique for its type.
// Result = getUniqueName(Name, Ty);
Globals[*Name][Ty] = Result;
return Result;
}
%}
// %file-prefix="UpgradeParser"
%union {
std::string* String;
TypeInfo* Type;
const TypeInfo* Type;
ValueInfo Value;
ConstInfo Const;
ValueList* ValList;
@ -570,17 +911,17 @@ PrimType : BOOL | SBYTE | UBYTE | SHORT | USHORT | INT | UINT ;
PrimType : LONG | ULONG | FLOAT | DOUBLE | LABEL;
UpRTypes
: OPAQUE {
$$ = new TypeInfo($1, OpaqueTy);
$$ = TypeInfo::get(*$1, OpaqueTy);
}
| SymbolicValueRef {
$$ = new TypeInfo($1, UnresolvedTy);
$$ = TypeInfo::get(*$1, UnresolvedTy);
}
| PrimType {
$$ = $1;
}
| '\\' EUINT64VAL { // Type UpReference
$2->insert(0, "\\");
$$ = new TypeInfo($2, UpRefTy);
$$ = TypeInfo::get(*$2, UpRefTy);
}
| UpRTypesV '(' ArgTypeListI ')' { // Function derived type?
std::string newTy( $1->getNewTy() + "(");
@ -593,19 +934,19 @@ UpRTypes
newTy += (*$3)[i]->getNewTy();
}
newTy += ")";
$$ = new TypeInfo(new std::string(newTy), $1, $3);
$$ = TypeInfo::get(newTy, $1, $3);
}
| '[' EUINT64VAL 'x' UpRTypes ']' { // Sized array type?
uint64_t elems = atoi($2->c_str());
$2->insert(0,"[ ");
*$2 += " x " + $4->getNewTy() + " ]";
uint64_t elems = atoi($2->c_str());
$$ = new TypeInfo($2, ArrayTy, $4, elems);
$$ = TypeInfo::get(*$2, ArrayTy, $4, elems);
}
| '<' EUINT64VAL 'x' UpRTypes '>' { // Packed array type?
uint64_t elems = atoi($2->c_str());
$2->insert(0,"< ");
*$2 += " x " + $4->getNewTy() + " >";
uint64_t elems = atoi($2->c_str());
$$ = new TypeInfo($2, PackedTy, $4, elems);
$$ = TypeInfo::get(*$2, PackedTy, $4, elems);
}
| '{' TypeListI '}' { // Structure type?
std::string newTy("{");
@ -615,10 +956,10 @@ UpRTypes
newTy += (*$2)[i]->getNewTy();
}
newTy += "}";
$$ = new TypeInfo(new std::string(newTy), StructTy, $2);
$$ = TypeInfo::get(newTy, StructTy, $2);
}
| '{' '}' { // Empty structure type?
$$ = new TypeInfo(new std::string("{}"), StructTy, new TypeList());
$$ = TypeInfo::get("{}", StructTy, new TypeList());
}
| '<' '{' TypeListI '}' '>' { // Packed Structure type?
std::string newTy("<{");
@ -628,10 +969,10 @@ UpRTypes
newTy += (*$3)[i]->getNewTy();
}
newTy += "}>";
$$ = new TypeInfo(new std::string(newTy), PackedStructTy, $3);
$$ = TypeInfo::get(newTy, PackedStructTy, $3);
}
| '<' '{' '}' '>' { // Empty packed structure type?
$$ = new TypeInfo(new std::string("<{}>"), PackedStructTy, new TypeList());
$$ = TypeInfo::get("<{}>", PackedStructTy, new TypeList());
}
| UpRTypes '*' { // Pointer type?
$$ = $1->getPointerType();
@ -655,12 +996,12 @@ ArgTypeListI
: TypeListI
| TypeListI ',' DOTDOTDOT {
$$ = $1;
$$->push_back(new TypeInfo("void",VoidTy));
$$->push_back(TypeInfo::get("void",VoidTy));
delete $3;
}
| DOTDOTDOT {
$$ = new TypeList();
$$->push_back(new TypeInfo("void",VoidTy));
$$->push_back(TypeInfo::get("void",VoidTy));
delete $1;
}
| /*empty*/ {
@ -720,7 +1061,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
delete $2;
}
| Types SymbolicValueRef {
std::string Name = getUniqueName($2,$1);
std::string Name = getUniqueName($2, $1->resolve(), true);
$$.type = $1;
$$.cnst = new std::string($1->getNewTy());
*$$.cnst += " " + Name;
@ -772,10 +1113,11 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
ConstExpr: CastOps '(' ConstVal TO Types ')' {
std::string source = *$3.cnst;
TypeInfo* DstTy = ResolveType($5);
const TypeInfo* SrcTy = $3.type->resolve();
const TypeInfo* DstTy = $5->resolve();
if (*$1 == "cast") {
// Call getCastUpgrade to upgrade the old cast
$$ = new std::string(getCastUpgrade(source, $3.type, DstTy, true));
$$ = new std::string(getCastUpgrade(source, SrcTy, DstTy, true));
} else {
// Nothing to upgrade, just create the cast constant expr
$$ = new std::string(*$1);
@ -902,9 +1244,9 @@ External : EXTERNAL | UNINITIALIZED { $$ = $1; *$$ = "external"; }
// ConstPool - Constants with optional names assigned to them.
ConstPool : ConstPool OptAssign TYPE TypesV {
EnumeratedTypes.push_back(*$4);
EnumeratedTypes.push_back($4);
if (!$2->empty()) {
NamedTypes[*$2] = *$4;
NamedTypes[*$2] = $4;
*O << *$2 << " = ";
}
*O << "type " << $4->getNewTy() << '\n';
@ -923,9 +1265,9 @@ ConstPool : ConstPool OptAssign TYPE TypesV {
}
| ConstPool OptAssign OptLinkage GlobalType ConstVal GlobalVarAttributes {
if (!$2->empty()) {
std::string Name = getUniqueName($2,$5.type);
std::string Name = getGlobalName($2,*$3, $5.type->getPointerType(),
*$4 == "constant");
*O << Name << " = ";
Globals[Name] = *$5.type;
}
*O << *$3 << ' ' << *$4 << ' ' << *$5.cnst << ' ' << *$6 << '\n';
delete $2; delete $3; delete $4; delete $6;
@ -933,19 +1275,19 @@ ConstPool : ConstPool OptAssign TYPE TypesV {
}
| ConstPool OptAssign External GlobalType Types GlobalVarAttributes {
if (!$2->empty()) {
std::string Name = getUniqueName($2,$5);
std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
*$4 == "constant");
*O << Name << " = ";
Globals[Name] = *$5;
}
*O << *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
delete $2; delete $3; delete $4; delete $6;
$$ = 0;
}
| ConstPool OptAssign DLLIMPORT GlobalType Types GlobalVarAttributes {
| ConstPool OptAssign DLLIMPORT GlobalType Types GlobalVarAttributes {
if (!$2->empty()) {
std::string Name = getUniqueName($2,$5);
std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
*$4 == "constant");
*O << Name << " = ";
Globals[Name] = *$5;
}
*O << *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
delete $2; delete $3; delete $4; delete $6;
@ -953,9 +1295,9 @@ ConstPool : ConstPool OptAssign TYPE TypesV {
}
| ConstPool OptAssign EXTERN_WEAK GlobalType Types GlobalVarAttributes {
if (!$2->empty()) {
std::string Name = getUniqueName($2,$5);
std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
*$4 == "constant");
*O << Name << " = ";
Globals[Name] = *$5;
}
*O << *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
delete $2; delete $3; delete $4; delete $6;
@ -1032,7 +1374,7 @@ OptName : Name | /*empty*/ { $$ = new std::string(); };
ArgVal : Types OptName {
$$ = new std::string($1->getNewTy());
if (!$2->empty()) {
std::string Name = getUniqueName($2, $1);
std::string Name = getUniqueName($2, $1->resolve());
*$$ += " " + Name;
}
delete $2;
@ -1152,12 +1494,12 @@ ValueRef
: SymbolicValueRef {
$$.val = $1;
$$.constant = false;
$$.type = new TypeInfo();
$$.type = 0;
}
| ConstValueRef {
$$.val = $1;
$$.constant = true;
$$.type = new TypeInfo();
$$.type = 0;
}
;
@ -1165,11 +1507,10 @@ ValueRef
// type immediately preceeds the value reference, and allows complex constant
// pool references (for things like: 'ret [2 x int] [ int 12, int 42]')
ResolvedVal : Types ValueRef {
ResolveType($1);
$1 = $1->resolve();
std::string Name = getUniqueName($2.val, $1);
$$ = $2;
delete $$.val;
delete $$.type;
$$.val = new std::string($1->getNewTy() + " " + Name);
$$.type = $1;
};
@ -1212,12 +1553,12 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
}
| RET VOID { // Return with no result...
*O << " " << *$1 << ' ' << $2->getNewTy() << '\n';
delete $1; delete $2;
delete $1;
$$ = 0;
}
| BR LABEL ValueRef { // Unconditional Branch...
*O << " " << *$1 << ' ' << $2->getNewTy() << ' ' << *$3.val << '\n';
delete $1; delete $2; $3.destroy();
delete $1; $3.destroy();
$$ = 0;
} // Conditional Branch...
| BR BOOL ValueRef ',' LABEL ValueRef ',' LABEL ValueRef {
@ -1225,15 +1566,14 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
*O << " " << *$1 << ' ' << $2->getNewTy() << ' ' << Name << ", "
<< $5->getNewTy() << ' ' << *$6.val << ", " << $8->getNewTy() << ' '
<< *$9.val << '\n';
delete $1; delete $2; $3.destroy(); delete $5; $6.destroy();
delete $8; $9.destroy();
delete $1; $3.destroy(); $6.destroy(); $9.destroy();
$$ = 0;
}
| SWITCH IntType ValueRef ',' LABEL ValueRef '[' JumpTable ']' {
std::string Name = getUniqueName($3.val, $2);
*O << " " << *$1 << ' ' << $2->getNewTy() << ' ' << Name << ", "
<< $5->getNewTy() << ' ' << *$6.val << " [" << *$8 << " ]\n";
delete $1; delete $2; $3.destroy(); delete $5; $6.destroy();
delete $1; $3.destroy(); $6.destroy();
delete $8;
$$ = 0;
}
@ -1241,12 +1581,12 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
std::string Name = getUniqueName($3.val, $2);
*O << " " << *$1 << ' ' << $2->getNewTy() << ' ' << Name << ", "
<< $5->getNewTy() << ' ' << *$6.val << "[]\n";
delete $1; delete $2; $3.destroy(); delete $5; $6.destroy();
delete $1; $3.destroy(); $6.destroy();
$$ = 0;
}
| OptAssign INVOKE OptCallingConv TypesV ValueRef '(' ValueRefListE ')'
TO LABEL ValueRef Unwind LABEL ValueRef {
TypeInfo* ResTy = getFunctionReturnType($4);
const TypeInfo* ResTy = getFunctionReturnType($4);
*O << " ";
if (!$1->empty()) {
std::string Name = getUniqueName($1, ResTy);
@ -1262,9 +1602,8 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
}
*O << ") " << *$9 << ' ' << $10->getNewTy() << ' ' << *$11.val << ' '
<< *$12 << ' ' << $13->getNewTy() << ' ' << *$14.val << '\n';
delete $1; delete $2; delete $3; delete $4; $5.destroy(); delete $7;
delete $9; delete $10; $11.destroy(); delete $12; delete $13;
$14.destroy();
delete $1; delete $2; delete $3; $5.destroy(); delete $7;
delete $9; $11.destroy(); delete $12; $14.destroy();
$$ = 0;
}
| Unwind {
@ -1281,26 +1620,26 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
JumpTable : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
*$1 += " " + $2->getNewTy() + " " + *$3 + ", " + $5->getNewTy() + " " +
*$6.val;
delete $2; delete $3; delete $5; $6.destroy();
delete $3; $6.destroy();
$$ = $1;
}
| IntType ConstValueRef ',' LABEL ValueRef {
$2->insert(0, $1->getNewTy() + " " );
*$2 += ", " + $4->getNewTy() + " " + *$5.val;
delete $1; delete $4; $5.destroy();
$5.destroy();
$$ = $2;
};
Inst
: OptAssign InstVal {
if (!$1->empty()) {
if (deleteUselessCastFlag && *deleteUselessCastName == *$1) {
*$1 += " = ";
$1->insert(0, "; "); // don't actually delete it, just comment it out
// Get a unique name for this value, based on its type.
std::string Name = getUniqueName($1, $2.type);
*$1 = Name + " = ";
if (deleteUselessCastFlag && *deleteUselessCastName == Name) {
// don't actually delete it, just comment it out
$1->insert(0, "; USELSS BITCAST: ");
delete deleteUselessCastName;
} else {
// Get a unique name for the name of this value, based on its type.
*$1 = getUniqueName($1, $2.type) + " = ";
}
}
*$1 += *$2.val;
@ -1374,7 +1713,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
*$1 = getCompareOp(*$1, $2);
*$1 += " " + $2->getNewTy() + " " + Name1 + ", " + Name2;
$$.val = $1;
$$.type = new TypeInfo("bool",BoolTy);
$$.type = TypeInfo::get("bool",BoolTy);
$3.destroy(); $5.destroy();
}
| ICMP IPredicates Types ValueRef ',' ValueRef {
@ -1382,7 +1721,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
std::string Name2 = getUniqueName($6.val, $3);
*$1 += " " + *$2 + " " + $3->getNewTy() + " " + Name1 + "," + Name2;
$$.val = $1;
$$.type = new TypeInfo("bool",BoolTy);
$$.type = TypeInfo::get("bool",BoolTy);
delete $2; $4.destroy(); $6.destroy();
}
| FCMP FPredicates Types ValueRef ',' ValueRef {
@ -1390,7 +1729,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
std::string Name2 = getUniqueName($6.val, $3);
*$1 += " " + *$2 + " " + $3->getNewTy() + " " + Name1 + "," + Name2;
$$.val = $1;
$$.type = new TypeInfo("bool",BoolTy);
$$.type = TypeInfo::get("bool",BoolTy);
delete $2; $4.destroy(); $6.destroy();
}
| NOT ResolvedVal {
@ -1409,21 +1748,21 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
}
| CastOps ResolvedVal TO Types {
std::string source = *$2.val;
TypeInfo* SrcTy = $2.type;
TypeInfo* DstTy = ResolveType($4);
const TypeInfo* SrcTy = $2.type->resolve();
const TypeInfo* DstTy = $4->resolve();
$$.val = new std::string();
$$.type = DstTy;
if (*$1 == "cast") {
*$$.val += getCastUpgrade(source, SrcTy, DstTy, false);
*$$.val += getCastUpgrade(source, SrcTy, DstTy, false);
} else {
*$$.val += *$1 + " " + source + " to " + DstTy->getNewTy();
}
$$.type = $4;
// Check to see if this is a useless cast of a value to the same name
// and the same type. Such casts will probably cause redefinition errors
// when assembled and perform no code gen action so just remove them.
if (*$1 == "cast" || *$1 == "bitcast")
if ($2.type->isInteger() && DstTy->isInteger() &&
$2.type->getBitWidth() == DstTy->getBitWidth()) {
if (SrcTy->isInteger() && DstTy->isInteger() &&
SrcTy->getBitWidth() == DstTy->getBitWidth()) {
deleteUselessCastFlag = true; // Flag the "Inst" rule
deleteUselessCastName = new std::string(*$2.val); // save the name
size_t pos = deleteUselessCastName->find_first_of("%\"",0);
@ -1450,7 +1789,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
| EXTRACTELEMENT ResolvedVal ',' ResolvedVal {
*$1 += " " + *$2.val + ", " + *$4.val;
$$.val = $1;
ResolveType($2.type);
$2.type = $2.type->resolve();;
$$.type = $2.type->getElementType();
delete $2.val; $4.destroy();
}
@ -1488,7 +1827,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
*$1 += ")";
$$.val = $1;
$$.type = getFunctionReturnType($3);
delete $2; delete $3; $4.destroy(); delete $6;
delete $2; $4.destroy(); delete $6;
}
| MemoryInst ;
@ -1510,7 +1849,7 @@ MemoryInst : MALLOC Types OptCAlign {
*$1 += " " + *$3;
$$.val = $1;
$$.type = $2->getPointerType();
delete $2; delete $3;
delete $3;
}
| MALLOC Types ',' UINT ValueRef OptCAlign {
std::string Name = getUniqueName($5.val, $4);
@ -1519,7 +1858,7 @@ MemoryInst : MALLOC Types OptCAlign {
*$1 += " " + *$6;
$$.val = $1;
$$.type = $2->getPointerType();
delete $2; delete $4; $5.destroy(); delete $6;
$5.destroy(); delete $6;
}
| ALLOCA Types OptCAlign {
*$1 += " " + $2->getNewTy();
@ -1527,7 +1866,7 @@ MemoryInst : MALLOC Types OptCAlign {
*$1 += " " + *$3;
$$.val = $1;
$$.type = $2->getPointerType();
delete $2; delete $3;
delete $3;
}
| ALLOCA Types ',' UINT ValueRef OptCAlign {
std::string Name = getUniqueName($5.val, $4);
@ -1536,12 +1875,12 @@ MemoryInst : MALLOC Types OptCAlign {
*$1 += " " + *$6;
$$.val = $1;
$$.type = $2->getPointerType();
delete $2; delete $4; $5.destroy(); delete $6;
$5.destroy(); delete $6;
}
| FREE ResolvedVal {
*$1 += " " + *$2.val;
$$.val = $1;
$$.type = new TypeInfo("void", VoidTy);
$$.type = TypeInfo::get("void", VoidTy);
$2.destroy();
}
| OptVolatile LOAD Types ValueRef {
@ -1550,8 +1889,8 @@ MemoryInst : MALLOC Types OptCAlign {
*$1 += " ";
*$1 += *$2 + " " + $3->getNewTy() + " " + Name;
$$.val = $1;
$$.type = $3->getElementType()->clone();
delete $2; delete $3; $4.destroy();
$$.type = $3->getElementType();
delete $2; $4.destroy();
}
| OptVolatile STORE ResolvedVal ',' Types ValueRef {
std::string Name = getUniqueName($6.val, $5);
@ -1559,8 +1898,8 @@ MemoryInst : MALLOC Types OptCAlign {
*$1 += " ";
*$1 += *$2 + " " + *$3.val + ", " + $5->getNewTy() + " " + Name;
$$.val = $1;
$$.type = new TypeInfo("void", VoidTy);
delete $2; $3.destroy(); delete $5; $6.destroy();
$$.type = TypeInfo::get("void", VoidTy);
delete $2; $3.destroy(); $6.destroy();
}
| GETELEMENTPTR Types ValueRef IndexList {
std::string Name = getUniqueName($3.val, $2);
@ -1573,7 +1912,7 @@ MemoryInst : MALLOC Types OptCAlign {
*O << " %gep_upgrade" << unique << " = zext " << *old
<< " to i64\n";
VI.val = new std::string("i64 %gep_upgrade" + llvm::utostr(unique++));
VI.type->setOldTy(ULongTy);
VI.type = TypeInfo::get("i64",ULongTy);
}
}
*$1 += " " + $2->getNewTy() + " " + Name;
@ -1592,7 +1931,8 @@ int yyerror(const char *ErrorMsg) {
std::string where
= std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
+ ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
std::string errMsg = std::string(ErrorMsg) + "\n" + where + " while reading ";
std::string errMsg = where + "error: " + std::string(ErrorMsg) +
" while reading ";
if (yychar == YYEMPTY || yychar == 0)
errMsg += "end-of-file.";
else
@ -1601,3 +1941,16 @@ int yyerror(const char *ErrorMsg) {
*O << "llvm-upgrade parse failed.\n";
exit(1);
}
static void warning(const std::string& ErrorMsg) {
std::string where
= std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
+ ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
std::string errMsg = where + "warning: " + std::string(ErrorMsg) +
" while reading ";
if (yychar == YYEMPTY || yychar == 0)
errMsg += "end-of-file.";
else
errMsg += "token: '" + std::string(Upgradetext, Upgradeleng) + "'";
std::cerr << "llvm-upgrade: " << errMsg << '\n';
}