summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2007-01-26 08:19:09 +0000
committerReid Spencer <rspencer@reidspencer.com>2007-01-26 08:19:09 +0000
commit950bf6030101d670ea205efd307ea5d3b375544d (patch)
treedcc8bdebff4129d0d919ae5ea53bb45af9d32fba
parentefd53d57a6606bfe0549a7e4bd1f29c5582d5b75 (diff)
Regenerate.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33532 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--tools/llvm-upgrade/Makefile2
-rw-r--r--tools/llvm-upgrade/UpgradeLexer.cpp.cvs1844
-rw-r--r--tools/llvm-upgrade/UpgradeLexer.l.cvs479
-rw-r--r--tools/llvm-upgrade/UpgradeParser.cpp.cvs7920
-rw-r--r--tools/llvm-upgrade/UpgradeParser.h.cvs490
-rw-r--r--tools/llvm-upgrade/UpgradeParser.y.cvs4628
-rw-r--r--tools/llvm-upgrade/llvm-upgrade.cpp23
7 files changed, 9230 insertions, 6156 deletions
diff --git a/tools/llvm-upgrade/Makefile b/tools/llvm-upgrade/Makefile
index 0f4440787b..b20da76b60 100644
--- a/tools/llvm-upgrade/Makefile
+++ b/tools/llvm-upgrade/Makefile
@@ -9,7 +9,7 @@
LEVEL = ../..
TOOLNAME = llvm-upgrade
-LINK_COMPONENTS := support system
+LINK_COMPONENTS := BCWriter Core support system
REQUIRES_EH := 1
include $(LEVEL)/Makefile.common
diff --git a/tools/llvm-upgrade/UpgradeLexer.cpp.cvs b/tools/llvm-upgrade/UpgradeLexer.cpp.cvs
index bbdec8ba02..9720d6f301 100644
--- a/tools/llvm-upgrade/UpgradeLexer.cpp.cvs
+++ b/tools/llvm-upgrade/UpgradeLexer.cpp.cvs
@@ -317,39 +317,39 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
*yy_cp = '\0'; \
yy_c_buf_p = yy_cp;
-#define YY_NUM_RULES 157
-#define YY_END_OF_BUFFER 158
-static yyconst short int yy_acclist[235] =
+#define YY_NUM_RULES 156
+#define YY_END_OF_BUFFER 157
+static yyconst short int yy_acclist[234] =
{ 0,
- 158, 156, 157, 155, 156, 157, 155, 157, 156, 157,
- 156, 157, 156, 157, 156, 157, 156, 157, 156, 157,
- 148, 156, 157, 148, 156, 157, 1, 156, 157, 156,
- 157, 156, 157, 156, 157, 156, 157, 156, 157, 156,
- 157, 156, 157, 156, 157, 156, 157, 156, 157, 156,
- 157, 156, 157, 156, 157, 156, 157, 156, 157, 156,
- 157, 156, 157, 156, 157, 156, 157, 156, 157, 156,
- 157, 147, 145, 144, 144, 151, 149, 153, 148, 1,
- 129, 39, 87, 56, 88, 77, 23, 147, 144, 144,
- 152, 153, 20, 153, 154, 65, 76, 37, 32, 40,
-
- 68, 3, 57, 58, 59, 52, 67, 93, 98, 96,
- 97, 95, 94, 99, 107, 72, 128, 92, 90, 123,
- 124, 91, 89, 66, 101, 106, 104, 105, 103, 102,
- 100, 78, 146, 153, 153, 125, 47, 108, 109, 86,
- 71, 137, 75, 85, 138, 54, 126, 22, 150, 70,
- 112, 74, 24, 4, 64, 69, 53, 73, 46, 11,
- 111, 153, 34, 2, 5, 60, 114, 62, 48, 80,
- 84, 82, 83, 81, 79, 50, 139, 110, 49, 55,
- 21, 136, 43, 61, 28, 133, 42, 116, 115, 7,
- 131, 31, 135, 36, 63, 122, 118, 130, 25, 26,
-
- 117, 132, 51, 127, 121, 41, 6, 27, 113, 35,
- 8, 16, 9, 120, 10, 119, 33, 12, 14, 13,
- 30, 38, 15, 29, 134, 140, 142, 143, 17, 44,
- 141, 18, 45, 19
+ 157, 155, 156, 154, 155, 156, 154, 156, 155, 156,
+ 155, 156, 155, 156, 155, 156, 155, 156, 155, 156,
+ 147, 155, 156, 147, 155, 156, 1, 155, 156, 155,
+ 156, 155, 156, 155, 156, 155, 156, 155, 156, 155,
+ 156, 155, 156, 155, 156, 155, 156, 155, 156, 155,
+ 156, 155, 156, 155, 156, 155, 156, 155, 156, 155,
+ 156, 155, 156, 155, 156, 155, 156, 155, 156, 155,
+ 156, 146, 144, 143, 143, 150, 148, 152, 147, 1,
+ 129, 41, 85, 86, 75, 23, 146, 143, 143, 151,
+ 152, 20, 152, 153, 63, 74, 39, 34, 42, 66,
+
+ 3, 52, 65, 25, 95, 100, 98, 99, 97, 96,
+ 101, 105, 70, 128, 90, 88, 121, 122, 89, 87,
+ 64, 103, 94, 92, 93, 91, 104, 102, 76, 145,
+ 152, 152, 124, 57, 106, 107, 84, 69, 136, 73,
+ 83, 137, 54, 123, 22, 149, 68, 110, 72, 26,
+ 4, 61, 67, 53, 71, 56, 11, 109, 152, 36,
+ 2, 5, 58, 112, 60, 48, 78, 82, 80, 81,
+ 79, 77, 50, 138, 108, 49, 55, 21, 126, 135,
+ 45, 59, 30, 24, 44, 114, 113, 7, 131, 33,
+ 134, 38, 62, 120, 116, 130, 27, 28, 115, 132,
+
+ 51, 127, 125, 119, 43, 6, 29, 111, 37, 8,
+ 17, 9, 118, 10, 117, 35, 12, 14, 13, 32,
+ 40, 15, 31, 133, 139, 141, 142, 16, 46, 140,
+ 18, 47, 19
} ;
-static yyconst short int yy_accept[609] =
+static yyconst short int yy_accept[611] =
{ 0,
1, 1, 1, 2, 4, 7, 9, 11, 13, 15,
17, 19, 21, 24, 27, 30, 32, 34, 36, 38,
@@ -359,65 +359,65 @@ static yyconst short int yy_accept[609] =
81, 81, 81, 81, 81, 81, 81, 81, 81, 82,
82, 83, 83, 83, 83, 83, 83, 83, 83, 83,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 86, 86, 86, 86, 86, 86,
-
- 86, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 89, 90, 92,
- 93, 94, 95, 95, 96, 97, 97, 97, 98, 98,
- 98, 99, 99, 100, 100, 100, 100, 100, 101, 101,
- 101, 101, 101, 101, 101, 102, 102, 102, 103, 103,
- 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
- 103, 104, 105, 106, 106, 106, 106, 107, 107, 107,
- 107, 107, 107, 107, 107, 107, 107, 108, 108, 109,
-
- 110, 111, 112, 113, 114, 114, 115, 116, 116, 116,
- 117, 118, 118, 118, 118, 118, 118, 118, 118, 119,
- 120, 121, 121, 122, 122, 122, 122, 123, 124, 124,
- 124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 126, 127, 128, 128, 128, 129, 129, 130, 130, 131,
- 131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 133, 133, 133, 134, 135, 135, 135, 135, 136,
- 136, 136, 136, 137, 137, 137, 138, 139, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 141, 142, 142, 142, 142, 142,
-
- 143, 144, 144, 144, 145, 145, 145, 145, 145, 145,
- 145, 145, 145, 146, 147, 148, 148, 148, 149, 149,
- 149, 149, 150, 150, 151, 151, 151, 151, 151, 151,
- 151, 152, 152, 152, 152, 152, 153, 153, 153, 154,
- 154, 154, 155, 155, 156, 156, 157, 158, 158, 158,
- 158, 158, 158, 158, 159, 159, 159, 160, 160, 161,
- 161, 161, 162, 163, 164, 164, 164, 165, 165, 165,
- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
- 165, 165, 166, 166, 167, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
-
- 169, 169, 169, 169, 170, 170, 170, 171, 172, 173,
- 174, 175, 176, 177, 177, 177, 177, 178, 178, 178,
- 178, 179, 180, 180, 181, 182, 182, 182, 182, 182,
- 182, 182, 182, 182, 182, 183, 183, 183, 184, 184,
- 184, 184, 184, 184, 184, 184, 185, 186, 187, 187,
- 187, 188, 189, 190, 190, 190, 191, 191, 191, 191,
- 191, 192, 192, 193, 194, 195, 196, 196, 196, 196,
- 197, 197, 197, 198, 199, 200, 201, 202, 202, 202,
- 203, 204, 205, 205, 205, 205, 205, 205, 206, 206,
- 207, 207, 208, 209, 209, 209, 209, 209, 209, 210,
-
- 210, 210, 210, 210, 210, 210, 210, 210, 211, 211,
- 211, 211, 211, 211, 211, 211, 211, 211, 212, 212,
- 212, 212, 212, 213, 213, 213, 213, 213, 214, 215,
- 216, 216, 217, 217, 217, 217, 217, 218, 218, 218,
- 218, 219, 219, 220, 221, 221, 221, 221, 221, 221,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 85, 85, 85, 85, 85, 85, 85, 85, 86, 86,
+
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 88, 89, 91, 92, 93, 94,
+ 94, 95, 96, 96, 96, 97, 97, 97, 98, 98,
+ 99, 99, 99, 99, 99, 100, 100, 100, 100, 100,
+ 100, 100, 101, 101, 101, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 104, 105, 105, 106, 107, 108, 109, 110, 111,
+
+ 111, 112, 113, 113, 113, 114, 115, 115, 115, 115,
+ 115, 115, 115, 115, 116, 117, 118, 118, 119, 119,
+ 119, 119, 120, 121, 121, 121, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 123, 124, 125, 125, 125,
+ 126, 126, 127, 127, 128, 128, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+ 130, 131, 132, 132, 132, 132, 133, 133, 133, 133,
+ 134, 134, 134, 135, 136, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 138, 139, 139, 139, 139, 139, 140, 141, 141,
+
+ 141, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 143, 144, 145, 145, 145, 146, 146, 146, 146, 147,
+ 147, 148, 148, 148, 148, 148, 148, 148, 149, 149,
+ 149, 149, 149, 150, 150, 150, 151, 151, 151, 152,
+ 152, 153, 153, 154, 155, 155, 155, 155, 155, 155,
+ 155, 156, 156, 156, 156, 156, 157, 157, 158, 158,
+ 158, 159, 160, 161, 161, 161, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 163, 163, 164, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 166, 166, 166, 166, 166,
+
+ 166, 166, 166, 167, 167, 167, 168, 169, 170, 171,
+ 172, 173, 174, 174, 174, 174, 175, 175, 175, 175,
+ 176, 177, 177, 178, 179, 179, 179, 179, 179, 179,
+ 180, 180, 180, 180, 180, 180, 181, 181, 181, 182,
+ 182, 182, 182, 182, 182, 182, 182, 183, 184, 185,
+ 185, 185, 186, 187, 188, 188, 188, 189, 189, 189,
+ 189, 189, 190, 190, 191, 192, 193, 194, 194, 194,
+ 194, 195, 195, 195, 196, 197, 198, 199, 200, 200,
+ 200, 201, 202, 203, 204, 204, 204, 204, 204, 204,
+ 205, 205, 206, 206, 207, 208, 208, 208, 208, 208,
+
+ 208, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+ 210, 210, 210, 210, 210, 210, 210, 210, 210, 210,
+ 211, 211, 211, 211, 211, 212, 212, 212, 212, 212,
+ 213, 214, 215, 215, 216, 216, 216, 216, 216, 217,
+ 217, 217, 217, 218, 218, 219, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
221, 221, 221, 221, 221, 221, 221, 221, 222, 222,
- 222, 222, 222, 222, 222, 222, 223, 223, 223, 223,
- 223, 223, 224, 224, 224, 224, 224, 225, 225, 225,
- 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 227, 227, 228, 229, 230, 230,
+ 222, 222, 222, 222, 223, 223, 223, 223, 223, 224,
+ 224, 224, 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 225, 226, 226, 227, 228,
- 231, 231, 232, 233, 234, 234, 235, 235
+ 229, 229, 230, 230, 231, 232, 233, 233, 234, 234
} ;
static yyconst int yy_ec[256] =
@@ -426,16 +426,16 @@ static yyconst int yy_ec[256] =
1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 4, 1, 5, 6, 1, 1, 1,
- 1, 1, 7, 1, 8, 9, 1, 10, 11, 12,
- 13, 14, 15, 16, 15, 17, 15, 18, 19, 1,
- 1, 1, 1, 1, 20, 20, 20, 20, 21, 20,
+ 1, 1, 7, 1, 8, 9, 1, 10, 11, 11,
+ 11, 11, 11, 12, 11, 13, 11, 14, 15, 1,
+ 1, 1, 1, 1, 16, 16, 16, 16, 17, 16,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 1, 1, 1, 1, 22, 1, 23, 24, 25, 26,
+ 1, 1, 1, 1, 18, 1, 19, 20, 21, 22,
- 27, 28, 29, 30, 31, 5, 32, 33, 34, 35,
- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
- 46, 47, 1, 1, 1, 1, 1, 1, 1, 1,
+ 23, 24, 25, 26, 27, 5, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -452,291 +452,291 @@ static yyconst int yy_ec[256] =
1, 1, 1, 1, 1
} ;
-static yyconst int yy_meta[48] =
+static yyconst int yy_meta[44] =
{ 0,
- 1, 1, 2, 1, 3, 1, 4, 5, 3, 6,
- 6, 6, 6, 6, 6, 6, 6, 7, 1, 3,
- 8, 3, 3, 3, 3, 3, 8, 3, 3, 3,
+ 1, 1, 2, 1, 3, 1, 1, 3, 3, 3,
+ 3, 3, 3, 4, 1, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3
+ 3, 3, 3
} ;
-static yyconst short int yy_base[617] =
+static yyconst short int yy_base[615] =
{ 0,
- 0, 0, 1298, 1299, 1299, 1299, 1293, 1278, 40, 0,
- 48, 58, 68, 1250, 0, 68, 71, 81, 91, 52,
- 105, 93, 134, 117, 118, 73, 137, 143, 98, 175,
- 144, 210, 159, 116, 56, 119, 1290, 1299, 1275, 1299,
- 0, 241, 0, 1283, 1282, 140, 249, 1245, 267, 0,
- 70, 163, 145, 31, 157, 160, 168, 57, 1271, 170,
- 94, 180, 182, 54, 193, 189, 194, 114, 205, 1270,
- 271, 207, 204, 211, 208, 279, 206, 228, 249, 53,
- 121, 254, 1269, 268, 280, 281, 283, 290, 291, 285,
- 286, 287, 300, 1268, 305, 292, 309, 310, 314, 293,
-
- 316, 217, 317, 321, 311, 147, 322, 325, 328, 331,
- 341, 329, 344, 336, 339, 358, 347, 348, 1267, 363,
- 349, 346, 366, 370, 371, 372, 373, 384, 377, 388,
- 253, 398, 378, 401, 385, 403, 1266, 0, 0, 372,
- 1265, 0, 442, 0, 1264, 404, 407, 1263, 408, 412,
- 1262, 409, 1261, 414, 427, 428, 423, 1260, 418, 429,
- 444, 445, 447, 448, 1259, 452, 449, 454, 457, 459,
- 456, 458, 460, 464, 469, 255, 470, 476, 473, 471,
- 1258, 1257, 1256, 475, 472, 484, 486, 483, 490, 496,
- 497, 498, 500, 502, 503, 504, 1255, 507, 1254, 1253,
-
- 1252, 1251, 1250, 1249, 505, 1248, 1247, 512, 508, 1246,
- 1245, 540, 517, 516, 521, 515, 551, 530, 1244, 1243,
- 1242, 552, 1241, 554, 556, 557, 1240, 1239, 555, 558,
- 1238, 559, 561, 563, 567, 572, 569, 570, 577, 1237,
- 1236, 1235, 580, 583, 1234, 587, 1233, 585, 1232, 588,
- 1231, 590, 513, 584, 591, 514, 598, 592, 596, 416,
- 1230, 595, 607, 1299, 605, 622, 626, 628, 630, 621,
- 622, 623, 1229, 624, 626, 1228, 1227, 1226, 625, 627,
- 628, 633, 634, 636, 635, 637, 642, 647, 644, 643,
- 654, 646, 658, 1225, 1224, 645, 656, 660, 661, 1223,
-
- 1222, 666, 667, 1221, 669, 670, 671, 675, 673, 674,
- 676, 680, 1220, 1219, 1218, 683, 688, 1217, 686, 677,
- 690, 0, 696, 1216, 698, 697, 699, 706, 707, 709,
- 1215, 702, 712, 714, 717, 1214, 724, 713, 1213, 726,
- 721, 1212, 731, 1211, 728, 1210, 1209, 732, 734, 739,
- 740, 741, 743, 1208, 744, 747, 1207, 748, 1206, 751,
- 750, 1205, 0, 1204, 752, 754, 1203, 755, 759, 764,
- 767, 770, 758, 772, 776, 780, 781, 783, 782, 784,
- 785, 1202, 786, 1201, 1200, 789, 791, 794, 787, 788,
- 797, 798, 806, 807, 808, 1199, 810, 809, 812, 815,
-
- 816, 820, 822, 1198, 814, 828, 1197, 1196, 1195, 1194,
- 1193, 1192, 1191, 830, 831, 833, 1190, 834, 836, 838,
- 1189, 1188, 837, 1187, 1186, 839, 842, 840, 843, 844,
- 850, 853, 854, 857, 1185, 860, 861, 1184, 864, 865,
- 867, 869, 868, 870, 871, 1183, 1182, 1181, 875, 876,
- 1180, 1179, 1178, 885, 882, 1177, 887, 891, 897, 883,
- 1176, 886, 1175, 1174, 1173, 1172, 894, 901, 903, 1171,
- 904, 907, 1170, 1169, 1168, 1167, 1166, 908, 910, 1165,
- 1164, 1163, 909, 905, 911, 912, 914, 1162, 916, 1161,
- 923, 1160, 1159, 926, 928, 929, 930, 933, 1158, 934,
-
- 935, 936, 938, 937, 948, 932, 940, 1157, 944, 950,
- 956, 960, 962, 964, 966, 967, 968, 1156, 946, 972,
- 974, 975, 1155, 976, 977, 978, 980, 1150, 1147, 1144,
- 983, 1136, 993, 981, 985, 986, 1133, 998, 999, 1003,
- 1130, 1006, 1124, 1113, 1007, 1008, 1009, 1010, 1011, 1013,
- 1014, 1018, 1020, 1019, 1023, 1022, 1025, 1111, 1024, 1031,
- 1026, 1035, 1039, 1040, 1036, 1109, 1043, 1044, 1046, 1050,
- 1051, 1108, 1054, 1052, 1055, 1056, 1106, 1060, 1062, 1104,
- 1064, 1067, 1057, 1069, 1076, 1077, 1080, 1081, 1082, 1084,
- 1085, 1083, 1087, 1101, 1088, 1100, 1099, 1094, 1089, 982,
-
- 1098, 756, 527, 419, 1093, 326, 1299, 1132, 1138, 1144,
- 268, 1152, 1158, 123, 1161, 1166
+ 0, 0, 1308, 1309, 1309, 1309, 1303, 1292, 36, 40,
+ 44, 50, 56, 62, 0, 63, 66, 81, 89, 47,
+ 108, 91, 105, 96, 119, 117, 144, 128, 68, 170,
+ 169, 202, 92, 111, 131, 125, 1301, 1309, 1290, 1309,
+ 0, 207, 229, 234, 239, 70, 244, 259, 264, 0,
+ 139, 145, 142, 76, 136, 156, 157, 31, 1289, 162,
+ 164, 192, 48, 172, 268, 175, 173, 221, 212, 1288,
+ 276, 278, 138, 186, 72, 279, 277, 280, 289, 249,
+ 282, 290, 216, 281, 291, 189, 294, 284, 295, 1287,
+ 297, 306, 73, 305, 316, 317, 246, 311, 318, 322,
+
+ 323, 324, 327, 329, 330, 338, 332, 348, 350, 333,
+ 337, 334, 362, 336, 364, 1286, 367, 351, 359, 371,
+ 374, 379, 375, 381, 405, 386, 389, 403, 396, 378,
+ 250, 376, 400, 1285, 0, 436, 440, 1284, 454, 471,
+ 0, 1283, 382, 406, 1282, 410, 425, 1281, 415, 1280,
+ 422, 430, 440, 456, 1279, 458, 459, 473, 412, 447,
+ 460, 1278, 474, 442, 472, 477, 480, 476, 461, 478,
+ 416, 488, 490, 491, 494, 495, 496, 492, 499, 506,
+ 507, 500, 513, 505, 508, 520, 521, 523, 524, 525,
+ 1277, 1276, 526, 1275, 1274, 1273, 1272, 1271, 1270, 527,
+
+ 1269, 1268, 529, 533, 1267, 1266, 561, 538, 537, 542,
+ 534, 572, 550, 1265, 1264, 1263, 553, 1262, 535, 575,
+ 536, 1261, 1260, 576, 577, 1259, 555, 579, 540, 580,
+ 586, 582, 585, 588, 1258, 1257, 1256, 593, 596, 1255,
+ 590, 1254, 597, 1253, 600, 1252, 601, 602, 604, 605,
+ 619, 609, 612, 618, 622, 611, 214, 1251, 628, 629,
+ 1309, 635, 643, 651, 657, 662, 651, 663, 664, 1250,
+ 665, 666, 1249, 1248, 1247, 667, 669, 672, 673, 675,
+ 676, 677, 678, 683, 679, 686, 685, 691, 690, 693,
+ 1246, 1245, 687, 697, 701, 702, 1244, 1243, 703, 707,
+
+ 1242, 708, 709, 711, 713, 714, 719, 715, 721, 1241,
+ 1240, 1239, 722, 724, 1238, 727, 729, 735, 0, 737,
+ 1237, 741, 738, 742, 747, 748, 749, 1236, 743, 635,
+ 750, 755, 1235, 760, 761, 1234, 763, 764, 1233, 767,
+ 1232, 773, 1231, 1230, 775, 776, 778, 777, 781, 780,
+ 1229, 783, 784, 789, 791, 1228, 792, 1227, 798, 793,
+ 1226, 813, 1225, 794, 795, 1224, 801, 807, 816, 817,
+ 822, 813, 796, 819, 825, 826, 828, 829, 830, 832,
+ 1223, 833, 1222, 1221, 836, 837, 831, 842, 841, 843,
+ 846, 853, 854, 855, 1220, 857, 858, 861, 862, 863,
+
+ 866, 865, 1219, 876, 860, 1218, 1217, 1216, 1215, 1214,
+ 1213, 1212, 877, 879, 880, 1211, 881, 882, 886, 1210,
+ 1209, 884, 1208, 1207, 885, 890, 888, 887, 891, 1206,
+ 898, 900, 901, 904, 907, 1205, 909, 911, 1204, 912,
+ 916, 716, 917, 914, 915, 919, 1203, 1202, 1201, 935,
+ 918, 1200, 1199, 1198, 925, 928, 1197, 938, 942, 943,
+ 930, 1196, 945, 1195, 1194, 1193, 1192, 946, 949, 954,
+ 1191, 950, 955, 1190, 1189, 1188, 1187, 1186, 956, 958,
+ 1185, 1184, 1183, 1182, 957, 960, 968, 961, 962, 1181,
+ 963, 1180, 973, 1179, 1178, 964, 975, 977, 978, 980,
+
+ 1177, 981, 983, 984, 987, 988, 992, 994, 995, 1176,
+ 997, 998, 1005, 1006, 1004, 1008, 1012, 1014, 920, 1175,
+ 1015, 1017, 1020, 1021, 1174, 1023, 1024, 1025, 1026, 1171,
+ 1162, 1160, 1029, 1159, 1027, 1044, 1032, 1028, 1158, 1045,
+ 1049, 1033, 1157, 1050, 1155, 1154, 1053, 1055, 1056, 1057,
+ 1059, 1060, 1061, 1063, 1065, 1066, 1067, 1069, 1071, 1152,
+ 1074, 1077, 1080, 1082, 1083, 1085, 1087, 1148, 1090, 1091,
+ 1096, 1097, 1098, 1147, 1095, 1101, 1102, 1103, 1145, 1107,
+ 1108, 1140, 1106, 1109, 1114, 1118, 1122, 1123, 1126, 1129,
+ 1128, 1130, 1131, 1132, 1133, 1070, 1134, 643, 552, 548,
+
+ 1139, 444, 1144, 360, 285, 252, 1142, 133, 1309, 1177,
+ 1179, 143, 1183, 57
} ;
-static yyconst short int yy_def[617] =
+static yyconst short int yy_def[615] =
{ 0,
- 607, 1, 607, 607, 607, 607, 608, 609, 610, 611,
- 609, 609, 11, 13, 612, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 608, 607, 609, 607,
- 613, 613, 614, 611, 11, 609, 11, 13, 11, 612,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
-
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 607, 613, 42, 615,
- 609, 47, 11, 49, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
-
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 49, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 607, 615, 616, 616, 143, 143, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
-
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 212, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 267, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
-
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
-
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
- 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
-
- 609, 609, 609, 609, 609, 609, 0, 607, 607, 607,
- 607, 607, 607, 607, 607, 607
+ 609, 1, 609, 609, 609, 609, 610, 611, 612, 609,
+ 611, 611, 611, 611, 613, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 610, 609, 611, 609,
+ 614, 614, 609, 609, 611, 611, 611, 611, 611, 613,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 609, 614, 614, 609, 611, 611, 611,
+ 49, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+
+ 611, 611, 611, 611, 611, 611, 49, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 609, 609, 609, 609, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 207, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 609, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+
+ 611, 611, 611, 611, 611, 611, 611, 611, 0, 609,
+ 609, 609, 609, 609
} ;
-static yyconst short int yy_nxt[1347] =
+static yyconst short int yy_nxt[1353] =
{ 0,
4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 14, 14, 14, 14, 14, 14, 4, 15, 8,
- 8, 8, 16, 17, 18, 19, 20, 21, 22, 8,
- 23, 8, 24, 25, 26, 27, 28, 8, 29, 30,
- 31, 32, 33, 34, 35, 8, 36, 42, 40, 43,
- 43, 43, 43, 43, 43, 43, 43, 45, 45, 45,
- 45, 45, 45, 45, 45, 40, 46, 149, 181, 40,
- 40, 40, 134, 40, 40, 40, 47, 48, 48, 48,
- 48, 48, 48, 48, 48, 40, 69, 40, 40, 70,
- 40, 135, 155, 51, 162, 145, 71, 56, 40, 94,
-
- 52, 57, 53, 60, 54, 61, 58, 55, 40, 59,
- 40, 40, 49, 64, 95, 40, 62, 65, 158, 78,
- 63, 66, 40, 67, 105, 79, 68, 72, 43, 73,
- 74, 40, 182, 40, 40, 40, 40, 75, 40, 87,
- 91, 76, 133, 77, 80, 136, 81, 88, 141, 82,
- 83, 40, 89, 92, 40, 167, 90, 40, 84, 93,
- 40, 40, 40, 96, 40, 97, 118, 85, 86, 98,
- 148, 99, 102, 100, 40, 101, 40, 40, 103, 119,
- 40, 131, 120, 104, 106, 40, 150, 40, 152, 121,
- 151, 212, 40, 146, 132, 147, 153, 40, 107, 40,
-
- 108, 109, 156, 110, 111, 112, 40, 113, 154, 157,
- 40, 40, 159, 114, 160, 115, 116, 163, 117, 106,
- 161, 40, 40, 40, 40, 40, 166, 40, 40, 164,
- 168, 165, 178, 122, 40, 123, 124, 173, 125, 171,
- 126, 174, 127, 175, 128, 40, 172, 207, 129, 130,
- 139, 139, 139, 139, 139, 139, 139, 139, 142, 142,
- 142, 142, 142, 142, 142, 142, 40, 183, 179, 143,
- 40, 40, 40, 44, 256, 143, 144, 144, 144, 144,
- 144, 144, 144, 144, 180, 40, 144, 144, 40, 144,
- 144, 144, 144, 144, 144, 169, 40, 40, 40, 297,
-
- 40, 184, 40, 40, 40, 176, 189, 40, 40, 40,
- 40, 170, 196, 192, 194, 205, 185, 40, 195, 177,
- 186, 187, 40, 188, 190, 193, 40, 40, 40, 199,
- 191, 40, 197, 40, 40, 200, 202, 198, 40, 40,
- 204, 206, 40, 40, 210, 40, 40, 208, 40, 201,
- 203, 211, 215, 40, 225, 214, 40, 219, 40, 209,
- 216, 40, 229, 40, 40, 40, 40, 213, 217, 226,
- 227, 220, 218, 221, 230, 40, 222, 232, 233, 223,
- 40, 231, 224, 40, 228, 237, 234, 40, 40, 40,
- 40, 238, 266, 235, 40, 40, 239, 241, 266, 245,
-
- 259, 40, 40, 254, 236, 40, 243, 240, 246, 248,
- 249, 242, 244, 247, 250, 40, 260, 255, 40, 251,
- 40, 40, 252, 261, 40, 40, 40, 253, 257, 40,
- 258, 40, 270, 40, 272, 40, 40, 360, 275, 274,
- 40, 262, 271, 279, 40, 40, 40, 263, 267, 268,
- 273, 269, 269, 269, 269, 269, 269, 269, 269, 276,
- 277, 40, 40, 278, 40, 40, 40, 282, 280, 40,
- 281, 40, 287, 40, 40, 40, 40, 40, 285, 283,
- 284, 40, 286, 289, 288, 290, 40, 40, 40, 40,
- 40, 296, 40, 40, 303, 292, 294, 291, 293, 302,
-
- 40, 40, 300, 40, 305, 298, 295, 40, 299, 301,
- 306, 304, 307, 40, 40, 40, 310, 40, 309, 40,
- 40, 40, 40, 313, 40, 40, 308, 311, 314, 40,
- 40, 40, 40, 40, 40, 316, 356, 312, 40, 318,
- 315, 326, 319, 353, 40, 317, 320, 40, 321, 322,
- 322, 322, 322, 322, 322, 322, 322, 323, 324, 322,
- 322, 325, 322, 322, 322, 322, 322, 322, 40, 40,
- 331, 40, 40, 40, 40, 40, 40, 327, 40, 328,
- 40, 333, 334, 329, 40, 330, 40, 40, 336, 40,
- 332, 340, 335, 339, 40, 344, 337, 40, 342, 338,
-
- 40, 40, 40, 341, 40, 40, 343, 40, 40, 40,
- 345, 350, 40, 40, 358, 40, 352, 354, 348, 346,
- 347, 349, 351, 357, 40, 266, 355, 359, 267, 267,
- 361, 266, 607, 607, 607, 39, 607, 39, 40, 40,
- 40, 40, 40, 40, 40, 40, 365, 362, 368, 369,
- 40, 40, 40, 40, 40, 364, 373, 366, 367, 40,
- 40, 40, 40, 40, 40, 372, 374, 370, 371, 378,
- 376, 40, 382, 40, 377, 40, 381, 40, 40, 375,
- 379, 380, 383, 40, 40, 384, 40, 40, 40, 390,
- 40, 40, 40, 40, 40, 391, 385, 40, 389, 386,
-
- 40, 387, 388, 40, 395, 40, 396, 40, 392, 393,
- 394, 397, 398, 40, 40, 40, 40, 402, 399, 40,
- 400, 406, 404, 40, 40, 403, 40, 401, 405, 40,
- 40, 40, 408, 410, 40, 412, 407, 418, 40, 414,
- 415, 40, 413, 40, 416, 40, 409, 411, 40, 40,
- 417, 40, 419, 420, 422, 421, 40, 40, 40, 423,
- 40, 40, 424, 427, 40, 40, 425, 40, 40, 40,
- 426, 40, 40, 40, 435, 40, 40, 428, 432, 436,
- 434, 40, 429, 438, 40, 430, 439, 40, 431, 40,
- 433, 440, 441, 40, 437, 443, 442, 40, 40, 40,
-
- 40, 40, 40, 40, 40, 40, 40, 446, 40, 450,
- 451, 40, 444, 455, 40, 40, 445, 447, 449, 452,
- 456, 453, 448, 40, 40, 40, 40, 40, 454, 40,
- 457, 40, 40, 40, 461, 463, 464, 40, 458, 40,
- 459, 465, 466, 460, 462, 40, 467, 40, 40, 469,
- 40, 40, 468, 40, 40, 40, 40, 40, 472, 40,
- 40, 40, 471, 474, 476, 480, 479, 40, 470, 473,
- 40, 40, 482, 477, 40, 484, 475, 40, 40, 478,
- 483, 40, 40, 481, 40, 40, 40, 40, 40, 490,
- 487, 486, 40, 40, 485, 492, 496, 497, 489, 40,
-
- 40, 488, 40, 40, 40, 494, 495, 493, 40, 499,
- 505, 40, 491, 501, 40, 500, 498, 502, 40, 503,
- 40, 40, 40, 504, 40, 40, 40, 40, 40, 40,
- 509, 40, 506, 40, 510, 507, 515, 508, 511, 512,
- 40, 513, 516, 40, 514, 40, 40, 40, 517, 40,
- 40, 40, 40, 40, 40, 40, 518, 40, 519, 524,
- 525, 40, 523, 40, 520, 40, 521, 40, 527, 526,
- 528, 531, 522, 40, 530, 529, 534, 40, 535, 40,
- 532, 40, 536, 40, 40, 40, 533, 542, 537, 40,
- 539, 40, 40, 40, 40, 40, 541, 40, 40, 40,
-
- 40, 545, 40, 40, 538, 552, 549, 540, 546, 554,
- 40, 547, 543, 550, 544, 40, 40, 553, 548, 551,
- 40, 556, 555, 40, 40, 40, 40, 40, 40, 559,
- 40, 40, 562, 557, 560, 40, 40, 40, 565, 40,
- 40, 40, 40, 40, 563, 569, 558, 571, 40, 561,
- 567, 568, 40, 40, 570, 572, 40, 40, 566, 564,
- 40, 40, 574, 40, 573, 576, 577, 40, 40, 40,
- 580, 40, 40, 40, 40, 575, 578, 40, 581, 40,
- 584, 40, 582, 583, 40, 586, 40, 592, 589, 579,
- 587, 591, 585, 40, 40, 588, 590, 40, 40, 40,
-
- 40, 40, 40, 593, 40, 40, 40, 598, 599, 600,
- 40, 40, 595, 604, 594, 40, 40, 40, 40, 597,
- 596, 40, 603, 40, 605, 40, 40, 602, 40, 601,
- 40, 606, 37, 37, 37, 37, 37, 37, 37, 37,
- 39, 40, 39, 39, 39, 39, 41, 40, 41, 41,
- 40, 41, 50, 40, 50, 50, 50, 50, 50, 50,
- 138, 40, 138, 138, 40, 138, 265, 40, 265, 363,
- 363, 363, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 14, 14, 14, 4, 15, 8, 8, 8, 16, 17,
+ 18, 19, 20, 21, 22, 8, 23, 8, 24, 25,
+ 26, 27, 28, 8, 29, 30, 31, 32, 33, 34,
+ 35, 8, 36, 42, 40, 43, 43, 43, 43, 44,
+ 44, 44, 44, 45, 45, 45, 45, 40, 46, 135,
+ 40, 40, 152, 40, 47, 48, 48, 48, 48, 40,
+ 47, 48, 48, 48, 48, 40, 40, 69, 138, 40,
+ 70, 40, 158, 40, 51, 40, 40, 71, 56, 40,
+ 102, 52, 57, 53, 40, 54, 49, 58, 55, 60,
+
+ 59, 61, 40, 172, 40, 40, 194, 64, 146, 40,
+ 128, 65, 62, 78, 83, 66, 63, 67, 40, 79,
+ 68, 40, 84, 129, 40, 80, 72, 85, 73, 74,
+ 40, 86, 40, 130, 81, 82, 75, 87, 40, 90,
+ 76, 40, 77, 131, 40, 41, 40, 133, 91, 40,
+ 88, 40, 40, 99, 92, 40, 89, 40, 40, 100,
+ 142, 147, 132, 145, 101, 148, 93, 170, 94, 40,
+ 40, 143, 95, 144, 96, 40, 97, 40, 98, 103,
+ 149, 150, 40, 40, 155, 40, 40, 115, 40, 104,
+ 153, 105, 106, 151, 107, 108, 109, 154, 110, 40,
+
+ 116, 163, 40, 117, 111, 40, 112, 113, 159, 114,
+ 118, 103, 171, 162, 188, 40, 136, 136, 136, 136,
+ 156, 119, 157, 120, 121, 40, 122, 40, 123, 40,
+ 124, 359, 125, 165, 40, 183, 126, 127, 43, 43,
+ 43, 43, 137, 44, 44, 44, 44, 47, 45, 45,
+ 45, 45, 40, 139, 139, 139, 139, 40, 164, 40,
+ 140, 257, 40, 40, 200, 40, 140, 47, 48, 48,
+ 48, 48, 40, 141, 141, 141, 141, 40, 178, 141,
+ 141, 40, 141, 141, 141, 141, 141, 141, 160, 40,
+ 40, 40, 40, 40, 40, 40, 166, 40, 40, 175,
+
+ 161, 173, 40, 40, 40, 190, 168, 40, 40, 186,
+ 40, 184, 167, 169, 179, 174, 176, 185, 40, 40,
+ 177, 187, 189, 191, 40, 180, 181, 195, 182, 40,
+ 40, 40, 201, 192, 193, 40, 40, 40, 197, 199,
+ 40, 196, 40, 40, 202, 40, 40, 40, 203, 40,
+ 40, 40, 198, 205, 214, 222, 209, 204, 210, 224,
+ 206, 40, 227, 40, 40, 225, 211, 207, 215, 223,
+ 208, 220, 40, 40, 212, 40, 216, 40, 213, 217,
+ 40, 226, 218, 232, 40, 219, 221, 40, 40, 40,
+ 228, 40, 40, 230, 40, 40, 256, 234, 229, 40,
+
+ 233, 236, 40, 240, 231, 238, 267, 235, 249, 40,
+ 258, 239, 241, 40, 250, 237, 40, 242, 40, 40,
+ 251, 252, 254, 40, 255, 40, 243, 244, 40, 40,
+ 279, 245, 269, 253, 259, 40, 246, 268, 40, 247,
+ 260, 271, 272, 40, 248, 136, 136, 136, 136, 262,
+ 262, 262, 262, 40, 292, 40, 263, 40, 273, 270,
+ 40, 284, 263, 139, 139, 139, 139, 40, 274, 40,
+ 140, 40, 40, 40, 40, 280, 140, 264, 265, 276,
+ 266, 266, 266, 266, 40, 40, 40, 40, 281, 40,
+ 40, 40, 275, 40, 277, 278, 282, 290, 285, 286,
+
+ 283, 40, 287, 40, 40, 40, 293, 40, 40, 40,
+ 291, 289, 40, 40, 288, 300, 297, 299, 40, 40,
+ 40, 40, 295, 298, 301, 296, 40, 302, 303, 304,
+ 294, 306, 308, 40, 40, 307, 40, 40, 40, 40,
+ 40, 310, 40, 305, 309, 311, 40, 40, 40, 40,
+ 40, 40, 313, 40, 315, 40, 323, 312, 330, 317,
+ 316, 40, 314, 40, 337, 40, 40, 332, 40, 318,
+ 319, 319, 319, 319, 320, 321, 319, 319, 322, 319,
+ 319, 319, 319, 319, 319, 40, 328, 329, 40, 40,
+ 40, 335, 40, 40, 324, 40, 325, 331, 40, 40,
+
+ 326, 40, 327, 40, 341, 333, 40, 336, 339, 40,
+ 40, 334, 338, 40, 40, 40, 340, 40, 40, 347,
+ 346, 342, 40, 349, 40, 40, 343, 345, 350, 344,
+ 348, 40, 40, 351, 355, 40, 352, 353, 358, 356,
+ 357, 40, 40, 354, 262, 262, 262, 262, 40, 264,
+ 264, 263, 362, 362, 362, 362, 40, 263, 413, 360,
+ 362, 362, 362, 362, 40, 361, 266, 266, 266, 266,
+ 40, 266, 266, 266, 266, 40, 40, 40, 40, 40,
+ 40, 363, 40, 364, 367, 40, 40, 368, 40, 40,
+ 40, 40, 40, 372, 365, 366, 40, 377, 40, 40,
+
+ 40, 371, 373, 40, 40, 369, 40, 375, 370, 380,
+ 40, 376, 381, 382, 40, 40, 40, 374, 378, 379,
+ 40, 40, 40, 383, 40, 389, 40, 40, 40, 40,
+ 390, 388, 40, 384, 40, 40, 385, 40, 386, 387,
+ 40, 394, 40, 391, 393, 392, 396, 395, 40, 397,
+ 40, 40, 399, 398, 40, 40, 40, 493, 405, 403,
+ 40, 40, 40, 40, 400, 401, 402, 404, 40, 407,
+ 409, 411, 414, 40, 40, 406, 40, 40, 415, 412,
+ 40, 417, 416, 408, 410, 418, 40, 420, 40, 40,
+ 40, 40, 419, 40, 40, 421, 40, 40, 422, 426,
+
+ 423, 424, 40, 425, 40, 40, 40, 40, 40, 40,
+ 427, 40, 436, 430, 40, 444, 437, 428, 429, 435,
+ 40, 433, 362, 362, 362, 362, 40, 439, 432, 40,
+ 40, 431, 40, 434, 440, 40, 438, 441, 40, 40,
+ 442, 40, 40, 40, 40, 40, 40, 443, 447, 40,
+ 40, 445, 451, 452, 40, 40, 40, 446, 448, 40,
+ 450, 455, 453, 454, 456, 449, 40, 40, 40, 457,
+ 40, 40, 458, 40, 40, 40, 40, 462, 40, 40,
+ 464, 465, 459, 460, 466, 467, 461, 463, 468, 40,
+ 40, 469, 40, 40, 40, 40, 471, 40, 40, 40,
+
+ 40, 40, 473, 40, 40, 472, 475, 470, 477, 481,
+ 480, 40, 474, 40, 40, 483, 478, 40, 476, 486,
+ 40, 479, 40, 482, 40, 40, 485, 40, 40, 40,
+ 40, 40, 40, 40, 484, 489, 492, 488, 40, 494,
+ 487, 40, 491, 40, 543, 501, 496, 490, 40, 495,
+ 497, 40, 498, 499, 500, 40, 40, 502, 40, 40,
+ 503, 505, 40, 40, 504, 507, 506, 40, 40, 40,
+ 40, 40, 511, 40, 40, 40, 40, 40, 512, 509,
+ 508, 40, 513, 514, 510, 515, 40, 518, 40, 517,
+ 40, 40, 519, 40, 40, 516, 40, 40, 522, 520,
+
+ 40, 40, 526, 527, 521, 40, 525, 40, 40, 523,
+ 40, 40, 529, 528, 532, 530, 524, 40, 40, 40,
+ 536, 40, 531, 537, 538, 40, 539, 40, 40, 533,
+ 40, 534, 541, 40, 40, 535, 40, 40, 40, 40,
+ 40, 40, 40, 547, 540, 40, 40, 556, 551, 553,
+ 542, 548, 544, 545, 549, 552, 546, 40, 40, 559,
+ 555, 550, 40, 40, 554, 557, 40, 558, 40, 40,
+ 40, 561, 40, 40, 40, 564, 40, 562, 40, 40,
+ 40, 567, 40, 40, 40, 571, 560, 40, 565, 573,
+ 40, 569, 563, 40, 570, 40, 40, 572, 40, 568,
+
+ 40, 574, 566, 40, 40, 578, 575, 579, 40, 40,
+ 40, 40, 576, 582, 40, 40, 40, 586, 577, 40,
+ 40, 40, 40, 580, 583, 584, 585, 40, 588, 593,
+ 591, 40, 581, 589, 592, 40, 40, 587, 590, 40,
+ 594, 40, 40, 40, 40, 40, 40, 40, 595, 600,
+ 601, 602, 40, 40, 597, 40, 596, 40, 40, 606,
+ 40, 40, 598, 599, 605, 40, 607, 40, 40, 604,
+ 40, 40, 40, 40, 603, 40, 608, 37, 37, 37,
+ 37, 39, 39, 50, 40, 50, 50, 40, 40, 40,
40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
@@ -747,166 +747,168 @@ static yyconst short int yy_nxt[1347] =
40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 264, 40, 40, 40, 40, 40, 39,
- 47, 140, 40, 137, 39, 40, 38, 607, 3, 607,
-
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 261, 40,
+
+ 40, 40, 40, 40, 134, 40, 38, 609, 3, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
+ 609, 609
} ;
-static yyconst short int yy_chk[1347] =
+static yyconst short int yy_chk[1353] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 9, 54, 9,
- 9, 9, 9, 9, 9, 9, 9, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 12, 54, 80, 20,
- 80, 64, 35, 35, 58, 12, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 16, 20, 51, 17, 20,
- 26, 35, 58, 16, 64, 51, 20, 17, 18, 26,
-
- 16, 17, 16, 18, 16, 18, 17, 16, 19, 17,
- 22, 61, 13, 19, 26, 29, 18, 19, 61, 22,
- 18, 19, 21, 19, 29, 22, 19, 21, 614, 21,
- 21, 68, 81, 34, 24, 25, 36, 21, 81, 24,
- 25, 21, 34, 21, 23, 36, 23, 24, 46, 23,
- 23, 23, 24, 25, 27, 68, 24, 46, 23, 25,
- 28, 31, 53, 27, 106, 27, 31, 23, 23, 27,
- 53, 27, 28, 27, 55, 27, 33, 56, 28, 31,
- 52, 33, 31, 28, 30, 57, 55, 60, 56, 31,
- 55, 106, 30, 52, 33, 52, 57, 62, 30, 63,
-
- 30, 30, 60, 30, 30, 30, 66, 30, 57, 60,
- 65, 67, 62, 30, 62, 30, 30, 65, 30, 32,
- 63, 73, 69, 77, 72, 75, 67, 32, 74, 65,
- 69, 66, 77, 32, 102, 32, 32, 73, 32, 72,
- 32, 74, 32, 75, 32, 78, 72, 102, 32, 32,
- 42, 42, 42, 42, 42, 42, 42, 42, 47, 47,
- 47, 47, 47, 47, 47, 47, 79, 82, 78, 47,
- 131, 82, 176, 611, 131, 47, 49, 49, 49, 49,
- 49, 49, 49, 49, 79, 84, 49, 49, 71, 49,
- 49, 49, 49, 49, 49, 71, 76, 85, 86, 176,
-
- 87, 84, 90, 91, 92, 76, 87, 88, 89, 96,
- 100, 71, 92, 89, 90, 100, 85, 93, 91, 76,
- 86, 86, 95, 86, 88, 89, 97, 98, 105, 96,
- 88, 99, 93, 101, 103, 97, 98, 95, 104, 107,
- 99, 101, 108, 606, 105, 109, 112, 103, 110, 97,
- 98, 105, 109, 114, 112, 108, 115, 110, 111, 104,
- 109, 113, 114, 122, 117, 118, 121, 107, 109, 112,
- 113, 110, 109, 111, 115, 116, 111, 117, 118, 111,
- 120, 116, 111, 123, 113, 121, 118, 124, 125, 126,
- 127, 122, 140, 120, 129, 133, 123, 125, 140, 127,
-
- 133, 128, 135, 129, 120, 130, 126, 124, 127, 128,
- 128, 125, 126, 127, 128, 132, 134, 130, 134, 128,
- 136, 146, 128, 135, 147, 149, 152, 128, 132, 150,
- 132, 154, 146, 260, 149, 159, 604, 260, 154, 152,
- 157, 136, 147, 159, 155, 156, 160, 136, 143, 143,
- 150, 143, 143, 143, 143, 143, 143, 143, 143, 155,
- 156, 161, 162, 157, 163, 164, 167, 162, 160, 166,
- 161, 168, 167, 171, 169, 172, 170, 173, 166, 163,
- 164, 174, 166, 169, 168, 170, 175, 177, 180, 185,
- 179, 175, 184, 178, 180, 171, 173, 170, 172, 179,
-
- 188, 186, 178, 187, 185, 177, 174, 189, 177, 178,
- 186, 184, 187, 190, 191, 192, 189, 193, 188, 194,
- 195, 196, 205, 192, 198, 209, 187, 190, 193, 208,
- 253, 256, 216, 214, 213, 195, 256, 191, 215, 198,
- 194, 216, 205, 253, 603, 196, 208, 218, 209, 212,
- 212, 212, 212, 212, 212, 212, 212, 213, 214, 212,
- 212, 215, 212, 212, 212, 212, 212, 212, 217, 222,
- 218, 224, 229, 225, 226, 230, 232, 217, 233, 217,
- 234, 224, 225, 217, 235, 217, 237, 238, 229, 236,
- 222, 234, 226, 233, 239, 237, 230, 243, 236, 232,
-
- 244, 254, 248, 235, 246, 250, 236, 252, 255, 258,
- 238, 248, 262, 259, 258, 257, 252, 254, 244, 239,
- 243, 246, 250, 257, 263, 265, 255, 259, 266, 266,
- 262, 265, 267, 267, 268, 268, 269, 269, 270, 271,
- 272, 274, 279, 275, 280, 281, 271, 263, 275, 279,
- 282, 283, 285, 284, 286, 270, 283, 272, 274, 287,
- 290, 289, 296, 292, 288, 282, 284, 280, 281, 288,
- 286, 291, 292, 297, 287, 293, 291, 298, 299, 285,
- 289, 290, 293, 302, 303, 296, 305, 306, 307, 303,
- 309, 310, 308, 311, 320, 305, 297, 312, 302, 298,
-
- 316, 298, 299, 319, 309, 317, 310, 321, 306, 307,
- 308, 311, 312, 323, 326, 325, 327, 320, 316, 332,
- 317, 326, 323, 328, 329, 321, 330, 319, 325, 333,
- 338, 334, 328, 329, 335, 330, 327, 338, 341, 333,
- 334, 337, 332, 340, 335, 345, 328, 329, 343, 348,
- 337, 349, 340, 341, 345, 343, 350, 351, 352, 348,
- 353, 355, 349, 352, 356, 358, 350, 361, 360, 365,
- 351, 366, 368, 602, 365, 373, 369, 353, 360, 366,
- 361, 370, 355, 369, 371, 356, 370, 372, 358, 374,
- 360, 371, 372, 375, 368, 374, 373, 376, 377, 379,
-
- 378, 380, 381, 383, 389, 390, 386, 377, 387, 381,
- 383, 388, 375, 389, 391, 392, 376, 378, 380, 386,
- 390, 387, 379, 393, 394, 395, 398, 397, 388, 399,
- 391, 405, 400, 401, 395, 398, 399, 402, 392, 403,
- 393, 400, 401, 394, 397, 406, 402, 414, 415, 405,
- 416, 418, 403, 419, 423, 420, 426, 428, 415, 427,
- 429, 430, 414, 418, 420, 428, 427, 431, 406, 416,
- 432, 433, 430, 423, 434, 432, 419, 436, 437, 426,
- 431, 439, 440, 429, 441, 443, 442, 444, 445, 440,
- 436, 434, 449, 450, 433, 442, 449, 449, 439, 455,
-
- 460, 437, 454, 462, 457, 444, 445, 443, 458, 454,
- 462, 467, 441, 457, 459, 455, 450, 458, 468, 459,
- 469, 471, 484, 460, 472, 478, 483, 479, 485, 486,
- 471, 487, 467, 489, 472, 468, 485, 469, 478, 479,
- 491, 483, 486, 494, 484, 495, 496, 497, 487, 506,
- 498, 500, 501, 502, 504, 503, 489, 507, 491, 498,
- 500, 509, 497, 519, 494, 505, 495, 510, 502, 501,
- 503, 506, 496, 511, 505, 504, 510, 512, 511, 513,
- 507, 514, 512, 515, 516, 517, 509, 519, 513, 520,
- 515, 521, 522, 524, 525, 526, 517, 527, 534, 600,
-
- 531, 522, 535, 536, 514, 534, 527, 516, 524, 536,
- 533, 525, 520, 531, 521, 538, 539, 535, 526, 533,
- 540, 539, 538, 542, 545, 546, 547, 548, 549, 545,
- 550, 551, 548, 540, 546, 552, 554, 553, 551, 556,
- 555, 559, 557, 561, 549, 555, 542, 557, 560, 547,
- 553, 554, 562, 565, 556, 559, 563, 564, 552, 550,
- 567, 568, 561, 569, 560, 563, 564, 570, 571, 574,
- 568, 573, 575, 576, 583, 562, 565, 578, 569, 579,
- 573, 581, 570, 571, 582, 575, 584, 583, 579, 567,
- 576, 582, 574, 585, 586, 578, 581, 587, 588, 589,
-
- 592, 590, 591, 584, 593, 595, 599, 589, 590, 591,
- 605, 598, 586, 599, 585, 601, 597, 596, 594, 588,
- 587, 580, 595, 577, 601, 572, 566, 593, 558, 592,
- 544, 605, 608, 608, 608, 608, 608, 608, 608, 608,
- 609, 543, 609, 609, 609, 609, 610, 541, 610, 610,
- 537, 610, 612, 532, 612, 612, 612, 612, 612, 612,
- 613, 530, 613, 613, 529, 613, 615, 528, 615, 616,
- 616, 616, 523, 518, 508, 499, 493, 492, 490, 488,
- 482, 481, 480, 477, 476, 475, 474, 473, 470, 466,
- 465, 464, 463, 461, 456, 453, 452, 451, 448, 447,
-
- 446, 438, 435, 425, 424, 422, 421, 417, 413, 412,
- 411, 410, 409, 408, 407, 404, 396, 385, 384, 382,
- 367, 364, 362, 359, 357, 354, 347, 346, 344, 342,
- 339, 336, 331, 324, 318, 315, 314, 313, 304, 301,
- 300, 295, 294, 278, 277, 276, 273, 261, 251, 249,
- 247, 245, 242, 241, 240, 231, 228, 227, 223, 221,
- 220, 219, 211, 210, 207, 206, 204, 203, 202, 201,
- 200, 199, 197, 183, 182, 181, 165, 158, 153, 151,
- 148, 145, 141, 137, 119, 94, 83, 70, 59, 48,
- 45, 44, 39, 37, 14, 8, 7, 3, 607, 607,
-
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607
+ 1, 1, 1, 9, 58, 9, 9, 9, 9, 10,
+ 10, 10, 10, 11, 11, 11, 11, 11, 12, 614,
+ 20, 63, 58, 12, 13, 13, 13, 13, 13, 13,
+ 14, 14, 14, 14, 14, 14, 16, 20, 46, 17,
+ 20, 29, 63, 46, 16, 75, 93, 20, 17, 54,
+ 29, 16, 17, 16, 18, 16, 13, 17, 16, 18,
+
+ 17, 18, 19, 75, 22, 33, 93, 19, 54, 24,
+ 33, 19, 18, 22, 24, 19, 18, 19, 23, 22,
+ 19, 21, 24, 33, 34, 23, 21, 24, 21, 21,
+ 26, 24, 25, 34, 23, 23, 21, 25, 36, 26,
+ 21, 28, 21, 35, 35, 612, 608, 36, 26, 55,
+ 25, 73, 51, 28, 26, 53, 25, 27, 52, 28,
+ 51, 55, 35, 53, 28, 55, 27, 73, 27, 56,
+ 57, 52, 27, 52, 27, 60, 27, 61, 27, 30,
+ 56, 57, 31, 30, 61, 64, 67, 31, 66, 30,
+ 60, 30, 30, 57, 30, 30, 30, 60, 30, 74,
+
+ 31, 67, 86, 31, 30, 62, 30, 30, 64, 30,
+ 31, 32, 74, 66, 86, 32, 42, 42, 42, 42,
+ 62, 32, 62, 32, 32, 69, 32, 257, 32, 83,
+ 32, 257, 32, 69, 68, 83, 32, 32, 43, 43,
+ 43, 43, 44, 44, 44, 44, 44, 45, 45, 45,
+ 45, 45, 45, 47, 47, 47, 47, 47, 68, 97,
+ 47, 131, 80, 131, 97, 606, 47, 48, 48, 48,
+ 48, 48, 48, 49, 49, 49, 49, 49, 80, 49,
+ 49, 65, 49, 49, 49, 49, 49, 49, 65, 71,
+ 77, 72, 76, 78, 84, 81, 71, 88, 605, 77,
+
+ 65, 76, 79, 82, 85, 88, 72, 87, 89, 85,
+ 91, 84, 71, 72, 81, 76, 78, 84, 94, 92,
+ 79, 85, 87, 89, 98, 82, 82, 94, 82, 95,
+ 96, 99, 98, 91, 92, 100, 101, 102, 95, 96,
+ 103, 94, 104, 105, 99, 107, 110, 112, 100, 114,
+ 111, 106, 95, 102, 107, 110, 105, 101, 106, 111,
+ 102, 108, 114, 109, 118, 112, 106, 103, 107, 110,
+ 104, 109, 119, 604, 106, 113, 108, 115, 106, 108,
+ 117, 113, 108, 118, 120, 108, 109, 121, 123, 132,
+ 115, 130, 122, 117, 124, 143, 130, 120, 115, 126,
+
+ 119, 122, 127, 124, 117, 123, 143, 121, 126, 129,
+ 132, 123, 124, 133, 127, 122, 128, 124, 125, 144,
+ 128, 128, 129, 146, 129, 159, 125, 125, 149, 171,
+ 159, 125, 146, 128, 133, 151, 125, 144, 147, 125,
+ 133, 149, 151, 152, 125, 136, 136, 136, 136, 137,
+ 137, 137, 137, 153, 171, 164, 137, 602, 152, 147,
+ 160, 164, 137, 139, 139, 139, 139, 139, 153, 154,
+ 139, 156, 157, 161, 169, 160, 139, 140, 140, 156,
+ 140, 140, 140, 140, 140, 165, 158, 163, 161, 168,
+ 166, 170, 154, 167, 157, 158, 163, 169, 165, 166,
+
+ 163, 172, 167, 173, 174, 178, 172, 175, 176, 177,
+ 170, 168, 179, 182, 167, 177, 175, 176, 184, 180,
+ 181, 185, 174, 175, 178, 174, 183, 179, 180, 181,
+ 173, 182, 184, 186, 187, 183, 188, 189, 190, 193,
+ 200, 186, 203, 181, 185, 187, 204, 211, 219, 221,
+ 209, 208, 189, 229, 193, 210, 211, 188, 219, 203,
+ 200, 600, 190, 213, 229, 599, 217, 221, 227, 204,
+ 207, 207, 207, 207, 208, 209, 207, 207, 210, 207,
+ 207, 207, 207, 207, 207, 212, 213, 217, 220, 224,
+ 225, 227, 228, 230, 212, 232, 212, 220, 233, 231,
+
+ 212, 234, 212, 241, 232, 224, 238, 228, 231, 239,
+ 243, 225, 230, 245, 247, 248, 231, 249, 250, 243,
+ 241, 233, 252, 247, 256, 253, 234, 239, 248, 238,
+ 245, 254, 251, 249, 253, 255, 250, 251, 256, 254,
+ 255, 259, 260, 252, 262, 262, 262, 262, 330, 263,
+ 263, 262, 263, 263, 263, 263, 598, 262, 330, 259,
+ 264, 264, 264, 264, 267, 260, 265, 265, 265, 265,
+ 265, 266, 266, 266, 266, 266, 268, 269, 271, 272,
+ 276, 267, 277, 268, 272, 278, 279, 276, 280, 281,
+ 282, 283, 285, 280, 269, 271, 284, 285, 287, 286,
+
+ 293, 279, 281, 289, 288, 277, 290, 283, 278, 288,
+ 294, 284, 289, 290, 295, 296, 299, 282, 286, 287,
+ 300, 302, 303, 293, 304, 300, 305, 306, 308, 442,
+ 302, 299, 307, 294, 309, 313, 295, 314, 295, 296,
+ 316, 306, 317, 303, 305, 304, 308, 307, 318, 309,
+ 320, 323, 314, 313, 322, 324, 329, 442, 323, 320,
+ 325, 326, 327, 331, 316, 317, 318, 322, 332, 325,
+ 326, 327, 331, 334, 335, 324, 337, 338, 332, 329,
+ 340, 335, 334, 325, 326, 337, 342, 340, 345, 346,
+ 348, 347, 338, 350, 349, 342, 352, 353, 345, 349,
+
+ 346, 347, 354, 348, 355, 357, 360, 364, 365, 373,
+ 350, 359, 364, 354, 367, 373, 365, 352, 353, 360,
+ 368, 359, 362, 362, 362, 362, 372, 368, 357, 369,
+ 370, 355, 374, 359, 369, 371, 367, 370, 375, 376,
+ 371, 377, 378, 379, 387, 380, 382, 372, 376, 385,
+ 386, 374, 380, 382, 389, 388, 390, 375, 377, 391,
+ 379, 387, 385, 386, 388, 378, 392, 393, 394, 389,
+ 396, 397, 390, 405, 398, 399, 400, 394, 402, 401,
+ 397, 398, 391, 392, 399, 400, 393, 396, 401, 404,
+ 413, 402, 414, 415, 417, 418, 405, 422, 425, 419,
+
+ 428, 427, 414, 426, 429, 413, 417, 404, 419, 427,
+ 426, 431, 415, 432, 433, 429, 422, 434, 418, 433,
+ 435, 425, 437, 428, 438, 440, 432, 444, 445, 441,
+ 443, 451, 446, 519, 431, 437, 441, 435, 455, 443,
+ 434, 456, 440, 461, 519, 455, 445, 438, 450, 444,
+ 446, 458, 450, 450, 451, 459, 460, 456, 463, 468,
+ 458, 460, 469, 472, 459, 463, 461, 470, 473, 479,
+ 485, 480, 472, 486, 488, 489, 491, 496, 473, 469,
+ 468, 487, 479, 480, 470, 485, 493, 488, 497, 487,
+ 498, 499, 489, 500, 502, 486, 503, 504, 496, 491,
+
+ 505, 506, 500, 502, 493, 507, 499, 508, 509, 497,
+ 511, 512, 504, 503, 507, 505, 498, 515, 513, 514,
+ 512, 516, 506, 513, 514, 517, 515, 518, 521, 508,
+ 522, 509, 517, 523, 524, 511, 526, 527, 528, 529,
+ 535, 538, 533, 524, 516, 537, 542, 538, 529, 535,
+ 518, 526, 521, 522, 527, 533, 523, 536, 540, 542,
+ 537, 528, 541, 544, 536, 540, 547, 541, 548, 549,
+ 550, 547, 551, 552, 553, 550, 554, 548, 555, 556,
+ 557, 553, 558, 596, 559, 557, 544, 561, 551, 559,
+ 562, 555, 549, 563, 556, 564, 565, 558, 566, 554,
+
+ 567, 561, 552, 569, 570, 565, 562, 566, 575, 571,
+ 572, 573, 563, 570, 576, 577, 578, 575, 564, 583,
+ 580, 581, 584, 567, 571, 572, 573, 585, 577, 584,
+ 581, 586, 569, 578, 583, 587, 588, 576, 580, 589,
+ 585, 591, 590, 592, 593, 594, 595, 597, 586, 591,
+ 592, 593, 601, 582, 588, 607, 587, 603, 579, 601,
+ 574, 568, 589, 590, 597, 560, 603, 546, 545, 595,
+ 543, 539, 534, 532, 594, 531, 607, 610, 610, 610,
+ 610, 611, 611, 613, 530, 613, 613, 525, 520, 510,
+ 501, 495, 494, 492, 490, 484, 483, 482, 481, 478,
+
+ 477, 476, 475, 474, 471, 467, 466, 465, 464, 462,
+ 457, 454, 453, 452, 449, 448, 447, 439, 436, 430,
+ 424, 423, 421, 420, 416, 412, 411, 410, 409, 408,
+ 407, 406, 403, 395, 384, 383, 381, 366, 363, 361,
+ 358, 356, 351, 344, 343, 341, 339, 336, 333, 328,
+ 321, 315, 312, 311, 310, 301, 298, 297, 292, 291,
+ 275, 274, 273, 270, 258, 246, 244, 242, 240, 237,
+ 236, 235, 226, 223, 222, 218, 216, 215, 214, 206,
+ 205, 202, 201, 199, 198, 197, 196, 195, 194, 192,
+ 191, 162, 155, 150, 148, 145, 142, 138, 134, 116,
+
+ 90, 70, 59, 39, 37, 8, 7, 3, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
+ 609, 609
} ;
static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
@@ -923,7 +925,7 @@ goto find_rule; \
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
char *yytext;
-#line 1 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 1 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
#define INITIAL 0
/*===-- UpgradeLexer.l - Scanner for 1.9 assembly files --------*- C++ -*--===//
//
@@ -938,9 +940,10 @@ char *yytext;
//
//===----------------------------------------------------------------------===*/
#define YY_NEVER_INTERACTIVE 1
-#line 28 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-
+#line 28 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
#include "UpgradeInternals.h"
+#include "llvm/Module.h"
+#include <list>
#include "UpgradeParser.h"
#include <cctype>
#include <cstdlib>
@@ -955,17 +958,108 @@ char *yytext;
} \
}
+#define YY_NEVER_INTERACTIVE 1
// Construct a token value for a non-obsolete token
-#define RET_TOK(sym) \
- Upgradelval.String = new std::string(yytext); \
+#define RET_TOK(type, Enum, sym) \
+ Upgradelval.type = Enum; \
return sym
-#define RET_TY(sym,OldTY,NewTY,sign) \
- Upgradelval.Ty = getType(NewTY, OldTY); \
+#define RET_TY(sym,NewTY,sign) \
+ Upgradelval.PrimType.T = NewTY; \
+ Upgradelval.PrimType.S = sign; \
return sym
-#define YY_NEVER_INTERACTIVE 1
+namespace llvm {
+
+// TODO: All of the static identifiers are figured out by the lexer,
+// these should be hashed to reduce the lexer size
+
+// UnEscapeLexed - Run through the specified buffer and change \xx codes to the
+// appropriate character. If AllowNull is set to false, a \00 value will cause
+// an exception to be thrown.
+//
+// If AllowNull is set to true, the return value of the function points to the
+// last character of the string in memory.
+//
+char *UnEscapeLexed(char *Buffer, bool AllowNull) {
+ char *BOut = Buffer;
+ for (char *BIn = Buffer; *BIn; ) {
+ if (BIn[0] == '\\' && isxdigit(BIn[1]) && isxdigit(BIn[2])) {
+ char Tmp = BIn[3]; BIn[3] = 0; // Terminate string
+ *BOut = (char)strtol(BIn+1, 0, 16); // Convert to number
+ if (!AllowNull && !*BOut)
+ error("String literal cannot accept \\00 escape!");
+
+ BIn[3] = Tmp; // Restore character
+ BIn += 3; // Skip over handled chars
+ ++BOut;
+ } else {
+ *BOut++ = *BIn++;
+ }
+ }
+
+ return BOut;
+}
+
+// atoull - Convert an ascii string of decimal digits into the unsigned long
+// long representation... this does not have to do input error checking,
+// because we know that the input will be matched by a suitable regex...
+//
+static uint64_t atoull(const char *Buffer) {
+ uint64_t Result = 0;
+ for (; *Buffer; Buffer++) {
+ uint64_t OldRes = Result;
+ Result *= 10;
+ Result += *Buffer-'0';
+ if (Result < OldRes) // Uh, oh, overflow detected!!!
+ error("constant bigger than 64 bits detected!");
+ }
+ return Result;
+}
+
+static uint64_t HexIntToVal(const char *Buffer) {
+ uint64_t Result = 0;
+ for (; *Buffer; ++Buffer) {
+ uint64_t OldRes = Result;
+ Result *= 16;
+ char C = *Buffer;
+ if (C >= '0' && C <= '9')
+ Result += C-'0';
+ else if (C >= 'A' && C <= 'F')
+ Result += C-'A'+10;
+ else if (C >= 'a' && C <= 'f')
+ Result += C-'a'+10;
+
+ if (Result < OldRes) // Uh, oh, overflow detected!!!
+ error("constant bigger than 64 bits detected!");
+ }
+ return Result;
+}
+
+
+// HexToFP - Convert the ascii string in hexidecimal format to the floating
+// point representation of it.
+//
+static double HexToFP(const char *Buffer) {
+ // Behave nicely in the face of C TBAA rules... see:
+ // http://www.nullstone.com/htmls/category/aliastyp.htm
+ union {
+ uint64_t UI;
+ double FP;
+ } UIntToFP;
+ UIntToFP.UI = HexIntToVal(Buffer);
+
+ assert(sizeof(double) == sizeof(uint64_t) &&
+ "Data sizes incompatible on this target!");
+ return UIntToFP.FP; // Cast Hex constant to double
+}
+
+
+} // End llvm namespace
+
+using namespace llvm;
+
/* Comments start with a ; and go till end of line */
/* Variable(Value) identifiers start with a % sign */
/* Label identifiers end with a colon */
@@ -982,7 +1076,7 @@ char *yytext;
/* HexIntConstant - Hexadecimal constant generated by the CFE to avoid forcing
* it to deal with 64 bit numbers.
*/
-#line 986 "UpgradeLexer.cpp"
+#line 1080 "UpgradeLexer.cpp"
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -1133,10 +1227,10 @@ YY_DECL
register char *yy_cp = NULL, *yy_bp = NULL;
register int yy_act;
-#line 97 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 189 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
-#line 1140 "UpgradeLexer.cpp"
+#line 1234 "UpgradeLexer.cpp"
if ( yy_init )
{
@@ -1184,14 +1278,14 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 608 )
+ if ( yy_current_state >= 610 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
*yy_state_ptr++ = yy_current_state;
++yy_cp;
}
- while ( yy_current_state != 607 );
+ while ( yy_current_state != 609 );
yy_find_action:
yy_current_state = *--yy_state_ptr;
@@ -1229,776 +1323,816 @@ do_action: /* This label is used only to access EOF actions. */
{ /* beginning of action switch */
case 1:
YY_RULE_SETUP
-#line 99 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 191 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
{ /* Ignore comments for now */ }
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 101 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( BEGINTOK); }
+#line 193 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return BEGINTOK; }
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 102 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ENDTOK); }
+#line 194 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ENDTOK; }
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 103 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TRUETOK); }
+#line 195 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TRUETOK; }
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 104 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FALSETOK); }
+#line 196 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return FALSETOK; }
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 105 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DECLARE); }
+#line 197 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DECLARE; }
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 106 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( GLOBAL); }
+#line 198 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return GLOBAL; }
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 107 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CONSTANT); }
+#line 199 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return CONSTANT; }
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 108 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( INTERNAL); }
+#line 200 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return INTERNAL; }
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 109 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LINKONCE); }
+#line 201 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return LINKONCE; }
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 110 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( WEAK); }
+#line 202 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return WEAK; }
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 111 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( APPENDING); }
+#line 203 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return APPENDING; }
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 112 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DLLIMPORT); }
+#line 204 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DLLIMPORT; }
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 113 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DLLEXPORT); }
+#line 205 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DLLEXPORT; }
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 114 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EXTERN_WEAK); }
+#line 206 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EXTERN_WEAK; }
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 115 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EXTERNAL); }
+#line 207 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EXTERNAL; } /* Deprecated, turn into external */
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 116 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UNINITIALIZED); } // alias for external
+#line 208 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EXTERNAL; }
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 117 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( IMPLEMENTATION); }
+#line 209 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return IMPLEMENTATION; }
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 118 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ZEROINITIALIZER); }
+#line 210 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ZEROINITIALIZER; }
YY_BREAK
case 20:
YY_RULE_SETUP
-#line 119 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DOTDOTDOT); }
+#line 211 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DOTDOTDOT; }
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 120 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UNDEF); }
+#line 212 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UNDEF; }
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 121 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( NULL_TOK); }
+#line 213 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return NULL_TOK; }
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 122 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TO); }
+#line 214 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TO; }
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 123 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TAIL); }
+#line 215 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EXCEPT; }
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 124 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TARGET); }
+#line 216 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return NOT; } /* Deprecated, turned into XOR */
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 125 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TRIPLE); }
+#line 217 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TAIL; }
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 126 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DEPLIBS); }
+#line 218 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TARGET; }
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 127 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ENDIAN); }
+#line 219 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TRIPLE; }
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 128 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( POINTERSIZE); }
+#line 220 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DEPLIBS; }
YY_BREAK
case 30:
YY_RULE_SETUP
-#line 129 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DATALAYOUT); }
+#line 221 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ENDIAN; }
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 130 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LITTLE); }
+#line 222 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return POINTERSIZE; }
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 131 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( BIG); }
+#line 223 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return DATALAYOUT; }
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 132 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( VOLATILE); }
+#line 224 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return LITTLE; }
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 133 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ALIGN); }
+#line 225 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return BIG; }
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 134 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SECTION); }
+#line 226 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return VOLATILE; }
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 135 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( MODULE); }
+#line 227 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ALIGN; }
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 136 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ASM_TOK); }
+#line 228 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SECTION; }
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 137 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SIDEEFFECT); }
+#line 229 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return MODULE; }
YY_BREAK
case 39:
YY_RULE_SETUP
-#line 139 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CC_TOK); }
+#line 230 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ASM_TOK; }
YY_BREAK
case 40:
YY_RULE_SETUP
-#line 140 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CCC_TOK); }
+#line 231 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SIDEEFFECT; }
YY_BREAK
case 41:
YY_RULE_SETUP
-#line 141 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CSRETCC_TOK); }
+#line 233 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return CC_TOK; }
YY_BREAK
case 42:
YY_RULE_SETUP
-#line 142 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FASTCC_TOK); }
+#line 234 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return CCC_TOK; }
YY_BREAK
case 43:
YY_RULE_SETUP
-#line 143 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( COLDCC_TOK); }
+#line 235 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return CSRETCC_TOK; }
YY_BREAK
case 44:
YY_RULE_SETUP
-#line 144 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( X86_STDCALLCC_TOK); }
+#line 236 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return FASTCC_TOK; }
YY_BREAK
case 45:
YY_RULE_SETUP
-#line 145 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( X86_FASTCALLCC_TOK); }
+#line 237 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return COLDCC_TOK; }
YY_BREAK
case 46:
YY_RULE_SETUP
-#line 147 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(VOID,VoidTy,"void",false); }
+#line 238 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return X86_STDCALLCC_TOK; }
YY_BREAK
case 47:
YY_RULE_SETUP
-#line 148 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(BOOL,BoolTy,"i1",false); }
+#line 239 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return X86_FASTCALLCC_TOK; }
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 149 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(SBYTE,SByteTy,"i8",true); }
+#line 241 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(SBYTE, Type::Int8Ty, Signed); }
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 150 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(UBYTE,UByteTy,"i8",false); }
+#line 242 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(UBYTE, Type::Int8Ty, Unsigned); }
YY_BREAK
case 50:
YY_RULE_SETUP
-#line 151 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(SHORT,ShortTy,"i16",true); }
+#line 243 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(SHORT, Type::Int16Ty, Signed); }
YY_BREAK
case 51:
YY_RULE_SETUP
-#line 152 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(USHORT,UShortTy,"i16",false); }
+#line 244 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(USHORT, Type::Int16Ty, Unsigned); }
YY_BREAK
case 52:
YY_RULE_SETUP
-#line 153 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(INT,IntTy,"i32",true); }
+#line 245 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(INT, Type::Int32Ty, Signed); }
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 154 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(UINT,UIntTy,"i32",false); }
+#line 246 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(UINT, Type::Int32Ty, Unsigned); }
YY_BREAK
case 54:
YY_RULE_SETUP
-#line 155 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(LONG,LongTy,"i64",true); }
+#line 247 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(LONG, Type::Int64Ty, Signed); }
YY_BREAK
case 55:
YY_RULE_SETUP
-#line 156 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(ULONG,ULongTy,"i64",false); }
+#line 248 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(ULONG, Type::Int64Ty, Unsigned); }
YY_BREAK
case 56:
YY_RULE_SETUP
-#line 157 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(UBYTE,UByteTy,"i8",false); }
+#line 249 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(VOID, Type::VoidTy, Signless ); }
YY_BREAK
case 57:
YY_RULE_SETUP
-#line 158 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(USHORT,UShortTy,"i16",false); }
+#line 250 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(BOOL, Type::Int1Ty, Unsigned ); }
YY_BREAK
case 58:
YY_RULE_SETUP
-#line 159 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(UINT,UIntTy,"i32",false); }
+#line 251 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(FLOAT, Type::FloatTy, Signless ); }
YY_BREAK
case 59:
YY_RULE_SETUP
-#line 160 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(ULONG,ULongTy,"i64",false); }
+#line 252 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(DOUBLE, Type::DoubleTy,Signless); }
YY_BREAK
case 60:
YY_RULE_SETUP
-#line 161 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(FLOAT,FloatTy,"float",false); }
+#line 253 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TY(LABEL, Type::LabelTy, Signless ); }
YY_BREAK
case 61:
YY_RULE_SETUP
-#line 162 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(DOUBLE,DoubleTy,"double",false); }
+#line 254 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return TYPE; }
YY_BREAK
case 62:
YY_RULE_SETUP
-#line 163 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TY(LABEL,LabelTy,"label",false); }
+#line 255 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OPAQUE; }
YY_BREAK
case 63:
YY_RULE_SETUP
-#line 164 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OPAQUE); }
+#line 257 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, AddOp, ADD); }
YY_BREAK
case 64:
YY_RULE_SETUP
-#line 165 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(TYPE); }
+#line 258 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SubOp, SUB); }
YY_BREAK
case 65:
YY_RULE_SETUP
-#line 167 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ADD); }
+#line 259 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, MulOp, MUL); }
YY_BREAK
case 66:
YY_RULE_SETUP
-#line 168 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SUB); }
+#line 260 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, DivOp, DIV); }
YY_BREAK
case 67:
YY_RULE_SETUP
-#line 169 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( MUL); }
+#line 261 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, UDivOp, UDIV); }
YY_BREAK
case 68:
YY_RULE_SETUP
-#line 170 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( DIV); }
+#line 262 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SDivOp, SDIV); }
YY_BREAK
case 69:
YY_RULE_SETUP
-#line 171 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UDIV); }
+#line 263 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, FDivOp, FDIV); }
YY_BREAK
case 70:
YY_RULE_SETUP
-#line 172 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SDIV); }
+#line 264 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, RemOp, REM); }
YY_BREAK
case 71:
YY_RULE_SETUP
-#line 173 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FDIV); }
+#line 265 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, URemOp, UREM); }
YY_BREAK
case 72:
YY_RULE_SETUP
-#line 174 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( REM); }
+#line 266 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SRemOp, SREM); }
YY_BREAK
case 73:
YY_RULE_SETUP
-#line 175 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UREM); }
+#line 267 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, FRemOp, FREM); }
YY_BREAK
case 74:
YY_RULE_SETUP
-#line 176 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SREM); }
+#line 268 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, AndOp, AND); }
YY_BREAK
case 75:
YY_RULE_SETUP
-#line 177 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FREM); }
+#line 269 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, OrOp , OR ); }
YY_BREAK
case 76:
YY_RULE_SETUP
-#line 178 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( AND); }
+#line 270 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, XorOp, XOR); }
YY_BREAK
case 77:
YY_RULE_SETUP
-#line 179 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( OR); }
+#line 271 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetNE, SETNE); }
YY_BREAK
case 78:
YY_RULE_SETUP
-#line 180 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( XOR); }
+#line 272 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetEQ, SETEQ); }
YY_BREAK
case 79:
YY_RULE_SETUP
-#line 181 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETNE); }
+#line 273 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetLT, SETLT); }
YY_BREAK
case 80:
YY_RULE_SETUP
-#line 182 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETEQ); }
+#line 274 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetGT, SETGT); }
YY_BREAK
case 81:
YY_RULE_SETUP
-#line 183 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETLT); }
+#line 275 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetLE, SETLE); }
YY_BREAK
case 82:
YY_RULE_SETUP
-#line 184 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETGT); }
+#line 276 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(BinaryOpVal, SetGE, SETGE); }
YY_BREAK
case 83:
YY_RULE_SETUP
-#line 185 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETLE); }
+#line 277 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ICmpOp, ICMP); }
YY_BREAK
case 84:
YY_RULE_SETUP
-#line 186 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SETGE); }
+#line 278 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, FCmpOp, FCMP); }
YY_BREAK
case 85:
YY_RULE_SETUP
-#line 187 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ICMP); }
+#line 280 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return EQ; }
YY_BREAK
case 86:
YY_RULE_SETUP
-#line 188 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(FCMP); }
+#line 281 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return NE; }
YY_BREAK
case 87:
YY_RULE_SETUP
-#line 189 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(EQ); }
+#line 282 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SLT; }
YY_BREAK
case 88:
YY_RULE_SETUP
-#line 190 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(NE); }
+#line 283 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SGT; }
YY_BREAK
case 89:
YY_RULE_SETUP
-#line 191 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(SLT); }
+#line 284 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SLE; }
YY_BREAK
case 90:
YY_RULE_SETUP
-#line 192 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(SGT); }
+#line 285 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return SGE; }
YY_BREAK
case 91:
YY_RULE_SETUP
-#line 193 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(SLE); }
+#line 286 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ULT; }
YY_BREAK
case 92:
YY_RULE_SETUP
-#line 194 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(SGE); }
+#line 287 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UGT; }
YY_BREAK
case 93:
YY_RULE_SETUP
-#line 195 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OEQ); }
+#line 288 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ULE; }
YY_BREAK
case 94:
YY_RULE_SETUP
-#line 196 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ONE); }
+#line 289 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UGE; }
YY_BREAK
case 95:
YY_RULE_SETUP
-#line 197 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OLT); }
+#line 290 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OEQ; }
YY_BREAK
case 96:
YY_RULE_SETUP
-#line 198 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OGT); }
+#line 291 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ONE; }
YY_BREAK
case 97:
YY_RULE_SETUP
-#line 199 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OLE); }
+#line 292 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OLT; }
YY_BREAK
case 98:
YY_RULE_SETUP
-#line 200 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(OGE); }
+#line 293 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OGT; }
YY_BREAK
case 99:
YY_RULE_SETUP
-#line 201 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ORD); }
+#line 294 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OLE; }
YY_BREAK
case 100:
YY_RULE_SETUP
-#line 202 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UNO); }
+#line 295 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return OGE; }
YY_BREAK
case 101:
YY_RULE_SETUP
-#line 203 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UEQ); }
+#line 296 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return ORD; }
YY_BREAK
case 102:
YY_RULE_SETUP
-#line 204 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UNE); }
+#line 297 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UNO; }
YY_BREAK
case 103:
YY_RULE_SETUP
-#line 205 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ULT); }
+#line 298 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UEQ; }
YY_BREAK
case 104:
YY_RULE_SETUP
-#line 206 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UGT); }
+#line 299 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UNE; }
YY_BREAK
case 105:
YY_RULE_SETUP
-#line 207 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(ULE); }
+#line 301 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, PHIOp, PHI_TOK); }
YY_BREAK
case 106:
YY_RULE_SETUP
-#line 208 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK(UGE); }
+#line 302 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, CallOp, CALL); }
YY_BREAK
case 107:
YY_RULE_SETUP
-#line 210 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( PHI_TOK); }
+#line 303 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, CastOp, CAST); }
YY_BREAK
case 108:
YY_RULE_SETUP
-#line 211 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CALL); }
+#line 304 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, TruncOp, TRUNC); }
YY_BREAK
case 109:
YY_RULE_SETUP
-#line 212 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( CAST); }
+#line 305 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, ZExtOp , ZEXT); }
YY_BREAK
case 110:
YY_RULE_SETUP
-#line 213 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( TRUNC); }
+#line 306 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, SExtOp, SEXT); }
YY_BREAK
case 111:
YY_RULE_SETUP
-#line 214 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ZEXT); }
+#line 307 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, FPTruncOp, FPTRUNC); }
YY_BREAK
case 112:
YY_RULE_SETUP
-#line 215 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SEXT); }
+#line 308 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, FPExtOp, FPEXT); }
YY_BREAK
case 113:
YY_RULE_SETUP
-#line 216 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPTRUNC); }
+#line 309 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, FPToUIOp, FPTOUI); }
YY_BREAK
case 114:
YY_RULE_SETUP
-#line 217 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPEXT); }
+#line 310 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, FPToSIOp, FPTOSI); }
YY_BREAK
case 115:
YY_RULE_SETUP
-#line 218 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPTOUI); }
+#line 311 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, UIToFPOp, UITOFP); }
YY_BREAK
case 116:
YY_RULE_SETUP
-#line 219 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPTOSI); }
+#line 312 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, SIToFPOp, SITOFP); }
YY_BREAK
case 117:
YY_RULE_SETUP
-#line 220 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UITOFP); }
+#line 313 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, PtrToIntOp, PTRTOINT); }
YY_BREAK
case 118:
YY_RULE_SETUP
-#line 221 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SITOFP); }
+#line 314 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, IntToPtrOp, INTTOPTR); }
YY_BREAK
case 119:
YY_RULE_SETUP
-#line 222 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( PTRTOINT); }
+#line 315 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(CastOpVal, BitCastOp, BITCAST); }
YY_BREAK
case 120:
YY_RULE_SETUP
-#line 223 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( INTTOPTR); }
+#line 316 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, SelectOp, SELECT); }
YY_BREAK
case 121:
YY_RULE_SETUP
-#line 224 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( BITCAST); }
+#line 317 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ShlOp, SHL); }
YY_BREAK
case 122:
YY_RULE_SETUP
-#line 225 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SELECT); }
+#line 318 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ShrOp, SHR); }
YY_BREAK
case 123:
YY_RULE_SETUP
-#line 226 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SHL); }
+#line 319 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, LShrOp, LSHR); }
YY_BREAK
case 124:
YY_RULE_SETUP
-#line 227 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SHR); }
+#line 320 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, AShrOp, ASHR); }
YY_BREAK
case 125:
YY_RULE_SETUP
-#line 228 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ASHR); }
+#line 321 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return VANEXT_old; }
YY_BREAK
case 126:
YY_RULE_SETUP
-#line 229 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LSHR); }
+#line 322 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return VAARG_old; }
YY_BREAK
case 127:
YY_RULE_SETUP
-#line 230 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( VAARG); }
+#line 323 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, VAArg , VAARG); }
YY_BREAK
case 128:
YY_RULE_SETUP
-#line 231 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( RET); }
+#line 324 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, RetOp, RET); }
YY_BREAK
case 129:
YY_RULE_SETUP
-#line 232 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( BR); }
+#line 325 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, BrOp, BR); }
YY_BREAK
case 130:
YY_RULE_SETUP
-#line 233 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SWITCH); }
+#line 326 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, SwitchOp, SWITCH); }
YY_BREAK
case 131:
YY_RULE_SETUP
-#line 234 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( INVOKE); }
+#line 327 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, InvokeOp, INVOKE); }
YY_BREAK
case 132:
YY_RULE_SETUP
-#line 235 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UNWIND); }
+#line 328 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ return UNWIND; }
YY_BREAK
case 133:
YY_RULE_SETUP
-#line 236 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EXCEPT); } // alias for unwind
+#line 329 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(TermOpVal, UnreachableOp, UNREACHABLE); }
YY_BREAK
case 134:
YY_RULE_SETUP
-#line 237 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UNREACHABLE); }
+#line 331 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, MallocOp, MALLOC); }
YY_BREAK
case 135:
YY_RULE_SETUP
-#line 239 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( MALLOC); }
+#line 332 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, AllocaOp, ALLOCA); }
YY_BREAK
case 136:
YY_RULE_SETUP
-#line 240 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ALLOCA); }
+#line 333 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, FreeOp, FREE); }
YY_BREAK
case 137:
YY_RULE_SETUP
-#line 241 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FREE); }
+#line 334 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, LoadOp, LOAD); }
YY_BREAK
case 138:
YY_RULE_SETUP
-#line 242 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LOAD); }
+#line 335 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, StoreOp, STORE); }
YY_BREAK
case 139:
YY_RULE_SETUP
-#line 243 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( STORE); }
+#line 336 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(MemOpVal, GetElementPtrOp, GETELEMENTPTR); }
YY_BREAK
case 140:
YY_RULE_SETUP
-#line 244 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( GETELEMENTPTR); }
+#line 338 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ExtractElementOp, EXTRACTELEMENT); }
YY_BREAK
case 141:
YY_RULE_SETUP
-#line 246 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EXTRACTELEMENT); }
+#line 339 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, InsertElementOp, INSERTELEMENT); }
YY_BREAK
case 142:
YY_RULE_SETUP
-#line 247 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( INSERTELEMENT); }
+#line 340 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ RET_TOK(OtherOpVal, ShuffleVectorOp, SHUFFLEVECTOR); }
YY_BREAK
case 143:
YY_RULE_SETUP
-#line 248 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SHUFFLEVECTOR); }
+#line 343 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+ UnEscapeLexed(yytext+1);
+ Upgradelval.StrVal = strdup(yytext+1); // Skip %
+ return VAR_ID;
+ }
YY_BREAK
case 144:
YY_RULE_SETUP
-#line 251 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( VAR_ID); }
+#line 348 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+ yytext[strlen(yytext)-1] = 0; // nuke colon
+ UnEscapeLexed(yytext);
+ Upgradelval.StrVal = strdup(yytext);
+ return LABELSTR;
+ }
YY_BREAK
case 145:
YY_RULE_SETUP
-#line 252 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LABELSTR); }
+#line 354 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+ yytext[strlen(yytext)-2] = 0; // nuke colon, end quote
+ UnEscapeLexed(yytext+1);
+ Upgradelval.StrVal = strdup(yytext+1);
+ return LABELSTR;
+ }
YY_BREAK
case 146:
YY_RULE_SETUP
-#line 253 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( LABELSTR); }
+#line 361 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ // Note that we cannot unescape a string constant here! The
+ // string constant might contain a \00 which would not be
+ // understood by the string stuff. It is valid to make a
+ // [sbyte] c"Hello World\00" constant, for example.
+ //
+ yytext[strlen(yytext)-1] = 0; // nuke end quote
+ Upgradelval.StrVal = strdup(yytext+1); // Nuke start quote
+ return STRINGCONSTANT;
+ }
YY_BREAK
case 147:
YY_RULE_SETUP
-#line 254 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( STRINGCONSTANT ); }
+#line 372 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ Upgradelval.UInt64Val = atoull(yytext); return EUINT64VAL; }
YY_BREAK
case 148:
YY_RULE_SETUP
-#line 255 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( EUINT64VAL ); }
+#line 373 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+ uint64_t Val = atoull(yytext+1);
+ // +1: we have bigger negative range
+ if (Val > (uint64_t)INT64_MAX+1)
+ error("Constant too large for signed 64 bits!");
+ Upgradelval.SInt64Val = -Val;
+ return ESINT64VAL;
+ }
YY_BREAK
case 149:
YY_RULE_SETUP
-#line 256 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( ESINT64VAL ); }
+#line 381 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+ Upgradelval.UInt64Val = HexIntToVal(yytext+3);
+ return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL;
+ }
YY_BREAK
case 150:
YY_RULE_SETUP
-#line 257 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( yytext[0] == 's' ? ESINT64VAL : EUINT64VAL ); }
+#line 386 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+ uint64_t Val = atoull(yytext+1);
+ if ((unsigned)Val != Val)
+ error("Invalid value number (too large)!");
+ Upgradelval.UIntVal = unsigned(Val);
+ return UINTVAL;
+ }
YY_BREAK
case 151:
YY_RULE_SETUP
-#line 258 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( UINTVAL); }
+#line 393 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{
+ uint64_t Val = atoull(yytext+2);
+ // +1: we have bigger negative range
+ if (Val > (uint64_t)INT32_MAX+1)
+ error("Constant too large for signed 32 bits!");
+ Upgradelval.SIntVal = (int)-Val;
+ return SINTVAL;
+ }
YY_BREAK
case 152:
YY_RULE_SETUP
-#line 259 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( SINTVAL); }
+#line 402 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ Upgradelval.FPVal = atof(yytext); return FPVAL; }
YY_BREAK
case 153:
YY_RULE_SETUP
-#line 260 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPVAL); }
- YY_BREAK
-case 154:
-YY_RULE_SETUP
-#line 261 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
-{ RET_TOK( FPVAL); }
+#line 403 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
+{ Upgradelval.FPVal = HexToFP(yytext); return FPVAL; }
YY_BREAK
case YY_STATE_EOF(INITIAL):
-#line 262 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 405 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
{
/* Make sure to free the internal buffers for flex when we are
* done reading our input!
@@ -2007,22 +2141,22 @@ case YY_STATE_EOF(INITIAL):
return EOF;
}
YY_BREAK
-case 155:
+case 154:
YY_RULE_SETUP
-#line 270 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 413 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
{ /* Ignore whitespace */ }
YY_BREAK
-case 156:
+case 155:
YY_RULE_SETUP
-#line 271 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 414 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
{ return yytext[0]; }
YY_BREAK
-case 157:
+case 156:
YY_RULE_SETUP
-#line 273 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 416 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
-#line 2026 "UpgradeLexer.cpp"
+#line 2160 "UpgradeLexer.cpp"
case YY_END_OF_BUFFER:
{
@@ -2309,7 +2443,7 @@ static yy_state_type yy_get_previous_state()
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 608 )
+ if ( yy_current_state >= 610 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2339,11 +2473,11 @@ yy_state_type yy_current_state;
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 608 )
+ if ( yy_current_state >= 610 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 607);
+ yy_is_jam = (yy_current_state == 609);
if ( ! yy_is_jam )
*yy_state_ptr++ = yy_current_state;
@@ -2900,5 +3034,5 @@ int main()
return 0;
}
#endif
-#line 273 "/proj/llvm/llvm-2/tools/llvm-upgrade/UpgradeLexer.l"
+#line 416 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeLexer.l"
diff --git a/tools/llvm-upgrade/UpgradeLexer.l.cvs b/tools/llvm-upgrade/UpgradeLexer.l.cvs
index d58f461548..0105e26ae3 100644
--- a/tools/llvm-upgrade/UpgradeLexer.l.cvs
+++ b/tools/llvm-upgrade/UpgradeLexer.l.cvs
@@ -25,8 +25,9 @@
%option noyymore
%{
-
#include "UpgradeInternals.h"
+#include "llvm/Module.h"
+#include <list>
#include "UpgradeParser.h"
#include <cctype>
#include <cstdlib>
@@ -41,17 +42,108 @@
} \
}
+#define YY_NEVER_INTERACTIVE 1
// Construct a token value for a non-obsolete token
-#define RET_TOK(sym) \
- Upgradelval.String = new std::string(yytext); \
+#define RET_TOK(type, Enum, sym) \
+ Upgradelval.type = Enum; \
return sym
-#define RET_TY(sym,OldTY,NewTY,sign) \
- Upgradelval.Ty = getType(NewTY, OldTY); \
+#define RET_TY(sym,NewTY,sign) \
+ Upgradelval.PrimType.T = NewTY; \
+ Upgradelval.PrimType.S = sign; \
return sym
-#define YY_NEVER_INTERACTIVE 1
+namespace llvm {
+
+// TODO: All of the static identifiers are figured out by the lexer,
+// these should be hashed to reduce the lexer size
+
+// UnEscapeLexed - Run through the specified buffer and change \xx codes to the
+// appropriate character. If AllowNull is set to false, a \00 value will cause
+// an exception to be thrown.
+//
+// If AllowNull is set to true, the return value of the function points to the
+// last character of the string in memory.
+//
+char *UnEscapeLexed(char *Buffer, bool AllowNull) {
+ char *BOut = Buffer;
+ for (char *BIn = Buffer; *BIn; ) {
+ if (BIn[0] == '\\' && isxdigit(BIn[1]) && isxdigit(BIn[2])) {
+ char Tmp = BIn[3]; BIn[3] = 0; // Terminate string
+ *BOut = (char)strtol(BIn+1, 0, 16); // Convert to number
+ if (!AllowNull && !*BOut)
+ error("String literal cannot accept \\00 escape!");
+
+ BIn[3] = Tmp; // Restore character
+ BIn += 3; // Skip over handled chars
+ ++BOut;
+ } else {
+ *BOut++ = *BIn++;
+ }
+ }
+
+ return BOut;
+}
+
+// atoull - Convert an ascii string of decimal digits into the unsigned long
+// long representation... this does not have to do input error checking,
+// because we know that the input will be matched by a suitable regex...
+//
+static uint64_t atoull(const char *Buffer) {
+ uint64_t Result = 0;
+ for (; *Buffer; Buffer++) {
+ uint64_t OldRes = Result;
+ Result *= 10;
+ Result += *Buffer-'0';
+ if (Result < OldRes) // Uh, oh, overflow detected!!!
+ error("constant bigger than 64 bits detected!");
+ }
+ return Result;
+}
+
+static uint64_t HexIntToVal(const char *Buffer) {
+ uint64_t Result = 0;
+ for (; *Buffer; ++Buffer) {
+ uint64_t OldRes = Result;
+ Result *= 16;
+ char C = *Buffer;
+ if (C >= '0' && C <= '9')
+ Result += C-'0';
+ else if (C >= 'A' && C <= 'F')
+ Result += C-'A'+10;
+ else if (C >= 'a' && C <= 'f')
+ Result += C-'a'+10;
+
+ if (Result < OldRes) // Uh, oh, overflow detected!!!
+ error("constant bigger than 64 bits detected!");
+ }
+ return Result;
+}
+
+
+// HexToFP - Convert the ascii string in hexidecimal format to the floating
+// point representation of it.
+//
+static double HexToFP(const char *Buffer) {
+ // Behave nicely in the face of C TBAA rules... see:
+ // http://www.nullstone.com/htmls/category/aliastyp.htm
+ union {
+ uint64_t UI;
+ double FP;
+ } UIntToFP;
+ UIntToFP.UI = HexIntToVal(Buffer);
+
+ assert(sizeof(double) == sizeof(uint64_t) &&
+ "Data sizes incompatible on this target!");
+ return UIntToFP.FP; // Cast Hex constant to double
+}
+
+
+} // End llvm namespace
+
+using namespace llvm;
+
%}
@@ -98,168 +190,219 @@ HexIntConstant [us]0x[0-9A-Fa-f]+
{Comment} { /* Ignore comments for now */ }
-begin { RET_TOK( BEGINTOK); }
-end { RET_TOK( ENDTOK); }
-true { RET_TOK( TRUETOK); }
-false { RET_TOK( FALSETOK); }
-declare { RET_TOK( DECLARE); }
-global { RET_TOK( GLOBAL); }
-constant { RET_TOK( CONSTANT); }
-internal { RET_TOK( INTERNAL); }
-linkonce { RET_TOK( LINKONCE); }
-weak { RET_TOK( WEAK); }
-appending { RET_TOK( APPENDING); }
-dllimport { RET_TOK( DLLIMPORT); }
-dllexport { RET_TOK( DLLEXPORT); }
-extern_weak { RET_TOK( EXTERN_WEAK); }
-external { RET_TOK( EXTERNAL); }
-uninitialized { RET_TOK( UNINITIALIZED); } // alias for external
-implementation { RET_TOK( IMPLEMENTATION); }
-zeroinitializer { RET_TOK( ZEROINITIALIZER); }
-\.\.\. { RET_TOK( DOTDOTDOT); }
-undef { RET_TOK( UNDEF); }
-null { RET_TOK( NULL_TOK); }
-to { RET_TOK( TO); }
-tail { RET_TOK( TAIL); }
-target { RET_TOK( TARGET); }
-triple { RET_TOK( TRIPLE); }
-deplibs { RET_TOK( DEPLIBS); }
-endian { RET_TOK( ENDIAN); }
-pointersize { RET_TOK( POINTERSIZE); }
-datalayout { RET_TOK( DATALAYOUT); }
-little { RET_TOK( LITTLE); }
-big { RET_TOK( BIG); }
-volatile { RET_TOK( VOLATILE); }
-align { RET_TOK( ALIGN); }
-section { RET_TOK( SECTION); }
-module { RET_TOK( MODULE); }
-asm { RET_TOK( ASM_TOK); }
-sideeffect { RET_TOK( SIDEEFFECT); }
-
-cc { RET_TOK( CC_TOK); }
-ccc { RET_TOK( CCC_TOK); }
-csretcc { RET_TOK( CSRETCC_TOK); }
-fastcc { RET_TOK( FASTCC_TOK); }
-coldcc { RET_TOK( COLDCC_TOK); }
-x86_stdcallcc { RET_TOK( X86_STDCALLCC_TOK); }
-x86_fastcallcc { RET_TOK( X86_FASTCALLCC_TOK); }
-
-void { RET_TY(VOID,VoidTy,"void",false); }
-bool { RET_TY(BOOL,BoolTy,"i1",false); }
-sbyte { RET_TY(SBYTE,SByteTy,"i8",true); }
-ubyte { RET_TY(UBYTE,UByteTy,"i8",false); }
-short { RET_TY(SHORT,ShortTy,"i16",true); }
-ushort { RET_TY(USHORT,UShortTy,"i16",false); }
-int { RET_TY(INT,IntTy,"i32",true); }
-uint { RET_TY(UINT,UIntTy,"i32",false); }
-long { RET_TY(LONG,LongTy,"i64",true); }
-ulong { RET_TY(ULONG,ULongTy,"i64",false); }
-i8 { RET_TY(UBYTE,UByteTy,"i8",false); }
-i16 { RET_TY(USHORT,UShortTy,"i16",false); }
-i32 { RET_TY(UINT,UIntTy,"i32",false); }
-i64 { RET_TY(ULONG,ULongTy,"i64",false); }
-float { RET_TY(FLOAT,FloatTy,"float",false); }
-double { RET_TY(DOUBLE,DoubleTy,"double",false); }
-label { RET_TY(LABEL,LabelTy,"label",false); }
-opaque { RET_TOK(OPAQUE); }
-type { RET_TOK(TYPE); }
-
-add { RET_TOK( ADD); }
-sub { RET_TOK( SUB); }
-mul { RET_TOK( MUL); }
-div { RET_TOK( DIV); }
-udiv { RET_TOK( UDIV); }
-sdiv { RET_TOK( SDIV); }
-fdiv { RET_TOK( FDIV); }
-rem { RET_TOK( REM); }
-urem { RET_TOK( UREM); }
-srem { RET_TOK( SREM); }
-frem { RET_TOK( FREM); }
-and { RET_TOK( AND); }
-or { RET_TOK( OR); }
-xor { RET_TOK( XOR); }
-setne { RET_TOK( SETNE); }
-seteq { RET_TOK( SETEQ); }
-setlt { RET_TOK( SETLT); }
-setgt { RET_TOK( SETGT); }
-setle { RET_TOK( SETLE); }
-setge { RET_TOK( SETGE); }
-icmp { RET_TOK(ICMP); }
-fcmp { RET_TOK(FCMP); }
-eq { RET_TOK(EQ); }
-ne { RET_TOK(NE); }
-slt { RET_TOK(SLT); }
-sgt { RET_TOK(SGT); }
-sle { RET_TOK(SLE); }
-sge { RET_TOK(SGE); }
-oeq { RET_TOK(OEQ); }
-one { RET_TOK(ONE); }
-olt { RET_TOK(OLT); }
-ogt { RET_TOK(OGT); }
-ole { RET_TOK(OLE); }
-oge { RET_TOK(OGE); }
-ord { RET_TOK(ORD); }
-uno { RET_TOK(UNO); }
-ueq { RET_TOK(UEQ); }
-une { RET_TOK(UNE); }
-ult { RET_TOK(ULT); }
-ugt { RET_TOK(UGT); }
-ule { RET_TOK(ULE); }
-uge { RET_TOK(UGE); }
-
-phi { RET_TOK( PHI_TOK); }
-call { RET_TOK( CALL); }
-cast { RET_TOK( CAST); }
-trunc { RET_TOK( TRUNC); }
-zext { RET_TOK( ZEXT); }
-sext { RET_TOK( SEXT); }
-fptrunc { RET_TOK( FPTRUNC); }
-fpext { RET_TOK( FPEXT); }
-fptoui { RET_TOK( FPTOUI); }
-fptosi { RET_TOK( FPTOSI); }
-uitofp { RET_TOK( UITOFP); }
-sitofp { RET_TOK( SITOFP); }
-ptrtoint { RET_TOK( PTRTOINT); }
-inttoptr { RET_TOK( INTTOPTR); }
-bitcast { RET_TOK( BITCAST); }
-select { RET_TOK( SELECT); }
-shl { RET_TOK( SHL); }
-shr { RET_TOK( SHR); }
-ashr { RET_TOK( ASHR); }
-lshr { RET_TOK( LSHR); }
-va_arg { RET_TOK( VAARG); }
-ret { RET_TOK( RET); }
-br { RET_TOK( BR); }
-switch { RET_TOK( SWITCH); }
-invoke { RET_TOK( INVOKE); }
-unwind { RET_TOK( UNWIND); }
-except { RET_TOK( EXCEPT); } // alias for unwind
-unreachable { RET_TOK( UNREACHABLE); }
-
-malloc { RET_TOK( MALLOC); }
-alloca { RET_TOK( ALLOCA); }
-free { RET_TOK( FREE); }
-load { RET_TOK( LOAD); }
-store { RET_TOK( STORE); }
-getelementptr { RET_TOK( GETELEMENTPTR); }
-
-extractelement { RET_TOK( EXTRACTELEMENT); }
-insertelement { RET_TOK( INSERTELEMENT); }
-shufflevector { RET_TOK( SHUFFLEVECTOR); }
-
-
-{VarID} { RET_TOK( VAR_ID); }
-{Label} { RET_TOK( LABELSTR); }
-{QuoteLabel} { RET_TOK( LABELSTR); }
-{StringConstant} { RET_TOK( STRINGCONSTANT ); }
-{PInteger} { RET_TOK( EUINT64VAL ); }
-{NInteger} { RET_TOK( ESINT64VAL ); }
-{HexIntConstant} { RET_TOK( yytext[0] == 's' ? ESINT64VAL : EUINT64VAL ); }
-{EPInteger} { RET_TOK( UINTVAL); }
-{ENInteger} { RET_TOK( SINTVAL); }
-{FPConstant} { RET_TOK( FPVAL); }
-{HexFPConstant} { RET_TOK( FPVAL); }
-<<EOF>> {
+begin { return BEGINTOK; }
+end { return ENDTOK; }
+true { return TRUETOK; }
+false { return FALSETOK; }
+declare { return DECLARE; }
+global { return GLOBAL; }
+constant { return CONSTANT; }
+internal { return INTERNAL; }
+linkonce { return LINKONCE; }
+weak { return WEAK; }
+appending { return APPENDING; }
+dllimport { return DLLIMPORT; }
+dllexport { return DLLEXPORT; }
+extern_weak { return EXTERN_WEAK; }
+uninitialized { return EXTERNAL; } /* Deprecated, turn into external */
+external { return EXTERNAL; }
+implementation { return IMPLEMENTATION; }
+zeroinitializer { return ZEROINITIALIZER; }
+\.\.\. { return DOTDOTDOT; }
+undef { return UNDEF; }
+null { return NULL_TOK; }
+to { return TO; }
+except { return EXCEPT; }
+not { return NOT; } /* Deprecated, turned into XOR */
+tail { return TAIL; }
+target { return TARGET; }
+triple { return TRIPLE; }
+deplibs { return DEPLIBS; }
+endian { return ENDIAN; }
+pointersize { return POINTERSIZE; }
+datalayout { return DATALAYOUT; }
+little { return LITTLE; }
+big { return BIG; }
+volatile { return VOLATILE; }
+align { return ALIGN; }
+section { return SECTION; }
+module { return MODULE; }
+asm { return ASM_TOK; }
+sideeffect { return SIDEEFFECT; }
+
+cc { return CC_TOK; }
+ccc { return CCC_TOK; }
+csretcc { return CSRETCC_TOK; }
+fastcc { return FASTCC_TOK; }
+coldcc { return COLDCC_TOK; }
+x86_stdcallcc { return X86_STDCALLCC_TOK; }
+x86_fastcallcc { return X86_FASTCALLCC_TOK; }
+
+sbyte { RET_TY(SBYTE, Type::Int8Ty, Signed); }
+ubyte { RET_TY(UBYTE, Type::Int8Ty, Unsigned); }
+short { RET_TY(SHORT, Type::Int16Ty, Signed); }
+ushort { RET_TY(USHORT, Type::Int16Ty, Unsigned); }
+int { RET_TY(INT, Type::Int32Ty, Signed); }
+uint { RET_TY(UINT, Type::Int32Ty, Unsigned); }
+long { RET_TY(LONG, Type::Int64Ty, Signed); }
+ulong { RET_TY(ULONG, Type::Int64Ty, Unsigned); }
+void { RET_TY(VOID, Type::VoidTy, Signless ); }
+bool { RET_TY(BOOL, Type::Int1Ty, Unsigned ); }
+float { RET_TY(FLOAT, Type::FloatTy, Signless ); }
+double { RET_TY(DOUBLE, Type::DoubleTy,Signless); }
+label { RET_TY(LABEL, Type::LabelTy, Signless ); }
+type { return TYPE; }
+opaque { return OPAQUE; }
+
+add { RET_TOK(BinaryOpVal, AddOp, ADD); }
+sub { RET_TOK(BinaryOpVal, SubOp, SUB); }
+mul { RET_TOK(BinaryOpVal, MulOp, MUL); }
+div { RET_TOK(BinaryOpVal, DivOp, DIV); }
+udiv { RET_TOK(BinaryOpVal, UDivOp, UDIV); }
+sdiv { RET_TOK(BinaryOpVal, SDivOp, SDIV); }
+fdiv { RET_TOK(BinaryOpVal, FDivOp, FDIV); }
+rem { RET_TOK(BinaryOpVal, RemOp, REM); }
+urem { RET_TOK(BinaryOpVal, URemOp, UREM); }
+srem { RET_TOK(BinaryOpVal, SRemOp, SREM); }
+frem { RET_TOK(BinaryOpVal, FRemOp, FREM); }
+and { RET_TOK(BinaryOpVal, AndOp, AND); }
+or { RET_TOK(BinaryOpVal, OrOp , OR ); }
+xor { RET_TOK(BinaryOpVal, XorOp, XOR); }
+setne { RET_TOK(BinaryOpVal, SetNE, SETNE); }
+seteq { RET_TOK(BinaryOpVal, SetEQ, SETEQ); }
+setlt { RET_TOK(BinaryOpVal, SetLT, SETLT); }
+setgt { RET_TOK(BinaryOpVal, SetGT, SETGT); }
+setle { RET_TOK(BinaryOpVal, SetLE, SETLE); }
+setge { RET_TOK(BinaryOpVal, SetGE, SETGE); }
+icmp { RET_TOK(OtherOpVal, ICmpOp, ICMP); }
+fcmp { RET_TOK(OtherOpVal, FCmpOp, FCMP); }
+
+eq { return EQ; }
+ne { return NE; }
+slt { return SLT; }
+sgt { return SGT; }
+sle { return SLE; }
+sge { return SGE; }
+ult { return ULT; }
+ugt { return UGT; }
+ule { return ULE; }
+uge { return UGE; }
+oeq { return OEQ; }
+one { return ONE; }
+olt { return OLT; }
+ogt { return OGT; }
+ole { return OLE; }
+oge { return OGE; }
+ord { return ORD; }
+uno { return UNO; }
+ueq { return UEQ; }
+une { return UNE; }
+
+phi { RET_TOK(OtherOpVal, PHIOp, PHI_TOK); }
+call { RET_TOK(OtherOpVal, CallOp, CALL); }
+cast { RET_TOK(CastOpVal, CastOp, CAST); }
+trunc { RET_TOK(CastOpVal, TruncOp, TRUNC); }
+zext { RET_TOK(CastOpVal, ZExtOp , ZEXT); }
+sext { RET_TOK(CastOpVal, SExtOp, SEXT); }
+fptrunc { RET_TOK(CastOpVal, FPTruncOp, FPTRUNC); }
+fpext { RET_TOK(CastOpVal, FPExtOp, FPEXT); }
+fptoui { RET_TOK(CastOpVal, FPToUIOp, FPTOUI); }
+fptosi { RET_TOK(CastOpVal, FPToSIOp, FPTOSI); }
+uitofp { RET_TOK(CastOpVal, UIToFPOp, UITOFP); }
+sitofp { RET_TOK(CastOpVal, SIToFPOp, SITOFP); }
+ptrtoint { RET_TOK(CastOpVal, PtrToIntOp, PTRTOINT); }
+inttoptr { RET_TOK(CastOpVal, IntToPtrOp, INTTOPTR); }
+bitcast { RET_TOK(CastOpVal, BitCastOp, BITCAST); }
+select { RET_TOK(OtherOpVal, SelectOp, SELECT); }
+shl { RET_TOK(OtherOpVal, ShlOp, SHL); }
+shr { RET_TOK(OtherOpVal, ShrOp, SHR); }
+lshr { RET_TOK(OtherOpVal, LShrOp, LSHR); }
+ashr { RET_TOK(OtherOpVal, AShrOp, ASHR); }
+vanext { return VANEXT_old; }
+vaarg { return VAARG_old; }
+va_arg { RET_TOK(OtherOpVal, VAArg , VAARG); }
+ret { RET_TOK(TermOpVal, RetOp, RET); }
+br { RET_TOK(TermOpVal, BrOp, BR); }
+switch { RET_TOK(TermOpVal, SwitchOp, SWITCH); }
+invoke { RET_TOK(TermOpVal, InvokeOp, INVOKE); }
+unwind { return UNWIND; }
+unreachable { RET_TOK(TermOpVal, UnreachableOp, UNREACHABLE); }
+
+malloc { RET_TOK(MemOpVal, MallocOp, MALLOC); }
+alloca { RET_TOK(MemOpVal, AllocaOp, ALLOCA); }
+free { RET_TOK(MemOpVal, FreeOp, FREE); }
+load { RET_TOK(MemOpVal, LoadOp, LOAD); }
+store { RET_TOK(MemOpVal, StoreOp, STORE); }
+getelementptr { RET_TOK(MemOpVal, GetElementPtrOp, GETELEMENTPTR); }
+
+extractelement { RET_TOK(OtherOpVal, ExtractElementOp, EXTRACTELEMENT); }
+insertelement { RET_TOK(OtherOpVal, InsertElementOp, INSERTELEMENT); }
+shufflevector { RET_TOK(OtherOpVal, ShuffleVectorOp, SHUFFLEVECTOR); }
+
+
+{VarID} {
+ UnEscapeLexed(yytext+1);
+ Upgradelval.StrVal = strdup(yytext+1); // Skip %
+ return VAR_ID;
+ }
+{Label} {
+ yytext[strlen(yytext)-1] = 0; // nuke colon
+ UnEscapeLexed(yytext);
+ Upgradelval.StrVal = strdup(yytext);
+ return LABELSTR;
+ }
+{QuoteLabel} {
+ yytext[strlen(yytext)-2] = 0; // nuke colon, end quote
+ UnEscapeLexed(yytext+1);
+ Upgradelval.StrVal = strdup(yytext+1);
+ return LABELSTR;
+ }
+
+{StringConstant} { // Note that we cannot unescape a string constant here! The
+ // string constant might contain a \00 which would not be
+ // understood by the string stuff. It is valid to make a
+ // [sbyte] c"Hello World\00" constant, for example.
+ //
+ yytext[strlen(yytext)-1] = 0; // nuke end quote
+ Upgradelval.StrVal = strdup(yytext+1); // Nuke start quote
+ return STRINGCONSTANT;
+ }
+
+
+{PInteger} { Upgradelval.UInt64Val = atoull(yytext); return EUINT64VAL; }
+{NInteger} {
+ uint64_t Val = atoull(yytext+1);
+ // +1: we have bigger negative range
+ if (Val > (uint64_t)INT64_MAX+1)
+ error("Constant too large for signed 64 bits!");
+ Upgradelval.SInt64Val = -Val;
+ return ESINT64VAL;
+ }
+{HexIntConstant} {
+ Upgradelval.UInt64Val = HexIntToVal(yytext+3);
+ return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL;
+ }
+
+{EPInteger} {
+ uint64_t Val = atoull(yytext+1);
+ if ((unsigned)Val != Val)
+ error("Invalid value number (too large)!");
+ Upgradelval.UIntVal = unsigned(Val);
+ return UINTVAL;
+ }
+{ENInteger} {
+ uint64_t Val = atoull(yytext+2);
+ // +1: we have bigger negative range
+ if (Val > (uint64_t)INT32_MAX+1)
+ error("Constant too large for signed 32 bits!");
+ Upgradelval.SIntVal = (int)-Val;
+ return SINTVAL;
+ }
+
+{FPConstant} { Upgradelval.FPVal = atof(yytext); return FPVAL; }
+{HexFPConstant} { Upgradelval.FPVal = HexToFP(yytext); return FPVAL; }
+
+<<EOF>> {
/* Make sure to free the internal buffers for flex when we are
* done reading our input!
*/
diff --git a/tools/llvm-upgrade/UpgradeParser.cpp.cvs b/tools/llvm-upgrade/UpgradeParser.cpp.cvs
index b65ac101d2..acaeade09a 100644
--- a/tools/llvm-upgrade/UpgradeParser.cpp.cvs
+++ b/tools/llvm-upgrade/UpgradeParser.cpp.cvs
@@ -1,7 +1,7 @@
-/* A Bison parser, made from /usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y, by GNU bison 1.75. */
+/* 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 Free Software Foundation, Inc.
+ 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
@@ -15,8 +15,8 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ 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.
@@ -34,16 +34,21 @@
USER NAME SPACE" below. */
/* Identify Bison output. */
-#define YYBISON 1
+#define YYBISON 1
+
+/* Bison version. */
+#define YYBISON_VERSION "2.1"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
/* Pure parsers. */
-#define YYPURE 0
+#define YYPURE 0
/* Using locations. */
#define YYLSP_NEEDED 0
-/* If NAME_PREFIX is specified substitute the variables and functions
- names. */
+/* Substitute the variable and function names. */
#define yyparse Upgradeparse
#define yylex Upgradelex
#define yyerror Upgradeerror
@@ -59,61 +64,61 @@
/* 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,
+ ESINT64VAL = 258,
+ EUINT64VAL = 259,
+ SINTVAL = 260,
+ UINTVAL = 261,
+ FPVAL = 262,
+ VOID = 263,
+ BOOL = 264,
+ SBYTE = 265,
+ UBYTE = 266,
+ SHORT = 267,
+ USHORT = 268,
+ INT = 269,
+ UINT = 270,
+ LONG = 271,
+ ULONG = 272,
+ FLOAT = 273,
+ DOUBLE = 274,
+ TYPE = 275,
+ LABEL = 276,
+ VAR_ID = 277,
+ LABELSTR = 278,
+ STRINGCONSTANT = 279,
+ IMPLEMENTATION = 280,
+ ZEROINITIALIZER = 281,
+ TRUETOK = 282,
+ FALSETOK = 283,
+ BEGINTOK = 284,
+ ENDTOK = 285,
+ DECLARE = 286,
+ GLOBAL = 287,
+ CONSTANT = 288,
+ SECTION = 289,
+ VOLATILE = 290,
+ TO = 291,
+ DOTDOTDOT = 292,
+ NULL_TOK = 293,
+ UNDEF = 294,
+ CONST = 295,
+ INTERNAL = 296,
+ LINKONCE = 297,
+ WEAK = 298,
+ APPENDING = 299,
DLLIMPORT = 300,
DLLEXPORT = 301,
EXTERN_WEAK = 302,
- APPENDING = 303,
- EXTERNAL = 304,
- TARGET = 305,
- TRIPLE = 306,
- ENDIAN = 307,
- POINTERSIZE = 308,
- LITTLE = 309,
- BIG = 310,
- ALIGN = 311,
- UNINITIALIZED = 312,
+ OPAQUE = 303,
+ NOT = 304,
+ EXTERNAL = 305,
+ TARGET = 306,
+ TRIPLE = 307,
+ ENDIAN = 308,
+ POINTERSIZE = 309,
+ LITTLE = 310,
+ BIG = 311,
+ ALIGN = 312,
DEPLIBS = 313,
CALL = 314,
TAIL = 315,
@@ -132,9 +137,9 @@
BR = 328,
SWITCH = 329,
INVOKE = 330,
- EXCEPT = 331,
+ UNREACHABLE = 331,
UNWIND = 332,
- UNREACHABLE = 333,
+ EXCEPT = 333,
ADD = 334,
SUB = 335,
MUL = 336,
@@ -157,112 +162,115 @@
SETNE = 353,
ICMP = 354,
FCMP = 355,
- EQ = 356,
- NE = 357,
- SLT = 358,
- SGT = 359,
- SLE = 360,
- SGE = 361,
- OEQ = 362,
- ONE = 363,
- OLT = 364,
- OGT = 365,
- OLE = 366,
- OGE = 367,
- ORD = 368,
- UNO = 369,
- UEQ = 370,
- UNE = 371,
- ULT = 372,
- UGT = 373,
- ULE = 374,
- UGE = 375,
- MALLOC = 376,
- ALLOCA = 377,
- FREE = 378,
- LOAD = 379,
- STORE = 380,
- GETELEMENTPTR = 381,
- PHI_TOK = 382,
- SELECT = 383,
- SHL = 384,
- SHR = 385,
- ASHR = 386,
- LSHR = 387,
- VAARG = 388,
- EXTRACTELEMENT = 389,
- INSERTELEMENT = 390,
- SHUFFLEVECTOR = 391,
- CAST = 392,
- TRUNC = 393,
- ZEXT = 394,
- SEXT = 395,
- FPTRUNC = 396,
- FPEXT = 397,
- FPTOUI = 398,
- FPTOSI = 399,
- UITOFP = 400,
- SITOFP = 401,
- PTRTOINT = 402,
- INTTOPTR = 403,
- BITCAST = 404
+ MALLOC = 356,
+ ALLOCA = 357,
+ FREE = 358,
+ LOAD = 359,
+ STORE = 360,
+ GETELEMENTPTR = 361,
+ PHI_TOK = 362,
+ SELECT = 363,
+ SHL = 364,
+ SHR = 365,
+ ASHR = 366,
+ LSHR = 367,
+ VAARG = 368,
+ EXTRACTELEMENT = 369,
+ INSERTELEMENT = 370,
+ SHUFFLEVECTOR = 371,
+ VAARG_old = 372,
+ VANEXT_old = 373,
+ EQ = 374,
+ NE = 375,
+ SLT = 376,
+ SGT = 377,
+ SLE = 378,
+ SGE = 379,
+ ULT = 380,
+ UGT = 381,
+ ULE = 382,
+ UGE = 383,
+ OEQ = 384,
+ ONE = 385,
+ OLT = 386,
+ OGT = 387,
+ OLE = 388,
+ OGE = 389,
+ ORD = 390,
+ UNO = 391,
+ UEQ = 392,
+ UNE = 393,
+ CAST = 394,
+ TRUNC = 395,
+ ZEXT = 396,
+ SEXT = 397,
+ FPTRUNC = 398,
+ FPEXT = 399,
+ FPTOUI = 400,
+ FPTOSI = 401,
+ UITOFP = 402,
+ SITOFP = 403,
+ PTRTOINT = 404,
+ INTTOPTR = 405,
+ BITCAST = 406
};
#endif
-#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
+/* Tokens. */
+#define ESINT64VAL 258
+#define EUINT64VAL 259
+#define SINTVAL 260
+#define UINTVAL 261
+#define FPVAL 262
+#define VOID 263
+#define BOOL 264
+#define SBYTE 265
+#define UBYTE 266
+#define SHORT 267
+#define USHORT 268
+#define INT 269
+#define UINT 270
+#define LONG 271
+#define ULONG 272
+#define FLOAT 273
+#define DOUBLE 274
+#define TYPE 275
+#define LABEL 276
+#define VAR_ID 277
+#define LABELSTR 278
+#define STRINGCONSTANT 279
+#define IMPLEMENTATION 280
+#define ZEROINITIALIZER 281
+#define TRUETOK 282
+#define FALSETOK 283
+#define BEGINTOK 284
+#define ENDTOK 285
+#define DECLARE 286
+#define GLOBAL 287
+#define CONSTANT 288
+#define SECTION 289
+#define VOLATILE 290
+#define TO 291
+#define DOTDOTDOT 292
+#define NULL_TOK 293
+#define UNDEF 294
+#define CONST 295
+#define INTERNAL 296
+#define LINKONCE 297
+#define WEAK 298
+#define APPENDING 299
#define DLLIMPORT 300
#define DLLEXPORT 301
#define EXTERN_WEAK 302
-#define APPENDING 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 OPAQUE 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 DEPLIBS 313
#define CALL 314
#define TAIL 315
@@ -281,9 +289,9 @@
#define BR 328
#define SWITCH 329
#define INVOKE 330
-#define EXCEPT 331
+#define UNREACHABLE 331
#define UNWIND 332
-#define UNREACHABLE 333
+#define EXCEPT 333
#define ADD 334
#define SUB 335
#define MUL 336
@@ -306,1013 +314,1515 @@
#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
+#define MALLOC 356
+#define ALLOCA 357
+#define FREE 358
+#define LOAD 359
+#define STORE 360
+#define GETELEMENTPTR 361
+#define PHI_TOK 362
+#define SELECT 363
+#define SHL 364
+#define SHR 365
+#define ASHR 366
+#define LSHR 367
+#define VAARG 368
+#define EXTRACTELEMENT 369
+#define INSERTELEMENT 370
+#define SHUFFLEVECTOR 371
+#define VAARG_old 372
+#define VANEXT_old 373
+#define EQ 374
+#define NE 375
+#define SLT 376
+#define SGT 377
+#define SLE 378
+#define SGE 379
+#define ULT 380
+#define UGT 381
+#define ULE 382
+#define UGE 383
+#define OEQ 384
+#define ONE 385
+#define OLT 386
+#define OGT 387
+#define OLE 388
+#define OGE 389
+#define ORD 390
+#define UNO 391
+#define UEQ 392
+#define UNE 393
+#define CAST 394
+#define TRUNC 395
+#define ZEXT 396
+#define SEXT 397
+#define FPTRUNC 398
+#define FPEXT 399
+#define FPTOUI 400
+#define FPTOSI 401
+#define UITOFP 402
+#define SITOFP 403
+#define PTRTOINT 404
+#define INTTOPTR 405
+#define BITCAST 406
/* Copy the first part of user declarations. */
-#line 14 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 14 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
#include "UpgradeInternals.h"
+#include "llvm/CallingConv.h"
+#include "llvm/InlineAsm.h"
+#include "llvm/Instructions.h"
+#include "llvm/Module.h"
+#include "llvm/SymbolTable.h"
+#include "llvm/Support/GetElementPtrTypeIterator.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/MathExtras.h"
#include <algorithm>
-#include <map>
-#include <utility>
#include <iostream>
+#include <list>
+#include <utility>
+
+// DEBUG_UPREFS - Define this symbol if you want to enable debugging output
+// relating to upreferences in the input stream.
+//
+//#define DEBUG_UPREFS 1
+#ifdef DEBUG_UPREFS
+#define UR_OUT(X) std::cerr << X
+#else
+#define UR_OUT(X)
+#endif
#define YYERROR_VERBOSE 1
#define YYINCLUDED_STDLIB_H
#define YYDEBUG 1
-int yylex(); // declaration" of xxx warnings.
+int yylex();
int yyparse();
-extern int yydebug;
-static std::string CurFilename;
-static std::ostream *O = 0;
-std::istream* LexInput = 0;
-unsigned SizeOfPointer = 32;
+int yyerror(const char*);
+static void warning(const std::string& WarningMsg);
+namespace llvm {
-// This bool controls whether attributes are ever added to function declarations
-// definitions and calls.
-static bool AddAttributes = false;
-static void warning(const std::string& msg);
+SignedType *SignedType::SByteTy = 0;
+SignedType *SignedType::SShortTy = 0;
+SignedType *SignedType::SIntTy = 0;
+SignedType *SignedType::SLongTy = 0;
-void UpgradeAssembly(const std::string &infile, std::istream& in,
- std::ostream &out, bool debug, bool addAttrs)
+inline bool SignedType::classof(const Type *T) {
+ if (T->getTypeID() != IntegerTyID)
+ return false;
+ return (T == SByteTy || T == SShortTy || T == SIntTy || T == SLongTy );
+}
+
+SignedType::SignedType(const IntegerType* ITy)
+ : IntegerType(ITy->getBitWidth()), base_type(ITy)
{
- Upgradelineno = 1;
- CurFilename = infile;
- LexInput = &in;
- yydebug = debug;
- AddAttributes = addAttrs;
- O = &out;
+}
- if (yyparse()) {
- std::cerr << "llvm-upgrade: parse failed.\n";
- out << "llvm-upgrade: parse failed.\n";
- exit(1);
- }
+const SignedType *SignedType::get(const IntegerType* ITy) {
+ if (ITy == Type::Int8Ty) {
+ if (!SByteTy)
+ SByteTy = new SignedType(IntegerType::get(8));
+ return SByteTy;
+ } else if (ITy == Type::Int16Ty) {
+ if (!SShortTy)
+ SShortTy = new SignedType(IntegerType::get(16));
+ return SShortTy;
+ } else if (ITy == Type::Int32Ty) {
+ if (!SIntTy)
+ SIntTy = new SignedType(IntegerType::get(32));
+ return SIntTy;
+ } else if (ITy == Type::Int64Ty) {
+ if (!SLongTy)
+ SLongTy = new SignedType(IntegerType::get(64));
+ return SLongTy;
+ } else
+ assert(0 && "Invalid integer type for SignedType::get");
}
-namespace { // Anonymous namespace to keep our implementation local
+static inline Signedness getSign(const Type *&Ty) {
+ if (const SignedType *STy = dyn_cast<SignedType>(Ty)) {
+ Ty = STy->getBaseType();
+ return Signed;
+ } else if (isa<IntegerType>(Ty))
+ return Unsigned;
+ return Signless;
+}
+
+static const Type*
+resolveTypeImpl(const Type* Ty, std::vector<const Type*>& TyStack)
+{
+ // Nothing to resolve if it isn't a derived type
+ if (!Ty->isDerivedType())
+ return Ty;
+
+ // Prevent infinite recursion for recursive types
+ for (std::vector<const Type*>::const_iterator I = TyStack.begin(),
+ E = TyStack.end(); I != E; ++I)
+ if (Ty == *I)
+ return Ty;
+
+ // Okay, haven't seen this derived type yet, push it on the stack.
+ const Type* Result = Ty;
+ TyStack.push_back(Ty);
+
+ // Process the type
+ switch (Ty->getTypeID()) {
+ default: assert(0 && "Invalid derived type");
+ case Type::IntegerTyID:
+ break;
+ case Type::FunctionTyID: {
+ const FunctionType* FTy = cast<FunctionType>(Ty);
+ const Type* RetTy = resolveTypeImpl(FTy->getReturnType(), TyStack);
+ std::vector<const Type*> Types;
+ FunctionType::ParamAttrsList Attrs;
+ Attrs.push_back(FTy->getParamAttrs(0));
+ for (unsigned i = 0; i < FTy->getNumParams(); ++i) {
+ Types.push_back(resolveTypeImpl(FTy->getParamType(i), TyStack));
+ Attrs.push_back(FTy->getParamAttrs(i+1));
+ }
+ Result = FunctionType::get(RetTy, Types, FTy->isVarArg(), Attrs);
+ break;
+ }
+ case Type::StructTyID:
+ case Type::PackedStructTyID: {
+ const StructType *STy = cast<StructType>(Ty);
+ std::vector<const Type*> FieldTypes;
+ for (unsigned i = 0; i < STy->getNumElements(); ++i)
+ FieldTypes.push_back(resolveTypeImpl(STy->getElementType(i), TyStack));
+ Result = StructType::get(FieldTypes, STy->isPacked());
+ break;
+ }
+ case Type::ArrayTyID: {
+ const ArrayType *ATy = cast<ArrayType>(Ty);
+ uint64_t NElems = ATy->getNumElements();
+ const Type *ElemTy = resolveTypeImpl(ATy->getElementType(), TyStack);
+ Result = ArrayType::get(ElemTy, NElems);
+ break;
+ }
+ case Type::PointerTyID: {
+ const PointerType *PTy = cast<PointerType>(Ty);
+ const Type *ElemTy = resolveTypeImpl(PTy->getElementType(), TyStack);
+ Result = PointerType::get(ElemTy);
+ break;
+ }
+ case Type::PackedTyID: {
+ const PackedType *PTy = cast<PackedType>(Ty);
+ unsigned NElems = PTy->getNumElements();
+ const Type *ElemTy = resolveTypeImpl(PTy->getElementType(), TyStack);
+ Result = PackedType::get(ElemTy, NElems);
+ break;
+ }
+ }
+ // Done with it, pop it off.
+ TyStack.pop_back();
+ return Result;
+}
+static inline const Type* resolveType(const Type* Ty) {
+ if (!Ty)
+ return 0;
+ if (const SignedType* STy = dyn_cast<SignedType>(Ty))
+ return STy->getBaseType();
+ std::vector<const Type*> TyStack;
+ return resolveTypeImpl(Ty, TyStack);
+}
-/// This type is used to keep track of the signedness of values. Instead
-/// of creating llvm::Value directly, the parser will create Value which
-/// associates a Value* with a Signedness indication.
-struct Value {
- std::string* val;
- const Type* type;
- bool constant;
- bool isConstant() const { return constant; }
- ~Value() { delete val; }
-};
+std::istream* LexInput;
+static std::string CurFilename;
+// This bool controls whether attributes are ever added to function declarations
+// definitions and calls.
+static bool AddAttributes = false;
-/// This type is used to keep track of the signedness of the obsolete
-/// integer types. Instead of creating an llvm::Type directly, the Lexer will
-/// create instances of Type which retains the signedness indication so
-/// it can be used by the parser for upgrade decisions.
-/// For example if "uint" is encountered then the "first" field will be set
-/// to "int32" and the "second" field will be set to "isUnsigned". If the
-/// type is not obsolete then "second" will be set to "isSignless".
-class Type {
-public:
- static const Type* get(const std::string &newType, TypeIDs oldType);
- static const Type* get(const std::string& newType, TypeIDs oldType,
- const Type* eTy, const Type* rTy);
+static Module *ParserResult;
+static bool ObsoleteVarArgs;
+static bool NewVarArgs;
+static BasicBlock *CurBB;
+static GlobalVariable *CurGV;
+
+
+
+// This contains info used when building the body of a function. It is
+// destroyed when the function is completed.
+//
+typedef std::vector<Value *> ValueList; // Numbered defs
+
+typedef std::pair<std::string,const Type*> RenameMapKey;
+typedef std::map<RenameMapKey,std::string> RenameMapType;
+
+static void
+ResolveDefinitions(std::map<const Type *,ValueList> &LateResolvers,
+ std::map<const Type *,ValueList> *FutureLateResolvers = 0);
+
+static struct PerModuleInfo {
+ Module *CurrentModule;
+ std::map<const Type *, ValueList> Values; // Module level numbered definitions
+ std::map<const Type *,ValueList> LateResolveValues;
+ std::vector<PATypeHolder> Types;
+ std::map<ValID, PATypeHolder> LateResolveTypes;
+ static Module::Endianness Endian;
+ static Module::PointerSize PointerSize;
+ RenameMapType RenameMap;
+
+ /// PlaceHolderInfo - When temporary placeholder objects are created, remember
+ /// how they were referenced and on which line of the input they came from so
+ /// that we can resolve them later and print error messages as appropriate.
+ std::map<Value*, std::pair<ValID, int> > PlaceHolderInfo;
+
+ // GlobalRefs - This maintains a mapping between <Type, ValID>'s and forward
+ // references to global values. Global values may be referenced before they
+ // are defined, and if so, the temporary object that they represent is held
+ // here. This is used for forward references of GlobalValues.
+ //
+ typedef std::map<std::pair<const PointerType *, ValID>, GlobalValue*>
+ GlobalRefsType;
+ GlobalRefsType GlobalRefs;
+
+ void ModuleDone() {
+ // If we could not resolve some functions at function compilation time
+ // (calls to functions before they are defined), resolve them now... Types
+ // are resolved when the constant pool has been completely parsed.
+ //
+ ResolveDefinitions(LateResolveValues);
+
+ // Check to make sure that all global value forward references have been
+ // resolved!
+ //
+ if (!GlobalRefs.empty()) {
+ std::string UndefinedReferences = "Unresolved global references exist:\n";
+
+ for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end();
+ I != E; ++I) {
+ UndefinedReferences += " " + I->first.first->getDescription() + " " +
+ I->first.second.getName() + "\n";
+ }
+ error(UndefinedReferences);
+ return;
+ }
- static const Type* get(const std::string& newType, TypeIDs oldType,
- const Type *eTy, uint64_t elems);
+ if (CurrentModule->getDataLayout().empty()) {
+ std::string dataLayout;
+ if (Endian != Module::AnyEndianness)
+ dataLayout.append(Endian == Module::BigEndian ? "E" : "e");
+ if (PointerSize != Module::AnyPointerSize) {
+ if (!dataLayout.empty())
+ dataLayout += "-";
+ dataLayout.append(PointerSize == Module::Pointer64 ?
+ "p:64:64" : "p:32:32");
+ }
+ CurrentModule->setDataLayout(dataLayout);
+ }
- static const Type* get(const std::string& newType, TypeIDs oldType,
- TypeList* TL);
+ Values.clear(); // Clear out function local definitions
+ Types.clear();
+ CurrentModule = 0;
+ }
+
+ // GetForwardRefForGlobal - Check to see if there is a forward reference
+ // for this global. If so, remove it from the GlobalRefs map and return it.
+ // If not, just return null.
+ GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) {
+ // Check to see if there is a forward reference to this global variable...
+ // if there is, eliminate it and patch the reference to use the new def'n.
+ GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID));
+ GlobalValue *Ret = 0;
+ if (I != GlobalRefs.end()) {
+ Ret = I->second;
+ GlobalRefs.erase(I);
+ }
+ return Ret;
+ }
+ void setEndianness(Module::Endianness E) { Endian = E; }
+ void setPointerSize(Module::PointerSize sz) { PointerSize = sz; }
+} CurModule;
- static const Type* get(const std::string& newType, const Type* resTy,
- TypeList* TL);
+Module::Endianness PerModuleInfo::Endian = Module::AnyEndianness;
+Module::PointerSize PerModuleInfo::PointerSize = Module::AnyPointerSize;
- const Type* resolve() const;
- bool operator<(const Type& that) const;
+static struct PerFunctionInfo {
+ Function *CurrentFunction; // Pointer to current function being created
- bool sameNewTyAs(const Type* that) const {
- return this->newTy == that->newTy;
- }
+ std::map<const Type*, ValueList> Values; // Keep track of #'d definitions
+ std::map<const Type*, ValueList> LateResolveValues;
+ bool isDeclare; // Is this function a forward declararation?
+ GlobalValue::LinkageTypes Linkage;// Linkage for forward declaration.
- bool sameOldTyAs(const Type* that) const;
+ /// BBForwardRefs - When we see forward references to basic blocks, keep
+ /// track of them here.
+ std::map<BasicBlock*, std::pair<ValID, int> > BBForwardRefs;
+ std::vector<BasicBlock*> NumberedBlocks;
+ RenameMapType RenameMap;
+ std::set<Value*> SignedValues;
+ unsigned NextBBNum;
- TypeIDs getElementTy() const {
- if (elemTy) {
- return elemTy->oldTy;
- }
- return UnresolvedTy;
+ inline PerFunctionInfo() {
+ CurrentFunction = 0;
+ isDeclare = false;
+ Linkage = GlobalValue::ExternalLinkage;
}
- unsigned getUpRefNum() const {
- assert(oldTy == UpRefTy && "Can't getUpRefNum on non upreference");
- return atoi(&((getNewTy().c_str())[1])); // skip the slash
+ inline void FunctionStart(Function *M) {
+ CurrentFunction = M;
+ NextBBNum = 0;
}
- typedef std::vector<const Type*> UpRefStack;
- void getSignedness(unsigned &sNum, unsigned &uNum, UpRefStack& stk) const;
- std::string makeUniqueName(const std::string& BaseName) const;
+ void FunctionDone() {
+ NumberedBlocks.clear();
- const std::string& getNewTy() const { return newTy; }
- const Type* getResultType() const { return resultTy; }
- const Type* getElementType() const { return elemTy; }
+ // Any forward referenced blocks left?
+ if (!BBForwardRefs.empty()) {
+ error("Undefined reference to label " +
+ BBForwardRefs.begin()->first->getName());
+ return;
+ }
- const Type* getPointerType() const {
- return get(newTy + "*", PointerTy, this, (Type*)0);
- }
+ // Resolve all forward references now.
+ ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
- bool isUnresolved() const { return oldTy == UnresolvedTy; }
- bool isUpReference() const { return oldTy == UpRefTy; }
- bool isVoid() const { return oldTy == VoidTy; }
- bool isBool() const { return oldTy == BoolTy; }
- bool isSigned() const {
- return oldTy == SByteTy || oldTy == ShortTy ||
- oldTy == IntTy || oldTy == LongTy;
+ Values.clear(); // Clear out function local definitions
+ RenameMap.clear();
+ SignedValues.clear();
+ CurrentFunction = 0;
+ isDeclare = false;
+ Linkage = GlobalValue::ExternalLinkage;
}
+} CurFun; // Info for the current function...
- bool isUnsigned() const {
- return oldTy == UByteTy || oldTy == UShortTy ||
- oldTy == UIntTy || oldTy == ULongTy;
- }
- bool isSignless() const { return !isSigned() && !isUnsigned(); }
- bool isInteger() const { return isSigned() || isUnsigned(); }
- bool isIntegral() const { return oldTy == BoolTy || isInteger(); }
- bool isFloatingPoint() const { return oldTy == DoubleTy || oldTy == FloatTy; }
- bool isPacked() const { return oldTy == PackedTy; }
- bool isPointer() const { return oldTy == PointerTy; }
- bool isStruct() const { return oldTy == StructTy || oldTy == PackedStructTy; }
- bool isArray() const { return oldTy == ArrayTy; }
- bool isOther() const {
- return !isPacked() && !isPointer() && !isFloatingPoint() && !isIntegral(); }
- bool isFunction() const { return oldTy == FunctionTy; }
- bool isComposite() const {
- return isStruct() || isPointer() || isArray() || isPacked();
- }
+static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }
- bool isAttributeCandidate() const {
- return isIntegral() && getBitWidth() < 32;
- }
- bool isUnresolvedDeep() const;
+//===----------------------------------------------------------------------===//
+// Code to handle definitions of all the types
+//===----------------------------------------------------------------------===//
- unsigned getBitWidth() const;
+static int InsertValue(Value *V,
+ std::map<const Type*,ValueList> &ValueTab = CurFun.Values) {
+ if (V->hasName()) return -1; // Is this a numbered definition?
- const Type* getIndexedType(const Value* V) const;
+ // Yes, insert the value into the value table...
+ ValueList &List = ValueTab[V->getType()];
+ List.push_back(V);
+ return List.size()-1;
+}
- unsigned getNumStructElements() const {
- return (elements ? elements->size() : 0);
+static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
+ switch (D.Type) {
+ case ValID::NumberVal: // Is it a numbered definition?
+ // Module constants occupy the lowest numbered slots...
+ if ((unsigned)D.Num < CurModule.Types.size()) {
+ return CurModule.Types[(unsigned)D.Num];
+ }
+ break;
+ case ValID::NameVal: // Is it a named definition?
+ if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
+ D.destroy(); // Free old strdup'd memory...
+ return N;
+ }
+ break;
+ default:
+ error("Internal parser error: Invalid symbol type reference");
+ return 0;
}
- const Type* getElement(unsigned idx) const {
- if (elements)
- if (idx < elements->size())
- return (*elements)[idx];
- return 0;
+ // If we reached here, we referenced either a symbol that we don't know about
+ // or an id number that hasn't been read yet. We may be referencing something
+ // forward, so just create an entry to be resolved later and get to it...
+ //
+ if (DoNotImprovise) return 0; // Do we just want a null to be returned?
+
+
+ if (inFunctionScope()) {
+ if (D.Type == ValID::NameVal) {
+ error("Reference to an undefined type: '" + D.getName() + "'");
+ return 0;
+ } else {
+ error("Reference to an undefined type: #" + itostr(D.Num));
+ return 0;
+ }
}
-private:
- Type()
- : newTy(), oldTy(UnresolvedTy), elemTy(0), resultTy(0), elements(0),
- nelems(0) {
+ std::map<ValID, PATypeHolder>::iterator I =CurModule.LateResolveTypes.find(D);
+ if (I != CurModule.LateResolveTypes.end())
+ return I->second;
+
+ Type *Typ = OpaqueType::get();
+ CurModule.LateResolveTypes.insert(std::make_pair(D, Typ));
+ return Typ;
+ }
+
+// getExistingValue - Look up the value specified by the provided type and
+// the provided ValID. If the value exists and has already been defined, return
+// it. Otherwise return null.
+//
+static Value *getExistingValue(const Type *Ty, const ValID &D) {
+ if (isa<FunctionType>(Ty)) {
+ error("Functions are not values and must be referenced as pointers");
}
- Type(const Type& that); // do not implement
- Type& operator=(const Type& that); // do not implement
+ switch (D.Type) {
+ case ValID::NumberVal: { // Is it a numbered definition?
+ unsigned Num = (unsigned)D.Num;
+
+ // Module constants occupy the lowest numbered slots...
+ std::map<const Type*,ValueList>::iterator VI = CurModule.Values.find(Ty);
+ if (VI != CurModule.Values.end()) {
+ if (Num < VI->second.size())
+ return VI->second[Num];
+ Num -= VI->second.size();
+ }
- ~Type() { delete elements; }
+ // Make sure that our type is within bounds
+ VI = CurFun.Values.find(Ty);
+ if (VI == CurFun.Values.end()) return 0;
- struct ltfunctor
- {
- bool operator()(const Type* X, const Type* Y) const {
- assert(X && "Can't compare null pointer");
- assert(Y && "Can't compare null pointer");
- return *X < *Y;
+ // Check that the number is within bounds...
+ if (VI->second.size() <= Num) return 0;
+
+ return VI->second[Num];
+ }
+
+ case ValID::NameVal: { // Is it a named definition?
+ // Get the name out of the ID
+ std::string Name(D.Name);
+ Value* V = 0;
+ RenameMapKey Key = std::make_pair(Name, Ty);
+ if (inFunctionScope()) {
+ // See if the name was renamed
+ RenameMapType::const_iterator I = CurFun.RenameMap.find(Key);
+ std::string LookupName;
+ if (I != CurFun.RenameMap.end())
+ LookupName = I->second;
+ else
+ LookupName = Name;
+ SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
+ V = SymTab.lookup(Ty, LookupName);
}
- };
+ if (!V) {
+ RenameMapType::const_iterator I = CurModule.RenameMap.find(Key);
+ std::string LookupName;
+ if (I != CurModule.RenameMap.end())
+ LookupName = I->second;
+ else
+ LookupName = Name;
+ V = CurModule.CurrentModule->getValueSymbolTable().lookup(Ty, LookupName);
+ }
+ if (V == 0)
+ return 0;
- typedef std::set<const Type*, ltfunctor> TypeRegMap;
-
- static const Type* add_new_type(Type* existing);
-
- std::string newTy;
- TypeIDs oldTy;
- Type *elemTy;
- Type *resultTy;
- TypeList *elements;
- uint64_t nelems;
- static TypeRegMap registry;
-public:
- typedef std::vector<const Type*> TypeVector;
- typedef std::map<std::string,const Type*> TypeMap;
- typedef std::map<const Type*,std::string> TypePlaneMap;
- typedef std::map<std::string,TypePlaneMap> GlobalsTypeMap;
- static TypeVector EnumeratedTypes;
- static TypeMap NamedTypes;
- static GlobalsTypeMap Globals;
-};
+ D.destroy(); // Free old strdup'd memory...
+ return V;
+ }
-Type::TypeRegMap Type::registry;
-Type::TypeVector Type::EnumeratedTypes;
-Type::TypeMap Type::NamedTypes;
-Type::GlobalsTypeMap Type::Globals;
+ // Check to make sure that "Ty" is an integral type, and that our
+ // value will fit into the specified type...
+ case ValID::ConstSIntVal: // Is it a constant pool reference??
+ if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
+ error("Signed integral constant '" + itostr(D.ConstPool64) +
+ "' is invalid for type '" + Ty->getDescription() + "'");
+ }
+ return ConstantInt::get(Ty, D.ConstPool64);
+
+ case ValID::ConstUIntVal: // Is it an unsigned const pool reference?
+ if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
+ if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64))
+ error("Integral constant '" + utostr(D.UConstPool64) +
+ "' is invalid or out of range");
+ else // This is really a signed reference. Transmogrify.
+ return ConstantInt::get(Ty, D.ConstPool64);
+ } else
+ return ConstantInt::get(Ty, D.UConstPool64);
+
+ case ValID::ConstFPVal: // Is it a floating point const pool reference?
+ if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP))
+ error("FP constant invalid for type");
+ return ConstantFP::get(Ty, D.ConstPoolFP);
+
+ case ValID::ConstNullVal: // Is it a null value?
+ if (!isa<PointerType>(Ty))
+ error("Cannot create a a non pointer null");
+ return ConstantPointerNull::get(cast<PointerType>(Ty));
+
+ case ValID::ConstUndefVal: // Is it an undef value?
+ return UndefValue::get(Ty);
+
+ case ValID::ConstZeroVal: // Is it a zero value?
+ return Constant::getNullValue(Ty);
+
+ case ValID::ConstantVal: // Fully resolved constant?
+ if (D.ConstantValue->getType() != Ty)
+ error("Constant expression type different from required type");
+ return D.ConstantValue;
+
+ case ValID::InlineAsmVal: { // Inline asm expression
+ const PointerType *PTy = dyn_cast<PointerType>(Ty);
+ const FunctionType *FTy =
+ PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
+ if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints))
+ error("Invalid type for asm constraint string");
+ InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
+ D.IAD->HasSideEffects);
+ D.destroy(); // Free InlineAsmDescriptor.
+ return IA;
+ }
+ default:
+ assert(0 && "Unhandled case");
+ return 0;
+ } // End of switch
-const Type* Type::get(const std::string &newType, TypeIDs oldType) {
- Type* Ty = new Type();
- Ty->newTy = newType;
- Ty->oldTy = oldType;
- return add_new_type(Ty);
+ assert(0 && "Unhandled case");
+ return 0;
}
-const Type* Type::get(const std::string& newType, TypeIDs oldType,
- const Type* eTy, const Type* rTy) {
- Type* Ty= new Type();
- Ty->newTy = newType;
- Ty->oldTy = oldType;
- Ty->elemTy = const_cast<Type*>(eTy);
- Ty->resultTy = const_cast<Type*>(rTy);
- return add_new_type(Ty);
+// getVal - This function is identical to getExistingValue, except that if a
+// value is not already defined, it "improvises" by creating a placeholder var
+// that looks and acts just like the requested variable. When the value is
+// defined later, all uses of the placeholder variable are replaced with the
+// real thing.
+//
+static Value *getVal(const Type *Ty, const ValID &ID) {
+ if (Ty == Type::LabelTy)
+ error("Cannot use a basic block here");
+
+ // See if the value has already been defined.
+ Value *V = getExistingValue(Ty, ID);
+ if (V) return V;
+
+ if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty))
+ error("Invalid use of a composite type");
+
+ // If we reached here, we referenced either a symbol that we don't know about
+ // or an id number that hasn't been read yet. We may be referencing something
+ // forward, so just create an entry to be resolved later and get to it...
+ assert(!isa<SignedType>(Ty) && "Can't create value with SignedType");
+ V = new Argument(Ty);
+
+ // Remember where this forward reference came from. FIXME, shouldn't we try
+ // to recycle these things??
+ CurModule.PlaceHolderInfo.insert(
+ std::make_pair(V, std::make_pair(ID, Upgradelineno-1)));
+
+ if (inFunctionScope())
+ InsertValue(V, CurFun.LateResolveValues);
+ else
+ InsertValue(V, CurModule.LateResolveValues);
+ return V;
}
-const Type* Type::get(const std::string& newType, TypeIDs oldType,
- const Type *eTy, uint64_t elems) {
- Type* Ty = new Type();
- Ty->newTy = newType;
- Ty->oldTy = oldType;
- Ty->elemTy = const_cast<Type*>(eTy);
- Ty->nelems = elems;
- return add_new_type(Ty);
-}
+/// getBBVal - This is used for two purposes:
+/// * If isDefinition is true, a new basic block with the specified ID is being
+/// defined.
+/// * If isDefinition is true, this is a reference to a basic block, which may
+/// or may not be a forward reference.
+///
+static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {
+ assert(inFunctionScope() && "Can't get basic block at global scope");
+
+ std::string Name;
+ BasicBlock *BB = 0;
+ switch (ID.Type) {
+ default:
+ error("Illegal label reference " + ID.getName());
+ break;
+ case ValID::NumberVal: // Is it a numbered definition?
+ if (unsigned(ID.Num) >= CurFun.NumberedBlocks.size())
+ CurFun.NumberedBlocks.resize(ID.Num+1);
+ BB = CurFun.NumberedBlocks[ID.Num];
+ break;
+ case ValID::NameVal: // Is it a named definition?
+ Name = ID.Name;
+ if (Value *N = CurFun.CurrentFunction->
+ getValueSymbolTable().lookup(Type::LabelTy, Name)) {
+ if (N->getType() != Type::LabelTy)
+ error("Name '" + Name + "' does not refer to a BasicBlock");
+ BB = cast<BasicBlock>(N);
+ }
+ break;
+ }
-const Type* Type::get(const std::string& newType, TypeIDs oldType,
- TypeList* TL) {
- Type* Ty = new Type();
- Ty->newTy = newType;
- Ty->oldTy = oldType;
- Ty->elements = TL;
- return add_new_type(Ty);
-}
+ // See if the block has already been defined.
+ if (BB) {
+ // If this is the definition of the block, make sure the existing value was
+ // just a forward reference. If it was a forward reference, there will be
+ // an entry for it in the PlaceHolderInfo map.
+ if (isDefinition && !CurFun.BBForwardRefs.erase(BB))
+ // The existing value was a definition, not a forward reference.
+ error("Redefinition of label " + ID.getName());
+
+ ID.destroy(); // Free strdup'd memory.
+ return BB;
+ }
+
+ // Otherwise this block has not been seen before.
+ BB = new BasicBlock("", CurFun.CurrentFunction);
+ if (ID.Type == ValID::NameVal) {
+ BB->setName(ID.Name);
+ } else {
+ CurFun.NumberedBlocks[ID.Num] = BB;
+ }
-const Type* Type::get(const std::string& newType, const Type* resTy,
- TypeList* TL) {
- Type* Ty = new Type();
- Ty->newTy = newType;
- Ty->oldTy = FunctionTy;
- Ty->resultTy = const_cast<Type*>(resTy);
- Ty->elements = TL;
- return add_new_type(Ty);
+ // If this is not a definition, keep track of it so we can use it as a forward
+ // reference.
+ if (!isDefinition) {
+ // Remember where this forward reference came from.
+ CurFun.BBForwardRefs[BB] = std::make_pair(ID, Upgradelineno);
+ } else {
+ // The forward declaration could have been inserted anywhere in the
+ // function: insert it into the correct place now.
+ CurFun.CurrentFunction->getBasicBlockList().remove(BB);
+ CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
+ }
+ ID.destroy();
+ return BB;
}
-const Type* Type::resolve() const {
- if (isUnresolved()) {
- if (getNewTy()[0] == '%' && isdigit(newTy[1])) {
- unsigned ref = atoi(&((newTy.c_str())[1])); // skip the %
- if (ref < EnumeratedTypes.size()) {
- return EnumeratedTypes[ref];
- } else {
- std::string msg("Can't resolve numbered type: ");
- msg += getNewTy();
- yyerror(msg.c_str());
- }
- } else {
- Type::TypeMap::iterator I = NamedTypes.find(newTy);
- if (I != NamedTypes.end()) {
- return I->second;
+
+//===----------------------------------------------------------------------===//
+// Code to handle forward references in instructions
+//===----------------------------------------------------------------------===//
+//
+// This code handles the late binding needed with statements that reference
+// values not defined yet... for example, a forward branch, or the PHI node for
+// a loop body.
+//
+// This keeps a table (CurFun.LateResolveValues) of all such forward references
+// and back patchs after we are done.
+//
+
+// ResolveDefinitions - If we could not resolve some defs at parsing
+// time (forward branches, phi functions for loops, etc...) resolve the
+// defs now...
+//
+static void
+ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
+ std::map<const Type*,ValueList> *FutureLateResolvers) {
+ // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
+ for (std::map<const Type*,ValueList>::iterator LRI = LateResolvers.begin(),
+ E = LateResolvers.end(); LRI != E; ++LRI) {
+ ValueList &List = LRI->second;
+ while (!List.empty()) {
+ Value *V = List.back();
+ List.pop_back();
+
+ std::map<Value*, std::pair<ValID, int> >::iterator PHI =
+ CurModule.PlaceHolderInfo.find(V);
+ assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error");
+
+ ValID &DID = PHI->second.first;
+
+ Value *TheRealValue = getExistingValue(LRI->first, DID);
+ if (TheRealValue) {
+ V->replaceAllUsesWith(TheRealValue);
+ delete V;
+ CurModule.PlaceHolderInfo.erase(PHI);
+ } else if (FutureLateResolvers) {
+ // Functions have their unresolved items forwarded to the module late
+ // resolver table
+ InsertValue(V, *FutureLateResolvers);
} else {
- std::string msg("Cannot resolve type: ");
- msg += getNewTy();
- yyerror(msg.c_str());
+ if (DID.Type == ValID::NameVal) {
+ error("Reference to an invalid definition: '" +DID.getName()+
+ "' of type '" + V->getType()->getDescription() + "'",
+ PHI->second.second);
+ return;
+ } else {
+ error("Reference to an invalid definition: #" +
+ itostr(DID.Num) + " of type '" +
+ V->getType()->getDescription() + "'", PHI->second.second);
+ return;
+ }
}
}
}
- // otherwise its already resolved.
- return this;
+
+ LateResolvers.clear();
}
-bool Type::operator<(const Type& 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 Type* thisTy = this->elemTy;
- const Type* thatTy = that.elemTy;
- return *thisTy < *thatTy;
- }
- case FunctionTy: {
- const Type* thisTy = this->resultTy;
- const Type* 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 Type* thisTy = (*this->elements)[i];
- const Type* thatTy = (*that.elements)[i];
- if (!thisTy->sameOldTyAs(thatTy))
- return *thisTy < *thatTy;
- }
- break;
- }
- case UnresolvedTy:
- return this->newTy < that.newTy;
- default:
- break;
+// ResolveTypeTo - A brand new type was just declared. This means that (if
+// name is not null) things referencing Name can be resolved. Otherwise, things
+// refering to the number can be resolved. Do this now.
+//
+static void ResolveTypeTo(char *Name, const Type *ToTy) {
+ ValID D;
+ if (Name) D = ValID::create(Name);
+ else D = ValID::create((int)CurModule.Types.size());
+
+ std::map<ValID, PATypeHolder>::iterator I =
+ CurModule.LateResolveTypes.find(D);
+ if (I != CurModule.LateResolveTypes.end()) {
+ ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy);
+ CurModule.LateResolveTypes.erase(I);
}
- return false;
}
-bool Type::sameOldTyAs(const Type* 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 Type* thisTy = this->elemTy;
- const Type* thatTy = that->elemTy;
- return thisTy->sameOldTyAs(thatTy);
- }
- case FunctionTy: {
- const Type* thisTy = this->resultTy;
- const Type* thatTy = that->resultTy;
- if (!thisTy->sameOldTyAs(thatTy))
- return false;
- /* FALL THROUGH */
+static std::string makeNameUnique(const std::string& Name) {
+ static unsigned UniqueNameCounter = 1;
+ std::string Result(Name);
+ Result += ".upgrd." + llvm::utostr(UniqueNameCounter++);
+ return Result;
+}
+
+// setValueName - Set the specified value to the name given. The name may be
+// null potentially, in which case this is a noop. The string passed in is
+// assumed to be a malloc'd string buffer, and is free'd by this function.
+//
+static void setValueName(Value *V, char *NameStr) {
+ if (NameStr) {
+ std::string Name(NameStr); // Copy string
+ free(NameStr); // Free old string
+
+ if (V->getType() == Type::VoidTy) {
+ error("Can't assign name '" + Name + "' to value with void type");
+ return;
}
- case StructTy:
- case PackedStructTy: {
- if (elements->size() != that->elements->size())
- return false;
- for (unsigned i = 0; i < elements->size(); i++) {
- const Type* thisTy = (*this->elements)[i];
- const Type* thatTy = (*that->elements)[i];
- if (!thisTy->sameOldTyAs(thatTy))
- return false;
+
+ assert(!isa<SignedType>(V->getType()) && "Shouldn't have SignedType Value");
+ assert(inFunctionScope() && "Must be in function scope");
+
+ // Search the function's symbol table for an existing value of this name
+ Value* Existing = 0;
+ SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
+ SymbolTable::plane_const_iterator PI = ST.plane_begin(), PE =ST.plane_end();
+ for ( ; PI != PE; ++PI) {
+ SymbolTable::value_const_iterator VI = PI->second.find(Name);
+ if (VI != PI->second.end()) {
+ Existing = VI->second;
+ break;
}
- return true;
}
- case UnresolvedTy:
- return this->newTy == that->newTy;
- default:
- return true; // for all others oldTy == that->oldTy is sufficient
- }
- return true;
-}
+ if (Existing) {
+ if (Existing->getType() == V->getType()) {
+ // The type of the Existing value and the new one are the same. This
+ // is probably a type plane collapsing error. If the types involved
+ // are both integer, just rename it. Otherwise it
+ // is a redefinition error.
+ if (!Existing->getType()->isInteger()) {
+ error("Redefinition of value named '" + Name + "' in the '" +
+ V->getType()->getDescription() + "' type plane");
+ return;
+ }
+ }
+ // In LLVM 2.0 we don't allow names to be re-used for any values in a
+ // function, regardless of Type. Previously re-use of names was okay as
+ // long as they were distinct types. With type planes collapsing because
+ // of the signedness change and because of PR411, this can no longer be
+ // supported. We must search the entire symbol table for a conflicting
+ // name and make the name unique. No warning is needed as this can't
+ // cause a problem.
+ std::string NewName = makeNameUnique(Name);
+ // We're changing the name but it will probably be used by other
+ // instructions as operands later on. Consequently we have to retain
+ // a mapping of the renaming that we're doing.
+ RenameMapKey Key = std::make_pair(Name,V->getType());
+ CurFun.RenameMap[Key] = NewName;
+ Name = NewName;
+ }
-bool Type::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;
+ // Set the name.
+ V->setName(Name);
}
}
-unsigned Type::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;
- }
+/// ParseGlobalVariable - Handle parsing of a global. If Initializer is null,
+/// this is a declaration, otherwise it is a definition.
+static GlobalVariable *
+ParseGlobalVariable(char *NameStr,GlobalValue::LinkageTypes Linkage,
+ bool isConstantGlobal, const Type *Ty,
+ Constant *Initializer) {
+ if (isa<FunctionType>(Ty))
+ error("Cannot declare global vars of function type");
+
+ const PointerType *PTy = PointerType::get(Ty);
+
+ std::string Name;
+ if (NameStr) {
+ Name = NameStr; // Copy string
+ free(NameStr); // Free old string
}
-}
-const Type* Type::getIndexedType(const Value* V) const {
- if (isStruct()) {
- if (V->isConstant() && V->type->isInteger()) {
- size_t pos = V->val->find(' ') + 1;
- if (pos < V->val->size()) {
- uint64_t idx = atoi(V->val->substr(pos).c_str());
- return (*elements)[idx];
+ // See if this global value was forward referenced. If so, recycle the
+ // object.
+ ValID ID;
+ if (!Name.empty()) {
+ ID = ValID::create((char*)Name.c_str());
+ } else {
+ ID = ValID::create((int)CurModule.Values[PTy].size());
+ }
+
+ if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
+ // Move the global to the end of the list, from whereever it was
+ // previously inserted.
+ GlobalVariable *GV = cast<GlobalVariable>(FWGV);
+ CurModule.CurrentModule->getGlobalList().remove(GV);
+ CurModule.CurrentModule->getGlobalList().push_back(GV);
+ GV->setInitializer(Initializer);
+ GV->setLinkage(Linkage);
+ GV->setConstant(isConstantGlobal);
+ InsertValue(GV, CurModule.Values);
+ return GV;
+ }
+
+ // If this global has a name, check to see if there is already a definition
+ // of this global in the module and emit warnings if there are conflicts.
+ if (!Name.empty()) {
+ // The global has a name. See if there's an existing one of the same name.
+ if (CurModule.CurrentModule->getNamedGlobal(Name)) {
+ // We found an existing global ov the same name. This isn't allowed
+ // in LLVM 2.0. Consequently, we must alter the name of the global so it
+ // can at least compile. This can happen because of type planes
+ // There is alread a global of the same name which means there is a
+ // conflict. Let's see what we can do about it.
+ std::string NewName(makeNameUnique(Name));
+ if (Linkage == GlobalValue::InternalLinkage) {
+ // The linkage type is internal so just warn about the rename without
+ // invoking "scarey language" about linkage failures. GVars with
+ // InternalLinkage can be renamed at will.
+ warning("Global variable '" + Name + "' was renamed to '"+
+ NewName + "'");
} else {
- yyerror("Invalid value for constant integer");
- return 0;
+ // 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.
+ warning("Renaming global variable '" + Name + "' to '" + NewName +
+ "' may cause linkage errors");
}
- } else {
- yyerror("Structure requires constant index");
- return 0;
+
+ // Put the renaming in the global rename map
+ RenameMapKey Key = std::make_pair(Name,PointerType::get(Ty));
+ CurModule.RenameMap[Key] = NewName;
+
+ // Rename it
+ Name = NewName;
}
}
- if (isArray() || isPacked() || isPointer())
- return elemTy;
- yyerror("Invalid type for getIndexedType");
- return 0;
+
+ // Otherwise there is no existing GV to use, create one now.
+ GlobalVariable *GV =
+ new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
+ CurModule.CurrentModule);
+ InsertValue(GV, CurModule.Values);
+ return GV;
}
-void Type::getSignedness(unsigned &sNum, unsigned &uNum,
- UpRefStack& stack) const {
- switch (oldTy) {
- default:
- case OpaqueTy: case LabelTy: case VoidTy: case BoolTy:
- case FloatTy : case DoubleTy: case UpRefTy:
- return;
- case SByteTy: case ShortTy: case LongTy: case IntTy:
- sNum++;
- return;
- case UByteTy: case UShortTy: case UIntTy: case ULongTy:
- uNum++;
- return;
- case PointerTy:
- case PackedTy:
- case ArrayTy:
- stack.push_back(this);
- elemTy->getSignedness(sNum, uNum, stack);
- return;
- case StructTy:
- case PackedStructTy: {
- stack.push_back(this);
- for (unsigned i = 0; i < elements->size(); i++) {
- (*elements)[i]->getSignedness(sNum, uNum, stack);
- }
- return;
- }
- case UnresolvedTy: {
- const Type* Ty = this->resolve();
- // Let's not recurse.
- UpRefStack::const_iterator I = stack.begin(), E = stack.end();
- for ( ; I != E && *I != Ty; ++I)
- ;
- if (I == E)
- Ty->getSignedness(sNum, uNum, stack);
- return;
+// setTypeName - Set the specified type to the name given. The name may be
+// null potentially, in which case this is a noop. The string passed in is
+// assumed to be a malloc'd string buffer, and is freed by this function.
+//
+// This function returns true if the type has already been defined, but is
+// allowed to be redefined in the specified context. If the name is a new name
+// for the type plane, it is inserted and false is returned.
+static bool setTypeName(const Type *T, char *NameStr) {
+ assert(!inFunctionScope() && "Can't give types function-local names");
+ if (NameStr == 0) return false;
+
+ std::string Name(NameStr); // Copy string
+ free(NameStr); // Free old string
+
+ // We don't allow assigning names to void type
+ if (T == Type::VoidTy) {
+ error("Can't assign name '" + Name + "' to the void type");
+ return false;
+ }
+
+ // Set the type name, checking for conflicts as we do so.
+ bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T);
+
+ if (AlreadyExists) { // Inserting a name that is already defined???
+ const Type *Existing = CurModule.CurrentModule->getTypeByName(Name);
+ assert(Existing && "Conflict but no matching type?");
+
+ // There is only one case where this is allowed: when we are refining an
+ // opaque type. In this case, Existing will be an opaque type.
+ if (const OpaqueType *OpTy = dyn_cast<OpaqueType>(Existing)) {
+ // We ARE replacing an opaque type!
+ const_cast<OpaqueType*>(OpTy)->refineAbstractTypeTo(T);
+ return true;
}
+
+ // Otherwise, this is an attempt to redefine a type. That's okay if
+ // the redefinition is identical to the original. This will be so if
+ // Existing and T point to the same Type object. In this one case we
+ // allow the equivalent redefinition.
+ if (Existing == T) return true; // Yes, it's equal.
+
+ // Any other kind of (non-equivalent) redefinition is an error.
+ error("Redefinition of type named '" + Name + "' in the '" +
+ T->getDescription() + "' type plane");
}
+
+ return false;
}
-std::string AddSuffix(const std::string& Name, const std::string& Suffix) {
- if (Name[Name.size()-1] == '"') {
- std::string Result = Name;
- Result.insert(Result.size()-1, Suffix);
- return Result;
- }
- return Name + Suffix;
+//===----------------------------------------------------------------------===//
+// Code for handling upreferences in type names...
+//
+
+// TypeContains - Returns true if Ty directly contains E in it.
+//
+static bool TypeContains(const Type *Ty, const Type *E) {
+ return std::find(Ty->subtype_begin(), Ty->subtype_end(),
+ E) != Ty->subtype_end();
}
-std::string Type::makeUniqueName(const std::string& BaseName) const {
- if (BaseName == "\"alloca point\"")
- return BaseName;
- switch (oldTy) {
- default:
- break;
- case OpaqueTy: case LabelTy: case VoidTy: case BoolTy: case UpRefTy:
- case FloatTy : case DoubleTy: case UnresolvedTy:
- return BaseName;
- case SByteTy: case ShortTy: case LongTy: case IntTy:
- return AddSuffix(BaseName, ".s");
- case UByteTy: case UShortTy: case UIntTy: case ULongTy:
- return AddSuffix(BaseName, ".u");
- }
+namespace {
+ struct UpRefRecord {
+ // NestingLevel - The number of nesting levels that need to be popped before
+ // this type is resolved.
+ unsigned NestingLevel;
- unsigned uNum = 0, sNum = 0;
- std::string Suffix;
- switch (oldTy) {
- case PointerTy:
- case PackedTy:
- case ArrayTy: {
- Type::UpRefStack stack;
- elemTy->resolve()->getSignedness(sNum, uNum, stack);
- break;
- }
- case StructTy:
- case PackedStructTy: {
- for (unsigned i = 0; i < elements->size(); i++) {
- Type::UpRefStack stack;
- (*elements)[i]->resolve()->getSignedness(sNum, uNum, stack);
+ // LastContainedTy - This is the type at the current binding level for the
+ // type. Every time we reduce the nesting level, this gets updated.
+ const Type *LastContainedTy;
+
+ // UpRefTy - This is the actual opaque type that the upreference is
+ // represented with.
+ OpaqueType *UpRefTy;
+
+ UpRefRecord(unsigned NL, OpaqueType *URTy)
+ : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {}
+ };
+}
+
+// UpRefs - A list of the outstanding upreferences that need to be resolved.
+static std::vector<UpRefRecord> UpRefs;
+
+/// HandleUpRefs - Every time we finish a new layer of types, this function is
+/// called. It loops through the UpRefs vector, which is a list of the
+/// currently active types. For each type, if the up reference is contained in
+/// the newly completed type, we decrement the level count. When the level
+/// count reaches zero, the upreferenced type is the type that is passed in:
+/// thus we can complete the cycle.
+///
+static PATypeHolder HandleUpRefs(const Type *ty) {
+ // If Ty isn't abstract, or if there are no up-references in it, then there is
+ // nothing to resolve here.
+ if (!ty->isAbstract() || UpRefs.empty()) return ty;
+
+ PATypeHolder Ty(ty);
+ UR_OUT("Type '" << Ty->getDescription() <<
+ "' newly formed. Resolving upreferences.\n" <<
+ UpRefs.size() << " upreferences active!\n");
+
+ // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
+ // to zero), we resolve them all together before we resolve them to Ty. At
+ // the end of the loop, if there is anything to resolve to Ty, it will be in
+ // this variable.
+ OpaqueType *TypeToResolve = 0;
+
+ for (unsigned i = 0; i != UpRefs.size(); ++i) {
+ UR_OUT(" UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
+ << UpRefs[i].second->getDescription() << ") = "
+ << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n");
+ if (TypeContains(Ty, UpRefs[i].LastContainedTy)) {
+ // Decrement level of upreference
+ unsigned Level = --UpRefs[i].NestingLevel;
+ UpRefs[i].LastContainedTy = Ty;
+ UR_OUT(" Uplevel Ref Level = " << Level << "\n");
+ if (Level == 0) { // Upreference should be resolved!
+ if (!TypeToResolve) {
+ TypeToResolve = UpRefs[i].UpRefTy;
+ } else {
+ UR_OUT(" * Resolving upreference for "
+ << UpRefs[i].second->getDescription() << "\n";
+ std::string OldName = UpRefs[i].UpRefTy->getDescription());
+ UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
+ UR_OUT(" * Type '" << OldName << "' refined upreference to: "
+ << (const void*)Ty << ", " << Ty->getDescription() << "\n");
+ }
+ UpRefs.erase(UpRefs.begin()+i); // Remove from upreference list...
+ --i; // Do not skip the next element...
}
- break;
}
- default:
- assert(0 && "Invalid Type");
- break;
}
- if (sNum == 0 && uNum == 0)
- return BaseName;
-
- switch (oldTy) {
- default: Suffix += ".nada"; break;
- case PointerTy: Suffix += ".pntr"; break;
- case PackedTy: Suffix += ".pckd"; break;
- case ArrayTy: Suffix += ".arry"; break;
- case StructTy: Suffix += ".strc"; break;
- case PackedStructTy: Suffix += ".pstr"; break;
+ if (TypeToResolve) {
+ UR_OUT(" * Resolving upreference for "
+ << UpRefs[i].second->getDescription() << "\n";
+ std::string OldName = TypeToResolve->getDescription());
+ TypeToResolve->refineAbstractTypeTo(Ty);
}
- Suffix += ".s" + llvm::utostr(sNum);
- Suffix += ".u" + llvm::utostr(uNum);
- return AddSuffix(BaseName, Suffix);
+ return Ty;
}
-Type& Type::operator=(const Type& 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;
+static inline Instruction::TermOps
+getTermOp(TermOps op) {
+ switch (op) {
+ default : assert(0 && "Invalid OldTermOp");
+ case RetOp : return Instruction::Ret;
+ case BrOp : return Instruction::Br;
+ case SwitchOp : return Instruction::Switch;
+ case InvokeOp : return Instruction::Invoke;
+ case UnwindOp : return Instruction::Unwind;
+ case UnreachableOp: return Instruction::Unreachable;
}
- return *this;
}
-const Type* Type::add_new_type(Type* newTy) {
- TypeRegMap::iterator I = registry.find(newTy);
- if (I != registry.end()) {
- delete newTy;
- return *I;
+static inline Instruction::BinaryOps
+getBinaryOp(BinaryOps op, const Type *Ty, Signedness Sign) {
+ switch (op) {
+ default : assert(0 && "Invalid OldBinaryOps");
+ case SetEQ :
+ case SetNE :
+ case SetLE :
+ case SetGE :
+ case SetLT :
+ case SetGT : assert(0 && "Should use getCompareOp");
+ case AddOp : return Instruction::Add;
+ case SubOp : return Instruction::Sub;
+ case MulOp : return Instruction::Mul;
+ case DivOp : {
+ // This is an obsolete instruction so we must upgrade it based on the
+ // types of its operands.
+ bool isFP = Ty->isFloatingPoint();
+ if (const PackedType* PTy = dyn_cast<PackedType>(Ty))
+ // If its a packed type we want to use the element type
+ isFP = PTy->getElementType()->isFloatingPoint();
+ if (isFP)
+ return Instruction::FDiv;
+ else if (Sign == Signed)
+ return Instruction::SDiv;
+ return Instruction::UDiv;
+ }
+ case UDivOp : return Instruction::UDiv;
+ case SDivOp : return Instruction::SDiv;
+ case FDivOp : return Instruction::FDiv;
+ case RemOp : {
+ // This is an obsolete instruction so we must upgrade it based on the
+ // types of its operands.
+ bool isFP = Ty->isFloatingPoint();
+ if (const PackedType* PTy = dyn_cast<PackedType>(Ty))
+ // If its a packed type we want to use the element type
+ isFP = PTy->getElementType()->isFloatingPoint();
+ // Select correct opcode
+ if (isFP)
+ return Instruction::FRem;
+ else if (Sign == Signed)
+ return Instruction::SRem;
+ return Instruction::URem;
+ }
+ case URemOp : return Instruction::URem;
+ case SRemOp : return Instruction::SRem;
+ case FRemOp : return Instruction::FRem;
+ case AndOp : return Instruction::And;
+ case OrOp : return Instruction::Or;
+ case XorOp : return Instruction::Xor;
}
- registry.insert(newTy);
- return newTy;
}
-class Instruction {
-};
-
-/// This type is used to keep track of the signedness of constants.
-struct Constant {
- std::string *cnst;
- const Type *type;
- ~Constant() { delete cnst; }
-};
-
-/// This variable provides a counter for unique names. It is used in various
-/// productions to ensure a unique name is generated.
-static uint64_t UniqueNameCounter = 1;
-
-// This is set when a DECLARE keyword is recognized so that subsequent parsing
-// of a function prototype can know if its a declaration or definition.
-static bool isDeclare = false;
-
-// This bool is used to communicate between the InstVal and Inst rules about
-// whether or not a cast should be deleted. When the flag is set, InstVal has
-// determined that the cast is a candidate. However, it can only be deleted if
-// the value being casted is the same value name as the instruction. The Inst
-// rule makes that comparison if the flag is set and comments out the
-// instruction if they match.
-static bool deleteUselessCastFlag = false;
-static std::string* deleteUselessCastName = 0;
-
-
-
-const char* getCastOpcode(std::string& Source, const Type* SrcTy,
- const Type* DstTy) {
- unsigned SrcBits = SrcTy->getBitWidth();
- unsigned DstBits = DstTy->getBitWidth();
- const char* opcode = "bitcast";
- // Run through the possibilities ...
- if (DstTy->isIntegral()) { // Casting to integral
- if (SrcTy->isIntegral()) { // Casting from integral
- if (DstBits < SrcBits)
- opcode = "trunc";
- else if (DstBits > SrcBits) { // its an extension
- if (SrcTy->isSigned())
- opcode ="sext"; // signed -> SEXT
+static inline Instruction::OtherOps
+getCompareOp(BinaryOps op, unsigned short &predicate, const Type* &Ty,
+ Signedness Sign) {
+ bool isSigned = Sign == Signed;
+ bool isFP = Ty->isFloatingPoint();
+ switch (op) {
+ default : assert(0 && "Invalid OldSetCC");
+ case SetEQ :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OEQ;
+ return Instruction::FCmp;
+ } else {
+ predicate = ICmpInst::ICMP_EQ;
+ return Instruction::ICmp;
+ }
+ case SetNE :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_UNE;
+ return Instruction::FCmp;
+ } else {
+ predicate = ICmpInst::ICMP_NE;
+ return Instruction::ICmp;
+ }
+ case SetLE :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OLE;
+ return Instruction::FCmp;
+ } else {
+ if (isSigned)
+ predicate = ICmpInst::ICMP_SLE;
else
- opcode = "zext"; // unsigned -> ZEXT
+ predicate = ICmpInst::ICMP_ULE;
+ return Instruction::ICmp;
+ }
+ case SetGE :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OGE;
+ return Instruction::FCmp;
} else {
- opcode = "bitcast"; // Same size, No-op cast
+ if (isSigned)
+ predicate = ICmpInst::ICMP_SGE;
+ else
+ predicate = ICmpInst::ICMP_UGE;
+ return Instruction::ICmp;
}
- } else if (SrcTy->isFloatingPoint()) { // Casting from floating pt
- if (DstTy->isSigned())
- opcode = "fptosi"; // FP -> sint
- else
- opcode = "fptoui"; // FP -> uint
- } else if (SrcTy->isPacked()) {
- assert(DstBits == SrcTy->getBitWidth() &&
- "Casting packed to integer of different width");
- opcode = "bitcast"; // same size, no-op cast
- } else {
- assert(SrcTy->isPointer() &&
- "Casting from a value that is not first-class type");
- opcode = "ptrtoint"; // ptr -> int
- }
- } else if (DstTy->isFloatingPoint()) { // Casting to floating pt
- if (SrcTy->isIntegral()) { // Casting from integral
- if (SrcTy->isSigned())
- opcode = "sitofp"; // sint -> FP
- else
- opcode = "uitofp"; // uint -> FP
- } else if (SrcTy->isFloatingPoint()) { // Casting from floating pt
- if (DstBits < SrcBits) {
- opcode = "fptrunc"; // FP -> smaller FP
- } else if (DstBits > SrcBits) {
- opcode = "fpext"; // FP -> larger FP
- } else {
- opcode ="bitcast"; // same size, no-op cast
+ case SetLT :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OLT;
+ return Instruction::FCmp;
+ } else {
+ if (isSigned)
+ predicate = ICmpInst::ICMP_SLT;
+ else
+ predicate = ICmpInst::ICMP_ULT;
+ return Instruction::ICmp;
+ }
+ case SetGT :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OGT;
+ return Instruction::FCmp;
+ } else {
+ if (isSigned)
+ predicate = ICmpInst::ICMP_SGT;
+ else
+ predicate = ICmpInst::ICMP_UGT;
+ return Instruction::ICmp;
}
- } else if (SrcTy->isPacked()) {
- assert(DstBits == SrcTy->getBitWidth() &&
- "Casting packed to floating point of different width");
- opcode = "bitcast"; // same size, no-op cast
- } else {
- assert(0 && "Casting pointer or non-first class to float");
- }
- } else if (DstTy->isPacked()) {
- if (SrcTy->isPacked()) {
- assert(DstTy->getBitWidth() == SrcTy->getBitWidth() &&
- "Casting packed to packed of different widths");
- opcode = "bitcast"; // packed -> packed
- } else if (DstTy->getBitWidth() == SrcBits) {
- opcode = "bitcast"; // float/int -> packed
- } else {
- assert(!"Illegal cast to packed (wrong type or size)");
- }
- } else if (DstTy->isPointer()) {
- if (SrcTy->isPointer()) {
- opcode = "bitcast"; // ptr -> ptr
- } else if (SrcTy->isIntegral()) {
- opcode = "inttoptr"; // int -> ptr
- } else {
- assert(!"Casting invalid type to pointer");
- }
- } else {
- assert(!"Casting to type that is not first-class");
}
- return opcode;
}
-std::string getCastUpgrade(const std::string& Src, const Type* SrcTy,
- const Type* DstTy, bool isConst) {
- std::string Result;
- std::string Source = Src;
- if (SrcTy->isFloatingPoint() && DstTy->isPointer()) {
- // fp -> ptr cast is no longer supported but we must upgrade this
- // by doing a double cast: fp -> int -> ptr
- if (isConst)
- Source = "i64 fptoui(" + Source + " to i64)";
- else {
- *O << " %cast_upgrade" << UniqueNameCounter << " = fptoui "
- << Source << " to i64\n";
- Source = "i64 %cast_upgrade" + llvm::utostr(UniqueNameCounter++);
- }
- // Update the SrcTy for the getCastOpcode call below
- SrcTy = Type::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
- // the original intent by replacing the cast with a setne
- const char* comparator = SrcTy->isPointer() ? ", null" :
- (SrcTy->isFloatingPoint() ? ", 0.0" :
- (SrcTy->isBool() ? ", false" : ", 0"));
- const char* compareOp = SrcTy->isFloatingPoint() ? "fcmp one " : "icmp ne ";
- if (isConst) {
- Result = "(" + Source + comparator + ")";
- Result = compareOp + Result;
- } else
- Result = compareOp + Source + comparator;
- return Result; // skip cast processing below
+static inline Instruction::MemoryOps getMemoryOp(MemoryOps op) {
+ switch (op) {
+ default : assert(0 && "Invalid OldMemoryOps");
+ case MallocOp : return Instruction::Malloc;
+ case FreeOp : return Instruction::Free;
+ case AllocaOp : return Instruction::Alloca;
+ case LoadOp : return Instruction::Load;
+ case StoreOp : return Instruction::Store;
+ case GetElementPtrOp : return Instruction::GetElementPtr;
}
- SrcTy = SrcTy->resolve();
- DstTy = DstTy->resolve();
- std::string Opcode(getCastOpcode(Source, SrcTy, DstTy));
- if (isConst)
- Result += Opcode + "( " + Source + " to " + DstTy->getNewTy() + ")";
- else
- Result += Opcode + " " + Source + " to " + DstTy->getNewTy();
- return Result;
}
-const char* getDivRemOpcode(const std::string& opcode, const Type* TI) {
- const char* op = opcode.c_str();
- const Type* Ty = TI->resolve();
- if (Ty->isPacked())
- Ty = Ty->getElementType();
- if (opcode == "div")
- if (Ty->isFloatingPoint())
- op = "fdiv";
- else if (Ty->isUnsigned())
- op = "udiv";
- else if (Ty->isSigned())
- op = "sdiv";
- else
- yyerror("Invalid type for div instruction");
- else if (opcode == "rem")
- if (Ty->isFloatingPoint())
- op = "frem";
- else if (Ty->isUnsigned())
- op = "urem";
- else if (Ty->isSigned())
- op = "srem";
- else
- yyerror("Invalid type for rem instruction");
- return op;
+static inline Instruction::OtherOps
+getOtherOp(OtherOps op, Signedness Sign) {
+ switch (op) {
+ default : assert(0 && "Invalid OldOtherOps");
+ case PHIOp : return Instruction::PHI;
+ case CallOp : return Instruction::Call;
+ case ShlOp : return Instruction::Shl;
+ case ShrOp :
+ if (Sign == Signed)
+ return Instruction::AShr;
+ return Instruction::LShr;
+ case SelectOp : return Instruction::Select;
+ case UserOp1 : return Instruction::UserOp1;
+ case UserOp2 : return Instruction::UserOp2;
+ case VAArg : return Instruction::VAArg;
+ case ExtractElementOp : return Instruction::ExtractElement;
+ case InsertElementOp : return Instruction::InsertElement;
+ case ShuffleVectorOp : return Instruction::ShuffleVector;
+ case ICmpOp : return Instruction::ICmp;
+ case FCmpOp : return Instruction::FCmp;
+ case LShrOp : return Instruction::LShr;
+ case AShrOp : return Instruction::AShr;
+ };
}
-std::string getCompareOp(const std::string& setcc, const Type* TI) {
- assert(setcc.length() == 5);
- char cc1 = setcc[3];
- char cc2 = setcc[4];
- assert(cc1 == 'e' || cc1 == 'n' || cc1 == 'l' || cc1 == 'g');
- assert(cc2 == 'q' || cc2 == 'e' || cc2 == 'e' || cc2 == 't');
- std::string result("xcmp xxx");
- result[6] = cc1;
- result[7] = cc2;
- if (TI->isFloatingPoint()) {
- result[0] = 'f';
- result[5] = 'o';
- if (cc1 == 'n')
- result[5] = 'u'; // NE maps to unordered
- else
- result[5] = 'o'; // everything else maps to ordered
- } else if (TI->isIntegral() || TI->isPointer()) {
- result[0] = 'i';
- if ((cc1 == 'e' && cc2 == 'q') || (cc1 == 'n' && cc2 == 'e'))
- result.erase(5,1);
- else if (TI->isSigned())
- result[5] = 's';
- else if (TI->isUnsigned() || TI->isPointer() || TI->isBool())
- result[5] = 'u';
- else
- yyerror("Invalid integral type for setcc");
- }
- return result;
+static inline Value*
+getCast(CastOps op, Value *Src, Signedness SrcSign, const Type *DstTy,
+ Signedness DstSign, bool ForceInstruction = false) {
+ Instruction::CastOps Opcode;
+ const Type* SrcTy = Src->getType();
+ if (op == CastOp) {
+ if (SrcTy->isFloatingPoint() && isa<PointerType>(DstTy)) {
+ // fp -> ptr cast is no longer supported but we must upgrade this
+ // by doing a double cast: fp -> int -> ptr
+ SrcTy = Type::Int64Ty;
+ Opcode = Instruction::IntToPtr;
+ if (isa<Constant>(Src)) {
+ Src = ConstantExpr::getCast(Instruction::FPToUI,
+ cast<Constant>(Src), SrcTy);
+ } else {
+ std::string NewName(makeNameUnique(Src->getName()));
+ Src = new FPToUIInst(Src, SrcTy, NewName, CurBB);
+ }
+ } else if (isa<IntegerType>(DstTy) &&
+ cast<IntegerType>(DstTy)->getBitWidth() == 1) {
+ // 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
+ // the original intent by replacing the cast with a setne
+ Constant* Null = Constant::getNullValue(SrcTy);
+ Instruction::OtherOps Opcode = Instruction::ICmp;
+ unsigned short predicate = ICmpInst::ICMP_NE;
+ if (SrcTy->isFloatingPoint()) {
+ Opcode = Instruction::FCmp;
+ predicate = FCmpInst::FCMP_ONE;
+ } else if (!SrcTy->isInteger() && !isa<PointerType>(SrcTy)) {
+ error("Invalid cast to bool");
+ }
+ if (isa<Constant>(Src) && !ForceInstruction)
+ return ConstantExpr::getCompare(predicate, cast<Constant>(Src), Null);
+ else
+ return CmpInst::create(Opcode, predicate, Src, Null);
+ }
+ // Determine the opcode to use by calling CastInst::getCastOpcode
+ Opcode =
+ CastInst::getCastOpcode(Src, SrcSign == Signed, DstTy, DstSign == Signed);
+
+ } else switch (op) {
+ default: assert(0 && "Invalid cast token");
+ case TruncOp: Opcode = Instruction::Trunc; break;
+ case ZExtOp: Opcode = Instruction::ZExt; break;
+ case SExtOp: Opcode = Instruction::SExt; break;
+ case FPTruncOp: Opcode = Instruction::FPTrunc; break;
+ case FPExtOp: Opcode = Instruction::FPExt; break;
+ case FPToUIOp: Opcode = Instruction::FPToUI; break;
+ case FPToSIOp: Opcode = Instruction::FPToSI; break;
+ case UIToFPOp: Opcode = Instruction::UIToFP; break;
+ case SIToFPOp: Opcode = Instruction::SIToFP; break;
+ case PtrToIntOp: Opcode = Instruction::PtrToInt; break;
+ case IntToPtrOp: Opcode = Instruction::IntToPtr; break;
+ case BitCastOp: Opcode = Instruction::BitCast; break;
+ }
+
+ if (isa<Constant>(Src) && !ForceInstruction)
+ return ConstantExpr::getCast(Opcode, cast<Constant>(Src), DstTy);
+ return CastInst::create(Opcode, Src, DstTy);
}
-const Type* getFunctionReturnType(const Type* PFTy) {
- PFTy = PFTy->resolve();
- if (PFTy->isPointer()) {
- const Type* ElemTy = PFTy->getElementType();
- ElemTy = ElemTy->resolve();
- if (ElemTy->isFunction())
- return ElemTy->getResultType();
- } else if (PFTy->isFunction()) {
- return PFTy->getResultType();
- }
- return PFTy;
-}
+static Instruction *
+upgradeIntrinsicCall(const Type* RetTy, const ValID &ID,
+ std::vector<Value*>& Args) {
-const Type* ResolveUpReference(const Type* Ty,
- Type::UpRefStack* stack) {
- assert(Ty->isUpReference() && "Can't resolve a non-upreference");
- unsigned upref = Ty->getUpRefNum();
- assert(upref < stack->size() && "Invalid up reference");
- return (*stack)[upref - stack->size() - 1];
+ std::string Name = ID.Type == ValID::NameVal ? ID.Name : "";
+ if (Name == "llvm.isunordered.f32" || Name == "llvm.isunordered.f64") {
+ if (Args.size() != 2)
+ error("Invalid prototype for " + Name + " prototype");
+ return new FCmpInst(FCmpInst::FCMP_UNO, Args[0], Args[1]);
+ } else {
+ static unsigned upgradeCount = 1;
+ const Type* PtrTy = PointerType::get(Type::Int8Ty);
+ std::vector<const Type*> Params;
+ if (Name == "llvm.va_start" || Name == "llvm.va_end") {
+ if (Args.size() != 1)
+ error("Invalid prototype for " + Name + " prototype");
+ Params.push_back(PtrTy);
+ const FunctionType *FTy = FunctionType::get(Type::VoidTy, Params, false);
+ const PointerType *PFTy = PointerType::get(FTy);
+ Value* Func = getVal(PFTy, ID);
+ std::string InstName("va_upgrade");
+ InstName += llvm::utostr(upgradeCount++);
+ Args[0] = new BitCastInst(Args[0], PtrTy, InstName, CurBB);
+ return new CallInst(Func, Args);
+ } else if (Name == "llvm.va_copy") {
+ if (Args.size() != 2)
+ error("Invalid prototype for " + Name + " prototype");
+ Params.push_back(PtrTy);
+ Params.push_back(PtrTy);
+ const FunctionType *FTy = FunctionType::get(Type::VoidTy, Params, false);
+ const PointerType *PFTy = PointerType::get(FTy);
+ Value* Func = getVal(PFTy, ID);
+ std::string InstName0("va_upgrade");
+ InstName0 += llvm::utostr(upgradeCount++);
+ std::string InstName1("va_upgrade");
+ InstName1 += llvm::utostr(upgradeCount++);
+ Args[0] = new BitCastInst(Args[0], PtrTy, InstName0, CurBB);
+ Args[1] = new BitCastInst(Args[1], PtrTy, InstName1, CurBB);
+ return new CallInst(Func, Args);
+ }
+ }
+ return 0;
}
-const Type* getGEPIndexedType(const Type* PTy, ValueList* idxs) {
- const Type* Result = PTy = PTy->resolve();
- assert(PTy->isPointer() && "GEP Operand is not a pointer?");
- Type::UpRefStack stack;
- for (unsigned i = 0; i < idxs->size(); ++i) {
- if (Result->isComposite()) {
- Result = Result->getIndexedType((*idxs)[i]);
- Result = Result->resolve();
- stack.push_back(Result);
- } else
- yyerror("Invalid type for index");
- }
- // Resolve upreferences so we can return a more natural type
- if (Result->isPointer()) {
- if (Result->getElementType()->isUpReference()) {
- stack.push_back(Result);
- Result = ResolveUpReference(Result->getElementType(), &stack);
+const Type* upgradeGEPIndices(const Type* PTy,
+ std::vector<ValueInfo> *Indices,
+ std::vector<Value*> &VIndices,
+ std::vector<Constant*> *CIndices = 0) {
+ // Traverse the indices with a gep_type_iterator so we can build the list
+ // of constant and value indices for use later. Also perform upgrades
+ VIndices.clear();
+ if (CIndices) CIndices->clear();
+ for (unsigned i = 0, e = Indices->size(); i != e; ++i)
+ VIndices.push_back((*Indices)[i].V);
+ generic_gep_type_iterator<std::vector<Value*>::iterator>
+ GTI = gep_type_begin(PTy, VIndices.begin(), VIndices.end()),
+ GTE = gep_type_end(PTy, VIndices.begin(), VIndices.end());
+ for (unsigned i = 0, e = Indices->size(); i != e && GTI != GTE; ++i, ++GTI) {
+ Value *Index = VIndices[i];
+ if (CIndices && !isa<Constant>(Index))
+ error("Indices to constant getelementptr must be constants");
+ // LLVM 1.2 and earlier used ubyte struct indices. Convert any ubyte
+ // struct indices to i32 struct indices with ZExt for compatibility.
+ else if (isa<StructType>(*GTI)) { // Only change struct indices
+ if (ConstantInt *CUI = dyn_cast<ConstantInt>(Index))
+ if (CUI->getType()->getBitWidth() == 8)
+ Index =
+ ConstantExpr::getCast(Instruction::ZExt, CUI, Type::Int32Ty);
+ } else {
+ // Make sure that unsigned SequentialType indices are zext'd to
+ // 64-bits if they were smaller than that because LLVM 2.0 will sext
+ // all indices for SequentialType elements. We must retain the same
+ // semantic (zext) for unsigned types.
+ if (const IntegerType *Ity = dyn_cast<IntegerType>(Index->getType()))
+ if (Ity->getBitWidth() < 64 && (*Indices)[i].S == Unsigned)
+ if (CIndices)
+ Index = ConstantExpr::getCast(Instruction::ZExt,
+ cast<Constant>(Index), Type::Int64Ty);
+ else
+ Index = CastInst::create(Instruction::ZExt, Index, Type::Int64Ty,
+ "gep_upgrade", CurBB);
}
- } else if (Result->isUpReference()) {
- Result = ResolveUpReference(Result->getElementType(), &stack);
+ // Add to the CIndices list, if requested.
+ if (CIndices)
+ CIndices->push_back(cast<Constant>(Index));
}
- return Result->getPointerType();
+
+ const Type *IdxTy =
+ GetElementPtrInst::getIndexedType(PTy, VIndices, true);
+ if (!IdxTy)
+ error("Index list invalid for constant getelementptr");
+ return IdxTy;
}
-// This function handles appending .u or .s to integer value names that
-// 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.
-std::string getUniqueName(const std::string *Name, const Type* Ty,
- bool isGlobal = false, bool isDef = 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
- Ty = Ty->resolve();
-
- // If its a global name, get its uniquified name, if any
- Type::GlobalsTypeMap::iterator GI = Type::Globals.find(*Name);
- if (GI != Type::Globals.end()) {
- Type::TypePlaneMap::iterator TPI = GI->second.begin();
- Type::TypePlaneMap::iterator TPE = GI->second.end();
- for ( ; TPI != TPE ; ++TPI) {
- if (TPI->first->sameNewTyAs(Ty))
- return TPI->second;
- }
+Module* UpgradeAssembly(const std::string &infile, std::istream& in,
+ bool debug, bool addAttrs)
+{
+ Upgradelineno = 1;
+ CurFilename = infile;
+ LexInput = &in;
+ yydebug = debug;
+ AddAttributes = addAttrs;
+ ObsoleteVarArgs = false;
+ NewVarArgs = false;
+
+ CurModule.CurrentModule = new Module(CurFilename);
+
+ // Check to make sure the parser succeeded
+ if (yyparse()) {
+ if (ParserResult)
+ delete ParserResult;
+ std::cerr << "llvm-upgrade: parse failed.\n";
+ return 0;
}
- 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;
+ // Check to make sure that parsing produced a result
+ if (!ParserResult) {
+ std::cerr << "llvm-upgrade: no parse result.\n";
+ return 0;
}
- // Default the result to the current name
- std::string Result = Ty->makeUniqueName(*Name);
+ // Reset ParserResult variable while saving its value for the result.
+ Module *Result = ParserResult;
+ ParserResult = 0;
- return Result;
-}
+ //Not all functions use vaarg, so make a second check for ObsoleteVarArgs
+ {
+ Function* F;
+ if ((F = Result->getNamedFunction("llvm.va_start"))
+ && F->getFunctionType()->getNumParams() == 0)
+ ObsoleteVarArgs = true;
+ if((F = Result->getNamedFunction("llvm.va_copy"))
+ && F->getFunctionType()->getNumParams() == 1)
+ ObsoleteVarArgs = true;
+ }
-std::string getGlobalName(const std::string* Name, const std::string Linkage,
- const Type* Ty, bool isConstant) {
- // Default to given name
- std::string Result = *Name;
- // Look up the name in the Globals Map
- Type::GlobalsTypeMap::iterator GI = Type::Globals.find(*Name);
- // Did we see this global name before?
- if (GI != Type::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 {
- Type::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.
- Type::TypePlaneMap::iterator TPI = GI->second.begin();
- Type::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.
+ if (ObsoleteVarArgs && NewVarArgs) {
+ error("This file is corrupt: it uses both new and old style varargs");
+ return 0;
+ }
+
+ if(ObsoleteVarArgs) {
+ if(Function* F = Result->getNamedFunction("llvm.va_start")) {
+ if (F->arg_size() != 0) {
+ error("Obsolete va_start takes 0 argument");
+ return 0;
}
+
+ //foo = va_start()
+ // ->
+ //bar = alloca typeof(foo)
+ //va_start(bar)
+ //foo = load bar
+
+ const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+ const Type* ArgTy = F->getFunctionType()->getReturnType();
+ const Type* ArgTyPtr = PointerType::get(ArgTy);
+ Function* NF = cast<Function>(Result->getOrInsertFunction(
+ "llvm.va_start", RetTy, ArgTyPtr, (Type *)0));
+
+ while (!F->use_empty()) {
+ CallInst* CI = cast<CallInst>(F->use_back());
+ AllocaInst* bar = new AllocaInst(ArgTy, 0, "vastart.fix.1", CI);
+ new CallInst(NF, bar, "", CI);
+ Value* foo = new LoadInst(bar, "vastart.fix.2", CI);
+ CI->replaceAllUsesWith(foo);
+ CI->getParent()->getInstList().erase(CI);
+ }
+ Result->getFunctionList().erase(F);
}
- }
+
+ if(Function* F = Result->getNamedFunction("llvm.va_end")) {
+ if(F->arg_size() != 1) {
+ error("Obsolete va_end takes 1 argument");
+ return 0;
+ }
- // Its a new global name, if it is external we can't change it
- if (isConstant || Linkage == "external" || Linkage == "dllimport" ||
- Linkage == "extern_weak" || Linkage == "") {
- Type::Globals[Result][Ty] = Result;
- return Result;
+ //vaend foo
+ // ->
+ //bar = alloca 1 of typeof(foo)
+ //vaend bar
+ const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+ const Type* ArgTy = F->getFunctionType()->getParamType(0);
+ const Type* ArgTyPtr = PointerType::get(ArgTy);
+ Function* NF = cast<Function>(Result->getOrInsertFunction(
+ "llvm.va_end", RetTy, ArgTyPtr, (Type *)0));
+
+ while (!F->use_empty()) {
+ CallInst* CI = cast<CallInst>(F->use_back());
+ AllocaInst* bar = new AllocaInst(ArgTy, 0, "vaend.fix.1", CI);
+ new StoreInst(CI->getOperand(1), bar, CI);
+ new CallInst(NF, bar, "", CI);
+ CI->getParent()->getInstList().erase(CI);
+ }
+ Result->getFunctionList().erase(F);
+ }
+
+ if(Function* F = Result->getNamedFunction("llvm.va_copy")) {
+ if(F->arg_size() != 1) {
+ error("Obsolete va_copy takes 1 argument");
+ return 0;
+ }
+ //foo = vacopy(bar)
+ // ->
+ //a = alloca 1 of typeof(foo)
+ //b = alloca 1 of typeof(foo)
+ //store bar -> b
+ //vacopy(a, b)
+ //foo = load a
+
+ const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+ const Type* ArgTy = F->getFunctionType()->getReturnType();
+ const Type* ArgTyPtr = PointerType::get(ArgTy);
+ Function* NF = cast<Function>(Result->getOrInsertFunction(
+ "llvm.va_copy", RetTy, ArgTyPtr, ArgTyPtr, (Type *)0));
+
+ while (!F->use_empty()) {
+ CallInst* CI = cast<CallInst>(F->use_back());
+ AllocaInst* a = new AllocaInst(ArgTy, 0, "vacopy.fix.1", CI);
+ AllocaInst* b = new AllocaInst(ArgTy, 0, "vacopy.fix.2", CI);
+ new StoreInst(CI->getOperand(1), b, CI);
+ new CallInst(NF, a, b, "", CI);
+ Value* foo = new LoadInst(a, "vacopy.fix.3", CI);
+ CI->replaceAllUsesWith(foo);
+ CI->getParent()->getInstList().erase(CI);
+ }
+ Result->getFunctionList().erase(F);
+ }
}
- // Its a new global name, and it is internal, change the name to make it
- // unique for its type.
- // Result = getUniqueName(Name, Ty);
- Type::Globals[*Name][Ty] = Result;
return Result;
}
-} // End anonymous namespace
+} // end llvm namespace
-// This function is used by the Lexer to create a Type. It can't be
-// in the anonymous namespace.
-const Type* getType(const std::string& newTy, TypeIDs oldTy) {
- return Type::get(newTy, oldTy);
-}
+using namespace llvm;
@@ -1329,53 +1839,108 @@ const Type* getType(const std::string& newTy, TypeIDs oldTy) {
# define YYERROR_VERBOSE 0
#endif
-#ifndef YYSTYPE
-#line 971 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-typedef union {
- std::string* String;
- const Type* Ty;
- Value* Val;
- Constant* Const;
- ValueList* ValList;
- TypeList* TypeVec;
-} yystype;
-/* Line 188 of /usr/local/share/bison/yacc.c. */
-#line 1344 "UpgradeParser.tab.c"
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
#endif
-#ifndef YYLTYPE
-typedef struct yyltype
-{
- int first_line;
- int first_column;
- int last_line;
- int last_column;
-} yyltype;
-# define YYLTYPE yyltype
-# define YYLTYPE_IS_TRIVIAL 1
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 1469 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+typedef union YYSTYPE {
+ llvm::Module *ModuleVal;
+ llvm::Function *FunctionVal;
+ std::pair<llvm::PATypeInfo, char*> *ArgVal;
+ llvm::BasicBlock *BasicBlockVal;
+ llvm::TerminatorInst *TermInstVal;
+ llvm::InstrInfo InstVal;
+ llvm::ConstInfo ConstVal;
+ llvm::ValueInfo ValueVal;
+ llvm::PATypeInfo TypeVal;
+ llvm::TypeInfo PrimType;
+ llvm::PHIListInfo PHIList;
+ std::list<llvm::PATypeInfo> *TypeList;
+ std::vector<llvm::ValueInfo> *ValueList;
+ std::vector<llvm::ConstInfo> *ConstVector;
+
+
+ std::vector<std::pair<llvm::PATypeInfo,char*> > *ArgList;
+ // Represent the RHS of PHI node
+ std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
+
+ llvm::GlobalValue::LinkageTypes Linkage;
+ int64_t SInt64Val;
+ uint64_t UInt64Val;
+ int SIntVal;
+ unsigned UIntVal;
+ double FPVal;
+ bool BoolVal;
+
+ char *StrVal; // This memory is strdup'd!
+ llvm::ValID ValIDVal; // strdup'd memory maybe!
+
+ llvm::BinaryOps BinaryOpVal;
+ llvm::TermOps TermOpVal;
+ llvm::MemoryOps MemOpVal;
+ llvm::OtherOps OtherOpVal;
+ llvm::CastOps CastOpVal;
+ llvm::ICmpInst::Predicate IPred;
+ llvm::FCmpInst::Predicate FPred;
+ llvm::Module::Endianness Endianness;
+} YYSTYPE;
+/* Line 196 of yacc.c. */
+#line 1892 "UpgradeParser.tab.c"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
#endif
+
+
/* Copy the second part of user declarations. */
-/* Line 213 of /usr/local/share/bison/yacc.c. */
-#line 1365 "UpgradeParser.tab.c"
+/* Line 219 of yacc.c. */
+#line 1904 "UpgradeParser.tab.c"
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#ifndef YY_
+# if YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(msgid) dgettext ("bison-runtime", msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(msgid) msgid
+# endif
+#endif
#if ! defined (yyoverflow) || YYERROR_VERBOSE
/* The parser invokes alloca or malloc; define the necessary symbols. */
-# if YYSTACK_USE_ALLOCA
-# define YYSTACK_ALLOC alloca
-# else
-# ifndef YYSTACK_USE_ALLOCA
-# if defined (alloca) || defined (_ALLOCA_H)
-# define YYSTACK_ALLOC alloca
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
# else
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
+# define YYSTACK_ALLOC alloca
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYINCLUDED_STDLIB_H
# endif
# endif
# endif
@@ -1384,50 +1949,76 @@ typedef struct yyltype
# ifdef YYSTACK_ALLOC
/* Pacify GCC's `empty if-body' warning. */
# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+# endif
# else
-# if defined (__STDC__) || defined (__cplusplus)
-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
+ && (defined (__STDC__) || defined (__cplusplus)))
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
+ && (defined (__STDC__) || defined (__cplusplus)))
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifdef __cplusplus
+}
# endif
-# define YYSTACK_ALLOC malloc
-# define YYSTACK_FREE free
# endif
#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
#if (! defined (yyoverflow) \
&& (! defined (__cplusplus) \
- || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
/* A type that is properly aligned for any stack member. */
union yyalloc
{
- short yyss;
+ short int yyss;
YYSTYPE yyvs;
};
/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
/* The size of an array large to enough to hold all stacks, each with
N elements. */
# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAX)
+ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
/* Copy COUNT objects from FROM to TO. The source and destination do
not overlap. */
# ifndef YYCOPY
-# if 1 < __GNUC__
+# if defined (__GNUC__) && 1 < __GNUC__
# define YYCOPY(To, From, Count) \
__builtin_memcpy (To, From, (Count) * sizeof (*(From)))
# else
# define YYCOPY(To, From, Count) \
do \
{ \
- register YYSIZE_T yyi; \
+ YYSIZE_T yyi; \
for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
+ (To)[yyi] = (From)[yyi]; \
} \
while (0)
# endif
@@ -1444,7 +2035,7 @@ union yyalloc
YYSIZE_T yynewbytes; \
YYCOPY (&yyptr->Stack, Stack, yysize); \
Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
yyptr += yynewbytes / sizeof (*yyptr); \
} \
while (0)
@@ -1454,28 +2045,29 @@ union yyalloc
#if defined (__STDC__) || defined (__cplusplus)
typedef signed char yysigned_char;
#else
- typedef short yysigned_char;
+ typedef short int yysigned_char;
#endif
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 4
-#define YYLAST 1473
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 1712
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 164
+#define YYNTOKENS 166
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 76
+#define YYNNTS 79
/* YYNRULES -- Number of rules. */
-#define YYNRULES 301
+#define YYNRULES 308
/* YYNRULES -- Number of states. */
-#define YYNSTATES 585
+#define YYNSTATES 604
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
-#define YYMAXUTOK 404
+#define YYMAXUTOK 406
-#define YYTRANSLATE(X) \
- ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
static const unsigned char yytranslate[] =
@@ -1484,15 +2076,15 @@ static const unsigned char yytranslate[] =
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 153, 154, 162, 2, 151, 2, 2, 2, 2, 2,
+ 155, 156, 164, 2, 153, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 158, 150, 159, 2, 2, 2, 2, 2, 2, 2,
+ 160, 152, 161, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 155, 152, 157, 2, 2, 2, 2, 2, 163,
+ 2, 157, 154, 159, 2, 2, 2, 2, 2, 165,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 156, 2, 2, 160, 2, 161, 2, 2, 2, 2,
+ 158, 2, 2, 162, 2, 163, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -1520,13 +2112,13 @@ static const unsigned char yytranslate[] =
115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
- 145, 146, 147, 148, 149
+ 145, 146, 147, 148, 149, 150, 151
};
#if YYDEBUG
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
YYRHS. */
-static const unsigned short yyprhs[] =
+static const unsigned short int yyprhs[] =
{
0, 0, 3, 5, 7, 9, 11, 13, 15, 17,
19, 21, 23, 25, 27, 29, 31, 33, 35, 37,
@@ -1537,210 +2129,213 @@ static const unsigned short yyprhs[] =
119, 121, 123, 125, 127, 129, 131, 133, 135, 137,
139, 141, 143, 145, 147, 149, 151, 153, 155, 157,
159, 161, 164, 165, 167, 169, 171, 173, 175, 177,
- 179, 180, 182, 184, 186, 188, 190, 192, 195, 196,
+ 179, 180, 181, 183, 185, 187, 189, 191, 193, 196,
197, 200, 201, 205, 208, 209, 211, 212, 216, 218,
221, 223, 225, 227, 229, 231, 233, 235, 237, 239,
241, 243, 245, 247, 249, 251, 253, 255, 257, 259,
261, 264, 269, 275, 281, 285, 288, 294, 299, 302,
304, 308, 310, 314, 316, 317, 322, 326, 330, 335,
- 340, 344, 347, 350, 353, 356, 359, 362, 365, 368,
- 371, 374, 381, 387, 396, 403, 410, 417, 425, 433,
- 440, 447, 456, 465, 469, 471, 473, 475, 477, 480,
- 483, 488, 491, 493, 495, 497, 502, 505, 510, 517,
- 524, 531, 538, 542, 547, 548, 550, 552, 554, 558,
- 562, 566, 570, 574, 578, 580, 581, 583, 585, 587,
- 588, 591, 595, 597, 599, 603, 605, 606, 615, 617,
- 619, 623, 625, 627, 631, 632, 634, 636, 637, 642,
- 643, 645, 647, 649, 651, 653, 655, 657, 659, 661,
- 665, 667, 673, 675, 677, 679, 681, 684, 687, 689,
- 692, 695, 696, 698, 700, 702, 705, 708, 712, 722,
- 732, 741, 756, 758, 760, 767, 773, 776, 783, 791,
- 793, 797, 799, 800, 803, 805, 811, 817, 823, 830,
- 837, 842, 847, 854, 859, 864, 871, 878, 881, 889,
- 891, 894, 895, 897, 898, 902, 909, 913, 920, 923,
- 928, 935
+ 340, 344, 351, 357, 360, 363, 366, 369, 372, 375,
+ 378, 381, 384, 387, 394, 400, 409, 416, 423, 430,
+ 438, 446, 453, 460, 469, 478, 482, 484, 486, 488,
+ 490, 493, 496, 501, 504, 506, 511, 514, 519, 520,
+ 528, 529, 537, 538, 546, 547, 555, 559, 564, 565,
+ 567, 569, 571, 575, 579, 583, 587, 591, 595, 597,
+ 598, 600, 602, 604, 605, 608, 612, 614, 616, 620,
+ 622, 623, 632, 634, 636, 640, 642, 644, 647, 648,
+ 650, 652, 653, 658, 659, 661, 663, 665, 667, 669,
+ 671, 673, 675, 677, 681, 683, 689, 691, 693, 695,
+ 697, 700, 703, 706, 710, 713, 714, 716, 718, 720,
+ 723, 726, 730, 740, 750, 759, 773, 775, 777, 784,
+ 790, 793, 800, 808, 810, 814, 816, 817, 820, 822,
+ 828, 834, 840, 847, 854, 857, 862, 867, 874, 879,
+ 884, 889, 894, 901, 908, 911, 919, 921, 924, 925,
+ 927, 928, 932, 939, 943, 950, 953, 958, 965
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const short yyrhs[] =
+static const short int yyrhs[] =
{
- 198, 0, -1, 19, -1, 20, -1, 17, -1, 18,
+ 200, 0, -1, 5, -1, 6, -1, 3, -1, 4,
-1, 79, -1, 80, -1, 81, -1, 82, -1, 83,
-1, 84, -1, 85, -1, 86, -1, 87, -1, 88,
-1, 89, -1, 90, -1, 91, -1, 92, -1, 93,
-1, 94, -1, 95, -1, 96, -1, 97, -1, 98,
- -1, 101, -1, 102, -1, 103, -1, 104, -1, 105,
- -1, 106, -1, 117, -1, 118, -1, 119, -1, 120,
- -1, 107, -1, 108, -1, 109, -1, 110, -1, 111,
- -1, 112, -1, 113, -1, 114, -1, 115, -1, 116,
- -1, 117, -1, 118, -1, 119, -1, 120, -1, 25,
- -1, 26, -1, 129, -1, 130, -1, 131, -1, 132,
- -1, 138, -1, 139, -1, 140, -1, 141, -1, 142,
- -1, 143, -1, 144, -1, 145, -1, 146, -1, 147,
- -1, 148, -1, 149, -1, 137, -1, 11, -1, 9,
- -1, 7, -1, 5, -1, 12, -1, 10, -1, 8,
- -1, 6, -1, 174, -1, 175, -1, 13, -1, 14,
- -1, 207, 150, -1, -1, 42, -1, 43, -1, 44,
- -1, 48, -1, 45, -1, 46, -1, 47, -1, -1,
- 65, -1, 66, -1, 67, -1, 68, -1, 69, -1,
- 70, -1, 64, 18, -1, -1, -1, 56, 18, -1,
- -1, 151, 56, 18, -1, 37, 30, -1, -1, 183,
- -1, -1, 151, 186, 185, -1, 183, -1, 56, 18,
- -1, 189, -1, 3, -1, 191, -1, 3, -1, 191,
- -1, 4, -1, 5, -1, 6, -1, 7, -1, 8,
+ -1, 119, -1, 120, -1, 121, -1, 122, -1, 123,
+ -1, 124, -1, 125, -1, 126, -1, 127, -1, 128,
+ -1, 129, -1, 130, -1, 131, -1, 132, -1, 133,
+ -1, 134, -1, 135, -1, 136, -1, 137, -1, 138,
+ -1, 125, -1, 126, -1, 127, -1, 128, -1, 27,
+ -1, 28, -1, 109, -1, 110, -1, 111, -1, 112,
+ -1, 140, -1, 141, -1, 142, -1, 143, -1, 144,
+ -1, 145, -1, 146, -1, 147, -1, 148, -1, 149,
+ -1, 150, -1, 151, -1, 139, -1, 16, -1, 14,
+ -1, 12, -1, 10, -1, 17, -1, 15, -1, 13,
+ -1, 11, -1, 176, -1, 177, -1, 18, -1, 19,
+ -1, 212, 152, -1, -1, 41, -1, 42, -1, 43,
+ -1, 44, -1, 45, -1, 46, -1, 47, -1, -1,
+ -1, 65, -1, 66, -1, 67, -1, 68, -1, 69,
+ -1, 70, -1, 64, 4, -1, -1, 57, 4, -1,
+ -1, 153, 57, 4, -1, 34, 24, -1, -1, 185,
+ -1, -1, 153, 188, 187, -1, 185, -1, 57, 4,
+ -1, 191, -1, 8, -1, 193, -1, 8, -1, 193,
-1, 9, -1, 10, -1, 11, -1, 12, -1, 13,
- -1, 14, -1, 15, -1, 16, -1, 222, -1, 190,
- -1, 152, 18, -1, 188, 153, 193, 154, -1, 155,
- 18, 156, 191, 157, -1, 158, 18, 156, 191, 159,
- -1, 160, 192, 161, -1, 160, 161, -1, 158, 160,
- 192, 161, 159, -1, 158, 160, 161, 159, -1, 191,
- 162, -1, 191, -1, 192, 151, 191, -1, 192, -1,
- 192, 151, 40, -1, 40, -1, -1, 189, 155, 196,
- 157, -1, 189, 155, 157, -1, 189, 163, 30, -1,
- 189, 158, 196, 159, -1, 189, 160, 196, 161, -1,
- 189, 160, 161, -1, 189, 22, -1, 189, 23, -1,
- 189, 222, -1, 189, 195, -1, 189, 24, -1, 174,
- 166, -1, 175, 166, -1, 4, 25, -1, 4, 26,
- -1, 177, 21, -1, 173, 153, 194, 39, 189, 154,
- -1, 126, 153, 194, 237, 154, -1, 128, 153, 194,
- 151, 194, 151, 194, 154, -1, 167, 153, 194, 151,
- 194, 154, -1, 168, 153, 194, 151, 194, 154, -1,
- 169, 153, 194, 151, 194, 154, -1, 99, 170, 153,
- 194, 151, 194, 154, -1, 100, 171, 153, 194, 151,
- 194, 154, -1, 172, 153, 194, 151, 194, 154, -1,
- 134, 153, 194, 151, 194, 154, -1, 135, 153, 194,
- 151, 194, 151, 194, 154, -1, 136, 153, 194, 151,
- 194, 151, 194, 154, -1, 196, 151, 194, -1, 194,
- -1, 35, -1, 36, -1, 199, -1, 199, 216, -1,
- 199, 218, -1, 199, 62, 61, 202, -1, 199, 31,
- -1, 201, -1, 49, -1, 57, -1, 201, 178, 27,
- 187, -1, 201, 218, -1, 201, 62, 61, 202, -1,
- 201, 178, 179, 197, 194, 185, -1, 201, 178, 200,
- 197, 189, 185, -1, 201, 178, 45, 197, 189, 185,
- -1, 201, 178, 47, 197, 189, 185, -1, 201, 50,
- 204, -1, 201, 58, 150, 205, -1, -1, 30, -1,
- 55, -1, 54, -1, 52, 150, 203, -1, 53, 150,
- 18, -1, 51, 150, 30, -1, 71, 150, 30, -1,
- 155, 206, 157, -1, 206, 151, 30, -1, 30, -1,
- -1, 28, -1, 30, -1, 207, -1, -1, 189, 208,
- -1, 210, 151, 209, -1, 209, -1, 210, -1, 210,
- 151, 40, -1, 40, -1, -1, 180, 187, 207, 153,
- 211, 154, 184, 181, -1, 32, -1, 160, -1, 179,
- 212, 213, -1, 33, -1, 161, -1, 214, 225, 215,
- -1, -1, 45, -1, 47, -1, -1, 34, 219, 217,
- 212, -1, -1, 63, -1, 17, -1, 18, -1, 21,
- -1, 25, -1, 26, -1, 22, -1, 23, -1, 24,
- -1, 158, 196, 159, -1, 195, -1, 61, 220, 30,
- 151, 30, -1, 165, -1, 207, -1, 222, -1, 221,
- -1, 189, 223, -1, 225, 226, -1, 226, -1, 227,
- 229, -1, 227, 231, -1, -1, 29, -1, 77, -1,
- 76, -1, 72, 224, -1, 72, 3, -1, 73, 15,
- 223, -1, 73, 4, 223, 151, 15, 223, 151, 15,
- 223, -1, 74, 176, 223, 151, 15, 223, 155, 230,
- 157, -1, 74, 176, 223, 151, 15, 223, 155, 157,
- -1, 178, 75, 180, 187, 223, 153, 234, 154, 39,
- 15, 223, 228, 15, 223, -1, 228, -1, 78, -1,
- 230, 176, 221, 151, 15, 223, -1, 176, 221, 151,
- 15, 223, -1, 178, 236, -1, 189, 155, 223, 151,
- 223, 157, -1, 232, 151, 155, 223, 151, 223, 157,
- -1, 224, -1, 233, 151, 224, -1, 233, -1, -1,
- 60, 59, -1, 59, -1, 167, 189, 223, 151, 223,
- -1, 168, 189, 223, 151, 223, -1, 169, 189, 223,
- 151, 223, -1, 99, 170, 189, 223, 151, 223, -1,
- 100, 171, 189, 223, 151, 223, -1, 172, 224, 151,
- 224, -1, 173, 224, 39, 189, -1, 128, 224, 151,
- 224, 151, 224, -1, 133, 224, 151, 189, -1, 134,
- 224, 151, 224, -1, 135, 224, 151, 224, 151, 224,
- -1, 136, 224, 151, 224, 151, 224, -1, 127, 232,
- -1, 235, 180, 187, 223, 153, 234, 154, -1, 239,
- -1, 151, 233, -1, -1, 38, -1, -1, 121, 189,
- 182, -1, 121, 189, 151, 10, 223, 182, -1, 122,
- 189, 182, -1, 122, 189, 151, 10, 223, 182, -1,
- 123, 224, -1, 238, 124, 189, 223, -1, 238, 125,
- 224, 151, 189, 223, -1, 126, 189, 223, 237, -1
+ -1, 14, -1, 15, -1, 16, -1, 17, -1, 18,
+ -1, 19, -1, 21, -1, 192, -1, 48, -1, 227,
+ -1, 154, 4, -1, 190, 155, 195, 156, -1, 157,
+ 4, 158, 193, 159, -1, 160, 4, 158, 193, 161,
+ -1, 162, 194, 163, -1, 162, 163, -1, 160, 162,
+ 194, 163, 161, -1, 160, 162, 163, 161, -1, 193,
+ 164, -1, 193, -1, 194, 153, 193, -1, 194, -1,
+ 194, 153, 37, -1, 37, -1, -1, 191, 157, 198,
+ 159, -1, 191, 157, 159, -1, 191, 165, 24, -1,
+ 191, 160, 198, 161, -1, 191, 162, 198, 163, -1,
+ 191, 162, 163, -1, 191, 160, 162, 198, 163, 161,
+ -1, 191, 160, 162, 163, 161, -1, 191, 38, -1,
+ 191, 39, -1, 191, 227, -1, 191, 197, -1, 191,
+ 26, -1, 176, 168, -1, 177, 4, -1, 9, 27,
+ -1, 9, 28, -1, 179, 7, -1, 175, 155, 196,
+ 36, 191, 156, -1, 106, 155, 196, 242, 156, -1,
+ 108, 155, 196, 153, 196, 153, 196, 156, -1, 169,
+ 155, 196, 153, 196, 156, -1, 170, 155, 196, 153,
+ 196, 156, -1, 171, 155, 196, 153, 196, 156, -1,
+ 99, 172, 155, 196, 153, 196, 156, -1, 100, 173,
+ 155, 196, 153, 196, 156, -1, 174, 155, 196, 153,
+ 196, 156, -1, 114, 155, 196, 153, 196, 156, -1,
+ 115, 155, 196, 153, 196, 153, 196, 156, -1, 116,
+ 155, 196, 153, 196, 153, 196, 156, -1, 198, 153,
+ 196, -1, 196, -1, 32, -1, 33, -1, 201, -1,
+ 201, 221, -1, 201, 223, -1, 201, 62, 61, 207,
+ -1, 201, 25, -1, 202, -1, 202, 180, 20, 189,
+ -1, 202, 223, -1, 202, 62, 61, 207, -1, -1,
+ 202, 180, 181, 199, 196, 203, 187, -1, -1, 202,
+ 180, 50, 199, 191, 204, 187, -1, -1, 202, 180,
+ 45, 199, 191, 205, 187, -1, -1, 202, 180, 47,
+ 199, 191, 206, 187, -1, 202, 51, 209, -1, 202,
+ 58, 152, 210, -1, -1, 24, -1, 56, -1, 55,
+ -1, 53, 152, 208, -1, 54, 152, 4, -1, 52,
+ 152, 24, -1, 71, 152, 24, -1, 157, 211, 159,
+ -1, 211, 153, 24, -1, 24, -1, -1, 22, -1,
+ 24, -1, 212, -1, -1, 191, 213, -1, 215, 153,
+ 214, -1, 214, -1, 215, -1, 215, 153, 37, -1,
+ 37, -1, -1, 182, 189, 212, 155, 216, 156, 186,
+ 183, -1, 29, -1, 162, -1, 181, 217, 218, -1,
+ 30, -1, 163, -1, 230, 220, -1, -1, 45, -1,
+ 47, -1, -1, 31, 224, 222, 217, -1, -1, 63,
+ -1, 3, -1, 4, -1, 7, -1, 27, -1, 28,
+ -1, 38, -1, 39, -1, 26, -1, 160, 198, 161,
+ -1, 197, -1, 61, 225, 24, 153, 24, -1, 167,
+ -1, 212, -1, 227, -1, 226, -1, 191, 228, -1,
+ 230, 231, -1, 219, 231, -1, 232, 180, 234, -1,
+ 232, 236, -1, -1, 23, -1, 77, -1, 78, -1,
+ 72, 229, -1, 72, 8, -1, 73, 21, 228, -1,
+ 73, 9, 228, 153, 21, 228, 153, 21, 228, -1,
+ 74, 178, 228, 153, 21, 228, 157, 235, 159, -1,
+ 74, 178, 228, 153, 21, 228, 157, 159, -1, 75,
+ 182, 189, 228, 155, 239, 156, 36, 21, 228, 233,
+ 21, 228, -1, 233, -1, 76, -1, 235, 178, 226,
+ 153, 21, 228, -1, 178, 226, 153, 21, 228, -1,
+ 180, 241, -1, 191, 157, 228, 153, 228, 159, -1,
+ 237, 153, 157, 228, 153, 228, 159, -1, 229, -1,
+ 238, 153, 229, -1, 238, -1, -1, 60, 59, -1,
+ 59, -1, 169, 191, 228, 153, 228, -1, 170, 191,
+ 228, 153, 228, -1, 171, 191, 228, 153, 228, -1,
+ 99, 172, 191, 228, 153, 228, -1, 100, 173, 191,
+ 228, 153, 228, -1, 49, 229, -1, 174, 229, 153,
+ 229, -1, 175, 229, 36, 191, -1, 108, 229, 153,
+ 229, 153, 229, -1, 113, 229, 153, 191, -1, 117,
+ 229, 153, 191, -1, 118, 229, 153, 191, -1, 114,
+ 229, 153, 229, -1, 115, 229, 153, 229, 153, 229,
+ -1, 116, 229, 153, 229, 153, 229, -1, 107, 237,
+ -1, 240, 182, 189, 228, 155, 239, 156, -1, 244,
+ -1, 153, 238, -1, -1, 35, -1, -1, 101, 191,
+ 184, -1, 101, 191, 153, 15, 228, 184, -1, 102,
+ 191, 184, -1, 102, 191, 153, 15, 228, 184, -1,
+ 103, 229, -1, 243, 104, 191, 228, -1, 243, 105,
+ 229, 153, 191, 228, -1, 106, 191, 228, 242, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const unsigned short yyrline[] =
+static const unsigned short int yyrline[] =
{
- 0, 1036, 1036, 1036, 1037, 1037, 1041, 1041, 1041, 1041,
- 1041, 1041, 1041, 1042, 1042, 1042, 1042, 1043, 1043, 1043,
- 1044, 1044, 1044, 1044, 1044, 1044, 1045, 1045, 1045, 1045,
- 1045, 1045, 1045, 1045, 1045, 1045, 1046, 1046, 1046, 1046,
- 1046, 1046, 1046, 1046, 1046, 1046, 1047, 1047, 1047, 1047,
- 1047, 1047, 1048, 1048, 1048, 1048, 1049, 1049, 1049, 1049,
- 1049, 1049, 1049, 1049, 1050, 1050, 1050, 1050, 1050, 1055,
- 1055, 1055, 1055, 1056, 1056, 1056, 1056, 1057, 1057, 1058,
- 1058, 1061, 1064, 1069, 1069, 1069, 1069, 1069, 1069, 1070,
- 1071, 1074, 1074, 1074, 1074, 1074, 1075, 1076, 1081, 1086,
- 1087, 1090, 1091, 1099, 1105, 1106, 1109, 1110, 1119, 1120,
- 1133, 1133, 1134, 1134, 1135, 1139, 1139, 1139, 1139, 1139,
- 1139, 1139, 1140, 1140, 1140, 1140, 1140, 1142, 1145, 1148,
- 1151, 1155, 1168, 1174, 1180, 1190, 1193, 1203, 1206, 1214,
- 1218, 1225, 1226, 1231, 1236, 1246, 1253, 1259, 1266, 1273,
- 1280, 1286, 1293, 1300, 1308, 1315, 1322, 1329, 1336, 1343,
- 1350, 1358, 1372, 1384, 1389, 1395, 1400, 1406, 1411, 1416,
- 1424, 1429, 1434, 1444, 1449, 1454, 1454, 1464, 1469, 1472,
- 1477, 1481, 1485, 1488, 1488, 1491, 1501, 1506, 1511, 1521,
- 1531, 1541, 1551, 1556, 1561, 1566, 1568, 1568, 1571, 1576,
- 1583, 1588, 1595, 1602, 1607, 1608, 1616, 1616, 1617, 1617,
- 1619, 1628, 1632, 1636, 1639, 1644, 1647, 1650, 1673, 1674,
- 1678, 1689, 1690, 1692, 1701, 1702, 1703, 1707, 1707, 1721,
- 1722, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1726, 1727,
- 1732, 1733, 1742, 1742, 1746, 1752, 1763, 1772, 1775, 1783,
- 1787, 1792, 1795, 1801, 1801, 1803, 1808, 1813, 1818, 1826,
- 1836, 1845, 1867, 1872, 1878, 1884, 1892, 1910, 1919, 1929,
- 1933, 1940, 1941, 1945, 1950, 1953, 1964, 1974, 1985, 1995,
- 2005, 2016, 2046, 2055, 2062, 2071, 2078, 2085, 2091, 2142,
- 2147, 2148, 2152, 2153, 2156, 2165, 2175, 2184, 2195, 2202,
- 2213, 2224
+ 0, 1607, 1607, 1608, 1616, 1617, 1627, 1627, 1627, 1627,
+ 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1631, 1631, 1631,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1639, 1639, 1640, 1640,
+ 1641, 1641, 1642, 1642, 1643, 1643, 1647, 1647, 1648, 1648,
+ 1649, 1649, 1650, 1650, 1651, 1651, 1652, 1652, 1653, 1653,
+ 1654, 1655, 1658, 1658, 1658, 1658, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1663, 1663, 1663, 1663, 1663, 1663, 1669,
+ 1669, 1669, 1669, 1673, 1673, 1673, 1673, 1677, 1677, 1681,
+ 1681, 1686, 1689, 1694, 1695, 1696, 1697, 1698, 1699, 1700,
+ 1701, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1722,
+ 1723, 1731, 1732, 1740, 1749, 1750, 1757, 1758, 1762, 1766,
+ 1782, 1783, 1790, 1791, 1798, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1807, 1807, 1807, 1807, 1807, 1812, 1816, 1820,
+ 1825, 1834, 1850, 1856, 1869, 1878, 1882, 1893, 1897, 1910,
+ 1914, 1921, 1922, 1928, 1935, 1947, 1977, 1990, 2013, 2041,
+ 2063, 2074, 2096, 2107, 2116, 2121, 2179, 2186, 2194, 2201,
+ 2208, 2212, 2216, 2225, 2240, 2253, 2262, 2290, 2303, 2312,
+ 2318, 2324, 2333, 2339, 2345, 2356, 2357, 2366, 2367, 2379,
+ 2388, 2389, 2390, 2391, 2392, 2408, 2428, 2430, 2432, 2432,
+ 2439, 2439, 2446, 2446, 2453, 2453, 2461, 2463, 2465, 2470,
+ 2484, 2485, 2489, 2492, 2500, 2504, 2511, 2515, 2519, 2523,
+ 2531, 2531, 2535, 2536, 2540, 2548, 2553, 2561, 2562, 2569,
+ 2576, 2580, 2686, 2686, 2690, 2700, 2700, 2704, 2708, 2710,
+ 2711, 2715, 2715, 2727, 2728, 2733, 2734, 2735, 2736, 2737,
+ 2738, 2739, 2740, 2741, 2762, 2765, 2780, 2781, 2786, 2786,
+ 2794, 2803, 2806, 2815, 2825, 2830, 2839, 2850, 2850, 2853,
+ 2856, 2859, 2863, 2869, 2884, 2890, 2941, 2944, 2950, 2960,
+ 2973, 3002, 3010, 3018, 3022, 3029, 3030, 3034, 3037, 3043,
+ 3060, 3076, 3090, 3102, 3114, 3125, 3134, 3143, 3152, 3159,
+ 3180, 3204, 3210, 3216, 3222, 3238, 3311, 3319, 3320, 3324,
+ 3325, 3329, 3335, 3341, 3347, 3353, 3360, 3372, 3386
};
#endif
-#if YYDEBUG || YYERROR_VERBOSE
-/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
static const char *const yytname[] =
{
- "$end", "error", "$undefined", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT",
- "USHORT", "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "LABEL",
- "OPAQUE", "ESINT64VAL", "EUINT64VAL", "SINTVAL", "UINTVAL", "FPVAL",
- "NULL_TOK", "UNDEF", "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "TYPE",
- "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION", "BEGINTOK",
- "ENDTOK", "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO",
- "DOTDOTDOT", "CONST", "INTERNAL", "LINKONCE", "WEAK", "DLLIMPORT",
- "DLLEXPORT", "EXTERN_WEAK", "APPENDING", "EXTERNAL", "TARGET", "TRIPLE",
- "ENDIAN", "POINTERSIZE", "LITTLE", "BIG", "ALIGN", "UNINITIALIZED",
- "DEPLIBS", "CALL", "TAIL", "ASM_TOK", "MODULE", "SIDEEFFECT", "CC_TOK",
- "CCC_TOK", "CSRETCC_TOK", "FASTCC_TOK", "COLDCC_TOK",
- "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT", "RET", "BR",
- "SWITCH", "INVOKE", "EXCEPT", "UNWIND", "UNREACHABLE", "ADD", "SUB",
- "MUL", "DIV", "UDIV", "SDIV", "FDIV", "REM", "UREM", "SREM", "FREM",
- "AND", "OR", "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ",
- "SETNE", "ICMP", "FCMP", "EQ", "NE", "SLT", "SGT", "SLE", "SGE", "OEQ",
- "ONE", "OLT", "OGT", "OLE", "OGE", "ORD", "UNO", "UEQ", "UNE", "ULT",
- "UGT", "ULE", "UGE", "MALLOC", "ALLOCA", "FREE", "LOAD", "STORE",
- "GETELEMENTPTR", "PHI_TOK", "SELECT", "SHL", "SHR", "ASHR", "LSHR",
- "VAARG", "EXTRACTELEMENT", "INSERTELEMENT", "SHUFFLEVECTOR", "CAST",
- "TRUNC", "ZEXT", "SEXT", "FPTRUNC", "FPEXT", "FPTOUI", "FPTOSI",
- "UITOFP", "SITOFP", "PTRTOINT", "INTTOPTR", "BITCAST", "'='", "','",
- "'\\\\'", "'('", "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", "'}'",
- "'*'", "'c'", "$accept", "IntVal", "EInt64Val", "ArithmeticOps",
- "LogicalOps", "SetCondOps", "IPredicates", "FPredicates", "ShiftOps",
- "CastOps", "SIntType", "UIntType", "IntType", "FPType", "OptAssign",
- "OptLinkage", "OptCallingConv", "OptAlign", "OptCAlign",
- "SectionString", "OptSection", "GlobalVarAttributes",
- "GlobalVarAttribute", "TypesV", "UpRTypesV", "Types", "PrimType",
- "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", "ConstExpr",
- "ConstVector", "GlobalType", "Module", "DefinitionList", "External",
- "ConstPool", "AsmBlock", "BigOrLittle", "TargetDefinition",
- "LibrariesDefinition", "LibList", "Name", "OptName", "ArgVal",
- "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader",
- "END", "Function", "FnDeclareLinkage", "FunctionProto", "@1",
- "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef",
- "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList",
- "Unwind", "BBTerminatorInst", "JumpTable", "Inst", "PHIList",
- "ValueRefList", "ValueRefListE", "OptTailCall", "InstVal", "IndexList",
+ "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL",
+ "UINTVAL", "FPVAL", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", "USHORT",
+ "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "TYPE", "LABEL",
+ "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION",
+ "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK",
+ "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO",
+ "DOTDOTDOT", "NULL_TOK", "UNDEF", "CONST", "INTERNAL", "LINKONCE",
+ "WEAK", "APPENDING", "DLLIMPORT", "DLLEXPORT", "EXTERN_WEAK", "OPAQUE",
+ "NOT", "EXTERNAL", "TARGET", "TRIPLE", "ENDIAN", "POINTERSIZE", "LITTLE",
+ "BIG", "ALIGN", "DEPLIBS", "CALL", "TAIL", "ASM_TOK", "MODULE",
+ "SIDEEFFECT", "CC_TOK", "CCC_TOK", "CSRETCC_TOK", "FASTCC_TOK",
+ "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT",
+ "RET", "BR", "SWITCH", "INVOKE", "UNREACHABLE", "UNWIND", "EXCEPT",
+ "ADD", "SUB", "MUL", "DIV", "UDIV", "SDIV", "FDIV", "REM", "UREM",
+ "SREM", "FREM", "AND", "OR", "XOR", "SETLE", "SETGE", "SETLT", "SETGT",
+ "SETEQ", "SETNE", "ICMP", "FCMP", "MALLOC", "ALLOCA", "FREE", "LOAD",
+ "STORE", "GETELEMENTPTR", "PHI_TOK", "SELECT", "SHL", "SHR", "ASHR",
+ "LSHR", "VAARG", "EXTRACTELEMENT", "INSERTELEMENT", "SHUFFLEVECTOR",
+ "VAARG_old", "VANEXT_old", "EQ", "NE", "SLT", "SGT", "SLE", "SGE", "ULT",
+ "UGT", "ULE", "UGE", "OEQ", "ONE", "OLT", "OGT", "OLE", "OGE", "ORD",
+ "UNO", "UEQ", "UNE", "CAST", "TRUNC", "ZEXT", "SEXT", "FPTRUNC", "FPEXT",
+ "FPTOUI", "FPTOSI", "UITOFP", "SITOFP", "PTRTOINT", "INTTOPTR",
+ "BITCAST", "'='", "','", "'\\\\'", "'('", "')'", "'['", "'x'", "']'",
+ "'<'", "'>'", "'{'", "'}'", "'*'", "'c'", "$accept", "INTVAL",
+ "EINT64VAL", "ArithmeticOps", "LogicalOps", "SetCondOps", "IPredicates",
+ "FPredicates", "ShiftOps", "CastOps", "SIntType", "UIntType", "IntType",
+ "FPType", "OptAssign", "OptLinkage", "OptCallingConv", "OptAlign",
+ "OptCAlign", "SectionString", "OptSection", "GlobalVarAttributes",
+ "GlobalVarAttribute", "TypesV", "UpRTypesV", "Types", "PrimType",
+ "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", "ConstExpr",
+ "ConstVector", "GlobalType", "Module", "FunctionList", "ConstPool", "@1",
+ "@2", "@3", "@4", "AsmBlock", "BigOrLittle", "TargetDefinition",
+ "LibrariesDefinition", "LibList", "Name", "OptName", "ArgVal",
+ "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader",
+ "END", "Function", "FnDeclareLinkage", "FunctionProto", "@5",
+ "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef",
+ "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList",
+ "Unwind", "BBTerminatorInst", "JumpTable", "Inst", "PHIList",
+ "ValueRefList", "ValueRefListE", "OptTailCall", "InstVal", "IndexList",
"OptVolatile", "MemoryInst", 0
};
#endif
@@ -1748,7 +2343,7 @@ static const char *const yytname[] =
# ifdef YYPRINT
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
token YYLEX-NUM. */
-static const unsigned short yytoknum[] =
+static const unsigned short int yytoknum[] =
{
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
@@ -1765,45 +2360,45 @@ static const unsigned short yytoknum[] =
375, 376, 377, 378, 379, 380, 381, 382, 383, 384,
385, 386, 387, 388, 389, 390, 391, 392, 393, 394,
395, 396, 397, 398, 399, 400, 401, 402, 403, 404,
- 61, 44, 92, 40, 41, 91, 120, 93, 60, 62,
- 123, 125, 42, 99
+ 405, 406, 61, 44, 92, 40, 41, 91, 120, 93,
+ 60, 62, 123, 125, 42, 99
};
# endif
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const unsigned char yyr1[] =
{
- 0, 164, 165, 165, 166, 166, 167, 167, 167, 167,
- 167, 167, 167, 167, 167, 167, 167, 168, 168, 168,
- 169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 172, 172, 172, 172, 173, 173, 173, 173,
- 173, 173, 173, 173, 173, 173, 173, 173, 173, 174,
- 174, 174, 174, 175, 175, 175, 175, 176, 176, 177,
- 177, 178, 178, 179, 179, 179, 179, 179, 179, 179,
- 179, 180, 180, 180, 180, 180, 180, 180, 180, 181,
- 181, 182, 182, 183, 184, 184, 185, 185, 186, 186,
- 187, 187, 188, 188, 189, 190, 190, 190, 190, 190,
- 190, 190, 190, 190, 190, 190, 190, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 192,
- 192, 193, 193, 193, 193, 194, 194, 194, 194, 194,
- 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
- 194, 195, 195, 195, 195, 195, 195, 195, 195, 195,
- 195, 195, 195, 196, 196, 197, 197, 198, 199, 199,
- 199, 199, 199, 200, 200, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 202, 203, 203, 204, 204,
- 204, 204, 205, 206, 206, 206, 207, 207, 208, 208,
- 209, 210, 210, 211, 211, 211, 211, 212, 213, 213,
- 214, 215, 215, 216, 217, 217, 217, 219, 218, 220,
- 220, 221, 221, 221, 221, 221, 221, 221, 221, 221,
- 221, 221, 222, 222, 223, 223, 224, 225, 225, 226,
- 227, 227, 227, 228, 228, 229, 229, 229, 229, 229,
- 229, 229, 229, 229, 230, 230, 231, 232, 232, 233,
- 233, 234, 234, 235, 235, 236, 236, 236, 236, 236,
- 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
- 237, 237, 238, 238, 239, 239, 239, 239, 239, 239,
- 239, 239
+ 0, 166, 167, 167, 168, 168, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 170, 170, 170,
+ 171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
+ 172, 172, 172, 172, 172, 172, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 174, 174, 174, 174, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 176,
+ 176, 176, 176, 177, 177, 177, 177, 178, 178, 179,
+ 179, 180, 180, 181, 181, 181, 181, 181, 181, 181,
+ 181, 182, 182, 182, 182, 182, 182, 182, 182, 183,
+ 183, 184, 184, 185, 186, 186, 187, 187, 188, 188,
+ 189, 189, 190, 190, 191, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
+ 193, 193, 193, 193, 193, 193, 193, 193, 193, 194,
+ 194, 195, 195, 195, 195, 196, 196, 196, 196, 196,
+ 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+ 196, 196, 196, 197, 197, 197, 197, 197, 197, 197,
+ 197, 197, 197, 197, 197, 198, 198, 199, 199, 200,
+ 201, 201, 201, 201, 201, 202, 202, 202, 203, 202,
+ 204, 202, 205, 202, 206, 202, 202, 202, 202, 207,
+ 208, 208, 209, 209, 209, 209, 210, 211, 211, 211,
+ 212, 212, 213, 213, 214, 215, 215, 216, 216, 216,
+ 216, 217, 218, 218, 219, 220, 220, 221, 222, 222,
+ 222, 224, 223, 225, 225, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 227, 227, 228, 228,
+ 229, 230, 230, 231, 232, 232, 232, 233, 233, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234, 235, 235,
+ 236, 237, 237, 238, 238, 239, 239, 240, 240, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 242, 242, 243,
+ 243, 244, 244, 244, 244, 244, 244, 244, 244
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
@@ -1818,586 +2413,625 @@ static const unsigned char yyr2[] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 0, 1, 1, 1, 1, 1, 1, 1,
- 0, 1, 1, 1, 1, 1, 1, 2, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1, 2, 0,
2, 0, 3, 2, 0, 1, 0, 3, 1, 2,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 4, 5, 5, 3, 2, 5, 4, 2, 1,
3, 1, 3, 1, 0, 4, 3, 3, 4, 4,
- 3, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 6, 5, 8, 6, 6, 6, 7, 7, 6,
- 6, 8, 8, 3, 1, 1, 1, 1, 2, 2,
- 4, 2, 1, 1, 1, 4, 2, 4, 6, 6,
- 6, 6, 3, 4, 0, 1, 1, 1, 3, 3,
- 3, 3, 3, 3, 1, 0, 1, 1, 1, 0,
- 2, 3, 1, 1, 3, 1, 0, 8, 1, 1,
- 3, 1, 1, 3, 0, 1, 1, 0, 4, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
- 1, 5, 1, 1, 1, 1, 2, 2, 1, 2,
- 2, 0, 1, 1, 1, 2, 2, 3, 9, 9,
- 8, 14, 1, 1, 6, 5, 2, 6, 7, 1,
- 3, 1, 0, 2, 1, 5, 5, 5, 6, 6,
- 4, 4, 6, 4, 4, 6, 6, 2, 7, 1,
- 2, 0, 1, 0, 3, 6, 3, 6, 2, 4,
- 6, 4
+ 3, 6, 5, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 6, 5, 8, 6, 6, 6, 7,
+ 7, 6, 6, 8, 8, 3, 1, 1, 1, 1,
+ 2, 2, 4, 2, 1, 4, 2, 4, 0, 7,
+ 0, 7, 0, 7, 0, 7, 3, 4, 0, 1,
+ 1, 1, 3, 3, 3, 3, 3, 3, 1, 0,
+ 1, 1, 1, 0, 2, 3, 1, 1, 3, 1,
+ 0, 8, 1, 1, 3, 1, 1, 2, 0, 1,
+ 1, 0, 4, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 3, 1, 5, 1, 1, 1, 1,
+ 2, 2, 2, 3, 2, 0, 1, 1, 1, 2,
+ 2, 3, 9, 9, 8, 13, 1, 1, 6, 5,
+ 2, 6, 7, 1, 3, 1, 0, 2, 1, 5,
+ 5, 5, 6, 6, 2, 4, 4, 6, 4, 4,
+ 4, 4, 6, 6, 2, 7, 1, 2, 0, 1,
+ 0, 3, 6, 3, 6, 2, 4, 6, 4
};
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
STATE-NUM when YYTABLE doesn't specify something else to do. Zero
means the default is an error. */
-static const unsigned short yydefact[] =
+static const unsigned short int yydefact[] =
{
- 194, 0, 90, 182, 1, 181, 227, 83, 84, 85,
- 87, 88, 89, 86, 0, 98, 251, 178, 179, 206,
- 207, 0, 0, 0, 90, 0, 186, 224, 0, 0,
- 91, 92, 93, 94, 95, 96, 0, 0, 252, 251,
- 248, 82, 0, 0, 0, 0, 192, 0, 0, 0,
- 0, 0, 183, 184, 0, 0, 81, 225, 226, 98,
- 195, 180, 97, 111, 115, 116, 117, 118, 119, 120,
- 121, 122, 123, 124, 125, 126, 127, 2, 3, 0,
- 0, 0, 0, 242, 0, 0, 110, 129, 114, 243,
- 128, 218, 219, 220, 221, 222, 223, 247, 0, 0,
- 0, 254, 253, 263, 293, 262, 249, 250, 0, 0,
- 0, 0, 205, 193, 187, 185, 175, 176, 0, 0,
- 0, 0, 228, 130, 0, 0, 0, 113, 135, 139,
- 0, 0, 144, 138, 256, 0, 255, 0, 0, 72,
- 76, 71, 75, 70, 74, 69, 73, 77, 78, 0,
- 292, 274, 0, 98, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
- 22, 23, 24, 25, 0, 0, 0, 0, 0, 0,
- 0, 0, 52, 53, 54, 55, 0, 0, 0, 0,
- 68, 56, 57, 58, 59, 60, 61, 62, 63, 64,
- 65, 66, 67, 0, 0, 0, 0, 0, 98, 266,
- 0, 289, 200, 197, 196, 198, 199, 201, 204, 0,
- 106, 106, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 0, 0, 0, 0, 106, 106, 0,
- 0, 0, 0, 0, 134, 216, 143, 141, 0, 231,
- 232, 233, 236, 237, 238, 234, 235, 229, 0, 0,
+ 198, 0, 90, 184, 1, 183, 231, 83, 84, 85,
+ 86, 87, 88, 89, 0, 91, 255, 180, 181, 255,
+ 210, 211, 0, 0, 0, 90, 0, 186, 228, 0,
+ 0, 92, 93, 94, 95, 96, 97, 0, 0, 256,
+ 252, 82, 225, 226, 227, 251, 0, 0, 0, 0,
+ 196, 0, 0, 0, 0, 0, 0, 0, 81, 229,
+ 230, 91, 199, 182, 98, 2, 3, 111, 115, 116,
+ 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+ 128, 0, 0, 0, 0, 246, 0, 0, 110, 127,
+ 114, 247, 129, 222, 223, 224, 300, 254, 0, 0,
+ 0, 0, 209, 197, 187, 185, 177, 178, 0, 0,
+ 0, 0, 232, 130, 0, 0, 0, 113, 135, 139,
+ 0, 0, 144, 138, 299, 0, 278, 0, 0, 0,
+ 0, 91, 267, 257, 258, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 0, 0, 0, 0, 0,
+ 0, 0, 0, 52, 53, 54, 55, 0, 0, 0,
+ 0, 0, 0, 68, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 0, 0, 0, 0,
+ 0, 266, 253, 91, 270, 0, 296, 204, 201, 200,
+ 202, 203, 205, 208, 0, 192, 194, 190, 115, 116,
+ 117, 118, 119, 120, 121, 122, 123, 124, 125, 0,
+ 0, 0, 0, 188, 0, 0, 0, 0, 0, 134,
+ 220, 143, 141, 0, 0, 284, 277, 260, 259, 0,
+ 0, 72, 76, 71, 75, 70, 74, 69, 73, 77,
+ 78, 0, 0, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 0, 50, 51, 46, 47, 48, 49,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
+ 0, 101, 101, 305, 0, 0, 294, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 240, 245, 244, 246, 0, 257, 0, 273, 0,
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
- 0, 50, 51, 36, 37, 38, 39, 40, 41, 42,
- 43, 44, 45, 46, 47, 48, 49, 0, 101, 101,
- 298, 0, 0, 287, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 202, 0,
- 190, 191, 158, 159, 4, 5, 156, 157, 160, 151,
- 152, 155, 0, 0, 0, 0, 154, 153, 188, 189,
- 112, 112, 137, 0, 140, 215, 209, 212, 213, 0,
- 0, 131, 230, 0, 0, 0, 0, 0, 0, 0,
- 0, 174, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 294, 0, 296, 291, 0, 0,
+ 0, 0, 0, 206, 106, 106, 106, 160, 161, 4,
+ 5, 158, 159, 162, 157, 153, 154, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 203, 0, 0, 108, 106, 146, 0,
- 0, 150, 0, 147, 132, 133, 136, 208, 210, 0,
- 104, 142, 0, 0, 0, 291, 0, 0, 0, 0,
- 0, 239, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 301, 0, 0, 0,
- 283, 284, 0, 0, 0, 0, 0, 280, 281, 0,
- 299, 0, 103, 109, 107, 145, 148, 149, 214, 211,
- 105, 99, 0, 0, 0, 0, 0, 0, 0, 0,
- 173, 0, 0, 0, 0, 0, 0, 0, 272, 0,
- 0, 101, 102, 101, 269, 290, 0, 0, 0, 0,
- 0, 275, 276, 277, 272, 0, 0, 217, 241, 0,
- 0, 162, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 271, 0, 278, 279, 0, 295, 297,
- 0, 0, 0, 282, 285, 286, 0, 300, 100, 0,
- 0, 0, 170, 0, 0, 164, 165, 166, 169, 161,
- 0, 260, 0, 0, 0, 270, 267, 0, 288, 167,
- 168, 0, 0, 0, 258, 0, 259, 0, 0, 268,
- 163, 171, 172, 0, 0, 0, 0, 0, 0, 265,
- 0, 0, 264, 0, 261
+ 0, 0, 0, 156, 155, 106, 112, 112, 137, 0,
+ 140, 219, 213, 216, 217, 0, 0, 131, 235, 236,
+ 237, 242, 238, 239, 240, 241, 233, 0, 244, 249,
+ 248, 250, 0, 261, 0, 0, 0, 0, 0, 301,
+ 0, 303, 298, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 207, 0, 193, 195, 191, 0, 0, 0, 0, 0,
+ 0, 0, 146, 176, 0, 0, 0, 150, 0, 147,
+ 0, 0, 0, 0, 0, 189, 132, 133, 136, 212,
+ 214, 0, 104, 142, 234, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 308, 0, 0, 0,
+ 288, 291, 0, 0, 289, 290, 0, 0, 0, 285,
+ 286, 0, 306, 0, 0, 0, 108, 106, 0, 0,
+ 298, 0, 0, 0, 0, 0, 145, 135, 114, 0,
+ 148, 149, 0, 0, 0, 0, 0, 218, 215, 105,
+ 99, 0, 243, 0, 0, 276, 0, 0, 101, 102,
+ 101, 273, 297, 0, 0, 0, 0, 0, 279, 280,
+ 281, 276, 0, 103, 109, 107, 0, 0, 0, 0,
+ 0, 0, 0, 175, 152, 0, 0, 0, 0, 0,
+ 0, 0, 221, 0, 0, 0, 275, 0, 282, 283,
+ 0, 302, 304, 0, 0, 0, 287, 292, 293, 0,
+ 307, 0, 0, 164, 0, 0, 0, 0, 151, 0,
+ 0, 0, 0, 0, 100, 245, 0, 0, 0, 274,
+ 271, 0, 295, 0, 0, 0, 172, 0, 0, 166,
+ 167, 168, 171, 163, 0, 264, 0, 0, 0, 272,
+ 169, 170, 0, 0, 0, 262, 0, 263, 0, 0,
+ 165, 173, 174, 0, 0, 0, 0, 0, 0, 269,
+ 0, 0, 268, 265
};
/* YYDEFGOTO[NTERM-NUM]. */
-static const short yydefgoto[] =
+static const short int yydefgoto[] =
{
- -1, 83, 336, 266, 267, 268, 290, 307, 269, 270,
- 233, 234, 149, 235, 24, 15, 36, 507, 384, 406,
- 471, 330, 407, 84, 85, 236, 87, 88, 130, 248,
- 371, 271, 372, 118, 1, 2, 55, 3, 61, 215,
- 46, 113, 219, 89, 418, 357, 358, 359, 37, 93,
- 16, 96, 17, 59, 18, 27, 363, 272, 90, 274,
- 494, 39, 40, 41, 105, 106, 553, 107, 313, 523,
- 524, 208, 209, 446, 210, 211
+ -1, 85, 311, 328, 329, 330, 263, 280, 331, 332,
+ 219, 220, 251, 221, 25, 15, 37, 522, 369, 456,
+ 480, 392, 457, 86, 87, 222, 89, 90, 120, 233,
+ 403, 358, 404, 108, 1, 2, 3, 335, 306, 304,
+ 305, 63, 200, 50, 103, 204, 91, 420, 343, 344,
+ 345, 38, 95, 16, 44, 17, 61, 18, 28, 425,
+ 359, 92, 361, 491, 19, 40, 41, 191, 192, 577,
+ 97, 286, 526, 527, 193, 194, 436, 195, 196
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
-#define YYPACT_NINF -537
-static const short yypact[] =
+#define YYPACT_NINF -508
+static const short int yypact[] =
{
- -537, 75, 61, 1145, -537, -537, -537, -537, -537, -537,
- -537, -537, -537, -537, 18, 180, 55, -537, -537, -537,
- -537, -28, -61, 33, 130, -40, -537, 102, 87, 117,
- -537, -537, -537, -537, -537, -537, 838, -24, -537, -15,
- -537, 48, -11, -2, 6, 12, -537, 11, 87, 838,
- -9, -9, -537, -537, -9, -9, -537, -537, -537, 180,
- -537, -537, -537, 32, -537, -537, -537, -537, -537, -537,
- -537, -537, -537, -537, -537, -537, -537, -537, -537, 164,
- 171, -6, 512, -537, 135, 41, -537, -537, -103, -537,
- -537, -537, -537, -537, -537, -537, -537, -537, 883, 45,
- 192, -537, -537, -537, 1324, -537, -537, -537, 175, 126,
- 190, 188, 203, -537, -537, -537, -537, -537, 911, 911,
- 957, 911, -537, -537, 81, 97, 561, -537, -537, -103,
- -109, 121, 641, -537, 32, 1140, -537, 1140, 1140, -537,
- -537, -537, -537, -537, -537, -537, -537, -537, -537, 1140,
- -537, -537, 219, 180, -537, -537, -537, -537, -537, -537,
- -537, -537, -537, -537, -537, -537, -537, -537, -537, -537,
- -537, -537, -537, -537, 10, 112, 911, 911, 911, 911,
- 911, 911, -537, -537, -537, -537, 911, 911, 911, 911,
- -537, -537, -537, -537, -537, -537, -537, -537, -537, -537,
- -537, -537, -537, 911, 911, 911, 911, 911, 180, -537,
- 59, -537, -537, -537, -537, -537, -537, -537, -537, -71,
- 129, 129, 167, 193, 195, 218, 222, 224, 234, 243,
- 250, 261, 263, 252, 252, 264, 993, 129, 129, 911,
- 911, 127, -97, 911, -537, 680, -537, 136, 137, -537,
- -537, -537, -537, -537, -537, -537, -537, 229, 10, 112,
- 140, 141, 144, 145, 146, 957, 147, 148, 150, 154,
- 155, -537, -537, -537, -537, 158, -537, 160, -537, 838,
- -537, -537, -537, -537, -537, -537, -537, -537, -537, -537,
- 911, -537, -537, -537, -537, -537, -537, -537, -537, -537,
- -537, -537, -537, -537, -537, -537, -537, 911, 163, 165,
- -537, 1140, 162, 169, 170, 172, 173, 174, 176, 1140,
- 1140, 1140, 177, 276, 838, 911, 911, 288, -537, -8,
- -537, -537, -537, -537, -537, -537, -537, -537, -537, -537,
- -537, -537, 724, 957, 590, 292, -537, -537, -537, -537,
- -106, -104, -537, 179, -103, -537, 135, -537, 178, 181,
- 752, -537, -537, 296, 183, 187, 957, 957, 957, 957,
- 957, -537, -131, 957, 957, 957, 957, 957, 315, 316,
- 1140, 1140, 1140, 1, -537, 7, -537, 191, 1140, 186,
- 911, 911, 911, 911, 911, 194, 197, 201, 911, 911,
- 1140, 1140, 202, -537, 304, 326, -537, 129, -537, -60,
- -78, -537, -74, -537, -537, -537, -537, -537, -537, 799,
- 309, -537, 208, 957, 957, 191, 210, 213, 223, 225,
- 957, -537, 230, 231, 235, 236, 308, 1140, 1140, 227,
- 237, 238, 1140, 357, 1140, 911, -537, 239, 1140, 241,
- -537, -537, 242, 244, 1140, 1140, 1140, -537, -537, 248,
- -537, 911, -537, -537, -537, -537, -537, -537, -537, -537,
- -537, 338, 366, 246, 251, 249, 957, 957, 957, 957,
- -537, 957, 957, 957, 957, 911, 253, 258, 911, 1140,
- 1140, 254, -537, 254, -537, 255, 1140, 256, 911, 911,
- 911, -537, -537, -537, 911, 1140, 390, -537, -537, 957,
- 957, -537, 265, 260, 266, 267, 268, 272, 274, 275,
- 277, 400, 29, 255, 280, -537, -537, 363, -537, -537,
- 911, 278, 1140, -537, -537, -537, 282, -537, -537, 283,
- 287, 957, -537, 957, 957, -537, -537, -537, -537, -537,
- 1140, -537, 1229, 60, 381, -537, -537, 286, -537, -537,
- -537, 290, 293, 294, -537, 270, -537, 1229, 435, -537,
- -537, -537, -537, 436, 302, 1140, 1140, 441, 196, -537,
- 1140, 442, -537, 1140, -537
+ -508, 18, 144, 546, -508, -508, -508, -508, -508, -508,
+ -508, -508, -508, -508, 2, 152, 47, -508, -508, -15,
+ -508, -508, -30, -75, 29, 69, -10, -508, 98, 104,
+ 151, -508, -508, -508, -508, -508, -508, 1307, -8, -508,
+ -508, 149, -508, -508, -508, -508, 11, 20, 22, 24,
+ -508, 27, 104, 1307, 0, 0, 0, 0, -508, -508,
+ -508, 152, -508, -508, -508, -508, -508, 37, -508, -508,
+ -508, -508, -508, -508, -508, -508, -508, -508, -508, -508,
+ -508, 194, 200, 3, 695, -508, 149, 54, -508, -508,
+ -81, -508, -508, -508, -508, -508, 1561, -508, 186, -19,
+ 210, 188, 203, -508, -508, -508, -508, -508, 1368, 1368,
+ 1368, 1409, -508, -508, 66, 70, 715, -508, -508, -81,
+ -85, 75, 781, -508, -508, 1368, -508, 172, 1429, 58,
+ 255, 152, -508, -508, -508, -508, -508, -508, -508, -508,
+ -508, -508, -508, -508, -508, -508, -508, -508, -508, -508,
+ -508, -508, -508, -508, -508, 208, 394, 1368, 1368, 1368,
+ 1368, 1368, 1368, -508, -508, -508, -508, 1368, 1368, 1368,
+ 1368, 1368, 1368, -508, -508, -508, -508, -508, -508, -508,
+ -508, -508, -508, -508, -508, -508, 1368, 1368, 1368, 1368,
+ 1368, -508, -508, 152, -508, 55, -508, -508, -508, -508,
+ -508, -508, -508, -508, -50, -508, -508, -508, 153, 179,
+ 228, 191, 229, 193, 230, 197, 231, 233, 234, 199,
+ 232, 235, 537, -508, 1368, 1368, 84, -45, 1368, -508,
+ 1149, -508, 93, 91, 898, -508, -508, 37, -508, 898,
+ 898, -508, -508, -508, -508, -508, -508, -508, -508, -508,
+ -508, 898, 1307, -508, -508, -508, -508, -508, -508, -508,
+ -508, -508, -508, 1368, -508, -508, -508, -508, -508, -508,
+ -508, -508, -508, -508, -508, -508, -508, -508, -508, -508,
+ 1368, 95, 96, -508, 898, 99, 97, 105, 106, 107,
+ 120, 123, 126, 127, 898, 898, 898, 128, 221, 1307,
+ 1368, 1368, 258, -508, 132, 132, 132, -508, -508, -508,
+ -508, -508, -508, -508, -508, -508, -508, 208, 394, 131,
+ 134, 135, 136, 137, 1190, 1470, 736, 259, 139, 140,
+ 141, 142, 148, -508, -508, 132, -130, -23, -508, 143,
+ -81, -508, 149, -508, 155, 154, 1210, -508, -508, -508,
+ -508, -508, -508, -508, -508, -508, 224, 1409, -508, -508,
+ -508, -508, 156, -508, 163, 898, 898, 898, 4, -508,
+ 5, -508, 164, 898, 162, 1368, 1368, 1368, 1368, 1368,
+ 1368, 1368, 167, 168, 169, 1368, 1368, 898, 898, 170,
+ -508, -17, -508, -508, -508, 150, 182, 1409, 1409, 1409,
+ 1409, 1409, -508, -508, -13, 756, -24, -508, -36, -508,
+ 1409, 1409, 1409, 1409, 1409, -508, -508, -508, -508, -508,
+ -508, 1251, 290, -508, -508, 301, -14, 324, 325, 198,
+ 201, 202, 898, 348, 898, 1368, -508, 204, 898, 205,
+ -508, -508, 211, 214, -508, -508, 898, 898, 898, -508,
+ -508, 213, -508, 1368, 332, 365, -508, 132, 1409, 1409,
+ 164, 217, 222, 223, 225, 1409, -508, 216, -71, -27,
+ -508, -508, 226, 236, 237, 240, 338, -508, -508, -508,
+ 326, 241, -508, 898, 898, 1368, 898, 898, 242, -508,
+ 242, -508, 243, 898, 244, 1368, 1368, 1368, -508, -508,
+ -508, 1368, 898, -508, -508, -508, 246, 247, 245, 1409,
+ 1409, 1409, 1409, -508, -508, 220, 1409, 1409, 1409, 1409,
+ 1368, 378, -508, 361, 249, 248, 243, 250, -508, -508,
+ 329, -508, -508, 1368, 256, 898, -508, -508, -508, 251,
+ -508, 1409, 1409, -508, 261, 252, 270, 271, -508, 269,
+ 272, 275, 279, 280, -508, -508, 367, 40, 368, -508,
+ -508, 267, -508, 281, 282, 1409, -508, 1409, 1409, -508,
+ -508, -508, -508, -508, 898, -508, 996, 85, 382, -508,
+ -508, -508, 283, 285, 288, -508, 274, -508, 996, 898,
+ -508, -508, -508, 424, 293, 130, 898, 426, 430, -508,
+ 898, 898, -508, -508
};
/* YYPGOTO[NTERM-NUM]. */
-static const short yypgoto[] =
+static const short int yypgoto[] =
{
- -537, -537, 226, 361, 362, 365, 209, 214, 368, 370,
- -99, -98, -507, -537, 420, 452, -134, -537, -303, 57,
- -537, -216, -537, -45, -537, -36, -537, -79, -30, -537,
- -111, 245, -210, 104, -537, -537, -537, -537, 431, -537,
- -537, -537, -537, 4, -537, 63, -537, -537, 421, -537,
- -537, -537, -537, -537, 480, -537, -537, -536, -105, 58,
- -88, -537, 445, -537, -93, -537, -537, -537, -537, 42,
- -18, -537, -537, 64, -537, -537
+ -508, -508, -508, 356, 357, 360, 145, 147, 371, 374,
+ -128, -127, -497, -508, 416, 436, -117, -508, -277, 41,
+ -508, -296, -508, -47, -508, -37, -508, -58, 46, -508,
+ -99, 253, -298, 49, -508, -508, -508, -508, -508, -508,
+ -508, 419, -508, -508, -508, -508, 8, -508, 51, -508,
+ -508, 412, -508, -508, -508, -508, -508, 471, -508, -508,
+ -507, -209, 67, -124, -508, 457, -508, -118, -508, -508,
+ -508, -508, 43, -22, -508, -508, 21, -508, -508
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
- If YYTABLE_NINF, parse error. */
-#define YYTABLE_NINF -178
-static const short yytable[] =
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -180
+static const short int yytable[] =
{
- 86, 147, 148, 129, 115, 331, 386, 25, 91, 237,
- 136, 442, 125, 86, 38, 552, 565, 444, 94, 279,
- 430, 348, 349, 42, 43, 44, 116, 117, 431, 404,
- 273, 574, 273, 273, 139, 140, 141, 142, 143, 144,
- 145, 146, 243, 45, 273, 25, 567, 129, 405, 137,
- -112, 414, 244, 129, 243, 415, 133, 443, 133, 133,
- 138, -177, 135, 443, 353, 139, 140, 141, 142, 143,
- 144, 145, 146, 430, 324, 4, 19, 430, 20, 28,
- 327, 466, 220, 221, 38, 238, 328, 467, 131, 47,
- 310, 430, 5, 314, 48, 6, 242, 465, 315, 316,
- 317, 318, 247, 7, 8, 9, 10, 11, 12, 13,
- 56, 280, 281, 282, 283, 284, 285, 60, 322, 323,
- 98, 99, 100, 14, 101, 102, 103, 286, 287, 288,
- 289, 347, 409, 410, 412, 62, 92, 291, 292, 108,
- 308, 309, 135, 311, 312, 135, 95, 57, 109, 58,
- 135, 135, 135, 135, 126, 119, 110, 49, 120, 121,
- 350, 351, 111, 19, 354, 20, 112, 319, 320, 321,
- 135, 135, 7, 8, 9, 50, 11, 51, 13, 52,
- 213, 214, 123, 325, 326, -113, 551, 53, 528, 124,
- 529, 464, 332, 333, 132, 275, 276, 139, 140, 141,
- 142, 143, 144, 145, 146, 212, 273, 277, 216, 356,
- -72, -72, -76, -76, 273, 273, 273, 566, 217, 293,
- 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,
- 304, 305, 306, 218, 380, -71, -71, 239, 402, -75,
- -75, -70, -70, 86, 29, 30, 31, 32, 33, 34,
- 35, -74, -74, 240, 381, 425, 426, 427, 428, 429,
- -69, -69, 432, 433, 434, 435, 436, -73, -73, 334,
- 335, 382, 101, 102, 245, 273, 273, 273, 278, 400,
- 329, 354, -79, 273, -80, 338, 352, 360, 86, 401,
- 135, 361, 362, 366, 367, 273, 273, 368, 369, 370,
- 373, 374, 449, 375, 451, 452, 453, 376, 377, 378,
- 457, 379, 473, 474, 383, 399, 385, 388, 403, 480,
- 389, 390, 413, 391, 392, 393, 422, 394, 398, 419,
- 437, 438, 273, 273, 462, 420, 423, 273, 416, 273,
- 424, 448, 445, 273, 463, 454, 404, 485, 455, 273,
- 273, 273, 456, 461, 135, 450, 135, 135, 135, 472,
- 417, 476, 135, 458, 477, 512, 513, 514, 515, 387,
- 516, 517, 518, 519, 478, 492, 479, 395, 396, 397,
- 488, 481, 482, 356, 273, 273, 483, 484, 489, 490,
- 496, 273, 498, 499, 506, 500, 508, 509, 539, 540,
- 273, 504, 510, 511, 521, 527, 530, 532, 538, 135,
- 533, 534, 535, 522, 542, 550, 541, 543, 544, 443,
- 568, 573, 545, 147, 148, 505, 546, 273, 547, 548,
- 561, 549, 562, 563, 554, 556, 558, 559, 439, 440,
- 441, 560, 555, 569, 570, 273, 447, 571, 572, 520,
- 575, 576, 135, 577, 147, 148, 580, 583, 459, 460,
- 337, 104, 135, 135, 135, 203, 204, 364, 135, 205,
- 273, 273, 206, 365, 207, 273, 54, 470, 273, 114,
- 122, 346, 469, 26, 97, 581, 536, 495, 0, 475,
- 0, 0, 0, 0, 135, 486, 487, 0, 0, 0,
- 491, 0, 493, 0, 0, 0, 497, 0, 0, 0,
- 0, 0, 501, 502, 503, 127, 64, 65, 66, 67,
- 68, 69, 70, 71, 72, 73, 74, 75, 76, 0,
- 0, 77, 78, 0, 0, 0, 0, 0, 0, 0,
- 19, 0, 20, 0, 0, 0, 0, 525, 526, 0,
- 0, 0, 0, 0, 531, 0, 0, 0, 0, 0,
- 0, 0, 0, 537, 127, 64, 65, 66, 67, 68,
- 69, 70, 71, 72, 73, 74, 75, 76, 0, 0,
- 77, 78, 0, 0, 0, 0, 0, 0, 0, 19,
- 557, 20, 0, 127, 222, 223, 224, 225, 226, 227,
- 228, 229, 230, 231, 232, 75, 76, 0, 564, 77,
- 78, 0, 0, 0, 0, 0, 0, 0, 19, 0,
- 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 578, 579, 0, 0, 0, 582, 0,
- 0, 584, 0, 0, 127, 64, 65, 66, 67, 68,
- 69, 70, 71, 72, 73, 74, 75, 76, 0, 0,
- 77, 78, 0, 0, 79, 0, 0, 80, 0, 19,
- 81, 20, 82, 128, 0, 0, 0, 0, 0, 0,
- 0, 246, 0, 127, 64, 65, 66, 67, 68, 69,
- 70, 71, 72, 73, 74, 75, 76, 0, 0, 77,
- 78, 0, 0, 0, 0, 0, 0, 0, 19, 0,
- 20, 0, 0, 79, 0, 0, 80, 0, 0, 81,
- 355, 82, 241, 0, 0, 0, 0, 127, 222, 223,
- 224, 225, 226, 227, 228, 229, 230, 231, 232, 75,
- 76, 0, 79, 77, 78, 80, 0, 0, 81, 0,
- 82, 411, 19, 0, 20, 127, 64, 65, 66, 67,
- 68, 69, 70, 71, 72, 73, 74, 75, 76, 0,
- 0, 77, 78, 0, 0, 0, 0, 0, 0, 0,
- 19, 0, 20, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 421, 79, 0, 0, 80, 0, 0, 81,
- 0, 82, 127, 64, 65, 66, 67, 68, 69, 70,
- 71, 72, 73, 74, 75, 76, 0, 0, 77, 78,
- 0, 0, 0, 0, 0, 0, 0, 19, 0, 20,
- 0, 0, 79, 0, 0, 80, 0, 0, 81, 468,
- 82, 63, 64, 65, 66, 67, 68, 69, 70, 71,
- 72, 73, 74, 75, 76, 0, 0, 77, 78, 0,
- 0, 0, 0, 0, 0, 0, 19, 0, 20, 0,
- 0, 0, 0, 0, 0, 0, 79, 0, 0, 80,
- 0, 408, 81, 0, 82, 0, 134, 64, 65, 66,
- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
- 0, 0, 77, 78, 79, 0, 0, 80, 0, 0,
- 81, 19, 82, 20, 127, 64, 65, 66, 67, 68,
- 69, 70, 71, 72, 73, 74, 75, 76, 0, 0,
- 77, 78, 0, 0, 0, 0, 0, 0, 0, 19,
- 0, 20, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 79, 0, 0, 80, 0, 0, 81, 0, 82,
- 127, 222, 223, 224, 225, 226, 227, 228, 229, 230,
- 231, 232, 75, 76, 0, 0, 77, 78, 0, 0,
- 0, 0, 0, 0, 0, 19, 0, 20, 0, 0,
- 79, 0, 0, 80, 0, 0, 81, 0, 82, 0,
+ 88, 235, 249, 250, 238, 371, 105, 115, 39, 393,
+ 394, 26, 223, 334, 252, 42, 88, 454, 4, 432,
+ 434, 93, 46, 47, 48, 360, 119, 406, 408, 416,
+ 360, 360, 106, 107, 123, 283, 198, 199, 287, 415,
+ 455, 49, 360, 288, 289, 290, 291, 292, 293, 26,
+ 241, 242, 243, 244, 245, 246, 247, 248, 119, 426,
+ 576, 433, 433, 29, 119, 297, 298, 239, 228, 586,
+ 39, 205, 206, 207, -112, 360, 299, 51, 229, 240,
+ 588, 594, -139, 123, -112, 360, 360, 360, 234, 53,
+ 52, 234, -139, 123, 121, 241, 242, 243, 244, 245,
+ 246, 247, 248, 302, 109, 110, 111, 469, 228, 303,
+ 7, 8, 9, 10, 54, 12, 55, 465, 339, 56,
+ 281, 282, 234, 284, 285, 234, 465, 471, 62, 465,
+ 234, 234, 234, 234, 234, 234, 515, 470, 417, 465,
+ 465, 123, 58, 59, -179, 60, 466, 482, 43, 294,
+ 295, 296, 234, 234, 94, 64, 360, 360, 360, 300,
+ 301, 505, 227, 98, 360, 116, 336, 337, 232, 5,
+ 340, 20, 99, 21, 100, 6, 101, 389, 360, 360,
+ 307, 308, -72, -72, 102, 7, 8, 9, 10, 11,
+ 12, 13, -113, 342, -71, -71, -70, -70, 113, 575,
+ -69, -69, 309, 310, 114, 365, 14, 133, 134, 122,
+ 197, 531, 202, 532, 201, 88, 30, 31, 32, 33,
+ 34, 35, 36, 360, 224, 360, 366, 203, 225, 360,
+ 230, 236, -76, -75, -74, -73, 312, 360, 360, 360,
+ -79, -80, 313, 367, 587, 338, 346, 347, 368, 370,
+ 374, 439, 387, 441, 442, 443, 373, 386, 375, 376,
+ 377, 449, 88, 388, 234, 241, 242, 243, 244, 245,
+ 246, 247, 248, 378, 360, 360, 379, 360, 360, 380,
+ 381, 385, 390, 409, 360, 391, 397, 424, 340, 398,
+ 399, 400, 401, 360, 410, 411, 412, 413, 460, 461,
+ 462, 463, 464, 414, 418, 458, 362, 363, 421, 427,
+ 422, 472, 473, 474, 475, 476, 428, 435, 364, 438,
+ 446, 447, 448, 453, 454, 481, 360, 253, 254, 255,
+ 256, 257, 258, 259, 260, 261, 262, 459, 234, 440,
+ 234, 234, 234, 444, 445, 483, 484, 468, 234, 450,
+ 419, 372, 489, 485, 486, 487, 503, 493, 495, 506,
+ 507, 382, 383, 384, 496, 360, 513, 497, 501, 504,
+ 509, 536, 537, 538, 520, 510, 511, 514, 512, 516,
+ 360, 548, 554, 521, 342, 555, 433, 360, 574, 517,
+ 518, 360, 360, 519, 523, 530, 533, 535, 234, 541,
+ 542, 543, 556, 589, 578, 557, 558, 562, 566, 559,
+ 544, 545, 546, 547, 565, 560, 502, 549, 550, 551,
+ 552, 264, 265, 567, 568, 569, 579, 593, 570, 249,
+ 250, 571, 429, 430, 431, 572, 573, 580, 581, 590,
+ 437, 591, 563, 564, 592, 596, 597, 600, 234, 249,
+ 250, 601, 186, 187, 451, 452, 188, 96, 234, 234,
+ 234, 57, 395, 479, 234, 396, 582, 189, 583, 584,
+ 190, 104, 478, 112, 27, 333, 45, 598, 492, 539,
+ 0, 508, 0, 553, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 234, 0, 0, 488,
+ 0, 490, 0, 0, 0, 494, 0, 0, 0, 0,
+ 0, 0, 0, 498, 499, 500, 0, 0, 0, 266,
+ 267, 268, 269, 270, 271, 272, 273, 274, 275, 276,
+ 277, 278, 279, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 65, 66, 0, 0, 0, 0, 0, 0,
+ 524, 525, 0, 528, 529, 0, 0, 0, 0, 20,
+ 534, 21, 0, 314, 0, 0, -82, 0, 20, 540,
+ 21, 0, 0, 0, 0, 315, 316, 6, -82, -82,
+ 0, 0, 0, 0, 0, 0, 0, -82, -82, -82,
+ -82, -82, -82, -82, 0, 0, -82, 22, 0, 0,
+ 0, 0, 561, 0, 23, 0, 0, 0, 24, 0,
+ 0, 0, 0, 0, 0, 0, 135, 136, 137, 138,
+ 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
+ 149, 150, 151, 152, 153, 154, 317, 318, 0, 0,
+ 0, 585, 0, 319, 0, 320, 163, 164, 165, 166,
+ 0, 321, 322, 323, 0, 0, 595, 0, 0, 0,
+ 0, 0, 0, 599, 0, 0, 0, 602, 603, 0,
+ 0, 0, 0, 0, 0, 0, 173, 174, 175, 176,
+ 177, 178, 179, 180, 181, 182, 183, 184, 185, 0,
+ 0, 0, 0, 0, 324, 0, 0, 325, 0, 326,
+ 65, 66, 327, 117, 68, 69, 70, 71, 72, 73,
+ 74, 75, 76, 77, 78, 0, 79, 20, 0, 21,
+ 65, 66, 0, 117, 68, 69, 70, 71, 72, 73,
+ 74, 75, 76, 77, 78, 0, 79, 20, 0, 21,
+ 0, 65, 66, 80, 117, 208, 209, 210, 211, 212,
+ 213, 214, 215, 216, 217, 218, 0, 79, 20, 0,
+ 21, 65, 66, 80, 117, 208, 209, 210, 211, 212,
+ 213, 214, 215, 216, 217, 218, 0, 79, 20, 0,
+ 21, 0, 0, 0, 80, 0, 65, 66, 0, 117,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 0, 79, 20, 80, 21, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 231, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,
+ 0, 0, 82, 0, 0, 83, 0, 84, 118, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,
+ 0, 0, 82, 0, 0, 83, 0, 84, 226, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 81, 0, 0, 82, 0, 0, 83, 0, 84, 407,
+ 0, 348, 349, 65, 66, 350, 0, 0, 0, 0,
+ 81, 0, 0, 82, 0, 0, 83, 0, 84, 467,
+ 20, 0, 21, 0, 351, 352, 353, 0, 0, 0,
+ 0, 0, 0, 0, 0, 81, 354, 355, 82, 0,
+ 0, 83, 0, 84, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 356,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 135, 136, 137,
+ 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
+ 148, 149, 150, 151, 152, 153, 154, 317, 318, 348,
+ 349, 0, 0, 350, 319, 0, 320, 163, 164, 165,
+ 166, 0, 321, 322, 323, 0, 0, 0, 0, 0,
+ 0, 0, 351, 352, 353, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 354, 355, 0, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
+ 0, 0, 0, 0, 0, 0, 0, 356, 357, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 135, 136, 137, 138, 139,
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+ 150, 151, 152, 153, 154, 317, 318, 0, 0, 0,
+ 0, 0, 319, 0, 320, 163, 164, 165, 166, 0,
+ 321, 322, 323, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 173, 174, 175, 176, 177,
+ 178, 179, 180, 181, 182, 183, 184, 185, 0, 0,
+ 0, 0, 0, 0, 65, 66, 357, 117, 68, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 0,
+ 79, 20, 0, 21, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 341, 0, 0, 0,
+ 0, 0, 0, 0, 0, 65, 66, 80, 117, 208,
+ 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
+ 0, 79, 20, 0, 21, 65, 66, 0, 117, 68,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 0, 79, 20, 0, 21, 0, 0, 0, 80, 0,
+ 0, 0, 0, 0, 0, 0, 0, 423, 0, 0,
+ 0, 0, 0, 0, 0, 0, 65, 66, 80, 117,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 0, 79, 20, 0, 21, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 477, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,
+ 0, 0, 0, 81, 0, 0, 82, 0, 0, 83,
+ 0, 84, 65, 66, 0, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 0, 79, 20,
+ 0, 21, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 81, 0, 0, 82, 0, 402,
+ 83, 0, 84, 0, 0, 80, 0, 0, 0, 0,
+ 0, 0, 0, 0, 81, 0, 0, 82, 0, 0,
+ 83, 0, 84, 65, 66, 0, 117, 68, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 0, 79,
+ 20, 0, 21, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 81, 0, 0, 82, 0,
+ 0, 83, 0, 84, 65, 66, 80, 117, 208, 209,
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 0,
+ 79, 20, 0, 21, 65, 66, 0, 237, 68, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 0,
+ 79, 20, 0, 21, 0, 0, 0, 80, 0, 0,
+ 0, 81, 0, 0, 82, 0, 0, 83, 0, 84,
+ 0, 0, 0, 0, 0, 65, 66, 80, 117, 208,
+ 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
+ 0, 79, 20, 0, 21, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80, 0,
+ 0, 0, 81, 0, 0, 82, 0, 0, 83, 0,
+ 84, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 77, 78, 0, 339, 340, 341, 0, 0,
- 0, 19, 0, 20, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 79, 0, 0, 80, 0,
- 0, 81, 0, 82, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 79, 0, 0, 80, 0, 0, 81,
- 0, 82, 154, 155, 156, 157, 158, 159, 160, 161,
- 162, 163, 164, 165, 166, 167, 168, 169, 170, 171,
- 172, 173, 258, 259, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,
- 0, 0, 80, 0, 0, 81, 0, 82, 0, 260,
- 0, 261, 182, 183, 184, 185, 0, 262, 263, 264,
- 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
- 200, 201, 202, 0, 0, 0, 0, 0, 342, 0,
- 0, 343, 0, 344, 0, 0, 345, 249, 250, 77,
- 78, 251, 252, 253, 254, 255, 256, 0, 19, 0,
- 20, 0, -82, 19, 0, 20, 0, 0, 0, 6,
- -82, -82, 0, 0, 0, 0, 0, -82, -82, -82,
- -82, -82, -82, -82, -82, 21, 0, 0, 0, 0,
- 0, 257, -82, 22, 0, 0, 0, 23, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 154,
- 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
- 165, 166, 167, 168, 169, 170, 171, 172, 173, 258,
- 259, 0, 0, 0, 0, 0, 249, 250, 0, 0,
- 251, 252, 253, 254, 255, 256, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 260, 0, 261, 182,
- 183, 184, 185, 0, 262, 263, 264, 190, 191, 192,
- 193, 194, 195, 196, 197, 198, 199, 200, 201, 202,
- 257, 0, 0, 0, 0, 0, 0, 0, 265, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 154, 155,
- 156, 157, 158, 159, 160, 161, 162, 163, 164, 165,
- 166, 167, 168, 169, 170, 171, 172, 173, 258, 259,
+ 0, 0, 0, 81, 0, 0, 82, 0, 0, 83,
+ 0, 84, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 81, 0, 0, 82, 0, 0, 83,
+ 0, 84, 0, 0, 0, 0, 124, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 125, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 126, 127, 0, 0, 81, 0, 0, 82, 0, 0,
+ 83, 0, 405, 128, 129, 130, 131, 132, 133, 134,
+ 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
+ 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
+ 155, 156, 157, 158, 159, 0, 0, 160, 161, 162,
+ 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 260, 0, 261, 182, 183,
- 184, 185, 150, 262, 263, 264, 190, 191, 192, 193,
- 194, 195, 196, 197, 198, 199, 200, 201, 202, 0,
- 0, 0, 0, 151, 152, 0, 0, 265, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 153,
- 0, 0, 0, 154, 155, 156, 157, 158, 159, 160,
- 161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
- 171, 172, 173, 174, 175, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 176, 177, 178, 0, 0,
- 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
- 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
- 199, 200, 201, 202
+ 173, 174, 175, 176, 177, 178, 179, 180, 181, 182,
+ 183, 184, 185
};
-static const short yycheck[] =
+static const short int yycheck[] =
{
- 36, 100, 100, 82, 49, 221, 309, 3, 32, 120,
- 98, 10, 18, 49, 29, 522, 552, 10, 33, 153,
- 151, 237, 238, 51, 52, 53, 35, 36, 159, 37,
- 135, 567, 137, 138, 5, 6, 7, 8, 9, 10,
- 11, 12, 151, 71, 149, 41, 553, 126, 56, 4,
- 153, 157, 161, 132, 151, 159, 162, 56, 162, 162,
- 15, 0, 98, 56, 161, 5, 6, 7, 8, 9,
- 10, 11, 12, 151, 208, 0, 28, 151, 30, 61,
- 151, 159, 118, 119, 29, 121, 157, 161, 84, 150,
- 178, 151, 31, 181, 61, 34, 126, 157, 186, 187,
- 188, 189, 132, 42, 43, 44, 45, 46, 47, 48,
- 150, 101, 102, 103, 104, 105, 106, 30, 206, 207,
- 72, 73, 74, 62, 76, 77, 78, 117, 118, 119,
- 120, 236, 342, 343, 344, 18, 160, 25, 26, 150,
- 176, 177, 178, 179, 180, 181, 161, 45, 150, 47,
- 186, 187, 188, 189, 160, 51, 150, 27, 54, 55,
- 239, 240, 150, 28, 243, 30, 155, 203, 204, 205,
- 206, 207, 42, 43, 44, 45, 46, 47, 48, 49,
- 54, 55, 18, 124, 125, 153, 157, 57, 491, 18,
- 493, 407, 25, 26, 153, 137, 138, 5, 6, 7,
- 8, 9, 10, 11, 12, 30, 311, 149, 18, 245,
- 17, 18, 17, 18, 319, 320, 321, 157, 30, 107,
- 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
- 118, 119, 120, 30, 279, 17, 18, 156, 326, 17,
- 18, 17, 18, 279, 64, 65, 66, 67, 68, 69,
- 70, 17, 18, 156, 290, 366, 367, 368, 369, 370,
- 17, 18, 373, 374, 375, 376, 377, 17, 18, 17,
- 18, 307, 76, 77, 153, 380, 381, 382, 59, 324,
- 151, 360, 21, 388, 21, 21, 159, 151, 324, 325,
- 326, 154, 63, 153, 153, 400, 401, 153, 153, 153,
- 153, 153, 390, 153, 392, 393, 394, 153, 153, 151,
- 398, 151, 423, 424, 151, 39, 151, 155, 30, 430,
- 151, 151, 30, 151, 151, 151, 30, 151, 151, 151,
- 15, 15, 437, 438, 30, 154, 153, 442, 159, 444,
- 153, 155, 151, 448, 18, 151, 37, 39, 151, 454,
- 455, 456, 151, 151, 390, 391, 392, 393, 394, 151,
- 356, 151, 398, 399, 151, 476, 477, 478, 479, 311,
- 481, 482, 483, 484, 151, 18, 151, 319, 320, 321,
- 153, 151, 151, 419, 489, 490, 151, 151, 151, 151,
- 151, 496, 151, 151, 56, 151, 30, 151, 509, 510,
- 505, 153, 151, 154, 151, 151, 151, 151, 18, 445,
- 498, 499, 500, 155, 154, 15, 151, 151, 151, 56,
- 39, 151, 154, 522, 522, 461, 154, 532, 154, 154,
- 541, 154, 543, 544, 154, 157, 154, 154, 380, 381,
- 382, 154, 530, 157, 154, 550, 388, 154, 154, 485,
- 15, 15, 488, 151, 553, 553, 15, 15, 400, 401,
- 234, 41, 498, 499, 500, 104, 104, 258, 504, 104,
- 575, 576, 104, 259, 104, 580, 24, 420, 583, 48,
- 59, 236, 419, 3, 39, 578, 504, 445, -1, 425,
- -1, -1, -1, -1, 530, 437, 438, -1, -1, -1,
- 442, -1, 444, -1, -1, -1, 448, -1, -1, -1,
- -1, -1, 454, 455, 456, 3, 4, 5, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 15, 16, -1,
- -1, 19, 20, -1, -1, -1, -1, -1, -1, -1,
- 28, -1, 30, -1, -1, -1, -1, 489, 490, -1,
- -1, -1, -1, -1, 496, -1, -1, -1, -1, -1,
- -1, -1, -1, 505, 3, 4, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 16, -1, -1,
- 19, 20, -1, -1, -1, -1, -1, -1, -1, 28,
- 532, 30, -1, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, -1, 550, 19,
- 20, -1, -1, -1, -1, -1, -1, -1, 28, -1,
- 30, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 575, 576, -1, -1, -1, 580, -1,
- -1, 583, -1, -1, 3, 4, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 16, -1, -1,
- 19, 20, -1, -1, 152, -1, -1, 155, -1, 28,
- 158, 30, 160, 161, -1, -1, -1, -1, -1, -1,
- -1, 40, -1, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, -1, -1, 19,
- 20, -1, -1, -1, -1, -1, -1, -1, 28, -1,
- 30, -1, -1, 152, -1, -1, 155, -1, -1, 158,
- 40, 160, 161, -1, -1, -1, -1, 3, 4, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, -1, 152, 19, 20, 155, -1, -1, 158, -1,
- 160, 161, 28, -1, 30, 3, 4, 5, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 15, 16, -1,
- -1, 19, 20, -1, -1, -1, -1, -1, -1, -1,
- 28, -1, 30, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 40, 152, -1, -1, 155, -1, -1, 158,
- -1, 160, 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 15, 16, -1, -1, 19, 20,
- -1, -1, -1, -1, -1, -1, -1, 28, -1, 30,
- -1, -1, 152, -1, -1, 155, -1, -1, 158, 40,
- 160, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, -1, -1, 19, 20, -1,
- -1, -1, -1, -1, -1, -1, 28, -1, 30, -1,
- -1, -1, -1, -1, -1, -1, 152, -1, -1, 155,
- -1, 157, 158, -1, 160, -1, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
- -1, -1, 19, 20, 152, -1, -1, 155, -1, -1,
- 158, 28, 160, 30, 3, 4, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 16, -1, -1,
- 19, 20, -1, -1, -1, -1, -1, -1, -1, 28,
- -1, 30, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 152, -1, -1, 155, -1, -1, 158, -1, 160,
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
- 13, 14, 15, 16, -1, -1, 19, 20, -1, -1,
- -1, -1, -1, -1, -1, 28, -1, 30, -1, -1,
- 152, -1, -1, 155, -1, -1, 158, -1, 160, -1,
+ 37, 125, 130, 130, 128, 282, 53, 4, 23, 305,
+ 306, 3, 111, 222, 131, 30, 53, 34, 0, 15,
+ 15, 29, 52, 53, 54, 234, 84, 325, 326, 159,
+ 239, 240, 32, 33, 164, 159, 55, 56, 162, 335,
+ 57, 71, 251, 167, 168, 169, 170, 171, 172, 41,
+ 10, 11, 12, 13, 14, 15, 16, 17, 116, 357,
+ 557, 57, 57, 61, 122, 189, 190, 9, 153, 576,
+ 23, 108, 109, 110, 155, 284, 193, 152, 163, 21,
+ 577, 588, 153, 164, 155, 294, 295, 296, 125, 20,
+ 61, 128, 163, 164, 86, 10, 11, 12, 13, 14,
+ 15, 16, 17, 153, 55, 56, 57, 405, 153, 159,
+ 41, 42, 43, 44, 45, 46, 47, 153, 163, 50,
+ 157, 158, 159, 160, 161, 162, 153, 163, 24, 153,
+ 167, 168, 169, 170, 171, 172, 163, 161, 161, 153,
+ 153, 164, 152, 45, 0, 47, 159, 161, 163, 186,
+ 187, 188, 189, 190, 162, 4, 365, 366, 367, 104,
+ 105, 457, 116, 152, 373, 162, 224, 225, 122, 25,
+ 228, 22, 152, 24, 152, 31, 152, 301, 387, 388,
+ 27, 28, 3, 4, 157, 41, 42, 43, 44, 45,
+ 46, 47, 155, 230, 3, 4, 3, 4, 4, 159,
+ 3, 4, 3, 4, 4, 252, 62, 77, 78, 155,
+ 24, 488, 24, 490, 4, 252, 64, 65, 66, 67,
+ 68, 69, 70, 432, 158, 434, 263, 24, 158, 438,
+ 155, 59, 4, 4, 4, 4, 4, 446, 447, 448,
+ 7, 7, 7, 280, 159, 161, 153, 156, 153, 153,
+ 153, 375, 299, 377, 378, 379, 157, 36, 153, 153,
+ 153, 385, 299, 300, 301, 10, 11, 12, 13, 14,
+ 15, 16, 17, 153, 483, 484, 153, 486, 487, 153,
+ 153, 153, 24, 24, 493, 153, 155, 63, 346, 155,
+ 155, 155, 155, 502, 155, 155, 155, 155, 397, 398,
+ 399, 400, 401, 155, 161, 155, 239, 240, 153, 153,
+ 156, 410, 411, 412, 413, 414, 153, 153, 251, 157,
+ 153, 153, 153, 153, 34, 24, 535, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, 155, 375, 376,
+ 377, 378, 379, 380, 381, 21, 21, 405, 385, 386,
+ 342, 284, 4, 155, 153, 153, 24, 153, 153, 458,
+ 459, 294, 295, 296, 153, 574, 465, 153, 155, 4,
+ 153, 495, 496, 497, 36, 153, 153, 161, 153, 153,
+ 589, 161, 4, 57, 421, 24, 57, 596, 21, 153,
+ 153, 600, 601, 153, 153, 153, 153, 153, 435, 153,
+ 153, 156, 153, 21, 36, 157, 156, 156, 156, 533,
+ 509, 510, 511, 512, 153, 159, 453, 516, 517, 518,
+ 519, 27, 28, 153, 153, 156, 159, 153, 156, 557,
+ 557, 156, 365, 366, 367, 156, 156, 156, 156, 156,
+ 373, 156, 541, 542, 156, 21, 153, 21, 485, 577,
+ 577, 21, 96, 96, 387, 388, 96, 41, 495, 496,
+ 497, 25, 317, 422, 501, 318, 565, 96, 567, 568,
+ 96, 52, 421, 61, 3, 222, 19, 595, 435, 501,
+ -1, 460, -1, 520, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 533, -1, -1, 432,
+ -1, 434, -1, -1, -1, 438, -1, -1, -1, -1,
+ -1, -1, -1, 446, 447, 448, -1, -1, -1, 125,
+ 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 5, 6, -1, -1, -1, -1, -1, -1,
+ 483, 484, -1, 486, 487, -1, -1, -1, -1, 22,
+ 493, 24, -1, 26, -1, -1, 20, -1, 22, 502,
+ 24, -1, -1, -1, -1, 38, 39, 31, 32, 33,
+ -1, -1, -1, -1, -1, -1, -1, 41, 42, 43,
+ 44, 45, 46, 47, -1, -1, 50, 51, -1, -1,
+ -1, -1, 535, -1, 58, -1, -1, -1, 62, -1,
+ -1, -1, -1, -1, -1, -1, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
+ 93, 94, 95, 96, 97, 98, 99, 100, -1, -1,
+ -1, 574, -1, 106, -1, 108, 109, 110, 111, 112,
+ -1, 114, 115, 116, -1, -1, 589, -1, -1, -1,
+ -1, -1, -1, 596, -1, -1, -1, 600, 601, -1,
+ -1, -1, -1, -1, -1, -1, 139, 140, 141, 142,
+ 143, 144, 145, 146, 147, 148, 149, 150, 151, -1,
+ -1, -1, -1, -1, 157, -1, -1, 160, -1, 162,
+ 5, 6, 165, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, -1, 21, 22, -1, 24,
+ 5, 6, -1, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, -1, 21, 22, -1, 24,
+ -1, 5, 6, 48, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, -1, 21, 22, -1,
+ 24, 5, 6, 48, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, -1, 21, 22, -1,
+ 24, -1, -1, -1, 48, -1, 5, 6, -1, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, -1, 21, 22, 48, 24, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 37, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 48,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 19, 20, -1, 22, 23, 24, -1, -1,
- -1, 28, -1, 30, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 152, -1, -1, 155, -1,
- -1, 158, -1, 160, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 154,
+ -1, -1, 157, -1, -1, 160, -1, 162, 163, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 154,
+ -1, -1, 157, -1, -1, 160, -1, 162, 163, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 152, -1, -1, 155, -1, -1, 158,
- -1, 160, 79, 80, 81, 82, 83, 84, 85, 86,
- 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
- 97, 98, 99, 100, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 152,
- -1, -1, 155, -1, -1, 158, -1, 160, -1, 126,
- -1, 128, 129, 130, 131, 132, -1, 134, 135, 136,
- 137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
- 147, 148, 149, -1, -1, -1, -1, -1, 155, -1,
- -1, 158, -1, 160, -1, -1, 163, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, -1, 28, -1,
- 30, -1, 27, 28, -1, 30, -1, -1, -1, 34,
- 35, 36, -1, -1, -1, -1, -1, 42, 43, 44,
- 45, 46, 47, 48, 49, 50, -1, -1, -1, -1,
- -1, 61, 57, 58, -1, -1, -1, 62, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 79,
- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
- 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
- 100, -1, -1, -1, -1, -1, 17, 18, -1, -1,
- 21, 22, 23, 24, 25, 26, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 126, -1, 128, 129,
- 130, 131, 132, -1, 134, 135, 136, 137, 138, 139,
- 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
- 61, -1, -1, -1, -1, -1, -1, -1, 158, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 79, 80,
- 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
- 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
+ 154, -1, -1, 157, -1, -1, 160, -1, 162, 163,
+ -1, 3, 4, 5, 6, 7, -1, -1, -1, -1,
+ 154, -1, -1, 157, -1, -1, 160, -1, 162, 163,
+ 22, -1, 24, -1, 26, 27, 28, -1, -1, -1,
+ -1, -1, -1, -1, -1, 154, 38, 39, 157, -1,
+ -1, 160, -1, 162, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 61,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 79, 80, 81,
+ 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95, 96, 97, 98, 99, 100, 3,
+ 4, -1, -1, 7, 106, -1, 108, 109, 110, 111,
+ 112, -1, 114, 115, 116, -1, -1, -1, -1, -1,
+ -1, -1, 26, 27, 28, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 38, 39, -1, 139, 140, 141,
+ 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
+ -1, -1, -1, -1, -1, -1, -1, 61, 160, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 126, -1, 128, 129, 130,
- 131, 132, 38, 134, 135, 136, 137, 138, 139, 140,
- 141, 142, 143, 144, 145, 146, 147, 148, 149, -1,
- -1, -1, -1, 59, 60, -1, -1, 158, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 75,
- -1, -1, -1, 79, 80, 81, 82, 83, 84, 85,
- 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
- 96, 97, 98, 99, 100, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 79, 80, 81, 82, 83,
+ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
+ 94, 95, 96, 97, 98, 99, 100, -1, -1, -1,
+ -1, -1, 106, -1, 108, 109, 110, 111, 112, -1,
+ 114, 115, 116, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 121, 122, 123, -1, -1,
- 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
- 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
- 146, 147, 148, 149
+ -1, -1, -1, -1, -1, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151, -1, -1,
+ -1, -1, -1, -1, 5, 6, 160, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, -1,
+ 21, 22, -1, 24, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 37, -1, -1, -1,
+ -1, -1, -1, -1, -1, 5, 6, 48, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ -1, 21, 22, -1, 24, 5, 6, -1, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ -1, 21, 22, -1, 24, -1, -1, -1, 48, -1,
+ -1, -1, -1, -1, -1, -1, -1, 37, -1, -1,
+ -1, -1, -1, -1, -1, -1, 5, 6, 48, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, -1, 21, 22, -1, 24, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 37, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 48,
+ -1, -1, -1, 154, -1, -1, 157, -1, -1, 160,
+ -1, 162, 5, 6, -1, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 18, 19, -1, 21, 22,
+ -1, 24, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 154, -1, -1, 157, -1, 159,
+ 160, -1, 162, -1, -1, 48, -1, -1, -1, -1,
+ -1, -1, -1, -1, 154, -1, -1, 157, -1, -1,
+ 160, -1, 162, 5, 6, -1, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19, -1, 21,
+ 22, -1, 24, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 154, -1, -1, 157, -1,
+ -1, 160, -1, 162, 5, 6, 48, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, -1,
+ 21, 22, -1, 24, 5, 6, -1, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, -1,
+ 21, 22, -1, 24, -1, -1, -1, 48, -1, -1,
+ -1, 154, -1, -1, 157, -1, -1, 160, -1, 162,
+ -1, -1, -1, -1, -1, 5, 6, 48, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ -1, 21, 22, -1, 24, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, -1,
+ -1, -1, 154, -1, -1, 157, -1, -1, 160, -1,
+ 162, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 154, -1, -1, 157, -1, -1, 160,
+ -1, 162, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 154, -1, -1, 157, -1, -1, 160,
+ -1, 162, -1, -1, -1, -1, 35, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 49, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 59, 60, -1, -1, 154, -1, -1, 157, -1, -1,
+ 160, -1, 162, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
+ 99, 100, 101, 102, 103, -1, -1, 106, 107, 108,
+ 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
+ 149, 150, 151
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const unsigned char yystos[] =
{
- 0, 198, 199, 201, 0, 31, 34, 42, 43, 44,
- 45, 46, 47, 48, 62, 179, 214, 216, 218, 28,
- 30, 50, 58, 62, 178, 207, 218, 219, 61, 64,
- 65, 66, 67, 68, 69, 70, 180, 212, 29, 225,
- 226, 227, 51, 52, 53, 71, 204, 150, 61, 27,
- 45, 47, 49, 57, 179, 200, 150, 45, 47, 217,
- 30, 202, 18, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 19, 20, 152,
- 155, 158, 160, 165, 187, 188, 189, 190, 191, 207,
- 222, 32, 160, 213, 33, 161, 215, 226, 72, 73,
- 74, 76, 77, 78, 178, 228, 229, 231, 150, 150,
- 150, 150, 155, 205, 202, 187, 35, 36, 197, 197,
- 197, 197, 212, 18, 18, 18, 160, 3, 161, 191,
- 192, 207, 153, 162, 3, 189, 224, 4, 15, 5,
- 6, 7, 8, 9, 10, 11, 12, 174, 175, 176,
- 38, 59, 60, 75, 79, 80, 81, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
- 95, 96, 97, 98, 99, 100, 121, 122, 123, 126,
- 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
- 137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
- 147, 148, 149, 167, 168, 169, 172, 173, 235, 236,
- 238, 239, 30, 54, 55, 203, 18, 30, 30, 206,
- 189, 189, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 174, 175, 177, 189, 194, 189, 156,
- 156, 161, 192, 151, 161, 153, 40, 192, 193, 17,
- 18, 21, 22, 23, 24, 25, 26, 61, 99, 100,
- 126, 128, 134, 135, 136, 158, 167, 168, 169, 172,
- 173, 195, 221, 222, 223, 223, 223, 223, 59, 180,
- 101, 102, 103, 104, 105, 106, 117, 118, 119, 120,
- 170, 25, 26, 107, 108, 109, 110, 111, 112, 113,
- 114, 115, 116, 117, 118, 119, 120, 171, 189, 189,
- 224, 189, 189, 232, 224, 224, 224, 224, 224, 189,
- 189, 189, 224, 224, 180, 124, 125, 151, 157, 151,
- 185, 185, 25, 26, 17, 18, 166, 166, 21, 22,
- 23, 24, 155, 158, 160, 163, 195, 222, 185, 185,
- 191, 191, 159, 161, 191, 40, 189, 209, 210, 211,
- 151, 154, 63, 220, 170, 171, 153, 153, 153, 153,
- 153, 194, 196, 153, 153, 153, 153, 153, 151, 151,
- 187, 189, 189, 151, 182, 151, 182, 223, 155, 151,
- 151, 151, 151, 151, 151, 223, 223, 223, 151, 39,
- 187, 189, 224, 30, 37, 56, 183, 186, 157, 196,
- 196, 161, 196, 30, 157, 159, 159, 207, 208, 151,
- 154, 40, 30, 153, 153, 194, 194, 194, 194, 194,
- 151, 159, 194, 194, 194, 194, 194, 15, 15, 223,
- 223, 223, 10, 56, 10, 151, 237, 223, 155, 224,
- 189, 224, 224, 224, 151, 151, 151, 224, 189, 223,
- 223, 151, 30, 18, 185, 157, 159, 161, 40, 209,
- 183, 184, 151, 194, 194, 237, 151, 151, 151, 151,
- 194, 151, 151, 151, 151, 39, 223, 223, 153, 151,
- 151, 223, 18, 223, 224, 233, 151, 223, 151, 151,
- 151, 223, 223, 223, 153, 189, 56, 181, 30, 151,
- 151, 154, 194, 194, 194, 194, 194, 194, 194, 194,
- 189, 151, 155, 233, 234, 223, 223, 151, 182, 182,
- 151, 223, 151, 224, 224, 224, 234, 223, 18, 194,
- 194, 151, 154, 151, 151, 154, 154, 154, 154, 154,
- 15, 157, 176, 230, 154, 224, 157, 223, 154, 154,
- 154, 194, 194, 194, 223, 221, 157, 176, 39, 157,
- 154, 154, 154, 151, 221, 15, 15, 151, 223, 223,
- 15, 228, 223, 15, 223
+ 0, 200, 201, 202, 0, 25, 31, 41, 42, 43,
+ 44, 45, 46, 47, 62, 181, 219, 221, 223, 230,
+ 22, 24, 51, 58, 62, 180, 212, 223, 224, 61,
+ 64, 65, 66, 67, 68, 69, 70, 182, 217, 23,
+ 231, 232, 30, 163, 220, 231, 52, 53, 54, 71,
+ 209, 152, 61, 20, 45, 47, 50, 181, 152, 45,
+ 47, 222, 24, 207, 4, 5, 6, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 21,
+ 48, 154, 157, 160, 162, 167, 189, 190, 191, 192,
+ 193, 212, 227, 29, 162, 218, 180, 236, 152, 152,
+ 152, 152, 157, 210, 207, 189, 32, 33, 199, 199,
+ 199, 199, 217, 4, 4, 4, 162, 8, 163, 193,
+ 194, 212, 155, 164, 35, 49, 59, 60, 72, 73,
+ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
+ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
+ 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
+ 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
+ 116, 117, 118, 139, 140, 141, 142, 143, 144, 145,
+ 146, 147, 148, 149, 150, 151, 169, 170, 171, 174,
+ 175, 233, 234, 240, 241, 243, 244, 24, 55, 56,
+ 208, 4, 24, 24, 211, 191, 191, 191, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 176,
+ 177, 179, 191, 196, 158, 158, 163, 194, 153, 163,
+ 155, 37, 194, 195, 191, 229, 59, 8, 229, 9,
+ 21, 10, 11, 12, 13, 14, 15, 16, 17, 176,
+ 177, 178, 182, 119, 120, 121, 122, 123, 124, 125,
+ 126, 127, 128, 172, 27, 28, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
+ 173, 191, 191, 229, 191, 191, 237, 229, 229, 229,
+ 229, 229, 229, 229, 191, 191, 191, 229, 229, 182,
+ 104, 105, 153, 159, 205, 206, 204, 27, 28, 3,
+ 4, 168, 4, 7, 26, 38, 39, 99, 100, 106,
+ 108, 114, 115, 116, 157, 160, 162, 165, 169, 170,
+ 171, 174, 175, 197, 227, 203, 193, 193, 161, 163,
+ 193, 37, 191, 214, 215, 216, 153, 156, 3, 4,
+ 7, 26, 27, 28, 38, 39, 61, 160, 197, 226,
+ 227, 228, 228, 228, 228, 189, 191, 191, 153, 184,
+ 153, 184, 228, 157, 153, 153, 153, 153, 153, 153,
+ 153, 153, 228, 228, 228, 153, 36, 189, 191, 229,
+ 24, 153, 187, 187, 187, 172, 173, 155, 155, 155,
+ 155, 155, 159, 196, 198, 162, 198, 163, 198, 24,
+ 155, 155, 155, 155, 155, 187, 159, 161, 161, 212,
+ 213, 153, 156, 37, 63, 225, 198, 153, 153, 228,
+ 228, 228, 15, 57, 15, 153, 242, 228, 157, 229,
+ 191, 229, 229, 229, 191, 191, 153, 153, 153, 229,
+ 191, 228, 228, 153, 34, 57, 185, 188, 155, 155,
+ 196, 196, 196, 196, 196, 153, 159, 163, 193, 198,
+ 161, 163, 196, 196, 196, 196, 196, 37, 214, 185,
+ 186, 24, 161, 21, 21, 155, 153, 153, 228, 4,
+ 228, 229, 238, 153, 228, 153, 153, 153, 228, 228,
+ 228, 155, 191, 24, 4, 187, 196, 196, 242, 153,
+ 153, 153, 153, 196, 161, 163, 153, 153, 153, 153,
+ 36, 57, 183, 153, 228, 228, 238, 239, 228, 228,
+ 153, 184, 184, 153, 228, 153, 229, 229, 229, 239,
+ 228, 153, 153, 156, 196, 196, 196, 196, 161, 196,
+ 196, 196, 196, 191, 4, 24, 153, 157, 156, 229,
+ 159, 228, 156, 196, 196, 153, 156, 153, 153, 156,
+ 156, 156, 156, 156, 21, 159, 178, 235, 36, 159,
+ 156, 156, 196, 196, 196, 228, 226, 159, 178, 21,
+ 156, 156, 156, 153, 226, 228, 21, 153, 233, 228,
+ 21, 21, 228, 228
};
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
-#endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
-#endif
-#if ! defined (YYSIZE_T)
-# if defined (__STDC__) || defined (__cplusplus)
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# endif
-#endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
-#endif
-
#define yyerrok (yyerrstatus = 0)
#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY -2
+#define YYEMPTY (-2)
#define YYEOF 0
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrlab1
+#define YYERROR goto yyerrorlab
+
/* Like YYERROR except do call yyerror. This remains here temporarily
to ease the transition to the new meaning of YYERROR, for GCC.
@@ -2413,34 +3047,71 @@ do \
{ \
yychar = (Token); \
yylval = (Value); \
- yychar1 = YYTRANSLATE (yychar); \
+ yytoken = YYTRANSLATE (yychar); \
YYPOPSTACK; \
goto yybackup; \
} \
else \
- { \
- yyerror ("syntax error: cannot back up"); \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
YYERROR; \
} \
while (0)
+
#define YYTERROR 1
#define YYERRCODE 256
-/* YYLLOC_DEFAULT -- Compute the default location (before the actions
- are run). */
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- Current.first_line = Rhs[1].first_line; \
- Current.first_column = Rhs[1].first_column; \
- Current.last_line = Rhs[N].last_line; \
- Current.last_column = Rhs[N].last_column;
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) \
+ { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ } \
+ else \
+ { \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ } \
+ while (0)
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+ This macro was not mandated originally: define only if we know
+ we won't break user code: when these are the locations we know. */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+# define YY_LOCATION_PRINT(File, Loc) \
+ fprintf (File, "%d.%d-%d.%d", \
+ (Loc).first_line, (Loc).first_column, \
+ (Loc).last_line, (Loc).last_column)
+# else
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
#endif
+
/* YYLEX -- calling `yylex' with the right arguments. */
-#define YYLEX yylex ()
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
/* Enable debugging if requested. */
#if YYDEBUG
@@ -2455,19 +3126,86 @@ do { \
if (yydebug) \
YYFPRINTF Args; \
} while (0)
-# define YYDSYMPRINT(Args) \
-do { \
- if (yydebug) \
- yysymprint Args; \
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yysymprint (stderr, \
+ Type, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+ short int *bottom;
+ short int *top;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (/* Nothing. */; bottom <= top; ++bottom)
+ YYFPRINTF (stderr, " %d", *bottom);
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+ int yyrule;
+#endif
+{
+ int yyi;
+ unsigned long int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
+ yyrule - 1, yylno);
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+ YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (Rule); \
+} while (0)
+
/* Nonzero means print parse trace. It is left uninitialized so that
multiple parsers can coexist. */
int yydebug;
#else /* !YYDEBUG */
# define YYDPRINTF(Args)
-# define YYDSYMPRINT(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
#endif /* !YYDEBUG */
+
/* YYINITDEPTH -- initial size of the parser's stacks. */
#ifndef YYINITDEPTH
# define YYINITDEPTH 200
@@ -2477,13 +3215,9 @@ int yydebug;
if the built-in stack extension method is used).
Do not make this value too large; the results are undefined if
- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
evaluated with infinite-precision integer arithmetic. */
-#if YYMAXDEPTH == 0
-# undef YYMAXDEPTH
-#endif
-
#ifndef YYMAXDEPTH
# define YYMAXDEPTH 10000
#endif
@@ -2505,7 +3239,7 @@ yystrlen (yystr)
const char *yystr;
# endif
{
- register const char *yys = yystr;
+ const char *yys = yystr;
while (*yys++ != '\0')
continue;
@@ -2530,8 +3264,8 @@ yystpcpy (yydest, yysrc)
const char *yysrc;
# endif
{
- register char *yyd = yydest;
- register const char *yys = yysrc;
+ char *yyd = yydest;
+ const char *yys = yysrc;
while ((*yyd++ = *yys++) != '\0')
continue;
@@ -2541,124 +3275,186 @@ yystpcpy (yydest, yysrc)
# endif
# endif
-#endif /* !YYERROR_VERBOSE */
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+ quotes and backslashes, so that it's suitable for yyerror. The
+ heuristic is that double-quoting is unnecessary unless the string
+ contains an apostrophe, a comma, or backslash (other than
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
+ null, do not copy; instead, return the length of what the result
+ would have been. */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ size_t yyn = 0;
+ char const *yyp = yystr;
+
+ for (;;)
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ /* Fall through. */
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
+ do_not_strip_quotes: ;
+ }
+
+ if (! yyres)
+ return yystrlen (yystr);
+
+ return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+#endif /* YYERROR_VERBOSE */
#if YYDEBUG
-/*-----------------------------.
-| Print this symbol on YYOUT. |
-`-----------------------------*/
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
-static void
#if defined (__STDC__) || defined (__cplusplus)
-yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
#else
-yysymprint (yyout, yytype, yyvalue)
- FILE* yyout;
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
int yytype;
- YYSTYPE yyvalue;
+ YYSTYPE *yyvaluep;
#endif
{
/* Pacify ``unused variable'' warnings. */
- (void) yyvalue;
+ (void) yyvaluep;
if (yytype < YYNTOKENS)
- {
- YYFPRINTF (yyout, "token %s (", yytname[yytype]);
-# ifdef YYPRINT
- YYPRINT (yyout, yytoknum[yytype], yyvalue);
-# endif
- }
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
else
- YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
switch (yytype)
{
default:
break;
}
- YYFPRINTF (yyout, ")");
+ YYFPRINTF (yyoutput, ")");
}
-#endif /* YYDEBUG. */
-
+#endif /* ! YYDEBUG */
/*-----------------------------------------------.
| Release the memory associated to this symbol. |
`-----------------------------------------------*/
-static void
#if defined (__STDC__) || defined (__cplusplus)
-yydestruct (int yytype, YYSTYPE yyvalue)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
#else
-yydestruct (yytype, yyvalue)
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+ const char *yymsg;
int yytype;
- YYSTYPE yyvalue;
+ YYSTYPE *yyvaluep;
#endif
{
/* Pacify ``unused variable'' warnings. */
- (void) yyvalue;
+ (void) yyvaluep;
+
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
switch (yytype)
{
+
default:
break;
}
}
-
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
- into yyparse. The argument should have type void *.
- It should actually point to an object.
- Grammar actions can access the variable by casting it
- to the proper pointer type. */
+/* Prevent warnings from -Wmissing-prototypes. */
#ifdef YYPARSE_PARAM
# if defined (__STDC__) || defined (__cplusplus)
-# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-# define YYPARSE_PARAM_DECL
+int yyparse (void *YYPARSE_PARAM);
# else
-# define YYPARSE_PARAM_ARG YYPARSE_PARAM
-# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+int yyparse ();
# endif
-#else /* !YYPARSE_PARAM */
-# define YYPARSE_PARAM_ARG
-# define YYPARSE_PARAM_DECL
-#endif /* !YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes. */
-#ifdef __GNUC__
-# ifdef YYPARSE_PARAM
-int yyparse (void *);
-# else
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
int yyparse (void);
-# endif
+#else
+int yyparse ();
#endif
+#endif /* ! YYPARSE_PARAM */
+
-/* The lookahead symbol. */
+/* The look-ahead symbol. */
int yychar;
-/* The semantic value of the lookahead symbol. */
+/* The semantic value of the look-ahead symbol. */
YYSTYPE yylval;
-/* Number of parse errors so far. */
+/* Number of syntax errors so far. */
int yynerrs;
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
int
-yyparse (YYPARSE_PARAM_ARG)
- YYPARSE_PARAM_DECL
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
{
- register int yystate;
- register int yyn;
+ int yystate;
+ int yyn;
int yyresult;
/* Number of tokens to shift before error messages enabled. */
int yyerrstatus;
- /* Lookahead token as an internal (translated) token number. */
- int yychar1 = 0;
+ /* Look-ahead token as an internal (translated) token number. */
+ int yytoken = 0;
/* Three stacks and their tools:
`yyss': related to states,
@@ -2669,14 +3465,14 @@ yyparse (YYPARSE_PARAM_ARG)
to reallocate them elsewhere. */
/* The state stack. */
- short yyssa[YYINITDEPTH];
- short *yyss = yyssa;
- register short *yyssp;
+ short int yyssa[YYINITDEPTH];
+ short int *yyss = yyssa;
+ short int *yyssp;
/* The semantic value stack. */
YYSTYPE yyvsa[YYINITDEPTH];
YYSTYPE *yyvs = yyvsa;
- register YYSTYPE *yyvsp;
+ YYSTYPE *yyvsp;
@@ -2722,7 +3518,7 @@ yyparse (YYPARSE_PARAM_ARG)
yysetstate:
*yyssp = yystate;
- if (yyssp >= yyss + yystacksize - 1)
+ if (yyss + yystacksize - 1 <= yyssp)
{
/* Get the current used size of the three stacks, in elements. */
YYSIZE_T yysize = yyssp - yyss + 1;
@@ -2733,14 +3529,14 @@ yyparse (YYPARSE_PARAM_ARG)
these so that the &'s don't force the real ones into
memory. */
YYSTYPE *yyvs1 = yyvs;
- short *yyss1 = yyss;
+ short int *yyss1 = yyss;
/* Each stack pointer address is followed by the size of the
data in use in that stack, in bytes. This used to be a
conditional around just the two extra args, but that might
be undefined if yyoverflow is a macro. */
- yyoverflow ("parser stack overflow",
+ yyoverflow (YY_("memory exhausted"),
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),
@@ -2751,21 +3547,21 @@ yyparse (YYPARSE_PARAM_ARG)
}
#else /* no yyoverflow */
# ifndef YYSTACK_RELOCATE
- goto yyoverflowlab;
+ goto yyexhaustedlab;
# else
/* Extend the stack our own way. */
- if (yystacksize >= YYMAXDEPTH)
- goto yyoverflowlab;
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
yystacksize *= 2;
- if (yystacksize > YYMAXDEPTH)
+ if (YYMAXDEPTH < yystacksize)
yystacksize = YYMAXDEPTH;
{
- short *yyss1 = yyss;
+ short int *yyss1 = yyss;
union yyalloc *yyptr =
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
if (! yyptr)
- goto yyoverflowlab;
+ goto yyexhaustedlab;
YYSTACK_RELOCATE (yyss);
YYSTACK_RELOCATE (yyvs);
@@ -2783,7 +3579,7 @@ yyparse (YYPARSE_PARAM_ARG)
YYDPRINTF ((stderr, "Stack size increased to %lu\n",
(unsigned long int) yystacksize));
- if (yyssp >= yyss + yystacksize - 1)
+ if (yyss + yystacksize - 1 <= yyssp)
YYABORT;
}
@@ -2797,50 +3593,39 @@ yyparse (YYPARSE_PARAM_ARG)
yybackup:
/* Do appropriate processing given the current state. */
-/* Read a lookahead token if we need one and don't already have one. */
+/* Read a look-ahead token if we need one and don't already have one. */
/* yyresume: */
- /* First try to decide what to do without reference to lookahead token. */
+ /* First try to decide what to do without reference to look-ahead token. */
yyn = yypact[yystate];
if (yyn == YYPACT_NINF)
goto yydefault;
- /* Not known => get a lookahead token if don't already have one. */
-
- /* yychar is either YYEMPTY or YYEOF
- or a valid token in external form. */
+ /* Not known => get a look-ahead token if don't already have one. */
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
if (yychar == YYEMPTY)
{
YYDPRINTF ((stderr, "Reading a token: "));
yychar = YYLEX;
}
- /* Convert token to internal form (in yychar1) for indexing tables with. */
-
- if (yychar <= 0) /* This means end of input. */
+ if (yychar <= YYEOF)
{
- yychar1 = 0;
- yychar = YYEOF; /* Don't call YYLEX any more. */
-
+ yychar = yytoken = YYEOF;
YYDPRINTF ((stderr, "Now at end of input.\n"));
}
else
{
- yychar1 = YYTRANSLATE (yychar);
-
- /* We have to keep this `#if YYDEBUG', since we use variables
- which are defined only if `YYDEBUG' is set. */
- YYDPRINTF ((stderr, "Next token is "));
- YYDSYMPRINT ((stderr, yychar1, yylval));
- YYDPRINTF ((stderr, "\n"));
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
}
- /* If the proper action on seeing token YYCHAR1 is to reduce or to
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
detect an error, take that action. */
- yyn += yychar1;
- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
goto yydefault;
yyn = yytable[yyn];
if (yyn <= 0)
@@ -2854,9 +3639,8 @@ yybackup:
if (yyn == YYFINAL)
YYACCEPT;
- /* Shift the lookahead token. */
- YYDPRINTF ((stderr, "Shifting token %d (%s), ",
- yychar, yytname[yychar1]));
+ /* Shift the look-ahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
/* Discard the token being shifted unless it is eof. */
if (yychar != YYEOF)
@@ -2902,1696 +3686,2439 @@ yyreduce:
yyval = yyvsp[1-yylen];
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 3:
+#line 1608 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX) // Outside of my range!
+ error("Value too large for type");
+ (yyval.SIntVal) = (int32_t)(yyvsp[0].UIntVal);
+ ;}
+ break;
-#if YYDEBUG
- /* We have to keep this `#if YYDEBUG', since we use variables which
- are defined only if `YYDEBUG' is set. */
- if (yydebug)
+ case 5:
+#line 1617 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- int yyi;
+ if ((yyvsp[0].UInt64Val) > (uint64_t)INT64_MAX) // Outside of my range!
+ error("Value too large for type");
+ (yyval.SInt64Val) = (int64_t)(yyvsp[0].UInt64Val);
+ ;}
+ break;
- YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
- yyn - 1, yyrline[yyn]);
+ case 26:
+#line 1639 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_EQ; ;}
+ break;
- /* Print the symbols being reduced, and their result. */
- for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
- YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
- YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
- }
-#endif
- switch (yyn)
- {
- case 81:
-#line 1061 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+ case 27:
+#line 1639 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_NE; ;}
+ break;
+
+ case 28:
+#line 1640 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_SLT; ;}
+ break;
+
+ case 29:
+#line 1640 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_SGT; ;}
+ break;
+
+ case 30:
+#line 1641 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_SLE; ;}
+ break;
+
+ case 31:
+#line 1641 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_SGE; ;}
+ break;
+
+ case 32:
+#line 1642 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_ULT; ;}
+ break;
+
+ case 33:
+#line 1642 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_UGT; ;}
+ break;
+
+ case 34:
+#line 1643 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_ULE; ;}
+ break;
+
+ case 35:
+#line 1643 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.IPred) = ICmpInst::ICMP_UGE; ;}
+ break;
+
+ case 36:
+#line 1647 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_OEQ; ;}
+ break;
+
+ case 37:
+#line 1647 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_ONE; ;}
+ break;
+
+ case 38:
+#line 1648 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_OLT; ;}
+ break;
+
+ case 39:
+#line 1648 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_OGT; ;}
+ break;
+
+ case 40:
+#line 1649 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_OLE; ;}
+ break;
+
+ case 41:
+#line 1649 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_OGE; ;}
+ break;
+
+ case 42:
+#line 1650 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_ORD; ;}
+ break;
+
+ case 43:
+#line 1650 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_UNO; ;}
+ break;
+
+ case 44:
+#line 1651 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_UEQ; ;}
+ break;
+
+ case 45:
+#line 1651 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_UNE; ;}
+ break;
+
+ case 46:
+#line 1652 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_ULT; ;}
+ break;
+
+ case 47:
+#line 1652 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_UGT; ;}
+ break;
+
+ case 48:
+#line 1653 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_ULE; ;}
+ break;
+
+ case 49:
+#line 1653 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_UGE; ;}
+ break;
+
+ case 50:
+#line 1654 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_TRUE; ;}
+ break;
+
+ case 51:
+#line 1655 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.FPred) = FCmpInst::FCMP_FALSE; ;}
+ break;
+
+ case 81:
+#line 1686 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.String = yyvsp[-1].String;
- }
+ (yyval.StrVal) = (yyvsp[-1].StrVal);
+ ;}
break;
case 82:
-#line 1064 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1689 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.String = new std::string("");
- }
+ (yyval.StrVal) = 0;
+ ;}
+ break;
+
+ case 83:
+#line 1694 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
+ break;
+
+ case 84:
+#line 1695 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
+ break;
+
+ case 85:
+#line 1696 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
+ break;
+
+ case 86:
+#line 1697 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
+ break;
+
+ case 87:
+#line 1698 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
+ break;
+
+ case 88:
+#line 1699 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
+ break;
+
+ case 89:
+#line 1700 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
break;
case 90:
-#line 1071 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(""); }
+#line 1701 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
+ break;
+
+ case 91:
+#line 1705 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = CallingConv::C; ;}
+ break;
+
+ case 92:
+#line 1706 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = CallingConv::C; ;}
+ break;
+
+ case 93:
+#line 1707 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = CallingConv::CSRet; ;}
+ break;
+
+ case 94:
+#line 1708 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = CallingConv::Fast; ;}
+ break;
+
+ case 95:
+#line 1709 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = CallingConv::Cold; ;}
+ break;
+
+ case 96:
+#line 1710 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = CallingConv::X86_StdCall; ;}
break;
case 97:
-#line 1076 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *yyvsp[-1].String += *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-1].String;
- }
+#line 1711 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = CallingConv::X86_FastCall; ;}
break;
case 98:
-#line 1081 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(""); }
+#line 1712 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val))
+ error("Calling conv too large");
+ (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+ ;}
break;
case 99:
-#line 1086 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+#line 1722 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = 0; ;}
break;
case 100:
-#line 1087 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { *yyvsp[-1].String += " " + *yyvsp[0].String; delete yyvsp[0].String; yyval.String = yyvsp[-1].String; }
+#line 1723 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+ if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
+ error("Alignment must be a power of two");
+ ;}
break;
case 101:
-#line 1090 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+#line 1731 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.UIntVal) = 0; ;}
break;
case 102:
-#line 1091 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyvsp[-1].String->insert(0, ", ");
- *yyvsp[-1].String += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-1].String;
- }
+#line 1732 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+ if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
+ error("Alignment must be a power of two");
+ ;}
break;
case 103:
-#line 1099 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *yyvsp[-1].String += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-1].String;
- }
+#line 1740 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i)
+ if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\')
+ error("Invalid character in section name");
+ (yyval.StrVal) = (yyvsp[0].StrVal);
+ ;}
break;
case 104:
-#line 1105 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+#line 1749 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.StrVal) = 0; ;}
+ break;
+
+ case 105:
+#line 1750 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.StrVal) = (yyvsp[0].StrVal); ;}
break;
case 106:
-#line 1109 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+#line 1757 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {;}
break;
case 107:
-#line 1110 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1758 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {;}
+ break;
+
+ case 108:
+#line 1762 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyvsp[-1].String->insert(0, ", ");
- if (!yyvsp[0].String->empty())
- *yyvsp[-1].String += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-1].String;
- }
+ CurGV->setSection((yyvsp[0].StrVal));
+ free((yyvsp[0].StrVal));
+ ;}
break;
case 109:
-#line 1120 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1766 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-1].String += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-1].String;
- }
+ if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val)))
+ error("Alignment must be a power of two");
+ CurGV->setAlignment((yyvsp[0].UInt64Val));
+
+ ;}
+ break;
+
+ case 111:
+#line 1783 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T);
+ (yyval.TypeVal).S = Signless;
+ ;}
+ break;
+
+ case 113:
+#line 1791 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T);
+ (yyval.TypeVal).S = Signless;
+ ;}
+ break;
+
+ case 114:
+#line 1798 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if (!UpRefs.empty())
+ error("Invalid upreference in type: " + (*(yyvsp[0].TypeVal).T)->getDescription());
+ (yyval.TypeVal) = (yyvsp[0].TypeVal);
+ ;}
break;
case 127:
-#line 1142 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1812 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Ty = Type::get(*yyvsp[0].String, OpaqueTy);
- }
+ (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T);
+ (yyval.TypeVal).S = (yyvsp[0].PrimType).S;
+ ;}
break;
case 128:
-#line 1145 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyval.Ty = Type::get(*yyvsp[0].String, UnresolvedTy);
- }
+#line 1816 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.TypeVal).T = new PATypeHolder(OpaqueType::get());
+ (yyval.TypeVal).S = Signless;
+ ;}
break;
case 129:
-#line 1148 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyval.Ty = yyvsp[0].Ty;
- }
+#line 1820 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Named types are also simple types...
+ const Type* tmp = getTypeVal((yyvsp[0].ValIDVal));
+ (yyval.TypeVal).T = new PATypeHolder(tmp);
+ (yyval.TypeVal).S = Signless; // FIXME: what if its signed?
+ ;}
break;
case 130:
-#line 1151 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1825 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Type UpReference
- yyvsp[0].String->insert(0, "\\");
- yyval.Ty = Type::get(*yyvsp[0].String, UpRefTy);
- }
+ if ((yyvsp[0].UInt64Val) > (uint64_t)~0U)
+ error("Value out of range");
+ OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder
+ UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT)); // Add to vector...
+ (yyval.TypeVal).T = new PATypeHolder(OT);
+ (yyval.TypeVal).S = Signless;
+ UR_OUT("New Upreference!\n");
+ ;}
break;
case 131:
-#line 1155 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1834 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Function derived type?
- std::string newTy( yyvsp[-3].Ty->getNewTy() + "(");
- for (unsigned i = 0; i < yyvsp[-1].TypeVec->size(); ++i) {
- if (i != 0)
- newTy += ", ";
- if ((*yyvsp[-1].TypeVec)[i]->isVoid())
- newTy += "...";
- else
- newTy += (*yyvsp[-1].TypeVec)[i]->getNewTy();
+ std::vector<const Type*> Params;
+ for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-1].TypeList)->begin(),
+ E = (yyvsp[-1].TypeList)->end(); I != E; ++I) {
+ Params.push_back(I->T->get());
+ delete I->T;
}
- newTy += ")";
- yyval.Ty = Type::get(newTy, yyvsp[-3].Ty, yyvsp[-1].TypeVec);
- }
+ bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
+ if (isVarArg) Params.pop_back();
+
+ (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(
+ FunctionType::get((yyvsp[-3].TypeVal).T->get(),Params,isVarArg)));
+ (yyval.TypeVal).S = (yyvsp[-3].TypeVal).S;
+ delete (yyvsp[-3].TypeVal).T; // Delete the return type handle
+ delete (yyvsp[-1].TypeList); // Delete the argument list
+ ;}
break;
case 132:
-#line 1168 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1850 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Sized array type?
- uint64_t elems = atoi(yyvsp[-3].String->c_str());
- yyvsp[-3].String->insert(0,"[ ");
- *yyvsp[-3].String += " x " + yyvsp[-1].Ty->getNewTy() + " ]";
- yyval.Ty = Type::get(*yyvsp[-3].String, ArrayTy, yyvsp[-1].Ty, elems);
- }
+ (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(ArrayType::get((yyvsp[-1].TypeVal).T->get(),
+ (unsigned)(yyvsp[-3].UInt64Val))));
+ (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 133:
-#line 1174 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1856 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Packed array type?
- uint64_t elems = atoi(yyvsp[-3].String->c_str());
- yyvsp[-3].String->insert(0,"< ");
- *yyvsp[-3].String += " x " + yyvsp[-1].Ty->getNewTy() + " >";
- yyval.Ty = Type::get(*yyvsp[-3].String, PackedTy, yyvsp[-1].Ty, elems);
- }
+ const llvm::Type* ElemTy = (yyvsp[-1].TypeVal).T->get();
+ if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val))
+ error("Unsigned result not equal to signed result");
+ if (!(ElemTy->isInteger() || ElemTy->isFloatingPoint()))
+ error("Elements of a PackedType must be integer or floating point");
+ if (!isPowerOf2_32((yyvsp[-3].UInt64Val)))
+ error("PackedType length should be a power of 2");
+ (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(PackedType::get(ElemTy,
+ (unsigned)(yyvsp[-3].UInt64Val))));
+ (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 134:
-#line 1180 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1869 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Structure type?
- std::string newTy("{");
- for (unsigned i = 0; i < yyvsp[-1].TypeVec->size(); ++i) {
- if (i != 0)
- newTy += ", ";
- newTy += (*yyvsp[-1].TypeVec)[i]->getNewTy();
- }
- newTy += "}";
- yyval.Ty = Type::get(newTy, StructTy, yyvsp[-1].TypeVec);
- }
+ std::vector<const Type*> Elements;
+ for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-1].TypeList)->begin(),
+ E = (yyvsp[-1].TypeList)->end(); I != E; ++I)
+ Elements.push_back(I->T->get());
+ (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
+ (yyval.TypeVal).S = Signless;
+ delete (yyvsp[-1].TypeList);
+ ;}
break;
case 135:
-#line 1190 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1878 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Empty structure type?
- yyval.Ty = Type::get("{}", StructTy, new TypeList());
- }
+ (yyval.TypeVal).T = new PATypeHolder(StructType::get(std::vector<const Type*>()));
+ (yyval.TypeVal).S = Signless;
+ ;}
break;
case 136:
-#line 1193 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1882 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Packed Structure type?
- std::string newTy("<{");
- for (unsigned i = 0; i < yyvsp[-2].TypeVec->size(); ++i) {
- if (i != 0)
- newTy += ", ";
- newTy += (*yyvsp[-2].TypeVec)[i]->getNewTy();
+ std::vector<const Type*> Elements;
+ for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-2].TypeList)->begin(),
+ E = (yyvsp[-2].TypeList)->end(); I != E; ++I) {
+ Elements.push_back(I->T->get());
+ delete I->T;
}
- newTy += "}>";
- yyval.Ty = Type::get(newTy, PackedStructTy, yyvsp[-2].TypeVec);
- }
+ (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
+ (yyval.TypeVal).S = Signless;
+ delete (yyvsp[-2].TypeList);
+ ;}
break;
case 137:
-#line 1203 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1893 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Empty packed structure type?
- yyval.Ty = Type::get("<{}>", PackedStructTy, new TypeList());
- }
+ (yyval.TypeVal).T = new PATypeHolder(StructType::get(std::vector<const Type*>(),true));
+ (yyval.TypeVal).S = Signless;
+ ;}
break;
case 138:
-#line 1206 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1897 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Pointer type?
- yyval.Ty = yyvsp[-1].Ty->getPointerType();
- }
+ if ((yyvsp[-1].TypeVal).T->get() == Type::LabelTy)
+ error("Cannot form a pointer to a basic block");
+ (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(PointerType::get((yyvsp[-1].TypeVal).T->get())));
+ (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 139:
-#line 1214 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1910 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.TypeVec = new TypeList();
- yyval.TypeVec->push_back(yyvsp[0].Ty);
- }
+ (yyval.TypeList) = new std::list<PATypeInfo>();
+ (yyval.TypeList)->push_back((yyvsp[0].TypeVal));
+ ;}
break;
case 140:
-#line 1218 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1914 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.TypeVec = yyvsp[-2].TypeVec;
- yyval.TypeVec->push_back(yyvsp[0].Ty);
- }
+ ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back((yyvsp[0].TypeVal));
+ ;}
break;
case 142:
-#line 1226 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1922 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.TypeVec = yyvsp[-2].TypeVec;
- yyval.TypeVec->push_back(Type::get("void",VoidTy));
- delete yyvsp[0].String;
- }
+ PATypeInfo VoidTI;
+ VoidTI.T = new PATypeHolder(Type::VoidTy);
+ VoidTI.S = Signless;
+ ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(VoidTI);
+ ;}
break;
case 143:
-#line 1231 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1928 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.TypeVec = new TypeList();
- yyval.TypeVec->push_back(Type::get("void",VoidTy));
- delete yyvsp[0].String;
- }
+ (yyval.TypeList) = new std::list<PATypeInfo>();
+ PATypeInfo VoidTI;
+ VoidTI.T = new PATypeHolder(Type::VoidTy);
+ VoidTI.S = Signless;
+ (yyval.TypeList)->push_back(VoidTI);
+ ;}
break;
case 144:
-#line 1236 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1935 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.TypeVec = new TypeList();
- }
+ (yyval.TypeList) = new std::list<PATypeInfo>();
+ ;}
break;
case 145:
-#line 1246 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1947 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Nonempty unsized arr
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-3].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-3].Ty->getNewTy());
- *yyval.Const->cnst += " [ " + *yyvsp[-1].String + " ]";
- delete yyvsp[-1].String;
- }
+ const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-3].TypeVal).T->get());
+ if (ATy == 0)
+ error("Cannot make array constant with type: '" +
+ (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
+ const Type *ETy = ATy->getElementType();
+ int NumElements = ATy->getNumElements();
+
+ // Verify that we have the correct size...
+ if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size())
+ error("Type mismatch: constant sized array initialized with " +
+ utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " +
+ itostr(NumElements) + "");
+
+ // Verify all elements are correct type!
+ std::vector<Constant*> Elems;
+ for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
+ Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+ const Type* ValTy = C->getType();
+ if (ETy != ValTy)
+ error("Element #" + utostr(i) + " is not of type '" +
+ ETy->getDescription() +"' as required!\nIt is of type '"+
+ ValTy->getDescription() + "'");
+ Elems.push_back(C);
+ }
+ (yyval.ConstVal).C = ConstantArray::get(ATy, Elems);
+ (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
+ delete (yyvsp[-3].TypeVal).T;
+ delete (yyvsp[-1].ConstVector);
+ ;}
break;
case 146:
-#line 1253 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1977 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-2].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-2].Ty->getNewTy());
- *yyval.Const->cnst += "[ ]";
- }
+ const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal).T->get());
+ if (ATy == 0)
+ error("Cannot make array constant with type: '" +
+ (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+ int NumElements = ATy->getNumElements();
+ if (NumElements != -1 && NumElements != 0)
+ error("Type mismatch: constant sized array initialized with 0"
+ " arguments, but has size of " + itostr(NumElements) +"");
+ (yyval.ConstVal).C = ConstantArray::get(ATy, std::vector<Constant*>());
+ (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
+ delete (yyvsp[-2].TypeVal).T;
+ ;}
break;
case 147:
-#line 1259 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 1990 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-2].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-2].Ty->getNewTy());
- *yyval.Const->cnst += " c" + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+ const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal).T->get());
+ if (ATy == 0)
+ error("Cannot make array constant with type: '" +
+ (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+ int NumElements = ATy->getNumElements();
+ const Type *ETy = dyn_cast<IntegerType>(ATy->getElementType());
+ if (!ETy || cast<IntegerType>(ETy)->getBitWidth() != 8)
+ error("String arrays require type i8, not '" + ETy->getDescription() +
+ "'");
+ char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
+ if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal)))
+ error("Can't build string constant of size " +
+ itostr((int)(EndStr-(yyvsp[0].StrVal))) + " when array has size " +
+ itostr(NumElements) + "");
+ std::vector<Constant*> Vals;
+ for (char *C = (char *)(yyvsp[0].StrVal); C != (char *)EndStr; ++C)
+ Vals.push_back(ConstantInt::get(ETy, *C));
+ free((yyvsp[0].StrVal));
+ (yyval.ConstVal).C = ConstantArray::get(ATy, Vals);
+ (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
+ delete (yyvsp[-2].TypeVal).T;
+ ;}
break;
case 148:
-#line 1266 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2013 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Nonempty unsized arr
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-3].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-3].Ty->getNewTy());
- *yyval.Const->cnst += " < " + *yyvsp[-1].String + " >";
- delete yyvsp[-1].String;
- }
+ const PackedType *PTy = dyn_cast<PackedType>((yyvsp[-3].TypeVal).T->get());
+ if (PTy == 0)
+ error("Cannot make packed constant with type: '" +
+ (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
+ const Type *ETy = PTy->getElementType();
+ int NumElements = PTy->getNumElements();
+ // Verify that we have the correct size...
+ if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size())
+ error("Type mismatch: constant sized packed initialized with " +
+ utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " +
+ itostr(NumElements) + "");
+ // Verify all elements are correct type!
+ std::vector<Constant*> Elems;
+ for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
+ Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+ const Type* ValTy = C->getType();
+ if (ETy != ValTy)
+ error("Element #" + utostr(i) + " is not of type '" +
+ ETy->getDescription() +"' as required!\nIt is of type '"+
+ ValTy->getDescription() + "'");
+ Elems.push_back(C);
+ }
+ (yyval.ConstVal).C = ConstantPacked::get(PTy, Elems);
+ (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
+ delete (yyvsp[-3].TypeVal).T;
+ delete (yyvsp[-1].ConstVector);
+ ;}
break;
case 149:
-#line 1273 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2041 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-3].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-3].Ty->getNewTy());
- *yyval.Const->cnst += " { " + *yyvsp[-1].String + " }";
- delete yyvsp[-1].String;
- }
+ const StructType *STy = dyn_cast<StructType>((yyvsp[-3].TypeVal).T->get());
+ if (STy == 0)
+ error("Cannot make struct constant with type: '" +
+ (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
+ if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes())
+ error("Illegal number of initializers for structure type");
+
+ // Check to ensure that constants are compatible with the type initializer!
+ std::vector<Constant*> Fields;
+ for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i) {
+ Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+ if (C->getType() != STy->getElementType(i))
+ error("Expected type '" + STy->getElementType(i)->getDescription() +
+ "' for element #" + utostr(i) + " of structure initializer");
+ Fields.push_back(C);
+ }
+ (yyval.ConstVal).C = ConstantStruct::get(STy, Fields);
+ (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
+ delete (yyvsp[-3].TypeVal).T;
+ delete (yyvsp[-1].ConstVector);
+ ;}
break;
case 150:
-#line 1280 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2063 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-2].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-2].Ty->getNewTy());
- *yyval.Const->cnst += " {}";
- }
+ const StructType *STy = dyn_cast<StructType>((yyvsp[-2].TypeVal).T->get());
+ if (STy == 0)
+ error("Cannot make struct constant with type: '" +
+ (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+ if (STy->getNumContainedTypes() != 0)
+ error("Illegal number of initializers for structure type");
+ (yyval.ConstVal).C = ConstantStruct::get(STy, std::vector<Constant*>());
+ (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
+ delete (yyvsp[-2].TypeVal).T;
+ ;}
break;
case 151:
-#line 1286 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2074 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+ const StructType *STy = dyn_cast<StructType>((yyvsp[-5].TypeVal).T->get());
+ if (STy == 0)
+ error("Cannot make packed struct constant with type: '" +
+ (yyvsp[-5].TypeVal).T->get()->getDescription() + "'");
+ if ((yyvsp[-2].ConstVector)->size() != STy->getNumContainedTypes())
+ error("Illegal number of initializers for packed structure type");
+
+ // Check to ensure that constants are compatible with the type initializer!
+ std::vector<Constant*> Fields;
+ for (unsigned i = 0, e = (yyvsp[-2].ConstVector)->size(); i != e; ++i) {
+ Constant *C = (*(yyvsp[-2].ConstVector))[i].C;
+ if (C->getType() != STy->getElementType(i))
+ error("Expected type '" + STy->getElementType(i)->getDescription() +
+ "' for element #" + utostr(i) + " of packed struct initializer");
+ Fields.push_back(C);
+ }
+ (yyval.ConstVal).C = ConstantStruct::get(STy, Fields);
+ (yyval.ConstVal).S = (yyvsp[-5].TypeVal).S;
+ delete (yyvsp[-5].TypeVal).T;
+ delete (yyvsp[-2].ConstVector);
+ ;}
break;
case 152:
-#line 1293 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2096 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+ const StructType *STy = dyn_cast<StructType>((yyvsp[-4].TypeVal).T->get());
+ if (STy == 0)
+ error("Cannot make packed struct constant with type: '" +
+ (yyvsp[-4].TypeVal).T->get()->getDescription() + "'");
+ if (STy->getNumContainedTypes() != 0)
+ error("Illegal number of initializers for packed structure type");
+ (yyval.ConstVal).C = ConstantStruct::get(STy, std::vector<Constant*>());
+ (yyval.ConstVal).S = (yyvsp[-4].TypeVal).S;
+ delete (yyvsp[-4].TypeVal).T;
+ ;}
break;
case 153:
-#line 1300 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2107 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- std::string Name = getUniqueName(yyvsp[0].String, yyvsp[-1].Ty->resolve(), true);
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + Name;
- delete yyvsp[0].String;
- }
+ const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+ if (PTy == 0)
+ error("Cannot make null pointer constant with type: '" +
+ (yyvsp[-1].TypeVal).T->get()->getDescription() + "'");
+ (yyval.ConstVal).C = ConstantPointerNull::get(PTy);
+ (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 154:
-#line 1308 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2116 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+ (yyval.ConstVal).C = UndefValue::get((yyvsp[-1].TypeVal).T->get());
+ (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 155:
-#line 1315 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2121 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+ const PointerType *Ty = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+ if (Ty == 0)
+ error("Global const reference must be a pointer type, not" +
+ (yyvsp[-1].TypeVal).T->get()->getDescription());
+
+ // ConstExprs can exist in the body of a function, thus creating
+ // GlobalValues whenever they refer to a variable. Because we are in
+ // the context of a function, getExistingValue will search the functions
+ // symbol table instead of the module symbol table for the global symbol,
+ // which throws things all off. To get around this, we just tell
+ // getExistingValue that we are at global scope here.
+ //
+ Function *SavedCurFn = CurFun.CurrentFunction;
+ CurFun.CurrentFunction = 0;
+ Value *V = getExistingValue(Ty, (yyvsp[0].ValIDVal));
+ CurFun.CurrentFunction = SavedCurFn;
+
+ // If this is an initializer for a constant pointer, which is referencing a
+ // (currently) undefined variable, create a stub now that shall be replaced
+ // in the future with the right type of variable.
+ //
+ if (V == 0) {
+ assert(isa<PointerType>(Ty) && "Globals may only be used as pointers");
+ const PointerType *PT = cast<PointerType>(Ty);
+
+ // First check to see if the forward references value is already created!
+ PerModuleInfo::GlobalRefsType::iterator I =
+ CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[0].ValIDVal)));
+
+ if (I != CurModule.GlobalRefs.end()) {
+ V = I->second; // Placeholder already exists, use it...
+ (yyvsp[0].ValIDVal).destroy();
+ } else {
+ std::string Name;
+ if ((yyvsp[0].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[0].ValIDVal).Name;
+
+ // Create the forward referenced global.
+ GlobalValue *GV;
+ if (const FunctionType *FTy =
+ dyn_cast<FunctionType>(PT->getElementType())) {
+ GV = new Function(FTy, GlobalValue::ExternalLinkage, Name,
+ CurModule.CurrentModule);
+ } else {
+ GV = new GlobalVariable(PT->getElementType(), false,
+ GlobalValue::ExternalLinkage, 0,
+ Name, CurModule.CurrentModule);
+ }
+
+ // Keep track of the fact that we have a forward ref to recycle it
+ CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[0].ValIDVal)), GV));
+ V = GV;
+ }
+ }
+ (yyval.ConstVal).C = cast<GlobalValue>(V);
+ (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+ delete (yyvsp[-1].TypeVal).T; // Free the type handle
+ ;}
break;
case 156:
-#line 1322 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // integral constants
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+#line 2179 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if ((yyvsp[-1].TypeVal).T->get() != (yyvsp[0].ConstVal).C->getType())
+ error("Mismatched types for constant expression");
+ (yyval.ConstVal) = (yyvsp[0].ConstVal);
+ (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 157:
-#line 1329 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // integral constants
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+#line 2186 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+ if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
+ error("Cannot create a null initialized value of this type");
+ (yyval.ConstVal).C = Constant::getNullValue(Ty);
+ (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 158:
-#line 1336 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // Boolean constants
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+#line 2194 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // integral constants
+ const Type *Ty = (yyvsp[-1].PrimType).T;
+ if (!ConstantInt::isValueValidForType(Ty, (yyvsp[0].SInt64Val)))
+ error("Constant value doesn't fit in type");
+ (yyval.ConstVal).C = ConstantInt::get(Ty, (yyvsp[0].SInt64Val));
+ (yyval.ConstVal).S = Signed;
+ ;}
break;
case 159:
-#line 1343 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // Boolean constants
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+#line 2201 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // integral constants
+ const Type *Ty = (yyvsp[-1].PrimType).T;
+ if (!ConstantInt::isValueValidForType(Ty, (yyvsp[0].UInt64Val)))
+ error("Constant value doesn't fit in type");
+ (yyval.ConstVal).C = ConstantInt::get(Ty, (yyvsp[0].UInt64Val));
+ (yyval.ConstVal).S = Unsigned;
+ ;}
break;
case 160:
-#line 1350 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // Float & Double constants
- yyval.Const = new Constant;
- yyval.Const->type = yyvsp[-1].Ty;
- yyval.Const->cnst = new std::string(yyvsp[-1].Ty->getNewTy());
- *yyval.Const->cnst += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+#line 2208 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Boolean constants
+ (yyval.ConstVal).C = ConstantInt::get(Type::Int1Ty, true);
+ (yyval.ConstVal).S = Unsigned;
+ ;}
break;
case 161:
-#line 1358 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- std::string source = *yyvsp[-3].Const->cnst;
- const Type* SrcTy = yyvsp[-3].Const->type->resolve();
- const Type* DstTy = yyvsp[-1].Ty->resolve();
- if (*yyvsp[-5].String == "cast") {
- // Call getCastUpgrade to upgrade the old cast
- yyval.String = new std::string(getCastUpgrade(source, SrcTy, DstTy, true));
- } else {
- // Nothing to upgrade, just create the cast constant expr
- yyval.String = new std::string(*yyvsp[-5].String);
- *yyval.String += "( " + source + " to " + yyvsp[-1].Ty->getNewTy() + ")";
- }
- delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-2].String;
- }
+#line 2212 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Boolean constants
+ (yyval.ConstVal).C = ConstantInt::get(Type::Int1Ty, false);
+ (yyval.ConstVal).S = Unsigned;
+ ;}
break;
case 162:
-#line 1372 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *yyvsp[-4].String += "(" + *yyvsp[-2].Const->cnst;
- for (unsigned i = 0; i < yyvsp[-1].ValList->size(); ++i) {
- Value* V = (*yyvsp[-1].ValList)[i];
- *yyvsp[-4].String += ", " + *V->val;
- delete V;
- }
- *yyvsp[-4].String += ")";
- yyval.String = yyvsp[-4].String;
- delete yyvsp[-2].Const;
- delete yyvsp[-1].ValList;
- }
+#line 2216 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Float & Double constants
+ if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType).T, (yyvsp[0].FPVal)))
+ error("Floating point constant invalid for type");
+ (yyval.ConstVal).C = ConstantFP::get((yyvsp[-1].PrimType).T, (yyvsp[0].FPVal));
+ (yyval.ConstVal).S = Signless;
+ ;}
break;
case 163:
-#line 1384 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2225 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-7].String += "(" + *yyvsp[-5].Const->cnst + "," + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-5].Const; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- yyval.String = yyvsp[-7].String;
- }
+ const Type* SrcTy = (yyvsp[-3].ConstVal).C->getType();
+ const Type* DstTy = (yyvsp[-1].TypeVal).T->get();
+ Signedness SrcSign = (yyvsp[-3].ConstVal).S;
+ Signedness DstSign = (yyvsp[-1].TypeVal).S;
+ if (!SrcTy->isFirstClassType())
+ error("cast constant expression from a non-primitive type: '" +
+ SrcTy->getDescription() + "'");
+ if (!DstTy->isFirstClassType())
+ error("cast constant expression to a non-primitive type: '" +
+ DstTy->getDescription() + "'");
+ (yyval.ConstVal).C = cast<Constant>(getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal).C, SrcSign, DstTy, DstSign));
+ (yyval.ConstVal).S = DstSign;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 164:
-#line 1389 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2240 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- const char* op = getDivRemOpcode(*yyvsp[-5].String, yyvsp[-3].Const->type);
- yyval.String = new std::string(op);
- *yyval.String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- }
+ const Type *Ty = (yyvsp[-2].ConstVal).C->getType();
+ if (!isa<PointerType>(Ty))
+ error("GetElementPtr requires a pointer operand");
+
+ std::vector<Value*> VIndices;
+ std::vector<Constant*> CIndices;
+ upgradeGEPIndices((yyvsp[-2].ConstVal).C->getType(), (yyvsp[-1].ValueList), VIndices, &CIndices);
+
+ delete (yyvsp[-1].ValueList);
+ (yyval.ConstVal).C = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal).C, CIndices);
+ (yyval.ConstVal).S = Signless;
+ ;}
break;
case 165:
-#line 1395 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2253 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-5].String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- yyval.String = yyvsp[-5].String;
- }
+ if (!(yyvsp[-5].ConstVal).C->getType()->isInteger() ||
+ cast<IntegerType>((yyvsp[-5].ConstVal).C->getType())->getBitWidth() != 1)
+ error("Select condition must be bool type");
+ if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType())
+ error("Select operand types must match");
+ (yyval.ConstVal).C = ConstantExpr::getSelect((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = Unsigned;
+ ;}
break;
case 166:
-#line 1400 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2262 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-5].String = getCompareOp(*yyvsp[-5].String, yyvsp[-3].Const->type);
- *yyvsp[-5].String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- yyval.String = yyvsp[-5].String;
- }
+ const Type *Ty = (yyvsp[-3].ConstVal).C->getType();
+ if (Ty != (yyvsp[-1].ConstVal).C->getType())
+ error("Binary operator types must match");
+ // First, make sure we're dealing with the right opcode by upgrading from
+ // obsolete versions.
+ Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-5].BinaryOpVal), Ty, (yyvsp[-3].ConstVal).S);
+
+ // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs.
+ // To retain backward compatibility with these early compilers, we emit a
+ // cast to the appropriate integer type automatically if we are in the
+ // broken case. See PR424 for more information.
+ if (!isa<PointerType>(Ty)) {
+ (yyval.ConstVal).C = ConstantExpr::get(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ } else {
+ const Type *IntPtrTy = 0;
+ switch (CurModule.CurrentModule->getPointerSize()) {
+ case Module::Pointer32: IntPtrTy = Type::Int32Ty; break;
+ case Module::Pointer64: IntPtrTy = Type::Int64Ty; break;
+ default: error("invalid pointer binary constant expr");
+ }
+ (yyval.ConstVal).C = ConstantExpr::get(Opcode,
+ ConstantExpr::getCast(Instruction::PtrToInt, (yyvsp[-3].ConstVal).C, IntPtrTy),
+ ConstantExpr::getCast(Instruction::PtrToInt, (yyvsp[-1].ConstVal).C, IntPtrTy));
+ (yyval.ConstVal).C = ConstantExpr::getCast(Instruction::IntToPtr, (yyval.ConstVal).C, Ty);
+ }
+ (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+ ;}
break;
case 167:
-#line 1406 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2290 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-6].String += " " + *yyvsp[-5].String + " (" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- yyval.String = yyvsp[-6].String;
- }
+ const Type* Ty = (yyvsp[-3].ConstVal).C->getType();
+ if (Ty != (yyvsp[-1].ConstVal).C->getType())
+ error("Logical operator types must match");
+ if (!Ty->isInteger()) {
+ if (!isa<PackedType>(Ty) ||
+ !cast<PackedType>(Ty)->getElementType()->isInteger())
+ error("Logical operator requires integer operands");
+ }
+ Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-5].BinaryOpVal), Ty, (yyvsp[-3].ConstVal).S);
+ (yyval.ConstVal).C = ConstantExpr::get(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+ ;}
break;
case 168:
-#line 1411 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2303 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-6].String += " " + *yyvsp[-5].String + " (" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- yyval.String = yyvsp[-6].String;
- }
+ const Type* Ty = (yyvsp[-3].ConstVal).C->getType();
+ if (Ty != (yyvsp[-1].ConstVal).C->getType())
+ error("setcc operand types must match");
+ unsigned short pred;
+ Instruction::OtherOps Opcode = getCompareOp((yyvsp[-5].BinaryOpVal), pred, Ty, (yyvsp[-3].ConstVal).S);
+ (yyval.ConstVal).C = ConstantExpr::getCompare(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = Unsigned;
+ ;}
break;
case 169:
-#line 1416 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2312 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- const char* shiftop = yyvsp[-5].String->c_str();
- if (*yyvsp[-5].String == "shr")
- shiftop = (yyvsp[-3].Const->type->isUnsigned()) ? "lshr" : "ashr";
- yyval.String = new std::string(shiftop);
- *yyval.String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-5].String; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- }
+ if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType())
+ error("icmp operand types must match");
+ (yyval.ConstVal).C = ConstantExpr::getCompare((yyvsp[-5].IPred), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = Unsigned;
+ ;}
break;
case 170:
-#line 1424 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2318 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-5].String += "(" + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- yyval.String = yyvsp[-5].String;
- }
+ if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType())
+ error("fcmp operand types must match");
+ (yyval.ConstVal).C = ConstantExpr::getCompare((yyvsp[-5].FPred), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = Unsigned;
+ ;}
break;
case 171:
-#line 1429 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2324 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-7].String += "(" + *yyvsp[-5].Const->cnst + "," + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-5].Const; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- yyval.String = yyvsp[-7].String;
- }
+ if (!(yyvsp[-1].ConstVal).C->getType()->isInteger() ||
+ cast<IntegerType>((yyvsp[-1].ConstVal).C->getType())->getBitWidth() != 8)
+ error("Shift count for shift constant must be unsigned byte");
+ if (!(yyvsp[-3].ConstVal).C->getType()->isInteger())
+ error("Shift constant expression requires integer operand");
+ (yyval.ConstVal).C = ConstantExpr::get(getOtherOp((yyvsp[-5].OtherOpVal), (yyvsp[-3].ConstVal).S), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+ ;}
break;
case 172:
-#line 1434 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2333 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-7].String += "(" + *yyvsp[-5].Const->cnst + "," + *yyvsp[-3].Const->cnst + "," + *yyvsp[-1].Const->cnst + ")";
- delete yyvsp[-5].Const; delete yyvsp[-3].Const; delete yyvsp[-1].Const;
- yyval.String = yyvsp[-7].String;
- }
+ if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+ error("Invalid extractelement operands");
+ (yyval.ConstVal).C = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+ ;}
break;
case 173:
-#line 1444 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2339 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-2].String += ", " + *yyvsp[0].Const->cnst;
- delete yyvsp[0].Const;
- yyval.String = yyvsp[-2].String;
- }
+ if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+ error("Invalid insertelement operands");
+ (yyval.ConstVal).C = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = (yyvsp[-5].ConstVal).S;
+ ;}
break;
case 174:
-#line 1449 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(*yyvsp[0].Const->cnst); delete yyvsp[0].Const; }
+#line 2345 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+ error("Invalid shufflevector operands");
+ (yyval.ConstVal).C = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+ (yyval.ConstVal).S = (yyvsp[-5].ConstVal).S;
+ ;}
break;
- case 177:
-#line 1464 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+ case 175:
+#line 2356 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); ;}
+ break;
+
+ case 176:
+#line 2357 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
-}
+ (yyval.ConstVector) = new std::vector<ConstInfo>();
+ (yyval.ConstVector)->push_back((yyvsp[0].ConstVal));
+ ;}
+ break;
+
+ case 177:
+#line 2366 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.BoolVal) = false; ;}
break;
case 178:
-#line 1469 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyval.String = 0;
- }
+#line 2367 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.BoolVal) = true; ;}
break;
case 179:
-#line 1472 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2379 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *O << *yyvsp[0].String << '\n';
- delete yyvsp[0].String;
- yyval.String = 0;
- }
+ (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal);
+ CurModule.ModuleDone();
+ ;}
break;
case 180:
-#line 1477 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *O << "module asm " << ' ' << *yyvsp[0].String << '\n';
- yyval.String = 0;
- }
+#line 2388 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CurFun.FunctionDone(); ;}
break;
case 181:
-#line 1481 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *O << "implementation\n";
- yyval.String = 0;
- }
+#line 2389 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); ;}
break;
case 182:
-#line 1485 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = 0; }
+#line 2390 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ModuleVal) = (yyvsp[-3].ModuleVal); ;}
+ break;
+
+ case 183:
+#line 2391 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); ;}
break;
case 184:
-#line 1488 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = yyvsp[0].String; *yyval.String = "external"; }
+#line 2392 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.ModuleVal) = CurModule.CurrentModule;
+ // Emit an error if there are any unresolved types left.
+ if (!CurModule.LateResolveTypes.empty()) {
+ const ValID &DID = CurModule.LateResolveTypes.begin()->first;
+ if (DID.Type == ValID::NameVal) {
+ error("Reference to an undefined type: '"+DID.getName() + "'");
+ } else {
+ error("Reference to an undefined type: #" + itostr(DID.Num));
+ }
+ }
+ ;}
break;
case 185:
-#line 1491 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2408 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- Type::EnumeratedTypes.push_back(yyvsp[0].Ty);
- if (!yyvsp[-2].String->empty()) {
- Type::NamedTypes[*yyvsp[-2].String] = yyvsp[0].Ty;
- *O << *yyvsp[-2].String << " = ";
+ // Eagerly resolve types. This is not an optimization, this is a
+ // requirement that is due to the fact that we could have this:
+ //
+ // %list = type { %list * }
+ // %list = type { %list * } ; repeated type decl
+ //
+ // If types are not resolved eagerly, then the two types will not be
+ // determined to be the same type!
+ //
+ const Type* Ty = (yyvsp[0].TypeVal).T->get();
+ ResolveTypeTo((yyvsp[-2].StrVal), Ty);
+
+ if (!setTypeName(Ty, (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) {
+ // If this is a named type that is not a redefinition, add it to the slot
+ // table.
+ CurModule.Types.push_back(Ty);
}
- *O << "type " << yyvsp[0].Ty->getNewTy() << '\n';
- delete yyvsp[-2].String; delete yyvsp[-1].String;
- yyval.String = 0;
- }
+ delete (yyvsp[0].TypeVal).T;
+ ;}
break;
case 186:
-#line 1501 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2428 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Function prototypes can be in const pool
- *O << *yyvsp[0].String << '\n';
- delete yyvsp[0].String;
- yyval.String = 0;
- }
+ ;}
break;
case 187:
-#line 1506 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2430 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{ // Asm blocks can be in the const pool
- *O << *yyvsp[-2].String << ' ' << *yyvsp[-1].String << ' ' << *yyvsp[0].String << '\n';
- delete yyvsp[-2].String; delete yyvsp[-1].String; delete yyvsp[0].String;
- yyval.String = 0;
- }
+ ;}
break;
case 188:
-#line 1511 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2432 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- if (!yyvsp[-4].String->empty()) {
- std::string Name = getGlobalName(yyvsp[-4].String,*yyvsp[-3].String, yyvsp[-1].Const->type->getPointerType(),
- *yyvsp[-2].String == "constant");
- *O << Name << " = ";
- }
- *O << *yyvsp[-3].String << ' ' << *yyvsp[-2].String << ' ' << *yyvsp[-1].Const->cnst << ' ' << *yyvsp[0].String << '\n';
- delete yyvsp[-4].String; delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
- yyval.String = 0;
- }
+ if ((yyvsp[0].ConstVal).C == 0)
+ error("Global value initializer is not a constant");
+ CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), (yyvsp[-2].Linkage), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal).C->getType(), (yyvsp[0].ConstVal).C);
+ ;}
break;
case 189:
-#line 1521 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2436 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- if (!yyvsp[-4].String->empty()) {
- std::string Name = getGlobalName(yyvsp[-4].String,*yyvsp[-3].String,yyvsp[-1].Ty->getPointerType(),
- *yyvsp[-2].String == "constant");
- *O << Name << " = ";
- }
- *O << *yyvsp[-3].String << ' ' << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].String << '\n';
- delete yyvsp[-4].String; delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
- yyval.String = 0;
- }
+ CurGV = 0;
+ ;}
break;
case 190:
-#line 1531 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2439 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- if (!yyvsp[-4].String->empty()) {
- std::string Name = getGlobalName(yyvsp[-4].String,*yyvsp[-3].String,yyvsp[-1].Ty->getPointerType(),
- *yyvsp[-2].String == "constant");
- *O << Name << " = ";
- }
- *O << *yyvsp[-3].String << ' ' << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].String << '\n';
- delete yyvsp[-4].String; delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
- yyval.String = 0;
- }
+ const Type *Ty = (yyvsp[0].TypeVal).T->get();
+ CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal), Ty, 0);
+ delete (yyvsp[0].TypeVal).T;
+ ;}
break;
case 191:
-#line 1541 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2443 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- if (!yyvsp[-4].String->empty()) {
- std::string Name = getGlobalName(yyvsp[-4].String,*yyvsp[-3].String,yyvsp[-1].Ty->getPointerType(),
- *yyvsp[-2].String == "constant");
- *O << Name << " = ";
- }
- *O << *yyvsp[-3].String << ' ' << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].String << '\n';
- delete yyvsp[-4].String; delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
- yyval.String = 0;
- }
+ CurGV = 0;
+ ;}
break;
case 192:
-#line 1551 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *O << *yyvsp[-1].String << ' ' << *yyvsp[0].String << '\n';
- delete yyvsp[-1].String; delete yyvsp[0].String;
- yyval.String = 0;
- }
+#line 2446 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type *Ty = (yyvsp[0].TypeVal).T->get();
+ CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal), Ty, 0);
+ delete (yyvsp[0].TypeVal).T;
+ ;}
break;
case 193:
-#line 1556 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2450 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *O << *yyvsp[-2].String << " = " << *yyvsp[0].String << '\n';
- delete yyvsp[-2].String; delete yyvsp[0].String;
- yyval.String = 0;
- }
+ CurGV = 0;
+ ;}
break;
case 194:
-#line 1561 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2453 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type *Ty = (yyvsp[0].TypeVal).T->get();
+ CurGV =
+ ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[-1].BoolVal), Ty, 0);
+ delete (yyvsp[0].TypeVal).T;
+ ;}
+ break;
+
+ case 195:
+#line 2458 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ CurGV = 0;
+ ;}
+ break;
+
+ case 196:
+#line 2461 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.String = 0;
- }
+ ;}
break;
- case 198:
-#line 1571 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+ case 197:
+#line 2463 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-2].String += " = " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-2].String;
- }
+ ;}
+ break;
+
+ case 198:
+#line 2465 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ ;}
break;
case 199:
-#line 1576 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2470 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-2].String += " = " + *yyvsp[0].String;
- if (*yyvsp[0].String == "64")
- SizeOfPointer = 64;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-2].String;
- }
+ const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
+ char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
+ std::string NewAsm((yyvsp[0].StrVal), EndStr);
+ free((yyvsp[0].StrVal));
+
+ if (AsmSoFar.empty())
+ CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
+ else
+ CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
+ ;}
break;
case 200:
-#line 1583 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *yyvsp[-2].String += " = " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-2].String;
- }
+#line 2484 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Endianness) = Module::BigEndian; ;}
break;
case 201:
-#line 1588 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *yyvsp[-2].String += " = " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-2].String;
- }
+#line 2485 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.Endianness) = Module::LittleEndian; ;}
break;
case 202:
-#line 1595 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2489 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyvsp[-1].String->insert(0, "[ ");
- *yyvsp[-1].String += " ]";
- yyval.String = yyvsp[-1].String;
- }
+ CurModule.setEndianness((yyvsp[0].Endianness));
+ ;}
break;
case 203:
-#line 1602 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2492 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-2].String += ", " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-2].String;
- }
+ if ((yyvsp[0].UInt64Val) == 32)
+ CurModule.setPointerSize(Module::Pointer32);
+ else if ((yyvsp[0].UInt64Val) == 64)
+ CurModule.setPointerSize(Module::Pointer64);
+ else
+ error("Invalid pointer size: '" + utostr((yyvsp[0].UInt64Val)) + "'");
+ ;}
break;
- case 205:
-#line 1608 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+ case 204:
+#line 2500 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.String = new std::string();
- }
+ CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal));
+ free((yyvsp[0].StrVal));
+ ;}
break;
- case 209:
-#line 1617 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+ case 205:
+#line 2504 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal));
+ free((yyvsp[0].StrVal));
+ ;}
break;
- case 210:
-#line 1619 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+ case 207:
+#line 2515 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.String = new std::string(yyvsp[-1].Ty->getNewTy());
- if (!yyvsp[0].String->empty()) {
- std::string Name = getUniqueName(yyvsp[0].String, yyvsp[-1].Ty->resolve());
- *yyval.String += " " + Name;
- }
- delete yyvsp[0].String;
-}
+ CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
+ free((yyvsp[0].StrVal));
+ ;}
break;
- case 211:
-#line 1628 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+ case 208:
+#line 2519 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-2].String += ", " + *yyvsp[0].String;
- delete yyvsp[0].String;
- }
+ CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
+ free((yyvsp[0].StrVal));
+ ;}
break;
- case 212:
-#line 1632 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyval.String = yyvsp[0].String;
- }
+ case 209:
+#line 2523 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { ;}
break;
case 213:
-#line 1636 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyval.String = yyvsp[0].String;
- }
+#line 2536 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.StrVal) = 0; ;}
break;
case 214:
-#line 1639 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2540 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-2].String += ", ...";
- yyval.String = yyvsp[-2].String;
- delete yyvsp[0].String;
- }
+ if ((yyvsp[-1].TypeVal).T->get() == Type::VoidTy)
+ error("void typed arguments are invalid");
+ (yyval.ArgVal) = new std::pair<PATypeInfo, char*>((yyvsp[-1].TypeVal), (yyvsp[0].StrVal));
+ ;}
break;
case 215:
-#line 1644 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2548 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.String = yyvsp[0].String;
- }
+ (yyval.ArgList) = (yyvsp[-2].ArgList);
+ (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal));
+ delete (yyvsp[0].ArgVal);
+ ;}
break;
case 216:
-#line 1647 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+#line 2553 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.ArgList) = new std::vector<std::pair<PATypeInfo,char*> >();
+ (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal));
+ delete (yyvsp[0].ArgVal);
+ ;}
break;
case 217:
-#line 1650 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- if (*yyvsp[-5].String == "%llvm.va_start" || *yyvsp[-5].String == "%llvm.va_end") {
- *yyvsp[-3].String = "i8*";
- } else if (*yyvsp[-5].String == "%llvm.va_copy") {
- *yyvsp[-3].String = "i8*, i8*";
- }
- if (!yyvsp[-7].String->empty()) {
- *yyvsp[-7].String += " ";
- }
- *yyvsp[-7].String += yyvsp[-6].Ty->getNewTy() + " " + *yyvsp[-5].String + "(" + *yyvsp[-3].String + ")";
- if (!yyvsp[-1].String->empty()) {
- *yyvsp[-7].String += " " + *yyvsp[-1].String;
- }
- if (!yyvsp[0].String->empty()) {
- *yyvsp[-7].String += " " + *yyvsp[0].String;
- }
- delete yyvsp[-5].String;
- delete yyvsp[-3].String;
- delete yyvsp[-1].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-7].String;
- }
+#line 2561 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ArgList) = (yyvsp[0].ArgList); ;}
break;
case 218:
-#line 1673 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string("{"); delete yyvsp[0].String; }
+#line 2562 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.ArgList) = (yyvsp[-2].ArgList);
+ PATypeInfo VoidTI;
+ VoidTI.T = new PATypeHolder(Type::VoidTy);
+ VoidTI.S = Signless;
+ (yyval.ArgList)->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
+ ;}
break;
case 219:
-#line 1674 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string ("{"); }
+#line 2569 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.ArgList) = new std::vector<std::pair<PATypeInfo,char*> >();
+ PATypeInfo VoidTI;
+ VoidTI.T = new PATypeHolder(Type::VoidTy);
+ VoidTI.S = Signless;
+ (yyval.ArgList)->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
+ ;}
break;
case 220:
-#line 1678 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2576 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ArgList) = 0; ;}
+ break;
+
+ case 221:
+#line 2580 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *O << "define ";
- if (!yyvsp[-2].String->empty()) {
- *O << *yyvsp[-2].String << ' ';
+ UnEscapeLexed((yyvsp[-5].StrVal));
+ std::string FunctionName((yyvsp[-5].StrVal));
+ free((yyvsp[-5].StrVal)); // Free strdup'd memory!
+
+ const Type* RetTy = (yyvsp[-6].TypeVal).T->get();
+
+ if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
+ error("LLVM functions cannot return aggregate types");
+
+ std::vector<const Type*> ParamTypeList;
+
+ // In LLVM 2.0 the signatures of three varargs intrinsics changed to take
+ // i8*. We check here for those names and override the parameter list
+ // types to ensure the prototype is correct.
+ if (FunctionName == "llvm.va_start" || FunctionName == "llvm.va_end") {
+ ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+ } else if (FunctionName == "llvm.va_copy") {
+ ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+ ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+ } else if ((yyvsp[-3].ArgList)) { // If there are arguments...
+ for (std::vector<std::pair<PATypeInfo,char*> >::iterator
+ I = (yyvsp[-3].ArgList)->begin(), E = (yyvsp[-3].ArgList)->end(); I != E; ++I) {
+ const Type *Ty = I->first.T->get();
+ ParamTypeList.push_back(Ty);
+ }
}
- *O << *yyvsp[-1].String << ' ' << *yyvsp[0].String << '\n';
- delete yyvsp[-2].String; delete yyvsp[-1].String; delete yyvsp[0].String;
- yyval.String = 0;
- }
+
+ bool isVarArg =
+ ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
+ if (isVarArg) ParamTypeList.pop_back();
+
+ const FunctionType *FT = FunctionType::get(RetTy, ParamTypeList, isVarArg);
+ const PointerType *PFT = PointerType::get(FT);
+ delete (yyvsp[-6].TypeVal).T;
+
+ ValID ID;
+ if (!FunctionName.empty()) {
+ ID = ValID::create((char*)FunctionName.c_str());
+ } else {
+ ID = ValID::create((int)CurModule.Values[PFT].size());
+ }
+
+ Function *Fn = 0;
+ // See if this function was forward referenced. If so, recycle the object.
+ if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
+ // Move the function to the end of the list, from whereever it was
+ // previously inserted.
+ Fn = cast<Function>(FWRef);
+ CurModule.CurrentModule->getFunctionList().remove(Fn);
+ CurModule.CurrentModule->getFunctionList().push_back(Fn);
+ } else if (!FunctionName.empty() && // Merge with an earlier prototype?
+ (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) {
+ // If this is the case, either we need to be a forward decl, or it needs
+ // to be.
+ if (!CurFun.isDeclare && !Fn->isExternal())
+ error("Redefinition of function '" + FunctionName + "'");
+
+ // Make sure to strip off any argument names so we can't get conflicts.
+ if (Fn->isExternal())
+ for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
+ AI != AE; ++AI)
+ AI->setName("");
+ } else { // Not already defined?
+ Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
+ CurModule.CurrentModule);
+
+ InsertValue(Fn, CurModule.Values);
+ }
+
+ CurFun.FunctionStart(Fn);
+
+ if (CurFun.isDeclare) {
+ // If we have declaration, always overwrite linkage. This will allow us
+ // to correctly handle cases, when pointer to function is passed as
+ // argument to another function.
+ Fn->setLinkage(CurFun.Linkage);
+ }
+ Fn->setCallingConv((yyvsp[-7].UIntVal));
+ Fn->setAlignment((yyvsp[0].UIntVal));
+ if ((yyvsp[-1].StrVal)) {
+ Fn->setSection((yyvsp[-1].StrVal));
+ free((yyvsp[-1].StrVal));
+ }
+
+ // Add all of the arguments we parsed to the function...
+ if ((yyvsp[-3].ArgList)) { // Is null if empty...
+ if (isVarArg) { // Nuke the last entry
+ assert((yyvsp[-3].ArgList)->back().first.T->get() == Type::VoidTy &&
+ (yyvsp[-3].ArgList)->back().second == 0 && "Not a varargs marker");
+ delete (yyvsp[-3].ArgList)->back().first.T;
+ (yyvsp[-3].ArgList)->pop_back(); // Delete the last entry
+ }
+ Function::arg_iterator ArgIt = Fn->arg_begin();
+ for (std::vector<std::pair<PATypeInfo,char*> >::iterator
+ I = (yyvsp[-3].ArgList)->begin(), E = (yyvsp[-3].ArgList)->end(); I != E; ++I, ++ArgIt) {
+ delete I->first.T; // Delete the typeholder...
+ setValueName(ArgIt, I->second); // Insert arg into symtab...
+ InsertValue(ArgIt);
+ }
+ delete (yyvsp[-3].ArgList); // We're now done with the argument list
+ }
+ ;}
break;
- case 221:
-#line 1689 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string("}"); delete yyvsp[0].String; }
+ case 224:
+#line 2690 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.FunctionVal) = CurFun.CurrentFunction;
+
+ // Make sure that we keep track of the linkage type even if there was a
+ // previous "declare".
+ (yyval.FunctionVal)->setLinkage((yyvsp[-2].Linkage));
+ ;}
break;
- case 222:
-#line 1690 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string("}"); }
+ case 227:
+#line 2704 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+ ;}
break;
- case 223:
-#line 1692 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+ case 229:
+#line 2710 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;}
+ break;
+
+ case 230:
+#line 2711 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; ;}
+ break;
+
+ case 231:
+#line 2715 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { CurFun.isDeclare = true; ;}
+ break;
+
+ case 232:
+#line 2715 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- if (yyvsp[-1].String)
- *O << *yyvsp[-1].String;
- *O << *yyvsp[0].String << "\n\n";
- delete yyvsp[-2].String; delete yyvsp[-1].String; delete yyvsp[0].String;
- yyval.String = 0;
-}
+ (yyval.FunctionVal) = CurFun.CurrentFunction;
+ CurFun.FunctionDone();
+
+ ;}
break;
- case 224:
-#line 1701 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+ case 233:
+#line 2727 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.BoolVal) = false; ;}
break;
- case 227:
-#line 1707 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { isDeclare = true; }
+ case 234:
+#line 2728 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.BoolVal) = true; ;}
break;
- case 228:
-#line 1707 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- if (!yyvsp[-1].String->empty())
- *yyvsp[-3].String += " " + *yyvsp[-1].String;
- *yyvsp[-3].String += " " + *yyvsp[0].String;
- delete yyvsp[-1].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-3].String;
- isDeclare = false;
- }
+ case 235:
+#line 2733 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); ;}
break;
- case 229:
-#line 1721 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+ case 236:
+#line 2734 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); ;}
+ break;
+
+ case 237:
+#line 2735 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); ;}
+ break;
+
+ case 238:
+#line 2736 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, true)); ;}
break;
case 239:
-#line 1727 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyvsp[-1].String->insert(0, "<");
- *yyvsp[-1].String += ">";
- yyval.String = yyvsp[-1].String;
- }
+#line 2737 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, false)); ;}
+ break;
+
+ case 240:
+#line 2738 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::createNull(); ;}
break;
case 241:
-#line 1733 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- if (!yyvsp[-3].String->empty()) {
- *yyvsp[-4].String += " " + *yyvsp[-3].String;
+#line 2739 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::createUndef(); ;}
+ break;
+
+ case 242:
+#line 2740 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::createZeroInit(); ;}
+ break;
+
+ case 243:
+#line 2741 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Nonempty unsized packed vector
+ const Type *ETy = (*(yyvsp[-1].ConstVector))[0].C->getType();
+ int NumElements = (yyvsp[-1].ConstVector)->size();
+ PackedType* pt = PackedType::get(ETy, NumElements);
+ PATypeHolder* PTy = new PATypeHolder(
+ HandleUpRefs(PackedType::get(ETy, NumElements)));
+
+ // Verify all elements are correct type!
+ std::vector<Constant*> Elems;
+ for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
+ Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+ const Type *CTy = C->getType();
+ if (ETy != CTy)
+ error("Element #" + utostr(i) + " is not of type '" +
+ ETy->getDescription() +"' as required!\nIt is of type '" +
+ CTy->getDescription() + "'");
+ Elems.push_back(C);
}
- *yyvsp[-4].String += " " + *yyvsp[-2].String + ", " + *yyvsp[0].String;
- delete yyvsp[-3].String; delete yyvsp[-2].String; delete yyvsp[0].String;
- yyval.String = yyvsp[-4].String;
- }
+ (yyval.ValIDVal) = ValID::create(ConstantPacked::get(pt, Elems));
+ delete PTy; delete (yyvsp[-1].ConstVector);
+ ;}
break;
case 244:
-#line 1746 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2762 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Val = new Value;
- yyval.Val->val = yyvsp[0].String;
- yyval.Val->constant = false;
- yyval.Val->type = 0;
- }
+ (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal).C);
+ ;}
break;
case 245:
-#line 1752 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2765 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.Val = new Value;
- yyval.Val->val = yyvsp[0].String;
- yyval.Val->constant = true;
- yyval.Val->type = 0;
- }
+ char *End = UnEscapeLexed((yyvsp[-2].StrVal), true);
+ std::string AsmStr = std::string((yyvsp[-2].StrVal), End);
+ End = UnEscapeLexed((yyvsp[0].StrVal), true);
+ std::string Constraints = std::string((yyvsp[0].StrVal), End);
+ (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[-3].BoolVal));
+ free((yyvsp[-2].StrVal));
+ free((yyvsp[0].StrVal));
+ ;}
break;
case 246:
-#line 1763 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyvsp[-1].Ty = yyvsp[-1].Ty->resolve();
- std::string Name = getUniqueName(yyvsp[0].Val->val, yyvsp[-1].Ty);
- yyval.Val = yyvsp[0].Val;
- delete yyval.Val->val;
- yyval.Val->val = new std::string(yyvsp[-1].Ty->getNewTy() + " " + Name);
- yyval.Val->type = yyvsp[-1].Ty;
- }
+#line 2780 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal)); ;}
break;
case 247:
-#line 1772 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyval.String = 0;
- }
- break;
-
- case 248:
-#line 1775 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // Do not allow functions with 0 basic blocks
- yyval.String = 0;
- }
- break;
-
- case 249:
-#line 1783 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- yyval.String = 0;
- }
+#line 2781 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal)); ;}
break;
case 250:
-#line 1787 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *O << " " << *yyvsp[0].String << '\n';
- delete yyvsp[0].String;
- yyval.String = 0;
- }
+#line 2794 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+ (yyval.ValueVal).S = (yyvsp[-1].TypeVal).S;
+ (yyval.ValueVal).V = getVal(Ty, (yyvsp[0].ValIDVal));
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
break;
case 251:
-#line 1792 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2803 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.String = 0;
- }
+ (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+ ;}
break;
case 252:
-#line 1795 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2806 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Do not allow functions with 0 basic blocks
+ (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+ ;}
+ break;
+
+ case 253:
+#line 2815 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *O << *yyvsp[0].String << '\n';
- delete yyvsp[0].String;
- yyval.String = 0;
- }
+ setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal));
+ InsertValue((yyvsp[0].TermInstVal));
+ (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal));
+ InsertValue((yyvsp[-2].BasicBlockVal));
+ (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal);
+ ;}
break;
case 254:
-#line 1801 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = yyvsp[0].String; *yyval.String = "unwind"; }
+#line 2825 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if ((yyvsp[0].InstVal).I)
+ (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal).I);
+ (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal);
+ ;}
break;
case 255:
-#line 1803 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // Return with a result...
- *O << " " << *yyvsp[-1].String << ' ' << *yyvsp[0].Val->val << '\n';
- delete yyvsp[-1].String; delete yyvsp[0].Val;
- yyval.String = 0;
- }
+#line 2830 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true);
+ // Make sure to move the basic block to the correct location in the
+ // function, instead of leaving it inserted wherever it was first
+ // referenced.
+ Function::BasicBlockListType &BBL =
+ CurFun.CurrentFunction->getBasicBlockList();
+ BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal));
+ ;}
break;
case 256:
-#line 1808 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // Return with no result...
- *O << " " << *yyvsp[-1].String << ' ' << yyvsp[0].Ty->getNewTy() << '\n';
- delete yyvsp[-1].String;
- yyval.String = 0;
- }
- break;
-
- case 257:
-#line 1813 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // Unconditional Branch...
- *O << " " << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].Val->val << '\n';
- delete yyvsp[-2].String; delete yyvsp[0].Val;
- yyval.String = 0;
- }
- break;
-
- case 258:
-#line 1818 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- std::string Name = getUniqueName(yyvsp[-6].Val->val, yyvsp[-7].Ty);
- *O << " " << *yyvsp[-8].String << ' ' << yyvsp[-7].Ty->getNewTy() << ' ' << Name << ", "
- << yyvsp[-4].Ty->getNewTy() << ' ' << *yyvsp[-3].Val->val << ", " << yyvsp[-1].Ty->getNewTy() << ' '
- << *yyvsp[0].Val->val << '\n';
- delete yyvsp[-8].String; delete yyvsp[-6].Val; delete yyvsp[-3].Val; delete yyvsp[0].Val;
- yyval.String = 0;
- }
+#line 2839 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[0].StrVal)), true);
+ // Make sure to move the basic block to the correct location in the
+ // function, instead of leaving it inserted wherever it was first
+ // referenced.
+ Function::BasicBlockListType &BBL =
+ CurFun.CurrentFunction->getBasicBlockList();
+ BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal));
+ ;}
break;
case 259:
-#line 1826 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- std::string Name = getUniqueName(yyvsp[-6].Val->val, yyvsp[-7].Ty);
- *O << " " << *yyvsp[-8].String << ' ' << yyvsp[-7].Ty->getNewTy() << ' ' << Name << ", "
- << yyvsp[-4].Ty->getNewTy() << ' ' << *yyvsp[-3].Val->val << " [" << *yyvsp[-1].String << " ]\n";
- delete yyvsp[-8].String;
- delete yyvsp[-6].Val;
- delete yyvsp[-3].Val;
- delete yyvsp[-1].String;
- yyval.String = 0;
- }
+#line 2853 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Return with a result...
+ (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal).V);
+ ;}
break;
case 260:
-#line 1836 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- std::string Name = getUniqueName(yyvsp[-5].Val->val, yyvsp[-6].Ty);
- *O << " " << *yyvsp[-7].String << ' ' << yyvsp[-6].Ty->getNewTy() << ' ' << Name << ", "
- << yyvsp[-3].Ty->getNewTy() << ' ' << *yyvsp[-2].Val->val << "[]\n";
- delete yyvsp[-7].String;
- delete yyvsp[-5].Val;
- delete yyvsp[-2].Val;
- yyval.String = 0;
- }
+#line 2856 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Return with no result...
+ (yyval.TermInstVal) = new ReturnInst();
+ ;}
break;
case 261:
-#line 1846 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- const Type* ResTy = getFunctionReturnType(yyvsp[-10].Ty);
- *O << " ";
- if (!yyvsp[-13].String->empty()) {
- std::string Name = getUniqueName(yyvsp[-13].String, ResTy);
- *O << Name << " = ";
- }
- *O << *yyvsp[-12].String << ' ' << *yyvsp[-11].String << ' ' << yyvsp[-10].Ty->getNewTy() << ' ' << *yyvsp[-9].Val->val << " (";
- for (unsigned i = 0; i < yyvsp[-7].ValList->size(); ++i) {
- Value* V = (*yyvsp[-7].ValList)[i];
- *O << *V->val;
- if (i+1 < yyvsp[-7].ValList->size())
- *O << ", ";
- delete V;
- }
- *O << ") " << *yyvsp[-5].String << ' ' << yyvsp[-4].Ty->getNewTy() << ' ' << *yyvsp[-3].Val->val << ' '
- << *yyvsp[-2].String << ' ' << yyvsp[-1].Ty->getNewTy() << ' ' << *yyvsp[0].Val->val << '\n';
- delete yyvsp[-13].String; delete yyvsp[-12].String; delete yyvsp[-11].String; delete yyvsp[-9].Val; delete yyvsp[-7].ValList;
- delete yyvsp[-5].String; delete yyvsp[-3].Val; delete yyvsp[-2].String; delete yyvsp[0].Val;
- yyval.String = 0;
- }
+#line 2859 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Unconditional Branch...
+ BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+ (yyval.TermInstVal) = new BranchInst(tmpBB);
+ ;}
break;
case 262:
-#line 1867 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *O << " " << *yyvsp[0].String << '\n';
- delete yyvsp[0].String;
- yyval.String = 0;
- }
+#line 2863 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal));
+ BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal));
+ Value* tmpVal = getVal(Type::Int1Ty, (yyvsp[-6].ValIDVal));
+ (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal);
+ ;}
break;
case 263:
-#line 1872 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2869 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *O << " " << *yyvsp[0].String << '\n';
- delete yyvsp[0].String;
- yyval.String = 0;
- }
+ Value* tmpVal = getVal((yyvsp[-7].PrimType).T, (yyvsp[-6].ValIDVal));
+ BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal));
+ SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size());
+ (yyval.TermInstVal) = S;
+ std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[-1].JumpTable)->begin(),
+ E = (yyvsp[-1].JumpTable)->end();
+ for (; I != E; ++I) {
+ if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
+ S->addCase(CI, I->second);
+ else
+ error("Switch case is constant, but not a simple integer");
+ }
+ delete (yyvsp[-1].JumpTable);
+ ;}
break;
case 264:
-#line 1878 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2884 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-5].String += " " + yyvsp[-4].Ty->getNewTy() + " " + *yyvsp[-3].String + ", " + yyvsp[-1].Ty->getNewTy() + " " +
- *yyvsp[0].Val->val;
- delete yyvsp[-3].String; delete yyvsp[0].Val;
- yyval.String = yyvsp[-5].String;
- }
+ Value* tmpVal = getVal((yyvsp[-6].PrimType).T, (yyvsp[-5].ValIDVal));
+ BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal));
+ SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
+ (yyval.TermInstVal) = S;
+ ;}
break;
case 265:
-#line 1884 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2891 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyvsp[-3].String->insert(0, yyvsp[-4].Ty->getNewTy() + " " );
- *yyvsp[-3].String += ", " + yyvsp[-1].Ty->getNewTy() + " " + *yyvsp[0].Val->val;
- delete yyvsp[0].Val;
- yyval.String = yyvsp[-3].String;
- }
+ const PointerType *PFTy;
+ const FunctionType *Ty;
+
+ if (!(PFTy = dyn_cast<PointerType>((yyvsp[-10].TypeVal).T->get())) ||
+ !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
+ // Pull out the types of all of the arguments...
+ std::vector<const Type*> ParamTypes;
+ if ((yyvsp[-7].ValueList)) {
+ for (std::vector<ValueInfo>::iterator I = (yyvsp[-7].ValueList)->begin(), E = (yyvsp[-7].ValueList)->end();
+ I != E; ++I)
+ ParamTypes.push_back((*I).V->getType());
+ }
+ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
+ if (isVarArg) ParamTypes.pop_back();
+ Ty = FunctionType::get((yyvsp[-10].TypeVal).T->get(), ParamTypes, isVarArg);
+ PFTy = PointerType::get(Ty);
+ }
+ Value *V = getVal(PFTy, (yyvsp[-9].ValIDVal)); // Get the function we're calling...
+ BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal));
+ BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal));
+
+ // Create the call node...
+ if (!(yyvsp[-7].ValueList)) { // Has no arguments?
+ (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector<Value*>());
+ } else { // Has arguments?
+ // Loop through FunctionType's arguments and ensure they are specified
+ // correctly!
+ //
+ FunctionType::param_iterator I = Ty->param_begin();
+ FunctionType::param_iterator E = Ty->param_end();
+ std::vector<ValueInfo>::iterator ArgI = (yyvsp[-7].ValueList)->begin(), ArgE = (yyvsp[-7].ValueList)->end();
+
+ std::vector<Value*> Args;
+ for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
+ if ((*ArgI).V->getType() != *I)
+ error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
+ (*I)->getDescription() + "'");
+ Args.push_back((*ArgI).V);
+ }
+
+ if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
+ error("Invalid number of parameters detected");
+
+ (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, Args);
+ }
+ cast<InvokeInst>((yyval.TermInstVal))->setCallingConv((yyvsp[-11].UIntVal));
+ delete (yyvsp[-10].TypeVal).T;
+ delete (yyvsp[-7].ValueList);
+ ;}
break;
case 266:
-#line 1892 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2941 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- if (!yyvsp[-1].String->empty()) {
- // Get a unique name for this value, based on its type.
- std::string Name = getUniqueName(yyvsp[-1].String, yyvsp[0].Val->type);
- *yyvsp[-1].String = Name + " = ";
- if (deleteUselessCastFlag && *deleteUselessCastName == Name) {
- // don't actually delete it, just comment it out
- yyvsp[-1].String->insert(0, "; USELSS BITCAST: ");
- delete deleteUselessCastName;
- }
- }
- *yyvsp[-1].String += *yyvsp[0].Val->val;
- delete yyvsp[0].Val;
- deleteUselessCastFlag = false;
- yyval.String = yyvsp[-1].String;
- }
+ (yyval.TermInstVal) = new UnwindInst();
+ ;}
break;
case 267:
-#line 1910 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { // Used for PHI nodes
- std::string Name = getUniqueName(yyvsp[-3].Val->val, yyvsp[-5].Ty);
- Name.insert(0, yyvsp[-5].Ty->getNewTy() + "[");
- Name += "," + *yyvsp[-1].Val->val + "]";
- yyval.Val = new Value;
- yyval.Val->val = new std::string(Name);
- yyval.Val->type = yyvsp[-5].Ty;
- delete yyvsp[-3].Val; delete yyvsp[-1].Val;
- }
+#line 2944 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.TermInstVal) = new UnreachableInst();
+ ;}
break;
case 268:
-#line 1919 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2950 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- std::string Name = getUniqueName(yyvsp[-3].Val->val, yyvsp[-6].Val->type);
- *yyvsp[-6].Val->val += ", [" + Name + "," + *yyvsp[-1].Val->val + "]";
- delete yyvsp[-3].Val;
- delete yyvsp[-1].Val;
- yyval.Val = yyvsp[-6].Val;
- }
+ (yyval.JumpTable) = (yyvsp[-5].JumpTable);
+ Constant *V = cast<Constant>(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal)));
+
+ if (V == 0)
+ error("May only switch on a constant pool value");
+
+ BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+ (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB));
+ ;}
break;
case 269:
-#line 1929 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2960 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.ValList = new ValueList();
- yyval.ValList->push_back(yyvsp[0].Val);
- }
+ (yyval.JumpTable) = new std::vector<std::pair<Constant*, BasicBlock*> >();
+ Constant *V = cast<Constant>(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal)));
+
+ if (V == 0)
+ error("May only switch on a constant pool value");
+
+ BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+ (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB));
+ ;}
break;
case 270:
-#line 1933 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 2973 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- yyval.ValList = yyvsp[-2].ValList;
- yyval.ValList->push_back(yyvsp[0].Val);
- }
+ bool omit = false;
+ if ((yyvsp[-1].StrVal))
+ if (BitCastInst *BCI = dyn_cast<BitCastInst>((yyvsp[0].InstVal).I))
+ if (BCI->getSrcTy() == BCI->getDestTy() &&
+ BCI->getOperand(0)->getName() == (yyvsp[-1].StrVal))
+ // This is a useless bit cast causing a name redefinition. It is
+ // a bit cast from a type to the same type of an operand with the
+ // same name as the name we would give this instruction. Since this
+ // instruction results in no code generation, it is safe to omit
+ // the instruction. This situation can occur because of collapsed
+ // type planes. For example:
+ // %X = add int %Y, %Z
+ // %X = cast int %Y to uint
+ // After upgrade, this looks like:
+ // %X = add i32 %Y, %Z
+ // %X = bitcast i32 to i32
+ // The bitcast is clearly useless so we omit it.
+ omit = true;
+ if (omit) {
+ (yyval.InstVal).I = 0;
+ (yyval.InstVal).S = Signless;
+ } else {
+ setValueName((yyvsp[0].InstVal).I, (yyvsp[-1].StrVal));
+ InsertValue((yyvsp[0].InstVal).I);
+ (yyval.InstVal) = (yyvsp[0].InstVal);
+ }
+ ;}
break;
case 271:
-#line 1940 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.ValList = yyvsp[0].ValList; }
+#line 3002 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Used for PHI nodes
+ (yyval.PHIList).P = new std::list<std::pair<Value*, BasicBlock*> >();
+ (yyval.PHIList).S = (yyvsp[-5].TypeVal).S;
+ Value* tmpVal = getVal((yyvsp[-5].TypeVal).T->get(), (yyvsp[-3].ValIDVal));
+ BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+ (yyval.PHIList).P->push_back(std::make_pair(tmpVal, tmpBB));
+ delete (yyvsp[-5].TypeVal).T;
+ ;}
break;
case 272:
-#line 1941 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.ValList = new ValueList(); }
+#line 3010 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ (yyval.PHIList) = (yyvsp[-6].PHIList);
+ Value* tmpVal = getVal((yyvsp[-6].PHIList).P->front().first->getType(), (yyvsp[-3].ValIDVal));
+ BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+ (yyvsp[-6].PHIList).P->push_back(std::make_pair(tmpVal, tmpBB));
+ ;}
break;
case 273:
-#line 1945 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *yyvsp[-1].String += " " + *yyvsp[0].String;
- delete yyvsp[0].String;
- yyval.String = yyvsp[-1].String;
- }
+#line 3018 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { // Used for call statements, and memory insts...
+ (yyval.ValueList) = new std::vector<ValueInfo>();
+ (yyval.ValueList)->push_back((yyvsp[0].ValueVal));
+ ;}
break;
- case 275:
-#line 1953 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+ case 274:
+#line 3022 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- const char* op = getDivRemOpcode(*yyvsp[-4].String, yyvsp[-3].Ty);
- std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
- std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = new std::string(op);
- *yyval.Val->val += " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + ", " + Name2;
- yyval.Val->type = yyvsp[-3].Ty;
- delete yyvsp[-4].String; delete yyvsp[0].Val;
- }
+ (yyval.ValueList) = (yyvsp[-2].ValueList);
+ (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal));
+ ;}
break;
case 276:
-#line 1964 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
- std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
- *yyvsp[-4].String += " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + ", " + Name2;
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-4].String;
- yyval.Val->type = yyvsp[-3].Ty;
- delete yyvsp[0].Val;
- }
+#line 3030 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValueList) = 0; ;}
break;
case 277:
-#line 1974 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3034 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
- std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
- *yyvsp[-4].String = getCompareOp(*yyvsp[-4].String, yyvsp[-3].Ty);
- *yyvsp[-4].String += " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + ", " + Name2;
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-4].String;
- yyval.Val->type = Type::get("i1",BoolTy);
- delete yyvsp[0].Val;
- }
+ (yyval.BoolVal) = true;
+ ;}
break;
case 278:
-#line 1985 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3037 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
- std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
- *yyvsp[-5].String += " " + *yyvsp[-4].String + " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + "," + Name2;
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-5].String;
- yyval.Val->type = Type::get("i1",BoolTy);
- delete yyvsp[-4].String; delete yyvsp[0].Val;
- }
+ (yyval.BoolVal) = false;
+ ;}
break;
case 279:
-#line 1995 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3043 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- std::string Name1 = getUniqueName(yyvsp[-2].Val->val, yyvsp[-3].Ty);
- std::string Name2 = getUniqueName(yyvsp[0].Val->val, yyvsp[-3].Ty);
- *yyvsp[-5].String += " " + *yyvsp[-4].String + " " + yyvsp[-3].Ty->getNewTy() + " " + Name1 + "," + Name2;
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-5].String;
- yyval.Val->type = Type::get("i1",BoolTy);
- delete yyvsp[-4].String; delete yyvsp[0].Val;
- }
+ const Type* Ty = (yyvsp[-3].TypeVal).T->get();
+ if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa<PackedType>(Ty))
+ error("Arithmetic operator requires integer, FP, or packed operands");
+ if (isa<PackedType>(Ty) &&
+ ((yyvsp[-4].BinaryOpVal) == URemOp || (yyvsp[-4].BinaryOpVal) == SRemOp || (yyvsp[-4].BinaryOpVal) == FRemOp || (yyvsp[-4].BinaryOpVal) == RemOp))
+ error("Remainder not supported on packed types");
+ // Upgrade the opcode from obsolete versions before we do anything with it.
+ Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-4].BinaryOpVal), Ty, (yyvsp[-3].TypeVal).S);
+ Value* val1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+ Value* val2 = getVal(Ty, (yyvsp[0].ValIDVal));
+ (yyval.InstVal).I = BinaryOperator::create(Opcode, val1, val2);
+ if ((yyval.InstVal).I == 0)
+ error("binary operator returned null");
+ (yyval.InstVal).S = (yyvsp[-3].TypeVal).S;
+ delete (yyvsp[-3].TypeVal).T;
+ ;}
break;
case 280:
-#line 2005 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3060 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- const char* shiftop = yyvsp[-3].String->c_str();
- if (*yyvsp[-3].String == "shr")
- shiftop = (yyvsp[-2].Val->type->isUnsigned()) ? "lshr" : "ashr";
- std::string *val = new std::string(shiftop);
- *val += " " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = val;
- delete yyvsp[-3].String; delete yyvsp[0].Val;
- }
+ const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+ if (!Ty->isInteger()) {
+ if (!isa<PackedType>(Ty) ||
+ !cast<PackedType>(Ty)->getElementType()->isInteger())
+ error("Logical operator requires integral operands");
+ }
+ Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-4].BinaryOpVal), Ty, (yyvsp[-3].TypeVal).S);
+ Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+ Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+ (yyval.InstVal).I = BinaryOperator::create(Opcode, tmpVal1, tmpVal2);
+ if ((yyval.InstVal).I == 0)
+ error("binary operator returned null");
+ (yyval.InstVal).S = (yyvsp[-3].TypeVal).S;
+ delete (yyvsp[-3].TypeVal).T;
+ ;}
break;
case 281:
-#line 2016 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3076 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- std::string source = *yyvsp[-2].Val->val;
- const Type* SrcTy = yyvsp[-2].Val->type->resolve();
- const Type* DstTy = yyvsp[0].Ty->resolve();
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = new std::string();
- yyval.Val->type = DstTy;
- if (*yyvsp[-3].String == "cast") {
- *yyval.Val->val += getCastUpgrade(source, SrcTy, DstTy, false);
- } else {
- *yyval.Val->val += *yyvsp[-3].String + " " + source + " to " + DstTy->getNewTy();
- }
- // 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 (*yyvsp[-3].String == "cast" || *yyvsp[-3].String == "bitcast")
- if (SrcTy->isInteger() && DstTy->isInteger() &&
- SrcTy->getBitWidth() == DstTy->getBitWidth()) {
- deleteUselessCastFlag = true; // Flag the "Inst" rule
- deleteUselessCastName = new std::string(*yyvsp[-2].Val->val); // save the name
- size_t pos = deleteUselessCastName->find_first_of("%\"",0);
- if (pos != std::string::npos) {
- // remove the type portion before val
- deleteUselessCastName->erase(0, pos);
- }
- }
- delete yyvsp[-3].String;
- delete yyvsp[-1].String;
- }
+ const Type* Ty = (yyvsp[-3].TypeVal).T->get();
+ if(isa<PackedType>(Ty))
+ error("PackedTypes currently not supported in setcc instructions");
+ unsigned short pred;
+ Instruction::OtherOps Opcode = getCompareOp((yyvsp[-4].BinaryOpVal), pred, Ty, (yyvsp[-3].TypeVal).S);
+ Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+ Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+ (yyval.InstVal).I = CmpInst::create(Opcode, pred, tmpVal1, tmpVal2);
+ if ((yyval.InstVal).I == 0)
+ error("binary operator returned null");
+ (yyval.InstVal).S = Unsigned;
+ delete (yyvsp[-3].TypeVal).T;
+ ;}
break;
case 282:
-#line 2046 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3090 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-5].String += " " + *yyvsp[-4].Val->val + ", " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
- yyval.Val = yyvsp[-4].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-5].String;
- yyval.Val->type = yyvsp[-2].Val->type;
- delete yyvsp[-2].Val;
- delete yyvsp[0].Val;
- }
+ const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+ if (isa<PackedType>(Ty))
+ error("PackedTypes currently not supported in icmp instructions");
+ else if (!Ty->isInteger() && !isa<PointerType>(Ty))
+ error("icmp requires integer or pointer typed operands");
+ Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+ Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+ (yyval.InstVal).I = new ICmpInst((yyvsp[-4].IPred), tmpVal1, tmpVal2);
+ (yyval.InstVal).S = Unsigned;
+ delete (yyvsp[-3].TypeVal).T;
+ ;}
break;
case 283:
-#line 2055 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3102 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-3].String += " " + *yyvsp[-2].Val->val + ", " + yyvsp[0].Ty->getNewTy();
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-3].String;
- yyval.Val->type = yyvsp[0].Ty;
- }
+ const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+ if (isa<PackedType>(Ty))
+ error("PackedTypes currently not supported in fcmp instructions");
+ else if (!Ty->isFloatingPoint())
+ error("fcmp instruction requires floating point operands");
+ Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
+ Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+ (yyval.InstVal).I = new FCmpInst((yyvsp[-4].FPred), tmpVal1, tmpVal2);
+ (yyval.InstVal).S = Unsigned;
+ delete (yyvsp[-3].TypeVal).T;
+ ;}
break;
case 284:
-#line 2062 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3114 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-3].String += " " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
- yyval.Val = yyvsp[-2].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-3].String;
- yyval.Val->type = yyval.Val->type->resolve();
- yyval.Val->type = yyval.Val->type->getElementType();
- delete yyvsp[0].Val;
- }
+ warning("Use of obsolete 'not' instruction: Replacing with 'xor");
+ const Type *Ty = (yyvsp[0].ValueVal).V->getType();
+ Value *Ones = ConstantInt::getAllOnesValue(Ty);
+ if (Ones == 0)
+ error("Expected integral type for not instruction");
+ (yyval.InstVal).I = BinaryOperator::create(Instruction::Xor, (yyvsp[0].ValueVal).V, Ones);
+ if ((yyval.InstVal).I == 0)
+ error("Could not create a xor instruction");
+ (yyval.InstVal).S = (yyvsp[0].ValueVal).S
+ ;}
break;
case 285:
-#line 2071 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3125 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-5].String += " " + *yyvsp[-4].Val->val + ", " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
- yyval.Val = yyvsp[-4].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-5].String;
- delete yyvsp[-2].Val; delete yyvsp[0].Val;
- }
+ if (!(yyvsp[0].ValueVal).V->getType()->isInteger() ||
+ cast<IntegerType>((yyvsp[0].ValueVal).V->getType())->getBitWidth() != 8)
+ error("Shift amount must be int8");
+ if (!(yyvsp[-2].ValueVal).V->getType()->isInteger())
+ error("Shift constant expression requires integer operand");
+ (yyval.InstVal).I = new ShiftInst(getOtherOp((yyvsp[-3].OtherOpVal), (yyvsp[-2].ValueVal).S), (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+ (yyval.InstVal).S = (yyvsp[-2].ValueVal).S;
+ ;}
break;
case 286:
-#line 2078 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3134 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-5].String += " " + *yyvsp[-4].Val->val + ", " + *yyvsp[-2].Val->val + ", " + *yyvsp[0].Val->val;
- yyval.Val = yyvsp[-4].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-5].String;
- delete yyvsp[-2].Val; delete yyvsp[0].Val;
- }
+ const Type *DstTy = (yyvsp[0].TypeVal).T->get();
+ if (!DstTy->isFirstClassType())
+ error("cast instruction to a non-primitive type: '" +
+ DstTy->getDescription() + "'");
+ (yyval.InstVal).I = cast<Instruction>(getCast((yyvsp[-3].CastOpVal), (yyvsp[-2].ValueVal).V, (yyvsp[-2].ValueVal).S, DstTy, (yyvsp[0].TypeVal).S, true));
+ (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
+ delete (yyvsp[0].TypeVal).T;
+ ;}
break;
case 287:
-#line 2085 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3143 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-1].String += " " + *yyvsp[0].Val->val;
- yyval.Val = yyvsp[0].Val;
- delete yyvsp[0].Val->val;
- yyval.Val->val = yyvsp[-1].String;
- }
+ if (!(yyvsp[-4].ValueVal).V->getType()->isInteger() ||
+ cast<IntegerType>((yyvsp[-4].ValueVal).V->getType())->getBitWidth() != 1)
+ error("select condition must be bool");
+ if ((yyvsp[-2].ValueVal).V->getType() != (yyvsp[0].ValueVal).V->getType())
+ error("select value types should match");
+ (yyval.InstVal).I = new SelectInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+ (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+ ;}
break;
case 288:
-#line 2091 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3152 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- // map llvm.isunordered to "fcmp uno"
- yyval.Val = new Value;
- if (*yyvsp[-3].Val->val == "%llvm.isunordered.f32" ||
- *yyvsp[-3].Val->val == "%llvm.isunordered.f64") {
- yyval.Val->val = new std::string( "fcmp uno " + *(*yyvsp[-1].ValList)[0]->val + ", ");
- size_t pos = (*yyvsp[-1].ValList)[1]->val->find(' ');
- assert(pos != std::string::npos && "no space?");
- *yyval.Val->val += (*yyvsp[-1].ValList)[1]->val->substr(pos+1);
- yyval.Val->type = Type::get("i1", BoolTy);
- } else {
- static unsigned upgradeCount = 1;
- if (*yyvsp[-3].Val->val == "%llvm.va_start" || *yyvsp[-3].Val->val == "%llvm.va_end") {
- if (!yyvsp[-1].ValList->empty()) {
- std::string name("%va_upgrade");
- name += llvm::utostr(upgradeCount++);
- yyvsp[-6].String->insert(0, name + " = bitcast " + *(*yyvsp[-1].ValList)[0]->val + " to i8*\n ");
- *(*yyvsp[-1].ValList)[0]->val = "i8* " + name;
- (*yyvsp[-1].ValList)[0]->type = Type::get("i8", UByteTy)->getPointerType();
- }
- } else if (*yyvsp[-3].Val->val == "%llvm.va_copy") {
- std::string name0("%va_upgrade");
- name0 += llvm::utostr(upgradeCount++);
- std::string name1("%va_upgrade");
- name1 += llvm::utostr(upgradeCount++);
- yyvsp[-6].String->insert(0, name0 + " = bitcast " + *(*yyvsp[-1].ValList)[0]->val + " to i8*\n " +
- name1 + " = bitcast " + *(*yyvsp[-1].ValList)[1]->val + " to i8*\n ");
- *(*yyvsp[-1].ValList)[0]->val = "i8* " + name0;
- (*yyvsp[-1].ValList)[0]->type = Type::get("i8", UByteTy)->getPointerType();
- *(*yyvsp[-1].ValList)[1]->val = "i8* " + name1;
- (*yyvsp[-1].ValList)[0]->type = Type::get("i8", UByteTy)->getPointerType();
- }
- if (!yyvsp[-5].String->empty())
- *yyvsp[-6].String += " " + *yyvsp[-5].String;
- if (!yyvsp[-6].String->empty())
- *yyvsp[-6].String += " ";
- *yyvsp[-6].String += yyvsp[-4].Ty->getNewTy() + " " + *yyvsp[-3].Val->val + "(";
- for (unsigned i = 0; i < yyvsp[-1].ValList->size(); ++i) {
- Value* V = (*yyvsp[-1].ValList)[i];
- *yyvsp[-6].String += *V->val;
- if (i+1 < yyvsp[-1].ValList->size())
- *yyvsp[-6].String += ", ";
- delete V;
- }
- *yyvsp[-6].String += ")";
- yyval.Val = new Value;
- yyval.Val->val = yyvsp[-6].String;
- yyval.Val->type = getFunctionReturnType(yyvsp[-4].Ty);
- }
- delete yyvsp[-5].String; delete yyvsp[-3].Val; delete yyvsp[-1].ValList;
- }
+ const Type *Ty = (yyvsp[0].TypeVal).T->get();
+ NewVarArgs = true;
+ (yyval.InstVal).I = new VAArgInst((yyvsp[-2].ValueVal).V, Ty);
+ (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
+ delete (yyvsp[0].TypeVal).T;
+ ;}
+ break;
+
+ case 289:
+#line 3159 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType();
+ const Type* DstTy = (yyvsp[0].TypeVal).T->get();
+ ObsoleteVarArgs = true;
+ Function* NF = cast<Function>(CurModule.CurrentModule->
+ getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+
+ //b = vaarg a, t ->
+ //foo = alloca 1 of t
+ //bar = vacopy a
+ //store bar -> foo
+ //b = vaarg foo, t
+ AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix");
+ CurBB->getInstList().push_back(foo);
+ CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal).V);
+ CurBB->getInstList().push_back(bar);
+ CurBB->getInstList().push_back(new StoreInst(bar, foo));
+ (yyval.InstVal).I = new VAArgInst(foo, DstTy);
+ (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
+ delete (yyvsp[0].TypeVal).T;
+ ;}
break;
case 290:
-#line 2147 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.ValList = yyvsp[0].ValList; }
+#line 3180 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType();
+ const Type* DstTy = (yyvsp[0].TypeVal).T->get();
+ ObsoleteVarArgs = true;
+ Function* NF = cast<Function>(CurModule.CurrentModule->
+ getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+
+ //b = vanext a, t ->
+ //foo = alloca 1 of t
+ //bar = vacopy a
+ //store bar -> foo
+ //tmp = vaarg foo, t
+ //b = load foo
+ AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix");
+ CurBB->getInstList().push_back(foo);
+ CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal).V);
+ CurBB->getInstList().push_back(bar);
+ CurBB->getInstList().push_back(new StoreInst(bar, foo));
+ Instruction* tmp = new VAArgInst(foo, DstTy);
+ CurBB->getInstList().push_back(tmp);
+ (yyval.InstVal).I = new LoadInst(foo);
+ (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
+ delete (yyvsp[0].TypeVal).T;
+ ;}
break;
case 291:
-#line 2148 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.ValList = new ValueList(); }
+#line 3204 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+ error("Invalid extractelement operands");
+ (yyval.InstVal).I = new ExtractElementInst((yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+ (yyval.InstVal).S = (yyvsp[-2].ValueVal).S;
+ ;}
+ break;
+
+ case 292:
+#line 3210 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+ error("Invalid insertelement operands");
+ (yyval.InstVal).I = new InsertElementInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+ (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+ ;}
break;
case 293:
-#line 2153 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- { yyval.String = new std::string(); }
+#line 3216 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+ error("Invalid shufflevector operands");
+ (yyval.InstVal).I = new ShuffleVectorInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
+ (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+ ;}
break;
case 294:
-#line 2156 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3222 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-2].String += " " + yyvsp[-1].Ty->getNewTy();
- if (!yyvsp[0].String->empty())
- *yyvsp[-2].String += " " + *yyvsp[0].String;
- yyval.Val = new Value;
- yyval.Val->val = yyvsp[-2].String;
- yyval.Val->type = yyvsp[-1].Ty->getPointerType();
- delete yyvsp[0].String;
- }
+ const Type *Ty = (yyvsp[0].PHIList).P->front().first->getType();
+ if (!Ty->isFirstClassType())
+ error("PHI node operands must be of first class type");
+ PHINode *PHI = new PHINode(Ty);
+ PHI->reserveOperandSpace((yyvsp[0].PHIList).P->size());
+ while ((yyvsp[0].PHIList).P->begin() != (yyvsp[0].PHIList).P->end()) {
+ if ((yyvsp[0].PHIList).P->front().first->getType() != Ty)
+ error("All elements of a PHI node must be of the same type");
+ PHI->addIncoming((yyvsp[0].PHIList).P->front().first, (yyvsp[0].PHIList).P->front().second);
+ (yyvsp[0].PHIList).P->pop_front();
+ }
+ (yyval.InstVal).I = PHI;
+ (yyval.InstVal).S = (yyvsp[0].PHIList).S;
+ delete (yyvsp[0].PHIList).P; // Free the list...
+ ;}
break;
case 295:
-#line 2165 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3238 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- std::string Name = getUniqueName(yyvsp[-1].Val->val, yyvsp[-2].Ty);
- *yyvsp[-5].String += " " + yyvsp[-4].Ty->getNewTy() + ", " + yyvsp[-2].Ty->getNewTy() + " " + Name;
- if (!yyvsp[0].String->empty())
- *yyvsp[-5].String += " " + *yyvsp[0].String;
- yyval.Val = new Value;
- yyval.Val->val = yyvsp[-5].String;
- yyval.Val->type = yyvsp[-4].Ty->getPointerType();
- delete yyvsp[-1].Val; delete yyvsp[0].String;
- }
+
+ // Handle the short call syntax
+ const PointerType *PFTy;
+ const FunctionType *FTy;
+ if (!(PFTy = dyn_cast<PointerType>((yyvsp[-4].TypeVal).T->get())) ||
+ !(FTy = dyn_cast<FunctionType>(PFTy->getElementType()))) {
+ // Pull out the types of all of the arguments...
+ std::vector<const Type*> ParamTypes;
+ if ((yyvsp[-1].ValueList)) {
+ for (std::vector<ValueInfo>::iterator I = (yyvsp[-1].ValueList)->begin(), E = (yyvsp[-1].ValueList)->end();
+ I != E; ++I)
+ ParamTypes.push_back((*I).V->getType());
+ }
+
+ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
+ if (isVarArg) ParamTypes.pop_back();
+
+ const Type *RetTy = (yyvsp[-4].TypeVal).T->get();
+ if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
+ error("Functions cannot return aggregate types");
+
+ FTy = FunctionType::get(RetTy, ParamTypes, isVarArg);
+ PFTy = PointerType::get(FTy);
+ }
+
+ // First upgrade any intrinsic calls.
+ std::vector<Value*> Args;
+ if ((yyvsp[-1].ValueList))
+ for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i < e; ++i)
+ Args.push_back((*(yyvsp[-1].ValueList))[i].V);
+ Instruction *Inst = upgradeIntrinsicCall(FTy, (yyvsp[-3].ValIDVal), Args);
+
+ // If we got an upgraded intrinsic
+ if (Inst) {
+ (yyval.InstVal).I = Inst;
+ (yyval.InstVal).S = Signless;
+ } else {
+ // Get the function we're calling
+ Value *V = getVal(PFTy, (yyvsp[-3].ValIDVal));
+
+ // Check the argument values match
+ if (!(yyvsp[-1].ValueList)) { // Has no arguments?
+ // Make sure no arguments is a good thing!
+ if (FTy->getNumParams() != 0)
+ error("No arguments passed to a function that expects arguments");
+ } else { // Has arguments?
+ // Loop through FunctionType's arguments and ensure they are specified
+ // correctly!
+ //
+ FunctionType::param_iterator I = FTy->param_begin();
+ FunctionType::param_iterator E = FTy->param_end();
+ std::vector<ValueInfo>::iterator ArgI = (yyvsp[-1].ValueList)->begin(), ArgE = (yyvsp[-1].ValueList)->end();
+
+ for (; ArgI != ArgE && I != E; ++ArgI, ++I)
+ if ((*ArgI).V->getType() != *I)
+ error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
+ (*I)->getDescription() + "'");
+
+ if (I != E || (ArgI != ArgE && !FTy->isVarArg()))
+ error("Invalid number of parameters detected");
+ }
+
+ // Create the call instruction
+ CallInst *CI = new CallInst(V, Args);
+ CI->setTailCall((yyvsp[-6].BoolVal));
+ CI->setCallingConv((yyvsp[-5].UIntVal));
+ (yyval.InstVal).I = CI;
+ (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
+ }
+ delete (yyvsp[-4].TypeVal).T;
+ delete (yyvsp[-1].ValueList);
+ ;}
break;
case 296:
-#line 2175 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3311 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- *yyvsp[-2].String += " " + yyvsp[-1].Ty->getNewTy();
- if (!yyvsp[0].String->empty())
- *yyvsp[-2].String += " " + *yyvsp[0].String;
- yyval.Val = new Value;
- yyval.Val->val = yyvsp[-2].String;
- yyval.Val->type = yyvsp[-1].Ty->getPointerType();
- delete yyvsp[0].String;
- }
+ (yyval.InstVal) = (yyvsp[0].InstVal);
+ ;}
break;
case 297:
-#line 2184 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- std::string Name = getUniqueName(yyvsp[-1].Val->val, yyvsp[-2].Ty);
- *yyvsp[-5].String += " " + yyvsp[-4].Ty->getNewTy() + ", " + yyvsp[-2].Ty->getNewTy() + " " + Name;
- if (!yyvsp[0].String->empty())
- *yyvsp[-5].String += " " + *yyvsp[0].String;
- yyval.Val = yyvsp[-1].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-5].String;
- yyval.Val->type = yyvsp[-4].Ty->getPointerType();
- delete yyvsp[0].String;
- }
+#line 3319 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValueList) = (yyvsp[0].ValueList); ;}
break;
case 298:
-#line 2195 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- *yyvsp[-1].String += " " + *yyvsp[0].Val->val;
- yyval.Val = yyvsp[0].Val;
- delete yyvsp[0].Val->val;
- yyval.Val->val = yyvsp[-1].String;
- yyval.Val->type = Type::get("void", VoidTy);
- }
+#line 3320 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.ValueList) = new std::vector<ValueInfo>(); ;}
break;
case 299:
-#line 2202 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- std::string Name = getUniqueName(yyvsp[0].Val->val, yyvsp[-1].Ty);
- if (!yyvsp[-3].String->empty())
- *yyvsp[-3].String += " ";
- *yyvsp[-3].String += *yyvsp[-2].String + " " + yyvsp[-1].Ty->getNewTy() + " " + Name;
- yyval.Val = yyvsp[0].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-3].String;
- yyval.Val->type = yyvsp[-1].Ty->getElementType();
- delete yyvsp[-2].String;
- }
+#line 3324 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.BoolVal) = true; ;}
break;
case 300:
-#line 2213 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
- {
- std::string Name = getUniqueName(yyvsp[0].Val->val, yyvsp[-1].Ty);
- if (!yyvsp[-5].String->empty())
- *yyvsp[-5].String += " ";
- *yyvsp[-5].String += *yyvsp[-4].String + " " + *yyvsp[-3].Val->val + ", " + yyvsp[-1].Ty->getNewTy() + " " + Name;
- yyval.Val = yyvsp[-3].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-5].String;
- yyval.Val->type = Type::get("void", VoidTy);
- delete yyvsp[-4].String; delete yyvsp[0].Val;
- }
+#line 3325 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ { (yyval.BoolVal) = false; ;}
break;
case 301:
-#line 2224 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3329 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
{
- std::string Name = getUniqueName(yyvsp[-1].Val->val, yyvsp[-2].Ty);
- // Upgrade the indices
- for (unsigned i = 0; i < yyvsp[0].ValList->size(); ++i) {
- Value* V = (*yyvsp[0].ValList)[i];
- if (V->type->isUnsigned() && !V->isConstant() &&
- V->type->getBitWidth() < 64) {
- *O << " %gep_upgrade" << UniqueNameCounter << " = zext " << *V->val
- << " to i64\n";
- *V->val = "i64 %gep_upgrade" + llvm::utostr(UniqueNameCounter++);
- V->type = Type::get("i64",ULongTy);
- }
- }
- *yyvsp[-3].String += " " + yyvsp[-2].Ty->getNewTy() + " " + Name;
- for (unsigned i = 0; i < yyvsp[0].ValList->size(); ++i) {
- Value* V = (*yyvsp[0].ValList)[i];
- *yyvsp[-3].String += ", " + *V->val;
- }
- yyval.Val = yyvsp[-1].Val;
- delete yyval.Val->val;
- yyval.Val->val = yyvsp[-3].String;
- yyval.Val->type = getGEPIndexedType(yyvsp[-2].Ty,yyvsp[0].ValList);
- for (unsigned i = 0; i < yyvsp[0].ValList->size(); ++i)
- delete (*yyvsp[0].ValList)[i];
- delete yyvsp[0].ValList;
- }
+ const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+ (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
+ (yyval.InstVal).I = new MallocInst(Ty, 0, (yyvsp[0].UIntVal));
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
+ break;
+
+ case 302:
+#line 3335 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type *Ty = (yyvsp[-4].TypeVal).T->get();
+ (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
+ (yyval.InstVal).I = new MallocInst(Ty, getVal((yyvsp[-2].PrimType).T, (yyvsp[-1].ValIDVal)), (yyvsp[0].UIntVal));
+ delete (yyvsp[-4].TypeVal).T;
+ ;}
+ break;
+
+ case 303:
+#line 3341 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+ (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
+ (yyval.InstVal).I = new AllocaInst(Ty, 0, (yyvsp[0].UIntVal));
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
+ break;
+
+ case 304:
+#line 3347 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type *Ty = (yyvsp[-4].TypeVal).T->get();
+ (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
+ (yyval.InstVal).I = new AllocaInst(Ty, getVal((yyvsp[-2].PrimType).T, (yyvsp[-1].ValIDVal)), (yyvsp[0].UIntVal));
+ delete (yyvsp[-4].TypeVal).T;
+ ;}
+ break;
+
+ case 305:
+#line 3353 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type *PTy = (yyvsp[0].ValueVal).V->getType();
+ if (!isa<PointerType>(PTy))
+ error("Trying to free nonpointer type '" + PTy->getDescription() + "'");
+ (yyval.InstVal).I = new FreeInst((yyvsp[0].ValueVal).V);
+ (yyval.InstVal).S = Signless;
+ ;}
break;
+ case 306:
+#line 3360 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type* Ty = (yyvsp[-1].TypeVal).T->get();
+ (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
+ if (!isa<PointerType>(Ty))
+ error("Can't load from nonpointer type: " + Ty->getDescription());
+ if (!cast<PointerType>(Ty)->getElementType()->isFirstClassType())
+ error("Can't load from pointer of non-first-class type: " +
+ Ty->getDescription());
+ Value* tmpVal = getVal(Ty, (yyvsp[0].ValIDVal));
+ (yyval.InstVal).I = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal));
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
+ break;
+
+ case 307:
+#line 3372 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+ if (!PTy)
+ error("Can't store to a nonpointer type: " +
+ (yyvsp[-1].TypeVal).T->get()->getDescription());
+ const Type *ElTy = PTy->getElementType();
+ if (ElTy != (yyvsp[-3].ValueVal).V->getType())
+ error("Can't store '" + (yyvsp[-3].ValueVal).V->getType()->getDescription() +
+ "' into space of type '" + ElTy->getDescription() + "'");
+ Value* tmpVal = getVal(PTy, (yyvsp[0].ValIDVal));
+ (yyval.InstVal).I = new StoreInst((yyvsp[-3].ValueVal).V, tmpVal, (yyvsp[-5].BoolVal));
+ (yyval.InstVal).S = Signless;
+ delete (yyvsp[-1].TypeVal).T;
+ ;}
+ break;
+
+ case 308:
+#line 3386 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+ {
+ const Type* Ty = (yyvsp[-2].TypeVal).T->get();
+ if (!isa<PointerType>(Ty))
+ error("getelementptr insn requires pointer operand");
+
+ std::vector<Value*> VIndices;
+ upgradeGEPIndices(Ty, (yyvsp[0].ValueList), VIndices);
+
+ Value* tmpVal = getVal(Ty, (yyvsp[-1].ValIDVal));
+ (yyval.InstVal).I = new GetElementPtrInst(tmpVal, VIndices);
+ (yyval.InstVal).S = Signless;
+ delete (yyvsp[-2].TypeVal).T;
+ delete (yyvsp[0].ValueList);
+ ;}
+ break;
+
+ default: break;
}
-/* Line 1016 of /usr/local/share/bison/yacc.c. */
-#line 4580 "UpgradeParser.tab.c"
+/* Line 1126 of yacc.c. */
+#line 6116 "UpgradeParser.tab.c"
yyvsp -= yylen;
yyssp -= yylen;
-#if YYDEBUG
- if (yydebug)
- {
- short *yyssp1 = yyss - 1;
- YYFPRINTF (stderr, "state stack now");
- while (yyssp1 != yyssp)
- YYFPRINTF (stderr, " %d", *++yyssp1);
- YYFPRINTF (stderr, "\n");
- }
-#endif
+ YY_STACK_PRINT (yyss, yyssp);
*++yyvsp = yyval;
@@ -4624,90 +6151,153 @@ yyerrlab:
if (YYPACT_NINF < yyn && yyn < YYLAST)
{
- YYSIZE_T yysize = 0;
int yytype = YYTRANSLATE (yychar);
- char *yymsg;
- int yyx, yycount;
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+ YYSIZE_T yysize = yysize0;
+ YYSIZE_T yysize1;
+ int yysize_overflow = 0;
+ char *yymsg = 0;
+# define YYERROR_VERBOSE_ARGS_MAXIMUM 5
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ int yyx;
+
+#if 0
+ /* This is so xgettext sees the translatable formats that are
+ constructed on the fly. */
+ YY_("syntax error, unexpected %s");
+ YY_("syntax error, unexpected %s, expecting %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+#endif
+ char *yyfmt;
+ char const *yyf;
+ static char const yyunexpected[] = "syntax error, unexpected %s";
+ static char const yyexpecting[] = ", expecting %s";
+ static char const yyor[] = " or %s";
+ char yyformat[sizeof yyunexpected
+ + sizeof yyexpecting - 1
+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+ * (sizeof yyor - 1))];
+ char const *yyprefix = yyexpecting;
- yycount = 0;
/* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. */
- for (yyx = yyn < 0 ? -yyn : 0;
- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 1;
+
+ yyarg[0] = yytname[yytype];
+ yyfmt = yystpcpy (yyformat, yyunexpected);
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- yysize += yystrlen (yytname[yyx]) + 15, yycount++;
- yysize += yystrlen ("parse error, unexpected ") + 1;
- yysize += yystrlen (yytname[yytype]);
- yymsg = (char *) YYSTACK_ALLOC (yysize);
- if (yymsg != 0)
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ yyformat[sizeof yyunexpected - 1] = '\0';
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+ yysize_overflow |= yysize1 < yysize;
+ yysize = yysize1;
+ yyfmt = yystpcpy (yyfmt, yyprefix);
+ yyprefix = yyor;
+ }
+
+ yyf = YY_(yyformat);
+ yysize1 = yysize + yystrlen (yyf);
+ yysize_overflow |= yysize1 < yysize;
+ yysize = yysize1;
+
+ if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg)
{
- char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
- yyp = yystpcpy (yyp, yytname[yytype]);
-
- if (yycount < 5)
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ char *yyp = yymsg;
+ int yyi = 0;
+ while ((*yyp = *yyf))
{
- yycount = 0;
- for (yyx = yyn < 0 ? -yyn : 0;
- yyx < (int) (sizeof (yytname) / sizeof (char *));
- yyx++)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- {
- const char *yyq = ! yycount ? ", expecting " : " or ";
- yyp = yystpcpy (yyp, yyq);
- yyp = yystpcpy (yyp, yytname[yyx]);
- yycount++;
- }
+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyf += 2;
+ }
+ else
+ {
+ yyp++;
+ yyf++;
+ }
}
yyerror (yymsg);
YYSTACK_FREE (yymsg);
}
else
- yyerror ("parse error; also virtual memory exhausted");
+ {
+ yyerror (YY_("syntax error"));
+ goto yyexhaustedlab;
+ }
}
else
#endif /* YYERROR_VERBOSE */
- yyerror ("parse error");
+ yyerror (YY_("syntax error"));
}
- goto yyerrlab1;
-/*----------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action. |
-`----------------------------------------------------*/
-yyerrlab1:
+
if (yyerrstatus == 3)
{
- /* If just tried and failed to reuse lookahead token after an
+ /* If just tried and failed to reuse look-ahead token after an
error, discard it. */
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
+ if (yychar <= YYEOF)
{
- /* Pop the error token. */
- YYPOPSTACK;
- /* Pop the rest of the stack. */
- while (yyssp > yyss)
- {
- YYDPRINTF ((stderr, "Error: popping "));
- YYDSYMPRINT ((stderr,
- yystos[*yyssp],
- *yyvsp));
- YYDPRINTF ((stderr, "\n"));
- yydestruct (yystos[*yyssp], *yyvsp);
- YYPOPSTACK;
- }
- YYABORT;
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
}
-
- YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
- yychar, yytname[yychar1]));
- yydestruct (yychar1, yylval);
- yychar = YYEMPTY;
+ else
+ {
+ yydestruct ("Error: discarding", yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
}
- /* Else will try to reuse lookahead token after shifting the error
+ /* Else will try to reuse look-ahead token after shifting the error
token. */
+ goto yyerrlab1;
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+ /* Pacify compilers like GCC when the user code never invokes
+ YYERROR and the label yyerrorlab therefore never appears in user
+ code. */
+ if (0)
+ goto yyerrorlab;
+
+yyvsp -= yylen;
+ yyssp -= yylen;
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
yyerrstatus = 3; /* Each real token shifted decrements this. */
for (;;)
@@ -4728,36 +6318,22 @@ yyerrlab1:
if (yyssp == yyss)
YYABORT;
- YYDPRINTF ((stderr, "Error: popping "));
- YYDSYMPRINT ((stderr,
- yystos[*yyssp], *yyvsp));
- YYDPRINTF ((stderr, "\n"));
- yydestruct (yystos[yystate], *yyvsp);
- yyvsp--;
- yystate = *--yyssp;
-
-
-#if YYDEBUG
- if (yydebug)
- {
- short *yyssp1 = yyss - 1;
- YYFPRINTF (stderr, "Error: state stack now");
- while (yyssp1 != yyssp)
- YYFPRINTF (stderr, " %d", *++yyssp1);
- YYFPRINTF (stderr, "\n");
- }
-#endif
+ yydestruct ("Error: popping", yystos[yystate], yyvsp);
+ YYPOPSTACK;
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
}
if (yyn == YYFINAL)
YYACCEPT;
- YYDPRINTF ((stderr, "Shifting error token, "));
-
*++yyvsp = yylval;
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
yystate = yyn;
goto yynewstate;
@@ -4777,16 +6353,25 @@ yyabortlab:
goto yyreturn;
#ifndef yyoverflow
-/*----------------------------------------------.
-| yyoverflowlab -- parser overflow comes here. |
-`----------------------------------------------*/
-yyoverflowlab:
- yyerror ("parser stack overflow");
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
yyresult = 2;
/* Fall through. */
#endif
yyreturn:
+ if (yychar != YYEOF && yychar != YYEMPTY)
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[*yyssp], yyvsp);
+ YYPOPSTACK;
+ }
#ifndef yyoverflow
if (yyss != yyssa)
YYSTACK_FREE (yyss);
@@ -4795,34 +6380,37 @@ yyreturn:
}
-#line 2251 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
+#line 3402 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
int yyerror(const char *ErrorMsg) {
std::string where
= std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
- + ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
- std::string errMsg = where + "error: " + std::string(ErrorMsg) +
- " while reading ";
- if (yychar == YYEMPTY || yychar == 0)
- errMsg += "end-of-file.";
- else
- errMsg += "token: '" + std::string(Upgradetext, Upgradeleng) + "'";
+ + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": ";
+ std::string errMsg = where + "error: " + std::string(ErrorMsg);
+ if (yychar != YYEMPTY && yychar != 0)
+ errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
+ "'.";
std::cerr << "llvm-upgrade: " << errMsg << '\n';
- *O << "llvm-upgrade parse failed.\n";
+ std::cout << "llvm-upgrade: parse failed.\n";
exit(1);
}
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) + "'";
+ + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": ";
+ std::string errMsg = where + "warning: " + std::string(ErrorMsg);
+ if (yychar != YYEMPTY && yychar != 0)
+ errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
+ "'.";
std::cerr << "llvm-upgrade: " << errMsg << '\n';
}
+void error(const std::string& ErrorMsg, int LineNo) {
+ if (LineNo == -1) LineNo = Upgradelineno;
+ Upgradelineno = LineNo;
+ yyerror(ErrorMsg.c_str());
+}
+
+
diff --git a/tools/llvm-upgrade/UpgradeParser.h.cvs b/tools/llvm-upgrade/UpgradeParser.h.cvs
index aab02ac861..7e0e3d8227 100644
--- a/tools/llvm-upgrade/UpgradeParser.h.cvs
+++ b/tools/llvm-upgrade/UpgradeParser.h.cvs
@@ -1,7 +1,7 @@
-/* A Bison parser, made from /usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y, by GNU bison 1.75. */
+/* 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 Free Software Foundation, Inc.
+ 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
@@ -15,78 +15,75 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ 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. */
-#ifndef BISON_UPGRADEPARSER_TAB_H
-# define BISON_UPGRADEPARSER_TAB_H
-
/* 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,
+ ESINT64VAL = 258,
+ EUINT64VAL = 259,
+ SINTVAL = 260,
+ UINTVAL = 261,
+ FPVAL = 262,
+ VOID = 263,
+ BOOL = 264,
+ SBYTE = 265,
+ UBYTE = 266,
+ SHORT = 267,
+ USHORT = 268,
+ INT = 269,
+ UINT = 270,
+ LONG = 271,
+ ULONG = 272,
+ FLOAT = 273,
+ DOUBLE = 274,
+ TYPE = 275,
+ LABEL = 276,
+ VAR_ID = 277,
+ LABELSTR = 278,
+ STRINGCONSTANT = 279,
+ IMPLEMENTATION = 280,
+ ZEROINITIALIZER = 281,
+ TRUETOK = 282,
+ FALSETOK = 283,
+ BEGINTOK = 284,
+ ENDTOK = 285,
+ DECLARE = 286,
+ GLOBAL = 287,
+ CONSTANT = 288,
+ SECTION = 289,
+ VOLATILE = 290,
+ TO = 291,
+ DOTDOTDOT = 292,
+ NULL_TOK = 293,
+ UNDEF = 294,
+ CONST = 295,
+ INTERNAL = 296,
+ LINKONCE = 297,
+ WEAK = 298,
+ APPENDING = 299,
DLLIMPORT = 300,
DLLEXPORT = 301,
EXTERN_WEAK = 302,
- APPENDING = 303,
- EXTERNAL = 304,
- TARGET = 305,
- TRIPLE = 306,
- ENDIAN = 307,
- POINTERSIZE = 308,
- LITTLE = 309,
- BIG = 310,
- ALIGN = 311,
- UNINITIALIZED = 312,
+ OPAQUE = 303,
+ NOT = 304,
+ EXTERNAL = 305,
+ TARGET = 306,
+ TRIPLE = 307,
+ ENDIAN = 308,
+ POINTERSIZE = 309,
+ LITTLE = 310,
+ BIG = 311,
+ ALIGN = 312,
DEPLIBS = 313,
CALL = 314,
TAIL = 315,
@@ -105,9 +102,9 @@
BR = 328,
SWITCH = 329,
INVOKE = 330,
- EXCEPT = 331,
+ UNREACHABLE = 331,
UNWIND = 332,
- UNREACHABLE = 333,
+ EXCEPT = 333,
ADD = 334,
SUB = 335,
MUL = 336,
@@ -130,112 +127,115 @@
SETNE = 353,
ICMP = 354,
FCMP = 355,
- EQ = 356,
- NE = 357,
- SLT = 358,
- SGT = 359,
- SLE = 360,
- SGE = 361,
- OEQ = 362,
- ONE = 363,
- OLT = 364,
- OGT = 365,
- OLE = 366,
- OGE = 367,
- ORD = 368,
- UNO = 369,
- UEQ = 370,
- UNE = 371,
- ULT = 372,
- UGT = 373,
- ULE = 374,
- UGE = 375,
- MALLOC = 376,
- ALLOCA = 377,
- FREE = 378,
- LOAD = 379,
- STORE = 380,
- GETELEMENTPTR = 381,
- PHI_TOK = 382,
- SELECT = 383,
- SHL = 384,
- SHR = 385,
- ASHR = 386,
- LSHR = 387,
- VAARG = 388,
- EXTRACTELEMENT = 389,
- INSERTELEMENT = 390,
- SHUFFLEVECTOR = 391,
- CAST = 392,
- TRUNC = 393,
- ZEXT = 394,
- SEXT = 395,
- FPTRUNC = 396,
- FPEXT = 397,
- FPTOUI = 398,
- FPTOSI = 399,
- UITOFP = 400,
- SITOFP = 401,
- PTRTOINT = 402,
- INTTOPTR = 403,
- BITCAST = 404
+ MALLOC = 356,
+ ALLOCA = 357,
+ FREE = 358,
+ LOAD = 359,
+ STORE = 360,
+ GETELEMENTPTR = 361,
+ PHI_TOK = 362,
+ SELECT = 363,
+ SHL = 364,
+ SHR = 365,
+ ASHR = 366,
+ LSHR = 367,
+ VAARG = 368,
+ EXTRACTELEMENT = 369,
+ INSERTELEMENT = 370,
+ SHUFFLEVECTOR = 371,
+ VAARG_old = 372,
+ VANEXT_old = 373,
+ EQ = 374,
+ NE = 375,
+ SLT = 376,
+ SGT = 377,
+ SLE = 378,
+ SGE = 379,
+ ULT = 380,
+ UGT = 381,
+ ULE = 382,
+ UGE = 383,
+ OEQ = 384,
+ ONE = 385,
+ OLT = 386,
+ OGT = 387,
+ OLE = 388,
+ OGE = 389,
+ ORD = 390,
+ UNO = 391,
+ UEQ = 392,
+ UNE = 393,
+ CAST = 394,
+ TRUNC = 395,
+ ZEXT = 396,
+ SEXT = 397,
+ FPTRUNC = 398,
+ FPEXT = 399,
+ FPTOUI = 400,
+ FPTOSI = 401,
+ UITOFP = 402,
+ SITOFP = 403,
+ PTRTOINT = 404,
+ INTTOPTR = 405,
+ BITCAST = 406
};
#endif
-#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
+/* Tokens. */
+#define ESINT64VAL 258
+#define EUINT64VAL 259
+#define SINTVAL 260
+#define UINTVAL 261
+#define FPVAL 262
+#define VOID 263
+#define BOOL 264
+#define SBYTE 265
+#define UBYTE 266
+#define SHORT 267
+#define USHORT 268
+#define INT 269
+#define UINT 270
+#define LONG 271
+#define ULONG 272
+#define FLOAT 273
+#define DOUBLE 274
+#define TYPE 275
+#define LABEL 276
+#define VAR_ID 277
+#define LABELSTR 278
+#define STRINGCONSTANT 279
+#define IMPLEMENTATION 280
+#define ZEROINITIALIZER 281
+#define TRUETOK 282
+#define FALSETOK 283
+#define BEGINTOK 284
+#define ENDTOK 285
+#define DECLARE 286
+#define GLOBAL 287
+#define CONSTANT 288
+#define SECTION 289
+#define VOLATILE 290
+#define TO 291
+#define DOTDOTDOT 292
+#define NULL_TOK 293
+#define UNDEF 294
+#define CONST 295
+#define INTERNAL 296
+#define LINKONCE 297
+#define WEAK 298
+#define APPENDING 299
#define DLLIMPORT 300
#define DLLEXPORT 301
#define EXTERN_WEAK 302
-#define APPENDING 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 OPAQUE 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 DEPLIBS 313
#define CALL 314
#define TAIL 315
@@ -254,9 +254,9 @@
#define BR 328
#define SWITCH 329
#define INVOKE 330
-#define EXCEPT 331
+#define UNREACHABLE 331
#define UNWIND 332
-#define UNREACHABLE 333
+#define EXCEPT 333
#define ADD 334
#define SUB 335
#define MUL 336
@@ -279,76 +279,112 @@
#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
+#define MALLOC 356
+#define ALLOCA 357
+#define FREE 358
+#define LOAD 359
+#define STORE 360
+#define GETELEMENTPTR 361
+#define PHI_TOK 362
+#define SELECT 363
+#define SHL 364
+#define SHR 365
+#define ASHR 366
+#define LSHR 367
+#define VAARG 368
+#define EXTRACTELEMENT 369
+#define INSERTELEMENT 370
+#define SHUFFLEVECTOR 371
+#define VAARG_old 372
+#define VANEXT_old 373
+#define EQ 374
+#define NE 375
+#define SLT 376
+#define SGT 377
+#define SLE 378
+#define SGE 379
+#define ULT 380
+#define UGT 381
+#define ULE 382
+#define UGE 383
+#define OEQ 384
+#define ONE 385
+#define OLT 386
+#define OGT 387
+#define OLE 388
+#define OGE 389
+#define ORD 390
+#define UNO 391
+#define UEQ 392
+#define UNE 393
+#define CAST 394
+#define TRUNC 395
+#define ZEXT 396
+#define SEXT 397
+#define FPTRUNC 398
+#define FPEXT 399
+#define FPTOUI 400
+#define FPTOSI 401
+#define UITOFP 402
+#define SITOFP 403
+#define PTRTOINT 404
+#define INTTOPTR 405
+#define BITCAST 406
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 1469 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+typedef union YYSTYPE {
+ llvm::Module *ModuleVal;
+ llvm::Function *FunctionVal;
+ std::pair<llvm::PATypeInfo, char*> *ArgVal;
+ llvm::BasicBlock *BasicBlockVal;
+ llvm::TerminatorInst *TermInstVal;
+ llvm::InstrInfo InstVal;
+ llvm::ConstInfo ConstVal;
+ llvm::ValueInfo ValueVal;
+ llvm::PATypeInfo TypeVal;
+ llvm::TypeInfo PrimType;
+ llvm::PHIListInfo PHIList;
+ std::list<llvm::PATypeInfo> *TypeList;
+ std::vector<llvm::ValueInfo> *ValueList;
+ std::vector<llvm::ConstInfo> *ConstVector;
+
+ std::vector<std::pair<llvm::PATypeInfo,char*> > *ArgList;
+ // Represent the RHS of PHI node
+ std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
+ llvm::GlobalValue::LinkageTypes Linkage;
+ int64_t SInt64Val;
+ uint64_t UInt64Val;
+ int SIntVal;
+ unsigned UIntVal;
+ double FPVal;
+ bool BoolVal;
+ char *StrVal; // This memory is strdup'd!
+ llvm::ValID ValIDVal; // strdup'd memory maybe!
-#ifndef YYSTYPE
-#line 971 "/usr/home/jeffc/llvm/tools/llvm-upgrade/UpgradeParser.y"
-typedef union {
- std::string* String;
- const Type* Ty;
- Value* Val;
- Constant* Const;
- ValueList* ValList;
- TypeList* TypeVec;
-} yystype;
-/* Line 1237 of /usr/local/share/bison/yacc.c. */
-#line 347 "UpgradeParser.tab.h"
-# define YYSTYPE yystype
+ llvm::BinaryOps BinaryOpVal;
+ llvm::TermOps TermOpVal;
+ llvm::MemoryOps MemOpVal;
+ llvm::OtherOps OtherOpVal;
+ llvm::CastOps CastOpVal;
+ llvm::ICmpInst::Predicate IPred;
+ llvm::FCmpInst::Predicate FPred;
+ llvm::Module::Endianness Endianness;
+} YYSTYPE;
+/* Line 1447 of yacc.c. */
+#line 382 "UpgradeParser.tab.h"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
#endif
extern YYSTYPE Upgradelval;
-#endif /* not BISON_UPGRADEPARSER_TAB_H */
diff --git a/tools/llvm-upgrade/UpgradeParser.y.cvs b/tools/llvm-upgrade/UpgradeParser.y.cvs
index da0772c3bf..ca6e7cd515 100644
--- a/tools/llvm-upgrade/UpgradeParser.y.cvs
+++ b/tools/llvm-upgrade/UpgradeParser.y.cvs
@@ -1,1127 +1,1775 @@
-//===-- UpgradeParser.y - Upgrade parser for llvm assmbly -------*- C++ -*-===//
+//===-- llvmAsmParser.y - Parser for llvm assembly files --------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
-// This file was developed by Reid Spencer and is distributed under the
-// University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
-// This file implements the bison parser for LLVM 1.9 assembly language.
+// This file implements the bison parser for LLVM assembly languages files.
//
//===----------------------------------------------------------------------===//
%{
#include "UpgradeInternals.h"
+#include "llvm/CallingConv.h"
+#include "llvm/InlineAsm.h"
+#include "llvm/Instructions.h"
+#include "llvm/Module.h"
+#include "llvm/SymbolTable.h"
+#include "llvm/Support/GetElementPtrTypeIterator.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/MathExtras.h"
#include <algorithm>
-#include <map>
-#include <utility>
#include <iostream>
+#include <list>
+#include <utility>
+
+// DEBUG_UPREFS - Define this symbol if you want to enable debugging output
+// relating to upreferences in the input stream.
+//
+//#define DEBUG_UPREFS 1
+#ifdef DEBUG_UPREFS
+#define UR_OUT(X) std::cerr << X
+#else
+#define UR_OUT(X)
+#endif
#define YYERROR_VERBOSE 1
#define YYINCLUDED_STDLIB_H
#define YYDEBUG 1
-int yylex(); // declaration" of xxx warnings.
+int yylex();
int yyparse();
-extern int yydebug;
-static std::string CurFilename;
-static std::ostream *O = 0;
-std::istream* LexInput = 0;
-unsigned SizeOfPointer = 32;
+int yyerror(const char*);
+static void warning(const std::string& WarningMsg);
+namespace llvm {
-// This bool controls whether attributes are ever added to function declarations
-// definitions and calls.
-static bool AddAttributes = false;
-static void warning(const std::string& msg);
+SignedType *SignedType::SByteTy = 0;
+SignedType *SignedType::SShortTy = 0;
+SignedType *SignedType::SIntTy = 0;
+SignedType *SignedType::SLongTy = 0;
-void UpgradeAssembly(const std::string &infile, std::istream& in,
- std::ostream &out, bool debug, bool addAttrs)
-{
- Upgradelineno = 1;
- CurFilename = infile;
- LexInput = &in;
- yydebug = debug;
- AddAttributes = addAttrs;
- O = &out;
+inline bool SignedType::classof(const Type *T) {
+ if (T->getTypeID() != IntegerTyID)
+ return false;
+ return (T == SByteTy || T == SShortTy || T == SIntTy || T == SLongTy );
+}
- if (yyparse()) {
- std::cerr << "llvm-upgrade: parse failed.\n";
- out << "llvm-upgrade: parse failed.\n";
- exit(1);
- }
+SignedType::SignedType(const IntegerType* ITy)
+ : IntegerType(ITy->getBitWidth()), base_type(ITy)
+{
}
-namespace { // Anonymous namespace to keep our implementation local
+const SignedType *SignedType::get(const IntegerType* ITy) {
+ if (ITy == Type::Int8Ty) {
+ if (!SByteTy)
+ SByteTy = new SignedType(IntegerType::get(8));
+ return SByteTy;
+ } else if (ITy == Type::Int16Ty) {
+ if (!SShortTy)
+ SShortTy = new SignedType(IntegerType::get(16));
+ return SShortTy;
+ } else if (ITy == Type::Int32Ty) {
+ if (!SIntTy)
+ SIntTy = new SignedType(IntegerType::get(32));
+ return SIntTy;
+ } else if (ITy == Type::Int64Ty) {
+ if (!SLongTy)
+ SLongTy = new SignedType(IntegerType::get(64));
+ return SLongTy;
+ } else
+ assert(0 && "Invalid integer type for SignedType::get");
+}
+static inline Signedness getSign(const Type *&Ty) {
+ if (const SignedType *STy = dyn_cast<SignedType>(Ty)) {
+ Ty = STy->getBaseType();
+ return Signed;
+ } else if (isa<IntegerType>(Ty))
+ return Unsigned;
+ return Signless;
+}
-/// This type is used to keep track of the signedness of values. Instead
-/// of creating llvm::Value directly, the parser will create Value which
-/// associates a Value* with a Signedness indication.
-struct Value {
- std::string* val;
- const Type* type;
- bool constant;
- bool isConstant() const { return constant; }
- ~Value() { delete val; }
-};
+static const Type*
+resolveTypeImpl(const Type* Ty, std::vector<const Type*>& TyStack)
+{
+ // Nothing to resolve if it isn't a derived type
+ if (!Ty->isDerivedType())
+ return Ty;
+
+ // Prevent infinite recursion for recursive types
+ for (std::vector<const Type*>::const_iterator I = TyStack.begin(),
+ E = TyStack.end(); I != E; ++I)
+ if (Ty == *I)
+ return Ty;
+
+ // Okay, haven't seen this derived type yet, push it on the stack.
+ const Type* Result = Ty;
+ TyStack.push_back(Ty);
+
+ // Process the type
+ switch (Ty->getTypeID()) {
+ default: assert(0 && "Invalid derived type");
+ case Type::IntegerTyID:
+ break;
+ case Type::FunctionTyID: {
+ const FunctionType* FTy = cast<FunctionType>(Ty);
+ const Type* RetTy = resolveTypeImpl(FTy->getReturnType(), TyStack);
+ std::vector<const Type*> Types;
+ FunctionType::ParamAttrsList Attrs;
+ Attrs.push_back(FTy->getParamAttrs(0));
+ for (unsigned i = 0; i < FTy->getNumParams(); ++i) {
+ Types.push_back(resolveTypeImpl(FTy->getParamType(i), TyStack));
+ Attrs.push_back(FTy->getParamAttrs(i+1));
+ }
+ Result = FunctionType::get(RetTy, Types, FTy->isVarArg(), Attrs);
+ break;
+ }
+ case Type::StructTyID:
+ case Type::PackedStructTyID: {
+ const StructType *STy = cast<StructType>(Ty);
+ std::vector<const Type*> FieldTypes;
+ for (unsigned i = 0; i < STy->getNumElements(); ++i)
+ FieldTypes.push_back(resolveTypeImpl(STy->getElementType(i), TyStack));
+ Result = StructType::get(FieldTypes, STy->isPacked());
+ break;
+ }
+ case Type::ArrayTyID: {
+ const ArrayType *ATy = cast<ArrayType>(Ty);
+ uint64_t NElems = ATy->getNumElements();
+ const Type *ElemTy = resolveTypeImpl(ATy->getElementType(), TyStack);
+ Result = ArrayType::get(ElemTy, NElems);
+ break;
+ }
+ case Type::PointerTyID: {
+ const PointerType *PTy = cast<PointerType>(Ty);
+ const Type *ElemTy = resolveTypeImpl(PTy->getElementType(), TyStack);
+ Result = PointerType::get(ElemTy);
+ break;
+ }
+ case Type::PackedTyID: {
+ const PackedType *PTy = cast<PackedType>(Ty);
+ unsigned NElems = PTy->getNumElements();
+ const Type *ElemTy = resolveTypeImpl(PTy->getElementType(), TyStack);
+ Result = PackedType::get(ElemTy, NElems);
+ break;
+ }
+ }
+ // Done with it, pop it off.
+ TyStack.pop_back();
+ return Result;
+}
+static inline const Type* resolveType(const Type* Ty) {
+ if (!Ty)
+ return 0;
+ if (const SignedType* STy = dyn_cast<SignedType>(Ty))
+ return STy->getBaseType();
+ std::vector<const Type*> TyStack;
+ return resolveTypeImpl(Ty, TyStack);
+}
-/// This type is used to keep track of the signedness of the obsolete
-/// integer types. Instead of creating an llvm::Type directly, the Lexer will
-/// create instances of Type which retains the signedness indication so
-/// it can be used by the parser for upgrade decisions.
-/// For example if "uint" is encountered then the "first" field will be set
-/// to "int32" and the "second" field will be set to "isUnsigned". If the
-/// type is not obsolete then "second" will be set to "isSignless".
-class Type {
-public:
- static const Type* get(const std::string &newType, TypeIDs oldType);
- static const Type* get(const std::string& newType, TypeIDs oldType,
- const Type* eTy, const Type* rTy);
+std::istream* LexInput;
+static std::string CurFilename;
- static const Type* get(const std::string& newType, TypeIDs oldType,
- const Type *eTy, uint64_t elems);
+// This bool controls whether attributes are ever added to function declarations
+// definitions and calls.
+static bool AddAttributes = false;
- static const Type* get(const std::string& newType, TypeIDs oldType,
- TypeList* TL);
+static Module *ParserResult;
+static bool ObsoleteVarArgs;
+static bool NewVarArgs;
+static BasicBlock *CurBB;
+static GlobalVariable *CurGV;
- static const Type* get(const std::string& newType, const Type* resTy,
- TypeList* TL);
- const Type* resolve() const;
- bool operator<(const Type& that) const;
- bool sameNewTyAs(const Type* that) const {
- return this->newTy == that->newTy;
- }
+// This contains info used when building the body of a function. It is
+// destroyed when the function is completed.
+//
+typedef std::vector<Value *> ValueList; // Numbered defs
+
+typedef std::pair<std::string,const Type*> RenameMapKey;
+typedef std::map<RenameMapKey,std::string> RenameMapType;
+
+static void
+ResolveDefinitions(std::map<const Type *,ValueList> &LateResolvers,
+ std::map<const Type *,ValueList> *FutureLateResolvers = 0);
+
+static struct PerModuleInfo {
+ Module *CurrentModule;
+ std::map<const Type *, ValueList> Values; // Module level numbered definitions
+ std::map<const Type *,ValueList> LateResolveValues;
+ std::vector<PATypeHolder> Types;
+ std::map<ValID, PATypeHolder> LateResolveTypes;
+ static Module::Endianness Endian;
+ static Module::PointerSize PointerSize;
+ RenameMapType RenameMap;
+
+ /// PlaceHolderInfo - When temporary placeholder objects are created, remember
+ /// how they were referenced and on which line of the input they came from so
+ /// that we can resolve them later and print error messages as appropriate.
+ std::map<Value*, std::pair<ValID, int> > PlaceHolderInfo;
+
+ // GlobalRefs - This maintains a mapping between <Type, ValID>'s and forward
+ // references to global values. Global values may be referenced before they
+ // are defined, and if so, the temporary object that they represent is held
+ // here. This is used for forward references of GlobalValues.
+ //
+ typedef std::map<std::pair<const PointerType *, ValID>, GlobalValue*>
+ GlobalRefsType;
+ GlobalRefsType GlobalRefs;
+
+ void ModuleDone() {
+ // If we could not resolve some functions at function compilation time
+ // (calls to functions before they are defined), resolve them now... Types
+ // are resolved when the constant pool has been completely parsed.
+ //
+ ResolveDefinitions(LateResolveValues);
+
+ // Check to make sure that all global value forward references have been
+ // resolved!
+ //
+ if (!GlobalRefs.empty()) {
+ std::string UndefinedReferences = "Unresolved global references exist:\n";
+
+ for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end();
+ I != E; ++I) {
+ UndefinedReferences += " " + I->first.first->getDescription() + " " +
+ I->first.second.getName() + "\n";
+ }
+ error(UndefinedReferences);
+ return;
+ }
- bool sameOldTyAs(const Type* that) const;
+ if (CurrentModule->getDataLayout().empty()) {
+ std::string dataLayout;
+ if (Endian != Module::AnyEndianness)
+ dataLayout.append(Endian == Module::BigEndian ? "E" : "e");
+ if (PointerSize != Module::AnyPointerSize) {
+ if (!dataLayout.empty())
+ dataLayout += "-";
+ dataLayout.append(PointerSize == Module::Pointer64 ?
+ "p:64:64" : "p:32:32");
+ }
+ CurrentModule->setDataLayout(dataLayout);
+ }
- TypeIDs getElementTy() const {
- if (elemTy) {
- return elemTy->oldTy;
+ Values.clear(); // Clear out function local definitions
+ Types.clear();
+ CurrentModule = 0;
+ }
+
+ // GetForwardRefForGlobal - Check to see if there is a forward reference
+ // for this global. If so, remove it from the GlobalRefs map and return it.
+ // If not, just return null.
+ GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) {
+ // Check to see if there is a forward reference to this global variable...
+ // if there is, eliminate it and patch the reference to use the new def'n.
+ GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID));
+ GlobalValue *Ret = 0;
+ if (I != GlobalRefs.end()) {
+ Ret = I->second;
+ GlobalRefs.erase(I);
}
- return UnresolvedTy;
+ return Ret;
}
+ void setEndianness(Module::Endianness E) { Endian = E; }
+ void setPointerSize(Module::PointerSize sz) { PointerSize = sz; }
+} CurModule;
- unsigned getUpRefNum() const {
- assert(oldTy == UpRefTy && "Can't getUpRefNum on non upreference");
- return atoi(&((getNewTy().c_str())[1])); // skip the slash
- }
+Module::Endianness PerModuleInfo::Endian = Module::AnyEndianness;
+Module::PointerSize PerModuleInfo::PointerSize = Module::AnyPointerSize;
- typedef std::vector<const Type*> UpRefStack;
- void getSignedness(unsigned &sNum, unsigned &uNum, UpRefStack& stk) const;
- std::string makeUniqueName(const std::string& BaseName) const;
+static struct PerFunctionInfo {
+ Function *CurrentFunction; // Pointer to current function being created
- const std::string& getNewTy() const { return newTy; }
- const Type* getResultType() const { return resultTy; }
- const Type* getElementType() const { return elemTy; }
+ std::map<const Type*, ValueList> Values; // Keep track of #'d definitions
+ std::map<const Type*, ValueList> LateResolveValues;
+ bool isDeclare; // Is this function a forward declararation?
+ GlobalValue::LinkageTypes Linkage;// Linkage for forward declaration.
- const Type* getPointerType() const {
- return get(newTy + "*", PointerTy, this, (Type*)0);
- }
+ /// BBForwardRefs - When we see forward references to basic blocks, keep
+ /// track of them here.
+ std::map<BasicBlock*, std::pair<ValID, int> > BBForwardRefs;
+ std::vector<BasicBlock*> NumberedBlocks;
+ RenameMapType RenameMap;
+ std::set<Value*> SignedValues;
+ unsigned NextBBNum;
- bool isUnresolved() const { return oldTy == UnresolvedTy; }
- bool isUpReference() const { return oldTy == UpRefTy; }
- bool isVoid() const { return oldTy == VoidTy; }
- bool isBool() const { return oldTy == BoolTy; }
- bool isSigned() const {
- return oldTy == SByteTy || oldTy == ShortTy ||
- oldTy == IntTy || oldTy == LongTy;
+ inline PerFunctionInfo() {
+ CurrentFunction = 0;
+ isDeclare = false;
+ Linkage = GlobalValue::ExternalLinkage;
}
- bool isUnsigned() const {
- return oldTy == UByteTy || oldTy == UShortTy ||
- oldTy == UIntTy || oldTy == ULongTy;
- }
- bool isSignless() const { return !isSigned() && !isUnsigned(); }
- bool isInteger() const { return isSigned() || isUnsigned(); }
- bool isIntegral() const { return oldTy == BoolTy || isInteger(); }
- bool isFloatingPoint() const { return oldTy == DoubleTy || oldTy == FloatTy; }
- bool isPacked() const { return oldTy == PackedTy; }
- bool isPointer() const { return oldTy == PointerTy; }
- bool isStruct() const { return oldTy == StructTy || oldTy == PackedStructTy; }
- bool isArray() const { return oldTy == ArrayTy; }
- bool isOther() const {
- return !isPacked() && !isPointer() && !isFloatingPoint() && !isIntegral(); }
- bool isFunction() const { return oldTy == FunctionTy; }
- bool isComposite() const {
- return isStruct() || isPointer() || isArray() || isPacked();
+ inline void FunctionStart(Function *M) {
+ CurrentFunction = M;
+ NextBBNum = 0;
}
- bool isAttributeCandidate() const {
- return isIntegral() && getBitWidth() < 32;
+ void FunctionDone() {
+ NumberedBlocks.clear();
+
+ // Any forward referenced blocks left?
+ if (!BBForwardRefs.empty()) {
+ error("Undefined reference to label " +
+ BBForwardRefs.begin()->first->getName());
+ return;
+ }
+
+ // Resolve all forward references now.
+ ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues);
+
+ Values.clear(); // Clear out function local definitions
+ RenameMap.clear();
+ SignedValues.clear();
+ CurrentFunction = 0;
+ isDeclare = false;
+ Linkage = GlobalValue::ExternalLinkage;
}
+} CurFun; // Info for the current function...
- bool isUnresolvedDeep() const;
+static bool inFunctionScope() { return CurFun.CurrentFunction != 0; }
- unsigned getBitWidth() const;
- const Type* getIndexedType(const Value* V) const;
+//===----------------------------------------------------------------------===//
+// Code to handle definitions of all the types
+//===----------------------------------------------------------------------===//
+
+static int InsertValue(Value *V,
+ std::map<const Type*,ValueList> &ValueTab = CurFun.Values) {
+ if (V->hasName()) return -1; // Is this a numbered definition?
- unsigned getNumStructElements() const {
- return (elements ? elements->size() : 0);
- }
+ // Yes, insert the value into the value table...
+ ValueList &List = ValueTab[V->getType()];
+ List.push_back(V);
+ return List.size()-1;
+}
- const Type* getElement(unsigned idx) const {
- if (elements)
- if (idx < elements->size())
- return (*elements)[idx];
+static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
+ switch (D.Type) {
+ case ValID::NumberVal: // Is it a numbered definition?
+ // Module constants occupy the lowest numbered slots...
+ if ((unsigned)D.Num < CurModule.Types.size()) {
+ return CurModule.Types[(unsigned)D.Num];
+ }
+ break;
+ case ValID::NameVal: // Is it a named definition?
+ if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
+ D.destroy(); // Free old strdup'd memory...
+ return N;
+ }
+ break;
+ default:
+ error("Internal parser error: Invalid symbol type reference");
return 0;
}
-private:
- Type()
- : newTy(), oldTy(UnresolvedTy), elemTy(0), resultTy(0), elements(0),
- nelems(0) {
+ // If we reached here, we referenced either a symbol that we don't know about
+ // or an id number that hasn't been read yet. We may be referencing something
+ // forward, so just create an entry to be resolved later and get to it...
+ //
+ if (DoNotImprovise) return 0; // Do we just want a null to be returned?
+
+
+ if (inFunctionScope()) {
+ if (D.Type == ValID::NameVal) {
+ error("Reference to an undefined type: '" + D.getName() + "'");
+ return 0;
+ } else {
+ error("Reference to an undefined type: #" + itostr(D.Num));
+ return 0;
+ }
}
- Type(const Type& that); // do not implement
- Type& operator=(const Type& that); // do not implement
+ std::map<ValID, PATypeHolder>::iterator I =CurModule.LateResolveTypes.find(D);
+ if (I != CurModule.LateResolveTypes.end())
+ return I->second;
- ~Type() { delete elements; }
+ Type *Typ = OpaqueType::get();
+ CurModule.LateResolveTypes.insert(std::make_pair(D, Typ));
+ return Typ;
+ }
- struct ltfunctor
- {
- bool operator()(const Type* X, const Type* Y) const {
- assert(X && "Can't compare null pointer");
- assert(Y && "Can't compare null pointer");
- return *X < *Y;
+// getExistingValue - Look up the value specified by the provided type and
+// the provided ValID. If the value exists and has already been defined, return
+// it. Otherwise return null.
+//
+static Value *getExistingValue(const Type *Ty, const ValID &D) {
+ if (isa<FunctionType>(Ty)) {
+ error("Functions are not values and must be referenced as pointers");
+ }
+
+ switch (D.Type) {
+ case ValID::NumberVal: { // Is it a numbered definition?
+ unsigned Num = (unsigned)D.Num;
+
+ // Module constants occupy the lowest numbered slots...
+ std::map<const Type*,ValueList>::iterator VI = CurModule.Values.find(Ty);
+ if (VI != CurModule.Values.end()) {
+ if (Num < VI->second.size())
+ return VI->second[Num];
+ Num -= VI->second.size();
}
- };
- typedef std::set<const Type*, ltfunctor> TypeRegMap;
-
- static const Type* add_new_type(Type* existing);
-
- std::string newTy;
- TypeIDs oldTy;
- Type *elemTy;
- Type *resultTy;
- TypeList *elements;
- uint64_t nelems;
- static TypeRegMap registry;
-public:
- typedef std::vector<const Type*> TypeVector;
- typedef std::map<std::string,const Type*> TypeMap;
- typedef std::map<const Type*,std::string> TypePlaneMap;
- typedef std::map<std::string,TypePlaneMap> GlobalsTypeMap;
- static TypeVector EnumeratedTypes;
- static TypeMap NamedTypes;
- static GlobalsTypeMap Globals;
-};
-
-Type::TypeRegMap Type::registry;
-Type::TypeVector Type::EnumeratedTypes;
-Type::TypeMap Type::NamedTypes;
-Type::GlobalsTypeMap Type::Globals;
-
-const Type* Type::get(const std::string &newType, TypeIDs oldType) {
- Type* Ty = new Type();
- Ty->newTy = newType;
- Ty->oldTy = oldType;
- return add_new_type(Ty);
-}
+ // Make sure that our type is within bounds
+ VI = CurFun.Values.find(Ty);
+ if (VI == CurFun.Values.end()) return 0;
-const Type* Type::get(const std::string& newType, TypeIDs oldType,
- const Type* eTy, const Type* rTy) {
- Type* Ty= new Type();
- Ty->newTy = newType;
- Ty->oldTy = oldType;
- Ty->elemTy = const_cast<Type*>(eTy);
- Ty->resultTy = const_cast<Type*>(rTy);
- return add_new_type(Ty);
-}
+ // Check that the number is within bounds...
+ if (VI->second.size() <= Num) return 0;
-const Type* Type::get(const std::string& newType, TypeIDs oldType,
- const Type *eTy, uint64_t elems) {
- Type* Ty = new Type();
- Ty->newTy = newType;
- Ty->oldTy = oldType;
- Ty->elemTy = const_cast<Type*>(eTy);
- Ty->nelems = elems;
- return add_new_type(Ty);
-}
+ return VI->second[Num];
+ }
-const Type* Type::get(const std::string& newType, TypeIDs oldType,
- TypeList* TL) {
- Type* Ty = new Type();
- Ty->newTy = newType;
- Ty->oldTy = oldType;
- Ty->elements = TL;
- return add_new_type(Ty);
+ case ValID::NameVal: { // Is it a named definition?
+ // Get the name out of the ID
+ std::string Name(D.Name);
+ Value* V = 0;
+ RenameMapKey Key = std::make_pair(Name, Ty);
+ if (inFunctionScope()) {
+ // See if the name was renamed
+ RenameMapType::const_iterator I = CurFun.RenameMap.find(Key);
+ std::string LookupName;
+ if (I != CurFun.RenameMap.end())
+ LookupName = I->second;
+ else
+ LookupName = Name;
+ SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
+ V = SymTab.lookup(Ty, LookupName);
+ }
+ if (!V) {
+ RenameMapType::const_iterator I = CurModule.RenameMap.find(Key);
+ std::string LookupName;
+ if (I != CurModule.RenameMap.end())
+ LookupName = I->second;
+ else
+ LookupName = Name;
+ V = CurModule.CurrentModule->getValueSymbolTable().lookup(Ty, LookupName);
+ }
+ if (V == 0)
+ return 0;
+
+ D.destroy(); // Free old strdup'd memory...
+ return V;
+ }
+
+ // Check to make sure that "Ty" is an integral type, and that our
+ // value will fit into the specified type...
+ case ValID::ConstSIntVal: // Is it a constant pool reference??
+ if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
+ error("Signed integral constant '" + itostr(D.ConstPool64) +
+ "' is invalid for type '" + Ty->getDescription() + "'");
+ }
+ return ConstantInt::get(Ty, D.ConstPool64);
+
+ case ValID::ConstUIntVal: // Is it an unsigned const pool reference?
+ if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
+ if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64))
+ error("Integral constant '" + utostr(D.UConstPool64) +
+ "' is invalid or out of range");
+ else // This is really a signed reference. Transmogrify.
+ return ConstantInt::get(Ty, D.ConstPool64);
+ } else
+ return ConstantInt::get(Ty, D.UConstPool64);
+
+ case ValID::ConstFPVal: // Is it a floating point const pool reference?
+ if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP))
+ error("FP constant invalid for type");
+ return ConstantFP::get(Ty, D.ConstPoolFP);
+
+ case ValID::ConstNullVal: // Is it a null value?
+ if (!isa<PointerType>(Ty))
+ error("Cannot create a a non pointer null");
+ return ConstantPointerNull::get(cast<PointerType>(Ty));
+
+ case ValID::ConstUndefVal: // Is it an undef value?
+ return UndefValue::get(Ty);
+
+ case ValID::ConstZeroVal: // Is it a zero value?
+ return Constant::getNullValue(Ty);
+
+ case ValID::ConstantVal: // Fully resolved constant?
+ if (D.ConstantValue->getType() != Ty)
+ error("Constant expression type different from required type");
+ return D.ConstantValue;
+
+ case ValID::InlineAsmVal: { // Inline asm expression
+ const PointerType *PTy = dyn_cast<PointerType>(Ty);
+ const FunctionType *FTy =
+ PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
+ if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints))
+ error("Invalid type for asm constraint string");
+ InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
+ D.IAD->HasSideEffects);
+ D.destroy(); // Free InlineAsmDescriptor.
+ return IA;
+ }
+ default:
+ assert(0 && "Unhandled case");
+ return 0;
+ } // End of switch
+
+ assert(0 && "Unhandled case");
+ return 0;
}
-const Type* Type::get(const std::string& newType, const Type* resTy,
- TypeList* TL) {
- Type* Ty = new Type();
- Ty->newTy = newType;
- Ty->oldTy = FunctionTy;
- Ty->resultTy = const_cast<Type*>(resTy);
- Ty->elements = TL;
- return add_new_type(Ty);
+// getVal - This function is identical to getExistingValue, except that if a
+// value is not already defined, it "improvises" by creating a placeholder var
+// that looks and acts just like the requested variable. When the value is
+// defined later, all uses of the placeholder variable are replaced with the
+// real thing.
+//
+static Value *getVal(const Type *Ty, const ValID &ID) {
+ if (Ty == Type::LabelTy)
+ error("Cannot use a basic block here");
+
+ // See if the value has already been defined.
+ Value *V = getExistingValue(Ty, ID);
+ if (V) return V;
+
+ if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty))
+ error("Invalid use of a composite type");
+
+ // If we reached here, we referenced either a symbol that we don't know about
+ // or an id number that hasn't been read yet. We may be referencing something
+ // forward, so just create an entry to be resolved later and get to it...
+ assert(!isa<SignedType>(Ty) && "Can't create value with SignedType");
+ V = new Argument(Ty);
+
+ // Remember where this forward reference came from. FIXME, shouldn't we try
+ // to recycle these things??
+ CurModule.PlaceHolderInfo.insert(
+ std::make_pair(V, std::make_pair(ID, Upgradelineno-1)));
+
+ if (inFunctionScope())
+ InsertValue(V, CurFun.LateResolveValues);
+ else
+ InsertValue(V, CurModule.LateResolveValues);
+ return V;
}
-const Type* Type::resolve() const {
- if (isUnresolved()) {
- if (getNewTy()[0] == '%' && isdigit(newTy[1])) {
- unsigned ref = atoi(&((newTy.c_str())[1])); // skip the %
- if (ref < EnumeratedTypes.size()) {
- return EnumeratedTypes[ref];
- } else {
- std::string msg("Can't resolve numbered type: ");
- msg += getNewTy();
- yyerror(msg.c_str());
- }
- } else {
- Type::TypeMap::iterator I = NamedTypes.find(newTy);
- if (I != NamedTypes.end()) {
- return I->second;
- } else {
- std::string msg("Cannot resolve type: ");
- msg += getNewTy();
- yyerror(msg.c_str());
- }
+/// getBBVal - This is used for two purposes:
+/// * If isDefinition is true, a new basic block with the specified ID is being
+/// defined.
+/// * If isDefinition is true, this is a reference to a basic block, which may
+/// or may not be a forward reference.
+///
+static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {
+ assert(inFunctionScope() && "Can't get basic block at global scope");
+
+ std::string Name;
+ BasicBlock *BB = 0;
+ switch (ID.Type) {
+ default:
+ error("Illegal label reference " + ID.getName());
+ break;
+ case ValID::NumberVal: // Is it a numbered definition?
+ if (unsigned(ID.Num) >= CurFun.NumberedBlocks.size())
+ CurFun.NumberedBlocks.resize(ID.Num+1);
+ BB = CurFun.NumberedBlocks[ID.Num];
+ break;
+ case ValID::NameVal: // Is it a named definition?
+ Name = ID.Name;
+ if (Value *N = CurFun.CurrentFunction->
+ getValueSymbolTable().lookup(Type::LabelTy, Name)) {
+ if (N->getType() != Type::LabelTy)
+ error("Name '" + Name + "' does not refer to a BasicBlock");
+ BB = cast<BasicBlock>(N);
}
+ break;
}
- // otherwise its already resolved.
- return this;
-}
-bool Type::operator<(const Type& 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 Type* thisTy = this->elemTy;
- const Type* thatTy = that.elemTy;
- return *thisTy < *thatTy;
- }
- case FunctionTy: {
- const Type* thisTy = this->resultTy;
- const Type* 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 Type* thisTy = (*this->elements)[i];
- const Type* thatTy = (*that.elements)[i];
- if (!thisTy->sameOldTyAs(thatTy))
- return *thisTy < *thatTy;
- }
- break;
- }
- case UnresolvedTy:
- return this->newTy < that.newTy;
- default:
- break;
+ // See if the block has already been defined.
+ if (BB) {
+ // If this is the definition of the block, make sure the existing value was
+ // just a forward reference. If it was a forward reference, there will be
+ // an entry for it in the PlaceHolderInfo map.
+ if (isDefinition && !CurFun.BBForwardRefs.erase(BB))
+ // The existing value was a definition, not a forward reference.
+ error("Redefinition of label " + ID.getName());
+
+ ID.destroy(); // Free strdup'd memory.
+ return BB;
}
- return false;
+
+ // Otherwise this block has not been seen before.
+ BB = new BasicBlock("", CurFun.CurrentFunction);
+ if (ID.Type == ValID::NameVal) {
+ BB->setName(ID.Name);
+ } else {
+ CurFun.NumberedBlocks[ID.Num] = BB;
+ }
+
+ // If this is not a definition, keep track of it so we can use it as a forward
+ // reference.
+ if (!isDefinition) {
+ // Remember where this forward reference came from.
+ CurFun.BBForwardRefs[BB] = std::make_pair(ID, Upgradelineno);
+ } else {
+ // The forward declaration could have been inserted anywhere in the
+ // function: insert it into the correct place now.
+ CurFun.CurrentFunction->getBasicBlockList().remove(BB);
+ CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
+ }
+ ID.destroy();
+ return BB;
}
-bool Type::sameOldTyAs(const Type* 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 Type* thisTy = this->elemTy;
- const Type* thatTy = that->elemTy;
- return thisTy->sameOldTyAs(thatTy);
- }
- case FunctionTy: {
- const Type* thisTy = this->resultTy;
- const Type* 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 Type* thisTy = (*this->elements)[i];
- const Type* thatTy = (*that->elements)[i];
- if (!thisTy->sameOldTyAs(thatTy))
- return false;
+
+//===----------------------------------------------------------------------===//
+// Code to handle forward references in instructions
+//===----------------------------------------------------------------------===//
+//
+// This code handles the late binding needed with statements that reference
+// values not defined yet... for example, a forward branch, or the PHI node for
+// a loop body.
+//
+// This keeps a table (CurFun.LateResolveValues) of all such forward references
+// and back patchs after we are done.
+//
+
+// ResolveDefinitions - If we could not resolve some defs at parsing
+// time (forward branches, phi functions for loops, etc...) resolve the
+// defs now...
+//
+static void
+ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
+ std::map<const Type*,ValueList> *FutureLateResolvers) {
+ // Loop over LateResolveDefs fixing up stuff that couldn't be resolved
+ for (std::map<const Type*,ValueList>::iterator LRI = LateResolvers.begin(),
+ E = LateResolvers.end(); LRI != E; ++LRI) {
+ ValueList &List = LRI->second;
+ while (!List.empty()) {
+ Value *V = List.back();
+ List.pop_back();
+
+ std::map<Value*, std::pair<ValID, int> >::iterator PHI =
+ CurModule.PlaceHolderInfo.find(V);
+ assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error");
+
+ ValID &DID = PHI->second.first;
+
+ Value *TheRealValue = getExistingValue(LRI->first, DID);
+ if (TheRealValue) {
+ V->replaceAllUsesWith(TheRealValue);
+ delete V;
+ CurModule.PlaceHolderInfo.erase(PHI);
+ } else if (FutureLateResolvers) {
+ // Functions have their unresolved items forwarded to the module late
+ // resolver table
+ InsertValue(V, *FutureLateResolvers);
+ } else {
+ if (DID.Type == ValID::NameVal) {
+ error("Reference to an invalid definition: '" +DID.getName()+
+ "' of type '" + V->getType()->getDescription() + "'",
+ PHI->second.second);
+ return;
+ } else {
+ error("Reference to an invalid definition: #" +
+ itostr(DID.Num) + " of type '" +
+ V->getType()->getDescription() + "'", PHI->second.second);
+ return;
+ }
}
- return true;
}
- case UnresolvedTy:
- return this->newTy == that->newTy;
- default:
- return true; // for all others oldTy == that->oldTy is sufficient
}
- return true;
+
+ LateResolvers.clear();
}
-bool Type::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;
+// ResolveTypeTo - A brand new type was just declared. This means that (if
+// name is not null) things referencing Name can be resolved. Otherwise, things
+// refering to the number can be resolved. Do this now.
+//
+static void ResolveTypeTo(char *Name, const Type *ToTy) {
+ ValID D;
+ if (Name) D = ValID::create(Name);
+ else D = ValID::create((int)CurModule.Types.size());
+
+ std::map<ValID, PATypeHolder>::iterator I =
+ CurModule.LateResolveTypes.find(D);
+ if (I != CurModule.LateResolveTypes.end()) {
+ ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy);
+ CurModule.LateResolveTypes.erase(I);
}
}
-unsigned Type::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();
+static std::string makeNameUnique(const std::string& Name) {
+ static unsigned UniqueNameCounter = 1;
+ std::string Result(Name);
+ Result += ".upgrd." + llvm::utostr(UniqueNameCounter++);
+ return Result;
+}
+
+// setValueName - Set the specified value to the name given. The name may be
+// null potentially, in which case this is a noop. The string passed in is
+// assumed to be a malloc'd string buffer, and is free'd by this function.
+//
+static void setValueName(Value *V, char *NameStr) {
+ if (NameStr) {
+ std::string Name(NameStr); // Copy string
+ free(NameStr); // Free old string
+
+ if (V->getType() == Type::VoidTy) {
+ error("Can't assign name '" + Name + "' to value with void type");
+ return;
+ }
+
+ assert(!isa<SignedType>(V->getType()) && "Shouldn't have SignedType Value");
+ assert(inFunctionScope() && "Must be in function scope");
+
+ // Search the function's symbol table for an existing value of this name
+ Value* Existing = 0;
+ SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
+ SymbolTable::plane_const_iterator PI = ST.plane_begin(), PE =ST.plane_end();
+ for ( ; PI != PE; ++PI) {
+ SymbolTable::value_const_iterator VI = PI->second.find(Name);
+ if (VI != PI->second.end()) {
+ Existing = VI->second;
+ break;
}
- return size;
}
+ if (Existing) {
+ if (Existing->getType() == V->getType()) {
+ // The type of the Existing value and the new one are the same. This
+ // is probably a type plane collapsing error. If the types involved
+ // are both integer, just rename it. Otherwise it
+ // is a redefinition error.
+ if (!Existing->getType()->isInteger()) {
+ error("Redefinition of value named '" + Name + "' in the '" +
+ V->getType()->getDescription() + "' type plane");
+ return;
+ }
+ }
+ // In LLVM 2.0 we don't allow names to be re-used for any values in a
+ // function, regardless of Type. Previously re-use of names was okay as
+ // long as they were distinct types. With type planes collapsing because
+ // of the signedness change and because of PR411, this can no longer be
+ // supported. We must search the entire symbol table for a conflicting
+ // name and make the name unique. No warning is needed as this can't
+ // cause a problem.
+ std::string NewName = makeNameUnique(Name);
+ // We're changing the name but it will probably be used by other
+ // instructions as operands later on. Consequently we have to retain
+ // a mapping of the renaming that we're doing.
+ RenameMapKey Key = std::make_pair(Name,V->getType());
+ CurFun.RenameMap[Key] = NewName;
+ Name = NewName;
+ }
+
+ // Set the name.
+ V->setName(Name);
}
}
-const Type* Type::getIndexedType(const Value* V) const {
- if (isStruct()) {
- if (V->isConstant() && V->type->isInteger()) {
- size_t pos = V->val->find(' ') + 1;
- if (pos < V->val->size()) {
- uint64_t idx = atoi(V->val->substr(pos).c_str());
- return (*elements)[idx];
+/// ParseGlobalVariable - Handle parsing of a global. If Initializer is null,
+/// this is a declaration, otherwise it is a definition.
+static GlobalVariable *
+ParseGlobalVariable(char *NameStr,GlobalValue::LinkageTypes Linkage,
+ bool isConstantGlobal, const Type *Ty,
+ Constant *Initializer) {
+ if (isa<FunctionType>(Ty))
+ error("Cannot declare global vars of function type");
+
+ const PointerType *PTy = PointerType::get(Ty);
+
+ std::string Name;
+ if (NameStr) {
+ Name = NameStr; // Copy string
+ free(NameStr); // Free old string
+ }
+
+ // See if this global value was forward referenced. If so, recycle the
+ // object.
+ ValID ID;
+ if (!Name.empty()) {
+ ID = ValID::create((char*)Name.c_str());
+ } else {
+ ID = ValID::create((int)CurModule.Values[PTy].size());
+ }
+
+ if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) {
+ // Move the global to the end of the list, from whereever it was
+ // previously inserted.
+ GlobalVariable *GV = cast<GlobalVariable>(FWGV);
+ CurModule.CurrentModule->getGlobalList().remove(GV);
+ CurModule.CurrentModule->getGlobalList().push_back(GV);
+ GV->setInitializer(Initializer);
+ GV->setLinkage(Linkage);
+ GV->setConstant(isConstantGlobal);
+ InsertValue(GV, CurModule.Values);
+ return GV;
+ }
+
+ // If this global has a name, check to see if there is already a definition
+ // of this global in the module and emit warnings if there are conflicts.
+ if (!Name.empty()) {
+ // The global has a name. See if there's an existing one of the same name.
+ if (CurModule.CurrentModule->getNamedGlobal(Name)) {
+ // We found an existing global ov the same name. This isn't allowed
+ // in LLVM 2.0. Consequently, we must alter the name of the global so it
+ // can at least compile. This can happen because of type planes
+ // There is alread a global of the same name which means there is a
+ // conflict. Let's see what we can do about it.
+ std::string NewName(makeNameUnique(Name));
+ if (Linkage == GlobalValue::InternalLinkage) {
+ // The linkage type is internal so just warn about the rename without
+ // invoking "scarey language" about linkage failures. GVars with
+ // InternalLinkage can be renamed at will.
+ warning("Global variable '" + Name + "' was renamed to '"+
+ NewName + "'");
} else {
- yyerror("Invalid value for constant integer");
- return 0;
+ // 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.
+ warning("Renaming global variable '" + Name + "' to '" + NewName +
+ "' may cause linkage errors");
}
- } else {
- yyerror("Structure requires constant index");
- return 0;
+
+ // Put the renaming in the global rename map
+ RenameMapKey Key = std::make_pair(Name,PointerType::get(Ty));
+ CurModule.RenameMap[Key] = NewName;
+
+ // Rename it
+ Name = NewName;
}
}
- if (isArray() || isPacked() || isPointer())
- return elemTy;
- yyerror("Invalid type for getIndexedType");
- return 0;
+
+ // Otherwise there is no existing GV to use, create one now.
+ GlobalVariable *GV =
+ new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
+ CurModule.CurrentModule);
+ InsertValue(GV, CurModule.Values);
+ return GV;
}
-void Type::getSignedness(unsigned &sNum, unsigned &uNum,
- UpRefStack& stack) const {
- switch (oldTy) {
- default:
- case OpaqueTy: case LabelTy: case VoidTy: case BoolTy:
- case FloatTy : case DoubleTy: case UpRefTy:
- return;
- case SByteTy: case ShortTy: case LongTy: case IntTy:
- sNum++;
- return;
- case UByteTy: case UShortTy: case UIntTy: case ULongTy:
- uNum++;
- return;
- case PointerTy:
- case PackedTy:
- case ArrayTy:
- stack.push_back(this);
- elemTy->getSignedness(sNum, uNum, stack);
- return;
- case StructTy:
- case PackedStructTy: {
- stack.push_back(this);
- for (unsigned i = 0; i < elements->size(); i++) {
- (*elements)[i]->getSignedness(sNum, uNum, stack);
- }
- return;
- }
- case UnresolvedTy: {
- const Type* Ty = this->resolve();
- // Let's not recurse.
- UpRefStack::const_iterator I = stack.begin(), E = stack.end();
- for ( ; I != E && *I != Ty; ++I)
- ;
- if (I == E)
- Ty->getSignedness(sNum, uNum, stack);
- return;
+// setTypeName - Set the specified type to the name given. The name may be
+// null potentially, in which case this is a noop. The string passed in is
+// assumed to be a malloc'd string buffer, and is freed by this function.
+//
+// This function returns true if the type has already been defined, but is
+// allowed to be redefined in the specified context. If the name is a new name
+// for the type plane, it is inserted and false is returned.
+static bool setTypeName(const Type *T, char *NameStr) {
+ assert(!inFunctionScope() && "Can't give types function-local names");
+ if (NameStr == 0) return false;
+
+ std::string Name(NameStr); // Copy string
+ free(NameStr); // Free old string
+
+ // We don't allow assigning names to void type
+ if (T == Type::VoidTy) {
+ error("Can't assign name '" + Name + "' to the void type");
+ return false;
+ }
+
+ // Set the type name, checking for conflicts as we do so.
+ bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T);
+
+ if (AlreadyExists) { // Inserting a name that is already defined???
+ const Type *Existing = CurModule.CurrentModule->getTypeByName(Name);
+ assert(Existing && "Conflict but no matching type?");
+
+ // There is only one case where this is allowed: when we are refining an
+ // opaque type. In this case, Existing will be an opaque type.
+ if (const OpaqueType *OpTy = dyn_cast<OpaqueType>(Existing)) {
+ // We ARE replacing an opaque type!
+ const_cast<OpaqueType*>(OpTy)->refineAbstractTypeTo(T);
+ return true;
}
+
+ // Otherwise, this is an attempt to redefine a type. That's okay if
+ // the redefinition is identical to the original. This will be so if
+ // Existing and T point to the same Type object. In this one case we
+ // allow the equivalent redefinition.
+ if (Existing == T) return true; // Yes, it's equal.
+
+ // Any other kind of (non-equivalent) redefinition is an error.
+ error("Redefinition of type named '" + Name + "' in the '" +
+ T->getDescription() + "' type plane");
}
+
+ return false;
}
-std::string AddSuffix(const std::string& Name, const std::string& Suffix) {
- if (Name[Name.size()-1] == '"') {
- std::string Result = Name;
- Result.insert(Result.size()-1, Suffix);
- return Result;
- }
- return Name + Suffix;
+//===----------------------------------------------------------------------===//
+// Code for handling upreferences in type names...
+//
+
+// TypeContains - Returns true if Ty directly contains E in it.
+//
+static bool TypeContains(const Type *Ty, const Type *E) {
+ return std::find(Ty->subtype_begin(), Ty->subtype_end(),
+ E) != Ty->subtype_end();
}
-std::string Type::makeUniqueName(const std::string& BaseName) const {
- if (BaseName == "\"alloca point\"")
- return BaseName;
- switch (oldTy) {
- default:
- break;
- case OpaqueTy: case LabelTy: case VoidTy: case BoolTy: case UpRefTy:
- case FloatTy : case DoubleTy: case UnresolvedTy:
- return BaseName;
- case SByteTy: case ShortTy: case LongTy: case IntTy:
- return AddSuffix(BaseName, ".s");
- case UByteTy: case UShortTy: case UIntTy: case ULongTy:
- return AddSuffix(BaseName, ".u");
- }
-
- unsigned uNum = 0, sNum = 0;
- std::string Suffix;
- switch (oldTy) {
- case PointerTy:
- case PackedTy:
- case ArrayTy: {
- Type::UpRefStack stack;
- elemTy->resolve()->getSignedness(sNum, uNum, stack);
- break;
- }
- case StructTy:
- case PackedStructTy: {
- for (unsigned i = 0; i < elements->size(); i++) {
- Type::UpRefStack stack;
- (*elements)[i]->resolve()->getSignedness(sNum, uNum, stack);
+namespace {
+ struct UpRefRecord {
+ // NestingLevel - The number of nesting levels that need to be popped before
+ // this type is resolved.
+ unsigned NestingLevel;
+
+ // LastContainedTy - This is the type at the current binding level for the
+ // type. Every time we reduce the nesting level, this gets updated.
+ const Type *LastContainedTy;
+
+ // UpRefTy - This is the actual opaque type that the upreference is
+ // represented with.
+ OpaqueType *UpRefTy;
+
+ UpRefRecord(unsigned NL, OpaqueType *URTy)
+ : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {}
+ };
+}
+
+// UpRefs - A list of the outstanding upreferences that need to be resolved.
+static std::vector<UpRefRecord> UpRefs;
+
+/// HandleUpRefs - Every time we finish a new layer of types, this function is
+/// called. It loops through the UpRefs vector, which is a list of the
+/// currently active types. For each type, if the up reference is contained in
+/// the newly completed type, we decrement the level count. When the level
+/// count reaches zero, the upreferenced type is the type that is passed in:
+/// thus we can complete the cycle.
+///
+static PATypeHolder HandleUpRefs(const Type *ty) {
+ // If Ty isn't abstract, or if there are no up-references in it, then there is
+ // nothing to resolve here.
+ if (!ty->isAbstract() || UpRefs.empty()) return ty;
+
+ PATypeHolder Ty(ty);
+ UR_OUT("Type '" << Ty->getDescription() <<
+ "' newly formed. Resolving upreferences.\n" <<
+ UpRefs.size() << " upreferences active!\n");
+
+ // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
+ // to zero), we resolve them all together before we resolve them to Ty. At
+ // the end of the loop, if there is anything to resolve to Ty, it will be in
+ // this variable.
+ OpaqueType *TypeToResolve = 0;
+
+ for (unsigned i = 0; i != UpRefs.size(); ++i) {
+ UR_OUT(" UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
+ << UpRefs[i].second->getDescription() << ") = "
+ << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n");
+ if (TypeContains(Ty, UpRefs[i].LastContainedTy)) {
+ // Decrement level of upreference
+ unsigned Level = --UpRefs[i].NestingLevel;
+ UpRefs[i].LastContainedTy = Ty;
+ UR_OUT(" Uplevel Ref Level = " << Level << "\n");
+ if (Level == 0) { // Upreference should be resolved!
+ if (!TypeToResolve) {
+ TypeToResolve = UpRefs[i].UpRefTy;
+ } else {
+ UR_OUT(" * Resolving upreference for "
+ << UpRefs[i].second->getDescription() << "\n";
+ std::string OldName = UpRefs[i].UpRefTy->getDescription());
+ UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
+ UR_OUT(" * Type '" << OldName << "' refined upreference to: "
+ << (const void*)Ty << ", " << Ty->getDescription() << "\n");
+ }
+ UpRefs.erase(UpRefs.begin()+i); // Remove from upreference list...
+ --i; // Do not skip the next element...
}
- break;
}
- default:
- assert(0 && "Invalid Type");
- break;
}
- if (sNum == 0 && uNum == 0)
- return BaseName;
-
- switch (oldTy) {
- default: Suffix += ".nada"; break;
- case PointerTy: Suffix += ".pntr"; break;
- case PackedTy: Suffix += ".pckd"; break;
- case ArrayTy: Suffix += ".arry"; break;
- case StructTy: Suffix += ".strc"; break;
- case PackedStructTy: Suffix += ".pstr"; break;
+ if (TypeToResolve) {
+ UR_OUT(" * Resolving upreference for "
+ << UpRefs[i].second->getDescription() << "\n";
+ std::string OldName = TypeToResolve->getDescription());
+ TypeToResolve->refineAbstractTypeTo(Ty);
}
- Suffix += ".s" + llvm::utostr(sNum);
- Suffix += ".u" + llvm::utostr(uNum);
- return AddSuffix(BaseName, Suffix);
+ return Ty;
}
-Type& Type::operator=(const Type& 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;
+static inline Instruction::TermOps
+getTermOp(TermOps op) {
+ switch (op) {
+ default : assert(0 && "Invalid OldTermOp");
+ case RetOp : return Instruction::Ret;
+ case BrOp : return Instruction::Br;
+ case SwitchOp : return Instruction::Switch;
+ case InvokeOp : return Instruction::Invoke;
+ case UnwindOp : return Instruction::Unwind;
+ case UnreachableOp: return Instruction::Unreachable;
}
- return *this;
}
-const Type* Type::add_new_type(Type* newTy) {
- TypeRegMap::iterator I = registry.find(newTy);
- if (I != registry.end()) {
- delete newTy;
- return *I;
+static inline Instruction::BinaryOps
+getBinaryOp(BinaryOps op, const Type *Ty, Signedness Sign) {
+ switch (op) {
+ default : assert(0 && "Invalid OldBinaryOps");
+ case SetEQ :
+ case SetNE :
+ case SetLE :
+ case SetGE :
+ case SetLT :
+ case SetGT : assert(0 && "Should use getCompareOp");
+ case AddOp : return Instruction::Add;
+ case SubOp : return Instruction::Sub;
+ case MulOp : return Instruction::Mul;
+ case DivOp : {
+ // This is an obsolete instruction so we must upgrade it based on the
+ // types of its operands.
+ bool isFP = Ty->isFloatingPoint();
+ if (const PackedType* PTy = dyn_cast<PackedType>(Ty))
+ // If its a packed type we want to use the element type
+ isFP = PTy->getElementType()->isFloatingPoint();
+ if (isFP)
+ return Instruction::FDiv;
+ else if (Sign == Signed)
+ return Instruction::SDiv;
+ return Instruction::UDiv;
+ }
+ case UDivOp : return Instruction::UDiv;
+ case SDivOp : return Instruction::SDiv;
+ case FDivOp : return Instruction::FDiv;
+ case RemOp : {
+ // This is an obsolete instruction so we must upgrade it based on the
+ // types of its operands.
+ bool isFP = Ty->isFloatingPoint();
+ if (const PackedType* PTy = dyn_cast<PackedType>(Ty))
+ // If its a packed type we want to use the element type
+ isFP = PTy->getElementType()->isFloatingPoint();
+ // Select correct opcode
+ if (isFP)
+ return Instruction::FRem;
+ else if (Sign == Signed)
+ return Instruction::SRem;
+ return Instruction::URem;
+ }
+ case URemOp : return Instruction::URem;
+ case SRemOp : return Instruction::SRem;
+ case FRemOp : return Instruction::FRem;
+ case AndOp : return Instruction::And;
+ case OrOp : return Instruction::Or;
+ case XorOp : return Instruction::Xor;
}
- registry.insert(newTy);
- return newTy;
}
-class Instruction {
-};
-
-/// This type is used to keep track of the signedness of constants.
-struct Constant {
- std::string *cnst;
- const Type *type;
- ~Constant() { delete cnst; }
-};
-
-/// This variable provides a counter for unique names. It is used in various
-/// productions to ensure a unique name is generated.
-static uint64_t UniqueNameCounter = 1;
-
-// This is set when a DECLARE keyword is recognized so that subsequent parsing
-// of a function prototype can know if its a declaration or definition.
-static bool isDeclare = false;
-
-// This bool is used to communicate between the InstVal and Inst rules about
-// whether or not a cast should be deleted. When the flag is set, InstVal has
-// determined that the cast is a candidate. However, it can only be deleted if
-// the value being casted is the same value name as the instruction. The Inst
-// rule makes that comparison if the flag is set and comments out the
-// instruction if they match.
-static bool deleteUselessCastFlag = false;
-static std::string* deleteUselessCastName = 0;
-
-
-
-const char* getCastOpcode(std::string& Source, const Type* SrcTy,
- const Type* DstTy) {
- unsigned SrcBits = SrcTy->getBitWidth();
- unsigned DstBits = DstTy->getBitWidth();
- const char* opcode = "bitcast";
- // Run through the possibilities ...
- if (DstTy->isIntegral()) { // Casting to integral
- if (SrcTy->isIntegral()) { // Casting from integral
- if (DstBits < SrcBits)
- opcode = "trunc";
- else if (DstBits > SrcBits) { // its an extension
- if (SrcTy->isSigned())
- opcode ="sext"; // signed -> SEXT
+static inline Instruction::OtherOps
+getCompareOp(BinaryOps op, unsigned short &predicate, const Type* &Ty,
+ Signedness Sign) {
+ bool isSigned = Sign == Signed;
+ bool isFP = Ty->isFloatingPoint();
+ switch (op) {
+ default : assert(0 && "Invalid OldSetCC");
+ case SetEQ :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OEQ;
+ return Instruction::FCmp;
+ } else {
+ predicate = ICmpInst::ICMP_EQ;
+ return Instruction::ICmp;
+ }
+ case SetNE :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_UNE;
+ return Instruction::FCmp;
+ } else {
+ predicate = ICmpInst::ICMP_NE;
+ return Instruction::ICmp;
+ }
+ case SetLE :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OLE;
+ return Instruction::FCmp;
+ } else {
+ if (isSigned)
+ predicate = ICmpInst::ICMP_SLE;
+ else
+ predicate = ICmpInst::ICMP_ULE;
+ return Instruction::ICmp;
+ }
+ case SetGE :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OGE;
+ return Instruction::FCmp;
+ } else {
+ if (isSigned)
+ predicate = ICmpInst::ICMP_SGE;
else
- opcode = "zext"; // unsigned -> ZEXT
+ predicate = ICmpInst::ICMP_UGE;
+ return Instruction::ICmp;
+ }
+ case SetLT :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OLT;
+ return Instruction::FCmp;
} else {
- opcode = "bitcast"; // Same size, No-op cast
+ if (isSigned)
+ predicate = ICmpInst::ICMP_SLT;
+ else
+ predicate = ICmpInst::ICMP_ULT;
+ return Instruction::ICmp;
}
- } else if (SrcTy->isFloatingPoint()) { // Casting from floating pt
- if (DstTy->isSigned())
- opcode = "fptosi"; // FP -> sint
- else
- opcode = "fptoui"; // FP -> uint
- } else if (SrcTy->isPacked()) {
- assert(DstBits == SrcTy->getBitWidth() &&
- "Casting packed to integer of different width");
- opcode = "bitcast"; // same size, no-op cast
- } else {
- assert(SrcTy->isPointer() &&
- "Casting from a value that is not first-class type");
- opcode = "ptrtoint"; // ptr -> int
- }
- } else if (DstTy->isFloatingPoint()) { // Casting to floating pt
- if (SrcTy->isIntegral()) { // Casting from integral
- if (SrcTy->isSigned())
- opcode = "sitofp"; // sint -> FP
- else
- opcode = "uitofp"; // uint -> FP
- } else if (SrcTy->isFloatingPoint()) { // Casting from floating pt
- if (DstBits < SrcBits) {
- opcode = "fptrunc"; // FP -> smaller FP
- } else if (DstBits > SrcBits) {
- opcode = "fpext"; // FP -> larger FP
- } else {
- opcode ="bitcast"; // same size, no-op cast
+ case SetGT :
+ if (isFP) {
+ predicate = FCmpInst::FCMP_OGT;
+ return Instruction::FCmp;
+ } else {
+ if (isSigned)
+ predicate = ICmpInst::ICMP_SGT;
+ else
+ predicate = ICmpInst::ICMP_UGT;
+ return Instruction::ICmp;
}
- } else if (SrcTy->isPacked()) {
- assert(DstBits == SrcTy->getBitWidth() &&
- "Casting packed to floating point of different width");
- opcode = "bitcast"; // same size, no-op cast
- } else {
- assert(0 && "Casting pointer or non-first class to float");
- }
- } else if (DstTy->isPacked()) {
- if (SrcTy->isPacked()) {
- assert(DstTy->getBitWidth() == SrcTy->getBitWidth() &&
- "Casting packed to packed of different widths");
- opcode = "bitcast"; // packed -> packed
- } else if (DstTy->getBitWidth() == SrcBits) {
- opcode = "bitcast"; // float/int -> packed
- } else {
- assert(!"Illegal cast to packed (wrong type or size)");
- }
- } else if (DstTy->isPointer()) {
- if (SrcTy->isPointer()) {
- opcode = "bitcast"; // ptr -> ptr
- } else if (SrcTy->isIntegral()) {
- opcode = "inttoptr"; // int -> ptr
- } else {
- assert(!"Casting invalid type to pointer");
- }
- } else {
- assert(!"Casting to type that is not first-class");
}
- return opcode;
}
-std::string getCastUpgrade(const std::string& Src, const Type* SrcTy,
- const Type* DstTy, bool isConst) {
- std::string Result;
- std::string Source = Src;
- if (SrcTy->isFloatingPoint() && DstTy->isPointer()) {
- // fp -> ptr cast is no longer supported but we must upgrade this
- // by doing a double cast: fp -> int -> ptr
- if (isConst)
- Source = "i64 fptoui(" + Source + " to i64)";
- else {
- *O << " %cast_upgrade" << UniqueNameCounter << " = fptoui "
- << Source << " to i64\n";
- Source = "i64 %cast_upgrade" + llvm::utostr(UniqueNameCounter++);
- }
- // Update the SrcTy for the getCastOpcode call below
- SrcTy = Type::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
- // the original intent by replacing the cast with a setne
- const char* comparator = SrcTy->isPointer() ? ", null" :
- (SrcTy->isFloatingPoint() ? ", 0.0" :
- (SrcTy->isBool() ? ", false" : ", 0"));
- const char* compareOp = SrcTy->isFloatingPoint() ? "fcmp one " : "icmp ne ";
- if (isConst) {
- Result = "(" + Source + comparator + ")";
- Result = compareOp + Result;
- } else
- Result = compareOp + Source + comparator;
- return Result; // skip cast processing below
- }
- SrcTy = SrcTy->resolve();
- DstTy = DstTy->resolve();
- std::string Opcode(getCastOpcode(Source, SrcTy, DstTy));
- if (isConst)
- Result += Opcode + "( " + Source + " to " + DstTy->getNewTy() + ")";
- else
- Result += Opcode + " " + Source + " to " + DstTy->getNewTy();
- return Result;
+static inline Instruction::MemoryOps getMemoryOp(MemoryOps op) {
+ switch (op) {
+ default : assert(0 && "Invalid OldMemoryOps");
+ case MallocOp : return Instruction::Malloc;
+ case FreeOp : return Instruction::Free;
+ case AllocaOp : return Instruction::Alloca;
+ case LoadOp : return Instruction::Load;
+ case StoreOp : return Instruction::Store;
+ case GetElementPtrOp : return Instruction::GetElementPtr;
+ }
}
-const char* getDivRemOpcode(const std::string& opcode, const Type* TI) {
- const char* op = opcode.c_str();
- const Type* Ty = TI->resolve();
- if (Ty->isPacked())
- Ty = Ty->getElementType();
- if (opcode == "div")
- if (Ty->isFloatingPoint())
- op = "fdiv";
- else if (Ty->isUnsigned())
- op = "udiv";
- else if (Ty->isSigned())
- op = "sdiv";
- else
- yyerror("Invalid type for div instruction");
- else if (opcode == "rem")
- if (Ty->isFloatingPoint())
- op = "frem";
- else if (Ty->isUnsigned())
- op = "urem";
- else if (Ty->isSigned())
- op = "srem";
- else
- yyerror("Invalid type for rem instruction");
- return op;
+static inline Instruction::OtherOps
+getOtherOp(OtherOps op, Signedness Sign) {
+ switch (op) {
+ default : assert(0 && "Invalid OldOtherOps");
+ case PHIOp : return Instruction::PHI;
+ case CallOp : return Instruction::Call;
+ case ShlOp : return Instruction::Shl;
+ case ShrOp :
+ if (Sign == Signed)
+ return Instruction::AShr;
+ return Instruction::LShr;
+ case SelectOp : return Instruction::Select;
+ case UserOp1 : return Instruction::UserOp1;
+ case UserOp2 : return Instruction::UserOp2;
+ case VAArg : return Instruction::VAArg;
+ case ExtractElementOp : return Instruction::ExtractElement;
+ case InsertElementOp : return Instruction::InsertElement;
+ case ShuffleVectorOp : return Instruction::ShuffleVector;
+ case ICmpOp : return Instruction::ICmp;
+ case FCmpOp : return Instruction::FCmp;
+ case LShrOp : return Instruction::LShr;
+ case AShrOp : return Instruction::AShr;
+ };
}
-std::string getCompareOp(const std::string& setcc, const Type* TI) {
- assert(setcc.length() == 5);
- char cc1 = setcc[3];
- char cc2 = setcc[4];
- assert(cc1 == 'e' || cc1 == 'n' || cc1 == 'l' || cc1 == 'g');
- assert(cc2 == 'q' || cc2 == 'e' || cc2 == 'e' || cc2 == 't');
- std::string result("xcmp xxx");
- result[6] = cc1;
- result[7] = cc2;
- if (TI->isFloatingPoint()) {
- result[0] = 'f';
- result[5] = 'o';
- if (cc1 == 'n')
- result[5] = 'u'; // NE maps to unordered
- else
- result[5] = 'o'; // everything else maps to ordered
- } else if (TI->isIntegral() || TI->isPointer()) {
- result[0] = 'i';
- if ((cc1 == 'e' && cc2 == 'q') || (cc1 == 'n' && cc2 == 'e'))
- result.erase(5,1);
- else if (TI->isSigned())
- result[5] = 's';
- else if (TI->isUnsigned() || TI->isPointer() || TI->isBool())
- result[5] = 'u';
- else
- yyerror("Invalid integral type for setcc");
- }
- return result;
+static inline Value*
+getCast(CastOps op, Value *Src, Signedness SrcSign, const Type *DstTy,
+ Signedness DstSign, bool ForceInstruction = false) {
+ Instruction::CastOps Opcode;
+ const Type* SrcTy = Src->getType();
+ if (op == CastOp) {
+ if (SrcTy->isFloatingPoint() && isa<PointerType>(DstTy)) {
+ // fp -> ptr cast is no longer supported but we must upgrade this
+ // by doing a double cast: fp -> int -> ptr
+ SrcTy = Type::Int64Ty;
+ Opcode = Instruction::IntToPtr;
+ if (isa<Constant>(Src)) {
+ Src = ConstantExpr::getCast(Instruction::FPToUI,
+ cast<Constant>(Src), SrcTy);
+ } else {
+ std::string NewName(makeNameUnique(Src->getName()));
+ Src = new FPToUIInst(Src, SrcTy, NewName, CurBB);
+ }
+ } else if (isa<IntegerType>(DstTy) &&
+ cast<IntegerType>(DstTy)->getBitWidth() == 1) {
+ // 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
+ // the original intent by replacing the cast with a setne
+ Constant* Null = Constant::getNullValue(SrcTy);
+ Instruction::OtherOps Opcode = Instruction::ICmp;
+ unsigned short predicate = ICmpInst::ICMP_NE;
+ if (SrcTy->isFloatingPoint()) {
+ Opcode = Instruction::FCmp;
+ predicate = FCmpInst::FCMP_ONE;
+ } else if (!SrcTy->isInteger() && !isa<PointerType>(SrcTy)) {
+ error("Invalid cast to bool");
+ }
+ if (isa<Constant>(Src) && !ForceInstruction)
+ return ConstantExpr::getCompare(predicate, cast<Constant>(Src), Null);
+ else
+ return CmpInst::create(Opcode, predicate, Src, Null);
+ }
+ // Determine the opcode to use by calling CastInst::getCastOpcode
+ Opcode =
+ CastInst::getCastOpcode(Src, SrcSign == Signed, DstTy, DstSign == Signed);
+
+ } else switch (op) {
+ default: assert(0 && "Invalid cast token");
+ case TruncOp: Opcode = Instruction::Trunc; break;
+ case ZExtOp: Opcode = Instruction::ZExt; break;
+ case SExtOp: Opcode = Instruction::SExt; break;
+ case FPTruncOp: Opcode = Instruction::FPTrunc; break;
+ case FPExtOp: Opcode = Instruction::FPExt; break;
+ case FPToUIOp: Opcode = Instruction::FPToUI; break;
+ case FPToSIOp: Opcode = Instruction::FPToSI; break;
+ case UIToFPOp: Opcode = Instruction::UIToFP; break;
+ case SIToFPOp: Opcode = Instruction::SIToFP; break;
+ case PtrToIntOp: Opcode = Instruction::PtrToInt; break;
+ case IntToPtrOp: Opcode = Instruction::IntToPtr; break;
+ case BitCastOp: Opcode = Instruction::BitCast; break;
+ }
+
+ if (isa<Constant>(Src) && !ForceInstruction)
+ return ConstantExpr::getCast(Opcode, cast<Constant>(Src), DstTy);
+ return CastInst::create(Opcode, Src, DstTy);
}
-const Type* getFunctionReturnType(const Type* PFTy) {
- PFTy = PFTy->resolve();
- if (PFTy->isPointer()) {
- const Type* ElemTy = PFTy->getElementType();
- ElemTy = ElemTy->resolve();
- if (ElemTy->isFunction())
- return ElemTy->getResultType();
- } else if (PFTy->isFunction()) {
- return PFTy->getResultType();
- }
- return PFTy;
-}
+static Instruction *
+upgradeIntrinsicCall(const Type* RetTy, const ValID &ID,
+ std::vector<Value*>& Args) {
-const Type* ResolveUpReference(const Type* Ty,
- Type::UpRefStack* stack) {
- assert(Ty->isUpReference() && "Can't resolve a non-upreference");
- unsigned upref = Ty->getUpRefNum();
- assert(upref < stack->size() && "Invalid up reference");
- return (*stack)[upref - stack->size() - 1];
+ std::string Name = ID.Type == ValID::NameVal ? ID.Name : "";
+ if (Name == "llvm.isunordered.f32" || Name == "llvm.isunordered.f64") {
+ if (Args.size() != 2)
+ error("Invalid prototype for " + Name + " prototype");
+ return new FCmpInst(FCmpInst::FCMP_UNO, Args[0], Args[1]);
+ } else {
+ static unsigned upgradeCount = 1;
+ const Type* PtrTy = PointerType::get(Type::Int8Ty);
+ std::vector<const Type*> Params;
+ if (Name == "llvm.va_start" || Name == "llvm.va_end") {
+ if (Args.size() != 1)
+ error("Invalid prototype for " + Name + " prototype");
+ Params.push_back(PtrTy);
+ const FunctionType *FTy = FunctionType::get(Type::VoidTy, Params, false);
+ const PointerType *PFTy = PointerType::get(FTy);
+ Value* Func = getVal(PFTy, ID);
+ std::string InstName("va_upgrade");
+ InstName += llvm::utostr(upgradeCount++);
+ Args[0] = new BitCastInst(Args[0], PtrTy, InstName, CurBB);
+ return new CallInst(Func, Args);
+ } else if (Name == "llvm.va_copy") {
+ if (Args.size() != 2)
+ error("Invalid prototype for " + Name + " prototype");
+ Params.push_back(PtrTy);
+ Params.push_back(PtrTy);
+ const FunctionType *FTy = FunctionType::get(Type::VoidTy, Params, false);
+ const PointerType *PFTy = PointerType::get(FTy);
+ Value* Func = getVal(PFTy, ID);
+ std::string InstName0("va_upgrade");
+ InstName0 += llvm::utostr(upgradeCount++);
+ std::string InstName1("va_upgrade");
+ InstName1 += llvm::utostr(upgradeCount++);
+ Args[0] = new BitCastInst(Args[0], PtrTy, InstName0, CurBB);
+ Args[1] = new BitCastInst(Args[1], PtrTy, InstName1, CurBB);
+ return new CallInst(Func, Args);
+ }
+ }
+ return 0;
}
-const Type* getGEPIndexedType(const Type* PTy, ValueList* idxs) {
- const Type* Result = PTy = PTy->resolve();
- assert(PTy->isPointer() && "GEP Operand is not a pointer?");
- Type::UpRefStack stack;
- for (unsigned i = 0; i < idxs->size(); ++i) {
- if (Result->isComposite()) {
- Result = Result->getIndexedType((*idxs)[i]);
- Result = Result->resolve();
- stack.push_back(Result);
- } else
- yyerror("Invalid type for index");
- }
- // Resolve upreferences so we can return a more natural type
- if (Result->isPointer()) {
- if (Result->getElementType()->isUpReference()) {
- stack.push_back(Result);
- Result = ResolveUpReference(Result->getElementType(), &stack);
+const Type* upgradeGEPIndices(const Type* PTy,
+ std::vector<ValueInfo> *Indices,
+ std::vector<Value*> &VIndices,
+ std::vector<Constant*> *CIndices = 0) {
+ // Traverse the indices with a gep_type_iterator so we can build the list
+ // of constant and value indices for use later. Also perform upgrades
+ VIndices.clear();
+ if (CIndices) CIndices->clear();
+ for (unsigned i = 0, e = Indices->size(); i != e; ++i)
+ VIndices.push_back((*Indices)[i].V);
+ generic_gep_type_iterator<std::vector<Value*>::iterator>
+ GTI = gep_type_begin(PTy, VIndices.begin(), VIndices.end()),
+ GTE = gep_type_end(PTy, VIndices.begin(), VIndices.end());
+ for (unsigned i = 0, e = Indices->size(); i != e && GTI != GTE; ++i, ++GTI) {
+ Value *Index = VIndices[i];
+ if (CIndices && !isa<Constant>(Index))
+ error("Indices to constant getelementptr must be constants");
+ // LLVM 1.2 and earlier used ubyte struct indices. Convert any ubyte
+ // struct indices to i32 struct indices with ZExt for compatibility.
+ else if (isa<StructType>(*GTI)) { // Only change struct indices
+ if (ConstantInt *CUI = dyn_cast<ConstantInt>(Index))
+ if (CUI->getType()->getBitWidth() == 8)
+ Index =
+ ConstantExpr::getCast(Instruction::ZExt, CUI, Type::Int32Ty);
+ } else {
+ // Make sure that unsigned SequentialType indices are zext'd to
+ // 64-bits if they were smaller than that because LLVM 2.0 will sext
+ // all indices for SequentialType elements. We must retain the same
+ // semantic (zext) for unsigned types.
+ if (const IntegerType *Ity = dyn_cast<IntegerType>(Index->getType()))
+ if (Ity->getBitWidth() < 64 && (*Indices)[i].S == Unsigned)
+ if (CIndices)
+ Index = ConstantExpr::getCast(Instruction::ZExt,
+ cast<Constant>(Index), Type::Int64Ty);
+ else
+ Index = CastInst::create(Instruction::ZExt, Index, Type::Int64Ty,
+ "gep_upgrade", CurBB);
}
- } else if (Result->isUpReference()) {
- Result = ResolveUpReference(Result->getElementType(), &stack);
+ // Add to the CIndices list, if requested.
+ if (CIndices)
+ CIndices->push_back(cast<Constant>(Index));
}
- return Result->getPointerType();
+
+ const Type *IdxTy =
+ GetElementPtrInst::getIndexedType(PTy, VIndices, true);
+ if (!IdxTy)
+ error("Index list invalid for constant getelementptr");
+ return IdxTy;
}
-// This function handles appending .u or .s to integer value names that
-// 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.
-std::string getUniqueName(const std::string *Name, const Type* Ty,
- bool isGlobal = false, bool isDef = 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
- Ty = Ty->resolve();
-
- // If its a global name, get its uniquified name, if any
- Type::GlobalsTypeMap::iterator GI = Type::Globals.find(*Name);
- if (GI != Type::Globals.end()) {
- Type::TypePlaneMap::iterator TPI = GI->second.begin();
- Type::TypePlaneMap::iterator TPE = GI->second.end();
- for ( ; TPI != TPE ; ++TPI) {
- if (TPI->first->sameNewTyAs(Ty))
- return TPI->second;
- }
+Module* UpgradeAssembly(const std::string &infile, std::istream& in,
+ bool debug, bool addAttrs)
+{
+ Upgradelineno = 1;
+ CurFilename = infile;
+ LexInput = &in;
+ yydebug = debug;
+ AddAttributes = addAttrs;
+ ObsoleteVarArgs = false;
+ NewVarArgs = false;
+
+ CurModule.CurrentModule = new Module(CurFilename);
+
+ // Check to make sure the parser succeeded
+ if (yyparse()) {
+ if (ParserResult)
+ delete ParserResult;
+ std::cerr << "llvm-upgrade: parse failed.\n";
+ return 0;
}
- 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;
+ // Check to make sure that parsing produced a result
+ if (!ParserResult) {
+ std::cerr << "llvm-upgrade: no parse result.\n";
+ return 0;
}
- // Default the result to the current name
- std::string Result = Ty->makeUniqueName(*Name);
+ // Reset ParserResult variable while saving its value for the result.
+ Module *Result = ParserResult;
+ ParserResult = 0;
- return Result;
-}
+ //Not all functions use vaarg, so make a second check for ObsoleteVarArgs
+ {
+ Function* F;
+ if ((F = Result->getNamedFunction("llvm.va_start"))
+ && F->getFunctionType()->getNumParams() == 0)
+ ObsoleteVarArgs = true;
+ if((F = Result->getNamedFunction("llvm.va_copy"))
+ && F->getFunctionType()->getNumParams() == 1)
+ ObsoleteVarArgs = true;
+ }
-std::string getGlobalName(const std::string* Name, const std::string Linkage,
- const Type* Ty, bool isConstant) {
- // Default to given name
- std::string Result = *Name;
- // Look up the name in the Globals Map
- Type::GlobalsTypeMap::iterator GI = Type::Globals.find(*Name);
- // Did we see this global name before?
- if (GI != Type::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 {
- Type::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.
- Type::TypePlaneMap::iterator TPI = GI->second.begin();
- Type::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.
+ if (ObsoleteVarArgs && NewVarArgs) {
+ error("This file is corrupt: it uses both new and old style varargs");
+ return 0;
+ }
+
+ if(ObsoleteVarArgs) {
+ if(Function* F = Result->getNamedFunction("llvm.va_start")) {
+ if (F->arg_size() != 0) {
+ error("Obsolete va_start takes 0 argument");
+ return 0;
+ }
+
+ //foo = va_start()
+ // ->
+ //bar = alloca typeof(foo)
+ //va_start(bar)
+ //foo = load bar
+
+ const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+ const Type* ArgTy = F->getFunctionType()->getReturnType();
+ const Type* ArgTyPtr = PointerType::get(ArgTy);
+ Function* NF = cast<Function>(Result->getOrInsertFunction(
+ "llvm.va_start", RetTy, ArgTyPtr, (Type *)0));
+
+ while (!F->use_empty()) {
+ CallInst* CI = cast<CallInst>(F->use_back());
+ AllocaInst* bar = new AllocaInst(ArgTy, 0, "vastart.fix.1", CI);
+ new CallInst(NF, bar, "", CI);
+ Value* foo = new LoadInst(bar, "vastart.fix.2", CI);
+ CI->replaceAllUsesWith(foo);
+ CI->getParent()->getInstList().erase(CI);
}
+ Result->getFunctionList().erase(F);
}
- }
+
+ if(Function* F = Result->getNamedFunction("llvm.va_end")) {
+ if(F->arg_size() != 1) {
+ error("Obsolete va_end takes 1 argument");
+ return 0;
+ }
- // Its a new global name, if it is external we can't change it
- if (isConstant || Linkage == "external" || Linkage == "dllimport" ||
- Linkage == "extern_weak" || Linkage == "") {
- Type::Globals[Result][Ty] = Result;
- return Result;
+ //vaend foo
+ // ->
+ //bar = alloca 1 of typeof(foo)
+ //vaend bar
+ const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+ const Type* ArgTy = F->getFunctionType()->getParamType(0);
+ const Type* ArgTyPtr = PointerType::get(ArgTy);
+ Function* NF = cast<Function>(Result->getOrInsertFunction(
+ "llvm.va_end", RetTy, ArgTyPtr, (Type *)0));
+
+ while (!F->use_empty()) {
+ CallInst* CI = cast<CallInst>(F->use_back());
+ AllocaInst* bar = new AllocaInst(ArgTy, 0, "vaend.fix.1", CI);
+ new StoreInst(CI->getOperand(1), bar, CI);
+ new CallInst(NF, bar, "", CI);
+ CI->getParent()->getInstList().erase(CI);
+ }
+ Result->getFunctionList().erase(F);
+ }
+
+ if(Function* F = Result->getNamedFunction("llvm.va_copy")) {
+ if(F->arg_size() != 1) {
+ error("Obsolete va_copy takes 1 argument");
+ return 0;
+ }
+ //foo = vacopy(bar)
+ // ->
+ //a = alloca 1 of typeof(foo)
+ //b = alloca 1 of typeof(foo)
+ //store bar -> b
+ //vacopy(a, b)
+ //foo = load a
+
+ const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
+ const Type* ArgTy = F->getFunctionType()->getReturnType();
+ const Type* ArgTyPtr = PointerType::get(ArgTy);
+ Function* NF = cast<Function>(Result->getOrInsertFunction(
+ "llvm.va_copy", RetTy, ArgTyPtr, ArgTyPtr, (Type *)0));
+
+ while (!F->use_empty()) {
+ CallInst* CI = cast<CallInst>(F->use_back());
+ AllocaInst* a = new AllocaInst(ArgTy, 0, "vacopy.fix.1", CI);
+ AllocaInst* b = new AllocaInst(ArgTy, 0, "vacopy.fix.2", CI);
+ new StoreInst(CI->getOperand(1), b, CI);
+ new CallInst(NF, a, b, "", CI);
+ Value* foo = new LoadInst(a, "vacopy.fix.3", CI);
+ CI->replaceAllUsesWith(foo);
+ CI->getParent()->getInstList().erase(CI);
+ }
+ Result->getFunctionList().erase(F);
+ }
}
- // Its a new global name, and it is internal, change the name to make it
- // unique for its type.
- // Result = getUniqueName(Name, Ty);
- Type::Globals[*Name][Ty] = Result;
return Result;
}
-} // End anonymous namespace
+} // end llvm namespace
-// This function is used by the Lexer to create a Type. It can't be
-// in the anonymous namespace.
-const Type* getType(const std::string& newTy, TypeIDs oldTy) {
- return Type::get(newTy, oldTy);
-}
+using namespace llvm;
%}
-// %file-prefix="UpgradeParser"
-
%union {
- std::string* String;
- const Type* Ty;
- Value* Val;
- Constant* Const;
- ValueList* ValList;
- TypeList* TypeVec;
+ llvm::Module *ModuleVal;
+ llvm::Function *FunctionVal;
+ std::pair<llvm::PATypeInfo, char*> *ArgVal;
+ llvm::BasicBlock *BasicBlockVal;
+ llvm::TerminatorInst *TermInstVal;
+ llvm::InstrInfo InstVal;
+ llvm::ConstInfo ConstVal;
+ llvm::ValueInfo ValueVal;
+ llvm::PATypeInfo TypeVal;
+ llvm::TypeInfo PrimType;
+ llvm::PHIListInfo PHIList;
+ std::list<llvm::PATypeInfo> *TypeList;
+ std::vector<llvm::ValueInfo> *ValueList;
+ std::vector<llvm::ConstInfo> *ConstVector;
+
+
+ std::vector<std::pair<llvm::PATypeInfo,char*> > *ArgList;
+ // Represent the RHS of PHI node
+ std::vector<std::pair<llvm::Constant*, llvm::BasicBlock*> > *JumpTable;
+
+ llvm::GlobalValue::LinkageTypes Linkage;
+ int64_t SInt64Val;
+ uint64_t UInt64Val;
+ int SIntVal;
+ unsigned UIntVal;
+ double FPVal;
+ bool BoolVal;
+
+ char *StrVal; // This memory is strdup'd!
+ llvm::ValID ValIDVal; // strdup'd memory maybe!
+
+ llvm::BinaryOps BinaryOpVal;
+ llvm::TermOps TermOpVal;
+ llvm::MemoryOps MemOpVal;
+ llvm::OtherOps OtherOpVal;
+ llvm::CastOps CastOpVal;
+ llvm::ICmpInst::Predicate IPred;
+ llvm::FCmpInst::Predicate FPred;
+ llvm::Module::Endianness Endianness;
}
-%token <Ty> VOID BOOL SBYTE UBYTE SHORT USHORT INT UINT LONG ULONG
-%token <Ty> FLOAT DOUBLE LABEL
-%token <String> OPAQUE ESINT64VAL EUINT64VAL SINTVAL UINTVAL FPVAL
-%token <String> NULL_TOK UNDEF ZEROINITIALIZER TRUETOK FALSETOK
-%token <String> TYPE VAR_ID LABELSTR STRINGCONSTANT
-%token <String> IMPLEMENTATION BEGINTOK ENDTOK
-%token <String> DECLARE GLOBAL CONSTANT SECTION VOLATILE
-%token <String> TO DOTDOTDOT CONST INTERNAL LINKONCE WEAK
-%token <String> DLLIMPORT DLLEXPORT EXTERN_WEAK APPENDING
-%token <String> EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG
-%token <String> ALIGN UNINITIALIZED
-%token <String> DEPLIBS CALL TAIL ASM_TOK MODULE SIDEEFFECT
-%token <String> CC_TOK CCC_TOK CSRETCC_TOK FASTCC_TOK COLDCC_TOK
-%token <String> X86_STDCALLCC_TOK X86_FASTCALLCC_TOK
-%token <String> DATALAYOUT
-%token <String> RET BR SWITCH INVOKE EXCEPT UNWIND UNREACHABLE
-%token <String> ADD SUB MUL DIV UDIV SDIV FDIV REM UREM SREM FREM AND OR XOR
-%token <String> SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comparators
-%token <String> ICMP FCMP EQ NE SLT SGT SLE SGE OEQ ONE OLT OGT OLE OGE
-%token <String> ORD UNO UEQ UNE ULT UGT ULE UGE
-%token <String> MALLOC ALLOCA FREE LOAD STORE GETELEMENTPTR
-%token <String> PHI_TOK SELECT SHL SHR ASHR LSHR VAARG
-%token <String> EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR
-%token <String> CAST TRUNC ZEXT SEXT FPTRUNC FPEXT FPTOUI FPTOSI UITOFP SITOFP
-%token <String> PTRTOINT INTTOPTR BITCAST
-
-%type <String> OptAssign OptLinkage OptCallingConv OptAlign OptCAlign
-%type <String> SectionString OptSection GlobalVarAttributes GlobalVarAttribute
-%type <String> ConstExpr DefinitionList
-%type <String> ConstPool TargetDefinition LibrariesDefinition LibList OptName
-%type <String> ArgVal ArgListH ArgList FunctionHeaderH BEGIN FunctionHeader END
-%type <String> Function FunctionProto BasicBlock
-%type <String> InstructionList BBTerminatorInst JumpTable Inst
-%type <String> OptTailCall OptVolatile Unwind
-%type <String> SymbolicValueRef OptSideEffect GlobalType
-%type <String> FnDeclareLinkage BasicBlockList BigOrLittle AsmBlock
-%type <String> Name ConstValueRef ConstVector External
-%type <String> ShiftOps SetCondOps LogicalOps ArithmeticOps CastOps
-%type <String> IPredicates FPredicates
-
-%type <ValList> ValueRefList ValueRefListE IndexList
-%type <TypeVec> TypeListI ArgTypeListI
-
-%type <Ty> IntType SIntType UIntType FPType TypesV Types
-%type <Ty> PrimType UpRTypesV UpRTypes
-
-%type <String> IntVal EInt64Val
-%type <Const> ConstVal
-
-%type <Val> ValueRef ResolvedVal InstVal PHIList MemoryInst
+%type <ModuleVal> Module FunctionList
+%type <FunctionVal> Function FunctionProto FunctionHeader BasicBlockList
+%type <BasicBlockVal> BasicBlock InstructionList
+%type <TermInstVal> BBTerminatorInst
+%type <InstVal> Inst InstVal MemoryInst
+%type <ConstVal> ConstVal ConstExpr
+%type <ConstVector> ConstVector
+%type <ArgList> ArgList ArgListH
+%type <ArgVal> ArgVal
+%type <PHIList> PHIList
+%type <ValueList> ValueRefList ValueRefListE // For call param lists
+%type <ValueList> IndexList // For GEP derived indices
+%type <TypeList> TypeListI ArgTypeListI
+%type <JumpTable> JumpTable
+%type <BoolVal> GlobalType // GLOBAL or CONSTANT?
+%type <BoolVal> OptVolatile // 'volatile' or not
+%type <BoolVal> OptTailCall // TAIL CALL or plain CALL.
+%type <BoolVal> OptSideEffect // 'sideeffect' or not.
+%type <Linkage> OptLinkage
+%type <Endianness> BigOrLittle
+
+// ValueRef - Unresolved reference to a definition or BB
+%type <ValIDVal> ValueRef ConstValueRef SymbolicValueRef
+%type <ValueVal> ResolvedVal // <type> <valref> pair
+// Tokens and types for handling constant integer values
+//
+// ESINT64VAL - A negative number within long long range
+%token <SInt64Val> ESINT64VAL
+
+// EUINT64VAL - A positive number within uns. long long range
+%token <UInt64Val> EUINT64VAL
+%type <SInt64Val> EINT64VAL
+
+%token <SIntVal> SINTVAL // Signed 32 bit ints...
+%token <UIntVal> UINTVAL // Unsigned 32 bit ints...
+%type <SIntVal> INTVAL
+%token <FPVal> FPVAL // Float or Double constant
+
+// Built in types...
+%type <TypeVal> Types TypesV UpRTypes UpRTypesV
+%type <PrimType> SIntType UIntType IntType FPType PrimType // Classifications
+%token <PrimType> VOID BOOL SBYTE UBYTE SHORT USHORT INT UINT LONG ULONG
+%token <PrimType> FLOAT DOUBLE TYPE LABEL
+
+%token <StrVal> VAR_ID LABELSTR STRINGCONSTANT
+%type <StrVal> Name OptName OptAssign
+%type <UIntVal> OptAlign OptCAlign
+%type <StrVal> OptSection SectionString
+
+%token IMPLEMENTATION ZEROINITIALIZER TRUETOK FALSETOK BEGINTOK ENDTOK
+%token DECLARE GLOBAL CONSTANT SECTION VOLATILE
+%token TO DOTDOTDOT NULL_TOK UNDEF CONST INTERNAL LINKONCE WEAK APPENDING
+%token DLLIMPORT DLLEXPORT EXTERN_WEAK
+%token OPAQUE NOT EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG ALIGN
+%token DEPLIBS CALL TAIL ASM_TOK MODULE SIDEEFFECT
+%token CC_TOK CCC_TOK CSRETCC_TOK FASTCC_TOK COLDCC_TOK
+%token X86_STDCALLCC_TOK X86_FASTCALLCC_TOK
+%token DATALAYOUT
+%type <UIntVal> OptCallingConv
+
+// Basic Block Terminating Operators
+%token <TermOpVal> RET BR SWITCH INVOKE UNREACHABLE
+%token UNWIND EXCEPT
+
+// Binary Operators
+%type <BinaryOpVal> ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories
+%token <BinaryOpVal> ADD SUB MUL DIV UDIV SDIV FDIV REM UREM SREM FREM
+%token <BinaryOpVal> AND OR XOR
+%token <BinaryOpVal> SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comparators
+%token <OtherOpVal> ICMP FCMP
+
+// Memory Instructions
+%token <MemOpVal> MALLOC ALLOCA FREE LOAD STORE GETELEMENTPTR
+
+// Other Operators
+%type <OtherOpVal> ShiftOps
+%token <OtherOpVal> PHI_TOK SELECT SHL SHR ASHR LSHR VAARG
+%token <OtherOpVal> EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR
+%token VAARG_old VANEXT_old //OBSOLETE
+
+%type <IPred> IPredicates
+%type <FPred> FPredicates
+%token EQ NE SLT SGT SLE SGE ULT UGT ULE UGE
+%token OEQ ONE OLT OGT OLE OGE ORD UNO UEQ UNE
+
+%token <CastOpVal> CAST TRUNC ZEXT SEXT FPTRUNC FPEXT FPTOUI FPTOSI
+%token <CastOpVal> UITOFP SITOFP PTRTOINT INTTOPTR BITCAST
+%type <CastOpVal> CastOps
%start Module
%%
// Handle constant integer size restriction and conversion...
-IntVal : SINTVAL | UINTVAL ;
-EInt64Val : ESINT64VAL | EUINT64VAL;
+//
+INTVAL
+ : SINTVAL;
+ | UINTVAL {
+ if ($1 > (uint32_t)INT32_MAX) // Outside of my range!
+ error("Value too large for type");
+ $$ = (int32_t)$1;
+ }
+ ;
+
+EINT64VAL
+ : ESINT64VAL; // These have same type and can't cause problems...
+ | EUINT64VAL {
+ if ($1 > (uint64_t)INT64_MAX) // Outside of my range!
+ error("Value too large for type");
+ $$ = (int64_t)$1;
+ };
// Operations that are notably excluded from this list include:
// RET, BR, & SWITCH because they end basic blocks and are treated specially.
-ArithmeticOps: ADD | SUB | MUL | DIV | UDIV | SDIV | FDIV
- | REM | UREM | SREM | FREM;
-LogicalOps : AND | OR | XOR;
-SetCondOps : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE;
-IPredicates : EQ | NE | SLT | SGT | SLE | SGE | ULT | UGT | ULE | UGE;
-FPredicates : OEQ | ONE | OLT | OGT | OLE | OGE | ORD | UNO | UEQ | UNE
- | ULT | UGT | ULE | UGE | TRUETOK | FALSETOK;
-ShiftOps : SHL | SHR | ASHR | LSHR;
-CastOps : TRUNC | ZEXT | SEXT | FPTRUNC | FPEXT | FPTOUI | FPTOSI |
- UITOFP | SITOFP | PTRTOINT | INTTOPTR | BITCAST | CAST
- ;
+//
+ArithmeticOps
+ : ADD | SUB | MUL | DIV | UDIV | SDIV | FDIV | REM | UREM | SREM | FREM
+ ;
+
+LogicalOps
+ : AND | OR | XOR
+ ;
+
+SetCondOps
+ : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE
+ ;
+
+IPredicates
+ : EQ { $$ = ICmpInst::ICMP_EQ; } | NE { $$ = ICmpInst::ICMP_NE; }
+ | SLT { $$ = ICmpInst::ICMP_SLT; } | SGT { $$ = ICmpInst::ICMP_SGT; }
+ | SLE { $$ = ICmpInst::ICMP_SLE; } | SGE { $$ = ICmpInst::ICMP_SGE; }
+ | ULT { $$ = ICmpInst::ICMP_ULT; } | UGT { $$ = ICmpInst::ICMP_UGT; }
+ | ULE { $$ = ICmpInst::ICMP_ULE; } | UGE { $$ = ICmpInst::ICMP_UGE; }
+ ;
+
+FPredicates
+ : OEQ { $$ = FCmpInst::FCMP_OEQ; } | ONE { $$ = FCmpInst::FCMP_ONE; }
+ | OLT { $$ = FCmpInst::FCMP_OLT; } | OGT { $$ = FCmpInst::FCMP_OGT; }
+ | OLE { $$ = FCmpInst::FCMP_OLE; } | OGE { $$ = FCmpInst::FCMP_OGE; }
+ | ORD { $$ = FCmpInst::FCMP_ORD; } | UNO { $$ = FCmpInst::FCMP_UNO; }
+ | UEQ { $$ = FCmpInst::FCMP_UEQ; } | UNE { $$ = FCmpInst::FCMP_UNE; }
+ | ULT { $$ = FCmpInst::FCMP_ULT; } | UGT { $$ = FCmpInst::FCMP_UGT; }
+ | ULE { $$ = FCmpInst::FCMP_ULE; } | UGE { $$ = FCmpInst::FCMP_UGE; }
+ | TRUETOK { $$ = FCmpInst::FCMP_TRUE; }
+ | FALSETOK { $$ = FCmpInst::FCMP_FALSE; }
+ ;
+ShiftOps
+ : SHL | SHR | ASHR | LSHR
+ ;
+
+CastOps
+ : TRUNC | ZEXT | SEXT | FPTRUNC | FPEXT | FPTOUI | FPTOSI
+ | UITOFP | SITOFP | PTRTOINT | INTTOPTR | BITCAST | CAST
+ ;
// These are some types that allow classification if we only want a particular
// thing... for example, only a signed, unsigned, or integral type.
-SIntType : LONG | INT | SHORT | SBYTE;
-UIntType : ULONG | UINT | USHORT | UBYTE;
-IntType : SIntType | UIntType;
-FPType : FLOAT | DOUBLE;
+SIntType
+ : LONG | INT | SHORT | SBYTE
+ ;
+
+UIntType
+ : ULONG | UINT | USHORT | UBYTE
+ ;
+
+IntType
+ : SIntType | UIntType
+ ;
+
+FPType
+ : FLOAT | DOUBLE
+ ;
// OptAssign - Value producing statements have an optional assignment component
-OptAssign : Name '=' {
+OptAssign
+ : Name '=' {
$$ = $1;
}
| /*empty*/ {
- $$ = new std::string("");
+ $$ = 0;
};
OptLinkage
- : INTERNAL | LINKONCE | WEAK | APPENDING | DLLIMPORT | DLLEXPORT
- | EXTERN_WEAK
- | /*empty*/ { $$ = new std::string(""); } ;
+ : INTERNAL { $$ = GlobalValue::InternalLinkage; }
+ | LINKONCE { $$ = GlobalValue::LinkOnceLinkage; }
+ | WEAK { $$ = GlobalValue::WeakLinkage; }
+ | APPENDING { $$ = GlobalValue::AppendingLinkage; }
+ | DLLIMPORT { $$ = GlobalValue::DLLImportLinkage; }
+ | DLLEXPORT { $$ = GlobalValue::DLLExportLinkage; }
+ | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; }
+ | /*empty*/ { $$ = GlobalValue::ExternalLinkage; }
+ ;
OptCallingConv
- : CCC_TOK | CSRETCC_TOK | FASTCC_TOK | COLDCC_TOK | X86_STDCALLCC_TOK
- | X86_FASTCALLCC_TOK
- | CC_TOK EUINT64VAL {
- *$1 += *$2;
- delete $2;
- $$ = $1;
- }
- | /*empty*/ { $$ = new std::string(""); } ;
+ : /*empty*/ { $$ = CallingConv::C; }
+ | CCC_TOK { $$ = CallingConv::C; }
+ | CSRETCC_TOK { $$ = CallingConv::CSRet; }
+ | FASTCC_TOK { $$ = CallingConv::Fast; }
+ | COLDCC_TOK { $$ = CallingConv::Cold; }
+ | X86_STDCALLCC_TOK { $$ = CallingConv::X86_StdCall; }
+ | X86_FASTCALLCC_TOK { $$ = CallingConv::X86_FastCall; }
+ | CC_TOK EUINT64VAL {
+ if ((unsigned)$2 != $2)
+ error("Calling conv too large");
+ $$ = $2;
+ }
+ ;
// OptAlign/OptCAlign - An optional alignment, and an optional alignment with
// a comma before it.
OptAlign
- : /*empty*/ { $$ = new std::string(); }
- | ALIGN EUINT64VAL { *$1 += " " + *$2; delete $2; $$ = $1; };
+ : /*empty*/ { $$ = 0; }
+ | ALIGN EUINT64VAL {
+ $$ = $2;
+ if ($$ != 0 && !isPowerOf2_32($$))
+ error("Alignment must be a power of two");
+ }
+ ;
OptCAlign
- : /*empty*/ { $$ = new std::string(); }
- | ',' ALIGN EUINT64VAL {
- $2->insert(0, ", ");
- *$2 += " " + *$3;
- delete $3;
- $$ = $2;
- };
+ : /*empty*/ { $$ = 0; }
+ | ',' ALIGN EUINT64VAL {
+ $$ = $3;
+ if ($$ != 0 && !isPowerOf2_32($$))
+ error("Alignment must be a power of two");
+ }
+ ;
SectionString
- : SECTION STRINGCONSTANT {
- *$1 += " " + *$2;
- delete $2;
- $$ = $1;
- };
+ : SECTION STRINGCONSTANT {
+ for (unsigned i = 0, e = strlen($2); i != e; ++i)
+ if ($2[i] == '"' || $2[i] == '\\')
+ error("Invalid character in section name");
+ $$ = $2;
+ }
+ ;
-OptSection : /*empty*/ { $$ = new std::string(); }
- | SectionString;
+OptSection
+ : /*empty*/ { $$ = 0; }
+ | SectionString { $$ = $1; }
+ ;
+// GlobalVarAttributes - Used to pass the attributes string on a global. CurGV
+// is set to be the global we are processing.
+//
GlobalVarAttributes
- : /* empty */ { $$ = new std::string(); }
- | ',' GlobalVarAttribute GlobalVarAttributes {
- $2->insert(0, ", ");
- if (!$3->empty())
- *$2 += " " + *$3;
- delete $3;
- $$ = $2;
- };
+ : /* empty */ {}
+ | ',' GlobalVarAttribute GlobalVarAttributes {}
+ ;
-GlobalVarAttribute
- : SectionString
- | ALIGN EUINT64VAL {
- *$1 += " " + *$2;
- delete $2;
- $$ = $1;
- };
+GlobalVarAttribute
+ : SectionString {
+ CurGV->setSection($1);
+ free($1);
+ }
+ | ALIGN EUINT64VAL {
+ if ($2 != 0 && !isPowerOf2_32($2))
+ error("Alignment must be a power of two");
+ CurGV->setAlignment($2);
+
+ }
+ ;
//===----------------------------------------------------------------------===//
// Types includes all predefined types... except void, because it can only be
@@ -1130,112 +1778,164 @@ GlobalVarAttribute
//
// TypesV includes all of 'Types', but it also includes the void type.
-TypesV : Types | VOID ;
-UpRTypesV : UpRTypes | VOID ;
-Types : UpRTypes ;
+TypesV
+ : Types
+ | VOID {
+ $$.T = new PATypeHolder($1.T);
+ $$.S = Signless;
+ }
+ ;
+
+UpRTypesV
+ : UpRTypes
+ | VOID {
+ $$.T = new PATypeHolder($1.T);
+ $$.S = Signless;
+ }
+ ;
+
+Types
+ : UpRTypes {
+ if (!UpRefs.empty())
+ error("Invalid upreference in type: " + (*$1.T)->getDescription());
+ $$ = $1;
+ }
+ ;
+
+PrimType
+ : BOOL | SBYTE | UBYTE | SHORT | USHORT | INT | UINT
+ | LONG | ULONG | FLOAT | DOUBLE | LABEL
+ ;
// Derived types are added later...
-//
-PrimType : BOOL | SBYTE | UBYTE | SHORT | USHORT | INT | UINT ;
-PrimType : LONG | ULONG | FLOAT | DOUBLE | LABEL;
UpRTypes
- : OPAQUE {
- $$ = Type::get(*$1, OpaqueTy);
- }
- | SymbolicValueRef {
- $$ = Type::get(*$1, UnresolvedTy);
+ : PrimType {
+ $$.T = new PATypeHolder($1.T);
+ $$.S = $1.S;
}
- | PrimType {
- $$ = $1;
+ | OPAQUE {
+ $$.T = new PATypeHolder(OpaqueType::get());
+ $$.S = Signless;
+ }
+ | SymbolicValueRef { // Named types are also simple types...
+ const Type* tmp = getTypeVal($1);
+ $$.T = new PATypeHolder(tmp);
+ $$.S = Signless; // FIXME: what if its signed?
}
| '\\' EUINT64VAL { // Type UpReference
- $2->insert(0, "\\");
- $$ = Type::get(*$2, UpRefTy);
+ if ($2 > (uint64_t)~0U)
+ error("Value out of range");
+ OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder
+ UpRefs.push_back(UpRefRecord((unsigned)$2, OT)); // Add to vector...
+ $$.T = new PATypeHolder(OT);
+ $$.S = Signless;
+ UR_OUT("New Upreference!\n");
}
| UpRTypesV '(' ArgTypeListI ')' { // Function derived type?
- std::string newTy( $1->getNewTy() + "(");
- for (unsigned i = 0; i < $3->size(); ++i) {
- if (i != 0)
- newTy += ", ";
- if ((*$3)[i]->isVoid())
- newTy += "...";
- else
- newTy += (*$3)[i]->getNewTy();
+ std::vector<const Type*> Params;
+ for (std::list<llvm::PATypeInfo>::iterator I = $3->begin(),
+ E = $3->end(); I != E; ++I) {
+ Params.push_back(I->T->get());
+ delete I->T;
}
- newTy += ")";
- $$ = Type::get(newTy, $1, $3);
+ bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
+ if (isVarArg) Params.pop_back();
+
+ $$.T = new PATypeHolder(HandleUpRefs(
+ FunctionType::get($1.T->get(),Params,isVarArg)));
+ $$.S = $1.S;
+ delete $1.T; // Delete the return type handle
+ delete $3; // Delete the argument list
}
| '[' EUINT64VAL 'x' UpRTypes ']' { // Sized array type?
- uint64_t elems = atoi($2->c_str());
- $2->insert(0,"[ ");
- *$2 += " x " + $4->getNewTy() + " ]";
- $$ = Type::get(*$2, ArrayTy, $4, elems);
+ $$.T = new PATypeHolder(HandleUpRefs(ArrayType::get($4.T->get(),
+ (unsigned)$2)));
+ $$.S = $4.S;
+ delete $4.T;
}
| '<' EUINT64VAL 'x' UpRTypes '>' { // Packed array type?
- uint64_t elems = atoi($2->c_str());
- $2->insert(0,"< ");
- *$2 += " x " + $4->getNewTy() + " >";
- $$ = Type::get(*$2, PackedTy, $4, elems);
+ const llvm::Type* ElemTy = $4.T->get();
+ if ((unsigned)$2 != $2)
+ error("Unsigned result not equal to signed result");
+ if (!(ElemTy->isInteger() || ElemTy->isFloatingPoint()))
+ error("Elements of a PackedType must be integer or floating point");
+ if (!isPowerOf2_32($2))
+ error("PackedType length should be a power of 2");
+ $$.T = new PATypeHolder(HandleUpRefs(PackedType::get(ElemTy,
+ (unsigned)$2)));
+ $$.S = $4.S;
+ delete $4.T;
}
| '{' TypeListI '}' { // Structure type?
- std::string newTy("{");
- for (unsigned i = 0; i < $2->size(); ++i) {
- if (i != 0)
- newTy += ", ";
- newTy += (*$2)[i]->getNewTy();
- }
- newTy += "}";
- $$ = Type::get(newTy, StructTy, $2);
+ std::vector<const Type*> Elements;
+ for (std::list<llvm::PATypeInfo>::iterator I = $2->begin(),
+ E = $2->end(); I != E; ++I)
+ Elements.push_back(I->T->get());
+ $$.T = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
+ $$.S = Signless;
+ delete $2;
}
| '{' '}' { // Empty structure type?
- $$ = Type::get("{}", StructTy, new TypeList());
+ $$.T = new PATypeHolder(StructType::get(std::vector<const Type*>()));
+ $$.S = Signless;
}
| '<' '{' TypeListI '}' '>' { // Packed Structure type?
- std::string newTy("<{");
- for (unsigned i = 0; i < $3->size(); ++i) {
- if (i != 0)
- newTy += ", ";
- newTy += (*$3)[i]->getNewTy();
+ std::vector<const Type*> Elements;
+ for (std::list<llvm::PATypeInfo>::iterator I = $3->begin(),
+ E = $3->end(); I != E; ++I) {
+ Elements.push_back(I->T->get());
+ delete I->T;
}
- newTy += "}>";
- $$ = Type::get(newTy, PackedStructTy, $3);
+ $$.T = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
+ $$.S = Signless;
+ delete $3;
}
| '<' '{' '}' '>' { // Empty packed structure type?
- $$ = Type::get("<{}>", PackedStructTy, new TypeList());
+ $$.T = new PATypeHolder(StructType::get(std::vector<const Type*>(),true));
+ $$.S = Signless;
}
| UpRTypes '*' { // Pointer type?
- $$ = $1->getPointerType();
- };
+ if ($1.T->get() == Type::LabelTy)
+ error("Cannot form a pointer to a basic block");
+ $$.T = new PATypeHolder(HandleUpRefs(PointerType::get($1.T->get())));
+ $$.S = $1.S;
+ delete $1.T;
+ }
+ ;
// TypeList - Used for struct declarations and as a basis for function type
// declaration type lists
//
TypeListI
: UpRTypes {
- $$ = new TypeList();
- $$->push_back($1);
+ $$ = new std::list<PATypeInfo>();
+ $$->push_back($1);
}
| TypeListI ',' UpRTypes {
- $$ = $1;
- $$->push_back($3);
- };
+ ($$=$1)->push_back($3);
+ }
+ ;
// ArgTypeList - List of types for a function type declaration...
ArgTypeListI
- : TypeListI
+ : TypeListI
| TypeListI ',' DOTDOTDOT {
- $$ = $1;
- $$->push_back(Type::get("void",VoidTy));
- delete $3;
+ PATypeInfo VoidTI;
+ VoidTI.T = new PATypeHolder(Type::VoidTy);
+ VoidTI.S = Signless;
+ ($$=$1)->push_back(VoidTI);
}
| DOTDOTDOT {
- $$ = new TypeList();
- $$->push_back(Type::get("void",VoidTy));
- delete $1;
+ $$ = new std::list<PATypeInfo>();
+ PATypeInfo VoidTI;
+ VoidTI.T = new PATypeHolder(Type::VoidTy);
+ VoidTI.S = Signless;
+ $$->push_back(VoidTI);
}
| /*empty*/ {
- $$ = new TypeList();
- };
+ $$ = new std::list<PATypeInfo>();
+ }
+ ;
// ConstVal - The various declarations that go into the constant pool. This
// production is used ONLY to represent constants that show up AFTER a 'const',
@@ -1243,215 +1943,429 @@ ArgTypeListI
// into other expressions (such as integers and constexprs) are handled by the
// ResolvedVal, ValueRef and ConstValueRef productions.
//
-ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " [ " + *$3 + " ]";
+ConstVal
+ : Types '[' ConstVector ']' { // Nonempty unsized arr
+ const ArrayType *ATy = dyn_cast<ArrayType>($1.T->get());
+ if (ATy == 0)
+ error("Cannot make array constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ const Type *ETy = ATy->getElementType();
+ int NumElements = ATy->getNumElements();
+
+ // Verify that we have the correct size...
+ if (NumElements != -1 && NumElements != (int)$3->size())
+ error("Type mismatch: constant sized array initialized with " +
+ utostr($3->size()) + " arguments, but has size of " +
+ itostr(NumElements) + "");
+
+ // Verify all elements are correct type!
+ std::vector<Constant*> Elems;
+ for (unsigned i = 0; i < $3->size(); i++) {
+ Constant *C = (*$3)[i].C;
+ const Type* ValTy = C->getType();
+ if (ETy != ValTy)
+ error("Element #" + utostr(i) + " is not of type '" +
+ ETy->getDescription() +"' as required!\nIt is of type '"+
+ ValTy->getDescription() + "'");
+ Elems.push_back(C);
+ }
+ $$.C = ConstantArray::get(ATy, Elems);
+ $$.S = $1.S;
+ delete $1.T;
delete $3;
}
| Types '[' ']' {
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += "[ ]";
+ const ArrayType *ATy = dyn_cast<ArrayType>($1.T->get());
+ if (ATy == 0)
+ error("Cannot make array constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ int NumElements = ATy->getNumElements();
+ if (NumElements != -1 && NumElements != 0)
+ error("Type mismatch: constant sized array initialized with 0"
+ " arguments, but has size of " + itostr(NumElements) +"");
+ $$.C = ConstantArray::get(ATy, std::vector<Constant*>());
+ $$.S = $1.S;
+ delete $1.T;
}
| Types 'c' STRINGCONSTANT {
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " c" + *$3;
- delete $3;
+ const ArrayType *ATy = dyn_cast<ArrayType>($1.T->get());
+ if (ATy == 0)
+ error("Cannot make array constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ int NumElements = ATy->getNumElements();
+ const Type *ETy = dyn_cast<IntegerType>(ATy->getElementType());
+ if (!ETy || cast<IntegerType>(ETy)->getBitWidth() != 8)
+ error("String arrays require type i8, not '" + ETy->getDescription() +
+ "'");
+ char *EndStr = UnEscapeLexed($3, true);
+ if (NumElements != -1 && NumElements != (EndStr-$3))
+ error("Can't build string constant of size " +
+ itostr((int)(EndStr-$3)) + " when array has size " +
+ itostr(NumElements) + "");
+ std::vector<Constant*> Vals;
+ for (char *C = (char *)$3; C != (char *)EndStr; ++C)
+ Vals.push_back(ConstantInt::get(ETy, *C));
+ free($3);
+ $$.C = ConstantArray::get(ATy, Vals);
+ $$.S = $1.S;
+ delete $1.T;
}
| Types '<' ConstVector '>' { // Nonempty unsized arr
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " < " + *$3 + " >";
+ const PackedType *PTy = dyn_cast<PackedType>($1.T->get());
+ if (PTy == 0)
+ error("Cannot make packed constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ const Type *ETy = PTy->getElementType();
+ int NumElements = PTy->getNumElements();
+ // Verify that we have the correct size...
+ if (NumElements != -1 && NumElements != (int)$3->size())
+ error("Type mismatch: constant sized packed initialized with " +
+ utostr($3->size()) + " arguments, but has size of " +
+ itostr(NumElements) + "");
+ // Verify all elements are correct type!
+ std::vector<Constant*> Elems;
+ for (unsigned i = 0; i < $3->size(); i++) {
+ Constant *C = (*$3)[i].C;
+ const Type* ValTy = C->getType();
+ if (ETy != ValTy)
+ error("Element #" + utostr(i) + " is not of type '" +
+ ETy->getDescription() +"' as required!\nIt is of type '"+
+ ValTy->getDescription() + "'");
+ Elems.push_back(C);
+ }
+ $$.C = ConstantPacked::get(PTy, Elems);
+ $$.S = $1.S;
+ delete $1.T;
delete $3;
}
| Types '{' ConstVector '}' {
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " { " + *$3 + " }";
+ const StructType *STy = dyn_cast<StructType>($1.T->get());
+ if (STy == 0)
+ error("Cannot make struct constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ if ($3->size() != STy->getNumContainedTypes())
+ error("Illegal number of initializers for structure type");
+
+ // Check to ensure that constants are compatible with the type initializer!
+ std::vector<Constant*> Fields;
+ for (unsigned i = 0, e = $3->size(); i != e; ++i) {
+ Constant *C = (*$3)[i].C;
+ if (C->getType() != STy->getElementType(i))
+ error("Expected type '" + STy->getElementType(i)->getDescription() +
+ "' for element #" + utostr(i) + " of structure initializer");
+ Fields.push_back(C);
+ }
+ $$.C = ConstantStruct::get(STy, Fields);
+ $$.S = $1.S;
+ delete $1.T;
delete $3;
}
| Types '{' '}' {
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " {}";
+ const StructType *STy = dyn_cast<StructType>($1.T->get());
+ if (STy == 0)
+ error("Cannot make struct constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ if (STy->getNumContainedTypes() != 0)
+ error("Illegal number of initializers for structure type");
+ $$.C = ConstantStruct::get(STy, std::vector<Constant*>());
+ $$.S = $1.S;
+ delete $1.T;
+ }
+ | Types '<' '{' ConstVector '}' '>' {
+ const StructType *STy = dyn_cast<StructType>($1.T->get());
+ if (STy == 0)
+ error("Cannot make packed struct constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ if ($4->size() != STy->getNumContainedTypes())
+ error("Illegal number of initializers for packed structure type");
+
+ // Check to ensure that constants are compatible with the type initializer!
+ std::vector<Constant*> Fields;
+ for (unsigned i = 0, e = $4->size(); i != e; ++i) {
+ Constant *C = (*$4)[i].C;
+ if (C->getType() != STy->getElementType(i))
+ error("Expected type '" + STy->getElementType(i)->getDescription() +
+ "' for element #" + utostr(i) + " of packed struct initializer");
+ Fields.push_back(C);
+ }
+ $$.C = ConstantStruct::get(STy, Fields);
+ $$.S = $1.S;
+ delete $1.T;
+ delete $4;
+ }
+ | Types '<' '{' '}' '>' {
+ const StructType *STy = dyn_cast<StructType>($1.T->get());
+ if (STy == 0)
+ error("Cannot make packed struct constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ if (STy->getNumContainedTypes() != 0)
+ error("Illegal number of initializers for packed structure type");
+ $$.C = ConstantStruct::get(STy, std::vector<Constant*>());
+ $$.S = $1.S;
+ delete $1.T;
}
| Types NULL_TOK {
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
+ const PointerType *PTy = dyn_cast<PointerType>($1.T->get());
+ if (PTy == 0)
+ error("Cannot make null pointer constant with type: '" +
+ $1.T->get()->getDescription() + "'");
+ $$.C = ConstantPointerNull::get(PTy);
+ $$.S = $1.S;
+ delete $1.T;
}
| Types UNDEF {
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
+ $$.C = UndefValue::get($1.T->get());
+ $$.S = $1.S;
+ delete $1.T;
}
| Types SymbolicValueRef {
- $$ = new Constant;
- std::string Name = getUniqueName($2, $1->resolve(), true);
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + Name;
- delete $2;
+ const PointerType *Ty = dyn_cast<PointerType>($1.T->get());
+ if (Ty == 0)
+ error("Global const reference must be a pointer type, not" +
+ $1.T->get()->getDescription());
+
+ // ConstExprs can exist in the body of a function, thus creating
+ // GlobalValues whenever they refer to a variable. Because we are in
+ // the context of a function, getExistingValue will search the functions
+ // symbol table instead of the module symbol table for the global symbol,
+ // which throws things all off. To get around this, we just tell
+ // getExistingValue that we are at global scope here.
+ //
+ Function *SavedCurFn = CurFun.CurrentFunction;
+ CurFun.CurrentFunction = 0;
+ Value *V = getExistingValue(Ty, $2);
+ CurFun.CurrentFunction = SavedCurFn;
+
+ // If this is an initializer for a constant pointer, which is referencing a
+ // (currently) undefined variable, create a stub now that shall be replaced
+ // in the future with the right type of variable.
+ //
+ if (V == 0) {
+ assert(isa<PointerType>(Ty) && "Globals may only be used as pointers");
+ const PointerType *PT = cast<PointerType>(Ty);
+
+ // First check to see if the forward references value is already created!
+ PerModuleInfo::GlobalRefsType::iterator I =
+ CurModule.GlobalRefs.find(std::make_pair(PT, $2));
+
+ if (I != CurModule.GlobalRefs.end()) {
+ V = I->second; // Placeholder already exists, use it...
+ $2.destroy();
+ } else {
+ std::string Name;
+ if ($2.Type == ValID::NameVal) Name = $2.Name;
+
+ // Create the forward referenced global.
+ GlobalValue *GV;
+ if (const FunctionType *FTy =
+ dyn_cast<FunctionType>(PT->getElementType())) {
+ GV = new Function(FTy, GlobalValue::ExternalLinkage, Name,
+ CurModule.CurrentModule);
+ } else {
+ GV = new GlobalVariable(PT->getElementType(), false,
+ GlobalValue::ExternalLinkage, 0,
+ Name, CurModule.CurrentModule);
+ }
+
+ // Keep track of the fact that we have a forward ref to recycle it
+ CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, $2), GV));
+ V = GV;
+ }
+ }
+ $$.C = cast<GlobalValue>(V);
+ $$.S = $1.S;
+ delete $1.T; // Free the type handle
}
| Types ConstExpr {
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
+ if ($1.T->get() != $2.C->getType())
+ error("Mismatched types for constant expression");
+ $$ = $2;
+ $$.S = $1.S;
+ delete $1.T;
}
| Types ZEROINITIALIZER {
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
- }
- | SIntType EInt64Val { // integral constants
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
- }
- | UIntType EInt64Val { // integral constants
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
+ const Type *Ty = $1.T->get();
+ if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
+ error("Cannot create a null initialized value of this type");
+ $$.C = Constant::getNullValue(Ty);
+ $$.S = $1.S;
+ delete $1.T;
+ }
+ | SIntType EINT64VAL { // integral constants
+ const Type *Ty = $1.T;
+ if (!ConstantInt::isValueValidForType(Ty, $2))
+ error("Constant value doesn't fit in type");
+ $$.C = ConstantInt::get(Ty, $2);
+ $$.S = Signed;
+ }
+ | UIntType EUINT64VAL { // integral constants
+ const Type *Ty = $1.T;
+ if (!ConstantInt::isValueValidForType(Ty, $2))
+ error("Constant value doesn't fit in type");
+ $$.C = ConstantInt::get(Ty, $2);
+ $$.S = Unsigned;
}
| BOOL TRUETOK { // Boolean constants
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
+ $$.C = ConstantInt::get(Type::Int1Ty, true);
+ $$.S = Unsigned;
}
| BOOL FALSETOK { // Boolean constants
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
+ $$.C = ConstantInt::get(Type::Int1Ty, false);
+ $$.S = Unsigned;
}
| FPType FPVAL { // Float & Double constants
- $$ = new Constant;
- $$->type = $1;
- $$->cnst = new std::string($1->getNewTy());
- *$$->cnst += " " + *$2;
- delete $2;
- };
+ if (!ConstantFP::isValueValidForType($1.T, $2))
+ error("Floating point constant invalid for type");
+ $$.C = ConstantFP::get($1.T, $2);
+ $$.S = Signless;
+ }
+ ;
-ConstExpr: CastOps '(' ConstVal TO Types ')' {
- std::string source = *$3->cnst;
- const Type* SrcTy = $3->type->resolve();
- const Type* DstTy = $5->resolve();
- if (*$1 == "cast") {
- // Call getCastUpgrade to upgrade the old cast
- $$ = new std::string(getCastUpgrade(source, SrcTy, DstTy, true));
- } else {
- // Nothing to upgrade, just create the cast constant expr
- $$ = new std::string(*$1);
- *$$ += "( " + source + " to " + $5->getNewTy() + ")";
- }
- delete $1; delete $3; delete $4;
+ConstExpr
+ : CastOps '(' ConstVal TO Types ')' {
+ const Type* SrcTy = $3.C->getType();
+ const Type* DstTy = $5.T->get();
+ Signedness SrcSign = $3.S;
+ Signedness DstSign = $5.S;
+ if (!SrcTy->isFirstClassType())
+ error("cast constant expression from a non-primitive type: '" +
+ SrcTy->getDescription() + "'");
+ if (!DstTy->isFirstClassType())
+ error("cast constant expression to a non-primitive type: '" +
+ DstTy->getDescription() + "'");
+ $$.C = cast<Constant>(getCast($1, $3.C, SrcSign, DstTy, DstSign));
+ $$.S = DstSign;
+ delete $5.T;
}
| GETELEMENTPTR '(' ConstVal IndexList ')' {
- *$1 += "(" + *$3->cnst;
- for (unsigned i = 0; i < $4->size(); ++i) {
- Value* V = (*$4)[i];
- *$1 += ", " + *V->val;
- delete V;
- }
- *$1 += ")";
- $$ = $1;
- delete $3;
+ const Type *Ty = $3.C->getType();
+ if (!isa<PointerType>(Ty))
+ error("GetElementPtr requires a pointer operand");
+
+ std::vector<Value*> VIndices;
+ std::vector<Constant*> CIndices;
+ upgradeGEPIndices($3.C->getType(), $4, VIndices, &CIndices);
+
delete $4;
+ $$.C = ConstantExpr::getGetElementPtr($3.C, CIndices);
+ $$.S = Signless;
}
| SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
- *$1 += "(" + *$3->cnst + "," + *$5->cnst + "," + *$7->cnst + ")";
- delete $3; delete $5; delete $7;
- $$ = $1;
+ if (!$3.C->getType()->isInteger() ||
+ cast<IntegerType>($3.C->getType())->getBitWidth() != 1)
+ error("Select condition must be bool type");
+ if ($5.C->getType() != $7.C->getType())
+ error("Select operand types must match");
+ $$.C = ConstantExpr::getSelect($3.C, $5.C, $7.C);
+ $$.S = Unsigned;
}
| ArithmeticOps '(' ConstVal ',' ConstVal ')' {
- const char* op = getDivRemOpcode(*$1, $3->type);
- $$ = new std::string(op);
- *$$ += "(" + *$3->cnst + "," + *$5->cnst + ")";
- delete $1; delete $3; delete $5;
+ const Type *Ty = $3.C->getType();
+ if (Ty != $5.C->getType())
+ error("Binary operator types must match");
+ // First, make sure we're dealing with the right opcode by upgrading from
+ // obsolete versions.
+ Instruction::BinaryOps Opcode = getBinaryOp($1, Ty, $3.S);
+
+ // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs.
+ // To retain backward compatibility with these early compilers, we emit a
+ // cast to the appropriate integer type automatically if we are in the
+ // broken case. See PR424 for more information.
+ if (!isa<PointerType>(Ty)) {
+ $$.C = ConstantExpr::get(Opcode, $3.C, $5.C);
+ } else {
+ const Type *IntPtrTy = 0;
+ switch (CurModule.CurrentModule->getPointerSize()) {
+ case Module::Pointer32: IntPtrTy = Type::Int32Ty; break;
+ case Module::Pointer64: IntPtrTy = Type::Int64Ty; break;
+ default: error("invalid pointer binary constant expr");
+ }
+ $$.C = ConstantExpr::get(Opcode,
+ ConstantExpr::getCast(Instruction::PtrToInt, $3.C, IntPtrTy),
+ ConstantExpr::getCast(Instruction::PtrToInt, $5.C, IntPtrTy));
+ $$.C = ConstantExpr::getCast(Instruction::IntToPtr, $$.C, Ty);
+ }
+ $$.S = $3.S;
}
| LogicalOps '(' ConstVal ',' ConstVal ')' {
- *$1 += "(" + *$3->cnst + "," + *$5->cnst + ")";
- delete $3; delete $5;
- $$ = $1;
+ const Type* Ty = $3.C->getType();
+ if (Ty != $5.C->getType())
+ error("Logical operator types must match");
+ if (!Ty->isInteger()) {
+ if (!isa<PackedType>(Ty) ||
+ !cast<PackedType>(Ty)->getElementType()->isInteger())
+ error("Logical operator requires integer operands");
+ }
+ Instruction::BinaryOps Opcode = getBinaryOp($1, Ty, $3.S);
+ $$.C = ConstantExpr::get(Opcode, $3.C, $5.C);
+ $$.S = $3.S;
}
| SetCondOps '(' ConstVal ',' ConstVal ')' {
- *$1 = getCompareOp(*$1, $3->type);
- *$1 += "(" + *$3->cnst + "," + *$5->cnst + ")";
- delete $3; delete $5;
- $$ = $1;
+ const Type* Ty = $3.C->getType();
+ if (Ty != $5.C->getType())
+ error("setcc operand types must match");
+ unsigned short pred;
+ Instruction::OtherOps Opcode = getCompareOp($1, pred, Ty, $3.S);
+ $$.C = ConstantExpr::getCompare(Opcode, $3.C, $5.C);
+ $$.S = Unsigned;
}
| ICMP IPredicates '(' ConstVal ',' ConstVal ')' {
- *$1 += " " + *$2 + " (" + *$4->cnst + "," + *$6->cnst + ")";
- delete $2; delete $4; delete $6;
- $$ = $1;
+ if ($4.C->getType() != $6.C->getType())
+ error("icmp operand types must match");
+ $$.C = ConstantExpr::getCompare($2, $4.C, $6.C);
+ $$.S = Unsigned;
}
| FCMP FPredicates '(' ConstVal ',' ConstVal ')' {
- *$1 += " " + *$2 + " (" + *$4->cnst + "," + *$6->cnst + ")";
- delete $2; delete $4; delete $6;
- $$ = $1;
+ if ($4.C->getType() != $6.C->getType())
+ error("fcmp operand types must match");
+ $$.C = ConstantExpr::getCompare($2, $4.C, $6.C);
+ $$.S = Unsigned;
}
| ShiftOps '(' ConstVal ',' ConstVal ')' {
- const char* shiftop = $1->c_str();
- if (*$1 == "shr")
- shiftop = ($3->type->isUnsigned()) ? "lshr" : "ashr";
- $$ = new std::string(shiftop);
- *$$ += "(" + *$3->cnst + "," + *$5->cnst + ")";
- delete $1; delete $3; delete $5;
+ if (!$5.C->getType()->isInteger() ||
+ cast<IntegerType>($5.C->getType())->getBitWidth() != 8)
+ error("Shift count for shift constant must be unsigned byte");
+ if (!$3.C->getType()->isInteger())
+ error("Shift constant expression requires integer operand");
+ $$.C = ConstantExpr::get(getOtherOp($1, $3.S), $3.C, $5.C);
+ $$.S = $3.S;
}
| EXTRACTELEMENT '(' ConstVal ',' ConstVal ')' {
- *$1 += "(" + *$3->cnst + "," + *$5->cnst + ")";
- delete $3; delete $5;
- $$ = $1;
+ if (!ExtractElementInst::isValidOperands($3.C, $5.C))
+ error("Invalid extractelement operands");
+ $$.C = ConstantExpr::getExtractElement($3.C, $5.C);
+ $$.S = $3.S;
}
| INSERTELEMENT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
- *$1 += "(" + *$3->cnst + "," + *$5->cnst + "," + *$7->cnst + ")";
- delete $3; delete $5; delete $7;
- $$ = $1;
+ if (!InsertElementInst::isValidOperands($3.C, $5.C, $7.C))
+ error("Invalid insertelement operands");
+ $$.C = ConstantExpr::getInsertElement($3.C, $5.C, $7.C);
+ $$.S = $3.S;
}
| SHUFFLEVECTOR '(' ConstVal ',' ConstVal ',' ConstVal ')' {
- *$1 += "(" + *$3->cnst + "," + *$5->cnst + "," + *$7->cnst + ")";
- delete $3; delete $5; delete $7;
- $$ = $1;
- };
+ if (!ShuffleVectorInst::isValidOperands($3.C, $5.C, $7.C))
+ error("Invalid shufflevector operands");
+ $$.C = ConstantExpr::getShuffleVector($3.C, $5.C, $7.C);
+ $$.S = $3.S;
+ }
+ ;
// ConstVector - A list of comma separated constants.
-
ConstVector
- : ConstVector ',' ConstVal {
- *$1 += ", " + *$3->cnst;
- delete $3;
- $$ = $1;
+ : ConstVector ',' ConstVal { ($$ = $1)->push_back($3); }
+ | ConstVal {
+ $$ = new std::vector<ConstInfo>();
+ $$->push_back($1);
}
- | ConstVal { $$ = new std::string(*$1->cnst); delete $1; }
;
// GlobalType - Match either GLOBAL or CONSTANT for global declarations...
-GlobalType : GLOBAL | CONSTANT ;
+GlobalType
+ : GLOBAL { $$ = false; }
+ | CONSTANT { $$ = true; }
+ ;
//===----------------------------------------------------------------------===//
@@ -1461,819 +2375,1059 @@ GlobalType : GLOBAL | CONSTANT ;
// Module rule: Capture the result of parsing the whole file into a result
// variable...
//
-Module : DefinitionList {
-};
+Module
+ : FunctionList {
+ $$ = ParserResult = $1;
+ CurModule.ModuleDone();
+ }
+ ;
-// DefinitionList - Top level definitions
+// FunctionList - A list of functions, preceeded by a constant pool.
//
-DefinitionList : DefinitionList Function {
- $$ = 0;
- }
- | DefinitionList FunctionProto {
- *O << *$2 << '\n';
- delete $2;
- $$ = 0;
- }
- | DefinitionList MODULE ASM_TOK AsmBlock {
- *O << "module asm " << ' ' << *$4 << '\n';
- $$ = 0;
- }
- | DefinitionList IMPLEMENTATION {
- *O << "implementation\n";
- $$ = 0;
+FunctionList
+ : FunctionList Function { $$ = $1; CurFun.FunctionDone(); }
+ | FunctionList FunctionProto { $$ = $1; }
+ | FunctionList MODULE ASM_TOK AsmBlock { $$ = $1; }
+ | FunctionList IMPLEMENTATION { $$ = $1; }
+ | ConstPool {
+ $$ = CurModule.CurrentModule;
+ // Emit an error if there are any unresolved types left.
+ if (!CurModule.LateResolveTypes.empty()) {
+ const ValID &DID = CurModule.LateResolveTypes.begin()->first;
+ if (DID.Type == ValID::NameVal) {
+ error("Reference to an undefined type: '"+DID.getName() + "'");
+ } else {
+ error("Reference to an undefined type: #" + itostr(DID.Num));
+ }
+ }
}
- | ConstPool { $$ = 0; }
;
-External : EXTERNAL | UNINITIALIZED { $$ = $1; *$$ = "external"; } ;
-
// ConstPool - Constants with optional names assigned to them.
-ConstPool : ConstPool OptAssign TYPE TypesV {
- Type::EnumeratedTypes.push_back($4);
- if (!$2->empty()) {
- Type::NamedTypes[*$2] = $4;
- *O << *$2 << " = ";
+ConstPool
+ : ConstPool OptAssign TYPE TypesV {
+ // Eagerly resolve types. This is not an optimization, this is a
+ // requirement that is due to the fact that we could have this:
+ //
+ // %list = type { %list * }
+ // %list = type { %list * } ; repeated type decl
+ //
+ // If types are not resolved eagerly, then the two types will not be
+ // determined to be the same type!
+ //
+ const Type* Ty = $4.T->get();
+ ResolveTypeTo($2, Ty);
+
+ if (!setTypeName(Ty, $2) && !$2) {
+ // If this is a named type that is not a redefinition, add it to the slot
+ // table.
+ CurModule.Types.push_back(Ty);
}
- *O << "type " << $4->getNewTy() << '\n';
- delete $2; delete $3;
- $$ = 0;
+ delete $4.T;
}
| ConstPool FunctionProto { // Function prototypes can be in const pool
- *O << *$2 << '\n';
- delete $2;
- $$ = 0;
}
| ConstPool MODULE ASM_TOK AsmBlock { // Asm blocks can be in the const pool
- *O << *$2 << ' ' << *$3 << ' ' << *$4 << '\n';
- delete $2; delete $3; delete $4;
- $$ = 0;
}
- | ConstPool OptAssign OptLinkage GlobalType ConstVal GlobalVarAttributes {
- if (!$2->empty()) {
- std::string Name = getGlobalName($2,*$3, $5->type->getPointerType(),
- *$4 == "constant");
- *O << Name << " = ";
- }
- *O << *$3 << ' ' << *$4 << ' ' << *$5->cnst << ' ' << *$6 << '\n';
- delete $2; delete $3; delete $4; delete $6;
- $$ = 0;
- }
- | ConstPool OptAssign External GlobalType Types GlobalVarAttributes {
- if (!$2->empty()) {
- std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
- *$4 == "constant");
- *O << Name << " = ";
- }
- *O << *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
- delete $2; delete $3; delete $4; delete $6;
- $$ = 0;
- }
- | ConstPool OptAssign DLLIMPORT GlobalType Types GlobalVarAttributes {
- if (!$2->empty()) {
- std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
- *$4 == "constant");
- *O << Name << " = ";
- }
- *O << *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
- delete $2; delete $3; delete $4; delete $6;
- $$ = 0;
- }
- | ConstPool OptAssign EXTERN_WEAK GlobalType Types GlobalVarAttributes {
- if (!$2->empty()) {
- std::string Name = getGlobalName($2,*$3,$5->getPointerType(),
- *$4 == "constant");
- *O << Name << " = ";
- }
- *O << *$3 << ' ' << *$4 << ' ' << $5->getNewTy() << ' ' << *$6 << '\n';
- delete $2; delete $3; delete $4; delete $6;
- $$ = 0;
+ | ConstPool OptAssign OptLinkage GlobalType ConstVal {
+ if ($5.C == 0)
+ error("Global value initializer is not a constant");
+ CurGV = ParseGlobalVariable($2, $3, $4, $5.C->getType(), $5.C);
+ } GlobalVarAttributes {
+ CurGV = 0;
+ }
+ | ConstPool OptAssign EXTERNAL GlobalType Types {
+ const Type *Ty = $5.T->get();
+ CurGV = ParseGlobalVariable($2, GlobalValue::ExternalLinkage, $4, Ty, 0);
+ delete $5.T;
+ } GlobalVarAttributes {
+ CurGV = 0;
+ }
+ | ConstPool OptAssign DLLIMPORT GlobalType Types {
+ const Type *Ty = $5.T->get();
+ CurGV = ParseGlobalVariable($2, GlobalValue::DLLImportLinkage, $4, Ty, 0);
+ delete $5.T;
+ } GlobalVarAttributes {
+ CurGV = 0;
+ }
+ | ConstPool OptAssign EXTERN_WEAK GlobalType Types {
+ const Type *Ty = $5.T->get();
+ CurGV =
+ ParseGlobalVariable($2, GlobalValue::ExternalWeakLinkage, $4, Ty, 0);
+ delete $5.T;
+ } GlobalVarAttributes {
+ CurGV = 0;
}
| ConstPool TARGET TargetDefinition {
- *O << *$2 << ' ' << *$3 << '\n';
- delete $2; delete $3;
- $$ = 0;
}
| ConstPool DEPLIBS '=' LibrariesDefinition {
- *O << *$2 << " = " << *$4 << '\n';
- delete $2; delete $4;
- $$ = 0;
}
| /* empty: end of list */ {
- $$ = 0;
- };
+ }
+ ;
+AsmBlock
+ : STRINGCONSTANT {
+ const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
+ char *EndStr = UnEscapeLexed($1, true);
+ std::string NewAsm($1, EndStr);
+ free($1);
-AsmBlock : STRINGCONSTANT ;
+ if (AsmSoFar.empty())
+ CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
+ else
+ CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
+ }
+ ;
-BigOrLittle : BIG | LITTLE ;
+BigOrLittle
+ : BIG { $$ = Module::BigEndian; };
+ | LITTLE { $$ = Module::LittleEndian; }
+ ;
TargetDefinition
: ENDIAN '=' BigOrLittle {
- *$1 += " = " + *$3;
- delete $3;
- $$ = $1;
+ CurModule.setEndianness($3);
}
| POINTERSIZE '=' EUINT64VAL {
- *$1 += " = " + *$3;
- if (*$3 == "64")
- SizeOfPointer = 64;
- delete $3;
- $$ = $1;
+ if ($3 == 32)
+ CurModule.setPointerSize(Module::Pointer32);
+ else if ($3 == 64)
+ CurModule.setPointerSize(Module::Pointer64);
+ else
+ error("Invalid pointer size: '" + utostr($3) + "'");
}
| TRIPLE '=' STRINGCONSTANT {
- *$1 += " = " + *$3;
- delete $3;
- $$ = $1;
+ CurModule.CurrentModule->setTargetTriple($3);
+ free($3);
}
| DATALAYOUT '=' STRINGCONSTANT {
- *$1 += " = " + *$3;
- delete $3;
- $$ = $1;
- };
+ CurModule.CurrentModule->setDataLayout($3);
+ free($3);
+ }
+ ;
LibrariesDefinition
- : '[' LibList ']' {
- $2->insert(0, "[ ");
- *$2 += " ]";
- $$ = $2;
- };
+ : '[' LibList ']'
+ ;
LibList
: LibList ',' STRINGCONSTANT {
- *$1 += ", " + *$3;
- delete $3;
- $$ = $1;
+ CurModule.CurrentModule->addLibrary($3);
+ free($3);
}
- | STRINGCONSTANT
- | /* empty: end of list */ {
- $$ = new std::string();
- };
+ | STRINGCONSTANT {
+ CurModule.CurrentModule->addLibrary($1);
+ free($1);
+ }
+ | /* empty: end of list */ { }
+ ;
//===----------------------------------------------------------------------===//
// Rules to match Function Headers
//===----------------------------------------------------------------------===//
-Name : VAR_ID | STRINGCONSTANT;
-OptName : Name | /*empty*/ { $$ = new std::string(); };
+Name
+ : VAR_ID | STRINGCONSTANT
+ ;
+
+OptName
+ : Name
+ | /*empty*/ { $$ = 0; }
+ ;
-ArgVal : Types OptName {
- $$ = new std::string($1->getNewTy());
- if (!$2->empty()) {
- std::string Name = getUniqueName($2, $1->resolve());
- *$$ += " " + Name;
+ArgVal
+ : Types OptName {
+ if ($1.T->get() == Type::VoidTy)
+ error("void typed arguments are invalid");
+ $$ = new std::pair<PATypeInfo, char*>($1, $2);
}
- delete $2;
-};
+ ;
-ArgListH : ArgListH ',' ArgVal {
- *$1 += ", " + *$3;
+ArgListH
+ : ArgListH ',' ArgVal {
+ $$ = $1;
+ $$->push_back(*$3);
delete $3;
}
| ArgVal {
- $$ = $1;
- };
-
-ArgList : ArgListH {
- $$ = $1;
+ $$ = new std::vector<std::pair<PATypeInfo,char*> >();
+ $$->push_back(*$1);
+ delete $1;
}
+ ;
+
+ArgList
+ : ArgListH { $$ = $1; }
| ArgListH ',' DOTDOTDOT {
- *$1 += ", ...";
$$ = $1;
- delete $3;
+ PATypeInfo VoidTI;
+ VoidTI.T = new PATypeHolder(Type::VoidTy);
+ VoidTI.S = Signless;
+ $$->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
}
| DOTDOTDOT {
- $$ = $1;
+ $$ = new std::vector<std::pair<PATypeInfo,char*> >();
+ PATypeInfo VoidTI;
+ VoidTI.T = new PATypeHolder(Type::VoidTy);
+ VoidTI.S = Signless;
+ $$->push_back(std::pair<PATypeInfo, char*>(VoidTI, 0));
}
- | /* empty */ { $$ = new std::string(); };
+ | /* empty */ { $$ = 0; }
+ ;
FunctionHeaderH
: OptCallingConv TypesV Name '(' ArgList ')' OptSection OptAlign {
- if (*$3 == "%llvm.va_start" || *$3 == "%llvm.va_end") {
- *$5 = "i8*";
- } else if (*$3 == "%llvm.va_copy") {
- *$5 = "i8*, i8*";
+ UnEscapeLexed($3);
+ std::string FunctionName($3);
+ free($3); // Free strdup'd memory!
+
+ const Type* RetTy = $2.T->get();
+
+ if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
+ error("LLVM functions cannot return aggregate types");
+
+ std::vector<const Type*> ParamTypeList;
+
+ // In LLVM 2.0 the signatures of three varargs intrinsics changed to take
+ // i8*. We check here for those names and override the parameter list
+ // types to ensure the prototype is correct.
+ if (FunctionName == "llvm.va_start" || FunctionName == "llvm.va_end") {
+ ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+ } else if (FunctionName == "llvm.va_copy") {
+ ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+ ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
+ } else if ($5) { // If there are arguments...
+ for (std::vector<std::pair<PATypeInfo,char*> >::iterator
+ I = $5->begin(), E = $5->end(); I != E; ++I) {
+ const Type *Ty = I->first.T->get();
+ ParamTypeList.push_back(Ty);
+ }
}
- if (!$1->empty()) {
- *$1 += " ";
+
+ bool isVarArg =
+ ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
+ if (isVarArg) ParamTypeList.pop_back();
+
+ const FunctionType *FT = FunctionType::get(RetTy, ParamTypeList, isVarArg);
+ const PointerType *PFT = PointerType::get(FT);
+ delete $2.T;
+
+ ValID ID;
+ if (!FunctionName.empty()) {
+ ID = ValID::create((char*)FunctionName.c_str());
+ } else {
+ ID = ValID::create((int)CurModule.Values[PFT].size());
}
- *$1 += $2->getNewTy() + " " + *$3 + "(" + *$5 + ")";
- if (!$7->empty()) {
- *$1 += " " + *$7;
+
+ Function *Fn = 0;
+ // See if this function was forward referenced. If so, recycle the object.
+ if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) {
+ // Move the function to the end of the list, from whereever it was
+ // previously inserted.
+ Fn = cast<Function>(FWRef);
+ CurModule.CurrentModule->getFunctionList().remove(Fn);
+ CurModule.CurrentModule->getFunctionList().push_back(Fn);
+ } else if (!FunctionName.empty() && // Merge with an earlier prototype?
+ (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) {
+ // If this is the case, either we need to be a forward decl, or it needs
+ // to be.
+ if (!CurFun.isDeclare && !Fn->isExternal())
+ error("Redefinition of function '" + FunctionName + "'");
+
+ // Make sure to strip off any argument names so we can't get conflicts.
+ if (Fn->isExternal())
+ for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
+ AI != AE; ++AI)
+ AI->setName("");
+ } else { // Not already defined?
+ Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
+ CurModule.CurrentModule);
+
+ InsertValue(Fn, CurModule.Values);
}
- if (!$8->empty()) {
- *$1 += " " + *$8;
+
+ CurFun.FunctionStart(Fn);
+
+ if (CurFun.isDeclare) {
+ // If we have declaration, always overwrite linkage. This will allow us
+ // to correctly handle cases, when pointer to function is passed as
+ // argument to another function.
+ Fn->setLinkage(CurFun.Linkage);
}
- delete $3;
- delete $5;
- delete $7;
- delete $8;
- $$ = $1;
- };
+ Fn->setCallingConv($1);
+ Fn->setAlignment($8);
+ if ($7) {
+ Fn->setSection($7);
+ free($7);
+ }
+
+ // Add all of the arguments we parsed to the function...
+ if ($5) { // Is null if empty...
+ if (isVarArg) { // Nuke the last entry
+ assert($5->back().first.T->get() == Type::VoidTy &&
+ $5->back().second == 0 && "Not a varargs marker");
+ delete $5->back().first.T;
+ $5->pop_back(); // Delete the last entry
+ }
+ Function::arg_iterator ArgIt = Fn->arg_begin();
+ for (std::vector<std::pair<PATypeInfo,char*> >::iterator
+ I = $5->begin(), E = $5->end(); I != E; ++I, ++ArgIt) {
+ delete I->first.T; // Delete the typeholder...
+ setValueName(ArgIt, I->second); // Insert arg into symtab...
+ InsertValue(ArgIt);
+ }
+ delete $5; // We're now done with the argument list
+ }
+ }
+ ;
-BEGIN : BEGINTOK { $$ = new std::string("{"); delete $1; }
- | '{' { $$ = new std::string ("{"); }
+BEGIN
+ : BEGINTOK | '{' // Allow BEGIN or '{' to start a function
;
FunctionHeader
: OptLinkage FunctionHeaderH BEGIN {
- *O << "define ";
- if (!$1->empty()) {
- *O << *$1 << ' ';
- }
- *O << *$2 << ' ' << *$3 << '\n';
- delete $1; delete $2; delete $3;
- $$ = 0;
+ $$ = CurFun.CurrentFunction;
+
+ // Make sure that we keep track of the linkage type even if there was a
+ // previous "declare".
+ $$->setLinkage($1);
}
;
-END : ENDTOK { $$ = new std::string("}"); delete $1; }
- | '}' { $$ = new std::string("}"); };
+END
+ : ENDTOK | '}' // Allow end of '}' to end a function
+ ;
-Function : FunctionHeader BasicBlockList END {
- if ($2)
- *O << *$2;
- *O << *$3 << "\n\n";
- delete $1; delete $2; delete $3;
- $$ = 0;
-};
+Function
+ : BasicBlockList END {
+ $$ = $1;
+ };
FnDeclareLinkage
- : /*default*/ { $$ = new std::string(); }
- | DLLIMPORT
- | EXTERN_WEAK
+ : /*default*/
+ | DLLIMPORT { CurFun.Linkage = GlobalValue::DLLImportLinkage; }
+ | EXTERN_WEAK { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; }
;
FunctionProto
- : DECLARE { isDeclare = true; } FnDeclareLinkage FunctionHeaderH {
- if (!$3->empty())
- *$1 += " " + *$3;
- *$1 += " " + *$4;
- delete $3;
- delete $4;
- $$ = $1;
- isDeclare = false;
- };
+ : DECLARE { CurFun.isDeclare = true; } FnDeclareLinkage FunctionHeaderH {
+ $$ = CurFun.CurrentFunction;
+ CurFun.FunctionDone();
+
+ }
+ ;
//===----------------------------------------------------------------------===//
// Rules to match Basic Blocks
//===----------------------------------------------------------------------===//
-OptSideEffect : /* empty */ { $$ = new std::string(); }
- | SIDEEFFECT;
+OptSideEffect
+ : /* empty */ { $$ = false; }
+ | SIDEEFFECT { $$ = true; }
+ ;
ConstValueRef
- : ESINT64VAL | EUINT64VAL | FPVAL | TRUETOK | FALSETOK | NULL_TOK | UNDEF
- | ZEROINITIALIZER
- | '<' ConstVector '>' {
- $2->insert(0, "<");
- *$2 += ">";
- $$ = $2;
+ // A reference to a direct constant
+ : ESINT64VAL { $$ = ValID::create($1); }
+ | EUINT64VAL { $$ = ValID::create($1); }
+ | FPVAL { $$ = ValID::create($1); }
+ | TRUETOK { $$ = ValID::create(ConstantInt::get(Type::Int1Ty, true)); }
+ | FALSETOK { $$ = ValID::create(ConstantInt::get(Type::Int1Ty, false)); }
+ | NULL_TOK { $$ = ValID::createNull(); }
+ | UNDEF { $$ = ValID::createUndef(); }
+ | ZEROINITIALIZER { $$ = ValID::createZeroInit(); }
+ | '<' ConstVector '>' { // Nonempty unsized packed vector
+ const Type *ETy = (*$2)[0].C->getType();
+ int NumElements = $2->size();
+ PackedType* pt = PackedType::get(ETy, NumElements);
+ PATypeHolder* PTy = new PATypeHolder(
+ HandleUpRefs(PackedType::get(ETy, NumElements)));
+
+ // Verify all elements are correct type!
+ std::vector<Constant*> Elems;
+ for (unsigned i = 0; i < $2->size(); i++) {
+ Constant *C = (*$2)[i].C;
+ const Type *CTy = C->getType();
+ if (ETy != CTy)
+ error("Element #" + utostr(i) + " is not of type '" +
+ ETy->getDescription() +"' as required!\nIt is of type '" +
+ CTy->getDescription() + "'");
+ Elems.push_back(C);
+ }
+ $$ = ValID::create(ConstantPacked::get(pt, Elems));
+ delete PTy; delete $2;
+ }
+ | ConstExpr {
+ $$ = ValID::create($1.C);
}
- | ConstExpr
| ASM_TOK OptSideEffect STRINGCONSTANT ',' STRINGCONSTANT {
- if (!$2->empty()) {
- *$1 += " " + *$2;
- }
- *$1 += " " + *$3 + ", " + *$5;
- delete $2; delete $3; delete $5;
- $$ = $1;
- };
+ char *End = UnEscapeLexed($3, true);
+ std::string AsmStr = std::string($3, End);
+ End = UnEscapeLexed($5, true);
+ std::string Constraints = std::string($5, End);
+ $$ = ValID::createInlineAsm(AsmStr, Constraints, $2);
+ free($3);
+ free($5);
+ }
+ ;
-SymbolicValueRef : IntVal | Name ;
+// SymbolicValueRef - Reference to one of two ways of symbolically refering to
+// another value.
+//
+SymbolicValueRef
+ : INTVAL { $$ = ValID::create($1); }
+ | Name { $$ = ValID::create($1); }
+ ;
// ValueRef - A reference to a definition... either constant or symbolic
ValueRef
- : SymbolicValueRef {
- $$ = new Value;
- $$->val = $1;
- $$->constant = false;
- $$->type = 0;
- }
- | ConstValueRef {
- $$ = new Value;
- $$->val = $1;
- $$->constant = true;
- $$->type = 0;
- }
+ : SymbolicValueRef | ConstValueRef
;
+
// ResolvedVal - a <type> <value> pair. This is used only in cases where the
// 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 {
- $1 = $1->resolve();
- std::string Name = getUniqueName($2->val, $1);
- $$ = $2;
- delete $$->val;
- $$->val = new std::string($1->getNewTy() + " " + Name);
- $$->type = $1;
- };
+ResolvedVal
+ : Types ValueRef {
+ const Type *Ty = $1.T->get();
+ $$.S = $1.S;
+ $$.V = getVal(Ty, $2);
+ delete $1.T;
+ }
+ ;
-BasicBlockList : BasicBlockList BasicBlock {
- $$ = 0;
+BasicBlockList
+ : BasicBlockList BasicBlock {
+ $$ = $1;
}
- | BasicBlock { // Do not allow functions with 0 basic blocks
- $$ = 0;
+ | FunctionHeader BasicBlock { // Do not allow functions with 0 basic blocks
+ $$ = $1;
};
// Basic blocks are terminated by branching instructions:
// br, br/cc, switch, ret
//
-BasicBlock : InstructionList BBTerminatorInst {
- $$ = 0;
- };
+BasicBlock
+ : InstructionList OptAssign BBTerminatorInst {
+ setValueName($3, $2);
+ InsertValue($3);
+ $1->getInstList().push_back($3);
+ InsertValue($1);
+ $$ = $1;
+ }
+ ;
-InstructionList : InstructionList Inst {
- *O << " " << *$2 << '\n';
- delete $2;
- $$ = 0;
+InstructionList
+ : InstructionList Inst {
+ if ($2.I)
+ $1->getInstList().push_back($2.I);
+ $$ = $1;
}
| /* empty */ {
- $$ = 0;
+ $$ = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true);
+ // Make sure to move the basic block to the correct location in the
+ // function, instead of leaving it inserted wherever it was first
+ // referenced.
+ Function::BasicBlockListType &BBL =
+ CurFun.CurrentFunction->getBasicBlockList();
+ BBL.splice(BBL.end(), BBL, $$);
}
| LABELSTR {
- *O << *$1 << '\n';
- delete $1;
- $$ = 0;
- };
+ $$ = CurBB = getBBVal(ValID::create($1), true);
+ // Make sure to move the basic block to the correct location in the
+ // function, instead of leaving it inserted wherever it was first
+ // referenced.
+ Function::BasicBlockListType &BBL =
+ CurFun.CurrentFunction->getBasicBlockList();
+ BBL.splice(BBL.end(), BBL, $$);
+ }
+ ;
-Unwind : UNWIND | EXCEPT { $$ = $1; *$$ = "unwind"; } ;
+Unwind : UNWIND | EXCEPT;
-BBTerminatorInst : RET ResolvedVal { // Return with a result...
- *O << " " << *$1 << ' ' << *$2->val << '\n';
- delete $1; delete $2;
- $$ = 0;
+BBTerminatorInst
+ : RET ResolvedVal { // Return with a result...
+ $$ = new ReturnInst($2.V);
}
| RET VOID { // Return with no result...
- *O << " " << *$1 << ' ' << $2->getNewTy() << '\n';
- delete $1;
- $$ = 0;
+ $$ = new ReturnInst();
}
| BR LABEL ValueRef { // Unconditional Branch...
- *O << " " << *$1 << ' ' << $2->getNewTy() << ' ' << *$3->val << '\n';
- delete $1; delete $3;
- $$ = 0;
+ BasicBlock* tmpBB = getBBVal($3);
+ $$ = new BranchInst(tmpBB);
} // Conditional Branch...
| BR BOOL ValueRef ',' LABEL ValueRef ',' LABEL ValueRef {
- std::string Name = getUniqueName($3->val, $2);
- *O << " " << *$1 << ' ' << $2->getNewTy() << ' ' << Name << ", "
- << $5->getNewTy() << ' ' << *$6->val << ", " << $8->getNewTy() << ' '
- << *$9->val << '\n';
- delete $1; delete $3; delete $6; delete $9;
- $$ = 0;
+ BasicBlock* tmpBBA = getBBVal($6);
+ BasicBlock* tmpBBB = getBBVal($9);
+ Value* tmpVal = getVal(Type::Int1Ty, $3);
+ $$ = new BranchInst(tmpBBA, tmpBBB, tmpVal);
}
| 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 $3;
- delete $6;
+ Value* tmpVal = getVal($2.T, $3);
+ BasicBlock* tmpBB = getBBVal($6);
+ SwitchInst *S = new SwitchInst(tmpVal, tmpBB, $8->size());
+ $$ = S;
+ std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = $8->begin(),
+ E = $8->end();
+ for (; I != E; ++I) {
+ if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
+ S->addCase(CI, I->second);
+ else
+ error("Switch case is constant, but not a simple integer");
+ }
delete $8;
- $$ = 0;
}
| SWITCH IntType ValueRef ',' LABEL ValueRef '[' ']' {
- std::string Name = getUniqueName($3->val, $2);
- *O << " " << *$1 << ' ' << $2->getNewTy() << ' ' << Name << ", "
- << $5->getNewTy() << ' ' << *$6->val << "[]\n";
- delete $1;
- delete $3;
- delete $6;
- $$ = 0;
+ Value* tmpVal = getVal($2.T, $3);
+ BasicBlock* tmpBB = getBBVal($6);
+ SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
+ $$ = S;
}
- | OptAssign INVOKE OptCallingConv TypesV ValueRef '(' ValueRefListE ')'
+ | INVOKE OptCallingConv TypesV ValueRef '(' ValueRefListE ')'
TO LABEL ValueRef Unwind LABEL ValueRef {
- const Type* ResTy = getFunctionReturnType($4);
- *O << " ";
- if (!$1->empty()) {
- std::string Name = getUniqueName($1, ResTy);
- *O << Name << " = ";
+ const PointerType *PFTy;
+ const FunctionType *Ty;
+
+ if (!(PFTy = dyn_cast<PointerType>($3.T->get())) ||
+ !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
+ // Pull out the types of all of the arguments...
+ std::vector<const Type*> ParamTypes;
+ if ($6) {
+ for (std::vector<ValueInfo>::iterator I = $6->begin(), E = $6->end();
+ I != E; ++I)
+ ParamTypes.push_back((*I).V->getType());
+ }
+ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
+ if (isVarArg) ParamTypes.pop_back();
+ Ty = FunctionType::get($3.T->get(), ParamTypes, isVarArg);
+ PFTy = PointerType::get(Ty);
}
- *O << *$2 << ' ' << *$3 << ' ' << $4->getNewTy() << ' ' << *$5->val << " (";
- for (unsigned i = 0; i < $7->size(); ++i) {
- Value* V = (*$7)[i];
- *O << *V->val;
- if (i+1 < $7->size())
- *O << ", ";
- delete V;
+ Value *V = getVal(PFTy, $4); // Get the function we're calling...
+ BasicBlock *Normal = getBBVal($10);
+ BasicBlock *Except = getBBVal($13);
+
+ // Create the call node...
+ if (!$6) { // Has no arguments?
+ $$ = new InvokeInst(V, Normal, Except, std::vector<Value*>());
+ } else { // Has arguments?
+ // Loop through FunctionType's arguments and ensure they are specified
+ // correctly!
+ //
+ FunctionType::param_iterator I = Ty->param_begin();
+ FunctionType::param_iterator E = Ty->param_end();
+ std::vector<ValueInfo>::iterator ArgI = $6->begin(), ArgE = $6->end();
+
+ std::vector<Value*> Args;
+ for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
+ if ((*ArgI).V->getType() != *I)
+ error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
+ (*I)->getDescription() + "'");
+ Args.push_back((*ArgI).V);
+ }
+
+ if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
+ error("Invalid number of parameters detected");
+
+ $$ = new InvokeInst(V, Normal, Except, Args);
}
- *O << ") " << *$9 << ' ' << $10->getNewTy() << ' ' << *$11->val << ' '
- << *$12 << ' ' << $13->getNewTy() << ' ' << *$14->val << '\n';
- delete $1; delete $2; delete $3; delete $5; delete $7;
- delete $9; delete $11; delete $12; delete $14;
- $$ = 0;
+ cast<InvokeInst>($$)->setCallingConv($2);
+ delete $3.T;
+ delete $6;
}
| Unwind {
- *O << " " << *$1 << '\n';
- delete $1;
- $$ = 0;
+ $$ = new UnwindInst();
}
| UNREACHABLE {
- *O << " " << *$1 << '\n';
- delete $1;
- $$ = 0;
- };
+ $$ = new UnreachableInst();
+ }
+ ;
-JumpTable : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
- *$1 += " " + $2->getNewTy() + " " + *$3 + ", " + $5->getNewTy() + " " +
- *$6->val;
- delete $3; delete $6;
+JumpTable
+ : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
$$ = $1;
+ Constant *V = cast<Constant>(getExistingValue($2.T, $3));
+
+ if (V == 0)
+ error("May only switch on a constant pool value");
+
+ BasicBlock* tmpBB = getBBVal($6);
+ $$->push_back(std::make_pair(V, tmpBB));
}
| IntType ConstValueRef ',' LABEL ValueRef {
- $2->insert(0, $1->getNewTy() + " " );
- *$2 += ", " + $4->getNewTy() + " " + *$5->val;
- delete $5;
- $$ = $2;
- };
+ $$ = new std::vector<std::pair<Constant*, BasicBlock*> >();
+ Constant *V = cast<Constant>(getExistingValue($1.T, $2));
+
+ if (V == 0)
+ error("May only switch on a constant pool value");
+
+ BasicBlock* tmpBB = getBBVal($5);
+ $$->push_back(std::make_pair(V, tmpBB));
+ }
+ ;
Inst
: OptAssign InstVal {
- if (!$1->empty()) {
- // 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;
- }
+ bool omit = false;
+ if ($1)
+ if (BitCastInst *BCI = dyn_cast<BitCastInst>($2.I))
+ if (BCI->getSrcTy() == BCI->getDestTy() &&
+ BCI->getOperand(0)->getName() == $1)
+ // This is a useless bit cast causing a name redefinition. It is
+ // a bit cast from a type to the same type of an operand with the
+ // same name as the name we would give this instruction. Since this
+ // instruction results in no code generation, it is safe to omit
+ // the instruction. This situation can occur because of collapsed
+ // type planes. For example:
+ // %X = add int %Y, %Z
+ // %X = cast int %Y to uint
+ // After upgrade, this looks like:
+ // %X = add i32 %Y, %Z
+ // %X = bitcast i32 to i32
+ // The bitcast is clearly useless so we omit it.
+ omit = true;
+ if (omit) {
+ $$.I = 0;
+ $$.S = Signless;
+ } else {
+ setValueName($2.I, $1);
+ InsertValue($2.I);
+ $$ = $2;
}
- *$1 += *$2->val;
- delete $2;
- deleteUselessCastFlag = false;
- $$ = $1;
};
-PHIList
- : Types '[' ValueRef ',' ValueRef ']' { // Used for PHI nodes
- std::string Name = getUniqueName($3->val, $1);
- Name.insert(0, $1->getNewTy() + "[");
- Name += "," + *$5->val + "]";
- $$ = new Value;
- $$->val = new std::string(Name);
- $$->type = $1;
- delete $3; delete $5;
+PHIList : Types '[' ValueRef ',' ValueRef ']' { // Used for PHI nodes
+ $$.P = new std::list<std::pair<Value*, BasicBlock*> >();
+ $$.S = $1.S;
+ Value* tmpVal = getVal($1.T->get(), $3);
+ BasicBlock* tmpBB = getBBVal($5);
+ $$.P->push_back(std::make_pair(tmpVal, tmpBB));
+ delete $1.T;
}
| PHIList ',' '[' ValueRef ',' ValueRef ']' {
- std::string Name = getUniqueName($4->val, $1->type);
- *$1->val += ", [" + Name + "," + *$6->val + "]";
- delete $4;
- delete $6;
$$ = $1;
- };
-
+ Value* tmpVal = getVal($1.P->front().first->getType(), $4);
+ BasicBlock* tmpBB = getBBVal($6);
+ $1.P->push_back(std::make_pair(tmpVal, tmpBB));
+ }
+ ;
-ValueRefList
- : ResolvedVal {
- $$ = new ValueList();
+ValueRefList : ResolvedVal { // Used for call statements, and memory insts...
+ $$ = new std::vector<ValueInfo>();
$$->push_back($1);
}
| ValueRefList ',' ResolvedVal {
$$ = $1;
- $$->push_back($3);
+ $1->push_back($3);
};
// ValueRefListE - Just like ValueRefList, except that it may also be empty!
ValueRefListE
- : ValueRefList { $$ = $1; }
- | /*empty*/ { $$ = new ValueList(); }
+ : ValueRefList
+ | /*empty*/ { $$ = 0; }
;
OptTailCall
: TAIL CALL {
- *$1 += " " + *$2;
- delete $2;
- $$ = $1;
+ $$ = true;
+ }
+ | CALL {
+ $$ = false;
}
- | CALL
;
-InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
- const char* op = getDivRemOpcode(*$1, $2);
- std::string Name1 = getUniqueName($3->val, $2);
- std::string Name2 = getUniqueName($5->val, $2);
- $$ = $3;
- delete $$->val;
- $$->val = new std::string(op);
- *$$->val += " " + $2->getNewTy() + " " + Name1 + ", " + Name2;
- $$->type = $2;
- delete $1; delete $5;
+InstVal
+ : ArithmeticOps Types ValueRef ',' ValueRef {
+ const Type* Ty = $2.T->get();
+ if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa<PackedType>(Ty))
+ error("Arithmetic operator requires integer, FP, or packed operands");
+ if (isa<PackedType>(Ty) &&
+ ($1 == URemOp || $1 == SRemOp || $1 == FRemOp || $1 == RemOp))
+ error("Remainder not supported on packed types");
+ // Upgrade the opcode from obsolete versions before we do anything with it.
+ Instruction::BinaryOps Opcode = getBinaryOp($1, Ty, $2.S);
+ Value* val1 = getVal(Ty, $3);
+ Value* val2 = getVal(Ty, $5);
+ $$.I = BinaryOperator::create(Opcode, val1, val2);
+ if ($$.I == 0)
+ error("binary operator returned null");
+ $$.S = $2.S;
+ delete $2.T;
}
| LogicalOps Types ValueRef ',' ValueRef {
- std::string Name1 = getUniqueName($3->val, $2);
- std::string Name2 = getUniqueName($5->val, $2);
- *$1 += " " + $2->getNewTy() + " " + Name1 + ", " + Name2;
- $$ = $3;
- delete $$->val;
- $$->val = $1;
- $$->type = $2;
- delete $5;
+ const Type *Ty = $2.T->get();
+ if (!Ty->isInteger()) {
+ if (!isa<PackedType>(Ty) ||
+ !cast<PackedType>(Ty)->getElementType()->isInteger())
+ error("Logical operator requires integral operands");
+ }
+ Instruction::BinaryOps Opcode = getBinaryOp($1, Ty, $2.S);
+ Value* tmpVal1 = getVal(Ty, $3);
+ Value* tmpVal2 = getVal(Ty, $5);
+ $$.I = BinaryOperator::create(Opcode, tmpVal1, tmpVal2);
+ if ($$.I == 0)
+ error("binary operator returned null");
+ $$.S = $2.S;
+ delete $2.T;
}
| SetCondOps Types ValueRef ',' ValueRef {
- std::string Name1 = getUniqueName($3->val, $2);
- std::string Name2 = getUniqueName($5->val, $2);
- *$1 = getCompareOp(*$1, $2);
- *$1 += " " + $2->getNewTy() + " " + Name1 + ", " + Name2;
- $$ = $3;
- delete $$->val;
- $$->val = $1;
- $$->type = Type::get("i1",BoolTy);
- delete $5;
+ const Type* Ty = $2.T->get();
+ if(isa<PackedType>(Ty))
+ error("PackedTypes currently not supported in setcc instructions");
+ unsigned short pred;
+ Instruction::OtherOps Opcode = getCompareOp($1, pred, Ty, $2.S);
+ Value* tmpVal1 = getVal(Ty, $3);
+ Value* tmpVal2 = getVal(Ty, $5);
+ $$.I = CmpInst::create(Opcode, pred, tmpVal1, tmpVal2);
+ if ($$.I == 0)
+ error("binary operator returned null");
+ $$.S = Unsigned;
+ delete $2.T;
}
| ICMP IPredicates Types ValueRef ',' ValueRef {
- std::string Name1 = getUniqueName($4->val, $3);
- std::string Name2 = getUniqueName($6->val, $3);
- *$1 += " " + *$2 + " " + $3->getNewTy() + " " + Name1 + "," + Name2;
- $$ = $4;
- delete $$->val;
- $$->val = $1;
- $$->type = Type::get("i1",BoolTy);
- delete $2; delete $6;
+ const Type *Ty = $3.T->get();
+ if (isa<PackedType>(Ty))
+ error("PackedTypes currently not supported in icmp instructions");
+ else if (!Ty->isInteger() && !isa<PointerType>(Ty))
+ error("icmp requires integer or pointer typed operands");
+ Value* tmpVal1 = getVal(Ty, $4);
+ Value* tmpVal2 = getVal(Ty, $6);
+ $$.I = new ICmpInst($2, tmpVal1, tmpVal2);
+ $$.S = Unsigned;
+ delete $3.T;
}
| FCMP FPredicates Types ValueRef ',' ValueRef {
- std::string Name1 = getUniqueName($4->val, $3);
- std::string Name2 = getUniqueName($6->val, $3);
- *$1 += " " + *$2 + " " + $3->getNewTy() + " " + Name1 + "," + Name2;
- $$ = $4;
- delete $$->val;
- $$->val = $1;
- $$->type = Type::get("i1",BoolTy);
- delete $2; delete $6;
+ const Type *Ty = $3.T->get();
+ if (isa<PackedType>(Ty))
+ error("PackedTypes currently not supported in fcmp instructions");
+ else if (!Ty->isFloatingPoint())
+ error("fcmp instruction requires floating point operands");
+ Value* tmpVal1 = getVal(Ty, $4);
+ Value* tmpVal2 = getVal(Ty, $6);
+ $$.I = new FCmpInst($2, tmpVal1, tmpVal2);
+ $$.S = Unsigned;
+ delete $3.T;
+ }
+ | NOT ResolvedVal {
+ warning("Use of obsolete 'not' instruction: Replacing with 'xor");
+ const Type *Ty = $2.V->getType();
+ Value *Ones = ConstantInt::getAllOnesValue(Ty);
+ if (Ones == 0)
+ error("Expected integral type for not instruction");
+ $$.I = BinaryOperator::create(Instruction::Xor, $2.V, Ones);
+ if ($$.I == 0)
+ error("Could not create a xor instruction");
+ $$.S = $2.S
}
| ShiftOps ResolvedVal ',' ResolvedVal {
- const char* shiftop = $1->c_str();
- if (*$1 == "shr")
- shiftop = ($2->type->isUnsigned()) ? "lshr" : "ashr";
- std::string *val = new std::string(shiftop);
- *val += " " + *$2->val + ", " + *$4->val;
- $$ = $2;
- delete $$->val;
- $$->val = val;
- delete $1; delete $4;
+ if (!$4.V->getType()->isInteger() ||
+ cast<IntegerType>($4.V->getType())->getBitWidth() != 8)
+ error("Shift amount must be int8");
+ if (!$2.V->getType()->isInteger())
+ error("Shift constant expression requires integer operand");
+ $$.I = new ShiftInst(getOtherOp($1, $2.S), $2.V, $4.V);
+ $$.S = $2.S;
}
| CastOps ResolvedVal TO Types {
- std::string source = *$2->val;
- const Type* SrcTy = $2->type->resolve();
- const Type* DstTy = $4->resolve();
- $$ = $2;
- delete $$->val;
- $$->val = new std::string();
- $$->type = DstTy;
- if (*$1 == "cast") {
- *$$->val += getCastUpgrade(source, SrcTy, DstTy, false);
- } else {
- *$$->val += *$1 + " " + source + " to " + DstTy->getNewTy();
- }
- // 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 (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);
- if (pos != std::string::npos) {
- // remove the type portion before val
- deleteUselessCastName->erase(0, pos);
- }
- }
- delete $1;
- delete $3;
+ const Type *DstTy = $4.T->get();
+ if (!DstTy->isFirstClassType())
+ error("cast instruction to a non-primitive type: '" +
+ DstTy->getDescription() + "'");
+ $$.I = cast<Instruction>(getCast($1, $2.V, $2.S, DstTy, $4.S, true));
+ $$.S = $4.S;
+ delete $4.T;
}
| SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
- *$1 += " " + *$2->val + ", " + *$4->val + ", " + *$6->val;
- $$ = $2;
- delete $$->val;
- $$->val = $1;
- $$->type = $4->type;
- delete $4;
- delete $6;
+ if (!$2.V->getType()->isInteger() ||
+ cast<IntegerType>($2.V->getType())->getBitWidth() != 1)
+ error("select condition must be bool");
+ if ($4.V->getType() != $6.V->getType())
+ error("select value types should match");
+ $$.I = new SelectInst($2.V, $4.V, $6.V);
+ $$.S = $2.S;
}
| VAARG ResolvedVal ',' Types {
- *$1 += " " + *$2->val + ", " + $4->getNewTy();
- $$ = $2;
- delete $$->val;
- $$->val = $1;
- $$->type = $4;
+ const Type *Ty = $4.T->get();
+ NewVarArgs = true;
+ $$.I = new VAArgInst($2.V, Ty);
+ $$.S = $4.S;
+ delete $4.T;
+ }
+ | VAARG_old ResolvedVal ',' Types {
+ const Type* ArgTy = $2.V->getType();
+ const Type* DstTy = $4.T->get();
+ ObsoleteVarArgs = true;
+ Function* NF = cast<Function>(CurModule.CurrentModule->
+ getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+
+ //b = vaarg a, t ->
+ //foo = alloca 1 of t
+ //bar = vacopy a
+ //store bar -> foo
+ //b = vaarg foo, t
+ AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix");
+ CurBB->getInstList().push_back(foo);
+ CallInst* bar = new CallInst(NF, $2.V);
+ CurBB->getInstList().push_back(bar);
+ CurBB->getInstList().push_back(new StoreInst(bar, foo));
+ $$.I = new VAArgInst(foo, DstTy);
+ $$.S = $4.S;
+ delete $4.T;
+ }
+ | VANEXT_old ResolvedVal ',' Types {
+ const Type* ArgTy = $2.V->getType();
+ const Type* DstTy = $4.T->get();
+ ObsoleteVarArgs = true;
+ Function* NF = cast<Function>(CurModule.CurrentModule->
+ getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+
+ //b = vanext a, t ->
+ //foo = alloca 1 of t
+ //bar = vacopy a
+ //store bar -> foo
+ //tmp = vaarg foo, t
+ //b = load foo
+ AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix");
+ CurBB->getInstList().push_back(foo);
+ CallInst* bar = new CallInst(NF, $2.V);
+ CurBB->getInstList().push_back(bar);
+ CurBB->getInstList().push_back(new StoreInst(bar, foo));
+ Instruction* tmp = new VAArgInst(foo, DstTy);
+ CurBB->getInstList().push_back(tmp);
+ $$.I = new LoadInst(foo);
+ $$.S = $4.S;
+ delete $4.T;
}
| EXTRACTELEMENT ResolvedVal ',' ResolvedVal {
- *$1 += " " + *$2->val + ", " + *$4->val;
- $$ = $2;
- delete $$->val;
- $$->val = $1;
- $$->type = $$->type->resolve();
- $$->type = $$->type->getElementType();
- delete $4;
+ if (!ExtractElementInst::isValidOperands($2.V, $4.V))
+ error("Invalid extractelement operands");
+ $$.I = new ExtractElementInst($2.V, $4.V);
+ $$.S = $2.S;
}
| INSERTELEMENT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
- *$1 += " " + *$2->val + ", " + *$4->val + ", " + *$6->val;
- $$ = $2;
- delete $$->val;
- $$->val = $1;
- delete $4; delete $6;
+ if (!InsertElementInst::isValidOperands($2.V, $4.V, $6.V))
+ error("Invalid insertelement operands");
+ $$.I = new InsertElementInst($2.V, $4.V, $6.V);
+ $$.S = $2.S;
}
| SHUFFLEVECTOR ResolvedVal ',' ResolvedVal ',' ResolvedVal {
- *$1 += " " + *$2->val + ", " + *$4->val + ", " + *$6->val;
- $$ = $2;
- delete $$->val;
- $$->val = $1;
- delete $4; delete $6;
+ if (!ShuffleVectorInst::isValidOperands($2.V, $4.V, $6.V))
+ error("Invalid shufflevector operands");
+ $$.I = new ShuffleVectorInst($2.V, $4.V, $6.V);
+ $$.S = $2.S;
}
| PHI_TOK PHIList {
- *$1 += " " + *$2->val;
- $$ = $2;
- delete $2->val;
- $$->val = $1;
+ const Type *Ty = $2.P->front().first->getType();
+ if (!Ty->isFirstClassType())
+ error("PHI node operands must be of first class type");
+ PHINode *PHI = new PHINode(Ty);
+ PHI->reserveOperandSpace($2.P->size());
+ while ($2.P->begin() != $2.P->end()) {
+ if ($2.P->front().first->getType() != Ty)
+ error("All elements of a PHI node must be of the same type");
+ PHI->addIncoming($2.P->front().first, $2.P->front().second);
+ $2.P->pop_front();
+ }
+ $$.I = PHI;
+ $$.S = $2.S;
+ delete $2.P; // Free the list...
}
| OptTailCall OptCallingConv TypesV ValueRef '(' ValueRefListE ')' {
- // map llvm.isunordered to "fcmp uno"
- $$ = new Value;
- if (*$4->val == "%llvm.isunordered.f32" ||
- *$4->val == "%llvm.isunordered.f64") {
- $$->val = new std::string( "fcmp uno " + *(*$6)[0]->val + ", ");
- size_t pos = (*$6)[1]->val->find(' ');
- assert(pos != std::string::npos && "no space?");
- *$$->val += (*$6)[1]->val->substr(pos+1);
- $$->type = Type::get("i1", BoolTy);
- } else {
- static unsigned upgradeCount = 1;
- if (*$4->val == "%llvm.va_start" || *$4->val == "%llvm.va_end") {
- if (!$6->empty()) {
- std::string name("%va_upgrade");
- name += llvm::utostr(upgradeCount++);
- $1->insert(0, name + " = bitcast " + *(*$6)[0]->val + " to i8*\n ");
- *(*$6)[0]->val = "i8* " + name;
- (*$6)[0]->type = Type::get("i8", UByteTy)->getPointerType();
- }
- } else if (*$4->val == "%llvm.va_copy") {
- std::string name0("%va_upgrade");
- name0 += llvm::utostr(upgradeCount++);
- std::string name1("%va_upgrade");
- name1 += llvm::utostr(upgradeCount++);
- $1->insert(0, name0 + " = bitcast " + *(*$6)[0]->val + " to i8*\n " +
- name1 + " = bitcast " + *(*$6)[1]->val + " to i8*\n ");
- *(*$6)[0]->val = "i8* " + name0;
- (*$6)[0]->type = Type::get("i8", UByteTy)->getPointerType();
- *(*$6)[1]->val = "i8* " + name1;
- (*$6)[0]->type = Type::get("i8", UByteTy)->getPointerType();
+
+ // Handle the short call syntax
+ const PointerType *PFTy;
+ const FunctionType *FTy;
+ if (!(PFTy = dyn_cast<PointerType>($3.T->get())) ||
+ !(FTy = dyn_cast<FunctionType>(PFTy->getElementType()))) {
+ // Pull out the types of all of the arguments...
+ std::vector<const Type*> ParamTypes;
+ if ($6) {
+ for (std::vector<ValueInfo>::iterator I = $6->begin(), E = $6->end();
+ I != E; ++I)
+ ParamTypes.push_back((*I).V->getType());
}
- if (!$2->empty())
- *$1 += " " + *$2;
- if (!$1->empty())
- *$1 += " ";
- *$1 += $3->getNewTy() + " " + *$4->val + "(";
- for (unsigned i = 0; i < $6->size(); ++i) {
- Value* V = (*$6)[i];
- *$1 += *V->val;
- if (i+1 < $6->size())
- *$1 += ", ";
- delete V;
+
+ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
+ if (isVarArg) ParamTypes.pop_back();
+
+ const Type *RetTy = $3.T->get();
+ if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
+ error("Functions cannot return aggregate types");
+
+ FTy = FunctionType::get(RetTy, ParamTypes, isVarArg);
+ PFTy = PointerType::get(FTy);
+ }
+
+ // First upgrade any intrinsic calls.
+ std::vector<Value*> Args;
+ if ($6)
+ for (unsigned i = 0, e = $6->size(); i < e; ++i)
+ Args.push_back((*$6)[i].V);
+ Instruction *Inst = upgradeIntrinsicCall(FTy, $4, Args);
+
+ // If we got an upgraded intrinsic
+ if (Inst) {
+ $$.I = Inst;
+ $$.S = Signless;
+ } else {
+ // Get the function we're calling
+ Value *V = getVal(PFTy, $4);
+
+ // Check the argument values match
+ if (!$6) { // Has no arguments?
+ // Make sure no arguments is a good thing!
+ if (FTy->getNumParams() != 0)
+ error("No arguments passed to a function that expects arguments");
+ } else { // Has arguments?
+ // Loop through FunctionType's arguments and ensure they are specified
+ // correctly!
+ //
+ FunctionType::param_iterator I = FTy->param_begin();
+ FunctionType::param_iterator E = FTy->param_end();
+ std::vector<ValueInfo>::iterator ArgI = $6->begin(), ArgE = $6->end();
+
+ for (; ArgI != ArgE && I != E; ++ArgI, ++I)
+ if ((*ArgI).V->getType() != *I)
+ error("Parameter " +(*ArgI).V->getName()+ " is not of type '" +
+ (*I)->getDescription() + "'");
+
+ if (I != E || (ArgI != ArgE && !FTy->isVarArg()))
+ error("Invalid number of parameters detected");
}
- *$1 += ")";
- $$ = new Value;
- $$->val = $1;
- $$->type = getFunctionReturnType($3);
+
+ // Create the call instruction
+ CallInst *CI = new CallInst(V, Args);
+ CI->setTailCall($1);
+ CI->setCallingConv($2);
+ $$.I = CI;
+ $$.S = $3.S;
}
- delete $2; delete $4; delete $6;
+ delete $3.T;
+ delete $6;
}
- | MemoryInst ;
+ | MemoryInst {
+ $$ = $1;
+ }
+ ;
// IndexList - List of indices for GEP based instructions...
IndexList
- : ',' ValueRefList { $$ = $2; }
- | /* empty */ { $$ = new ValueList(); }
+ : ',' ValueRefList { $$ = $2; }
+ | /* empty */ { $$ = new std::vector<ValueInfo>(); }
;
OptVolatile
- : VOLATILE
- | /* empty */ { $$ = new std::string(); }
+ : VOLATILE { $$ = true; }
+ | /* empty */ { $$ = false; }
;
-MemoryInst : MALLOC Types OptCAlign {
- *$1 += " " + $2->getNewTy();
- if (!$3->empty())
- *$1 += " " + *$3;
- $$ = new Value;
- $$->val = $1;
- $$->type = $2->getPointerType();
- delete $3;
+MemoryInst
+ : MALLOC Types OptCAlign {
+ const Type *Ty = $2.T->get();
+ $$.S = $2.S;
+ $$.I = new MallocInst(Ty, 0, $3);
+ delete $2.T;
}
| MALLOC Types ',' UINT ValueRef OptCAlign {
- std::string Name = getUniqueName($5->val, $4);
- *$1 += " " + $2->getNewTy() + ", " + $4->getNewTy() + " " + Name;
- if (!$6->empty())
- *$1 += " " + *$6;
- $$ = new Value;
- $$->val = $1;
- $$->type = $2->getPointerType();
- delete $5; delete $6;
+ const Type *Ty = $2.T->get();
+ $$.S = $2.S;
+ $$.I = new MallocInst(Ty, getVal($4.T, $5), $6);
+ delete $2.T;
}
| ALLOCA Types OptCAlign {
- *$1 += " " + $2->getNewTy();
- if (!$3->empty())
- *$1 += " " + *$3;
- $$ = new Value;
- $$->val = $1;
- $$->type = $2->getPointerType();
- delete $3;
+ const Type *Ty = $2.T->get();
+ $$.S = $2.S;
+ $$.I = new AllocaInst(Ty, 0, $3);
+ delete $2.T;
}
| ALLOCA Types ',' UINT ValueRef OptCAlign {
- std::string Name = getUniqueName($5->val, $4);
- *$1 += " " + $2->getNewTy() + ", " + $4->getNewTy() + " " + Name;
- if (!$6->empty())
- *$1 += " " + *$6;
- $$ = $5;
- delete $$->val;
- $$->val = $1;
- $$->type = $2->getPointerType();
- delete $6;
+ const Type *Ty = $2.T->get();
+ $$.S = $2.S;
+ $$.I = new AllocaInst(Ty, getVal($4.T, $5), $6);
+ delete $2.T;
}
| FREE ResolvedVal {
- *$1 += " " + *$2->val;
- $$ = $2;
- delete $2->val;
- $$->val = $1;
- $$->type = Type::get("void", VoidTy);
+ const Type *PTy = $2.V->getType();
+ if (!isa<PointerType>(PTy))
+ error("Trying to free nonpointer type '" + PTy->getDescription() + "'");
+ $$.I = new FreeInst($2.V);
+ $$.S = Signless;
}
| OptVolatile LOAD Types ValueRef {
- std::string Name = getUniqueName($4->val, $3);
- if (!$1->empty())
- *$1 += " ";
- *$1 += *$2 + " " + $3->getNewTy() + " " + Name;
- $$ = $4;
- delete $$->val;
- $$->val = $1;
- $$->type = $3->getElementType();
- delete $2;
+ const Type* Ty = $3.T->get();
+ $$.S = $3.S;
+ if (!isa<PointerType>(Ty))
+ error("Can't load from nonpointer type: " + Ty->getDescription());
+ if (!cast<PointerType>(Ty)->getElementType()->isFirstClassType())
+ error("Can't load from pointer of non-first-class type: " +
+ Ty->getDescription());
+ Value* tmpVal = getVal(Ty, $4);
+ $$.I = new LoadInst(tmpVal, "", $1);
+ delete $3.T;
}
| OptVolatile STORE ResolvedVal ',' Types ValueRef {
- std::string Name = getUniqueName($6->val, $5);
- if (!$1->empty())
- *$1 += " ";
- *$1 += *$2 + " " + *$3->val + ", " + $5->getNewTy() + " " + Name;
- $$ = $3;
- delete $$->val;
- $$->val = $1;
- $$->type = Type::get("void", VoidTy);
- delete $2; delete $6;
+ const PointerType *PTy = dyn_cast<PointerType>($5.T->get());
+ if (!PTy)
+ error("Can't store to a nonpointer type: " +
+ $5.T->get()->getDescription());
+ const Type *ElTy = PTy->getElementType();
+ if (ElTy != $3.V->getType())
+ error("Can't store '" + $3.V->getType()->getDescription() +
+ "' into space of type '" + ElTy->getDescription() + "'");
+ Value* tmpVal = getVal(PTy, $6);
+ $$.I = new StoreInst($3.V, tmpVal, $1);
+ $$.S = Signless;
+ delete $5.T;
}
| GETELEMENTPTR Types ValueRef IndexList {
- std::string Name = getUniqueName($3->val, $2);
- // Upgrade the indices
- for (unsigned i = 0; i < $4->size(); ++i) {
- Value* V = (*$4)[i];
- if (V->type->isUnsigned() && !V->isConstant() &&
- V->type->getBitWidth() < 64) {
- *O << " %gep_upgrade" << UniqueNameCounter << " = zext " << *V->val
- << " to i64\n";
- *V->val = "i64 %gep_upgrade" + llvm::utostr(UniqueNameCounter++);
- V->type = Type::get("i64",ULongTy);
- }
- }
- *$1 += " " + $2->getNewTy() + " " + Name;
- for (unsigned i = 0; i < $4->size(); ++i) {
- Value* V = (*$4)[i];
- *$1 += ", " + *V->val;
- }
- $$ = $3;
- delete $$->val;
- $$->val = $1;
- $$->type = getGEPIndexedType($2,$4);
- for (unsigned i = 0; i < $4->size(); ++i)
- delete (*$4)[i];
+ const Type* Ty = $2.T->get();
+ if (!isa<PointerType>(Ty))
+ error("getelementptr insn requires pointer operand");
+
+ std::vector<Value*> VIndices;
+ upgradeGEPIndices(Ty, $4, VIndices);
+
+ Value* tmpVal = getVal(Ty, $3);
+ $$.I = new GetElementPtrInst(tmpVal, VIndices);
+ $$.S = Signless;
+ delete $2.T;
delete $4;
};
+
%%
int yyerror(const char *ErrorMsg) {
std::string where
= std::string((CurFilename == "-") ? std::string("<stdin>") : CurFilename)
- + ":" + llvm::utostr((unsigned) Upgradelineno) + ": ";
- std::string errMsg = where + "error: " + std::string(ErrorMsg) +
- " while reading ";
- if (yychar == YYEMPTY || yychar == 0)
- errMsg += "end-of-file.";
- else
- errMsg += "token: '" + std::string(Upgradetext, Upgradeleng) + "'";
+ + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": ";
+ std::string errMsg = where + "error: " + std::string(ErrorMsg);
+ if (yychar != YYEMPTY && yychar != 0)
+ errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
+ "'.";
std::cerr << "llvm-upgrade: " << errMsg << '\n';
- *O << "llvm-upgrade parse failed.\n";
+ std::cout << "llvm-upgrade: parse failed.\n";
exit(1);
}
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) + "'";
+ + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": ";
+ std::string errMsg = where + "warning: " + std::string(ErrorMsg);
+ if (yychar != YYEMPTY && yychar != 0)
+ errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) +
+ "'.";
std::cerr << "llvm-upgrade: " << errMsg << '\n';
}
+
+void error(const std::string& ErrorMsg, int LineNo) {
+ if (LineNo == -1) LineNo = Upgradelineno;
+ Upgradelineno = LineNo;
+ yyerror(ErrorMsg.c_str());
+}
+
diff --git a/tools/llvm-upgrade/llvm-upgrade.cpp b/tools/llvm-upgrade/llvm-upgrade.cpp
index 38aa9ad052..d3a60cfa82 100644
--- a/tools/llvm-upgrade/llvm-upgrade.cpp
+++ b/tools/llvm-upgrade/llvm-upgrade.cpp
@@ -20,6 +20,8 @@
//===----------------------------------------------------------------------===//
#include "UpgradeInternals.h"
+#include "llvm/Module.h"
+#include "llvm/Bytecode/Writer.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/Streams.h"
@@ -45,7 +47,11 @@ AddAttrs("add-attrs", cl::desc("Add function result and argument attributes"),
cl::init(false));
static cl::opt<bool>
-Debug("debug", cl::desc("Print debug output from yacc parser"),cl::Hidden,
+Debug("debug-upgrade-yacc", cl::desc("Print debug output from yacc parser"),
+ cl::Hidden, cl::init(false));
+
+static cl::opt<bool>
+EmitByteCode("emit-bytecode", cl::desc("Emit bytecode instead of assembly"),
cl::init(false));
int main(int argc, char **argv) {
@@ -119,7 +125,20 @@ int main(int argc, char **argv) {
return 1;
}
- UpgradeAssembly(InputFilename, *In, *Out, Debug, AddAttrs);
+ Module *M = UpgradeAssembly(InputFilename, *In, Debug, AddAttrs);
+ if (!M) {
+ cerr << argv[0] << ": No module returned from assembly parsing\n";
+ if (!EmitByteCode)
+ *Out << argv[0] << ": parse failed.";
+ exit(1);
+ }
+
+ // Finally, print the module on the output stream.
+ if (EmitByteCode) {
+ OStream OS(*Out);
+ WriteBytecodeToFile(M, OS);
+ } else
+ M->print(Out);
} catch (const std::string& caught_message) {
cerr << argv[0] << ": " << caught_message << "\n";