فهرست منبع

* synchronized with trunk

git-svn-id: branches/wasm@46529 -
nickysn 5 سال پیش
والد
کامیت
c1197ddb90

+ 11 - 6
compiler/Makefile

@@ -4732,10 +4732,11 @@ $(PPC_TARGETS):
 	$(MAKE) PPC_TARGET=$@ CPU_UNITDIR=$@ compiler
 	$(MAKE) PPC_TARGET=$@ CPU_UNITDIR=$@ compiler
 $(INSTALL_TARGETS):
 $(INSTALL_TARGETS):
 	$(MAKE) PPC_TARGET=$(subst _exe_install,,$@) CPU_UNITDIR=$(subst _exe_install,,$@) compiler
 	$(MAKE) PPC_TARGET=$(subst _exe_install,,$@) CPU_UNITDIR=$(subst _exe_install,,$@) compiler
-		$(MAKE) PPC_TARGET=$(subst _exe_install,,$@) CPU_UNITDIR=$(subst _exe_install,,$@) exeinstall
+	$(MAKE) PPC_TARGET=$(subst _exe_install,,$@) CPU_UNITDIR=$(subst _exe_install,,$@) exeinstall
 $(SYMLINKINSTALL_TARGETS):
 $(SYMLINKINSTALL_TARGETS):
 	$(MAKE) PPC_TARGET=$(subst _symlink_install,,$@) CPU_UNITDIR=$(subst _symlink_install,,$@) compiler
 	$(MAKE) PPC_TARGET=$(subst _symlink_install,,$@) CPU_UNITDIR=$(subst _symlink_install,,$@) compiler
-		$(MAKE) PPC_TARGET=$(subst _symlink_install,,$@) CPU_UNITDIR=$(subst _symlink_install,,$@) installsymlink
+	$(ECHO) "Compiler $(subst _symlink_install,,$@) finished, starting installsymlink"
+	$(MAKE) PPC_TARGET=$(subst _symlink_install,,$@) CPU_UNITDIR=$(subst _symlink_install,,$@) installsymlink
 alltargets: $(ALLTARGETS)
 alltargets: $(ALLTARGETS)
 .PHONY: all compiler echotime ppuclean execlean clean distclean
 .PHONY: all compiler echotime ppuclean execlean clean distclean
 all: compiler $(addsuffix _all,$(TARGET_DIRS))
 all: compiler $(addsuffix _all,$(TARGET_DIRS))
@@ -5002,12 +5003,14 @@ extcycle:
 	$(MAKE) cycle OPT="$(OPT) -n -OG2p3 -glttt -CRriot -dEXTDEBUG" ALLOW_WARNINGS=1
 	$(MAKE) cycle OPT="$(OPT) -n -OG2p3 -glttt -CRriot -dEXTDEBUG" ALLOW_WARNINGS=1
 cvstest:
 cvstest:
 	$(MAKE) cycle 'LOCALOPT=-n -Se' 'RTLOPT=-n -Se'
 	$(MAKE) cycle 'LOCALOPT=-n -Se' 'RTLOPT=-n -Se'
+ifeq ($(findstring -dFPC_SOFT_FPUX80,$(OPT)),)
 ifeq ($(OS_SOURCE),win64)
 ifeq ($(OS_SOURCE),win64)
   EXCLUDE_80BIT_TARGETS=1
   EXCLUDE_80BIT_TARGETS=1
 endif
 endif
 ifneq ($(findstring $(CPU_SOURCE),aarch64 arm avr jvm m68k mips mipsel powerpc powerpc64 sparc sparc64 riscv32 riscv64 xtensa),)
 ifneq ($(findstring $(CPU_SOURCE),aarch64 arm avr jvm m68k mips mipsel powerpc powerpc64 sparc sparc64 riscv32 riscv64 xtensa),)
   EXCLUDE_80BIT_TARGETS=1
   EXCLUDE_80BIT_TARGETS=1
 endif
 endif
+endif
 full: fullcycle
 full: fullcycle
 fullcycle:
 fullcycle:
 	$(MAKE) distclean
 	$(MAKE) distclean
@@ -5048,10 +5051,11 @@ endif
 endif
 endif
 fullinstall:
 fullinstall:
 ifndef EXCLUDE_80BIT_TARGETS
 ifndef EXCLUDE_80BIT_TARGETS
-	$(MAKE) $(addsuffix _exe_install,$(filter-out $(PPC_TARGET),$(CYCLETARGETS))) $(addsuffix _all,$(TARGET_DIRS))
+	$(MAKE) $(addsuffix _exe_install,$(filter-out $(PPC_TARGET),$(CYCLETARGETS)))
 else
 else
-	$(MAKE) $(addsuffix _exe_install,$(filter-out i8086,$(filter-out i386,$(filter-out $(PPC_TARGET),$(CYCLETARGETS))))) $(addsuffix _all,$(TARGET_DIRS))
+	$(MAKE) $(addsuffix _exe_install,$(filter-out i8086,$(filter-out i386,$(filter-out $(PPC_TARGET),$(CYCLETARGETS)))))
 endif
 endif
+	$(MAKE) $(addsuffix _all,$(TARGET_DIRS))
 	$(MAKE) $(addsuffix _install,$(TARGET_DIRS))
 	$(MAKE) $(addsuffix _install,$(TARGET_DIRS))
 auxfilesinstall:
 auxfilesinstall:
 ifndef CROSSINSTALL
 ifndef CROSSINSTALL
@@ -5068,12 +5072,13 @@ ifndef FPC
 else
 else
 	$(MAKE) quickinstall auxfilesinstall
 	$(MAKE) quickinstall auxfilesinstall
 endif
 endif
-installsymlink: install
+installsymlink: exeinstall
 ifneq ($(PPCCPULOCATION),$(INSTALL_BINDIR))
 ifneq ($(PPCCPULOCATION),$(INSTALL_BINDIR))
 	$(MKDIR) $(INSTALL_BINDIR)
 	$(MKDIR) $(INSTALL_BINDIR)
 	ln -sf $(INSTALL_BASEDIR)/$(EXENAME) $(INSTALL_BINDIR)/$(EXENAME)
 	ln -sf $(INSTALL_BASEDIR)/$(EXENAME) $(INSTALL_BINDIR)/$(EXENAME)
 endif
 endif
-fullinstallsymlink: fullinstall
+fullinstallsymlink:
+	$(ECHO) "Fullinstall finished, starting XXX_symlink_install"
 ifndef EXCLUDE_80BIT_TARGETS
 ifndef EXCLUDE_80BIT_TARGETS
 	$(MAKE) $(addsuffix _symlink_install,$(filter-out $(PPC_TARGET),$(CYCLETARGETS)))
 	$(MAKE) $(addsuffix _symlink_install,$(filter-out $(PPC_TARGET),$(CYCLETARGETS)))
 else
 else

+ 14 - 9
compiler/Makefile.fpc

@@ -619,15 +619,16 @@ SYMLINKINSTALL_TARGETS=$(addsuffix _symlink_install,$(sort $(CYCLETARGETS) $(PPC
 .PHONY: $(PPC_TARGETS) $(INSTALL_TARGETS)$(SYMLINKINSTALL_TARGETS)
 .PHONY: $(PPC_TARGETS) $(INSTALL_TARGETS)$(SYMLINKINSTALL_TARGETS)
 
 
 $(PPC_TARGETS):
 $(PPC_TARGETS):
-        $(MAKE) PPC_TARGET=$@ CPU_UNITDIR=$@ compiler
+	$(MAKE) PPC_TARGET=$@ CPU_UNITDIR=$@ compiler
 
 
 $(INSTALL_TARGETS):
 $(INSTALL_TARGETS):
-        $(MAKE) PPC_TARGET=$(subst _exe_install,,$@) CPU_UNITDIR=$(subst _exe_install,,$@) compiler
-		$(MAKE) PPC_TARGET=$(subst _exe_install,,$@) CPU_UNITDIR=$(subst _exe_install,,$@) exeinstall
+	$(MAKE) PPC_TARGET=$(subst _exe_install,,$@) CPU_UNITDIR=$(subst _exe_install,,$@) compiler
+	$(MAKE) PPC_TARGET=$(subst _exe_install,,$@) CPU_UNITDIR=$(subst _exe_install,,$@) exeinstall
 
 
 $(SYMLINKINSTALL_TARGETS):
 $(SYMLINKINSTALL_TARGETS):
-        $(MAKE) PPC_TARGET=$(subst _symlink_install,,$@) CPU_UNITDIR=$(subst _symlink_install,,$@) compiler
-		$(MAKE) PPC_TARGET=$(subst _symlink_install,,$@) CPU_UNITDIR=$(subst _symlink_install,,$@) installsymlink
+	$(MAKE) PPC_TARGET=$(subst _symlink_install,,$@) CPU_UNITDIR=$(subst _symlink_install,,$@) compiler
+	$(ECHO) "Compiler $(subst _symlink_install,,$@) finished, starting installsymlink"
+	$(MAKE) PPC_TARGET=$(subst _symlink_install,,$@) CPU_UNITDIR=$(subst _symlink_install,,$@) installsymlink
 
 
 alltargets: $(ALLTARGETS)
 alltargets: $(ALLTARGETS)
 
 
@@ -1028,6 +1029,7 @@ cvstest:
 # This is also the case for other CPUs that don't support
 # This is also the case for other CPUs that don't support
 # 80bit real type.
 # 80bit real type.
 
 
+ifeq ($(findstring -dFPC_SOFT_FPUX80,$(OPT)),)
 ifeq ($(OS_SOURCE),win64)
 ifeq ($(OS_SOURCE),win64)
   EXCLUDE_80BIT_TARGETS=1
   EXCLUDE_80BIT_TARGETS=1
 endif
 endif
@@ -1035,6 +1037,7 @@ endif
 ifneq ($(findstring $(CPU_SOURCE),aarch64 arm avr jvm m68k mips mipsel powerpc powerpc64 sparc sparc64 riscv32 riscv64 xtensa),)
 ifneq ($(findstring $(CPU_SOURCE),aarch64 arm avr jvm m68k mips mipsel powerpc powerpc64 sparc sparc64 riscv32 riscv64 xtensa),)
   EXCLUDE_80BIT_TARGETS=1
   EXCLUDE_80BIT_TARGETS=1
 endif
 endif
+endif
 
 
 full: fullcycle
 full: fullcycle
 
 
@@ -1097,10 +1100,11 @@ endif
 
 
 fullinstall:
 fullinstall:
 ifndef EXCLUDE_80BIT_TARGETS
 ifndef EXCLUDE_80BIT_TARGETS
-        $(MAKE) $(addsuffix _exe_install,$(filter-out $(PPC_TARGET),$(CYCLETARGETS))) $(addsuffix _all,$(TARGET_DIRS))
+        $(MAKE) $(addsuffix _exe_install,$(filter-out $(PPC_TARGET),$(CYCLETARGETS)))
 else
 else
-        $(MAKE) $(addsuffix _exe_install,$(filter-out i8086,$(filter-out i386,$(filter-out $(PPC_TARGET),$(CYCLETARGETS))))) $(addsuffix _all,$(TARGET_DIRS))
+        $(MAKE) $(addsuffix _exe_install,$(filter-out i8086,$(filter-out i386,$(filter-out $(PPC_TARGET),$(CYCLETARGETS)))))
 endif
 endif
+        $(MAKE) $(addsuffix _all,$(TARGET_DIRS))
         $(MAKE) $(addsuffix _install,$(TARGET_DIRS))
         $(MAKE) $(addsuffix _install,$(TARGET_DIRS))
         
         
 auxfilesinstall:
 auxfilesinstall:
@@ -1124,13 +1128,14 @@ endif
 
 
 # This also installs a link from bin to the actual executable.
 # This also installs a link from bin to the actual executable.
 # The .deb does that later.
 # The .deb does that later.
-installsymlink: install
+installsymlink: exeinstall
 ifneq ($(PPCCPULOCATION),$(INSTALL_BINDIR))
 ifneq ($(PPCCPULOCATION),$(INSTALL_BINDIR))
         $(MKDIR) $(INSTALL_BINDIR)
         $(MKDIR) $(INSTALL_BINDIR)
         ln -sf $(INSTALL_BASEDIR)/$(EXENAME) $(INSTALL_BINDIR)/$(EXENAME)
         ln -sf $(INSTALL_BASEDIR)/$(EXENAME) $(INSTALL_BINDIR)/$(EXENAME)
 endif
 endif
 
 
-fullinstallsymlink: fullinstall
+fullinstallsymlink:
+	$(ECHO) "Fullinstall finished, starting XXX_symlink_install"
 ifndef EXCLUDE_80BIT_TARGETS
 ifndef EXCLUDE_80BIT_TARGETS
         $(MAKE) $(addsuffix _symlink_install,$(filter-out $(PPC_TARGET),$(CYCLETARGETS)))
         $(MAKE) $(addsuffix _symlink_install,$(filter-out $(PPC_TARGET),$(CYCLETARGETS)))
 else
 else

+ 20 - 1
compiler/fpccrc.pas

@@ -26,7 +26,9 @@ Unit fpccrc;
 Interface
 Interface
 
 
 Function UpdateCrc32(InitCrc:cardinal;const InBuf;InLen:integer):cardinal;
 Function UpdateCrc32(InitCrc:cardinal;const InBuf;InLen:integer):cardinal;
-
+{ If needed trims the string to maxlen, adding at the end the CRC32 of discarded chars.
+  The resulting string is guaranteed to be not longer than maxlen. }
+function TrimStrCRC32(const s: ansistring; maxlen: longint): ansistring;
 
 
 Implementation
 Implementation
 
 
@@ -73,4 +75,21 @@ begin
 end;
 end;
 
 
 
 
+function TrimStrCRC32(const s: ansistring; maxlen: longint): ansistring;
+var
+  crc: DWord;
+  len: longint;
+begin
+  len:=length(s);
+  if (len<=maxlen) or (len<12) then
+    result:=s
+  else
+   begin
+     dec(maxlen,11);
+     crc:=0;
+     crc:=UpdateCrc32(crc,s[maxlen+1],len-maxlen);
+     result:=copy(s,1,maxlen)+'$CRC'+hexstr(crc,8);
+   end;
+end;
+
 end.
 end.

+ 4 - 1
compiler/globals.pas

@@ -254,7 +254,10 @@ interface
        { specified with -FW and -Fw }
        { specified with -FW and -Fw }
        wpofeedbackinput,
        wpofeedbackinput,
        wpofeedbackoutput : TPathStr;
        wpofeedbackoutput : TPathStr;
-
+{$ifdef XTENSA}
+       { specified with -Ff }
+       idfpath           : TPathStr;
+{$endif XTENSA}
        { external assembler extra option }
        { external assembler extra option }
        asmextraopt       : string;
        asmextraopt       : string;
 
 

+ 1 - 1
compiler/msg/errore.msg

@@ -3961,7 +3961,7 @@ A*2CV<x>_Set section threadvar model to <x>
 **2FD<x>_Set the directory where to search for compiler utilities
 **2FD<x>_Set the directory where to search for compiler utilities
 **2Fe<x>_Redirect error output to <x>
 **2Fe<x>_Redirect error output to <x>
 **2FE<x>_Set exe/unit output path to <x>
 **2FE<x>_Set exe/unit output path to <x>
-**2Ff<x>_Add <x> to framework path (Darwin only)
+**2Ff<x>_Add <x> to framework path (Darwin only), or set IDF path to <x> (Xtensa-FreeRTOS)
 **2FF_Use fpcres as RC to RES compiler instead of windres or gorc
 **2FF_Use fpcres as RC to RES compiler instead of windres or gorc
 **2Fi<x>_Add <x> to include path
 **2Fi<x>_Add <x> to include path
 **2Fl<x>_Add <x> to library path
 **2Fl<x>_Add <x> to library path

+ 1 - 1
compiler/msgidx.inc

@@ -1126,7 +1126,7 @@ const
   option_info=11024;
   option_info=11024;
   option_help_pages=11025;
   option_help_pages=11025;
 
 
-  MsgTxtSize = 85690;
+  MsgTxtSize = 85732;
 
 
   MsgIdxMax : array[1..20] of longint=(
   MsgIdxMax : array[1..20] of longint=(
     28,106,356,129,99,63,143,36,223,68,
     28,106,356,129,99,63,143,36,223,68,

+ 131 - 130
compiler/msgtxt.inc

@@ -1592,164 +1592,165 @@ const msgtxt : array[0..000357,1..240] of char=(
   '**2FD<x>_Set the directory where to search for compiler utilities'#010+
   '**2FD<x>_Set the directory where to search for compiler utilities'#010+
   '**2Fe<x>_Redirect error output to <x>'#010+
   '**2Fe<x>_Redirect error output to <x>'#010+
   '**2FE<x>_Set exe/unit output path to <x>'#010+
   '**2FE<x>_Set exe/unit output path to <x>'#010+
-  '**2Ff<x>_Add ','<x> to framework path (Darwin only)'#010+
+  '**2Ff<x>_Add ','<x> to framework path (Darwin only), or set IDF path to'+
+  ' <x> (Xtensa-FreeRTOS)'#010+
   '**2FF_Use fpcres as RC to RES compiler instead of windres or gorc'#010+
   '**2FF_Use fpcres as RC to RES compiler instead of windres or gorc'#010+
   '**2Fi<x>_Add <x> to include path'#010+
   '**2Fi<x>_Add <x> to include path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
-  '**2FL<x>_Use <x> as dynamic linker'#010+
-  '**2Fm<x>_Load unicode conversion tabl','e from <x>.txt in the compiler '+
-  'dir'#010+
+  '**2FL<x>_Use <x> as dynamic li','nker'#010+
+  '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
+  'r'#010+
   '**2FM<x>_Set the directory where to search for unicode binary files'#010+
   '**2FM<x>_Set the directory where to search for unicode binary files'#010+
   '**2FN<x>_Add <x> to list of default unit scopes (namespaces)'#010+
   '**2FN<x>_Add <x> to list of default unit scopes (namespaces)'#010+
   '**2Fo<x>_Add <x> to object path'#010+
   '**2Fo<x>_Add <x> to object path'#010+
-  '**2Fr<x>_Load error message file <x>'#010+
-  '**2FR<x','>_Set resource (.res) linker to <x>'#010+
+  '**','2Fr<x>_Load error message file <x>'#010+
+  '**2FR<x>_Set resource (.res) linker to <x>'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
   '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
   '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
   '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
   '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
-  '**2Fw<x>_Load previously stored whole-program optimiza','tion feedback '+
+  '**2Fw<x>_Loa','d previously stored whole-program optimization feedback '+
   'from <x>'#010+
   'from <x>'#010+
   '*g1g_Generate debug information (default format for target)'#010+
   '*g1g_Generate debug information (default format for target)'#010+
   '*g2gc_Generate checks for pointers (experimental, only available on so'+
   '*g2gc_Generate checks for pointers (experimental, only available on so'+
   'me targets, might generate false positive)'#010+
   'me targets, might generate false positive)'#010+
-  '*g2gh_Use heaptrace unit (for memory leak/co','rruption debugging)'#010+
+  '*g','2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
   '*g2gl_Use line info unit (show more info with backtraces)'#010+
   '*g2gl_Use line info unit (show more info with backtraces)'#010+
   '*g2gm_Generate Microsoft CodeView debug information (experimental)'#010+
   '*g2gm_Generate Microsoft CodeView debug information (experimental)'#010+
   '*g2go<x>_Set debug information options'#010+
   '*g2go<x>_Set debug information options'#010+
-  '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug informatio','n (b'+
+  '*g3godwarfsets','_ Enable DWARF '#039'set'#039' type debug information (b'+
   'reaks gdb < 6.5)'#010+
   'reaks gdb < 6.5)'#010+
   '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
   '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
   #010+
   #010+
   '*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+
   '*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+
   'ame'#010+
   'ame'#010+
-  '*g3godwarfcpp_ Simulate C++ debug information in DWARF'#010+
-  '*g3godwarfomflinnum','_ Generate line number information in OMF LINNUM '+
-  'records in MS LINK format in addition to the DWARF debug information ('+
-  'Open Watcom Debugger/Linker compatibility)'#010+
-  '*g2gp_Preserve case in stabs symbol names'#010+
-  '*g2gs_Generate Stabs debug informati','on'#010+
+  '*g3godwarfcpp_ Simulate C++ debu','g information in DWARF'#010+
+  '*g3godwarfomflinnum_ Generate line number information in OMF LINNUM re'+
+  'cords in MS LINK format in addition to the DWARF debug information (Op'+
+  'en Watcom Debugger/Linker compatibility)'#010+
+  '*g2gp_Preserve case in stabs symbol ','names'#010+
+  '*g2gs_Generate Stabs debug information'#010+
   '*g2gt_Trash local variables (to detect uninitialized uses; multiple '#039+
   '*g2gt_Trash local variables (to detect uninitialized uses; multiple '#039+
   't'#039' changes the trashing value)'#010+
   't'#039' changes the trashing value)'#010+
   '*g2gv_Generates programs traceable with Valgrind'#010+
   '*g2gv_Generates programs traceable with Valgrind'#010+
-  '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
-  '*g2gw2_Generate DWARFv2 debug in','formation'#010+
+  '*g2gw_Generate DWARFv2 debug information (same',' as -gw2)'#010+
+  '*g2gw2_Generate DWARFv2 debug information'#010+
   '*g2gw3_Generate DWARFv3 debug information'#010+
   '*g2gw3_Generate DWARFv3 debug information'#010+
   '*g2gw4_Generate DWARFv4 debug information (experimental)'#010+
   '*g2gw4_Generate DWARFv4 debug information (experimental)'#010+
   '**1i_Information'#010+
   '**1i_Information'#010+
   '**2iD_Return compiler date'#010+
   '**2iD_Return compiler date'#010+
   '**2iSO_Return compiler OS'#010+
   '**2iSO_Return compiler OS'#010+
-  '**2iSP_Return compiler host processor'#010+
-  '**2iTO_Return target OS',#010+
+  '**2iSP_Return compi','ler host processor'#010+
+  '**2iTO_Return target OS'#010+
   '**2iTP_Return target processor'#010+
   '**2iTP_Return target processor'#010+
   '**2iV_Return short compiler version'#010+
   '**2iV_Return short compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2ia_Return list of supported ABI targets'#010+
   '**2ia_Return list of supported ABI targets'#010+
   '**2ib_Return the used code generation backend type'#010+
   '**2ib_Return the used code generation backend type'#010+
-  '**2ic_Return list of supported CPU instruct','ion sets'#010+
+  '*','*2ic_Return list of supported CPU instruction sets'#010+
   '**2if_Return list of supported FPU instruction sets'#010+
   '**2if_Return list of supported FPU instruction sets'#010+
   '**2ii_Return list of supported inline assembler modes'#010+
   '**2ii_Return list of supported inline assembler modes'#010+
   '**2im_Return list of supported modeswitches'#010+
   '**2im_Return list of supported modeswitches'#010+
-  '**2io_Return list of supported optimizations'#010+
-  '**2ir_Return list of recognized comp','iler and RTL features'#010+
+  '**2io_Return list of supported optimiza','tions'#010+
+  '**2ir_Return list of recognized compiler and RTL features'#010+
   '**2it_Return list of supported targets'#010+
   '**2it_Return list of supported targets'#010+
   '**2iu_Return list of supported microcontroller types'#010+
   '**2iu_Return list of supported microcontroller types'#010+
   '**2iw_Return list of supported whole program optimizations'#010+
   '**2iw_Return list of supported whole program optimizations'#010+
-  '**1I<x>_Add <x> to include path'#010+
+  '**1I<x>_Add <x> to includ','e path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1k<x>_Pass <x> to the linker'#010+
-  '**1l','_Write logo'#010+
+  '**1l_Write logo'#010+
   '**1M<x>_Set language mode to <x> / enable modeswitch <x> (see option -'+
   '**1M<x>_Set language mode to <x> / enable modeswitch <x> (see option -'+
   'im)'#010+
   'im)'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
   '**2Mobjfpc_FPC mode with Object Pascal support'#010+
   '**2Mobjfpc_FPC mode with Object Pascal support'#010+
-  '**2Mdelphi_Delphi 7 compatibility mode'#010+
-  '**2Mtp_TP/BP 7.0 compatibility',' mode'#010+
+  '**2Mdelphi_Delphi 7 compati','bility mode'#010+
+  '**2Mtp_TP/BP 7.0 compatibility mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
   '**2Miso_ISO 7185 mode'#010+
   '**2Miso_ISO 7185 mode'#010+
   '**2Mextendedpascal_ISO 10206 mode'#010+
   '**2Mextendedpascal_ISO 10206 mode'#010+
   '**2Mdelphiunicode_Delphi 2009 and later compatibility mode'#010+
   '**2Mdelphiunicode_Delphi 2009 and later compatibility mode'#010+
-  '**2*_Each mode (as listed above) enables its default set of mod','eswit'+
+  '**2*_Each mode (as li','sted above) enables its default set of modeswit'+
   'ches.'#010+
   'ches.'#010+
   '**2*_Other modeswitches are disabled and need to be enabled one by ano'+
   '**2*_Other modeswitches are disabled and need to be enabled one by ano'+
   'ther.'#010+
   'ther.'#010+
   '**1M<x>-_Disable modeswitch <x> (see option -im)'#010+
   '**1M<x>-_Disable modeswitch <x> (see option -im)'#010+
   '**1n_Do not read the default config files'#010+
   '**1n_Do not read the default config files'#010+
-  '**1o<x>_Change the name of the executable produced to <x>'#010+
-  '**1O','<x>_Optimizations:'#010+
+  '**1o<x>_Change the n','ame of the executable produced to <x>'#010+
+  '**1O<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#010+
   '**2O-_Disable optimizations'#010+
   '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
   '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
   '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
   '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
-  '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
-  '**2O4_Level 4 optimizati','ons (-O3 + optimizations which might have un'+
-  'expected side effects)'#010+
+  '**2O3_Level 3 optimizations (-O2 + sl','ow optimizations)'#010+
+  '**2O4_Level 4 optimizations (-O3 + optimizations which might have unex'+
+  'pected side effects)'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oo[NO]<x>_Enable or disable optimizations; see fpc -i or fpc -io fo'+
   '**2Oo[NO]<x>_Enable or disable optimizations; see fpc -i or fpc -io fo'+
   'r possible values'#010+
   'r possible values'#010+
-  '**2Op<x>_Set target cpu for optimizing; see fpc -i or fpc ','-ic for po'+
+  '**2Op<x>_Set tar','get cpu for optimizing; see fpc -i or fpc -ic for po'+
   'ssible values'#010+
   'ssible values'#010+
   '**2OW<x>_Generate whole-program optimization feedback for optimization'+
   '**2OW<x>_Generate whole-program optimization feedback for optimization'+
   ' <x>; see fpc -i or fpc -iw for possible values'#010+
   ' <x>; see fpc -i or fpc -iw for possible values'#010+
-  '**2Ow<x>_Perform whole-program optimization <x>; see fpc -i or fpc -iw'+
-  ' for possible values'#010+
-  '**2Os_O','ptimize for size rather than speed'#010+
+  '**2Ow<x>_Perform whole-program optimization <x>; see fpc',' -i or fpc -'+
+  'iw for possible values'#010+
+  '**2Os_Optimize for size rather than speed'#010+
   '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
   '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
   'F*1P<x>_Target CPU / compiler related options:'#010+
   'F*1P<x>_Target CPU / compiler related options:'#010+
   'F*2PB_Show default compiler binary'#010+
   'F*2PB_Show default compiler binary'#010+
-  'F*2PP_Show default target cpu'#010+
-  'F*2P<x>_Set target CPU (aarch64,a','rm,avr,i386,i8086,jvm,m68k,mips,mip'+
-  'sel,powerpc,powerpc64,sparc,x86_64)'#010+
+  'F*2PP_Show default ta','rget cpu'#010+
+  'F*2P<x>_Set target CPU (aarch64,arm,avr,i386,i8086,jvm,m68k,mips,mipse'+
+  'l,powerpc,powerpc64,sparc,x86_64)'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**2Rdefault_Use default assembler for target'#010+
   '**2Rdefault_Use default assembler for target'#010+
   '3*2Ratt_Read AT&T style assembler'#010+
   '3*2Ratt_Read AT&T style assembler'#010+
-  '3*2Rintel_Read Intel style assembler'#010+
-  '4*2Ratt_Read AT&T st','yle assembler'#010+
+  '3*2Rintel_Read ','Intel style assembler'#010+
+  '4*2Ratt_Read AT&T style assembler'#010+
   '4*2Rintel_Read Intel style assembler'#010+
   '4*2Rintel_Read Intel style assembler'#010+
   '8*2Ratt_Read AT&T style assembler'#010+
   '8*2Ratt_Read AT&T style assembler'#010+
   '8*2Rintel_Read Intel style assembler'#010+
   '8*2Rintel_Read Intel style assembler'#010+
   '6*2RMOT_Read Motorola style assembler'#010+
   '6*2RMOT_Read Motorola style assembler'#010+
   '**1S<x>_Syntax options:'#010+
   '**1S<x>_Syntax options:'#010+
-  '**2S2_Same as -Mobjfpc'#010+
-  '**2Sc_Support operators like C (*','=,+=,/= and -=)'#010+
+  '**2S2_Same as ','-Mobjfpc'#010+
+  '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sd_Same as -Mdelphi'#010+
   '**2Sd_Same as -Mdelphi'#010+
   '**2Se<x>_Error options. <x> is a combination of the following:'#010+
   '**2Se<x>_Error options. <x> is a combination of the following:'#010+
   '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
   '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
-  '**3*_w : Compiler also halts after warnings'#010+
-  '**3*_n ',': Compiler also halts after notes'#010+
+  '**3*_w : ','Compiler also halts after warnings'#010+
+  '**3*_n : Compiler also halts after notes'#010+
   '**3*_h : Compiler also halts after hints'#010+
   '**3*_h : Compiler also halts after hints'#010+
   '**2Sf_Enable certain features in compiler and RTL; see fpc -i or fpc -'+
   '**2Sf_Enable certain features in compiler and RTL; see fpc -i or fpc -'+
   'ir for possible values)'#010+
   'ir for possible values)'#010+
-  '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
-  '**2Sh_Use re','ference counted strings (ansistring by default) instead '+
-  'of shortstrings'#010+
+  '**2Sg_Enable LABEL and GOTO (','default in -Mtp and -Mdelphi)'#010+
+  '**2Sh_Use reference counted strings (ansistring by default) instead of'+
+  ' shortstrings'#010+
   '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
   '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
-  '**2Sj_Allows typed constants to be writeable (default in all modes)'#010+
+  '**2Sj_Allows typed constants to be writeable (default in a','ll modes)'#010+
   '**2Sk_Load fpcylix unit'#010+
   '**2Sk_Load fpcylix unit'#010+
-  '**2SI<x>','_Set interface style to <x>'#010+
+  '**2SI<x>_Set interface style to <x>'#010+
   '**3SIcom_COM compatible interface (default)'#010+
   '**3SIcom_COM compatible interface (default)'#010+
   '**3SIcorba_CORBA compatible interface'#010+
   '**3SIcorba_CORBA compatible interface'#010+
   '**2Sm_Support macros like C (global)'#010+
   '**2Sm_Support macros like C (global)'#010+
   '**2So_Same as -Mtp'#010+
   '**2So_Same as -Mtp'#010+
-  '**2Sr_Transparent file names in ISO mode'#010+
-  '**2Ss_Constructor name must be in','it (destructor must be done)'#010+
+  '**2Sr_Transparent file names in ','ISO mode'#010+
+  '**2Ss_Constructor name must be init (destructor must be done)'#010+
   '**2Sv_Support vector processing (use CPU vector extensions if availabl'+
   '**2Sv_Support vector processing (use CPU vector extensions if availabl'+
   'e)'#010+
   'e)'#010+
   '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
   '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
-  '**2Sy_@<pointer> returns a typed pointer, same as $T+'#010+
-  '**1s_Do not call as','sembler and linker'#010+
+  '**2Sy_@<pointer> returns a type','d pointer, same as $T+'#010+
+  '**1s_Do not call assembler and linker'#010+
   '**2sh_Generate script to link on host'#010+
   '**2sh_Generate script to link on host'#010+
   '**2st_Generate script to link on target'#010+
   '**2st_Generate script to link on target'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
   '**1T<x>_Target operating system:'#010+
-  '3*2Tandroid_Android'#010+
+  '3*2Tandroid_And','roid'#010+
   '3*2Taros_AROS'#010+
   '3*2Taros_AROS'#010+
   '3*2Tbeos_BeOS'#010+
   '3*2Tbeos_BeOS'#010+
-  '3*2Tdarwi','n_Darwin/Mac OS X'#010+
+  '3*2Tdarwin_Darwin/Mac OS X'#010+
   '3*2Tembedded_Embedded'#010+
   '3*2Tembedded_Embedded'#010+
   '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
   '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Thaiku_Haiku'#010+
   '3*2Thaiku_Haiku'#010+
-  '3*2Tiphonesim_iPhoneSimulator from iOS SDK 3.2+ (older versions: -','Td'+
+  '3*2Tiphonesim_iPhoneSimu','lator from iOS SDK 3.2+ (older versions: -Td'+
   'arwin)'#010+
   'arwin)'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tnativent_Native NT API (experimental)'#010+
   '3*2Tnativent_Native NT API (experimental)'#010+
@@ -1757,9 +1758,9 @@ const msgtxt : array[0..000357,1..240] of char=(
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Topenbsd_OpenBSD'#010+
-  '3*2Tos2_OS/2 / eComStation'#010+
+  '3*2Tos2_OS','/2 / eComStation'#010+
   '3*2Tsymbian_Symbian OS'#010+
   '3*2Tsymbian_Symbian OS'#010+
-  '3*','2Tsolaris_Solaris'#010+
+  '3*2Tsolaris_Solaris'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twin32_Windows 32 Bit'#010+
@@ -1767,8 +1768,8 @@ const msgtxt : array[0..000357,1..240] of char=(
   '4*2Tandroid_Android'#010+
   '4*2Tandroid_Android'#010+
   '4*2Taros_AROS'#010+
   '4*2Taros_AROS'#010+
   '4*2Tdarwin_Darwin/Mac OS X'#010+
   '4*2Tdarwin_Darwin/Mac OS X'#010+
-  '4*2Tdragonfly_DragonFly BSD'#010+
-  '4*2Tembedded_Emb','edded'#010+
+  '4*','2Tdragonfly_DragonFly BSD'#010+
+  '4*2Tembedded_Embedded'#010+
   '4*2Tfreebsd_FreeBSD'#010+
   '4*2Tfreebsd_FreeBSD'#010+
   '4*2Thaiku_Haiku'#010+
   '4*2Thaiku_Haiku'#010+
   '4*2Tiphonesim_iPhoneSimulator'#010+
   '4*2Tiphonesim_iPhoneSimulator'#010+
@@ -1777,9 +1778,9 @@ const msgtxt : array[0..000357,1..240] of char=(
   '4*2Topenbsd_OpenBSD'#010+
   '4*2Topenbsd_OpenBSD'#010+
   '4*2Tsolaris_Solaris'#010+
   '4*2Tsolaris_Solaris'#010+
   '4*2Twin64_Win64 (64 bit Windows systems)'#010+
   '4*2Twin64_Win64 (64 bit Windows systems)'#010+
-  '6*2Tamiga_Commodore Amiga'#010+
+  '6*2Tamiga_C','ommodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
-  '6','*2Tembedded_Embedded'#010+
+  '6*2Tembedded_Embedded'#010+
   '6*2Tlinux_Linux'#010+
   '6*2Tlinux_Linux'#010+
   '6*2Tnetbsd_NetBSD'#010+
   '6*2Tnetbsd_NetBSD'#010+
   '6*2Tmacosclassic_Classic Mac OS'#010+
   '6*2Tmacosclassic_Classic Mac OS'#010+
@@ -1787,9 +1788,9 @@ const msgtxt : array[0..000357,1..240] of char=(
   '8*2Tembedded_Embedded'#010+
   '8*2Tembedded_Embedded'#010+
   '8*2Tmsdos_MS-DOS (and compatible)'#010+
   '8*2Tmsdos_MS-DOS (and compatible)'#010+
   '8*2Twin16_Windows 16 Bit'#010+
   '8*2Twin16_Windows 16 Bit'#010+
-  'A*2Tandroid_Android'#010+
+  'A*2Tandroid_','Android'#010+
   'A*2Taros_AROS'#010+
   'A*2Taros_AROS'#010+
-  'A*2Tdarwin_Darwin/iP','honeOS/iOS'#010+
+  'A*2Tdarwin_Darwin/iPhoneOS/iOS'#010+
   'A*2Tembedded_Embedded'#010+
   'A*2Tembedded_Embedded'#010+
   'A*2Tfreertos_FreeRTOS'#010+
   'A*2Tfreertos_FreeRTOS'#010+
   'A*2Tgba_Game Boy Advance'#010+
   'A*2Tgba_Game Boy Advance'#010+
@@ -1799,9 +1800,9 @@ const msgtxt : array[0..000357,1..240] of char=(
   'A*2Tpalmos_PalmOS'#010+
   'A*2Tpalmos_PalmOS'#010+
   'A*2Tsymbian_Symbian'#010+
   'A*2Tsymbian_Symbian'#010+
   'A*2Twince_Windows CE'#010+
   'A*2Twince_Windows CE'#010+
-  'a*2Tandroid_Android'#010+
+  'a*2Ta','ndroid_Android'#010+
   'a*2Tdarwin_Darwin/iOS'#010+
   'a*2Tdarwin_Darwin/iOS'#010+
-  'a*2Tl','inux_Linux'#010+
+  'a*2Tlinux_Linux'#010+
   'a*2Twin64_Windows 64'#010+
   'a*2Twin64_Windows 64'#010+
   'J*2Tandroid_Android'#010+
   'J*2Tandroid_Android'#010+
   'J*2Tjava_Java'#010+
   'J*2Tjava_Java'#010+
@@ -1812,8 +1813,8 @@ const msgtxt : array[0..000357,1..240] of char=(
   'M*2Tlinux_Linux'#010+
   'M*2Tlinux_Linux'#010+
   'P*2Taix_AIX'#010+
   'P*2Taix_AIX'#010+
   'P*2Tamiga_AmigaOS'#010+
   'P*2Tamiga_AmigaOS'#010+
-  'P*2Tdarwin_Darwin/Mac OS X'#010+
-  'P*2Tembedded_Embedded',#010+
+  'P*2Tda','rwin_Darwin/Mac OS X'#010+
+  'P*2Tembedded_Embedded'#010+
   'P*2Tlinux_Linux'#010+
   'P*2Tlinux_Linux'#010+
   'P*2Tmacosclassic_Classic Mac OS'#010+
   'P*2Tmacosclassic_Classic Mac OS'#010+
   'P*2Tmorphos_MorphOS'#010+
   'P*2Tmorphos_MorphOS'#010+
@@ -1824,9 +1825,9 @@ const msgtxt : array[0..000357,1..240] of char=(
   'p*2Tembedded_Embedded'#010+
   'p*2Tembedded_Embedded'#010+
   'p*2Tlinux_Linux'#010+
   'p*2Tlinux_Linux'#010+
   'R*2Tlinux_Linux'#010+
   'R*2Tlinux_Linux'#010+
-  'R*2Tembedded_Embedded'#010+
+  'R*2Tem','bedded_Embedded'#010+
   'r*2Tlinux_Linux'#010+
   'r*2Tlinux_Linux'#010+
-  'r*2Tembedd','ed_Embedded'#010+
+  'r*2Tembedded_Embedded'#010+
   'S*2Tlinux_Linux'#010+
   'S*2Tlinux_Linux'#010+
   'S*2Tsolaris_Solaris'#010+
   'S*2Tsolaris_Solaris'#010+
   's*2Tlinux_Linux'#010+
   's*2Tlinux_Linux'#010+
@@ -1836,152 +1837,152 @@ const msgtxt : array[0..000357,1..240] of char=(
   'x*2Tlinux_Linux'#010+
   'x*2Tlinux_Linux'#010+
   'Z*2Tembedded_Embedded'#010+
   'Z*2Tembedded_Embedded'#010+
   'Z*2Tzxspectrum_ZX Spectrum'#010+
   'Z*2Tzxspectrum_ZX Spectrum'#010+
-  'Z*2Tmsxdos_MSX-DOS'#010+
-  '**1u<x>_Undefines the symb','ol <x>'#010+
+  'Z*2','Tmsxdos_MSX-DOS'#010+
+  '**1u<x>_Undefines the symbol <x>'#010+
   '**1U_Unit options:'#010+
   '**1U_Unit options:'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
   '**2Ur_Generate release unit files (never automatically recompiled)'#010+
   '**2Ur_Generate release unit files (never automatically recompiled)'#010+
   '**2Us_Compile a system unit'#010+
   '**2Us_Compile a system unit'#010+
-  '**1v<x>_Be verbose. <x> is a combination of the following ','letters:'#010+
+  '**1v<x>_Be verbo','se. <x> is a combination of the following letters:'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
   '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_w : Show warnings               u : Show unit info'#010+
-  '**2*_n : Show notes                  t : Show tried/used files'#010+
-  '**2*_h : Show hints                  c : S','how conditionals'#010+
+  '**2*_n : Show notes                  t : Show tried/used files'#010,
+  '**2*_h : Show hints                  c : Show conditionals'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
   '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
-  '**2*_s : Show time stamps            q : Show message numbers'#010+
-  '**2*_a : Show everything          ','   x : Show info about invoked too'+
-  'ls'#010+
+  '**2*_s : Show time stamps            q : Show message ','numbers'#010+
+  '**2*_a : Show everything             x : Show info about invoked tools'+
+  #010+
   '**2*_b : Write file names messages   p : Write tree.log with parse tre'+
   '**2*_b : Write file names messages   p : Write tree.log with parse tre'+
   'e'#010+
   'e'#010+
   '**2*_    with full path              v : Write fpcdebug.txt with'#010+
   '**2*_    with full path              v : Write fpcdebug.txt with'#010+
-  '**2*_z : Write output to stderr          lots of debugging info'#010+
-  '**','2*_m<x>,<y> : Do not show messages numbered <x> and <y>'#010+
+  '**2*_z : Write output to',' stderr          lots of debugging info'#010+
+  '**2*_m<x>,<y> : Do not show messages numbered <x> and <y>'#010+
   'F*1V<x>_Append '#039'-<x>'#039' to the used compiler binary name (e.g. f'+
   'F*1V<x>_Append '#039'-<x>'#039' to the used compiler binary name (e.g. f'+
   'or version)'#010+
   'or version)'#010+
   '**1W<x>_Target-specific options (targets)'#010+
   '**1W<x>_Target-specific options (targets)'#010+
-  '3*2WA_Specify native type application (Windows)'#010+
-  '4*2WA_Specify native',' type application (Windows)'#010+
+  '3*2WA_Specify native type ','application (Windows)'#010+
+  '4*2WA_Specify native type application (Windows)'#010+
   'A*2WA_Specify native type application (Windows)'#010+
   'A*2WA_Specify native type application (Windows)'#010+
   '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  'a*2Wb_Cr','eate a bundle instead of a library (Darwin)'#010+
+  'p*2Wb_Create a bun','dle instead of a library (Darwin)'#010+
+  'a*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'A*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'A*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '4*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '4*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  '3*2WB_Create a relocatable image (Windows, Symbian)'#010+
-  '3*2WB<x>_Set image base to <x> (Windows,',' Symbian)'#010+
+  '3*2WB_Create a relocatable image (Windows, Symbian',')'#010+
+  '3*2WB<x>_Set image base to <x> (Windows, Symbian)'#010+
   '4*2WB_Create a relocatable image (Windows)'#010+
   '4*2WB_Create a relocatable image (Windows)'#010+
   '4*2WB<x>_Set image base to <x> (Windows)'#010+
   '4*2WB<x>_Set image base to <x> (Windows)'#010+
   'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
   'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
   'A*2WB<x>_Set image base to <x> (Windows, Symbian)'#010+
   'A*2WB<x>_Set image base to <x> (Windows, Symbian)'#010+
-  'Z*2WB<x>_Set image base to <x> (ZX Spectrum)',#010+
+  'Z*','2WB<x>_Set image base to <x> (ZX Spectrum)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
   '4*2WC_Specify console type application (Windows)'#010+
   '4*2WC_Specify console type application (Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
-  'P*2WC_Specify console type application (Classic Mac OS)'#010+
-  '3*2WD_Use DEFFILE to expo','rt functions of DLL or EXE (Windows)'#010+
+  'P*2WC_Specify console type application ','(Classic Mac OS)'#010+
+  '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   '4*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   '4*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
-  '3*2We_Use external resources (Darwin)'#010+
+  '3*2We_Use external resources (Darwin)',#010+
   '4*2We_Use external resources (Darwin)'#010+
   '4*2We_Use external resources (Darwin)'#010+
-  'a*2','We_Use external resources (Darwin)'#010+
+  'a*2We_Use external resources (Darwin)'#010+
   'A*2We_Use external resources (Darwin)'#010+
   'A*2We_Use external resources (Darwin)'#010+
   'P*2We_Use external resources (Darwin)'#010+
   'P*2We_Use external resources (Darwin)'#010+
   'p*2We_Use external resources (Darwin)'#010+
   'p*2We_Use external resources (Darwin)'#010+
-  '3*2WF_Specify full-screen type application (EMX, OS/2)'#010+
-  '3*2WG_Specify graphic type applicati','on (EMX, OS/2, Windows)'#010+
+  '3*2WF_Specify full-screen type application (EMX, ','OS/2)'#010+
+  '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
   '4*2WG_Specify graphic type application (Windows)'#010+
   '4*2WG_Specify graphic type application (Windows)'#010+
   'A*2WG_Specify graphic type application (Windows)'#010+
   'A*2WG_Specify graphic type application (Windows)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
-  '3*2Wi_Use internal resources (Darwin)'#010+
-  '4*2Wi_Use internal resou','rces (Darwin)'#010+
+  '3*2Wi_Use internal r','esources (Darwin)'#010+
+  '4*2Wi_Use internal resources (Darwin)'#010+
   'a*2Wi_Use internal resources (Darwin)'#010+
   'a*2Wi_Use internal resources (Darwin)'#010+
   'A*2Wi_Use internal resources (Darwin)'#010+
   'A*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
   'p*2Wi_Use internal resources (Darwin)'#010+
   'p*2Wi_Use internal resources (Darwin)'#010+
-  '3*2WI_Turn on/off the usage of import sections (Windows)'#010+
-  '4*2WI_Turn on/off',' the usage of import sections (Windows)'#010+
+  '3*2WI_Turn on/off the usage of i','mport sections (Windows)'#010+
+  '4*2WI_Turn on/off the usage of import sections (Windows)'#010+
   'A*2WI_Turn on/off the usage of import sections (Windows)'#010+
   'A*2WI_Turn on/off the usage of import sections (Windows)'#010+
   '8*2Wh_Use huge code for units (ignored for models with CODE in a uniqu'+
   '8*2Wh_Use huge code for units (ignored for models with CODE in a uniqu'+
   'e segment)'#010+
   'e segment)'#010+
-  '8*2Wm<x>_Set memory model'#010+
+  '8*2Wm<x>_Set memory ','model'#010+
   '8*3WmTiny_Tiny memory model'#010+
   '8*3WmTiny_Tiny memory model'#010+
-  '8*3WmSma','ll_Small memory model (default)'#010+
+  '8*3WmSmall_Small memory model (default)'#010+
   '8*3WmMedium_Medium memory model'#010+
   '8*3WmMedium_Medium memory model'#010+
   '8*3WmCompact_Compact memory model'#010+
   '8*3WmCompact_Compact memory model'#010+
   '8*3WmLarge_Large memory model'#010+
   '8*3WmLarge_Large memory model'#010+
   '8*3WmHuge_Huge memory model'#010+
   '8*3WmHuge_Huge memory model'#010+
-  '3*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
-  'n)'#010+
-  '4*2WM<x>_Mi','nimum Mac OS X deployment version: 10.4, 10.5.1, ... (Dar'+
+  '3*2WM<x>_Minimum Mac OS X deployment versi','on: 10.4, 10.5.1, ... (Dar'+
   'win)'#010+
   'win)'#010+
-  'p*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  '4*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
   'n)'#010+
   'n)'#010+
-  'P*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  'p*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
   'n)'#010+
   'n)'#010+
-  '3*2WN_Do not generate relocation',' code, needed for debugging (Windows'+
-  ')'#010+
+  'P*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ...',' (Dar'+
+  'win)'#010+
+  '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   '4*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   '4*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  'A*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu fo','r poss'+
+  'A*2Wp<x>_Specify the',' controller type; see fpc -i or fpc -iu for poss'+
   'ible values'#010+
   'ible values'#010+
   'm*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
   'm*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
   'le values'#010+
   'le values'#010+
   'R*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
   'R*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
   'le values'#010+
   'le values'#010+
-  'V*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu fo','r poss'+
+  'V*2Wp<x>_Specify the',' controller type; see fpc -i or fpc -iu for poss'+
   'ible values'#010+
   'ible values'#010+
   'x*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
   'x*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
   'le values'#010+
   'le values'#010+
   '3*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (iphonesim)'#010+
   '3*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (iphonesim)'#010+
-  '4*2WP<x>_Minimum iOS deployment version: 8.0, 8.0.2, ... (iphonesim)'#010+
-  'a*2W','P<x>_Minimum iOS deployment version: 7.0, 7.1.2, ... (Darwin)'#010+
+  '4*2WP<x>_Minimum iOS deployment',' version: 8.0, 8.0.2, ... (iphonesim)'+
+  #010+
+  'a*2WP<x>_Minimum iOS deployment version: 7.0, 7.1.2, ... (Darwin)'#010+
   'A*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+
   'A*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
-  '4*2WR_Generate relocation code (Windows)'#010+
-  'A*2WR_Generate relocation code',' (Windows)'#010+
+  '4*2WR_Generate relocation cod','e (Windows)'#010+
+  'A*2WR_Generate relocation code (Windows)'#010+
   '8*2Wt<x>_Set the target executable format'#010+
   '8*2Wt<x>_Set the target executable format'#010+
   '8*3Wtexe_Create a DOS .EXE file (default)'#010+
   '8*3Wtexe_Create a DOS .EXE file (default)'#010+
   '8*3Wtcom_Create a DOS .COM file (requires tiny memory model)'#010+
   '8*3Wtcom_Create a DOS .COM file (requires tiny memory model)'#010+
-  'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
-  '**2WX_Enable executable sta','ck (Linux)'#010+
+  'P*2WT_Specify MPW tool type application (C','lassic Mac OS)'#010+
+  '**2WX_Enable executable stack (Linux)'#010+
   '**1X_Executable options:'#010+
   '**1X_Executable options:'#010+
   '**2X9_Generate linkerscript for GNU Binutils ld older than version 2.1'+
   '**2X9_Generate linkerscript for GNU Binutils ld older than version 2.1'+
   '9.1 (Linux)'#010+
   '9.1 (Linux)'#010+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   'ux)'#010+
   'ux)'#010+
-  '**2Xd_Do not search default library path (someti','mes required for cro'+
+  '**2Xd_','Do not search default library path (sometimes required for cro'+
   'ss-compiling when not using -XR)'#010+
   'ss-compiling when not using -XR)'#010+
   '**2Xe_Use external linker'#010+
   '**2Xe_Use external linker'#010+
   '**2Xf_Substitute pthread library name for linking (BSD)'#010+
   '**2Xf_Substitute pthread library name for linking (BSD)'#010+
-  '**2Xg_Create debuginfo in a separate file and add a debuglink section '+
-  'to executable'#010+
-  '**2XD_Try to link uni','ts dynamically      (defines FPC_LINK_DYNAMIC)'#010+
+  '**2Xg_Create debuginfo in a separate file and add a debuglink s','ectio'+
+  'n to executable'#010+
+  '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
   '**2Xi_Use internal linker'#010+
   '**2Xi_Use internal linker'#010+
   'L*2XlS<x>_LLVM utilties suffix (e.g. -7 in case clang is called clang-'+
   'L*2XlS<x>_LLVM utilties suffix (e.g. -7 in case clang is called clang-'+
   '7)'#010+
   '7)'#010+
   '**2XLA_Define library substitutions for linking'#010+
   '**2XLA_Define library substitutions for linking'#010+
-  '**2XLO_Define order of library linking'#010+
-  '**2XLD_','Exclude default order of standard libraries'#010+
+  '**2X','LO_Define order of library linking'#010+
+  '**2XLD_Exclude default order of standard libraries'#010+
   '**2Xm_Generate link map'#010+
   '**2Xm_Generate link map'#010+
   '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
   '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
   's '#039'main'#039')'#010+
   's '#039'main'#039')'#010+
-  '**2Xn_Use target system native linker instead of GNU ld (Solaris, AIX)'+
-  #010+
-  'F*2Xp<x>_First search for the',' compiler binary in the directory <x>'#010+
+  '**2Xn_Use target system native linker instead of GNU ld (S','olaris, AI'+
+  'X)'#010+
+  'F*2Xp<x>_First search for the compiler binary in the directory <x>'#010+
   '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
   '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
-  'ile, see the ld manual for more information) (BeOS, Linux)'#010+
-  '**2XR<x>_Prepend <x> ','to all linker search paths (BeOS, Darwin, FreeB'+
-  'SD, Linux, Mac OS, Solaris)'#010+
+  'ile, see the ld manual for more inform','ation) (BeOS, Linux)'#010+
+  '**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+
+  ', Linux, Mac OS, Solaris)'#010+
   '**2Xs_Strip all symbols from executable'#010+
   '**2Xs_Strip all symbols from executable'#010+
   '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
   '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
-  '**2Xt_Link with static libraries (-static is passed to ','linker)'#010+
+  '**2Xt_Link wi','th static libraries (-static is passed to linker)'#010+
   '**2Xv_Generate table for Virtual Entry calls'#010+
   '**2Xv_Generate table for Virtual Entry calls'#010+
   '**2XV_Use VLink as external linker       (default on Amiga, MorphOS)'#010+
   '**2XV_Use VLink as external linker       (default on Amiga, MorphOS)'#010+
   '**2XX_Try to smartlink units             (defines FPC_LINK_SMART)'#010+
   '**2XX_Try to smartlink units             (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
   '**1*_'#010+
-  '**1?_Show this help'#010+
-  '**1h_Shows this help witho','ut waiting'
+  '**1?','_Show this help'#010+
+  '**1h_Shows this help without waiting'
 );
 );

+ 15 - 5
compiler/ncgcal.pas

@@ -128,13 +128,14 @@ implementation
 
 
     uses
     uses
       systems,
       systems,
-      verbose,globals,
+      verbose,globals,cutils,
       symconst,symtable,symtype,symsym,defutil,paramgr,
       symconst,symtable,symtype,symsym,defutil,paramgr,
       pass_2,
       pass_2,
       nld,ncnv,
       nld,ncnv,
       ncgutil,blockutl,
       ncgutil,blockutl,
       cgobj,tgobj,hlcgobj,
       cgobj,tgobj,hlcgobj,
       procinfo,
       procinfo,
+      aasmtai,
       wpobase;
       wpobase;
 
 
 
 
@@ -143,13 +144,15 @@ implementation
         { We can skip passing the parameter when:
         { We can skip passing the parameter when:
             the parameter can be optimized as unused
             the parameter can be optimized as unused
             and the target does not strictly require all parameters (has_strict_proc_signature = false)
             and the target does not strictly require all parameters (has_strict_proc_signature = false)
-            and fixed stack is used
+            and
+                 fixed stack is used
               or the parameter is in a register
               or the parameter is in a register
-              or the parameter is $parentfp. }
+              or the parameter is $parentfp and po_delphi_nested_cc is set for the routine. }
         result:=paramanager.can_opt_unused_para(parasym) and
         result:=paramanager.can_opt_unused_para(parasym) and
           not paramanager.has_strict_proc_signature and
           not paramanager.has_strict_proc_signature and
           (paramanager.use_fixed_stack or
           (paramanager.use_fixed_stack or
-           (vo_is_parentfp in parasym.varoptions) or
+           ((vo_is_parentfp in parasym.varoptions) and
+            (po_delphi_nested_cc in tabstractprocdef(parasym.owner.defowner).procoptions)) or
            (parasym.paraloc[callerside].Location^.Loc in [LOC_REGISTER,LOC_CREGISTER]));
            (parasym.paraloc[callerside].Location^.Loc in [LOC_REGISTER,LOC_CREGISTER]));
       end;
       end;
 
 
@@ -304,7 +307,14 @@ implementation
           exit;
           exit;
         { If we can't skip loading of the parameter, load an undefined dummy value. }
         { If we can't skip loading of the parameter, load an undefined dummy value. }
         if not can_skip_para_push(parasym) then
         if not can_skip_para_push(parasym) then
-          hlcg.a_load_undefined_cgpara(current_asmdata.CurrAsmList,left.resultdef,tempcgpara);
+          begin
+            if cs_asm_source in current_settings.globalswitches then
+              current_asmdata.CurrAsmList.concat(tai_comment.Create(strpnew('Parameter '+parasym.realname+' is unused, loading undefined value')));
+            hlcg.a_load_undefined_cgpara(current_asmdata.CurrAsmList,left.resultdef,tempcgpara);
+          end
+        else
+          if cs_asm_source in current_settings.globalswitches then
+            current_asmdata.CurrAsmList.concat(tai_comment.Create(strpnew('Parameter '+parasym.realname+' is unused')));
       end;
       end;
 
 
 
 

+ 2 - 1
compiler/ncgutil.pas

@@ -865,7 +865,8 @@ implementation
                     end
                     end
                   { Unused parameters need to be kept in the original location
                   { Unused parameters need to be kept in the original location
                     to prevent allocation of registers/resources for them. }
                     to prevent allocation of registers/resources for them. }
-                  else if not tparavarsym(vs).is_used then
+                  else if not tparavarsym(vs).is_used and
+                    (cs_opt_unused_para in current_settings.optimizerswitches) then
                     begin
                     begin
                       tparavarsym(vs).paraloc[calleeside].get_location(vs.initialloc);
                       tparavarsym(vs).paraloc[calleeside].get_location(vs.initialloc);
                     end
                     end

+ 10 - 4
compiler/ogomf.pas

@@ -803,7 +803,7 @@ implementation
 
 
     uses
     uses
        SysUtils,
        SysUtils,
-       cutils,verbose,globals,
+       cutils,verbose,globals,fpccrc,
        fmodule,aasmtai,aasmdata,
        fmodule,aasmtai,aasmdata,
        ogmap,owomflib,elfbase,
        ogmap,owomflib,elfbase,
        version
        version
@@ -1053,7 +1053,7 @@ implementation
         if current_settings.x86memorymodel in x86_far_code_models then
         if current_settings.x86memorymodel in x86_far_code_models then
           begin
           begin
             if cs_huge_code in current_settings.moduleswitches then
             if cs_huge_code in current_settings.moduleswitches then
-              result:=aname + '_TEXT'
+              result:=TrimStrCRC32(aname,30) + '_TEXT'
             else
             else
               result:=current_module.modulename^ + '_TEXT';
               result:=current_module.modulename^ + '_TEXT';
           end
           end
@@ -3546,7 +3546,13 @@ cleanup:
                 else if assigned(objreloc.symbol.group) then
                 else if assigned(objreloc.symbol.group) then
                   framebase:=TMZExeUnifiedLogicalGroup(ExeUnifiedLogicalGroups.Find(objreloc.symbol.group.Name)).MemPos
                   framebase:=TMZExeUnifiedLogicalGroup(ExeUnifiedLogicalGroups.Find(objreloc.symbol.group.Name)).MemPos
                 else
                 else
-                  framebase:=TOmfObjSection(objreloc.symbol.objsection).MZExeUnifiedLogicalSegment.MemBasePos;
+                  if assigned(TOmfObjSection(objreloc.symbol.objsection).MZExeUnifiedLogicalSegment) then
+                    framebase:=TOmfObjSection(objreloc.symbol.objsection).MZExeUnifiedLogicalSegment.MemBasePos
+                  else
+                    begin
+                      framebase:=0;
+                      Comment(V_Warning,'Encountered an OMF reference to a symbol, that is not present in the final executable: '+objreloc.symbol.Name);
+                    end;
                 case objreloc.typ of
                 case objreloc.typ of
                   RELOC_ABSOLUTE16,RELOC_ABSOLUTE32,RELOC_SEG,RELOC_FARPTR,RELOC_FARPTR48:
                   RELOC_ABSOLUTE16,RELOC_ABSOLUTE32,RELOC_SEG,RELOC_FARPTR,RELOC_FARPTR48:
                     fixupamount:=target-framebase;
                     fixupamount:=target-framebase;
@@ -3595,7 +3601,7 @@ cleanup:
                     else
                     else
                       begin
                       begin
                         framebase:=0;
                         framebase:=0;
-                        Comment(V_Warning,'Encountered an OMF reference to a section, that has been removed by smartlinking: '+TOmfObjSection(objreloc.objsection).Name);
+                        Comment(V_Warning,'Encountered an OMF reference to a section, that is not present in the final executable: '+TOmfObjSection(objreloc.objsection).Name);
                       end;
                       end;
                   end;
                   end;
                 case objreloc.typ of
                 case objreloc.typ of

+ 4 - 0
compiler/options.pas

@@ -1698,6 +1698,10 @@ begin
                          ParaFrameworkPath.AddPath(More,false)
                          ParaFrameworkPath.AddPath(More,false)
                        else
                        else
                          frameworksearchpath.AddPath(More,true)
                          frameworksearchpath.AddPath(More,true)
+{$ifdef XTENSA}
+                     else if (target_info.system=system_xtensa_freertos) then
+                       idfpath:=FixPath(More,true)
+{$endif XTENSA}
                      else
                      else
                        IllegalPara(opt);
                        IllegalPara(opt);
                  'F' :
                  'F' :

+ 250 - 216
compiler/systems/t_freertos.pas

@@ -46,8 +46,6 @@ implementation
           function postprocessexecutable(const fn : string;isdll:boolean):boolean;
           function postprocessexecutable(const fn : string;isdll:boolean):boolean;
        end;
        end;
 
 
-       var
-         IDF_PATH: string;
 
 
 {*****************************************************************************
 {*****************************************************************************
                                   TlinkerEmbedded
                                   TlinkerEmbedded
@@ -73,21 +71,7 @@ const
   platform_select='';
   platform_select='';
 {$endif}
 {$endif}
 begin
 begin
-  with Info do
-   begin
-{$ifdef xtensa}
-     if target_info.system=system_xtensa_freertos then
-       ExeCmd[1]:='ld -g '+platform_select+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE -T $RES '+
-         '-u call_user_start_cpu0 -u ld_include_panic_highint_hdl -u esp_app_desc -u vfs_include_syscalls_impl -u pthread_include_pthread_impl -u pthread_include_pthread_cond_impl -u pthread_include_pthread_local_storage_impl -u newlib_include_locks_impl -u newlib_include_heap_impl -u newlib_include_syscalls_impl -u newlib_include_pthread_impl -u app_main -u uxTopUsedPriority '+
-         '-L $IDF_PATH/components/esp_rom/esp32/ld '+
-         '-T esp32.rom.ld -T esp32.rom.libgcc.ld -T esp32.rom.newlib-data.ld -T esp32.rom.syscalls.ld -T esp32.rom.newlib-funcs.ld '+
-         '-L . -T esp32_out.ld -T esp32.project.ld '+
-         '-L $IDF_PATH/components/esp32/ld -T esp32.peripherals.ld'
-     else
-{$else}
-       ExeCmd[1]:='ld -g '+platform_select+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE -T $RES';
-{$endif xtensa}
-   end;
+  Info.ExeCmd[1]:='ld -g '+platform_select+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE -T $RES';
 end;
 end;
 
 
 
 
@@ -961,14 +945,11 @@ var
   hp: TCmdStrListItem;
   hp: TCmdStrListItem;
   filepath: TCmdStr;
   filepath: TCmdStr;
 begin
 begin
-  IDF_PATH:='';
-{$ifdef xtensa}
-  if (target_info.system=system_xtensa_freertos) then
-    if (current_settings.controllertype = ct_esp32) then
-      IDF_PATH := 'IDF_PATH'
-    else
-      IDF_PATH := 'IDF_PATH8266';
-{$endif xtensa}
+{$ifdef XTENSA}
+  { idfpath can be set by -Ff, else default to environment value of IDF_PATH }
+  if idfpath='' then
+    idfpath := trim(GetEnvironmentVariable('IDF_PATH'));
+{$endif XTENSA}
 
 
   { for future use }
   { for future use }
   StaticStr:='';
   StaticStr:='';
@@ -979,194 +960,250 @@ begin
   success:=true;
   success:=true;
   Result:=false;
   Result:=false;
 
 
-  if target_info.system=system_xtensa_freertos then
+{$ifdef XTENSA}
+  { generate a sdkconfig.h if none is provided,
+    only a few fields are provided to far }
+  Assign(t,'sdkconfig.h');
+  {$push}{$I-}
+  Rewrite(t);
+  if ioresult<>0 then
+    exit;
+
+  if (current_settings.controllertype = ct_esp32) then
     begin
     begin
-      { generate a sdkconfig.h if none is provided,
-        only a few fields are provided to far }
-      if not(Sysutils.FileExists('sdkconfig.h')) then
-        begin
-          Assign(t,'sdkconfig.h');
-          {$push}{$I-}
-          Rewrite(t);
-          if ioresult<>0 then
-            exit;
-          writeln(t,'#pragma once');
-          writeln(t,'#define CONFIG_APP_BUILD_USE_FLASH_SECTIONS 1');
-          writeln(t,'#define CONFIG_BT_RESERVE_DRAM 0x0');
-          writeln(t,'#define CONFIG_ESP32_ULP_COPROC_RESERVE_MEM 0');
-          writeln(t,'#define CONFIG_ESP32_TRACEMEM_RESERVE_DRAM 0x0');
-
-          Close(t);
-          if ioresult<>0 then
-            exit;
-          {$pop}
-        end;
+      writeln(t,'#pragma once');
+      writeln(t,'#define CONFIG_APP_BUILD_USE_FLASH_SECTIONS 1');
+      writeln(t,'#define CONFIG_BT_RESERVE_DRAM 0x0');
+      writeln(t,'#define CONFIG_ESP32_ULP_COPROC_RESERVE_MEM 0');
+      writeln(t,'#define CONFIG_ESP32_TRACEMEM_RESERVE_DRAM 0x0');
+    end
+  else
+    begin
+      { TODO: APP_OFFSET & APP_SIZE depends on partition table
+        Default for partition table: Single factory app, no OTA }
+      writeln(t,'#define APP_OFFSET 0x10000');
+      writeln(t,'#define APP_SIZE 0xf0000');
+      { Include build version of sdkconfig.h for custom configuration, if available }
+      S:=idfpath+'/libs/sdkconfig.h';
+      if SysUtils.FileExists(S) then
+        writeln(t,'#include "'+S+'"')
+      else
+        { Assume SOC_FULL_ICACHE option not selected (default) }
+        writeln(t,'#define CONFIG_SOC_IRAM_SIZE 0xC000');
+    end;
 
 
-      { generate an sdkconfig if none is provided,
-        this is a dummy so far }
-      if not(Sysutils.FileExists('sdkconfig')) then
-        begin
-          Assign(t,'sdkconfig');
-          {$push}{$I-}
-          Rewrite(t);
-          if ioresult<>0 then
-            exit;
-
-          writeln(t);
-
-          Close(t);
-          if ioresult<>0 then
-            exit;
-          {$pop}
-        end;
+  Close(t);
+  if ioresult<>0 then
+    exit;
+  {$pop}
 
 
-      { generate an Kconfig if none is provided,
-        this is a dummy so far }
-      if not(Sysutils.FileExists('Kconfig')) then
-        begin
-          Assign(t,'Kconfig');
-          {$push}{$I-}
-          Rewrite(t);
-          if ioresult<>0 then
-            exit;
-
-          writeln(t);
-
-          Close(t);
-          if ioresult<>0 then
-            exit;
-          {$pop}
-        end;
+  { generate an sdkconfig if none is provided,
+    this is a dummy so far }
+  if not(Sysutils.FileExists('sdkconfig')) then
+    begin
+      Assign(t,'sdkconfig');
+      {$push}{$I-}
+      Rewrite(t);
+      if ioresult<>0 then
+        exit;
 
 
-      { generate an Kconfig.projbuild if none is provided,
-        this is a dummy so far }
-      if not(Sysutils.FileExists('Kconfig.projbuild')) then
-        begin
-          Assign(t,'Kconfig.projbuild');
-          {$push}{$I-}
-          Rewrite(t);
-          if ioresult<>0 then
-            exit;
-
-          writeln(t);
-
-          Close(t);
-          if ioresult<>0 then
-            exit;
-          {$pop}
-        end;
+      writeln(t);
 
 
-      { generate an kconfigs.in if none is provided,
-        this is a dummy so far }
-      if not(Sysutils.FileExists('kconfigs.in')) then
-        begin
-          Assign(t,'kconfigs.in');
-          {$push}{$I-}
-          Rewrite(t);
-          if ioresult<>0 then
-            exit;
-
-          writeln(t);
-
-          Close(t);
-          if ioresult<>0 then
-            exit;
-          {$pop}
-        end;
+      Close(t);
+      if ioresult<>0 then
+        exit;
+      {$pop}
+    end;
 
 
-      { generate an kconfigs_projbuild.in if none is provided,
-        this is a dummy so far }
-      if not(Sysutils.FileExists('kconfigs_projbuild.in')) then
-        begin
-          Assign(t,'kconfigs_projbuild.in');
-          {$push}{$I-}
-          Rewrite(t);
-          if ioresult<>0 then
-            exit;
-
-          writeln(t);
-
-          Close(t);
-          if ioresult<>0 then
-            exit;
-          {$pop}
-        end;
+  { generate an Kconfig if none is provided,
+    this is a dummy so far }
+  if not(Sysutils.FileExists('Kconfig')) then
+    begin
+      Assign(t,'Kconfig');
+      {$push}{$I-}
+      Rewrite(t);
+      if ioresult<>0 then
+        exit;
 
 
-      { generate a config.env if none is provided,
-        COMPONENT_KCONFIGS and COMPONENT_KCONFIGS_PROJBUILD are dummy fields and might
-        be needed to be filed properly }
-      if not(Sysutils.FileExists('config.env')) then
-        begin
-          Assign(t,'config.env');
-          {$push}{$I-}
-          Rewrite(t);
-          if ioresult<>0 then
-            exit;
-
-          writeln(t,'{');
-          writeln(t,'    "COMPONENT_KCONFIGS": "Kconfig",');
-          writeln(t,'    "COMPONENT_KCONFIGS_PROJBUILD": "Kconfig.projbuild",');
-          writeln(t,'    "IDF_CMAKE": "y",');
-          writeln(t,'    "IDF_TARGET": "esp32",');
-          writeln(t,'    "IDF_PATH": "'+GetEnvironmentVariable('IDF_PATH')+'",');
-          writeln(t,'    "COMPONENT_KCONFIGS_SOURCE_FILE": "kconfigs.in",');
-          writeln(t,'    "COMPONENT_KCONFIGS_PROJBUILD_SOURCE_FILE": "kconfigs_projbuild.in"');
-          writeln(t,'}');
-
-          Close(t);
-          if ioresult<>0 then
-            exit;
-          {$pop}
-        end;
+      writeln(t);
 
 
-      { generate ldgen_libraries }
-      Assign(t,'ldgen_libraries');
+      Close(t);
+      if ioresult<>0 then
+        exit;
+      {$pop}
+    end;
+
+  { generate an Kconfig.projbuild if none is provided,
+    this is a dummy so far }
+  if not(Sysutils.FileExists('Kconfig.projbuild')) then
+    begin
+      Assign(t,'Kconfig.projbuild');
       {$push}{$I-}
       {$push}{$I-}
       Rewrite(t);
       Rewrite(t);
       if ioresult<>0 then
       if ioresult<>0 then
         exit;
         exit;
 
 
-      hp:=TCmdStrListItem(StaticLibFiles.First);
-      while assigned(hp) do
-        begin
-          FindLibraryFile(hp.Str,target_info.staticClibprefix,target_info.staticClibext,filepath);
-          writeln(t,filepath);
-          hp:=TCmdStrListItem(hp.Next);
-        end;
+      writeln(t);
 
 
       Close(t);
       Close(t);
       if ioresult<>0 then
       if ioresult<>0 then
         exit;
         exit;
       {$pop}
       {$pop}
+    end;
 
 
-      binstr:='xtensa-esp32-elf-gcc';
-      cmdstr:='-C -P -x c -E -o esp32_out.ld -I . $IDF_PATH/components/esp32/ld/esp32.ld';
-
-      Replace(binstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
-      Replace(cmdstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
-      success:=DoExec(binstr,cmdstr,true,true);
-
-      { generate linker maps for esp32 }
-      binstr:='$IDF_PATH/tools/ldgen/ldgen.py';
-      cmdstr:='--config sdkconfig --fragments $IDF_PATH/components/xtensa/linker.lf $IDF_PATH/components/soc/linker.lf $IDF_PATH/components/esp_event/linker.lf '+
-        '$IDF_PATH/components/spi_flash/linker.lf $IDF_PATH/components/esp_wifi/linker.lf $IDF_PATH/components/lwip/linker.lf '+
-        '$IDF_PATH/components/heap/linker.lf $IDF_PATH/components/esp_ringbuf/linker.lf $IDF_PATH/components/espcoredump/linker.lf $IDF_PATH/components/esp32/linker.lf '+
-        '$IDF_PATH/components/esp32/ld/esp32_fragments.lf $IDF_PATH/components/freertos/linker.lf $IDF_PATH/components/newlib/newlib.lf '+
-        '$IDF_PATH/components/esp_gdbstub/linker.lf '+
-        '--input $IDF_PATH/components/esp32/ld/esp32.project.ld.in --output ./esp32.project.ld --kconfig $IDF_PATH/Kconfig --env-file config.env '+
-        '--libraries-file ldgen_libraries --objdump xtensa-esp32-elf-objdump';
-      Replace(binstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
-      Replace(cmdstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
-      if success and not(cs_link_nolink in current_settings.globalswitches) then
-        success:=DoExec(binstr,cmdstr,true,false);
+  { generate an kconfigs.in if none is provided,
+    this is a dummy so far }
+  if not(Sysutils.FileExists('kconfigs.in')) then
+    begin
+      Assign(t,'kconfigs.in');
+      {$push}{$I-}
+      Rewrite(t);
+      if ioresult<>0 then
+        exit;
+
+      writeln(t);
+
+      Close(t);
+      if ioresult<>0 then
+        exit;
+      {$pop}
+    end;
+
+  { generate an kconfigs_projbuild.in if none is provided,
+    this is a dummy so far }
+  if not(Sysutils.FileExists('kconfigs_projbuild.in')) then
+    begin
+      Assign(t,'kconfigs_projbuild.in');
+      {$push}{$I-}
+      Rewrite(t);
+      if ioresult<>0 then
+        exit;
+
+      writeln(t);
+
+      Close(t);
+      if ioresult<>0 then
+        exit;
+      {$pop}
+    end;
+
+  { generate a config.env if none is provided,
+    COMPONENT_KCONFIGS and COMPONENT_KCONFIGS_PROJBUILD are dummy fields and might
+    be needed to be filed properly }
+  Assign(t,'config.env');
+  {$push}{$I-}
+  Rewrite(t);
+  if ioresult<>0 then
+    exit;
+
+  writeln(t,'{');
+  if (current_settings.controllertype = ct_esp32) then
+    begin
+      writeln(t,'    "COMPONENT_KCONFIGS": "Kconfig",');
+      writeln(t,'    "COMPONENT_KCONFIGS_PROJBUILD": "Kconfig.projbuild",');
+      writeln(t,'    "IDF_CMAKE": "y",');
+      writeln(t,'    "IDF_TARGET": "esp32",');
+      writeln(t,'    "IDF_PATH": "'+idfpath+'",');
+      writeln(t,'    "COMPONENT_KCONFIGS_SOURCE_FILE": "kconfigs.in",');
+      writeln(t,'    "COMPONENT_KCONFIGS_PROJBUILD_SOURCE_FILE": "kconfigs_projbuild.in"');
+    end
+  else
+    begin
+      writeln(t,'    "IDF_PATH": "'+idfpath+'",');
+      writeln(t,'    "IDF_TARGET": "esp8266",');
+      writeln(t,'    "IDF_CMAKE": "n"');
     end;
     end;
+  writeln(t,'}');
+
+  Close(t);
+  if ioresult<>0 then
+    exit;
+  {$pop}
+
+  { generate ldgen_libraries }
+  Assign(t,'ldgen_libraries');
+  {$push}{$I-}
+  Rewrite(t);
+  if ioresult<>0 then
+    exit;
+
+  hp:=TCmdStrListItem(StaticLibFiles.First);
+  while assigned(hp) do
+    begin
+      FindLibraryFile(hp.Str,target_info.staticClibprefix,target_info.staticClibext,filepath);
+      writeln(t,filepath);
+      hp:=TCmdStrListItem(hp.Next);
+    end;
+
+  Close(t);
+  if ioresult<>0 then
+    exit;
+  {$pop}
+
+  binstr:='gcc';
+  if (current_settings.controllertype = ct_esp32) then
+    cmdstr:='-C -P -x c -E -o esp32_out.ld -I . $IDF_PATH/components/esp32/ld/esp32.ld'
+  else
+    cmdstr:='-C -P -x c -E -o esp8266_out.ld -I . $IDF_PATH/components/esp8266/ld/esp8266.ld';
+  Replace(cmdstr,'$IDF_PATH',idfpath);
+  success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,true);
+
+  { generate linker maps }
+  binstr:='$IDF_PATH/tools/ldgen/ldgen.py';
+  if (current_settings.controllertype = ct_esp32) then
+    cmdstr:='--config sdkconfig '+
+            '--fragments $IDF_PATH/components/xtensa/linker.lf $IDF_PATH/components/soc/linker.lf $IDF_PATH/components/esp_event/linker.lf '+
+            '$IDF_PATH/components/spi_flash/linker.lf $IDF_PATH/components/esp_wifi/linker.lf $IDF_PATH/components/lwip/linker.lf '+
+            '$IDF_PATH/components/heap/linker.lf $IDF_PATH/components/esp_ringbuf/linker.lf $IDF_PATH/components/espcoredump/linker.lf $IDF_PATH/components/esp32/linker.lf '+
+            '$IDF_PATH/components/esp32/ld/esp32_fragments.lf $IDF_PATH/components/freertos/linker.lf $IDF_PATH/components/newlib/newlib.lf '+
+            '$IDF_PATH/components/esp_gdbstub/linker.lf '+
+            '--input $IDF_PATH/components/esp32/ld/esp32.project.ld.in '+
+            '--output ./esp32.project.ld '+
+            '--kconfig $IDF_PATH/Kconfig '+
+            '--env-file config.env '+
+            '--libraries-file ldgen_libraries '+
+            '--objdump xtensa-esp32-elf-objdump'
+  else
+    cmdstr:='--config sdkconfig '+
+            '--fragments $IDF_PATH/components/esp8266/ld/esp8266_fragments.lf '+
+            '$IDF_PATH/components/esp8266/ld/esp8266_bss_fragments.lf $IDF_PATH/components/esp8266/linker.lf '+
+            '$IDF_PATH/components/freertos/linker.lf $IDF_PATH/components/log/linker.lf '+
+            '$IDF_PATH/components/lwip/linker.lf $IDF_PATH/components/spi_flash/linker.lf '+
+            '--env "COMPONENT_KCONFIGS_PROJBUILD=  $IDF_PATH/components/bootloader/Kconfig.projbuild '+
+            '$IDF_PATH/components/esptool_py/Kconfig.projbuild  $IDF_PATH/components/partition_table/Kconfig.projbuild"'+
+            '--env "COMPONENT_KCONFIGS=$IDF_PATH/components/app_update/Kconfig '+
+            '$IDF_PATH/components/esp8266/Kconfig  $IDF_PATH/components/freertos/Kconfig '+
+            '$IDF_PATH/components/log/Kconfig $IDF_PATH/components/lwip/Kconfig" '+
+            '--input $IDF_PATH/components/esp8266/ld/esp8266.project.ld.in '+
+            '--output ./esp8266.project.ld '+
+            '--kconfig $IDF_PATH/Kconfig '+
+            '--env-file config.env '+
+            '--libraries-file ldgen_libraries '+
+            '--objdump xtensa-lx106-elf-objdump';
+
+  Replace(binstr,'$IDF_PATH',idfpath);
+  Replace(cmdstr,'$IDF_PATH',idfpath);
+  if success and not(cs_link_nolink in current_settings.globalswitches) then
+    success:=DoExec(binstr,cmdstr,true,false);
+
+  if (current_settings.controllertype = ct_esp32) then
+    Info.ExeCmd[1] := Info.ExeCmd[1]+' -u call_user_start_cpu0 -u ld_include_panic_highint_hdl -u esp_app_desc -u vfs_include_syscalls_impl -u pthread_include_pthread_impl -u pthread_include_pthread_cond_impl -u pthread_include_pthread_local_storage_impl -u newlib_include_locks_impl '+
+       '-u newlib_include_heap_impl -u newlib_include_syscalls_impl -u newlib_include_pthread_impl -u app_main -u uxTopUsedPriority '+
+       '-L $IDF_PATH/components/esp_rom/esp32/ld '+
+       '-T esp32.rom.ld -T esp32.rom.libgcc.ld -T esp32.rom.newlib-data.ld -T esp32.rom.syscalls.ld -T esp32.rom.newlib-funcs.ld '+
+       '-L . -T esp32_out.ld -T esp32.project.ld '+
+       '-L $IDF_PATH/components/esp32/ld -T esp32.peripherals.ld'
+  else
+    Info.ExeCmd[1] := Info.ExeCmd[1]+' -u call_user_start -u g_esp_sys_info -u _printf_float -u _scanf_float '+
+      '-L $IDF_PATH/components/esp8266/ld -T esp8266.peripherals.ld -T esp8266.rom.ld '+ { SDK scripts }
+      '-L . -T esp8266_out.ld -T esp8266.project.ld'; { Project scripts }
+
+  Replace(Info.ExeCmd[1],'$IDF_PATH',idfpath);
+{$endif XTENSA}
 
 
-  if IDF_PATH <> '' then
-    Replace(Info.ExeCmd[1],'$'+IDF_PATH,maybequoted(GetEnvironmentVariable(IDF_PATH)));
   FixedExeFileName:=maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.elf')));
   FixedExeFileName:=maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.elf')));
 
 
   GCSectionsStr:='--gc-sections';
   GCSectionsStr:='--gc-sections';
-  //if not(cs_link_extern in current_settings.globalswitches) then
   if not(cs_link_nolink in current_settings.globalswitches) then
   if not(cs_link_nolink in current_settings.globalswitches) then
    Message1(exec_i_linking,current_module.exefilename);
    Message1(exec_i_linking,current_module.exefilename);
 
 
@@ -1179,8 +1216,6 @@ begin
 { Call linker }
 { Call linker }
   SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
   SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
   Replace(cmdstr,'$OPT',Info.ExtraOptions);
   Replace(cmdstr,'$OPT',Info.ExtraOptions);
-  if target_info.system=system_xtensa_freertos then
-    Replace(cmdstr,'$'+IDF_PATH,maybequoted(GetEnvironmentVariable(IDF_PATH)));
   if not(cs_link_on_target in current_settings.globalswitches) then
   if not(cs_link_on_target in current_settings.globalswitches) then
    begin
    begin
     Replace(cmdstr,'$EXE',FixedExeFileName);
     Replace(cmdstr,'$EXE',FixedExeFileName);
@@ -1212,32 +1247,31 @@ begin
   if success and not(cs_link_nolink in current_settings.globalswitches) then
   if success and not(cs_link_nolink in current_settings.globalswitches) then
     success:=PostProcessExecutable(FixedExeFileName,false);
     success:=PostProcessExecutable(FixedExeFileName,false);
 
 
-{$ifdef xtensa}
-  if success and (target_info.system=system_xtensa_freertos) then
-    if (current_settings.controllertype = ct_esp32) then
-      begin
-        binstr:='$'+IDF_PATH+'/components/esptool_py/esptool/esptool.py';
-        Replace(binstr,'$'+IDF_PATH,maybequoted(GetEnvironmentVariable(IDF_PATH)));
-        success:=DoExec(binstr,'--chip esp32 elf2image --flash_mode dio --flash_freq 40m '+
-          '--flash_size '+tostr(embedded_controllers[current_settings.controllertype].flashsize div (1024*1024))+'MB '+
-          '--elf-sha256-offset 0xb0 '+
-          '-o '+maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.bin')))+' '+
-          FixedExeFileName,
-          true,false);
-      end
-    else if (current_settings.controllertype = ct_esp8266) then
-      begin
-        binstr:='$'+IDF_PATH+'/components/esptool_py/esptool/esptool.py';
-        Replace(binstr,'$'+IDF_PATH,maybequoted(GetEnvironmentVariable(IDF_PATH)));
-        success:=DoExec(binstr,'--chip esp8266 elf2image --flash_mode dout --flash_freq 40m '+
-          '--flash_size '+tostr(embedded_controllers[current_settings.controllertype].flashsize div (1024*1024))+'MB '+
-          '--version=3 '+
-          '-o '+maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.bin')))+' '+
-          FixedExeFileName,
-          true,false);
-      end
+{$ifdef XTENSA}
+  if success then
+   begin
+      binstr:=idfpath+'/components/esptool_py/esptool/esptool.py';
+      if (current_settings.controllertype = ct_esp32) then
+        begin
+          success:=DoExec(binstr,'--chip esp32 elf2image --flash_mode dio --flash_freq 40m '+
+            '--flash_size '+tostr(embedded_controllers[current_settings.controllertype].flashsize div (1024*1024))+'MB '+
+            '--elf-sha256-offset 0xb0 '+
+            '-o '+maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.bin')))+' '+
+            FixedExeFileName,
+            true,false);
+        end
+      else if (current_settings.controllertype = ct_esp8266) then
+        begin
+          success:=DoExec(binstr,'--chip esp8266 elf2image --flash_mode dout --flash_freq 40m '+
+            '--flash_size '+tostr(embedded_controllers[current_settings.controllertype].flashsize div (1024*1024))+'MB '+
+            '--version=3 '+
+            '-o '+maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.bin')))+' '+
+            FixedExeFileName,
+            true,false);
+        end
+   end
   else
   else
-{$endif xtensa}
+{$endif XTENSA}
     if success then
     if success then
       success:=DoExec(FindUtil(utilsprefix+'objcopy'),'-O binary '+
       success:=DoExec(FindUtil(utilsprefix+'objcopy'),'-O binary '+
         FixedExeFileName+' '+
         FixedExeFileName+' '+

+ 1 - 1
compiler/systems/t_linux.pas

@@ -390,7 +390,7 @@ begin
   with Info do
   with Info do
    begin
    begin
      ExeCmd[1]:='ld '+platform_select+platformopt+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO -L. -o $EXE';
      ExeCmd[1]:='ld '+platform_select+platformopt+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO -L. -o $EXE';
-     DllCmd[1]:='ld '+platform_select+' $OPT $INIT $FINI $SONAME $MAP $LTO -shared $GCSECTIONS -L. -o $EXE';
+     DllCmd[1]:='ld '+platform_select+platformopt+' $OPT $INIT $FINI $SONAME $MAP $LTO -shared $GCSECTIONS -L. -o $EXE';
      { when we want to cross-link we need to override default library paths;
      { when we want to cross-link we need to override default library paths;
        when targeting binutils 2.19 or later, we use the "INSERT" command to
        when targeting binutils 2.19 or later, we use the "INSERT" command to
        augment the default linkerscript, which also requires -T (normally that
        augment the default linkerscript, which also requires -T (normally that

+ 9 - 6
compiler/systems/t_msdos.pas

@@ -102,14 +102,17 @@ implementation
 
 
   procedure tmsdostai_typedconstbuilder.add_link_ordered_symbol(sym: tasmsymbol; const secname: TSymStr);
   procedure tmsdostai_typedconstbuilder.add_link_ordered_symbol(sym: tasmsymbol; const secname: TSymStr);
     begin
     begin
-      with current_module.linkorderedsymbols do
-        if (Last=nil) or (TCmdStrListItem(Last).Str<>secname) then
-          current_module.linkorderedsymbols.concat(secname);
+      if (tf_smartlink_library in target_info.flags) and is_smartlink_vectorized_dead_strip then
+        begin
+          with current_module.linkorderedsymbols do
+            if (Last=nil) or (TCmdStrListItem(Last).Str<>secname) then
+              current_module.linkorderedsymbols.concat(secname);
+        end;
     end;
     end;
 
 
   class function tmsdostai_typedconstbuilder.get_vectorized_dead_strip_custom_section_name(const basename: TSymStr; st: tsymtable; options: ttcasmlistoptions; out secname: TSymStr): boolean;
   class function tmsdostai_typedconstbuilder.get_vectorized_dead_strip_custom_section_name(const basename: TSymStr; st: tsymtable; options: ttcasmlistoptions; out secname: TSymStr): boolean;
     begin
     begin
-      result:=is_smartlink_vectorized_dead_strip;
+      result:=(tf_smartlink_library in target_info.flags) and is_smartlink_vectorized_dead_strip;
       if not result then
       if not result then
         exit;
         exit;
       if tcalo_vectorized_dead_strip_start in options then
       if tcalo_vectorized_dead_strip_start in options then
@@ -126,9 +129,9 @@ implementation
   class function tmsdostai_typedconstbuilder.is_smartlink_vectorized_dead_strip: boolean;
   class function tmsdostai_typedconstbuilder.is_smartlink_vectorized_dead_strip: boolean;
     begin
     begin
 {$ifdef USE_LINKER_WLINK}
 {$ifdef USE_LINKER_WLINK}
-      result:=true;
+      result:=inherited or (tf_smartlink_library in target_info.flags);
 {$else}
 {$else}
-      result:=not (cs_link_extern in current_settings.globalswitches);
+      result:=inherited and not (cs_link_extern in current_settings.globalswitches);
 {$endif USE_LINKER_WLINK}
 {$endif USE_LINKER_WLINK}
     end;
     end;
 
 

+ 2 - 2
compiler/x86/agx86nsm.pas

@@ -84,7 +84,7 @@ interface
   implementation
   implementation
 
 
     uses
     uses
-      cutils,globals,systems,
+      cutils,globals,systems,fpccrc,
       fmodule,finput,verbose,cpuinfo,cgbase,omfbase
       fmodule,finput,verbose,cpuinfo,cgbase,omfbase
       ;
       ;
 
 
@@ -306,7 +306,7 @@ interface
         if current_settings.x86memorymodel in x86_far_code_models then
         if current_settings.x86memorymodel in x86_far_code_models then
           begin
           begin
             if cs_huge_code in current_settings.moduleswitches then
             if cs_huge_code in current_settings.moduleswitches then
-              result:=aname + '_TEXT'
+              result:=TrimStrCRC32(aname,30) + '_TEXT'
             else
             else
               result:=current_module.modulename^ + '_TEXT';
               result:=current_module.modulename^ + '_TEXT';
           end
           end

+ 12 - 0
compiler/x86/hlcgx86.pas

@@ -43,6 +43,8 @@ interface
      protected
      protected
       procedure gen_load_uninitialized_function_result(list: TAsmList; pd: tprocdef; resdef: tdef; const resloc: tcgpara); override;
       procedure gen_load_uninitialized_function_result(list: TAsmList; pd: tprocdef; resdef: tdef; const resloc: tcgpara); override;
       procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); override;
       procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); override;
+     public
+      procedure a_load_undefined_cgpara(list: TAsmList; size: tdef; const cgpara: TCGPara); override;
     end;
     end;
 
 
 implementation
 implementation
@@ -89,4 +91,14 @@ implementation
       list.concat(taicpu.op_ref(A_JMP,S_NO,ref));
       list.concat(taicpu.op_ref(A_JMP,S_NO,ref));
     end;
     end;
 
 
+
+  procedure thlcgx86.a_load_undefined_cgpara(list: TAsmList; size: tdef; const cgpara: TCGPara);
+    begin
+      if not (cgpara.Location^.Loc in [LOC_REGISTER,LOC_CREGISTER]) and
+        (cgpara.size=OS_ADDR) then
+        a_load_reg_cgpara(list,size,NR_FRAME_POINTER_REG,cgpara)
+      else
+        inherited;
+    end;
+
 end.
 end.

+ 2 - 6
compiler/xtensa/hlcgcpu.pas

@@ -115,16 +115,12 @@ implementation
     var
     var
       alt : TAsmListType;
       alt : TAsmListType;
     begin
     begin
-      if not(po_assembler in pd.procoptions) then
-        alt:=al_procedures
-      else
-        alt:=al_pure_assembler;
       { Xtensa needs the data before the subroutine }
       { Xtensa needs the data before the subroutine }
       if assigned(data) and
       if assigned(data) and
          (not data.empty) then
          (not data.empty) then
         begin
         begin
-          data.Insert(tai_align.Create(4));
-          current_asmdata.asmlists[alt].concatlist(data);
+          data.Concat(tai_align.Create(4));
+          code.insertlist(data);
         end;
         end;
       inherited record_generated_code_for_procdef(pd,code,nil);
       inherited record_generated_code_for_procdef(pd,code,nil);
     end;
     end;

+ 2 - 0
packages/fcl-js/src/jswriter.pp

@@ -441,6 +441,7 @@ end;
 {$endif}
 {$endif}
 
 
 { TJSWriter }
 { TJSWriter }
+{AllowWriteln}
 
 
 procedure TJSWriter.SetOptions(AValue: TWriteOptions);
 procedure TJSWriter.SetOptions(AValue: TWriteOptions);
 begin
 begin
@@ -1939,6 +1940,7 @@ begin
 //  Write('/* '+El.ClassName+' */');
 //  Write('/* '+El.ClassName+' */');
   FSkipCurlyBrackets:=False;
   FSkipCurlyBrackets:=False;
 end;
 end;
+{AllowWriteln-}
 
 
 {$ifdef HasFileWriter}
 {$ifdef HasFileWriter}
 { TFileWriter }
 { TFileWriter }

+ 30 - 1
packages/fcl-passrc/src/pasresolver.pp

@@ -1433,7 +1433,9 @@ type
   private
   private
     FOwner: TObject;
     FOwner: TObject;
   public
   public
-    constructor Create(TheOwner: TObject);
+    FinishedInterfaceCount: integer;
+    constructor Create(TheOwner: TObject); virtual;
+    procedure Reset; virtual;
     property Owner: TObject read FOwner;
     property Owner: TObject read FOwner;
   end;
   end;
   TPasResolverHubClass = class of TPasResolverHub;
   TPasResolverHubClass = class of TPasResolverHub;
@@ -1491,6 +1493,7 @@ type
     FDefaultScope: TPasDefaultScope;
     FDefaultScope: TPasDefaultScope;
     FDynArrayMaxIndex: TMaxPrecInt;
     FDynArrayMaxIndex: TMaxPrecInt;
     FDynArrayMinIndex: TMaxPrecInt;
     FDynArrayMinIndex: TMaxPrecInt;
+    FFinishedInterfaceIndex: integer;
     FHub: TPasResolverHub;
     FHub: TPasResolverHub;
     FLastCreatedData: array[TResolveDataListKind] of TResolveData;
     FLastCreatedData: array[TResolveDataListKind] of TResolveData;
     FLastElement: TPasElement;
     FLastElement: TPasElement;
@@ -2268,6 +2271,7 @@ type
       PosEl: TPasElement; RaiseIfConst: boolean = true): boolean;
       PosEl: TPasElement; RaiseIfConst: boolean = true): boolean;
     function ResolvedElIsClassOrRecordInstance(const ResolvedEl: TPasResolverResult): boolean;
     function ResolvedElIsClassOrRecordInstance(const ResolvedEl: TPasResolverResult): boolean;
     // utility functions
     // utility functions
+    function GetResolver(El: TPasElement): TPasResolver;
     function ElHasModeSwitch(El: TPasElement; ms: TModeSwitch): boolean;
     function ElHasModeSwitch(El: TPasElement; ms: TModeSwitch): boolean;
     function GetElModeSwitches(El: TPasElement): TModeSwitches;
     function GetElModeSwitches(El: TPasElement): TModeSwitches;
     function ElHasBoolSwitch(El: TPasElement; bs: TBoolSwitch): boolean;
     function ElHasBoolSwitch(El: TPasElement; bs: TBoolSwitch): boolean;
@@ -2403,6 +2407,7 @@ type
     property RootElement: TPasModule read FRootElement write SetRootElement;
     property RootElement: TPasModule read FRootElement write SetRootElement;
     property Step: TPasResolverStep read FStep;
     property Step: TPasResolverStep read FStep;
     property ActiveHelpers: TPRHelperEntryArray read FActiveHelpers;
     property ActiveHelpers: TPRHelperEntryArray read FActiveHelpers;
+    property FinishedInterfaceIndex: integer read FFinishedInterfaceIndex;
     // scopes
     // scopes
     property Scopes[Index: integer]: TPasScope read GetScopes;
     property Scopes[Index: integer]: TPasScope read GetScopes;
     property ScopeCount: integer read FScopeCount;
     property ScopeCount: integer read FScopeCount;
@@ -3084,6 +3089,11 @@ begin
   FOwner:=TheOwner;
   FOwner:=TheOwner;
 end;
 end;
 
 
+procedure TPasResolverHub.Reset;
+begin
+  FinishedInterfaceCount:=0;
+end;
+
 { TPRSpecializedItem }
 { TPRSpecializedItem }
 
 
 destructor TPRSpecializedItem.Destroy;
 destructor TPRSpecializedItem.Destroy;
@@ -5844,6 +5854,8 @@ begin
   if not IsUnitIntfFinished(Section.GetModule) then
   if not IsUnitIntfFinished(Section.GetModule) then
     RaiseInternalError(20171214004323,'TPasResolver.FinishInterfaceSection "'+RootElement.Name+'" "'+Section.GetModule.Name+'" IsUnitIntfFinished=false');
     RaiseInternalError(20171214004323,'TPasResolver.FinishInterfaceSection "'+RootElement.Name+'" "'+Section.GetModule.Name+'" IsUnitIntfFinished=false');
   {$ENDIF}
   {$ENDIF}
+  inc(Hub.FinishedInterfaceCount);
+  FFinishedInterfaceIndex:=Hub.FinishedInterfaceCount;
   NotifyPendingUsedInterfaces;
   NotifyPendingUsedInterfaces;
   if Section=nil then ;
   if Section=nil then ;
 end;
 end;
@@ -6583,6 +6595,9 @@ begin
 
 
       if ResolvedEl.LoTypeEl is TPasGenericTemplateType then
       if ResolvedEl.LoTypeEl is TPasGenericTemplateType then
         begin
         begin
+        if ResolvedEl.LoTypeEl=El then
+          RaiseMsg(20200820185313,nTypeCycleFound,sTypeCycleFound,[],
+                      GetGenericConstraintErrorEl(ConEl,El));
         // ok
         // ok
         if length(El.Constraints)>1 then
         if length(El.Constraints)>1 then
           RaiseXIsNotAValidConstraint(20190831213645,ResolvedEl.HiTypeEl.Name);
           RaiseXIsNotAValidConstraint(20190831213645,ResolvedEl.HiTypeEl.Name);
@@ -24957,6 +24972,20 @@ begin
     exit(true);
     exit(true);
 end;
 end;
 
 
+function TPasResolver.GetResolver(El: TPasElement): TPasResolver;
+var
+  Module: TPasModule;
+  Scope: TPasModuleScope;
+begin
+  Result:=nil;
+  if El=nil then exit;
+  Module:=El.GetModule;
+  if Module=nil then exit;
+  Scope:=Module.CustomData as TPasModuleScope;
+  if Scope=nil then exit;
+  Result:=Scope.Owner as TPasResolver;
+end;
+
 function TPasResolver.ElHasModeSwitch(El: TPasElement; ms: TModeSwitch
 function TPasResolver.ElHasModeSwitch(El: TPasElement; ms: TModeSwitch
   ): boolean;
   ): boolean;
 begin
 begin

+ 31 - 5
packages/fcl-passrc/src/pastree.pp

@@ -562,12 +562,15 @@ type
   { TPasGenericTemplateType - type param of a generic }
   { TPasGenericTemplateType - type param of a generic }
 
 
   TPasGenericTemplateType = Class(TPasType)
   TPasGenericTemplateType = Class(TPasType)
+  protected
+    procedure SetParent(const AValue: TPasElement); override;
   public
   public
     destructor Destroy; override;
     destructor Destroy; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
     procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
     procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
       const Arg: Pointer); override;
       const Arg: Pointer); override;
     procedure AddConstraint(El: TPasElement);
     procedure AddConstraint(El: TPasElement);
+    procedure ClearConstraints;
   Public
   Public
     TypeConstraint: String deprecated; // deprecated in fpc 3.3.1
     TypeConstraint: String deprecated; // deprecated in fpc 3.3.1
     Constraints: TPasElementArray; // list of TPasExpr or TPasType, can be nil!
     Constraints: TPasElementArray; // list of TPasExpr or TPasType, can be nil!
@@ -1962,13 +1965,20 @@ end;
 
 
 { TPasGenericTemplateType }
 { TPasGenericTemplateType }
 
 
+procedure TPasGenericTemplateType.SetParent(const AValue: TPasElement);
+begin
+  if (AValue=nil) and (Parent<>nil) then
+    begin
+    // parent is cleared
+    // -> clear all references to this class (releasing loops)
+    ClearConstraints;
+    end;
+  inherited SetParent(AValue);
+end;
+
 destructor TPasGenericTemplateType.Destroy;
 destructor TPasGenericTemplateType.Destroy;
-var
-  i: Integer;
 begin
 begin
-  for i:=0 to length(Constraints)-1 do
-    Constraints[i].Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
-  Constraints:=nil;
+  ClearConstraints;
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
@@ -2008,6 +2018,22 @@ begin
   Constraints[l]:=El;
   Constraints[l]:=El;
 end;
 end;
 
 
+procedure TPasGenericTemplateType.ClearConstraints;
+var
+  i: Integer;
+  aConstraint: TPasElement;
+begin
+  // -> clear all references to this class (releasing loops)
+  for i:=0 to length(Constraints)-1 do
+    begin
+    aConstraint:=Constraints[i];
+    if aConstraint.Parent=Self then
+      aConstraint.Parent:=nil;
+    aConstraint.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
+    end;
+  Constraints:=nil;
+end;
+
 {$IFDEF HasPTDumpStack}
 {$IFDEF HasPTDumpStack}
 procedure PTDumpStack;
 procedure PTDumpStack;
 begin
 begin

+ 14 - 16
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -329,6 +329,7 @@ function CompareElementWithPAElement(El, Id: Pointer): integer;
 function ComparePAOverrideLists(List1, List2: Pointer): integer;
 function ComparePAOverrideLists(List1, List2: Pointer): integer;
 function CompareElementWithPAOverrideList(El, List: Pointer): integer;
 function CompareElementWithPAOverrideList(El, List: Pointer): integer;
 {$endif}
 {$endif}
+function CreatePasElementSet: TPasAnalyzerKeySet;
 function GetElModName(El: TPasElement): string;
 function GetElModName(El: TPasElement): string;
 function dbgs(a: TPAIdentifierAccess): string; overload;
 function dbgs(a: TPAIdentifierAccess): string; overload;
 
 
@@ -394,6 +395,17 @@ begin
 end;
 end;
 {$endif}
 {$endif}
 
 
+function CreatePasElementSet: TPasAnalyzerKeySet;
+begin
+  Result:=TPasAnalyzerKeySet.Create(
+            {$ifdef pas2js}
+            @PasElementToHashName
+            {$else}
+            @ComparePointer
+            {$endif}
+            ,nil);
+end;
+
 function GetElModName(El: TPasElement): string;
 function GetElModName(El: TPasElement): string;
 var
 var
   aModule: TPasModule;
   aModule: TPasModule;
@@ -2977,23 +2989,9 @@ var
 begin
 begin
   CreateTree;
   CreateTree;
   for m in TPAUseMode do
   for m in TPAUseMode do
-    FModeChecked[m]:=TPasAnalyzerKeySet.Create(
-      {$ifdef pas2js}
-      @PasElementToHashName
-      {$else}
-      @ComparePointer
-      {$endif}
-      ,nil
-      );
+    FModeChecked[m]:=CreatePasElementSet;
   for oc in TPAOtherCheckedEl do
   for oc in TPAOtherCheckedEl do
-    FOtherChecked[oc]:=TPasAnalyzerKeySet.Create(
-      {$ifdef pas2js}
-      @PasElementToHashName
-      {$else}
-      @ComparePointer
-      {$endif}
-      ,nil
-      );
+    FOtherChecked[oc]:=CreatePasElementSet;
   FOverrideLists:=TPasAnalyzerKeySet.Create(
   FOverrideLists:=TPasAnalyzerKeySet.Create(
     {$ifdef pas2js}
     {$ifdef pas2js}
     @PAOverrideList_ElToHashName,@PasElementToHashName
     @PAOverrideList_ElToHashName,@PasElementToHashName

+ 6 - 1
packages/fcl-passrc/src/pparser.pp

@@ -4429,6 +4429,7 @@ var
   i: Integer;
   i: Integer;
   AObjKind: TPasObjKind;
   AObjKind: TPasObjKind;
   ok: Boolean;
   ok: Boolean;
+  GenTempl: TPasGenericTemplateType;
 begin
 begin
   Result:=nil;
   Result:=nil;
   ok := false;
   ok := false;
@@ -4517,7 +4518,11 @@ begin
     if (not ok) and (Result<>nil) and not AddToParent then
     if (not ok) and (Result<>nil) and not AddToParent then
       Result.Release({$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF});
       Result.Release({$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF});
     for i:=0 to TypeParams.Count-1 do
     for i:=0 to TypeParams.Count-1 do
-      TPasElement(TypeParams[i]).Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
+      begin
+      GenTempl:=TPasGenericTemplateType(TypeParams[i]);
+      GenTempl.Parent:=nil;
+      GenTempl.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
+      end;
     TypeParams.Free;
     TypeParams.Free;
   end;
   end;
 end;
 end;

+ 16 - 2
packages/fcl-passrc/tests/tcresolvegenerics.pas

@@ -34,6 +34,8 @@ type
     procedure TestGen_ConstraintSpecialize;
     procedure TestGen_ConstraintSpecialize;
     procedure TestGen_ConstraintTSpecializeWithT;
     procedure TestGen_ConstraintTSpecializeWithT;
     procedure TestGen_ConstraintTSpecializeAsTFail;
     procedure TestGen_ConstraintTSpecializeAsTFail;
+    procedure TestGen_ConstraintTcolonTFail; // A<T:T>
+    // ToDo: A<T:B<T>> fail
     procedure TestGen_TemplNameEqTypeNameFail;
     procedure TestGen_TemplNameEqTypeNameFail;
     procedure TestGen_ConstraintInheritedMissingRecordFail;
     procedure TestGen_ConstraintInheritedMissingRecordFail;
     procedure TestGen_ConstraintInheritedMissingClassTypeFail;
     procedure TestGen_ConstraintInheritedMissingClassTypeFail;
@@ -42,8 +44,6 @@ type
     procedure TestGen_ConstraintClassType_DotIsAsTypeCast;
     procedure TestGen_ConstraintClassType_DotIsAsTypeCast;
     procedure TestGen_ConstraintClassType_ForInT;
     procedure TestGen_ConstraintClassType_ForInT;
     procedure TestGen_ConstraintClassType_IsAs;
     procedure TestGen_ConstraintClassType_IsAs;
-    // ToDo: A<T:T> fail
-    // ToDo: A<T:B<T>> fail
 
 
     // generic record
     // generic record
     procedure TestGen_RecordLocalNameDuplicateFail;
     procedure TestGen_RecordLocalNameDuplicateFail;
@@ -429,6 +429,20 @@ begin
   CheckResolverException('identifier not found "T<>"',nIdentifierNotFound);
   CheckResolverException('identifier not found "T<>"',nIdentifierNotFound);
 end;
 end;
 
 
+procedure TTestResolveGenerics.TestGen_ConstraintTcolonTFail;
+begin
+  StartProgram(false);
+  Add([
+  '{$mode objfpc}',
+  'type',
+  '  TObject = class end;',
+  '  T = TObject;',
+  '  generic TAnt<T:T> = record v: word; end;',
+  'begin',
+  '']);
+  CheckResolverException(sTypeCycleFound,nTypeCycleFound);
+end;
+
 procedure TTestResolveGenerics.TestGen_TemplNameEqTypeNameFail;
 procedure TTestResolveGenerics.TestGen_TemplNameEqTypeNameFail;
 begin
 begin
   StartProgram(false);
   StartProgram(false);

+ 119 - 14
packages/pastojs/src/fppas2js.pp

@@ -465,9 +465,14 @@ unit FPPas2Js;
 interface
 interface
 
 
 uses
 uses
+  {$ifdef pas2js}
+  js,
+  {$else}
+  AVL_Tree,
+  {$endif}
   Classes, SysUtils, math, contnrs,
   Classes, SysUtils, math, contnrs,
   jsbase, jstree, jswriter,
   jsbase, jstree, jswriter,
-  PasTree, PScanner, PasResolveEval, PasResolver;
+  PasTree, PScanner, PasResolveEval, PasResolver, PasUseAnalyzer;
 
 
 // message numbers
 // message numbers
 const
 const
@@ -1372,6 +1377,15 @@ type
   { TPas2JSResolverHub }
   { TPas2JSResolverHub }
 
 
   TPas2JSResolverHub = class(TPasResolverHub)
   TPas2JSResolverHub = class(TPasResolverHub)
+  private
+    FJSSpecialized: TPasAnalyzerKeySet; // set of TPasGenericType
+  public
+    constructor Create(TheOwner: TObject); override;
+    destructor Destroy; override;
+    procedure Reset; override;
+    // delayed type specialization
+    procedure AddJSSpecialized(SpecType: TPasGenericType);
+    function IsJSSpecialized(SpecType: TPasGenericType): boolean;
   end;
   end;
 
 
   { TPas2JSResolver }
   { TPas2JSResolver }
@@ -1908,6 +1922,7 @@ type
     Function CreateVarStatement(const aName: String; Init: TJSElement;
     Function CreateVarStatement(const aName: String; Init: TJSElement;
       El: TPasElement): TJSVariableStatement; virtual;
       El: TPasElement): TJSVariableStatement; virtual;
     Function CreateVarDecl(const aName: String; Init: TJSElement; El: TPasElement): TJSVarDeclaration; virtual;
     Function CreateVarDecl(const aName: String; Init: TJSElement; El: TPasElement): TJSVarDeclaration; virtual;
+    Procedure InitJSSpecialization(aType: TPasType; AContext: TConvertContext; ErrorEl: TPasElement); virtual;
     // JS literals
     // JS literals
     Function CreateLiteralNumber(El: TPasElement; const n: TJSNumber): TJSLiteral; virtual;
     Function CreateLiteralNumber(El: TPasElement; const n: TJSNumber): TJSLiteral; virtual;
     Function CreateLiteralHexNumber(El: TPasElement; const n: TMaxPrecInt; Digits: byte): TJSLiteral; virtual;
     Function CreateLiteralHexNumber(El: TPasElement; const n: TMaxPrecInt; Digits: byte): TJSLiteral; virtual;
@@ -2317,6 +2332,36 @@ begin
   Result:='['+Result+']';
   Result:='['+Result+']';
 end;
 end;
 
 
+{ TPas2JSResolverHub }
+
+constructor TPas2JSResolverHub.Create(TheOwner: TObject);
+begin
+  inherited Create(TheOwner);
+  FJSSpecialized:=CreatePasElementSet;
+end;
+
+destructor TPas2JSResolverHub.Destroy;
+begin
+  FreeAndNil(FJSSpecialized);
+  inherited Destroy;
+end;
+
+procedure TPas2JSResolverHub.Reset;
+begin
+  inherited Reset;
+end;
+
+procedure TPas2JSResolverHub.AddJSSpecialized(SpecType: TPasGenericType);
+begin
+  if FJSSpecialized.FindItem(SpecType)=nil then
+    FJSSpecialized.Add(SpecType,false);
+end;
+
+function TPas2JSResolverHub.IsJSSpecialized(SpecType: TPasGenericType): boolean;
+begin
+  Result:=FJSSpecialized.FindItem(SpecType)<>nil;
+end;
+
 { TPas2JSModuleScope }
 { TPas2JSModuleScope }
 
 
 procedure TPas2JSModuleScope.SetJSPromiseClass(const AValue: TPasClassType);
 procedure TPas2JSModuleScope.SetJSPromiseClass(const AValue: TPasClassType);
@@ -4918,32 +4963,44 @@ var
   Param: TPasType;
   Param: TPasType;
   i: Integer;
   i: Integer;
   GenSection, ParamSection: TPasSection;
   GenSection, ParamSection: TPasSection;
+  ParamResolver, GenResolver: TPasResolver;
 begin
 begin
   Result:=nil;
   Result:=nil;
+  {$IFNDEF EnableDelaySpecialize}
+  exit;
+  {$ENDIF}
   Gen:=SpecializedItem.GenericEl;
   Gen:=SpecializedItem.GenericEl;
   GenSection:=GetParentSection(Gen);
   GenSection:=GetParentSection(Gen);
   if not (GenSection is TInterfaceSection) then
   if not (GenSection is TInterfaceSection) then
-    exit; // generic in unit implementation/program/library -> params cannot be defined a later section
-  GenMod:=GenSection.GetModule;
+    exit; // generic in unit implementation/program/library -> params cannot be defined in a later section -> no delay needed
+  GenMod:=nil;
+  GenResolver:=nil;
 
 
   Params:=SpecializedItem.Params;
   Params:=SpecializedItem.Params;
   for i:=0 to length(Params)-1 do
   for i:=0 to length(Params)-1 do
     begin
     begin
     Param:=ResolveAliasType(Params[i],false);
     Param:=ResolveAliasType(Params[i],false);
     if Param.ClassType=TPasUnresolvedSymbolRef then
     if Param.ClassType=TPasUnresolvedSymbolRef then
-      continue; // built-in type
+      continue; // built-in type -> no delay needed
     ParamSection:=GetParentSection(Param);
     ParamSection:=GetParentSection(Param);
-    if ParamSection=GenSection then continue;
+    if ParamSection=GenSection then
+      continue; // same section -> no delay needed
     // not in same section
     // not in same section
     ParamMod:=ParamSection.GetModule;
     ParamMod:=ParamSection.GetModule;
+    if GenMod=nil then
+      GenMod:=GenSection.GetModule;
     if ParamMod=GenMod then
     if ParamMod=GenMod then
-      exit(Param); // generic in unit interface, specialize in implementation
+      exit(Param); // generic in unit interface, param in implementation
     // param in another unit
     // param in another unit
     if ParamSection is TImplementationSection then
     if ParamSection is TImplementationSection then
-      exit(Param); // generic in unit interface, specialize in another(later) implementation
+      exit(Param); // generic in unit interface, param in another implementation
     // param in another unit interface
     // param in another unit interface
-
-    //xxx
+    if GenResolver=nil then
+      GenResolver:=GetResolver(GenMod);
+    ParamResolver:=GetResolver(ParamMod);
+    if ParamResolver.FinishedInterfaceIndex<GenResolver.FinishedInterfaceIndex then
+      exit(Param); // param in a later unit interface
+    // generic in a later unit interface -> no delay needed
     end;
     end;
 end;
 end;
 
 
@@ -14422,7 +14479,7 @@ begin
         continue;
         continue;
         end
         end
       else if C=TPasAttributes then
       else if C=TPasAttributes then
-        // ToDo
+        continue
       else
       else
         RaiseNotSupported(P as TPasElement,AContext,20161024191434);
         RaiseNotSupported(P as TPasElement,AContext,20161024191434);
       Add(E,P);
       Add(E,P);
@@ -22545,6 +22602,53 @@ begin
   Result.Init:=Init;
   Result.Init:=Init;
 end;
 end;
 
 
+procedure TPasToJSConverter.InitJSSpecialization(aType: TPasType;
+  AContext: TConvertContext; ErrorEl: TPasElement);
+var
+  aResolver: TPas2JSResolver;
+  SpecTypeData: TPasSpecializeTypeData;
+  Hub: TPas2JSResolverHub;
+  SpecType: TPasGenericType;
+  C: TClass;
+  FuncCtx: TFunctionContext;
+  SrcEl: TJSSourceElements;
+begin
+  while aType<>nil do
+    begin
+    C:=aType.ClassType;
+    if C=TPasAliasType then
+      aType:=TPasAliasType(aType).DestType
+    else if C=TPasSpecializeType then
+      begin
+      // specialized type
+      SpecTypeData:=aType.CustomData as TPasSpecializeTypeData;
+      if SpecTypeData=nil then
+        RaiseNotSupported(aType,AContext,20200815210904);
+      aResolver:=AContext.Resolver;
+      Hub:=TPas2JSResolverHub(aResolver.Hub);
+      SpecType:=SpecTypeData.SpecializedType;
+      if Hub.IsJSSpecialized(SpecType) then exit;
+      Hub.AddJSSpecialized(SpecType);
+      FuncCtx:=AContext.GetGlobalFunc;
+      SrcEl:=FuncCtx.JSElement as TJSSourceElements;
+
+      if SrcEl=nil then ;
+
+      if SpecType is TPasRecordType then
+        begin
+        // add $mod.TAnt$G1();
+        //CreateReferencePath();
+        RaiseNotSupported(ErrorEl,AContext,20200815215652);
+        end
+      else
+        RaiseNotSupported(ErrorEl,AContext,20200815215338);
+      exit;
+      end
+    else
+      exit;
+    end;
+end;
+
 function TPasToJSConverter.CreateLiteralNumber(El: TPasElement;
 function TPasToJSConverter.CreateLiteralNumber(El: TPasElement;
   const n: TJSNumber): TJSLiteral;
   const n: TJSNumber): TJSLiteral;
 begin
 begin
@@ -24639,6 +24743,7 @@ var
   ok, IsFull: Boolean;
   ok, IsFull: Boolean;
   VarSt: TJSVariableStatement;
   VarSt: TJSVariableStatement;
   bifn: TPas2JSBuiltInName;
   bifn: TPas2JSBuiltInName;
+  RecScope: TPas2JSRecordScope;
 begin
 begin
   Result:=nil;
   Result:=nil;
   if El.Name='' then
   if El.Name='' then
@@ -24657,14 +24762,14 @@ begin
     // rtl.recNewT()
     // rtl.recNewT()
     Call:=CreateCallExpression(El);
     Call:=CreateCallExpression(El);
     bifn:=pbifnRecordCreateType;
     bifn:=pbifnRecordCreateType;
-    {$IFDEF EnableDelaySpecialize}
+
     RecScope:=TPas2JSRecordScope(El.CustomData);
     RecScope:=TPas2JSRecordScope(El.CustomData);
     if RecScope.SpecializedFromItem<>nil then
     if RecScope.SpecializedFromItem<>nil then
       begin
       begin
-      if RecScope.SpecializedFromItem.FirstSpecialize.GetModule<>EL.GetModule then
-        bifn:=pbifnRecordCreateSpecializeType;
+      // ToDo
+      //if aResolver.SpecializeNeedsDelay(RecScope.SpecializedFromItem)<>nil then
+        //bifn:=pbifnRecordCreateSpecializeType;
       end;
       end;
-    {$ENDIF}
 
 
     Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(bifn)]);
     Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(bifn)]);
 
 

+ 1 - 0
packages/pastojs/src/pas2jscompiler.pp

@@ -4413,6 +4413,7 @@ end;
 
 
 procedure TPas2jsCompiler.Reset;
 procedure TPas2jsCompiler.Reset;
 begin
 begin
+  FResolverHub.Reset;
   FreeAndNil(FWPOAnalyzer);
   FreeAndNil(FWPOAnalyzer);
   FPrecompileGUID:=default(TGUID);
   FPrecompileGUID:=default(TGUID);
   FNamespaces.Clear;
   FNamespaces.Clear;

+ 8 - 1
packages/pastojs/src/pas2jsfilecache.pp

@@ -1988,11 +1988,18 @@ var
 
 
   function SearchInDir(Dir: string; var Filename: string): boolean;
   function SearchInDir(Dir: string; var Filename: string): boolean;
   // search in Dir for pp, pas, p times given case, lower case, upper case
   // search in Dir for pp, pas, p times given case, lower case, upper case
+  var
+    CurFile : String;
   begin
   begin
     Dir:=IncludeTrailingPathDelimiter(Dir);
     Dir:=IncludeTrailingPathDelimiter(Dir);
     if IndexOfFile(SearchedDirs,Dir)>=0 then exit(false);
     if IndexOfFile(SearchedDirs,Dir)>=0 then exit(false);
     SearchedDirs.Add(Dir);
     SearchedDirs.Add(Dir);
-    if SearchLowUpCase(Filename) then exit(true);
+    CurFile:=Dir+Filename;
+    if SearchLowUpCase(CurFile) then
+      begin
+      FileName:=CurFile;
+      exit(true);
+      end;
     Result:=false;
     Result:=false;
   end;
   end;
 
 

+ 0 - 6
rtl/freertos/xtensa/esp8266.pp

@@ -9,7 +9,6 @@ unit esp8266;
   interface
   interface
 
 
 {$linklib esp8266, static}
 {$linklib esp8266, static}
-{$linklib util, static}
 {$linklib log, static}
 {$linklib log, static}
 {$linklib c_fnano, static}
 {$linklib c_fnano, static}
 {$linklib newlib, static}
 {$linklib newlib, static}
@@ -29,11 +28,6 @@ unit esp8266;
 {$linklib pp, static}
 {$linklib pp, static}
 {$linklib stdc++, static}
 {$linklib stdc++, static}
 {$linklib pthread, static}
 {$linklib pthread, static}
-{$linklib wpa_supplicant, static}
-//{$linklib esp_event, static} // Not in V3.3
-{$linklib wpa, static}  // not in master version
-{$linklib lwip, static}
-{$linklib mbedtls, static}
 
 
   implementation
   implementation
 
 

+ 22 - 0
rtl/inc/objpas.inc

@@ -1172,6 +1172,28 @@
       inherited;
       inherited;
     end;
     end;
 
 
+{****************************************************************************
+                               TCustomStoredAttribute
+****************************************************************************}
+
+
+    constructor StoredAttribute.Create;
+    begin
+    end;
+
+
+    constructor  StoredAttribute.Create(Const aFlag : Boolean);
+    begin
+      FFlag:=aFlag;
+    end;
+
+
+
+    constructor StoredAttribute.Create(Const aName : string);
+    begin
+      FName:=aName;
+    end;
+
 
 
 {****************************************************************************
 {****************************************************************************
                              Exception Support
                              Exception Support

+ 18 - 1
rtl/inc/objpash.inc

@@ -440,7 +440,24 @@
          constructor Create;
          constructor Create;
        end;
        end;
        {$POP}
        {$POP}
-
+       WeakAttribute = class(TCustomAttribute);
+       UnsafeAttribute = class(TCustomAttribute);
+       RefAttribute = class(TCustomAttribute);
+       VolatileAttribute = class(TCustomAttribute);
+       
+       StoredAttribute = Class(TCustomAttribute)
+       Private
+          FFlag : Boolean;
+          FName : String;
+       Public
+         Constructor Create; 
+         Constructor Create(Const aFlag : Boolean); 
+         Constructor Create(Const aName : String); 
+         Property Flag : Boolean Read FFlag;
+         Property Name : String Read FName; 
+       end;
+       
+  
     Const
     Const
        ExceptProc : TExceptProc = Nil;
        ExceptProc : TExceptProc = Nil;
        RaiseProc : TExceptProc = Nil;
        RaiseProc : TExceptProc = Nil;

+ 6 - 6
rtl/objpas/typinfo.pp

@@ -477,12 +477,12 @@ unit TypInfo;
         case TTypeKind of
         case TTypeKind of
           tkRecord: (
           tkRecord: (
             Terminator: Pointer;
             Terminator: Pointer;
-            Size: Integer;
+            Size: Longint;
 {$ifndef VER3_0}
 {$ifndef VER3_0}
             InitOffsetOp: PRecOpOffsetTable;
             InitOffsetOp: PRecOpOffsetTable;
             ManagementOp: Pointer;
             ManagementOp: Pointer;
 {$endif}
 {$endif}
-            ManagedFieldCount: Integer;
+            ManagedFieldCount: Longint;
           { ManagedFields: array[0..ManagedFieldCount - 1] of TInitManagedField ; }
           { ManagedFields: array[0..ManagedFieldCount - 1] of TInitManagedField ; }
           );
           );
           { include for proper alignment }
           { include for proper alignment }
@@ -710,10 +710,10 @@ unit TypInfo;
 {$ifndef VER3_0}
 {$ifndef VER3_0}
                 RecInitInfo: Pointer; { points to TTypeInfo followed by init table }
                 RecInitInfo: Pointer; { points to TTypeInfo followed by init table }
 {$endif VER3_0}
 {$endif VER3_0}
-                RecSize: Integer;
+                RecSize: Longint;
                 case Boolean of
                 case Boolean of
-                  False: (ManagedFldCount: Integer deprecated 'Use RecInitData^.ManagedFieldCount or TotalFieldCount depending on your use case');
-                  True: (TotalFieldCount: Integer);
+                  False: (ManagedFldCount: Longint deprecated 'Use RecInitData^.ManagedFieldCount or TotalFieldCount depending on your use case');
+                  True: (TotalFieldCount: Longint);
                 {ManagedFields: array[1..TotalFieldCount] of TManagedField}
                 {ManagedFields: array[1..TotalFieldCount] of TManagedField}
               );
               );
             tkHelper:
             tkHelper:
@@ -812,7 +812,7 @@ unit TypInfo;
         GetProc : CodePointer;
         GetProc : CodePointer;
         SetProc : CodePointer;
         SetProc : CodePointer;
         StoredProc : CodePointer;
         StoredProc : CodePointer;
-        Index : Integer;
+        Index : Longint;
         Default : Longint;
         Default : Longint;
         NameIndex : SmallInt;
         NameIndex : SmallInt;