systems.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. {
  2. $Id$
  3. Copyright (C) 1998-2000 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 defines.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. no_cpu, { 0 }
  35. i386, { 1 }
  36. m68k, { 2 }
  37. alpha, { 3 }
  38. powerpc, { 4 }
  39. sparc, { 5 }
  40. vm { 6 }
  41. );
  42. tprocessors = (no_processor
  43. ,Class386,ClassP5,ClassP6
  44. ,MC68000,MC68100,MC68020
  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
  50. );
  51. tasmmode= (asmmode_none
  52. ,asmmode_i386_direct,asmmode_i386_att,asmmode_i386_intel
  53. ,asmmode_m68k_mot
  54. ,asmmode_alpha_direct
  55. ,asmmode_powerpc_direct
  56. );
  57. { IMPORTANT NOTE:
  58. the integer value of this enum is stored in PPU
  59. files to recognize the target, so if you add new targets
  60. allways add them at end PM
  61. FURTHERMORE : Make sure that this branch values, are
  62. consistant with the main branch version always.
  63. }
  64. { IMPORTANT NOTE:
  65. the integer value of this enum is stored in PPU
  66. files to recognize the target, so if you add new targets
  67. allways add them at end PM
  68. FURTHERMORE : Make sure that this branch values, are
  69. consistant with the main branch version always. (CEC)
  70. }
  71. type
  72. ttarget =
  73. (
  74. target_none, { 0 }
  75. obsolete_target_i386_GO32V1,{ 1 }
  76. target_i386_GO32V2, { 2 }
  77. target_i386_linux, { 3 }
  78. target_i386_OS2, { 4 }
  79. target_i386_Win32, { 5 }
  80. target_i386_freebsd, { 6 }
  81. target_m68k_Amiga, { 7 }
  82. target_m68k_Atari, { 8 }
  83. target_m68k_Mac, { 9 }
  84. target_m68k_linux, { 10 }
  85. target_m68k_PalmOS, { 11 }
  86. target_alpha_linux, { 12 }
  87. target_powerpc_linux, { 13 }
  88. target_powerpc_macos, { 14 }
  89. target_i386_sunos, { 15 }
  90. target_i386_beos, { 16 }
  91. target_i386_netbsd, { 17 }
  92. target_m68k_netbsd, { 18 }
  93. target_i386_Netware, { 19 }
  94. target_i386_qnx, { 20 }
  95. target_i386_wdosx, { 21 }
  96. target_sparc_sunos, { 22 }
  97. target_sparc_linux { 23 }
  98. );
  99. tasm = (as_none
  100. ,as_i386_as,as_i386_as_aout,as_i386_asw,as_i386_aswdosx,
  101. as_i386_nasmcoff,as_i386_nasmwin32,as_i386_nasmwdosx,
  102. as_i386_nasmelf,as_i386_nasmobj,
  103. as_i386_tasm,as_i386_masm,
  104. as_i386_dbg,as_i386_coff,as_i386_pecoff,as_i386_elf32,as_i386_pecoffwdosx
  105. ,as_m68k_as,as_m68k_gas,as_m68k_mit,as_m68k_mot,
  106. as_m68k_mpw,as_m68k_palm
  107. ,as_alpha_as
  108. ,as_powerpc_as,as_powerpc_mpw
  109. );
  110. tld = (ld_none,
  111. ld_i386_GO32V1,ld_i386_GO32V2,ld_i386_linux,
  112. ld_i386_OS2,ld_i386_Win32,ld_i386_freebsd,
  113. ld_i386_Netware,ld_i386_sunos,ld_i386_beos,
  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_powerpc_linux,ld_powerpc_macos,ld_i386_Wdosx
  118. );
  119. tar = (ar_none
  120. ,ar_gnu_ar,ar_gnu_arw
  121. );
  122. tres = (res_none
  123. ,res_gnu_windres,res_emxbind
  124. );
  125. tscripttype = (script_none
  126. ,script_dos,script_unix,script_amiga
  127. );
  128. {*****************************************************************************
  129. Structures
  130. *****************************************************************************}
  131. type
  132. palignmentinfo = ^talignmentinfo;
  133. talignmentinfo = packed record
  134. procalign,
  135. loopalign,
  136. jumpalign,
  137. constalignmin,
  138. constalignmax,
  139. varalignmin,
  140. varalignmax,
  141. localalignmin,
  142. localalignmax,
  143. paraalign,
  144. recordalignmin,
  145. recordalignmax,
  146. maxCrecordalign : longint;
  147. end;
  148. pasminfo = ^tasminfo;
  149. tasminfo = packed record
  150. id : tasm;
  151. idtxt : string[9];
  152. asmbin : string[8];
  153. asmcmd : string[50];
  154. supported_target : ttarget;
  155. outputbinary,
  156. allowdirect,
  157. externals,
  158. needar,
  159. labelprefix_only_inside_procedure : boolean;
  160. labelprefix : string[3];
  161. comment : string[2];
  162. secnames : array[tsection] of string[20];
  163. end;
  164. parinfo = ^tarinfo;
  165. tarinfo = packed record
  166. id : tar;
  167. arcmd : string[50];
  168. end;
  169. presinfo = ^tresinfo;
  170. tresinfo = packed record
  171. id : tres;
  172. resbin : string[8];
  173. rescmd : string[50];
  174. end;
  175. ttargetflags = (tf_none,
  176. tf_under_development,tf_supports_stack_checking,
  177. tf_need_export,tf_needs_isconsole
  178. {$ifdef m68k}
  179. ,tf_code_small,tf_static_a5_based
  180. {$endif m68k}
  181. );
  182. ptargetinfo = ^ttargetinfo;
  183. ttargetinfo = packed record
  184. target : ttarget;
  185. name : string[30];
  186. shortname : string[9];
  187. flags : set of ttargetflags;
  188. cpu : ttargetcpu;
  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 : tld;
  218. linkextern : tld; { external linker, used by -s }
  219. ar : tar;
  220. res : tres;
  221. script : tscripttype;
  222. endian : tendian;
  223. alignment : talignmentinfo;
  224. size_of_pointer : byte;
  225. size_of_longint : byte;
  226. heapsize,
  227. maxheapsize,
  228. stacksize : longint;
  229. DllScanSupported : boolean;
  230. use_bound_instruction : boolean;
  231. use_function_relative_addresses : boolean;
  232. end;
  233. pasmmodeinfo = ^tasmmodeinfo;
  234. tasmmodeinfo = packed record
  235. id : tasmmode;
  236. idtxt : string[8];
  237. end;
  238. const
  239. { alias for supported_target field in tasminfo }
  240. target_any = target_none;
  241. var
  242. targetinfos : array[ttarget] of ptargetinfo;
  243. asminfos : array[tasm] of pasminfo;
  244. arinfos : array[tar] of parinfo;
  245. resinfos : array[tres] of presinfo;
  246. asmmodeinfos : array[tasmmode] of pasmmodeinfo;
  247. source_info : ttargetinfo;
  248. target_cpu : ttargetcpu;
  249. target_info : ttargetinfo;
  250. target_asm : tasminfo;
  251. target_ar : tarinfo;
  252. target_res : tresinfo;
  253. target_path : string[12]; { for rtl/<X>/,fcl/<X>/, etc. }
  254. function set_target(t:ttarget):boolean;
  255. function set_target_asm(t:tasm):boolean;
  256. function set_target_ar(t:tar):boolean;
  257. function set_target_res(t:tres):boolean;
  258. function set_target_by_string(const s : string) : boolean;
  259. function set_target_asm_by_string(const s : string) : boolean;
  260. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  261. procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
  262. procedure RegisterTarget(const r:ttargetinfo);
  263. procedure RegisterAsmMode(const r:tasmmodeinfo);
  264. procedure RegisterRes(const r:tresinfo);
  265. procedure RegisterAr(const r:tarinfo);
  266. procedure InitSystems;
  267. implementation
  268. uses
  269. cutils;
  270. {****************************************************************************
  271. Target setting
  272. ****************************************************************************}
  273. function set_target(t:ttarget):boolean;
  274. begin
  275. set_target:=false;
  276. if assigned(targetinfos[t]) then
  277. begin
  278. target_info:=targetinfos[t]^;
  279. set_target_asm(target_info.assem);
  280. set_target_ar(target_info.ar);
  281. set_target_res(target_info.res);
  282. target_path:=lower(target_info.shortname);
  283. target_cpu:=target_info.cpu;
  284. set_target:=true;
  285. exit;
  286. end;
  287. end;
  288. function set_target_asm(t:tasm):boolean;
  289. begin
  290. set_target_asm:=false;
  291. if assigned(asminfos[t]) then
  292. begin
  293. target_asm:=asminfos[t]^;
  294. set_target_asm:=true;
  295. exit;
  296. end;
  297. end;
  298. function set_target_ar(t:tar):boolean;
  299. begin
  300. set_target_ar:=false;
  301. if assigned(arinfos[t]) then
  302. begin
  303. target_ar:=arinfos[t]^;
  304. set_target_ar:=true;
  305. exit;
  306. end;
  307. end;
  308. function set_target_res(t:tres):boolean;
  309. begin
  310. set_target_res:=false;
  311. if assigned(resinfos[t]) then
  312. begin
  313. target_res:=resinfos[t]^;
  314. set_target_res:=true;
  315. exit;
  316. end;
  317. end;
  318. function set_target_by_string(const s : string) : boolean;
  319. var
  320. hs : string;
  321. t : ttarget;
  322. begin
  323. set_target_by_string:=false;
  324. { this should be case insensitive !! PM }
  325. hs:=upper(s);
  326. for t:=low(ttarget) to high(ttarget) do
  327. if assigned(targetinfos[t]) and
  328. (upper(targetinfos[t]^.shortname)=hs) then
  329. begin
  330. set_target_by_string:=set_target(t);
  331. exit;
  332. end;
  333. end;
  334. function set_target_asm_by_string(const s : string) : boolean;
  335. var
  336. hs : string;
  337. t : tasm;
  338. begin
  339. set_target_asm_by_string:=false;
  340. { this should be case insensitive !! PM }
  341. hs:=upper(s);
  342. for t:=low(tasm) to high(tasm) do
  343. if assigned(asminfos[t]) and
  344. (asminfos[t]^.idtxt=hs) then
  345. begin
  346. set_target_asm_by_string:=set_target_asm(t);
  347. exit;
  348. end;
  349. end;
  350. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  351. var
  352. hs : string;
  353. ht : tasmmode;
  354. begin
  355. set_asmmode_by_string:=false;
  356. { this should be case insensitive !! PM }
  357. hs:=upper(s);
  358. for ht:=low(tasmmode) to high(tasmmode) do
  359. if assigned(asmmodeinfos[ht]) and
  360. (asmmodeinfos[ht]^.idtxt=hs) then
  361. begin
  362. t:=asmmodeinfos[ht]^.id;
  363. set_asmmode_by_string:=true;
  364. end;
  365. end;
  366. procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
  367. begin
  368. with d do
  369. begin
  370. { general update rules:
  371. minimum: if higher then update
  372. maximum: if lower then update or if undefined then update }
  373. if s.procalign>procalign then
  374. procalign:=s.procalign;
  375. if s.loopalign>loopalign then
  376. loopalign:=s.loopalign;
  377. if s.jumpalign>jumpalign then
  378. jumpalign:=s.jumpalign;
  379. if s.constalignmin>constalignmin then
  380. constalignmin:=s.constalignmin;
  381. if (constalignmax=0) or
  382. ((s.constalignmax>0) and (s.constalignmax<constalignmax)) then
  383. constalignmax:=s.constalignmax;
  384. if s.varalignmin>varalignmin then
  385. varalignmin:=s.varalignmin;
  386. if (varalignmax=0) or
  387. ((s.varalignmax>0) and (s.varalignmax<varalignmax)) then
  388. varalignmax:=s.varalignmax;
  389. if s.localalignmin>localalignmin then
  390. localalignmin:=s.localalignmin;
  391. if (localalignmax=0) or
  392. ((s.localalignmax>0) and (s.localalignmax<localalignmax)) then
  393. localalignmax:=s.localalignmax;
  394. if s.paraalign>paraalign then
  395. paraalign:=s.paraalign;
  396. if s.recordalignmin>recordalignmin then
  397. recordalignmin:=s.recordalignmin;
  398. if (recordalignmax=0) or
  399. ((s.recordalignmax>0) and (s.recordalignmax<recordalignmax)) then
  400. recordalignmax:=s.recordalignmax;
  401. if (maxCrecordalign=0) or
  402. ((s.maxCrecordalign>0) and (s.maxCrecordalign<maxCrecordalign)) then
  403. maxCrecordalign:=s.maxCrecordalign;
  404. end;
  405. end;
  406. {****************************************************************************
  407. Target registration
  408. ****************************************************************************}
  409. procedure RegisterTarget(const r:ttargetinfo);
  410. var
  411. t : ttarget;
  412. begin
  413. t:=r.target;
  414. if assigned(targetinfos[t]) then
  415. writeln('Warning: Target is already registered!')
  416. else
  417. Getmem(targetinfos[t],sizeof(ttargetinfo));
  418. targetinfos[t]^:=r;
  419. end;
  420. procedure RegisterAsmmode(const r:tasmmodeinfo);
  421. var
  422. t : tasmmode;
  423. begin
  424. t:=r.id;
  425. if assigned(asmmodeinfos[t]) then
  426. writeln('Warning: Asmmode is already registered!')
  427. else
  428. Getmem(asmmodeinfos[t],sizeof(tasmmodeinfo));
  429. asmmodeinfos[t]^:=r;
  430. end;
  431. procedure RegisterRes(const r:tresinfo);
  432. var
  433. t : tres;
  434. begin
  435. t:=r.id;
  436. if assigned(resinfos[t]) then
  437. writeln('Warning: resourcecompiler is already registered!')
  438. else
  439. Getmem(resinfos[t],sizeof(tresinfo));
  440. resinfos[t]^:=r;
  441. end;
  442. procedure RegisterAr(const r:tarinfo);
  443. var
  444. t : tar;
  445. begin
  446. t:=r.id;
  447. if assigned(arinfos[t]) then
  448. writeln('Warning: ar is already registered!')
  449. else
  450. Getmem(arinfos[t],sizeof(tarinfo));
  451. arinfos[t]^:=r;
  452. end;
  453. procedure DeregisterInfos;
  454. var
  455. assem : tasm;
  456. target : ttarget;
  457. ar : tar;
  458. asmmode : tasmmode;
  459. res : tres;
  460. begin
  461. for target:=low(ttarget) to high(ttarget) do
  462. if assigned(targetinfos[target]) then
  463. begin
  464. freemem(targetinfos[target],sizeof(ttargetinfo));
  465. targetinfos[target]:=nil;
  466. end;
  467. for assem:=low(tasm) to high(tasm) do
  468. if assigned(asminfos[assem]) then
  469. begin
  470. freemem(asminfos[assem],sizeof(tasminfo));
  471. asminfos[assem]:=nil;
  472. end;
  473. for ar:=low(tar) to high(tar) do
  474. if assigned(arinfos[ar]) then
  475. begin
  476. freemem(arinfos[ar],sizeof(tarinfo));
  477. arinfos[ar]:=nil;
  478. end;
  479. for res:=low(tres) to high(tres) do
  480. if assigned(resinfos[res]) then
  481. begin
  482. freemem(resinfos[res],sizeof(tresinfo));
  483. resinfos[res]:=nil;
  484. end;
  485. for asmmode:=low(tasmmode) to high(tasmmode) do
  486. if assigned(asmmodeinfos[asmmode]) then
  487. begin
  488. freemem(asmmodeinfos[asmmode],sizeof(tasmmodeinfo));
  489. asmmodeinfos[asmmode]:=nil;
  490. end;
  491. end;
  492. {****************************************************************************
  493. Initialization of default target
  494. ****************************************************************************}
  495. procedure default_target(t:ttarget);
  496. begin
  497. set_target(t);
  498. if source_info.name='' then
  499. source_info:=target_info;
  500. end;
  501. procedure set_source(t:ttarget);
  502. begin
  503. { can't use message() here (PFV) }
  504. if source_info.name<>'' then
  505. Writeln('Warning: Source OS Redefined!');
  506. if assigned(targetinfos[t]) then
  507. source_info:=targetinfos[t]^
  508. else
  509. Writeln('Warning: Source OS Not Supported!');
  510. end;
  511. procedure InitSystems;
  512. begin
  513. { first get source OS }
  514. source_info.name:='';
  515. { please note then we use cpu86 and cpu68 here on purpose !! }
  516. {$ifdef cpu86}
  517. {$ifdef GO32V2}
  518. set_source(target_i386_GO32V2);
  519. {$else}
  520. {$ifdef OS2}
  521. set_source(target_i386_OS2);
  522. if (OS_Mode = osDOS) or (OS_Mode = osDPMI) then
  523. source_info.scriptext := '.bat';
  524. { OS/2 via EMX can be run under DOS as well }
  525. {$else}
  526. {$ifdef WIN32}
  527. {$ifdef WDOSX}
  528. set_source(target_i386_wdosx);
  529. {$else}
  530. set_source(target_i386_WIN32);
  531. {$endif}
  532. {$else}
  533. {$ifdef FreeBSD}
  534. set_source(target_i386_FreeBSD);
  535. {$else}
  536. {$ifdef netbsd}
  537. set_source(target_i386_NetBSD);
  538. {$else}
  539. {$ifdef sunos}
  540. set_source(target_i386_sunos);
  541. {$else}
  542. {$ifdef beos}
  543. set_source(target_i386_beos);
  544. {$else}
  545. { Must be the last as some freebsd also
  546. defined linux }
  547. {$ifdef linux}
  548. set_source(target_i386_linux);
  549. {$else}
  550. {$error Error setting source OS}
  551. {$endif linux}
  552. {$endif beos}
  553. {$endif sunos}
  554. {$endif netbsd}
  555. {$endif freebsd}
  556. {$endif win32}
  557. {$endif os2}
  558. {$endif go32v2}
  559. {$endif cpu86}
  560. {$ifdef cpu68}
  561. {$ifdef AMIGA}
  562. set_source(target_m68k_Amiga);
  563. {$else}
  564. {$ifdef ATARI}
  565. set_source(target_m68k_Atari);
  566. {$else}
  567. {$ifdef MACOS}
  568. set_source(target_m68k_MAC);
  569. {$else}
  570. {$ifdef linux}
  571. set_source(target_m68k_linux);
  572. {$endif linux}
  573. {$endif macos}
  574. {$endif atari}
  575. {$endif amiga}
  576. {$endif cpu68}
  577. { Now default target, this is dependent on the i386 or m68k define,
  578. when the define is the same as the current cpu then we use the source
  579. os, else we pick a default }
  580. {$ifdef i386}
  581. {$ifdef cpu86}
  582. default_target(source_info.target);
  583. {$else cpu86}
  584. default_target(target_i386_linux);
  585. {$endif cpu86}
  586. {$endif i386}
  587. {$ifdef m68k}
  588. {$ifdef cpu68}
  589. default_target(source_info.target);
  590. {$else cpu68}
  591. default_target(target_m68k_linux);
  592. {$endif cpu68}
  593. {$endif m68k}
  594. {$ifdef alpha}
  595. {$ifdef cpualpha}
  596. default_target(source_info.target);
  597. {$else cpualpha}
  598. default_target(target_alpha_linux);
  599. {$endif cpualpha}
  600. {$endif alpha}
  601. {$ifdef powerpc}
  602. {$ifdef cpuppc}
  603. default_target(source_info.target);
  604. {$else cpuppc}
  605. default_target(target_powerpc_linux);
  606. {$endif cpuppc}
  607. {$endif powerpc}
  608. end;
  609. initialization
  610. finalization
  611. DeregisterInfos;
  612. end.
  613. {
  614. $Log$
  615. Revision 1.37 2002-04-07 10:20:15 carl
  616. + added SPARC targets
  617. + added VM target
  618. Revision 1.36 2002/04/04 19:18:06 carl
  619. - removed cmnts
  620. }