systems.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. This unit contains information about the target systems supported
  5. (these are not processor specific)
  6. This program is free software; you can redistribute it and/or modify
  7. iu under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 3 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 systems;
  20. {$i fpcdefs.inc}
  21. interface
  22. type
  23. tendian = (endian_little,endian_big);
  24. (*
  25. IMPORTANT NOTE:
  26. The value of this enumeration is stored in PPU files.
  27. Therefore adding new CPU targets should not change the
  28. values of the pre-existing targets. (CEC)
  29. FURTHERMORE : Make sure that this branch values, are
  30. consistant with the main branch version always.
  31. *)
  32. tsystemcpu=
  33. (
  34. cpu_no, { 0 }
  35. cpu_i386, { 1 }
  36. cpu_m68k, { 2 }
  37. cpu_alpha, { 3 }
  38. cpu_powerpc, { 4 }
  39. cpu_sparc, { 5 }
  40. cpu_vm, { 6 }
  41. cpu_iA64, { 7 }
  42. cpu_x86_64, { 8 }
  43. cpu_mips, { 9 }
  44. cpu_arm { 10 }
  45. );
  46. TSection=(sec_none,
  47. sec_code,sec_data,sec_bss,
  48. sec_idata2,sec_idata4,sec_idata5,sec_idata6,sec_idata7,sec_edata,
  49. sec_stab,sec_stabstr,sec_common
  50. );
  51. tasmmode= (asmmode_none
  52. { direct output with minimal parsing }
  53. ,asmmode_direct
  54. { standard assembler (cpu dependant) with full parsing }
  55. ,asmmode_standard
  56. ,asmmode_i386_att
  57. ,asmmode_i386_intel
  58. );
  59. (* IMPORTANT NOTE:
  60. the integer value of this enum is stored in PPU
  61. files to recognize the target, so if you add new targets
  62. allways add them at end PM
  63. FURTHERMORE : Make sure that this branch values are
  64. consistant with the main branch version always. (CEC)
  65. *)
  66. type
  67. tsystem =
  68. (
  69. system_none, { 0 }
  70. obsolete_system_i386_GO32V1,{ 1 }
  71. system_i386_GO32V2, { 2 }
  72. system_i386_linux, { 3 }
  73. system_i386_OS2, { 4 }
  74. system_i386_Win32, { 5 }
  75. system_i386_freebsd, { 6 }
  76. system_m68k_Amiga, { 7 }
  77. system_m68k_Atari, { 8 }
  78. system_m68k_Mac, { 9 }
  79. system_m68k_linux, { 10 }
  80. system_m68k_PalmOS, { 11 }
  81. system_alpha_linux, { 12 }
  82. system_powerpc_linux, { 13 }
  83. system_powerpc_macos, { 14 }
  84. system_i386_sunos, { 15 }
  85. system_i386_beos, { 16 }
  86. system_i386_netbsd, { 17 }
  87. system_m68k_netbsd, { 18 }
  88. system_i386_Netware, { 19 }
  89. system_i386_qnx, { 20 }
  90. system_i386_wdosx, { 21 }
  91. system_sparc_sunos, { 22 }
  92. system_sparc_linux, { 23 }
  93. system_x86_64_linux, { 24 }
  94. system_powerpc_macosx { 25 }
  95. );
  96. tasm = (as_none
  97. ,as_gas { standard gnu assembler }
  98. ,as_i386_as_aout
  99. ,as_i386_asw
  100. ,as_i386_nasmcoff
  101. ,as_i386_nasmwin32
  102. ,as_i386_nasmwdosx
  103. ,as_i386_nasmelf
  104. ,as_i386_nasmobj
  105. ,as_i386_tasm
  106. ,as_i386_masm
  107. ,as_i386_coff
  108. ,as_i386_pecoff
  109. ,as_i386_elf32
  110. ,as_i386_pecoffwdosx
  111. ,as_m68k_mit
  112. ,as_powerpc_mpw
  113. );
  114. tar = (ar_none
  115. ,ar_gnu_ar,ar_gnu_arw,ar_mpw_ar
  116. );
  117. tres = (res_none
  118. ,res_gnu_windres,res_emxbind,res_mpw_res
  119. );
  120. tscripttype = (script_none
  121. ,script_dos,script_unix,script_amiga
  122. );
  123. {*****************************************************************************
  124. Structures
  125. *****************************************************************************}
  126. type
  127. { Abstract linker class which is implemented in link module }
  128. TAbstractLinker = class
  129. end;
  130. TAbstractLinkerClass = class of TABstractLinker;
  131. { Abstract assembler class which is implemented in assemble module }
  132. TAbstractAssembler = class
  133. end;
  134. TAbstractAssemblerClass = class of TAbstractAssembler;
  135. palignmentinfo = ^talignmentinfo;
  136. talignmentinfo = packed record
  137. procalign,
  138. loopalign,
  139. jumpalign,
  140. constalignmin,
  141. constalignmax,
  142. varalignmin,
  143. varalignmax,
  144. localalignmin,
  145. localalignmax,
  146. paraalign,
  147. recordalignmin,
  148. recordalignmax,
  149. maxCrecordalign : longint;
  150. end;
  151. pasminfo = ^tasminfo;
  152. tasminfo = packed record
  153. id : tasm;
  154. idtxt : string[9];
  155. asmbin : string[8];
  156. asmcmd : string[50];
  157. supported_target : tsystem;
  158. outputbinary,
  159. allowdirect,
  160. needar,
  161. labelprefix_only_inside_procedure : boolean;
  162. labelprefix : string[3];
  163. comment : string[2];
  164. secnames : array[TSection] of string[20];
  165. end;
  166. parinfo = ^tarinfo;
  167. tarinfo = packed record
  168. id : tar;
  169. arcmd : string[50];
  170. end;
  171. presinfo = ^tresinfo;
  172. tresinfo = packed record
  173. id : tres;
  174. resbin : string[8];
  175. rescmd : string[50];
  176. end;
  177. tsystemflags = (tf_none,
  178. tf_under_development,
  179. tf_need_export,tf_needs_isconsole
  180. ,tf_code_small,tf_static_reg_based
  181. );
  182. psysteminfo = ^tsysteminfo;
  183. tsysteminfo = packed record
  184. system : tsystem;
  185. name : string[30];
  186. shortname : string[9];
  187. flags : set of tsystemflags;
  188. cpu : tsystemcpu;
  189. unit_env : string[12];
  190. extradefines : string[40];
  191. sourceext,
  192. pasext,
  193. exeext,
  194. defext,
  195. scriptext,
  196. smartext,
  197. unitext,
  198. unitlibext,
  199. asmext,
  200. objext,
  201. resext,
  202. resobjext : string[4];
  203. sharedlibext : string[10];
  204. staticlibext,
  205. staticlibprefix : string[4];
  206. sharedlibprefix : string[4];
  207. sharedClibext : string[10];
  208. staticClibext,
  209. staticClibprefix : string[4];
  210. sharedClibprefix : string[4];
  211. Cprefix : string[2];
  212. newline : string[2];
  213. dirsep : char;
  214. files_case_relevent : boolean;
  215. assem : tasm;
  216. assemextern : tasm; { external assembler, used by -a }
  217. link : tabstractlinkerclass;
  218. linkextern : tabstractlinkerclass; { external linker, used by -s }
  219. ar : tar;
  220. res : tres;
  221. script : tscripttype;
  222. endian : tendian;
  223. alignment : talignmentinfo;
  224. {
  225. Offset from the argument pointer register to the first
  226. argument's address. On some machines it may depend on
  227. the data type of the function.
  228. (see also FIRST_PARM_OFFSET in GCC source)
  229. }
  230. first_parm_offset : longint;
  231. heapsize,
  232. stacksize : longint;
  233. DllScanSupported : boolean;
  234. use_function_relative_addresses : boolean;
  235. end;
  236. pasmmodeinfo = ^tasmmodeinfo;
  237. tasmmodeinfo = packed record
  238. id : tasmmode;
  239. idtxt : string[8];
  240. end;
  241. const
  242. { alias for supported_target field in tasminfo }
  243. system_any = system_none;
  244. var
  245. targetinfos : array[tsystem] of psysteminfo;
  246. asminfos : array[tasm] of pasminfo;
  247. arinfos : array[tar] of parinfo;
  248. resinfos : array[tres] of presinfo;
  249. asmmodeinfos : array[tasmmode] of pasmmodeinfo;
  250. source_info : tsysteminfo;
  251. target_cpu : tsystemcpu;
  252. target_info : tsysteminfo;
  253. target_asm : tasminfo;
  254. target_ar : tarinfo;
  255. target_res : tresinfo;
  256. target_path : string[12]; { for rtl/<X>/,fcl/<X>/, etc. }
  257. function set_target(t:tsystem):boolean;
  258. function set_target_asm(t:tasm):boolean;
  259. function set_target_ar(t:tar):boolean;
  260. function set_target_res(t:tres):boolean;
  261. function set_target_by_string(const s : string) : boolean;
  262. function set_target_asm_by_string(const s : string) : boolean;
  263. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  264. procedure set_source_info(const ti : tsysteminfo);
  265. procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
  266. procedure RegisterTarget(const r:tsysteminfo);
  267. procedure RegisterAsmMode(const r:tasmmodeinfo);
  268. procedure RegisterRes(const r:tresinfo);
  269. procedure RegisterAr(const r:tarinfo);
  270. { Register the external linker. This routine is called to setup the
  271. class to use for the linker. It returns the tsysteminfo structure
  272. updated with the correct linker class for external linking.
  273. }
  274. procedure RegisterExternalLinker(var system_info: tsysteminfo; c:TAbstractLinkerClass);
  275. { Register the internal linker. This routine is called to setup the
  276. class to use for the linker. It returns the tsysteminfo structure
  277. updated with the correct linker class for internal linking.
  278. If internal linking is not supported, this class can be set
  279. to nil.
  280. }
  281. procedure RegisterInternalLinker(var system_info : tsysteminfo; c:TAbstractLinkerClass);
  282. procedure InitSystems;
  283. implementation
  284. uses
  285. cutils;
  286. {****************************************************************************
  287. Target setting
  288. ****************************************************************************}
  289. function set_target(t:tsystem):boolean;
  290. begin
  291. set_target:=false;
  292. if assigned(targetinfos[t]) then
  293. begin
  294. target_info:=targetinfos[t]^;
  295. set_target_asm(target_info.assem);
  296. set_target_ar(target_info.ar);
  297. set_target_res(target_info.res);
  298. target_path:=lower(target_info.shortname);
  299. target_cpu:=target_info.cpu;
  300. set_target:=true;
  301. exit;
  302. end;
  303. end;
  304. function set_target_asm(t:tasm):boolean;
  305. begin
  306. set_target_asm:=false;
  307. if assigned(asminfos[t]) then
  308. begin
  309. target_asm:=asminfos[t]^;
  310. set_target_asm:=true;
  311. exit;
  312. end;
  313. end;
  314. function set_target_ar(t:tar):boolean;
  315. begin
  316. set_target_ar:=false;
  317. if assigned(arinfos[t]) then
  318. begin
  319. target_ar:=arinfos[t]^;
  320. set_target_ar:=true;
  321. exit;
  322. end;
  323. end;
  324. function set_target_res(t:tres):boolean;
  325. begin
  326. set_target_res:=false;
  327. if assigned(resinfos[t]) then
  328. begin
  329. target_res:=resinfos[t]^;
  330. set_target_res:=true;
  331. exit;
  332. end;
  333. end;
  334. function set_target_by_string(const s : string) : boolean;
  335. var
  336. hs : string;
  337. t : tsystem;
  338. begin
  339. set_target_by_string:=false;
  340. { this should be case insensitive !! PM }
  341. hs:=upper(s);
  342. for t:=low(tsystem) to high(tsystem) do
  343. if assigned(targetinfos[t]) and
  344. (upper(targetinfos[t]^.shortname)=hs) then
  345. begin
  346. set_target_by_string:=set_target(t);
  347. exit;
  348. end;
  349. end;
  350. function set_target_asm_by_string(const s : string) : boolean;
  351. var
  352. hs : string;
  353. t : tasm;
  354. begin
  355. set_target_asm_by_string:=false;
  356. { this should be case insensitive !! PM }
  357. hs:=upper(s);
  358. for t:=low(tasm) to high(tasm) do
  359. if assigned(asminfos[t]) and
  360. (asminfos[t]^.idtxt=hs) then
  361. begin
  362. set_target_asm_by_string:=set_target_asm(t);
  363. exit;
  364. end;
  365. end;
  366. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  367. var
  368. hs : string;
  369. ht : tasmmode;
  370. begin
  371. set_asmmode_by_string:=false;
  372. { this should be case insensitive !! PM }
  373. hs:=upper(s);
  374. for ht:=low(tasmmode) to high(tasmmode) do
  375. if assigned(asmmodeinfos[ht]) and
  376. (asmmodeinfos[ht]^.idtxt=hs) then
  377. begin
  378. t:=asmmodeinfos[ht]^.id;
  379. set_asmmode_by_string:=true;
  380. end;
  381. end;
  382. procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
  383. begin
  384. with d do
  385. begin
  386. { general update rules:
  387. minimum: if higher then update
  388. maximum: if lower then update or if undefined then update }
  389. if s.procalign>procalign then
  390. procalign:=s.procalign;
  391. if s.loopalign>loopalign then
  392. loopalign:=s.loopalign;
  393. if s.jumpalign>jumpalign then
  394. jumpalign:=s.jumpalign;
  395. if s.constalignmin>constalignmin then
  396. constalignmin:=s.constalignmin;
  397. if (constalignmax=0) or
  398. ((s.constalignmax>0) and (s.constalignmax<constalignmax)) then
  399. constalignmax:=s.constalignmax;
  400. if s.varalignmin>varalignmin then
  401. varalignmin:=s.varalignmin;
  402. if (varalignmax=0) or
  403. ((s.varalignmax>0) and (s.varalignmax<varalignmax)) then
  404. varalignmax:=s.varalignmax;
  405. if s.localalignmin>localalignmin then
  406. localalignmin:=s.localalignmin;
  407. if (localalignmax=0) or
  408. ((s.localalignmax>0) and (s.localalignmax<localalignmax)) then
  409. localalignmax:=s.localalignmax;
  410. if s.paraalign>paraalign then
  411. paraalign:=s.paraalign;
  412. if s.recordalignmin>recordalignmin then
  413. recordalignmin:=s.recordalignmin;
  414. if (recordalignmax=0) or
  415. ((s.recordalignmax>0) and (s.recordalignmax<recordalignmax)) then
  416. recordalignmax:=s.recordalignmax;
  417. if (maxCrecordalign=0) or
  418. ((s.maxCrecordalign>0) and (s.maxCrecordalign<maxCrecordalign)) then
  419. maxCrecordalign:=s.maxCrecordalign;
  420. end;
  421. end;
  422. {****************************************************************************
  423. Target registration
  424. ****************************************************************************}
  425. procedure RegisterTarget(const r:tsysteminfo);
  426. var
  427. t : tsystem;
  428. begin
  429. t:=r.system;
  430. if assigned(targetinfos[t]) then
  431. writeln('Warning: Target is already registered!')
  432. else
  433. Getmem(targetinfos[t],sizeof(tsysteminfo));
  434. targetinfos[t]^:=r;
  435. end;
  436. procedure RegisterAsmmode(const r:tasmmodeinfo);
  437. var
  438. t : tasmmode;
  439. begin
  440. t:=r.id;
  441. if assigned(asmmodeinfos[t]) then
  442. writeln('Warning: Asmmode is already registered!')
  443. else
  444. Getmem(asmmodeinfos[t],sizeof(tasmmodeinfo));
  445. asmmodeinfos[t]^:=r;
  446. end;
  447. procedure RegisterRes(const r:tresinfo);
  448. var
  449. t : tres;
  450. begin
  451. t:=r.id;
  452. if assigned(resinfos[t]) then
  453. writeln('Warning: resourcecompiler is already registered!')
  454. else
  455. Getmem(resinfos[t],sizeof(tresinfo));
  456. resinfos[t]^:=r;
  457. end;
  458. procedure RegisterAr(const r:tarinfo);
  459. var
  460. t : tar;
  461. begin
  462. t:=r.id;
  463. if assigned(arinfos[t]) then
  464. writeln('Warning: ar is already registered!')
  465. else
  466. Getmem(arinfos[t],sizeof(tarinfo));
  467. arinfos[t]^:=r;
  468. end;
  469. procedure RegisterExternalLinker(var system_info: tsysteminfo; c:TAbstractLinkerClass);
  470. begin
  471. system_info.linkextern := c;
  472. end;
  473. procedure RegisterInternalLinker(var system_info : tsysteminfo; c:TAbstractLinkerClass);
  474. begin
  475. system_info.link := c;
  476. end;
  477. procedure DeregisterInfos;
  478. var
  479. assem : tasm;
  480. target : tsystem;
  481. ar : tar;
  482. asmmode : tasmmode;
  483. res : tres;
  484. begin
  485. for target:=low(tsystem) to high(tsystem) do
  486. if assigned(targetinfos[target]) then
  487. begin
  488. freemem(targetinfos[target],sizeof(tsysteminfo));
  489. targetinfos[target]:=nil;
  490. end;
  491. for assem:=low(tasm) to high(tasm) do
  492. if assigned(asminfos[assem]) then
  493. begin
  494. freemem(asminfos[assem],sizeof(tasminfo));
  495. asminfos[assem]:=nil;
  496. end;
  497. for ar:=low(tar) to high(tar) do
  498. if assigned(arinfos[ar]) then
  499. begin
  500. freemem(arinfos[ar],sizeof(tarinfo));
  501. arinfos[ar]:=nil;
  502. end;
  503. for res:=low(tres) to high(tres) do
  504. if assigned(resinfos[res]) then
  505. begin
  506. freemem(resinfos[res],sizeof(tresinfo));
  507. resinfos[res]:=nil;
  508. end;
  509. for asmmode:=low(tasmmode) to high(tasmmode) do
  510. if assigned(asmmodeinfos[asmmode]) then
  511. begin
  512. freemem(asmmodeinfos[asmmode],sizeof(tasmmodeinfo));
  513. asmmodeinfos[asmmode]:=nil;
  514. end;
  515. end;
  516. {****************************************************************************
  517. Initialization of default target
  518. ****************************************************************************}
  519. procedure default_target(t:tsystem);
  520. begin
  521. set_target(t);
  522. if source_info.name='' then
  523. source_info:=target_info;
  524. end;
  525. procedure set_source_info(const ti : tsysteminfo);
  526. begin
  527. { can't use message() here (PFV) }
  528. if source_info.name<>'' then
  529. Writeln('Warning: Source OS Redefined!');
  530. source_info:=ti;
  531. end;
  532. procedure InitSystems;
  533. begin
  534. { Now default target, this is dependent on the i386 or m68k define,
  535. when the define is the same as the current cpu then we use the source
  536. os, else we pick a default }
  537. {$ifdef i386}
  538. {$ifdef cpu86}
  539. default_target(source_info.system);
  540. {$else cpu86}
  541. default_target(target_i386_linux);
  542. {$endif cpu86}
  543. {$endif i386}
  544. {$ifdef x86_64}
  545. {$ifdef cpu86_64}
  546. default_target(source_info.system);
  547. {$else cpu86_64}
  548. default_target(target_x86_64_linux);
  549. {$endif cpu86_64}
  550. {$endif x86_64}
  551. {$ifdef m68k}
  552. {$ifdef cpu68}
  553. default_target(source_info.target);
  554. {$else cpu68}
  555. default_target(system_m68k_linux);
  556. {$endif cpu68}
  557. {$endif m68k}
  558. {$ifdef alpha}
  559. {$ifdef cpualpha}
  560. default_target(source_info.system);
  561. {$else cpualpha}
  562. default_target(system_alpha_linux);
  563. {$endif cpualpha}
  564. {$endif alpha}
  565. {$ifdef powerpc}
  566. {$ifdef cpuppc}
  567. default_target(source_info.system);
  568. {$else cpuppc}
  569. default_target(system_powerpc_linux);
  570. {$endif cpuppc}
  571. {$endif powerpc}
  572. {$IFDEF sparc}
  573. default_target(system_sparc_linux);
  574. {$ENDIF sparc}
  575. end;
  576. initialization
  577. source_info.name:='';
  578. finalization
  579. DeregisterInfos;
  580. end.
  581. {
  582. $Log$
  583. Revision 1.54 2002-08-20 21:40:44 florian
  584. + target macos for ppc added
  585. + frame work for mpw assembler output
  586. Revision 1.53 2002/08/18 09:13:02 florian
  587. * small fixes to the alpha stuff
  588. Revision 1.52 2002/08/13 21:40:57 florian
  589. * more fixes for ppc calling conventions
  590. Revision 1.51 2002/08/12 15:08:40 carl
  591. + stab register indexes for powerpc (moved from gdb to cpubase)
  592. + tprocessor enumeration moved to cpuinfo
  593. + linker in target_info is now a class
  594. * many many updates for m68k (will soon start to compile)
  595. - removed some ifdef or correct them for correct cpu
  596. Revision 1.50 2002/08/10 14:46:31 carl
  597. + moved target_cpu_string to cpuinfo
  598. * renamed asmmode enum.
  599. * assembler reader has now less ifdef's
  600. * move from nppcmem.pas -> ncgmem.pas vec. node.
  601. Revision 1.49 2002/07/28 20:45:22 florian
  602. + added direct assembler reader for PowerPC
  603. Revision 1.48 2002/07/26 21:15:42 florian
  604. * rewrote the system handling
  605. Revision 1.47 2002/07/04 20:43:02 florian
  606. * first x86-64 patches
  607. Revision 1.46 2002/07/01 18:46:29 peter
  608. * internal linker
  609. * reorganized aasm layer
  610. Revision 1.45 2002/05/18 13:34:21 peter
  611. * readded missing revisions
  612. Revision 1.44 2002/05/16 19:46:45 carl
  613. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  614. + try to fix temp allocation (still in ifdef)
  615. + generic constructor calls
  616. + start of tassembler / tmodulebase class cleanup
  617. Revision 1.42 2002/05/06 19:52:04 carl
  618. + added more patches from Mazen for SPARC port
  619. Revision 1.41 2002/04/24 16:08:30 carl
  620. * fix compilation problem
  621. Revision 1.40 2002/04/20 21:32:26 carl
  622. + generic FPC_CHECKPOINTER
  623. + first parameter offset in stack now portable
  624. * rename some constants
  625. + move some cpu stuff to other units
  626. - remove unused constents
  627. * fix stacksize for some targets
  628. * fix generic size problems which depend now on EXTEND_SIZE constant
  629. Revision 1.39 2002/04/15 19:08:22 carl
  630. + target_info.size_of_pointer -> pointer_size
  631. + some cleanup of unused types/variables
  632. Revision 1.38 2002/04/14 16:56:30 carl
  633. - remove duplicate comment
  634. }