systems.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  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. ttargetcpu=
  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. tprocessors = (no_processor
  47. ,Class386,ClassP5,ClassP6
  48. ,MC68000,MC68100,MC68020
  49. );
  50. TSection=(sec_none,
  51. sec_code,sec_data,sec_bss,
  52. sec_idata2,sec_idata4,sec_idata5,sec_idata6,sec_idata7,sec_edata,
  53. sec_stab,sec_stabstr,sec_common
  54. );
  55. tasmmode= (asmmode_none
  56. ,asmmode_i386_direct,asmmode_i386_att,asmmode_i386_intel
  57. ,asmmode_m68k_mot
  58. ,asmmode_alpha_direct
  59. ,asmmode_powerpc_direct
  60. );
  61. { IMPORTANT NOTE:
  62. the integer value of this enum is stored in PPU
  63. files to recognize the target, so if you add new targets
  64. allways add them at end PM
  65. FURTHERMORE : Make sure that this branch values, are
  66. consistant with the main branch version always. (CEC)
  67. }
  68. type
  69. ttarget =
  70. (
  71. target_none, { 0 }
  72. obsolete_target_i386_GO32V1,{ 1 }
  73. target_i386_GO32V2, { 2 }
  74. target_i386_linux, { 3 }
  75. target_i386_OS2, { 4 }
  76. target_i386_Win32, { 5 }
  77. target_i386_freebsd, { 6 }
  78. target_m68k_Amiga, { 7 }
  79. target_m68k_Atari, { 8 }
  80. target_m68k_Mac, { 9 }
  81. target_m68k_linux, { 10 }
  82. target_m68k_PalmOS, { 11 }
  83. target_alpha_linux, { 12 }
  84. target_powerpc_linux, { 13 }
  85. target_powerpc_macos, { 14 }
  86. target_i386_sunos, { 15 }
  87. target_i386_beos, { 16 }
  88. target_i386_netbsd, { 17 }
  89. target_m68k_netbsd, { 18 }
  90. target_i386_Netware, { 19 }
  91. target_i386_qnx, { 20 }
  92. target_i386_wdosx, { 21 }
  93. target_sparc_sunos, { 22 }
  94. target_sparc_linux, { 23 }
  95. target_x86_64_linux { 24 }
  96. );
  97. tasm = (as_none
  98. ,as_i386_as,as_i386_as_aout,as_i386_asw,as_i386_aswdosx,
  99. as_i386_nasmcoff,as_i386_nasmwin32,as_i386_nasmwdosx,
  100. as_i386_nasmelf,as_i386_nasmobj,
  101. as_i386_tasm,as_i386_masm,
  102. as_i386_dbg,as_i386_coff,as_i386_pecoff,as_i386_elf32,as_i386_pecoffwdosx
  103. ,as_m68k_as,as_m68k_gas,as_m68k_mit,as_m68k_mot,
  104. as_m68k_mpw,as_m68k_palm
  105. ,as_alpha_as
  106. ,as_powerpc_as,as_powerpc_mpw,
  107. as_SPARC_as,as_SPARC_elf32
  108. );
  109. tld = (ld_none,
  110. ld_i386_GO32V1,ld_i386_GO32V2,ld_i386_linux,
  111. ld_i386_OS2,ld_i386_Win32,ld_i386_freebsd,
  112. ld_i386_Netware,ld_i386_sunos,ld_i386_beos,
  113. ld_i386_coff,ld_i386_pecoff,ld_i386_Wdosx,
  114. ld_m68k_Amiga,ld_m68k_Atari,ld_m68k_Mac,
  115. ld_m68k_linux,ld_m68k_PalmOS,ld_m68k_freebsd,
  116. ld_alpha_linux,
  117. ld_x86_64_linux,
  118. ld_powerpc_linux,ld_powerpc_macos,
  119. ld_SPARC_SunOs,ld_SPARC_linux
  120. );
  121. tar = (ar_none
  122. ,ar_gnu_ar,ar_gnu_arw
  123. );
  124. tres = (res_none
  125. ,res_gnu_windres,res_emxbind
  126. );
  127. tscripttype = (script_none
  128. ,script_dos,script_unix,script_amiga
  129. );
  130. {*****************************************************************************
  131. Structures
  132. *****************************************************************************}
  133. type
  134. palignmentinfo = ^talignmentinfo;
  135. talignmentinfo = packed record
  136. procalign,
  137. loopalign,
  138. jumpalign,
  139. constalignmin,
  140. constalignmax,
  141. varalignmin,
  142. varalignmax,
  143. localalignmin,
  144. localalignmax,
  145. paraalign,
  146. recordalignmin,
  147. recordalignmax,
  148. maxCrecordalign : longint;
  149. end;
  150. pasminfo = ^tasminfo;
  151. tasminfo = packed record
  152. id : tasm;
  153. idtxt : string[9];
  154. asmbin : string[8];
  155. asmcmd : string[50];
  156. supported_target : ttarget;
  157. outputbinary,
  158. allowdirect,
  159. externals,
  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. {# }
  178. ttargetflags = (tf_none,
  179. tf_under_development,
  180. tf_need_export,tf_needs_isconsole
  181. ,tf_code_small,tf_static_reg_based
  182. );
  183. ptargetinfo = ^ttargetinfo;
  184. ttargetinfo = packed record
  185. target : ttarget;
  186. name : string[30];
  187. shortname : string[9];
  188. flags : set of ttargetflags;
  189. cpu : ttargetcpu;
  190. unit_env : string[12];
  191. extradefines : string[40];
  192. sourceext,
  193. pasext,
  194. exeext,
  195. defext,
  196. scriptext,
  197. smartext,
  198. unitext,
  199. unitlibext,
  200. asmext,
  201. objext,
  202. resext,
  203. resobjext : string[4];
  204. sharedlibext : string[10];
  205. staticlibext,
  206. staticlibprefix : string[4];
  207. sharedlibprefix : string[4];
  208. sharedClibext : string[10];
  209. staticClibext,
  210. staticClibprefix : string[4];
  211. sharedClibprefix : string[4];
  212. Cprefix : string[2];
  213. newline : string[2];
  214. dirsep : char;
  215. files_case_relevent : boolean;
  216. assem : tasm;
  217. assemextern : tasm; { external assembler, used by -a }
  218. link : tld;
  219. linkextern : tld; { external linker, used by -s }
  220. ar : tar;
  221. res : tres;
  222. script : tscripttype;
  223. endian : tendian;
  224. alignment : talignmentinfo;
  225. {
  226. Offset from the argument pointer register to the first
  227. argument's address. On some machines it may depend on
  228. the data type of the function.
  229. (see also FIRST_PARM_OFFSET in GCC source)
  230. }
  231. first_parm_offset : longint;
  232. heapsize,
  233. stacksize : longint;
  234. DllScanSupported : boolean;
  235. use_function_relative_addresses : boolean;
  236. end;
  237. pasmmodeinfo = ^tasmmodeinfo;
  238. tasmmodeinfo = packed record
  239. id : tasmmode;
  240. idtxt : string[8];
  241. end;
  242. const
  243. { alias for supported_target field in tasminfo }
  244. target_any = target_none;
  245. var
  246. targetinfos : array[ttarget] of ptargetinfo;
  247. asminfos : array[tasm] of pasminfo;
  248. arinfos : array[tar] of parinfo;
  249. resinfos : array[tres] of presinfo;
  250. asmmodeinfos : array[tasmmode] of pasmmodeinfo;
  251. source_info : ttargetinfo;
  252. target_cpu : ttargetcpu;
  253. target_info : ttargetinfo;
  254. target_asm : tasminfo;
  255. target_ar : tarinfo;
  256. target_res : tresinfo;
  257. target_path : string[12]; { for rtl/<X>/,fcl/<X>/, etc. }
  258. function set_target(t:ttarget):boolean;
  259. function set_target_asm(t:tasm):boolean;
  260. function set_target_ar(t:tar):boolean;
  261. function set_target_res(t:tres):boolean;
  262. function set_target_by_string(const s : string) : boolean;
  263. function set_target_asm_by_string(const s : string) : boolean;
  264. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  265. procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
  266. procedure RegisterTarget(const r:ttargetinfo);
  267. procedure RegisterAsmMode(const r:tasmmodeinfo);
  268. procedure RegisterRes(const r:tresinfo);
  269. procedure RegisterAr(const r:tarinfo);
  270. procedure InitSystems;
  271. implementation
  272. uses
  273. cutils;
  274. {****************************************************************************
  275. Target setting
  276. ****************************************************************************}
  277. function set_target(t:ttarget):boolean;
  278. begin
  279. set_target:=false;
  280. if assigned(targetinfos[t]) then
  281. begin
  282. target_info:=targetinfos[t]^;
  283. set_target_asm(target_info.assem);
  284. set_target_ar(target_info.ar);
  285. set_target_res(target_info.res);
  286. target_path:=lower(target_info.shortname);
  287. target_cpu:=target_info.cpu;
  288. set_target:=true;
  289. exit;
  290. end;
  291. end;
  292. function set_target_asm(t:tasm):boolean;
  293. begin
  294. set_target_asm:=false;
  295. if assigned(asminfos[t]) then
  296. begin
  297. target_asm:=asminfos[t]^;
  298. set_target_asm:=true;
  299. exit;
  300. end;
  301. end;
  302. function set_target_ar(t:tar):boolean;
  303. begin
  304. set_target_ar:=false;
  305. if assigned(arinfos[t]) then
  306. begin
  307. target_ar:=arinfos[t]^;
  308. set_target_ar:=true;
  309. exit;
  310. end;
  311. end;
  312. function set_target_res(t:tres):boolean;
  313. begin
  314. set_target_res:=false;
  315. if assigned(resinfos[t]) then
  316. begin
  317. target_res:=resinfos[t]^;
  318. set_target_res:=true;
  319. exit;
  320. end;
  321. end;
  322. function set_target_by_string(const s : string) : boolean;
  323. var
  324. hs : string;
  325. t : ttarget;
  326. begin
  327. set_target_by_string:=false;
  328. { this should be case insensitive !! PM }
  329. hs:=upper(s);
  330. for t:=low(ttarget) to high(ttarget) do
  331. if assigned(targetinfos[t]) and
  332. (upper(targetinfos[t]^.shortname)=hs) then
  333. begin
  334. set_target_by_string:=set_target(t);
  335. exit;
  336. end;
  337. end;
  338. function set_target_asm_by_string(const s : string) : boolean;
  339. var
  340. hs : string;
  341. t : tasm;
  342. begin
  343. set_target_asm_by_string:=false;
  344. { this should be case insensitive !! PM }
  345. hs:=upper(s);
  346. for t:=low(tasm) to high(tasm) do
  347. if assigned(asminfos[t]) and
  348. (asminfos[t]^.idtxt=hs) then
  349. begin
  350. set_target_asm_by_string:=set_target_asm(t);
  351. exit;
  352. end;
  353. end;
  354. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  355. var
  356. hs : string;
  357. ht : tasmmode;
  358. begin
  359. set_asmmode_by_string:=false;
  360. { this should be case insensitive !! PM }
  361. hs:=upper(s);
  362. for ht:=low(tasmmode) to high(tasmmode) do
  363. if assigned(asmmodeinfos[ht]) and
  364. (asmmodeinfos[ht]^.idtxt=hs) then
  365. begin
  366. t:=asmmodeinfos[ht]^.id;
  367. set_asmmode_by_string:=true;
  368. end;
  369. end;
  370. procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
  371. begin
  372. with d do
  373. begin
  374. { general update rules:
  375. minimum: if higher then update
  376. maximum: if lower then update or if undefined then update }
  377. if s.procalign>procalign then
  378. procalign:=s.procalign;
  379. if s.loopalign>loopalign then
  380. loopalign:=s.loopalign;
  381. if s.jumpalign>jumpalign then
  382. jumpalign:=s.jumpalign;
  383. if s.constalignmin>constalignmin then
  384. constalignmin:=s.constalignmin;
  385. if (constalignmax=0) or
  386. ((s.constalignmax>0) and (s.constalignmax<constalignmax)) then
  387. constalignmax:=s.constalignmax;
  388. if s.varalignmin>varalignmin then
  389. varalignmin:=s.varalignmin;
  390. if (varalignmax=0) or
  391. ((s.varalignmax>0) and (s.varalignmax<varalignmax)) then
  392. varalignmax:=s.varalignmax;
  393. if s.localalignmin>localalignmin then
  394. localalignmin:=s.localalignmin;
  395. if (localalignmax=0) or
  396. ((s.localalignmax>0) and (s.localalignmax<localalignmax)) then
  397. localalignmax:=s.localalignmax;
  398. if s.paraalign>paraalign then
  399. paraalign:=s.paraalign;
  400. if s.recordalignmin>recordalignmin then
  401. recordalignmin:=s.recordalignmin;
  402. if (recordalignmax=0) or
  403. ((s.recordalignmax>0) and (s.recordalignmax<recordalignmax)) then
  404. recordalignmax:=s.recordalignmax;
  405. if (maxCrecordalign=0) or
  406. ((s.maxCrecordalign>0) and (s.maxCrecordalign<maxCrecordalign)) then
  407. maxCrecordalign:=s.maxCrecordalign;
  408. end;
  409. end;
  410. {****************************************************************************
  411. Target registration
  412. ****************************************************************************}
  413. procedure RegisterTarget(const r:ttargetinfo);
  414. var
  415. t : ttarget;
  416. begin
  417. t:=r.target;
  418. if assigned(targetinfos[t]) then
  419. writeln('Warning: Target is already registered!')
  420. else
  421. Getmem(targetinfos[t],sizeof(ttargetinfo));
  422. targetinfos[t]^:=r;
  423. end;
  424. procedure RegisterAsmmode(const r:tasmmodeinfo);
  425. var
  426. t : tasmmode;
  427. begin
  428. t:=r.id;
  429. if assigned(asmmodeinfos[t]) then
  430. writeln('Warning: Asmmode is already registered!')
  431. else
  432. Getmem(asmmodeinfos[t],sizeof(tasmmodeinfo));
  433. asmmodeinfos[t]^:=r;
  434. end;
  435. procedure RegisterRes(const r:tresinfo);
  436. var
  437. t : tres;
  438. begin
  439. t:=r.id;
  440. if assigned(resinfos[t]) then
  441. writeln('Warning: resourcecompiler is already registered!')
  442. else
  443. Getmem(resinfos[t],sizeof(tresinfo));
  444. resinfos[t]^:=r;
  445. end;
  446. procedure RegisterAr(const r:tarinfo);
  447. var
  448. t : tar;
  449. begin
  450. t:=r.id;
  451. if assigned(arinfos[t]) then
  452. writeln('Warning: ar is already registered!')
  453. else
  454. Getmem(arinfos[t],sizeof(tarinfo));
  455. arinfos[t]^:=r;
  456. end;
  457. procedure DeregisterInfos;
  458. var
  459. assem : tasm;
  460. target : ttarget;
  461. ar : tar;
  462. asmmode : tasmmode;
  463. res : tres;
  464. begin
  465. for target:=low(ttarget) to high(ttarget) do
  466. if assigned(targetinfos[target]) then
  467. begin
  468. freemem(targetinfos[target],sizeof(ttargetinfo));
  469. targetinfos[target]:=nil;
  470. end;
  471. for assem:=low(tasm) to high(tasm) do
  472. if assigned(asminfos[assem]) then
  473. begin
  474. freemem(asminfos[assem],sizeof(tasminfo));
  475. asminfos[assem]:=nil;
  476. end;
  477. for ar:=low(tar) to high(tar) do
  478. if assigned(arinfos[ar]) then
  479. begin
  480. freemem(arinfos[ar],sizeof(tarinfo));
  481. arinfos[ar]:=nil;
  482. end;
  483. for res:=low(tres) to high(tres) do
  484. if assigned(resinfos[res]) then
  485. begin
  486. freemem(resinfos[res],sizeof(tresinfo));
  487. resinfos[res]:=nil;
  488. end;
  489. for asmmode:=low(tasmmode) to high(tasmmode) do
  490. if assigned(asmmodeinfos[asmmode]) then
  491. begin
  492. freemem(asmmodeinfos[asmmode],sizeof(tasmmodeinfo));
  493. asmmodeinfos[asmmode]:=nil;
  494. end;
  495. end;
  496. {****************************************************************************
  497. Initialization of default target
  498. ****************************************************************************}
  499. procedure default_target(t:ttarget);
  500. begin
  501. set_target(t);
  502. if source_info.name='' then
  503. source_info:=target_info;
  504. end;
  505. procedure set_source(t:ttarget);
  506. begin
  507. { can't use message() here (PFV) }
  508. if source_info.name<>'' then
  509. Writeln('Warning: Source OS Redefined!');
  510. if assigned(targetinfos[t]) then
  511. source_info:=targetinfos[t]^
  512. else
  513. Writeln('Warning: Source OS Not Supported!');
  514. end;
  515. procedure InitSystems;
  516. begin
  517. { first get source OS }
  518. source_info.name:='';
  519. { please note then we use cpu86 and cpu68 here on purpose !! }
  520. {$ifdef cpu86}
  521. {$ifdef GO32V2}
  522. set_source(target_i386_GO32V2);
  523. {$else}
  524. {$ifdef OS2}
  525. set_source(target_i386_OS2);
  526. if (OS_Mode = osDOS) or (OS_Mode = osDPMI) then
  527. source_info.scriptext := '.bat';
  528. { OS/2 via EMX can be run under DOS as well }
  529. {$else}
  530. {$ifdef WIN32}
  531. {$ifdef WDOSX}
  532. set_source(target_i386_wdosx);
  533. {$else}
  534. set_source(target_i386_WIN32);
  535. {$endif}
  536. {$else}
  537. {$ifdef FreeBSD}
  538. set_source(target_i386_FreeBSD);
  539. {$else}
  540. {$ifdef netbsd}
  541. set_source(target_i386_NetBSD);
  542. {$else}
  543. {$ifdef sunos}
  544. set_source(target_i386_sunos);
  545. {$else}
  546. {$ifdef beos}
  547. set_source(target_i386_beos);
  548. {$else}
  549. { Must be the last as some freebsd also
  550. defined linux }
  551. {$ifdef linux}
  552. set_source(target_i386_linux);
  553. {$else}
  554. {$error Error setting source OS}
  555. {$endif linux}
  556. {$endif beos}
  557. {$endif sunos}
  558. {$endif netbsd}
  559. {$endif freebsd}
  560. {$endif win32}
  561. {$endif os2}
  562. {$endif go32v2}
  563. {$endif cpu86}
  564. {$ifdef cpu86_64}
  565. set_source(target_x86_64_linux);
  566. {$endif cpu86_64}
  567. {$ifdef cpu68}
  568. {$ifdef AMIGA}
  569. set_source(target_m68k_Amiga);
  570. {$else}
  571. {$ifdef ATARI}
  572. set_source(target_m68k_Atari);
  573. {$else}
  574. {$ifdef MACOS}
  575. set_source(target_m68k_MAC);
  576. {$else}
  577. {$ifdef linux}
  578. set_source(target_m68k_linux);
  579. {$endif linux}
  580. {$endif macos}
  581. {$endif atari}
  582. {$endif amiga}
  583. {$endif cpu68}
  584. { Now default target, this is dependent on the i386 or m68k define,
  585. when the define is the same as the current cpu then we use the source
  586. os, else we pick a default }
  587. {$ifdef i386}
  588. {$ifdef cpu86}
  589. default_target(source_info.target);
  590. {$else cpu86}
  591. default_target(target_i386_linux);
  592. {$endif cpu86}
  593. {$endif i386}
  594. {$ifdef x86_64}
  595. {$ifdef cpu86_64}
  596. default_target(source_info.target);
  597. {$else cpu86_64}
  598. default_target(target_x86_64_linux);
  599. {$endif cpu86_64}
  600. {$endif x86_64}
  601. {$ifdef m68k}
  602. {$ifdef cpu68}
  603. default_target(source_info.target);
  604. {$else cpu68}
  605. default_target(target_m68k_linux);
  606. {$endif cpu68}
  607. {$endif m68k}
  608. {$ifdef alpha}
  609. {$ifdef cpualpha}
  610. default_target(source_info.target);
  611. {$else cpualpha}
  612. default_target(target_alpha_linux);
  613. {$endif cpualpha}
  614. {$endif alpha}
  615. {$ifdef powerpc}
  616. {$ifdef cpuppc}
  617. default_target(source_info.target);
  618. {$else cpuppc}
  619. default_target(target_powerpc_linux);
  620. {$endif cpuppc}
  621. {$endif powerpc}
  622. {$IFDEF SPARC}
  623. default_target(target_SPARC_linux);
  624. {$ENDIF SPARC}
  625. end;
  626. initialization
  627. finalization
  628. DeregisterInfos;
  629. end.
  630. {
  631. $Log$
  632. Revision 1.47 2002-07-04 20:43:02 florian
  633. * first x86-64 patches
  634. Revision 1.46 2002/07/01 18:46:29 peter
  635. * internal linker
  636. * reorganized aasm layer
  637. Revision 1.45 2002/05/18 13:34:21 peter
  638. * readded missing revisions
  639. Revision 1.44 2002/05/16 19:46:45 carl
  640. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  641. + try to fix temp allocation (still in ifdef)
  642. + generic constructor calls
  643. + start of tassembler / tmodulebase class cleanup
  644. Revision 1.42 2002/05/06 19:52:04 carl
  645. + added more patches from Mazen for SPARC port
  646. Revision 1.41 2002/04/24 16:08:30 carl
  647. * fix compilation problem
  648. Revision 1.40 2002/04/20 21:32:26 carl
  649. + generic FPC_CHECKPOINTER
  650. + first parameter offset in stack now portable
  651. * rename some constants
  652. + move some cpu stuff to other units
  653. - remove unused constents
  654. * fix stacksize for some targets
  655. * fix generic size problems which depend now on EXTEND_SIZE constant
  656. Revision 1.39 2002/04/15 19:08:22 carl
  657. + target_info.size_of_pointer -> pointer_size
  658. + some cleanup of unused types/variables
  659. Revision 1.38 2002/04/14 16:56:30 carl
  660. - remove duplicate comment
  661. }