assemble.pas 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. {
  2. $Id$
  3. Copyright (c) 1998 by the FPC development team
  4. This unit handles the assemblerfile write and assembler calls of FPC
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************}
  17. unit assemble;
  18. interface
  19. {$ifdef OLDASM}
  20. {$define NOAG386BIN}
  21. {$endif}
  22. uses
  23. {$ifdef Delphi}
  24. dmisc,
  25. {$endif Delphi}
  26. dos,cobjects,globtype,globals,aasm;
  27. const
  28. {$ifdef tp}
  29. AsmOutSize=1024;
  30. {$else}
  31. AsmOutSize=32768;
  32. {$endif}
  33. type
  34. PAsmList=^TAsmList;
  35. TAsmList=object
  36. {filenames}
  37. path : pathstr;
  38. name : namestr;
  39. asmfile, { current .s and .o file }
  40. objfile,
  41. as_bin : string;
  42. IsEndFile : boolean; { special 'end' file for import dir ? }
  43. {outfile}
  44. AsmSize,
  45. AsmStartSize,
  46. outcnt : longint;
  47. outbuf : array[0..AsmOutSize-1] of char;
  48. outfile : file;
  49. Constructor Init;
  50. Destructor Done;
  51. Function FindAssembler:string;
  52. Function CallAssembler(const command,para:string):Boolean;
  53. Function DoAssemble:boolean;
  54. Procedure RemoveAsm;
  55. procedure NextSmartName;
  56. Procedure AsmFlush;
  57. Procedure AsmClear;
  58. Procedure AsmWrite(const s:string);
  59. Procedure AsmWritePChar(p:pchar);
  60. Procedure AsmWriteLn(const s:string);
  61. Procedure AsmLn;
  62. procedure AsmCreate;
  63. procedure AsmClose;
  64. procedure Synchronize;
  65. procedure WriteTree(p:paasmoutput);virtual;
  66. procedure WriteAsmList;virtual;
  67. end;
  68. Procedure GenerateAsm;
  69. Procedure OnlyAsm;
  70. var
  71. SmartLinkFilesCnt : longint;
  72. Implementation
  73. uses
  74. script,files,systems,verbose
  75. {$ifdef linux}
  76. ,linux
  77. {$endif}
  78. ,strings
  79. {$ifdef i386}
  80. {$ifndef NoAg386Bin}
  81. ,ag386bin
  82. {$endif}
  83. {$ifndef NoAg386Att}
  84. ,ag386att
  85. {$endif NoAg386Att}
  86. {$ifndef NoAg386Nsm}
  87. ,ag386nsm
  88. {$endif NoAg386Nsm}
  89. {$ifndef NoAg386Int}
  90. ,ag386int
  91. {$endif NoAg386Int}
  92. {$ifdef Ag386Cof}
  93. ,ag386cof
  94. {$endif Ag386Cof}
  95. {$endif}
  96. {$ifdef m68k}
  97. {$ifndef NoAg68kGas}
  98. ,ag68kgas
  99. {$endif NoAg68kGas}
  100. {$ifndef NoAg68kMot}
  101. ,ag68kmot
  102. {$endif NoAg68kMot}
  103. {$ifndef NoAg68kMit}
  104. ,ag68kmit
  105. {$endif NoAg68kMit}
  106. {$ifndef NoAg68kMpw}
  107. ,ag68kmpw
  108. {$endif NoAg68kMpw}
  109. {$endif}
  110. ;
  111. {*****************************************************************************
  112. TAsmList
  113. *****************************************************************************}
  114. Function DoPipe:boolean;
  115. begin
  116. DoPipe:=(cs_asm_pipe in aktglobalswitches) and
  117. not(cs_asm_leave in aktglobalswitches)
  118. {$ifdef i386}
  119. and (aktoutputformat=as_i386_as)
  120. {$endif i386}
  121. {$ifdef m68k}
  122. and (aktoutputformat=as_m68k_as);
  123. {$endif m68k}
  124. end;
  125. const
  126. lastas : byte=255;
  127. var
  128. LastASBin : string;
  129. Function TAsmList.FindAssembler:string;
  130. var
  131. asfound : boolean;
  132. begin
  133. if lastas<>ord(target_asm.id) then
  134. begin
  135. lastas:=ord(target_asm.id);
  136. { is an assembler passed ? }
  137. if utilsdirectory<>'' then
  138. begin
  139. LastASBin:=Search(target_asm.asmbin+source_os.exeext,
  140. utilsdirectory,asfound)+target_asm.asmbin+source_os.exeext;
  141. end
  142. else
  143. LastASBin:=FindExe(target_asm.asmbin,asfound);
  144. if (not asfound) and not(cs_asm_extern in aktglobalswitches) then
  145. begin
  146. Message1(exec_w_assembler_not_found,LastASBin);
  147. aktglobalswitches:=aktglobalswitches+[cs_asm_extern];
  148. end;
  149. if asfound then
  150. Message1(exec_t_using_assembler,LastASBin);
  151. end;
  152. FindAssembler:=LastASBin;
  153. end;
  154. Function TAsmList.CallAssembler(const command,para:string):Boolean;
  155. begin
  156. callassembler:=true;
  157. if not(cs_asm_extern in aktglobalswitches) then
  158. begin
  159. swapvectors;
  160. exec(command,para);
  161. swapvectors;
  162. if (doserror<>0) then
  163. begin
  164. Message1(exec_w_cant_call_assembler,tostr(doserror));
  165. aktglobalswitches:=aktglobalswitches+[cs_asm_extern];
  166. callassembler:=false;
  167. end
  168. else
  169. if (dosexitcode<>0) then
  170. begin
  171. Message1(exec_w_error_while_assembling,tostr(dosexitcode));
  172. callassembler:=false;
  173. end;
  174. end
  175. else
  176. AsmRes.AddAsmCommand(command,para,name);
  177. end;
  178. procedure TAsmList.RemoveAsm;
  179. var
  180. g : file;
  181. i : word;
  182. begin
  183. if cs_asm_leave in aktglobalswitches then
  184. exit;
  185. if cs_asm_extern in aktglobalswitches then
  186. AsmRes.AddDeleteCommand(AsmFile)
  187. else
  188. begin
  189. assign(g,AsmFile);
  190. {$I-}
  191. erase(g);
  192. {$I+}
  193. i:=ioresult;
  194. end;
  195. end;
  196. Function TAsmList.DoAssemble:boolean;
  197. var
  198. s : string;
  199. begin
  200. DoAssemble:=true;
  201. if DoPipe then
  202. exit;
  203. if (SmartLinkFilesCnt<=1) and not(cs_asm_extern in aktglobalswitches) then
  204. Message1(exec_i_assembling,name);
  205. s:=target_asm.asmcmd;
  206. Replace(s,'$ASM',AsmFile);
  207. Replace(s,'$OBJ',ObjFile);
  208. if CallAssembler(FindAssembler,s) then
  209. RemoveAsm
  210. else
  211. begin
  212. DoAssemble:=false;
  213. GenerateError;
  214. end;
  215. end;
  216. procedure TAsmList.NextSmartName;
  217. var
  218. s : string;
  219. begin
  220. inc(SmartLinkFilesCnt);
  221. if SmartLinkFilesCnt>999999 then
  222. Message(asmw_f_too_many_asm_files);
  223. if IsEndFile then
  224. begin
  225. s:=current_module^.asmprefix^+'e';
  226. IsEndFile:=false;
  227. end
  228. else
  229. s:=current_module^.asmprefix^;
  230. AsmFile:=Path+FixFileName(s+tostr(SmartLinkFilesCnt)+target_info.asmext);
  231. ObjFile:=Path+FixFileName(s+tostr(SmartLinkFilesCnt)+target_info.objext);
  232. end;
  233. {*****************************************************************************
  234. TAsmList AsmFile Writing
  235. *****************************************************************************}
  236. Procedure TAsmList.AsmFlush;
  237. begin
  238. if outcnt>0 then
  239. begin
  240. BlockWrite(outfile,outbuf,outcnt);
  241. outcnt:=0;
  242. end;
  243. end;
  244. Procedure TAsmList.AsmClear;
  245. begin
  246. outcnt:=0;
  247. end;
  248. Procedure TAsmList.AsmWrite(const s:string);
  249. begin
  250. if OutCnt+length(s)>=AsmOutSize then
  251. AsmFlush;
  252. Move(s[1],OutBuf[OutCnt],length(s));
  253. inc(OutCnt,length(s));
  254. inc(AsmSize,length(s));
  255. end;
  256. Procedure TAsmList.AsmWriteLn(const s:string);
  257. begin
  258. AsmWrite(s);
  259. AsmLn;
  260. end;
  261. Procedure TAsmList.AsmWritePChar(p:pchar);
  262. var
  263. i,j : longint;
  264. begin
  265. i:=StrLen(p);
  266. j:=i;
  267. while j>0 do
  268. begin
  269. i:=min(j,AsmOutSize);
  270. if OutCnt+i>=AsmOutSize then
  271. AsmFlush;
  272. Move(p[0],OutBuf[OutCnt],i);
  273. inc(OutCnt,i);
  274. inc(AsmSize,i);
  275. dec(j,i);
  276. p:=pchar(@p[i]);
  277. end;
  278. end;
  279. Procedure TAsmList.AsmLn;
  280. begin
  281. if OutCnt>=AsmOutSize-2 then
  282. AsmFlush;
  283. OutBuf[OutCnt]:=target_os.newline[1];
  284. inc(OutCnt);
  285. inc(AsmSize);
  286. if length(target_os.newline)>1 then
  287. begin
  288. OutBuf[OutCnt]:=target_os.newline[2];
  289. inc(OutCnt);
  290. inc(AsmSize);
  291. end;
  292. end;
  293. procedure TAsmList.AsmCreate;
  294. begin
  295. if (cs_smartlink in aktmoduleswitches) then
  296. NextSmartName;
  297. {$ifdef linux}
  298. if DoPipe then
  299. begin
  300. Message1(exec_i_assembling_pipe,asmfile);
  301. POpen(outfile,'as -o '+objfile,'W');
  302. end
  303. else
  304. {$endif}
  305. begin
  306. Assign(outfile,asmfile);
  307. {$I-}
  308. Rewrite(outfile,1);
  309. {$I+}
  310. if ioresult<>0 then
  311. Message1(exec_d_cant_create_asmfile,asmfile);
  312. end;
  313. outcnt:=0;
  314. AsmSize:=0;
  315. AsmStartSize:=0;
  316. end;
  317. procedure TAsmList.AsmClose;
  318. var
  319. f : file;
  320. l : longint;
  321. begin
  322. AsmFlush;
  323. {$ifdef linux}
  324. if DoPipe then
  325. Close(outfile)
  326. else
  327. {$endif}
  328. begin
  329. {Touch Assembler time to ppu time is there is a ppufilename}
  330. if Assigned(current_module^.ppufilename) then
  331. begin
  332. Assign(f,current_module^.ppufilename^);
  333. {$I-}
  334. reset(f,1);
  335. {$I+}
  336. if ioresult=0 then
  337. begin
  338. getftime(f,l);
  339. close(f);
  340. reset(outfile,1);
  341. setftime(outfile,l);
  342. end;
  343. end;
  344. close(outfile);
  345. end;
  346. end;
  347. {Touch Assembler and object time to ppu time is there is a ppufilename}
  348. procedure TAsmList.Synchronize;
  349. begin
  350. {Touch Assembler time to ppu time is there is a ppufilename}
  351. if Assigned(current_module^.ppufilename) then
  352. begin
  353. SynchronizeFileTime(current_module^.ppufilename^,asmfile);
  354. if not(cs_asm_extern in aktglobalswitches) then
  355. SynchronizeFileTime(current_module^.ppufilename^,objfile);
  356. end;
  357. end;
  358. procedure TAsmList.WriteTree(p:paasmoutput);
  359. begin
  360. end;
  361. procedure TAsmList.WriteAsmList;
  362. begin
  363. end;
  364. Constructor TAsmList.Init;
  365. var
  366. i : word;
  367. begin
  368. { load start values }
  369. asmfile:=current_module^.asmfilename^;
  370. objfile:=current_module^.objfilename^;
  371. name:=FixFileName(current_module^.modulename^);
  372. OutCnt:=0;
  373. SmartLinkFilesCnt:=0;
  374. IsEndFile:=false;
  375. { Which path will be used ? }
  376. if (cs_smartlink in aktmoduleswitches) then
  377. begin
  378. path:=current_module^.path^+FixFileName(current_module^.modulename^)+target_info.smartext;
  379. {$I-}
  380. mkdir(path);
  381. {$I+}
  382. i:=ioresult;
  383. path:=FixPath(path,false);
  384. end
  385. else
  386. path:=current_module^.path^;
  387. end;
  388. Destructor TAsmList.Done;
  389. begin
  390. end;
  391. {*****************************************************************************
  392. Generate Assembler Files Main Procedure
  393. *****************************************************************************}
  394. Procedure GenerateAsm;
  395. var
  396. a : PAsmList;
  397. {$ifdef i386}
  398. {$ifndef NoAg386Bin}
  399. b : Pi386binasmlist;
  400. {$endif}
  401. {$endif}
  402. begin
  403. case aktoutputformat of
  404. as_none : ;
  405. {$ifdef i386}
  406. {$ifndef NoAg386Bin}
  407. as_i386_dbg,
  408. as_i386_coff,
  409. as_i386_pecoff :
  410. begin
  411. case aktoutputformat of
  412. as_i386_dbg :
  413. b:=new(pi386binasmlist,Init(og_dbg));
  414. as_i386_coff :
  415. b:=new(pi386binasmlist,Init(og_coff));
  416. as_i386_pecoff :
  417. b:=new(pi386binasmlist,Init(og_pecoff));
  418. end;
  419. b^.WriteBin;
  420. dispose(b,done);
  421. if assigned(current_module^.ppufilename) then
  422. begin
  423. if (cs_smartlink in aktmoduleswitches) then
  424. SynchronizeFileTime(current_module^.ppufilename^,current_module^.staticlibfilename^)
  425. else
  426. SynchronizeFileTime(current_module^.ppufilename^,current_module^.objfilename^);
  427. end;
  428. if assigned(current_module^.ppufilename) then
  429. SynchronizeFileTime(current_module^.ppufilename^,current_module^.objfilename^);
  430. exit;
  431. end;
  432. {$endif NoAg386Bin}
  433. {$ifndef NoAg386Att}
  434. as_i386_as,
  435. as_i386_as_aout,
  436. as_i386_asw :
  437. a:=new(pi386attasmlist,Init);
  438. {$endif NoAg386Att}
  439. {$ifndef NoAg386Nsm}
  440. as_i386_nasmcoff,
  441. as_i386_nasmelf,
  442. as_i386_nasmobj :
  443. a:=new(pi386nasmasmlist,Init);
  444. {$endif NoAg386Nsm}
  445. {$ifndef NoAg386Int}
  446. as_i386_tasm :
  447. a:=new(pi386intasmlist,Init);
  448. {$endif NoAg386Int}
  449. {$endif}
  450. {$ifdef m68k}
  451. {$ifndef NoAg68kGas}
  452. as_m68k_as,
  453. as_m68k_gas :
  454. a:=new(pm68kgasasmlist,Init);
  455. {$endif NoAg86KGas}
  456. {$ifndef NoAg68kMot}
  457. as_m68k_mot :
  458. a:=new(pm68kmotasmlist,Init);
  459. {$endif NoAg86kMot}
  460. {$ifndef NoAg68kMit}
  461. as_m68k_mit :
  462. a:=new(pm68kmitasmlist,Init);
  463. {$endif NoAg86KMot}
  464. {$ifndef NoAg68kMpw}
  465. as_m68k_mpw :
  466. a:=new(pm68kmpwasmlist,Init);
  467. {$endif NoAg68kMpw}
  468. {$endif}
  469. else
  470. {$ifdef TP}
  471. exit;
  472. {$else}
  473. Message(asmw_f_assembler_output_not_supported);
  474. {$endif}
  475. end;
  476. a^.AsmCreate;
  477. a^.WriteAsmList;
  478. a^.AsmClose;
  479. a^.DoAssemble;
  480. a^.synchronize;
  481. dispose(a,Done);
  482. end;
  483. Procedure OnlyAsm;
  484. var
  485. a : PAsmList;
  486. begin
  487. a:=new(pasmlist,Init);
  488. a^.DoAssemble;
  489. dispose(a,Done);
  490. end;
  491. end.
  492. {
  493. $Log$
  494. Revision 1.47 1999-05-13 21:59:19 peter
  495. * removed oldppu code
  496. * warning if objpas is loaded from uses
  497. * first things for new deref writing
  498. Revision 1.46 1999/05/05 22:21:48 peter
  499. * updated messages
  500. Revision 1.45 1999/05/04 21:44:33 florian
  501. * changes to compile it with Delphi 4.0
  502. Revision 1.44 1999/05/02 23:28:42 peter
  503. * don't include ag386bin for oldasm
  504. Revision 1.43 1999/05/02 22:41:51 peter
  505. * moved section names to systems
  506. * fixed nasm,intel writer
  507. Revision 1.42 1999/05/01 13:24:00 peter
  508. * merged nasm compiler
  509. * old asm moved to oldasm/
  510. Revision 1.41 1999/03/24 23:16:42 peter
  511. * fixed bugs 212,222,225,227,229,231,233
  512. Revision 1.40 1999/03/18 20:30:44 peter
  513. + .a writer
  514. Revision 1.39 1999/03/01 15:43:48 peter
  515. * synchronize also the objfile for ag386bin
  516. Revision 1.38 1999/02/26 00:48:15 peter
  517. * assembler writers fixed for ag386bin
  518. Revision 1.37 1999/02/24 00:59:11 peter
  519. * small updates for ag386bin
  520. Revision 1.36 1999/02/22 02:15:01 peter
  521. * updates for ag386bin
  522. Revision 1.35 1999/02/17 10:16:26 peter
  523. * small fixes for the binary writer
  524. Revision 1.34 1999/01/10 15:37:52 peter
  525. * moved some tables from ra386*.pas -> i386.pas
  526. + start of coff writer
  527. * renamed asmutils unit to rautils
  528. Revision 1.33 1998/12/11 00:02:45 peter
  529. + globtype,tokens,version unit splitted from globals
  530. Revision 1.32 1998/11/06 09:46:46 pierre
  531. * assemble failure increments status errorcount again !!
  532. Revision 1.31 1998/10/26 22:23:28 peter
  533. + fixpath() has an extra option to allow a ./ as path
  534. Revision 1.30 1998/10/16 13:37:14 florian
  535. + switch -FD added to specify the path for utilities
  536. Revision 1.29 1998/10/15 16:19:42 peter
  537. * fixed asmsynchronize
  538. Revision 1.28 1998/10/14 15:56:43 pierre
  539. * all references to comp suppressed for m68k
  540. Revision 1.27 1998/10/13 16:50:01 pierre
  541. * undid some changes of Peter that made the compiler wrong
  542. for m68k (I had to reinsert some ifdefs)
  543. * removed several memory leaks under m68k
  544. * removed the meory leaks for assembler readers
  545. * cross compiling shoud work again better
  546. ( crosscompiling sysamiga works
  547. but as68k still complain about some code !)
  548. Revision 1.26 1998/10/13 13:10:11 peter
  549. * new style for m68k/i386 infos and enums
  550. Revision 1.25 1998/10/13 08:19:24 pierre
  551. + source_os is now set correctly for cross-processor compilers
  552. (tos contains all target_infos and
  553. we use CPU86 and CPU68 conditionnals to
  554. get the source operating system
  555. this only works if you do not undefine
  556. the source target !!)
  557. * several cg68k memory leaks fixed
  558. + started to change the code so that it should be possible to have
  559. a complete compiler (both for m68k and i386 !!)
  560. Revision 1.24 1998/10/08 23:28:50 peter
  561. * -vu shows unit info, -vt shows tried/used files
  562. Revision 1.23 1998/10/07 04:27:37 carl
  563. + MPW support
  564. Revision 1.22 1998/09/16 16:41:39 peter
  565. * merged fixes
  566. Revision 1.21.2.1 1998/09/16 16:11:38 peter
  567. * missing isendfile reset in .init
  568. Revision 1.21 1998/09/07 18:33:32 peter
  569. + smartlinking for win95 imports
  570. Revision 1.20 1998/09/04 17:34:20 pierre
  571. * bug with datalabel corrected
  572. + assembler errors better commented
  573. * one nested record crash removed
  574. Revision 1.19 1998/08/26 10:06:34 peter
  575. * reduce amount of asmfiles generated
  576. * no stabs are written in writefilelineinfo when debuginfo is off
  577. Revision 1.18 1998/08/21 14:08:39 pierre
  578. + TEST_FUNCRET now default (old code removed)
  579. works also for m68k (at least compiles)
  580. Revision 1.17 1998/08/17 09:17:43 peter
  581. * static/shared linking updates
  582. Revision 1.16 1998/08/14 21:56:30 peter
  583. * setting the outputfile using -o works now to create static libs
  584. Revision 1.15 1998/08/14 18:16:09 peter
  585. * return after a failed call will now add it to ppas
  586. Revision 1.14 1998/08/10 14:49:41 peter
  587. + localswitches, moduleswitches, globalswitches splitting
  588. Revision 1.13 1998/07/14 21:46:40 peter
  589. * updated messages file
  590. Revision 1.12 1998/07/08 14:58:34 daniel
  591. * First check if call to assembler is succesfull, then check it's exit code.
  592. This is more logical than first checking the exit code. For some mysterious
  593. reason this did not give problems on DOS & Linux. On OS/2 it did.
  594. Revision 1.11 1998/06/08 22:59:43 peter
  595. * smartlinking works for win32
  596. * some defines to exclude some compiler parts
  597. Revision 1.10 1998/06/04 23:51:33 peter
  598. * m68k compiles
  599. + .def file creation moved to gendef.pas so it could also be used
  600. for win32
  601. Revision 1.9 1998/05/23 01:21:01 peter
  602. + aktasmmode, aktoptprocessor, aktoutputformat
  603. + smartlink per module $SMARTLINK-/+ (like MMX) and moved to aktswitches
  604. + $LIBNAME to set the library name where the unit will be put in
  605. * splitted cgi386 a bit (codeseg to large for bp7)
  606. * nasm, tasm works again. nasm moved to ag386nsm.pas
  607. Revision 1.8 1998/05/11 13:07:53 peter
  608. + $ifdef NEWPPU for the new ppuformat
  609. + $define GDB not longer required
  610. * removed all warnings and stripped some log comments
  611. * no findfirst/findnext anymore to remove smartlink *.o files
  612. Revision 1.7 1998/05/07 00:17:00 peter
  613. * smartlinking for sets
  614. + consts labels are now concated/generated in hcodegen
  615. * moved some cpu code to cga and some none cpu depended code from cga
  616. to tree and hcodegen and cleanup of hcodegen
  617. * assembling .. output reduced for smartlinking ;)
  618. Revision 1.6 1998/05/04 17:54:24 peter
  619. + smartlinking works (only case jumptable left todo)
  620. * redesign of systems.pas to support assemblers and linkers
  621. + Unitname is now also in the PPU-file, increased version to 14
  622. Revision 1.5 1998/04/29 10:33:44 pierre
  623. + added some code for ansistring (not complete nor working yet)
  624. * corrected operator overloading
  625. * corrected nasm output
  626. + started inline procedures
  627. + added starstarn : use ** for exponentiation (^ gave problems)
  628. + started UseTokenInfo cond to get accurate positions
  629. Revision 1.4 1998/04/27 23:10:27 peter
  630. + new scanner
  631. * $makelib -> if smartlink
  632. * small filename fixes pmodule.setfilename
  633. * moved import from files.pas -> import.pas
  634. Revision 1.3 1998/04/10 14:41:43 peter
  635. * removed some Hints
  636. * small speed optimization for AsmLn
  637. Revision 1.2 1998/04/08 11:34:18 peter
  638. * nasm works (linux only tested)
  639. }