ソースを参照

* split i/t_darwin from i/t_bsd, as they don't have that much in common
any more

git-svn-id: trunk@44407 -

Jonas Maebe 5 年 前
コミット
10b15628ab

+ 2 - 0
.gitattributes

@@ -830,6 +830,7 @@ compiler/systems/i_aros.pas svneol=native#text/plain
 compiler/systems/i_atari.pas svneol=native#text/plain
 compiler/systems/i_beos.pas svneol=native#text/plain
 compiler/systems/i_bsd.pas svneol=native#text/plain
+compiler/systems/i_darwin.pas svneol=native#text/plain
 compiler/systems/i_embed.pas svneol=native#text/plain
 compiler/systems/i_emx.pas svneol=native#text/plain
 compiler/systems/i_freertos.pas svneol=native#text/pascal
@@ -862,6 +863,7 @@ compiler/systems/t_aros.pas svneol=native#text/plain
 compiler/systems/t_atari.pas svneol=native#text/plain
 compiler/systems/t_beos.pas svneol=native#text/plain
 compiler/systems/t_bsd.pas svneol=native#text/plain
+compiler/systems/t_darwin.pas svneol=native#text/plain
 compiler/systems/t_embed.pas svneol=native#text/plain
 compiler/systems/t_emx.pas svneol=native#text/plain
 compiler/systems/t_freertos.pas svneol=native#text/pascal

+ 2 - 2
compiler/aarch64/cputarg.pas

@@ -38,8 +38,8 @@ implementation
     {$ifndef NOTARGETLINUX}
       ,t_linux
     {$endif}
-    {$ifndef NOTARGETBSD}
-      ,t_bsd
+    {$ifndef NOTARGETDARWIN}
+      ,t_darwin
     {$endif}
     {$ifndef NOTARGETANDROID}
       ,t_android

+ 3 - 0
compiler/arm/cputarg.pas

@@ -62,6 +62,9 @@ implementation
     {$ifndef NOTARGETBSD}
       ,t_bsd
     {$endif}
+    {$ifndef NOTARGETDARWIN}
+      ,t_darwin
+    {$endif}
     {$ifndef NOTARGETAROS}
       ,t_aros
     {$endif}

+ 3 - 0
compiler/i386/cputarg.pas

@@ -44,6 +44,9 @@ implementation
     {$ifndef NOTARGETBSD}
       ,t_bsd
     {$endif}
+    {$ifndef NOTARGETDARWIN}
+      ,t_darwin
+    {$endif}
     {$ifndef NOTARGETSUNOS}
       ,t_sunos
     {$endif}

+ 42 - 10
compiler/link.pas

@@ -78,6 +78,8 @@ interface
        end;
 
       TExternalLinker = class(TLinker)
+      protected
+         Function WriteSymbolOrderFile: TCmdStr;
       public
          Info : TLinkerInfo;
          Constructor Create;override;
@@ -87,6 +89,8 @@ interface
          Function  DoExec(const command:TCmdStr; para:TCmdStr;showinfo,useshell:boolean):boolean;
          procedure SetDefaultInfo;virtual;
          Function  MakeStaticLibrary:boolean;override;
+
+         Function UniqueName(const str:TCmdStr): TCmdStr;
        end;
 
       TBooleanArray = array [1..1024] of boolean;
@@ -642,6 +646,30 @@ Implementation
                               TEXTERNALLINKER
 *****************************************************************************}
 
+    Function TExternalLinker.WriteSymbolOrderFile: TCmdStr;
+      var
+        item: TCmdStrListItem;
+        symfile: TScript;
+      begin
+        result:='';
+        { only for darwin for now; can also enable for other platforms when using
+          the LLVM linker }
+        if (OrderedSymbols.Empty) or
+           not(tf_supports_symbolorderfile in target_info.flags) then
+          exit;
+        symfile:=TScript.Create(outputexedir+'symbol_order.fpc');
+        item:=TCmdStrListItem(OrderedSymbols.First);
+        while assigned(item) do
+          begin
+            symfile.add(item.str);
+            item:=TCmdStrListItem(item.next);
+          end;
+        symfile.WriteToDisk;
+        result:=symfile.fn;
+        symfile.Free;
+      end;
+
+
     Constructor TExternalLinker.Create;
       begin
         inherited Create;
@@ -654,16 +682,8 @@ Implementation
           end
         else
           begin
-            if GetProcessID>0 then
-              begin
-                Info.ResName:='link'+tostr(GetProcessID)+'.res';
-                Info.ScriptName:='script'+tostr(GetProcessID)+'.res';
-              end
-            else
-              begin
-                Info.ResName:='link.res';
-                Info.ScriptName:='script.res';
-              end;
+            Info.ResName:=UniqueName('link')+'.res';
+            Info.ScriptName:=UniqueName('script')+'.res';
           end;
         { set the linker specific defaults }
         SetDefaultInfo;
@@ -941,6 +961,18 @@ Implementation
         MakeStaticLibrary:=success;
       end;
 
+    function TExternalLinker.UniqueName(const str: TCmdStr): TCmdStr;
+      const
+        pid: SizeUInt = 0;
+      begin
+        if pid=0 then
+          pid:=GetProcessID;
+        if pid>0 then
+          result:=str+tostr(pid)
+        else
+          result:=str;
+      end;
+
 
 {*****************************************************************************
                               TINTERNALLINKER

+ 4 - 1
compiler/powerpc/cputarg.pas

@@ -41,9 +41,12 @@ implementation
     {$ifndef NOTARGETMACOS}
       ,t_macos
     {$endif}
-    {$ifndef NOTARGETDARWIN}
+    {$ifndef NOTARGETBSD}
       ,t_bsd
     {$endif}
+    {$ifndef NOTARGETDARWIN}
+      ,t_darwin
+    {$endif}
     {$ifndef NOTARGETMORPHOS}
       ,t_morph
     {$endif}

+ 2 - 2
compiler/powerpc64/cputarg.pas

@@ -38,8 +38,8 @@ implementation
     {$ifndef NOTARGETLINUX}
       ,t_linux
     {$endif}
-    {$ifndef NOTARGETBSD}
-      ,t_bsd
+    {$ifndef NOTARGETDARWIN}
+      ,t_darwin
     {$endif}
     {$ifndef NOTARGETAIX}
       ,t_aix

+ 1 - 0
compiler/systems.inc

@@ -258,6 +258,7 @@
              ld_android,
              ld_beos,
              ld_bsd,
+             ld_darwin,
              ld_embedded,
              ld_emx,
              ld_gba,

+ 2 - 572
compiler/systems/i_bsd.pas

@@ -1,8 +1,8 @@
 {
     Copyright (c) 1998-2008 by Peter Vreman
 
-    This unit implements support information structures for FreeBSD/NetBSD,
-    OpenBSD and Darwin (Mac OS X)
+    This unit implements support information structures for FreeBSD/NetBSD
+    and OpenBSD
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -742,554 +742,6 @@ unit i_bsd;
             llvmdatalayout : 'todo';
           );
 
-       system_powerpc_darwin_info  : tsysteminfo =
-          (
-            system       : system_powerpc_darwin;
-            name         : 'Darwin for PowerPC';
-            shortname    : 'Darwin';
-            flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,tf_pic_default,tf_has_winlike_resources,
-                            tf_supports_hidden_symbols];
-            cpu          : cpu_powerpc;
-            unit_env     : 'BSDUNITS';
-            extradefines : 'UNIX;BSD;HASUNIX';
-            exeext       : '';
-            defext       : '.def';
-            scriptext    : '.sh';
-            smartext     : '.sl';
-            unitext      : '.ppu';
-            unitlibext   : '.ppl';
-            asmext       : '.s';
-            objext       : '.o';
-            resext       : '.res';
-            resobjext    : '.or';
-            sharedlibext : '.dylib';
-            staticlibext : '.a';
-            staticlibprefix : 'libp';
-            sharedlibprefix : 'lib';
-            sharedClibext : '.dylib';
-            staticClibext : '.a';
-            staticClibprefix : 'lib';
-            sharedClibprefix : 'lib';
-            importlibprefix : 'libimp';
-            importlibext : '.a';
-            Cprefix      : '_';
-            newline      : #10;
-            dirsep       : '/';
-            assem        : as_darwin;
-            assemextern  : as_darwin;
-            link         : ld_none;
-            linkextern   : ld_bsd;
-            ar           : ar_gnu_ar;
-            res          : res_macho;
-            dbg          : dbg_stabs;
-            script       : script_unix;
-            endian       : endian_big;
-            alignment    :
-              (
-                procalign       : 16;
-                loopalign       : 4;
-                jumpalign       : 0;
-                jumpalignskipmax    : 0;
-                coalescealign   : 0;
-                coalescealignskipmax: 0;
-                constalignmin   : 0;
-                constalignmax   : 4;
-                varalignmin     : 0;
-                varalignmax     : 4;
-                localalignmin   : 0;
-                localalignmax   : 4;
-                recordalignmin  : 0;
-                recordalignmax  : 4;
-                maxCrecordalign : 4
-              );
-            first_parm_offset : 24;
-            stacksize   : 262144;
-            stackalign   : 16;
-            abi : abi_powerpc_darwin;
-            llvmdatalayout : 'E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32';
-          );
-
-
-
-       system_i386_darwin_info  : tsysteminfo =
-          (
-            system       : system_i386_darwin;
-            name         : 'Darwin for i386';
-            shortname    : 'Darwin';
-            flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,tf_pic_uses_got,
-                            tf_pic_default,tf_has_winlike_resources,tf_use_hlcfi,tf_supports_symbolorderfile,tf_supports_hidden_symbols];
-            cpu          : cpu_i386;
-            unit_env     : 'BSDUNITS';
-            extradefines : 'UNIX;BSD;HASUNIX';
-            exeext       : '';
-            defext       : '.def';
-            scriptext    : '.sh';
-            smartext     : '.sl';
-            unitext      : '.ppu';
-            unitlibext   : '.ppl';
-            asmext       : '.s';
-            objext       : '.o';
-            resext       : '.res';
-            resobjext    : '.or';
-            sharedlibext : '.dylib';
-            staticlibext : '.a';
-            staticlibprefix : 'libp';
-            sharedlibprefix : 'lib';
-            sharedClibext : '.dylib';
-            staticClibext : '.a';
-            staticClibprefix : 'lib';
-            sharedClibprefix : 'lib';
-            importlibprefix : 'libimp';
-            importlibext : '.a';
-            Cprefix      : '_';
-            newline      : #10;
-            dirsep       : '/';
-            assem        : as_clang;
-            assemextern  : as_clang;
-            link         : ld_none;
-            linkextern   : ld_bsd;
-            ar           : ar_gnu_ar;
-            res          : res_macho;
-            dbg          : dbg_dwarf2;
-            script       : script_unix;
-            endian       : endian_little;
-            alignment    :
-              (
-                procalign       : 16;
-                loopalign       : 8;
-                jumpalign       : 16;
-                jumpalignskipmax    : 10;
-                coalescealign   : 0;
-                coalescealignskipmax: 0;
-                constalignmin   : 0;
-                constalignmax   : 16;
-                varalignmin     : 0;
-                varalignmax     : 16;
-                localalignmin   : 0;
-                localalignmax   : 8;
-                recordalignmin  : 0;
-                recordalignmax  : 16;
-                maxCrecordalign : 16
-              );
-            first_parm_offset : 8;
-            stacksize   : 262144;
-            stackalign   : 16;
-            abi         : abi_i386_dynalignedstack;
-            llvmdatalayout : 'e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32-S128';
-          );
-
-
-
-       system_i386_iphonesim_info  : tsysteminfo =
-          (
-            system       : system_i386_iphonesim;
-            name         : 'Darwin/iPhoneSim for i386';
-            shortname    : 'iPhoneSim';
-            flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,
-                            tf_pic_uses_got,tf_pic_default,tf_has_winlike_resources,tf_use_hlcfi,tf_supports_hidden_symbols];
-            cpu          : cpu_i386;
-            unit_env     : 'BSDUNITS';
-            extradefines : 'UNIX;BSD;HASUNIX;DARWIN'; // also define darwin for code compatibility
-            exeext       : '';
-            defext       : '.def';
-            scriptext    : '.sh';
-            smartext     : '.sl';
-            unitext      : '.ppu';
-            unitlibext   : '.ppl';
-            asmext       : '.s';
-            objext       : '.o';
-            resext       : '.res';
-            resobjext    : '.or';
-            sharedlibext : '.dylib';
-            staticlibext : '.a';
-            staticlibprefix : 'libp';
-            sharedlibprefix : 'lib';
-            sharedClibext : '.dylib';
-            staticClibext : '.a';
-            staticClibprefix : 'lib';
-            sharedClibprefix : 'lib';
-            importlibprefix : 'libimp';
-            importlibext : '.a';
-            Cprefix      : '_';
-            newline      : #10;
-            dirsep       : '/';
-            assem        : as_clang;
-            assemextern  : as_clang;
-            link         : ld_none;
-            linkextern   : ld_bsd;
-            ar           : ar_gnu_ar;
-            res          : res_macho;
-            dbg          : dbg_dwarf2;
-            script       : script_unix;
-            endian       : endian_little;
-            alignment    :
-              (
-                procalign       : 16;
-                loopalign       : 8;
-                jumpalign       : 16;
-                jumpalignskipmax    : 10;
-                coalescealign   : 0;
-                coalescealignskipmax: 0;
-                constalignmin   : 0;
-                constalignmax   : 16;
-                varalignmin     : 0;
-                varalignmax     : 16;
-                localalignmin   : 0;
-                localalignmax   : 16;
-                recordalignmin  : 0;
-                recordalignmax  : 16;
-                maxCrecordalign : 16
-              );
-            first_parm_offset : 8;
-            stacksize   : 262144;
-            stackalign   : 16;
-            abi         : abi_i386_dynalignedstack;
-            llvmdatalayout : 'e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32-S128';
-          );
-
-
-
-       system_powerpc64_darwin_info  : tsysteminfo =
-          (
-            system       : system_powerpc64_darwin;
-            name         : 'Darwin for PowerPC64';
-            shortname    : 'Darwin';
-            flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,
-                            tf_pic_default,tf_has_winlike_resources,tf_supports_symbolorderfile,tf_supports_hidden_symbols];
-            cpu          : cpu_powerpc64;
-            unit_env     : 'BSDUNITS';
-            extradefines : 'UNIX;BSD;HASUNIX';
-            exeext       : '';
-            defext       : '.def';
-            scriptext    : '.sh';
-            smartext     : '.sl';
-            unitext      : '.ppu';
-            unitlibext   : '.ppl';
-            asmext       : '.s';
-            objext       : '.o';
-            resext       : '.res';
-            resobjext    : '.or';
-            sharedlibext : '.dylib';
-            staticlibext : '.a';
-            staticlibprefix : 'libp';
-            sharedlibprefix : 'lib';
-            sharedClibext : '.dylib';
-            staticClibext : '.a';
-            staticClibprefix : 'lib';
-            sharedClibprefix : 'lib';
-            importlibprefix : 'libimp';
-            importlibext : '.a';
-            Cprefix      : '_';
-            newline      : #10;
-            dirsep       : '/';
-            assem        : as_darwin;
-            assemextern  : as_darwin;
-            link         : ld_none;
-            linkextern   : ld_bsd;
-            ar           : ar_gnu_ar;
-            res          : res_macho;
-            dbg          : dbg_dwarf2;
-            script       : script_unix;
-            endian       : endian_big;
-            alignment    :
-              (
-                procalign       : 16;
-                loopalign       : 4;
-                jumpalign       : 0;
-                jumpalignskipmax    : 0;
-                coalescealign   : 0;
-                coalescealignskipmax: 0;
-                constalignmin   : 4;
-                constalignmax   : 8;
-                varalignmin     : 4;
-                varalignmax     : 8;
-                localalignmin   : 4;
-                localalignmax   : 8;
-                recordalignmin  : 0;
-                recordalignmax  : 8;
-                maxCrecordalign : 4
-              );
-            first_parm_offset : 48;
-            stacksize   : 262144;
-            stackalign   : 16;
-            abi : abi_powerpc_darwin;
-            llvmdatalayout : 'E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64';
-          );
-
-
-
-       system_x86_64_darwin_info  : tsysteminfo =
-          (
-            system       : system_x86_64_darwin;
-            name         : 'Darwin for x86_64';
-            shortname    : 'Darwin';
-            flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,tf_pic_default,tf_has_winlike_resources,tf_use_hlcfi
-                            {$ifdef llvm},tf_use_psabieh{$endif},tf_supports_symbolorderfile,tf_supports_hidden_symbols];
-            cpu          : cpu_x86_64;
-            unit_env     : 'BSDUNITS';
-            extradefines : 'UNIX;BSD;HASUNIX';
-            exeext       : '';
-            defext       : '.def';
-            scriptext    : '.sh';
-            smartext     : '.sl';
-            unitext      : '.ppu';
-            unitlibext   : '.ppl';
-            asmext       : '.s';
-            objext       : '.o';
-            resext       : '.res';
-            resobjext    : '.or';
-            sharedlibext : '.dylib';
-            staticlibext : '.a';
-            staticlibprefix : 'libp';
-            sharedlibprefix : 'lib';
-            sharedClibext : '.dylib';
-            staticClibext : '.a';
-            staticClibprefix : 'lib';
-            sharedClibprefix : 'lib';
-            importlibprefix : 'libimp';
-            importlibext : '.a';
-            Cprefix      : '_';
-            newline      : #10;
-            dirsep       : '/';
-            assem        : as_clang;
-            assemextern  : as_clang;
-            link         : ld_none;
-            linkextern   : ld_bsd;
-            ar           : ar_gnu_ar;
-            res          : res_macho;
-            dbg          : dbg_dwarf2;
-            script       : script_unix;
-            endian       : endian_little;
-            alignment    :
-              (
-                procalign       : 16;
-                loopalign       : 8;
-                jumpalign       : 16;
-                jumpalignskipmax    : 10;
-                coalescealign   : 0;
-                coalescealignskipmax: 0;
-                constalignmin   : 0;
-                constalignmax   : 16;
-                varalignmin     : 0;
-                varalignmax     : 16;
-                localalignmin   : 4;
-                localalignmax   : 16;
-                recordalignmin  : 0;
-                recordalignmax  : 16;
-                maxCrecordalign : 16
-              );
-            first_parm_offset : 16;
-            stacksize   : 262144;
-            stackalign   : 16;
-            abi : abi_default;
-            llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128';
-          );
-
-
-       system_x86_64_iphonesim_info  : tsysteminfo =
-          (
-            system       : system_x86_64_iphonesim;
-            name         : 'Darwin/iPhoneSim for x86_64';
-            shortname    : 'iPhoneSim';
-            flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,
-                            tf_pic_default,tf_has_winlike_resources,tf_use_hlcfi,tf_supports_hidden_symbols];
-            cpu          : cpu_x86_64;
-            unit_env     : 'BSDUNITS';
-            extradefines : 'UNIX;BSD;HASUNIX;DARWIN'; // also define darwin for code compatibility
-            exeext       : '';
-            defext       : '.def';
-            scriptext    : '.sh';
-            smartext     : '.sl';
-            unitext      : '.ppu';
-            unitlibext   : '.ppl';
-            asmext       : '.s';
-            objext       : '.o';
-            resext       : '.res';
-            resobjext    : '.or';
-            sharedlibext : '.dylib';
-            staticlibext : '.a';
-            staticlibprefix : 'libp';
-            sharedlibprefix : 'lib';
-            sharedClibext : '.dylib';
-            staticClibext : '.a';
-            staticClibprefix : 'lib';
-            sharedClibprefix : 'lib';
-            importlibprefix : 'libimp';
-            importlibext : '.a';
-            Cprefix      : '_';
-            newline      : #10;
-            dirsep       : '/';
-            assem        : as_clang;
-            assemextern  : as_clang;
-            link         : ld_none;
-            linkextern   : ld_bsd;
-            ar           : ar_gnu_ar;
-            res          : res_macho;
-            dbg          : dbg_dwarf2;
-            script       : script_unix;
-            endian       : endian_little;
-            alignment    :
-              (
-                procalign       : 16;
-                loopalign       : 8;
-                jumpalign       : 16;
-                jumpalignskipmax    : 10;
-                coalescealign   : 0;
-                coalescealignskipmax: 0;
-                constalignmin   : 0;
-                constalignmax   : 16;
-                varalignmin     : 0;
-                varalignmax     : 16;
-                localalignmin   : 4;
-                localalignmax   : 16;
-                recordalignmin  : 0;
-                recordalignmax  : 16;
-                maxCrecordalign : 16
-              );
-            first_parm_offset : 16;
-            stacksize   : 262144;
-            stackalign   : 16;
-            abi : abi_default;
-            llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128';
-          );
-
-
-       system_arm_darwin_info : tsysteminfo =
-          (
-            system       : system_arm_darwin;
-            name         : 'Darwin for ARM';
-            shortname    : 'Darwin';
-            flags        : [tf_p_ext_support,tf_requires_proper_alignment,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,
-                            tf_dwarf_only_local_labels,tf_has_winlike_resources,tf_pic_default,tf_supports_symbolorderfile,tf_supports_hidden_symbols];
-            cpu          : cpu_arm;
-            unit_env     : 'BSDUNITS';
-            extradefines : 'UNIX;BSD;HASUNIX;CPUARMEL';
-            exeext       : '';
-            defext       : '.def';
-            scriptext    : '.sh';
-            smartext     : '.sl';
-            unitext      : '.ppu';
-            unitlibext   : '.ppl';
-            asmext       : '.s';
-            objext       : '.o';
-            resext       : '.res';
-            resobjext    : '.or';
-            sharedlibext : '.dylib';
-            staticlibext : '.a';
-            staticlibprefix : 'libp';
-            sharedlibprefix : 'lib';
-            sharedClibext : '.dylib';
-            staticClibext : '.a';
-            staticClibprefix : 'lib';
-            sharedClibprefix : 'lib';
-            importlibprefix : 'libimp';
-            importlibext : '.a';
-            Cprefix      : '_';
-            newline      : #10;
-            dirsep       : '/';
-            assem        : as_clang;
-            assemextern  : as_clang;
-            link         : ld_none;
-            linkextern   : ld_bsd;
-            ar           : ar_gnu_ar;
-            res          : res_macho;
-            dbg          : dbg_dwarf2;
-            script       : script_unix;
-            endian       : endian_little;
-            alignment    :
-              (
-                procalign       : 16;
-                loopalign       : 4;
-                jumpalign       : 0;
-                jumpalignskipmax    : 0;
-                coalescealign   : 0;
-                coalescealignskipmax: 0;
-                constalignmin   : 0;
-                constalignmax   : 8;
-                varalignmin     : 0;
-                varalignmax     : 8;
-                localalignmin   : 4;
-                localalignmax   : 8;
-                recordalignmin  : 0;
-                recordalignmax  : 8;
-                maxCrecordalign : 8
-              );
-            first_parm_offset : 8;
-            stacksize    : 262144;
-            stackalign   : 4;
-            abi : abi_default;
-            { note: default LLVM stack alignment is 8 bytes for this target }
-            llvmdatalayout : 'e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S32';
-          );
-
-
-       system_aarch64_darwin_info  : tsysteminfo =
-          (
-            system       : system_aarch64_darwin;
-            name         : 'Darwin for AArch64';
-            shortname    : 'Darwin';
-            flags        : [tf_p_ext_support,tf_requires_proper_alignment,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,
-                            tf_dwarf_only_local_labels,tf_pic_default,tf_has_winlike_resources,tf_supports_symbolorderfile,tf_supports_hidden_symbols];
-            cpu          : cpu_aarch64;
-            unit_env     : 'BSDUNITS';
-            extradefines : 'UNIX;BSD;HASUNIX';
-            exeext       : '';
-            defext       : '.def';
-            scriptext    : '.sh';
-            smartext     : '.sl';
-            unitext      : '.ppu';
-            unitlibext   : '.ppl';
-            asmext       : '.s';
-            objext       : '.o';
-            resext       : '.res';
-            resobjext    : '.or';
-            sharedlibext : '.dylib';
-            staticlibext : '.a';
-            staticlibprefix : 'libp';
-            sharedlibprefix : 'lib';
-            sharedClibext : '.dylib';
-            staticClibext : '.a';
-            staticClibprefix : 'lib';
-            sharedClibprefix : 'lib';
-            importlibprefix : 'libimp';
-            importlibext : '.a';
-            Cprefix      : '_';
-            newline      : #10;
-            dirsep       : '/';
-            assem        : as_clang;
-            assemextern  : as_clang;
-            link         : ld_none;
-            linkextern   : ld_bsd;
-            ar           : ar_gnu_ar;
-            res          : res_macho;
-            dbg          : dbg_dwarf2;
-            script       : script_unix;
-            endian       : endian_little;
-            alignment    :
-              (
-                procalign       : 16;
-                loopalign       : 4;
-                jumpalign       : 0;
-                jumpalignskipmax    : 0;
-                coalescealign   : 0;
-                coalescealignskipmax: 0;
-                constalignmin   : 0;
-                constalignmax   : 16;
-                varalignmin     : 0;
-                varalignmax     : 16;
-                localalignmin   : 4;
-                localalignmax   : 16;
-                recordalignmin  : 0;
-                recordalignmax  : 16;
-                maxCrecordalign : 16
-              );
-            first_parm_offset : 16;
-            stacksize   : 8*1024*1024;
-            stackalign   : 16;
-            abi : abi_aarch64_darwin;
-            llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32:64-S128'
-          );
-
 
 
   implementation
@@ -1305,9 +757,6 @@ initialization
   {$ifdef OpenBSD}
      set_source_info(system_i386_OpenBSD_info);
   {$endif}
-  {$ifdef Darwin}
-     set_source_info(system_i386_Darwin_info);
-  {$endif Darwin}
 {$endif cpui386}
 {$ifdef cpux86_64}
    {$ifdef FreeBSD}
@@ -1322,9 +771,6 @@ initialization
    {$ifdef NetBSD}
      set_source_info(system_x86_64_NetBSD_info);
    {$endif}
-   {$ifdef Darwin}
-     set_source_info(system_x86_64_darwin_info);
-   {$endif}
 {$endif}
 {$ifdef cpu68}
   {$ifdef NetBSD}
@@ -1332,29 +778,13 @@ initialization
   {$endif NetBSD}
 {$endif cpu68}
 {$ifdef cpupowerpc32}
-  {$ifdef Darwin}
-     set_source_info(system_powerpc_darwin_info);
-  {$endif Darwin}
   {$ifdef NetBSD}
      set_source_info(system_powerpc_netbsd_info);
   {$endif}
 {$endif cpupowerpc32}
-{$ifdef cpupowerpc64}
-  {$ifdef Darwin}
-     set_source_info(system_powerpc64_darwin_info);
-  {$endif Darwin}
-{$endif powerpc64}
 {$ifdef cpuarm}
-  {$ifdef Darwin}
-     set_source_info(system_arm_darwin_info);
-  {$endif Darwin}
   {$ifdef NetBSD}
      set_source_info(system_arm_netbsd_info);
   {$endif}
 {$endif cpuarm}
-{$ifdef cpuaarch64}
-  {$ifdef Darwin}
-     set_source_info(system_aarch64_darwin_info);
-  {$endif Darwin}
-{$endif cpuaarch64}
 end.

+ 636 - 0
compiler/systems/i_darwin.pas

@@ -0,0 +1,636 @@
+{
+    Copyright (c) 1998-2008 by Peter Vreman
+
+    This unit implements support information structures for Darwin
+    (Mac OS X/OS X/macOS/iOS/iPhoneSimulator/...)
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 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 i_darwin;
+
+{$i fpcdefs.inc}
+
+interface
+
+uses
+   systems;
+
+const
+   res_macho_info : tresinfo =
+       (
+         id     : res_macho;
+         resbin : 'fpcres';
+         rescmd : '-o $OBJ -a $ARCH -s $SUBARCH -of mach-o $DBG';
+         rcbin  : 'windres';
+         rccmd  : '--include $INC -O res -D FPC -o $RES $RC';
+         resourcefileclass : nil;
+         resflags : [];
+       );
+   res_macosx_ext_info : tresinfo =
+      (
+         id     : res_ext;
+         resbin : 'fpcres';
+         rescmd : '-o $OBJ -a $ENDIAN -of external $DBG';
+         rcbin  : 'windres';
+         rccmd  : '--include $INC -O res -D FPC -o $RES $RC';
+         resourcefileclass : nil;
+         resflags : [res_external_file,res_arch_in_file_name];
+      );
+
+   system_powerpc_darwin_info  : tsysteminfo =
+      (
+        system       : system_powerpc_darwin;
+        name         : 'Darwin for PowerPC';
+        shortname    : 'Darwin';
+        flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,tf_pic_default,tf_has_winlike_resources,
+                        tf_supports_hidden_symbols];
+        cpu          : cpu_powerpc;
+        unit_env     : 'BSDUNITS';
+        extradefines : 'UNIX;BSD;HASUNIX';
+        exeext       : '';
+        defext       : '.def';
+        scriptext    : '.sh';
+        smartext     : '.sl';
+        unitext      : '.ppu';
+        unitlibext   : '.ppl';
+        asmext       : '.s';
+        objext       : '.o';
+        resext       : '.res';
+        resobjext    : '.or';
+        sharedlibext : '.dylib';
+        staticlibext : '.a';
+        staticlibprefix : 'libp';
+        sharedlibprefix : 'lib';
+        sharedClibext : '.dylib';
+        staticClibext : '.a';
+        staticClibprefix : 'lib';
+        sharedClibprefix : 'lib';
+        importlibprefix : 'libimp';
+        importlibext : '.a';
+        Cprefix      : '_';
+        newline      : #10;
+        dirsep       : '/';
+        assem        : as_darwin;
+        assemextern  : as_darwin;
+        link         : ld_none;
+        linkextern   : ld_darwin;
+        ar           : ar_gnu_ar;
+        res          : res_macho;
+        dbg          : dbg_stabs;
+        script       : script_unix;
+        endian       : endian_big;
+        alignment    :
+          (
+            procalign       : 16;
+            loopalign       : 4;
+            jumpalign       : 0;
+            jumpalignskipmax    : 0;
+            coalescealign   : 0;
+            coalescealignskipmax: 0;
+            constalignmin   : 0;
+            constalignmax   : 4;
+            varalignmin     : 0;
+            varalignmax     : 4;
+            localalignmin   : 0;
+            localalignmax   : 4;
+            recordalignmin  : 0;
+            recordalignmax  : 4;
+            maxCrecordalign : 4
+          );
+        first_parm_offset : 24;
+        stacksize   : 262144;
+        stackalign   : 16;
+        abi : abi_powerpc_darwin;
+        llvmdatalayout : 'E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32';
+      );
+
+
+
+   system_i386_darwin_info  : tsysteminfo =
+      (
+        system       : system_i386_darwin;
+        name         : 'Darwin for i386';
+        shortname    : 'Darwin';
+        flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,tf_pic_uses_got,
+                        tf_pic_default,tf_has_winlike_resources,tf_use_hlcfi,tf_supports_symbolorderfile,tf_supports_hidden_symbols];
+        cpu          : cpu_i386;
+        unit_env     : 'BSDUNITS';
+        extradefines : 'UNIX;BSD;HASUNIX';
+        exeext       : '';
+        defext       : '.def';
+        scriptext    : '.sh';
+        smartext     : '.sl';
+        unitext      : '.ppu';
+        unitlibext   : '.ppl';
+        asmext       : '.s';
+        objext       : '.o';
+        resext       : '.res';
+        resobjext    : '.or';
+        sharedlibext : '.dylib';
+        staticlibext : '.a';
+        staticlibprefix : 'libp';
+        sharedlibprefix : 'lib';
+        sharedClibext : '.dylib';
+        staticClibext : '.a';
+        staticClibprefix : 'lib';
+        sharedClibprefix : 'lib';
+        importlibprefix : 'libimp';
+        importlibext : '.a';
+        Cprefix      : '_';
+        newline      : #10;
+        dirsep       : '/';
+        assem        : as_clang;
+        assemextern  : as_clang;
+        link         : ld_none;
+        linkextern   : ld_darwin;
+        ar           : ar_gnu_ar;
+        res          : res_macho;
+        dbg          : dbg_dwarf2;
+        script       : script_unix;
+        endian       : endian_little;
+        alignment    :
+          (
+            procalign       : 16;
+            loopalign       : 8;
+            jumpalign       : 16;
+            jumpalignskipmax    : 10;
+            coalescealign   : 0;
+            coalescealignskipmax: 0;
+            constalignmin   : 0;
+            constalignmax   : 16;
+            varalignmin     : 0;
+            varalignmax     : 16;
+            localalignmin   : 0;
+            localalignmax   : 8;
+            recordalignmin  : 0;
+            recordalignmax  : 16;
+            maxCrecordalign : 16
+          );
+        first_parm_offset : 8;
+        stacksize   : 262144;
+        stackalign   : 16;
+        abi         : abi_i386_dynalignedstack;
+        llvmdatalayout : 'e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32-S128';
+      );
+
+
+
+   system_i386_iphonesim_info  : tsysteminfo =
+      (
+        system       : system_i386_iphonesim;
+        name         : 'Darwin/iPhoneSim for i386';
+        shortname    : 'iPhoneSim';
+        flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,
+                        tf_pic_uses_got,tf_pic_default,tf_has_winlike_resources,tf_use_hlcfi,tf_supports_hidden_symbols];
+        cpu          : cpu_i386;
+        unit_env     : 'BSDUNITS';
+        extradefines : 'UNIX;BSD;HASUNIX;DARWIN'; // also define darwin for code compatibility
+        exeext       : '';
+        defext       : '.def';
+        scriptext    : '.sh';
+        smartext     : '.sl';
+        unitext      : '.ppu';
+        unitlibext   : '.ppl';
+        asmext       : '.s';
+        objext       : '.o';
+        resext       : '.res';
+        resobjext    : '.or';
+        sharedlibext : '.dylib';
+        staticlibext : '.a';
+        staticlibprefix : 'libp';
+        sharedlibprefix : 'lib';
+        sharedClibext : '.dylib';
+        staticClibext : '.a';
+        staticClibprefix : 'lib';
+        sharedClibprefix : 'lib';
+        importlibprefix : 'libimp';
+        importlibext : '.a';
+        Cprefix      : '_';
+        newline      : #10;
+        dirsep       : '/';
+        assem        : as_clang;
+        assemextern  : as_clang;
+        link         : ld_none;
+        linkextern   : ld_darwin;
+        ar           : ar_gnu_ar;
+        res          : res_macho;
+        dbg          : dbg_dwarf2;
+        script       : script_unix;
+        endian       : endian_little;
+        alignment    :
+          (
+            procalign       : 16;
+            loopalign       : 8;
+            jumpalign       : 16;
+            jumpalignskipmax    : 10;
+            coalescealign   : 0;
+            coalescealignskipmax: 0;
+            constalignmin   : 0;
+            constalignmax   : 16;
+            varalignmin     : 0;
+            varalignmax     : 16;
+            localalignmin   : 0;
+            localalignmax   : 16;
+            recordalignmin  : 0;
+            recordalignmax  : 16;
+            maxCrecordalign : 16
+          );
+        first_parm_offset : 8;
+        stacksize   : 262144;
+        stackalign   : 16;
+        abi         : abi_i386_dynalignedstack;
+        llvmdatalayout : 'e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32-S128';
+      );
+
+
+
+   system_powerpc64_darwin_info  : tsysteminfo =
+      (
+        system       : system_powerpc64_darwin;
+        name         : 'Darwin for PowerPC64';
+        shortname    : 'Darwin';
+        flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,
+                        tf_pic_default,tf_has_winlike_resources,tf_supports_symbolorderfile,tf_supports_hidden_symbols];
+        cpu          : cpu_powerpc64;
+        unit_env     : 'BSDUNITS';
+        extradefines : 'UNIX;BSD;HASUNIX';
+        exeext       : '';
+        defext       : '.def';
+        scriptext    : '.sh';
+        smartext     : '.sl';
+        unitext      : '.ppu';
+        unitlibext   : '.ppl';
+        asmext       : '.s';
+        objext       : '.o';
+        resext       : '.res';
+        resobjext    : '.or';
+        sharedlibext : '.dylib';
+        staticlibext : '.a';
+        staticlibprefix : 'libp';
+        sharedlibprefix : 'lib';
+        sharedClibext : '.dylib';
+        staticClibext : '.a';
+        staticClibprefix : 'lib';
+        sharedClibprefix : 'lib';
+        importlibprefix : 'libimp';
+        importlibext : '.a';
+        Cprefix      : '_';
+        newline      : #10;
+        dirsep       : '/';
+        assem        : as_darwin;
+        assemextern  : as_darwin;
+        link         : ld_none;
+        linkextern   : ld_darwin;
+        ar           : ar_gnu_ar;
+        res          : res_macho;
+        dbg          : dbg_dwarf2;
+        script       : script_unix;
+        endian       : endian_big;
+        alignment    :
+          (
+            procalign       : 16;
+            loopalign       : 4;
+            jumpalign       : 0;
+            jumpalignskipmax    : 0;
+            coalescealign   : 0;
+            coalescealignskipmax: 0;
+            constalignmin   : 4;
+            constalignmax   : 8;
+            varalignmin     : 4;
+            varalignmax     : 8;
+            localalignmin   : 4;
+            localalignmax   : 8;
+            recordalignmin  : 0;
+            recordalignmax  : 8;
+            maxCrecordalign : 4
+          );
+        first_parm_offset : 48;
+        stacksize   : 262144;
+        stackalign   : 16;
+        abi : abi_powerpc_darwin;
+        llvmdatalayout : 'E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64';
+      );
+
+
+
+   system_x86_64_darwin_info  : tsysteminfo =
+      (
+        system       : system_x86_64_darwin;
+        name         : 'Darwin for x86_64';
+        shortname    : 'Darwin';
+        flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,tf_pic_default,tf_has_winlike_resources,tf_use_hlcfi
+                        {$ifdef llvm},tf_use_psabieh{$endif},tf_supports_symbolorderfile,tf_supports_hidden_symbols];
+        cpu          : cpu_x86_64;
+        unit_env     : 'BSDUNITS';
+        extradefines : 'UNIX;BSD;HASUNIX';
+        exeext       : '';
+        defext       : '.def';
+        scriptext    : '.sh';
+        smartext     : '.sl';
+        unitext      : '.ppu';
+        unitlibext   : '.ppl';
+        asmext       : '.s';
+        objext       : '.o';
+        resext       : '.res';
+        resobjext    : '.or';
+        sharedlibext : '.dylib';
+        staticlibext : '.a';
+        staticlibprefix : 'libp';
+        sharedlibprefix : 'lib';
+        sharedClibext : '.dylib';
+        staticClibext : '.a';
+        staticClibprefix : 'lib';
+        sharedClibprefix : 'lib';
+        importlibprefix : 'libimp';
+        importlibext : '.a';
+        Cprefix      : '_';
+        newline      : #10;
+        dirsep       : '/';
+        assem        : as_clang;
+        assemextern  : as_clang;
+        link         : ld_none;
+        linkextern   : ld_darwin;
+        ar           : ar_gnu_ar;
+        res          : res_macho;
+        dbg          : dbg_dwarf2;
+        script       : script_unix;
+        endian       : endian_little;
+        alignment    :
+          (
+            procalign       : 16;
+            loopalign       : 8;
+            jumpalign       : 16;
+            jumpalignskipmax    : 10;
+            coalescealign   : 0;
+            coalescealignskipmax: 0;
+            constalignmin   : 0;
+            constalignmax   : 16;
+            varalignmin     : 0;
+            varalignmax     : 16;
+            localalignmin   : 4;
+            localalignmax   : 16;
+            recordalignmin  : 0;
+            recordalignmax  : 16;
+            maxCrecordalign : 16
+          );
+        first_parm_offset : 16;
+        stacksize   : 262144;
+        stackalign   : 16;
+        abi : abi_default;
+        llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128';
+      );
+
+
+   system_x86_64_iphonesim_info  : tsysteminfo =
+      (
+        system       : system_x86_64_iphonesim;
+        name         : 'Darwin/iPhoneSim for x86_64';
+        shortname    : 'iPhoneSim';
+        flags        : [tf_p_ext_support,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,tf_dwarf_only_local_labels,
+                        tf_pic_default,tf_has_winlike_resources,tf_use_hlcfi,tf_supports_hidden_symbols];
+        cpu          : cpu_x86_64;
+        unit_env     : 'BSDUNITS';
+        extradefines : 'UNIX;BSD;HASUNIX;DARWIN'; // also define darwin for code compatibility
+        exeext       : '';
+        defext       : '.def';
+        scriptext    : '.sh';
+        smartext     : '.sl';
+        unitext      : '.ppu';
+        unitlibext   : '.ppl';
+        asmext       : '.s';
+        objext       : '.o';
+        resext       : '.res';
+        resobjext    : '.or';
+        sharedlibext : '.dylib';
+        staticlibext : '.a';
+        staticlibprefix : 'libp';
+        sharedlibprefix : 'lib';
+        sharedClibext : '.dylib';
+        staticClibext : '.a';
+        staticClibprefix : 'lib';
+        sharedClibprefix : 'lib';
+        importlibprefix : 'libimp';
+        importlibext : '.a';
+        Cprefix      : '_';
+        newline      : #10;
+        dirsep       : '/';
+        assem        : as_clang;
+        assemextern  : as_clang;
+        link         : ld_none;
+        linkextern   : ld_darwin;
+        ar           : ar_gnu_ar;
+        res          : res_macho;
+        dbg          : dbg_dwarf2;
+        script       : script_unix;
+        endian       : endian_little;
+        alignment    :
+          (
+            procalign       : 16;
+            loopalign       : 8;
+            jumpalign       : 16;
+            jumpalignskipmax    : 10;
+            coalescealign   : 0;
+            coalescealignskipmax: 0;
+            constalignmin   : 0;
+            constalignmax   : 16;
+            varalignmin     : 0;
+            varalignmax     : 16;
+            localalignmin   : 4;
+            localalignmax   : 16;
+            recordalignmin  : 0;
+            recordalignmax  : 16;
+            maxCrecordalign : 16
+          );
+        first_parm_offset : 16;
+        stacksize   : 262144;
+        stackalign   : 16;
+        abi : abi_default;
+        llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128';
+      );
+
+
+   system_arm_darwin_info : tsysteminfo =
+      (
+        system       : system_arm_darwin;
+        name         : 'Darwin for ARM';
+        shortname    : 'Darwin';
+        flags        : [tf_p_ext_support,tf_requires_proper_alignment,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,
+                        tf_dwarf_only_local_labels,tf_has_winlike_resources,tf_pic_default,tf_supports_symbolorderfile,tf_supports_hidden_symbols];
+        cpu          : cpu_arm;
+        unit_env     : 'BSDUNITS';
+        extradefines : 'UNIX;BSD;HASUNIX;CPUARMEL';
+        exeext       : '';
+        defext       : '.def';
+        scriptext    : '.sh';
+        smartext     : '.sl';
+        unitext      : '.ppu';
+        unitlibext   : '.ppl';
+        asmext       : '.s';
+        objext       : '.o';
+        resext       : '.res';
+        resobjext    : '.or';
+        sharedlibext : '.dylib';
+        staticlibext : '.a';
+        staticlibprefix : 'libp';
+        sharedlibprefix : 'lib';
+        sharedClibext : '.dylib';
+        staticClibext : '.a';
+        staticClibprefix : 'lib';
+        sharedClibprefix : 'lib';
+        importlibprefix : 'libimp';
+        importlibext : '.a';
+        Cprefix      : '_';
+        newline      : #10;
+        dirsep       : '/';
+        assem        : as_clang;
+        assemextern  : as_clang;
+        link         : ld_none;
+        linkextern   : ld_darwin;
+        ar           : ar_gnu_ar;
+        res          : res_macho;
+        dbg          : dbg_dwarf2;
+        script       : script_unix;
+        endian       : endian_little;
+        alignment    :
+          (
+            procalign       : 16;
+            loopalign       : 4;
+            jumpalign       : 0;
+            jumpalignskipmax    : 0;
+            coalescealign   : 0;
+            coalescealignskipmax: 0;
+            constalignmin   : 0;
+            constalignmax   : 8;
+            varalignmin     : 0;
+            varalignmax     : 8;
+            localalignmin   : 4;
+            localalignmax   : 8;
+            recordalignmin  : 0;
+            recordalignmax  : 8;
+            maxCrecordalign : 8
+          );
+        first_parm_offset : 8;
+        stacksize    : 262144;
+        stackalign   : 4;
+        abi : abi_default;
+        { note: default LLVM stack alignment is 8 bytes for this target }
+        llvmdatalayout : 'e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S32';
+      );
+
+
+   system_aarch64_darwin_info  : tsysteminfo =
+      (
+        system       : system_aarch64_darwin;
+        name         : 'Darwin for AArch64';
+        shortname    : 'Darwin';
+        flags        : [tf_p_ext_support,tf_requires_proper_alignment,tf_files_case_sensitive,tf_smartlink_sections,tf_dwarf_relative_addresses,
+                        tf_dwarf_only_local_labels,tf_pic_default,tf_has_winlike_resources,tf_supports_symbolorderfile,tf_supports_hidden_symbols];
+        cpu          : cpu_aarch64;
+        unit_env     : 'BSDUNITS';
+        extradefines : 'UNIX;BSD;HASUNIX';
+        exeext       : '';
+        defext       : '.def';
+        scriptext    : '.sh';
+        smartext     : '.sl';
+        unitext      : '.ppu';
+        unitlibext   : '.ppl';
+        asmext       : '.s';
+        objext       : '.o';
+        resext       : '.res';
+        resobjext    : '.or';
+        sharedlibext : '.dylib';
+        staticlibext : '.a';
+        staticlibprefix : 'libp';
+        sharedlibprefix : 'lib';
+        sharedClibext : '.dylib';
+        staticClibext : '.a';
+        staticClibprefix : 'lib';
+        sharedClibprefix : 'lib';
+        importlibprefix : 'libimp';
+        importlibext : '.a';
+        Cprefix      : '_';
+        newline      : #10;
+        dirsep       : '/';
+        assem        : as_clang;
+        assemextern  : as_clang;
+        link         : ld_none;
+        linkextern   : ld_darwin;
+        ar           : ar_gnu_ar;
+        res          : res_macho;
+        dbg          : dbg_dwarf2;
+        script       : script_unix;
+        endian       : endian_little;
+        alignment    :
+          (
+            procalign       : 16;
+            loopalign       : 4;
+            jumpalign       : 0;
+            jumpalignskipmax    : 0;
+            coalescealign   : 0;
+            coalescealignskipmax: 0;
+            constalignmin   : 0;
+            constalignmax   : 16;
+            varalignmin     : 0;
+            varalignmax     : 16;
+            localalignmin   : 4;
+            localalignmax   : 16;
+            recordalignmin  : 0;
+            recordalignmax  : 16;
+            maxCrecordalign : 16
+          );
+        first_parm_offset : 16;
+        stacksize   : 8*1024*1024;
+        stackalign   : 16;
+        abi : abi_aarch64_darwin;
+        llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32:64-S128'
+      );
+
+implementation
+
+initialization
+  {$ifdef cpui386}
+    {$ifdef Darwin}
+      set_source_info(system_i386_Darwin_info);
+    {$endif Darwin}
+  {$endif cpui386}
+  {$ifdef cpux86_64}
+    {$ifdef Darwin}
+      set_source_info(system_x86_64_darwin_info);
+    {$endif}
+  {$endif cpux86_64}
+  {$ifdef cpupowerpc32}
+    {$ifdef Darwin}
+      set_source_info(system_powerpc_darwin_info);
+    {$endif Darwin}
+  {$endif cpupowerpc32}
+  {$ifdef cpupowerpc64}
+    {$ifdef Darwin}
+      set_source_info(system_powerpc64_darwin_info);
+    {$endif Darwin}
+  {$endif powerpc64}
+  {$ifdef cpuarm}
+    {$ifdef Darwin}
+      set_source_info(system_arm_darwin_info);
+    {$endif Darwin}
+  {$endif cpuarm}
+  {$ifdef cpuaarch64}
+    {$ifdef Darwin}
+      set_source_info(system_aarch64_darwin_info);
+    {$endif Darwin}
+  {$endif cpuaarch64}
+
+end.
+

+ 79 - 601
compiler/systems/t_bsd.pas

@@ -40,10 +40,6 @@ implementation
     cgutils,cgbase,cgobj,cpuinfo,ogbase;
 
   type
-    timportlibdarwin=class(timportlib)
-      procedure generatelib;override;
-    end;
-
     timportlibbsd=class(timportlib)
       procedure generatelib;override;
     end;
@@ -51,11 +47,6 @@ implementation
     texportlibbsd=class(texportlibunix)
     end;
 
-    texportlibdarwin=class(texportlibbsd)
-      procedure setinitname(list: TAsmList; const s: string); override;
-      procedure setfininame(list: TAsmList; const s: string); override;
-    end;
-
     tlinkerbsd=class(texternallinker)
     private
       LdSupportsNoResponseFile : boolean;
@@ -64,9 +55,6 @@ implementation
       ReOrder : Boolean;
       linklibc : boolean;
       Function  WriteResponseFile(isdll:boolean) : Boolean;
-      function GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
-      Function GetDarwinPrtobjName(isdll: boolean): TCmdStr;
-      Function WriteSymbolOrderFile: TCmdStr;
     public
       constructor Create;override;
       procedure SetDefaultInfo;override;
@@ -99,33 +87,6 @@ begin
 end;
 
 
-{*****************************************************************************
-                             TIMPORTLIBDARWIN
-*****************************************************************************}
-
-    procedure timportlibdarwin.generatelib;
-      begin
-      end;
-
-
-{*****************************************************************************
-                             TEXPORTLIBDARWIN
-*****************************************************************************}
-
-    procedure texportlibdarwin.setinitname(list: TAsmList; const s: string);
-      begin
-        new_section(list,sec_init_func,'',sizeof(pint));
-        list.concat(Tai_const.Createname(s,0));
-      end;
-
-
-    procedure texportlibdarwin.setfininame(list: TAsmList; const s: string);
-      begin
-        new_section(list,sec_term_func,'',sizeof(pint));
-        list.concat(Tai_const.Createname(s,0));
-      end;
-
-
 {*****************************************************************************
                                TIMPORTLIBBSD
 *****************************************************************************}
@@ -151,10 +112,7 @@ Constructor TLinkerBSD.Create;
 begin
   Inherited Create;
   if not Dontlinkstdlibpath Then
-   if target_info.system in systems_darwin then
-     { Mac OS X doesn't have a /lib }
-     LibrarySearchPath.AddLibraryPath(sysrootpath,'=/usr/lib',true)
-   else if target_info.system in systems_openbsd then
+   if target_info.system in systems_openbsd then
      LibrarySearchPath.AddLibraryPath(sysrootpath,'=/usr/lib;=$OPENBSD_X11BASE/lib;=$OPENBSD_LOCALBASE/lib',true)
    else
      LibrarySearchPath.AddLibraryPath(sysrootpath,'=/lib;=/usr/lib;=/usr/X11R6/lib',true);
@@ -176,49 +134,15 @@ begin
    begin
      if LdSupportsNoResponseFile then
        begin
-         if not(target_info.system in systems_darwin) then
-           begin
-             ExeCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $CATRES $FILELIST';
-             DllCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $MAP $LTO $ORDERSYMS -shared -L. -o $EXE $CATRES $FILELIST'
-           end
-         else
-           begin
-{$ifndef cpu64bitaddr}
-             { Set the size of the page at address zero to 64kb, so nothing
-               is loaded below that address. This avoids problems with the
-               strange Windows-compatible resource handling that assumes
-               that addresses below 64kb do not exist.
-
-               On 64bit systems, page zero is 4GB by default, so no problems
-               there.
-             }
-             { In case of valgrind, don't do that, because it cannot deal with
-               a custom pagezero size -- in general, this should not cause any
-               problems because the resources are added at the end and most
-               programs with problems that require Valgrind will have more
-               than 60KB of data (first 4KB of address space is always invalid)
-             }
-             ExeCmd[1]:=LdProgram+' $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
-             if not(cs_gdb_valgrind in current_settings.globalswitches) then
-               ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
-{$else ndef cpu64bitaddr}
-             ExeCmd[1]:=LdProgram+' $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
-{$endif ndef cpu64bitaddr}
-             if (apptype<>app_bundle) then
-               DllCmd[1]:=LdProgram+' $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -dylib -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
-             else
-               DllCmd[1]:=LdProgram+' $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -bundle -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
-           end
+         ExeCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $CATRES $FILELIST';
+         DllCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $MAP $LTO $ORDERSYMS -shared -L. -o $EXE $CATRES $FILELIST'
        end
      else
        begin
          ExeCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $RES';
          DllCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $INIT $FINI $SONAME $MAP $LTO $ORDERSYMS -shared -L. -o $EXE $RES';
        end;
-     if not(target_info.system in systems_darwin) then
-       DllCmd[2]:='strip --strip-unneeded $EXE'
-     else
-       DllCmd[2]:='strip -x $EXE';
+     DllCmd[2]:='strip --strip-unneeded $EXE';
      { OpenBSD seems to use a wrong dynamic linker by default }
      if target_info.system in systems_openbsd then
       DynamicLinker:='/usr/libexec/ld.so'
@@ -235,26 +159,18 @@ procedure TLinkerBSD.LoadPredefinedLibraryOrder;
 // put your linkorder/linkalias overrides here.
 // Note: assumes only called when reordering/aliasing is used.
 Begin
-  if not(target_info.system in systems_darwin) then
-    begin
-      if (target_info.system =system_i386_freebsd) and
-         not (cs_link_no_default_lib_order in  current_settings.globalswitches) Then
-        Begin
-          LinkLibraryOrder.add('gcc','',15);
-          LinkLibraryOrder.add('c','',50);		     // c and c_p mutual. excl?
-          LinkLibraryOrder.add('c_p','',55);
-          LinkLibraryOrder.add('pthread','',75);	     // pthread and c_r should be mutually exclusive
-          LinkLibraryOrder.add('c_r','',76);
-          LinkLibraryOrder.add('kvm','',80);		     // must be before ncurses
-          if (cs_link_pthread in current_settings.globalswitches) Then     // convert libpthread to libc_r.
-            LinkLibraryAliases.add('pthread','c_r');
-        end;
-    end
-else
-    begin
-          LinkLibraryOrder.add('gcc','',15);
-          LinkLibraryOrder.add('c','',50);
-   end;
+  if (target_info.system =system_i386_freebsd) and
+     not (cs_link_no_default_lib_order in  current_settings.globalswitches) Then
+    Begin
+      LinkLibraryOrder.add('gcc','',15);
+      LinkLibraryOrder.add('c','',50);		     // c and c_p mutual. excl?
+      LinkLibraryOrder.add('c_p','',55);
+      LinkLibraryOrder.add('pthread','',75);	     // pthread and c_r should be mutually exclusive
+      LinkLibraryOrder.add('c_r','',76);
+      LinkLibraryOrder.add('kvm','',80);		     // must be before ncurses
+      if (cs_link_pthread in current_settings.globalswitches) Then     // convert libpthread to libc_r.
+        LinkLibraryAliases.add('pthread','c_r');
+    end;
 End;
 
 
@@ -265,243 +181,53 @@ var
   si_cprt,
   si_gprt : string[80];
 begin
-  if target_info.system in systems_darwin then
+  linklibc:=ModulesLinkToLibc;
+  if current_module.islibrary and
+     (target_info.system in systems_bsd) then
     begin
-      { for darwin: always link dynamically against libc }
-      linklibc := true;
-      reorder:=reorderentries;
-      prtobj:='';
-      SysInitUnit:='sysinit';
+      prtobj:='dllprt0';
+      cprtobj:='dllprt0';
+      gprtobj:='dllprt0';
+      SysInitUnit:='si_dll';
+      si_cprt:='si_dll';
+      si_gprt:='si_dll';
     end
   else
     begin
-      linklibc:=ModulesLinkToLibc;
-      if current_module.islibrary and
-         (target_info.system in systems_bsd) then
-        begin
-          prtobj:='dllprt0';
-          cprtobj:='dllprt0';
-          gprtobj:='dllprt0';
-          SysInitUnit:='si_dll';
-          si_cprt:='si_dll';
-          si_gprt:='si_dll';
-        end
-      else
-        begin
-          prtobj:='prt0';
-          cprtobj:='cprt0';
-          gprtobj:='gprt0';
-          SysInitUnit:='si_prc';
-          si_cprt:='si_c';
-          si_gprt:='si_g';
-        end;
-      // this one is a bit complex.
-      // Only reorder for now if -XL or -XO params are given
-      // or when -Xf.
-      reorder:= linklibc and
-                (
-                  ReorderEntries
-                   or
-                  (cs_link_pthread in current_settings.globalswitches));
-      if cs_profile in current_settings.moduleswitches then
-       begin
-         prtobj:=gprtobj;
-         SysInitUnit:=si_gprt;
-         AddSharedLibrary('c');
-         LibrarySuffix:='p';
-         linklibc:=true;
-       end
-      else
-       begin
-         if linklibc then
-           begin
-             prtobj:=cprtobj;
-             SysInitUnit:=si_cprt;
-           end;
-       end;
+      prtobj:='prt0';
+      cprtobj:='cprt0';
+      gprtobj:='gprt0';
+      SysInitUnit:='si_prc';
+      si_cprt:='si_c';
+      si_gprt:='si_g';
     end;
-end;
-
-
-function TLinkerBSD.GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
-begin
-  if not isdll then
-    begin
-      if not(cs_profile in current_settings.moduleswitches) then
-        begin
-          case target_info.system of
-            system_powerpc_darwin,
-            system_powerpc64_darwin,
-            system_i386_darwin,
-            system_x86_64_darwin:
-              begin
-                { 10.8 and later: no crt1.* }
-                if CompareVersionStrings(MacOSXVersionMin,'10.8')>=0 then
-                  exit('');
-                { x86: crt1.10.6.o -> crt1.10.5.o -> crt1.o }
-                { others: crt1.10.5 -> crt1.o }
-                if (target_info.system in [system_i386_darwin,system_x86_64_darwin]) and
-                   (CompareVersionStrings(MacOSXVersionMin,'10.6')>=0) then
-                  exit('crt1.10.6.o');
-                if CompareVersionStrings(MacOSXVersionMin,'10.5')>=0 then
-                  exit('crt1.10.5.o');
-              end;
-            system_arm_darwin:
-              begin
-                { iOS:
-                    iOS 6 and later: nothing
-                    iOS 3.1 - 5.x: crt1.3.1.o
-                    pre-iOS 3.1: crt1.o
-                }
-                if (CompareVersionStrings(iPhoneOSVersionMin,'6.0')>=0) then
-                  exit('');
-                if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
-                  exit('crt1.3.1.o');
-              end;
-            system_i386_iphonesim,
-            system_x86_64_iphonesim:
-              begin
-                { "recent versions" must not use anything (https://github.com/llvm-mirror/clang/commit/e6d04f3d152a22077022cf9287d4c538a0918ab0 )
-                  What those recent versions could be, is anyone's guess. It
-                  still seems to work with 8.1 and no longer with 8.3, so use
-                  8.1 as a cut-off point }
-                if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
-                  exit('');
-              end;
-            system_aarch64_darwin:
-              { never anything }
-              exit('');
-            else
-              Internalerror(2019050709);
-          end;
-          { nothing special -> default }
-          result:='crt1.o';
-        end
-      else
-        begin
-          result:='gcrt1.o';
-          { 10.8 and later: tell the linker to use 'start' instead of "_main"
-            as entry point }
-          if CompareVersionStrings(MacOSXVersionMin,'10.8')>=0 then
-            Info.ExeCmd[1]:=Info.ExeCmd[1]+' -no_new_main';
-        end;
-    end
+  // this one is a bit complex.
+  // Only reorder for now if -XL or -XO params are given
+  // or when -Xf.
+  reorder:= linklibc and
+            (
+              ReorderEntries
+               or
+              (cs_link_pthread in current_settings.globalswitches));
+  if cs_profile in current_settings.moduleswitches then
+   begin
+     prtobj:=gprtobj;
+     SysInitUnit:=si_gprt;
+     AddSharedLibrary('c');
+     LibrarySuffix:='p';
+     linklibc:=true;
+   end
   else
-    begin
-      if (apptype=app_bundle) then
-        begin
-          case target_info.system of
-            system_powerpc_darwin,
-            system_powerpc64_darwin,
-            system_i386_darwin,
-            system_x86_64_darwin:
-              begin
-                { < 10.6: bundle1.o
-                  >= 10.6: nothing }
-                if CompareVersionStrings(MacOSXVersionMin,'10.6')>=0 then
-                  exit('');
-              end;
-            system_arm_darwin,
-            system_aarch64_darwin:
-              begin
-                { iOS: < 3.1: bundle1.o
-                       >= 3.1: nothing }
-                if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
-                  exit('');
-              end;
-            system_i386_iphonesim,
-            system_x86_64_iphonesim:
-              begin
-                { see rule for crt1.o }
-                if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
-                  exit('');
-              end;
-            else
-              Internalerror(2019050710);
-          end;
-          result:='bundle1.o';
-        end
-      else
-        begin
-          case target_info.system of
-            system_powerpc_darwin,
-            system_powerpc64_darwin,
-            system_i386_darwin,
-            system_x86_64_darwin:
-              begin
-                { >= 10.6: nothing
-                  = 10.5: dylib1.10.5.o
-                  < 10.5: dylib1.o
-                }
-                if CompareVersionStrings(MacOSXVersionMin,'10.6')>=0 then
-                  exit('');
-                if CompareVersionStrings(MacOSXVersionMin,'10.5')>=0 then
-                  exit('dylib1.10.5.o');
-              end;
-            system_arm_darwin,
-            system_aarch64_darwin:
-              begin
-                { iOS: < 3.1: dylib1.o
-                       >= 3.1: nothing }
-                if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
-                  exit('');
-              end;
-            system_i386_iphonesim,
-            system_x86_64_iphonesim:
-              begin
-                { see rule for crt1.o }
-                if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
-                  exit('');
-              end;
-            else
-              Internalerror(2019050711);
-          end;
-          result:='dylib1.o';
-        end;
-    end;
-end;
-
-
-Function TLinkerBSD.GetDarwinPrtobjName(isdll: boolean): TCmdStr;
-var
-  startupfile: TCmdStr;
-begin
-  result:='';
-
-  startupfile:=GetDarwinCrt1ObjName(isdll);
-  if startupfile<>'' then
-    begin
-     if not librarysearchpath.FindFile(startupfile,false,result) then
-       result:='/usr/lib/'+startupfile;
-    end;
-  result:=maybequoted(result);
+   begin
+     if linklibc then
+       begin
+         prtobj:=cprtobj;
+         SysInitUnit:=si_cprt;
+       end;
+   end;
 end;
 
 
-function tlinkerbsd.WriteSymbolOrderFile: TCmdStr;
-  var
-    item: TCmdStrListItem;
-    symfile: TScript;
-  begin
-    result:='';
-    { only for darwin for now; can also enable for other platforms when using
-      the LLVM linker }
-    if (OrderedSymbols.Empty) or
-       not(tf_supports_symbolorderfile in target_info.flags) then
-      exit;
-    symfile:=TScript.Create(outputexedir+'symbol_order.fpc');
-    item:=TCmdStrListItem(OrderedSymbols.First);
-    while assigned(item) do
-      begin
-        symfile.add(item.str);
-        item:=TCmdStrListItem(item.next);
-      end;
-    symfile.WriteToDisk;
-    result:=symfile.fn;
-    symfile.Free;
-  end;
-
-
 Function TLinkerBSD.WriteResponseFile(isdll:boolean) : Boolean;
 Var
   linkres      : TLinkRes;
@@ -511,29 +237,14 @@ Var
   s,s1,s2      : TCmdStr;
   linkdynamic  : boolean;
   Fl1,Fl2      : Boolean;
-  IsDarwin     : Boolean;
 
 begin
   WriteResponseFile:=False;
   ReOrder:=False;
   linkdynamic:=False;
-  IsDarwin:=target_info.system in systems_darwin;
-{ set special options for some targets }
-  if not IsDarwin Then
-    begin
-      linkdynamic:=not(SharedLibFiles.empty);
-      // after this point addition of shared libs not allowed.
-    end
-  else
-    begin
-{$ifdef MACOSX104ORHIGHER}
-      { not sure what this is for, but gcc always links against it }
-      if not(cs_profile in current_settings.moduleswitches) then
-        AddSharedLibrary('SystemStubs')
-      else
-        AddSharedLibrary('SystemStubs_profile');
-{$endif MACOSX104ORHIGHER}
-    end;
+  { set special options for some targets }
+  linkdynamic:=not(SharedLibFiles.empty);
+  // after this point addition of shared libs not allowed.
 
   if reorder Then
      ExpandAndApplyOrder(SharedLibFiles);
@@ -541,47 +252,6 @@ begin
   { Open link.res file }
   LinkRes:=TLinkRes.Create(outputexedir+Info.ResName,not LdSupportsNoResponseFile);
 
-  if (target_info.system in systems_darwin) and
-     (sysrootpath<>'') then
-    begin
-      LinkRes.Add('-syslibroot');
-      LinkRes.Add(sysrootpath);
-    end;
-
-  if (target_info.system in systems_darwin) then
-    begin
-      LinkRes.Add('-arch');
-      case target_info.system of
-        system_powerpc_darwin:
-          LinkRes.Add('ppc');
-        system_i386_darwin,
-        system_i386_iphonesim:
-          LinkRes.Add('i386');
-        system_powerpc64_darwin:
-          LinkRes.Add('ppc64');
-        system_x86_64_darwin,
-        system_x86_64_iphonesim:
-          LinkRes.Add('x86_64');
-        system_arm_darwin:
-          { current versions of the linker require the sub-architecture type
-            to be specified }
-          LinkRes.Add(lower(cputypestr[current_settings.cputype]));
-        system_aarch64_darwin:
-          LinkRes.Add('arm64');
-        else
-          internalerror(2014121801);
-      end;
-      if MacOSXVersionMin<>'' then
-        begin
-          LinkRes.Add('-macosx_version_min');
-          LinkRes.Add(MacOSXVersionMin);
-        end
-      else if iPhoneOSVersionMin<>'' then
-        begin
-          LinkRes.Add('-iphoneos_version_min');
-          LinkRes.Add(iPhoneOSVersionMin);
-        end;
-    end;
   { Write path to search libraries }
   HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
   while assigned(HPath) do
@@ -602,22 +272,6 @@ begin
      HPath:=TCmdStrListItem(HPath.Next);
    end;
 
-  if (target_info.system in systems_darwin) then
-    begin
-      HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-F'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
-      HPath:=TCmdStrListItem(FrameworkSearchPath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-F'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
-    end;
-
   { force local symbol resolution (i.e., inside the shared }
   { library itself) for all non-exorted symbols, otherwise }
   { several RTL symbols of FPC-compiled shared libraries   }
@@ -647,8 +301,7 @@ begin
   if not (target_info.system in systems_internal_sysinit) and (prtobj<>'') then
    LinkRes.AddFileName(FindObjectFile(prtobj,'',false));
   { try to add crti and crtbegin if linking to C }
-  if linklibc and
-     not IsDarwin Then
+  if linklibc then
    begin
      if librarysearchpath.FindFile('crti.o',false,s) then
       LinkRes.AddFileName(s);
@@ -669,34 +322,15 @@ begin
    end;
 
   { main objectfiles }
-
-  if (target_info.system in systems_darwin) then
-   begin
-     FilesList:=TLinkRes.Create(outputexedir+'linkfiles.res',false);
-     while not ObjectFiles.Empty do
-      begin
-        s:=ObjectFiles.GetFirst;
-        if s<>'' then
-         begin
-           s:=TargetFixFileName(s);
-           FilesList.Add(s);
-         end;
-      end;
-     FilesList.writetodisk;
-     FilesList.Free;
-   end
-  else
-   begin
-     while not ObjectFiles.Empty do
-      begin
-        s:=ObjectFiles.GetFirst;
-        if s<>'' then
-          if LdSupportsNoResponseFile then
-            LinkRes.AddFileName(s)
-          else
-            LinkRes.AddFileName(maybequoted(s));
-      end;
-   end;
+   while not ObjectFiles.Empty do
+    begin
+      s:=ObjectFiles.GetFirst;
+      if s<>'' then
+        if LdSupportsNoResponseFile then
+          LinkRes.AddFileName(s)
+        else
+          LinkRes.AddFileName(maybequoted(s));
+    end;
 
   if not LdSupportsNoResponseFile then
    LinkRes.Add(')');
@@ -760,17 +394,8 @@ begin
        LinkRes.Add(')');
    end;
 
-  { frameworks for Darwin }
-  if IsDarwin then
-    while not FrameworkFiles.empty do
-      begin
-        LinkRes.Add('-framework');
-        LinkRes.Add(FrameworkFiles.GetFirst);
-      end;
-
   { objects which must be at the end }
-  if linklibc and
-     not IsDarwin Then
+  if linklibc then
    begin
      if ((cs_create_pic in current_settings.moduleswitches) and
          not (target_info.system in systems_openbsd)) or
@@ -805,8 +430,6 @@ var
   mapstr,
   targetstr,
   emulstr,
-  extdbgbinstr,
-  extdbgcmdstr,
   ltostr,
   ordersymfile: TCmdStr;
   linkscript: TAsmScript;
@@ -854,20 +477,13 @@ begin
         StaticStr:='-static';
     end;
   if (cs_link_strip in current_settings.globalswitches) then
-    if (target_info.system in systems_darwin) then
-      StripStr:='-x'
-    else
-      StripStr:='-s';
+    StripStr:='-s';
 
   if (cs_link_smart in current_settings.globalswitches) and
      (tf_smartlink_sections in target_info.flags) then
-    if not(target_info.system in systems_darwin) then
-      GCSectionsStr:='--gc-sections'
-    else
-      GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
+    GCSectionsStr:='--gc-sections';
 
-   if(not(target_info.system in systems_darwin) and
-      (cs_profile in current_settings.moduleswitches)) or
+   if(cs_profile in current_settings.moduleswitches) or
      ((Info.DynamicLinker<>'') and
       ((not SharedLibFiles.Empty) or
        (target_info.system in systems_openbsd))) then
@@ -875,22 +491,9 @@ begin
 
   if CShared Then
    begin
-   if not(target_info.system in systems_darwin) then
-     DynLinKStr:=DynLinkStr+' --shared'
-    else
-     DynLinKStr:=DynLinkStr+' -dynamic'; // one dash!
+      DynLinKStr:=DynLinkStr+' --shared'
    end;
 
-  { add custom LTO library if using custom clang }
-  if (target_info.system in systems_darwin) and
-     (cs_lto in current_settings.moduleswitches) and
-     not(cs_link_on_target in current_settings.globalswitches) and
-     (utilsdirectory<>'') and
-     FileExists(utilsdirectory+'/../lib/libLTO.dylib',true) then
-    begin
-      ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
-    end;
-
 { Use -nopie on OpenBSD if PIC support is turned off }
   if (target_info.system in systems_openbsd) and
      not(cs_create_pic in current_settings.moduleswitches) then
@@ -917,46 +520,23 @@ begin
   Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
   Replace(cmdstr,'$LTO',ltostr);
   if ordersymfile<>'' then
-    begin
-      if target_info.system in systems_darwin then
-        Replace(cmdstr,'$ORDERSYMS','-order_file '+maybequoted(ordersymfile))
-      else
-        Replace(cmdstr,'$ORDERSYMS','--symbol-ordering-file '+maybequoted(ordersymfile))
-    end
+    Replace(cmdstr,'$ORDERSYMS','--symbol-ordering-file '+maybequoted(ordersymfile))
   else
     Replace(cmdstr,'$ORDERSYMS','');
 
-  if (target_info.system in systems_darwin) then
-    Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+'linkfiles.res'))
-  else
-    Replace(cmdstr,'$FILELIST','');
+  Replace(cmdstr,'$FILELIST','');
   Replace(cmdstr,'$STATIC',StaticStr);
   Replace(cmdstr,'$STRIP',StripStr);
   Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
   Replace(cmdstr,'$DYNLINK',DynLinkStr);
-  if (target_info.system in systems_darwin) then
-    Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(false));
   BinStr:=FindUtil(utilsprefix+BinStr);
 
-  { create dsym file? }
-  extdbgbinstr:='';
-  extdbgcmdstr:='';
-  if (target_info.system in systems_darwin) and
-     (target_dbg.id in [dbg_dwarf2,dbg_dwarf3]) and
-     (cs_link_separate_dbg_file in current_settings.globalswitches) then
-    begin
-      extdbgbinstr:=FindUtil(utilsprefix+'dsymutil');
-      extdbgcmdstr:=maybequoted(current_module.exefilename);
-    end;
-
   if (LdSupportsNoResponseFile) and
      not(cs_link_nolink in current_settings.globalswitches) then
     begin
       { we have to use a script to use the IFS hack }
       linkscript:=GenerateScript(outputexedir+'ppaslink');
       linkscript.AddLinkCommand(BinStr,CmdStr,'');
-      if (extdbgcmdstr<>'') then
-        linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
       linkscript.WriteToDisk;
       BinStr:=linkscript.fn;
       if not path_absolute(BinStr) then
@@ -969,10 +549,6 @@ begin
 
   useshell:=not (tf_no_backquote_support in source_info.flags);
   success:=DoExec(BinStr,CmdStr,true,LdSupportsNoResponseFile or useshell);
-  if (success and
-      (extdbgbinstr<>'') and
-      (cs_link_nolink in current_settings.globalswitches)) then
-    success:=DoExec(extdbgbinstr,extdbgcmdstr,false,LdSupportsNoResponseFile);
 
 { Remove ReponseFile }
   if (success) and not(cs_link_nolink in current_settings.globalswitches) then
@@ -985,8 +561,6 @@ begin
          DeleteFile(linkscript.fn);
          linkscript.free
        end;
-     if target_info.system in systems_darwin then
-       DeleteFile(outputexedir+'linkfiles.res');
    end;
 
   MakeExecutable:=success;   { otherwise a recursive call to link method }
@@ -1005,9 +579,7 @@ var
   ltostr,
   ordersymfile,
   targetstr,
-  emulstr,
-  extdbgbinstr,
-  extdbgcmdstr  : TCmdStr;
+  emulstr       : TCmdStr;
   GCSectionsStr : string[63];
   exportedsyms: text;
   success : boolean;
@@ -1028,25 +600,13 @@ begin
 
   if (cs_link_smart in current_settings.globalswitches) and
      (tf_smartlink_sections in target_info.flags) then
-    if not(target_info.system in systems_darwin) then
      { disabled because not tested
       GCSectionsStr:='--gc-sections' }
-    else
-      GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
+    ;
 
   if (cs_link_map in current_settings.globalswitches) then
     mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
 
-  { add custom LTO library if using custom clang }
-  if (target_info.system in systems_darwin) and
-     (cs_lto in current_settings.moduleswitches) and
-     not(cs_link_on_target in current_settings.globalswitches) and
-     (utilsdirectory<>'') and
-     FileExists(utilsdirectory+'/../lib/libLTO.dylib',true) then
-    begin
-      ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
-    end;
-
   { i386_freebsd needs -b elf32-i386-freebsd and -m elf_i386_fbsd
     to avoid creation of a i386:x86_64 arch binary }
 
@@ -1067,18 +627,12 @@ begin
 
 { Call linker }
   SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
-  if not(target_info.system in systems_darwin) then
-    Replace(cmdstr,'$EXE',maybequoted(current_module.sharedlibfilename))
-  else
-    Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
+  Replace(cmdstr,'$EXE',maybequoted(current_module.sharedlibfilename));
   Replace(cmdstr,'$OPT',Info.ExtraOptions);
   Replace(cmdstr,'$TARGET',targetstr);
   Replace(cmdstr,'$EMUL',EmulStr);
   Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
-  if (target_info.system in systems_darwin) then
-    Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+'linkfiles.res'))
-  else
-    Replace(cmdstr,'$FILELIST','');
+  Replace(cmdstr,'$FILELIST','');
   Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
   Replace(cmdstr,'$INIT',InitStr);
   Replace(cmdstr,'$FINI',FiniStr);
@@ -1087,52 +641,17 @@ begin
   Replace(cmdstr,'$MAP',mapstr);
   Replace(cmdstr,'$LTO',ltostr);
   if ordersymfile<>'' then
-    begin
-      if target_info.system in systems_darwin then
-        Replace(cmdstr,'$ORDERSYMS','-order_file '+maybequoted(ordersymfile))
-      else
-        Replace(cmdstr,'$ORDERSYMS','--symbol-ordering-file '+maybequoted(ordersymfile))
-    end
+    Replace(cmdstr,'$ORDERSYMS','--symbol-ordering-file '+maybequoted(ordersymfile))
   else
     Replace(cmdstr,'$ORDERSYMS','');
-  if (target_info.system in systems_darwin) then
-    Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
   BinStr:=FindUtil(utilsprefix+BinStr);
 
-  { create dsym file? }
-  extdbgbinstr:='';
-  extdbgcmdstr:='';
-  if (target_info.system in systems_darwin) and
-     (target_dbg.id in [dbg_dwarf2,dbg_dwarf3]) and
-     (cs_link_separate_dbg_file in current_settings.globalswitches) then
-    begin
-      extdbgbinstr:=FindUtil(utilsprefix+'dsymutil');
-      extdbgcmdstr:=maybequoted(current_module.sharedlibfilename);
-    end;
-
-  if (target_info.system in systems_darwin) then
-    begin
-      { exported symbols for darwin }
-      if not texportlibunix(exportlib).exportedsymnames.empty then
-        begin
-          assign(exportedsyms,outputexedir+'linksyms.fpc');
-          rewrite(exportedsyms);
-          repeat
-            writeln(exportedsyms,texportlibunix(exportlib).exportedsymnames.getfirst);
-          until texportlibunix(exportlib).exportedsymnames.empty;
-          close(exportedsyms);
-          cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir)+'linksyms.fpc';
-        end;
-    end;
-
   if (LdSupportsNoResponseFile) and
      not(cs_link_nolink in current_settings.globalswitches) then
     begin
       { we have to use a script to use the IFS hack }
       linkscript:=GenerateScript(outputexedir+'ppaslink');
       linkscript.AddLinkCommand(BinStr,CmdStr,'');
-      if (extdbgbinstr<>'') then
-        linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
       linkscript.WriteToDisk;
       BinStr:=linkscript.fn;
       if not path_absolute(BinStr) then
@@ -1144,10 +663,6 @@ begin
     end;
 
   success:=DoExec(BinStr,cmdstr,true,LdSupportsNoResponseFile);
-  if (success and
-      (extdbgbinstr<>'') and
-      (cs_link_nolink in current_settings.globalswitches)) then
-    success:=DoExec(extdbgbinstr,extdbgcmdstr,false,LdSupportsNoResponseFile);
 
 { Strip the library ? }
   if success and (cs_link_strip in current_settings.globalswitches) then
@@ -1168,11 +683,6 @@ begin
           DeleteFile(linkscript.fn);
           linkscript.free
         end;
-      if (target_info.system in systems_darwin) then
-        begin
-          DeleteFile(outputexedir+'linksyms.fpc');
-          DeleteFile(outputexedir+'linkfiles.res');
-        end;
     end;
 
   MakeSharedLibrary:=success;   { otherwise a recursive call to link method }
@@ -1198,13 +708,6 @@ initialization
   RegisterImport(system_x86_64_netbsd,timportlibbsd);
   RegisterExport(system_x86_64_netbsd,texportlibbsd);
   RegisterTarget(system_x86_64_netbsd_info);
-
-  RegisterImport(system_x86_64_darwin,timportlibdarwin);
-  RegisterExport(system_x86_64_darwin,texportlibdarwin);
-  RegisterTarget(system_x86_64_darwin_info);
-  RegisterImport(system_x86_64_iphonesim,timportlibdarwin);
-  RegisterExport(system_x86_64_iphonesim,texportlibdarwin);
-  RegisterTarget(system_x86_64_iphonesim_info);
 {$endif}
 {$ifdef i386}
   RegisterImport(system_i386_freebsd,timportlibbsd);
@@ -1216,12 +719,6 @@ initialization
   RegisterImport(system_i386_openbsd,timportlibbsd);
   RegisterExport(system_i386_openbsd,texportlibbsd);
   RegisterTarget(system_i386_openbsd_info);
-  RegisterImport(system_i386_darwin,timportlibdarwin);
-  RegisterExport(system_i386_darwin,texportlibdarwin);
-  RegisterTarget(system_i386_darwin_info);
-  RegisterImport(system_i386_iphonesim,timportlibdarwin);
-  RegisterExport(system_i386_iphonesim,texportlibdarwin);
-  RegisterTarget(system_i386_iphonesim_info);
 {$endif i386}
 {$ifdef m68k}
   RegisterImport(system_m68k_netbsd,timportlibbsd);
@@ -1229,34 +726,15 @@ initialization
   RegisterTarget(system_m68k_netbsd_info);
 {$endif m68k}
 {$ifdef powerpc}
-  RegisterImport(system_powerpc_darwin,timportlibdarwin);
-  RegisterExport(system_powerpc_darwin,texportlibdarwin);
-  RegisterTarget(system_powerpc_darwin_info);
-
   RegisterImport(system_powerpc_netbsd,timportlibbsd);
   RegisterExport(system_powerpc_netbsd,texportlibbsd);
   RegisterTarget(system_powerpc_netbsd_info);
 {$endif powerpc}
-{$ifdef powerpc64}
-  RegisterImport(system_powerpc64_darwin,timportlibdarwin);
-  RegisterExport(system_powerpc64_darwin,texportlibdarwin);
-  RegisterTarget(system_powerpc64_darwin_info);
-{$endif powerpc64}
 {$ifdef arm}
-  RegisterImport(system_arm_darwin,timportlibdarwin);
-  RegisterExport(system_arm_darwin,texportlibdarwin);
-  RegisterTarget(system_arm_darwin_info);
-
   RegisterImport(system_arm_netbsd,timportlibbsd);
   RegisterExport(system_arm_netbsd,texportlibbsd);
   RegisterTarget(system_arm_netbsd_info);
 {$endif arm}
-{$ifdef aarch64}
-  RegisterImport(system_aarch64_darwin,timportlibdarwin);
-  RegisterExport(system_aarch64_darwin,texportlibdarwin);
-  RegisterTarget(system_aarch64_darwin_info);
-{$endif aarch64}
 
   RegisterRes(res_elf_info,TWinLikeResourceFile);
-  RegisterRes(res_macho_info,TWinLikeResourceFile);
 end.

+ 773 - 0
compiler/systems/t_darwin.pas

@@ -0,0 +1,773 @@
+{
+    Copyright (c) 1998-2002 by Peter Vreman (original Linux)
+              (c) 2000      by Marco van de Voort (FreeBSD mods)
+
+    This unit implements support import,export,link routines
+    for the (i386)FreeBSD target
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 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 t_darwin;
+
+{$i fpcdefs.inc}
+
+interface
+
+implementation
+
+  uses
+    sysutils,
+    cutils,cfileutl,cclasses,
+    verbose,systems,globtype,globals,
+    symconst,cscript,
+    fmodule,aasmbase,aasmtai,aasmdata,aasmcpu,cpubase,symsym,symdef,
+    import,export,link,comprsrc,rescmn,i_darwin,expunix,
+    cgutils,cgbase,cgobj,cpuinfo,ogbase;
+
+  type
+    timportlibdarwin=class(timportlib)
+      procedure generatelib;override;
+    end;
+
+    texportlibdarwin=class(texportlibunix)
+      procedure setinitname(list: TAsmList; const s: string); override;
+      procedure setfininame(list: TAsmList; const s: string); override;
+    end;
+
+    tlinkerdarwin=class(texternallinker)
+    private
+      LinkFilesFileName,
+      LinkSymsFileName   : TCmdStr;
+      Function  WriteResponseFile(isdll:boolean) : Boolean;
+      function GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
+      Function GetDarwinPrtobjName(isdll: boolean): TCmdStr;
+    public
+      constructor Create;override;
+      procedure SetDefaultInfo;override;
+      function  MakeExecutable:boolean;override;
+      function  MakeSharedLibrary:boolean;override;
+      procedure LoadPredefinedLibraryOrder; override;
+      procedure InitSysInitUnitName; override;
+    end;
+
+{*****************************************************************************
+                             TIMPORTLIBDARWIN
+*****************************************************************************}
+
+    procedure timportlibdarwin.generatelib;
+      begin
+      end;
+
+
+{*****************************************************************************
+                             TEXPORTLIBDARWIN
+*****************************************************************************}
+
+    procedure texportlibdarwin.setinitname(list: TAsmList; const s: string);
+      begin
+        new_section(list,sec_init_func,'',sizeof(pint));
+        list.concat(Tai_const.Createname(s,0));
+      end;
+
+
+    procedure texportlibdarwin.setfininame(list: TAsmList; const s: string);
+      begin
+        new_section(list,sec_term_func,'',sizeof(pint));
+        list.concat(Tai_const.Createname(s,0));
+      end;
+
+
+{*****************************************************************************
+                                  TLINKERBSD
+*****************************************************************************}
+
+    constructor tlinkerdarwin.Create;
+      begin
+        inherited;
+        if not Dontlinkstdlibpath Then
+          LibrarySearchPath.AddLibraryPath(sysrootpath,'=/usr/lib',true)
+      end;
+
+
+    procedure tlinkerdarwin.SetDefaultInfo;
+      begin
+        with Info do
+         begin
+  {$ifndef cpu64bitaddr}
+           { Set the size of the page at address zero to 64kb, so nothing
+             is loaded below that address. This avoids problems with the
+             strange Windows-compatible resource handling that assumes
+             that addresses below 64kb do not exist.
+
+             On 64bit systems, page zero is 4GB by default, so no problems
+             there.
+           }
+           { In case of valgrind, don't do that, because it cannot deal with
+             a custom pagezero size -- in general, this should not cause any
+             problems because the resources are added at the end and most
+             programs with problems that require Valgrind will have more
+             than 60KB of data (first 4KB of address space is always invalid)
+           }
+           ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+           if not(cs_gdb_valgrind in current_settings.globalswitches) then
+             ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
+  {$else ndef cpu64bitaddr}
+           ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+  {$endif ndef cpu64bitaddr}
+           if (apptype<>app_bundle) then
+             DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -dylib -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
+           else
+             DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -bundle -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+           DllCmd[2]:='strip -x $EXE';
+           DynamicLinker:='';
+         end;
+      end;
+
+
+    procedure tlinkerdarwin.LoadPredefinedLibraryOrder;
+      begin
+        // put your linkorder/linkalias overrides here.
+        // Note: assumes only called when reordering/aliasing is used.
+        LinkLibraryOrder.add('gcc','',15);
+        LinkLibraryOrder.add('c','',50);
+      end;
+
+
+    procedure tlinkerdarwin.InitSysInitUnitName;
+      begin
+        SysInitUnit:='sysinit';
+      end;
+
+
+    function tlinkerdarwin.GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
+      begin
+        if not isdll then
+          begin
+            if not(cs_profile in current_settings.moduleswitches) then
+              begin
+                case target_info.system of
+                  system_powerpc_darwin,
+                  system_powerpc64_darwin,
+                  system_i386_darwin,
+                  system_x86_64_darwin:
+                    begin
+                      { 10.8 and later: no crt1.* }
+                      if CompareVersionStrings(MacOSXVersionMin,'10.8')>=0 then
+                        exit('');
+                      { x86: crt1.10.6.o -> crt1.10.5.o -> crt1.o }
+                      { others: crt1.10.5 -> crt1.o }
+                      if (target_info.system in [system_i386_darwin,system_x86_64_darwin]) and
+                         (CompareVersionStrings(MacOSXVersionMin,'10.6')>=0) then
+                        exit('crt1.10.6.o');
+                      if CompareVersionStrings(MacOSXVersionMin,'10.5')>=0 then
+                        exit('crt1.10.5.o');
+                    end;
+                  system_arm_darwin:
+                    begin
+                      { iOS:
+                          iOS 6 and later: nothing
+                          iOS 3.1 - 5.x: crt1.3.1.o
+                          pre-iOS 3.1: crt1.o
+                      }
+                      if (CompareVersionStrings(iPhoneOSVersionMin,'6.0')>=0) then
+                        exit('');
+                      if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
+                        exit('crt1.3.1.o');
+                    end;
+                  system_i386_iphonesim,
+                  system_x86_64_iphonesim:
+                    begin
+                      { "recent versions" must not use anything (https://github.com/llvm-mirror/clang/commit/e6d04f3d152a22077022cf9287d4c538a0918ab0 )
+                        What those recent versions could be, is anyone's guess. It
+                        still seems to work with 8.1 and no longer with 8.3, so use
+                        8.1 as a cut-off point }
+                      if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
+                        exit('');
+                    end;
+                  system_aarch64_darwin:
+                    { never anything }
+                    exit('');
+                  else
+                    Internalerror(2019050709);
+                end;
+                { nothing special -> default }
+                result:='crt1.o';
+              end
+            else
+              begin
+                result:='gcrt1.o';
+                { 10.8 and later: tell the linker to use 'start' instead of "_main"
+                  as entry point }
+                if CompareVersionStrings(MacOSXVersionMin,'10.8')>=0 then
+                  Info.ExeCmd[1]:=Info.ExeCmd[1]+' -no_new_main';
+              end;
+          end
+        else
+          begin
+            if (apptype=app_bundle) then
+              begin
+                case target_info.system of
+                  system_powerpc_darwin,
+                  system_powerpc64_darwin,
+                  system_i386_darwin,
+                  system_x86_64_darwin:
+                    begin
+                      { < 10.6: bundle1.o
+                        >= 10.6: nothing }
+                      if CompareVersionStrings(MacOSXVersionMin,'10.6')>=0 then
+                        exit('');
+                    end;
+                  system_arm_darwin,
+                  system_aarch64_darwin:
+                    begin
+                      { iOS: < 3.1: bundle1.o
+                             >= 3.1: nothing }
+                      if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
+                        exit('');
+                    end;
+                  system_i386_iphonesim,
+                  system_x86_64_iphonesim:
+                    begin
+                      { see rule for crt1.o }
+                      if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
+                        exit('');
+                    end;
+                  else
+                    Internalerror(2019050710);
+                end;
+                result:='bundle1.o';
+              end
+            else
+              begin
+                case target_info.system of
+                  system_powerpc_darwin,
+                  system_powerpc64_darwin,
+                  system_i386_darwin,
+                  system_x86_64_darwin:
+                    begin
+                      { >= 10.6: nothing
+                        = 10.5: dylib1.10.5.o
+                        < 10.5: dylib1.o
+                      }
+                      if CompareVersionStrings(MacOSXVersionMin,'10.6')>=0 then
+                        exit('');
+                      if CompareVersionStrings(MacOSXVersionMin,'10.5')>=0 then
+                        exit('dylib1.10.5.o');
+                    end;
+                  system_arm_darwin,
+                  system_aarch64_darwin:
+                    begin
+                      { iOS: < 3.1: dylib1.o
+                             >= 3.1: nothing }
+                      if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
+                        exit('');
+                    end;
+                  system_i386_iphonesim,
+                  system_x86_64_iphonesim:
+                    begin
+                      { see rule for crt1.o }
+                      if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
+                        exit('');
+                    end;
+                  else
+                    Internalerror(2019050711);
+                end;
+                result:='dylib1.o';
+              end;
+          end;
+      end;
+
+
+    Function tlinkerdarwin.GetDarwinPrtobjName(isdll: boolean): TCmdStr;
+    var
+      startupfile: TCmdStr;
+    begin
+      result:='';
+
+      startupfile:=GetDarwinCrt1ObjName(isdll);
+      if startupfile<>'' then
+        begin
+         if not librarysearchpath.FindFile(startupfile,false,result) then
+           result:='/usr/lib/'+startupfile;
+        end;
+      result:=maybequoted(result);
+    end;
+
+
+    Function tlinkerdarwin.WriteResponseFile(isdll:boolean) : Boolean;
+    Var
+      linkres      : TLinkRes;
+      FilesList    : TLinkRes;
+      i            : longint;
+      HPath        : TCmdStrListItem;
+      s,s1,s2      : TCmdStr;
+      Fl1,Fl2      : Boolean;
+    begin
+      WriteResponseFile:=False;
+      if ReOrderEntries Then
+         ExpandAndApplyOrder(SharedLibFiles);
+
+      { Open link.res file }
+      LinkRes:=TLinkRes.Create(outputexedir+Info.ResName,false);
+
+      if sysrootpath<>'' then
+        begin
+          LinkRes.Add('-syslibroot');
+          LinkRes.Add(sysrootpath);
+        end;
+
+      LinkRes.Add('-arch');
+      case target_info.system of
+        system_powerpc_darwin:
+          LinkRes.Add('ppc');
+        system_i386_darwin,
+        system_i386_iphonesim:
+          LinkRes.Add('i386');
+        system_powerpc64_darwin:
+          LinkRes.Add('ppc64');
+        system_x86_64_darwin,
+        system_x86_64_iphonesim:
+          LinkRes.Add('x86_64');
+        system_arm_darwin:
+          { current versions of the linker require the sub-architecture type
+            to be specified }
+          LinkRes.Add(lower(cputypestr[current_settings.cputype]));
+        system_aarch64_darwin:
+          LinkRes.Add('arm64');
+        else
+          internalerror(2014121801);
+      end;
+      if MacOSXVersionMin<>'' then
+        begin
+          LinkRes.Add('-macosx_version_min');
+          LinkRes.Add(MacOSXVersionMin);
+        end
+      else if iPhoneOSVersionMin<>'' then
+        begin
+          LinkRes.Add('-iphoneos_version_min');
+          LinkRes.Add(iPhoneOSVersionMin);
+        end;
+
+      { Write path to search libraries }
+      HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
+      while assigned(HPath) do
+       begin
+         LinkRes.Add('-L'+HPath.Str);
+         HPath:=TCmdStrListItem(HPath.Next);
+       end;
+      HPath:=TCmdStrListItem(LibrarySearchPath.First);
+      while assigned(HPath) do
+       begin
+         LinkRes.Add('-L'+HPath.Str);
+         HPath:=TCmdStrListItem(HPath.Next);
+       end;
+
+      HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
+      while assigned(HPath) do
+       begin
+         LinkRes.Add('-F'+HPath.Str);
+         HPath:=TCmdStrListItem(HPath.Next);
+       end;
+      HPath:=TCmdStrListItem(FrameworkSearchPath.First);
+      while assigned(HPath) do
+       begin
+         LinkRes.Add('-F'+HPath.Str);
+         HPath:=TCmdStrListItem(HPath.Next);
+       end;
+
+      { main objectfiles }
+      LinkFilesFileName:=UniqueName('linkfiles')+'.res';
+      FilesList:=TLinkRes.Create(outputexedir+LinkFilesFileName,false);
+      while not ObjectFiles.Empty do
+        begin
+          s:=ObjectFiles.GetFirst;
+          if s<>'' then
+            begin
+              s:=TargetFixFileName(s);
+              FilesList.Add(s);
+            end;
+        end;
+      FilesList.writetodisk;
+      FilesList.Free;
+
+      { Write staticlibraries }
+      while not StaticLibFiles.Empty do
+        begin
+          S:=StaticLibFiles.GetFirst;
+          LinkRes.AddFileName(s)
+        end;
+
+      { Write sharedlibraries like -l<lib> }
+      while not SharedLibFiles.Empty do
+        begin
+          S:=SharedLibFiles.GetFirst;
+          if (s<>'c') or ReOrderEntries then
+            begin
+              i:=Pos(target_info.sharedlibext,S);
+              if i>0 then
+                Delete(S,i,255);
+              LinkRes.Add('-l'+s);
+            end;
+         { be sure that libc is the last lib }
+         if not ReOrderEntries then
+           begin
+             LinkRes.Add('-lc')
+           end;
+       end;
+
+      while not FrameworkFiles.empty do
+        begin
+          LinkRes.Add('-framework');
+          LinkRes.Add(FrameworkFiles.GetFirst);
+        end;
+
+    { Write and Close response }
+      linkres.writetodisk;
+      linkres.Free;
+
+      WriteResponseFile:=True;
+    end;
+
+
+    function tlinkerdarwin.MakeExecutable:boolean;
+    var
+      binstr,
+      cmdstr,
+      mapstr,
+      targetstr,
+      emulstr,
+      extdbgbinstr,
+      extdbgcmdstr,
+      ltostr,
+      ordersymfile: TCmdStr;
+      linkscript: TAsmScript;
+      DynLinkStr : string[60];
+      GCSectionsStr,
+      StaticStr,
+      StripStr   : string[63];
+      success : boolean;
+    begin
+      if not(cs_link_nolink in current_settings.globalswitches) then
+       Message1(exec_i_linking,current_module.exefilename);
+
+    { Create some replacements }
+      StaticStr:='';
+      StripStr:='';
+      DynLinkStr:='';
+      GCSectionsStr:='';
+      linkscript:=nil;
+      mapstr:='';
+      targetstr:='';
+      emulstr:='';
+      ltostr:='';
+      if (cs_link_map in current_settings.globalswitches) then
+        mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
+
+      if (cs_link_staticflag in current_settings.globalswitches) then
+        StaticStr:='-static';
+      if (cs_link_strip in current_settings.globalswitches) then
+        StripStr:='-x';
+
+      if (cs_link_smart in current_settings.globalswitches) then
+        GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
+
+      if CShared Then
+       begin
+         DynLinKStr:=DynLinkStr+' -dynamic'; // one dash!
+       end;
+
+      { add custom LTO library if using custom clang }
+      if (cs_lto in current_settings.moduleswitches) and
+         not(cs_link_on_target in current_settings.globalswitches) and
+         (utilsdirectory<>'') and
+         FileExists(utilsdirectory+'/../lib/libLTO.dylib',true) then
+        begin
+          ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
+        end;
+
+    { Write used files and libraries }
+      WriteResponseFile(false);
+
+    { Write symbol order file }
+      ordersymfile:=WriteSymbolOrderFile;
+
+    { Call linker }
+      SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
+      Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
+      Replace(cmdstr,'$OPT',Info.ExtraOptions);
+      Replace(cmdstr,'$TARGET',targetstr);
+      Replace(cmdstr,'$EMUL',EmulStr);
+      Replace(cmdstr,'$MAP',mapstr);
+      Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
+      Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
+      Replace(cmdstr,'$LTO',ltostr);
+      if ordersymfile<>'' then
+        Replace(cmdstr,'$ORDERSYMS','-order_file '+maybequoted(ordersymfile))
+      else
+        Replace(cmdstr,'$ORDERSYMS','');
+
+      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+LinkFilesFileName));
+      Replace(cmdstr,'$STATIC',StaticStr);
+      Replace(cmdstr,'$STRIP',StripStr);
+      Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
+      Replace(cmdstr,'$DYNLINK',DynLinkStr);
+      Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(false));
+      BinStr:=FindUtil(utilsprefix+BinStr);
+
+      { create dsym file? }
+      extdbgbinstr:='';
+      extdbgcmdstr:='';
+      if (target_dbg.id in [dbg_dwarf2,dbg_dwarf3]) and
+         (cs_link_separate_dbg_file in current_settings.globalswitches) then
+        begin
+          extdbgbinstr:=FindUtil(utilsprefix+'dsymutil');
+          extdbgcmdstr:=maybequoted(current_module.exefilename);
+        end;
+
+      if not(cs_link_nolink in current_settings.globalswitches) then
+        begin
+          { we have to use a script to use the IFS hack }
+          linkscript:=GenerateScript(outputexedir+'ppaslink');
+          linkscript.AddLinkCommand(BinStr,CmdStr,'');
+          if (extdbgcmdstr<>'') then
+            linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
+          linkscript.WriteToDisk;
+          BinStr:=linkscript.fn;
+          if not path_absolute(BinStr) then
+            if cs_link_on_target in current_settings.globalswitches then
+              BinStr:='.'+target_info.dirsep+BinStr
+            else
+              BinStr:='.'+source_info.dirsep+BinStr;
+          CmdStr:='';
+        end;
+
+      success:=DoExec(BinStr,CmdStr,true,true);
+      if (success and
+          (extdbgbinstr<>'') and
+          (cs_link_nolink in current_settings.globalswitches)) then
+        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,true);
+
+    { Remove ReponseFile }
+      if (success) and not(cs_link_nolink in current_settings.globalswitches) then
+       begin
+         DeleteFile(outputexedir+Info.ResName);
+         if ordersymfile<>'' then
+           DeleteFile(ordersymfile);
+         DeleteFile(linkscript.fn);
+         linkscript.free;
+         DeleteFile(outputexedir+LinkFilesFileName);
+       end;
+
+      MakeExecutable:=success;   { otherwise a recursive call to link method }
+    end;
+
+
+    Function tlinkerdarwin.MakeSharedLibrary:boolean;
+    var
+      InitStr,
+      FiniStr,
+      SoNameStr : string[80];
+      linkscript: TAsmScript;
+      binstr,
+      cmdstr,
+      mapstr,
+      ltostr,
+      ordersymfile,
+      targetstr,
+      emulstr,
+      extdbgbinstr,
+      extdbgcmdstr  : TCmdStr;
+      GCSectionsStr : string[63];
+      exportedsyms: text;
+      success : boolean;
+    begin
+      MakeSharedLibrary:=false;
+      GCSectionsStr:='';
+      mapstr:='';
+      ltostr:='';
+      linkscript:=nil;
+      if not(cs_link_nolink in current_settings.globalswitches) then
+       Message1(exec_i_linking,current_module.sharedlibfilename);
+
+    { Write used files and libraries }
+      WriteResponseFile(true);
+
+    { Write symbol order file }
+      ordersymfile:=WriteSymbolOrderFile;
+
+      if (cs_link_smart in current_settings.globalswitches) then
+        GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
+
+      if (cs_link_map in current_settings.globalswitches) then
+        mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
+
+      { add custom LTO library if using custom clang }
+      if (cs_lto in current_settings.moduleswitches) and
+         not(cs_link_on_target in current_settings.globalswitches) and
+         (utilsdirectory<>'') and
+         FileExists(utilsdirectory+'/../lib/libLTO.dylib',true) then
+        begin
+          ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
+        end;
+
+      targetstr:='';
+      emulstr:='';
+
+      InitStr:='-init FPC_LIB_START';
+      FiniStr:='-fini FPC_LIB_EXIT';
+      SoNameStr:='-soname '+ExtractFileName(current_module.sharedlibfilename);
+
+      { Call linker }
+      SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
+      Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
+      Replace(cmdstr,'$OPT',Info.ExtraOptions);
+      Replace(cmdstr,'$TARGET',targetstr);
+      Replace(cmdstr,'$EMUL',EmulStr);
+      Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
+      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+LinkFilesFileName));
+      Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
+      Replace(cmdstr,'$INIT',InitStr);
+      Replace(cmdstr,'$FINI',FiniStr);
+      Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
+      Replace(cmdstr,'$SONAME',SoNameStr);
+      Replace(cmdstr,'$MAP',mapstr);
+      Replace(cmdstr,'$LTO',ltostr);
+      if ordersymfile<>'' then
+        Replace(cmdstr,'$ORDERSYMS','-order_file '+maybequoted(ordersymfile))
+      else
+        Replace(cmdstr,'$ORDERSYMS','');
+      Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
+      BinStr:=FindUtil(utilsprefix+BinStr);
+
+      { create dsym file? }
+      extdbgbinstr:='';
+      extdbgcmdstr:='';
+      if (target_dbg.id in [dbg_dwarf2,dbg_dwarf3]) and
+         (cs_link_separate_dbg_file in current_settings.globalswitches) then
+        begin
+          extdbgbinstr:=FindUtil(utilsprefix+'dsymutil');
+          extdbgcmdstr:=maybequoted(current_module.sharedlibfilename);
+        end;
+
+      if not texportlibunix(exportlib).exportedsymnames.empty then
+        begin
+          LinkSymsFileName:=UniqueName('linksyms')+'.fpc';
+          assign(exportedsyms,outputexedir+LinkSymsFileName);
+          rewrite(exportedsyms);
+          repeat
+            writeln(exportedsyms,texportlibunix(exportlib).exportedsymnames.getfirst);
+          until texportlibunix(exportlib).exportedsymnames.empty;
+          close(exportedsyms);
+          cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir)+LinkSymsFileName;
+        end;
+
+      if not(cs_link_nolink in current_settings.globalswitches) then
+        begin
+          { we have to use a script to use the IFS hack }
+          linkscript:=GenerateScript(outputexedir+'ppaslink');
+          linkscript.AddLinkCommand(BinStr,CmdStr,'');
+          if (extdbgbinstr<>'') then
+            linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
+          linkscript.WriteToDisk;
+          BinStr:=linkscript.fn;
+          if not path_absolute(BinStr) then
+            if cs_link_on_target in current_settings.globalswitches then
+              BinStr:='.'+target_info.dirsep+BinStr
+            else
+              BinStr:='.'+source_info.dirsep+BinStr;
+          CmdStr:='';
+        end;
+
+      success:=DoExec(BinStr,cmdstr,true,true);
+      if (success and
+          (extdbgbinstr<>'') and
+          (cs_link_nolink in current_settings.globalswitches)) then
+        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,true);
+
+    { Strip the library ? }
+      if success and (cs_link_strip in current_settings.globalswitches) then
+       begin
+         SplitBinCmd(Info.DllCmd[2],binstr,cmdstr);
+         Replace(cmdstr,'$EXE',maybequoted(current_module.sharedlibfilename));
+         success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,false,false);
+       end;
+
+    { Remove ReponseFile }
+      if (success) and not(cs_link_nolink in current_settings.globalswitches) then
+        begin
+          DeleteFile(outputexedir+Info.ResName);
+          if ordersymfile<>'' then
+            DeleteFile(ordersymfile);
+          DeleteFile(linkscript.fn);
+          linkscript.free;
+           if not texportlibunix(exportlib).exportedsymnames.empty then
+             DeleteFile(outputexedir+LinkSymsFileName);
+           DeleteFile(outputexedir+LinkFilesFileName);
+        end;
+
+      MakeSharedLibrary:=success;   { otherwise a recursive call to link method }
+    end;
+
+
+
+{*****************************************************************************
+                                     Initialize
+*****************************************************************************}
+
+initialization
+  RegisterLinker(ld_darwin,tlinkerdarwin);
+{$ifdef x86_64}
+  RegisterImport(system_x86_64_darwin,timportlibdarwin);
+  RegisterExport(system_x86_64_darwin,texportlibdarwin);
+  RegisterTarget(system_x86_64_darwin_info);
+  RegisterImport(system_x86_64_iphonesim,timportlibdarwin);
+  RegisterExport(system_x86_64_iphonesim,texportlibdarwin);
+  RegisterTarget(system_x86_64_iphonesim_info);
+{$endif}
+{$ifdef i386}
+  RegisterImport(system_i386_darwin,timportlibdarwin);
+  RegisterExport(system_i386_darwin,texportlibdarwin);
+  RegisterTarget(system_i386_darwin_info);
+  RegisterImport(system_i386_iphonesim,timportlibdarwin);
+  RegisterExport(system_i386_iphonesim,texportlibdarwin);
+  RegisterTarget(system_i386_iphonesim_info);
+{$endif i386}
+{$ifdef powerpc}
+  RegisterImport(system_powerpc_darwin,timportlibdarwin);
+  RegisterExport(system_powerpc_darwin,texportlibdarwin);
+  RegisterTarget(system_powerpc_darwin_info);
+{$endif powerpc}
+{$ifdef powerpc64}
+  RegisterImport(system_powerpc64_darwin,timportlibdarwin);
+  RegisterExport(system_powerpc64_darwin,texportlibdarwin);
+  RegisterTarget(system_powerpc64_darwin_info);
+{$endif powerpc64}
+{$ifdef arm}
+  RegisterImport(system_arm_darwin,timportlibdarwin);
+  RegisterExport(system_arm_darwin,texportlibdarwin);
+  RegisterTarget(system_arm_darwin_info);
+{$endif arm}
+{$ifdef aarch64}
+  RegisterImport(system_aarch64_darwin,timportlibdarwin);
+  RegisterExport(system_aarch64_darwin,texportlibdarwin);
+  RegisterTarget(system_aarch64_darwin_info);
+{$endif aarch64}
+
+  RegisterRes(res_macho_info,TWinLikeResourceFile);
+end.
+

+ 3 - 0
compiler/x86_64/cputarg.pas

@@ -44,6 +44,9 @@ implementation
     {$ifndef NOTARGETFREEBSD}
       ,t_bsd
     {$endif}
+    {$ifndef NOTARGETDARWIN}
+      ,t_darwin
+    {$endif}
     {$ifndef NOTARGETWIN}
       ,t_win
       ,win64unw