systems.pas 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  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 progsam 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. ttargetcpu=(no_cpu
  25. ,i386,m68k,alpha,powerpc
  26. );
  27. tprocessors = (no_processor
  28. ,Class386,ClassP5,ClassP6
  29. ,MC68000,MC68100,MC68020
  30. );
  31. tsection=(sec_none,
  32. sec_code,sec_data,sec_bss,
  33. sec_idata2,sec_idata4,sec_idata5,sec_idata6,sec_idata7,sec_edata,
  34. sec_stab,sec_stabstr
  35. );
  36. tasmmode= (asmmode_none
  37. ,asmmode_i386_direct,asmmode_i386_att,asmmode_i386_intel
  38. ,asmmode_m68k_mot
  39. ,asmmode_alpha_direct
  40. ,asmmode_powerpc_direct
  41. );
  42. ttarget = (target_none,
  43. target_i386_GO32V1,target_i386_GO32V2,target_i386_linux,
  44. target_i386_OS2,target_i386_Win32,target_i386_freebsd,
  45. target_i386_Netware,target_i386_sunos,
  46. target_m68k_Amiga,target_m68k_Atari,target_m68k_Mac,
  47. target_m68k_linux,target_m68k_PalmOS,
  48. target_alpha_linux,
  49. target_powerpc_linux,target_powerpc_macos
  50. );
  51. tasm = (as_none
  52. ,as_i386_as,as_i386_as_aout,as_i386_asw,
  53. as_i386_nasmcoff,as_i386_nasmwin32,
  54. as_i386_nasmelf,as_i386_nasmobj,
  55. as_i386_tasm,as_i386_masm,
  56. as_i386_dbg,as_i386_coff,as_i386_pecoff,as_i386_elf32
  57. ,as_m68k_as,as_m68k_gas,as_m68k_mit,as_m68k_mot,as_m68k_mpw
  58. ,as_alpha_as
  59. ,as_powerpc_as,as_powerpc_mpw
  60. );
  61. tld = (ld_none,
  62. ld_i386_GO32V1,ld_i386_GO32V2,ld_i386_linux,
  63. ld_i386_OS2,ld_i386_Win32,ld_i386_freebsd,
  64. ld_i386_Netware,ld_i386_sunos,
  65. ld_m68k_Amiga,ld_m68k_Atari,ld_m68k_Mac,
  66. ld_m68k_linux,ld_m68k_PalmOS,
  67. ld_alpha_linux,
  68. ld_powerpc_linux,ld_powerpc_macos
  69. );
  70. tar = (ar_none
  71. ,ar_gnu_ar,ar_gnu_arw
  72. );
  73. tres = (res_none
  74. ,res_gnu_windres,res_emxbind
  75. );
  76. {*****************************************************************************
  77. Structures
  78. *****************************************************************************}
  79. type
  80. pasminfo = ^tasminfo;
  81. tasminfo = packed record
  82. id : tasm;
  83. idtxt : string[9];
  84. asmbin : string[8];
  85. asmcmd : string[50];
  86. supported_target : ttarget;
  87. outputbinary,
  88. allowdirect,
  89. externals,
  90. needar,
  91. labelprefix_only_inside_procedure : boolean;
  92. labelprefix : string[3];
  93. comment : string[2];
  94. secnames : array[tsection] of string[20];
  95. end;
  96. parinfo = ^tarinfo;
  97. tarinfo = packed record
  98. id : tar;
  99. arcmd : string[50];
  100. end;
  101. presinfo = ^tresinfo;
  102. tresinfo = packed record
  103. id : tres;
  104. resbin : string[8];
  105. rescmd : string[50];
  106. end;
  107. ttargetflags = (tf_none,
  108. tf_supports_stack_checking,tf_need_export,tf_needs_isconsole
  109. );
  110. ptargetinfo = ^ttargetinfo;
  111. ttargetinfo = packed record
  112. target : ttarget;
  113. name : string[30];
  114. shortname : string[9];
  115. flags : set of ttargetflags;
  116. cpu : ttargetcpu;
  117. unit_env : string[12];
  118. sharedlibext : string[10];
  119. staticlibext,
  120. sourceext,
  121. pasext,
  122. exeext,
  123. defext,
  124. scriptext,
  125. smartext,
  126. unitext,
  127. unitlibext,
  128. asmext,
  129. objext,
  130. resext,
  131. resobjext : string[4];
  132. libprefix : string[4];
  133. Cprefix : string[2];
  134. newline : string[2];
  135. assem : tasm;
  136. assemextern : tasm; { external assembler, used by -a }
  137. link : tld;
  138. linkextern : tld; { external linker, used by -s }
  139. ar : tar;
  140. res : tres;
  141. endian : tendian;
  142. stackalignment : word;
  143. maxCrecordalignment : word;
  144. size_of_pointer : byte;
  145. size_of_longint : byte;
  146. heapsize,
  147. maxheapsize,
  148. stacksize : longint;
  149. DllScanSupported : boolean;
  150. use_bound_instruction : boolean;
  151. use_function_relative_addresses : boolean;
  152. end;
  153. pasmmodeinfo = ^tasmmodeinfo;
  154. tasmmodeinfo = packed record
  155. id : tasmmode;
  156. idtxt : string[8];
  157. end;
  158. const
  159. { alias for supported_target field in tasminfo }
  160. target_any = target_none;
  161. var
  162. targetinfos : array[ttarget] of ptargetinfo;
  163. asminfos : array[tasm] of pasminfo;
  164. arinfos : array[tar] of parinfo;
  165. resinfos : array[tres] of presinfo;
  166. asmmodeinfos : array[tasmmode] of pasmmodeinfo;
  167. source_info : ttargetinfo;
  168. target_cpu : ttargetcpu;
  169. target_info : ttargetinfo;
  170. target_asm : tasminfo;
  171. target_ar : tarinfo;
  172. target_res : tresinfo;
  173. target_path : string[12]; { for rtl/<X>/,fcl/<X>/, etc. }
  174. function set_target(t:ttarget):boolean;
  175. function set_target_asm(t:tasm):boolean;
  176. function set_target_ar(t:tar):boolean;
  177. function set_target_res(t:tres):boolean;
  178. function set_target_by_string(const s : string) : boolean;
  179. function set_target_asm_by_string(const s : string) : boolean;
  180. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  181. procedure RegisterTarget(const r:ttargetinfo);
  182. procedure RegisterAsmMode(const r:tasmmodeinfo);
  183. procedure RegisterRes(const r:tresinfo);
  184. procedure RegisterAr(const r:tarinfo);
  185. procedure InitSystems;
  186. implementation
  187. uses
  188. cutils;
  189. {****************************************************************************
  190. Target setting
  191. ****************************************************************************}
  192. function set_target(t:ttarget):boolean;
  193. begin
  194. set_target:=false;
  195. if assigned(targetinfos[t]) then
  196. begin
  197. target_info:=targetinfos[t]^;
  198. set_target_asm(target_info.assem);
  199. set_target_ar(target_info.ar);
  200. set_target_res(target_info.res);
  201. target_path:=lower(target_info.shortname);
  202. target_cpu:=target_info.cpu;
  203. set_target:=true;
  204. exit;
  205. end;
  206. end;
  207. function set_target_asm(t:tasm):boolean;
  208. begin
  209. set_target_asm:=false;
  210. if assigned(asminfos[t]) then
  211. begin
  212. target_asm:=asminfos[t]^;
  213. set_target_asm:=true;
  214. exit;
  215. end;
  216. end;
  217. function set_target_ar(t:tar):boolean;
  218. begin
  219. set_target_ar:=false;
  220. if assigned(arinfos[t]) then
  221. begin
  222. target_ar:=arinfos[t]^;
  223. set_target_ar:=true;
  224. exit;
  225. end;
  226. end;
  227. function set_target_res(t:tres):boolean;
  228. begin
  229. set_target_res:=false;
  230. if assigned(resinfos[t]) then
  231. begin
  232. target_res:=resinfos[t]^;
  233. set_target_res:=true;
  234. exit;
  235. end;
  236. end;
  237. function set_target_by_string(const s : string) : boolean;
  238. var
  239. hs : string;
  240. t : ttarget;
  241. begin
  242. set_target_by_string:=false;
  243. { this should be case insensitive !! PM }
  244. hs:=upper(s);
  245. for t:=low(ttarget) to high(ttarget) do
  246. if assigned(targetinfos[t]) and
  247. (upper(targetinfos[t]^.shortname)=hs) then
  248. begin
  249. set_target_by_string:=set_target(t);
  250. exit;
  251. end;
  252. end;
  253. function set_target_asm_by_string(const s : string) : boolean;
  254. var
  255. hs : string;
  256. t : tasm;
  257. begin
  258. set_target_asm_by_string:=false;
  259. { this should be case insensitive !! PM }
  260. hs:=upper(s);
  261. for t:=low(tasm) to high(tasm) do
  262. if assigned(asminfos[t]) and
  263. (asminfos[t]^.idtxt=hs) then
  264. begin
  265. set_target_asm_by_string:=set_target_asm(t);
  266. exit;
  267. end;
  268. end;
  269. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  270. var
  271. hs : string;
  272. ht : tasmmode;
  273. begin
  274. set_asmmode_by_string:=false;
  275. { this should be case insensitive !! PM }
  276. hs:=upper(s);
  277. for ht:=low(tasmmode) to high(tasmmode) do
  278. if assigned(asmmodeinfos[ht]) and
  279. (asmmodeinfos[ht]^.idtxt=hs) then
  280. begin
  281. t:=asmmodeinfos[ht]^.id;
  282. set_asmmode_by_string:=true;
  283. end;
  284. end;
  285. {****************************************************************************
  286. Target registration
  287. ****************************************************************************}
  288. procedure RegisterTarget(const r:ttargetinfo);
  289. var
  290. t : ttarget;
  291. begin
  292. t:=r.target;
  293. if assigned(targetinfos[t]) then
  294. writeln('Warning: Target is already registered!')
  295. else
  296. Getmem(targetinfos[t],sizeof(ttargetinfo));
  297. targetinfos[t]^:=r;
  298. end;
  299. procedure RegisterAsmmode(const r:tasmmodeinfo);
  300. var
  301. t : tasmmode;
  302. begin
  303. t:=r.id;
  304. if assigned(asmmodeinfos[t]) then
  305. writeln('Warning: Asmmode is already registered!')
  306. else
  307. Getmem(asmmodeinfos[t],sizeof(tasmmodeinfo));
  308. asmmodeinfos[t]^:=r;
  309. end;
  310. procedure RegisterRes(const r:tresinfo);
  311. var
  312. t : tres;
  313. begin
  314. t:=r.id;
  315. if assigned(resinfos[t]) then
  316. writeln('Warning: resourcecompiler is already registered!')
  317. else
  318. Getmem(resinfos[t],sizeof(tresinfo));
  319. resinfos[t]^:=r;
  320. end;
  321. procedure RegisterAr(const r:tarinfo);
  322. var
  323. t : tar;
  324. begin
  325. t:=r.id;
  326. if assigned(arinfos[t]) then
  327. writeln('Warning: ar is already registered!')
  328. else
  329. Getmem(arinfos[t],sizeof(tarinfo));
  330. arinfos[t]^:=r;
  331. end;
  332. procedure DeregisterInfos;
  333. var
  334. assem : tasm;
  335. target : ttarget;
  336. ar : tar;
  337. asmmode : tasmmode;
  338. res : tres;
  339. begin
  340. for target:=low(ttarget) to high(ttarget) do
  341. if assigned(targetinfos[target]) then
  342. begin
  343. freemem(targetinfos[target],sizeof(ttargetinfo));
  344. targetinfos[target]:=nil;
  345. end;
  346. for assem:=low(tasm) to high(tasm) do
  347. if assigned(asminfos[assem]) then
  348. begin
  349. freemem(asminfos[assem],sizeof(tasminfo));
  350. asminfos[assem]:=nil;
  351. end;
  352. for ar:=low(tar) to high(tar) do
  353. if assigned(arinfos[ar]) then
  354. begin
  355. freemem(arinfos[ar],sizeof(tarinfo));
  356. arinfos[ar]:=nil;
  357. end;
  358. for res:=low(tres) to high(tres) do
  359. if assigned(resinfos[res]) then
  360. begin
  361. freemem(resinfos[res],sizeof(tresinfo));
  362. resinfos[res]:=nil;
  363. end;
  364. for asmmode:=low(tasmmode) to high(tasmmode) do
  365. if assigned(asmmodeinfos[asmmode]) then
  366. begin
  367. freemem(asmmodeinfos[asmmode],sizeof(tasmmodeinfo));
  368. asmmodeinfos[asmmode]:=nil;
  369. end;
  370. end;
  371. {****************************************************************************
  372. Initialization of default target
  373. ****************************************************************************}
  374. procedure default_target(t:ttarget);
  375. begin
  376. set_target(t);
  377. if source_info.name='' then
  378. source_info:=target_info;
  379. end;
  380. procedure set_source(t:ttarget);
  381. begin
  382. { can't use message() here (PFV) }
  383. if source_info.name<>'' then
  384. Writeln('Warning: Source OS Redefined!');
  385. if assigned(targetinfos[t]) then
  386. source_info:=targetinfos[t]^
  387. else
  388. Writeln('Warning: Source OS Not Supported!');
  389. end;
  390. procedure InitSystems;
  391. begin
  392. { first get source OS }
  393. source_info.name:='';
  394. { please note then we use cpu86 and cpu68 here on purpose !! }
  395. {$ifdef cpu86}
  396. {$ifdef GO32V1}
  397. set_source(target_i386_GO32V1);
  398. {$else}
  399. {$ifdef GO32V2}
  400. set_source(target_i386_GO32V2);
  401. {$else}
  402. {$ifdef OS2}
  403. set_source(target_i386_OS2);
  404. if (target_Mode = osDOS) or (target_Mode = osDPMI) then
  405. source_info.scriptext := '.bat';
  406. { OS/2 via EMX can be run under DOS as well }
  407. {$else}
  408. {$ifdef WIN32}
  409. set_source(target_i386_WIN32);
  410. {$else}
  411. {$Ifdef BSD}
  412. set_source(target_i386_FreeBSD);
  413. {$else}
  414. {$ifdef sunos}
  415. set_source(target_i386_sunos);
  416. {$else}
  417. { Must be the last as some freebsd also
  418. defined linux }
  419. {$ifdef Linux}
  420. set_source(target_i386_LINUX);
  421. {$endif linux}
  422. {$endif sunos}
  423. {$endif bsd}
  424. {$endif win32}
  425. {$endif os2}
  426. {$endif go32v2}
  427. {$endif go32v1}
  428. {$endif cpu86}
  429. {$ifdef cpu68}
  430. {$ifdef AMIGA}
  431. set_source(target_m68k_Amiga);
  432. {$else}
  433. {$ifdef ATARI}
  434. set_source(target_m68k_Atari);
  435. {$else}
  436. {$ifdef MACOS}
  437. set_source(target_m68k_MAC);
  438. {$else}
  439. {$ifdef LINUX}
  440. set_source(target_m68k_linux);
  441. {$endif linux}
  442. {$endif macos}
  443. {$endif atari}
  444. {$endif amiga}
  445. {$endif cpu68}
  446. { Now default target !! }
  447. {$ifdef i386}
  448. {$ifdef GO32V1}
  449. default_target(target_i386_GO32V1);
  450. {$else}
  451. {$ifdef GO32V2}
  452. default_target(target_i386_GO32V2);
  453. {$else}
  454. {$ifdef OS2}
  455. default_target(target_i386_OS2);
  456. {$else}
  457. {$ifdef LINUX}
  458. {$ifdef BSD}
  459. default_target(target_i386_FreeBSD);
  460. {$else}
  461. default_target(target_i386_LINUX);
  462. {$endif}
  463. {$else}
  464. {$ifdef WIN32}
  465. default_target(target_i386_WIN32);
  466. {$else}
  467. default_target(target_i386_GO32V2);
  468. {$endif win32}
  469. {$endif linux}
  470. {$endif os2}
  471. {$endif go32v2}
  472. {$endif go32v1}
  473. {$endif i386}
  474. {$ifdef m68k}
  475. {$ifdef AMIGA}
  476. default_target(target_m68k_Amiga);
  477. {$else}
  478. {$ifdef ATARI}
  479. default_target(target_m68k_Atari);
  480. {$else}
  481. {$ifdef MACOS}
  482. default_target(target_m68k_Mac);
  483. {$else}
  484. {$ifdef LINUX}
  485. default_target(target_m68k_linux);
  486. {$else}
  487. default_target(target_m68k_Amiga);
  488. {$endif linux}
  489. {$endif macos}
  490. {$endif atari}
  491. {$endif amiga}
  492. {$endif m68k}
  493. {$ifdef alpha}
  494. default_target(target_alpha_linux);
  495. {$endif alpha}
  496. {$ifdef powerpc}
  497. default_target(target_powerpc_linux);
  498. {$endif powerpc}
  499. end;
  500. finalization
  501. DeregisterInfos;
  502. end.
  503. {
  504. $Log$
  505. Revision 1.16 2001-04-18 22:02:00 peter
  506. * registration of targets and assemblers
  507. Revision 1.15 2001/03/06 18:28:02 peter
  508. * patch from Pavel with a new and much faster DLL Scanner for
  509. automatic importing so $linklib works for DLLs. Thanks Pavel!
  510. Revision 1.14 2001/02/26 19:44:55 peter
  511. * merged generic m68k updates from fixes branch
  512. Revision 1.13 2001/02/20 21:36:40 peter
  513. * tasm/masm fixes merged
  514. Revision 1.12 2001/01/06 20:15:43 peter
  515. * merged libp library prefix
  516. Revision 1.11 2000/10/15 09:08:58 peter
  517. * use System for the systemunit instead of target dependent
  518. Revision 1.10 2000/09/24 21:12:41 hajny
  519. * OS/2 stack alignment corrected + default stack increased
  520. Revision 1.9 2000/09/24 15:06:30 peter
  521. * use defines.inc
  522. Revision 1.8 2000/09/20 10:49:39 marco
  523. * Set writer to elf. (Only a prob for smart with -OG3p3r)
  524. Revision 1.7 2000/09/16 12:22:52 peter
  525. * freebsd support merged
  526. Revision 1.6 2000/09/11 17:00:23 florian
  527. + first implementation of Netware Module support, thanks to
  528. Armin Diehl ([email protected]) for providing the patches
  529. Revision 1.5 2000/08/12 19:14:59 peter
  530. * ELF writer works now also with -g
  531. * ELF writer is default again for linux
  532. Revision 1.4 2000/07/14 21:29:38 michael
  533. * Back to external assembler till peter fixes gdb
  534. Revision 1.3 2000/07/13 12:08:28 michael
  535. + patched to 1.1.0 with former 1.09patch from peter
  536. Revision 1.2 2000/07/13 11:32:50 michael
  537. + removed logs
  538. }