systems.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  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,target_i386_beos,
  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,ld_i386_beos,
  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. extradefines : string[40];
  119. sharedlibext : string[10];
  120. staticlibext,
  121. sourceext,
  122. pasext,
  123. exeext,
  124. defext,
  125. scriptext,
  126. smartext,
  127. unitext,
  128. unitlibext,
  129. asmext,
  130. objext,
  131. resext,
  132. resobjext : string[4];
  133. staticlibprefix : string[4];
  134. sharedlibprefix : string[4];
  135. Cprefix : string[2];
  136. newline : string[2];
  137. assem : tasm;
  138. assemextern : tasm; { external assembler, used by -a }
  139. link : tld;
  140. linkextern : tld; { external linker, used by -s }
  141. ar : tar;
  142. res : tres;
  143. endian : tendian;
  144. stackalignment : word;
  145. maxCrecordalignment : word;
  146. size_of_pointer : byte;
  147. size_of_longint : byte;
  148. heapsize,
  149. maxheapsize,
  150. stacksize : longint;
  151. DllScanSupported : boolean;
  152. use_bound_instruction : boolean;
  153. use_function_relative_addresses : boolean;
  154. end;
  155. pasmmodeinfo = ^tasmmodeinfo;
  156. tasmmodeinfo = packed record
  157. id : tasmmode;
  158. idtxt : string[8];
  159. end;
  160. const
  161. { alias for supported_target field in tasminfo }
  162. target_any = target_none;
  163. var
  164. targetinfos : array[ttarget] of ptargetinfo;
  165. asminfos : array[tasm] of pasminfo;
  166. arinfos : array[tar] of parinfo;
  167. resinfos : array[tres] of presinfo;
  168. asmmodeinfos : array[tasmmode] of pasmmodeinfo;
  169. source_info : ttargetinfo;
  170. target_cpu : ttargetcpu;
  171. target_info : ttargetinfo;
  172. target_asm : tasminfo;
  173. target_ar : tarinfo;
  174. target_res : tresinfo;
  175. target_path : string[12]; { for rtl/<X>/,fcl/<X>/, etc. }
  176. function set_target(t:ttarget):boolean;
  177. function set_target_asm(t:tasm):boolean;
  178. function set_target_ar(t:tar):boolean;
  179. function set_target_res(t:tres):boolean;
  180. function set_target_by_string(const s : string) : boolean;
  181. function set_target_asm_by_string(const s : string) : boolean;
  182. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  183. procedure RegisterTarget(const r:ttargetinfo);
  184. procedure RegisterAsmMode(const r:tasmmodeinfo);
  185. procedure RegisterRes(const r:tresinfo);
  186. procedure RegisterAr(const r:tarinfo);
  187. procedure InitSystems;
  188. implementation
  189. uses
  190. cutils;
  191. {****************************************************************************
  192. Target setting
  193. ****************************************************************************}
  194. function set_target(t:ttarget):boolean;
  195. begin
  196. set_target:=false;
  197. if assigned(targetinfos[t]) then
  198. begin
  199. target_info:=targetinfos[t]^;
  200. set_target_asm(target_info.assem);
  201. set_target_ar(target_info.ar);
  202. set_target_res(target_info.res);
  203. target_path:=lower(target_info.shortname);
  204. target_cpu:=target_info.cpu;
  205. set_target:=true;
  206. exit;
  207. end;
  208. end;
  209. function set_target_asm(t:tasm):boolean;
  210. begin
  211. set_target_asm:=false;
  212. if assigned(asminfos[t]) then
  213. begin
  214. target_asm:=asminfos[t]^;
  215. set_target_asm:=true;
  216. exit;
  217. end;
  218. end;
  219. function set_target_ar(t:tar):boolean;
  220. begin
  221. set_target_ar:=false;
  222. if assigned(arinfos[t]) then
  223. begin
  224. target_ar:=arinfos[t]^;
  225. set_target_ar:=true;
  226. exit;
  227. end;
  228. end;
  229. function set_target_res(t:tres):boolean;
  230. begin
  231. set_target_res:=false;
  232. if assigned(resinfos[t]) then
  233. begin
  234. target_res:=resinfos[t]^;
  235. set_target_res:=true;
  236. exit;
  237. end;
  238. end;
  239. function set_target_by_string(const s : string) : boolean;
  240. var
  241. hs : string;
  242. t : ttarget;
  243. begin
  244. set_target_by_string:=false;
  245. { this should be case insensitive !! PM }
  246. hs:=upper(s);
  247. for t:=low(ttarget) to high(ttarget) do
  248. if assigned(targetinfos[t]) and
  249. (upper(targetinfos[t]^.shortname)=hs) then
  250. begin
  251. set_target_by_string:=set_target(t);
  252. exit;
  253. end;
  254. end;
  255. function set_target_asm_by_string(const s : string) : boolean;
  256. var
  257. hs : string;
  258. t : tasm;
  259. begin
  260. set_target_asm_by_string:=false;
  261. { this should be case insensitive !! PM }
  262. hs:=upper(s);
  263. for t:=low(tasm) to high(tasm) do
  264. if assigned(asminfos[t]) and
  265. (asminfos[t]^.idtxt=hs) then
  266. begin
  267. set_target_asm_by_string:=set_target_asm(t);
  268. exit;
  269. end;
  270. end;
  271. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  272. var
  273. hs : string;
  274. ht : tasmmode;
  275. begin
  276. set_asmmode_by_string:=false;
  277. { this should be case insensitive !! PM }
  278. hs:=upper(s);
  279. for ht:=low(tasmmode) to high(tasmmode) do
  280. if assigned(asmmodeinfos[ht]) and
  281. (asmmodeinfos[ht]^.idtxt=hs) then
  282. begin
  283. t:=asmmodeinfos[ht]^.id;
  284. set_asmmode_by_string:=true;
  285. end;
  286. end;
  287. {****************************************************************************
  288. Target registration
  289. ****************************************************************************}
  290. procedure RegisterTarget(const r:ttargetinfo);
  291. var
  292. t : ttarget;
  293. begin
  294. t:=r.target;
  295. if assigned(targetinfos[t]) then
  296. writeln('Warning: Target is already registered!')
  297. else
  298. Getmem(targetinfos[t],sizeof(ttargetinfo));
  299. targetinfos[t]^:=r;
  300. end;
  301. procedure RegisterAsmmode(const r:tasmmodeinfo);
  302. var
  303. t : tasmmode;
  304. begin
  305. t:=r.id;
  306. if assigned(asmmodeinfos[t]) then
  307. writeln('Warning: Asmmode is already registered!')
  308. else
  309. Getmem(asmmodeinfos[t],sizeof(tasmmodeinfo));
  310. asmmodeinfos[t]^:=r;
  311. end;
  312. procedure RegisterRes(const r:tresinfo);
  313. var
  314. t : tres;
  315. begin
  316. t:=r.id;
  317. if assigned(resinfos[t]) then
  318. writeln('Warning: resourcecompiler is already registered!')
  319. else
  320. Getmem(resinfos[t],sizeof(tresinfo));
  321. resinfos[t]^:=r;
  322. end;
  323. procedure RegisterAr(const r:tarinfo);
  324. var
  325. t : tar;
  326. begin
  327. t:=r.id;
  328. if assigned(arinfos[t]) then
  329. writeln('Warning: ar is already registered!')
  330. else
  331. Getmem(arinfos[t],sizeof(tarinfo));
  332. arinfos[t]^:=r;
  333. end;
  334. procedure DeregisterInfos;
  335. var
  336. assem : tasm;
  337. target : ttarget;
  338. ar : tar;
  339. asmmode : tasmmode;
  340. res : tres;
  341. begin
  342. for target:=low(ttarget) to high(ttarget) do
  343. if assigned(targetinfos[target]) then
  344. begin
  345. freemem(targetinfos[target],sizeof(ttargetinfo));
  346. targetinfos[target]:=nil;
  347. end;
  348. for assem:=low(tasm) to high(tasm) do
  349. if assigned(asminfos[assem]) then
  350. begin
  351. freemem(asminfos[assem],sizeof(tasminfo));
  352. asminfos[assem]:=nil;
  353. end;
  354. for ar:=low(tar) to high(tar) do
  355. if assigned(arinfos[ar]) then
  356. begin
  357. freemem(arinfos[ar],sizeof(tarinfo));
  358. arinfos[ar]:=nil;
  359. end;
  360. for res:=low(tres) to high(tres) do
  361. if assigned(resinfos[res]) then
  362. begin
  363. freemem(resinfos[res],sizeof(tresinfo));
  364. resinfos[res]:=nil;
  365. end;
  366. for asmmode:=low(tasmmode) to high(tasmmode) do
  367. if assigned(asmmodeinfos[asmmode]) then
  368. begin
  369. freemem(asmmodeinfos[asmmode],sizeof(tasmmodeinfo));
  370. asmmodeinfos[asmmode]:=nil;
  371. end;
  372. end;
  373. {****************************************************************************
  374. Initialization of default target
  375. ****************************************************************************}
  376. procedure default_target(t:ttarget);
  377. begin
  378. set_target(t);
  379. if source_info.name='' then
  380. source_info:=target_info;
  381. end;
  382. procedure set_source(t:ttarget);
  383. begin
  384. { can't use message() here (PFV) }
  385. if source_info.name<>'' then
  386. Writeln('Warning: Source OS Redefined!');
  387. if assigned(targetinfos[t]) then
  388. source_info:=targetinfos[t]^
  389. else
  390. Writeln('Warning: Source OS Not Supported!');
  391. end;
  392. procedure InitSystems;
  393. begin
  394. { first get source OS }
  395. source_info.name:='';
  396. { please note then we use cpu86 and cpu68 here on purpose !! }
  397. {$ifdef cpu86}
  398. {$ifdef GO32V1}
  399. set_source(target_i386_GO32V1);
  400. {$else}
  401. {$ifdef GO32V2}
  402. set_source(target_i386_GO32V2);
  403. {$else}
  404. {$ifdef OS2}
  405. set_source(target_i386_OS2);
  406. if (target_Mode = osDOS) or (target_Mode = osDPMI) then
  407. source_info.scriptext := '.bat';
  408. { OS/2 via EMX can be run under DOS as well }
  409. {$else}
  410. {$ifdef WIN32}
  411. set_source(target_i386_WIN32);
  412. {$else}
  413. {$Ifdef BSD}
  414. set_source(target_i386_FreeBSD);
  415. {$else}
  416. {$ifdef sunos}
  417. set_source(target_i386_sunos);
  418. {$else}
  419. { Must be the last as some freebsd also
  420. defined linux }
  421. {$ifdef Linux}
  422. set_source(target_i386_LINUX);
  423. {$endif linux}
  424. {$endif sunos}
  425. {$endif bsd}
  426. {$endif win32}
  427. {$endif os2}
  428. {$endif go32v2}
  429. {$endif go32v1}
  430. {$endif cpu86}
  431. {$ifdef cpu68}
  432. {$ifdef AMIGA}
  433. set_source(target_m68k_Amiga);
  434. {$else}
  435. {$ifdef ATARI}
  436. set_source(target_m68k_Atari);
  437. {$else}
  438. {$ifdef MACOS}
  439. set_source(target_m68k_MAC);
  440. {$else}
  441. {$ifdef LINUX}
  442. set_source(target_m68k_linux);
  443. {$endif linux}
  444. {$endif macos}
  445. {$endif atari}
  446. {$endif amiga}
  447. {$endif cpu68}
  448. { Now default target !! }
  449. {$ifdef i386}
  450. {$ifdef GO32V1}
  451. default_target(target_i386_GO32V1);
  452. {$else}
  453. {$ifdef GO32V2}
  454. default_target(target_i386_GO32V2);
  455. {$else}
  456. {$ifdef OS2}
  457. default_target(target_i386_OS2);
  458. {$else}
  459. {$ifdef LINUX}
  460. {$ifdef BSD}
  461. default_target(target_i386_FreeBSD);
  462. {$else}
  463. default_target(target_i386_LINUX);
  464. {$endif}
  465. {$else}
  466. {$ifdef WIN32}
  467. default_target(target_i386_WIN32);
  468. {$else}
  469. default_target(target_i386_GO32V2);
  470. {$endif win32}
  471. {$endif linux}
  472. {$endif os2}
  473. {$endif go32v2}
  474. {$endif go32v1}
  475. {$endif i386}
  476. {$ifdef m68k}
  477. {$ifdef AMIGA}
  478. default_target(target_m68k_Amiga);
  479. {$else}
  480. {$ifdef ATARI}
  481. default_target(target_m68k_Atari);
  482. {$else}
  483. {$ifdef MACOS}
  484. default_target(target_m68k_Mac);
  485. {$else}
  486. {$ifdef LINUX}
  487. default_target(target_m68k_linux);
  488. {$else}
  489. default_target(target_m68k_Amiga);
  490. {$endif linux}
  491. {$endif macos}
  492. {$endif atari}
  493. {$endif amiga}
  494. {$endif m68k}
  495. {$ifdef alpha}
  496. default_target(target_alpha_linux);
  497. {$endif alpha}
  498. {$ifdef powerpc}
  499. default_target(target_powerpc_linux);
  500. {$endif powerpc}
  501. end;
  502. initialization
  503. finalization
  504. DeregisterInfos;
  505. end.
  506. {
  507. $Log$
  508. Revision 1.19 2001-06-03 20:21:08 peter
  509. * Kylix fixes, mostly case names of units
  510. Revision 1.18 2001/06/03 15:15:31 peter
  511. * dllprt0 stub for linux shared libs
  512. * pass -init and -fini for linux shared libs
  513. * libprefix splitted into staticlibprefix and sharedlibprefix
  514. Revision 1.17 2001/06/02 19:21:45 peter
  515. * extradefines field added to target_info, so that targets don't
  516. need to put code in options.pas for it
  517. Revision 1.16 2001/04/18 22:02:00 peter
  518. * registration of targets and assemblers
  519. Revision 1.15 2001/03/06 18:28:02 peter
  520. * patch from Pavel with a new and much faster DLL Scanner for
  521. automatic importing so $linklib works for DLLs. Thanks Pavel!
  522. Revision 1.14 2001/02/26 19:44:55 peter
  523. * merged generic m68k updates from fixes branch
  524. Revision 1.13 2001/02/20 21:36:40 peter
  525. * tasm/masm fixes merged
  526. Revision 1.12 2001/01/06 20:15:43 peter
  527. * merged libp library prefix
  528. Revision 1.11 2000/10/15 09:08:58 peter
  529. * use System for the systemunit instead of target dependent
  530. Revision 1.10 2000/09/24 21:12:41 hajny
  531. * OS/2 stack alignment corrected + default stack increased
  532. Revision 1.9 2000/09/24 15:06:30 peter
  533. * use defines.inc
  534. Revision 1.8 2000/09/20 10:49:39 marco
  535. * Set writer to elf. (Only a prob for smart with -OG3p3r)
  536. Revision 1.7 2000/09/16 12:22:52 peter
  537. * freebsd support merged
  538. Revision 1.6 2000/09/11 17:00:23 florian
  539. + first implementation of Netware Module support, thanks to
  540. Armin Diehl ([email protected]) for providing the patches
  541. Revision 1.5 2000/08/12 19:14:59 peter
  542. * ELF writer works now also with -g
  543. * ELF writer is default again for linux
  544. Revision 1.4 2000/07/14 21:29:38 michael
  545. * Back to external assembler till peter fixes gdb
  546. Revision 1.3 2000/07/13 12:08:28 michael
  547. + patched to 1.1.0 with former 1.09patch from peter
  548. Revision 1.2 2000/07/13 11:32:50 michael
  549. + removed logs
  550. }