t_linux.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Peter Vreman
  4. This unit implements support import,export,link routines
  5. for the (i386) Linux target
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. ****************************************************************************
  18. }
  19. unit t_linux;
  20. {$i fpcdefs.inc}
  21. interface
  22. uses
  23. symsym,symdef,
  24. import,export,link;
  25. type
  26. timportliblinux=class(timportlib)
  27. procedure preparelib(const s:string);override;
  28. procedure importprocedure(aprocdef:tprocdef;const module:string;index:longint;const name:string);override;
  29. procedure importvariable(vs:tvarsym;const name,module:string);override;
  30. procedure generatelib;override;
  31. end;
  32. texportliblinux=class(texportlib)
  33. procedure preparelib(const s : string);override;
  34. procedure exportprocedure(hp : texported_item);override;
  35. procedure exportvar(hp : texported_item);override;
  36. procedure generatelib;override;
  37. end;
  38. tlinkerlinux=class(texternallinker)
  39. private
  40. Glibc2,
  41. Glibc21 : boolean;
  42. Function WriteResponseFile(isdll:boolean) : Boolean;
  43. public
  44. constructor Create;override;
  45. procedure SetDefaultInfo;override;
  46. function MakeExecutable:boolean;override;
  47. function MakeSharedLibrary:boolean;override;
  48. end;
  49. implementation
  50. uses
  51. cutils,cclasses,
  52. verbose,systems,globtype,globals,
  53. symconst,script,
  54. fmodule,dos
  55. ,aasmbase,aasmtai,aasmcpu,cpubase
  56. ,i_linux
  57. ;
  58. {*****************************************************************************
  59. TIMPORTLIBLINUX
  60. *****************************************************************************}
  61. procedure timportliblinux.preparelib(const s : string);
  62. begin
  63. end;
  64. procedure timportliblinux.importprocedure(aprocdef:tprocdef;const module:string;index:longint;const name:string);
  65. begin
  66. { insert sharedlibrary }
  67. current_module.linkothersharedlibs.add(SplitName(module),link_allways);
  68. { do nothing with the procedure, only set the mangledname }
  69. if name<>'' then
  70. begin
  71. aprocdef.setmangledname(name);
  72. end
  73. else
  74. message(parser_e_empty_import_name);
  75. end;
  76. procedure timportliblinux.importvariable(vs:tvarsym;const name,module:string);
  77. begin
  78. { insert sharedlibrary }
  79. current_module.linkothersharedlibs.add(SplitName(module),link_allways);
  80. { reset the mangledname and turn off the dll_var option }
  81. vs.set_mangledname(name);
  82. exclude(vs.varoptions,vo_is_dll_var);
  83. end;
  84. procedure timportliblinux.generatelib;
  85. begin
  86. end;
  87. {*****************************************************************************
  88. TEXPORTLIBLINUX
  89. *****************************************************************************}
  90. procedure texportliblinux.preparelib(const s:string);
  91. begin
  92. end;
  93. procedure texportliblinux.exportprocedure(hp : texported_item);
  94. var
  95. hp2 : texported_item;
  96. begin
  97. { first test the index value }
  98. if (hp.options and eo_index)<>0 then
  99. begin
  100. Message1(parser_e_no_export_with_index_for_target,'linux');
  101. exit;
  102. end;
  103. { now place in correct order }
  104. hp2:=texported_item(current_module._exports.first);
  105. while assigned(hp2) and
  106. (hp.name^>hp2.name^) do
  107. hp2:=texported_item(hp2.next);
  108. { insert hp there !! }
  109. if assigned(hp2) and (hp2.name^=hp.name^) then
  110. begin
  111. { this is not allowed !! }
  112. Message1(parser_e_export_name_double,hp.name^);
  113. exit;
  114. end;
  115. if hp2=texported_item(current_module._exports.first) then
  116. current_module._exports.concat(hp)
  117. else if assigned(hp2) then
  118. begin
  119. hp.next:=hp2;
  120. hp.previous:=hp2.previous;
  121. if assigned(hp2.previous) then
  122. hp2.previous.next:=hp;
  123. hp2.previous:=hp;
  124. end
  125. else
  126. current_module._exports.concat(hp);
  127. end;
  128. procedure texportliblinux.exportvar(hp : texported_item);
  129. begin
  130. hp.is_var:=true;
  131. exportprocedure(hp);
  132. end;
  133. procedure texportliblinux.generatelib;
  134. var
  135. hp2 : texported_item;
  136. begin
  137. hp2:=texported_item(current_module._exports.first);
  138. while assigned(hp2) do
  139. begin
  140. if (not hp2.is_var) and
  141. (hp2.sym.typ=procsym) then
  142. begin
  143. { the manglednames can already be the same when the procedure
  144. is declared with cdecl }
  145. if tprocsym(hp2.sym).first_procdef.mangledname<>hp2.name^ then
  146. begin
  147. {$ifdef i386}
  148. { place jump in codesegment }
  149. codesegment.concat(Tai_align.Create_op(4,$90));
  150. codeSegment.concat(Tai_symbol.Createname_global(hp2.name^,0));
  151. codeSegment.concat(Taicpu.Op_sym(A_JMP,S_NO,objectlibrary.newasmsymbol(tprocsym(hp2.sym).first_procdef.mangledname)));
  152. codeSegment.concat(Tai_symbol_end.Createname(hp2.name^));
  153. {$endif i386}
  154. {$ifdef m68k}
  155. { place jump in codesegment }
  156. codesegment.concat(tai_align.create(4));
  157. codesegment.concat(tai_symbol.createname_global(hp2.name^,0));
  158. codesegment.concat(taicpu.op_sym(A_JMP,S_NO,objectlibrary.newasmsymbol(tprocsym(hp2.sym).first_procdef.mangledname)));
  159. codesegment.concat(tai_symbol_end.createname(hp2.name^));
  160. {$endif m68k}
  161. end;
  162. end
  163. else
  164. Message1(parser_e_no_export_of_variables_for_target,'linux');
  165. hp2:=texported_item(hp2.next);
  166. end;
  167. end;
  168. {*****************************************************************************
  169. TLINKERLINUX
  170. *****************************************************************************}
  171. Constructor TLinkerLinux.Create;
  172. begin
  173. Inherited Create;
  174. if NOT Dontlinkstdlibpath Then
  175. LibrarySearchPath.AddPath('/lib;/usr/lib;/usr/X11R6/lib',true);
  176. end;
  177. procedure TLinkerLinux.SetDefaultInfo;
  178. {
  179. This will also detect which libc version will be used
  180. }
  181. {$ifdef m68k}
  182. var
  183. St : SearchRec;
  184. {$endif m68k}
  185. begin
  186. Glibc2:=false;
  187. Glibc21:=false;
  188. with Info do
  189. begin
  190. ExeCmd[1]:='ld $OPT $DYNLINK $STATIC $STRIP -L. -o $EXE $RES';
  191. DllCmd[1]:='ld $OPT $INIT $FINI $SONAME -shared -L. -o $EXE $RES';
  192. DllCmd[2]:='strip --strip-unneeded $EXE';
  193. {$ifdef m68k}
  194. Glibc2:=true;
  195. FindFirst('/lib/ld*',AnyFile,st);
  196. while DosError=0 do
  197. begin
  198. if copy(st.name,1,5)='ld-2.' then
  199. begin
  200. DynamicLinker:='/lib/'+St.name;
  201. Glibc21:=st.name[6]<>'0';
  202. break;
  203. end;
  204. FindNext(St);
  205. end;
  206. FindClose(St);
  207. {$else m68k}
  208. { first try glibc2 }
  209. DynamicLinker:='/lib/ld-linux.so.2';
  210. if FileExists(DynamicLinker) then
  211. begin
  212. Glibc2:=true;
  213. { Check for 2.0 files, else use the glibc 2.1 stub }
  214. if FileExists('/lib/ld-2.0.*') then
  215. Glibc21:=false
  216. else
  217. Glibc21:=true;
  218. end
  219. else
  220. DynamicLinker:='/lib/ld-linux.so.1';
  221. {$endif m68k}
  222. end;
  223. end;
  224. Function TLinkerLinux.WriteResponseFile(isdll:boolean) : Boolean;
  225. Var
  226. linkres : TLinkRes;
  227. i : longint;
  228. cprtobj,
  229. gprtobj,
  230. prtobj : string[80];
  231. HPath : TStringListItem;
  232. s,s1,s2 : string;
  233. found1,
  234. found2,
  235. linkdynamic,
  236. linklibc : boolean;
  237. begin
  238. WriteResponseFile:=False;
  239. { set special options for some targets }
  240. linkdynamic:=not(SharedLibFiles.empty);
  241. linklibc:=(SharedLibFiles.Find('c')<>nil);
  242. if isdll then
  243. begin
  244. prtobj:='dllprt0';
  245. cprtobj:='dllprt0';
  246. gprtobj:='dllprt0';
  247. end
  248. else
  249. begin
  250. prtobj:='prt0';
  251. cprtobj:='cprt0';
  252. gprtobj:='gprt0';
  253. if glibc21 then
  254. begin
  255. cprtobj:='cprt21';
  256. gprtobj:='gprt21';
  257. end;
  258. end;
  259. if cs_profile in aktmoduleswitches then
  260. begin
  261. prtobj:=gprtobj;
  262. if not glibc2 then
  263. AddSharedLibrary('gmon');
  264. AddSharedLibrary('c');
  265. linklibc:=true;
  266. end
  267. else
  268. begin
  269. if linklibc then
  270. prtobj:=cprtobj;
  271. end;
  272. { Open link.res file }
  273. LinkRes:=TLinkRes.Create(outputexedir+Info.ResName);
  274. { Write path to search libraries }
  275. HPath:=TStringListItem(current_module.locallibrarysearchpath.First);
  276. while assigned(HPath) do
  277. begin
  278. LinkRes.Add('SEARCH_DIR('+HPath.Str+')');
  279. HPath:=TStringListItem(HPath.Next);
  280. end;
  281. HPath:=TStringListItem(LibrarySearchPath.First);
  282. while assigned(HPath) do
  283. begin
  284. LinkRes.Add('SEARCH_DIR('+HPath.Str+')');
  285. HPath:=TStringListItem(HPath.Next);
  286. end;
  287. LinkRes.Add('INPUT(');
  288. { add objectfiles, start with prt0 always }
  289. if prtobj<>'' then
  290. LinkRes.AddFileName(FindObjectFile(prtobj,'',false));
  291. { try to add crti and crtbegin if linking to C }
  292. if linklibc then
  293. begin
  294. if librarysearchpath.FindFile('crtbegin.o',s) then
  295. LinkRes.AddFileName(s);
  296. if librarysearchpath.FindFile('crti.o',s) then
  297. LinkRes.AddFileName(s);
  298. end;
  299. { main objectfiles }
  300. while not ObjectFiles.Empty do
  301. begin
  302. s:=ObjectFiles.GetFirst;
  303. if s<>'' then
  304. LinkRes.AddFileName(s);
  305. end;
  306. LinkRes.Add(')');
  307. { Write staticlibraries }
  308. if not StaticLibFiles.Empty then
  309. begin
  310. LinkRes.Add('GROUP(');
  311. While not StaticLibFiles.Empty do
  312. begin
  313. S:=StaticLibFiles.GetFirst;
  314. LinkRes.AddFileName(s)
  315. end;
  316. LinkRes.Add(')');
  317. end;
  318. { Write sharedlibraries like -l<lib>, also add the needed dynamic linker
  319. here to be sure that it gets linked this is needed for glibc2 systems (PFV) }
  320. if not SharedLibFiles.Empty then
  321. begin
  322. LinkRes.Add('INPUT(');
  323. While not SharedLibFiles.Empty do
  324. begin
  325. S:=SharedLibFiles.GetFirst;
  326. if s<>'c' then
  327. begin
  328. i:=Pos(target_info.sharedlibext,S);
  329. if i>0 then
  330. Delete(S,i,255);
  331. LinkRes.Add('-l'+s);
  332. end
  333. else
  334. begin
  335. linklibc:=true;
  336. linkdynamic:=false; { libc will include the ld-linux for us }
  337. end;
  338. end;
  339. { be sure that libc is the last lib }
  340. if linklibc then
  341. LinkRes.Add('-lc');
  342. { when we have -static for the linker the we also need libgcc }
  343. if (cs_link_staticflag in aktglobalswitches) then
  344. LinkRes.Add('-lgcc');
  345. if linkdynamic and (Info.DynamicLinker<>'') then
  346. LinkRes.AddFileName(Info.DynamicLinker);
  347. LinkRes.Add(')');
  348. end;
  349. { objects which must be at the end }
  350. if linklibc then
  351. begin
  352. found1:=librarysearchpath.FindFile('crtend.o',s1);
  353. found2:=librarysearchpath.FindFile('crtn.o',s2);
  354. if found1 or found2 then
  355. begin
  356. LinkRes.Add('INPUT(');
  357. if found1 then
  358. LinkRes.AddFileName(s1);
  359. if found2 then
  360. LinkRes.AddFileName(s2);
  361. LinkRes.Add(')');
  362. end;
  363. end;
  364. { Write and Close response }
  365. linkres.writetodisk;
  366. linkres.Free;
  367. WriteResponseFile:=True;
  368. end;
  369. function TLinkerLinux.MakeExecutable:boolean;
  370. var
  371. binstr,
  372. cmdstr : string;
  373. success : boolean;
  374. DynLinkStr : string[60];
  375. StaticStr,
  376. StripStr : string[40];
  377. begin
  378. if not(cs_link_extern in aktglobalswitches) then
  379. Message1(exec_i_linking,current_module.exefilename^);
  380. { Create some replacements }
  381. StaticStr:='';
  382. StripStr:='';
  383. DynLinkStr:='';
  384. if (cs_link_staticflag in aktglobalswitches) then
  385. StaticStr:='-static';
  386. if (cs_link_strip in aktglobalswitches) then
  387. StripStr:='-s';
  388. If (cs_profile in aktmoduleswitches) or
  389. ((Info.DynamicLinker<>'') and (not SharedLibFiles.Empty)) then
  390. begin
  391. DynLinkStr:='-dynamic-linker='+Info.DynamicLinker;
  392. if cshared Then
  393. DynLinkStr:='--shared ' + DynLinkStr;
  394. if rlinkpath<>'' Then
  395. DynLinkStr:='--rpath-link '+rlinkpath + ' '+ DynLinkStr;
  396. End;
  397. { Write used files and libraries }
  398. WriteResponseFile(false);
  399. { Call linker }
  400. SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
  401. Replace(cmdstr,'$EXE',current_module.exefilename^);
  402. Replace(cmdstr,'$OPT',Info.ExtraOptions);
  403. Replace(cmdstr,'$RES',outputexedir+Info.ResName);
  404. Replace(cmdstr,'$STATIC',StaticStr);
  405. Replace(cmdstr,'$STRIP',StripStr);
  406. Replace(cmdstr,'$DYNLINK',DynLinkStr);
  407. success:=DoExec(FindUtil(utilsprefix+BinStr),CmdStr,true,false);
  408. { Remove ReponseFile }
  409. if (success) and not(cs_link_extern in aktglobalswitches) then
  410. RemoveFile(outputexedir+Info.ResName);
  411. MakeExecutable:=success; { otherwise a recursive call to link method }
  412. end;
  413. Function TLinkerLinux.MakeSharedLibrary:boolean;
  414. var
  415. InitStr,
  416. FiniStr,
  417. SoNameStr : string[80];
  418. binstr,
  419. cmdstr : string;
  420. success : boolean;
  421. begin
  422. MakeSharedLibrary:=false;
  423. if not(cs_link_extern in aktglobalswitches) then
  424. Message1(exec_i_linking,current_module.sharedlibfilename^);
  425. { Write used files and libraries }
  426. WriteResponseFile(true);
  427. { Create some replacements }
  428. InitStr:='-init FPC_LIB_START';
  429. FiniStr:='-fini FPC_LIB_EXIT';
  430. SoNameStr:='-soname '+SplitFileName(current_module.sharedlibfilename^);
  431. { Call linker }
  432. SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
  433. Replace(cmdstr,'$EXE',current_module.sharedlibfilename^);
  434. Replace(cmdstr,'$OPT',Info.ExtraOptions);
  435. Replace(cmdstr,'$RES',outputexedir+Info.ResName);
  436. Replace(cmdstr,'$INIT',InitStr);
  437. Replace(cmdstr,'$FINI',FiniStr);
  438. Replace(cmdstr,'$SONAME',SoNameStr);
  439. success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,false);
  440. { Strip the library ? }
  441. if success and (cs_link_strip in aktglobalswitches) then
  442. begin
  443. SplitBinCmd(Info.DllCmd[2],binstr,cmdstr);
  444. Replace(cmdstr,'$EXE',current_module.sharedlibfilename^);
  445. success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,false);
  446. end;
  447. { Remove ReponseFile }
  448. if (success) and not(cs_link_extern in aktglobalswitches) then
  449. RemoveFile(outputexedir+Info.ResName);
  450. MakeSharedLibrary:=success; { otherwise a recursive call to link method }
  451. end;
  452. {*****************************************************************************
  453. Initialize
  454. *****************************************************************************}
  455. initialization
  456. {$ifdef i386}
  457. RegisterExternalLinker(system_i386_linux_info,TLinkerLinux);
  458. RegisterImport(system_i386_linux,timportliblinux);
  459. RegisterExport(system_i386_linux,texportliblinux);
  460. RegisterTarget(system_i386_linux_info);
  461. {$endif i386}
  462. {$ifdef m68k}
  463. RegisterExternalLinker(system_m68k_linux_info,TLinkerLinux);
  464. RegisterImport(system_m68k_linux,timportliblinux);
  465. RegisterExport(system_m68k_linux,texportliblinux);
  466. RegisterTarget(system_m68k_linux_info);
  467. {$endif m68k}
  468. {$ifdef powerpc}
  469. RegisterExternalLinker(system_powerpc_linux_info,TLinkerLinux);
  470. RegisterImport(system_powerpc_linux,timportliblinux);
  471. RegisterExport(system_powerpc_linux,texportliblinux);
  472. RegisterTarget(system_powerpc_linux_info);
  473. {$endif powerpc}
  474. {$ifdef alpha}
  475. RegisterExternalLinker(system_alpha_linux_info,TLinkerLinux);
  476. RegisterImport(system_alpha_linux,timportliblinux);
  477. RegisterExport(system_alpha_linux,texportliblinux);
  478. RegisterTarget(system_alpha_linux_info);
  479. {$endif alpha}
  480. {$ifdef x86_64}
  481. RegisterExternalLinker(system_x86_64_linux_info,TLinkerLinux);
  482. RegisterImport(system_x86_64_linux,timportliblinux);
  483. RegisterExport(system_x86_64_linux,texportliblinux);
  484. RegisterTarget(system_x86_64_linux_info);
  485. {$endif x86_64}
  486. {$ifdef SPARC}
  487. RegisterExternalLinker(system_sparc_linux_info,TLinkerLinux);
  488. RegisterImport(system_SPARC_linux,timportliblinux);
  489. RegisterExport(system_SPARC_linux,texportliblinux);
  490. RegisterTarget(system_SPARC_linux_info);
  491. {$endif SPARC}
  492. {$ifdef ARM}
  493. RegisterExternalLinker(system_arm_linux_info,TLinkerLinux);
  494. RegisterImport(system_arm_linux,timportliblinux);
  495. RegisterExport(system_arm_linux,texportliblinux);
  496. RegisterTarget(system_arm_linux_info);
  497. {$endif ARM}
  498. end.
  499. {
  500. $Log$
  501. Revision 1.12 2003-10-30 18:35:30 marco
  502. * librarysuffix + profiling
  503. Revision 1.11 2003/10/11 19:32:04 marco
  504. * -Xd
  505. Revision 1.10 2003/10/03 14:16:48 marco
  506. * -XP<prefix> support
  507. Revision 1.9 2003/07/21 11:52:57 florian
  508. * very basic stuff for the arm
  509. Revision 1.8 2003/04/27 07:29:52 peter
  510. * aktprocdef cleanup, aktprocdef is now always nil when parsing
  511. a new procdef declaration
  512. * aktprocsym removed
  513. * lexlevel removed, use symtable.symtablelevel instead
  514. * implicit init/final code uses the normal genentry/genexit
  515. * funcret state checking updated for new funcret handling
  516. Revision 1.7 2003/04/26 09:16:08 peter
  517. * .o files belonging to the unit are first searched in the same dir
  518. as the .ppu
  519. Revision 1.6 2002/12/14 13:02:45 carl
  520. - remove extra ifdef i386 (avoir compilation errors)
  521. Revision 1.5 2002/12/06 17:51:43 peter
  522. * m68k library support
  523. Revision 1.4 2002/11/17 16:32:04 carl
  524. * memory optimization (3-4%) : cleanup of tai fields,
  525. cleanup of tdef and tsym fields.
  526. * make it work for m68k
  527. Revision 1.3 2002/11/15 01:59:02 peter
  528. * merged changes from 1.0.7 up to 04-11
  529. - -V option for generating bug report tracing
  530. - more tracing for option parsing
  531. - errors for cdecl and high()
  532. - win32 import stabs
  533. - win32 records<=8 are returned in eax:edx (turned off by default)
  534. - heaptrc update
  535. - more info for temp management in .s file with EXTDEBUG
  536. Revision 1.2 2002/09/09 17:34:17 peter
  537. * tdicationary.replace added to replace and item in a dictionary. This
  538. is only allowed for the same name
  539. * varsyms are inserted in symtable before the types are parsed. This
  540. fixes the long standing "var longint : longint" bug
  541. - consume_idlist and idstringlist removed. The loops are inserted
  542. at the callers place and uses the symtable for duplicate id checking
  543. Revision 1.1 2002/09/06 15:03:51 carl
  544. * moved files to systems directory
  545. Revision 1.33 2002/09/03 16:26:28 daniel
  546. * Make Tprocdef.defs protected
  547. Revision 1.32 2002/08/12 15:08:44 carl
  548. + stab register indexes for powerpc (moved from gdb to cpubase)
  549. + tprocessor enumeration moved to cpuinfo
  550. + linker in target_info is now a class
  551. * many many updates for m68k (will soon start to compile)
  552. - removed some ifdef or correct them for correct cpu
  553. Revision 1.31 2002/08/11 14:32:32 peter
  554. * renamed current_library to objectlibrary
  555. Revision 1.30 2002/08/11 13:24:19 peter
  556. * saving of asmsymbols in ppu supported
  557. * asmsymbollist global is removed and moved into a new class
  558. tasmlibrarydata that will hold the info of a .a file which
  559. corresponds with a single module. Added librarydata to tmodule
  560. to keep the library info stored for the module. In the future the
  561. objectfiles will also be stored to the tasmlibrarydata class
  562. * all getlabel/newasmsymbol and friends are moved to the new class
  563. Revision 1.29 2002/07/26 21:15:46 florian
  564. * rewrote the system handling
  565. Revision 1.28 2002/07/04 20:43:02 florian
  566. * first x86-64 patches
  567. Revision 1.27 2002/07/01 18:46:35 peter
  568. * internal linker
  569. * reorganized aasm layer
  570. Revision 1.26 2002/05/18 13:34:26 peter
  571. * readded missing revisions
  572. Revision 1.25 2002/05/16 19:46:53 carl
  573. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  574. + try to fix temp allocation (still in ifdef)
  575. + generic constructor calls
  576. + start of tassembler / tmodulebase class cleanup
  577. Revision 1.22 2002/05/06 19:46:36 carl
  578. + added more patches from Mazen for SPARC port
  579. Revision 1.21 2002/04/22 18:19:22 carl
  580. - remove use_bound_instruction field
  581. Revision 1.20 2002/04/20 21:43:18 carl
  582. * fix stack size for some targets
  583. + add offset to parameters from frame pointer info.
  584. - remove some unused stuff
  585. Revision 1.19 2002/04/19 15:46:05 peter
  586. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  587. in most cases and not written to the ppu
  588. * add mangeledname_prefix() routine to generate the prefix of
  589. manglednames depending on the current procedure, object and module
  590. * removed static procprefix since the mangledname is now build only
  591. on demand from tprocdef.mangledname
  592. Revision 1.18 2002/04/15 19:44:23 peter
  593. * fixed stackcheck that would be called recursively when a stack
  594. error was found
  595. * generic changeregsize(reg,size) for i386 register resizing
  596. * removed some more routines from cga unit
  597. * fixed returnvalue handling
  598. * fixed default stacksize of linux and go32v2, 8kb was a bit small :-)
  599. Revision 1.17 2002/04/15 19:16:57 carl
  600. - remove size_of_pointer field
  601. Revision 1.16 2002/01/29 21:27:34 peter
  602. * default alignment changed to 4 bytes for locals and static const,var
  603. Revision 1.15 2002/01/09 07:38:37 michael
  604. + Patch from Peter for library imports
  605. }