t_bsd.pas 19 KB

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