github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/cmd/8a/lex.c (about) 1 // Inferno utils/8a/lex.c 2 // http://code.google.com/p/inferno-os/source/browse/utils/8a/lex.c 3 // 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) 6 // Portions Copyright © 1997-1999 Vita Nuova Limited 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) 8 // Portions Copyright © 2004,2006 Bruce Ellis 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others 11 // Portions Copyright © 2009 The Go Authors. All rights reserved. 12 // 13 // Permission is hereby granted, free of charge, to any person obtaining a copy 14 // of this software and associated documentation files (the "Software"), to deal 15 // in the Software without restriction, including without limitation the rights 16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 // copies of the Software, and to permit persons to whom the Software is 18 // furnished to do so, subject to the following conditions: 19 // 20 // The above copyright notice and this permission notice shall be included in 21 // all copies or substantial portions of the Software. 22 // 23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 // THE SOFTWARE. 30 31 #define EXTERN 32 #include <u.h> 33 #include <libc.h> 34 #include "a.h" 35 #include "y.tab.h" 36 37 enum 38 { 39 Plan9 = 1<<0, 40 Unix = 1<<1, 41 Windows = 1<<2, 42 }; 43 44 int 45 systemtype(int sys) 46 { 47 #ifdef _WIN32 48 return sys&Windows; 49 #else 50 return sys&Plan9; 51 #endif 52 } 53 54 int 55 pathchar(void) 56 { 57 return '/'; 58 } 59 60 void 61 main(int argc, char *argv[]) 62 { 63 char *p; 64 int c; 65 66 thechar = '8'; 67 thestring = "386"; 68 69 ensuresymb(NSYMB); 70 memset(debug, 0, sizeof(debug)); 71 cinit(); 72 outfile = 0; 73 setinclude("."); 74 ARGBEGIN { 75 default: 76 c = ARGC(); 77 if(c >= 0 || c < sizeof(debug)) 78 debug[c] = 1; 79 break; 80 81 case 'o': 82 outfile = ARGF(); 83 break; 84 85 case 'D': 86 p = ARGF(); 87 if(p) { 88 if (nDlist%8 == 0) 89 Dlist = allocn(Dlist, nDlist*sizeof(char *), 90 8*sizeof(char *)); 91 Dlist[nDlist++] = p; 92 } 93 break; 94 95 case 'I': 96 p = ARGF(); 97 setinclude(p); 98 break; 99 } ARGEND 100 if(*argv == 0) { 101 print("usage: %ca [-options] file.s\n", thechar); 102 errorexit(); 103 } 104 if(argc > 1){ 105 print("can't assemble multiple files\n"); 106 errorexit(); 107 } 108 if(assemble(argv[0])) 109 errorexit(); 110 exits(0); 111 } 112 113 int 114 assemble(char *file) 115 { 116 char *ofile, *p; 117 int i, of; 118 119 ofile = alloc(strlen(file)+3); // +3 for .x\0 (x=thechar) 120 strcpy(ofile, file); 121 p = utfrrune(ofile, pathchar()); 122 if(p) { 123 include[0] = ofile; 124 *p++ = 0; 125 } else 126 p = ofile; 127 if(outfile == 0) { 128 outfile = p; 129 if(outfile){ 130 p = utfrrune(outfile, '.'); 131 if(p) 132 if(p[1] == 's' && p[2] == 0) 133 p[0] = 0; 134 p = utfrune(outfile, 0); 135 p[0] = '.'; 136 p[1] = thechar; 137 p[2] = 0; 138 } else 139 outfile = "/dev/null"; 140 } 141 142 of = create(outfile, OWRITE, 0664); 143 if(of < 0) { 144 yyerror("%ca: cannot create %s", thechar, outfile); 145 errorexit(); 146 } 147 Binit(&obuf, of, OWRITE); 148 149 pass = 1; 150 pinit(file); 151 152 Bprint(&obuf, "go object %s %s %s\n", getgoos(), thestring, getgoversion()); 153 154 for(i=0; i<nDlist; i++) 155 dodefine(Dlist[i]); 156 yyparse(); 157 if(nerrors) { 158 cclean(); 159 return nerrors; 160 } 161 162 Bprint(&obuf, "\n!\n"); 163 164 pass = 2; 165 outhist(); 166 pinit(file); 167 for(i=0; i<nDlist; i++) 168 dodefine(Dlist[i]); 169 yyparse(); 170 cclean(); 171 return nerrors; 172 } 173 174 struct 175 { 176 char *name; 177 ushort type; 178 ushort value; 179 } itab[] = 180 { 181 "SP", LSP, D_AUTO, 182 "SB", LSB, D_EXTERN, 183 "FP", LFP, D_PARAM, 184 "PC", LPC, D_BRANCH, 185 186 "AL", LBREG, D_AL, 187 "CL", LBREG, D_CL, 188 "DL", LBREG, D_DL, 189 "BL", LBREG, D_BL, 190 "AH", LBREG, D_AH, 191 "CH", LBREG, D_CH, 192 "DH", LBREG, D_DH, 193 "BH", LBREG, D_BH, 194 195 "AX", LLREG, D_AX, 196 "CX", LLREG, D_CX, 197 "DX", LLREG, D_DX, 198 "BX", LLREG, D_BX, 199 /* "SP", LLREG, D_SP, */ 200 "BP", LLREG, D_BP, 201 "SI", LLREG, D_SI, 202 "DI", LLREG, D_DI, 203 204 "F0", LFREG, D_F0+0, 205 "F1", LFREG, D_F0+1, 206 "F2", LFREG, D_F0+2, 207 "F3", LFREG, D_F0+3, 208 "F4", LFREG, D_F0+4, 209 "F5", LFREG, D_F0+5, 210 "F6", LFREG, D_F0+6, 211 "F7", LFREG, D_F0+7, 212 213 "X0", LXREG, D_X0+0, 214 "X1", LXREG, D_X0+1, 215 "X2", LXREG, D_X0+2, 216 "X3", LXREG, D_X0+3, 217 "X4", LXREG, D_X0+4, 218 "X5", LXREG, D_X0+5, 219 "X6", LXREG, D_X0+6, 220 "X7", LXREG, D_X0+7, 221 222 "CS", LSREG, D_CS, 223 "SS", LSREG, D_SS, 224 "DS", LSREG, D_DS, 225 "ES", LSREG, D_ES, 226 "FS", LSREG, D_FS, 227 "GS", LSREG, D_GS, 228 229 "GDTR", LBREG, D_GDTR, 230 "IDTR", LBREG, D_IDTR, 231 "LDTR", LBREG, D_LDTR, 232 "MSW", LBREG, D_MSW, 233 "TASK", LBREG, D_TASK, 234 235 "CR0", LBREG, D_CR+0, 236 "CR1", LBREG, D_CR+1, 237 "CR2", LBREG, D_CR+2, 238 "CR3", LBREG, D_CR+3, 239 "CR4", LBREG, D_CR+4, 240 "CR5", LBREG, D_CR+5, 241 "CR6", LBREG, D_CR+6, 242 "CR7", LBREG, D_CR+7, 243 244 "DR0", LBREG, D_DR+0, 245 "DR1", LBREG, D_DR+1, 246 "DR2", LBREG, D_DR+2, 247 "DR3", LBREG, D_DR+3, 248 "DR4", LBREG, D_DR+4, 249 "DR5", LBREG, D_DR+5, 250 "DR6", LBREG, D_DR+6, 251 "DR7", LBREG, D_DR+7, 252 253 "TR0", LBREG, D_TR+0, 254 "TR1", LBREG, D_TR+1, 255 "TR2", LBREG, D_TR+2, 256 "TR3", LBREG, D_TR+3, 257 "TR4", LBREG, D_TR+4, 258 "TR5", LBREG, D_TR+5, 259 "TR6", LBREG, D_TR+6, 260 "TR7", LBREG, D_TR+7, 261 262 "AAA", LTYPE0, AAAA, 263 "AAD", LTYPE0, AAAD, 264 "AAM", LTYPE0, AAAM, 265 "AAS", LTYPE0, AAAS, 266 "ADCB", LTYPE3, AADCB, 267 "ADCL", LTYPE3, AADCL, 268 "ADCW", LTYPE3, AADCW, 269 "ADDB", LTYPE3, AADDB, 270 "ADDL", LTYPE3, AADDL, 271 "ADDW", LTYPE3, AADDW, 272 "ADJSP", LTYPE2, AADJSP, 273 "ANDB", LTYPE3, AANDB, 274 "ANDL", LTYPE3, AANDL, 275 "ANDW", LTYPE3, AANDW, 276 "ARPL", LTYPE3, AARPL, 277 "BOUNDL", LTYPE3, ABOUNDL, 278 "BOUNDW", LTYPE3, ABOUNDW, 279 "BSFL", LTYPE3, ABSFL, 280 "BSFW", LTYPE3, ABSFW, 281 "BSRL", LTYPE3, ABSRL, 282 "BSRW", LTYPE3, ABSRW, 283 "BSWAPL", LTYPE1, ABSWAPL, 284 "BTCL", LTYPE3, ABTCL, 285 "BTCW", LTYPE3, ABTCW, 286 "BTL", LTYPE3, ABTL, 287 "BTRL", LTYPE3, ABTRL, 288 "BTRW", LTYPE3, ABTRW, 289 "BTSL", LTYPE3, ABTSL, 290 "BTSW", LTYPE3, ABTSW, 291 "BTW", LTYPE3, ABTW, 292 "BYTE", LTYPE2, ABYTE, 293 "CALL", LTYPEC, ACALL, 294 "CLC", LTYPE0, ACLC, 295 "CLD", LTYPE0, ACLD, 296 "CLI", LTYPE0, ACLI, 297 "CLTS", LTYPE0, ACLTS, 298 "CMC", LTYPE0, ACMC, 299 "CMPB", LTYPE4, ACMPB, 300 "CMPL", LTYPE4, ACMPL, 301 "CMPW", LTYPE4, ACMPW, 302 "CMPSB", LTYPE0, ACMPSB, 303 "CMPSL", LTYPE0, ACMPSL, 304 "CMPSW", LTYPE0, ACMPSW, 305 "CMPXCHG8B", LTYPE1, ACMPXCHG8B, 306 "CMPXCHGB", LTYPE3, ACMPXCHGB, 307 "CMPXCHGL", LTYPE3, ACMPXCHGL, 308 "CMPXCHGW", LTYPE3, ACMPXCHGW, 309 "CPUID", LTYPE0, ACPUID, 310 "DAA", LTYPE0, ADAA, 311 "DAS", LTYPE0, ADAS, 312 "DATA", LTYPED, ADATA, 313 "DECB", LTYPE1, ADECB, 314 "DECL", LTYPE1, ADECL, 315 "DECW", LTYPE1, ADECW, 316 "DIVB", LTYPE2, ADIVB, 317 "DIVL", LTYPE2, ADIVL, 318 "DIVW", LTYPE2, ADIVW, 319 "END", LTYPE0, AEND, 320 "ENTER", LTYPE2, AENTER, 321 "GLOBL", LTYPEG, AGLOBL, 322 "HLT", LTYPE0, AHLT, 323 "IDIVB", LTYPE2, AIDIVB, 324 "IDIVL", LTYPE2, AIDIVL, 325 "IDIVW", LTYPE2, AIDIVW, 326 "IMULB", LTYPE2, AIMULB, 327 "IMULL", LTYPEI, AIMULL, 328 "IMULW", LTYPEI, AIMULW, 329 "INB", LTYPE0, AINB, 330 "INL", LTYPE0, AINL, 331 "INW", LTYPE0, AINW, 332 "INCB", LTYPE1, AINCB, 333 "INCL", LTYPE1, AINCL, 334 "INCW", LTYPE1, AINCW, 335 "INSB", LTYPE0, AINSB, 336 "INSL", LTYPE0, AINSL, 337 "INSW", LTYPE0, AINSW, 338 "INT", LTYPE2, AINT, 339 "INTO", LTYPE0, AINTO, 340 "IRETL", LTYPE0, AIRETL, 341 "IRETW", LTYPE0, AIRETW, 342 343 "JOS", LTYPER, AJOS, 344 "JO", LTYPER, AJOS, /* alternate */ 345 "JOC", LTYPER, AJOC, 346 "JNO", LTYPER, AJOC, /* alternate */ 347 "JCS", LTYPER, AJCS, 348 "JB", LTYPER, AJCS, /* alternate */ 349 "JC", LTYPER, AJCS, /* alternate */ 350 "JNAE", LTYPER, AJCS, /* alternate */ 351 "JLO", LTYPER, AJCS, /* alternate */ 352 "JCC", LTYPER, AJCC, 353 "JAE", LTYPER, AJCC, /* alternate */ 354 "JNB", LTYPER, AJCC, /* alternate */ 355 "JNC", LTYPER, AJCC, /* alternate */ 356 "JHS", LTYPER, AJCC, /* alternate */ 357 "JEQ", LTYPER, AJEQ, 358 "JE", LTYPER, AJEQ, /* alternate */ 359 "JZ", LTYPER, AJEQ, /* alternate */ 360 "JNE", LTYPER, AJNE, 361 "JNZ", LTYPER, AJNE, /* alternate */ 362 "JLS", LTYPER, AJLS, 363 "JBE", LTYPER, AJLS, /* alternate */ 364 "JNA", LTYPER, AJLS, /* alternate */ 365 "JHI", LTYPER, AJHI, 366 "JA", LTYPER, AJHI, /* alternate */ 367 "JNBE", LTYPER, AJHI, /* alternate */ 368 "JMI", LTYPER, AJMI, 369 "JS", LTYPER, AJMI, /* alternate */ 370 "JPL", LTYPER, AJPL, 371 "JNS", LTYPER, AJPL, /* alternate */ 372 "JPS", LTYPER, AJPS, 373 "JP", LTYPER, AJPS, /* alternate */ 374 "JPE", LTYPER, AJPS, /* alternate */ 375 "JPC", LTYPER, AJPC, 376 "JNP", LTYPER, AJPC, /* alternate */ 377 "JPO", LTYPER, AJPC, /* alternate */ 378 "JLT", LTYPER, AJLT, 379 "JL", LTYPER, AJLT, /* alternate */ 380 "JNGE", LTYPER, AJLT, /* alternate */ 381 "JGE", LTYPER, AJGE, 382 "JNL", LTYPER, AJGE, /* alternate */ 383 "JLE", LTYPER, AJLE, 384 "JNG", LTYPER, AJLE, /* alternate */ 385 "JGT", LTYPER, AJGT, 386 "JG", LTYPER, AJGT, /* alternate */ 387 "JNLE", LTYPER, AJGT, /* alternate */ 388 389 "JCXZL", LTYPER, AJCXZL, 390 "JCXZW", LTYPER, AJCXZW, 391 "JMP", LTYPEC, AJMP, 392 "LAHF", LTYPE0, ALAHF, 393 "LARL", LTYPE3, ALARL, 394 "LARW", LTYPE3, ALARW, 395 "LEAL", LTYPE3, ALEAL, 396 "LEAW", LTYPE3, ALEAW, 397 "LEAVEL", LTYPE0, ALEAVEL, 398 "LEAVEW", LTYPE0, ALEAVEW, 399 "LOCK", LTYPE0, ALOCK, 400 "LODSB", LTYPE0, ALODSB, 401 "LODSL", LTYPE0, ALODSL, 402 "LODSW", LTYPE0, ALODSW, 403 "LONG", LTYPE2, ALONG, 404 "LOOP", LTYPER, ALOOP, 405 "LOOPEQ", LTYPER, ALOOPEQ, 406 "LOOPNE", LTYPER, ALOOPNE, 407 "LSLL", LTYPE3, ALSLL, 408 "LSLW", LTYPE3, ALSLW, 409 "MOVB", LTYPE3, AMOVB, 410 "MOVL", LTYPEM, AMOVL, 411 "MOVW", LTYPEM, AMOVW, 412 "MOVQ", LTYPEM, AMOVQ, 413 "MOVBLSX", LTYPE3, AMOVBLSX, 414 "MOVBLZX", LTYPE3, AMOVBLZX, 415 "MOVBWSX", LTYPE3, AMOVBWSX, 416 "MOVBWZX", LTYPE3, AMOVBWZX, 417 "MOVWLSX", LTYPE3, AMOVWLSX, 418 "MOVWLZX", LTYPE3, AMOVWLZX, 419 "MOVSB", LTYPE0, AMOVSB, 420 "MOVSL", LTYPE0, AMOVSL, 421 "MOVSW", LTYPE0, AMOVSW, 422 "MULB", LTYPE2, AMULB, 423 "MULL", LTYPE2, AMULL, 424 "MULW", LTYPE2, AMULW, 425 "NEGB", LTYPE1, ANEGB, 426 "NEGL", LTYPE1, ANEGL, 427 "NEGW", LTYPE1, ANEGW, 428 "NOP", LTYPEN, ANOP, 429 "NOTB", LTYPE1, ANOTB, 430 "NOTL", LTYPE1, ANOTL, 431 "NOTW", LTYPE1, ANOTW, 432 "ORB", LTYPE3, AORB, 433 "ORL", LTYPE3, AORL, 434 "ORW", LTYPE3, AORW, 435 "OUTB", LTYPE0, AOUTB, 436 "OUTL", LTYPE0, AOUTL, 437 "OUTW", LTYPE0, AOUTW, 438 "OUTSB", LTYPE0, AOUTSB, 439 "OUTSL", LTYPE0, AOUTSL, 440 "OUTSW", LTYPE0, AOUTSW, 441 "PAUSE", LTYPEN, APAUSE, 442 "PINSRD", LTYPEX, APINSRD, 443 "POPAL", LTYPE0, APOPAL, 444 "POPAW", LTYPE0, APOPAW, 445 "POPFL", LTYPE0, APOPFL, 446 "POPFW", LTYPE0, APOPFW, 447 "POPL", LTYPE1, APOPL, 448 "POPW", LTYPE1, APOPW, 449 "PUSHAL", LTYPE0, APUSHAL, 450 "PUSHAW", LTYPE0, APUSHAW, 451 "PUSHFL", LTYPE0, APUSHFL, 452 "PUSHFW", LTYPE0, APUSHFW, 453 "PUSHL", LTYPE2, APUSHL, 454 "PUSHW", LTYPE2, APUSHW, 455 "RCLB", LTYPE3, ARCLB, 456 "RCLL", LTYPE3, ARCLL, 457 "RCLW", LTYPE3, ARCLW, 458 "RCRB", LTYPE3, ARCRB, 459 "RCRL", LTYPE3, ARCRL, 460 "RCRW", LTYPE3, ARCRW, 461 "RDTSC", LTYPE0, ARDTSC, 462 "REP", LTYPE0, AREP, 463 "REPN", LTYPE0, AREPN, 464 "RET", LTYPE0, ARET, 465 "ROLB", LTYPE3, AROLB, 466 "ROLL", LTYPE3, AROLL, 467 "ROLW", LTYPE3, AROLW, 468 "RORB", LTYPE3, ARORB, 469 "RORL", LTYPE3, ARORL, 470 "RORW", LTYPE3, ARORW, 471 "SAHF", LTYPE0, ASAHF, 472 "SALB", LTYPE3, ASALB, 473 "SALL", LTYPE3, ASALL, 474 "SALW", LTYPE3, ASALW, 475 "SARB", LTYPE3, ASARB, 476 "SARL", LTYPE3, ASARL, 477 "SARW", LTYPE3, ASARW, 478 "SBBB", LTYPE3, ASBBB, 479 "SBBL", LTYPE3, ASBBL, 480 "SBBW", LTYPE3, ASBBW, 481 "SCASB", LTYPE0, ASCASB, 482 "SCASL", LTYPE0, ASCASL, 483 "SCASW", LTYPE0, ASCASW, 484 "SETCC", LTYPE1, ASETCC, 485 "SETCS", LTYPE1, ASETCS, 486 "SETEQ", LTYPE1, ASETEQ, 487 "SETGE", LTYPE1, ASETGE, 488 "SETGT", LTYPE1, ASETGT, 489 "SETHI", LTYPE1, ASETHI, 490 "SETLE", LTYPE1, ASETLE, 491 "SETLS", LTYPE1, ASETLS, 492 "SETLT", LTYPE1, ASETLT, 493 "SETMI", LTYPE1, ASETMI, 494 "SETNE", LTYPE1, ASETNE, 495 "SETOC", LTYPE1, ASETOC, 496 "SETOS", LTYPE1, ASETOS, 497 "SETPC", LTYPE1, ASETPC, 498 "SETPL", LTYPE1, ASETPL, 499 "SETPS", LTYPE1, ASETPS, 500 "CDQ", LTYPE0, ACDQ, 501 "CWD", LTYPE0, ACWD, 502 "SHLB", LTYPE3, ASHLB, 503 "SHLL", LTYPES, ASHLL, 504 "SHLW", LTYPES, ASHLW, 505 "SHRB", LTYPE3, ASHRB, 506 "SHRL", LTYPES, ASHRL, 507 "SHRW", LTYPES, ASHRW, 508 "STC", LTYPE0, ASTC, 509 "STD", LTYPE0, ASTD, 510 "STI", LTYPE0, ASTI, 511 "STOSB", LTYPE0, ASTOSB, 512 "STOSL", LTYPE0, ASTOSL, 513 "STOSW", LTYPE0, ASTOSW, 514 "SUBB", LTYPE3, ASUBB, 515 "SUBL", LTYPE3, ASUBL, 516 "SUBW", LTYPE3, ASUBW, 517 "SYSCALL", LTYPE0, ASYSCALL, 518 "TESTB", LTYPE3, ATESTB, 519 "TESTL", LTYPE3, ATESTL, 520 "TESTW", LTYPE3, ATESTW, 521 "TEXT", LTYPET, ATEXT, 522 "VERR", LTYPE2, AVERR, 523 "VERW", LTYPE2, AVERW, 524 "WAIT", LTYPE0, AWAIT, 525 "WORD", LTYPE2, AWORD, 526 "XADDB", LTYPE3, AXADDB, 527 "XADDL", LTYPE3, AXADDL, 528 "XADDW", LTYPE3, AXADDW, 529 "XCHGB", LTYPE3, AXCHGB, 530 "XCHGL", LTYPE3, AXCHGL, 531 "XCHGW", LTYPE3, AXCHGW, 532 "XLAT", LTYPE2, AXLAT, 533 "XORB", LTYPE3, AXORB, 534 "XORL", LTYPE3, AXORL, 535 "XORW", LTYPE3, AXORW, 536 537 "CMOVLCC", LTYPE3, ACMOVLCC, 538 "CMOVLCS", LTYPE3, ACMOVLCS, 539 "CMOVLEQ", LTYPE3, ACMOVLEQ, 540 "CMOVLGE", LTYPE3, ACMOVLGE, 541 "CMOVLGT", LTYPE3, ACMOVLGT, 542 "CMOVLHI", LTYPE3, ACMOVLHI, 543 "CMOVLLE", LTYPE3, ACMOVLLE, 544 "CMOVLLS", LTYPE3, ACMOVLLS, 545 "CMOVLLT", LTYPE3, ACMOVLLT, 546 "CMOVLMI", LTYPE3, ACMOVLMI, 547 "CMOVLNE", LTYPE3, ACMOVLNE, 548 "CMOVLOC", LTYPE3, ACMOVLOC, 549 "CMOVLOS", LTYPE3, ACMOVLOS, 550 "CMOVLPC", LTYPE3, ACMOVLPC, 551 "CMOVLPL", LTYPE3, ACMOVLPL, 552 "CMOVLPS", LTYPE3, ACMOVLPS, 553 "CMOVWCC", LTYPE3, ACMOVWCC, 554 "CMOVWCS", LTYPE3, ACMOVWCS, 555 "CMOVWEQ", LTYPE3, ACMOVWEQ, 556 "CMOVWGE", LTYPE3, ACMOVWGE, 557 "CMOVWGT", LTYPE3, ACMOVWGT, 558 "CMOVWHI", LTYPE3, ACMOVWHI, 559 "CMOVWLE", LTYPE3, ACMOVWLE, 560 "CMOVWLS", LTYPE3, ACMOVWLS, 561 "CMOVWLT", LTYPE3, ACMOVWLT, 562 "CMOVWMI", LTYPE3, ACMOVWMI, 563 "CMOVWNE", LTYPE3, ACMOVWNE, 564 "CMOVWOC", LTYPE3, ACMOVWOC, 565 "CMOVWOS", LTYPE3, ACMOVWOS, 566 "CMOVWPC", LTYPE3, ACMOVWPC, 567 "CMOVWPL", LTYPE3, ACMOVWPL, 568 "CMOVWPS", LTYPE3, ACMOVWPS, 569 570 "FMOVB", LTYPE3, AFMOVB, 571 "FMOVBP", LTYPE3, AFMOVBP, 572 "FMOVD", LTYPE3, AFMOVD, 573 "FMOVDP", LTYPE3, AFMOVDP, 574 "FMOVF", LTYPE3, AFMOVF, 575 "FMOVFP", LTYPE3, AFMOVFP, 576 "FMOVL", LTYPE3, AFMOVL, 577 "FMOVLP", LTYPE3, AFMOVLP, 578 "FMOVV", LTYPE3, AFMOVV, 579 "FMOVVP", LTYPE3, AFMOVVP, 580 "FMOVW", LTYPE3, AFMOVW, 581 "FMOVWP", LTYPE3, AFMOVWP, 582 "FMOVX", LTYPE3, AFMOVX, 583 "FMOVXP", LTYPE3, AFMOVXP, 584 "FCMOVCC", LTYPE3, AFCMOVCC, 585 "FCMOVCS", LTYPE3, AFCMOVCS, 586 "FCMOVEQ", LTYPE3, AFCMOVEQ, 587 "FCMOVHI", LTYPE3, AFCMOVHI, 588 "FCMOVLS", LTYPE3, AFCMOVLS, 589 "FCMOVNE", LTYPE3, AFCMOVNE, 590 "FCMOVNU", LTYPE3, AFCMOVNU, 591 "FCMOVUN", LTYPE3, AFCMOVUN, 592 "FCOMB", LTYPE3, AFCOMB, 593 "FCOMBP", LTYPE3, AFCOMBP, 594 "FCOMD", LTYPE3, AFCOMD, 595 "FCOMDP", LTYPE3, AFCOMDP, 596 "FCOMDPP", LTYPE3, AFCOMDPP, 597 "FCOMF", LTYPE3, AFCOMF, 598 "FCOMFP", LTYPE3, AFCOMFP, 599 "FCOMI", LTYPE3, AFCOMI, 600 "FCOMIP", LTYPE3, AFCOMIP, 601 "FCOML", LTYPE3, AFCOML, 602 "FCOMLP", LTYPE3, AFCOMLP, 603 "FCOMW", LTYPE3, AFCOMW, 604 "FCOMWP", LTYPE3, AFCOMWP, 605 "FUCOM", LTYPE3, AFUCOM, 606 "FUCOMI", LTYPE3, AFUCOMI, 607 "FUCOMIP", LTYPE3, AFUCOMIP, 608 "FUCOMP", LTYPE3, AFUCOMP, 609 "FUCOMPP", LTYPE3, AFUCOMPP, 610 "FADDW", LTYPE3, AFADDW, 611 "FADDL", LTYPE3, AFADDL, 612 "FADDF", LTYPE3, AFADDF, 613 "FADDD", LTYPE3, AFADDD, 614 "FADDDP", LTYPE3, AFADDDP, 615 "FSUBDP", LTYPE3, AFSUBDP, 616 "FSUBW", LTYPE3, AFSUBW, 617 "FSUBL", LTYPE3, AFSUBL, 618 "FSUBF", LTYPE3, AFSUBF, 619 "FSUBD", LTYPE3, AFSUBD, 620 "FSUBRDP", LTYPE3, AFSUBRDP, 621 "FSUBRW", LTYPE3, AFSUBRW, 622 "FSUBRL", LTYPE3, AFSUBRL, 623 "FSUBRF", LTYPE3, AFSUBRF, 624 "FSUBRD", LTYPE3, AFSUBRD, 625 "FMULDP", LTYPE3, AFMULDP, 626 "FMULW", LTYPE3, AFMULW, 627 "FMULL", LTYPE3, AFMULL, 628 "FMULF", LTYPE3, AFMULF, 629 "FMULD", LTYPE3, AFMULD, 630 "FDIVDP", LTYPE3, AFDIVDP, 631 "FDIVW", LTYPE3, AFDIVW, 632 "FDIVL", LTYPE3, AFDIVL, 633 "FDIVF", LTYPE3, AFDIVF, 634 "FDIVD", LTYPE3, AFDIVD, 635 "FDIVRDP", LTYPE3, AFDIVRDP, 636 "FDIVRW", LTYPE3, AFDIVRW, 637 "FDIVRL", LTYPE3, AFDIVRL, 638 "FDIVRF", LTYPE3, AFDIVRF, 639 "FDIVRD", LTYPE3, AFDIVRD, 640 "FXCHD", LTYPE3, AFXCHD, 641 "FFREE", LTYPE1, AFFREE, 642 "FLDCW", LTYPE2, AFLDCW, 643 "FLDENV", LTYPE1, AFLDENV, 644 "FRSTOR", LTYPE2, AFRSTOR, 645 "FSAVE", LTYPE1, AFSAVE, 646 "FSTCW", LTYPE1, AFSTCW, 647 "FSTENV", LTYPE1, AFSTENV, 648 "FSTSW", LTYPE1, AFSTSW, 649 "F2XM1", LTYPE0, AF2XM1, 650 "FABS", LTYPE0, AFABS, 651 "FCHS", LTYPE0, AFCHS, 652 "FCLEX", LTYPE0, AFCLEX, 653 "FCOS", LTYPE0, AFCOS, 654 "FDECSTP", LTYPE0, AFDECSTP, 655 "FINCSTP", LTYPE0, AFINCSTP, 656 "FINIT", LTYPE0, AFINIT, 657 "FLD1", LTYPE0, AFLD1, 658 "FLDL2E", LTYPE0, AFLDL2E, 659 "FLDL2T", LTYPE0, AFLDL2T, 660 "FLDLG2", LTYPE0, AFLDLG2, 661 "FLDLN2", LTYPE0, AFLDLN2, 662 "FLDPI", LTYPE0, AFLDPI, 663 "FLDZ", LTYPE0, AFLDZ, 664 "FNOP", LTYPE0, AFNOP, 665 "FPATAN", LTYPE0, AFPATAN, 666 "FPREM", LTYPE0, AFPREM, 667 "FPREM1", LTYPE0, AFPREM1, 668 "FPTAN", LTYPE0, AFPTAN, 669 "FRNDINT", LTYPE0, AFRNDINT, 670 "FSCALE", LTYPE0, AFSCALE, 671 "FSIN", LTYPE0, AFSIN, 672 "FSINCOS", LTYPE0, AFSINCOS, 673 "FSQRT", LTYPE0, AFSQRT, 674 "FTST", LTYPE0, AFTST, 675 "FXAM", LTYPE0, AFXAM, 676 "FXTRACT", LTYPE0, AFXTRACT, 677 "FYL2X", LTYPE0, AFYL2X, 678 "FYL2XP1", LTYPE0, AFYL2XP1, 679 "LFENCE", LTYPE0, ALFENCE, 680 "MFENCE", LTYPE0, AMFENCE, 681 "SFENCE", LTYPE0, ASFENCE, 682 "EMMS", LTYPE0, AEMMS, 683 "PREFETCHT0", LTYPE2, APREFETCHT0, 684 "PREFETCHT1", LTYPE2, APREFETCHT1, 685 "PREFETCHT2", LTYPE2, APREFETCHT2, 686 "PREFETCHNTA", LTYPE2, APREFETCHNTA, 687 "UNDEF", LTYPE0, AUNDEF, 688 689 "ADDPD", LTYPE3, AADDPD, 690 "ADDPS", LTYPE3, AADDPS, 691 "ADDSD", LTYPE3, AADDSD, 692 "ADDSS", LTYPE3, AADDSS, 693 "AESENC", LTYPE3, AAESENC, 694 "ANDNPD", LTYPE3, AANDNPD, 695 "ANDNPS", LTYPE3, AANDNPS, 696 "ANDPD", LTYPE3, AANDPD, 697 "ANDPS", LTYPE3, AANDPS, 698 "CMPPD", LTYPEXC,ACMPPD, 699 "CMPPS", LTYPEXC,ACMPPS, 700 "CMPSD", LTYPEXC,ACMPSD, 701 "CMPSS", LTYPEXC,ACMPSS, 702 "COMISD", LTYPE3, ACOMISD, 703 "COMISS", LTYPE3, ACOMISS, 704 "CVTPL2PD", LTYPE3, ACVTPL2PD, 705 "CVTPL2PS", LTYPE3, ACVTPL2PS, 706 "CVTPD2PL", LTYPE3, ACVTPD2PL, 707 "CVTPD2PS", LTYPE3, ACVTPD2PS, 708 "CVTPS2PL", LTYPE3, ACVTPS2PL, 709 "CVTPS2PD", LTYPE3, ACVTPS2PD, 710 "CVTSD2SL", LTYPE3, ACVTSD2SL, 711 "CVTSD2SS", LTYPE3, ACVTSD2SS, 712 "CVTSL2SD", LTYPE3, ACVTSL2SD, 713 "CVTSL2SS", LTYPE3, ACVTSL2SS, 714 "CVTSS2SD", LTYPE3, ACVTSS2SD, 715 "CVTSS2SL", LTYPE3, ACVTSS2SL, 716 "CVTTPD2PL", LTYPE3, ACVTTPD2PL, 717 "CVTTPS2PL", LTYPE3, ACVTTPS2PL, 718 "CVTTSD2SL", LTYPE3, ACVTTSD2SL, 719 "CVTTSS2SL", LTYPE3, ACVTTSS2SL, 720 "DIVPD", LTYPE3, ADIVPD, 721 "DIVPS", LTYPE3, ADIVPS, 722 "DIVSD", LTYPE3, ADIVSD, 723 "DIVSS", LTYPE3, ADIVSS, 724 "MASKMOVOU", LTYPE3, AMASKMOVOU, 725 "MASKMOVDQU", LTYPE3, AMASKMOVOU, /* syn */ 726 "MAXPD", LTYPE3, AMAXPD, 727 "MAXPS", LTYPE3, AMAXPS, 728 "MAXSD", LTYPE3, AMAXSD, 729 "MAXSS", LTYPE3, AMAXSS, 730 "MINPD", LTYPE3, AMINPD, 731 "MINPS", LTYPE3, AMINPS, 732 "MINSD", LTYPE3, AMINSD, 733 "MINSS", LTYPE3, AMINSS, 734 "MOVAPD", LTYPE3, AMOVAPD, 735 "MOVAPS", LTYPE3, AMOVAPS, 736 "MOVO", LTYPE3, AMOVO, 737 "MOVOA", LTYPE3, AMOVO, /* syn */ 738 "MOVOU", LTYPE3, AMOVOU, 739 "MOVHLPS", LTYPE3, AMOVHLPS, 740 "MOVHPD", LTYPE3, AMOVHPD, 741 "MOVHPS", LTYPE3, AMOVHPS, 742 "MOVLHPS", LTYPE3, AMOVLHPS, 743 "MOVLPD", LTYPE3, AMOVLPD, 744 "MOVLPS", LTYPE3, AMOVLPS, 745 "MOVMSKPD", LTYPE3, AMOVMSKPD, 746 "MOVMSKPS", LTYPE3, AMOVMSKPS, 747 "MOVNTO", LTYPE3, AMOVNTO, 748 "MOVNTDQ", LTYPE3, AMOVNTO, /* syn */ 749 "MOVNTPD", LTYPE3, AMOVNTPD, 750 "MOVNTPS", LTYPE3, AMOVNTPS, 751 "MOVSD", LTYPE3, AMOVSD, 752 "MOVSS", LTYPE3, AMOVSS, 753 "MOVUPD", LTYPE3, AMOVUPD, 754 "MOVUPS", LTYPE3, AMOVUPS, 755 "MULPD", LTYPE3, AMULPD, 756 "MULPS", LTYPE3, AMULPS, 757 "MULSD", LTYPE3, AMULSD, 758 "MULSS", LTYPE3, AMULSS, 759 "ORPD", LTYPE3, AORPD, 760 "ORPS", LTYPE3, AORPS, 761 "PADDQ", LTYPE3, APADDQ, 762 "PAND", LTYPE3, APAND, 763 "PCMPEQB", LTYPE3, APCMPEQB, 764 "PMAXSW", LTYPE3, APMAXSW, 765 "PMAXUB", LTYPE3, APMAXUB, 766 "PMINSW", LTYPE3, APMINSW, 767 "PMINUB", LTYPE3, APMINUB, 768 "PMOVMSKB", LTYPE3, APMOVMSKB, 769 "PSADBW", LTYPE3, APSADBW, 770 "PSHUFB", LTYPE3, APSHUFB, 771 "PSUBB", LTYPE3, APSUBB, 772 "PSUBL", LTYPE3, APSUBL, 773 "PSUBQ", LTYPE3, APSUBQ, 774 "PSUBSB", LTYPE3, APSUBSB, 775 "PSUBSW", LTYPE3, APSUBSW, 776 "PSUBUSB", LTYPE3, APSUBUSB, 777 "PSUBUSW", LTYPE3, APSUBUSW, 778 "PSUBW", LTYPE3, APSUBW, 779 "PUNPCKHQDQ", LTYPE3, APUNPCKHQDQ, 780 "PUNPCKLQDQ", LTYPE3, APUNPCKLQDQ, 781 "RCPPS", LTYPE3, ARCPPS, 782 "RCPSS", LTYPE3, ARCPSS, 783 "RSQRTPS", LTYPE3, ARSQRTPS, 784 "RSQRTSS", LTYPE3, ARSQRTSS, 785 "SQRTPD", LTYPE3, ASQRTPD, 786 "SQRTPS", LTYPE3, ASQRTPS, 787 "SQRTSD", LTYPE3, ASQRTSD, 788 "SQRTSS", LTYPE3, ASQRTSS, 789 "SUBPD", LTYPE3, ASUBPD, 790 "SUBPS", LTYPE3, ASUBPS, 791 "SUBSD", LTYPE3, ASUBSD, 792 "SUBSS", LTYPE3, ASUBSS, 793 "UCOMISD", LTYPE3, AUCOMISD, 794 "UCOMISS", LTYPE3, AUCOMISS, 795 "UNPCKHPD", LTYPE3, AUNPCKHPD, 796 "UNPCKHPS", LTYPE3, AUNPCKHPS, 797 "UNPCKLPD", LTYPE3, AUNPCKLPD, 798 "UNPCKLPS", LTYPE3, AUNPCKLPS, 799 "XORPD", LTYPE3, AXORPD, 800 "XORPS", LTYPE3, AXORPS, 801 "USEFIELD", LTYPEN, AUSEFIELD, 802 803 0 804 }; 805 806 void 807 cinit(void) 808 { 809 Sym *s; 810 int i; 811 812 nullgen.sym = S; 813 nullgen.offset = 0; 814 if(FPCHIP) 815 nullgen.dval = 0; 816 for(i=0; i<sizeof(nullgen.sval); i++) 817 nullgen.sval[i] = 0; 818 nullgen.type = D_NONE; 819 nullgen.index = D_NONE; 820 nullgen.scale = 0; 821 822 nerrors = 0; 823 iostack = I; 824 iofree = I; 825 peekc = IGN; 826 nhunk = 0; 827 for(i=0; i<NHASH; i++) 828 hash[i] = S; 829 for(i=0; itab[i].name; i++) { 830 s = slookup(itab[i].name); 831 if(s->type != LNAME) 832 yyerror("double initialization %s", itab[i].name); 833 s->type = itab[i].type; 834 s->value = itab[i].value; 835 } 836 837 pathname = allocn(pathname, 0, 100); 838 if(getwd(pathname, 99) == 0) { 839 pathname = allocn(pathname, 100, 900); 840 if(getwd(pathname, 999) == 0) 841 strcpy(pathname, "/???"); 842 } 843 } 844 845 void 846 checkscale(int scale) 847 { 848 849 switch(scale) { 850 case 1: 851 case 2: 852 case 4: 853 case 8: 854 return; 855 } 856 yyerror("scale must be 1248: %d", scale); 857 } 858 859 void 860 syminit(Sym *s) 861 { 862 863 s->type = LNAME; 864 s->value = 0; 865 } 866 867 void 868 cclean(void) 869 { 870 Gen2 g2; 871 872 g2.from = nullgen; 873 g2.to = nullgen; 874 outcode(AEND, &g2); 875 Bflush(&obuf); 876 } 877 878 void 879 zname(char *n, int t, int s) 880 { 881 882 Bputc(&obuf, ANAME); /* as(2) */ 883 Bputc(&obuf, ANAME>>8); 884 Bputc(&obuf, t); /* type */ 885 Bputc(&obuf, s); /* sym */ 886 while(*n) { 887 Bputc(&obuf, *n); 888 n++; 889 } 890 Bputc(&obuf, 0); 891 } 892 893 void 894 zaddr(Gen *a, int s) 895 { 896 int32 l; 897 int i, t; 898 char *n; 899 Ieee e; 900 901 t = 0; 902 if(a->index != D_NONE || a->scale != 0) 903 t |= T_INDEX; 904 if(a->offset != 0) 905 t |= T_OFFSET; 906 if(s != 0) 907 t |= T_SYM; 908 909 switch(a->type) { 910 default: 911 t |= T_TYPE; 912 break; 913 case D_FCONST: 914 t |= T_FCONST; 915 break; 916 case D_CONST2: 917 t |= T_OFFSET|T_OFFSET2; 918 break; 919 case D_SCONST: 920 t |= T_SCONST; 921 break; 922 case D_NONE: 923 break; 924 } 925 Bputc(&obuf, t); 926 927 if(t & T_INDEX) { /* implies index, scale */ 928 Bputc(&obuf, a->index); 929 Bputc(&obuf, a->scale); 930 } 931 if(t & T_OFFSET) { /* implies offset */ 932 l = a->offset; 933 Bputc(&obuf, l); 934 Bputc(&obuf, l>>8); 935 Bputc(&obuf, l>>16); 936 Bputc(&obuf, l>>24); 937 } 938 if(t & T_OFFSET2) { 939 l = a->offset2; 940 Bputc(&obuf, l); 941 Bputc(&obuf, l>>8); 942 Bputc(&obuf, l>>16); 943 Bputc(&obuf, l>>24); 944 } 945 if(t & T_SYM) /* implies sym */ 946 Bputc(&obuf, s); 947 if(t & T_FCONST) { 948 ieeedtod(&e, a->dval); 949 l = e.l; 950 Bputc(&obuf, l); 951 Bputc(&obuf, l>>8); 952 Bputc(&obuf, l>>16); 953 Bputc(&obuf, l>>24); 954 l = e.h; 955 Bputc(&obuf, l); 956 Bputc(&obuf, l>>8); 957 Bputc(&obuf, l>>16); 958 Bputc(&obuf, l>>24); 959 return; 960 } 961 if(t & T_SCONST) { 962 n = a->sval; 963 for(i=0; i<NSNAME; i++) { 964 Bputc(&obuf, *n); 965 n++; 966 } 967 return; 968 } 969 if(t & T_TYPE) 970 Bputc(&obuf, a->type); 971 } 972 973 void 974 outcode(int a, Gen2 *g2) 975 { 976 int sf, st, t; 977 Sym *s; 978 979 if(pass == 1) 980 goto out; 981 982 jackpot: 983 sf = 0; 984 s = g2->from.sym; 985 while(s != S) { 986 sf = s->sym; 987 if(sf < 0 || sf >= NSYM) 988 sf = 0; 989 t = g2->from.type; 990 if(t == D_ADDR) 991 t = g2->from.index; 992 if(h[sf].type == t) 993 if(h[sf].sym == s) 994 break; 995 zname(s->name, t, sym); 996 s->sym = sym; 997 h[sym].sym = s; 998 h[sym].type = t; 999 sf = sym; 1000 sym++; 1001 if(sym >= NSYM) 1002 sym = 1; 1003 break; 1004 } 1005 st = 0; 1006 s = g2->to.sym; 1007 while(s != S) { 1008 st = s->sym; 1009 if(st < 0 || st >= NSYM) 1010 st = 0; 1011 t = g2->to.type; 1012 if(t == D_ADDR) 1013 t = g2->to.index; 1014 if(h[st].type == t) 1015 if(h[st].sym == s) 1016 break; 1017 zname(s->name, t, sym); 1018 s->sym = sym; 1019 h[sym].sym = s; 1020 h[sym].type = t; 1021 st = sym; 1022 sym++; 1023 if(sym >= NSYM) 1024 sym = 1; 1025 if(st == sf) 1026 goto jackpot; 1027 break; 1028 } 1029 Bputc(&obuf, a); 1030 Bputc(&obuf, a>>8); 1031 Bputc(&obuf, stmtline); 1032 Bputc(&obuf, stmtline>>8); 1033 Bputc(&obuf, stmtline>>16); 1034 Bputc(&obuf, stmtline>>24); 1035 zaddr(&g2->from, sf); 1036 zaddr(&g2->to, st); 1037 1038 out: 1039 if(a != AGLOBL && a != ADATA) 1040 pc++; 1041 } 1042 1043 void 1044 outhist(void) 1045 { 1046 Gen g; 1047 Hist *h; 1048 char *p, *q, *op, c; 1049 int n; 1050 char *tofree; 1051 static int first = 1; 1052 static char *goroot, *goroot_final; 1053 1054 if(first) { 1055 // Decide whether we need to rewrite paths from $GOROOT to $GOROOT_FINAL. 1056 first = 0; 1057 goroot = getenv("GOROOT"); 1058 goroot_final = getenv("GOROOT_FINAL"); 1059 if(goroot == nil) 1060 goroot = ""; 1061 if(goroot_final == nil) 1062 goroot_final = goroot; 1063 if(strcmp(goroot, goroot_final) == 0) { 1064 goroot = nil; 1065 goroot_final = nil; 1066 } 1067 } 1068 1069 tofree = nil; 1070 1071 g = nullgen; 1072 c = pathchar(); 1073 for(h = hist; h != H; h = h->link) { 1074 p = h->name; 1075 if(p != nil && goroot != nil) { 1076 n = strlen(goroot); 1077 if(strncmp(p, goroot, strlen(goroot)) == 0 && p[n] == '/') { 1078 tofree = smprint("%s%s", goroot_final, p+n); 1079 p = tofree; 1080 } 1081 } 1082 op = 0; 1083 if(systemtype(Windows) && p && p[1] == ':'){ 1084 c = p[2]; 1085 } else if(p && p[0] != c && h->offset == 0 && pathname){ 1086 if(systemtype(Windows) && pathname[1] == ':') { 1087 op = p; 1088 p = pathname; 1089 c = p[2]; 1090 } else if(pathname[0] == c){ 1091 op = p; 1092 p = pathname; 1093 } 1094 } 1095 while(p) { 1096 q = strchr(p, c); 1097 if(q) { 1098 n = q-p; 1099 if(n == 0){ 1100 n = 1; /* leading "/" */ 1101 *p = '/'; /* don't emit "\" on windows */ 1102 } 1103 q++; 1104 } else { 1105 n = strlen(p); 1106 q = 0; 1107 } 1108 if(n) { 1109 Bputc(&obuf, ANAME); 1110 Bputc(&obuf, ANAME>>8); 1111 Bputc(&obuf, D_FILE); /* type */ 1112 Bputc(&obuf, 1); /* sym */ 1113 Bputc(&obuf, '<'); 1114 Bwrite(&obuf, p, n); 1115 Bputc(&obuf, 0); 1116 } 1117 p = q; 1118 if(p == 0 && op) { 1119 p = op; 1120 op = 0; 1121 } 1122 } 1123 g.offset = h->offset; 1124 1125 Bputc(&obuf, AHISTORY); 1126 Bputc(&obuf, AHISTORY>>8); 1127 Bputc(&obuf, h->line); 1128 Bputc(&obuf, h->line>>8); 1129 Bputc(&obuf, h->line>>16); 1130 Bputc(&obuf, h->line>>24); 1131 zaddr(&nullgen, 0); 1132 zaddr(&g, 0); 1133 1134 if(tofree) { 1135 free(tofree); 1136 tofree = nil; 1137 } 1138 } 1139 } 1140 1141 #include "../cc/lexbody" 1142 #include "../cc/macbody"