Browse Source

* synchronized with trunk

git-svn-id: branches/z80@44414 -
nickysn 5 years ago
parent
commit
48b4cc34cb
53 changed files with 9960 additions and 1279 deletions
  1. 23 0
      .gitattributes
  2. 5 5
      Makefile
  3. 2 2
      Makefile.fpc
  4. 2 2
      compiler/aarch64/cputarg.pas
  5. 3 0
      compiler/arm/cputarg.pas
  6. 3 0
      compiler/i386/cputarg.pas
  7. 42 10
      compiler/link.pas
  8. 1 1
      compiler/ngenutil.pas
  9. 2 2
      compiler/options.pas
  10. 1 1
      compiler/pmodules.pas
  11. 4 1
      compiler/powerpc/cputarg.pas
  12. 2 2
      compiler/powerpc64/cputarg.pas
  13. 5 2
      compiler/systems.inc
  14. 3 0
      compiler/systems.pas
  15. 2 572
      compiler/systems/i_bsd.pas
  16. 636 0
      compiler/systems/i_darwin.pas
  17. 775 0
      compiler/systems/i_freertos.pas
  18. 78 601
      compiler/systems/t_bsd.pas
  19. 773 0
      compiler/systems/t_darwin.pas
  20. 1861 0
      compiler/systems/t_freertos.pas
  21. 1 1
      compiler/utils/fpc.pp
  22. 2 1
      compiler/utils/ppuutils/ppudump.pp
  23. 3 0
      compiler/x86_64/cputarg.pas
  24. 5 1
      compiler/xtensa/cgcpu.pas
  25. 2 0
      compiler/xtensa/cpuinfo.pas
  26. 0 39
      compiler/xtensa/cpupara.pas
  27. 1 1
      compiler/xtensa/cputarg.pas
  28. 8 4
      compiler/xtensa/ncpuadd.pas
  29. 3 7
      rtl/darwin/sysmach.inc
  30. 2969 0
      rtl/freertos/Makefile
  31. 437 0
      rtl/freertos/Makefile.fpc
  32. 83 0
      rtl/freertos/check.inc
  33. 47 0
      rtl/freertos/classes.pp
  34. 179 0
      rtl/freertos/consoleio.pp
  35. 280 0
      rtl/freertos/dos.pp
  36. 297 0
      rtl/freertos/heapmgr.pp
  37. 29 0
      rtl/freertos/rtldefs.inc
  38. 67 0
      rtl/freertos/sysdir.inc
  39. 115 0
      rtl/freertos/sysfile.inc
  40. 15 0
      rtl/freertos/sysheap.inc
  41. 12 0
      rtl/freertos/sysos.inc
  42. 44 0
      rtl/freertos/sysosh.inc
  43. 266 0
      rtl/freertos/system.cfg
  44. 337 0
      rtl/freertos/system.pp
  45. 21 0
      rtl/freertos/systhrd.inc
  46. 296 0
      rtl/freertos/sysutils.pp
  47. 111 0
      rtl/freertos/tthread.inc
  48. 58 0
      rtl/freertos/xtensa/esp32.pp
  49. 11 7
      rtl/inc/heaph.inc
  50. 4 2
      rtl/inc/systemh.inc
  51. 1 1
      utils/fpcm/fpcmmain.pp
  52. 32 13
      utils/fpcm/get_revision.sh
  53. 1 1
      utils/fpcm/revision.inc

+ 23 - 0
.gitattributes

@@ -831,8 +831,10 @@ 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
 compiler/systems/i_gba.pas svneol=native#text/plain
 compiler/systems/i_go32v2.pas svneol=native#text/plain
 compiler/systems/i_haiku.pas svneol=native#text/plain
@@ -862,8 +864,10 @@ 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
 compiler/systems/t_gba.pas svneol=native#text/plain
 compiler/systems/t_go32v2.pas svneol=native#text/plain
 compiler/systems/t_haiku.pas svneol=native#text/plain
@@ -10710,6 +10714,25 @@ rtl/freebsd/x86_64/prt0.as svneol=native#text/plain
 rtl/freebsd/x86_64/reloc.inc svneol=native#text/plain
 rtl/freebsd/x86_64/si_c.inc svneol=native#text/plain
 rtl/freebsd/x86_64/sighnd.inc svneol=native#text/plain
+rtl/freertos/Makefile svneol=native#text/plain
+rtl/freertos/Makefile.fpc svneol=native#text/plain
+rtl/freertos/check.inc svneol=native#text/plain
+rtl/freertos/classes.pp svneol=native#text/pascal
+rtl/freertos/consoleio.pp svneol=native#text/pascal
+rtl/freertos/dos.pp svneol=native#text/pascal
+rtl/freertos/heapmgr.pp svneol=native#text/pascal
+rtl/freertos/rtldefs.inc svneol=native#text/plain
+rtl/freertos/sysdir.inc svneol=native#text/plain
+rtl/freertos/sysfile.inc svneol=native#text/plain
+rtl/freertos/sysheap.inc svneol=native#text/plain
+rtl/freertos/sysos.inc svneol=native#text/plain
+rtl/freertos/sysosh.inc svneol=native#text/plain
+rtl/freertos/system.cfg svneol=native#text/plain
+rtl/freertos/system.pp svneol=native#text/pascal
+rtl/freertos/systhrd.inc svneol=native#text/plain
+rtl/freertos/sysutils.pp svneol=native#text/pascal
+rtl/freertos/tthread.inc svneol=native#text/plain
+rtl/freertos/xtensa/esp32.pp svneol=native#text/pascal
 rtl/gba/Makefile svneol=native#text/plain
 rtl/gba/Makefile.fpc svneol=native#text/plain
 rtl/gba/classes.pp svneol=native#text/plain

+ 5 - 5
Makefile

@@ -2,7 +2,7 @@
 # Don't edit, this file is generated by FPCMake Version 2.0.0
 #
 default: help
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-darwin aarch64-android wasm-wasm sparc64-linux riscv32-linux riscv32-embedded riscv64-linux riscv64-embedded xtensa-embedded xtensa-freertos
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-darwin aarch64-android wasm-wasm sparc64-linux riscv32-linux riscv32-embedded riscv64-linux riscv64-embedded xtensa-embedded xtensa-FreeRTOS
 BSDs = freebsd netbsd openbsd darwin dragonfly
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari
@@ -331,8 +331,8 @@ endif
 endif
 override PACKAGE_NAME=fpc
 override PACKAGE_VERSION=3.3.1
-REQUIREDVERSION=3.0.4
-REQUIREDVERSION2=3.0.2
+REQUIREDVERSION=3.2.0
+REQUIREDVERSION2=3.0.4
 ifndef inOS2
 override FPCDIR:=$(BASEDIR)
 export FPCDIR
@@ -769,7 +769,7 @@ endif
 ifeq ($(FULL_TARGET),xtensa-embedded)
 override TARGET_DIRS+=compiler rtl utils packages installer
 endif
-ifeq ($(FULL_TARGET),xtensa-freertos)
+ifeq ($(FULL_TARGET),xtensa-FreeRTOS)
 override TARGET_DIRS+=compiler rtl utils packages installer
 endif
 override INSTALL_FPCPACKAGE=y
@@ -2611,7 +2611,7 @@ TARGET_DIRS_UTILS=1
 TARGET_DIRS_PACKAGES=1
 TARGET_DIRS_INSTALLER=1
 endif
-ifeq ($(FULL_TARGET),xtensa-freertos)
+ifeq ($(FULL_TARGET),xtensa-FreeRTOS)
 TARGET_DIRS_COMPILER=1
 TARGET_DIRS_RTL=1
 TARGET_DIRS_UTILS=1

+ 2 - 2
Makefile.fpc

@@ -20,8 +20,8 @@ fpcdir=.
 rule=help
 
 [prerules]
-REQUIREDVERSION=3.0.4
-REQUIREDVERSION2=3.0.2
+REQUIREDVERSION=3.2.0
+REQUIREDVERSION2=3.0.4
 
 
 # make versions < 3.77 (OS2 version) are buggy

+ 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

+ 1 - 1
compiler/ngenutil.pas

@@ -1547,7 +1547,7 @@ implementation
       tcb.free;
 
       { allocate an initial heap on embedded systems }
-      if target_info.system in systems_embedded then
+      if target_info.system in (systems_embedded+systems_freertos) then
         begin
           { tai_datablock cannot yet be handled via the high level typed const
             builder, because it implies the generation of a symbol, while this

+ 2 - 2
compiler/options.pas

@@ -2538,7 +2538,7 @@ begin
                       begin
 {$push}
 {$warn 6018 off} { Unreachable code due to compile time evaluation }
-                        if (target_info.system in systems_embedded) and
+                        if ((target_info.system in systems_embedded) or (target_info.system in systems_freertos)) and
                           ControllerSupport then
                           begin
                             s:=upper(copy(more,j+1,length(more)-j));
@@ -4641,7 +4641,7 @@ begin
 
 {$push}
 {$warn 6018 off} { Unreachable code due to compile time evaluation }
-  if ControllerSupport and (target_info.system in systems_embedded) and
+  if ControllerSupport and (target_info.system in (systems_embedded+systems_freertos)) and
     (init_settings.controllertype<>ct_none) then
     begin
       with embedded_controllers[init_settings.controllertype] do

+ 1 - 1
compiler/pmodules.pas

@@ -408,7 +408,7 @@ implementation
 {$push}
 {$warn 6018 off} { Unreachable code due to compile time evaluation }
         { CPU targets with microcontroller support can add a controller specific unit }
-        if ControllerSupport and (target_info.system in systems_embedded) and
+        if ControllerSupport and (target_info.system in (systems_embedded+systems_freertos)) and
           (current_settings.controllertype<>ct_none) and
           (embedded_controllers[current_settings.controllertype].controllerunitstr<>'') then
           AddUnit(embedded_controllers[current_settings.controllertype].controllerunitstr);

+ 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

+ 5 - 2
compiler/systems.inc

@@ -193,7 +193,8 @@
              system_x86_64_android,     { 101 }
              system_x86_64_haiku,       { 102 }
              system_xtensa_embedded,    { 103 }
-             system_z80_embedded        { 104 }
+             system_xtensa_freertos,    { 104 }
+             system_z80_embedded        { 105 }
        );
 
      type
@@ -260,6 +261,7 @@
              ld_android,
              ld_beos,
              ld_bsd,
+             ld_darwin,
              ld_embedded,
              ld_emx,
              ld_gba,
@@ -287,7 +289,8 @@
              ld_int_netware,
              ld_int_windows,
              ld_int_msdos,
-             ld_int_win16
+             ld_int_win16,
+             ld_freertos
        );
 
        tar = (ar_none

+ 3 - 0
compiler/systems.pas

@@ -301,6 +301,9 @@ interface
                            system_i8086_embedded,system_riscv32_embedded,system_riscv64_embedded,
                            system_xtensa_embedded];
 
+       { all FreeRTOS systems }
+       systems_freertos = [system_xtensa_freertos];
+
        { all systems that allow section directive }
        systems_allow_section = systems_embedded;
 

+ 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.
+

+ 775 - 0
compiler/systems/i_freertos.pas

@@ -0,0 +1,775 @@
+{
+    This unit implements support information structures for the FPC FreeRTOS target
+
+    Copyright (c) 1998-2006 by Peter Vreman
+
+    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_freertos;
+
+{$i fpcdefs.inc}
+
+{$ifdef go32v2}
+  { As wlib uses a different Dos-Extender, long-command line
+    encoding for DJGPP does not work here.
+    Put all inside a script file instead }
+  {$define USE_SCRIPTED_WLIB}
+{$endif}
+
+  interface
+
+    uses
+       systems;
+
+    const
+{$ifdef dummy}
+       system_arm_embedded_info : tsysteminfo =
+          (
+            system       : system_arm_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_needs_symbol_size,tf_files_case_sensitive,tf_requires_proper_alignment,
+                            tf_smartlink_sections,tf_init_final_units_by_calls];
+            cpu          : cpu_arm;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_gas;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_embedded;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_dwarf2;
+            script       : script_unix;
+            endian       : endian_little;
+            alignment    :
+              (
+                procalign       : 4;
+                loopalign       : 4;
+                jumpalign       : 0;
+                jumpalignskipmax    : 0;
+                coalescealign   : 0;
+                coalescealignskipmax: 0;
+                constalignmin   : 0;
+                constalignmax   : 4;
+                varalignmin     : 0;
+                varalignmax     : 4;
+                localalignmin   : 4;
+                localalignmax   : 4;
+                recordalignmin  : 0;
+                recordalignmax  : 4;
+                maxCrecordalign : 4
+              );
+            first_parm_offset : 8;
+            stacksize    : 262144;
+            stackalign   : 4;
+            abi : abi_default;
+            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_avr_embedded_info : tsysteminfo =
+          (
+            system       : system_avr_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_needs_symbol_size,tf_files_case_sensitive,
+                            tf_smartlink_sections,tf_init_final_units_by_calls];
+            cpu          : cpu_avr;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_gas;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_embedded;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_dwarf3;
+            script       : script_unix;
+            endian       : endian_little;
+            alignment    :
+              (
+                procalign       : 1;
+                loopalign       : 1;
+                jumpalign       : 0;
+                jumpalignskipmax    : 0;
+                coalescealign   : 0;
+                coalescealignskipmax: 0;
+                constalignmin   : 0;
+                constalignmax   : 1;
+                varalignmin     : 0;
+                varalignmax     : 1;
+                localalignmin   : 0;
+                localalignmax   : 1;
+                recordalignmin  : 0;
+                recordalignmax  : 1;
+                maxCrecordalign : 1
+              );
+            first_parm_offset : 0;
+            stacksize    : 1024;
+            stackalign   : 1;
+            abi : abi_default;
+            llvmdatalayout : 'todo';
+          );
+
+       system_mipsel_embedded_info : tsysteminfo =
+          (
+            system       : system_mipsel_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,
+                            tf_smartlink_sections];
+            cpu          : cpu_mipsel;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_gas;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_embedded;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_dwarf2;
+            script       : script_unix;
+            endian       : endian_little;
+            alignment    :
+              (
+                procalign       : 4;
+                loopalign       : 4;
+                jumpalign       : 0;
+                jumpalignskipmax    : 0;
+                coalescealign   : 0;
+                coalescealignskipmax: 0;
+                constalignmin   : 0;
+                constalignmax   : 4;
+                varalignmin     : 0;
+                varalignmax     : 4;
+                localalignmin   : 4;
+                localalignmax   : 8;
+                recordalignmin  : 0;
+                recordalignmax  : 8;
+                maxCrecordalign : 4
+              );
+            first_parm_offset : 0;
+            stacksize    : 262144;
+            stackalign   : 8;
+            abi : abi_default;
+            llvmdatalayout : 'todo';
+          );
+
+       system_i386_embedded_info : tsysteminfo =
+          (
+            system       : system_i386_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_needs_symbol_size,tf_files_case_sensitive,
+                            tf_smartlink_sections];
+            cpu          : cpu_i386;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_i386_elf32;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_embedded;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_stabs;
+            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   : 8;
+                recordalignmin  : 0;
+                recordalignmax  : 16;
+                maxCrecordalign : 4
+              );
+            first_parm_offset : 8;
+            stacksize    : 4096;
+            stackalign   : 4;
+            abi : abi_default;
+            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:32:32-n8:16:32-S32';
+          );
+
+       system_x86_64_embedded_info : tsysteminfo =
+          (
+            system       : system_x86_64_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_needs_symbol_size,tf_files_case_sensitive,
+                            tf_smartlink_sections];
+            cpu          : cpu_x86_64;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_x86_64_elf64;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_embedded;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_stabs;
+            script       : script_unix;
+            endian       : endian_little;
+            alignment    :
+              (
+                procalign       : 16;
+                loopalign       : 8;
+                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_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_i8086_embedded_info : tsysteminfo =
+          (
+            system       : system_i8086_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_use_8_3,
+{$ifdef I8086_SMARTLINK_SECTIONS}
+                            tf_smartlink_sections,
+{$else I8086_SMARTLINK_SECTIONS}
+                            tf_smartlink_library,
+                            tf_no_objectfiles_when_smartlinking,
+{$endif I8086_SMARTLINK_SECTIONS}
+                            tf_cld,
+                            tf_no_generic_stackcheck,tf_emit_stklen];
+            cpu          : cpu_i8086;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '.exe';
+            defext       : '.def';
+            scriptext    : '.bat';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.dll';
+            staticlibext : '.a';
+            staticlibprefix : '';
+            sharedlibprefix : '';
+            sharedClibext : '.dll';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : '';
+            importlibprefix : '';
+            importlibext : '.al';
+            Cprefix      : '_';
+            newline      : #13#10;
+            dirsep       : '\';
+            assem        : as_i8086_omf;
+            assemextern  : as_i8086_nasmobj;
+            link         : ld_int_msdos;
+            linkextern   : ld_msdos;
+{$ifdef USE_SCRIPTED_WLIB}
+            ar           : ar_watcom_wlib_omf_scripted;
+{$else}
+            ar           : ar_watcom_wlib_omf;
+{$endif}
+            res          : res_none;
+            dbg          : dbg_dwarf2;
+            script       : script_dos;
+            endian       : endian_little;
+            alignment    :
+              (
+                procalign       : 1;
+                loopalign       : 1;
+                jumpalign       : 0;
+                jumpalignskipmax    : 0;
+                coalescealign   : 0;
+                coalescealignskipmax: 0;
+                constalignmin   : 0;
+                constalignmax   : 2;
+                varalignmin     : 0;
+                varalignmax     : 2;
+                localalignmin   : 0;
+                localalignmax   : 2;
+                recordalignmin  : 0;
+                recordalignmax  : 2;
+                maxCrecordalign : 2
+              );
+            first_parm_offset : 4;
+            stacksize    : 0;
+            stackalign   : 2;
+            abi          : abi_default;
+            llvmdatalayout : 'todo';
+          );
+
+       system_m68k_embedded_info : tsysteminfo =
+          (
+            system       : system_m68k_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_under_development,tf_needs_symbol_size,tf_files_case_sensitive,tf_requires_proper_alignment,
+                            tf_smartlink_sections];
+            cpu          : cpu_m68k;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_gas;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_embedded;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_dwarf2;
+            script       : script_unix;
+            endian       : endian_big;
+            alignment    :
+              (
+                procalign       : 4;
+                loopalign       : 4;
+                jumpalign       : 0;
+                jumpalignskipmax    : 0;
+                coalescealign   : 0;
+                coalescealignskipmax: 0;
+                constalignmin   : 0;
+                constalignmax   : 4;
+                varalignmin     : 0;
+                varalignmax     : 4;
+                localalignmin   : 4;
+                localalignmax   : 4;
+                recordalignmin  : 0;
+                recordalignmax  : 4;
+                maxCrecordalign : 4
+              );
+            first_parm_offset : 8;
+            stacksize    : 32768;
+            stackalign   : 4;
+            abi : abi_default;
+            llvmdatalayout : 'TODO';
+          );
+
+       system_riscv32_embedded_info : tsysteminfo =
+          (
+            system       : system_riscv32_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_needs_symbol_size,tf_files_case_sensitive,tf_requires_proper_alignment,
+                            tf_smartlink_sections];
+            cpu          : cpu_riscv32;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_gas;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_embedded;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_dwarf2;
+            script       : script_unix;
+            endian       : endian_little;
+            alignment    :
+              (
+                procalign       : 4;
+                loopalign       : 4;
+                jumpalign       : 0;
+                jumpalignskipmax    : 0;
+                coalescealign   : 0;
+                coalescealignskipmax: 0;
+                constalignmin   : 0;
+                constalignmax   : 4;
+                varalignmin     : 0;
+                varalignmax     : 4;
+                localalignmin   : 4;
+                localalignmax   : 4;
+                recordalignmin  : 0;
+                recordalignmax  : 4;
+                maxCrecordalign : 4
+              );
+            first_parm_offset : 8;
+            stacksize    : 262144;
+            stackalign   : 4;
+            abi : abi_default;
+            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_riscv64_embedded_info : tsysteminfo =
+          (
+            system       : system_riscv64_embedded;
+            name         : 'Embedded';
+            shortname    : 'embedded';
+            flags        : [tf_needs_symbol_size,tf_files_case_sensitive,tf_requires_proper_alignment,
+                            tf_smartlink_sections];
+            cpu          : cpu_riscv64;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_gas;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_embedded;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_dwarf2;
+            script       : script_unix;
+            endian       : endian_little;
+            alignment    :
+              (
+                procalign       : 4;
+                loopalign       : 4;
+                jumpalign       : 0;
+                jumpalignskipmax    : 0;
+                coalescealign   : 0;
+                coalescealignskipmax: 0;
+                constalignmin   : 0;
+                constalignmax   : 4;
+                varalignmin     : 0;
+                varalignmax     : 4;
+                localalignmin   : 4;
+                localalignmax   : 4;
+                recordalignmin  : 0;
+                recordalignmax  : 4;
+                maxCrecordalign : 4
+              );
+            first_parm_offset : 16;
+            stacksize    : 262144;
+            stackalign   : 8;
+            abi : abi_default;
+            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';
+          );
+{$endif dummy}
+
+       system_xtensa_freertos_info : tsysteminfo =
+          (
+            system       : system_xtensa_freertos;
+            name         : 'FreeRTOS';
+            shortname    : 'freertos';
+            flags        : [tf_needs_symbol_size,tf_files_case_sensitive,tf_requires_proper_alignment,
+                            tf_smartlink_sections,tf_init_final_units_by_calls];
+            cpu          : cpu_xtensa;
+            unit_env     : '';
+            extradefines : '';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.so';
+            staticlibext : '.a';
+            staticlibprefix : 'libp';
+            sharedlibprefix : 'lib';
+            sharedClibext : '.so';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : 'lib';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            assem        : as_gas;
+            assemextern  : as_gas;
+            link         : ld_none;
+            linkextern   : ld_freertos;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            dbg          : dbg_dwarf2;
+            script       : script_unix;
+            endian       : endian_little;
+            alignment    :
+              (
+                procalign       : 4;
+                loopalign       : 4;
+                jumpalign       : 0;
+                jumpalignskipmax    : 0;
+                coalescealign   : 0;
+                coalescealignskipmax: 0;
+                constalignmin   : 0;
+                constalignmax   : 4;
+                varalignmin     : 0;
+                varalignmax     : 4;
+                localalignmin   : 4;
+                localalignmax   : 16;
+                recordalignmin  : 0;
+                recordalignmax  : 4;
+                maxCrecordalign : 4
+              );
+            first_parm_offset : 8;
+            stacksize    : 65536;
+            stackalign   : 16;
+            abi : abi_default;
+            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';
+          );
+
+ implementation
+
+initialization
+{$ifdef CPUARM}
+  {$ifdef embedded}
+    set_source_info(system_arm_freertos_info);
+  {$endif embedded}
+{$endif CPUARM}
+{$ifdef CPUAVR}
+  {$ifdef embedded}
+    set_source_info(system_avr_freertosd_info);
+  {$endif embedded}
+{$endif CPUAVR}
+{$ifdef CPUMIPSEL}
+  {$ifdef embedded}
+    set_source_info(system_mipsel_freertos_info);
+  {$endif embedded}
+{$endif CPUMIPSEL}
+{$ifdef CPUI386}
+  {$ifdef embedded}
+    set_source_info(system_i386_freertos_info);
+  {$endif embedded}
+{$endif CPUI386}
+{$ifdef CPUX86_64}
+  {$ifdef embedded}
+    set_source_info(system_x86_64_freertos_info);
+  {$endif embedded}
+{$endif CPUX86_64}
+{$ifdef cpu8086}
+  {$ifdef embedded}
+    set_source_info(system_i8086_freertos_info);
+  {$endif embedded}
+{$endif cpu8086}
+{$ifdef cpum68k}
+  {$ifdef embedded}
+    set_source_info(system_m68k_freertos_info);
+  {$endif embedded}
+{$endif cpum68k}
+{$ifdef cpuriscv32}
+  {$ifdef embedded}
+    set_source_info(system_riscv32_freertos_info);
+  {$endif embedded}
+{$endif cpuriscv32}
+{$ifdef cpuriscv64}
+  {$ifdef embedded}
+    set_source_info(system_riscv64_freertos_info);
+  {$endif embedded}
+{$endif cpuriscv64}
+{$ifdef cpuxtensa}
+  {$ifdef embedded}
+    set_source_info(system_xtensa_freertos_info);
+  {$endif embedded}
+{$endif cpuxtensa}
+end.
+

+ 78 - 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,19 +627,12 @@ begin
 
 { Call linker }
   SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
-{$ifndef darwin}
   Replace(cmdstr,'$EXE',maybequoted(current_module.sharedlibfilename));
-{$else darwin}
-  Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
-{$endif darwin}
   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);
@@ -1088,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
@@ -1145,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
@@ -1169,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 }
@@ -1199,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);
@@ -1217,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);
@@ -1230,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.
+

+ 1861 - 0
compiler/systems/t_freertos.pas

@@ -0,0 +1,1861 @@
+{
+    Copyright (c) 2005-2017 by Free Pascal Compiler team
+
+    This unit implements support import, export, link routines
+    for the FreeRTOS 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_freertos;
+
+{$i fpcdefs.inc}
+
+interface
+
+
+implementation
+
+    uses
+       SysUtils,
+       cutils,cfileutl,cclasses,
+       globtype,globals,systems,verbose,comphook,cscript,fmodule,i_freertos,link,
+       cpuinfo;
+
+    type
+       TlinkerFreeRTOS=class(texternallinker)
+       private
+          Function  WriteResponseFile: Boolean;
+       public
+          constructor Create; override;
+          procedure SetDefaultInfo; override;
+          function  MakeExecutable:boolean; override;
+          function postprocessexecutable(const fn : string;isdll:boolean):boolean;
+       end;
+
+
+
+{*****************************************************************************
+                                  TlinkerEmbedded
+*****************************************************************************}
+
+Constructor TlinkerFreeRTOS.Create;
+begin
+  Inherited Create;
+  SharedLibFiles.doubles:=true;
+  StaticLibFiles.doubles:=true;
+end;
+
+
+procedure TlinkerFreeRTOS.SetDefaultInfo;
+const
+{$ifdef mips}
+  {$ifdef mipsel}
+    platform_select='-EL';
+  {$else}
+    platform_select='-EB';
+  {$endif}
+{$else}
+  platform_select='';
+{$endif}
+begin
+  with Info do
+   begin
+     ExeCmd[1]:='ld -g '+platform_select+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE -T $RES';
+   end;
+end;
+
+
+Function TlinkerFreeRTOS.WriteResponseFile: Boolean;
+Var
+  linkres  : TLinkRes;
+  i        : longint;
+  HPath    : TCmdStrListItem;
+  s,s1,s2  : TCmdStr;
+  prtobj,
+  cprtobj  : string[80];
+  linklibc : boolean;
+  found1,
+  found2   : boolean;
+{$if defined(ARM)}
+  LinkStr  : string;
+{$endif}
+begin
+  WriteResponseFile:=False;
+  linklibc:=(SharedLibFiles.Find('c')<>nil);
+{$if defined(ARM) or defined(i386) or defined(x86_64) or defined(AVR) or defined(MIPSEL) or defined(RISCV32) or defined(XTENSA)}
+  prtobj:='';
+{$else}
+  prtobj:='prt0';
+{$endif}
+  cprtobj:='cprt0';
+  if linklibc then
+    prtobj:=cprtobj;
+
+  { Open link.res file }
+  LinkRes:=TLinkRes.Create(outputexedir+Info.ResName,true);
+
+  { Write path to search libraries }
+  HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
+  while assigned(HPath) do
+   begin
+    s:=HPath.Str;
+    if (cs_link_on_target in current_settings.globalswitches) then
+     s:=ScriptFixFileName(s);
+    LinkRes.Add('-L'+s);
+    HPath:=TCmdStrListItem(HPath.Next);
+   end;
+  HPath:=TCmdStrListItem(LibrarySearchPath.First);
+  while assigned(HPath) do
+   begin
+    s:=HPath.Str;
+    if s<>'' then
+     LinkRes.Add('SEARCH_DIR("'+s+'")');
+    HPath:=TCmdStrListItem(HPath.Next);
+   end;
+
+  LinkRes.Add('INPUT (');
+  { add objectfiles, start with prt0 always }
+  //s:=FindObjectFile('prt0','',false);
+  if prtobj<>'' then
+    begin
+      s:=FindObjectFile(prtobj,'',false);
+      LinkRes.AddFileName(s);
+    end;
+
+  { try to add crti and crtbegin if linking to C }
+  if linklibc then
+   begin
+     if librarysearchpath.FindFile('crtbegin.o',false,s) then
+      LinkRes.AddFileName(s);
+     if librarysearchpath.FindFile('crti.o',false,s) then
+      LinkRes.AddFileName(s);
+   end;
+
+  while not ObjectFiles.Empty do
+   begin
+    s:=ObjectFiles.GetFirst;
+    if s<>'' then
+     begin
+      { vlink doesn't use SEARCH_DIR for object files }
+      if not(cs_link_on_target in current_settings.globalswitches) then
+       s:=FindObjectFile(s,'',false);
+      LinkRes.AddFileName((maybequoted(s)));
+     end;
+   end;
+
+  { Write staticlibraries }
+  if not StaticLibFiles.Empty then
+   begin
+    { vlink doesn't need, and doesn't support GROUP }
+    if (cs_link_on_target in current_settings.globalswitches) then
+     begin
+      LinkRes.Add(')');
+      LinkRes.Add('GROUP(');
+     end;
+    while not StaticLibFiles.Empty do
+     begin
+      S:=StaticLibFiles.GetFirst;
+      LinkRes.AddFileName((maybequoted(s)));
+     end;
+   end;
+
+  if (cs_link_on_target in current_settings.globalswitches) then
+   begin
+    LinkRes.Add(')');
+
+    { Write sharedlibraries like -l<lib>, also add the needed dynamic linker
+      here to be sure that it gets linked this is needed for glibc2 systems (PFV) }
+    linklibc:=false;
+    while not SharedLibFiles.Empty do
+     begin
+      S:=SharedLibFiles.GetFirst;
+      if s<>'c' then
+       begin
+        i:=Pos(target_info.sharedlibext,S);
+        if i>0 then
+         Delete(S,i,255);
+        LinkRes.Add('-l'+s);
+       end
+      else
+       begin
+        LinkRes.Add('-l'+s);
+        linklibc:=true;
+       end;
+     end;
+    { be sure that libc&libgcc is the last lib }
+    if linklibc then
+     begin
+      LinkRes.Add('-lc');
+      LinkRes.Add('-lgcc');
+     end;
+   end
+  else
+   begin
+    while not SharedLibFiles.Empty do
+     begin
+      S:=SharedLibFiles.GetFirst;
+      LinkRes.Add('lib'+s+target_info.staticlibext);
+     end;
+    LinkRes.Add(')');
+   end;
+
+  { objects which must be at the end }
+  if linklibc then
+   begin
+     found1:=librarysearchpath.FindFile('crtend.o',false,s1);
+     found2:=librarysearchpath.FindFile('crtn.o',false,s2);
+     if found1 or found2 then
+      begin
+        LinkRes.Add('INPUT(');
+        if found1 then
+         LinkRes.AddFileName(s1);
+        if found2 then
+         LinkRes.AddFileName(s2);
+        LinkRes.Add(')');
+      end;
+   end;
+
+{$ifdef ARM}
+  case current_settings.controllertype of
+      ct_none:
+           begin
+           end;
+      ct_lpc810m021fn8,
+      ct_lpc811m001fdh16,
+      ct_lpc812m101fdh16,
+      ct_lpc812m101fd20,
+      ct_lpc812m101fdh20,
+      ct_lpc1110fd20,
+      ct_lpc1111fdh20_002,
+      ct_lpc1111fhn33_101,
+      ct_lpc1111fhn33_102,
+      ct_lpc1111fhn33_103,
+      ct_lpc1111fhn33_201,
+      ct_lpc1111fhn33_202,
+      ct_lpc1111fhn33_203,
+      ct_lpc1112fd20_102,
+      ct_lpc1112fdh20_102,
+      ct_lpc1112fdh28_102,
+      ct_lpc1112fhn33_101,
+      ct_lpc1112fhn33_102,
+      ct_lpc1112fhn33_103,
+      ct_lpc1112fhn33_201,
+      ct_lpc1112fhn24_202,
+      ct_lpc1112fhn33_202,
+      ct_lpc1112fhn33_203,
+      ct_lpc1112fhi33_202,
+      ct_lpc1112fhi33_203,
+      ct_lpc1113fhn33_201,
+      ct_lpc1113fhn33_202,
+      ct_lpc1113fhn33_203,
+      ct_lpc1113fhn33_301,
+      ct_lpc1113fhn33_302,
+      ct_lpc1113fhn33_303,
+      ct_lpc1113bfd48_301,
+      ct_lpc1113bfd48_302,
+      ct_lpc1113bfd48_303,
+      ct_lpc1114fdh28_102,
+      ct_lpc1114fn28_102,
+      ct_lpc1114fhn33_201,
+      ct_lpc1114fhn33_202,
+      ct_lpc1114fhn33_203,
+      ct_lpc1114fhn33_301,
+      ct_lpc1114fhn33_302,
+      ct_lpc1114fhn33_303,
+      ct_lpc1114fhn33_333,
+      ct_lpc1114fhi33_302,
+      ct_lpc1114fhi33_303,
+      ct_lpc1114bfd48_301,
+      ct_lpc1114bfd48_302,
+      ct_lpc1114bfd48_303,
+      ct_lpc1114bfd48_323,
+      ct_lpc1114bfd48_333,
+      ct_lpc1115bfd48_303,
+      ct_lpc11c12fd48_301,
+      ct_lpc11c14fd48_301,
+      ct_lpc11c22fd48_301,
+      ct_lpc11c24fd48_301,
+      ct_lpc11d24fd48_301,
+      ct_lpc1224fbd48_101,
+      ct_lpc1224fbd48_121,
+      ct_lpc1224fbd64_101,
+      ct_lpc1224fbd64_121,
+      ct_lpc1225fbd48_301,
+      ct_lpc1225fbd48_321,
+      ct_lpc1225fbd64_301,
+      ct_lpc1225fbd64_321,
+      ct_lpc1226fbd48_301,
+      ct_lpc1226fbd64_301,
+      ct_lpc1227fbd48_301,
+      ct_lpc1227fbd64_301,
+      ct_lpc12d27fbd100_301,
+      ct_lpc1311fhn33,
+      ct_lpc1311fhn33_01,
+      ct_lpc1313fhn33,
+      ct_lpc1313fhn33_01,
+      ct_lpc1313fbd48,
+      ct_lpc1313fbd48_01,
+      ct_lpc1315fhn33,
+      ct_lpc1315fbd48,
+      ct_lpc1316fhn33,
+      ct_lpc1316fbd48,
+      ct_lpc1317fhn33,
+      ct_lpc1317fbd48,
+      ct_lpc1317fbd64,
+      ct_lpc1342fhn33,
+      ct_lpc1342fbd48,
+      ct_lpc1343fhn33,
+      ct_lpc1343fbd48,
+      ct_lpc1345fhn33,
+      ct_lpc1345fbd48,
+      ct_lpc1346fhn33,
+      ct_lpc1346fbd48,
+      ct_lpc1347fhn33,
+      ct_lpc1347fbd48,
+      ct_lpc1347fbd64,
+      ct_lpc2114,
+      ct_lpc2124,
+      ct_lpc2194,
+      ct_lpc1768,
+      ct_at91sam7s256,
+      ct_at91sam7se256,
+      ct_at91sam7x256,
+      ct_at91sam7xc256,
+
+      ct_stm32f030c6,
+      ct_stm32f030c8,
+      ct_stm32f030f4,
+      ct_stm32f030k6,
+      ct_stm32f030r8,
+      ct_stm32f050c4,
+      ct_stm32f050c6,
+      ct_stm32f050f4,
+      ct_stm32f050f6,
+      ct_stm32f050g4,
+      ct_stm32f050g6,
+      ct_stm32f050k4,
+      ct_stm32f050k6,
+      ct_stm32f051c4,
+      ct_stm32f051c6,
+      ct_stm32f051c8,
+      ct_stm32f051k4,
+      ct_stm32f051k6,
+      ct_stm32f051k8,
+      ct_stm32f051r4,
+      ct_stm32f051r6,
+      ct_stm32f051r8,
+
+      ct_stm32f091cc,
+      ct_stm32f091cb,
+      ct_stm32f091rc,
+      ct_stm32f091rb,
+      ct_stm32f091vc,
+      ct_stm32f091vb,
+
+      ct_stm32f100x4,
+      ct_stm32f100x6,
+      ct_stm32f100x8,
+      ct_stm32f100xB,
+      ct_stm32f100xC,
+      ct_stm32f100xD,
+      ct_stm32f100xE,
+      ct_stm32f101x4,
+      ct_stm32f101x6,
+      ct_stm32f101x8,
+      ct_stm32f101xB,
+      ct_stm32f101xC,
+      ct_stm32f101xD,
+      ct_stm32f101xE,
+      ct_stm32f101xF,
+      ct_stm32f101xG,
+      ct_stm32f102x4,
+      ct_stm32f102x6,
+      ct_stm32f102x8,
+      ct_stm32f102xB,
+      ct_stm32f103x4,
+      ct_stm32f103x6,
+      ct_stm32f103x8,
+      ct_stm32f103xB,
+      ct_stm32f103xC,
+      ct_stm32f103xD,
+      ct_stm32f103xE,
+      ct_stm32f103xF,
+      ct_stm32f103xG,
+      ct_stm32f107x8,
+      ct_stm32f107xB,
+      ct_stm32f107xC,
+      ct_stm32f105r8,
+      ct_stm32f105rb,
+      ct_stm32f105rc,
+      ct_stm32f105v8,
+      ct_stm32f105vb,
+      ct_stm32f105vc,
+      ct_stm32f107rb,
+      ct_stm32f107rc,
+      ct_stm32f107vb,
+      ct_stm32f107vc,
+      
+      ct_stm32f401cb,
+      ct_stm32f401rb,
+      ct_stm32f401vb,
+      ct_stm32f401cc,
+      ct_stm32f401rc,
+      ct_stm32f401vc,
+      ct_discoveryf401vc,
+      ct_stm32f401cd,
+      ct_stm32f401rd,
+      ct_stm32f401vd,
+      ct_stm32f401ce,
+      ct_stm32f401re,
+      ct_nucleof401re,
+      ct_stm32f401ve,
+      ct_stm32f407vg,
+      ct_discoveryf407vg,
+      ct_stm32f407ig,
+      ct_stm32f407zg,
+      ct_stm32f407ve,
+      ct_stm32f407ze,
+      ct_stm32f407ie,
+      ct_stm32f411cc,
+      ct_stm32f411rc,
+      ct_stm32f411vc,
+      ct_stm32f411ce,
+      ct_stm32f411re,
+      ct_nucleof411re,
+      ct_stm32f411ve,
+      ct_discoveryf411ve,
+      ct_stm32f429vg,
+      ct_stm32f429zg,
+      ct_stm32f429ig,
+      ct_stm32f429vi,
+      ct_stm32f429zi,
+      ct_discoveryf429zi,
+      ct_stm32f429ii,
+      ct_stm32f429ve,
+      ct_stm32f429ze,
+      ct_stm32f429ie,
+      ct_stm32f429bg,
+      ct_stm32f429bi,
+      ct_stm32f429be,
+      ct_stm32f429ng,
+      ct_stm32f429ni,
+      ct_stm32f429ne,
+      ct_stm32f446mc,
+      ct_stm32f446rc,
+      ct_stm32f446vc,
+      ct_stm32f446zc,
+      ct_stm32f446me,
+      ct_stm32f446re,
+      ct_nucleof446re,
+      ct_stm32f446ve,
+      ct_stm32f446ze,
+
+      ct_stm32f745xe,
+      ct_stm32f745xg,
+      ct_stm32f746xe,
+      ct_stm32f746xg,
+      ct_stm32f756xe,
+      ct_stm32f756xg,
+
+      { TI - 64 K Flash, 16 K SRAM Devices }
+      ct_lm3s1110,
+      ct_lm3s1133,
+      ct_lm3s1138,
+      ct_lm3s1150,
+      ct_lm3s1162,
+      ct_lm3s1165,
+      ct_lm3s1166,
+      ct_lm3s2110,
+      ct_lm3s2139,
+      ct_lm3s6100,
+      ct_lm3s6110,
+
+      { TI 128 K Flash, 32 K SRAM devices - Fury Class }
+      ct_lm3s1601,
+      ct_lm3s1608,
+      ct_lm3s1620,
+      ct_lm3s1635,
+      ct_lm3s1636,
+      ct_lm3s1637,
+      ct_lm3s1651,
+      ct_lm3s2601,
+      ct_lm3s2608,
+      ct_lm3s2620,
+      ct_lm3s2637,
+      ct_lm3s2651,
+      ct_lm3s6610,
+      ct_lm3s6611,
+      ct_lm3s6618,
+      ct_lm3s6633,
+      ct_lm3s6637,
+      ct_lm3s8630,
+
+      { TI 256 K Flase, 32 K SRAM devices - Fury Class }
+      ct_lm3s1911,
+      ct_lm3s1918,
+      ct_lm3s1937,
+      ct_lm3s1958,
+      ct_lm3s1960,
+      ct_lm3s1968,
+      ct_lm3s1969,
+      ct_lm3s2911,
+      ct_lm3s2918,
+      ct_lm3s2919,
+      ct_lm3s2939,
+      ct_lm3s2948,
+      ct_lm3s2950,
+      ct_lm3s2965,
+      ct_lm3s6911,
+      ct_lm3s6918,
+      ct_lm3s6938,
+      ct_lm3s6950,
+      ct_lm3s6952,
+      ct_lm3s6965,
+      ct_lm3s8930,
+      ct_lm3s8933,
+      ct_lm3s8938,
+      ct_lm3s8962,
+      ct_lm3s8970,
+      ct_lm3s8971,
+
+      { TI - Tempest Tempest - 256 K Flash, 64 K SRAM }
+      ct_lm3s5951,
+      ct_lm3s5956,
+      ct_lm3s1b21,
+      ct_lm3s2b93,
+      ct_lm3s5b91,
+      ct_lm3s9b81,
+      ct_lm3s9b90,
+      ct_lm3s9b92,
+      ct_lm3s9b95,
+      ct_lm3s9b96,
+      
+      ct_lm3s5d51,
+      
+      { TI - Stellaris something }
+      ct_lm4f120h5,
+      
+      { Infineon }
+      ct_xmc4500x1024,
+      ct_xmc4500x768,
+      ct_xmc4502x768,
+      ct_xmc4504x512,
+
+      { Allwinner }
+      ct_allwinner_a20,
+
+      { Freescale }
+      ct_mk20dx128vfm5,
+      ct_mk20dx128vft5,
+      ct_mk20dx128vlf5,
+      ct_mk20dx128vlh5,
+      ct_teensy30,
+      ct_mk20dx128vmp5,
+
+      ct_mk20dx32vfm5,
+      ct_mk20dx32vft5,
+      ct_mk20dx32vlf5,
+      ct_mk20dx32vlh5,
+      ct_mk20dx32vmp5,
+
+      ct_mk20dx64vfm5,
+      ct_mk20dx64vft5,
+      ct_mk20dx64vlf5,
+      ct_mk20dx64vlh5,
+      ct_mk20dx64vmp5,
+
+      ct_mk20dx128vlh7,
+      ct_mk20dx128vlk7,
+      ct_mk20dx128vll7,
+      ct_mk20dx128vmc7,
+
+      ct_mk20dx256vlh7,
+      ct_mk20dx256vlk7,
+      ct_mk20dx256vll7,
+      ct_mk20dx256vmc7,
+      ct_teensy31,
+      ct_teensy32,
+
+      ct_mk20dx64vlh7,
+      ct_mk20dx64vlk7,
+      ct_mk20dx64vmc7,
+
+      ct_mk22fn512cap12,
+      ct_mk22fn512cbp12,
+      ct_mk22fn512vdc12,
+      ct_mk22fn512vlh12,
+      ct_mk22fn512vll12,
+      ct_mk22fn512vmp12,
+      ct_freedom_k22f,
+ 
+      { Atmel }
+      ct_sam3x8e,
+      ct_arduino_due,
+      ct_flip_n_click,
+      
+      { Nordic Semiconductor }
+      ct_nrf51422_xxaa,
+      ct_nrf51422_xxab,
+      ct_nrf51422_xxac,
+      ct_nrf51822_xxaa,
+      ct_nrf51822_xxab,
+      ct_nrf51822_xxac,
+      ct_nrf52832_xxaa,
+      ct_nrf52840_xxaa,
+      
+      ct_sc32442b,
+
+      { Raspberry Pi 2 }
+      ct_raspi2,
+
+      ct_thumb2bare:
+        begin
+         with embedded_controllers[current_settings.controllertype] do
+          with linkres do
+            begin
+              if (embedded_controllers[current_settings.controllertype].controllerunitstr='MK20D5')
+              or (embedded_controllers[current_settings.controllertype].controllerunitstr='MK20D7')
+              or (embedded_controllers[current_settings.controllertype].controllerunitstr='MK22F51212')
+              or (embedded_controllers[current_settings.controllertype].controllerunitstr='MK64F12') then
+                Add('ENTRY(_LOWLEVELSTART)')
+              else
+                Add('ENTRY(_START)');
+              Add('MEMORY');
+              Add('{');
+              if flashsize<>0 then
+                begin
+                  LinkStr := '    flash : ORIGIN = 0x' + IntToHex(flashbase,8)
+                    + ', LENGTH = 0x' + IntToHex(flashsize,8);
+                  Add(LinkStr);
+                end;
+
+              LinkStr := '    ram : ORIGIN = 0x' + IntToHex(srambase,8)
+              	+ ', LENGTH = 0x' + IntToHex(sramsize,8);
+              Add(LinkStr);
+
+              Add('}');
+              Add('_stack_top = 0x' + IntToHex(sramsize+srambase,8) + ';');
+    
+              // Add Checksum Calculation for LPC Controllers so that the bootloader starts the uploaded binary 
+              writeln(controllerunitstr);
+              if (controllerunitstr = 'LPC8xx') or (controllerunitstr = 'LPC11XX') or (controllerunitstr = 'LPC122X') then
+                Add('Startup_Checksum = 0 - (_stack_top + _START + 1 + NonMaskableInt_interrupt + 1 + Hardfault_interrupt + 1);');
+              if (controllerunitstr = 'LPC13XX') then
+                Add('Startup_Checksum = 0 - (_stack_top + _START + 1 + NonMaskableInt_interrupt + 1 + MemoryManagement_interrupt + 1 + BusFault_interrupt + 1 + UsageFault_interrupt + 1);');
+            end;
+        end
+    else
+      if not (cs_link_nolink in current_settings.globalswitches) then
+      	 internalerror(200902011);
+  end;
+
+  with linkres do
+    begin
+      Add('SECTIONS');
+      Add('{');
+      Add('     .text :');
+      Add('    {');
+      Add('    _text_start = .;');
+      Add('    KEEP(*(.init .init.*))');
+      if (embedded_controllers[current_settings.controllertype].controllerunitstr='MK20D5')
+         or (embedded_controllers[current_settings.controllertype].controllerunitstr='MK20D7')
+         or (embedded_controllers[current_settings.controllertype].controllerunitstr='MK22F51212')
+         or (embedded_controllers[current_settings.controllertype].controllerunitstr='MK64F12') then
+        begin
+          Add('    . = 0x400;');
+          Add('    KEEP(*(.flash_config *.flash_config.*))');
+        end;
+      Add('    *(.text .text.*)');
+      Add('    *(.strings)');
+      Add('    *(.rodata .rodata.*)');
+      Add('    *(.comment)');
+      Add('    . = ALIGN(4);');
+      Add('    _etext = .;');
+      if embedded_controllers[current_settings.controllertype].flashsize<>0 then
+        begin
+          Add('    } >flash');
+          Add('    .note.gnu.build-id : { *(.note.gnu.build-id) } >flash ');
+        end
+      else
+        begin
+          Add('    } >ram');
+          Add('    .note.gnu.build-id : { *(.note.gnu.build-id) } >ram ');
+        end;
+
+      Add('    .data :');
+      Add('    {');
+      Add('    _data = .;');
+      Add('    *(.data .data.*)');
+      Add('    KEEP (*(.fpc .fpc.n_version .fpc.n_links))');
+      Add('    _edata = .;');
+      if embedded_controllers[current_settings.controllertype].flashsize<>0 then
+        begin
+          Add('    } >ram AT >flash');
+        end
+      else
+        begin
+          Add('    } >ram');
+        end;
+      Add('    .bss :');
+      Add('    {');
+      Add('    _bss_start = .;');
+      Add('    *(.bss .bss.*)');
+      Add('    *(COMMON)');
+      Add('    } >ram');
+      Add('. = ALIGN(4);');
+      Add('_bss_end = . ;');
+      Add('}');
+      Add('_end = .;');
+    end;
+{$endif ARM}
+
+{$ifdef i386}
+  with linkres do
+    begin
+      Add('ENTRY(_START)');
+      Add('SECTIONS');
+      Add('{');
+      Add('     . = 0x100000;');
+      Add('     .text ALIGN (0x1000) :');
+      Add('    {');
+      Add('    _text = .;');
+      Add('    KEEP(*(.init .init.*))');
+      Add('    *(.text .text.*)');
+      Add('    *(.strings)');
+      Add('    *(.rodata .rodata.*)');
+      Add('    *(.comment)');
+      Add('    _etext = .;');
+      Add('    }');
+      Add('    .data ALIGN (0x1000) :');
+      Add('    {');
+      Add('    _data = .;');
+      Add('    *(.data .data.*)');
+      Add('    KEEP (*(.fpc .fpc.n_version .fpc.n_links))');
+      Add('    _edata = .;');
+      Add('    }');
+      Add('    . = ALIGN(4);');
+      Add('    .bss :');
+      Add('    {');
+      Add('    _bss_start = .;');
+      Add('    *(.bss .bss.*)');
+      Add('    *(COMMON)');
+      Add('    }');
+      Add('_bss_end = . ;');
+      Add('}');
+      Add('_end = .;');
+    end;
+{$endif i386}
+
+{$ifdef x86_64}
+  with linkres do
+    begin
+      Add('ENTRY(_START)');
+      Add('SECTIONS');
+      Add('{');
+      Add('     . = 0x100000;');
+      Add('     .text ALIGN (0x1000) :');
+      Add('    {');
+      Add('    _text = .;');
+      Add('    KEEP(*(.init .init.*))');
+      Add('    *(.text .text.*)');
+      Add('    *(.strings)');
+      Add('    *(.rodata .rodata.*)');
+      Add('    *(.comment)');
+      Add('    _etext = .;');
+      Add('    }');
+      Add('    .data ALIGN (0x1000) :');
+      Add('    {');
+      Add('    _data = .;');
+      Add('    *(.data .data.*)');
+      Add('    KEEP (*(.fpc .fpc.n_version .fpc.n_links))');
+      Add('    _edata = .;');
+      Add('    }');
+      Add('    . = ALIGN(4);');
+      Add('    .bss :');
+      Add('    {');
+      Add('    _bss_start = .;');
+      Add('    *(.bss .bss.*)');
+      Add('    *(COMMON)');
+      Add('    }');
+      Add('_bss_end = . ;');
+      Add('}');
+      Add('_end = .;');
+    end;
+{$endif x86_64}
+
+{$ifdef AVR}
+  with linkres do
+    begin
+      { linker script from ld 2.19 }
+      Add('ENTRY(_START)');
+      Add('OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")');
+      case current_settings.cputype of
+       cpu_avr1:
+         Add('OUTPUT_ARCH(avr:1)');
+       cpu_avr2:
+         Add('OUTPUT_ARCH(avr:2)');
+       cpu_avr25:
+         Add('OUTPUT_ARCH(avr:25)');
+       cpu_avr3:
+         Add('OUTPUT_ARCH(avr:3)');
+       cpu_avr31:
+         Add('OUTPUT_ARCH(avr:31)');
+       cpu_avr35:
+         Add('OUTPUT_ARCH(avr:35)');
+       cpu_avr4:
+         Add('OUTPUT_ARCH(avr:4)');
+       cpu_avr5:
+         Add('OUTPUT_ARCH(avr:5)');
+       cpu_avr51:
+         Add('OUTPUT_ARCH(avr:51)');
+       cpu_avr6:
+         Add('OUTPUT_ARCH(avr:6)');
+       cpu_avrxmega3:
+         Add('OUTPUT_ARCH(avr:103)');
+       cpu_avrtiny:
+         Add('OUTPUT_ARCH(avr:100)');
+       else
+         Internalerror(2015072701);
+      end;
+      Add('MEMORY');
+      with embedded_controllers[current_settings.controllertype] do
+        begin
+          Add('{');
+          Add('  text      (rx)   : ORIGIN = 0, LENGTH = 0x'+IntToHex(flashsize,6));
+          Add('  data      (rw!x) : ORIGIN = 0x'+IntToHex($800000+srambase,6)+', LENGTH = 0x'+IntToHex(sramsize,6));
+          Add('  eeprom    (rw!x) : ORIGIN = 0x810000, LENGTH = 0x'+IntToHex(eepromsize,6));
+          Add('  fuse      (rw!x) : ORIGIN = 0x820000, LENGTH = 1K');
+          Add('  lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 1K');
+          Add('  signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K');
+          Add('}');
+          Add('_stack_top = 0x' + IntToHex(srambase+sramsize-1,4) + ';');
+        end;
+      Add('SECTIONS');
+      Add('{');
+      Add('  /* Read-only sections, merged into text segment: */');
+      Add('  .hash          : { *(.hash)		}');
+      Add('  .dynsym        : { *(.dynsym)		}');
+      Add('  .dynstr        : { *(.dynstr)		}');
+      Add('  .gnu.version   : { *(.gnu.version)	}');
+      Add('  .gnu.version_d   : { *(.gnu.version_d)	}');
+      Add('  .gnu.version_r   : { *(.gnu.version_r)	}');
+      Add('  .rel.init      : { *(.rel.init)		}');
+      Add('  .rela.init     : { *(.rela.init)	}');
+      Add('  .rel.text      :');
+      Add('    {');
+      Add('      *(.rel.text)');
+      Add('      *(.rel.text.*)');
+      Add('      *(.rel.gnu.linkonce.t*)');
+      Add('    }');
+      Add('  .rela.text     :');
+      Add('    {');
+      Add('      *(.rela.text)');
+      Add('      *(.rela.text.*)');
+      Add('      *(.rela.gnu.linkonce.t*)');
+      Add('    }');
+      Add('  .rel.fini      : { *(.rel.fini)		}');
+      Add('  .rela.fini     : { *(.rela.fini)	}');
+      Add('  .rel.rodata    :');
+      Add('    {');
+      Add('      *(.rel.rodata)');
+      Add('      *(.rel.rodata.*)');
+      Add('      *(.rel.gnu.linkonce.r*)');
+      Add('    }');
+      Add('  .rela.rodata   :');
+      Add('    {');
+      Add('      *(.rela.rodata)');
+      Add('      *(.rela.rodata.*)');
+      Add('      *(.rela.gnu.linkonce.r*)');
+      Add('    }');
+      Add('  .rel.data      :');
+      Add('    {');
+      Add('      *(.rel.data)');
+      Add('      *(.rel.data.*)');
+      Add('      *(.rel.gnu.linkonce.d*)');
+      Add('    }');
+      Add('  .rela.data     :');
+      Add('    {');
+      Add('      *(.rela.data)');
+      Add('      *(.rela.data.*)');
+      Add('      *(.rela.gnu.linkonce.d*)');
+      Add('    }');
+      Add('  .rel.ctors     : { *(.rel.ctors)	}');
+      Add('  .rela.ctors    : { *(.rela.ctors)	}');
+      Add('  .rel.dtors     : { *(.rel.dtors)	}');
+      Add('  .rela.dtors    : { *(.rela.dtors)	}');
+      Add('  .rel.got       : { *(.rel.got)		}');
+      Add('  .rela.got      : { *(.rela.got)		}');
+      Add('  .rel.bss       : { *(.rel.bss)		}');
+      Add('  .rela.bss      : { *(.rela.bss)		}');
+      Add('  .rel.plt       : { *(.rel.plt)		}');
+      Add('  .rela.plt      : { *(.rela.plt)		}');
+      Add('  /* Internal text space or external memory.  */');
+      Add('  .text   :');
+      Add('  {');
+      Add('    KEEP(*(.init .init.*))');
+      Add('    /* For data that needs to reside in the lower 64k of progmem.  */');
+      Add('    *(.progmem.gcc*)');
+      Add('    *(.progmem*)');
+      Add('    . = ALIGN(2);');
+      Add('     __trampolines_start = . ;');
+      Add('    /* The jump trampolines for the 16-bit limited relocs will reside here.  */');
+      Add('    *(.trampolines)');
+      Add('    *(.trampolines*)');
+      Add('     __trampolines_end = . ;');
+      Add('    /* For future tablejump instruction arrays for 3 byte pc devices.');
+      Add('       We don''t relax jump/call instructions within these sections.  */');
+      Add('    *(.jumptables)');
+      Add('    *(.jumptables*)');
+      Add('    /* For code that needs to reside in the lower 128k progmem.  */');
+      Add('    *(.lowtext)');
+      Add('    *(.lowtext*)');
+      Add('     __ctors_start = . ;');
+      Add('     *(.ctors)');
+      Add('     __ctors_end = . ;');
+      Add('     __dtors_start = . ;');
+      Add('     *(.dtors)');
+      Add('     __dtors_end = . ;');
+      Add('    KEEP(SORT(*)(.ctors))');
+      Add('    KEEP(SORT(*)(.dtors))');
+      Add('    /* From this point on, we don''t bother about wether the insns are');
+      Add('       below or above the 16 bits boundary.  */');
+      Add('    *(.init0)  /* Start here after reset.  */');
+      Add('    KEEP (*(.init0))');
+      Add('    *(.init1)');
+      Add('    KEEP (*(.init1))');
+      Add('    *(.init2)  /* Clear __zero_reg__, set up stack pointer.  */');
+      Add('    KEEP (*(.init2))');
+      Add('    *(.init3)');
+      Add('    KEEP (*(.init3))');
+      Add('    *(.init4)  /* Initialize data and BSS.  */');
+      Add('    KEEP (*(.init4))');
+      Add('    *(.init5)');
+      Add('    KEEP (*(.init5))');
+      Add('    *(.init6)  /* C++ constructors.  */');
+      Add('    KEEP (*(.init6))');
+      Add('    *(.init7)');
+      Add('    KEEP (*(.init7))');
+      Add('    *(.init8)');
+      Add('    KEEP (*(.init8))');
+      Add('    *(.init9)  /* Call main().  */');
+      Add('    KEEP (*(.init9))');
+      Add('    *(.text)');
+      Add('    . = ALIGN(2);');
+      Add('    *(.text.*)');
+      Add('    . = ALIGN(2);');
+      Add('    *(.fini9)  /* _exit() starts here.  */');
+      Add('    KEEP (*(.fini9))');
+      Add('    *(.fini8)');
+      Add('    KEEP (*(.fini8))');
+      Add('    *(.fini7)');
+      Add('    KEEP (*(.fini7))');
+      Add('    *(.fini6)  /* C++ destructors.  */');
+      Add('    KEEP (*(.fini6))');
+      Add('    *(.fini5)');
+      Add('    KEEP (*(.fini5))');
+      Add('    *(.fini4)');
+      Add('    KEEP (*(.fini4))');
+      Add('    *(.fini3)');
+      Add('    KEEP (*(.fini3))');
+      Add('    *(.fini2)');
+      Add('    KEEP (*(.fini2))');
+      Add('    *(.fini1)');
+      Add('    KEEP (*(.fini1))');
+      Add('    *(.fini0)  /* Infinite loop after program termination.  */');
+      Add('    KEEP (*(.fini0))');
+      Add('     _etext = . ;');
+      Add('  }  > text');
+      Add('  .data	  : AT (ADDR (.text) + SIZEOF (.text))');
+      Add('  {');
+      Add('     PROVIDE (__data_start = .) ;');
+      Add('    *(.data)');
+      Add('    *(.data*)');
+      Add('    *(.rodata)  /* We need to include .rodata here if gcc is used */');
+      Add('    *(.rodata*) /* with -fdata-sections.  */');
+      Add('    *(.gnu.linkonce.d*)');
+      Add('    . = ALIGN(2);');
+      Add('     _edata = . ;');
+      Add('     PROVIDE (__data_end = .) ;');
+      Add('  }  > data');
+      Add('  .bss   : AT (ADDR (.bss))');
+      Add('  {');
+      Add('     PROVIDE (__bss_start = .) ;');
+      Add('    *(.bss)');
+      Add('    *(.bss*)');
+      Add('    *(COMMON)');
+      Add('     PROVIDE (__bss_end = .) ;');
+      Add('  }  > data');
+      Add('   __data_load_start = LOADADDR(.data);');
+      Add('   __data_load_end = __data_load_start + SIZEOF(.data);');
+      Add('  /* Global data not cleared after reset.  */');
+      Add('  .noinit  :');
+      Add('  {');
+      Add('     PROVIDE (__noinit_start = .) ;');
+      Add('    *(.noinit*)');
+      Add('     PROVIDE (__noinit_end = .) ;');
+      Add('     _end = . ;');
+      Add('     PROVIDE (__heap_start = .) ;');
+      Add('  }  > data');
+      Add('  .eeprom  :');
+      Add('  {');
+      Add('    *(.eeprom*)');
+      Add('     __eeprom_end = . ;');
+      Add('  }  > eeprom');
+      Add('  .fuse  :');
+      Add('  {');
+      Add('    KEEP(*(.fuse))');
+      Add('    KEEP(*(.lfuse))');
+      Add('    KEEP(*(.hfuse))');
+      Add('    KEEP(*(.efuse))');
+      Add('  }  > fuse');
+      Add('  .lock  :');
+      Add('  {');
+      Add('    KEEP(*(.lock*))');
+      Add('  }  > lock');
+      Add('  .signature  :');
+      Add('  {');
+      Add('    KEEP(*(.signature*))');
+      Add('  }  > signature');
+      Add('  /* Stabs debugging sections.  */');
+      Add('  .stab 0 : { *(.stab) }');
+      Add('  .stabstr 0 : { *(.stabstr) }');
+      Add('  .stab.excl 0 : { *(.stab.excl) }');
+      Add('  .stab.exclstr 0 : { *(.stab.exclstr) }');
+      Add('  .stab.index 0 : { *(.stab.index) }');
+      Add('  .stab.indexstr 0 : { *(.stab.indexstr) }');
+      Add('  .comment 0 : { *(.comment) }');
+      Add('  /* DWARF debug sections.');
+      Add('     Symbols in the DWARF debugging sections are relative to the beginning');
+      Add('     of the section so we begin them at 0.  */');
+      Add('  /* DWARF 1 */');
+      Add('  .debug          0 : { *(.debug) }');
+      Add('  .line           0 : { *(.line) }');
+      Add('  /* GNU DWARF 1 extensions */');
+      Add('  .debug_srcinfo  0 : { *(.debug_srcinfo) }');
+      Add('  .debug_sfnames  0 : { *(.debug_sfnames) }');
+      Add('  /* DWARF 1.1 and DWARF 2 */');
+      Add('  .debug_aranges  0 : { *(.debug_aranges) }');
+      Add('  .debug_pubnames 0 : { *(.debug_pubnames) }');
+      Add('  /* DWARF 2 */');
+      Add('  .debug_info     0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }');
+      Add('  .debug_abbrev   0 : { *(.debug_abbrev) }');
+      Add('  .debug_line     0 : { *(.debug_line) }');
+      Add('  .debug_frame    0 : { *(.debug_frame) }');
+      Add('  .debug_str      0 : { *(.debug_str) }');
+      Add('  .debug_loc      0 : { *(.debug_loc) }');
+      Add('  .debug_macinfo  0 : { *(.debug_macinfo) }');
+      Add('}');
+    end;
+{$endif AVR}
+
+{$ifdef MIPSEL}
+  case current_settings.controllertype of
+      ct_none:
+           begin
+           end;
+      ct_pic32mx110f016b,
+      ct_pic32mx110f016c,
+      ct_pic32mx110f016d,
+      ct_pic32mx120f032b,
+      ct_pic32mx120f032c,
+      ct_pic32mx120f032d,
+      ct_pic32mx130f064b,
+      ct_pic32mx130f064c,
+      ct_pic32mx130f064d,
+      ct_pic32mx150f128b,
+      ct_pic32mx150f128c,
+      ct_pic32mx150f128d,
+      ct_pic32mx210f016b,
+      ct_pic32mx210f016c,
+      ct_pic32mx210f016d,
+      ct_pic32mx220f032b,
+      ct_pic32mx220f032c,
+      ct_pic32mx220f032d,
+      ct_pic32mx230f064b,
+      ct_pic32mx230f064c,
+      ct_pic32mx230f064d,
+      ct_pic32mx250f128b,
+      ct_pic32mx250f128c,
+      ct_pic32mx250f128d,
+      ct_pic32mx775f256h,
+      ct_pic32mx775f256l,
+      ct_pic32mx775f512h,
+      ct_pic32mx775f512l,
+      ct_pic32mx795f512h,
+      ct_pic32mx795f512l:
+        begin
+         with embedded_controllers[current_settings.controllertype] do
+          with linkres do
+            begin
+              Add('OUTPUT_FORMAT("elf32-tradlittlemips")');
+              Add('OUTPUT_ARCH(pic32mx)');
+              Add('ENTRY(_reset)');
+              Add('PROVIDE(_vector_spacing = 0x00000001);');
+              Add('_ebase_address = 0x'+IntToHex(flashbase,8)+';');
+              Add('_RESET_ADDR              = 0xBFC00000;');
+              Add('_BEV_EXCPT_ADDR          = 0xBFC00380;');
+              Add('_DBG_EXCPT_ADDR          = 0xBFC00480;');
+              Add('_GEN_EXCPT_ADDR          = _ebase_address + 0x180;');
+              Add('MEMORY');
+              Add('{');
+              if flashsize<>0 then
+                begin
+                  Add('  kseg0_program_mem          : ORIGIN = 0x'+IntToHex(flashbase,8)+', LENGTH = 0x'+IntToHex(flashsize,8));
+                  //TODO This should better be placed into the controllertype records
+                  Add('  kseg1_boot_mem             : ORIGIN = 0xBFC00000, LENGTH = 0xbef');
+                  Add('  config3                    : ORIGIN = 0xBFC00BF0, LENGTH = 0x4');
+                  Add('  config2                    : ORIGIN = 0xBFC00BF4, LENGTH = 0x4');
+                  Add('  config1                    : ORIGIN = 0xBFC00BF8, LENGTH = 0x4');
+                  Add('  config0                    : ORIGIN = 0xBFC00BFC, LENGTH = 0x4');
+                end;
+
+              Add('  ram                        : ORIGIN = 0x' + IntToHex(srambase,8)
+              	+ ', LENGTH = 0x' + IntToHex(sramsize,8));
+
+              Add('}');
+              Add('_stack_top = 0x' + IntToHex(sramsize+srambase,8) + ';');
+            end;
+        end
+  end;
+
+  with linkres do
+    begin
+      Add('SECTIONS');
+      Add('{');
+      Add('    .reset _RESET_ADDR :');
+      Add('    {');
+      Add('      KEEP(*(.reset .reset.*))');
+      Add('      KEEP(*(.startup .startup.*))');
+      Add('    } > kseg1_boot_mem');
+      Add('    .bev_excpt _BEV_EXCPT_ADDR :');
+      Add('    {');
+      Add('      KEEP(*(.bev_handler))');
+      Add('    } > kseg1_boot_mem');
+
+      Add('    .text :');
+      Add('    {');
+      Add('    _text_start = .;');
+      Add('    . = _text_start + 0x180;');
+      Add('    KEEP(*(.gen_handler))');
+      Add('    . = _text_start + 0x200;');
+      Add('    KEEP(*(.init .init.*))');
+      Add('    *(.text .text.*)');
+      Add('    *(.strings)');
+      Add('    *(.rodata .rodata.*)');
+      Add('    *(.comment)');
+      Add('    _etext = .;');
+      if embedded_controllers[current_settings.controllertype].flashsize<>0 then
+        begin
+          Add('    } >kseg0_program_mem');
+        end
+      else
+        begin
+          Add('    } >ram');
+        end;
+      Add('    .note.gnu.build-id : { *(.note.gnu.build-id) }');
+
+      Add('    .data :');
+      Add('    {');
+      Add('    _data = .;');
+      Add('    *(.data .data.*)');
+      Add('    KEEP (*(.fpc .fpc.n_version .fpc.n_links))');
+      Add('    . = .;');
+      Add('    _gp = ALIGN(16) + 0x7ff0;');
+      Add('    _edata = .;');
+      if embedded_controllers[current_settings.controllertype].flashsize<>0 then
+        begin
+          Add('    } >ram AT >kseg0_program_mem');
+        end
+      else
+        begin
+          Add('    } >ram');
+        end;
+      Add('  .config_BFC00BF0 : {');
+      Add('    KEEP(*(.config_BFC00BF0))');
+      Add('  } > config3');
+      Add('  .config_BFC00BF4 : {');
+      Add('    KEEP(*(.config_BFC00BF4))');
+      Add('  } > config2');
+      Add('  .config_BFC00BF8 : {');
+      Add('    KEEP(*(.config_BFC00BF8))');
+      Add('  } > config1');
+      Add('  .config_BFC00BFC : {');
+      Add('    KEEP(*(.config_BFC00BFC))');
+      Add('  } > config0');
+      Add('    .bss :');
+      Add('    {');
+      Add('    _bss_start = .;');
+      Add('    *(.bss .bss.*)');
+      Add('    *(COMMON)');
+      Add('    } >ram');
+      Add('. = ALIGN(4);');
+      Add('_bss_end = . ;');
+      Add('  .comment       0 : { *(.comment) }');
+      Add('  /* DWARF debug sections.');
+      Add('     Symbols in the DWARF debugging sections are relative to the beginning');
+      Add('     of the section so we begin them at 0.  */');
+      Add('  /* DWARF 1 */');
+      Add('  .debug          0 : { *(.debug) }');
+      Add('  .line           0 : { *(.line) }');
+      Add('  /* GNU DWARF 1 extensions */');
+      Add('  .debug_srcinfo  0 : { *(.debug_srcinfo) }');
+      Add('  .debug_sfnames  0 : { *(.debug_sfnames) }');
+      Add('  /* DWARF 1.1 and DWARF 2 */');
+      Add('  .debug_aranges  0 : { *(.debug_aranges) }');
+      Add('  .debug_pubnames 0 : { *(.debug_pubnames) }');
+      Add('  /* DWARF 2 */');
+      Add('  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }');
+      Add('  .debug_abbrev   0 : { *(.debug_abbrev) }');
+      Add('  /DISCARD/         : { *(.debug_line) }');
+      Add('  .debug_frame    0 : { *(.debug_frame) }');
+      Add('  .debug_str      0 : { *(.debug_str) }');
+      Add('  /DISCARD/         : { *(.debug_loc) }');
+      Add('  .debug_macinfo  0 : { *(.debug_macinfo) }');
+      Add('  /* SGI/MIPS DWARF 2 extensions */');
+      Add('  .debug_weaknames 0 : { *(.debug_weaknames) }');
+      Add('  .debug_funcnames 0 : { *(.debug_funcnames) }');
+      Add('  .debug_typenames 0 : { *(.debug_typenames) }');
+      Add('  .debug_varnames  0 : { *(.debug_varnames) }');
+      Add('  /* DWARF 3 */');
+      Add('  .debug_pubtypes 0 : { *(.debug_pubtypes) }');
+      Add('  .debug_ranges   0 : { *(.debug_ranges) }');
+      Add('  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }');
+      Add('  .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }');
+      Add('  .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }');
+      Add('  .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) }');
+      Add('  .mdebug.abiN32 : { KEEP(*(.mdebug.abiN32)) }');
+      Add('  .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) }');
+      Add('  .mdebug.abiO64 : { KEEP(*(.mdebug.abiO64)) }');
+      Add('  .mdebug.eabi32 : { KEEP(*(.mdebug.eabi32)) }');
+      Add('  .mdebug.eabi64 : { KEEP(*(.mdebug.eabi64)) }');
+      Add('  /DISCARD/ : { *(.rel.dyn) }');
+      Add('  /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }');
+      Add('}');
+      Add('_end = .;');
+    end;
+{$endif MIPSEL}
+
+{$ifdef RISCV32}
+  with linkres do
+    begin
+      Add('OUTPUT_ARCH("riscv")');
+      Add('ENTRY(_START)');
+      Add('MEMORY');
+      with embedded_controllers[current_settings.controllertype] do
+        begin
+          Add('{');
+          Add('  flash      (rx)   : ORIGIN = 0x'+IntToHex(flashbase,6)+', LENGTH = 0x'+IntToHex(flashsize,6));
+          Add('  ram        (rw!x) : ORIGIN = 0x'+IntToHex(srambase,6)+', LENGTH = 0x'+IntToHex(sramsize,6));
+          Add('}');
+          Add('_stack_top = 0x' + IntToHex(srambase+sramsize-1,4) + ';');
+        end;
+      Add('SECTIONS');
+      Add('{');
+      Add('  .text :');
+      Add('  {');
+      Add('    _text_start = .;');
+      Add('    KEEP(*(.init .init.*))');
+      Add('    *(.text .text.*)');
+      Add('    *(.strings)');
+      Add('    *(.rodata .rodata.*)');
+      Add('    *(.comment)');
+      Add('    . = ALIGN(4);');
+      Add('    _etext = .;');
+      if embedded_controllers[current_settings.controllertype].flashsize<>0 then
+        begin
+          Add('  } >flash');
+          //Add('    .note.gnu.build-id : { *(.note.gnu.build-id) } >flash ');
+        end
+      else
+        begin
+          Add('  } >ram');
+          //Add('    .note.gnu.build-id : { *(.note.gnu.build-id) } >ram ');
+        end;
+
+      Add('  .data :');
+      Add('  {');
+      Add('    _data = .;');
+      Add('    *(.data .data.*)');
+      Add('    KEEP (*(.fpc .fpc.n_version .fpc.n_links))');
+      Add('    _edata = .;');
+      if embedded_controllers[current_settings.controllertype].flashsize<>0 then
+        begin
+          Add('  } >ram AT >flash');
+        end
+      else
+        begin
+          Add('  } >ram');
+        end;
+      Add('  .bss :');
+      Add('  {');
+      Add('    _bss_start = .;');
+      Add('    *(.bss .bss.*)');
+      Add('    *(COMMON)');
+      Add('  } >ram');
+      Add('  . = ALIGN(4);');
+      Add('  _bss_end = . ;');
+      Add('  /* Stabs debugging sections.  */');
+      Add('  .stab          0 : { *(.stab) }');
+      Add('  .stabstr       0 : { *(.stabstr) }');
+      Add('  .stab.excl     0 : { *(.stab.excl) }');
+      Add('  .stab.exclstr  0 : { *(.stab.exclstr) }');
+      Add('  .stab.index    0 : { *(.stab.index) }');
+      Add('  .stab.indexstr 0 : { *(.stab.indexstr) }');
+      Add('  .comment       0 : { *(.comment) }');
+      Add('  /* DWARF debug sections.');
+      Add('     Symbols in the DWARF debugging sections are relative to the beginning');
+      Add('     of the section so we begin them at 0.  */');
+      Add('  /* DWARF 1 */');
+      Add('  .debug          0 : { *(.debug) }');
+      Add('  .line           0 : { *(.line) }');
+      Add('  /* GNU DWARF 1 extensions */');
+      Add('  .debug_srcinfo  0 : { *(.debug_srcinfo) }');
+      Add('  .debug_sfnames  0 : { *(.debug_sfnames) }');
+      Add('  /* DWARF 1.1 and DWARF 2 */');
+      Add('  .debug_aranges  0 : { *(.debug_aranges) }');
+      Add('  .debug_pubnames 0 : { *(.debug_pubnames) }');
+      Add('  /* DWARF 2 */');
+      Add('  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }');
+      Add('  .debug_abbrev   0 : { *(.debug_abbrev) }');
+      Add('  .debug_line     0 : { *(.debug_line) }');
+      Add('  .debug_frame    0 : { *(.debug_frame) }');
+      Add('  .debug_str      0 : { *(.debug_str) }');
+      Add('  .debug_loc      0 : { *(.debug_loc) }');
+      Add('  .debug_macinfo  0 : { *(.debug_macinfo) }');
+      Add('  /* SGI/MIPS DWARF 2 extensions */');
+      Add('  .debug_weaknames 0 : { *(.debug_weaknames) }');
+      Add('  .debug_funcnames 0 : { *(.debug_funcnames) }');
+      Add('  .debug_typenames 0 : { *(.debug_typenames) }');
+      Add('  .debug_varnames  0 : { *(.debug_varnames) }');
+      Add('  /* DWARF 3 */');
+      Add('  .debug_pubtypes 0 : { *(.debug_pubtypes) }');
+      Add('  .debug_ranges   0 : { *(.debug_ranges) }');
+
+      Add('}');
+      Add('_end = .;');
+
+    end;
+  {$endif RISCV32}
+
+  {$ifdef XTENSA}
+  with linkres do
+    begin
+      Add('/* Script for -z combreloc: combine and sort reloc sections */');
+      Add('/* Copyright (C) 2014-2018 Free Software Foundation, Inc.');
+      Add('   Copying and distribution of this script, with or without modification,');
+      Add('   are permitted in any medium without royalty provided the copyright');
+      Add('   notice and this notice are preserved.  */');
+      Add('ENTRY(_start)');
+      Add('SEARCH_DIR("=/builds/idf/crosstool-NG/builds/xtensa-esp32-elf/xtensa-esp32-elf/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");');
+      Add('SECTIONS');
+      Add('{');
+      Add('  /* Read-only sections, merged into text segment: */');
+      Add('  PROVIDE (__executable_start = 0x400000); . = 0x400000 + SIZEOF_HEADERS;');
+      Add('  .interp         : { *(.interp) }');
+      Add('  .note.gnu.build-id : { *(.note.gnu.build-id) }');
+      Add('  .hash           : { *(.hash) }');
+      Add('  .gnu.hash       : { *(.gnu.hash) }');
+      Add('  .dynsym         : { *(.dynsym) }');
+      Add('  .dynstr         : { *(.dynstr) }');
+      Add('  .gnu.version    : { *(.gnu.version) }');
+      Add('  .gnu.version_d  : { *(.gnu.version_d) }');
+      Add('  .gnu.version_r  : { *(.gnu.version_r) }');
+      Add('  .rela.dyn       :');
+      Add('    {');
+      Add('      *(.rela.init)');
+      Add('      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)');
+      Add('      *(.rela.fini)');
+      Add('      *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)');
+      Add('      *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)');
+      Add('      *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)');
+      Add('      *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)');
+      Add('      *(.rela.ctors)');
+      Add('      *(.rela.dtors)');
+      Add('      *(.rela.got)');
+      Add('      *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)');
+      Add('    }');
+      Add('  .rela.plt       : { *(.rela.plt) }');
+      Add('  /* .plt* sections are embedded in .text */');
+      Add('  .text           :');
+      Add('  {');
+      Add('    *(.got.plt* .plt*)');
+      Add('    KEEP (*(.init.literal))');
+      Add('    KEEP (*(SORT_NONE(.init)))');
+      Add('    *(.literal .text .stub .literal.* .text.* .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)');
+      Add('    /* .gnu.warning sections are handled specially by elf32.em.  */');
+      Add('    *(.gnu.warning)');
+      Add('    KEEP (*(.fini.literal))');
+      Add('    KEEP (*(SORT_NONE(.fini)))');
+      Add('  } =0');
+      Add('  PROVIDE (__etext = .);');
+      Add('  PROVIDE (_etext = .);');
+      Add('  PROVIDE (etext = .);');
+      Add('  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }');
+      Add('  .rodata1        : { *(.rodata1) }');
+      Add('  .got.loc        : { *(.got.loc) }');
+      Add('  .xt_except_table   : ONLY_IF_RO { KEEP (*(.xt_except_table .xt_except_table.* .gnu.linkonce.e.*)) }');
+      Add('  .eh_frame_hdr : { *(.eh_frame_hdr) }');
+      Add('  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }');
+      Add('  .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }');
+      Add('  /* Adjust the address for the data segment.  We want to adjust up to');
+      Add('     the same address within the page on the next page up.  */');
+      Add('  . = ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1));');
+      Add('  /* Exception handling  */');
+      Add('  .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }');
+      Add('  .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }');
+      Add('  /* Thread Local Storage sections  */');
+      Add('  .tdata	  : { *(.tdata .tdata.* .gnu.linkonce.td.*) }');
+      Add('  .tbss		  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }');
+      Add('  .preinit_array     :');
+      Add('  {');
+      Add('    PROVIDE_HIDDEN (__preinit_array_start = .);');
+      Add('    KEEP (*(.preinit_array))');
+      Add('    PROVIDE_HIDDEN (__preinit_array_end = .);');
+      Add('  }');
+      Add('  .init_array     :');
+      Add('  {');
+      Add('     PROVIDE_HIDDEN (__init_array_start = .);');
+      Add('     KEEP (*(SORT(.init_array.*)))');
+      Add('     KEEP (*(.init_array))');
+      Add('     PROVIDE_HIDDEN (__init_array_end = .);');
+      Add('  }');
+      Add('  .fini_array     :');
+      Add('  {');
+      Add('    PROVIDE_HIDDEN (__fini_array_start = .);');
+      Add('    KEEP (*(SORT(.fini_array.*)))');
+      Add('    KEEP (*(.fini_array))');
+      Add('    PROVIDE_HIDDEN (__fini_array_end = .);');
+      Add('  }');
+      Add('  .ctors          :');
+      Add('  {');
+      Add('    /* gcc uses crtbegin.o to find the start of');
+      Add('       the constructors, so we make sure it is');
+      Add('       first.  Because this is a wildcard, it');
+      Add('       doesn''t matter if the user does not');
+      Add('       actually link against crtbegin.o; the');
+      Add('       linker won''t look for a file to match a');
+      Add('       wildcard.  The wildcard also means that it');
+      Add('       doesn''t matter which directory crtbegin.o');
+      Add('       is in.  */');
+      Add('    KEEP (*crtbegin.o(.ctors))');
+      Add('    KEEP (*crtbegin?.o(.ctors))');
+      Add('    /* We don''t want to include the .ctor section from');
+      Add('       the crtend.o file until after the sorted ctors.');
+      Add('       The .ctor section from the crtend file contains the');
+      Add('       end of ctors marker and it must be last */');
+      Add('    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))');
+      Add('    KEEP (*(SORT(.ctors.*)))');
+      Add('    KEEP (*(.ctors))');
+      Add('  }');
+      Add('  .dtors          :');
+      Add('  {');
+      Add('    KEEP (*crtbegin.o(.dtors))');
+      Add('    KEEP (*crtbegin?.o(.dtors))');
+      Add('    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))');
+      Add('    KEEP (*(SORT(.dtors.*)))');
+      Add('    KEEP (*(.dtors))');
+      Add('  }');
+      Add('  .jcr            : { KEEP (*(.jcr)) }');
+      Add('  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }');
+      Add('  .xt_except_table   : ONLY_IF_RW { KEEP (*(.xt_except_table .xt_except_table.* .gnu.linkonce.e.*)) }');
+      Add('  .dynamic        : { *(.dynamic) }');
+      Add('  .got            : { *(.got) }');
+      Add('  .data           :');
+      Add('  {');
+      Add('    *(.data .data.* .gnu.linkonce.d.*)');
+      Add('    SORT(CONSTRUCTORS)');
+      Add('    KEEP (*(.fpc .fpc.n_version .fpc.n_links))');
+      Add('  }');
+      Add('  .data1          : { *(.data1) }');
+      Add('  .xt_except_desc   :');
+      Add('  {');
+      Add('    *(.xt_except_desc .xt_except_desc.* .gnu.linkonce.h.*)');
+      Add('    *(.xt_except_desc_end)');
+      Add('  }');
+      Add('  .lit4           :');
+      Add('  {');
+      Add('    PROVIDE (_lit4_start = .);');
+      Add('    *(.lit4 .lit4.* .gnu.linkonce.lit4.*)');
+      Add('    PROVIDE (_lit4_end = .);');
+      Add('  }');
+      Add('  _edata = .; PROVIDE (edata = .);');
+      Add('  __bss_start = .;');
+      Add('  .bss            :');
+      Add('  {');
+      Add('   *(.dynbss)');
+      Add('   *(.bss .bss.* .gnu.linkonce.b.*)');
+      Add('   *(COMMON)');
+      Add('   /* Align here to ensure that the .bss section occupies space up to');
+      Add('      _end.  Align after .bss to ensure correct alignment even if the');
+      Add('      .bss section disappears because there are no input sections.');
+      Add('      FIXME: Why do we need it? When there is no .bss section, we don''t');
+      Add('      pad the .data section.  */');
+      Add('   . = ALIGN(. != 0 ? 32 / 8 : 1);');
+      Add('  }');
+      Add('  . = ALIGN(32 / 8);');
+      Add('  . = ALIGN(32 / 8);');
+      Add('  _end = .; PROVIDE (end = .);');
+      Add('  /* Stabs debugging sections.  */');
+      Add('  .stab          0 : { *(.stab) }');
+      Add('  .stabstr       0 : { *(.stabstr) }');
+      Add('  .stab.excl     0 : { *(.stab.excl) }');
+      Add('  .stab.exclstr  0 : { *(.stab.exclstr) }');
+      Add('  .stab.index    0 : { *(.stab.index) }');
+      Add('  .stab.indexstr 0 : { *(.stab.indexstr) }');
+      Add('  .comment       0 : { *(.comment) }');
+      Add('  /* DWARF debug sections.');
+      Add('     Symbols in the DWARF debugging sections are relative to the beginning');
+      Add('     of the section so we begin them at 0.  */');
+      Add('  /* DWARF 1 */');
+      Add('  .debug          0 : { *(.debug) }');
+      Add('  .line           0 : { *(.line) }');
+      Add('  /* GNU DWARF 1 extensions */');
+      Add('  .debug_srcinfo  0 : { *(.debug_srcinfo) }');
+      Add('  .debug_sfnames  0 : { *(.debug_sfnames) }');
+      Add('  /* DWARF 1.1 and DWARF 2 */');
+      Add('  .debug_aranges  0 : { *(.debug_aranges) }');
+      Add('  .debug_pubnames 0 : { *(.debug_pubnames) }');
+      Add('  /* DWARF 2 */');
+      Add('  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }');
+      Add('  .debug_abbrev   0 : { *(.debug_abbrev) }');
+      Add('  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }');
+      Add('  .debug_frame    0 : { *(.debug_frame) }');
+      Add('  .debug_str      0 : { *(.debug_str) }');
+      Add('  .debug_loc      0 : { *(.debug_loc) }');
+      Add('  .debug_macinfo  0 : { *(.debug_macinfo) }');
+      Add('  /* SGI/MIPS DWARF 2 extensions */');
+      Add('  .debug_weaknames 0 : { *(.debug_weaknames) }');
+      Add('  .debug_funcnames 0 : { *(.debug_funcnames) }');
+      Add('  .debug_typenames 0 : { *(.debug_typenames) }');
+      Add('  .debug_varnames  0 : { *(.debug_varnames) }');
+      Add('  /* DWARF 3 */');
+      Add('  .debug_pubtypes 0 : { *(.debug_pubtypes) }');
+      Add('  .debug_ranges   0 : { *(.debug_ranges) }');
+      Add('  /* DWARF Extension.  */');
+      Add('  .debug_macro    0 : { *(.debug_macro) }');
+      Add('  .debug_addr     0 : { *(.debug_addr) }');
+      Add('  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }');
+      Add('  .xt.lit       0 : { KEEP (*(.xt.lit .xt.lit.* .gnu.linkonce.p.*)) }');
+      Add('  .xt.insn      0 : { KEEP (*(.xt.insn .gnu.linkonce.x.*)) }');
+      Add('  .xt.prop      0 : { KEEP (*(.xt.prop .xt.prop.* .gnu.linkonce.prop.*)) }');
+      Add('  /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink)  *(.gnu.lto_*) }');
+      Add('}');
+    end;
+{$endif XTENSA}
+
+  { Write and Close response }
+  linkres.writetodisk;
+  linkres.free;
+
+  WriteResponseFile:=True;
+
+end;
+
+
+function TlinkerFreeRTOS.MakeExecutable:boolean;
+var
+  binstr,
+  cmdstr,
+  mapstr: TCmdStr;
+  success : boolean;
+  StaticStr,
+  GCSectionsStr,
+  DynLinkStr,
+  StripStr,
+  FixedExeFileName: string;
+begin
+  { for future use }
+  StaticStr:='';
+  StripStr:='';
+  mapstr:='';
+  DynLinkStr:='';
+  FixedExeFileName:=maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.elf')));
+
+  GCSectionsStr:='--gc-sections';
+  //if not(cs_link_extern in current_settings.globalswitches) then
+  if not(cs_link_nolink in current_settings.globalswitches) then
+   Message1(exec_i_linking,current_module.exefilename);
+
+  if (cs_link_map in current_settings.globalswitches) then
+   mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
+
+{ Write used files and libraries }
+  WriteResponseFile();
+
+{ Call linker }
+  SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
+  Replace(cmdstr,'$OPT',Info.ExtraOptions);
+  if not(cs_link_on_target in current_settings.globalswitches) then
+   begin
+    Replace(cmdstr,'$EXE',FixedExeFileName);
+    Replace(cmdstr,'$RES',(maybequoted(ScriptFixFileName(outputexedir+Info.ResName))));
+    Replace(cmdstr,'$STATIC',StaticStr);
+    Replace(cmdstr,'$STRIP',StripStr);
+    Replace(cmdstr,'$MAP',mapstr);
+    Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
+    Replace(cmdstr,'$DYNLINK',DynLinkStr);
+   end
+  else
+   begin
+    Replace(cmdstr,'$EXE',FixedExeFileName);
+    Replace(cmdstr,'$RES',maybequoted(ScriptFixFileName(outputexedir+Info.ResName)));
+    Replace(cmdstr,'$STATIC',StaticStr);
+    Replace(cmdstr,'$STRIP',StripStr);
+    Replace(cmdstr,'$MAP',mapstr);
+    Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
+    Replace(cmdstr,'$DYNLINK',DynLinkStr);
+   end;
+  success:=DoExec(FindUtil(utilsprefix+BinStr),cmdstr,true,false);
+
+{ Remove ReponseFile }
+  if success and not(cs_link_nolink in current_settings.globalswitches) then
+   DeleteFile(outputexedir+Info.ResName);
+
+{ Post process }
+  if success and not(cs_link_nolink in current_settings.globalswitches) then
+    success:=PostProcessExecutable(FixedExeFileName,false);
+
+  if success and (target_info.system in [system_arm_embedded,system_avr_embedded,system_mipsel_embedded,system_xtensa_embedded]) then
+    begin
+      success:=DoExec(FindUtil(utilsprefix+'objcopy'),'-O ihex '+
+        FixedExeFileName+' '+
+        maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.hex'))),true,false);
+      if success then
+        success:=DoExec(FindUtil(utilsprefix+'objcopy'),'-O binary '+
+          FixedExeFileName+' '+
+          maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.bin'))),true,false);
+    end;
+
+  MakeExecutable:=success;   { otherwise a recursive call to link method }
+end;
+
+
+function TlinkerFreeRTOS.postprocessexecutable(const fn : string;isdll:boolean):boolean;
+  type
+    TElf32header=packed record
+      magic0123         : longint;
+      file_class        : byte;
+      data_encoding     : byte;
+      file_version      : byte;
+      padding           : array[$07..$0f] of byte;
+
+      e_type            : word;
+      e_machine         : word;
+      e_version         : longint;
+      e_entry           : longint;          { entrypoint }
+      e_phoff           : longint;          { program header offset }
+
+      e_shoff           : longint;          { sections header offset }
+      e_flags           : longint;
+      e_ehsize          : word;             { elf header size in bytes }
+      e_phentsize       : word;             { size of an entry in the program header array }
+      e_phnum           : word;             { 0..e_phnum-1 of entrys }
+      e_shentsize       : word;             { size of an entry in sections header array }
+      e_shnum           : word;             { 0..e_shnum-1 of entrys }
+      e_shstrndx        : word;             { index of string section header }
+    end;
+    TElf32sechdr=packed record
+      sh_name           : longint;
+      sh_type           : longint;
+      sh_flags          : longint;
+      sh_addr           : longint;
+
+      sh_offset         : longint;
+      sh_size           : longint;
+      sh_link           : longint;
+      sh_info           : longint;
+
+      sh_addralign      : longint;
+      sh_entsize        : longint;
+    end;
+
+  function MayBeSwapHeader(h : telf32header) : telf32header;
+    begin
+      result:=h;
+      if source_info.endian<>target_info.endian then
+        with h do
+          begin
+            result.e_type:=swapendian(e_type);
+            result.e_machine:=swapendian(e_machine);
+            result.e_version:=swapendian(e_version);
+            result.e_entry:=swapendian(e_entry);
+            result.e_phoff:=swapendian(e_phoff);
+            result.e_shoff:=swapendian(e_shoff);
+            result.e_flags:=swapendian(e_flags);
+            result.e_ehsize:=swapendian(e_ehsize);
+            result.e_phentsize:=swapendian(e_phentsize);
+            result.e_phnum:=swapendian(e_phnum);
+            result.e_shentsize:=swapendian(e_shentsize);
+            result.e_shnum:=swapendian(e_shnum);
+            result.e_shstrndx:=swapendian(e_shstrndx);
+          end;
+    end;
+
+  function MaybeSwapSecHeader(h : telf32sechdr) : telf32sechdr;
+    begin
+      result:=h;
+      if source_info.endian<>target_info.endian then
+        with h do
+          begin
+            result.sh_name:=swapendian(sh_name);
+            result.sh_type:=swapendian(sh_type);
+            result.sh_flags:=swapendian(sh_flags);
+            result.sh_addr:=swapendian(sh_addr);
+            result.sh_offset:=swapendian(sh_offset);
+            result.sh_size:=swapendian(sh_size);
+            result.sh_link:=swapendian(sh_link);
+            result.sh_info:=swapendian(sh_info);
+            result.sh_addralign:=swapendian(sh_addralign);
+            result.sh_entsize:=swapendian(sh_entsize);
+          end;
+    end;
+
+  var
+    f : file;
+
+  function ReadSectionName(pos : longint) : String;
+    var
+      oldpos : longint;
+      c : char;
+    begin
+      oldpos:=filepos(f);
+      seek(f,pos);
+      Result:='';
+      while true do
+        begin
+          blockread(f,c,1);
+          if c=#0 then
+            break;
+          Result:=Result+c;
+        end;
+      seek(f,oldpos);
+    end;
+
+  var
+    elfheader : TElf32header;
+    secheader : TElf32sechdr;
+    i : longint;
+    stringoffset : longint;
+    secname : string;
+  begin
+    postprocessexecutable:=false;
+    { open file }
+    assign(f,fn);
+    {$push}{$I-}
+    reset(f,1);
+    if ioresult<>0 then
+      Message1(execinfo_f_cant_open_executable,fn);
+    { read header }
+    blockread(f,elfheader,sizeof(tElf32header));
+    elfheader:=MayBeSwapHeader(elfheader);
+    seek(f,elfheader.e_shoff);
+    { read string section header }
+    seek(f,elfheader.e_shoff+sizeof(TElf32sechdr)*elfheader.e_shstrndx);
+    blockread(f,secheader,sizeof(secheader));
+    secheader:=MaybeSwapSecHeader(secheader);
+    stringoffset:=secheader.sh_offset;
+
+    seek(f,elfheader.e_shoff);
+    status.datasize:=0;
+    for i:=0 to elfheader.e_shnum-1 do
+      begin
+        blockread(f,secheader,sizeof(secheader));
+        secheader:=MaybeSwapSecHeader(secheader);
+        secname:=ReadSectionName(stringoffset+secheader.sh_name);
+        if secname='.text' then
+          begin
+            Message1(execinfo_x_codesize,tostr(secheader.sh_size));
+            status.codesize:=secheader.sh_size;
+          end
+        else if secname='.data' then
+          begin
+            Message1(execinfo_x_initdatasize,tostr(secheader.sh_size));
+            inc(status.datasize,secheader.sh_size);
+          end
+        else if secname='.bss' then
+          begin
+            Message1(execinfo_x_uninitdatasize,tostr(secheader.sh_size));
+            inc(status.datasize,secheader.sh_size);
+          end;
+
+      end;
+    close(f);
+    {$pop}
+    if ioresult<>0 then
+      ;
+    postprocessexecutable:=true;
+  end;
+
+
+{*****************************************************************************
+                                     Initialize
+*****************************************************************************}
+
+initialization
+{$ifdef arm}
+  RegisterLinker(ld_freertos,TLinkerEmbedded);
+  RegisterTarget(system_arm_embedded_info);
+{$endif arm}
+
+{$ifdef avr}
+  RegisterLinker(ld_freertos,TLinkerEmbedded);
+  RegisterTarget(system_avr_embedded_info);
+{$endif avr}
+
+{$ifdef i386}
+  RegisterLinker(ld_freertos,TLinkerEmbedded);
+  RegisterTarget(system_i386_embedded_info);
+{$endif i386}
+
+{$ifdef x86_64}
+  RegisterLinker(ld_freertos,TLinkerEmbedded);
+  RegisterTarget(system_x86_64_embedded_info);
+{$endif x86_64}
+
+{$ifdef i8086}
+  { no need to register linker ld_embedded, because i8086_embedded uses the
+    regular msdos linker. In case a flat binary, relocated for a specific
+    segment address is needed (e.g. for a BIOS or a real mode bootloader), it
+    can be produced post-compilation with exe2bin or a similar tool. }
+  RegisterTarget(system_i8086_embedded_info);
+{$endif i8086}
+
+{$ifdef mipsel}
+  RegisterLinker(ld_freertos,TLinkerEmbedded);
+  RegisterTarget(system_mipsel_embedded_info);
+{$endif mipsel}
+
+{$ifdef m68k}
+  RegisterLinker(ld_freertos,TLinkerEmbedded);
+  RegisterTarget(system_m68k_embedded_info);
+{$endif m68k}
+
+{$ifdef riscv32}
+  RegisterLinker(ld_freertos,TLinkerEmbedded);
+  RegisterTarget(system_riscv32_embedded_info);
+{$endif riscv32}
+
+{$ifdef riscv64}
+  RegisterLinker(ld_freertos,TLinkerEmbedded);
+  RegisterTarget(system_riscv64_embedded_info);
+{$endif riscv64}
+
+{$ifdef xtensa}
+  RegisterLinker(ld_freertos,TlinkerFreeRTOS);
+  RegisterTarget(system_xtensa_freertos_info);
+{$endif xtensa}
+end.

+ 1 - 1
compiler/utils/fpc.pp

@@ -94,7 +94,7 @@ program fpc;
          ppcbin:=extrapath+ppcbin;
          findexe:=true;
        end
-      else if FileExists(path+ppcbin) then
+      else if (path<>'') and FileExists(path+ppcbin) then
        begin
          ppcbin:=path+ppcbin;
          findexe:=true;

+ 2 - 1
compiler/utils/ppuutils/ppudump.pp

@@ -222,7 +222,8 @@ const
   { 101 } 'Android-x86-64',
   { 102 } 'Haiku-x86-64',
   { 103 } 'Embedded-Xtensa',
-  { 104 } 'Embedded-Z80'
+  { 104 } 'FreeRTos-Xtensa',
+  { 105 } 'Embedded-Z80'
   );
 
 const

+ 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

+ 5 - 1
compiler/xtensa/cgcpu.pas

@@ -754,7 +754,7 @@ implementation
             reg2:=tmpreg;
           end;
 
-        instr:=taicpu.op_reg_reg_sym(A_Bcc,reg1,reg2,l);
+        instr:=taicpu.op_reg_reg_sym(A_Bcc,reg2,reg1,l);
         instr.condition:=TOpCmp2AsmCond[cmp_op];
         list.concat(instr);
       end;
@@ -867,6 +867,10 @@ implementation
             list.concat(taicpu.op_reg_reg_const(A_ADDI, dst.base, dst.base, 4));
             list.concat(taicpu.op_reg_reg_const(A_ADDI, countreg, countreg, -1));
             a_cmp_const_reg_label(list,OS_INT,OC_GT,0,countreg,lab);
+            { keep the registers alive }
+            list.concat(taicpu.op_reg_reg(A_MOV,countreg,countreg));
+            list.concat(taicpu.op_reg_reg(A_MOV,src.base,src.base));
+            list.concat(taicpu.op_reg_reg(A_MOV,dst.base,dst.base));
             len := len mod 4;
           end;
           { unrolled loop }

+ 2 - 0
compiler/xtensa/cpuinfo.pas

@@ -52,6 +52,7 @@ Type
    tcontrollertype =
      (ct_none,
       ct_esp8266,
+      ct_esp32,
       ct_esp32_d0wd,
       ct_esp32_d2wd,
       ct_esp32_sOwd
@@ -108,6 +109,7 @@ Const
    (
       (controllertypestr:'';		controllerunitstr:'';	cputype:cpu_none; fputype:fpu_none; abi: abi_default; flashbase:0),
       (controllertypestr:'ESP8266';	controllerunitstr:'ESP8266';	cputype:cpu_lx106; fputype:fpu_none; abi: abi_xtensa_call0; { flashbase:$40000000; flashsize:448*1024; srambase:$40070000; sramsize: 520*1024 }),
+      (controllertypestr:'ESP32';	controllerunitstr:'ESP32';	cputype:cpu_lx6; fputype:fpu_none; abi: abi_xtensa_windowed),
       (controllertypestr:'ESP32_D0WD';	controllerunitstr:'ESP32_D0WD';	cputype:cpu_lx6; fputype:fpu_none; abi: abi_xtensa_windowed; flashbase:$40000000; flashsize:448*1024; srambase:$40070000; sramsize: 520*1024),
       (controllertypestr:'ESP32_D2WD';	controllerunitstr:'ESP32_D2WD';	cputype:cpu_lx6; fputype:fpu_none; abi: abi_xtensa_windowed; flashbase:$40000000; flashsize:448*1024; srambase:$40070000; sramsize: 520*1024),
       (controllertypestr:'ESP32_S0WD';	controllerunitstr:'ESP32_S0WD';	cputype:cpu_lx6; fputype:fpu_none; abi: abi_xtensa_windowed; flashbase:$40000000; flashsize:448*1024; srambase:$40070000; sramsize: 520*1024)

+ 0 - 39
compiler/xtensa/cpupara.pas

@@ -37,7 +37,6 @@ unit cpupara;
          function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
          function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
 
-         procedure getcgtempparaloc(list: TAsmList; pd : tabstractprocdef; nr : longint; var cgpara : tcgpara);override;
          function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
          function create_varargs_paraloc_info(p : tabstractprocdef; side: tcallercallee; varargspara:tvarargsparalist):longint;override;
          function get_funcretloc(p : tabstractprocdef; side: tcallercallee; forcetempdef: tdef): tcgpara;override;
@@ -76,44 +75,6 @@ unit cpupara;
       end;
 
 
-    procedure tcpuparamanager.getcgtempparaloc(list: TAsmList; pd : tabstractprocdef; nr : longint; var cgpara : tcgpara);
-      var
-        paraloc : pcgparalocation;
-        psym : tparavarsym;
-        pdef : tdef;
-      begin
-        psym:=tparavarsym(pd.paras[nr-1]);
-        pdef:=psym.vardef;
-        if push_addr_param(psym.varspez,pdef,pd.proccalloption) then
-          pdef:=cpointerdef.getreusable_no_free(pdef);
-        cgpara.reset;
-        cgpara.size:=def_cgsize(pdef);
-        cgpara.intsize:=tcgsize2size[cgpara.size];
-        cgpara.alignment:=get_para_align(pd.proccalloption);
-        cgpara.def:=pdef;
-        paraloc:=cgpara.add_location;
-        with paraloc^ do
-         begin
-           size:=def_cgsize(pdef);
-           def:=pdef;
-           if (nr<=8) then
-             begin
-               if nr=0 then
-                 internalerror(200309271);
-               loc:=LOC_REGISTER;
-               register:=newreg(R_INTREGISTER,RS_A2+nr,R_SUBWHOLE);
-             end
-           else
-             begin
-               loc:=LOC_REFERENCE;
-               paraloc^.reference.index:=NR_STACK_POINTER_REG;
-               reference.offset:=sizeof(pint)*(nr);
-             end;
-          end;
-      end;
-
-
-
     function getparaloc(p : tdef) : tcgloc;
 
       begin

+ 1 - 1
compiler/xtensa/cputarg.pas

@@ -36,7 +36,7 @@ implementation
 **************************************}
 
     {$ifndef NOTARGETEMBEDDED}
-      ,t_embed
+      ,t_embed,t_freertos
     {$endif}
 
 {**************************************

+ 8 - 4
compiler/xtensa/ncpuadd.pas

@@ -53,7 +53,7 @@ interface
       hlcgobj;
 
 {*****************************************************************************
-                               TAVRAddNode
+                               TCPUAddNode
 *****************************************************************************}
 
    procedure TCPUAddNode.second_cmpsmallset;
@@ -124,13 +124,16 @@ interface
             internalerror(2020030801);
           end;
 
-        if right.nodetype=ordconstn then
+        if (right.nodetype=ordconstn) and not(nf_swapped in flags) then
           cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_INT,cond,right.location.value,left.location.register,location.truelabel)
         else
           begin
             force_reg_left_right(false,false);
-            cg.a_cmp_reg_reg_label(current_asmdata.CurrAsmList,OS_INT,cond,left.location.register,right.location.register,location.truelabel);
-          end;                                                                                                                                
+            if nf_swapped in flags then
+               cg.a_cmp_reg_reg_label(current_asmdata.CurrAsmList,OS_INT,cond,left.location.register,right.location.register,location.truelabel)
+             else
+               cg.a_cmp_reg_reg_label(current_asmdata.CurrAsmList,OS_INT,cond,right.location.register,left.location.register,location.truelabel);
+          end;
         current_asmdata.CurrAsmList.concat(taicpu.op_sym(A_J,location.falselabel));
       end;
 
@@ -176,3 +179,4 @@ interface
 begin
   caddnode:=tcpuaddnode;
 end.
+

+ 3 - 7
rtl/darwin/sysmach.inc

@@ -64,18 +64,14 @@ const
 var
   mach_task_self_: mach_port_t; cvar; external;
 
-  vm_page_size: vm_size_t; cvar; external;
+  darwin_page_size: vm_size_t;
 
-  vm_kernel_page_size: vm_size_t; cvar; weakexternal; //__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0)
 
-  darwin_page_size: vm_size_t;
+  function getpagesize: longint; cdecl; external;
 
   procedure darwin_init_page_size;
     begin
-      if (@vm_kernel_page_size<>nil) and (vm_kernel_page_size>vm_page_size) then
-        darwin_page_size:=vm_kernel_page_size
-      else
-        darwin_page_size:=vm_page_size;
+      darwin_page_size:=getpagesize;
     end;
 
 

+ 2969 - 0
rtl/freertos/Makefile

@@ -0,0 +1,2969 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-darwin aarch64-android wasm-wasm sparc64-linux riscv32-linux riscv32-embedded riscv64-linux riscv64-embedded xtensa-embedded xtensa-freertos
+BSDs = freebsd netbsd openbsd darwin dragonfly
+UNIXs = linux $(BSDs) solaris qnx haiku aix
+LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+ifndef RUNBATCH
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override OS_TARGET_DEFAULT=embedded
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifeq ($(CPU_TARGET),armeb)
+ARCH=arm
+override FPCOPT+=-Cb
+else
+ifeq ($(CPU_TARGET),armel)
+ARCH=arm
+override FPCOPT+=-CaEABI
+else
+ARCH=$(CPU_TARGET)
+endif
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for arm-embedded, a sub-architecture (e.g. SUBARCH=armv4t or SUBARCH=armv7m) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for avr-embedded, a sub-architecture (e.g. SUBARCH=avr25 or SUBARCH=avr35) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for mipsel-embedded, a sub-architecture (e.g. SUBARCH=pic32mx) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+ifneq ($(findstring $(OS_TARGET),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+endif
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+ifndef CROSSCOMPILE
+BUILDFULLNATIVE=1
+export BUILDFULLNATIVE
+endif
+ifdef BUILDFULLNATIVE
+BUILDNATIVE=1
+export BUILDNATIVE
+endif
+export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
+ifeq ($(OS_SOURCE),darwin)
+DARWIN2DARWIN=1
+endif
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+ifneq ($(OS_TARGET),msdos)
+ifndef DARWIN2DARWIN
+ifneq ($(CPU_TARGET),jvm)
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+ifeq ($(OS_TARGET),android)
+ifeq ($(CPU_TARGET),arm)
+BINUTILSPREFIX=arm-linux-androideabi-
+else
+ifeq ($(CPU_TARGET),i386)
+BINUTILSPREFIX=i686-linux-android-
+else
+BINUTILSPREFIX=$(CPU_TARGET)-linux-android-
+endif
+endif
+endif
+endif
+endif
+else
+BINUTILSPREFIX=$(OS_TARGET)-
+endif
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages)
+ifndef FPCFPMAKE
+ifdef CROSSCOMPILE
+ifeq ($(strip $(wildcard $(addsuffix /compiler/ppc$(SRCEXEEXT),$(FPCDIR)))),)
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPCFPMAKE:=$(shell $(FPCPROG) -PB)
+ifeq ($(strip $(wildcard $(FPCFPMAKE))),)
+FPCFPMAKE:=$(firstword $(FPCPROG))
+endif
+else
+override FPCFPMAKE=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+FPCFPMAKE=$(strip $(wildcard $(addsuffix /compiler/ppc$(SRCEXEEXT),$(FPCDIR))))
+FPMAKE_SKIP_CONFIG=-n
+export FPCFPMAKE
+export FPMAKE_SKIP_CONFIG
+endif
+else
+FPMAKE_SKIP_CONFIG=-n
+FPCFPMAKE=$(FPC)
+endif
+endif
+override PACKAGE_NAME=rtl
+PACKAGEDIR_MAIN:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+RTL=..
+INC=$(RTL)/inc
+COMMON=$(RTL)/common
+PROCINC=$(RTL)/$(CPU_TARGET)
+UNITPREFIX=rtl
+SYSTEMUNIT=system
+LOADERS=
+ifeq ($(ARCH),mipsel)
+ifeq ($(SUBARCH),pic32mx)
+override LOADERS=startup
+endif
+endif
+ifdef RELEASE
+override FPCOPT+=-Ur
+endif
+ifeq ($(ARCH),i8086)
+override [email protected]
+endif
+CPU_UNITS=
+SYSINIT_UNITS=
+CPU_SPECIFIC_COMMON_UNITS=
+ifeq ($(ARCH),arm)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+ifeq ($(SUBARCH),armv7m)
+CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl stm32f10x_conn stm32f10x_cl lpc13xx lpc1768 lm4f120 sam3x8e xmc4500 cortexm3 cortexm4 # thumb2_bare
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv7em)
+CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 # thumb2_bare
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv4t)
+CPU_UNITS=lpc21x4 at91sam7x256 sc32442b
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv4)
+CPU_UNITS=lpc21x4 at91sam7x256 sc32442b
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv6m)
+CPU_UNITS=lpc8xx lpc11xx lpc122x stm32f0xx nrf51 cortexm0
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv7a)
+CPU_UNITS=allwinner_a20 raspi2
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+ifeq ($(ARCH),avr)
+CPU_SPECIFIC_COMMON_UNITS=intrinsics
+ifeq ($(SUBARCH),avrtiny)
+CPU_UNITS=attiny4 attiny5 attiny9 attiny10 attiny20 attiny40 attiny102 attiny104
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr1)
+CPU_UNITS=attiny11 attiny12 attiny15 attiny28
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr2)
+CPU_UNITS=attiny26
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr25)
+CPU_UNITS=attiny13 attiny13a attiny24 attiny24a attiny25 attiny43u \
+	  attiny44 attiny44a attiny45 attiny48 attiny84a attiny84 attiny85 \
+	  attiny87 attiny88 attiny261 attiny261a attiny441 attiny461 attiny461a attiny828 \
+	  attiny841 attiny861 attiny861a attiny2313 attiny2313a attiny4313
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr35)
+CPU_UNITS=at90usb82 at90usb162 atmega8u2 atmega16u2 atmega32u2 attiny167 attiny1634
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr4)
+CPU_UNITS=at90pwm1 at90pwm2b at90pwm3b at90pwm81 ata6285 ata6286 atmega8 \
+	  atmega8a atmega8hva atmega48 atmega48a atmega48p atmega48pa \
+	  atmega48pb atmega88 atmega88a atmega88p atmega88pa atmega88pb \
+	  atmega8515 atmega8535
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr5)
+CPU_UNITS=avrsim at90can32 at90can64 at90pwm161 at90pwm216 at90pwm316 \
+	  at90usb646 at90usb647 atmega16 atmega16a atmega16hva atmega16hvb atmega16hvbrevb atmega16m1 \
+	  atmega16u4 atmega32 atmega32a atmega32c1 atmega32hvb atmega32hvbrevb atmega32m1 \
+	  atmega32u4 atmega64 atmega64a atmega64c1 atmega64hve2 atmega64m1 atmega64rfr2 atmega162 \
+	  atmega164a atmega164p atmega164pa atmega165a atmega165p atmega165pa \
+	  atmega168 atmega168a atmega168p atmega168pa atmega168pb atmega169a atmega169p \
+	  atmega169pa atmega324a atmega324p atmega324pa atmega324pb atmega325 atmega325a \
+	  atmega325p atmega325pa atmega328 atmega328p atmega328pb atmega329 atmega329a \
+	  atmega329p atmega329pa atmega406 atmega640 atmega644 atmega644a atmega644p \
+	  atmega644pa atmega644rfr2 atmega645 atmega645a atmega645p atmega649 atmega649a \
+	  atmega649p atmega3250 atmega3250a atmega3250p atmega3250pa atmega3290 \
+	  atmega3290a atmega3290p atmega3290pa atmega6450 atmega6450a \
+	  atmega6450p atmega6490 atmega6490a atmega6490p
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr51)
+CPU_UNITS=at90can128 at90usb1286 at90usb1287 atmega128 atmega128a atmega128rfa1 atmega128rfr2 \
+	  atmega1280 atmega1281 atmega1284 atmega1284p atmega1284rfr2
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr6)
+CPU_UNITS=avrsim atmega256rfr2 atmega2560 atmega2561 atmega2564rfr2
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avrxmega3)
+CPU_UNITS=atmega808 atmega809 atmega1608 atmega1609 atmega3208 atmega3209 \
+	  atmega4808 atmega4809 attiny202 attiny204 attiny212 attiny214 \
+	  attiny402 attiny404 attiny406 attiny412 attiny414 attiny416 \
+	  attiny416auto attiny417 attiny804 attiny806 attiny807 attiny814 \
+	  attiny816 attiny817 attiny1604 attiny1606 attiny1607 attiny1614 \
+	  attiny1616 attiny1617 attiny1624 attiny1626 attiny1627 attiny3214 attiny3216 attiny3217
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+ifeq ($(ARCH),i386)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+CPU_UNITS=multiboot
+CPU_UNITS_DEFINED=1
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+ifeq ($(ARCH),x86_64)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+endif
+ifeq ($(ARCH),m68k)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math
+endif
+ifeq ($(ARCH),mipsel)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+ifeq ($(SUBARCH),pic32mx)
+CPU_UNITS=pic32mx1xxfxxxb pic32mx2xxfxxxb pic32mx1xxfxxxc pic32mx2xxfxxxc pic32mx1xxfxxxd pic32mx2xxfxxxd pic32mx7x5fxxxl pic32mx7x5fxxxh
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+ifeq ($(ARCH),riscv32)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+ifeq ($(SUBARCH),rv32imac)
+override FPCOPT+=-Cprv32imac
+CPU_UNITS=fe310g000 fe310g002 gd32vf103xx
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+ifeq ($(ARCH),riscv64)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+CPU_UNITS=
+CPU_UNITS_DEFINED=1
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+ifeq ($(ARCH),xtensa)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+CPU_UNITS=esp32
+CPU_UNITS_DEFINED=1
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+OBJPASDIR=$(RTL)/objpas
+GRAPHDIR=$(INC)/graph
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-android)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-aros)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),m68k-macos)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc-aix)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-haiku)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-netbsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-openbsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-iphonesim)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-android)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-aros)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),x86_64-dragonfly)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-netbsd)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-android)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),arm-aros)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),powerpc64-aix)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),mips-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),mipsel-android)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),jvm-java)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i8086-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i8086-msdos)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i8086-win16)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),aarch64-darwin)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),aarch64-android)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),wasm-wasm)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),sparc64-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),riscv32-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),riscv32-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),riscv64-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),riscv64-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),xtensa-embedded)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),xtensa-freertos)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-android)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i386-aros)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),m68k-macos)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc-aix)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-haiku)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-netbsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-openbsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-iphonesim)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-android)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-aros)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),x86_64-dragonfly)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-netbsd)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-android)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),arm-aros)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),powerpc64-aix)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),mips-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),mipsel-android)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),jvm-java)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i8086-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i8086-msdos)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),i8086-win16)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),aarch64-darwin)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),aarch64-android)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),wasm-wasm)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),sparc64-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),riscv32-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),riscv32-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),riscv64-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),riscv64-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),xtensa-embedded)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+ifeq ($(FULL_TARGET),xtensa-freertos)
+override TARGET_LOADERS+=$(LOADERS)
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-android)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-aros)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),m68k-macos)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc-aix)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-haiku)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-netbsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-openbsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-iphonesim)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-android)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-aros)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),x86_64-dragonfly)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-netbsd)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-android)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),arm-aros)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),powerpc64-aix)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),mips-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),mipsel-android)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),jvm-java)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i8086-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i8086-msdos)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i8086-win16)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),aarch64-darwin)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),aarch64-android)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),wasm-wasm)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),sparc64-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),riscv32-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),riscv32-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),riscv64-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),riscv64-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),xtensa-embedded)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),xtensa-freertos)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-android)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i386-aros)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),m68k-macos)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc-aix)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-haiku)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-netbsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-openbsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-iphonesim)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-android)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-aros)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),x86_64-dragonfly)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-netbsd)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-android)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),arm-aros)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),powerpc64-aix)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),mips-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),mipsel-android)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),jvm-java)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i8086-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i8086-msdos)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),i8086-win16)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),aarch64-darwin)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),aarch64-android)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),wasm-wasm)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),sparc64-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),riscv32-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),riscv32-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),riscv64-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),riscv64-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),xtensa-embedded)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifeq ($(FULL_TARGET),xtensa-freertos)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+LTOEXT=.bc
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+EXEDBGEXT=.dbg
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifneq ($(CPU_TARGET),jvm)
+ifeq ($(OS_TARGET),android)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),dragonfly)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=df
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),aros)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=aros
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),haiku)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=hai
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+EXEDBGEXT=.dSYM
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+ifeq ($(OS_TARGET),NativeNT)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=nativent
+endif
+ifeq ($(OS_TARGET),wii)
+EXEEXT=.dol
+SHAREDLIBEXT=.so
+SHORTSUFFIX=wii
+endif
+ifeq ($(OS_TARGET),aix)
+BATCHEXT=.sh
+EXEEXT=
+SHAREDLIBEXT=.a
+SHORTSUFFIX=aix
+endif
+ifeq ($(OS_TARGET),java)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=java
+endif
+ifeq ($(CPU_TARGET),jvm)
+ifeq ($(OS_TARGET),android)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=android
+endif
+endif
+ifeq ($(OS_TARGET),msdos)
+STATICLIBPREFIX=
+STATICLIBEXT=.a
+SHORTSUFFIX=d16
+endif
+ifeq ($(OS_TARGET),embedded)
+ifeq ($(CPU_TARGET),i8086)
+STATICLIBPREFIX=
+STATICLIBEXT=.a
+else
+EXEEXT=.bin
+endif
+SHORTSUFFIX=emb
+endif
+ifeq ($(OS_TARGET),win16)
+STATICLIBPREFIX=
+STATICLIBEXT=.a
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w16
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+NASMNAME=$(BINUTILSPREFIX)nasm
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+ifndef NASMPROG
+ifdef CROSSBINDIR
+NASMPROG=$(CROSSBINDIR)/$(NASMNAME)$(SRCEXEEXT)
+else
+NASMPROG=$(NASMNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+NASM=$(NASMPROG)
+ifdef inUnix
+PPAS=./ppas$(SRCBATCHEXT)
+else
+PPAS=ppas$(SRCBATCHEXT)
+endif
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(ARCH)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(ARCH)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+override FPCMAKEOPT+=-FD$(NEW_BINUTILS_PATH)
+override FPMAKE_BUILD_OPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifndef CROSSCOMPILE
+ifneq ($(BINUTILSPREFIX),)
+override FPCMAKEOPT+=-XP$(BINUTILSPREFIX)
+override FPMAKE_BUILD_OPT+=-XP$(BINUTILSPREFIX)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+endif
+ifneq ($(findstring $(OS_TARGET),dragonfly freebsd openbsd netbsd linux solaris),)
+ifneq ($(findstring $(CPU_TARGET),x86_64 mips mipsel),)
+override FPCOPT+=-Cg
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPMAKEBUILDOPT
+override FPMAKE_BUILD_OPT+=$(FPMAKEBUILDOPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(strip $(FPC) $(FPCOPT))
+ifneq (,$(findstring -sh ,$(COMPILER)))
+UseEXECPPAS=1
+endif
+ifneq (,$(findstring -s ,$(COMPILER)))
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+UseEXECPPAS=1
+endif
+endif
+ifneq ($(UseEXECPPAS),1)
+EXECPPAS=
+else
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_loaders
+ifneq ($(TARGET_LOADERS),)
+override ALLTARGET+=fpc_loaders
+override CLEANTARGET+=fpc_loaders_clean
+override INSTALLTARGET+=fpc_loaders_install
+override LOADEROFILES:=$(addsuffix $(OEXT),$(TARGET_LOADERS))
+endif
+%$(OEXT): %$(LOADEREXT)
+ifdef COMPILER_UNITTARGETDIR
+	$(AS) -o $(COMPILER_UNITTARGETDIR)/$*$(OEXT) $<
+else
+	$(AS) -o $*$(OEXT) $<
+endif
+fpc_loaders: $(COMPILER_UNITTARGETDIR) $(LOADEROFILES)
+fpc_loaders_clean:
+ifdef COMPILER_UNITTARGETDIR
+	-$(DEL) $(addprefix $(COMPILER_UNITTARGETDIR)/,$(LOADEROFILES))
+else
+	-$(DEL) $(LOADEROFILES)
+endif
+fpc_loaders_install:
+	$(MKDIR) $(INSTALL_UNITDIR)
+ifdef COMPILER_UNITTARGETDIR
+	$(INSTALL) $(addprefix $(COMPILER_UNITTARGETDIR)/,$(LOADEROFILES)) $(INSTALL_UNITDIR)
+else
+	$(INSTALL) $(LOADEROFILES) $(INSTALL_UNITDIR)
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS)$(TARGET_IMPLICITUNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) $(LTOEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(LTOEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR) -P$(BINUTILSPREFIX)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+ifneq ($(IMPORTLIBPREFIX)-$(STATICLIBEXT),$(STATICLIBPREFIX)-$(STATICLIBEXT))
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(subst $(PPUEXT),$(LTOEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+else
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(subst $(PPUEXT),$(LTOEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+endif
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILENAMES:=$(notdir $(INSTALLPPUFILES))
+override INSTALLPPULINKFILENAMES:=$(notdir $(INSTALLPPULINKFILES))
+override INSTALLPPUFILES=$(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPUFILENAMES))
+override INSTALLPPULINKFILES=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPULINKFILENAMES)))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(EXAMPLEINSTALLTARGET) $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+override CLEANEXEDBGFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEDBGFILES))
+endif
+ifdef CLEAN_PROGRAMS
+override CLEANEXEFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEEXT), $(CLEAN_PROGRAMS)))
+override CLEANEXEDBGFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEDBGEXT), $(CLEAN_PROGRAMS)))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(subst $(PPUEXT),$(LTOEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILENAMES:=$(CLEANPPUFILES)
+override CLEANPPUFILES=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILENAMES))
+override CLEANPPULINKFILENAMES:=$(CLEANPPULINKFILES)
+override CLEANPPULINKFILES=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILENAMES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANEXEDBGFILES
+	-$(DELTREE) $(CLEANEXEDBGFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) *$(FULL_TARGET).fpm Package.fpc *$(ASMEXT)
+	-$(DEL) $(FPCEXTFILE) $(REDIRFILE) script*.res link*.res *_script.res *_link.res
+	-$(DEL) $(PPAS) *_ppas$(BATCHEXT) ppas$(BATCHEXT) ppaslink$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+	-$(DELTREE) units
+	-$(DELTREE) bin
+	-$(DEL) *$(OEXT) *$(LTOEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc *.fpm
+	-$(DEL) $(FPCEXTFILE) $(REDIRFILE) script*.res link*.res *_script.res *_link.res
+	-$(DEL) $(PPAS) *_ppas$(BATCHEXT) ppas$(BATCHEXT) ppaslink$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+ifdef LOCALFPMAKEBIN
+	-$(DEL) $(LOCALFPMAKEBIN)
+	-$(DEL) $(FPMAKEBINOBJ)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)  FPC fpmake... $(FPCFPMAKE)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+include $(INC)/makefile.inc
+SYSINCDEPS=$(addprefix $(INC)/,$(SYSINCNAMES))
+include $(PROCINC)/makefile.cpu
+SYSCPUDEPS=$(addprefix $(PROCINC)/,$(CPUINCNAMES))
+SYSDEPS=$(SYSINCDEPS) $(SYSCPUDEPS)
+startup$(OEXT) : $(CPU_TARGET)/startup.s
+	$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)startup$(OEXT) $(CPU_TARGET)/startup.s  -mabi=32 -march=pic32mx -mtune=pic32mx -W -EL  -msym32
+$(SYSTEMUNIT)$(PPUEXT) : $(SYSTEMUNIT).pp $(SYSDEPS) $(INC)/softfpu.pp
+	$(COMPILER) $(FPC_SYSTEM_OPT) -Us -Sg $(SYSTEMUNIT).pp @system.cfg $(REDIR)
+uuchar$(PPUEXT): $(INC)/uuchar.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+objpas$(PPUEXT): $(OBJPASDIR)/objpas.pp $(INC)/except.inc $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/objpas.pp $(REDIR)
+strings$(PPUEXT) : $(INC)/strings.pp $(INC)/stringsi.inc \
+		   $(PROCINC)/strings.inc $(PROCINC)/stringss.inc \
+		   $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+consoleio$(PPUEXT) : consoleio.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+heapmgr$(PPUEXT) : heapmgr.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+dos$(PPUEXT) : dos.pp $(INC)/fexpand.inc $(INC)/filerec.inc $(INC)/textrec.inc $(INC)/dosh.inc $(INC)/dos.inc objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+objects$(PPUEXT) : $(INC)/objects.pp dos$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+sysutils$(PPUEXT) : sysutils.pp $(wildcard $(OBJPASDIR)/sysutils/*.inc) \
+		    objpas$(PPUEXT) sysconst$(PPUEXT) heapmgr$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) -Fi$(OBJPASDIR)/sysutils sysutils.pp
+classes$(PPUEXT) : classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
+		   sysutils$(PPUEXT) typinfo$(PPUEXT) rtlconsts$(PPUEXT) types$(PPUEXT) sortbase$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) -Fi$(OBJPASDIR)/classes classes.pp
+typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT) sysutils$(PPUEXT) rtlconsts$(PPUEXT)
+	$(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp $(REDIR)
+math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(OBJPASDIR)/math.pp $(REDIR)
+varutils$(PPUEXT) : $(OBJPASDIR)/cvarutil.inc $(OBJPASDIR)/varutils.inc \
+		    $(OBJPASDIR)/varutilh.inc varutils.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) -I$(OBJPASDIR) varutils.pp $(REDIR)
+fmtbcd$(PPUEXT) : $(OBJPASDIR)/fmtbcd.pp objpas$(PPUEXT) sysutils$(PPUEXT) variants$(PPUEXT) classes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(OBJPASDIR)/fmtbcd.pp
+types$(PPUEXT) : $(OBJPASDIR)/types.pp math$(PPUEXT) objpas$(PPUEXT) math$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(OBJPASDIR)/types.pp
+rtlconsts$(PPUEXT) : $(OBJPASDIR)/rtlconsts.pp $(OBJPASDIR)/rtlconst.inc objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(OBJPASDIR)/rtlconsts.pp
+sysconst$(PPUEXT) : $(OBJPASDIR)/sysconst.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(OBJPASDIR)/sysconst.pp
+fgl$(PPUEXT): $(OBJPASDIR)/fgl.pp objpas$(PPUEXT) types$(PPUEXT) system$(PPUEXT) sysutils$(PPUEXT) sortbase$(PPUEXT)
+	$(COMPILER) -Sg $(OBJPASDIR)/fgl.pp $(REDIR)
+dateutil$(PPUEXT) : $(OBJPASDIR)/dateutil.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/dateutil.pp
+macpas$(PPUEXT) : $(INC)/macpas.pp objpas$(PPUEXT) math$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/macpas.pp $(REDIR)
+ucomplex$(PPUEXT): $(INC)/ucomplex.pp math$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+getopts$(PPUEXT) : $(INC)/getopts.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+heaptrc$(PPUEXT) : $(INC)/heaptrc.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) -Sg $(INC)/heaptrc.pp $(REDIR)
+lineinfo$(PPUEXT) : $(INC)/lineinfo.pp strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/lineinfo.pp
+charset$(PPUEXT) : $(INC)/charset.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+cpall$(PPUEXT): $(RTL)/charmaps/cpall.pas system$(PPUEXT) charset$(PPUEXT)
+	$(COMPILER) -Fu$(INC) -Fi$(RTL)/charmaps $(RTL)/charmaps/cpall.pas
+iso7185$(PPUEXT) : $(INC)/iso7185.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/iso7185.pp
+extpas$(PPUEXT) : $(INC)/extpas.pp dos$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/extpas.pp
+define CPU_UNITS_RULE
+ifeq ($(ARCH),avr)
+$(1)$(PPUEXT): $(ARCH)/$(1).pp intrinsics$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+else
+$(1)$(PPUEXT): $(ARCH)/$(1).pp $(SYSTEMUNIT)$(PPUEXT)
+endif
+endef
+$(foreach unit,$(CPU_UNITS),$(eval $(call CPU_UNITS_RULE,$(unit))))
+$(addsuffix $(PPUEXT),$(CPU_UNITS)):
+	$(COMPILER) -g $<
+errors$(PPUEXT) : $(UNIXINC)/errors.pp strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(UNIXINC)/errors.pp
+callspec$(PPUEXT) : $(INC)/callspec.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/callspec.pp
+cmem$(PPUEXT) : $(INC)/cmem.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/cmem.pp
+cthreads$(PPUEXT) : $(UNIXINC)/cthreads.pp $(SYSTEMUNIT)$(PPUEXT) unix$(PPUEXT) sysutils$(PPUEXT) baseunix$(PPUEXT) initc$(PPUEXT) dl$(PPUEXT)
+	$(COMPILER) $(UNIXINC)/cthreads.pp
+cwstring$(PPUEXT) : $(UNIXINC)/cwstring.pp $(SYSTEMUNIT)$(PPUEXT) sysutils$(PPUEXT) baseunix$(PPUEXT) unix$(PPUEXT) unixtype$(PPUEXT) ctypes$(PPUEXT) dynlibs$(PPUEXT) unixcp$(PPUEXT)
+	$(COMPILER) $(UNIXINC)/cwstring.pp
+ctypes$(PPUEXT) :  $(INC)/ctypes.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/ctypes.pp
+fpcylix$(PPUEXT) : fpcylix.pp cthreads$(PPUEXT) cwstring$(PPUEXT) dynlibs$(PPUEXT) objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) fpcylix.pp
+intrinsics$(PPUEXT) : $(PROCINC)/intrinsics.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(PROCINC)/intrinsics.pp
+sortbase$(PPUEXT) : $(INC)/sortbase.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/sortbase.pp

+ 437 - 0
rtl/freertos/Makefile.fpc

@@ -0,0 +1,437 @@
+#
+#   Makefile.fpc for Free Pascal FreeRTOS RTL
+#
+
+[package]
+main=rtl
+
+[target]
+loaders=$(LOADERS)
+
+
+# not all targets include enough features to build all units so
+# the common units which are not compiled for all CPUs are stored in
+# CPU_SPECIFIC_COMMON_UNITS
+units=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 extpas strings heapmgr consoleio sortbase $(CPU_SPECIFIC_COMMON_UNITS) \
+# macpas iso7185 strings
+       dos \
+       ctypes \
+       charset cpall \
+       sysconst
+#implicitunits=exeinfo \
+#      cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 \
+#      cp437 cp646 cp737 cp775 cp850 cp852 cp855 cp856 cp857 cp860 cp861 cp862 \
+#      cp863 cp864 cp865 cp866 cp869 cp874 cp3021 cp8859_1 cp8859_2 cp8859_3 cp8859_4 \
+#      cp8859_5 cp8859_6 cp8859_7 cp8859_8 cp8859_9 cp8859_10 cp8859_11 \
+#      cp8859_13 cp8859_14 cp8859_15 cp8859_16 cpkoi8_r cpkoi8_u
+
+#rsts=math rtlconsts varutils typinfo variants classes sysconst dateutil
+
+[require]
+nortl=y
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../..
+target=embedded
+
+[compiler]
+includedir=$(INC) $(PROCINC)
+sourcedir=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+
+[prerules]
+RTL=..
+INC=$(RTL)/inc
+COMMON=$(RTL)/common
+PROCINC=$(RTL)/$(CPU_TARGET)
+UNITPREFIX=rtl
+SYSTEMUNIT=system
+LOADERS=
+ifeq ($(ARCH),mipsel)
+ifeq ($(SUBARCH),pic32mx)
+override LOADERS=startup
+endif
+endif
+
+ifdef RELEASE
+override FPCOPT+=-Ur
+endif
+
+# Always include rtl.cfg config file for i8086
+ifeq ($(ARCH),i8086)
+override [email protected]
+endif
+
+CPU_UNITS=
+SYSINIT_UNITS=
+CPU_SPECIFIC_COMMON_UNITS=
+
+ifeq ($(ARCH),arm)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+ifeq ($(SUBARCH),armv7m)
+CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl stm32f10x_conn stm32f10x_cl lpc13xx lpc1768 lm4f120 sam3x8e xmc4500 cortexm3 cortexm4 # thumb2_bare
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv7em)
+CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 # thumb2_bare
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv4t)
+CPU_UNITS=lpc21x4 at91sam7x256 sc32442b
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv4)
+CPU_UNITS=lpc21x4 at91sam7x256 sc32442b
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv6m)
+CPU_UNITS=lpc8xx lpc11xx lpc122x stm32f0xx nrf51 cortexm0
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),armv7a)
+CPU_UNITS=allwinner_a20 raspi2
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+
+ifeq ($(ARCH),avr)
+CPU_SPECIFIC_COMMON_UNITS=intrinsics
+ifeq ($(SUBARCH),avrtiny)
+CPU_UNITS=attiny4 attiny5 attiny9 attiny10 attiny20 attiny40 attiny102 attiny104
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr1)
+CPU_UNITS=attiny11 attiny12 attiny15 attiny28
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr2)
+CPU_UNITS=attiny26
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr25)
+CPU_UNITS=attiny13 attiny13a attiny24 attiny24a attiny25 attiny43u \
+          attiny44 attiny44a attiny45 attiny48 attiny84a attiny84 attiny85 \
+          attiny87 attiny88 attiny261 attiny261a attiny441 attiny461 attiny461a attiny828 \
+          attiny841 attiny861 attiny861a attiny2313 attiny2313a attiny4313
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr35)
+CPU_UNITS=at90usb82 at90usb162 atmega8u2 atmega16u2 atmega32u2 attiny167 attiny1634
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr4)
+CPU_UNITS=at90pwm1 at90pwm2b at90pwm3b at90pwm81 ata6285 ata6286 atmega8 \
+          atmega8a atmega8hva atmega48 atmega48a atmega48p atmega48pa \
+          atmega48pb atmega88 atmega88a atmega88p atmega88pa atmega88pb \
+          atmega8515 atmega8535
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr5)
+CPU_UNITS=avrsim at90can32 at90can64 at90pwm161 at90pwm216 at90pwm316 \
+          at90usb646 at90usb647 atmega16 atmega16a atmega16hva atmega16hvb atmega16hvbrevb atmega16m1 \
+          atmega16u4 atmega32 atmega32a atmega32c1 atmega32hvb atmega32hvbrevb atmega32m1 \
+          atmega32u4 atmega64 atmega64a atmega64c1 atmega64hve2 atmega64m1 atmega64rfr2 atmega162 \
+          atmega164a atmega164p atmega164pa atmega165a atmega165p atmega165pa \
+          atmega168 atmega168a atmega168p atmega168pa atmega168pb atmega169a atmega169p \
+          atmega169pa atmega324a atmega324p atmega324pa atmega324pb atmega325 atmega325a \
+          atmega325p atmega325pa atmega328 atmega328p atmega328pb atmega329 atmega329a \
+          atmega329p atmega329pa atmega406 atmega640 atmega644 atmega644a atmega644p \
+          atmega644pa atmega644rfr2 atmega645 atmega645a atmega645p atmega649 atmega649a \
+          atmega649p atmega3250 atmega3250a atmega3250p atmega3250pa atmega3290 \
+          atmega3290a atmega3290p atmega3290pa atmega6450 atmega6450a \
+          atmega6450p atmega6490 atmega6490a atmega6490p
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr51)
+CPU_UNITS=at90can128 at90usb1286 at90usb1287 atmega128 atmega128a atmega128rfa1 atmega128rfr2 \
+          atmega1280 atmega1281 atmega1284 atmega1284p atmega1284rfr2
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avr6)
+CPU_UNITS=avrsim atmega256rfr2 atmega2560 atmega2561 atmega2564rfr2
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(SUBARCH),avrxmega3)
+CPU_UNITS=atmega808 atmega809 atmega1608 atmega1609 atmega3208 atmega3209 \
+          atmega4808 atmega4809 attiny202 attiny204 attiny212 attiny214 \
+          attiny402 attiny404 attiny406 attiny412 attiny414 attiny416 \
+          attiny416auto attiny417 attiny804 attiny806 attiny807 attiny814 \
+          attiny816 attiny817 attiny1604 attiny1606 attiny1607 attiny1614 \
+          attiny1616 attiny1617 attiny1624 attiny1626 attiny1627 attiny3214 attiny3216 attiny3217
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+
+ifeq ($(ARCH),i386)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+CPU_UNITS=multiboot
+CPU_UNITS_DEFINED=1
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+
+ifeq ($(ARCH),x86_64)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+# CPU_UNITS=multiboot
+endif
+
+ifeq ($(ARCH),m68k)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math
+# CPU_UNITS=multiboot
+endif
+
+ifeq ($(ARCH),mipsel)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+ifeq ($(SUBARCH),pic32mx)
+CPU_UNITS=pic32mx1xxfxxxb pic32mx2xxfxxxb pic32mx1xxfxxxc pic32mx2xxfxxxc pic32mx1xxfxxxd pic32mx2xxfxxxd pic32mx7x5fxxxl pic32mx7x5fxxxh
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+
+ifeq ($(ARCH),riscv32)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+ifeq ($(SUBARCH),rv32imac)
+override FPCOPT+=-Cprv32imac
+CPU_UNITS=fe310g000 fe310g002 gd32vf103xx
+CPU_UNITS_DEFINED=1
+endif
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+
+ifeq ($(ARCH),riscv64)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+CPU_UNITS=
+CPU_UNITS_DEFINED=1
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+
+ifeq ($(ARCH),xtensa)
+CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
+CPU_UNITS=esp32
+CPU_UNITS_DEFINED=1
+ifeq ($(CPU_UNITS_DEFINED),)
+$(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
+endif
+endif
+
+# Paths
+OBJPASDIR=$(RTL)/objpas
+GRAPHDIR=$(INC)/graph
+
+[rules]
+# .NOTPARALLEL:
+# Get the system independent include file names.
+# This will set the following variables :
+# SYSINCNAMES
+include $(INC)/makefile.inc
+SYSINCDEPS=$(addprefix $(INC)/,$(SYSINCNAMES))
+
+# Get the processor dependent include file names.
+# This will set the following variables :
+# CPUINCNAMES
+include $(PROCINC)/makefile.cpu
+SYSCPUDEPS=$(addprefix $(PROCINC)/,$(CPUINCNAMES))
+
+# Put system unit dependencies together.
+SYSDEPS=$(SYSINCDEPS) $(SYSCPUDEPS)
+
+#
+# Loaders
+#
+
+startup$(OEXT) : $(CPU_TARGET)/startup.s
+        $(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)startup$(OEXT) $(CPU_TARGET)/startup.s  -mabi=32 -march=pic32mx -mtune=pic32mx -W -EL  -msym32
+
+#
+# Base Units (System, strings, os-dependent-base-unit)
+#
+
+$(SYSTEMUNIT)$(PPUEXT) : $(SYSTEMUNIT).pp $(SYSDEPS) $(INC)/softfpu.pp
+        $(COMPILER) $(FPC_SYSTEM_OPT) -Us -Sg $(SYSTEMUNIT).pp @system.cfg $(REDIR)
+
+uuchar$(PPUEXT): $(INC)/uuchar.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+
+objpas$(PPUEXT): $(OBJPASDIR)/objpas.pp $(INC)/except.inc $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/objpas.pp $(REDIR)
+
+strings$(PPUEXT) : $(INC)/strings.pp $(INC)/stringsi.inc \
+                   $(PROCINC)/strings.inc $(PROCINC)/stringss.inc \
+                   $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $<
+
+
+#
+# System Dependent Units
+#
+
+#ports$(PPUEXT) : ports.pas objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+#        $(COMPILER) $<
+
+#doscalls$(PPUEXT) : doscalls.pas strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+#        $(COMPILER) $<
+
+consoleio$(PPUEXT) : consoleio.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+
+heapmgr$(PPUEXT) : heapmgr.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+
+
+#
+# TP7 Compatible RTL Units
+#
+
+dos$(PPUEXT) : dos.pp $(INC)/fexpand.inc $(INC)/filerec.inc $(INC)/textrec.inc $(INC)/dosh.inc $(INC)/dos.inc objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $<
+
+#crt$(PPUEXT) : crt.pas $(INC)/textrec.inc $(SYSTEMUNIT)$(PPUEXT)
+#        $(COMPILER) $<
+
+objects$(PPUEXT) : $(INC)/objects.pp dos$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $<
+
+#printer$(PPUEXT) : printer.pas $(INC)/textrec.inc $(SYSTEMUNIT)$(PPUEXT)
+#        $(COMPILER) $<
+
+#graph$(PPUEXT) : graph.pp
+#        $(COMPILER) $<
+
+#
+# Delphi Compatible Units
+#
+
+sysutils$(PPUEXT) : sysutils.pp $(wildcard $(OBJPASDIR)/sysutils/*.inc) \
+                    objpas$(PPUEXT) sysconst$(PPUEXT) heapmgr$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) -Fi$(OBJPASDIR)/sysutils sysutils.pp
+
+classes$(PPUEXT) : classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
+                   sysutils$(PPUEXT) typinfo$(PPUEXT) rtlconsts$(PPUEXT) types$(PPUEXT) sortbase$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) -Fi$(OBJPASDIR)/classes classes.pp
+
+typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT) sysutils$(PPUEXT) rtlconsts$(PPUEXT)
+        $(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp $(REDIR)
+
+math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(OBJPASDIR)/math.pp $(REDIR)
+
+varutils$(PPUEXT) : $(OBJPASDIR)/cvarutil.inc $(OBJPASDIR)/varutils.inc \
+                    $(OBJPASDIR)/varutilh.inc varutils.pp $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) -I$(OBJPASDIR) varutils.pp $(REDIR)
+
+fmtbcd$(PPUEXT) : $(OBJPASDIR)/fmtbcd.pp objpas$(PPUEXT) sysutils$(PPUEXT) variants$(PPUEXT) classes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(OBJPASDIR)/fmtbcd.pp
+
+types$(PPUEXT) : $(OBJPASDIR)/types.pp math$(PPUEXT) objpas$(PPUEXT) math$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(OBJPASDIR)/types.pp
+
+rtlconsts$(PPUEXT) : $(OBJPASDIR)/rtlconsts.pp $(OBJPASDIR)/rtlconst.inc objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(OBJPASDIR)/rtlconsts.pp
+
+sysconst$(PPUEXT) : $(OBJPASDIR)/sysconst.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(OBJPASDIR)/sysconst.pp
+
+fgl$(PPUEXT): $(OBJPASDIR)/fgl.pp objpas$(PPUEXT) types$(PPUEXT) system$(PPUEXT) sysutils$(PPUEXT) sortbase$(PPUEXT)
+        $(COMPILER) -Sg $(OBJPASDIR)/fgl.pp $(REDIR)
+
+dateutil$(PPUEXT) : $(OBJPASDIR)/dateutil.pp $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/dateutil.pp
+
+#
+# Mac Pascal Model
+#
+
+macpas$(PPUEXT) : $(INC)/macpas.pp objpas$(PPUEXT) math$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(INC)/macpas.pp $(REDIR)
+
+#
+# Other system-independent RTL Units
+#
+
+ucomplex$(PPUEXT): $(INC)/ucomplex.pp math$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+
+getopts$(PPUEXT) : $(INC)/getopts.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+
+heaptrc$(PPUEXT) : $(INC)/heaptrc.pp $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) -Sg $(INC)/heaptrc.pp $(REDIR)
+
+lineinfo$(PPUEXT) : $(INC)/lineinfo.pp strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/lineinfo.pp
+
+charset$(PPUEXT) : $(INC)/charset.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $<
+
+cpall$(PPUEXT): $(RTL)/charmaps/cpall.pas system$(PPUEXT) charset$(PPUEXT)
+        $(COMPILER) -Fu$(INC) -Fi$(RTL)/charmaps $(RTL)/charmaps/cpall.pas
+
+iso7185$(PPUEXT) : $(INC)/iso7185.pp $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(INC)/iso7185.pp
+
+extpas$(PPUEXT) : $(INC)/extpas.pp dos$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(INC)/extpas.pp
+
+#
+# Unit specific rules
+#
+
+define CPU_UNITS_RULE
+ifeq ($(ARCH),avr)
+$(1)$(PPUEXT): $(ARCH)/$(1).pp intrinsics$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+else
+$(1)$(PPUEXT): $(ARCH)/$(1).pp $(SYSTEMUNIT)$(PPUEXT)
+endif
+endef
+
+$(foreach unit,$(CPU_UNITS),$(eval $(call CPU_UNITS_RULE,$(unit))))
+
+$(addsuffix $(PPUEXT),$(CPU_UNITS)):
+	$(COMPILER) -g $<
+
+#
+# Other $(SYSTEMUNIT)-dependent RTL Units
+#
+
+errors$(PPUEXT) : $(UNIXINC)/errors.pp strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(UNIXINC)/errors.pp
+
+callspec$(PPUEXT) : $(INC)/callspec.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/callspec.pp
+
+cmem$(PPUEXT) : $(INC)/cmem.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/cmem.pp
+
+cthreads$(PPUEXT) : $(UNIXINC)/cthreads.pp $(SYSTEMUNIT)$(PPUEXT) unix$(PPUEXT) sysutils$(PPUEXT) baseunix$(PPUEXT) initc$(PPUEXT) dl$(PPUEXT)
+	$(COMPILER) $(UNIXINC)/cthreads.pp
+
+cwstring$(PPUEXT) : $(UNIXINC)/cwstring.pp $(SYSTEMUNIT)$(PPUEXT) sysutils$(PPUEXT) baseunix$(PPUEXT) unix$(PPUEXT) unixtype$(PPUEXT) ctypes$(PPUEXT) dynlibs$(PPUEXT) unixcp$(PPUEXT)
+	$(COMPILER) $(UNIXINC)/cwstring.pp
+
+ctypes$(PPUEXT) :  $(INC)/ctypes.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/ctypes.pp
+
+fpcylix$(PPUEXT) : fpcylix.pp cthreads$(PPUEXT) cwstring$(PPUEXT) dynlibs$(PPUEXT) objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) fpcylix.pp
+	
+intrinsics$(PPUEXT) : $(PROCINC)/intrinsics.pp $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(PROCINC)/intrinsics.pp
+
+sortbase$(PPUEXT) : $(INC)/sortbase.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(INC)/sortbase.pp

+ 83 - 0
rtl/freertos/check.inc

@@ -0,0 +1,83 @@
+{
+  This file checks feature dependencies, so the compiler
+  exits with a proper error message before a bunch of errors
+  confuse the user.
+}
+{$ifdef FPC_HAS_FEATURE_COMMANDARGS}
+  {$ifndef FPC_HAS_FEATURE_HEAP}
+    {$fatal Using commandline arguments requires a heap manager }
+  {$endif FPC_HAS_FEATURE_HEAP}
+{$endif FPC_HAS_FEATURE_COMMANDARGS}
+
+
+{$ifdef FPC_HAS_FEATURE_OBJECTS}
+  {$ifndef FPC_HAS_FEATURE_HEAP}
+    {$fatal Using objects requires a heap manager }
+  {$endif FPC_HAS_FEATURE_HEAP}
+{$endif FPC_HAS_FEATURE_OBJECTS}
+
+
+{$ifdef FPC_HAS_FEATURE_EXCEPTIONS}
+  {$ifndef FPC_HAS_FEATURE_HEAP}
+    {$fatal Using exceptions requires a heap manager }
+  {$endif FPC_HAS_FEATURE_HEAP}
+{$endif FPC_HAS_FEATURE_EXCEPTIONS}
+
+
+{$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
+  {$ifndef FPC_HAS_FEATURE_HEAP}
+    {$fatal Using widestrings requires a heap manager }
+  {$endif FPC_HAS_FEATURE_HEAP}
+  {$ifndef FPC_HAS_FEATURE_RTTI}
+    {$fatal Using widestrings requires rtti }
+  {$endif FPC_HAS_FEATURE_RTTI}
+{$endif FPC_HAS_FEATURE_WIDESTRINGS}
+
+
+{$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
+  {$ifndef FPC_HAS_FEATURE_HEAP}
+    {$fatal Using ansistrings requires a heap manager }
+  {$endif FPC_HAS_FEATURE_HEAP}
+  {$ifndef FPC_HAS_FEATURE_RTTI}
+    {$fatal Using ansistrings requires rtti }
+  {$endif FPC_HAS_FEATURE_RTTI}
+{$endif FPC_HAS_FEATURE_ANSISTRINGS}
+
+
+{$ifdef FPC_HAS_FEATURE_DYNARRAYS}
+  {$ifndef FPC_HAS_FEATURE_HEAP}
+    {$fatal Using dyn. arrays requires a heap manager }
+  {$endif FPC_HAS_FEATURE_HEAP}
+  {$ifndef FPC_HAS_FEATURE_RTTI}
+    {$fatal Using dyn. arrays requires rtti }
+  {$endif FPC_HAS_FEATURE_RTTI}
+{$endif FPC_HAS_FEATURE_DYNARRAYS}
+
+
+{$ifdef FPC_HAS_FEATURE_CLASSES}
+  {$ifndef FPC_HAS_FEATURE_HEAP}
+    {$fatal Using classes requires a heap manager }
+  {$endif FPC_HAS_FEATURE_HEAP}
+  {$ifndef FPC_HAS_FEATURE_RTTI}
+    {$fatal Using classes requires rtti }
+  {$endif FPC_HAS_FEATURE_RTTI}
+  {$ifndef FPC_HAS_FEATURE_EXCEPTIONS}
+    {$fatal Using classes requires exceptions }
+  {$endif FPC_HAS_FEATURE_EXCEPTIONS}
+{$endif FPC_HAS_FEATURE_CLASSES}
+
+
+{$ifdef FPC_HAS_FEATURE_VARIANTS}
+  {$ifndef FPC_HAS_FEATURE_HEAP}
+    {$fatal Using variants requires a heap manager }
+  {$endif FPC_HAS_FEATURE_HEAP}
+  {$ifndef FPC_HAS_FEATURE_ANSISTRINGS}
+    {$fatal Using variants requires ansistrings }
+  {$endif FPC_HAS_FEATURE_ANSISTRRING}
+  {$ifndef FPC_HAS_FEATURE_WIDESTRINGS}
+    {$fatal Using variants requires widestrings }
+  {$endif FPC_HAS_FEATURE_WIDESTRINGS}
+  {$ifndef FPC_HAS_FEATURE_CLASSES}
+    {$fatal Using variants requires classes }
+  {$endif FPC_HAS_FEATURE_CLASSES}
+{$endif FPC_HAS_FEATURE_VARIANTS}

+ 47 - 0
rtl/freertos/classes.pp

@@ -0,0 +1,47 @@
+{
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 1999-2002 by the Free Pascal development team
+
+    Classes unit for FreeRTOS target
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+{$mode objfpc}
+
+unit Classes;
+
+interface
+
+uses
+  sysutils,
+  rtlconsts,
+  types,
+  sortbase,
+{$ifdef FPC_TESTGENERICS}
+  fgl,
+{$endif}
+  typinfo;
+
+{$i classesh.inc}
+
+
+implementation
+
+{ OS - independent class implementations are in /inc directory. }
+{$i classes.inc}
+
+
+initialization
+  CommonInit;
+
+finalization
+  CommonCleanup;
+
+end.

+ 179 - 0
rtl/freertos/consoleio.pp

@@ -0,0 +1,179 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2011 by the Free Pascal development team.
+
+    Console i/o for the FPC FreeRTOS target
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+Unit consoleio;
+
+  interface
+
+    type
+      TWriteCharFunc = function(ACh: char; AUserData: pointer): boolean;
+      TReadCharFunc = function(var ACh: char; AUserData: pointer): boolean;
+
+    procedure OpenIO(var f: Text; AWrite: TWriteCharFunc; ARead: TReadCharFunc; AMode: word; AUserData: pointer);
+
+  implementation
+
+    {$i textrec.inc}
+
+    type
+      PUserData = ^TUserData;
+      TUserData = record
+        WriteChar: TWriteCharFunc;
+        ReadChar: TReadCharFunc;
+        UserData: Pointer;
+      end;
+
+    function EmptyWrite(ACh: char; AUserData: pointer): boolean;
+      begin
+        EmptyWrite:=true;
+      end;
+
+    function EmptyRead(var ACh: char; AUserData: pointer): boolean;
+      begin
+        EmptyRead:=true;
+        ACh:=#0;
+      end;
+
+    procedure Console_Close(var t:TextRec);
+      begin
+      end;
+
+    function ReadData(Func: TReadCharFunc; UserData: pointer; Buffer: pchar; count: SizeInt): SizeInt;
+      var
+        c: char;
+        got_linechar: boolean;
+      begin
+        ReadData:=0;
+        got_linechar:=false;
+        while (ReadData < count) and (not got_linechar) do
+          begin
+            if Func(c, UserData) then
+              begin
+                if c = #10 then
+                  got_linechar:=true;
+                buffer^:=c;
+                inc(buffer);
+                inc(ReadData);
+              end;
+          end;
+      end;
+
+    Procedure Console_Read(var t:TextRec);
+      var
+        userdata: PUserData;
+      begin
+        userdata:[email protected][1];
+        InOutRes:=0;
+        t.bufend:=ReadData(userdata^.ReadChar,userdata^.UserData,pchar(t.bufptr),t.bufsize);
+        t.bufpos:=0;
+      end;
+
+    Procedure Console_Write(var t:TextRec);
+      var
+        userdata: PUserData;
+        p: pchar;
+        i: SizeInt;
+      begin
+        if t.BufPos=0 then exit;
+        userdata:[email protected][1];
+        i := 0;
+        p := pchar(t.bufptr);
+        while i < t.bufpos do
+          begin
+            if not userdata^.WriteChar(p^, userdata^.UserData) then
+              break;
+            inc(p);
+            inc(i);
+          end;
+        if i<>t.BufPos then
+          InOutRes:=101
+        else
+          InOutRes:=0;
+        t.BufPos:=0;
+      end;
+
+    procedure OpenIO(var f: Text; AWrite: TWriteCharFunc; ARead: TReadCharFunc; AMode: word; AUserData: pointer);
+      var
+        userdata: PUserData;
+      begin
+        { Essentially just init everything, more or less what Assign(f,'');
+          does }
+        FillChar(f,SizeOf(TextRec),0);
+        { only set things that are not zero }
+        TextRec(f).Handle:=UnusedHandle;
+        TextRec(f).BufSize:=TextRecBufSize;
+        TextRec(f).Bufptr:=@TextRec(f).Buffer;
+        TextRec(f).OpenFunc:=nil;
+        TextRec(f).LineEnd := #13#10;
+
+        userdata:=@TextRec(f).UserData[1];
+        TextRec(f).Mode:=AMode;
+        case AMode of
+          fmInput: TextRec(f).Handle:=StdInputHandle;
+          fmOutput: TextRec(f).Handle:=StdOutputHandle;
+        end;
+        TextRec(f).CloseFunc:=@Console_Close;
+        TextRec(f).FlushFunc:=nil;
+        case AMode of
+          fmInput: TextRec(f).InOutFunc:=@Console_Read;
+          fmOutput:
+            begin
+              TextRec(f).InOutFunc:=@Console_Write;
+              TextRec(f).FlushFunc:=@Console_Write;
+            end;
+        end;
+        userdata^.WriteChar := AWrite;
+        userdata^.ReadChar := ARead;
+        userdata^.UserData := AUserData;
+      end;
+
+    procedure SysInitStdIO;
+      begin
+        OpenIO(Input, @EmptyWrite, @EmptyRead, fmInput, nil);
+        OpenIO(Output, @EmptyWrite, @EmptyRead, fmOutput, nil);
+        OpenIO(ErrOutput, @EmptyWrite, @EmptyRead, fmOutput, nil);
+        OpenIO(StdOut, @EmptyWrite, @EmptyRead, fmOutput, nil);
+        OpenIO(StdErr, @EmptyWrite, @EmptyRead, fmOutput, nil);
+      end;
+
+   procedure SysFlushStdIO;
+     begin
+     end;
+
+var
+  ErrorBase : Pointer;external name 'FPC_ERRORBASE';
+
+var
+  pstdout : ^Text;
+
+{$ifndef CPUAVR}
+initialization
+  { Setup stdin, stdout and stderr }
+  SysInitStdIO;
+finalization
+  { Show runtime error and exit }
+  pstdout:=@stdout;
+  If erroraddr<>nil Then
+   Begin
+     Writeln(pstdout^,'Runtime error ',Errorcode,' at $',hexstr(erroraddr));
+     { to get a nice symify }
+     Writeln(pstdout^,BackTraceStrFunc(Erroraddr));
+     dump_stack(pstdout^,ErrorBase);
+     Writeln(pstdout^,'');
+   End;
+  SysFlushStdIO;
+{$endif CPUAVR}
+
+end.
+

+ 280 - 0
rtl/freertos/dos.pp

@@ -0,0 +1,280 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2004 by Karoly Balogh for Genesi S.a.r.l.
+
+    Heavily based on the Commodore Amiga/m68k RTL by Nils Sjoholm and
+    Carl Eric Codere
+
+    MorphOS port was done on a free Pegasos II/G4 machine
+    provided by Genesi S.a.r.l. <www.genesi.lu>
+
+    This unit is based on the MorphOS one and is adapted for Gameboy Advance
+    simply by stripping out all stuff inside funcs and procs.
+    Copyright (c) 2006 by Francesco Lombardi
+    
+    Adapted to FPC FreeRTOS by Florian Klämpfl
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+unit Dos;
+
+interface
+
+{$MODE objfpc}
+
+type
+  SearchRec = Packed Record
+	AnchorPtr : Pointer;    { Pointer to the Anchorpath structure }
+	Fill: Array[1..15] of Byte; {future use}
+    {End of replacement for fill}
+    Attr : BYTE;        {attribute of found file}
+    Time : LongInt;     {last modify date of found file}
+    Size : LongInt;     {file size of found file}
+    Name : String[255]; {name of found file}
+  End;
+
+{$I dosh.inc}
+
+implementation
+
+{$define HAS_GETMSCOUNT}
+
+{$I dos.inc}
+
+{******************************************************************************
+                           --- Internal routines ---
+******************************************************************************}
+
+function dosLock(const name: String; accessmode: Longint) : LongInt;
+begin
+  result := -1;
+end;
+
+function IsLeapYear(Source : Word) : Boolean;
+begin
+  result := false;
+end;
+
+function dosSetProtection(const name: string; mask:longint): Boolean;
+begin
+  result := false;
+end;
+
+function dosSetFileDate(name: string): Boolean;
+begin
+  result := false;
+end;
+
+
+{******************************************************************************
+                        --- Info / Date / Time ---
+******************************************************************************}
+
+function DosVersion: Word;
+begin
+  result := 0;
+end;
+
+procedure NewList ();
+begin
+end;
+
+function CreateExtIO (size: Longint): integer;
+begin
+  result := -1;
+end;
+
+procedure DeleteExtIO ();
+begin
+end;
+
+function Createport(name : PChar; pri : longint): integer;
+begin
+  result := -1;
+end;
+
+procedure DeletePort ();
+begin
+end;
+
+
+function Create_Timer(theUnit : longint) : integer;
+begin
+  result := -1;
+end;
+
+Procedure Delete_Timer();
+begin
+end;
+
+function set_new_time(secs, micro : longint): longint;
+begin
+  result := -1;
+end;
+
+function get_sys_time(): longint;
+begin
+  result := -1;
+end;
+
+procedure GetDate(Var Year, Month, MDay, WDay: Word);
+begin
+  Year := 0;
+  Month := 0;
+  MDay := 0;
+  WDay := 0;
+end;
+
+procedure SetDate(Year, Month, Day: Word);
+begin
+end;
+
+procedure GetTime(Var Hour, Minute, Second, Sec100: Word);
+begin
+  Hour := 0;
+  Minute := 0;
+  Second := 0;
+  Sec100 := 0;
+end;
+
+Procedure SetTime(Hour, Minute, Second, Sec100: Word);
+begin
+end;
+
+function GetMsCount: int64;
+begin
+   result:=0;
+end;
+
+{******************************************************************************
+                               --- Exec ---
+******************************************************************************}
+procedure Exec(const Path: PathStr; const ComLine: ComStr);
+begin
+end;
+
+
+{******************************************************************************
+                               --- Disk ---
+******************************************************************************}
+
+Function DiskFree(Drive: Byte): int64;
+Begin
+  result := -1;
+end;
+
+
+Function DiskSize(Drive: Byte): int64;
+Begin
+  result := -1;
+end;
+
+
+procedure FindFirst(const Path: PathStr; Attr: Word; Var f: SearchRec);
+begin
+  DosError:=18;
+end;
+
+
+procedure FindNext(Var f: SearchRec);
+begin
+  DosError:=18;
+end;
+
+
+procedure FindClose(Var f: SearchRec);
+begin
+  DosError:=18;
+end;
+
+
+{******************************************************************************
+                               --- File ---
+******************************************************************************}
+
+
+function FSearch(path: PathStr; dirlist: String) : PathStr;
+begin
+  result := '';
+end;
+
+
+Procedure getftime (var f; var time : longint);
+begin
+end;
+
+
+Procedure setftime(var f; time : longint);
+Begin
+End;
+
+procedure getfattr(var f; var attr : word);
+begin
+End;
+
+
+procedure setfattr(var f; attr : word);
+begin
+end;
+
+
+{******************************************************************************
+                             --- Environment ---
+******************************************************************************}
+
+function getpathstring: string;
+begin
+  result := '';
+end;
+
+
+function EnvCount: Longint;
+begin
+  result := -1;
+end;
+
+
+function EnvStr(Index: LongInt): String;
+begin
+  result := '';
+end;
+
+
+
+function GetEnv(envvar : String): String;
+begin
+  result := '';
+end;
+
+
+procedure AddDevice(str : String);
+begin
+end;
+
+function MakeDeviceName(str : pchar): string;
+begin
+  result := '';
+end;
+
+function IsInDeviceList(str : string): boolean;
+begin
+  result := false;
+end;
+
+procedure ReadInDevices;
+begin
+end;
+
+begin
+//  DosError:=0;
+//  numberofdevices := 0;
+//  StrOfPaths := '';
+//  ReadInDevices;
+end.

+ 297 - 0
rtl/freertos/heapmgr.pp

@@ -0,0 +1,297 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2011 by the Free Pascal development team.
+
+    Tiny heap manager for the FPC FreeRTOS target
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+{$modeswitch result}
+Unit heapmgr;
+
+  interface
+
+    procedure RegisterHeapBlock(AAddress: pointer; ASize: ptruint);
+    
+    function GetAlignedMem(Size, Alignment: ptruint): pointer;
+
+  implementation
+
+    const
+      MinBlock = 16;
+
+    type
+      PHeapBlock = ^THeapBlock;
+      THeapBlock = record
+        Size: ptruint;
+        Next: PHeapBlock;
+        EndAddr: pointer;
+      end;
+
+    var
+      Blocks: PHeapBlock = nil;
+
+    procedure InternalFreeMem(Addr: Pointer; Size: ptruint); forward;
+
+    function FindSize(p: pointer): ptruint; inline;
+      begin
+        FindSize := PPtrUInt(p)[-1];
+      end;
+
+    function SysGetMem(Size: ptruint): pointer;
+      var
+        p, prev: PHeapBlock;
+        AllocSize, RestSize: ptruint;
+      begin
+        if size+sizeof(PtrUInt)<MinBlock then
+          AllocSize := MinBlock
+        else
+          AllocSize := align(size+sizeof(PtrUInt), sizeof(pointer));
+
+        p := Blocks;
+        prev := nil;
+        while assigned(p) and (p^.Size < AllocSize) do
+          begin
+            prev := p;
+            p := p^.Next;
+          end;
+
+        if assigned(p) then
+          begin
+            result := @pptruint(p)[1];
+
+            if (p^.size > AllocSize) and
+               (p^.Size-AllocSize >= MinBlock) then
+              RestSize := p^.Size-AllocSize
+            else
+              begin
+                AllocSize := p^.Size;
+                RestSize := 0;
+              end;
+
+            if prev = nil then
+              Blocks := p^.Next
+            else
+              prev^.next := p^.next;
+
+            pptruint(p)^ := size;
+
+            InternalFreemem(pointer(ptruint(p)+AllocSize), RestSize);
+          end
+        else
+          begin
+            if ReturnNilIfGrowHeapFails then
+              Result := nil
+            else
+              RunError(203);
+          end;
+      end;
+
+    function GetAlignedMem(Size, Alignment: ptruint): pointer;
+      var
+        mem: Pointer;
+        memp: ptruint;
+      begin
+        if alignment <= sizeof(pointer) then
+          result := GetMem(size)
+        else
+          begin
+            mem := GetMem(Size+Alignment-1+MinBlock);
+            memp := align(ptruint(mem)+MinBlock, Alignment);
+            InternalFreemem(mem, ptruint(memp)-ptruint(mem));
+            result := pointer(memp);
+          end;
+      end;
+
+    procedure InternalFreeMem(Addr: Pointer; Size: ptruint);
+      var
+        b, p, prev: PHeapBlock;
+        concatenated: boolean;
+      begin
+        if size<=0 then
+          exit;
+
+        concatenated := true;
+        while concatenated do
+          begin
+            concatenated := false;
+            b := addr;
+
+            b^.Next := Blocks;
+            b^.Size := Size;
+            b^.EndAddr := pointer(ptruint(addr)+size);
+
+            if Blocks = nil then
+              Blocks := b
+            else
+              begin
+                p := Blocks;
+                prev := nil;
+
+                while assigned(p) do
+                  begin
+                    if p^.EndAddr = addr then
+                      begin
+                        addr:=p;
+                        size:=p^.size+size;
+                        if prev = nil then
+                          blocks:=p^.next
+                        else
+                          prev^.next:=p^.next;
+                        concatenated:=true;
+                        break;
+                      end
+                    else if p = b^.EndAddr then
+                      begin
+                        size:=p^.size+size;
+                        if prev = nil then
+                          blocks:=p^.next
+                        else
+                          prev^.next:=p^.next;
+                        concatenated:=true;
+                        break;
+                      end;
+
+                    prev := p;
+                    p := p^.next;
+                  end;
+
+                if not concatenated then
+                  begin
+                    p := Blocks;
+                    prev := nil;
+
+                    while assigned(p) and (p^.Size < size) do
+                      begin
+                        prev := p;
+                        p := p^.Next;
+                      end;
+
+                    if assigned(prev) then
+                      begin
+                        b^.Next := p;
+                        prev^.Next := b;
+                      end
+                    else
+                      Blocks := b;
+                  end;
+              end;
+          end;
+      end;
+
+    function SysFreeMem(Addr: Pointer): ptruint;
+      var
+        sz: ptruint;
+      begin
+        if addr=nil then
+          begin
+            result:=0;
+            exit;
+          end;
+        sz := Align(FindSize(addr)+SizeOf(pointer), sizeof(pointer));
+
+        InternalFreeMem(@pptruint(addr)[-1], sz);
+
+        result := sz;
+      end;
+
+    function SysFreeMemSize(Addr: Pointer; Size: Ptruint): ptruint;
+      begin
+        result := SysFreeMem(addr);
+      end;
+
+    function SysMemSize(p: pointer): ptruint;
+      begin
+        result := findsize(p);
+      end;
+
+    function SysAllocMem(size: ptruint): pointer;
+      begin
+        result := SysGetMem(size);
+        if result<>nil then
+          FillChar(pbyte(result)^,size,0);
+      end;
+
+    function SysReAllocMem(var p: pointer; size: ptruint):pointer;
+      var
+        sz: ptruint;
+      begin
+        if size=0 then
+          begin
+            SysFreeMem(p);
+            result := nil;
+            p := nil;
+          end
+        else if p=nil then
+          begin
+            result := AllocMem(size);
+            p := result;
+          end
+        else
+          begin
+            result := AllocMem(size);
+            if result <> nil then
+              begin
+                if p <> nil then
+                  begin
+                    sz := FindSize(p);
+                    if sz > size then
+                      sz := size;
+                    move(pbyte(p)^, pbyte(result)^, sz);
+                  end;
+              end;
+            SysFreeMem(p);
+            p := result;
+          end;
+      end;
+
+    procedure RegisterHeapBlock(AAddress: pointer; ASize: ptruint);
+      begin
+        InternalFreeMem(AAddress, ASize);
+      end;
+
+    { avoid that programs crash due to a heap status request }
+    function SysGetFPCHeapStatus : TFPCHeapStatus;
+      begin
+        FillChar(Result,SizeOf(Result),0);
+      end;
+
+    { avoid that programs crash due to a heap status request }
+    function SysGetHeapStatus : THeapStatus;
+      begin
+        FillChar(Result,SizeOf(Result),0);
+      end;
+
+    const
+      MyMemoryManager: TMemoryManager = (
+        NeedLock: false;  // Obsolete
+        GetMem: @SysGetMem;
+        FreeMem: @SysFreeMem;
+        FreeMemSize: @SysFreeMemSize;
+        AllocMem: @SysAllocMem;
+        ReAllocMem: @SysReAllocMem;
+        MemSize: @SysMemSize;
+        InitThread: nil;
+        DoneThread: nil;
+        RelocateHeap: nil;
+        GetHeapStatus: @SysGetHeapStatus;
+        GetFPCHeapStatus: @SysGetFPCHeapStatus;
+      );
+
+var
+  initialheap : record end; external name '__fpc_initialheap';
+  heapsize : PtrInt; external name '__heapsize';
+
+
+initialization
+  SetMemoryManager(MyMemoryManager);
+  RegisterHeapBlock(@initialheap,heapsize);
+finalization
+  //FinalizeHeap;
+end.

+ 29 - 0
rtl/freertos/rtldefs.inc

@@ -0,0 +1,29 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2012 by Free Pascal development team
+
+    This file contains platform-specific defines that are used in
+    multiple RTL units.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+{ the single byte OS APIs always use UTF-8 }
+{ define FPCRTL_FILESYSTEM_UTF8}
+
+{ The OS supports a single byte file system operations API that we use }
+{$define FPCRTL_FILESYSTEM_SINGLE_BYTE_API}
+
+{ The OS supports a two byte file system operations API that we use }
+{ define FPCRTL_FILESYSTEM_TWO_BYTE_API}
+
+{ Use the shortstring version of do_getdir (should be converted to rawbytestring or
+  unicodestring for all but the OSes that don't support code pages and/or are
+  resource limited) }
+{$define FPCRTL_DO_GETDIR_SHORTSTRING}

+ 67 - 0
rtl/freertos/sysdir.inc

@@ -0,0 +1,67 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2006 by Free Pascal development team
+
+    Low level directory functions
+    GBA does not have any drive, so no directory handling is needed.
+    Copyright (c) 2006 by Francesco Lombardi
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+
+{*****************************************************************************
+                           Directory Handling
+*****************************************************************************}
+{$if defined(FPC_HAS_FEATURE_ANSISTRINGS)}
+procedure do_mkdir(const s: rawbytestring);
+begin
+  InOutRes:=3;
+end;
+
+procedure do_rmdir(const s: rawbytestring);
+begin
+  InOutRes:=3;
+end;
+
+procedure do_chdir(const s: rawbytestring);
+begin
+  InOutRes:=3;
+end;
+
+procedure do_GetDir (DriveNr: byte; var Dir: RawByteString);
+begin
+  InOutRes:=3;
+end;
+
+{$else FPC_HAS_FEATURE_ANSISTRINGS}
+
+procedure mkdir(const s: shortstring);
+begin
+  InOutRes:=3;
+end;
+
+procedure rmdir(const s: shortstring);
+begin
+  InOutRes:=3;
+end;
+
+procedure chdir(const s: shortstring);
+begin
+  InOutRes:=3;
+end;
+
+procedure GetDir (DriveNr: byte; var Dir: ShortString);
+begin
+  InOutRes:=3;
+end;
+{$endif FPC_HAS_FEATURE_ANSISTRINGS}
+
+
+

+ 115 - 0
rtl/freertos/sysfile.inc

@@ -0,0 +1,115 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2005 by Free Pascal development team
+
+    Low level file functions
+    GBA does not have any drive, so no file handling is needed.
+    Copyright (c) 2006 by Francesco Lombardi
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+
+{****************************************************************************
+                        Low level File Routines
+               All these functions can set InOutRes on errors
+****************************************************************************}
+
+{ close a file from the handle value }
+procedure do_close(handle : longint);
+begin
+end;
+
+
+procedure do_erase(p : pchar; pchangeable: boolean);
+begin
+  if assigned (@rtl_do_erase) then
+    rtl_do_erase(p);
+end;
+
+
+procedure do_rename(p1,p2 : pchar; p1changeable, p2changeable: boolean);
+begin
+  if assigned (@rtl_do_rename) then
+    rtl_do_rename(p1, p2);
+end;
+
+
+function do_write(h: longint; addr: pointer; len: longint) : longint;
+begin
+  if assigned (rtl_do_write) then
+    result := rtl_do_write(h, addr, len)
+  else
+    result := -1;
+end;
+
+
+function do_read(h: longint; addr: pointer; len: longint) : longint;
+begin
+  if assigned (rtl_do_read) then
+    result := rtl_do_read(h, addr, len)
+  else
+    result := -1;
+end;
+
+
+function do_filepos(handle: longint) : longint;
+begin
+  if assigned (rtl_do_filepos) then
+    result := rtl_do_filepos(handle)
+  else
+    result := -1;
+end;
+
+
+procedure do_seek(handle, pos: longint);
+begin
+  if assigned (rtl_do_seek) then
+    rtl_do_seek(handle, pos);
+end;
+
+
+function do_seekend(handle: longint):longint;
+begin
+  if assigned (rtl_do_seekend) then
+    result := rtl_do_seekend(handle)
+  else
+    result := -1;
+end;
+
+
+function do_filesize(handle : longint) : longint;
+begin
+  result := -1;
+  if assigned (rtl_do_filesize) then
+    result := rtl_do_filesize(handle);
+end;
+
+
+{ truncate at a given position }
+procedure do_truncate(handle, pos: longint);
+begin
+  if assigned (rtl_do_truncate) then
+    rtl_do_truncate(handle, pos);
+end;
+
+
+procedure do_open(var f;p:PFileTextRecChar;flags:longint; pchangeable: boolean);
+begin
+  if assigned (rtl_do_open) then
+    rtl_do_open(f, p, flags);
+end;
+
+
+function do_isdevice(handle: THandle): boolean;
+begin
+  result := false;
+  if assigned (rtl_do_isdevice) then
+    result := rtl_do_isdevice(handle);
+end;

+ 15 - 0
rtl/freertos/sysheap.inc

@@ -0,0 +1,15 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2005 by Free Pascal development team
+
+    Low level memory functions
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+

+ 12 - 0
rtl/freertos/sysos.inc

@@ -0,0 +1,12 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2006 by Free Pascal development team
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}

+ 44 - 0
rtl/freertos/sysosh.inc

@@ -0,0 +1,44 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2001 by Free Pascal development team
+
+    This file implements all the base types and limits required
+    for a minimal POSIX compliant subset required to port the compiler
+    to a new OS.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+{Platform specific information}
+type
+  { fd are int in C also for 64bit targets (x86_64) }
+  THandle = SizeInt;
+  { pthread_t is defined as an "unsigned long" }
+  {$ifdef CPU64}
+  TThreadID = QWord;
+  {$else}
+  TThreadID = THandle;
+  {$endif}
+  TOSTimestamp = Int64;
+
+  { pthread_mutex_t }
+  PRTLCriticalSection = ^TRTLCriticalSection;
+  TRTLCriticalSection = record
+    __m_reserved: longint;
+    __m_count: longint;
+    __m_owner: pointer;
+    __m_kind:  longint;
+    __m_lock:  record
+       __status: sizeint;
+      __spinlock: longint;
+    end;
+  end;
+
+
+

+ 266 - 0
rtl/freertos/system.cfg

@@ -0,0 +1,266 @@
+# first, disable all
+-Sf-
+# enable required ones
+# they don't add much additional code or data
+-SfTEXTIO
+-SfFILEIO
+-SfHEAP
+
+# uncomment to enable the stuff you want to use
+
+# include full heap management into the rtl
+# -SfHEAP
+
+# include support for init final code of units into the rtl
+# -SfINITFINAL
+
+# -SfCLASSES
+# -SfEXCEPTIONS
+# -SfEXITCODE
+# -SfANSISTRINGS
+# -SfWIDESTRINGS
+# -SfTEXTIO
+# -SfCONSOLEIO
+# -SfFILEIO
+# -SfRANDOM
+# -SfVARIANTS
+# -SfOBJECTS
+# -SfDYNARRAYS
+# -SfTHREADING
+# -SfCOMMANDARGS
+# -SfPROCESSES
+# -SfSTACKCHECK
+# -SfDYNLIBS
+
+# include exit code support
+-SfEXITCODE
+
+# i386 is powerful enough to handle most object pascal constructs
+# it is only a matter of size
+#ifdef CPUI386
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPUI386
+
+# x86_64 is powerful enough to handle most object pascal constructs
+# it is only a matter of size
+#ifdef CPUX86_64
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPUX86_64
+
+# arm is powerful enough to handle most object pascal constructs
+# it is only a matter of size
+#ifdef CPUARM
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPUARM
+
+# mipsel is powerful enough to handle most object pascal constructs
+# it is only a matter of size
+#ifdef CPUMIPSEL
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPUMIPSEL
+
+# mips is powerful enough to handle most object pascal constructs
+# it is only a matter of size
+#ifdef CPUMIPS
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPUMIPS
+
+# powerpc is powerful enough to handle most object pascal constructs
+# it is only a matter of size
+#ifdef CPUPOWERPC
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPUPOWERPC
+
+# powerpc64 is powerful enough to handle most object pascal constructs
+# it is only a matter of size
+#ifdef CPUPOWERPC64
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPUPOWERPC64
+
+# does not require extra memory, neither code nor data
+# in programs not using e. g. writeln based I/O which is the common case for AVR
+#ifdef CPUAVR
+-SfOBJECTS
+-SfEXCEPTIONS
+-SfCLASSES
+-SfRTTI
+# AVR6 has normally more memory, so enable more functions
+#ifdef CPUAVR6
+-SfANSISTRINGS
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif
+#endif
+
+# Minimal set for m68k, copied from AVR above
+# does not require extra memory, neither code nor data
+# in programs not using e. g. writeln based I/O
+#ifdef CPUM68K
+-SfSOFTFPU
+-SfOBJECTS
+-SfEXCEPTIONS
+-SfCLASSES
+-SfRTTI
+-SfANSISTRINGS
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif
+
+# Minimal set for i8086, copied from AVR above
+# does not require extra memory, neither code nor data
+# in programs not using e. g. writeln based I/OR
+#ifdef CPUI8086
+-SfOBJECTS
+-SfEXCEPTIONS
+-SfCLASSES
+-SfRTTI
+-Cs2048
+-CX
+-XX
+#endif
+
+#ifdef CPURISCV32
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPURISCV32
+
+#ifdef CPURISCV64
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPURISCV64
+
+# Xtensa is powerful enough to handle most object pascal constructs
+# it is only a matter of size
+#ifdef CPUXTENSA
+-SfSOFTFPU
+-SfCLASSES
+-SfEXCEPTIONS
+-SfANSISTRINGS
+-SfRTTI
+-SfWIDESTRINGS
+-SfDYNARRAYS
+-SfTHREADING
+-SfVARIANTS
+-SfOBJECTS
+-SfCOMMANDARGS
+-SfRANDOM
+-SfRESOURCES
+#endif CPUXTENSA

+ 337 - 0
rtl/freertos/system.pp

@@ -0,0 +1,337 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2006 by Florian Klaempfl
+    member of the Free Pascal development team.
+
+    System unit for FreeRTOS systems
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+Unit System;
+
+{*****************************************************************************}
+                                    interface
+{*****************************************************************************}
+
+{$define FPC_SYSTEM_HAS_STACKTOP}
+
+{$define FPC_IS_SYSTEM}
+{$define HAS_CMDLINE}
+
+{ currently, the avr compiler cannot compile complex procedures especially dealing with int64
+  which are probably anyways rarely used on avr
+
+  meanwhile, the avr compiler can deal with them (FK) }
+{$ifdef CPUAVR}
+{ $define EXCLUDE_COMPLEX_PROCS}
+{$endif CPUAVR}
+
+{ $define USE_NOTHREADMANAGER}
+
+{$define DISABLE_NO_THREAD_MANAGER}
+{ Do not use standard memory manager }
+{$define HAS_MEMORYMANAGER}
+{$define FPC_NO_DEFAULT_HEAP}
+
+{$define FPC_ANSI_TEXTFILEREC}
+
+{ make output and stdout as well as input and stdin equal to save memory }
+{$define FPC_STDOUT_TRUE_ALIAS}
+
+{$ifdef CPUI8086}
+  {$DEFINE FPC_INCLUDE_SOFTWARE_MUL}
+  {$DEFINE FPC_INCLUDE_SOFTWARE_MOD_DIV}
+{$endif CPUI8086}
+
+{$I check.inc}
+
+{$I systemh.inc}
+
+const
+{$ifdef FPC_HAS_FEATURE_TEXTIO}
+  LineEnding = #10;
+{$endif FPC_HAS_FEATURE_TEXTIO}
+{$ifdef FPC_HAS_FEATURE_FILEIO}
+  LFNSupport = true;
+  DirectorySeparator = '/';
+  DriveSeparator = ':';
+  ExtensionSeparator = '.';
+  PathSeparator = ':';
+  AllowDirectorySeparators : set of char = ['\','/'];
+  AllowDriveSeparators : set of char = [':'];
+{$endif FPC_HAS_FEATURE_FILEIO}
+
+{ FileNameCaseSensitive and FileNameCasePreserving are defined below! }
+
+{$ifdef FPC_HAS_FEATURE_EXITCODE}
+  maxExitCode = 255;
+{$endif FPC_HAS_FEATURE_EXITCODE}
+{$ifdef FPC_HAS_FEATURE_FILEIO}
+
+  MaxPathLen = 1024; // BSDs since 1993, Solaris 10, Darwin
+  AllFilesMask = '*';
+
+  UnusedHandle    = -1;
+  StdInputHandle  = 0;
+  StdOutputHandle = 1;
+  StdErrorHandle  = 2;
+
+  FileNameCaseSensitive : boolean = true;
+  FileNameCasePreserving: boolean = true;
+{$endif FPC_HAS_FEATURE_FILEIO}
+{$ifdef FPC_HAS_FEATURE_TEXTIO}
+  CtrlZMarksEOF: boolean = false; (* #26 not considered as end of file *)
+
+  sLineBreak = LineEnding;
+  DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsCrLF;
+{$endif FPC_HAS_FEATURE_TEXTIO}
+{$ifdef CPUI8086}
+{ The value that needs to be added to the segment to move the pointer by
+  64K bytes (BP7 compatibility) }
+  SelectorInc: Word = $1000;
+{$endif CPUI8086}
+
+type
+  trtl_do_close = procedure (handle : longint);
+  trtl_do_erase = procedure (p : pchar);
+  trtl_do_rename = procedure (p1,p2 : pchar);
+  trtl_do_write = function (h: longint; addr: pointer; len: longint) : longint;
+  trtl_do_read = function (h: longint; addr: pointer; len: longint) : longint;
+  trtl_do_filepos = function (handle: longint) : longint;
+  trtl_do_seek = procedure (handle, pos: longint);
+  trtl_do_seekend = function (handle: longint):longint;
+  trtl_do_filesize = function (handle : longint) : longint;
+  trtl_do_truncate = procedure (handle, pos: longint);
+  trtl_do_open = procedure (var f;p:pchar;flags:longint);
+  trtl_do_isdevice = function (handle: longint): boolean;
+
+var
+  rtl_do_close : trtl_do_close = nil;
+  rtl_do_erase : trtl_do_erase = nil;
+  rtl_do_rename : trtl_do_rename  = nil;
+  rtl_do_write : trtl_do_write = nil;
+  rtl_do_read : trtl_do_read = nil;
+  rtl_do_filepos : trtl_do_filepos = nil;
+  rtl_do_seek : trtl_do_seek = nil;
+  rtl_do_seekend : trtl_do_seekend = nil;
+  rtl_do_filesize : trtl_do_filesize = nil;
+  rtl_do_truncate : trtl_do_truncate = nil;
+  rtl_do_open : trtl_do_open = nil;
+  rtl_do_isdevice : trtl_do_isdevice = nil;
+
+{$ifdef FPC_HAS_FEATURE_COMMANDARGS}
+var
+  argc: LongInt = 0;
+  argv: PPChar = nil;
+  envp: PPChar = nil;
+  cmdline: PChar = nil;
+{$endif FPC_HAS_FEATURE_COMMANDARGS}
+
+{$ifndef FPUNONE}
+{$ifdef FPC_HAS_FEATURE_SOFTFPU}
+
+{$define fpc_softfpu_interface}
+{$i softfpu.pp}
+{$undef fpc_softfpu_interface}
+
+{$endif FPC_HAS_FEATURE_SOFTFPU}
+
+{$endif FPUNONE}
+
+{$ifdef CPUI8086}
+var
+{ Mem[] support }
+  mem  : array[0..$7fff-1] of byte absolute $0:$0;
+  memw : array[0..($7fff div sizeof(word))-1] of word absolute $0:$0;
+  meml : array[0..($7fff div sizeof(longint))-1] of longint absolute $0:$0;
+  __stkbottom : pointer;public name '__stkbottom';
+{$endif CPUI8086}
+
+{*****************************************************************************}
+                                 implementation
+{*****************************************************************************}
+
+{$ifdef CPUI8086}
+  { used for an offset fixup for accessing the proc parameters in asm routines
+    that use nostackframe. We can't use the parameter name directly, because
+    i8086 doesn't support sp relative addressing. }
+  const
+  {$ifdef FPC_X86_CODE_FAR}
+    extra_param_offset = 2;
+  {$else FPC_X86_CODE_FAR}
+    extra_param_offset = 0;
+  {$endif FPC_X86_CODE_FAR}
+  {$if defined(FPC_X86_DATA_FAR) or defined(FPC_X86_DATA_HUGE)}
+    extra_data_offset = 2;
+  {$else}
+    extra_data_offset = 0;
+  {$endif}
+{$endif CPUI8086}
+
+{ Include ELF resources }
+
+const calculated_cmdline:Pchar=nil;
+
+{$ifndef FPUNONE}
+{$ifdef FPC_HAS_FEATURE_SOFTFPU}
+
+{$define fpc_softfpu_implementation}
+{$i softfpu.pp}
+{$undef fpc_softfpu_implementation}
+
+{ we get these functions and types from the softfpu code }
+{$define FPC_SYSTEM_HAS_float64}
+{$define FPC_SYSTEM_HAS_float32}
+{$define FPC_SYSTEM_HAS_flag}
+{$define FPC_SYSTEM_HAS_extractFloat64Frac0}
+{$define FPC_SYSTEM_HAS_extractFloat64Frac1}
+{$define FPC_SYSTEM_HAS_extractFloat64Exp}
+{$define FPC_SYSTEM_HAS_extractFloat64Frac}
+{$define FPC_SYSTEM_HAS_extractFloat64Sign}
+{$define FPC_SYSTEM_HAS_ExtractFloat32Frac}
+{$define FPC_SYSTEM_HAS_extractFloat32Exp}
+{$define FPC_SYSTEM_HAS_extractFloat32Sign}
+
+{$endif FPC_HAS_FEATURE_SOFTFPU}
+{$endif FPUNONE}
+
+{$define FPC_SYSTEM_EXIT_NO_RETURN}
+{$I system.inc}
+
+{*****************************************************************************
+                       Misc. System Dependent Functions
+*****************************************************************************}
+var
+ _stack_top: record end; external name '_stack_top';
+
+function StackTop: pointer;
+begin
+  StackTop:=@_stack_top;
+end;
+
+
+procedure haltproc;cdecl;external name '_haltproc';
+
+procedure System_exit;noreturn;external name '_haltproc';
+
+
+{$ifdef FPC_HAS_FEATURE_PROCESSES}
+function GetProcessID: SizeUInt;
+begin
+  GetProcessID := 0;
+end;
+{$endif}
+
+
+{$ifdef FPC_HAS_FEATURE_COMMANDARGS}
+Function ParamCount: Longint;
+Begin
+  Paramcount:=argc-1
+End;
+
+
+function paramstr(l: longint) : string;
+ begin
+   paramstr := '';
+ end;
+{$endif FPC_HAS_FEATURE_COMMANDARGS}
+
+const
+  QRAN_SHIFT  = 15;
+  QRAN_MASK   = ((1 shl QRAN_SHIFT) - 1);
+  QRAN_MAX    = QRAN_MASK;
+  QRAN_A      = 1664525;
+  QRAN_C      = 1013904223;
+
+{$ifdef FPC_HAS_FEATURE_RANDOM}
+procedure randomize();
+begin
+  RandSeed := 63458;
+end;
+
+procedure randomize(value: integer);
+begin
+  RandSeed := value;
+end;
+
+function random(): integer;
+begin
+  RandSeed := QRAN_A * RandSeed + QRAN_C;
+  random := (RandSeed shr 16) and QRAN_MAX;
+end;
+
+function random(value: integer): integer;
+var
+  a: integer;
+begin
+  RandSeed := QRAN_A * RandSeed + QRAN_C;
+  a := (RandSeed shr 16) and QRAN_MAX;
+  random := (a * value) shr 15;
+end;
+{$endif FPC_HAS_FEATURE_RANDOM}
+
+
+{*****************************************************************************
+                         SystemUnit Initialization
+*****************************************************************************}
+
+{$ifdef FPC_HAS_FEATURE_STACKCHECK}
+
+function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;inline;
+begin
+  result := stklen;
+end;
+
+var
+  initialstkptr : record end; external name '_stack_top';
+{$endif FPC_HAS_FEATURE_STACKCHECK}
+
+begin
+  { FPU (hard or soft) is initialized from fpc_cpuinit, which is included
+    per-cpu unconditionally.
+  SysResetFPU;
+  if not(IsLibrary) then
+    SysInitFPU;
+  }
+
+{$ifdef FPC_HAS_FEATURE_CONSOLEIO}
+  IsConsole := TRUE;
+{$endif FPC_HAS_FEATURE_CONSOLEIO}
+
+{$ifdef FPC_HAS_FEATURE_STACKCHECK}
+  StackLength := CheckInitialStkLen(initialStkLen);
+  StackBottom := @initialstkptr - StackLength;
+{$endif FPC_HAS_FEATURE_STACKCHECK}
+
+{$ifdef FPC_HAS_FEATURE_EXCEPTIONS}
+  { SysInitExceptions initializes only ExceptObjectstack and ExceptAddrStack
+    with nil since both are located in the bss section, they are zeroed at startup
+    anyways so not calling SysInitExceptions saves some bytes for simple programs. Even for threaded
+    programs this does not matter because in the main thread, the variables are located
+    in bss
+
+    SysInitExceptions;
+  }
+{$endif FPC_HAS_FEATURE_EXCEPTIONS}
+
+{$ifdef FPC_HAS_FEATURE_CONSOLEIO}
+  { Reset IO Error }
+  InOutRes:=0;
+{$endif FPC_HAS_FEATURE_CONSOLEIO}
+
+{$ifdef FPC_HAS_FEATURE_THREADING}
+  { threading }
+  //InitSystemThreads; // Empty call for embedded anyway
+{$endif FPC_HAS_FEATURE_THREADING}
+
+{$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
+//  initunicodestringmanager;
+{$endif FPC_HAS_FEATURE_WIDESTRINGS}
+end.

+ 21 - 0
rtl/freertos/systhrd.inc

@@ -0,0 +1,21 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2002 by Peter Vreman,
+    member of the Free Pascal development team.
+
+    Embedded empty threading support implementation
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+Procedure InitSystemThreads;
+begin
+end;
+
+

+ 296 - 0
rtl/freertos/sysutils.pp

@@ -0,0 +1,296 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2004 by the Free Pascal development team
+
+    Sysutils unit for the FreeRTOS target.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+{$MODE objfpc}
+{$MODESWITCH OUT}
+{$H+}
+unit sysutils;
+
+interface
+
+{$DEFINE HAS_SLEEP}
+{$DEFINE HAS_OSERROR}
+{$modeswitch typehelpers}
+{$modeswitch advancedrecords}
+
+{ used OS file system APIs use ansistring }
+{$define SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
+{ OS has an ansistring/single byte environment variable API }
+{$define SYSUTILS_HAS_ANSISTR_ENVVAR_IMPL}
+
+  { Include platform independent interface part }
+  {$i sysutilh.inc}
+
+  var
+    SleepHandler: procedure(ms: cardinal) = nil;
+
+implementation
+
+uses
+  sysconst,heapmgr;
+
+  { Include platform independent implementation part }
+  {$i sysutils.inc}
+
+{****************************************************************************
+                              File Functions
+****************************************************************************}
+function FileOpen(const FileName: RawByteString; Mode: Integer): THandle;
+begin
+  result := -1;
+end;
+
+
+function FileGetDate(Handle: THandle) : TOSTimestamp;
+begin
+  result := -1;
+end;
+
+
+function FileSetDate(Handle: THandle; Age: TOSTimestamp) : Longint;
+begin
+  result := -1;
+end;
+
+
+function FileCreate(const FileName: RawByteString) : THandle;
+begin
+  result := -1;
+end;
+
+
+function FileCreate(const FileName: RawByteString; Rights: integer): THandle;
+begin
+  result := -1;
+end;
+
+
+function FileCreate(const FileName: RawByteString; ShareMode: integer; rights : integer): THandle;
+begin
+  result := -1;
+end;
+
+
+function FileRead(Handle: THandle; Out Buffer; Count: LongInt): LongInt;
+begin
+  result := -1;
+end;
+
+
+function FileWrite(Handle: THandle; const Buffer; Count: LongInt): LongInt;
+begin
+  result := -1;
+end;
+
+
+function FileSeek(Handle: THandle; FOffset, Origin: LongInt) : LongInt;
+begin
+  result := -1;
+end;
+
+function FileSeek(Handle: THandle; FOffset: Int64; Origin: Longint): Int64;
+begin
+  result := -1;
+end;
+
+
+procedure FileClose(Handle: THandle);
+begin
+end;
+
+
+function FileTruncate(Handle: THandle; Size: Int64): Boolean;
+begin
+  result := false;
+end;
+
+
+function DeleteFile(const FileName: RawByteString) : Boolean;
+begin
+  result := false;
+end;
+
+
+function RenameFile(const OldName, NewName: RawByteString): Boolean;
+begin
+  result := false;
+end;
+
+
+Function FileAge (Const FileName : RawByteString): TOSTimestamp;
+begin
+  result := -1;
+end;
+
+
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
+Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
+Begin
+  result := false;
+end;
+
+
+Function InternalFindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TAbstractSearchRec; var Name: RawByteString) : Longint;
+begin
+  result := -1;
+end;
+
+
+Function InternalFindNext (var Rslt : TAbstractSearchRec; var Name : RawByteString) : Longint;
+begin
+  result := -1;
+end;
+
+
+Procedure InternalFindClose(var Handle: THandle);
+begin
+end;
+
+
+Function FileGetAttr (Const FileName : RawByteString) : Longint;
+begin
+  result := -1;
+end;
+
+
+Function FileSetAttr (Const Filename : RawByteString; Attr: longint) : Longint;
+begin
+  result := -1;
+end;
+
+
+{****************************************************************************
+                              Disk Functions
+****************************************************************************}
+
+Procedure AddDisk(const path:string);
+begin
+end;
+
+
+Function DiskFree(Drive: Byte): int64;
+Begin
+  result := -1;
+End;
+
+
+Function DiskSize(Drive: Byte): int64;
+Begin
+  result := -1;
+End;
+
+
+function DirectoryExists(const Directory: RawByteString; FollowLink : Boolean): Boolean;
+begin
+  result := false;
+end;
+
+
+{****************************************************************************
+                              Misc Functions
+****************************************************************************}
+
+procedure sysBeep;
+begin
+end;
+
+
+Procedure Sleep(Milliseconds : Cardinal);
+begin
+  if assigned(SleepHandler) then
+    SleepHandler(Milliseconds);
+end;
+
+Function GetLastOSError : Integer;
+begin
+  Result:=-1;
+end;
+
+
+{****************************************************************************
+                              Locale Functions
+****************************************************************************}
+
+Procedure GetLocalTime(var SystemTime: TSystemTime);
+begin
+end ;
+
+
+function SysErrorMessage(ErrorCode: Integer): String;
+begin
+{  Result:=StrError(ErrorCode);}
+  result := '';
+end;
+
+{****************************************************************************
+                              OS utility functions
+****************************************************************************}
+
+Function GetEnvironmentVariable(Const EnvVar : String) : String;
+begin
+  result := '';
+end;
+
+
+Function GetEnvironmentVariableCount : Integer;
+begin
+  result := -1;
+end;
+
+
+Function GetEnvironmentString(Index : Integer) : {$ifdef FPC_RTL_UNICODE}UnicodeString{$else}AnsiString{$endif};
+begin
+  result := '';
+end;
+
+
+function ExecuteProcess (const Path: RawByteString; const ComLine: RawByteString;Flags:TExecuteFlags=[]): integer;
+begin
+  result := -1;
+end;
+
+function ExecuteProcess (const Path: RawByteString;
+                               const ComLine: array of RawByteString;Flags:TExecuteFlags=[]): integer;
+begin
+  result := -1;
+end;
+
+function ExecuteProcess (const Path: UnicodeString; const ComLine: UnicodeString;Flags:TExecuteFlags=[]): integer;
+begin
+  result := -1;
+end;
+
+function ExecuteProcess (const Path: UnicodeString;
+                               const ComLine: array of UnicodeString;Flags:TExecuteFlags=[]): integer;
+begin
+  result := -1;
+end;
+
+
+{****************************************************************************
+                              Initialization code
+****************************************************************************}
+
+Initialization
+  InitExceptions;
+Finalization
+  FreeTerminateProcs;
+  DoneExceptions;
+end.

+ 111 - 0
rtl/freertos/tthread.inc

@@ -0,0 +1,111 @@
+{
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 1999-2002 by the Free Pascal development team
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+{****************************************************************************}
+{*                             TThread                                      *}
+{****************************************************************************}
+
+{$WARNING This file is only a stub, and will not work!}
+
+const
+ ThreadCount: longint = 0;
+
+(* Implementation of exported functions *)
+
+procedure AddThread (T: TThread);
+begin
+ Inc (ThreadCount);
+end;
+
+
+procedure RemoveThread (T: TThread);
+begin
+ Dec (ThreadCount);
+end;
+
+
+procedure TThread.CallOnTerminate;
+begin
+ FOnTerminate (Self);
+end;
+
+
+function TThread.GetPriority: TThreadPriority;
+begin
+  result := tpNormal;
+end;
+
+
+procedure TThread.SetPriority(Value: TThreadPriority);
+begin
+
+end;
+
+
+procedure TThread.SetSuspended(Value: Boolean);
+begin
+ if Value <> FSuspended then
+ begin
+  if Value then Suspend else Resume;
+ end;
+end;
+
+
+procedure TThread.DoTerminate;
+begin
+ if Assigned (FOnTerminate) then Synchronize (@CallOnTerminate);
+end;
+
+
+procedure TThread.SysCreate(CreateSuspended: Boolean;
+                            const StackSize: SizeUInt);
+var
+  Flags: cardinal;
+begin
+  AddThread (Self);
+end;
+
+
+procedure TThread.SysDestroy;
+begin
+ if not FFinished and not Suspended then
+ begin
+  Terminate;
+  WaitFor;
+ end;
+end;
+
+procedure TThread.Resume;
+begin
+
+end;
+
+
+procedure TThread.Suspend;
+begin
+
+end;
+
+
+procedure TThread.Terminate;
+begin
+ FTerminated := true;
+end;
+
+
+function TThread.WaitFor: Integer;
+begin
+  result := -1;
+end;
+
+

+ 58 - 0
rtl/freertos/xtensa/esp32.pp

@@ -0,0 +1,58 @@
+{******************************************************************************
+Startup code for xtensa-esp32 using idf
+
+******************************************************************************}
+unit esp32;
+
+{$goto on}
+{$macro on}
+
+  interface
+
+  implementation
+
+    uses
+      consoleio,heapmgr;
+
+    var
+      _stack_top: record end; public name '_stack_top';
+
+    procedure PASCALMAIN; external name 'PASCALMAIN';
+    
+    procedure esp_deep_sleep_start;external;
+    procedure putchar(c : char);external;
+    function getchar : char;external;
+    
+    procedure _FPC_haltproc; public name '_haltproc';noreturn;
+      begin
+        while true do
+           esp_deep_sleep_start;
+      end;
+      
+
+    procedure app_main;public name 'app_main';noreturn;
+      begin
+        PASCALMAIN;        
+        _FPC_haltproc;
+      end;
+
+    function WriteChar(ACh: char; AUserData: pointer): boolean;
+      begin
+        WriteChar:=true;
+        putchar(ACh);
+      end;
+
+
+    function ReadChar(var ACh: char; AUserData: pointer): boolean;
+      begin
+        ReadChar:=true;
+        ACh:=getchar;
+      end;
+           
+begin
+  OpenIO(Input, @WriteChar, @ReadChar, fmInput, nil);
+  OpenIO(Output, @WriteChar, @ReadChar, fmOutput, nil);
+  OpenIO(ErrOutput, @WriteChar, @ReadChar, fmOutput, nil);
+  OpenIO(StdOut, @WriteChar, @ReadChar, fmOutput, nil);
+  OpenIO(StdErr, @WriteChar, @ReadChar, fmOutput, nil);
+end.

+ 11 - 7
rtl/inc/heaph.inc

@@ -56,20 +56,24 @@ procedure SetMemoryManager(const MemMgr: TMemoryManager);
 function  IsMemoryManagerSet: Boolean;
 
 { Variables }
-var
-  ReturnNilIfGrowHeapFails : boolean;
-{$ifdef EMBEDDED}
-  {$define FPC_NO_DEFAULT_MEMORYMANAGER}
-{$endif EMBEDDED}
-
-{$ifndef FPC_NO_DEFAULT_MEMORYMANAGER}
 const
   MaxKeptOSChunks: DWord = 4; { if more than MaxKeptOSChunks are free, the heap manager will release
                               chunks back to the OS }
   growheapsizesmall : ptruint=32*1024; { fixed-size small blocks will grow with 32k }
   growheapsize1 : ptruint=256*1024;  { < 256k will grow with 256k }
   growheapsize2 : ptruint=1024*1024; { > 256k will grow with 1m }
+var
+  ReturnNilIfGrowHeapFails : boolean;
+
+{$ifdef EMBEDDED}
+  {$define FPC_NO_DEFAULT_MEMORYMANAGER}
+{$endif EMBEDDED}
+
+{$ifdef FREERTOS}
+  {$define FPC_NO_DEFAULT_MEMORYMANAGER}
+{$endif FREERTOS}
 
+{$ifndef FPC_NO_DEFAULT_MEMORYMANAGER}
 { Default MemoryManager functions }
 Function  SysGetmem(Size:ptruint):Pointer;
 Function  SysFreemem(p:pointer):ptruint;

+ 4 - 2
rtl/inc/systemh.inc

@@ -1606,10 +1606,12 @@ Procedure Halt;{$ifdef SYSTEMINLINE}inline;{$endif}noreturn;
 Procedure SysInitExceptions;
 {$endif FPC_HAS_FEATURE_EXCEPTIONS}
 {$ifdef FPC_HAS_FEATURE_CONSOLEIO}
-{$ifndef EMBEDDED}
+
+{$if not(defined(EMBEDDED)) and not(defined(FREERTOS))}
 procedure SysInitStdIO;
 procedure SysFlushStdIO;
-{$endif EMBEDDED}
+{$endif not(defined(EMBEDDED)) and not(defined(FREERTOS))}
+
 {$endif FPC_HAS_FEATURE_CONSOLEIO}
 {$ifndef FPUNONE}
 Procedure SysResetFPU;

+ 1 - 1
utils/fpcm/fpcmmain.pp

@@ -125,7 +125,7 @@ interface
         'palmos','macos','darwin','emx','watcom','morphos','netwlibc',
         'win64','wince','gba','nds','embedded','symbian','nativent',
         'iphonesim', 'wii', 'aix', 'java', 'android', 'msdos', 'aros',
-        'dragonfly', 'win16', 'wasm', 'FreeRTOS'
+        'dragonfly', 'win16', 'wasm', 'freertos'
       );
 
       OSSuffix : array[TOS] of string=(

+ 32 - 13
utils/fpcm/get_revision.sh

@@ -14,18 +14,37 @@ export LANG
 
 tmpfiles=
 
-for f in $important_sources ; do
-  tmpfile=.tmp.$f
-  tmpfiles="$tmpfiles $tmpfile"
-  svn info $f > $tmpfile
-done
+# git repository?
+if [ -d ../../.git ] ; then
+  USEGIT=1
+  echo Using git repository
+  # we just look for the last commit date here
+  for f in $important_sources ; do
+    tmpfile=.tmp.$f
+    tmpfiles="$tmpfiles $tmpfile"
+    echo "Change information for $f: "
+    git log -1 --pretty="format:%ci %h" $f > $tmpfile
+    echo >> $tmpfile
+    cat $tmpfile
+  done
+  git_date=`cat $tmpfiles | sort -n | tail -1 | gawk '{ print $1 }'`
+
+  git_hash=`cat $tmpfiles | sort -n | tail -1 | gawk '{ print $4 }'`
+  
+  echo "Last date is $git_date, hash is $git_hash"
+  echo "'$git_date hash $git_hash'" > revision.inc
+else
+  for f in $important_sources ; do
+    tmpfile=.tmp.$f
+    tmpfiles="$tmpfiles $tmpfile"
+    svn info $f > $tmpfile
+  done
+
+  # echo "svn_info is $svn_info"
+  svn_date=`gawk '/Last Changed Date: / {print $4 }' $tmpfiles | sort -n | tail -1`
+  svn_rev=`gawk '/Last Changed Rev: / {print $4 }' $tmpfiles | sort -n | tail -1`
+  echo "for files $important_sources, date is $svn_date, rev is $svn_rev"
+  echo "'$svn_date rev $svn_rev'" > revision.inc
+fi
 
-# echo "svn_info is $svn_info"
-svn_date=`gawk '/Last Changed Date: / {print $4 }' $tmpfiles | sort -n | tail -1`
-svn_rev=`gawk '/Last Changed Rev: / {print $4 }' $tmpfiles | sort -n | tail -1`
-echo "for files $important_sources, date is $svn_date, rev is $svn_rev"
-echo "'$svn_date rev $svn_rev'" > revision.inc
 rm -Rf $tmpfiles
-
-
-

+ 1 - 1
utils/fpcm/revision.inc

@@ -1 +1 @@
-'2020-03-20 rev 44319'
+'2020-03-29 rev 44400'