lex.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  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 *p;
  9. int nout, nproc, status, i, c;
  10. thechar = 'k';
  11. thestring = "sparc";
  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. setinclude(p);
  33. break;
  34. } ARGEND
  35. if(*argv == 0) {
  36. print("usage: %ca [-options] file.s\n", thechar);
  37. errorexit();
  38. }
  39. if(argc > 1 && systemtype(Windows)){
  40. print("can't assemble multiple files on windows\n");
  41. errorexit();
  42. }
  43. if(argc > 1 && !systemtype(Windows)) {
  44. nproc = 1;
  45. if(p = getenv("NPROC"))
  46. nproc = atol(p); /* */
  47. c = 0;
  48. nout = 0;
  49. for(;;) {
  50. while(nout < nproc && argc > 0) {
  51. i = myfork();
  52. if(i < 0) {
  53. i = mywait(&status);
  54. if(i < 0)
  55. errorexit();
  56. if(status)
  57. c++;
  58. nout--;
  59. continue;
  60. }
  61. if(i == 0) {
  62. print("%s:\n", *argv);
  63. if(assemble(*argv))
  64. errorexit();
  65. exits(0);
  66. }
  67. nout++;
  68. argc--;
  69. argv++;
  70. }
  71. i = mywait(&status);
  72. if(i < 0) {
  73. if(c)
  74. errorexit();
  75. exits(0);
  76. }
  77. if(status)
  78. c++;
  79. nout--;
  80. }
  81. }
  82. if(assemble(argv[0]))
  83. errorexit();
  84. exits(0);
  85. }
  86. int
  87. assemble(char *file)
  88. {
  89. char ofile[100], incfile[20], *p;
  90. int i, of;
  91. strcpy(ofile, file);
  92. p = utfrrune(ofile, pathchar());
  93. if(p) {
  94. include[0] = ofile;
  95. *p++ = 0;
  96. } else
  97. p = ofile;
  98. if(outfile == 0) {
  99. outfile = p;
  100. if(outfile){
  101. p = utfrrune(outfile, '.');
  102. if(p)
  103. if(p[1] == 's' && p[2] == 0)
  104. p[0] = 0;
  105. p = utfrune(outfile, 0);
  106. p[0] = '.';
  107. p[1] = thechar;
  108. p[2] = 0;
  109. } else
  110. outfile = "/dev/null";
  111. }
  112. p = getenv("INCLUDE");
  113. if(p) {
  114. setinclude(p);
  115. } else {
  116. if(systemtype(Plan9)) {
  117. sprint(incfile,"/%s/include", thestring);
  118. setinclude(strdup(incfile));
  119. }
  120. }
  121. of = mycreat(outfile, 0664);
  122. if(of < 0) {
  123. yyerror("%ca: cannot create %s", thechar, outfile);
  124. errorexit();
  125. }
  126. Binit(&obuf, of, OWRITE);
  127. pass = 1;
  128. pinit(file);
  129. for(i=0; i<nDlist; i++)
  130. dodefine(Dlist[i]);
  131. yyparse();
  132. if(nerrors) {
  133. cclean();
  134. return nerrors;
  135. }
  136. pass = 2;
  137. outhist();
  138. pinit(file);
  139. for(i=0; i<nDlist; i++)
  140. dodefine(Dlist[i]);
  141. yyparse();
  142. cclean();
  143. return nerrors;
  144. }
  145. struct
  146. {
  147. char *name;
  148. ushort type;
  149. ushort value;
  150. } itab[] =
  151. {
  152. "SP", LSP, D_AUTO,
  153. "SB", LSB, D_EXTERN,
  154. "FP", LFP, D_PARAM,
  155. "PC", LPC, D_BRANCH,
  156. "FSR", LFSR, D_FSR,
  157. "CSR", LFSR, D_CSR,
  158. "FQ", LFPQ, D_FPQ,
  159. "CQ", LFPQ, D_CPQ,
  160. "Y", LPSR, D_Y,
  161. "PSR", LPSR, D_PSR,
  162. "WIM", LPSR, D_WIM,
  163. "TBR", LPSR, D_TBR,
  164. "R", LR, 0,
  165. "R0", LREG, 0,
  166. "R1", LREG, 1,
  167. "R2", LREG, 2,
  168. "R3", LREG, 3,
  169. "R4", LREG, 4,
  170. "R5", LREG, 5,
  171. "R6", LREG, 6,
  172. "R7", LREG, 7,
  173. "R8", LREG, 8,
  174. "R9", LREG, 9,
  175. "R10", LREG, 10,
  176. "R11", LREG, 11,
  177. "R12", LREG, 12,
  178. "R13", LREG, 13,
  179. "R14", LREG, 14,
  180. "R15", LREG, 15,
  181. "R16", LREG, 16,
  182. "R17", LREG, 17,
  183. "R18", LREG, 18,
  184. "R19", LREG, 19,
  185. "R20", LREG, 20,
  186. "R21", LREG, 21,
  187. "R22", LREG, 22,
  188. "R23", LREG, 23,
  189. "R24", LREG, 24,
  190. "R25", LREG, 25,
  191. "R26", LREG, 26,
  192. "R27", LREG, 27,
  193. "R28", LREG, 28,
  194. "R29", LREG, 29,
  195. "R30", LREG, 30,
  196. "R31", LREG, 31,
  197. "C", LC, 0,
  198. "C0", LCREG, 0,
  199. "C1", LCREG, 1,
  200. "C2", LCREG, 2,
  201. "C3", LCREG, 3,
  202. "C4", LCREG, 4,
  203. "C5", LCREG, 5,
  204. "C6", LCREG, 6,
  205. "C7", LCREG, 7,
  206. "C8", LCREG, 8,
  207. "C9", LCREG, 9,
  208. "C10", LCREG, 10,
  209. "C11", LCREG, 11,
  210. "C12", LCREG, 12,
  211. "C13", LCREG, 13,
  212. "C14", LCREG, 14,
  213. "C15", LCREG, 15,
  214. "C16", LCREG, 16,
  215. "C17", LCREG, 17,
  216. "C18", LCREG, 18,
  217. "C19", LCREG, 19,
  218. "C20", LCREG, 20,
  219. "C21", LCREG, 21,
  220. "C22", LCREG, 22,
  221. "C23", LCREG, 23,
  222. "C24", LCREG, 24,
  223. "C25", LCREG, 25,
  224. "C26", LCREG, 26,
  225. "C27", LCREG, 27,
  226. "C28", LCREG, 28,
  227. "C29", LCREG, 29,
  228. "C30", LCREG, 30,
  229. "C31", LCREG, 31,
  230. "F", LF, 0,
  231. "F0", LFREG, 0,
  232. "F2", LFREG, 2,
  233. "F4", LFREG, 4,
  234. "F6", LFREG, 6,
  235. "F8", LFREG, 8,
  236. "F10", LFREG, 10,
  237. "F12", LFREG, 12,
  238. "F14", LFREG, 14,
  239. "F16", LFREG, 16,
  240. "F18", LFREG, 18,
  241. "F20", LFREG, 20,
  242. "F22", LFREG, 22,
  243. "F24", LFREG, 24,
  244. "F26", LFREG, 26,
  245. "F28", LFREG, 28,
  246. "F30", LFREG, 30,
  247. "F1", LFREG, 1,
  248. "F3", LFREG, 3,
  249. "F5", LFREG, 5,
  250. "F7", LFREG, 7,
  251. "F9", LFREG, 9,
  252. "F11", LFREG, 11,
  253. "F13", LFREG, 13,
  254. "F15", LFREG, 15,
  255. "F17", LFREG, 17,
  256. "F19", LFREG, 19,
  257. "F21", LFREG, 21,
  258. "F23", LFREG, 23,
  259. "F25", LFREG, 25,
  260. "F27", LFREG, 27,
  261. "F29", LFREG, 29,
  262. "F31", LFREG, 31,
  263. "ADD", LADDW, AADD,
  264. "ADDCC", LADDW, AADDCC,
  265. "ADDX", LADDW, AADDX,
  266. "ADDXCC", LADDW, AADDXCC,
  267. "AND", LADDW, AAND,
  268. "ANDCC", LADDW, AANDCC,
  269. "ANDN", LADDW, AANDN,
  270. "ANDNCC", LADDW, AANDNCC,
  271. "BA", LBRA, ABA,
  272. "BCC", LBRA, ABCC,
  273. "BCS", LBRA, ABCS,
  274. "BE", LBRA, ABE,
  275. "BG", LBRA, ABG,
  276. "BGE", LBRA, ABGE,
  277. "BGU", LBRA, ABGU,
  278. "BL", LBRA, ABL,
  279. "BLE", LBRA, ABLE,
  280. "BLEU", LBRA, ABLEU,
  281. "BN", LBRA, ABN,
  282. "BNE", LBRA, ABNE,
  283. "BNEG", LBRA, ABNEG,
  284. "BPOS", LBRA, ABPOS,
  285. "BVC", LBRA, ABVC,
  286. "BVS", LBRA, ABVS,
  287. "CB0", LBRA, ACB0,
  288. "CB01", LBRA, ACB01,
  289. "CB012", LBRA, ACB012,
  290. "CB013", LBRA, ACB013,
  291. "CB02", LBRA, ACB02,
  292. "CB023", LBRA, ACB023,
  293. "CB03", LBRA, ACB03,
  294. "CB1", LBRA, ACB1,
  295. "CB12", LBRA, ACB12,
  296. "CB123", LBRA, ACB123,
  297. "CB13", LBRA, ACB13,
  298. "CB2", LBRA, ACB2,
  299. "CB23", LBRA, ACB23,
  300. "CB3", LBRA, ACB3,
  301. "CBA", LBRA, ACBA,
  302. "CBN", LBRA, ACBN,
  303. "CMP", LCMP, ACMP,
  304. "CPOP1", LCPOP, ACPOP1,
  305. "CPOP2", LCPOP, ACPOP2,
  306. "DATA", LDATA, ADATA,
  307. "DIV", LADDW, ADIV,
  308. "DIVL", LADDW, ADIVL,
  309. "END", LEND, AEND,
  310. "FABSD", LFCONV, AFABSD,
  311. "FABSF", LFCONV, AFABSF,
  312. "FABSX", LFCONV, AFABSX,
  313. "FADDD", LFADD, AFADDD,
  314. "FADDF", LFADD, AFADDF,
  315. "FADDX", LFADD, AFADDX,
  316. "FBA", LBRA, AFBA,
  317. "FBE", LBRA, AFBE,
  318. "FBG", LBRA, AFBG,
  319. "FBGE", LBRA, AFBGE,
  320. "FBL", LBRA, AFBL,
  321. "FBLE", LBRA, AFBLE,
  322. "FBLG", LBRA, AFBLG,
  323. "FBN", LBRA, AFBN,
  324. "FBNE", LBRA, AFBNE,
  325. "FBO", LBRA, AFBO,
  326. "FBU", LBRA, AFBU,
  327. "FBUE", LBRA, AFBUE,
  328. "FBUG", LBRA, AFBUG,
  329. "FBUGE", LBRA, AFBUGE,
  330. "FBUL", LBRA, AFBUL,
  331. "FBULE", LBRA, AFBULE,
  332. "FCMPD", LFADD, AFCMPD,
  333. "FCMPED", LFADD, AFCMPED,
  334. "FCMPEF", LFADD, AFCMPEF,
  335. "FCMPEX", LFADD, AFCMPEX,
  336. "FCMPF", LFADD, AFCMPF,
  337. "FCMPX", LFADD, AFCMPX,
  338. "FDIVD", LFADD, AFDIVD,
  339. "FDIVF", LFADD, AFDIVF,
  340. "FDIVX", LFADD, AFDIVX,
  341. "FMOVD", LFMOV, AFMOVD,
  342. "FMOVDF", LFCONV, AFMOVDF,
  343. "FMOVDW", LFCONV, AFMOVDW,
  344. "FMOVDX", LFCONV, AFMOVDX,
  345. "FMOVF", LFMOV, AFMOVF,
  346. "FMOVFD", LFCONV, AFMOVFD,
  347. "FMOVFW", LFCONV, AFMOVFW,
  348. "FMOVFX", LFCONV, AFMOVFX,
  349. "FMOVWD", LFCONV, AFMOVWD,
  350. "FMOVWF", LFCONV, AFMOVWF,
  351. "FMOVWX", LFCONV, AFMOVWX,
  352. "FMOVX", LFCONV, AFMOVX,
  353. "FMOVXD", LFCONV, AFMOVXD,
  354. "FMOVXF", LFCONV, AFMOVXF,
  355. "FMOVXW", LFCONV, AFMOVXW,
  356. "FMULD", LFADD, AFMULD,
  357. "FMULF", LFADD, AFMULF,
  358. "FMULX", LFADD, AFMULX,
  359. "FNEGD", LFCONV, AFNEGD,
  360. "FNEGF", LFCONV, AFNEGF,
  361. "FNEGX", LFCONV, AFNEGX,
  362. "FSQRTD", LFCONV, AFSQRTD,
  363. "FSQRTF", LFCONV, AFSQRTF,
  364. "FSQRTX", LFCONV, AFSQRTX,
  365. "FSUBD", LFADD, AFSUBD,
  366. "FSUBF", LFADD, AFSUBF,
  367. "FSUBX", LFADD, AFSUBX,
  368. "GLOBL", LTEXT, AGLOBL,
  369. "IFLUSH", LFLUSH, AIFLUSH,
  370. "JMPL", LJMPL, AJMPL,
  371. "JMP", LJMPL, AJMP,
  372. "MOD", LADDW, AMOD,
  373. "MODL", LADDW, AMODL,
  374. "MOVB", LMOVB, AMOVB,
  375. "MOVBU", LMOVB, AMOVBU,
  376. "MOVD", LMOVD, AMOVD,
  377. "MOVH", LMOVB, AMOVH,
  378. "MOVHU", LMOVB, AMOVHU,
  379. "MOVW", LMOVW, AMOVW,
  380. "MUL", LADDW, AMUL,
  381. "MULSCC", LADDW, AMULSCC,
  382. "NOP", LNOP, ANOP,
  383. "OR", LADDW, AOR,
  384. "ORCC", LADDW, AORCC,
  385. "ORN", LADDW, AORN,
  386. "ORNCC", LADDW, AORNCC,
  387. "RESTORE", LADDW, ARESTORE,
  388. "RETT", LRETT, ARETT,
  389. "RETURN", LRETRN, ARETURN,
  390. "SAVE", LADDW, ASAVE,
  391. "SLL", LADDW, ASLL,
  392. "SRA", LADDW, ASRA,
  393. "SRL", LADDW, ASRL,
  394. "SUB", LADDW, ASUB,
  395. "SUBCC", LADDW, ASUBCC,
  396. "SUBX", LADDW, ASUBX,
  397. "SUBXCC", LADDW, ASUBXCC,
  398. "SWAP", LSWAP, ASWAP,
  399. "TA", LTRAP, ATA,
  400. "TADDCC", LADDW, ATADDCC,
  401. "TADDCCTV", LADDW, ATADDCCTV,
  402. "TAS", LSWAP, ATAS,
  403. "TCC", LTRAP, ATCC,
  404. "TCS", LTRAP, ATCS,
  405. "TE", LTRAP, ATE,
  406. "TEXT", LTEXT, ATEXT,
  407. "TG", LTRAP, ATG,
  408. "TGE", LTRAP, ATGE,
  409. "TGU", LTRAP, ATGU,
  410. "TL", LTRAP, ATL,
  411. "TLE", LTRAP, ATLE,
  412. "TLEU", LTRAP, ATLEU,
  413. "TN", LTRAP, ATN,
  414. "TNE", LTRAP, ATNE,
  415. "TNEG", LTRAP, ATNEG,
  416. "TPOS", LTRAP, ATPOS,
  417. "TSUBCC", LADDW, ATSUBCC,
  418. "TSUBCCTV", LADDW, ATSUBCCTV,
  419. "TVC", LTRAP, ATVC,
  420. "TVS", LTRAP, ATVS,
  421. "UNIMP", LUNIMP, AUNIMP,
  422. "WORD", LUNIMP, AWORD,
  423. "XNOR", LADDW, AXNOR,
  424. "XNORCC", LADDW, AXNORCC,
  425. "XOR", LXORW, AXOR,
  426. "XORCC", LADDW, AXORCC,
  427. "SCHED", LSCHED, 0,
  428. "NOSCHED", LSCHED, 0x80,
  429. 0
  430. };
  431. void
  432. cinit(void)
  433. {
  434. Sym *s;
  435. int i;
  436. nullgen.sym = S;
  437. nullgen.offset = 0;
  438. nullgen.type = D_NONE;
  439. nullgen.name = D_NONE;
  440. nullgen.reg = NREG;
  441. nullgen.xreg = NREG;
  442. if(FPCHIP)
  443. nullgen.dval = 0;
  444. for(i=0; i<sizeof(nullgen.sval); i++)
  445. nullgen.sval[i] = 0;
  446. nerrors = 0;
  447. iostack = I;
  448. iofree = I;
  449. peekc = IGN;
  450. nhunk = 0;
  451. for(i=0; i<NHASH; i++)
  452. hash[i] = S;
  453. for(i=0; itab[i].name; i++) {
  454. s = slookup(itab[i].name);
  455. s->type = itab[i].type;
  456. s->value = itab[i].value;
  457. }
  458. pathname = allocn(pathname, 0, 100);
  459. if(mygetwd(pathname, 99) == 0) {
  460. pathname = allocn(pathname, 100, 900);
  461. if(mygetwd(pathname, 999) == 0)
  462. strcpy(pathname, "/???");
  463. }
  464. }
  465. void
  466. syminit(Sym *s)
  467. {
  468. s->type = LNAME;
  469. s->value = 0;
  470. }
  471. void
  472. cclean(void)
  473. {
  474. outcode(AEND, &nullgen, NREG, &nullgen);
  475. Bflush(&obuf);
  476. }
  477. void
  478. zname(char *n, int t, int s)
  479. {
  480. Bputc(&obuf, ANAME);
  481. Bputc(&obuf, t); /* type */
  482. Bputc(&obuf, s); /* sym */
  483. while(*n) {
  484. Bputc(&obuf, *n);
  485. n++;
  486. }
  487. Bputc(&obuf, 0);
  488. }
  489. void
  490. zaddr(Gen *a, int s)
  491. {
  492. long l;
  493. int i;
  494. char *n;
  495. Ieee e;
  496. Bputc(&obuf, a->type);
  497. Bputc(&obuf, a->reg);
  498. Bputc(&obuf, s);
  499. Bputc(&obuf, a->name);
  500. switch(a->type) {
  501. default:
  502. print("unknown type %d\n", a->type);
  503. exits("arg");
  504. case D_NONE:
  505. case D_REG:
  506. case D_FREG:
  507. case D_CREG:
  508. case D_PREG:
  509. break;
  510. case D_OREG:
  511. case D_ASI:
  512. case D_CONST:
  513. case D_BRANCH:
  514. l = a->offset;
  515. Bputc(&obuf, l);
  516. Bputc(&obuf, l>>8);
  517. Bputc(&obuf, l>>16);
  518. Bputc(&obuf, l>>24);
  519. break;
  520. case D_SCONST:
  521. n = a->sval;
  522. for(i=0; i<NSNAME; i++) {
  523. Bputc(&obuf, *n);
  524. n++;
  525. }
  526. break;
  527. case D_FCONST:
  528. ieeedtod(&e, a->dval);
  529. Bputc(&obuf, e.l);
  530. Bputc(&obuf, e.l>>8);
  531. Bputc(&obuf, e.l>>16);
  532. Bputc(&obuf, e.l>>24);
  533. Bputc(&obuf, e.h);
  534. Bputc(&obuf, e.h>>8);
  535. Bputc(&obuf, e.h>>16);
  536. Bputc(&obuf, e.h>>24);
  537. break;
  538. }
  539. }
  540. void
  541. outcode(int a, Gen *g1, int reg, Gen *g2)
  542. {
  543. int sf, st, t;
  544. Sym *s;
  545. if(pass == 1)
  546. goto out;
  547. if(g1->xreg != NREG) {
  548. if(reg != NREG || g2->xreg != NREG)
  549. yyerror("bad addressing modes");
  550. reg = g1->xreg;
  551. } else
  552. if(g2->xreg != NREG) {
  553. if(reg != NREG)
  554. yyerror("bad addressing modes");
  555. reg = g2->xreg;
  556. }
  557. jackpot:
  558. sf = 0;
  559. s = g1->sym;
  560. while(s != S) {
  561. sf = s->sym;
  562. if(sf < 0 || sf >= NSYM)
  563. sf = 0;
  564. t = g1->name;
  565. if(h[sf].type == t)
  566. if(h[sf].sym == s)
  567. break;
  568. zname(s->name, t, sym);
  569. s->sym = sym;
  570. h[sym].sym = s;
  571. h[sym].type = t;
  572. sf = sym;
  573. sym++;
  574. if(sym >= NSYM)
  575. sym = 1;
  576. break;
  577. }
  578. st = 0;
  579. s = g2->sym;
  580. while(s != S) {
  581. st = s->sym;
  582. if(st < 0 || st >= NSYM)
  583. st = 0;
  584. t = g2->name;
  585. if(h[st].type == t)
  586. if(h[st].sym == s)
  587. break;
  588. zname(s->name, t, sym);
  589. s->sym = sym;
  590. h[sym].sym = s;
  591. h[sym].type = t;
  592. st = sym;
  593. sym++;
  594. if(sym >= NSYM)
  595. sym = 1;
  596. if(st == sf)
  597. goto jackpot;
  598. break;
  599. }
  600. Bputc(&obuf, a);
  601. Bputc(&obuf, reg|nosched);
  602. Bputc(&obuf, lineno);
  603. Bputc(&obuf, lineno>>8);
  604. Bputc(&obuf, lineno>>16);
  605. Bputc(&obuf, lineno>>24);
  606. zaddr(g1, sf);
  607. zaddr(g2, st);
  608. out:
  609. if(a != AGLOBL && a != ADATA)
  610. pc++;
  611. }
  612. void
  613. outhist(void)
  614. {
  615. Gen g;
  616. Hist *h;
  617. char *p, *q, *op, c;
  618. int n;
  619. g = nullgen;
  620. c = pathchar();
  621. for(h = hist; h != H; h = h->link) {
  622. p = h->name;
  623. op = 0;
  624. /* on windows skip drive specifier in pathname */
  625. if(systemtype(Windows) && p && p[1] == ':'){
  626. p += 2;
  627. c = *p;
  628. }
  629. if(p && p[0] != c && h->offset == 0 && pathname){
  630. /* on windows skip drive specifier in pathname */
  631. if(systemtype(Windows) && pathname[1] == ':') {
  632. op = p;
  633. p = pathname+2;
  634. c = *p;
  635. } else if(pathname[0] == c){
  636. op = p;
  637. p = pathname;
  638. }
  639. }
  640. while(p) {
  641. q = strchr(p, c);
  642. if(q) {
  643. n = q-p;
  644. if(n == 0){
  645. n = 1; /* leading "/" */
  646. *p = '/'; /* don't emit "\" on windows */
  647. }
  648. q++;
  649. } else {
  650. n = strlen(p);
  651. q = 0;
  652. }
  653. if(n) {
  654. Bputc(&obuf, ANAME);
  655. Bputc(&obuf, D_FILE); /* type */
  656. Bputc(&obuf, 1); /* sym */
  657. Bputc(&obuf, '<');
  658. Bwrite(&obuf, p, n);
  659. Bputc(&obuf, 0);
  660. }
  661. p = q;
  662. if(p == 0 && op) {
  663. p = op;
  664. op = 0;
  665. }
  666. }
  667. g.offset = h->offset;
  668. Bputc(&obuf, AHISTORY);
  669. Bputc(&obuf, 0);
  670. Bputc(&obuf, h->line);
  671. Bputc(&obuf, h->line>>8);
  672. Bputc(&obuf, h->line>>16);
  673. Bputc(&obuf, h->line>>24);
  674. zaddr(&nullgen, 0);
  675. zaddr(&g, 0);
  676. }
  677. }
  678. #include "../cc/lexbody"
  679. #include "../cc/macbody"
  680. #include "../cc/compat"