mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 13:31:40 +01:00 
			
		
		
		
	 c13ff3729b
			
		
	
	
		c13ff3729b
		
	
	
	
	
		
			
			+ darwin/ppc64 support
    + val/str/read(ln)/write(ln) support for enums
    + simple cse at the node tree level
    + if-node simplify support
    + simple ssa support for memory locations
    + support for optional overflow/rangecheck boolean parameters for
      operators
    * a lot of unification of the ppc32/ppc64 code generators
........
r6380 | jonas | 2007-02-08 21:25:36 +0100 (Thu, 08 Feb 2007) | 4 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ncgld.pas
   M /branches/fpc_2_3/compiler/tgobj.pas
   A /branches/fpc_2_3/tests/webtbs/tw8283.pp
  + support for replacing the memory location of a temp (including
    local variables) with that of another temp to avoid unnecessary
    copies (mantis #8283)
........
r6381 | jonas | 2007-02-08 22:53:36 +0100 (Thu, 08 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/nflw.pas
   A /branches/fpc_2_3/tests/webtbs/tw8282.pp
  + simplify support for ifn (based on patch by Florian)
........
r6386 | peter | 2007-02-09 13:48:53 +0100 (Fri, 09 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/htypechk.pas
   M /branches/fpc_2_3/compiler/ncal.pas
   M /branches/fpc_2_3/compiler/symconst.pas
  * overflow,rangecheck optional parameters for operators, patch from 8281
........
r6391 | jonas | 2007-02-09 23:52:13 +0100 (Fri, 09 Feb 2007) | 4 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc/agppcgas.pas
   M /branches/fpc_2_3/compiler/powerpc64/cpunode.pas
   D /branches/fpc_2_3/compiler/powerpc64/nppcinl.pas
   M /branches/fpc_2_3/compiler/ppcgen/ngppcinl.pas
  * merged fsqrt(s) support to common powerpc unit, activate for ppc32
    if -Op970 is used (still default for ppc64, since default cpu there
    is already ppc970)
........
r6394 | jonas | 2007-02-10 18:58:47 +0100 (Sat, 10 Feb 2007) | 4 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc/cgcpu.pas
   M /branches/fpc_2_3/compiler/powerpc64/cgcpu.pas
   M /branches/fpc_2_3/compiler/ppcgen/cgppc.pas
  * adapted a_jmp_name for darwin/ppc64
  * merged g_intf_wrapper for ppc32 and ppc64, and added darwin/ppc64
    support to it
........
r6396 | jonas | 2007-02-10 20:16:06 +0100 (Sat, 10 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/cgobj.pas
  + darwin/ppc64 support for g_indirect_sym_load
........
r6397 | jonas | 2007-02-10 20:22:49 +0100 (Sat, 10 Feb 2007) | 4 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc/cgcpu.pas
   M /branches/fpc_2_3/compiler/powerpc64/cgcpu.pas
   M /branches/fpc_2_3/compiler/ppcgen/cgppc.pas
  + darwin/ppc64 support to ppc64's fixref
  * moved ppc32 a_load_store to cgppc and use it for darwin/ppc64 as
    well (its relocatable symbols are only 32 bits large)
........
r6399 | jonas | 2007-02-10 22:02:37 +0100 (Sat, 10 Feb 2007) | 4 lines
Changed paths:
   M /branches/fpc_2_3/compiler/systems.pas
  + system_x86_64_darwin identifier
  + set default source system for system_x86_64_darwin and
    system_powerpc64_darwin
........
r6404 | jonas | 2007-02-10 23:01:23 +0100 (Sat, 10 Feb 2007) | 5 lines
Changed paths:
   M /branches/fpc_2_3/compiler/aasmdata.pas
   M /branches/fpc_2_3/compiler/aggas.pas
   M /branches/fpc_2_3/compiler/cgobj.pas
   M /branches/fpc_2_3/compiler/cgutils.pas
   M /branches/fpc_2_3/compiler/cresstr.pas
   M /branches/fpc_2_3/compiler/dbgdwarf.pas
   M /branches/fpc_2_3/compiler/dbgstabs.pas
   M /branches/fpc_2_3/compiler/ncgutil.pas
   M /branches/fpc_2_3/compiler/ogelf.pas
   M /branches/fpc_2_3/compiler/pdecvar.pas
   M /branches/fpc_2_3/compiler/pmodules.pas
   M /branches/fpc_2_3/compiler/symdef.pas
   M /branches/fpc_2_3/compiler/systems.pas
  + system_x86_64_darwin identifier
  + systems_darwin set which collects all darwin variants
  + added support for darwin/ppc64 and darwin/x86_64 where needed in
    the generic code
........
r6406 | jonas | 2007-02-10 23:24:32 +0100 (Sat, 10 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/cgobj.pas
  * ifdef cpu64 -> ifdef cpu64bit
........
r6409 | jonas | 2007-02-11 00:34:04 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/pdecvar.pas
  * fixed ppc64 compilation
........
r6413 | jonas | 2007-02-11 12:41:27 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/rtl/bsd/system.pp
   M /branches/fpc_2_3/rtl/darwin/powerpc/sig_cpu.inc
   M /branches/fpc_2_3/rtl/darwin/signal.inc
  + darwin/ppc64 support for signal routines
........
r6415 | jonas | 2007-02-11 13:54:53 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/systems/i_linux.pas
  * set abi of linux/ppc64 to abi_powerpc_sysv
........
r6416 | jonas | 2007-02-11 13:55:51 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc64/cputarg.pas
   M /branches/fpc_2_3/compiler/systems/i_bsd.pas
   M /branches/fpc_2_3/compiler/systems/t_bsd.pas
  + darwin/ppc64 source and target information
........
r6418 | jonas | 2007-02-11 14:19:55 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/rtl/powerpc64/math.inc
  * darwin/ppc64 compilation fixes
........
r6419 | jonas | 2007-02-11 14:22:22 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc/cgcpu.pas
   M /branches/fpc_2_3/compiler/powerpc64/cgcpu.pas
   M /branches/fpc_2_3/compiler/ppcgen/cgppc.pas
  * darwin/ppc64 needs the 32 bit version of a_loadaddr_ref_reg
........
r6420 | jonas | 2007-02-11 14:22:55 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/utils/fpcm/fpcmmain.pp
  + darwin/ppc64 support
........
r6426 | jonas | 2007-02-11 16:13:19 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc64/rappcgas.pas
  * fixed refaddr parsing for darwin/ppc64
........
r6427 | jonas | 2007-02-11 16:14:21 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc/agppcgas.pas
   M /branches/fpc_2_3/compiler/powerpc64/agppcgas.pas
   A /branches/fpc_2_3/compiler/ppcgen/agppcutl.pas
  * moved ppc32/ppc64 assembler writer helpers to a common unit
........
r6430 | jonas | 2007-02-11 17:53:23 +0100 (Sun, 11 Feb 2007) | 4 lines
Changed paths:
   D /branches/fpc_2_3/rtl/darwin/powerpc/sig_cpu.inc
   D /branches/fpc_2_3/rtl/darwin/powerpc/sighnd.inc
   A /branches/fpc_2_3/rtl/darwin/powerpc64
   A /branches/fpc_2_3/rtl/darwin/powerpc64/sig_cpu.inc
   A /branches/fpc_2_3/rtl/darwin/powerpc64/sighnd.inc
   A /branches/fpc_2_3/rtl/darwin/ppcgen
   A /branches/fpc_2_3/rtl/darwin/ppcgen/ppchnd.inc (from /branches/fpc_2_3/rtl/darwin/powerpc/sighnd.inc:6422)
   A /branches/fpc_2_3/rtl/darwin/ppcgen/sig_ppc.inc (from /branches/fpc_2_3/rtl/darwin/powerpc/sig_cpu.inc:6422)
   M /branches/fpc_2_3/rtl/darwin/signal.inc
  * fixed ppc/ppc64 signal include handling (both real files are in
    ppcgen, dummies in powerpc and powerpc64 which include those files)
    (1st step because pre-commit filter can't handle replaced files)
........
r6431 | jonas | 2007-02-11 17:53:47 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   A /branches/fpc_2_3/rtl/darwin/powerpc/sig_cpu.inc
   A /branches/fpc_2_3/rtl/darwin/powerpc/sighnd.inc
  * second step of signal include patch
........
r6432 | jonas | 2007-02-11 19:00:12 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/systems/t_bsd.pas
  * changed darwin checks to use systems_darwin constant
........
r6433 | jonas | 2007-02-11 19:05:38 +0100 (Sun, 11 Feb 2007) | 3 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc64/cgcpu.pas
  * handle non-multiple-of-4 offsets with 64 bit loads/stores for
    darwin/ppc64
........
r6434 | jonas | 2007-02-11 19:05:56 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   D /branches/fpc_2_3/compiler/powerpc/agppcgas.pas
   D /branches/fpc_2_3/compiler/powerpc64/agppcgas.pas
   A /branches/fpc_2_3/compiler/ppcgen/agppcgas.pas (from /branches/fpc_2_3/compiler/ppcgen/agppcutl.pas:6427)
   D /branches/fpc_2_3/compiler/ppcgen/agppcutl.pas
  * completely merged ppc assembler writers
........
r6435 | jonas | 2007-02-11 19:06:40 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/rtl/darwin/console.pp
   M /branches/fpc_2_3/rtl/darwin/termiosproc.inc
  * fixed 64 bit compilation
........
r6436 | jonas | 2007-02-11 19:09:28 +0100 (Sun, 11 Feb 2007) | 3 lines
Changed paths:
   M /branches/fpc_2_3/packages/extra/Makefile.fpc
  * universal interfaces aren't 64 bit ready yet -> only compile for
    darwin/ppc and darwin/i386
........
r6438 | jonas | 2007-02-11 19:22:34 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   A /branches/fpc_2_3/tests/test/cg/obj/darwin/powerpc64
   A /branches/fpc_2_3/tests/test/cg/obj/darwin/powerpc64/ctest.o
   A /branches/fpc_2_3/tests/test/cg/obj/darwin/powerpc64/tcext3.o
   A /branches/fpc_2_3/tests/test/cg/obj/darwin/powerpc64/tcext4.o
   A /branches/fpc_2_3/tests/test/cg/obj/darwin/powerpc64/tcext5.o
  + compiled for darwin/ppc64
........
r6439 | jonas | 2007-02-11 20:24:42 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ppcgen/cgppc.pas
  * patch from Thomas to fix linux/ppc64
........
r6440 | jonas | 2007-02-11 20:25:15 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/systems.pas
  * fixed setting source OS for darwin/ppc64
........
r6444 | florian | 2007-02-11 22:24:20 +0100 (Sun, 11 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/globtype.pas
   M /branches/fpc_2_3/compiler/nopt.pas
   M /branches/fpc_2_3/compiler/nutils.pas
   M /branches/fpc_2_3/compiler/optcse.pas
   M /branches/fpc_2_3/compiler/psub.pas
+ first node cse implementation
........
r6445 | jonas | 2007-02-11 22:30:07 +0100 (Sun, 11 Feb 2007) | 6 lines
Changed paths:
   M /branches/fpc_2_3/compiler/cresstr.pas
  * hack to work around strange darwin/ppc64 linker bug: it seems to
    have problems if you put a global symbol at the end of a section
    without any data following (at least in case of the resource strings
    section) -> add dummy byte at the end for darwin/ppc64 (otherwise
    it messes up the address of the first symbol stub entry)
........
r6449 | jonas | 2007-02-11 23:23:44 +0100 (Sun, 11 Feb 2007) | 4 lines
Changed paths:
   M /branches/fpc_2_3/compiler/systems/i_bsd.pas
  * cpupowerpc is defined for both ppc32 and ppc64 ->
    changed to cpupowerpc32 to avoid defining source
    wrongly on ppc64
........
r6450 | jonas | 2007-02-11 23:26:34 +0100 (Sun, 11 Feb 2007) | 3 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ppcgen/ngppcset.pas
  * disable jump tables for darwin/ppc64 for now, don't work
    yet for some reason
........
r6451 | florian | 2007-02-11 23:54:37 +0100 (Sun, 11 Feb 2007) | 3 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ncal.pas
   M /branches/fpc_2_3/compiler/nutils.pas
   M /branches/fpc_2_3/compiler/optcse.pas
* improved cse
* better complexity calculation for subscript nodes with classes or interfaces
........
r6456 | jonas | 2007-02-12 19:33:22 +0100 (Mon, 12 Feb 2007) | 4 lines
Changed paths:
   M /branches/fpc_2_3/compiler/nutils.pas
  + support for notn,shln,shrn,equaln,unequaln,gtn,gten,ltn,lten in
    node_cplexity()
  * mark muln,divn,modn as more complex
........
r6469 | jonas | 2007-02-13 15:56:01 +0100 (Tue, 13 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/optcse.pas
  * fixed when cross-compiling a 64 bit compiler from a 32 bit platform
........
r6471 | jonas | 2007-02-13 16:17:16 +0100 (Tue, 13 Feb 2007) | 3 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc64/cputarg.pas
  * include stabs support (can work on darwin/ppc64, but doesn't work
    yet)
........
r6473 | jonas | 2007-02-13 16:45:48 +0100 (Tue, 13 Feb 2007) | 3 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc64/cgcpu.pas
   M /branches/fpc_2_3/compiler/powerpc64/cpupara.pas
  * R2 is a volatile and usable register under darwin/ppc64
  * R13 is a reserved non-volatile register under darwin/ppc64 (tls)
........
r6479 | jonas | 2007-02-13 20:40:50 +0100 (Tue, 13 Feb 2007) | 3 lines
Changed paths:
   M /branches/fpc_2_3/compiler/systems/i_bsd.pas
  * maxCrecordalign seems to have to be 8 rather 4, in spite of what
    the ABI docs say (although they are contradictory to some extent)
........
r6487 | jonas | 2007-02-14 15:57:40 +0100 (Wed, 14 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/tests/webtbs/tw8153a.pp
  * fixed for darwin/ppc64
........
r6488 | jonas | 2007-02-14 15:58:56 +0100 (Wed, 14 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/tests/webtbs/tw7851a.pp
  * fixed for darwin/ppc64
........
r6494 | jonas | 2007-02-15 19:36:55 +0100 (Thu, 15 Feb 2007) | 3 lines
Changed paths:
   M /branches/fpc_2_3/compiler/systems/i_bsd.pas
  * set default debug info for darwin/ppc64 to dwarf2 since
    it works better than stabs currently
........
r6500 | jonas | 2007-02-15 21:38:16 +0100 (Thu, 15 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/version.pas
  * updated version to 2.3.0
........
r6505 | jonas | 2007-02-15 22:39:28 +0100 (Thu, 15 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/version.pas
  * changed version to 2.3.1
........
r6511 | jonas | 2007-02-16 15:17:24 +0100 (Fri, 16 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/powerpc64/itcpugas.pas
  * system_powerpc_darwin -> system_powerpc64_darwin
........
r6546 | daniel | 2007-02-18 15:48:54 +0100 (Sun, 18 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ncginl.pas
   M /branches/fpc_2_3/compiler/ncgld.pas
   M /branches/fpc_2_3/compiler/ncgrtti.pas
   M /branches/fpc_2_3/compiler/ncnv.pas
   M /branches/fpc_2_3/compiler/ninl.pas
   M /branches/fpc_2_3/compiler/nld.pas
   M /branches/fpc_2_3/compiler/nutils.pas
   M /branches/fpc_2_3/compiler/pinline.pas
   M /branches/fpc_2_3/rtl/inc/astrings.inc
   M /branches/fpc_2_3/rtl/inc/compproc.inc
   M /branches/fpc_2_3/rtl/inc/sstrings.inc
   M /branches/fpc_2_3/rtl/inc/text.inc
   M /branches/fpc_2_3/rtl/inc/wstrings.inc
  + Val/str/read/write support for enumeration types.
........
r6547 | daniel | 2007-02-18 17:01:20 +0100 (Sun, 18 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/rtl/inc/sstrings.inc
  * Fix val code that I broke.
........
r6571 | daniel | 2007-02-20 09:27:44 +0100 (Tue, 20 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/rtl/inc/astrings.inc
   M /branches/fpc_2_3/rtl/inc/sstrings.inc
   M /branches/fpc_2_3/rtl/inc/text.inc
   M /branches/fpc_2_3/rtl/inc/wstrings.inc
  * o2s -> ord2str, s2o -> str2ord
........
r6572 | daniel | 2007-02-20 09:33:30 +0100 (Tue, 20 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ncgld.pas
   M /branches/fpc_2_3/compiler/ncgrtti.pas
   M /branches/fpc_2_3/compiler/ninl.pas
   M /branches/fpc_2_3/compiler/nld.pas
  * o2s -> ord2str, s2o -> str2ord
........
r6574 | daniel | 2007-02-20 12:07:58 +0100 (Tue, 20 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/rtl/inc/compproc.inc
  * o2s -> ord2str, s2o -> str2ord
........
r6578 | daniel | 2007-02-20 22:18:49 +0100 (Tue, 20 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/rtl/inc/text.inc
  * Change longint to valsint.
........
r6579 | daniel | 2007-02-20 22:29:09 +0100 (Tue, 20 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ninl.pas
  * Handle ordinal currency types.
........
r6580 | jonas | 2007-02-20 22:29:11 +0100 (Tue, 20 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ncgrtti.pas
  * fixed compilation for cpurequiresproperalignment
........
r6581 | jonas | 2007-02-20 22:30:21 +0100 (Tue, 20 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ninl.pas
  * fixed typo
........
r6582 | daniel | 2007-02-20 22:36:19 +0100 (Tue, 20 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/ninl.pas
  * Set is_real to true.
........
r6590 | jonas | 2007-02-21 20:23:54 +0100 (Wed, 21 Feb 2007) | 2 lines
Changed paths:
   M /branches/fpc_2_3/compiler/systems/i_bsd.pas
  * set tf_dwarf_only_local_labels for darwin/ppc64
git-svn-id: trunk@6720 -
		
	
			
		
			
				
	
	
		
			911 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			911 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {
 | |
|     Copyright (c) 1998-2002 by Florian Klaempfl
 | |
| 
 | |
|     This unit contains information about the target systems supported
 | |
|     (these are not processor specific)
 | |
| 
 | |
|     This program is free software; you can redistribute it and/or modify
 | |
|     iu under the terms of the GNU General Public License as published by
 | |
|     the Free Software Foundation; either version 3 of the License, or
 | |
|     (at your option) any later version.
 | |
| 
 | |
|     This program is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|     GNU General Public License for more details.
 | |
| 
 | |
|     You should have received a copy of the GNU General Public License
 | |
|     along with this program; if not, write to the Free Software
 | |
|     Foundation, Inc., 675 Mass Ave, Cambridge- MA 02139, USA.
 | |
| 
 | |
|  ****************************************************************************
 | |
| }
 | |
| unit systems;
 | |
| 
 | |
| {$i fpcdefs.inc}
 | |
| 
 | |
| interface
 | |
| 
 | |
| 
 | |
|    type
 | |
|        tendian = (endian_little,endian_big);
 | |
| 
 | |
|      (*
 | |
|        IMPORTANT NOTE:
 | |
|        The value of this enumeration is stored in PPU files.
 | |
|        Therefore adding new CPU targets should not change the
 | |
|        values of the pre-existing targets. (CEC)
 | |
|        FURTHERMORE : Make sure that this branch values, are
 | |
|        consistant with the main branch version always.
 | |
|      *)
 | |
|        tsystemcpu=
 | |
|        (
 | |
|              cpu_no,                       { 0 }
 | |
|              cpu_i386,                     { 1 }
 | |
|              cpu_m68k,                     { 2 }
 | |
|              cpu_alpha,                    { 3 }
 | |
|              cpu_powerpc,                  { 4 }
 | |
|              cpu_sparc,                    { 5 }
 | |
|              cpu_vm,                       { 6 }
 | |
|              cpu_iA64,                     { 7 }
 | |
|              cpu_x86_64,                   { 8 }
 | |
|              cpu_mips,                     { 9 }
 | |
|              cpu_arm,                      { 10 }
 | |
|              cpu_powerpc64                 { 11 }
 | |
|        );
 | |
| 
 | |
|        tasmmode= (asmmode_none
 | |
|             { standard assembler (cpu dependant) with full parsing }
 | |
|             ,asmmode_standard
 | |
|             ,asmmode_i386_att
 | |
|             ,asmmode_i386_intel
 | |
|             ,asmmode_ppc_gas
 | |
|             ,asmmode_ppc_motorola
 | |
|             ,asmmode_arm_gas
 | |
|             ,asmmode_sparc_gas
 | |
|             ,asmmode_x86_64_gas
 | |
|             ,asmmode_m68k_mot
 | |
|             ,asmmode_x86_64_intel
 | |
|             ,asmmode_x86_64_att
 | |
|        );
 | |
| 
 | |
|      (* IMPORTANT NOTE:
 | |
|        the integer value of this enum is stored in PPU
 | |
|        files to recognize the target, so if you add new targets
 | |
|        allways add them at end PM
 | |
|        FURTHERMORE : Make sure that this branch values are
 | |
|        consistant with the main branch version always. (CEC)
 | |
|        *)
 | |
|      type
 | |
|        tsystem =
 | |
|        (
 | |
|              system_none,               { 0 }
 | |
|              obsolete_system_i386_GO32V1,{ 1 }
 | |
|              system_i386_GO32V2,        { 2 }
 | |
|              system_i386_linux,         { 3 }
 | |
|              system_i386_OS2,           { 4 }
 | |
|              system_i386_Win32,         { 5 }
 | |
|              system_i386_freebsd,       { 6 }
 | |
|              system_m68k_Amiga,         { 7 }
 | |
|              system_m68k_Atari,         { 8 }
 | |
|              system_m68k_Mac,           { 9 }
 | |
|              system_m68k_linux,         { 10 }
 | |
|              system_m68k_PalmOS,        { 11 }
 | |
|              system_alpha_linux,        { 12 }
 | |
|              system_powerpc_linux,      { 13 }
 | |
|              system_powerpc_macos,      { 14 }
 | |
|              system_i386_solaris,       { 15 }
 | |
|              system_i386_beos,          { 16 }
 | |
|              system_i386_netbsd,        { 17 }
 | |
|              system_m68k_netbsd,        { 18 }
 | |
|              system_i386_Netware,       { 19 }
 | |
|              system_i386_qnx,           { 20 }
 | |
|              system_i386_wdosx,         { 21 }
 | |
|              system_sparc_solaris,      { 22 }
 | |
|              system_sparc_linux,        { 23 }
 | |
|              system_i386_openbsd,       { 24 }
 | |
|              system_m68k_openbsd,       { 25 }
 | |
|              system_x86_64_linux,       { 26 }
 | |
|              system_powerpc_darwin,     { 27 }
 | |
|              system_i386_EMX,           { 28 }
 | |
|              system_powerpc_netbsd,     { 29 }
 | |
|              system_powerpc_openbsd,    { 30 }
 | |
|              system_arm_linux,          { 31 }
 | |
|              system_i386_watcom,        { 32 }
 | |
|              system_powerpc_MorphOS,    { 33 }
 | |
|              system_x86_64_freebsd,     { 34 }
 | |
|              system_i386_netwlibc,      { 35 }
 | |
|              system_powerpc_Amiga,      { 36 }
 | |
|              system_x86_64_win64,       { 37 }
 | |
|              system_arm_wince,          { 38 }
 | |
|              system_ia64_win64,         { 39 }
 | |
|              system_i386_wince,         { 40 }
 | |
|              system_x86_6432_linux,     { 41 }
 | |
|              system_arm_gba,            { 42 }
 | |
|              system_powerpc64_linux,    { 43 }
 | |
|              system_i386_darwin,        { 44 }
 | |
|              system_arm_palmos,         { 45 }
 | |
|              system_powerpc64_darwin,   { 46 }
 | |
|              system_arm_nds,            { 47 }
 | |
|              system_i386_embedded,      { 48 }
 | |
|              system_m68k_embedded,      { 49 }
 | |
|              system_alpha_embedded,     { 50 }
 | |
|              system_powerpc_embedded,   { 51 }
 | |
|              system_sparc_embedded,     { 52 }
 | |
|              system_vm_embedded,        { 53 }
 | |
|              system_iA64_embedded,      { 54 }
 | |
|              system_x86_64_embedded,    { 55 }
 | |
|              system_mips_embedded,      { 56 }
 | |
|              system_arm_embedded,       { 57 }
 | |
|              system_powerpc64_embedded, { 58 }
 | |
|              system_i386_symbian,       { 59 }
 | |
|              system_arm_symbian,        { 60 }
 | |
|              system_x86_64_darwin       { 61 }
 | |
|        );
 | |
| 
 | |
|      const
 | |
|        systems_darwin = [system_powerpc_darwin,system_i386_darwin,
 | |
|                          system_powerpc64_darwin,system_x86_64_darwin];
 | |
| 
 | |
|      type
 | |
|        tasm = (as_none
 | |
|              ,as_gas                   { standard gnu assembler }
 | |
|              ,as_i386_as_aout
 | |
|              ,as_i386_nasmcoff
 | |
|              ,as_i386_nasmwin32
 | |
|              ,as_i386_nasmwdosx
 | |
|              ,as_i386_nasmelf
 | |
|              ,as_i386_nasmobj
 | |
|              ,as_i386_nasmbeos
 | |
|              ,as_i386_tasm
 | |
|              ,as_i386_masm
 | |
|              ,as_i386_wasm
 | |
|              ,as_i386_coff
 | |
|              ,as_i386_pecoff
 | |
|              ,as_i386_elf32
 | |
|              ,as_i386_pecoffwdosx
 | |
|              ,as_m68k_mit
 | |
|              ,as_powerpc_mpw
 | |
|              ,as_darwin
 | |
|              ,as_x86_64_masm
 | |
|              ,as_x86_64_pecoff
 | |
|              ,as_i386_pecoffwince
 | |
|              ,as_arm_pecoffwince
 | |
|              ,as_x86_64_elf64
 | |
|              ,as_sparc_elf32
 | |
|              ,as_ggas                  { gnu assembler called "gas" instead of "as" }
 | |
|        );
 | |
| 
 | |
|        tar = (ar_none
 | |
|             ,ar_gnu_ar
 | |
|             ,ar_mpw_ar
 | |
|             ,ar_gnu_ar_scripted
 | |
|             ,ar_gnu_gar
 | |
|        );
 | |
| 
 | |
|        tres = (res_none
 | |
|             ,res_gnu_windres,res_emxbind
 | |
|             ,res_m68k_palmos,res_m68k_mpw
 | |
|             ,res_powerpc_mpw,res_elf
 | |
|             ,res_gnu_wince_windres
 | |
|        );
 | |
| 
 | |
|        tdbg = (dbg_none
 | |
|             ,dbg_stabs,dbg_dwarf2,dbg_dwarf3
 | |
|        );
 | |
| 
 | |
|        tscripttype = (script_none
 | |
|             ,script_dos,script_unix,script_amiga,
 | |
|             script_mpw
 | |
|        );
 | |
| 
 | |
|        tabi = (abi_default
 | |
|             ,abi_powerpc_sysv,abi_powerpc_aix
 | |
|        );
 | |
| 
 | |
| {*****************************************************************************
 | |
|                                Structures
 | |
| *****************************************************************************}
 | |
| 
 | |
|      type
 | |
|        { Abstract linker class which is implemented in link module }
 | |
|        TAbstractLinker = class
 | |
|        end;
 | |
| 
 | |
|        TAbstractLinkerClass = class of TAbstractLinker;
 | |
| 
 | |
| 
 | |
|        { Abstract assembler class which is implemented in assemble module }
 | |
|        TAbstractAssembler = class
 | |
|        end;
 | |
| 
 | |
|        TAbstractAssemblerClass = class of TAbstractAssembler;
 | |
| 
 | |
| 
 | |
|        TAbstractResourceFile = class
 | |
|          constructor create(const fn : ansistring);virtual;abstract;
 | |
|        end;
 | |
|        TAbstractResourceFileClass = class of TAbstractResourceFile;
 | |
| 
 | |
| 
 | |
|        palignmentinfo = ^talignmentinfo;
 | |
|        talignmentinfo = record
 | |
|          procalign,
 | |
|          loopalign,
 | |
|          jumpalign,
 | |
|          constalignmin,
 | |
|          constalignmax,
 | |
|          varalignmin,
 | |
|          varalignmax,
 | |
|          localalignmin,
 | |
|          localalignmax,
 | |
|          recordalignmin,
 | |
|          recordalignmax,
 | |
|          maxCrecordalign : longint;
 | |
|        end;
 | |
| 
 | |
|        tasmflags = (af_none,
 | |
|          af_outputbinary,af_allowdirect,
 | |
|          af_needar,af_smartlink_sections,
 | |
|          af_labelprefix_only_inside_procedure,
 | |
|          af_supports_dwarf,
 | |
|          af_no_debug
 | |
|        );
 | |
| 
 | |
|        pasminfo = ^tasminfo;
 | |
|        tasminfo = record
 | |
|           id          : tasm;
 | |
|           idtxt       : string[12];
 | |
|           asmbin      : string[8];
 | |
|           asmcmd      : string[50];
 | |
|           supported_target : tsystem;
 | |
|           flags        : set of tasmflags;
 | |
|           labelprefix : string[3];
 | |
|           comment     : string[3];
 | |
|        end;
 | |
| 
 | |
|        parinfo = ^tarinfo;
 | |
|        tarinfo = record
 | |
|           id          : tar;
 | |
|           arcmd       : string[50];
 | |
|           arfinishcmd : string[10];
 | |
|        end;
 | |
| 
 | |
|        presinfo = ^tresinfo;
 | |
|        tresinfo = record
 | |
|           id      : tres;
 | |
|           resbin  : string[8];
 | |
|           rescmd  : string[50];
 | |
|           resourcefileclass : TAbstractResourceFileClass;
 | |
|        end;
 | |
| 
 | |
|        pdbginfo = ^tdbginfo;
 | |
|        tdbginfo = record
 | |
|           id      : tdbg;
 | |
|           idtxt   : string[12];
 | |
|        end;
 | |
| 
 | |
|        tsystemflags = (tf_none,
 | |
|             tf_under_development,
 | |
|             tf_need_export,
 | |
|             tf_needs_isconsole,
 | |
|             tf_code_small,
 | |
|             tf_static_reg_based,
 | |
|             tf_needs_symbol_size,
 | |
|             tf_smartlink_sections,
 | |
|             tf_needs_dwarf_cfi,
 | |
|             tf_use_8_3,
 | |
|             tf_pic_uses_got,
 | |
|             tf_library_needs_pic,
 | |
|             tf_needs_symbol_type,
 | |
|             tf_section_threadvars,
 | |
|             tf_files_case_sensitive,
 | |
|             tf_files_case_aware,
 | |
|             tf_p_ext_support,
 | |
|             tf_has_dllscanner,
 | |
|             tf_use_function_relative_addresses,
 | |
|             tf_winlikewidestring,
 | |
|             tf_dwarf_relative_addresses,         // use offsets where the Dwarf spec requires this instead of absolute addresses (the latter is needed by Linux binutils)
 | |
|             tf_dwarf_only_local_labels           // only use local labels inside the Dwarf debug_info section (needed for e.g. Darwin)
 | |
|        );
 | |
| 
 | |
|        psysteminfo = ^tsysteminfo;
 | |
|        { using packed causes bus errors on processors which require alignment }
 | |
|        tsysteminfo = record
 | |
|           system       : tsystem;
 | |
|           name         : string[34];
 | |
|           shortname    : string[9];
 | |
|           flags        : set of tsystemflags;
 | |
|           cpu          : tsystemcpu;
 | |
|           unit_env     : string[16];
 | |
|           extradefines : string[40];
 | |
|           exeext,
 | |
|           defext,
 | |
|           scriptext,
 | |
|           smartext,
 | |
|           unitext,
 | |
|           unitlibext,
 | |
|           asmext,
 | |
|           objext,
 | |
|           resext,
 | |
|           resobjext    : string[4];
 | |
|           sharedlibext : string[10];
 | |
|           staticlibext,
 | |
|           staticlibprefix : string[4];
 | |
|           sharedlibprefix : string[4];
 | |
|           sharedClibext : string[10];
 | |
|           staticClibext,
 | |
|           staticClibprefix : string[4];
 | |
|           sharedClibprefix : string[4];
 | |
|           Cprefix      : string[2];
 | |
|           newline      : string[2];
 | |
|           dirsep       : char;
 | |
|           assem        : tasm;
 | |
|           assemextern  : tasm; { external assembler, used by -a }
 | |
|           link         : tabstractlinkerclass;
 | |
|           linkextern   : tabstractlinkerclass;  { external linker, used by -s }
 | |
|           ar           : tar;
 | |
|           res          : tres;
 | |
|           dbg          : tdbg;
 | |
|           script       : tscripttype;
 | |
|           endian       : tendian;
 | |
|           alignment    : talignmentinfo;
 | |
|           {
 | |
|             Offset from the argument pointer register to the first
 | |
|             argument's address. On some machines it may depend on
 | |
|             the data type of the function.
 | |
|             (see also FIRST_PARM_OFFSET in GCC source)
 | |
|           }
 | |
|           first_parm_offset : longint;
 | |
|           stacksize    : longint;
 | |
|           abi          : tabi;
 | |
|        end;
 | |
| 
 | |
|     const
 | |
|        { alias for supported_target field in tasminfo }
 | |
|        system_any = system_none;
 | |
| 
 | |
|        system_wince = [system_arm_wince,system_i386_wince];
 | |
|        system_linux = [system_i386_linux,system_x86_64_linux,system_powerpc_linux,
 | |
|                        system_arm_linux,system_sparc_linux,system_alpha_linux,system_m68k_linux,
 | |
|                        system_x86_6432_linux];
 | |
|        { all real windows systems, no cripple ones like wince, wdosx et. al. }
 | |
|        system_windows = [system_i386_win32,system_x86_64_win64,system_ia64_win64];
 | |
|        { all windows systems }
 | |
|        system_all_windows = [system_i386_win32,system_x86_64_win64,system_ia64_win64,
 | |
|                              system_arm_wince,system_i386_wince];
 | |
| 
 | |
|        { all systems supporting exports from programs or units }
 | |
|        system_unit_program_exports = [system_i386_win32,
 | |
|                                          system_i386_wdosx,
 | |
|                                          system_i386_Netware,
 | |
|                                          system_i386_netwlibc,
 | |
|                                          system_arm_wince,
 | |
|                                          system_x86_64_win64,
 | |
|                                          system_ia64_win64]+system_linux;
 | |
| 
 | |
|        system_internal_sysinit = [system_i386_linux,system_i386_win32];
 | |
| 
 | |
|        system_embedded = [system_i386_embedded,system_m68k_embedded,system_alpha_embedded,
 | |
|              system_powerpc_embedded,system_sparc_embedded,system_vm_embedded,
 | |
|              system_iA64_embedded,system_x86_64_embedded,system_mips_embedded,
 | |
|              system_arm_embedded,system_powerpc64_embedded];
 | |
| 
 | |
| 
 | |
|        cpu2str : array[TSystemCpu] of string =
 | |
|             ('','i386','m68k','alpha','powerpc','sparc','vm','ia64','x86_64',
 | |
|              'mips','arm', 'powerpc64');
 | |
| 
 | |
|     var
 | |
|        targetinfos   : array[tsystem] of psysteminfo;
 | |
|        arinfos       : array[tar] of parinfo;
 | |
|        resinfos      : array[tres] of presinfo;
 | |
|        asminfos      : array[tasm] of pasminfo;
 | |
|        dbginfos      : array[tdbg] of pdbginfo;
 | |
| 
 | |
|        source_info : tsysteminfo;
 | |
|        target_cpu  : tsystemcpu;
 | |
|        target_info : tsysteminfo;
 | |
|        target_asm  : tasminfo;
 | |
|        target_ar   : tarinfo;
 | |
|        target_res  : tresinfo;
 | |
|        target_dbg  : tdbginfo;
 | |
|        target_cpu_string,
 | |
|        target_os_string   : string[12]; { for rtl/<X>/,fcl/<X>/, etc. }
 | |
|        target_full_string : string[24];
 | |
| 
 | |
|     function set_target(t:tsystem):boolean;
 | |
|     function set_target_asm(t:tasm):boolean;
 | |
|     function set_target_ar(t:tar):boolean;
 | |
|     function set_target_res(t:tres):boolean;
 | |
|     function set_target_dbg(t:tdbg):boolean;
 | |
| 
 | |
|     function find_system_by_string(const s : string) : tsystem;
 | |
|     function find_asm_by_string(const s : string) : tasm;
 | |
|     function find_dbg_by_string(const s : string) : tdbg;
 | |
| 
 | |
|     procedure set_source_info(const ti : tsysteminfo);
 | |
| 
 | |
|     procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
 | |
| 
 | |
|     procedure RegisterTarget(const r:tsysteminfo);
 | |
|     procedure RegisterRes(const r:tresinfo; rcf : TAbstractResourceFileClass);
 | |
|     procedure RegisterAr(const r:tarinfo);
 | |
|     { Register the external linker. This routine is called to setup the
 | |
|       class to use for the linker. It returns the tsysteminfo structure
 | |
|       updated with the correct linker class for external linking.
 | |
|     }
 | |
|     procedure RegisterExternalLinker(var system_info: tsysteminfo; c:TAbstractLinkerClass);
 | |
|     { Register the internal linker. This routine is called to setup the
 | |
|       class to use for the linker. It returns the tsysteminfo structure
 | |
|       updated with the correct linker class for internal linking.
 | |
| 
 | |
|       If internal linking is not supported, this class can be set
 | |
|       to nil.
 | |
|     }
 | |
|     procedure RegisterInternalLinker(var system_info : tsysteminfo; c:TAbstractLinkerClass);
 | |
| 
 | |
|     procedure InitSystems;
 | |
| 
 | |
|     {$ifdef FreeBSD}
 | |
|         function GetOSRelDate:Longint;
 | |
|     {$endif}
 | |
| 
 | |
| implementation
 | |
| 
 | |
|     uses
 | |
|       cutils{$ifdef FreeBSD},SysCtl,BaseUnix{$endif};
 | |
| 
 | |
| {****************************************************************************
 | |
|            OS runtime version detection utility routine
 | |
| ****************************************************************************}
 | |
| 
 | |
| {$ifdef FreeBSD}
 | |
| function GetOSRelDate:Longint;
 | |
| 
 | |
| var
 | |
|         mib  : array[0..1] of cint;
 | |
|         rval : cint;
 | |
|         len  : size_t;
 | |
|         i    : longint;
 | |
|         v    : longint;
 | |
|         oerrno : cint;
 | |
|         S    : AnsiString;
 | |
| 
 | |
| Begin
 | |
|         s:='ab';
 | |
|         SetLength(S,50);
 | |
|         mib[0] := CTL_KERN;
 | |
|         mib[1] := KERN_OSRELDATE;
 | |
|         len    := 4;
 | |
|         oerrno:= fpgeterrno;
 | |
|         if (FPsysctl(pChar(@mib), 2, pchar(@v), @len, NIL, 0) = -1) Then
 | |
|            Begin
 | |
|                 if (fpgeterrno = ESysENOMEM) Then
 | |
|                         fpseterrno(oerrno);
 | |
|                 GetOSRelDate:=0;
 | |
|            End
 | |
|         else
 | |
|          GetOSRelDate:=v;
 | |
| End;
 | |
| {$endif}
 | |
| 
 | |
| 
 | |
| {****************************************************************************
 | |
|                               Target setting
 | |
| ****************************************************************************}
 | |
| 
 | |
| function set_target(t:tsystem):boolean;
 | |
| begin
 | |
|   set_target:=false;
 | |
|   if assigned(targetinfos[t]) then
 | |
|    begin
 | |
|      target_info:=targetinfos[t]^;
 | |
|      set_target_asm(target_info.assem);
 | |
|      set_target_ar(target_info.ar);
 | |
|      set_target_res(target_info.res);
 | |
|      set_target_dbg(target_info.dbg);
 | |
|      target_cpu:=target_info.cpu;
 | |
|      target_os_string:=lower(target_info.shortname);
 | |
|      target_cpu_string:=cpu2str[target_cpu];
 | |
|      target_full_string:=target_cpu_string+'-'+target_os_string;
 | |
|      set_target:=true;
 | |
|      exit;
 | |
|    end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function set_target_asm(t:tasm):boolean;
 | |
| begin
 | |
|   set_target_asm:=false;
 | |
|   if assigned(asminfos[t]) and
 | |
|     ((asminfos[t]^.supported_target=target_info.system) or
 | |
|      (asminfos[t]^.supported_target=system_any)) then
 | |
|    begin
 | |
|      target_asm:=asminfos[t]^;
 | |
|      set_target_asm:=true;
 | |
|      exit;
 | |
|    end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function set_target_ar(t:tar):boolean;
 | |
| begin
 | |
|   result:=false;
 | |
|   if assigned(arinfos[t]) then
 | |
|    begin
 | |
|      target_ar:=arinfos[t]^;
 | |
|      result:=true;
 | |
|      exit;
 | |
|    end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function set_target_res(t:tres):boolean;
 | |
| begin
 | |
|   result:=false;
 | |
|   if assigned(resinfos[t]) then
 | |
|    begin
 | |
|      target_res:=resinfos[t]^;
 | |
|      result:=true;
 | |
|      exit;
 | |
|    end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function set_target_dbg(t:tdbg):boolean;
 | |
| begin
 | |
|   result:=false;
 | |
|   if assigned(dbginfos[t]) then
 | |
|    begin
 | |
|      target_dbg:=dbginfos[t]^;
 | |
|      result:=true;
 | |
|      exit;
 | |
|    end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function find_system_by_string(const s : string) : tsystem;
 | |
| var
 | |
|   hs : string;
 | |
|   t  : tsystem;
 | |
| begin
 | |
|   result:=system_none;
 | |
|   hs:=upper(s);
 | |
|   for t:=low(tsystem) to high(tsystem) do
 | |
|    if assigned(targetinfos[t]) and
 | |
|       (upper(targetinfos[t]^.shortname)=hs) then
 | |
|     begin
 | |
|       result:=t;
 | |
|       exit;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function find_asm_by_string(const s : string) : tasm;
 | |
| var
 | |
|   hs : string;
 | |
|   t  : tasm;
 | |
| begin
 | |
|   result:=as_none;
 | |
|   hs:=upper(s);
 | |
|   for t:=low(tasm) to high(tasm) do
 | |
|    if assigned(asminfos[t]) and
 | |
|       (asminfos[t]^.idtxt=hs) then
 | |
|     begin
 | |
|       result:=t;
 | |
|       exit;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function find_dbg_by_string(const s : string) : tdbg;
 | |
| var
 | |
|   hs : string;
 | |
|   t  : tdbg;
 | |
| begin
 | |
|   result:=dbg_none;
 | |
|   hs:=upper(s);
 | |
|   for t:=low(tdbg) to high(tdbg) do
 | |
|    if assigned(dbginfos[t]) and
 | |
|       (dbginfos[t]^.idtxt=hs) then
 | |
|     begin
 | |
|       result:=t;
 | |
|       exit;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
 | |
| begin
 | |
|   with d do
 | |
|    begin
 | |
|      { general update rules:
 | |
|        minimum: if higher then update
 | |
|        maximum: if lower then update or if undefined then update }
 | |
|      if s.procalign>procalign then
 | |
|       procalign:=s.procalign;
 | |
|      if s.loopalign>loopalign then
 | |
|       loopalign:=s.loopalign;
 | |
|      if s.jumpalign>jumpalign then
 | |
|       jumpalign:=s.jumpalign;
 | |
|      if s.constalignmin>constalignmin then
 | |
|       constalignmin:=s.constalignmin;
 | |
|      if (constalignmax=0) or
 | |
|         ((s.constalignmax>0) and (s.constalignmax<constalignmax)) then
 | |
|       constalignmax:=s.constalignmax;
 | |
|      if s.varalignmin>varalignmin then
 | |
|       varalignmin:=s.varalignmin;
 | |
|      if (varalignmax=0) or
 | |
|         ((s.varalignmax>0) and (s.varalignmax<varalignmax)) then
 | |
|       varalignmax:=s.varalignmax;
 | |
|      if s.localalignmin>localalignmin then
 | |
|       localalignmin:=s.localalignmin;
 | |
|      if (localalignmax=0) or
 | |
|         ((s.localalignmax>0) and (s.localalignmax<localalignmax)) then
 | |
|       localalignmax:=s.localalignmax;
 | |
|      if s.recordalignmin>recordalignmin then
 | |
|       recordalignmin:=s.recordalignmin;
 | |
|      if (recordalignmax=0) or
 | |
|         ((s.recordalignmax>0) and (s.recordalignmax<recordalignmax)) then
 | |
|       recordalignmax:=s.recordalignmax;
 | |
|      if (maxCrecordalign=0) or
 | |
|         ((s.maxCrecordalign>0) and (s.maxCrecordalign<maxCrecordalign)) then
 | |
|       maxCrecordalign:=s.maxCrecordalign;
 | |
|    end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| {****************************************************************************
 | |
|                               Target registration
 | |
| ****************************************************************************}
 | |
| 
 | |
| procedure RegisterTarget(const r:tsysteminfo);
 | |
| var
 | |
|   t : tsystem;
 | |
| begin
 | |
|   t:=r.system;
 | |
|   if assigned(targetinfos[t]) then
 | |
|    writeln('Warning: Target is already registered!')
 | |
|   else
 | |
|    Getmem(targetinfos[t],sizeof(tsysteminfo));
 | |
|   targetinfos[t]^:=r;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure RegisterRes(const r:tresinfo; rcf : TAbstractResourceFileClass);
 | |
| var
 | |
|   t : tres;
 | |
| begin
 | |
|   t:=r.id;
 | |
|   if assigned(resinfos[t]) then
 | |
|     writeln('Warning: resourcecompiler is already registered!')
 | |
|   else
 | |
|     Getmem(resinfos[t],sizeof(tresinfo));
 | |
|   resinfos[t]^:=r;
 | |
|   resinfos[t]^.resourcefileclass:=rcf;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure RegisterAr(const r:tarinfo);
 | |
| var
 | |
|   t : tar;
 | |
| begin
 | |
|   t:=r.id;
 | |
|   if assigned(arinfos[t]) then
 | |
|     writeln('Warning: ar is already registered!')
 | |
|   else
 | |
|     Getmem(arinfos[t],sizeof(tarinfo));
 | |
|   arinfos[t]^:=r;
 | |
| end;
 | |
| 
 | |
| procedure RegisterExternalLinker(var system_info: tsysteminfo; c:TAbstractLinkerClass);
 | |
| begin
 | |
|   system_info.linkextern := c;
 | |
| end;
 | |
| 
 | |
| procedure RegisterInternalLinker(var system_info : tsysteminfo; c:TAbstractLinkerClass);
 | |
| begin
 | |
|   system_info.link := c;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| procedure DeregisterInfos;
 | |
| var
 | |
|   assem   : tasm;
 | |
|   target  : tsystem;
 | |
|   ar      : tar;
 | |
|   res     : tres;
 | |
|   dbg     : tdbg;
 | |
| begin
 | |
|   for target:=low(tsystem) to high(tsystem) do
 | |
|    if assigned(targetinfos[target]) then
 | |
|     begin
 | |
|       freemem(targetinfos[target],sizeof(tsysteminfo));
 | |
|       targetinfos[target]:=nil;
 | |
|     end;
 | |
|   for assem:=low(tasm) to high(tasm) do
 | |
|    if assigned(asminfos[assem]) then
 | |
|     begin
 | |
|       freemem(asminfos[assem],sizeof(tasminfo));
 | |
|       asminfos[assem]:=nil;
 | |
|     end;
 | |
|   for ar:=low(tar) to high(tar) do
 | |
|    if assigned(arinfos[ar]) then
 | |
|     begin
 | |
|       freemem(arinfos[ar],sizeof(tarinfo));
 | |
|       arinfos[ar]:=nil;
 | |
|     end;
 | |
|   for res:=low(tres) to high(tres) do
 | |
|    if assigned(resinfos[res]) then
 | |
|     begin
 | |
|       freemem(resinfos[res],sizeof(tresinfo));
 | |
|       resinfos[res]:=nil;
 | |
|     end;
 | |
|   for dbg:=low(tdbg) to high(tdbg) do
 | |
|    if assigned(dbginfos[dbg]) then
 | |
|     begin
 | |
|       freemem(dbginfos[dbg],sizeof(tdbginfo));
 | |
|       dbginfos[dbg]:=nil;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| {****************************************************************************
 | |
|                       Initialization of default target
 | |
| ****************************************************************************}
 | |
| 
 | |
| procedure default_target(t:tsystem);
 | |
| begin
 | |
|   set_target(t);
 | |
|   if source_info.name='' then
 | |
|     source_info:=target_info;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure set_source_info(const ti : tsysteminfo);
 | |
| begin
 | |
| { can't use message() here (PFV) }
 | |
|   if source_info.name<>'' then
 | |
|     Writeln('Warning: Source OS Redefined!');
 | |
|   source_info:=ti;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure InitSystems;
 | |
| begin
 | |
| { Now default target, this is dependent on the target cpu define,
 | |
|   when the define is the same as the source cpu then we use the source
 | |
|   os, else we pick a default }
 | |
| {$ifdef i386}
 | |
|   {$ifdef cpu86}
 | |
|     default_target(source_info.system);
 | |
|     {$define default_target_set}
 | |
|   {$else cpu86}
 | |
|    {$ifdef linux}
 | |
|     default_target(system_i386_linux);
 | |
|     {$define default_target_set}
 | |
|    {$endif}
 | |
|    {$ifdef freebsd}
 | |
|     default_target(system_i386_freebsd);
 | |
|     {$define default_target_set}
 | |
|    {$endif}
 | |
|    {$ifdef darwin}
 | |
|     default_target(system_i386_darwin);
 | |
|     {$define default_target_set}
 | |
|    {$endif}
 | |
|   {$endif cpu86}
 | |
|   { default is linux }
 | |
|   {$ifndef default_target_set}
 | |
|    default_target(system_i386_linux);
 | |
|   {$endif default_target_set}
 | |
| {$endif i386}
 | |
| 
 | |
| {$ifdef x86_64}
 | |
|   {$ifdef cpux86_64}
 | |
|     default_target(source_info.system);
 | |
|     {$define default_target_set}
 | |
|   {$else cpux86_64}
 | |
|    {$ifdef MSWindows}
 | |
|     default_target(system_x86_64_win64);
 | |
|     {$define default_target_set}
 | |
|    {$endif}
 | |
|    {$ifdef linux}
 | |
|     default_target(system_x86_64_linux);
 | |
|     {$define default_target_set}
 | |
|    {$endif}
 | |
|    {$ifdef freebsd}
 | |
|     default_target(system_x86_64_freebsd);
 | |
|     {$define default_target_set}
 | |
|    {$endif}
 | |
|    {$ifdef darwin}
 | |
|     default_target(system_x86_64_darwin);
 | |
|     {$define source_system_set}
 | |
|    {$endif}
 | |
|   {$endif cpux86_64}
 | |
|   { default is linux }
 | |
|   {$ifndef default_target_set}
 | |
|    default_target(system_x86_64_linux);
 | |
|   {$endif default_target_set}
 | |
| {$endif x86_64}
 | |
| 
 | |
| {$ifdef m68k}
 | |
|   {$ifdef cpu68}
 | |
|     default_target(source_info.target);
 | |
|   {$else cpu68}
 | |
|     default_target(system_m68k_linux);
 | |
|   {$endif cpu68}
 | |
| {$endif m68k}
 | |
| 
 | |
| {$ifdef alpha}
 | |
|   {$ifdef cpualpha}
 | |
|     default_target(source_info.system);
 | |
|   {$else cpualpha}
 | |
|     default_target(system_alpha_linux);
 | |
|   {$endif cpualpha}
 | |
| {$endif alpha}
 | |
| 
 | |
| {$ifdef powerpc}
 | |
|   {$ifdef cpupowerpc}
 | |
|     default_target(source_info.system);
 | |
|     {$define default_target_set}
 | |
|   {$else cpupowerpc}
 | |
|    {$ifdef linux}
 | |
|     default_target(system_powerpc_linux);
 | |
|     {$define default_target_set}
 | |
|    {$endif}
 | |
|    {$ifdef darwin}
 | |
|     default_target(system_powerpc_darwin);
 | |
|     {$define default_target_set}
 | |
|    {$endif}
 | |
|   {$endif cpupowerpc}
 | |
|   {$ifndef default_target_set}
 | |
|     default_target(system_powerpc_linux);
 | |
|   {$endif default_target_set}
 | |
| {$endif powerpc}
 | |
| 
 | |
| {$ifdef POWERPC64}
 | |
|   {$ifdef cpupowerpc64}
 | |
|     default_target(source_info.system);
 | |
|     {$define default_target_set}
 | |
|   {$else cpupowerpc64}
 | |
|     {$ifdef darwin}
 | |
|      default_target(system_powerpc64_darwin);
 | |
|      {$define default_target_set}
 | |
|     {$endif}
 | |
|     {$ifdef linux}
 | |
|      default_target(system_powerpc64_linux);
 | |
|      {$define default_target_set}
 | |
|     {$endif}
 | |
|   {$endif cpupowerpc64}
 | |
|   {$ifndef default_target_set}
 | |
|     default_target(system_powerpc64_linux);
 | |
|     {$define default_target_set}
 | |
|   {$endif}
 | |
| {$endif POWERPC64}
 | |
| 
 | |
| {$ifdef sparc}
 | |
|   {$ifdef cpusparc}
 | |
|     default_target(source_info.system);
 | |
|   {$else cpusparc}
 | |
|     default_target(system_sparc_linux);
 | |
|   {$endif cpusparc}
 | |
| {$endif sparc}
 | |
| 
 | |
| {$ifdef arm}
 | |
|   {$ifdef cpuarm}
 | |
|     default_target(source_info.system);
 | |
|   {$else cpuarm}
 | |
|     default_target(system_arm_linux);
 | |
|   {$endif cpuarm}
 | |
| {$endif arm}
 | |
| end;
 | |
| 
 | |
| 
 | |
| initialization
 | |
|    source_info.name:='';
 | |
| finalization
 | |
|   DeregisterInfos;
 | |
| end.
 |