lex.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  1. #include <ctype.h>
  2. #define EXTERN
  3. #include "a.h"
  4. #include "y.tab.h"
  5. void
  6. main(int argc, char *argv[])
  7. {
  8. char ofile[100], incfile[20], *p;
  9. int nout, nproc, status, i, c, of;
  10. thechar = '7'; /* of 9 */
  11. thestring = "alpha";
  12. memset(debug, 0, sizeof(debug));
  13. cinit();
  14. outfile = 0;
  15. include[ninclude++] = ".";
  16. ARGBEGIN {
  17. default:
  18. c = ARGC();
  19. if(c >= 0 || c < sizeof(debug))
  20. debug[c] = 1;
  21. break;
  22. case 'o':
  23. outfile = ARGF();
  24. break;
  25. case 'D':
  26. p = ARGF();
  27. if(p)
  28. Dlist[nDlist++] = p;
  29. break;
  30. case 'I':
  31. p = ARGF();
  32. if(p)
  33. include[ninclude++] = p;
  34. break;
  35. } ARGEND
  36. if(*argv == 0) {
  37. print("usage: %ca [-options] file.s\n", thechar);
  38. errorexit();
  39. }
  40. nproc = 3;
  41. if(p = getenv("NPROC"))
  42. nproc = atol(p);
  43. if(argc > 1) {
  44. c = 0;
  45. nout = 0;
  46. for(;;) {
  47. while(nout < nproc && argc > 0) {
  48. i = fork();
  49. if(i < 0) {
  50. i = mywait(&status);
  51. if(i < 0)
  52. errorexit();
  53. if(status)
  54. c++;
  55. nout--;
  56. continue;
  57. }
  58. if(i == 0) {
  59. print("%s:\n", *argv);
  60. goto child;
  61. }
  62. nout++;
  63. argc--;
  64. argv++;
  65. }
  66. i = mywait(&status);
  67. if(i < 0) {
  68. if(c)
  69. errorexit();
  70. exits(0);
  71. }
  72. if(status)
  73. c++;
  74. nout--;
  75. }
  76. }
  77. child:
  78. strecpy(ofile, ofile+sizeof ofile, *argv);
  79. if(p = strrchr(ofile, '/')) {
  80. include[0] = ofile;
  81. *p++ = 0;
  82. } else
  83. p = ofile;
  84. if(outfile == 0) {
  85. outfile = p;
  86. if(p = strrchr(outfile, '.'))
  87. if(p[1] == 's' && p[2] == 0)
  88. p[0] = 0;
  89. p = strrchr(outfile, 0);
  90. p[0] = '.';
  91. p[1] = thechar;
  92. p[2] = 0;
  93. }
  94. if(0) {
  95. strcpy(incfile, "/usr/%include");
  96. p = strrchr(incfile, '%');
  97. if(p)
  98. *p = thechar;
  99. } else {
  100. strcpy(incfile, "/");
  101. strcat(incfile, thestring);
  102. strcat(incfile, "/include");
  103. }
  104. include[ninclude++] = incfile;
  105. if(p = getenv("INCLUDE"))
  106. include[ninclude-1] = p; /* */
  107. of = mycreat(outfile, 0664);
  108. if(of < 0) {
  109. yyerror("%ca: cannot create %s", thechar, outfile);
  110. errorexit();
  111. }
  112. Binit(&obuf, of, OWRITE);
  113. pass = 1;
  114. pinit(*argv);
  115. for(i=0; i<nDlist; i++)
  116. dodefine(Dlist[i]);
  117. yyparse();
  118. if(nerrors) {
  119. cclean();
  120. errorexit();
  121. }
  122. pass = 2;
  123. outhist();
  124. pinit(*argv);
  125. for(i=0; i<nDlist; i++)
  126. dodefine(Dlist[i]);
  127. yyparse();
  128. cclean();
  129. if(nerrors)
  130. errorexit();
  131. exits(0);
  132. }
  133. struct
  134. {
  135. char *name;
  136. ushort type;
  137. ushort value;
  138. } itab[] =
  139. {
  140. "SP", LSP, D_AUTO,
  141. "SB", LSB, D_EXTERN,
  142. "FP", LFP, D_PARAM,
  143. "PC", LPC, D_BRANCH,
  144. "R", LR, 0,
  145. "R0", LREG, 0,
  146. "R1", LREG, 1,
  147. "R2", LREG, 2,
  148. "R3", LREG, 3,
  149. "R4", LREG, 4,
  150. "R5", LREG, 5,
  151. "R6", LREG, 6,
  152. "R7", LREG, 7,
  153. "R8", LREG, 8,
  154. "R9", LREG, 9,
  155. "R10", LREG, 10,
  156. "R11", LREG, 11,
  157. "R12", LREG, 12,
  158. "R13", LREG, 13,
  159. "R14", LREG, 14,
  160. "R15", LREG, 15,
  161. "R16", LREG, 16,
  162. "R17", LREG, 17,
  163. "R18", LREG, 18,
  164. "R19", LREG, 19,
  165. "R20", LREG, 20,
  166. "R21", LREG, 21,
  167. "R22", LREG, 22,
  168. "R23", LREG, 23,
  169. "R24", LREG, 24,
  170. "R25", LREG, 25,
  171. "R26", LREG, 26,
  172. "R27", LREG, 27,
  173. "R28", LREG, 28,
  174. "R29", LREG, 29,
  175. "R30", LREG, 30,
  176. "R31", LREG, 31,
  177. "P", LP, 0,
  178. "I", LP, 32,
  179. "A", LP, 64,
  180. "IA", LP, 96,
  181. "T", LP, 128,
  182. "IT", LP, 32+128,
  183. "AT", LP, 64+128,
  184. "IAT", LP, 96+128,
  185. "T0", LPREG, 0+128,
  186. "T1", LPREG, 1+128,
  187. "T2", LPREG, 2+128,
  188. "T3", LPREG, 3+128,
  189. "T4", LPREG, 4+128,
  190. "T5", LPREG, 5+128,
  191. "T6", LPREG, 6+128,
  192. "T7", LPREG, 7+128,
  193. "T8", LPREG, 8+128,
  194. "T9", LPREG, 9+128,
  195. "T10", LPREG, 10+128,
  196. "T11", LPREG, 11+128,
  197. "T12", LPREG, 12+128,
  198. "T13", LPREG, 13+128,
  199. "T14", LPREG, 14+128,
  200. "T15", LPREG, 15+128,
  201. "T16", LPREG, 16+128,
  202. "T17", LPREG, 17+128,
  203. "T18", LPREG, 18+128,
  204. "T19", LPREG, 19+128,
  205. "T20", LPREG, 20+128,
  206. "T21", LPREG, 21+128,
  207. "T22", LPREG, 22+128,
  208. "T23", LPREG, 23+128,
  209. "T24", LPREG, 24+128,
  210. "T25", LPREG, 25+128,
  211. "T26", LPREG, 26+128,
  212. "T27", LPREG, 27+128,
  213. "T28", LPREG, 28+128,
  214. "T29", LPREG, 29+128,
  215. "T30", LPREG, 30+128,
  216. "T31", LPREG, 31+128,
  217. "F", LF, 0,
  218. "F0", LFREG, 0,
  219. "F1", LFREG, 1,
  220. "F2", LFREG, 2,
  221. "F3", LFREG, 3,
  222. "F4", LFREG, 4,
  223. "F5", LFREG, 5,
  224. "F6", LFREG, 6,
  225. "F7", LFREG, 7,
  226. "F8", LFREG, 8,
  227. "F9", LFREG, 9,
  228. "F10", LFREG, 10,
  229. "F11", LFREG, 11,
  230. "F12", LFREG, 12,
  231. "F13", LFREG, 13,
  232. "F14", LFREG, 14,
  233. "F15", LFREG, 15,
  234. "F16", LFREG, 16,
  235. "F17", LFREG, 17,
  236. "F18", LFREG, 18,
  237. "F19", LFREG, 19,
  238. "F20", LFREG, 20,
  239. "F21", LFREG, 21,
  240. "F22", LFREG, 22,
  241. "F23", LFREG, 23,
  242. "F24", LFREG, 24,
  243. "F25", LFREG, 25,
  244. "F26", LFREG, 26,
  245. "F27", LFREG, 27,
  246. "F28", LFREG, 28,
  247. "F29", LFREG, 29,
  248. "F30", LFREG, 30,
  249. "F31", LFREG, 31,
  250. "FPCR", LFPCR, 0,
  251. "PCC", LPCC, 0,
  252. /* 1: integer operates */
  253. "ADDQ", LTYPE1, AADDQ,
  254. "ADDL", LTYPE1, AADDL,
  255. "SUBL", LTYPE1, ASUBL,
  256. "SUBQ", LTYPE1, ASUBQ,
  257. "CMPEQ", LTYPE1, ACMPEQ,
  258. "CMPGT", LTYPE1, ACMPGT,
  259. "CMPGE", LTYPE1, ACMPGE,
  260. "CMPUGT", LTYPE1, ACMPUGT,
  261. "CMPUGE", LTYPE1, ACMPUGE,
  262. "CMPBLE", LTYPE1, ACMPBLE,
  263. "AND", LTYPE1, AAND,
  264. "ANDNOT", LTYPE1, AANDNOT,
  265. "OR", LTYPE1, AOR,
  266. "ORNOT", LTYPE1, AORNOT,
  267. "XOR", LTYPE1, AXOR,
  268. "XORNOT", LTYPE1, AXORNOT,
  269. "CMOVEQ", LTYPE1, ACMOVEQ,
  270. "CMOVNE", LTYPE1, ACMOVNE,
  271. "CMOVLT", LTYPE1, ACMOVLT,
  272. "CMOVGE", LTYPE1, ACMOVGE,
  273. "CMOVLE", LTYPE1, ACMOVLE,
  274. "CMOVGT", LTYPE1, ACMOVGT,
  275. "CMOVLBS", LTYPE1, ACMOVLBS,
  276. "CMOVLBC", LTYPE1, ACMOVLBC,
  277. "MULL", LTYPE1, AMULL,
  278. "MULQ", LTYPE1, AMULQ,
  279. "UMULH", LTYPE1, AUMULH,
  280. "DIVQ", LTYPE1, ADIVQ,
  281. "MODQ", LTYPE1, AMODQ,
  282. "DIVQU", LTYPE1, ADIVQU,
  283. "MODQU", LTYPE1, AMODQU,
  284. "DIVL", LTYPE1, ADIVL,
  285. "MODL", LTYPE1, AMODL,
  286. "DIVLU", LTYPE1, ADIVLU,
  287. "MODLU", LTYPE1, AMODLU,
  288. "SLLQ", LTYPE1, ASLLQ,
  289. "SRLQ", LTYPE1, ASRLQ,
  290. "SRAQ", LTYPE1, ASRAQ,
  291. "SLLL", LTYPE1, ASLLL,
  292. "SRLL", LTYPE1, ASRLL,
  293. "SRAL", LTYPE1, ASRAL,
  294. "EXTBL", LTYPE1, AEXTBL,
  295. "EXTWL", LTYPE1, AEXTWL,
  296. "EXTLL", LTYPE1, AEXTLL,
  297. "EXTQL", LTYPE1, AEXTQL,
  298. "EXTWH", LTYPE1, AEXTWH,
  299. "EXTLH", LTYPE1, AEXTLH,
  300. "EXTQH", LTYPE1, AEXTQH,
  301. "INSBL", LTYPE1, AINSBL,
  302. "INSWL", LTYPE1, AINSWL,
  303. "INSLL", LTYPE1, AINSLL,
  304. "INSQL", LTYPE1, AINSQL,
  305. "INSWH", LTYPE1, AINSWH,
  306. "INSLH", LTYPE1, AINSLH,
  307. "INSQH", LTYPE1, AINSQH,
  308. "MSKBL", LTYPE1, AMSKBL,
  309. "MSKWL", LTYPE1, AMSKWL,
  310. "MSKLL", LTYPE1, AMSKLL,
  311. "MSKQL", LTYPE1, AMSKQL,
  312. "MSKWH", LTYPE1, AMSKWH,
  313. "MSKLH", LTYPE1, AMSKLH,
  314. "MSKQH", LTYPE1, AMSKQH,
  315. "ZAP", LTYPE1, AZAP,
  316. "ZAPNOT", LTYPE1, AZAPNOT,
  317. /* 2: floating operates with 2 operands */
  318. "CVTQS", LTYPE2, ACVTQS,
  319. "CVTQT", LTYPE2, ACVTQT,
  320. "CVTTS", LTYPE2, ACVTTS,
  321. "CVTTQ", LTYPE2, ACVTTQ,
  322. "CVTLQ", LTYPE2, ACVTLQ,
  323. "CVTQL", LTYPE2, ACVTQL,
  324. /* 3: floating operates with 2 or 3 operands */
  325. "CPYS", LTYPE3, ACPYS,
  326. "CPYSN", LTYPE3, ACPYSN,
  327. "CPYSE", LTYPE3, ACPYSE,
  328. "ADDS", LTYPE3, AADDS,
  329. "ADDT", LTYPE3, AADDT,
  330. "CMPTEQ", LTYPE3, ACMPTEQ,
  331. "CMPTGT", LTYPE3, ACMPTGT,
  332. "CMPTGE", LTYPE3, ACMPTGE,
  333. "CMPTUN", LTYPE3, ACMPTUN,
  334. "DIVS", LTYPE3, ADIVS,
  335. "DIVT", LTYPE3, ADIVT,
  336. "MULS", LTYPE3, AMULS,
  337. "MULT", LTYPE3, AMULT,
  338. "SUBS", LTYPE3, ASUBS,
  339. "SUBT", LTYPE3, ASUBT,
  340. "FCMOVEQ", LTYPE3, AFCMOVEQ,
  341. "FCMOVNE", LTYPE3, AFCMOVNE,
  342. "FCMOVLT", LTYPE3, AFCMOVLT,
  343. "FCMOVGE", LTYPE3, AFCMOVGE,
  344. "FCMOVLE", LTYPE3, AFCMOVLE,
  345. "FCMOVGT", LTYPE3, AFCMOVGT,
  346. /* 4: integer load/store and reg->reg (incl special regs) */
  347. "MOVQ", LTYPE4, AMOVQ,
  348. /* 5: integer load/store and reg->reg */
  349. "MOVL", LTYPE5, AMOVL,
  350. "MOVQU", LTYPE5, AMOVQU,
  351. "MOVB", LTYPE5, AMOVB,
  352. "MOVBU", LTYPE5, AMOVBU,
  353. "MOVW", LTYPE5, AMOVW,
  354. "MOVWU", LTYPE5, AMOVWU,
  355. "MOVLP", LTYPE5, AMOVLP,
  356. "MOVQP", LTYPE5, AMOVQP,
  357. /* 6: integer load/store (only) */
  358. "MOVA", LTYPE6, AMOVA,
  359. "MOVAH", LTYPE6, AMOVAH,
  360. "MOVLL", LTYPE6, AMOVLL,
  361. "MOVQL", LTYPE6, AMOVQL,
  362. "MOVLC", LTYPEK, AMOVLC,
  363. "MOVQC", LTYPEK, AMOVQC,
  364. /* 7: floating load/store and reg->reg */
  365. "MOVS", LTYPE7, AMOVS,
  366. "MOVT", LTYPE7, AMOVT,
  367. /* 8,9: jumps */
  368. "JMP", LTYPE8, AJMP,
  369. "JSR", LTYPE8, AJSR,
  370. "RET", LTYPE9, ARET,
  371. /* A: integer conditional branches */
  372. "BEQ", LTYPEA, ABEQ,
  373. "BNE", LTYPEA, ABNE,
  374. "BLT", LTYPEA, ABLT,
  375. "BGE", LTYPEA, ABGE,
  376. "BLE", LTYPEA, ABLE,
  377. "BGT", LTYPEA, ABGT,
  378. "BLBC", LTYPEA, ABLBC,
  379. "BLBS", LTYPEA, ABLBS,
  380. /* B: floating conditional branches */
  381. "FBEQ", LTYPEB, AFBEQ,
  382. "FBNE", LTYPEB, AFBNE,
  383. "FBLT", LTYPEB, AFBLT,
  384. "FBGE", LTYPEB, AFBGE,
  385. "FBLE", LTYPEB, AFBLE,
  386. "FBGT", LTYPEB, AFBGT,
  387. /* C-J: miscellaneous */
  388. "TRAPB", LTYPEC, ATRAPB,
  389. "MB", LTYPEC, AMB,
  390. "REI", LTYPEC, AREI,
  391. "END", LTYPEC, AEND,
  392. "FETCH", LTYPED, AFETCH,
  393. "FETCHM", LTYPED, AFETCHM,
  394. "CALL_PAL", LTYPEE, ACALL_PAL,
  395. "TEXT", LTYPEF, ATEXT,
  396. "GLOBL", LTYPEF, AGLOBL,
  397. "DATA", LTYPEG, ADATA,
  398. "WORD", LTYPEH, AWORD,
  399. "NOP", LTYPEI, ANOP,
  400. 0
  401. };
  402. void
  403. cinit(void)
  404. {
  405. Sym *s;
  406. int i;
  407. nullgen.sym = S;
  408. nullgen.offset = 0;
  409. nullgen.type = D_NONE;
  410. nullgen.name = D_NONE;
  411. nullgen.reg = NREG;
  412. if(FPCHIP)
  413. nullgen.dval = 0;
  414. for(i=0; i<sizeof(nullgen.sval); i++)
  415. nullgen.sval[i] = 0;
  416. nerrors = 0;
  417. iostack = I;
  418. iofree = I;
  419. peekc = IGN;
  420. nhunk = 0;
  421. for(i=0; i<NHASH; i++)
  422. hash[i] = S;
  423. for(i=0; itab[i].name; i++) {
  424. s = slookup(itab[i].name);
  425. s->type = itab[i].type;
  426. s->value = itab[i].value;
  427. }
  428. ALLOCN(pathname, 0, 100);
  429. if(getwd(pathname, 99) == 0) {
  430. ALLOCN(pathname, 100, 900);
  431. if(getwd(pathname, 999) == 0)
  432. strcpy(pathname, "/???");
  433. }
  434. }
  435. void
  436. syminit(Sym *s)
  437. {
  438. s->type = LNAME;
  439. s->value = 0;
  440. }
  441. int
  442. isreg(Gen *g)
  443. {
  444. USED(g);
  445. return 1;
  446. }
  447. void
  448. cclean(void)
  449. {
  450. outcode(AEND, &nullgen, NREG, &nullgen);
  451. Bflush(&obuf);
  452. }
  453. void
  454. zname(char *n, int t, int s)
  455. {
  456. Bputc(&obuf, ANAME);
  457. Bputc(&obuf, t); /* type */
  458. Bputc(&obuf, s); /* sym */
  459. while(*n) {
  460. Bputc(&obuf, *n);
  461. n++;
  462. }
  463. Bputc(&obuf, 0);
  464. }
  465. void
  466. zaddr(Gen *a, int s)
  467. {
  468. vlong l;
  469. int i;
  470. char *n;
  471. Ieee e;
  472. Bputc(&obuf, a->type);
  473. Bputc(&obuf, a->reg);
  474. Bputc(&obuf, s);
  475. Bputc(&obuf, a->name);
  476. switch(a->type) {
  477. default:
  478. print("unknown type %d\n", a->type);
  479. exits("arg");
  480. case D_NONE:
  481. case D_REG:
  482. case D_FREG:
  483. case D_PREG:
  484. case D_FCREG:
  485. case D_PCC:
  486. break;
  487. case D_OREG:
  488. case D_CONST:
  489. case D_BRANCH:
  490. l = a->offset;
  491. Bputc(&obuf, l);
  492. Bputc(&obuf, l>>8);
  493. Bputc(&obuf, l>>16);
  494. Bputc(&obuf, l>>24);
  495. Bputc(&obuf, l>>32);
  496. Bputc(&obuf, l>>40);
  497. Bputc(&obuf, l>>48);
  498. Bputc(&obuf, l>>56);
  499. break;
  500. case D_SCONST:
  501. n = a->sval;
  502. for(i=0; i<NSNAME; i++) {
  503. Bputc(&obuf, *n);
  504. n++;
  505. }
  506. break;
  507. case D_FCONST:
  508. ieeedtod(&e, a->dval);
  509. Bputc(&obuf, e.l);
  510. Bputc(&obuf, e.l>>8);
  511. Bputc(&obuf, e.l>>16);
  512. Bputc(&obuf, e.l>>24);
  513. Bputc(&obuf, e.h);
  514. Bputc(&obuf, e.h>>8);
  515. Bputc(&obuf, e.h>>16);
  516. Bputc(&obuf, e.h>>24);
  517. break;
  518. }
  519. }
  520. void
  521. outcode(int a, Gen *g1, int reg, Gen *g2)
  522. {
  523. int sf, st, t;
  524. Sym *s;
  525. if(pass == 1)
  526. goto out;
  527. jackpot:
  528. sf = 0;
  529. s = g1->sym;
  530. while(s != S) {
  531. sf = s->sym;
  532. if(sf < 0 || sf >= NSYM)
  533. sf = 0;
  534. t = g1->name;
  535. if(h[sf].type == t)
  536. if(h[sf].sym == s)
  537. break;
  538. zname(s->name, t, sym);
  539. s->sym = sym;
  540. h[sym].sym = s;
  541. h[sym].type = t;
  542. sf = sym;
  543. sym++;
  544. if(sym >= NSYM)
  545. sym = 1;
  546. break;
  547. }
  548. st = 0;
  549. s = g2->sym;
  550. while(s != S) {
  551. st = s->sym;
  552. if(st < 0 || st >= NSYM)
  553. st = 0;
  554. t = g2->name;
  555. if(h[st].type == t)
  556. if(h[st].sym == s)
  557. break;
  558. zname(s->name, t, sym);
  559. s->sym = sym;
  560. h[sym].sym = s;
  561. h[sym].type = t;
  562. st = sym;
  563. sym++;
  564. if(sym >= NSYM)
  565. sym = 1;
  566. if(st == sf)
  567. goto jackpot;
  568. break;
  569. }
  570. Bputc(&obuf, a);
  571. Bputc(&obuf, reg);
  572. Bputc(&obuf, lineno);
  573. Bputc(&obuf, lineno>>8);
  574. Bputc(&obuf, lineno>>16);
  575. Bputc(&obuf, lineno>>24);
  576. zaddr(g1, sf);
  577. zaddr(g2, st);
  578. out:
  579. if(a != AGLOBL && a != ADATA)
  580. pc++;
  581. }
  582. void
  583. outhist(void)
  584. {
  585. Gen g;
  586. Hist *h;
  587. char *p, *q, *op;
  588. int n;
  589. g = nullgen;
  590. for(h = hist; h != H; h = h->link) {
  591. p = h->name;
  592. op = 0;
  593. if(p && p[0] != '/' && h->offset == 0 && pathname && pathname[0] == '/') {
  594. op = p;
  595. p = pathname;
  596. }
  597. while(p) {
  598. q = strchr(p, '/');
  599. if(q) {
  600. n = q-p;
  601. if(n == 0)
  602. n = 1; /* leading "/" */
  603. q++;
  604. } else {
  605. n = strlen(p);
  606. q = 0;
  607. }
  608. if(n) {
  609. Bputc(&obuf, ANAME);
  610. Bputc(&obuf, D_FILE); /* type */
  611. Bputc(&obuf, 1); /* sym */
  612. Bputc(&obuf, '<');
  613. Bwrite(&obuf, p, n);
  614. Bputc(&obuf, 0);
  615. }
  616. p = q;
  617. if(p == 0 && op) {
  618. p = op;
  619. op = 0;
  620. }
  621. }
  622. g.offset = h->offset;
  623. Bputc(&obuf, AHISTORY);
  624. Bputc(&obuf, 0);
  625. Bputc(&obuf, h->line);
  626. Bputc(&obuf, h->line>>8);
  627. Bputc(&obuf, h->line>>16);
  628. Bputc(&obuf, h->line>>24);
  629. zaddr(&nullgen, 0);
  630. zaddr(&g, 0);
  631. }
  632. }
  633. #include "../cc/lexbody"
  634. #include "../cc/macbody"
  635. #include "../cc/compat"