Browse Source

* synchronized with trunk

git-svn-id: branches/unicodekvm@49078 -
nickysn 4 years ago
parent
commit
7371e7c105
76 changed files with 3681 additions and 709 deletions
  1. 9 0
      .gitattributes
  2. 1 1
      Makefile
  3. 1 1
      Makefile.fpc
  4. 6 0
      compiler/arm/cpuinfo.pas
  5. 1 1
      compiler/assemble.pas
  6. 4 4
      compiler/cgutils.pas
  7. 48 40
      compiler/dbgdwarf.pas
  8. 28 2
      compiler/i386/n386flw.pas
  9. 1 1
      compiler/link.pas
  10. 105 24
      compiler/nbas.pas
  11. 16 6
      compiler/nflw.pas
  12. 17 7
      compiler/ninl.pas
  13. 2 0
      compiler/nld.pas
  14. 5 0
      compiler/raatt.pas
  15. 185 214
      compiler/systems/t_darwin.pas
  16. 2 0
      compiler/systems/t_embed.pas
  17. 5 0
      compiler/x86/rax86int.pas
  18. 117 77
      installer/install.dat
  19. 11 7
      packages/chm/src/chmfilewriter.pas
  20. 4 0
      packages/fcl-db/src/sqldb/odbc/odbcconn.pas
  21. 31 1
      packages/fcl-js/src/jstree.pp
  22. 61 26
      packages/fcl-js/src/jswriter.pp
  23. 61 5
      packages/fcl-js/tests/tcsrcmap.pas
  24. 48 0
      packages/fcl-passrc/src/pasresolveeval.pas
  25. 99 7
      packages/fcl-passrc/src/pasresolver.pp
  26. 26 3
      packages/fcl-passrc/src/pastree.pp
  27. 25 2
      packages/fcl-passrc/src/pasuseanalyzer.pas
  28. 1 0
      packages/fcl-process/src/win/process.inc
  29. 5 0
      packages/odbc/src/odbcsql.inc
  30. 278 96
      packages/pastojs/src/fppas2js.pp
  31. 1 1
      packages/pastojs/src/pas2jsfiler.pp
  32. 1 1
      packages/pastojs/tests/tcgenerics.pas
  33. 84 13
      packages/pastojs/tests/tcmodules.pas
  34. 42 0
      packages/pastojs/tests/tcprecompile.pas
  35. 1 1
      packages/qlunits/fpmake.pp
  36. 5 5
      packages/qlunits/src/qlfloat.pas
  37. 34 9
      packages/regexpr/src/regexpr.pas
  38. 3 3
      packages/rtl-generics/src/generics.defaults.pas
  39. 6 6
      packages/rtl-objpas/src/inc/strutils.pp
  40. 2 2
      packages/rtl-objpas/src/inc/variants.pp
  41. 1 1
      rtl/amicommon/paramhandling.inc
  42. 2 1
      rtl/embedded/Makefile
  43. 2 1
      rtl/embedded/Makefile.fpc
  44. 2093 0
      rtl/embedded/arm/samd51p19a.pp
  45. 0 4
      rtl/inc/compproc.inc
  46. 7 7
      rtl/inc/dynlib.inc
  47. 1 1
      rtl/inc/filerec.inc
  48. 0 12
      rtl/inc/generic.inc
  49. 0 27
      rtl/inc/rtti.inc
  50. 0 7
      rtl/inc/rttidecl.inc
  51. 1 2
      rtl/inc/system.inc
  52. 2 14
      rtl/inc/systemh.inc
  53. 1 1
      rtl/inc/textrec.inc
  54. 1 1
      rtl/java/jsystemh.inc
  55. 3 4
      rtl/objpas/character.pas
  56. 1 1
      rtl/objpas/classes/classesh.inc
  57. 1 1
      rtl/objpas/classes/lists.inc
  58. 12 22
      rtl/objpas/fgl.pp
  59. 1 1
      rtl/objpas/objpas.pp
  60. 0 3
      rtl/objpas/sysutils/sysencoding.inc
  61. 0 2
      rtl/objpas/sysutils/sysencodingh.inc
  62. 0 5
      rtl/objpas/sysutils/sysstr.inc
  63. 6 18
      rtl/win/systhrd.inc
  64. 2 2
      tests/Makefile
  65. 2 2
      tests/Makefile.fpc
  66. 26 0
      tests/test/trtti21.pp
  67. 17 0
      tests/test/trtti22.pp
  68. 27 0
      tests/test/trtti23.pp
  69. 15 0
      tests/webtbs/tw28640.pp
  70. 14 0
      tests/webtbs/tw28640a.pp
  71. 16 0
      tests/webtbs/tw34232.pp
  72. 21 0
      tests/webtbs/tw38636.pp
  73. 14 0
      tests/webtbs/tw38642.pp
  74. 1 1
      utils/fpmake.pp
  75. 8 0
      utils/pas2js/dist/rtl.js
  76. 1 2
      utils/pas2js/httpcompiler.pp

+ 9 - 0
.gitattributes

@@ -10650,6 +10650,7 @@ rtl/embedded/arm/nrf51.pp svneol=native#text/pascal
 rtl/embedded/arm/nrf52.pp svneol=native#text/pascal
 rtl/embedded/arm/raspi2.pp svneol=native#text/pascal
 rtl/embedded/arm/sam3x8e.pp svneol=native#text/pascal
+rtl/embedded/arm/samd51p19a.pp svneol=native#text/pascal
 rtl/embedded/arm/sc32442b.pp svneol=native#text/pascal
 rtl/embedded/arm/stm32f0xx.pp svneol=native#text/plain
 rtl/embedded/arm/stm32f10x_cl.pp svneol=native#text/plain
@@ -15915,6 +15916,9 @@ tests/test/trtti18b.pp svneol=native#text/pascal
 tests/test/trtti19.pp svneol=native#text/pascal
 tests/test/trtti2.pp svneol=native#text/plain
 tests/test/trtti20.pp svneol=native#text/pascal
+tests/test/trtti21.pp svneol=native#text/pascal
+tests/test/trtti22.pp svneol=native#text/pascal
+tests/test/trtti23.pp svneol=native#text/pascal
 tests/test/trtti3.pp svneol=native#text/plain
 tests/test/trtti4.pp svneol=native#text/plain
 tests/test/trtti5.pp svneol=native#text/plain
@@ -18211,6 +18215,8 @@ tests/webtbs/tw2853e.pp svneol=native#text/plain
 tests/webtbs/tw2859.pp svneol=native#text/plain
 tests/webtbs/tw28593.pp svneol=native#text/plain
 tests/webtbs/tw28632.pp -text svneol=native#text/plain
+tests/webtbs/tw28640.pp svneol=native#text/pascal
+tests/webtbs/tw28640a.pp svneol=native#text/pascal
 tests/webtbs/tw28641.pp svneol=native#text/plain
 tests/webtbs/tw2865.pp svneol=native#text/plain
 tests/webtbs/tw28650.pp svneol=native#text/pascal
@@ -18560,6 +18566,7 @@ tests/webtbs/tw3411.pp svneol=native#text/plain
 tests/webtbs/tw34124.pp svneol=native#text/pascal
 tests/webtbs/tw3418.pp svneol=native#text/plain
 tests/webtbs/tw3423.pp svneol=native#text/plain
+tests/webtbs/tw34232.pp svneol=native#text/pascal
 tests/webtbs/tw34239.pp svneol=native#text/pascal
 tests/webtbs/tw34287.pp svneol=native#text/pascal
 tests/webtbs/tw3429.pp svneol=native#text/plain
@@ -18824,7 +18831,9 @@ tests/webtbs/tw38549b.pp svneol=native#text/plain
 tests/webtbs/tw38549c.pp svneol=native#text/plain
 tests/webtbs/tw38549d.pp svneol=native#text/plain
 tests/webtbs/tw3863.pp svneol=native#text/plain
+tests/webtbs/tw38636.pp svneol=native#text/plain
 tests/webtbs/tw3864.pp svneol=native#text/plain
+tests/webtbs/tw38642.pp svneol=native#text/pascal
 tests/webtbs/tw3865.pp svneol=native#text/plain
 tests/webtbs/tw3870.pp svneol=native#text/plain
 tests/webtbs/tw3893.pp svneol=native#text/plain

+ 1 - 1
Makefile

@@ -350,7 +350,7 @@ endif
 override PACKAGE_NAME=fpc
 override PACKAGE_VERSION=3.3.1
 REQUIREDVERSION=3.2.0
-REQUIREDVERSION2=3.0.4
+REQUIREDVERSION2=3.2.2
 ifndef inOS2
 override FPCDIR:=$(BASEDIR)
 export FPCDIR

+ 1 - 1
Makefile.fpc

@@ -21,7 +21,7 @@ rule=help
 
 [prerules]
 REQUIREDVERSION=3.2.0
-REQUIREDVERSION2=3.0.4
+REQUIREDVERSION2=3.2.2
 
 
 # make versions < 3.77 (OS2 version) are buggy

+ 6 - 0
compiler/arm/cpuinfo.pas

@@ -496,8 +496,10 @@ Type
 
       { Atmel }
       ct_sam3x8e,
+      ct_samd51p19a,
       ct_arduino_due,
       ct_flip_n_click,
+      ct_wio_terminal,
       
       { Nordic Semiconductor }
       ct_nrf51422_xxaa,
@@ -1019,8 +1021,12 @@ Const
 
       { Atmel }
       (controllertypestr:'ATSAM3X8E';     controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
+
+      (controllertypestr:'SAMD51P19A';    controllerunitstr:'SAMD51P19A'; cputype:cpu_armv7em; fputype:fpu_fpv4_sp_d16; flashbase:$00000000; flashsize:$00080000; srambase:$20000000; sramsize:$00030000),
+      
       (controllertypestr:'ARDUINO_DUE';   controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
       (controllertypestr:'FLIP_N_CLICK';  controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
+      (controllertypestr:'WIO_TERMINAL'; controllerunitstr:'SAMD51P19A'   ; cputype:cpu_armv7em; fputype:fpu_fpv4_sp_d16; flashbase:$00004000; flashsize:$0007C000; srambase:$20000000; sramsize:$00030000),
       
       { Nordic Semiconductor }
       (controllertypestr:'NRF51422_XXAA'; controllerunitstr:'NRF51'; cputype:cpu_armv6m; fputype:fpu_soft; flashbase:$00000000; flashsize:$00040000;      srambase:$20000000; sramsize:$00004000),

+ 1 - 1
compiler/assemble.pas

@@ -750,7 +750,7 @@ Implementation
 {$ifdef hasunix}
         DoPipe:=(cs_asm_pipe in current_settings.globalswitches) and
                 (([cs_asm_extern,cs_asm_leave,cs_assemble_on_target] * current_settings.globalswitches) = []) and
-                ((asminfo^.id in [as_gas,as_ggas,as_darwin,as_powerpc_xcoff,as_clang_gas,as_clang_llvm,as_solaris_as]));
+                ((asminfo^.id in [as_gas,as_ggas,as_darwin,as_powerpc_xcoff,as_clang_gas,as_clang_llvm,as_solaris_as,as_clang_asdarwin]));
 {$else hasunix}
         DoPipe:=false;
 {$endif}

+ 4 - 4
compiler/cgutils.pas

@@ -192,8 +192,8 @@ unit cgutils;
     {# Clear to zero a treference, and set is base address
        to base register.
     }
-    procedure reference_reset_base(var ref : treference;base : tregister;offset : longint; temppos : treftemppos; alignment : longint; volatility: tvolatilityset);
-    procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset, alignment : longint; volatility: tvolatilityset);
+    procedure reference_reset_base(var ref: treference; base: tregister; offset: asizeint; temppos: treftemppos; alignment: longint; volatility: tvolatilityset);
+    procedure reference_reset_symbol(var ref: treference;sym: tasmsymbol; offset: asizeint; alignment : longint; volatility: tvolatilityset);
     { This routine verifies if two references are the same, and
        if so, returns TRUE, otherwise returns false.
     }
@@ -244,7 +244,7 @@ uses
       end;
 
 
-    procedure reference_reset_base(var ref: treference; base: tregister; offset : longint; temppos : treftemppos ; alignment : longint; volatility: tvolatilityset);
+    procedure reference_reset_base(var ref: treference; base: tregister; offset: asizeint; temppos: treftemppos ; alignment: longint; volatility: tvolatilityset);
       begin
         reference_reset(ref,alignment,volatility);
         ref.base:=base;
@@ -253,7 +253,7 @@ uses
       end;
 
 
-    procedure reference_reset_symbol(var ref: treference; sym: tasmsymbol; offset, alignment: longint; volatility: tvolatilityset);
+    procedure reference_reset_symbol(var ref: treference; sym: tasmsymbol; offset: asizeint; alignment: longint; volatility: tvolatilityset);
       begin
         reference_reset(ref,alignment,volatility);
         ref.symbol:=sym;

+ 48 - 40
compiler/dbgdwarf.pas

@@ -4609,34 +4609,39 @@ implementation
 
     procedure TDebugInfoDwarf3.appenddef_variant(list:TAsmList;def: tvariantdef);
       const
-        VARIANTS: array[1..27] of record Value: Word; Name: String end = (
-          (value:0;     name:''),
-          (value:1;     name:''),
-          (value:2;     name:'VSMALLINT'),
-          (value:3;     name:'VINTEGER'),
-          (value:4;     name:'VSINGLE'),
-          (value:5;     name:'VDOUBLE'),
-          (value:6;     name:'VCURRENCY'),
-          (value:7;     name:'VDATE'),
-          (value:8;     name:'VOLESTR'),
-          (value:9;     name:'VDISPATCH'),
-          (value:10;    name:'VERROR'),
-          (value:11;    name:'VBOOLEAN'),
-          (value:12;    name:''),
-          (value:13;    name:'VUNKNOWN'),
-          (value:14;    name:''),
-          (value:16;    name:'VSHORTINT'),
-          (value:17;    name:'VBYTE'),
-          (value:18;    name:'VWORD'),
-          (value:19;    name:'VLONGWORD'),
-          (value:20;    name:'VINT64'),
-          (value:21;    name:'VQWORD'),
-          (value:36;    name:'VRECORD'),
-          (value:$48;   name:''),
-          (value:$100;  name:'VSTRING'),
-          (value:$101;  name:'VANY'),
-          (value:$2000; name:'VARRAY'),
-          (value:$4000; name:'VPOINTER')
+        VARIANTS: array[1..27] of record
+          Value: Word;
+          Name: String;
+          { some fields are only supported by some features }
+          features : tfeatures
+        end = (
+          (value:0;     name:'';features: []),
+          (value:1;     name:'';features: []),
+          (value:2;     name:'VSMALLINT';features: []),
+          (value:3;     name:'VINTEGER';features: []),
+          (value:4;     name:'VSINGLE';features: [f_softfpu]),
+          (value:5;     name:'VDOUBLE';features: [f_softfpu]),
+          (value:6;     name:'VCURRENCY';features: [f_softfpu]),
+          (value:7;     name:'VDATE';features: [f_softfpu]),
+          (value:8;     name:'VOLESTR';features: []),
+          (value:9;     name:'VDISPATCH';features: []),
+          (value:10;    name:'VERROR';features: []),
+          (value:11;    name:'VBOOLEAN';features: []),
+          (value:12;    name:'';features: []),
+          (value:13;    name:'VUNKNOWN';features: []),
+          (value:14;    name:'';features: []),
+          (value:16;    name:'VSHORTINT';features: []),
+          (value:17;    name:'VBYTE';features: []),
+          (value:18;    name:'VWORD';features: []),
+          (value:19;    name:'VLONGWORD';features: []),
+          (value:20;    name:'VINT64';features: []),
+          (value:21;    name:'VQWORD';features: []),
+          (value:36;    name:'VRECORD';features: []),
+          (value:$48;   name:'';features: []),
+          (value:$100;  name:'VSTRING';features: []),
+          (value:$101;  name:'VANY';features: []),
+          (value:$2000; name:'VARRAY';features: []),
+          (value:$4000; name:'VPOINTER';features: [])
         );
       var
         fs: tfieldvarsym;
@@ -4669,20 +4674,23 @@ implementation
         { variants }
         for idx := Low(VARIANTS) to High(VARIANTS) do
           begin
-            append_entry(DW_TAG_variant,true,[
-              DW_AT_discr_value,DW_FORM_udata,VARIANTS[idx].value
-              ]);
-            finish_entry;
-
-            if VARIANTS[idx].name <> '' then
+            if (features*VARIANTS[idx].features)=VARIANTS[idx].features then
               begin
-                fs := tfieldvarsym(vardatadef.symtable.Find(VARIANTS[idx].name));
-                if (fs = nil) or (fs.typ <> fieldvarsym) then
-                  internalerror(20060927200+idx);
-                appendsym_fieldvar(list,fs);
-              end;
+                append_entry(DW_TAG_variant,true,[
+                  DW_AT_discr_value,DW_FORM_udata,VARIANTS[idx].value
+                  ]);
+                finish_entry;
 
-            finish_children; { variant }
+                if VARIANTS[idx].name <> '' then
+                  begin
+                    fs := tfieldvarsym(vardatadef.symtable.Find(VARIANTS[idx].name));
+                    if (fs = nil) or (fs.typ <> fieldvarsym) then
+                      internalerror(2006092702+idx);
+                    appendsym_fieldvar(list,fs);
+                  end;
+
+                finish_children; { variant }
+              end;
           end;
 
 

+ 28 - 2
compiler/i386/n386flw.pas

@@ -46,6 +46,7 @@ interface
       constructor create(l,r:TNode);override;
       constructor create_implicit(l,r:TNode);override;
       function pass_1: tnode;override;
+	  function dogetcopy : tnode;override;
       function simplify(forinline: boolean): tnode;override;
       procedure pass_generate_code;override;
     end;
@@ -59,7 +60,7 @@ implementation
     cgbase,cgobj,cgcpu,cgutils,tgobj,
     cpubase,htypechk,
     parabase,paramgr,pass_1,pass_2,ncgutil,cga,
-    aasmbase,aasmtai,aasmdata,aasmcpu,procinfo,cpupi;
+    aasmbase,aasmtai,aasmdata,aasmcpu,procinfo,cpupi,procdefutil;
 
   var
     endexceptlabel: tasmlabel;
@@ -215,6 +216,30 @@ function ti386tryfinallynode.pass_1: tnode;
       end;
   end;
 
+function ti386tryfinallynode.dogetcopy: tnode;
+  var
+    n: ti386tryfinallynode;
+  begin
+	n:=ti386tryfinallynode(inherited dogetcopy);
+	if target_info.system=system_i386_win32 then
+	  begin
+	    n.finalizepi:=tcgprocinfo(cprocinfo.create(finalizepi.parent));
+		n.finalizepi.force_nested;
+		n.finalizepi.procdef:=create_outline_procdef('$fin$',current_procinfo.procdef.struct,potype_exceptfilter,voidtype);
+		n.finalizepi.entrypos:=finalizepi.entrypos;
+		n.finalizepi.entryswitches:=finalizepi.entryswitches;
+		n.finalizepi.exitpos:=finalizepi.exitpos;
+		n.finalizepi.exitswitches:=finalizepi.exitswitches;
+		n.finalizepi.flags:=finalizepi.flags;
+		{ node already transformed? }
+		if assigned(finalizepi.code) then
+		  begin
+			n.finalizepi.code:=finalizepi.code.getcopy;
+			n.right:=ccallnode.create(nil,tprocsym(n.finalizepi.procdef.procsym),nil,nil,[],nil);
+		  end;
+	  end;
+	result:=n;
+  end;
 
 function ti386tryfinallynode.simplify(forinline: boolean): tnode;
   begin
@@ -222,7 +247,8 @@ function ti386tryfinallynode.simplify(forinline: boolean): tnode;
     if (target_info.system<>system_i386_win32) then
       exit;
 
-    if (result=nil) and assigned(finalizepi) then
+    { actually, this is not really the right place to do a node transformation like this }
+    if (result=nil) and assigned(finalizepi) and (not(assigned(finalizepi.code))) then
       begin
         finalizepi.code:=right;
         foreachnodestatic(right,@copy_parasize,finalizepi);

+ 1 - 1
compiler/link.pas

@@ -662,7 +662,7 @@ Implementation
         if (OrderedSymbols.Empty) or
            not(tf_supports_symbolorderfile in target_info.flags) then
           exit;
-        symfile:=TScript.Create(outputexedir+'symbol_order.fpc');
+        symfile:=TScript.Create(outputexedir+UniqueName('symbol_order')+'.fpc');
         item:=TCmdStrListItem(OrderedSymbols.First);
         while assigned(item) do
           begin

+ 105 - 24
compiler/nbas.pas

@@ -706,10 +706,31 @@ implementation
 
 
     function tblocknode.simplify(forinline : boolean): tnode;
-{$ifdef break_inlining}
       var
+        hp, nextp: TStatementNode;
+        lastp: TNode;
+{$ifdef break_inlining}
         a : array[0..3] of tstatementnode;
 {$endif break_inlining}
+
+        procedure EraseCurrentStatement;
+          begin
+            { make sure the nf_block_with_exit and nf_usercode_entry flags are safeguarded }
+            if Assigned(nextp) then
+              nextp.flags := nextp.flags + (hp.left.flags * [nf_block_with_exit, nf_usercode_entry]);
+
+            hp.right := nil;
+            hp.Free;
+            hp := nextp;
+            if not Assigned(lastp) then
+              Exit;
+
+            if lastp = Self then
+              TBlockNode(lastp).left := nextp
+            else
+              TStatementNode(lastp).right := nextp;
+          end;
+
       begin
         result := nil;
         { Warning: never replace a blocknode with another node type,
@@ -717,33 +738,93 @@ implementation
           main program body, and those nodes should always be blocknodes
           since that's what the compiler expects elsewhere. }
 
-        if assigned(left) and
-           not assigned(tstatementnode(left).right) then
+        lastp := Self;
+        hp := TStatementNode(left);
+
+        if Assigned(hp) then
           begin
-            case tstatementnode(left).left.nodetype of
-              blockn:
-                begin
-                  { if the current block contains only one statement, and
-                    this one statement only contains another block, replace
-                    this block with that other block.                       }
-                  result:=tstatementnode(left).left;
-                  tstatementnode(left).left:=nil;
-                  { make sure the nf_block_with_exit flag is safeguarded }
-                  result.flags:=result.flags+(flags*[nf_block_with_exit,nf_usercode_entry]);
-                  exit;
+            if not assigned(tstatementnode(left).right) then
+              begin
+                { Simplify single-statement blocks }
+                case tstatementnode(left).left.nodetype of
+                  blockn:
+                    begin
+                      { if the current block contains only one statement, and
+                        this one statement only contains another block, replace
+                        this block with that other block.                       }
+                      result:=tstatementnode(left).left;
+                      tstatementnode(left).left:=nil;
+                      { make sure the nf_block_with_exit and nf_usercode_entry flags are safeguarded }
+                      result.flags:=result.flags+(flags*[nf_block_with_exit,nf_usercode_entry]);
+                      exit;
+                    end;
+                  nothingn:
+                    begin
+                      { if the block contains only a statement with a nothing node,
+                        get rid of the statement }
+                      left.Free;
+                      left:=nil;
+                      exit;
+                    end;
+                  else
+                    ;
                 end;
-              nothingn:
-                begin
-                  { if the block contains only a statement with a nothing node,
-                    get rid of the statement }
-                  left.Free;
-                  left:=nil;
-                  exit;
+              end
+            else
+              repeat
+                nextp := TStatementNode(hp.Right);
+                case hp.left.nodetype of
+                  blockn:
+                    if not Assigned(TBlockNode(hp.left).left) then
+                      begin
+                        { Empty block - delete statement (and block within),
+                          but only if the nf_usercode_entry flag is not set}
+                        if hp.left.flags * [nf_usercode_entry] = [] then
+                          begin
+                            EraseCurrentStatement;
+                            Continue;
+                          end;
+                      end
+                    else
+                      begin
+                        if (TStatementNode(TBlockNode(hp.left).left).left.nodetype = nothingn) and
+                          not Assigned(TStatementNode(TBlockNode(hp.left).left).right) then
+                          begin
+                            { Block contains only a statement->nothingn branch }
+                            EraseCurrentStatement;
+                            Continue;
+                          end;
+
+                        if not Assigned(nextp) then
+                          begin
+                            { If the last statement contains a block, Merge them
+                              (statements within will already be simplified) }
+
+                            { Internal error is triggered if the calling block only
+                              had one statement - code flow should have exited
+                              earlier. }
+                            nextp := TStatementNode(TBlockNode(hp.left).left);
+                            TBlockNode(hp.left).left := nil;
+                            EraseCurrentStatement;
+                            Continue;
+                          end;
+                      end;
+                  nothingn:
+                    { Make sure it's not the only node left }
+                      begin
+                        { Delete statement (and nothing node within) }
+                        EraseCurrentStatement;
+                        Continue;
+                      end;
+                  else
+                    ;
                 end;
-              else
-                ;
-            end;
+
+                lastp := hp;
+                hp := nextp;
+              until not Assigned(hp);
           end;
+
 {$ifdef break_inlining}
         { simple sequence of tempcreate, assign and return temp.? }
         if GetStatements(left,a) and

+ 16 - 6
compiler/nflw.pas

@@ -1896,7 +1896,7 @@ implementation
         needsifblock : Boolean;
         cond : tnodetype;
         fromexpr : tnode;
-        toexpr : tnode;
+        toexpr, leftcopy: tnode;
         { if the upper bound is not constant, it must be store in a temp initially }
         usetotemp : boolean;
         { if the lower bound is not constant, it must be store in a temp before calculating the upper bound }
@@ -1905,13 +1905,19 @@ implementation
         countermin, countermax: Tconstexprint;
 
       procedure iterate_counter(var s : tstatementnode;fw : boolean);
+        var
+          leftcopy: tnode;
         begin
+          { get rid of nf_write etc. as the left node is now only read }
+          leftcopy:=left.getcopy;
+          node_reset_flags(leftcopy,[nf_pass1_done,nf_modify,nf_write]);
+
           if fw then
             addstatement(s,
-              cassignmentnode.create_internal(left.getcopy,cinlinenode.createintern(in_succ_x,false,left.getcopy)))
+              cassignmentnode.create_internal(left.getcopy,cinlinenode.createintern(in_succ_x,false,leftcopy)))
           else
             addstatement(s,
-              cassignmentnode.create_internal(left.getcopy,cinlinenode.createintern(in_pred_x,false,left.getcopy)));
+              cassignmentnode.create_internal(left.getcopy,cinlinenode.createintern(in_pred_x,false,leftcopy)));
         end;
 
       function iterate_counter_func(arg : tnode;fw : boolean) : tnode;
@@ -2056,6 +2062,10 @@ implementation
               cond:=gten;
           end;
 
+        { get rid of nf_write etc. as the left node is now only read }
+        leftcopy:=left.getcopy;
+        node_reset_flags(leftcopy,[nf_pass1_done,nf_modify,nf_write]);
+
         if needsifblock then
           begin
             if usetotemp then
@@ -2063,7 +2073,7 @@ implementation
             else
               toexpr:=t1.getcopy;
 
-            addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(cond,left.getcopy,toexpr),loopblock,false,true));
+            addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(cond,leftcopy,toexpr),loopblock,false,true));
 
             if usefromtemp then
               fromexpr:=ctemprefnode.create(fromtemp)
@@ -2091,10 +2101,10 @@ implementation
           begin
             { is a simple comparision for equality sufficient? }
             if do_loopvar_at_end and (lnf_backward in loopflags) and (lnf_counter_not_used in loopflags) then
-              addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(equaln,left.getcopy,
+              addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(equaln,leftcopy,
                 caddnode.create_internal(subn,t1.getcopy,cordconstnode.create(1,t1.resultdef,false))),loopblock,false,true))
             else
-              addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(cond,left.getcopy,t1.getcopy),loopblock,false,true));
+              addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(cond,leftcopy,t1.getcopy),loopblock,false,true));
             addstatement(statements,ifblock);
           end;
         current_filepos:=storefilepos;

+ 17 - 7
compiler/ninl.pas

@@ -3209,7 +3209,11 @@ implementation
                   if target_info.system in systems_managed_vm then
                     message(parser_e_feature_unsupported_for_vm);
                    if (left.resultdef.typ=enumdef) and
-                      (tenumdef(left.resultdef).has_jumps) then
+                      (tenumdef(left.resultdef).has_jumps) and
+                      (
+                        (left.nodetype<>typen) or
+                        not (sp_generic_para in ttypenode(left).typesym.symoptions)
+                      ) then
                      CGMessage(type_e_no_type_info);
                    set_varstate(left,vs_read,[vsf_must_be_valid]);
                    resultdef:=voidpointertype;
@@ -3219,9 +3223,6 @@ implementation
                 begin
                   if target_info.system in systems_managed_vm then
                     message(parser_e_feature_unsupported_for_vm);
-                  if (left.resultdef.typ=enumdef) and
-                     (tenumdef(left.resultdef).has_jumps) then
-                    CGMessage(type_e_no_type_info);
                   set_varstate(left,vs_read,[vsf_must_be_valid]);
                   resultdef:=typekindtype;
                 end;
@@ -3935,9 +3936,18 @@ implementation
 
           in_typeinfo_x:
             begin
-              result:=caddrnode.create_internal(
-                crttinode.create(tstoreddef(left.resultdef),fullrtti,rdt_normal)
-              );
+              if (left.resultdef.typ=enumdef) and
+                 (tenumdef(left.resultdef).has_jumps) then
+                begin
+                  if (left.nodetype=typen) and (sp_generic_para in ttypenode(left).typesym.symoptions) then
+                    result:=cnilnode.create
+                  else
+                    internalerror(2021032601);
+                end
+              else
+                result:=caddrnode.create_internal(
+                  crttinode.create(tstoreddef(left.resultdef),fullrtti,rdt_normal)
+                );
             end;
 
           in_gettypekind_x:

+ 2 - 0
compiler/nld.pas

@@ -1372,6 +1372,7 @@ implementation
          n:=ttypenode(inherited dogetcopy);
          n.allowed:=allowed;
          n.typedef:=typedef;
+         n.typesym:=typesym;
          n.helperallowed:=helperallowed;
          result:=n;
       end;
@@ -1382,6 +1383,7 @@ implementation
         docompare :=
           inherited docompare(p) and
           (typedef=ttypenode(p).typedef) and
+          (typesym=ttypenode(p).typesym) and
           (allowed=ttypenode(p).allowed) and
           (helperallowed=ttypenode(p).helperallowed);
       end;

+ 5 - 0
compiler/raatt.pas

@@ -1594,6 +1594,11 @@ unit raatt;
                  4 :
                   l:=ord(actasmpattern[4]) + ord(actasmpattern[3]) shl 8 +
                      Ord(actasmpattern[2]) shl 16 + ord(actasmpattern[1]) shl 24;
+                 8 :
+                  begin
+                    move(actasmpattern[1],l,8);
+                    l:=SwapEndian(l);
+                  end;
                 else
                   Message1(asmr_e_invalid_string_as_opcode_operand,actasmpattern);
                 end;

+ 185 - 214
compiler/systems/t_darwin.pas

@@ -51,11 +51,15 @@ implementation
 
     tlinkerdarwin=class(texternallinker)
     private
-      LinkFilesFileName,
       LinkSymsFileName   : TCmdStr;
-      Function  WriteResponseFile(isdll:boolean) : Boolean;
+      function WriteFileList: TCmdStr;
       function GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
       Function GetDarwinPrtobjName(isdll: boolean): TCmdStr;
+      function GetLinkArch: TCmdStr;
+      function GetLinkVersion: TCmdStr;
+      function GetSysroot: TCmdStr;
+      function GetLibSearchPath: TCmdStr;
+      function GetLibraries: TCmdStr;
     public
       constructor Create;override;
       procedure SetDefaultInfo;override;
@@ -123,16 +127,16 @@ implementation
              programs with problems that require Valgrind will have more
              than 60KB of data (first 4KB of address space is always invalid)
            }
-           ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+           ExeCmd[1]:='ld $PRTOBJ $TARGET $OPT $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
            if not(cs_gdb_valgrind in current_settings.globalswitches) then
              ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
   {$else ndef cpu64bitaddr}
-           ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+           ExeCmd[1]:='ld $PRTOBJ $TARGET $OPT $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
   {$endif ndef cpu64bitaddr}
            if (apptype<>app_bundle) then
-             DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -dylib -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
+             DllCmd[1]:='ld $PRTOBJ $TARGET $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -dylib -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES'
            else
-             DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -bundle -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+             DllCmd[1]:='ld $PRTOBJ $TARGET $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -bundle -L. -o $EXE $ARCH $VERSION $SYRSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
            DllCmd[2]:='strip -x $EXE';
            DynamicLinker:='';
          end;
@@ -298,106 +302,152 @@ implementation
       end;
 
 
-    Function tlinkerdarwin.GetDarwinPrtobjName(isdll: boolean): TCmdStr;
-    var
-      startupfile: TCmdStr;
-    begin
-      result:='';
+    function tlinkerdarwin.GetDarwinPrtobjName(isdll: boolean): TCmdStr;
+      var
+        startupfile: TCmdStr;
+      begin
+        result:='';
 
-      startupfile:=GetDarwinCrt1ObjName(isdll);
-      if startupfile<>'' then
-        begin
-         if not librarysearchpath.FindFile(startupfile,false,result) then
-           result:='/usr/lib/'+startupfile;
-        end;
-      result:=maybequoted(result);
-    end;
+        startupfile:=GetDarwinCrt1ObjName(isdll);
+        if startupfile<>'' then
+          begin
+           if not librarysearchpath.FindFile(startupfile,false,result) then
+             result:='/usr/lib/'+startupfile;
+          end;
+        result:=maybequoted(result);
+      end;
 
 
-    Function tlinkerdarwin.WriteResponseFile(isdll:boolean) : Boolean;
-    Var
-      linkres      : TLinkRes;
-      FilesList    : TLinkRes;
-      i            : longint;
-      HPath        : TCmdStrListItem;
-      s            : TCmdStr;
-    begin
-      WriteResponseFile:=False;
-      if ReOrderEntries Then
-         ExpandAndApplyOrder(SharedLibFiles);
+    function tlinkerdarwin.GetLinkArch: TCmdStr;
+      begin
+        case target_info.system of
+          system_powerpc_darwin:
+            result:='-arch ppc';
+          system_i386_darwin,
+          system_i386_iphonesim:
+            result:='-arch i386';
+          system_powerpc64_darwin:
+            result:='-arch ppc64';
+          system_x86_64_darwin,
+          system_x86_64_iphonesim:
+            result:='-arch x86_64';
+          system_arm_ios:
+            { current versions of the linker require the sub-architecture type
+              to be specified }
+            result:='-arch '+lower(cputypestr[current_settings.cputype]);
+          system_aarch64_ios,
+          system_aarch64_darwin:
+            result:='-arch arm64';
+          else
+            internalerror(2014121801);
+        end;
+      end;
 
-      { Open link.res file }
-      LinkRes:=TLinkRes.Create(outputexedir+Info.ResName,false);
 
-      if sysrootpath<>'' then
-        begin
-          LinkRes.Add('-syslibroot');
-          LinkRes.Add(sysrootpath);
-        end;
+    function tlinkerdarwin.GetLinkVersion: TCmdStr;
+      begin
+        if MacOSXVersionMin<>'' then
+          begin
+            result:='-macosx_version_min '+MacOSXVersionMin;
+          end
+        else if iPhoneOSVersionMin<>'' then
+          begin
+            result:='-iphoneos_version_min '+iPhoneOSVersionMin;
+          end
+        else
+          begin
+            result:='';
+          end;
+      end;
+
 
-      LinkRes.Add('-arch');
-      case target_info.system of
-        system_powerpc_darwin:
-          LinkRes.Add('ppc');
-        system_i386_darwin,
-        system_i386_iphonesim:
-          LinkRes.Add('i386');
-        system_powerpc64_darwin:
-          LinkRes.Add('ppc64');
-        system_x86_64_darwin,
-        system_x86_64_iphonesim:
-          LinkRes.Add('x86_64');
-        system_arm_ios:
-          { current versions of the linker require the sub-architecture type
-            to be specified }
-          LinkRes.Add(lower(cputypestr[current_settings.cputype]));
-        system_aarch64_ios,
-        system_aarch64_darwin:
-          LinkRes.Add('arm64');
+    function tlinkerdarwin.GetSysroot: TCmdStr;
+      begin
+        if sysrootpath<>'' then
+          begin
+            result:='-syslibroot '+maybequoted(sysrootpath);
+          end
         else
-          internalerror(2014121801);
+          begin
+            result:='';
+          end;
       end;
-      if MacOSXVersionMin<>'' then
-        begin
-          LinkRes.Add('-macosx_version_min');
-          LinkRes.Add(MacOSXVersionMin);
-        end
-      else if iPhoneOSVersionMin<>'' then
-        begin
-          LinkRes.Add('-iphoneos_version_min');
-          LinkRes.Add(iPhoneOSVersionMin);
-        end;
 
-      { Write path to search libraries }
-      HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-L'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
-      HPath:=TCmdStrListItem(LibrarySearchPath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-L'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
 
-      HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-F'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
-      HPath:=TCmdStrListItem(FrameworkSearchPath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-F'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
+    function tlinkerdarwin.GetLibSearchPath: TCmdStr;
+      var
+        HPath: TCmdStrListItem;
+      begin
+        result:='';
+        HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-L'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+        HPath:=TCmdStrListItem(LibrarySearchPath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-L'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+
+        HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-F'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+        HPath:=TCmdStrListItem(FrameworkSearchPath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-F'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+      end;
+
+
+    function tlinkerdarwin.GetLibraries: TCmdStr;
+      var
+        s: TCmdStr;
+        i: longint;
+      begin
+        result:='';
+        while not SharedLibFiles.Empty do
+          begin
+            s:=SharedLibFiles.GetFirst;
+            if (s<>'c') or ReOrderEntries then
+              begin
+                i:=Pos(target_info.sharedlibext,s);
+                if i>0 then
+                  Delete(s,i,length(s));
+                result:=result+' '+maybequoted('-l'+s);
+              end;
+           { be sure that libc is the last lib }
+           if not ReOrderEntries then
+             begin
+               result:=result+' -lc'
+             end;
+         end;
+
+        while not FrameworkFiles.empty do
+          begin
+            result:=result+' -framework '+maybequoted(FrameworkFiles.GetFirst);
+          end;
+      end;
 
-      { main objectfiles }
-      LinkFilesFileName:=UniqueName('linkfiles')+'.res';
-      FilesList:=TLinkRes.Create(outputexedir+LinkFilesFileName,false);
+
+    Function tlinkerdarwin.WriteFileList: TCmdStr;
+    Var
+      FilesList    : TScript;
+      s            : TCmdStr;
+    begin
+      if ReOrderEntries Then
+         ExpandAndApplyOrder(SharedLibFiles);
+
+      { main objectfiles and static libraries: in filelist file to avoid overflowing command line limit }
+      result:=UniqueName(outputexedir+'linkfiles')+'.res';
+      FilesList:=TScript.Create(result);
       while not ObjectFiles.Empty do
         begin
           s:=ObjectFiles.GetFirst;
@@ -406,46 +456,15 @@ implementation
               s:=TargetFixFileName(s);
               FilesList.Add(s);
             end;
-        end;
-      FilesList.writetodisk;
-      FilesList.Free;
-
-      { Write staticlibraries }
-      while not StaticLibFiles.Empty do
-        begin
-          S:=StaticLibFiles.GetFirst;
-          LinkRes.AddFileName(s)
-        end;
-
-      { Write sharedlibraries like -l<lib> }
-      while not SharedLibFiles.Empty do
-        begin
-          S:=SharedLibFiles.GetFirst;
-          if (s<>'c') or ReOrderEntries then
+          { Write staticlibraries }
+          while not StaticLibFiles.Empty do
             begin
-              i:=Pos(target_info.sharedlibext,S);
-              if i>0 then
-                Delete(S,i,255);
-              LinkRes.Add('-l'+s);
+              s:=StaticLibFiles.GetFirst;
+              FilesList.Add(s)
             end;
-         { be sure that libc is the last lib }
-         if not ReOrderEntries then
-           begin
-             LinkRes.Add('-lc')
-           end;
-       end;
-
-      while not FrameworkFiles.empty do
-        begin
-          LinkRes.Add('-framework');
-          LinkRes.Add(FrameworkFiles.GetFirst);
         end;
-
-    { Write and Close response }
-      linkres.writetodisk;
-      linkres.Free;
-
-      WriteResponseFile:=True;
+      FilesList.writetodisk;
+      FilesList.Free;
     end;
 
 
@@ -455,16 +474,14 @@ implementation
       cmdstr,
       mapstr,
       targetstr,
-      emulstr,
       extdbgbinstr,
       extdbgcmdstr,
       ltostr,
-      ordersymfile: TCmdStr;
-      linkscript: TAsmScript;
-      DynLinkStr : string[60];
+      ordersymfile,
+      linkfiles: TCmdStr;
       GCSectionsStr,
       StaticStr,
-      StripStr   : string[63];
+      StripStr   : TCmdStr;
       success : boolean;
     begin
       if not(cs_link_nolink in current_settings.globalswitches) then
@@ -473,13 +490,11 @@ implementation
     { Create some replacements }
       StaticStr:='';
       StripStr:='';
-      DynLinkStr:='';
       GCSectionsStr:='';
-      linkscript:=nil;
       mapstr:='';
       targetstr:='';
-      emulstr:='';
       ltostr:='';
+
       if (cs_link_map in current_settings.globalswitches) then
         mapstr:='-map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
 
@@ -491,11 +506,6 @@ implementation
       if (cs_link_smart in current_settings.globalswitches) then
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
 
-      if CShared Then
-       begin
-         DynLinKStr:=DynLinkStr+' -dynamic'; // one dash!
-       end;
-
       { add custom LTO library if using custom clang }
       if (cs_lto in current_settings.moduleswitches) and
          not(cs_link_on_target in current_settings.globalswitches) and
@@ -505,10 +515,10 @@ implementation
           ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
         end;
 
-    { Write used files and libraries }
-      WriteResponseFile(false);
+      { Write list of files to link }
+      linkfiles:=WriteFileList;
 
-    { Write symbol order file }
+      { Write symbol order file }
       ordersymfile:=WriteSymbolOrderFile;
 
     { Call linker }
@@ -516,9 +526,7 @@ implementation
       Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$TARGET',targetstr);
-      Replace(cmdstr,'$EMUL',EmulStr);
       Replace(cmdstr,'$MAP',mapstr);
-      Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$LTO',ltostr);
       if ordersymfile<>'' then
@@ -526,12 +534,16 @@ implementation
       else
         Replace(cmdstr,'$ORDERSYMS','');
 
-      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+LinkFilesFileName));
       Replace(cmdstr,'$STATIC',StaticStr);
       Replace(cmdstr,'$STRIP',StripStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
-      Replace(cmdstr,'$DYNLINK',DynLinkStr);
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(false));
+      Replace(cmdstr,'$ARCH', GetLinkArch);
+      Replace(cmdstr,'$VERSION',GetLinkVersion);
+      Replace(cmdstr,'$SYSROOT',GetSysroot);
+      Replace(cmdstr,'$LIBSEARCHPATH',GetLibSearchPath);
+      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(linkfiles));
+      Replace(cmdstr,'$LIBRARIES',GetLibraries);
       BinStr:=FindUtil(utilsprefix+BinStr);
 
       { create dsym file? }
@@ -544,28 +556,11 @@ implementation
           extdbgcmdstr:=maybequoted(current_module.exefilename);
         end;
 
-      if not(cs_link_nolink in current_settings.globalswitches) then
-        begin
-          { we have to use a script to use the IFS hack }
-          linkscript:=GenerateScript(outputexedir+'ppaslink');
-          linkscript.AddLinkCommand(BinStr,CmdStr,'');
-          if (extdbgcmdstr<>'') then
-            linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
-          linkscript.WriteToDisk;
-          BinStr:=linkscript.fn;
-          if not path_absolute(BinStr) then
-            if cs_link_on_target in current_settings.globalswitches then
-              BinStr:='.'+target_info.dirsep+BinStr
-            else
-              BinStr:='.'+source_info.dirsep+BinStr;
-          CmdStr:='';
-        end;
-
-      success:=DoExec(BinStr,CmdStr,true,true);
+      success:=DoExec(BinStr,CmdStr,true,false);
       if (success and
           (extdbgbinstr<>'') and
           (cs_link_nolink in current_settings.globalswitches)) then
-        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,true);
+        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,false);
 
     { Remove ReponseFile }
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
@@ -573,9 +568,7 @@ implementation
          DeleteFile(outputexedir+Info.ResName);
          if ordersymfile<>'' then
            DeleteFile(ordersymfile);
-         DeleteFile(linkscript.fn);
-         linkscript.free;
-         DeleteFile(outputexedir+LinkFilesFileName);
+         DeleteFile(linkfiles);
        end;
 
       MakeExecutable:=success;   { otherwise a recursive call to link method }
@@ -586,18 +579,16 @@ implementation
     var
       InitStr,
       FiniStr,
-      SoNameStr : string[80];
-      linkscript: TAsmScript;
       binstr,
       cmdstr,
       mapstr,
       ltostr,
       ordersymfile,
       targetstr,
-      emulstr,
       extdbgbinstr,
-      extdbgcmdstr  : TCmdStr;
-      GCSectionsStr : string[63];
+      extdbgcmdstr,
+      linkfiles,
+      GCSectionsStr : TCmdStr;
       exportedsyms: text;
       success : boolean;
     begin
@@ -605,21 +596,20 @@ implementation
       GCSectionsStr:='';
       mapstr:='';
       ltostr:='';
-      linkscript:=nil;
       if not(cs_link_nolink in current_settings.globalswitches) then
        Message1(exec_i_linking,current_module.sharedlibfilename);
 
-    { Write used files and libraries }
-      WriteResponseFile(true);
+      { Write list of files to link }
+      linkfiles:=WriteFileList;
 
-    { Write symbol order file }
+      { Write symbol order file }
       ordersymfile:=WriteSymbolOrderFile;
 
       if (cs_link_smart in current_settings.globalswitches) then
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
 
       if (cs_link_map in current_settings.globalswitches) then
-        mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
+        mapstr:='-map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
 
       { add custom LTO library if using custom clang }
       if (cs_lto in current_settings.moduleswitches) and
@@ -631,25 +621,19 @@ implementation
         end;
 
       targetstr:='';
-      emulstr:='';
 
       InitStr:='-init FPC_LIB_START';
       FiniStr:='-fini FPC_LIB_EXIT';
-      SoNameStr:='-soname '+ExtractFileName(current_module.sharedlibfilename);
 
       { Call linker }
       SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
       Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$TARGET',targetstr);
-      Replace(cmdstr,'$EMUL',EmulStr);
-      Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
-      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+LinkFilesFileName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$INIT',InitStr);
       Replace(cmdstr,'$FINI',FiniStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
-      Replace(cmdstr,'$SONAME',SoNameStr);
       Replace(cmdstr,'$MAP',mapstr);
       Replace(cmdstr,'$LTO',ltostr);
       if ordersymfile<>'' then
@@ -657,6 +641,12 @@ implementation
       else
         Replace(cmdstr,'$ORDERSYMS','');
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
+      Replace(cmdstr,'$ARCH', GetLinkArch);
+      Replace(cmdstr,'$VERSION',GetLinkVersion);
+      Replace(cmdstr,'$SYSROOT',GetSysroot);
+      Replace(cmdstr,'$LIBSEARCHPATH',GetLibSearchPath);
+      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(linkfiles));
+      Replace(cmdstr,'$LIBRARIES',GetLibraries);
       BinStr:=FindUtil(utilsprefix+BinStr);
 
       { create dsym file? }
@@ -679,31 +669,14 @@ implementation
             writeln(exportedsyms,texportlibunix(exportlib).exportedsymnames.getfirst);
           until texportlibunix(exportlib).exportedsymnames.empty;
           close(exportedsyms);
-          cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir)+LinkSymsFileName;
+          cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir+LinkSymsFileName);
         end;
 
-      if not(cs_link_nolink in current_settings.globalswitches) then
-        begin
-          { we have to use a script to use the IFS hack }
-          linkscript:=GenerateScript(outputexedir+'ppaslink');
-          linkscript.AddLinkCommand(BinStr,CmdStr,'');
-          if (extdbgbinstr<>'') then
-            linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
-          linkscript.WriteToDisk;
-          BinStr:=linkscript.fn;
-          if not path_absolute(BinStr) then
-            if cs_link_on_target in current_settings.globalswitches then
-              BinStr:='.'+target_info.dirsep+BinStr
-            else
-              BinStr:='.'+source_info.dirsep+BinStr;
-          CmdStr:='';
-        end;
-
-      success:=DoExec(BinStr,cmdstr,true,true);
+      success:=DoExec(BinStr,cmdstr,true,false);
       if (success and
           (extdbgbinstr<>'') and
           (cs_link_nolink in current_settings.globalswitches)) then
-        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,true);
+        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,false);
 
     { Strip the library ? }
       if success and (cs_link_strip in current_settings.globalswitches) then
@@ -713,17 +686,15 @@ implementation
          success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,false,false);
        end;
 
-    { Remove ReponseFile }
+    { Remove temporary files }
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
         begin
           DeleteFile(outputexedir+Info.ResName);
           if ordersymfile<>'' then
             DeleteFile(ordersymfile);
-          DeleteFile(linkscript.fn);
-          linkscript.free;
            if LinkSymsFileName<>'' then
              DeleteFile(outputexedir+LinkSymsFileName);
-           DeleteFile(outputexedir+LinkFilesFileName);
+           DeleteFile(linkfiles);
         end;
 
       MakeSharedLibrary:=success;   { otherwise a recursive call to link method }

+ 2 - 0
compiler/systems/t_embed.pas

@@ -634,8 +634,10 @@ begin
  
       { Atmel }
       ct_sam3x8e,
+      ct_samd51p19a,
       ct_arduino_due,
       ct_flip_n_click,
+      ct_wio_terminal,
       
       { Nordic Semiconductor }
       ct_nrf51422_xxaa,

+ 5 - 0
compiler/x86/rax86int.pas

@@ -1494,6 +1494,11 @@ Unit Rax86int;
                  4 :
                   l:=ord(actasmpattern[4]) + ord(actasmpattern[3]) shl 8 +
                      Ord(actasmpattern[2]) shl 16 + ord(actasmpattern[1]) shl 24;
+                 8 :
+                  begin
+                    move(actasmpattern[1],l,8);
+                    l:=SwapEndian(l);
+                  end;
                 else
                   Message1(asmr_e_invalid_string_as_opcode_operand,actasmpattern);
                 end;

+ 117 - 77
installer/install.dat

@@ -33,7 +33,7 @@ package=basedos.zip[basedos.zip],~B~asic system for Go32v2 (required)
 # Dos 2
 package=aslddos.zip[aslddos.zip],GNU ~L~inker and GNU Assembler for Go32v2 (required)
 # Dos 3
-package=idedos.zip[idedos.zip],~I~DE with integrated debugger/compiler (BETA)
+package=units-idedos.zip[uidedos.zip],~I~DE with integrated debugger/compiler (BETA)
 # Dos 4
 package=utilsdos.zip[utilsdos.zip],~E~xtra Utilities
 # Dos 5
@@ -115,41 +115,52 @@ package=units-rtl-extrados.zip[urtledos.zip],RTL-additional units not needed for
 package=units-rtl-objpasdos.zip[urtlodos.zip],RTL-Object Pascal units (e.g. Delphi compatibility)
 # Dos-2 10
 package=units-rtl-unicodedos.zip[urtludos.zip],RTL-miscellaneous Unicode support units
-# Dos-2 11
-package=utils-fpcmkcfgdos.zip[ufpckdos.zip],Creation of Free Pascal configuration files
-# Dos-2 12
-package=utils-fpcmdos.zip[ufpcmdos.zip],Generate Makefiles out of Makefile.fpc files
-# Dos-2 13
-package=utils-fprcpdos.zip[ufprcdos.zip],Free Pascal Resource Compiler Preprocessor
-# Dos-2 14
-package=utils-h2pasdos.zip[uh2pados.zip],Create Pascal interface units from C headers
-# Dos-2 15
-package=utils-pas2fpmdos.zip[up2fpdos.zip],Generate fpmake.pp for Pascal source
-# Dos-2 16
-package=utils-pas2utdos.zip[up2utdos.zip],Pascal source to FPC Unit test generator
-# Dos-2 17
-package=utils-rmwaitdos.zip[urmwdos.zip],Remove (delete) file(s) with optional retries
-# Dos-2 18
-package=utils-lexyaccdos.zip[ulexydos.zip],Compiler generator for TP and compatibles
 # Dos-2 19
 package=units-ptcdos.zip[uptcdos.zip],Free portable framebuffer library
-# Dos-2 20
-package=utils-dxegendos.zip[udxegdos.zip],Generation of D~X~E modules loadable at runtime
 # Dos-2 21
 package=units-fcl-pdfdos.zip[ufcpddos.zip],PDF generating and TTF file info library
 # Dos-2 22
 package=units-rtl-genericsdos.zip[urtlgdos.zip],RTL-generic collection library
 # Dos-2 23
 package=units-webidldos.zip[uwidldos.zip],WEB IDL parser and converter to Object Pascal classes
-# Dos-2 24
-package=utils-fpcresdos.zip[ufprsdos.zip],Free Pascal Resource Converter
-# Dos-2 25
-package=utils-fpcreslipodos.zip[ufprldos.zip],Free Pascal External Resource Thinner
-# Dos-2 26
-package=utils-json2pasdos.zip[ujs2pdos.zip],A utility to create Object Pascal classes files from sample JSON files
 # Dos-2 27
-# Dos-2 28
-# Dos-2 29
+package=units-tplylibdos.zip[utplldos.zip],Units for sources created with the compiler generator
+
+#
+# Go32v2 utils packages 3rd part
+#
+pack=Dos/Go32v2-~U~tils
+filecheck=*dos.zip
+# Dos-3 1
+package=utils-fpcmkcfgdos.zip[fpckdos.zip],Creation of Free Pascal configuration files
+# Dos-3 2
+package=utils-fpcmdos.zip[fpcmdos.zip],Generate Makefiles out of Makefile.fpc files
+# Dos-3 3
+package=utils-fprcpdos.zip[fprcdos.zip],Free Pascal Resource Compiler Preprocessor
+# Dos-3 4
+package=utils-h2pasdos.zip[h2pados.zip],Create Pascal interface units from C headers
+# Dos-3 5
+package=utils-pas2fpmdos.zip[p2fmdos.zip],Generate fpmake.pp for Pascal source
+# Dos-3 6
+package=utils-pas2utdos.zip[p2utdos.zip],Pascal source to FPC Unit test generator
+# Dos-3 7
+package=utils-rmwaitdos.zip[rmwdos.zip],Remove (delete) file(s) with optional retries
+# Dos-3 8
+package=utils-dxegendos.zip[dxegdos.zip],Generation of D~X~E modules loadable at runtime
+# Dos-3 9
+package=utils-fpcresdos.zip[fprsdos.zip],Free Pascal Resource Converter
+# Dos-3 10
+package=utils-fpcreslipodos.zip[fprldos.zip],Free Pascal External Resource Thinner
+# Dos-3 11
+package=utils-json2pasdos.zip[jsnpdos.zip],A utility to create Object Pascal classes files from sample JSON files
+# Dos-3 12
+package=utils-unicodedos.zip[ucddos.zip],Transformation of Unicode consortium data for FPC
+# Dos-3 13
+package=utils-ihxutildos.zip[ihxudos.zip],A tool to convert Intel HEX Format files different formats used on various Z80 systems
+# Dos-3 14
+package=utils-lexyaccdos.zip[tplydos.zip],A compiler generator for Turbo Pascal and compatibles
+# Dos-3 15
+package=utils-fpcmkcfgdos.zip[fcmkdos.zip],A utility to create the Free Pascal configuration files
 
 #
 # Win32 packages
@@ -168,7 +179,7 @@ package=base.i386-win32.zip,~B~asic system for Win32 (required)
 # Win32 2
 package=asld.i386-win32.zip,GNU ~L~inker and GNU Assembler for Win32 (required)
 # Win32 3
-package=ide.i386-win32.zip,~I~DE with integrated debugger/compiler (BETA)
+package=units-ide.i386-win32.zip,~I~DE with integrated debugger/compiler (BETA)
 # Win32 4
 package=utils.i386-win32.zip,~E~xtra Utilities
 # Win32 5
@@ -311,9 +322,9 @@ package=baseos2.zip,~B~asic system for OS/2 (required)
 # OS/2 2
 package=asldos2.zip,GNU ~L~inker and GNU assembler for OS/2 (required)
 # OS/2 3
-package=ideos2.zip,~I~DE with integrated compiler (BETA - no debugger)
+package=uideos2.zip,~I~DE with integrated compiler (BETA - no debugger)
 # OS/2 4
-package=utilsos2.zip[utilos2.zip],~E~xtra Utilities
+package=utilsos2.zip[utilsos2.zip],~E~xtra Utilities
 # OS/2 5
 package=makeos2.zip,GNU ~U~tilities (needed for Makefile usage)
 # OS/2 6
@@ -323,7 +334,7 @@ package=ufvos2.zip,Free ~V~ision (FV)
 # OS/2 8
 package=uos2unitsos2.zip[uos2os2.zip],Units interfacing libraries delivered with OS/2/eCS
 # OS/2 9
-package=utils-h2pasos2.zip[uh2paos2.zip],Create Pascal interface units from C headers
+package=utils-h2pasos2.zip[h2paos2.zip],Create Pascal interface units from C headers
 # OS/2 10
 package=upasjpegos2.zip[upjpos2.zip],Pas~J~PEG units
 # OS/2 11
@@ -359,11 +370,11 @@ package=utils-fpmcos2.zip[fpmcos2.zip],Free Pascal Message Compiler
 # OS/2 26
 package=utils-fppkgos2.zip[fppkgos2.zip],Free Pascal package repository utility
 # OS/2 27
-package=utils-fprcpos2.zip[ufprcos2.zip],Free Pascal Resource Compiler Preprocessor
+package=utils-fprcpos2.zip[fprcos2.zip],Free Pascal Resource Compiler Preprocessor
 # OS/2 28
-package=utils-fpcresos2.zip[fpresos2.zip],Free Pascal Resource Converter
+package=utils-fpcresos2.zip[fprsos2.zip],Free Pascal Resource Converter
 # OS/2 29
-package=utils-pas2fpmos2.zip[up2fpos2.zip],Generate fpmake.pp for Pascal source
+package=utils-pas2fpmos2.zip[p2fmos2.zip],Generate fpmake.pp for Pascal source
 # OS/2 30
 package=utils-pas2jnios2.zip[p2jnos2.zip],Generate JNI bridge for Pascal code
 # OS/2 31
@@ -433,7 +444,7 @@ package=urtl-unicodeos2.zip[urtluos2.zip],RTL-miscellaneous Unicode support unit
 # OS/2-2 29
 package=utils-rmwaitos2.zip[rmwos2.zip],Remove (delete) file(s) with optional retries
 # OS/2-2 30
-package=utils-lexyaccos2.zip[lexyos2.zip],Compiler generator for TP and compatibles
+package=utils-lexyaccos2.zip[tplyos2.zip],A compiler generator for Turbo Pascal and compatibles
 # OS/2-2 31
 package=utils-fpcmos2.zip[fpcmos2.zip],Generate Makefiles out of Makefile.fpc files
 
@@ -456,9 +467,21 @@ package=utils-json2pasos2.zip[js2pos2.zip],Create Object Pascal classes from JSO
 # OS/2-3 5
 package=ufcl-pdfos2.zip[ufcpdos2.zip],PDF generating and TTF file info library
 # OS/2-2 6
-package=utils-unicodeos2.zip[ucodeos2.zip],Transformation of Unicode consortium data for FPC
+package=utils-unicodeos2.zip[ucdos2.zip],Transformation of Unicode consortium data for FPC
 # OS/2-3 7
 package=utplylibos2.zip[utpllos2.zip],Units for sources created with the compiler generator
+# OS/2-3 8
+package=units-webidlos2.zip[uwidlos2.zip],WEB IDL parser and converter to Object Pascal classes
+# OS/2-3 9
+package=utils-fpdocos2.zip[fpdcos2.zip],Free Pascal documentation generation utility
+# OS/2-3 10
+package=utils-fppkgos2.zip[fpkgos2.zip],Free Pascal package repository utility
+# OS/2-3 11
+package=utils-fpcreslipoos2.zip[fprlos2.zip],Free Pascal External Resource Thinner
+# OS/2-3 13
+package=utils-ihxutilos2.zip[ihxuos2.zip],A tool to convert Intel HEX Format files different formats used on various Z80 systems
+# OS/2-3 14
+package=utils-json2pasos2.zip[jsnpos2.zip],A utility to create Object Pascal classes files from sample JSON files
 
 #
 # EMX packages
@@ -476,9 +499,9 @@ package=baseemx.zip,~B~asic system for EMX (required)
 # EMX 2
 package=asldemx.zip,GNU ~L~inker and GNU assembler for EMX (required)
 # EMX 3
-package=ideemx.zip,~I~DE with integrated compiler (BETA - no debugger)
+package=uideemx.zip,~I~DE with integrated compiler (BETA - no debugger)
 # EMX 4
-package=utilsemx.zip[utilemx.zip],~E~xtra Utilities
+package=utilsemx.zip[utilsemx.zip],~E~xtra Utilities
 # EMX 5
 package=makeemx.zip,GNU ~U~tilities (needed for Makefile usage)
 # EMX 6
@@ -516,19 +539,19 @@ package=uopensslemx.zip[uosslemx.zip],OpenSSL interface units
 # EMX 22
 package=utils-fpcmkcfgemx.zip[fcmkemx.zip],Creation of Free Pascal configuration files
 # EMX 23
-package=utils-fpdocemx.zip[fpdocemx.zip],Free Pascal documentation generation utility.
+package=utils-fpdocemx.zip[fpdocemx.zip],Free Pascal documentation generation utility
 # EMX 24
-package=utils-fpmcemx.zip[fpmcemx.zip],Free Pascal Message Compiler.
+package=utils-fpmcemx.zip[fpmcemx.zip],Free Pascal Message Compiler
 # EMX 25
-package=utils-fppkgemx.zip[fppkgemx.zip],Free Pascal package repository utility.
+package=utils-fppkgemx.zip[fppkgemx.zip],Free Pascal package repository utility
 # EMX 26
-package=utils-fprcpemx.zip[ufprcemx.zip],Free Pascal Resource Compiler Preprocessor
+package=utils-fprcpemx.zip[fprcemx.zip],Free Pascal Resource Compiler Preprocessor
 # EMX 27
-package=utils-fpcresemx.zip[fpresemx.zip],Free Pascal Resource Converter
+package=utils-fpcresemx.zip[fprsemx.zip],Free Pascal Resource Converter
 # EMX 28
-package=utils-h2pasemx.zip[uh2paemx.zip],Create Pascal interface units from C headers
+package=utils-h2pasemx.zip[h2paemx.zip],Create Pascal interface units from C headers
 # EMX 29
-package=utils-pas2fpmemx.zip[up2fpemx.zip],Generate fpmake.pp for Pascal source
+package=utils-pas2fpmemx.zip[p2fmemx.zip],Generate fpmake.pp for Pascal source
 # EMX 30
 package=utils-pas2jniemx.zip[p2jnemx.zip],Generate JNI bridge for Pascal code
 # EMX 31
@@ -596,12 +619,7 @@ package=urtl-objpasemx.zip[urtloemx.zip],RTL-Object Pascal units (e.g. Delphi co
 # EMX-2 28
 package=urtl-unicodeemx.zip[urtluemx.zip],RTL-miscellaneous Unicode support units
 # EMX-2 29
-package=utils-rmwaitemx.zip[rmwemx.zip],Remove (delete) file(s) with optional retries
-# EMX-2 30
-package=utils-lexyaccemx.zip[ulexyemx.zip],Compiler generator for TP and compatibles
-# EMX-2 31
-package=utils-fpcmemx.zip[fpcmemx.zip],Generate Makefiles out of Makefile.fpc files
-
+package=units-webidlemx.zip[uwidlemx.zip],WEB IDL parser and converter to Object Pascal classes
 
 #
 # EMX packages 3rd part
@@ -618,11 +636,26 @@ package=utils-webidlemx.zip[widlemx.zip],Web IDL parser and converter to Object
 package=utils-json2pasemx.zip[js2pemx.zip],Create Object Pascal classes from JSON files
 # EMX-3 5
 package=ufcl-pdfemx.zip[ufcpdemx.zip],PDF generating and TTF file info library
-# EMX-2 6
-package=utils-unicodeemx.zip[ucodeemx.zip],Transformation of Unicode consortium data for FPC
+# EMX-3 6
+package=utils-unicodeemx.zip[ucdemx.zip],Transformation of Unicode consortium data for FPC
 # EMX-3 7
 package=utplylibemx.zip[utpllemx.zip],Units for sources created with the compiler generator
-
+# EMX-3 8
+package=utils-fpdocemx.zip[fpdcemx.zip],Free Pascal documentation generation utility
+# EMX-3 9
+package=utils-fppkgemx.zip[fpkgemx.zip],Free Pascal package repository utility
+# EMX-3 10
+package=utils-fpcreslipoemx.zip[fprlemx.zip],Free Pascal External Resource Thinner
+# EMX-3 11
+package=utils-ihxutilemx.zip[ihxuemx.zip],A tool to convert Intel HEX Format files different formats used on various Z80 systems
+# EMX-3 12
+package=utils-json2pasemx.zip[jsnpemx.zip],A utility to create Object Pascal classes fil|es from sample JSON files
+# EMX-3 13
+package=utils-lexyaccemx.zip[tplyemx.zip],A compiler generator for Turbo Pascal and compatibles
+# EMX-3 14
+package=utils-rmwaitemx.zip[rmwemx.zip],Remove (delete) file(s) with optional retries
+# EMX-3 15
+package=utils-fpcmemx.zip[fpcmemx.zip],Generate Makefiles out of Makefile.fpc files
 
 #
 # Common packages
@@ -652,7 +685,7 @@ package=compiler.source.zip[compsrc.zip],~C~ompiler sources
 # Source 3
 package=rtl.source.zip[rtlsrc.zip],Run time library sources
 # Source 4
-package=ide-3.3.1.source.zip[idesrc.zip],IDE sources
+package=units-ide-3.3.1.source.zip[uidesrc.zip],IDE sources
 # Source 5
 package=utils-3.3.1.source.zip[utilssrc.zip],~U~tils sources
 # Source 6
@@ -681,8 +714,10 @@ package=units-graph-3.3.1.source.zip[ugrphsrc.zip],Unit Graph sources
 package=units-hermes-3.3.1.source.zip[uhermsrc.zip],Port of Hermes graphics library
 # Source 18
 package=units-fppkg-3.3.1.source.zip[ufppksrc.zip],Units for FPPkg packaging support
-
-
+# Source 19
+package=units-fpc-all.source.zip[ufpcasrc.zip],uninitialized function result in function TPa|ckage.GetDescription:AnsiString(0);
+# Source 20
+package=units-webidl.source.zip[uwidlsrc.zip],WEB IDL parser and converter to Object Pascal classes
 #
 # Source packages 2nd part
 #
@@ -699,9 +734,9 @@ package=units-ibase-3.3.1.source.zip[uibassrc.zip],Interbase interface units sou
 # Source-2 5
 package=units-mysql-3.3.1.source.zip[umysqsrc.zip],MySQL interface units sources
 # Source-2 6
-package=utils-lexyacc-3.3.1.source.zip[ulexysrc.zip],Compiler generator for TP and compatibles
+package=utils-lexyacc-3.3.1.source.zip[tplysrc.zip],A compiler generator for Turbo Pascal and compatibles
 # Source-2 7
-package=utils-unicode-3.3.1.source.zip[uucdsrc.zip],Transformation of Unicode consortium data for FPC
+package=utils-unicode-3.3.1.source.zip[ucdsrc.zip],Transformation of Unicode consortium data for FPC
 # Source-2 8
 package=units-os2units-3.3.1.source.zip[uos2src.zip],Units interfacing libraries delivered with OS/2/eCS
 # Source-2 9
@@ -823,41 +858,46 @@ package=units-rtl-generics-3.3.1.source.zip[urtlgsrc.zip],RTL-generic collection
 pack=~U~tils sources
 filecheck=*.source.zip[*src.zip]
 # Source 1
-package=utils-dxegen-3.3.1.source.zip[udxegsrc.zip],Generation of D~X~E modules loadable at runtime
+package=utils-dxegen-3.3.1.source.zip[dxegsrc.zip],Generation of D~X~E modules loadable at runtime
 # Source 2
-package=utils-fpcmkcfg-3.3.1.source.zip[ufpcksrc.zip],Creation of Free Pascal configuration files
+package=utils-fpcmkcfg-3.3.1.source.zip[fpcksrc.zip],Creation of Free Pascal configuration files
 # Source 3
-package=utils-fpcm-3.3.1.source.zip[ufpcmsrc.zip],Generate Makefiles out of Makefile.fpc files
+package=utils-fpcm-3.3.1.source.zip[fpcmsrc.zip],Generate Makefiles out of Makefile.fpc files
 # Source 4
-package=utils-fpdoc-3.3.1.source.zip[ufpdcsrc.zip],Free Pascal documentation generation utility
+package=utils-fpdoc-3.3.1.source.zip[fpdcsrc.zip],Free Pascal documentation generation utility
 # Source 5
-package=utils-fpmc-3.3.1.source.zip[ufpmcsrc.zip],Free Pascal Message Compiler
+package=utils-fpmc-3.3.1.source.zip[fpmcsrc.zip],Free Pascal Message Compiler
 # Source 6
-package=utils-fppkg-3.3.1.source.zip[ufpkgsrc.zip],Free Pascal package repository utility
+package=utils-fppkg-3.3.1.source.zip[fpkgsrc.zip],Free Pascal package repository utility
 # Source 7
-package=utils-fprcp-3.3.1.source.zip[ufprcsrc.zip],Free Pascal Resource Compiler Preprocessor
+package=utils-fprcp-3.3.1.source.zip[fprcsrc.zip],Free Pascal Resource Compiler Preprocessor
 # Source 8
-package=utils-fpcres-3.3.1.source.zip[ufprssrc.zip],Free Pascal Resource Converter
+package=utils-fpcres-3.3.1.source.zip[fprssrc.zip],Free Pascal Resource Converter
 # Source 9
-package=utils-fpcreslipo-3.3.1.source.zip[ufprlsrc.zip],Free Pascal External Resource Thinner
+package=utils-fpcreslipo-3.3.1.source.zip[fprlsrc.zip],Free Pascal External Resource Thinner
 # Source 10
-package=utils-h2pas-3.3.1.source.zip[uh2pasrc.zip],Create Pascal interface units from C headers
+package=utils-h2pas-3.3.1.source.zip[h2pasrc.zip],Create Pascal interface units from C headers
 # Source 11
-package=utils-json2pas-3.3.1.source.zip[ujs2psrc.zip],A utility to create Object Pascal classes files from sample JSON files
+package=utils-json2pas-3.3.1.source.zip[jsnpsrc.zip],A utility to create Object Pascal classes files from sample JSON files
 # Source 12
-package=utils-importtl-3.3.1.source.zip[uimptsrc.zip],
+package=utils-importtl-3.3.1.source.zip[imptsrc.zip],
 # Source 13
-package=utils-instantfpc-3.3.1.source.zip[uifpcsrc.zip],Instantaneous Free Pascal source executer
+package=utils-instantfpc-3.3.1.source.zip[ifpcsrc.zip],Instantaneous Free Pascal source executer
 # Source 14
-package=utils-pas2js-3.3.1.source.zip[up2jssrc.zip],Pascal to JavaScript converter
+package=utils-pas2js-3.3.1.source.zip[p2jssrc.zip],Pascal to JavaScript converter
 # Source 15
-package=utils-pas2fpm-3.3.1.source.zip[up2fpsrc.zip],Generate fpmake.pp for Pascal source
+package=utils-pas2fpm-3.3.1.source.zip[p2fmsrc.zip],Generate fpmake.pp for Pascal source
 # Source 16
-package=utils-pas2jni-3.3.1.source.zip[up2jnsrc.zip],Generate JNI bridge for Pascal code
+package=utils-pas2jni-3.3.1.source.zip[p2jnsrc.zip],Generate JNI bridge for Pascal code
 # Source 17
-package=utils-pas2ut-3.3.1.source.zip[up2utsrc.zip],Pascal source to FPC Unit test generator
+package=utils-pas2ut-3.3.1.source.zip[p2utsrc.zip],Pascal source to FPC Unit test generator
 # Source 18
-package=utils-rmwait-3.3.1.source.zip[urmwsrc.zip],Remove (delete) file(s) with optional retries
+package=utils-rmwait-3.3.1.source.zip[rmwsrc.zip],Remove (delete) file(s) with optional retries
+# Source 19
+package=utils-fpcmkcfg-3.3.1.source.zip[fcmksrc.zip],A utility to create the Free Pascal configuration files
+# Source 20
+package=utils-ihxutil-3.3.1.source.zip[ihxusrc.zip],A tool to convert Intel HEX Format files different formats used on various Z80 systems
+
 
 defaultcfg=
 #

+ 11 - 7
packages/chm/src/chmfilewriter.pas

@@ -1190,8 +1190,8 @@ begin
   Writer.FullTextSearch := MakeSearchable;
   Writer.HasBinaryTOC := MakeBinaryTOC;
   Writer.HasBinaryIndex := MakeBinaryIndex;
-  Writer.IndexName := ExtractFileName(IndexFileName);
-  Writer.TocName   := ExtractFileName(TableOfContentsFileName);
+  Writer.IndexName := IndexFileName;
+  Writer.TocName   := TableOfContentsFileName;
   Writer.ReadmeMessage := ReadmeMessage;
   Writer.DefaultWindow := FDefaultWindow;
   Writer.LocaleID := FLocaleID;
@@ -1231,16 +1231,19 @@ begin
 end;
 
 procedure TChmProject.LoadSitemaps;
+var
+  FullFileName: string;
 // #IDXHDR (merged files) goes into the system file, and need to keep  TOC sitemap around
 begin
    if FTableOfContentsFileName<>'' then
    begin
-     if fileexists(FTableOfContentsFileName) then
+     FullFileName := IncludeTrailingPathDelimiter(ProjectDir()) + ExtractFileName(FTableOfContentsFileName);
+     if FileExists(FullFileName) then
        begin
          FreeAndNil(FTocStream);
          FTocStream:=TMemoryStream.Create;
          try
-           FTocStream.loadfromfile(FTableOfContentsFilename);
+           FTocStream.loadfromfile(FullFileName);
            //writeln(ftableofcontentsfilename, ' ' ,ftocstream.size);
            FTocStream.Position:=0;
            FreeAndNil(FToc);
@@ -1257,18 +1260,19 @@ begin
      else
        error(chmerror,'Can''t find TOC file'+FTableOfContentsFileName);
    end;
-   if FIndexFileName<>'' then
+   FullFileName := IncludeTrailingPathDelimiter(ProjectDir()) + ExtractFileName(FIndexFileName);
+   if FileExists(FullFileName) then
    begin
      if fileexists(FIndexFileName) then
        begin
         FreeAndNil(FIndexStream);
         FIndexStream:=TMemoryStream.Create;
         try
-          FIndexStream.LoadFromFile(FIndexFileName);
+          FIndexStream.LoadFromFile(FullFileName);
           FIndexStream.Position:=0;
           FreeAndNil(FIndex);
           FIndex:=TChmSiteMap.Create(stindex);
-          FIndex.loadfromfile(FIndexFileName);
+          FIndex.loadfromfile(FullFileName);
           Error(chmnote,'Index items:'+inttostr(findex.Items.count));
         except
           on e: Exception do

+ 4 - 0
packages/fcl-db/src/sqldb/odbc/odbcconn.pas

@@ -32,6 +32,8 @@ type
     FParamIndex:TParamBinding; // maps the i-th parameter in the query to the TParams passed to PrepareStatement
     FParamBuf:array of pointer; // buffers that can be used to bind the i-th parameter in the query
   public
+    property STMTHandle:SQLHSTMT read FSTMTHandle;
+
     constructor Create(Connection:TODBCConnection);
     destructor Destroy; override;
   end;
@@ -142,6 +144,8 @@ type
     Class Function Description : String; override;
   end;
 
+function ODBCSuccess(const Res:SQLRETURN):boolean;
+
 implementation
 
 uses

+ 31 - 1
packages/fcl-js/src/jstree.pp

@@ -158,6 +158,7 @@ Type
     Property Flags : TJSElementFlags Read FFlags Write FFlags;
   end;
   TJSElementClass = Class of TJSElement;
+  TJSElementArray = array of TJSElement;
 
   { TJSEmptyBlockStatement - empty curly brackets }
 
@@ -1758,9 +1759,38 @@ end;
 { TJSBinary }
 
 destructor TJSBinary.Destroy;
+var
+  El: TJSElement;
+  BinCnt: Integer;
+  Bins: TJSElementArray;
+  SubBin: TJSBinary;
 begin
-  FreeAndNil(FB);
+  if FA is TJSBinary then
+    begin
+    // free El binary chains without stack
+    El:=FA;
+    SetLength(Bins{%H-},8);
+    BinCnt:=0;
+    while El is TJSBinary do
+      begin
+      SubBin:=TJSBinary(El);
+      if BinCnt=length(Bins) then
+        SetLength(Bins,BinCnt*2);
+      Bins[BinCnt]:=SubBin;
+      inc(BinCnt);
+      El:=SubBin.FA;
+      end;
+    while BinCnt>0 do
+      begin
+      dec(BinCnt);
+      SubBin:=TJSBinary(Bins[BinCnt]);
+      FreeAndNil(SubBin.FA);
+      FreeAndNil(SubBin.FB);
+      end;
+    end;
+
   FreeAndNil(FA);
+  FreeAndNil(FB);
   inherited Destroy;
 end;
 

+ 61 - 26
packages/fcl-js/src/jswriter.pp

@@ -1372,11 +1372,26 @@ begin
 end;
 
 procedure TJSWriter.WriteBinary(El: TJSBinary);
+var
+  ElC: TClass;
+  S : String;
+
+  procedure WriteRight(Bin: TJSBinary);
+  begin
+    FSkipRoundBrackets:=(Bin.B.ClassType=ElC)
+          and ((ElC=TJSLogicalOrExpression)
+            or (ElC=TJSLogicalAndExpression));
+    Write(S);
+    WriteJS(Bin.B);
+    Writer.CurElement:=Bin;
+  end;
 
 Var
-  S : String;
   AllowCompact, WithBrackets: Boolean;
-  ElC: TClass;
+  Left: TJSElement;
+  SubBin: TJSBinaryExpression;
+  Binaries: TJSElementArray;
+  BinariesCnt: integer;
 begin
   {$IFDEF VerboseJSWriter}
   System.writeln('TJSWriter.WriteBinary SkipRoundBrackets=',FSkipRoundBrackets);
@@ -1386,20 +1401,10 @@ begin
     Write('(');
   FSkipRoundBrackets:=false;
   ElC:=El.ClassType;
-  if El.A is TJSBinaryExpression then
-    if (El.A.ClassType=ElC)
-        and ((ElC=TJSLogicalOrExpression)
-        or (ElC=TJSLogicalAndExpression)
-        or (ElC=TJSBitwiseAndExpression)
-        or (ElC=TJSBitwiseOrExpression)
-        or (ElC=TJSBitwiseXOrExpression)
-        or (ElC=TJSAdditiveExpressionPlus)
-        or (ElC=TJSAdditiveExpressionMinus)
-        or (ElC=TJSMultiplicativeExpressionMul)) then
-      FSkipRoundBrackets:=true;
-  WriteJS(El.A);
-  Writer.CurElement:=El;
+  Left:=El.A;
   AllowCompact:=False;
+
+  S:='';
   if (El is TJSBinaryExpression) then
     begin
     S:=TJSBinaryExpression(El).OperatorString;
@@ -1412,17 +1417,47 @@ begin
     else
       S:=' '+S+' ';
     end;
-  FSkipRoundBrackets:=false;
-  ElC:=El.ClassType;
-  if El.B is TJSBinaryExpression then
-    if (El.B.ClassType=ElC)
-        and ((ElC=TJSLogicalOrExpression)
-        or (ElC=TJSLogicalAndExpression)) then
-      FSkipRoundBrackets:=true;
-  // Note: a+(b+c) <> a+b+c  e.g. floats, 0+string
-  Write(S);
-  WriteJS(El.B);
-  Writer.CurElement:=El;
+
+  if (Left is TJSBinaryExpression)
+      and (Left.ClassType=ElC)
+      and ((ElC=TJSLogicalOrExpression)
+        or (ElC=TJSLogicalAndExpression)
+        or (ElC=TJSBitwiseAndExpression)
+        or (ElC=TJSBitwiseOrExpression)
+        or (ElC=TJSBitwiseXOrExpression)
+        or (ElC=TJSAdditiveExpressionPlus)
+        or (ElC=TJSAdditiveExpressionMinus)
+        or (ElC=TJSMultiplicativeExpressionMul)) then
+    begin
+    // handle left handed multi add without stack
+    SetLength(Binaries{%H-},8);
+    BinariesCnt:=0;
+    while Left is TJSBinaryExpression do
+      begin
+      SubBin:=TJSBinaryExpression(Left);
+      if SubBin.ClassType<>ElC then break;
+      if BinariesCnt=length(Binaries) then
+        SetLength(Binaries,BinariesCnt*2);
+      Binaries[BinariesCnt]:=SubBin;
+      inc(BinariesCnt);
+      Left:=SubBin.A;
+      end;
+
+    WriteJS(Left);
+    Writer.CurElement:=El;
+
+    while BinariesCnt>0 do
+      begin
+      dec(BinariesCnt);
+      WriteRight(TJSBinaryExpression(Binaries[BinariesCnt]));
+      end;
+    end
+  else
+    begin;
+    WriteJS(Left);
+    Writer.CurElement:=El;
+    end;
+  WriteRight(El);
   if WithBrackets then
     Write(')');
 end;

+ 61 - 5
packages/fcl-js/tests/tcsrcmap.pas

@@ -24,6 +24,7 @@ type
     procedure Test_Base64VLQ;
     procedure TestSrcMapIgnoreDuplicate;
     procedure TestSrcMapNames;
+    procedure TestSrcMapLoad;
   end;
 
 implementation
@@ -127,7 +128,9 @@ begin
   try
     sm.AddMapping(1,1,'a.js',2,2,'foo');
     sm.AddMapping(3,3,'a.js',4,4,'foo');
+    {$IFDEF VerboseSrcMap}
     writeln(sm.ToString);
+    {$ENDIF}
     {
       version: 3,
       file: 'generated.js',
@@ -139,33 +142,86 @@ begin
 
     // version
     El:=GetEl(Obj,'version',TJSONIntegerNumber);
-    AssertEquals('json "version" value',El.AsInt64,3);
+    AssertEquals('json "version" value',3,El.AsInt64);
 
     // file
     El:=GetEl(Obj,'file',TJSONString);
-    AssertEquals('json "file" value',El.AsString,'generated.js');
+    AssertEquals('json "file" value','generated.js',El.AsString);
 
     // sources
     Arr:=TJSONArray(GetEl(Obj,'sources',TJSONArray));
     AssertEquals('json "sources".count',Arr.Count,1);
     El:=Arr[0];
     CheckEl('sources[0]',El,TJSONString);
-    AssertEquals('json "sources[0]" value',El.AsString,'a.js');
+    AssertEquals('json "sources[0]" value','a.js',El.AsString);
 
     // names
     Arr:=TJSONArray(GetEl(Obj,'names',TJSONArray));
     AssertEquals('json "names".count',Arr.Count,1);
     El:=Arr[0];
     CheckEl('names[0]',El,TJSONString);
-    AssertEquals('json "names[0]" value',El.AsString,'foo');
+    AssertEquals('json "names[0]" value','foo',El.AsString);
 
     // mappings
     El:=GetEl(Obj,'mappings',TJSONString);
-    AssertEquals('json "mappings" value',El.AsString,'CACEA;;GAEEA');
+    AssertEquals('json "mappings" value','CACEA;;GAEEA',El.AsString);
+
+  finally
+    Obj.Free;
+    sm.Free;
+  end;
+end;
+
+procedure TTestSrcMap.TestSrcMapLoad;
+var
+  sm, sm2: TSourceMap;
+  Obj: TJSONObject;
+  i: Integer;
+begin
+  Obj:=nil;
+  sm2:=nil;
+  sm:=TSourceMap.Create('generated.js');
+  try
+    sm.AddMapping(1,1,'a.js',2,2,'foo');
+    sm.AddMapping(3,3,'a.js',4,4,'foo');
+    {$IFDEF VerboseSrcMap}
+    writeln(sm.ToString);
+    {$ENDIF}
+    {
+      version: 3,
+      file: 'generated.js',
+      sources: ['a.js'],
+      names: ['foo'],
+      mappings: 'CACEA;;GAEEA'
+    }
+    Obj:=sm.ToJSON;
+
+    sm2:=TSourceMap.Create('(not set)');
+    sm2.LoadFromJSON(Obj);
+
+    AssertEquals('same GeneratedFilename',sm.GeneratedFilename,sm2.GeneratedFilename);
+    AssertEquals('same SourceCount',sm.SourceCount,sm2.SourceCount);
+    for i:=0 to sm.SourceCount-1 do
+      AssertEquals('same SourceFiles['+IntToStr(i)+']',sm.SourceFiles[i],sm2.SourceFiles[i]);
+    AssertEquals('same NameCount',sm.NameCount,sm2.NameCount);
+    for i:=0 to sm.NameCount-1 do
+      AssertEquals('same Names['+IntToStr(i)+']',sm.Names[i],sm2.Names[i]);
+    AssertEquals('same Count',sm.Count,sm2.Count);
+    for i:=0 to sm.Count-1 do
+      begin
+      AssertEquals('same Items['+IntToStr(i)+'].Index',sm[i].Index,sm2[i].Index);
+      AssertEquals('same Items['+IntToStr(i)+'].GeneratedLine',sm[i].GeneratedLine,sm2[i].GeneratedLine);
+      AssertEquals('same Items['+IntToStr(i)+'].GeneratedColumn',sm[i].GeneratedColumn,sm2[i].GeneratedColumn);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcFileIndex',sm[i].SrcFileIndex,sm2[i].SrcFileIndex);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcLine',sm[i].SrcLine,sm2[i].SrcLine);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcColumn',sm[i].SrcColumn,sm2[i].SrcColumn);
+      AssertEquals('same Items['+IntToStr(i)+'].NameIndex',sm[i].NameIndex,sm2[i].NameIndex);
+      end;
 
   finally
     Obj.Free;
     sm.Free;
+    sm2.Free;
   end;
 end;
 

+ 48 - 0
packages/fcl-passrc/src/pasresolveeval.pas

@@ -1524,6 +1524,8 @@ function TResExprEvaluator.EvalBinaryExpr(Expr: TBinaryExpr;
   Flags: TResEvalFlags): TResEvalValue;
 var
   LeftValue, RightValue: TResEvalValue;
+  Left: TPasExpr;
+  SubBin: TBinaryExpr;
 begin
   Result:=nil;
   if (Expr.Kind=pekBinary) and (Expr.OpCode=eopSubIdent) then
@@ -1534,6 +1536,52 @@ begin
   LeftValue:=nil;
   RightValue:=nil;
   try
+    if Expr.OpCode=eopAdd then
+      begin
+      // handle multi adds without stack
+      Left:=Expr.left;
+      while Left.ClassType=TBinaryExpr do
+        begin
+        SubBin:=TBinaryExpr(Left);
+        if SubBin.OpCode<>eopAdd then break;
+        Left:=SubBin.left;
+        end;
+      LeftValue:=Eval(Left,Flags);
+      while LeftValue<>nil do
+        begin
+        SubBin:=TBinaryExpr(Left.Parent);
+        RightValue:=Eval(SubBin.right,Flags);
+        if RightValue=nil then exit;
+
+        if LeftValue.Kind=revkExternal then
+          begin
+          if [refConst,refConstExt]*Flags=[refConst] then
+            RaiseConstantExprExp(20210321205928,Expr.left);
+          Result:=LeftValue;
+          LeftValue:=nil;
+          exit;
+          end;
+        if RightValue.Kind=revkExternal then
+          begin
+          if [refConst,refConstExt]*Flags=[refConst] then
+            RaiseConstantExprExp(20210321205948,Expr.right);
+          Result:=RightValue;
+          RightValue:=nil;
+          exit;
+          end;
+
+        Result:=EvalBinaryAddExpr(SubBin,LeftValue,RightValue);
+        ReleaseEvalValue(LeftValue);
+        if SubBin=Expr then exit;
+
+        LeftValue:=Result;
+        Result:=nil;
+        Left:=SubBin;
+        end;
+
+      exit;
+      end;
+
     LeftValue:=Eval(Expr.left,Flags);
     if LeftValue=nil then exit;
     RightValue:=Eval(Expr.right,Flags);

+ 99 - 7
packages/fcl-passrc/src/pasresolver.pp

@@ -2387,6 +2387,7 @@ type
       EvalLow: boolean; ErrorEl: TPasElement): TResEvalValue; virtual; // compute low() or high()
     function EvalTypeRange(Decl: TPasType; Flags: TResEvalFlags): TResEvalValue; virtual; // compute low() and high()
     function HasTypeInfo(El: TPasType): boolean; virtual;
+    function IsAnonymousElType(El: TPasType): boolean; virtual;
     function GetActualBaseType(bt: TResolverBaseType): TResolverBaseType; virtual;
     function GetCombinedBoolean(Bool1, Bool2: TResolverBaseType; ErrorEl: TPasElement): TResolverBaseType; virtual;
     function GetCombinedInt(const Int1, Int2: TPasResolverResult; ErrorEl: TPasElement): TResolverBaseType; virtual;
@@ -6236,15 +6237,26 @@ procedure TPasResolver.FinishSubElementType(Parent: TPasElement; El: TPasType);
     {$IFDEF CheckPasTreeRefCount};const aId: string{$ENDIF});
   var
     i: Integer;
-    p: TPasElement;
+    p, Prev: TPasElement;
   begin
     p:=El.Parent;
     if NewParent=p.Parent then
       begin
-      // e.g. a:array of longint; -> insert a$a in front of a
+      // e.g. m,n:array of longint; -> insert n$a in front of m
       i:=List.Count-1;
       while (i>=0) and (List[i]<>Pointer(p)) do
         dec(i);
+      if P is TPasVariable then
+        begin
+        while (i>0) do
+          begin
+          Prev:=TPasElement(List[i-1]);
+          if (Prev.ClassType=P.ClassType) and (TPasVariable(Prev).VarType=TPasVariable(P).VarType) then
+            dec(i) // e.g. m,n: array of longint
+          else
+            break;
+          end;
+        end;
       if i<0 then
         List.Add(El)
       else
@@ -10585,6 +10597,9 @@ end;
 
 procedure TPasResolver.ResolveBinaryExpr(El: TBinaryExpr;
   Access: TResolvedRefAccess);
+var
+  Left, Next: TPasExpr;
+  Bin: TBinaryExpr;
 begin
   {$IFDEF VerbosePasResolver}
   //writeln('TPasResolver.ResolveBinaryExpr left=',GetObjName(El.left),' right=',GetObjName(El.right),' opcode=',OpcodeStrings[El.OpCode]);
@@ -10611,7 +10626,26 @@ begin
         RaiseNotYetImplemented(20160922163456,El);
         end;
     end;
-  eopAdd,
+  eopAdd:
+    begin
+    Left:=El.left;
+    while (Left.ClassType=TBinaryExpr) do
+      begin
+      Bin:=TBinaryExpr(Left);
+      if Bin.OpCode<>eopAdd then break;
+      Next:=TBinaryExpr(Left).left;
+      if Next.Parent<>Left then
+        RaiseNotYetImplemented(20210321201257,Left);
+      Left:=Next;
+      end;
+    ResolveExpr(Left,rraRead);
+    repeat
+      Bin:=TBinaryExpr(Left.Parent);
+      if Bin.right<>nil then
+        ResolveExpr(Bin.right,rraRead);
+      Left:=Bin;
+    until Left=El;
+    end;
   eopSubtract,
   eopMultiply,
   eopDivide,
@@ -12939,6 +12973,8 @@ procedure TPasResolver.ComputeBinaryExpr(Bin: TBinaryExpr; out
   StartEl: TPasElement);
 var
   LeftResolved, RightResolved: TPasResolverResult;
+  Left: TPasExpr;
+  SubBin: TBinaryExpr;
 begin
   if (Bin.OpCode=eopSubIdent)
   or ((Bin.OpCode=eopNone) and (Bin.left is TInheritedExpr)) then
@@ -12958,11 +12994,36 @@ begin
     exit;
     end;
 
-  ComputeElement(Bin.left,LeftResolved,Flags-[rcNoImplicitProc],StartEl);
-  ComputeElement(Bin.right,RightResolved,Flags-[rcNoImplicitProc],StartEl);
-  // ToDo: check operator overloading
+  if Bin.OpCode=eopAdd then
+    begin
+    // handle multi-adds without stack
+    Left:=Bin.left;
+    while Left.ClassType=TBinaryExpr do
+      begin
+      SubBin:=TBinaryExpr(Left);
+      if SubBin.OpCode<>eopAdd then break;
+      Left:=SubBin.left;
+      end;
+    // Left is now left-most of multi add
+    ComputeElement(Left,LeftResolved,Flags-[rcNoImplicitProc],StartEl);
+    repeat
+      SubBin:=TBinaryExpr(Left.Parent);
+      ComputeElement(Bin.right,RightResolved,Flags-[rcNoImplicitProc],StartEl);
 
-  ComputeBinaryExprRes(Bin,ResolvedEl,Flags,LeftResolved,RightResolved);
+      // ToDo: check operator overloading
+      ComputeBinaryExprRes(SubBin,ResolvedEl,Flags,LeftResolved,RightResolved);
+      LeftResolved:=ResolvedEl;
+      Left:=SubBin;
+    until Left=Bin;
+    end
+  else
+    begin
+    ComputeElement(Bin.left,LeftResolved,Flags-[rcNoImplicitProc],StartEl);
+    ComputeElement(Bin.right,RightResolved,Flags-[rcNoImplicitProc],StartEl);
+
+    // ToDo: check operator overloading
+    ComputeBinaryExprRes(Bin,ResolvedEl,Flags,LeftResolved,RightResolved);
+    end;
 end;
 
 procedure TPasResolver.ComputeBinaryExprRes(Bin: TBinaryExpr; out
@@ -29623,6 +29684,37 @@ begin
   Result:=true;
 end;
 
+function TPasResolver.IsAnonymousElType(El: TPasType): boolean;
+// e.g. b$a$a
+var
+  aName: String;
+  i, l: SizeInt;
+  j: Integer;
+begin
+  Result:=false;
+  if AnonymousElTypePostfix='' then exit;
+  aName:=El.Name;
+  l:=length(AnonymousElTypePostfix);
+  i:=length(aName);
+  repeat
+    dec(i,l);
+    if i>0 then
+      begin
+      j:=i;
+      while (j<=l) and (aName[i+j]=AnonymousElTypePostfix[j]) do inc(j);
+      if j>l then
+        begin
+        Result:=true;
+        continue;
+        end;
+      end;
+    if not Result then exit; // no postfix
+    // at least one anonymous eltype postfix
+    Result:=IsValidIdent(LeftStr(aName,i+l));
+    exit;
+  until false;
+end;
+
 function TPasResolver.GetActualBaseType(bt: TResolverBaseType
   ): TResolverBaseType;
 begin

+ 26 - 3
packages/fcl-passrc/src/pastree.pp

@@ -5873,7 +5873,6 @@ begin
   end;
 end;
 
-
 constructor TBinaryExpr.Create(AParent : TPasElement; xleft,xright:TPasExpr; AOpCode:TExprOpCode);
 begin
   inherited Create(AParent,pekBinary, AOpCode);
@@ -5893,9 +5892,33 @@ begin
 end;
 
 destructor TBinaryExpr.Destroy;
+var
+  El: TPasExpr;
+  SubBin: TBinaryExpr;
 begin
-  ReleaseAndNil(TPasElement(left){$IFDEF CheckPasTreeRefCount},'TBinaryExpr.left'{$ENDIF});
-  ReleaseAndNil(TPasElement(right){$IFDEF CheckPasTreeRefCount},'TBinaryExpr.right'{$ENDIF});
+  // handle left of binary chains without stack
+  El:=Left;
+  while El is TBinaryExpr do
+    begin
+    SubBin:=TBinaryExpr(El);
+    El:=SubBin.left;
+    if (El=nil) or (El.Parent<>SubBin) then
+      begin
+      El:=SubBin;
+      break;
+      end;
+    end;
+
+  repeat
+    if El=left then
+      SubBin:=Self
+    else
+      SubBin:=TBinaryExpr(El.Parent);
+    ReleaseAndNil(TPasElement(SubBin.left){$IFDEF CheckPasTreeRefCount},'TBinaryExpr.left'{$ENDIF});
+    ReleaseAndNil(TPasElement(SubBin.right){$IFDEF CheckPasTreeRefCount},'TBinaryExpr.left'{$ENDIF});
+    El:=SubBin;
+  until El=Self;
+
   inherited Destroy;
 end;
 

+ 25 - 2
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -1711,6 +1711,8 @@ var
   Decl: TPasElement;
   ModScope: TPasModuleScope;
   Access: TResolvedRefAccess;
+  Bin: TBinaryExpr;
+  Left: TPasExpr;
 begin
   if El=nil then exit;
   // Note: expression itself is not marked, but it can reference identifiers
@@ -1792,8 +1794,29 @@ begin
     // ok
   else if C=TBinaryExpr then
     begin
-    UseExpr(TBinaryExpr(El).left);
-    UseExpr(TBinaryExpr(El).right);
+    Bin:=TBinaryExpr(El);
+    if Bin.OpCode=eopAdd then
+      begin
+      // handle multi add expressions without stack
+      Left:=Bin;
+      while Left.ClassType=TBinaryExpr do
+        begin
+        Bin:=TBinaryExpr(Left);
+        if Bin.OpCode<>eopAdd then break;
+        Left:=Bin.left;
+        end;
+      UseExpr(Left);
+      repeat
+        Bin:=TBinaryExpr(Left.Parent);
+        UseExpr(Bin.right);
+        Left:=Bin;
+      until Left=El;
+      end
+    else
+      begin
+      UseExpr(Bin.left);
+      UseExpr(Bin.right);
+      end;
     end
   else if C=TUnaryExpr then
     UseExpr(TUnaryExpr(El).Operand)

+ 1 - 0
packages/fcl-process/src/win/process.inc

@@ -285,6 +285,7 @@ Var
         Raise EProcess.CreateFmt(SErrCannotExecute,[FCommandLine,GetLastError]);
       FProcessHandle:=FProcessInformation.hProcess;
       FThreadHandle:=FProcessInformation.hThread;
+      FThreadId:=FProcessInformation.dwThreadId;  
       FProcessID:=FProcessINformation.dwProcessID;
     Finally
       if POUsePipes in Options then

+ 5 - 0
packages/odbc/src/odbcsql.inc

@@ -1217,6 +1217,7 @@ type   TSQLFetch=function (StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extd
 
 type   TSQLNumResultCols=function (StatementHandle:SQLHSTMT;
            var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+type   TSQLMoreResults=function (StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLDescribeCol=function (StatementHandle:SQLHSTMT;
            ColumnNumber:SQLUSMALLINT;ColumnName:PSQLCHAR;
@@ -1444,6 +1445,7 @@ var    SQLCloseCursor:TSQLCloseCursor;
 var    SQLExecute:TSQLExecute;
 var    SQLFetch:TSQLFetch;
 var    SQLNumResultCols:TSQLNumResultCols;
+var    SQLMoreResults:TSQLMoreResults;
 var    SQLDescribeColA:TSQLDescribeCol;
        SQLDescribeColW:TSQLDescribeColW;
 var    SQLFetchScroll:TSQLFetchScroll;
@@ -1608,6 +1610,8 @@ var
    function SQLNumResultCols(
                StatementHandle:SQLHSTMT;
                var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+   function SQLMoreResults(
+               StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLDescribeCol(
                StatementHandle:SQLHSTMT;
                ColumnNumber:SQLUSMALLINT;
@@ -1918,6 +1922,7 @@ begin
     pointer(SQLExecute) := GetProcedureAddress(ODBCLibraryHandle,'SQLExecute');
     pointer(SQLFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetch');
     pointer(SQLNumResultCols) := GetProcedureAddress(ODBCLibraryHandle,'SQLNumResultCols');
+    pointer(SQLMoreResults) := GetProcedureAddress(ODBCLibraryHandle,'SQLMoreResults');
     pointer(SQLFetchScroll) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetchScroll');
     pointer(SQLExtendedFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLExtendedFetch');
     pointer(SQLGetData) := GetProcedureAddress(ODBCLibraryHandle,'SQLGetData');

+ 278 - 96
packages/pastojs/src/fppas2js.pp

@@ -555,6 +555,7 @@ type
     pbifnArray_ConcatN,
     pbifnArray_Copy,
     pbifnArray_Equal,
+    pbifnArray_Insert,
     pbifnArray_Length,
     pbifnArray_Reference,
     pbifnArray_SetLength,
@@ -743,6 +744,7 @@ const
     'arrayConcatN', // rtl.arrayConcatN   pbifnArray_ConcatN
     'arrayCopy', // rtl.arrayCopy      pbifnArray_Copy
     'arrayEq', // rtl.arrayEq          pbifnArray_Equal
+    'arrayInsert', // rtl.arrayCopy      pbifnArray_Insert
     'length', // rtl.length    pbifnArray_Length
     'arrayRef', // rtl.arrayRef  pbifnArray_Reference
     'arraySetLength', // rtl.arraySetLength  pbifnArray_SetLength
@@ -2160,6 +2162,7 @@ type
     Function CreateRTTIMemberProperty(Members: TFPList; Index: integer;
       AContext: TConvertContext): TJSElement; virtual;
     Procedure CreateRTTIAnonymous(El: TPasType; AContext: TConvertContext); virtual; // needed by precompiled files from 2.0.0
+    Function CreateRTTIAnonymousArray(El: TPasArrayType; AContext: TConvertContext): TJSCallExpression; virtual;
     Function CreateRTTIMembers(El: TPasMembersType; Src: TJSSourceElements;
       FuncContext: TFunctionContext; MembersSrc: TJSSourceElements;
       MembersFuncContext: TFunctionContext; RTTIExpr: TJSElement;
@@ -2261,6 +2264,7 @@ type
     Function ConvertBinaryExpression(El: TBinaryExpr; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertBinaryExpressionRes(El: TBinaryExpr; AContext: TConvertContext;
       const LeftResolved, RightResolved: TPasResolverResult; var A,B: TJSElement): TJSElement; virtual;
+    function ConvertBinaryExpressionMultiAdd(El: TBinaryExpr; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertSubIdentExpression(El: TBinaryExpr; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertSubIdentExprCustom(El: TBinaryExpr; AContext: TConvertContext;
       const OnConvertRight: TConvertJSEvent = nil; Data: Pointer = nil): TJSElement; virtual;
@@ -7575,8 +7579,11 @@ var
   i: Integer;
 begin
   for i:=0 to length(PrecompiledVars)-1 do
-    if PrecompiledVars[i].Name=aName then
-      exit(PrecompiledVars[i]);
+    begin
+    Result:=PrecompiledVars[i];
+    if Result.Name=aName then
+      exit;
+    end;
   if not WithParents then
     exit(nil);
   Result:=inherited FindPrecompiledVar(aName,WithParents);
@@ -7588,8 +7595,11 @@ var
   i: Integer;
 begin
   for i:=0 to length(PrecompiledVars)-1 do
-    if PrecompiledVars[i].Element=El then
-      exit(PrecompiledVars[i]);
+    begin
+    Result:=PrecompiledVars[i];
+    if Result.Element=El then
+      exit;
+    end;
   if not WithParents then
     exit(nil);
   Result:=inherited FindPrecompiledVar(El, WithParents);
@@ -7622,6 +7632,7 @@ function TFunctionContext.AddLocalVar(aName: string; El: TPasElement;
 var
   l: Integer;
   Ident, V: TFCLocalIdentifier;
+  PV: TPas2JSStoredLocalVar;
 begin
   Ident:=FindLocalVar(aName,true);
   if Ident<>nil then
@@ -7643,7 +7654,15 @@ begin
         raise EPas2JS.Create('[20200608131330] "'+aName+'" El='+GetObjPath(El));
         end;
       end;
+    end
+  else if aKind=cvkGlobal then
+    begin
+    // check precompiled names
+    PV:=FindPrecompiledVar(El,true);
+    if PV<>nil then
+      aName:=PV.Name;
     end;
+  // add
   l:=length(LocalVars);
   SetLength(LocalVars,l+1);
   Result:=TFCLocalIdentifier.Create(aName,El,aKind);
@@ -8787,6 +8806,11 @@ begin
   aResolver:=AContext.Resolver;
 
   case El.OpCode of
+  eopAdd:
+    begin
+    Result:=ConvertBinaryExpressionMultiAdd(El,aContext);
+    exit;
+    end;
   eopSubIdent:
     begin
     Result:=ConvertSubIdentExpression(El,AContext);
@@ -8803,9 +8827,10 @@ begin
   OldAccess:=AContext.Access;
   AContext.Access:=caRead;
   Call:=nil;
-  A:=ConvertExpression(El.left,AContext);
+  A:=nil;
   B:=nil;
   try
+    A:=ConvertExpression(El.left,AContext);
     B:=ConvertExpression(El.right,AContext);
 
     if aResolver<>nil then
@@ -9677,6 +9702,103 @@ begin
     end;
 end;
 
+function TPasToJSConverter.ConvertBinaryExpressionMultiAdd(El: TBinaryExpr;
+  AContext: TConvertContext): TJSElement;
+// handle multi add without stack
+// Note: The parser generates a list of TBinaryExpr.Lefts
+var
+  aResolver: TPas2JSResolver;
+  Left: TPasExpr;
+  SubBin: TBinaryExpr;
+  A, B: TJSElement;
+  LeftResolved, RightResolved, ResultResolved: TPasResolverResult;
+  Flags: TPasResolverComputeFlags;
+  R: TJSBinary;
+  OldAccess: TCtxAccess;
+begin
+  Result:=nil;
+  aResolver:=AContext.Resolver;
+  Left:=El;
+  while Left.ClassType=TBinaryExpr do
+    begin
+    SubBin:=TBinaryExpr(Left);
+    if SubBin.OpCode<>eopAdd then break;
+    Left:=SubBin.left;
+    if Left.Parent<>SubBin then
+      begin
+      if aResolver<>nil then
+        RaiseNotSupported(SubBin,AContext,20210321220458)
+      else if Left.Parent=nil then
+        Left.Parent:=SubBin
+      else
+        RaiseNotSupported(SubBin,AContext,20210321221135);
+      end;
+    end;
+  if Left=El then
+    RaiseNotSupported(El,AContext,20210321221047);
+  OldAccess:=AContext.Access;
+  AContext.Access:=caRead;
+  A:=nil;
+  B:=nil;
+  try
+    A:=ConvertExpression(Left,AContext);
+    Flags:=[];
+    if aResolver<>nil then
+      aResolver.ComputeElement(Left,LeftResolved,Flags);
+    repeat
+      SubBin:=TBinaryExpr(Left.Parent);
+      B:=ConvertExpression(SubBin.right,AContext);
+      if aResolver<>nil then
+        begin
+        aResolver.ComputeElement(El.right,RightResolved,Flags);
+        Result:=ConvertBinaryExpressionRes(SubBin,AContext,LeftResolved,RightResolved,A,B);
+        if (Result<>nil) then
+          begin
+          A:=nil;
+          B:=nil;
+          if SubBin=El then exit;
+          end;
+        aResolver.ComputeBinaryExprRes(SubBin,ResultResolved,Flags,LeftResolved,RightResolved);
+        end;
+      if Result=nil then
+        begin
+        // +
+        R:=TJSBinary(CreateElement(TJSAdditiveExpressionPlus,El));
+        R.A:=A; A:=nil;
+        R.B:=B; B:=nil;
+        Result:=R;
+
+        if (bsOverflowChecks in AContext.ScannerBoolSwitches) and (aResolver<>nil) then
+          case El.OpCode of
+          eopAdd,eopSubtract:
+            if (LeftResolved.BaseType in btAllJSOverflowAddSubType)
+                or (RightResolved.BaseType in btAllJSOverflowAddSubType) then
+              Result:=CreateOverflowCheckCall(Result,SubBin);
+          eopMultiply:
+            if (LeftResolved.BaseType in btAllJSOverflowMultType)
+                or (RightResolved.BaseType in btAllJSOverflowMultType) then
+              Result:=CreateOverflowCheckCall(Result,SubBin);
+          end;
+
+        if SubBin=El then exit;
+        end;
+      // next
+      A:=Result;
+      Result:=nil;
+      if aResolver<>nil then
+        LeftResolved:=ResultResolved;
+      Left:=SubBin;
+    until false;
+  finally
+    AContext.Access:=OldAccess;
+    if Result=nil then
+      begin
+      A.Free;
+      B.Free;
+      end;
+  end;
+end;
+
 function TPasToJSConverter.ConvertSubIdentExpression(El: TBinaryExpr;
   AContext: TConvertContext): TJSElement;
 // connect El.left and El.right with a dot.
@@ -14260,6 +14382,8 @@ end;
 
 function TPasToJSConverter.ConvertBuiltIn_CopyArray(El: TParamsExpr;
   AContext: TConvertContext): TJSElement;
+// convert  copy(Arr,Start,Count)
+//   ->  rtl.arrayCopy(type,Arr,Start,Count)
 var
   Param: TPasExpr;
   ParamResolved, ElTypeResolved: TPasResolverResult;
@@ -14328,25 +14452,32 @@ end;
 
 function TPasToJSConverter.ConvertBuiltIn_InsertArray(El: TParamsExpr;
   AContext: TConvertContext): TJSElement;
-// procedure insert(item,var array,const position)
-// ->  array.splice(position,0,item);
+// procedure insert(item,var AnArray,const position)
+// ->  AnArray=rtl.arrayInsert(item,AnArray,position);
 var
-  ArrEl: TJSElement;
   Call: TJSCallExpression;
+  AssignSt: TJSSimpleAssignStatement;
 begin
   Result:=nil;
-  Call:=nil;
+  AssignSt:=nil;
   try
+    // AnArray=
+    AssignSt:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El));
+    AssignSt.LHS:=ConvertExpression(El.Params[1],AContext);
     Call:=CreateCallExpression(El);
-    ArrEl:=ConvertExpression(El.Params[1],AContext);
-    Call.Expr:=CreateDotNameExpr(El,ArrEl,'splice');
-    Call.AddArg(ConvertExpression(El.Params[2],AContext));
-    Call.AddArg(CreateLiteralNumber(El,0));
+    AssignSt.Expr:=Call;
+    // rtl.arrayInsert
+    Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnArray_Insert)]);
+    // param: item
     Call.AddArg(ConvertExpression(El.Params[0],AContext));
-    Result:=Call;
+    // param: AnArray
+    Call.AddArg(ConvertExpression(El.Params[1],AContext));
+    // param: position
+    Call.AddArg(ConvertExpression(El.Params[2],AContext));
+    Result:=AssignSt;
   finally
     if Result=nil then
-      Call.Free;
+      AssignSt.Free;
   end;
 end;
 
@@ -16501,19 +16632,13 @@ var
 
 var
   aResolver: TPas2JSResolver;
-  Scope: TPas2JSArrayScope;
-  SpecializeDelay: Boolean;
   AssignSt: TJSSimpleAssignStatement;
-  CallName, ArrName: String;
-  Obj: TJSObjectLiteral;
-  Prop: TJSObjectLiteralElement;
-  ArrLit: TJSArrayLiteral;
-  Arr: TPasArrayType;
+  ArrName: String;
   Index: Integer;
-  ElTypeHi, ElTypeLo: TPasType;
+  ElTypeLo: TPasType;
   RangeEl: TPasExpr;
   Call: TJSCallExpression;
-  RgLen, RangeEnd: TMaxPrecInt;
+  RangeEnd: TMaxPrecInt;
   List: TJSStatementList;
   Func: TJSFunctionDeclarationStatement;
   BodySrc: TJSSourceElements;
@@ -16536,9 +16661,6 @@ begin
   writeln('TPasToJSConverter.ConvertArrayType ',GetObjName(El));
   {$ENDIF}
 
-  Scope:=El.CustomData as TPas2JSArrayScope;
-  SpecializeDelay:=(Scope<>nil) and (SpecializeNeedsDelay(El,AContext));
-
   ProcScope:=nil;
   Src:=nil;
   if AContext.JSElement is TJSSourceElements then
@@ -16636,7 +16758,7 @@ begin
       else
         Result:=ArraySt;
 
-      // store precompiled enum type in proc
+      // store precompiled array type in proc
       StorePrecompiledJS(ArraySt);
 
       ArraySt:=nil;
@@ -16648,52 +16770,12 @@ begin
     end;
     end;
 
-  if HasTypeInfo(El,AContext) then
+  if (not (AContext.PasElement is TPasMembersType)) // rtti of members is added separate
+      and HasTypeInfo(El,AContext) then
     begin
-    // module.$rtti.$DynArray("name",{...})
-    if length(El.Ranges)>0 then
-      CallName:=GetBIName(pbifnRTTINewStaticArray)
-    else
-      CallName:=GetBIName(pbifnRTTINewDynArray);
-    Call:=CreateRTTINewType(El,CallName,false,AContext,Obj);
+    Call:=nil;
     try
-      ElTypeHi:=aResolver.ResolveAliasType(El.ElType,false);
-      ElTypeLo:=aResolver.ResolveAliasType(ElTypeHi);
-      if length(El.Ranges)>0 then
-        begin
-        // static array
-        // dims: [dimsize1,dimsize2,...]
-        Prop:=Obj.Elements.AddElement;
-        Prop.Name:=TJSString(GetBIName(pbivnRTTIArray_Dims));
-        ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,El));
-        Prop.Expr:=ArrLit;
-        Arr:=El;
-        Index:=0;
-        repeat
-          RangeEl:=Arr.Ranges[Index];
-          RgLen:=aResolver.GetRangeLength(RangeEl);
-          ArrLit.AddElement(CreateLiteralNumber(RangeEl,RgLen));
-          inc(Index);
-          if Index=length(Arr.Ranges) then
-            begin
-            if ElTypeLo.ClassType<>TPasArrayType then
-              break;
-            Arr:=TPasArrayType(ElTypeLo);
-            if length(Arr.Ranges)=0 then
-              RaiseNotSupported(Arr,AContext,20170411222315,'static array of anonymous array');
-            ElTypeHi:=aResolver.ResolveAliasType(Arr.ElType,false);
-            ElTypeLo:=aResolver.ResolveAliasType(ElTypeHi);
-            Index:=0;
-            end;
-        until false;
-        end;
-      // eltype: ref
-      if not SpecializeDelay then
-        begin
-        Prop:=Obj.Elements.AddElement;
-        Prop.Name:=TJSString(GetBIName(pbivnRTTIArray_ElType));
-        Prop.Expr:=CreateTypeInfoRef(ElTypeHi,AContext,El);
-        end;
+      Call:=CreateRTTIAnonymousArray(El,AContext);
 
       if Src<>nil then
         begin
@@ -16912,6 +16994,7 @@ begin
         AddToSourceElements(ConstSrcElems,Lit);
         end;
       end;
+
     if coShortRefGlobals in Options then
       CreateGlobalAlias_List(ImplJS.ShortRefs,AContext);
     // precompiled body
@@ -20001,6 +20084,7 @@ begin
 
   JSTypeInfo:=CreateTypeInfoRef(VarType,AContext,V);
   OptionsEl:=nil;
+
   // Note: create JSTypeInfo first, it may raise an exception
   Call:=CreateCallExpression(V);
   try
@@ -20346,6 +20430,80 @@ begin
     end;
 end;
 
+function TPasToJSConverter.CreateRTTIAnonymousArray(El: TPasArrayType;
+  AContext: TConvertContext): TJSCallExpression;
+var
+  Scope: TPas2JSArrayScope;
+  SpecializeDelay: Boolean;
+  CallName: String;
+  Call: TJSCallExpression;
+  Obj: TJSObjectLiteral;
+  aResolver: TPas2JSResolver;
+  ElTypeHi, ElTypeLo: TPasType;
+  Prop: TJSObjectLiteralElement;
+  ArrLit: TJSArrayLiteral;
+  Arr: TPasArrayType;
+  Index: Integer;
+  RangeEl: TPasExpr;
+  RgLen: TMaxPrecInt;
+begin
+  Result:=nil;
+  aResolver:=AContext.Resolver;
+
+  Scope:=El.CustomData as TPas2JSArrayScope;
+  SpecializeDelay:=(Scope<>nil) and (SpecializeNeedsDelay(El,AContext));
+
+  // module.$rtti.$DynArray("name",{...})
+  if length(El.Ranges)>0 then
+    CallName:=GetBIName(pbifnRTTINewStaticArray)
+  else
+    CallName:=GetBIName(pbifnRTTINewDynArray);
+  Call:=CreateRTTINewType(El,CallName,false,AContext,Obj);
+  try
+    ElTypeHi:=aResolver.ResolveAliasType(El.ElType,false);
+    ElTypeLo:=aResolver.ResolveAliasType(ElTypeHi);
+    if length(El.Ranges)>0 then
+      begin
+      // static array
+      // dims: [dimsize1,dimsize2,...]
+      Prop:=Obj.Elements.AddElement;
+      Prop.Name:=TJSString(GetBIName(pbivnRTTIArray_Dims));
+      ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,El));
+      Prop.Expr:=ArrLit;
+      Arr:=El;
+      Index:=0;
+      repeat
+        RangeEl:=Arr.Ranges[Index];
+        RgLen:=aResolver.GetRangeLength(RangeEl);
+        ArrLit.AddElement(CreateLiteralNumber(RangeEl,RgLen));
+        inc(Index);
+        if Index=length(Arr.Ranges) then
+          begin
+          if ElTypeLo.ClassType<>TPasArrayType then
+            break;
+          Arr:=TPasArrayType(ElTypeLo);
+          if length(Arr.Ranges)=0 then
+            RaiseNotSupported(Arr,AContext,20170411222315,'static array of anonymous array');
+          ElTypeHi:=aResolver.ResolveAliasType(Arr.ElType,false);
+          ElTypeLo:=aResolver.ResolveAliasType(ElTypeHi);
+          Index:=0;
+          end;
+      until false;
+      end;
+    // eltype: ref
+    if not SpecializeDelay then
+      begin
+      Prop:=Obj.Elements.AddElement;
+      Prop.Name:=TJSString(GetBIName(pbivnRTTIArray_ElType));
+      Prop.Expr:=CreateTypeInfoRef(ElTypeHi,AContext,El);
+      end;
+    Result:=Call;
+  finally
+    if Result=nil then
+      Call.Free;
+  end;
+end;
+
 function TPasToJSConverter.CreateRTTIMembers(El: TPasMembersType;
   Src: TJSSourceElements; FuncContext: TFunctionContext;
   MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext;
@@ -20401,35 +20559,51 @@ begin
   Members:=El.Members;
   For i:=0 to Members.Count-1 do
     begin
+    NewEl:=nil;
     P:=TPasElement(Members[i]);
     C:=P.ClassType;
-    // check visibility
-    case mt of
-    mtClass:
-      if P.Visibility<>visPublished then continue;
-    mtInterface: ; // all members of an interface are published
-    mtRecord:
-      // a published record publishes all non private members
-      if P.Visibility in [visPrivate,visStrictPrivate] then
-        continue;
-    end;
-    if not IsElementUsed(P) then continue;
-
-    NewEl:=nil;
-    if C=TPasVariable then
-      NewEl:=CreateRTTIMemberField(Members,i,MembersFuncContext)
-    else if C.InheritsFrom(TPasProcedure) then
+    writeln('AAA1 TPasToJSConverter.CreateRTTIMembers ',GetObjPath(P));
+    if C.InheritsFrom(TPasType) and HasTypeInfo(TPasType(P),MembersFuncContext) then
       begin
-      if aResolver.GetProcTemplateTypes(TPasProcedure(P))<>nil then
-        continue; // parametrized functions cannot be published
-      NewEl:=CreateRTTIMemberMethod(Members,i,MembersFuncContext);
+        writeln('AAA2 TPasToJSConverter.CreateRTTIMembers ',GetObjPath(P));
+      // published subtype
+      if aResolver.IsAnonymousElType(TPasType(P)) then
+        begin
+        // published anonymous eltype
+          writeln('AAA3 TPasToJSConverter.CreateRTTIMembers ',GetObjPath(P));
+        if C.InheritsFrom(TPasArrayType) then
+          NewEl:=CreateRTTIAnonymousArray(TPasArrayType(P),MembersFuncContext);
+        end;
       end
-    else if C=TPasProperty then
-      NewEl:=CreateRTTIMemberProperty(Members,i,MembersFuncContext)
-    else if C.InheritsFrom(TPasType)
-        or (C=TPasAttributes) then
     else
-      DoError(20190105142236,nSymbolCannotBePublished,sSymbolCannotBePublished,[],P);
+      begin
+      // check visibility
+      case mt of
+      mtClass:
+        if P.Visibility<>visPublished then continue;
+      mtInterface: ; // all members of an interface are published
+      mtRecord:
+        // a published record publishes all non private members
+        if P.Visibility in [visPrivate,visStrictPrivate] then
+          continue;
+      end;
+      if not IsElementUsed(P) then continue;
+
+      if C=TPasVariable then
+        NewEl:=CreateRTTIMemberField(Members,i,MembersFuncContext)
+      else if C.InheritsFrom(TPasProcedure) then
+        begin
+        if aResolver.GetProcTemplateTypes(TPasProcedure(P))<>nil then
+          continue; // parametrized functions cannot be published
+        NewEl:=CreateRTTIMemberMethod(Members,i,MembersFuncContext);
+        end
+      else if C=TPasProperty then
+        NewEl:=CreateRTTIMemberProperty(Members,i,MembersFuncContext)
+      else if C.InheritsFrom(TPasType)
+          or (C=TPasAttributes) then
+      else
+        DoError(20190105142236,nSymbolCannotBePublished,sSymbolCannotBePublished,[],P);
+      end;
     if NewEl=nil then
       continue; // e.g. abstract or external proc
     // add RTTI element
@@ -25054,7 +25228,9 @@ var
   Parent: TPasElement;
   CurModule: TPasModule;
   ElClass: TClass;
+  aResolver: TPas2JSResolver;
 begin
+  aResolver:=AContext.Resolver;
   Result:=AContext.GetLocalName(El,[cvkGlobal]);
   if Result<>'' then
     begin
@@ -25091,6 +25267,12 @@ begin
         Result:=TransformModuleName(TPasModule(Parent),true,AContext)
       else
         RaiseNotSupported(El,AContext,20200609230526,GetObjPath(El));
+      end
+    else
+      begin
+      // parent has local var
+      if (coStoreImplJS in Options) and (aResolver.GetParentProcBody(Parent)=nil) then
+        StoreImplJSLocal(Parent,AContext);
       end;
     Result:=Result+'.'+TransformElToJSName(El,AContext);
     end

+ 1 - 1
packages/pastojs/src/pas2jsfiler.pp

@@ -3806,7 +3806,7 @@ begin
     else if C=TPasDestructor then
       Obj.Add('Type','Destructor')
     else if C=TPasClassDestructor then
-      Obj.Add('Type','Class Destructor')
+      Obj.Add('Type','ClassDestructor')
     else if C=TPasAnonymousProcedure then
       Obj.Add('Type','AnonymousProcedure')
     else if C=TPasAnonymousFunction then

+ 1 - 1
packages/pastojs/tests/tcgenerics.pas

@@ -486,7 +486,7 @@ begin
     '  };',
     '  this.Alter = function (w) {',
     '    this.FItems = rtl.arraySetLength(this.FItems, 0, rtl.length(this.FItems) + 1);',
-    '    this.FItems.splice(2, 0, w);',
+    '    this.FItems = rtl.arrayInsert(w, this.FItems, 2);',
     '    this.FItems.splice(2, 3);',
     '  };',
     '}, "TList<System.Word>");',

+ 84 - 13
packages/pastojs/tests/tcmodules.pas

@@ -406,6 +406,7 @@ type
     Procedure TestLoHiDelphiMode;
     Procedure TestAssignments;
     Procedure TestArithmeticOperators1;
+    Procedure TestMultiAdd;
     Procedure TestLogicalOperators;
     Procedure TestBitwiseOperators;
     Procedure TestBitwiseOperatorsLongword;
@@ -828,6 +829,7 @@ type
     Procedure TestRTTI_Class_PropertyParams;
     Procedure TestRTTI_Class_OtherUnit_TypeAlias;
     Procedure TestRTTI_Class_OmitRTTI;
+    Procedure TestRTTI_Class_Field_AnonymousArrayOfSelfClass;
     Procedure TestRTTI_IndexModifier;
     Procedure TestRTTI_StoredModifier;
     Procedure TestRTTI_DefaultValue;
@@ -3308,6 +3310,38 @@ begin
     ]));
 end;
 
+procedure TTestModule.TestMultiAdd;
+begin
+  StartProgram(false);
+  Add([
+  'function TryEncodeDate(Year, Month, Day: Word): Boolean;',
+  'var Date: double;',
+  'begin',
+  '  Result:=(Year>0) and (Year<10000) and',
+  '          (Month >= 1) and (Month<=12) and',
+  '          (Day>0) and (Day<=31);',
+  '  Date := (146097*Year) SHR 2 + (1461*Year) SHR 2 + (153*LongWord(Month)+2) DIV 5 + LongWord(Day);',
+  'end;',
+  'var s: string;',
+  'begin',
+  '  s:=''a''+''b''+''c''+''d'';']);
+  ConvertProgram;
+  CheckSource('TestMultiAdd',
+    LinesToStr([ // statements
+    'this.TryEncodeDate = function (Year, Month, Day) {',
+    '  var Result = false;',
+    '  var date = 0.0;',
+    '  Result = (Year > 0) && (Year < 10000) && (Month >= 1) && (Month <= 12) && (Day > 0) && (Day <= 31);',
+    '  date = ((146097 * Year) >>> 2) + ((1461 * Year) >>> 2) + rtl.trunc(((153 * Month) + 2) / 5) + Day;',
+    '  return Result;',
+    '};',
+    'this.s = "";',
+    '']),
+    LinesToStr([ // this.$main
+    '$mod.s = "a" + "b" + "c" + "d";',
+    '']));
+end;
+
 procedure TTestModule.TestLogicalOperators;
 begin
   StartProgram(false);
@@ -10500,13 +10534,13 @@ begin
     'this.ArrArrInt = [];',
     '']),
     LinesToStr([ // $mod.$main
-    '$mod.ArrInt.splice(2, 0, 1);',
-    '$mod.ArrInt.splice(4, 0, $mod.ArrInt[3]);',
-    '$mod.ArrRec.splice(6, 0, $mod.ArrRec[5]);',
-    '$mod.ArrSet.splice(7, 0, $mod.ArrSet[7]);',
-    '$mod.ArrJSValue.splice(9, 0, $mod.ArrJSValue[8]);',
-    '$mod.ArrJSValue.splice(11, 0, 10);',
-    '$mod.ArrArrInt.splice(22, 0, [23]);',
+    '$mod.ArrInt = rtl.arrayInsert(1, $mod.ArrInt, 2);',
+    '$mod.ArrInt = rtl.arrayInsert($mod.ArrInt[3], $mod.ArrInt, 4);',
+    '$mod.ArrRec = rtl.arrayInsert($mod.ArrRec[5], $mod.ArrRec, 6);',
+    '$mod.ArrSet = rtl.arrayInsert($mod.ArrSet[7], $mod.ArrSet, 7);',
+    '$mod.ArrJSValue = rtl.arrayInsert($mod.ArrJSValue[8], $mod.ArrJSValue, 9);',
+    '$mod.ArrJSValue = rtl.arrayInsert(10, $mod.ArrJSValue, 11);',
+    '$mod.ArrArrInt = rtl.arrayInsert([23], $mod.ArrArrInt, 22);',
     '$mod.ArrInt.splice(12, 13);',
     '$mod.ArrRec.splice(14, 15);',
     '$mod.ArrSet.splice(17, 18);',
@@ -29646,9 +29680,6 @@ begin
   CheckSource('TestRTTI_Class_Field',
     LinesToStr([ // statements
     'rtl.createClass(this, "TObject", null, function () {',
-    '  $mod.$rtti.$DynArray("TObject.ArrB$a", {',
-    '    eltype: rtl.byte',
-    '  });',
     '  this.$init = function () {',
     '    this.FPropA = "";',
     '    this.VarLI = 0;',
@@ -29680,6 +29711,9 @@ begin
     '  $r.addField("VarShI", rtl.shortint);',
     '  $r.addField("VarBy", rtl.byte);',
     '  $r.addField("VarExt", rtl.longint);',
+    '  $mod.$rtti.$DynArray("TObject.ArrB$a", {',
+    '    eltype: rtl.byte',
+    '  });',
     '  $r.addField("ArrA", $mod.$rtti["TObject.ArrB$a"]);',
     '  $r.addField("ArrB", $mod.$rtti["TObject.ArrB$a"]);',
     '});',
@@ -29949,6 +29983,43 @@ begin
     '']));
 end;
 
+procedure TTestModule.TestRTTI_Class_Field_AnonymousArrayOfSelfClass;
+begin
+  WithTypeInfo:=true;
+  StartUnit(true,[supTObject]);
+  Add([
+  'interface',
+  'type',
+  '  {$M+1}',
+  '  TBird = class',
+  '  published',
+  '    Swarm: array of TBird;',
+  '  end;',
+  'implementation',
+  '']);
+  ConvertUnit;
+  CheckSource('TestRTTI_Class_Field_AnonymousArrayOfSelfClass',
+    LinesToStr([ // statements
+    'rtl.createClass(this, "TBird", pas.system.TObject, function () {',
+    '  this.$init = function () {',
+    '    pas.system.TObject.$init.call(this);',
+    '    this.Swarm = [];',
+    '  };',
+    '  this.$final = function () {',
+    '    this.Swarm = undefined;',
+    '    pas.system.TObject.$final.call(this);',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $mod.$rtti.$DynArray("TBird.Swarm$a", {',
+    '    eltype: $r',
+    '  });',
+    '  $r.addField("Swarm", $mod.$rtti["TBird.Swarm$a"]);',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
 procedure TTestModule.TestRTTI_IndexModifier;
 begin
   WithTypeInfo:=true;
@@ -30714,9 +30785,6 @@ begin
   CheckSource('TestRTTI_Record',
     LinesToStr([ // statements
     'rtl.recNewT(this, "TFloatRec", function () {',
-    '  $mod.$rtti.$DynArray("TFloatRec.d$a", {',
-    '    eltype: rtl.char',
-    '  });',
     '  this.$new = function () {',
     '    var r = Object.create(this);',
     '    r.c = [];',
@@ -30732,6 +30800,9 @@ begin
     '    return this;',
     '  };',
     '  var $r = $mod.$rtti.$Record("TFloatRec", {});',
+    '  $mod.$rtti.$DynArray("TFloatRec.d$a", {',
+    '    eltype: rtl.char',
+    '  });',
     '  $r.addField("c", $mod.$rtti["TFloatRec.d$a"]);',
     '  $r.addField("d", $mod.$rtti["TFloatRec.d$a"]);',
     '});',

+ 42 - 0
packages/pastojs/tests/tcprecompile.pas

@@ -64,6 +64,7 @@ type
     procedure TestPCU_Class_Constructor;
     procedure TestPCU_Class_ClassConstructor;
     procedure TestPCU_ClassInterface;
+    procedure TestPCU_EnumNames;
     procedure TestPCU_Namespace;
     procedure TestPCU_CheckVersionMain;
     procedure TestPCU_CheckVersionMain2;
@@ -135,6 +136,7 @@ begin
     if ExpExitCode=0 then
       begin
       NewSrc:=JSFile.Source;
+      //writeln('TCustomTestCLI_Precompile.CheckPrecompile ',NewSrc);
       if not CheckSrcDiff(OrigSrc,NewSrc,s) then
         begin
         WriteSources;
@@ -510,6 +512,46 @@ begin
   CheckPrecompile('test1.pas','src');
 end;
 
+procedure TTestCLI_Precompile.TestPCU_EnumNames;
+var
+  SharedParams: TStringList;
+begin
+  AddUnit('src/system.pp',[
+    'type integer = longint;',
+    '  TObject = class end;',
+    'procedure Writeln; varargs;'],
+    ['procedure Writeln; begin end;']);
+  AddUnit('src/unit1.pp',
+  ['type',
+  '  TEnum = (red,green,blue);',
+   '  TBird = class ',
+   '  private',
+   '    Color: TEnum;',
+   '  public',
+   '    procedure Fly;',
+   '    procedure Run;',
+   '  end;',
+   ''],
+  ['procedure TBird.Fly;',
+   'begin',
+   '  Color:=blue;',
+   'end;',
+   'procedure TBird.Run;',
+   'begin',
+   '  Color:=green;',
+   'end;']);
+  AddFile('test1.pas',[
+    'uses unit1;',
+    'var b: TBird;',
+    'begin',
+    '  b.Fly();',
+    '  b.Run();',
+    'end.']);
+  SharedParams:=TStringList.Create;
+  SharedParams.Add('-OoEnumNumbers-');
+  CheckPrecompile('test1.pas','src',SharedParams);
+end;
+
 procedure TTestCLI_Precompile.TestPCU_Namespace;
 begin
   AddUnit('src/system.pp',[

+ 1 - 1
packages/qlunits/fpmake.pp

@@ -13,7 +13,7 @@ begin
 {$endif ALLPACKAGES}
 
     P:=AddPackage('qlunits');
-    P.ShortName := 'qlunits';
+    P.ShortName := 'qlun';
 
     P.Author := 'FPC core team';
     P.License := 'LGPL with modification';

+ 5 - 5
packages/qlunits/src/qlfloat.pas

@@ -104,16 +104,16 @@ asm
 
 @setmant:
   move.l  d1,(a0)         { copy into mantissa }
-@fin:
-  movem.l (sp)+,d2-d4/a0  { reset register variables and return value }
-  rts
+  bra     @fin
 
 { quick exit if zero }
-
 @zeroval:
   move.w  d2,(a0)+        { zero exponent }
   move.l  d2,(a0)         { zero mantissa }
-  bra     @fin
+
+@fin:
+  movem.l (sp)+,d2-d4/a0  { reset register variables and return value }
+  move.l  a0,d0           { copy return value into d0 as well }
 end;
 
 

+ 34 - 9
packages/regexpr/src/regexpr.pas

@@ -1615,40 +1615,65 @@ end; { of function TRegExpr.GetModifierStr
 
 procedure TRegExpr.SetModifierG(AValue: boolean);
 begin
-  fModifiers.G := AValue;
+  if fModifiers.G <> AValue then
+  begin
+    fModifiers.G := AValue;
+    InvalidateProgramm;
+  end;
 end;
 
 procedure TRegExpr.SetModifierI(AValue: boolean);
 begin
-  fModifiers.I := AValue;
+  if fModifiers.I <> AValue then
+  begin
+    fModifiers.I := AValue;
+    InvalidateProgramm;
+  end;
 end;
 
 procedure TRegExpr.SetModifierM(AValue: boolean);
 begin
-  fModifiers.M := AValue;
+  if fModifiers.M <> AValue then
+  begin
+    fModifiers.M := AValue;
+    InvalidateProgramm;
+  end;
 end;
 
 procedure TRegExpr.SetModifierR(AValue: boolean);
 begin
-  fModifiers.R := AValue;
+  if fModifiers.R <> AValue then
+  begin
+    fModifiers.R := AValue;
+    InvalidateProgramm;
+  end;
 end;
 
 procedure TRegExpr.SetModifierS(AValue: boolean);
 begin
-  fModifiers.S := AValue;
+  if fModifiers.S <> AValue then
+  begin
+    fModifiers.S := AValue;
+    InvalidateProgramm;
+  end;
 end;
 
 procedure TRegExpr.SetModifierX(AValue: boolean);
 begin
-  fModifiers.X := AValue;
+  if fModifiers.X <> AValue then
+  begin
+    fModifiers.X := AValue;
+    InvalidateProgramm;
+  end;
 end;
 
 procedure TRegExpr.SetModifierStr(const AStr: RegExprString);
 begin
-  if not ParseModifiers(PRegExprChar(AStr), Length(AStr), fModifiers) then
+  if ParseModifiers(PRegExprChar(AStr), Length(AStr), fModifiers) then
+    InvalidateProgramm
+  else
     Error(reeModifierUnsupported);
-end; { of procedure TRegExpr.SetModifierStr
-  -------------------------------------------------------------- }
+end;
 
 { ============================================================= }
 { ==================== Compiler section ======================= }

+ 3 - 3
packages/rtl-generics/src/generics.defaults.pas

@@ -2163,7 +2163,7 @@ var
   LInstance: PInstance;
 begin
   if ATypeInfo = nil then
-    Exit(SelectBinaryComparer(GetTypeData(ATypeInfo), ASize))
+    Exit(SelectBinaryComparer(Nil, ASize))
   else
   begin
     LInstance := @ComparerInstances[ATypeInfo.Kind];
@@ -2279,7 +2279,7 @@ var
   LSelectMethod: TSelectMethod;
 begin
   if ATypeInfo = nil then
-    Exit(SelectBinaryEqualityComparer(GetTypeData(ATypeInfo), ASize))
+    Exit(SelectBinaryEqualityComparer(Nil, ASize))
   else
   begin
     LInstance := @FEqualityComparerInstances[ATypeInfo.Kind];
@@ -2492,7 +2492,7 @@ var
   LSelectMethod: TSelectMethod;
 begin
   if ATypeInfo = nil then
-    Exit(SelectBinaryEqualityComparer(GetTypeData(ATypeInfo), ASize))
+    Exit(SelectBinaryEqualityComparer(Nil, ASize))
   else
   begin
     LInstance := @FExtendedEqualityComparerInstances[ATypeInfo.Kind];

+ 6 - 6
packages/rtl-objpas/src/inc/strutils.pp

@@ -177,14 +177,14 @@ function DelSpace1(const S: string): string;
 function Tab2Space(const S: string; Numb: Byte): string;
 function NPos(const C: string; S: string; N: Integer): SizeInt;
 
-Function RPosEX(C:char;const S : AnsiString;offs:cardinal):SizeInt; overload;
-Function RPosex (Const Substr : AnsiString; Const Source : AnsiString;offs:cardinal) : SizeInt; overload;
+Function RPosEx(C:char;const S : AnsiString;offs:cardinal):SizeInt; overload;
+Function RPosEx(C:Unicodechar;const S : UnicodeString;offs:cardinal):SizeInt; overload;
+Function RPosEx(Const Substr : AnsiString; Const Source : AnsiString;offs:cardinal) : SizeInt; overload;
+Function RPosEx(Const Substr : UnicodeString; Const Source : UnicodeString;offs:cardinal) : SizeInt; overload;
 Function RPos(c:char;const S : AnsiString):SizeInt; overload;
-Function RPos (Const Substr : AnsiString; Const Source : AnsiString) : SizeInt; overload;
-Function RPosEX(C:Unicodechar;const S : UnicodeString;offs:cardinal):SizeInt; overload;
-Function RPosex (Const Substr : UnicodeString; Const Source : UnicodeString;offs:cardinal) : SizeInt; overload;
 Function RPos(c:Unicodechar;const S : UnicodeString):SizeInt; overload;
-Function RPos (Const Substr : UnicodeString; Const Source : UnicodeString) : SizeInt; overload;
+Function RPos(Const Substr : AnsiString; Const Source : AnsiString) : SizeInt; overload;
+Function RPos(Const Substr : UnicodeString; Const Source : UnicodeString) : SizeInt; overload;
 
 function AddChar(C: Char; const S: string; N: Integer): string;
 function AddCharR(C: Char; const S: string; N: Integer): string;

+ 2 - 2
packages/rtl-objpas/src/inc/variants.pp

@@ -4129,7 +4129,7 @@ begin
         if not DoProcedure(Source,method_name,args) then
         // may be function?
         try
-          variant(dummy_data) := Unassigned;
+          dummy_data.VType := varEmpty;
           if not DoFunction(dummy_data,Source,method_name,args) then
             RaiseDispError;
         finally
@@ -4482,7 +4482,7 @@ Var
 begin
   case (PropInfo^.PropProcs shr 2) and 3 of
     ptfield:
-      PVariant(Pointer(Instance)+PtrUInt(PropInfo^.SetProc))^:=Value;	
+      PVariant(Pointer(Instance)+PtrUInt(PropInfo^.SetProc))^:=Value;
     ptVirtual,ptStatic:
       begin
         if ((PropInfo^.PropProcs shr 2) and 3)=ptStatic then

+ 1 - 1
rtl/amicommon/paramhandling.inc

@@ -116,7 +116,7 @@ begin
   Count := 0;
   { first index is one }
   LocalIndex := 1;
-  while (P[Count] <> #0) do
+  while assigned(P) and (P[Count] <> #0) do
   begin
     while (p[count]=' ') or (p[count]=#9) or (p[count]=LineEnding) do
       Inc(count);

+ 2 - 1
rtl/embedded/Makefile

@@ -378,7 +378,8 @@ CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl
 CPU_UNITS_DEFINED=1
 endif
 ifeq ($(SUBARCH),armv7em)
-CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 # thumb2_bare
+CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 \
+samd51p19a # thumb2_bare
 CPU_UNITS_DEFINED=1
 endif
 ifeq ($(SUBARCH),armv4t)

+ 2 - 1
rtl/embedded/Makefile.fpc

@@ -75,7 +75,8 @@ CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl
 CPU_UNITS_DEFINED=1
 endif
 ifeq ($(SUBARCH),armv7em)
-CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 # thumb2_bare
+CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 \
+samd51p19a # thumb2_bare
 CPU_UNITS_DEFINED=1
 endif
 ifeq ($(SUBARCH),armv4t)

+ 2093 - 0
rtl/embedded/arm/samd51p19a.pp

@@ -0,0 +1,2093 @@
+unit samd51p19a;
+(*
+  Copyright (c) 2020 Microchip Technology Inc.
+                   
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the Licence at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+*)
+
+interface
+{$PACKRECORDS C}
+{$GOTO ON}
+{$SCOPEDENUMS ON}
+{$DEFINE INTERFACE}
+{$UNDEF IMPLEMENTATION}
+{$DEFINE __CORTEXM4}
+{$DEFINE __NVIC_PRIO_BITS3 }
+
+const
+  __FPU_PRESENT=1;
+  __MPU_PRESENT=1;
+  __NVIC_PRIO_BITS=3;
+
+type
+  TIRQn_Enum = (
+    NonMaskableInt_IRQn       = -14,
+    HardFault_IRQn            = -13,
+    MemoryManagement_IRQn     = -12,
+    BusFault_IRQn             = -11,
+    UsageFault_IRQn           = -10,
+    SVCall_IRQn               = -5,
+    DebugMonitor_IRQn         = -4,
+    PendSV_IRQn               = -2,
+    SysTick_IRQn              = -1,
+    PM_IRQn                   = 0,
+    MCLK_IRQn                 = 1,
+    OSCCTRL_0_IRQn            = 2,
+    OSCCTRL_1_IRQn            = 3,
+    OSCCTRL_2_IRQn            = 4,
+    OSCCTRL_3_IRQn            = 5,
+    OSCCTRL_4_IRQn            = 6,
+    OSC32KCTRL_IRQn           = 7,
+    SUPC_0_IRQn               = 8,
+    SUPC_1_IRQn               = 9,
+    WDT_IRQn                  = 10,
+    RTC_IRQn                  = 11,
+    EIC_0_IRQn                = 12,
+    EIC_1_IRQn                = 13,
+    EIC_2_IRQn                = 14,
+    EIC_3_IRQn                = 15,
+    EIC_4_IRQn                = 16,
+    EIC_5_IRQn                = 17,
+    EIC_6_IRQn                = 18,
+    EIC_7_IRQn                = 19,
+    EIC_8_IRQn                = 20,
+    EIC_9_IRQn                = 21,
+    EIC_10_IRQn               = 22,
+    EIC_11_IRQn               = 23,
+    EIC_12_IRQn               = 24,
+    EIC_13_IRQn               = 25,
+    EIC_14_IRQn               = 26,
+    EIC_15_IRQn               = 27,
+    FREQM_IRQn                = 28,
+    NVMCTRL_0_IRQn            = 29,
+    NVMCTRL_1_IRQn            = 30,
+    DMAC_0_IRQn               = 31,
+    DMAC_1_IRQn               = 32,
+    DMAC_2_IRQn               = 33,
+    DMAC_3_IRQn               = 34,
+    DMAC_4_IRQn               = 35,
+    EVSYS_0_IRQn              = 36,
+    EVSYS_1_IRQn              = 37,
+    EVSYS_2_IRQn              = 38,
+    EVSYS_3_IRQn              = 39,
+    EVSYS_4_IRQn              = 40,
+    PAC_IRQn                  = 41,
+    RAMECC_IRQn               = 45,
+    SERCOM0_0_IRQn            = 46,
+    SERCOM0_1_IRQn            = 47,
+    SERCOM0_2_IRQn            = 48,
+    SERCOM0_3_IRQn            = 49,
+    SERCOM1_0_IRQn            = 50,
+    SERCOM1_1_IRQn            = 51,
+    SERCOM1_2_IRQn            = 52,
+    SERCOM1_3_IRQn            = 53,
+    SERCOM2_0_IRQn            = 54,
+    SERCOM2_1_IRQn            = 55,
+    SERCOM2_2_IRQn            = 56,
+    SERCOM2_3_IRQn            = 57,
+    SERCOM3_0_IRQn            = 58,
+    SERCOM3_1_IRQn            = 59,
+    SERCOM3_2_IRQn            = 60,
+    SERCOM3_3_IRQn            = 61,
+    SERCOM4_0_IRQn            = 62,
+    SERCOM4_1_IRQn            = 63,
+    SERCOM4_2_IRQn            = 64,
+    SERCOM4_3_IRQn            = 65,
+    SERCOM5_0_IRQn            = 66,
+    SERCOM5_1_IRQn            = 67,
+    SERCOM5_2_IRQn            = 68,
+    SERCOM5_3_IRQn            = 69,
+    SERCOM6_0_IRQn            = 70,
+    SERCOM6_1_IRQn            = 71,
+    SERCOM6_2_IRQn            = 72,
+    SERCOM6_3_IRQn            = 73,
+    SERCOM7_0_IRQn            = 74,
+    SERCOM7_1_IRQn            = 75,
+    SERCOM7_2_IRQn            = 76,
+    SERCOM7_3_IRQn            = 77,
+    USB_0_IRQn                = 80,
+    USB_1_IRQn                = 81,
+    USB_2_IRQn                = 82,
+    USB_3_IRQn                = 83,
+    TCC0_0_IRQn               = 85,
+    TCC0_1_IRQn               = 86,
+    TCC0_2_IRQn               = 87,
+    TCC0_3_IRQn               = 88,
+    TCC0_4_IRQn               = 89,
+    TCC0_5_IRQn               = 90,
+    TCC0_6_IRQn               = 91,
+    TCC1_0_IRQn               = 92,
+    TCC1_1_IRQn               = 93,
+    TCC1_2_IRQn               = 94,
+    TCC1_3_IRQn               = 95,
+    TCC1_4_IRQn               = 96,
+    TCC2_0_IRQn               = 97,
+    TCC2_1_IRQn               = 98,
+    TCC2_2_IRQn               = 99,
+    TCC2_3_IRQn               = 100,
+    TCC3_0_IRQn               = 101,
+    TCC3_1_IRQn               = 102,
+    TCC3_2_IRQn               = 103,
+    TCC4_0_IRQn               = 104,
+    TCC4_1_IRQn               = 105,
+    TCC4_2_IRQn               = 106,
+    TC0_IRQn                  = 107,
+    TC1_IRQn                  = 108,
+    TC2_IRQn                  = 109,
+    TC3_IRQn                  = 110,
+    TC4_IRQn                  = 111,
+    TC5_IRQn                  = 112,
+    TC6_IRQn                  = 113,
+    TC7_IRQn                  = 114,
+    PDEC_0_IRQn               = 115,
+    PDEC_1_IRQn               = 116,
+    PDEC_2_IRQn               = 117,
+    ADC0_0_IRQn               = 118,
+    ADC0_1_IRQn               = 119,
+    ADC1_0_IRQn               = 120,
+    ADC1_1_IRQn               = 121,
+    AC_IRQn                   = 122,
+    DAC_0_IRQn                = 123,
+    DAC_1_IRQn                = 124,
+    DAC_2_IRQn                = 125,
+    DAC_3_IRQn                = 126,
+    DAC_4_IRQn                = 127,
+    I2S_IRQn                  = 128,
+    PCC_IRQn                  = 129,
+    AES_IRQn                  = 130,
+    TRNG_IRQn                 = 131,
+    ICM_IRQn                  = 132,
+    PUKCC_IRQn                = 133,
+    QSPI_IRQn                 = 134,
+    SDHC0_IRQn                = 135,
+    SDHC1_IRQn                = 136
+  );
+
+  TAC_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    CTRLB        : byte;                 //0001 Control B
+    EVCTRL       : word;                 //0002 Event Control
+    INTENCLR     : byte;                 //0004 Interrupt Enable Clear
+    INTENSET     : byte;                 //0005 Interrupt Enable Set
+    INTFLAG      : byte;                 //0006 Interrupt Flag Status and Clear
+    STATUSA      : byte;                 //0007 Status A
+    STATUSB      : byte;                 //0008 Status B
+    DBGCTRL      : byte;                 //0009 Debug Control
+    WINCTRL      : byte;                 //000A Window Control
+    RESERVED0    : byte;
+    SCALER       : array[0..1] of byte;  //000C Scaler n
+    RESERVED1    : word;
+    COMPCTRL     : array[0..1] of longWord; //0010 Comparator Control n
+    RESERVED2    : array[1..8] of byte;
+    SYNCBUSY     : longWord;             //0020 Synchronization Busy
+    CALIB        : word;                 //0024 Calibration
+  end;
+
+  TADC_Registers = record
+    CTRLA        : word;                 //0000 Control A
+    EVCTRL       : byte;                 //0002 Event Control
+    DBGCTRL      : byte;                 //0003 Debug Control
+    INPUTCTRL    : word;                 //0004 Input Control
+    CTRLB        : word;                 //0006 Control B
+    REFCTRL      : byte;                 //0008 Reference Control
+    RESERVED0    : byte;
+    AVGCTRL      : byte;                 //000A Average Control
+    SAMPCTRL     : byte;                 //000B Sample Time Control
+    WINLT        : word;                 //000C Window Monitor Lower Threshold
+    WINUT        : word;                 //000E Window Monitor Upper Threshold
+    GAINCORR     : word;                 //0010 Gain Correction
+    OFFSETCORR   : word;                 //0012 Offset Correction
+    SWTRIG       : byte;                 //0014 Software Trigger
+    RESERVED1    : array[1..23] of byte;
+    INTENCLR     : byte;                 //002C Interrupt Enable Clear
+    INTENSET     : byte;                 //002D Interrupt Enable Set
+    INTFLAG      : byte;                 //002E Interrupt Flag Status and Clear
+    STATUS       : byte;                 //002F Status
+    SYNCBUSY     : longWord;             //0030 Synchronization Busy
+    DSEQDATA     : longWord;             //0034 DMA Sequencial Data
+    DSEQCTRL     : longWord;             //0038 DMA Sequential Control
+    DSEQSTAT     : longWord;             //003C DMA Sequencial Status
+    RESULT       : word;                 //0040 Result Conversion Value
+    RESERVED2    : word;
+    RESS         : word;                 //0044 Last Sample Result
+    RESERVED3    : word;
+    CALIB        : word;                 //0048 Calibration
+  end;
+
+  TAES_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLB        : byte;                 //0004 Control B
+    INTENCLR     : byte;                 //0005 Interrupt Enable Clear
+    INTENSET     : byte;                 //0006 Interrupt Enable Set
+    INTFLAG      : byte;                 //0007 Interrupt Flag Status
+    DATABUFPTR   : byte;                 //0008 Data buffer pointer
+    DBGCTRL      : byte;                 //0009 Debug control
+    RESERVED0    : word;
+    KEYWORD      : array[0..7] of longWord; //000C Keyword n
+    RESERVED1    : array[1..12] of byte;
+    INDATA       : longWord;             //0038 Indata
+    INTVECTV     : array[0..3] of longWord; //003C Initialisation Vector n
+    RESERVED2    : array[1..16] of byte;
+    HASHKEY      : array[0..3] of longWord; //005C Hash key n
+    GHASH        : array[0..3] of longWord; //006C Galois Hash n
+    RESERVED3    : longWord;
+    CIPLEN       : longWord;             //0080 Cipher Length
+    RANDSEED     : longWord;             //0084 Random Seed
+  end;
+
+  TCCL_Registers = record
+    CTRL         : byte;                 //0000 Control
+    RESERVED0    : array[1..3] of byte;
+    SEQCTRL      : array[0..1] of byte;  //0004 SEQ Control x
+    RESERVED1    : word;
+    LUTCTRL      : array[0..3] of longWord; //0008 LUT Control x
+  end;
+
+  TCMCC_Registers = record
+    &TYPE        : longWord;             //0000 Cache Type Register
+    CFG          : longWord;             //0004 Cache Configuration Register
+    CTRL         : longWord;             //0008 Cache Control Register
+    SR           : longWord;             //000C Cache Status Register
+    LCKWAY       : longWord;             //0010 Cache Lock per Way Register
+    RESERVED0    : array[1..12] of byte;
+    MAINT0       : longWord;             //0020 Cache Maintenance Register 0
+    MAINT1       : longWord;             //0024 Cache Maintenance Register 1
+    MCFG         : longWord;             //0028 Cache Monitor Configuration Register
+    MEN          : longWord;             //002C Cache Monitor Enable Register
+    MCTRL        : longWord;             //0030 Cache Monitor Control Register
+    MSR          : longWord;             //0034 Cache Monitor Status Register
+  end;
+
+  TDAC_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    CTRLB        : byte;                 //0001 Control B
+    EVCTRL       : byte;                 //0002 Event Control
+    RESERVED0    : byte;
+    INTENCLR     : byte;                 //0004 Interrupt Enable Clear
+    INTENSET     : byte;                 //0005 Interrupt Enable Set
+    INTFLAG      : byte;                 //0006 Interrupt Flag Status and Clear
+    STATUS       : byte;                 //0007 Status
+    SYNCBUSY     : longWord;             //0008 Synchronization Busy
+    DACCTRL      : array[0..1] of word;  //000C DAC n Control
+    DATA         : array[0..1] of word;  //0010 DAC n Data
+    DATABUF      : array[0..1] of word;  //0014 DAC n Data Buffer
+    DBGCTRL      : byte;                 //0018 Debug Control
+    RESERVED1    : array[1..3] of byte;
+    RESULT       : array[0..1] of word;  //001C Filter Result
+  end;
+
+  TDMAC_CHANNEL_Registers = record
+    CHCTRLA      : longWord;             //0000 Channel n Control A
+    CHCTRLB      : byte;                 //0004 Channel n Control B
+    CHPRILVL     : byte;                 //0005 Channel n Priority Level
+    CHEVCTRL     : byte;                 //0006 Channel n Event Control
+    RESERVED0    : array[1..5] of byte;
+    CHINTENCLR   : byte;                 //000C Channel n Interrupt Enable Clear
+    CHINTENSET   : byte;                 //000D Channel n Interrupt Enable Set
+    CHINTFLAG    : byte;                 //000E Channel n Interrupt Flag Status and Clear
+    CHSTATUS     : byte;                 //000F Channel n Status
+  end;
+
+  TDMAC_Registers = record
+    CTRL         : word;                 //0000 Control
+    CRCCTRL      : word;                 //0002 CRC Control
+    CRCDATAIN    : longWord;             //0004 CRC Data Input
+    CRCCHKSUM    : longWord;             //0008 CRC Checksum
+    CRCSTATUS    : byte;                 //000C CRC Status
+    DBGCTRL      : byte;                 //000D Debug Control
+    RESERVED0    : word;
+    SWTRIGCTRL   : longWord;             //0010 Software Trigger Control
+    PRICTRL0     : longWord;             //0014 Priority Control 0
+    RESERVED1    : array[1..8] of byte;
+    INTPEND      : word;                 //0020 Interrupt Pending
+    RESERVED2    : word;
+    INTSTATUS    : longWord;             //0024 Interrupt Status
+    BUSYCH       : longWord;             //0028 Busy Channels
+    PENDCH       : longWord;             //002C Pending Channels
+    ACTIVE       : longWord;             //0030 Active Channel and Levels
+    BASEADDR     : longWord;             //0034 Descriptor Memory Section Base Address
+    WRBADDR      : longWord;             //0038 Write-Back Memory Section Base Address
+    RESERVED3    : longWord;
+    CHANNEL      : array[0..31] of TDMAC_CHANNEL_Registers;  //0040 
+  end;
+
+  TDMAC_DESCRIPTOR_Registers = record
+    BTCTRL       : word;                 //0000 Block Transfer Control
+    BTCNT        : word;                 //0002 Block Transfer Count
+    SRCADDR      : longWord;             //0004 Block Transfer Source Address
+    DSTADDR      : longWord;             //0008 Block Transfer Destination Address
+    DESCADDR     : longWord;             //000C Next Descriptor Address
+  end;
+
+  TDSU_Registers = record
+    CTRL         : byte;                 //0000 Control
+    STATUSA      : byte;                 //0001 Status A
+    STATUSB      : byte;                 //0002 Status B
+    RESERVED0    : byte;
+    ADDR         : longWord;             //0004 Address
+    LENGTH       : longWord;             //0008 Length
+    DATA         : longWord;             //000C Data
+    DCC          : array[0..1] of longWord; //0010 Debug Communication Channel n
+    DID          : longWord;             //0018 Device Identification
+    CFG          : longWord;             //001C Configuration
+    RESERVED1    : array[1..208] of byte;
+    DCFG         : array[0..1] of longWord; //00F0 Device Configuration
+    RESERVED2    : array[1..3848] of byte;
+    ENTRY0       : longWord;             //1000 CoreSight ROM Table Entry 0
+    ENTRY1       : longWord;             //1004 CoreSight ROM Table Entry 1
+    &END         : longWord;             //1008 CoreSight ROM Table End
+    RESERVED3    : array[1..4032] of byte;
+    MEMTYPE      : longWord;             //1FCC CoreSight ROM Table Memory Type
+    PID4         : longWord;             //1FD0 Peripheral Identification 4
+    PID5         : longWord;             //1FD4 Peripheral Identification 5
+    PID6         : longWord;             //1FD8 Peripheral Identification 6
+    PID7         : longWord;             //1FDC Peripheral Identification 7
+    PID0         : longWord;             //1FE0 Peripheral Identification 0
+    PID1         : longWord;             //1FE4 Peripheral Identification 1
+    PID2         : longWord;             //1FE8 Peripheral Identification 2
+    PID3         : longWord;             //1FEC Peripheral Identification 3
+    CID0         : longWord;             //1FF0 Component Identification 0
+    CID1         : longWord;             //1FF4 Component Identification 1
+    CID2         : longWord;             //1FF8 Component Identification 2
+    CID3         : longWord;             //1FFC Component Identification 3
+  end;
+
+  TEIC_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    NMICTRL      : byte;                 //0001 Non-Maskable Interrupt Control
+    NMIFLAG      : word;                 //0002 Non-Maskable Interrupt Flag Status and Clear
+    SYNCBUSY     : longWord;             //0004 Synchronization Busy
+    EVCTRL       : longWord;             //0008 Event Control
+    INTENCLR     : longWord;             //000C Interrupt Enable Clear
+    INTENSET     : longWord;             //0010 Interrupt Enable Set
+    INTFLAG      : longWord;             //0014 Interrupt Flag Status and Clear
+    ASYNCH       : longWord;             //0018 External Interrupt Asynchronous Mode
+    CONFIG       : array[0..1] of longWord; //001C External Interrupt Sense Configuration
+    RESERVED0    : array[1..12] of byte;
+    DEBOUNCEN    : longWord;             //0030 Debouncer Enable
+    DPRESCALER   : longWord;             //0034 Debouncer Prescaler
+    PINSTATE     : longWord;             //0038 Pin State
+  end;
+
+  TEVSYS_CHANNEL_Registers = record
+    CHANNEL      : longWord;             //0000 Channel n Control
+    CHINTENCLR   : byte;                 //0004 Channel n Interrupt Enable Clear
+    CHINTENSET   : byte;                 //0005 Channel n Interrupt Enable Set
+    CHINTFLAG    : byte;                 //0006 Channel n Interrupt Flag Status and Clear
+    CHSTATUS     : byte;                 //0007 Channel n Status
+  end;
+
+  TEVSYS_Registers = record
+    CTRLA        : byte;                 //0000 Control
+    RESERVED0    : array[1..3] of byte;
+    SWEVT        : longWord;             //0004 Software Event
+    PRICTRL      : byte;                 //0008 Priority Control
+    RESERVED1    : array[1..7] of byte;
+    INTPEND      : word;                 //0010 Channel Pending Interrupt
+    RESERVED2    : word;
+    INTSTATUS    : longWord;             //0014 Interrupt Status
+    BUSYCH       : longWord;             //0018 Busy Channels
+    READYUSR     : longWord;             //001C Ready Users
+    CHANNEL      : array[0..31] of TEVSYS_CHANNEL_Registers;  //0020 
+    USER         : array[0..66] of longWord; //0120 User Multiplexer n
+  end;
+
+  TFREQM_Registers = record
+    CTRLA        : byte;                 //0000 Control A Register
+    CTRLB        : byte;                 //0001 Control B Register
+    CFGA         : word;                 //0002 Config A register
+    RESERVED0    : longWord;
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear Register
+    INTENSET     : byte;                 //0009 Interrupt Enable Set Register
+    INTFLAG      : byte;                 //000A Interrupt Flag Register
+    STATUS       : byte;                 //000B Status Register
+    SYNCBUSY     : longWord;             //000C Synchronization Busy Register
+    VALUE        : longWord;             //0010 Count Value Register
+  end;
+
+  TGCLK_Registers = record
+    CTRLA        : byte;                 //0000 Control
+    RESERVED0    : array[1..3] of byte;
+    SYNCBUSY     : longWord;             //0004 Synchronization Busy
+    RESERVED1    : array[1..24] of byte;
+    GENCTRL      : array[0..11] of longWord; //0020 Generic Clock Generator Control
+    RESERVED2    : array[1..48] of byte;
+    PCHCTRL      : array[0..47] of longWord; //0080 Peripheral Clock Control
+  end;
+
+  THMATRIXB_PRS_Registers = record
+    PRAS         : longWord;             //0000 Priority A for Slave
+    PRBS         : longWord;             //0004 Priority B for Slave
+  end;
+
+  THMATRIXB_Registers = record
+    PRS          : array[0..15] of THMATRIXB_PRS_Registers;  //0080 
+  end;
+
+  TICM_Registers = record
+    CFG          : longWord;             //0000 Configuration
+    CTRL         : longWord;             //0004 Control
+    SR           : longWord;             //0008 Status
+    RESERVED0    : longWord;
+    IER          : longWord;             //0010 Interrupt Enable
+    IDR          : longWord;             //0014 Interrupt Disable
+    IMR          : longWord;             //0018 Interrupt Mask
+    ISR          : longWord;             //001C Interrupt Status
+    UASR         : longWord;             //0020 Undefined Access Status
+    RESERVED1    : array[1..12] of byte;
+    DSCR         : longWord;             //0030 Region Descriptor Area Start Address
+    HASH         : longWord;             //0034 Region Hash Area Start Address
+    UIHVAL       : array[0..7] of longWord; //0038 User Initial Hash Value n
+  end;
+
+  TICM_DESCRIPTOR_Registers = record
+    RADDR        : longWord;             //0000 Region Start Address
+    RCFG         : longWord;             //0004 Region Configuration
+    RCTRL        : longWord;             //0008 Region Control
+    RNEXT        : longWord;             //000C Region Next Address
+  end;
+
+  TI2S_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    RESERVED0    : array[1..3] of byte;
+    CLKCTRL      : array[0..1] of longWord; //0004 Clock Unit n Control
+    INTENCLR     : word;                 //000C Interrupt Enable Clear
+    RESERVED1    : word;
+    INTENSET     : word;                 //0010 Interrupt Enable Set
+    RESERVED2    : word;
+    INTFLAG      : word;                 //0014 Interrupt Flag Status and Clear
+    RESERVED3    : word;
+    SYNCBUSY     : word;                 //0018 Synchronization Status
+    RESERVED4    : array[1..6] of byte;
+    TXCTRL       : longWord;             //0020 Tx Serializer Control
+    RXCTRL       : longWord;             //0024 Rx Serializer Control
+    RESERVED5    : array[1..8] of byte;
+    TXDATA       : longWord;             //0030 Tx Data
+    RXDATA       : longWord;             //0034 Rx Data
+  end;
+
+  TMCLK_Registers = record
+    INTENCLR     : byte;                 //0001 Interrupt Enable Clear
+    INTENSET     : byte;                 //0002 Interrupt Enable Set
+    INTFLAG      : byte;                 //0003 Interrupt Flag Status and Clear
+    HSDIV        : byte;                 //0004 HS Clock Division
+    CPUDIV       : byte;                 //0005 CPU Clock Division
+    RESERVED0    : array[1..10] of byte;
+    AHBMASK      : longWord;             //0010 AHB Mask
+    APBAMASK     : longWord;             //0014 APBA Mask
+    APBBMASK     : longWord;             //0018 APBB Mask
+    APBCMASK     : longWord;             //001C APBC Mask
+    APBDMASK     : longWord;             //0020 APBD Mask
+  end;
+
+  TNVMCTRL_Registers = record
+    CTRLA        : word;                 //0000 Control A
+    RESERVED0    : word;
+    CTRLB        : word;                 //0004 Control B
+    RESERVED1    : word;
+    PARAM        : longWord;             //0008 NVM Parameter
+    INTENCLR     : word;                 //000C Interrupt Enable Clear
+    INTENSET     : word;                 //000E Interrupt Enable Set
+    INTFLAG      : word;                 //0010 Interrupt Flag Status and Clear
+    STATUS       : word;                 //0012 Status
+    ADDR         : longWord;             //0014 Address
+    RUNLOCK      : longWord;             //0018 Lock Section
+    PBLDATA      : array[0..1] of longWord; //001C Page Buffer Load Data x
+    ECCERR       : longWord;             //0024 ECC Error Status Register
+    DBGCTRL      : byte;                 //0028 Debug Control
+    RESERVED2    : byte;
+    SEECFG       : byte;                 //002A SmartEEPROM Configuration Register
+    RESERVED3    : byte;
+    SEESTAT      : longWord;             //002C SmartEEPROM Status Register
+  end;
+
+  TSW0_FUSES_Registers = record
+    SW0_WORD_0   : longWord;             //0000 SW0 Page Word 0
+    SW0_WORD_1   : longWord;             //0004 SW0 Page Word 1
+  end;
+
+  TTEMP_LOG_FUSES_Registers = record
+    TEMP_LOG_WORD_0 : longWord;             //0000 TEMP_LOG Page Word 0
+    TEMP_LOG_WORD_1 : longWord;             //0004 TEMP_LOG Page Word 1
+    TEMP_LOG_WORD_2 : longWord;             //0008 TEMP_LOG Page Word 2
+  end;
+
+  TUSER_FUSES_Registers = record
+    USER_WORD_0  : longWord;             //0000 USER Page Word 0
+    USER_WORD_1  : longWord;             //0004 USER Page Word 1
+    USER_WORD_2  : longWord;             //0008 USER Page Word 2
+  end;
+
+  TOSCCTRL_DPLL_Registers = record
+    DPLLCTRLA    : byte;                 //0000 DPLL Control A
+    RESERVED0    : array[1..3] of byte;
+    DPLLRATIO    : longWord;             //0004 DPLL Ratio Control
+    DPLLCTRLB    : longWord;             //0008 DPLL Control B
+    DPLLSYNCBUSY : longWord;             //000C DPLL Synchronization Busy
+    DPLLSTATUS   : longWord;             //0010 DPLL Status
+  end;
+
+  TOSCCTRL_Registers = record
+    EVCTRL       : byte;                 //0000 Event Control
+    RESERVED0    : array[1..3] of byte;
+    INTENCLR     : longWord;             //0004 Interrupt Enable Clear
+    INTENSET     : longWord;             //0008 Interrupt Enable Set
+    INTFLAG      : longWord;             //000C Interrupt Flag Status and Clear
+    STATUS       : longWord;             //0010 Status
+    XOSCCTRL     : array[0..1] of longWord; //0014 External Multipurpose Crystal Oscillator Control
+    DFLLCTRLA    : byte;                 //001C DFLL48M Control A
+    RESERVED1    : array[1..3] of byte;
+    DFLLCTRLB    : byte;                 //0020 DFLL48M Control B
+    RESERVED2    : array[1..3] of byte;
+    DFLLVAL      : longWord;             //0024 DFLL48M Value
+    DFLLMUL      : longWord;             //0028 DFLL48M Multiplier
+    DFLLSYNC     : byte;                 //002C DFLL48M Synchronization
+    RESERVED3    : array[1..3] of byte;
+    DPLL         : array[0..1] of TOSCCTRL_DPLL_Registers;  //0030 
+  end;
+
+  TOSC32KCTRL_Registers = record
+    INTENCLR     : longWord;             //0000 Interrupt Enable Clear
+    INTENSET     : longWord;             //0004 Interrupt Enable Set
+    INTFLAG      : longWord;             //0008 Interrupt Flag Status and Clear
+    STATUS       : longWord;             //000C Power and Clocks Status
+    RTCCTRL      : byte;                 //0010 RTC Clock Selection
+    RESERVED0    : array[1..3] of byte;
+    XOSC32K      : word;                 //0014 32kHz External Crystal Oscillator (XOSC32K) Control
+    CFDCTRL      : byte;                 //0016 Clock Failure Detector Control
+    EVCTRL       : byte;                 //0017 Event Control
+    RESERVED1    : longWord;
+    OSCULP32K    : longWord;             //001C 32kHz Ultra Low Power Internal Oscillator (OSCULP32K) Control
+  end;
+
+  TPAC_Registers = record
+    WRCTRL       : longWord;             //0000 Write control
+    EVCTRL       : byte;                 //0004 Event control
+    RESERVED0    : array[1..3] of byte;
+    INTENCLR     : byte;                 //0008 Interrupt enable clear
+    INTENSET     : byte;                 //0009 Interrupt enable set
+    RESERVED1    : array[1..6] of byte;
+    INTFLAGAHB   : longWord;             //0010 Bridge interrupt flag status
+    INTFLAGA     : longWord;             //0014 Peripheral interrupt flag status - Bridge A
+    INTFLAGB     : longWord;             //0018 Peripheral interrupt flag status - Bridge B
+    INTFLAGC     : longWord;             //001C Peripheral interrupt flag status - Bridge C
+    INTFLAGD     : longWord;             //0020 Peripheral interrupt flag status - Bridge D
+    RESERVED2    : array[1..16] of byte;
+    STATUSA      : longWord;             //0034 Peripheral write protection status - Bridge A
+    STATUSB      : longWord;             //0038 Peripheral write protection status - Bridge B
+    STATUSC      : longWord;             //003C Peripheral write protection status - Bridge C
+    STATUSD      : longWord;             //0040 Peripheral write protection status - Bridge D
+  end;
+
+  TPCC_Registers = record
+    MR           : longWord;             //0000 Mode Register
+    IER          : longWord;             //0004 Interrupt Enable Register
+    IDR          : longWord;             //0008 Interrupt Disable Register
+    IMR          : longWord;             //000C Interrupt Mask Register
+    ISR          : longWord;             //0010 Interrupt Status Register
+    RHR          : longWord;             //0014 Reception Holding Register
+    RESERVED0    : array[1..200] of byte;
+    WPMR         : longWord;             //00E0 Write Protection Mode Register
+    WPSR         : longWord;             //00E4 Write Protection Status Register
+  end;
+
+  TPDEC_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    EVCTRL       : word;                 //0006 Event Control
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    RESERVED0    : byte;
+    STATUS       : word;                 //000C Status
+    RESERVED1    : byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+    SYNCBUSY     : longWord;             //0010 Synchronization Status
+    PRESC        : byte;                 //0014 Prescaler Value
+    FILTER       : byte;                 //0015 Filter Value
+    RESERVED2    : word;
+    PRESCBUF     : byte;                 //0018 Prescaler Buffer Value
+    FILTERBUF    : byte;                 //0019 Filter Buffer Value
+    RESERVED3    : word;
+    COUNT        : longWord;             //001C Counter Value
+    CC           : array[0..1] of longWord; //0020 Channel n Compare Value
+    RESERVED4    : array[1..8] of byte;
+    CCBUF        : array[0..1] of longWord; //0030 Channel Compare Buffer Value
+  end;
+
+  TPM_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    SLEEPCFG     : byte;                 //0001 Sleep Configuration
+    RESERVED0    : word;
+    INTENCLR     : byte;                 //0004 Interrupt Enable Clear
+    INTENSET     : byte;                 //0005 Interrupt Enable Set
+    INTFLAG      : byte;                 //0006 Interrupt Flag Status and Clear
+    RESERVED1    : byte;
+    STDBYCFG     : byte;                 //0008 Standby Configuration
+    HIBCFG       : byte;                 //0009 Hibernate Configuration
+    BKUPCFG      : byte;                 //000A Backup Configuration
+    RESERVED2    : array[1..7] of byte;
+    PWSAKDLY     : byte;                 //0012 Power Switch Acknowledge Delay
+  end;
+
+  TPORT_GROUP_Registers = record
+    DIR          : longWord;             //0000 Data Direction
+    DIRCLR       : longWord;             //0004 Data Direction Clear
+    DIRSET       : longWord;             //0008 Data Direction Set
+    DIRTGL       : longWord;             //000C Data Direction Toggle
+    &OUT         : longWord;             //0010 Data Output Value
+    OUTCLR       : longWord;             //0014 Data Output Value Clear
+    OUTSET       : longWord;             //0018 Data Output Value Set
+    OUTTGL       : longWord;             //001C Data Output Value Toggle
+    &IN          : longWord;             //0020 Data Input Value
+    CTRL         : longWord;             //0024 Control
+    WRCONFIG     : longWord;             //0028 Write Configuration
+    EVCTRL       : longWord;             //002C Event Input Control
+    PMUX         : array[0..15] of byte;  //0030 Peripheral Multiplexing
+    PINCFG       : array[0..31] of byte;  //0040 Pin Configuration
+    Res          : array[$60..$7F] of byte;
+  end;
+
+  TPORT_Registers = record
+    GROUP        : array[0..3] of TPORT_GROUP_Registers;  //0000 
+  end;
+
+  TPUKCC_Registers = record
+  end;
+
+  TQSPI_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLB        : longWord;             //0004 Control B
+    BAUD         : longWord;             //0008 Baud Rate
+    RXDATA       : longWord;             //000C Receive Data
+    TXDATA       : longWord;             //0010 Transmit Data
+    INTENCLR     : longWord;             //0014 Interrupt Enable Clear
+    INTENSET     : longWord;             //0018 Interrupt Enable Set
+    INTFLAG      : longWord;             //001C Interrupt Flag Status and Clear
+    STATUS       : longWord;             //0020 Status Register
+    RESERVED0    : array[1..12] of byte;
+    INSTRADDR    : longWord;             //0030 Instruction Address
+    INSTRCTRL    : longWord;             //0034 Instruction Code
+    INSTRFRAME   : longWord;             //0038 Instruction Frame
+    RESERVED1    : longWord;
+    SCRAMBCTRL   : longWord;             //0040 Scrambling Mode
+    SCRAMBKEY    : longWord;             //0044 Scrambling Key
+  end;
+
+  TRAMECC_Registers = record
+    INTENCLR     : byte;                 //0000 Interrupt Enable Clear
+    INTENSET     : byte;                 //0001 Interrupt Enable Set
+    INTFLAG      : byte;                 //0002 Interrupt Flag
+    STATUS       : byte;                 //0003 Status
+    ERRADDR      : longWord;             //0004 Error Address
+    RESERVED0    : array[1..7] of byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+  end;
+
+  TRSTC_Registers = record
+    RCAUSE       : byte;                 //0000 Reset Cause
+    RESERVED0    : byte;
+    BKUPEXIT     : byte;                 //0002 Backup Exit Source
+  end;
+
+  TRTCMODE0_Registers = record
+    CTRLA        : word;                 //0000 MODE0 Control A
+    CTRLB        : word;                 //0002 MODE0 Control B
+    EVCTRL       : longWord;             //0004 MODE0 Event Control
+    INTENCLR     : word;                 //0008 MODE0 Interrupt Enable Clear
+    INTENSET     : word;                 //000A MODE0 Interrupt Enable Set
+    INTFLAG      : word;                 //000C MODE0 Interrupt Flag Status and Clear
+    DBGCTRL      : byte;                 //000E Debug Control
+    RESERVED0    : byte;
+    SYNCBUSY     : longWord;             //0010 MODE0 Synchronization Busy Status
+    FREQCORR     : byte;                 //0014 Frequency Correction
+    RESERVED1    : array[1..3] of byte;
+    COUNT        : longWord;             //0018 MODE0 Counter Value
+    RESERVED2    : longWord;
+    COMP         : array[0..1] of longWord; //0020 MODE0 Compare n Value
+    RESERVED3    : array[1..24] of byte;
+    GP           : array[0..3] of longWord; //0040 General Purpose
+    RESERVED4    : array[1..16] of byte;
+    TAMPCTRL     : longWord;             //0060 Tamper Control
+    TIMESTAMP    : longWord;             //0064 MODE0 Timestamp
+    TAMPID       : longWord;             //0068 Tamper ID
+    RESERVED5    : array[1..20] of byte;
+    BKUP         : array[0..7] of longWord; //0080 Backup
+  end;
+
+  TRTCMODE1_Registers = record
+    CTRLA        : word;                 //0000 MODE1 Control A
+    CTRLB        : word;                 //0002 MODE1 Control B
+    EVCTRL       : longWord;             //0004 MODE1 Event Control
+    INTENCLR     : word;                 //0008 MODE1 Interrupt Enable Clear
+    INTENSET     : word;                 //000A MODE1 Interrupt Enable Set
+    INTFLAG      : word;                 //000C MODE1 Interrupt Flag Status and Clear
+    DBGCTRL      : byte;                 //000E Debug Control
+    RESERVED0    : byte;
+    SYNCBUSY     : longWord;             //0010 MODE1 Synchronization Busy Status
+    FREQCORR     : byte;                 //0014 Frequency Correction
+    RESERVED1    : array[1..3] of byte;
+    COUNT        : word;                 //0018 MODE1 Counter Value
+    RESERVED2    : word;
+    PER          : word;                 //001C MODE1 Counter Period
+    RESERVED3    : word;
+    COMP         : array[0..3] of word;  //0020 MODE1 Compare n Value
+    RESERVED4    : array[1..24] of byte;
+    GP           : array[0..3] of longWord; //0040 General Purpose
+    RESERVED5    : array[1..16] of byte;
+    TAMPCTRL     : longWord;             //0060 Tamper Control
+    TIMESTAMP    : longWord;             //0064 MODE1 Timestamp
+    TAMPID       : longWord;             //0068 Tamper ID
+    RESERVED6    : array[1..20] of byte;
+    BKUP         : array[0..7] of longWord; //0080 Backup
+  end;
+
+  TRTCMODE2_Registers = record
+    CTRLA        : word;                 //0000 MODE2 Control A
+    CTRLB        : word;                 //0002 MODE2 Control B
+    EVCTRL       : longWord;             //0004 MODE2 Event Control
+    INTENCLR     : word;                 //0008 MODE2 Interrupt Enable Clear
+    INTENSET     : word;                 //000A MODE2 Interrupt Enable Set
+    INTFLAG      : word;                 //000C MODE2 Interrupt Flag Status and Clear
+    DBGCTRL      : byte;                 //000E Debug Control
+    RESERVED0    : byte;
+    SYNCBUSY     : longWord;             //0010 MODE2 Synchronization Busy Status
+    FREQCORR     : byte;                 //0014 Frequency Correction
+    RESERVED1    : array[1..3] of byte;
+    CLOCK        : longWord;             //0018 MODE2 Clock Value
+    RESERVED2    : longWord;
+    ALARM0       : longWord;             //0020 MODE2_ALARM Alarm n Value
+    MASK0        : byte;                 //0024 MODE2_ALARM Alarm n Mask
+    RESERVED3    : array[1..3] of byte;
+    ALARM1       : longWord;             //0028 MODE2_ALARM Alarm n Value
+    MASK1        : byte;                 //002C MODE2_ALARM Alarm n Mask
+    RESERVED4    : array[1..19] of byte;
+    GP           : array[0..3] of longWord; //0040 General Purpose
+    RESERVED5    : array[1..16] of byte;
+    TAMPCTRL     : longWord;             //0060 Tamper Control
+    TIMESTAMP    : longWord;             //0064 MODE2 Timestamp
+    TAMPID       : longWord;             //0068 Tamper ID
+    RESERVED6    : array[1..20] of byte;
+    BKUP         : array[0..7] of longWord; //0080 Backup
+  end;
+
+  TSDHC_Registers = record
+    SSAR         : longWord;             //0000 SDMA System Address / Argument 2
+    BSR          : word;                 //0004 Block Size
+    BCR          : word;                 //0006 Block Count
+    ARG1R        : longWord;             //0008 Argument 1
+    TMR          : word;                 //000C Transfer Mode
+    CR           : word;                 //000E Command
+    RR           : array[0..3] of longWord; //0010 Response
+    BDPR         : longWord;             //0020 Buffer Data Port
+    PSR          : longWord;             //0024 Present State
+    HC1R         : byte;                 //0028 Host Control 1
+    PCR          : byte;                 //0029 Power Control
+    BGCR         : byte;                 //002A Block Gap Control
+    WCR          : byte;                 //002B Wakeup Control
+    CCR          : word;                 //002C Clock Control
+    TCR          : byte;                 //002E Timeout Control
+    SRR          : byte;                 //002F Software Reset
+    NISTR        : word;                 //0030 Normal Interrupt Status
+    EISTR        : word;                 //0032 Error Interrupt Status
+    NISTER       : word;                 //0034 Normal Interrupt Status Enable
+    EISTER       : word;                 //0036 Error Interrupt Status Enable
+    NISIER       : word;                 //0038 Normal Interrupt Signal Enable
+    EISIER       : word;                 //003A Error Interrupt Signal Enable
+    ACESR        : word;                 //003C Auto CMD Error Status
+    HC2R         : word;                 //003E Host Control 2
+    CA0R         : longWord;             //0040 Capabilities 0
+    CA1R         : longWord;             //0044 Capabilities 1
+    MCCAR        : longWord;             //0048 Maximum Current Capabilities
+    RESERVED0    : longWord;
+    FERACES      : word;                 //0050 Force Event for Auto CMD Error Status
+    FEREIS       : word;                 //0052 Force Event for Error Interrupt Status
+    AESR         : byte;                 //0054 ADMA Error Status
+    RESERVED1    : array[1..3] of byte;
+    ASAR         : longWord;             //0058 ADMA System Address n
+    RESERVED2    : longWord;
+    PVR          : array[0..7] of word;  //0060 Preset Value n
+    RESERVED3    : array[1..140] of byte;
+    SISR         : word;                 //00FC Slot Interrupt Status
+    HCVR         : word;                 //00FE Host Controller Version
+    RESERVED4    : array[1..260] of byte;
+    MC1R         : byte;                 //0204 MMC Control 1
+    MC2R         : byte;                 //0205 MMC Control 2
+    RESERVED5    : word;
+    ACR          : longWord;             //0208 AHB Control
+    CC2R         : longWord;             //020C Clock Control 2
+    RESERVED6    : array[1..32] of byte;
+    CACR         : longWord;             //0230 Capabilities Control
+    DBGR         : byte;                 //0234 Debug
+  end;
+
+  TSERCOMI2CM_Registers = record
+    CTRLA        : longWord;             //0000 I2CM Control A
+    CTRLB        : longWord;             //0004 I2CM Control B
+    CTRLC        : longWord;             //0008 I2CM Control C
+    BAUD         : longWord;             //000C I2CM Baud Rate
+    RESERVED0    : longWord;
+    INTENCLR     : byte;                 //0014 I2CM Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 I2CM Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 I2CM Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A I2CM Status
+    SYNCBUSY     : longWord;             //001C I2CM Synchronization Busy
+    RESERVED4    : longWord;
+    ADDR         : longWord;             //0024 I2CM Address
+    DATA         : longWord;             //0028 I2CM Data
+    RESERVED5    : longWord;
+    DBGCTRL      : byte;                 //0030 I2CM Debug Control
+  end;
+
+  TSERCOMI2CS_Registers = record
+    CTRLA        : longWord;             //0000 I2CS Control A
+    CTRLB        : longWord;             //0004 I2CS Control B
+    CTRLC        : longWord;             //0008 I2CS Control C
+    RESERVED0    : array[1..8] of byte;
+    INTENCLR     : byte;                 //0014 I2CS Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 I2CS Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 I2CS Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A I2CS Status
+    SYNCBUSY     : longWord;             //001C I2CS Synchronization Busy
+    RESERVED4    : word;
+    LENGTH       : word;                 //0022 I2CS Length
+    ADDR         : longWord;             //0024 I2CS Address
+    DATA         : longWord;             //0028 I2CS Data
+  end;
+
+  TSERCOMSPIS_Registers = record
+    CTRLA        : longWord;             //0000 SPIS Control A
+    CTRLB        : longWord;             //0004 SPIS Control B
+    CTRLC        : longWord;             //0008 SPIS Control C
+    BAUD         : byte;                 //000C SPIS Baud Rate
+    RESERVED0    : array[1..7] of byte;
+    INTENCLR     : byte;                 //0014 SPIS Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 SPIS Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 SPIS Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A SPIS Status
+    SYNCBUSY     : longWord;             //001C SPIS Synchronization Busy
+    RESERVED4    : word;
+    LENGTH       : word;                 //0022 SPIS Length
+    ADDR         : longWord;             //0024 SPIS Address
+    DATA         : longWord;             //0028 SPIS Data
+    RESERVED5    : longWord;
+    DBGCTRL      : byte;                 //0030 SPIS Debug Control
+  end;
+
+  TSERCOMSPIM_Registers = record
+    CTRLA        : longWord;             //0000 SPIM Control A
+    CTRLB        : longWord;             //0004 SPIM Control B
+    CTRLC        : longWord;             //0008 SPIM Control C
+    BAUD         : byte;                 //000C SPIM Baud Rate
+    RESERVED0    : array[1..7] of byte;
+    INTENCLR     : byte;                 //0014 SPIM Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 SPIM Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 SPIM Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A SPIM Status
+    SYNCBUSY     : longWord;             //001C SPIM Synchronization Busy
+    RESERVED4    : word;
+    LENGTH       : word;                 //0022 SPIM Length
+    ADDR         : longWord;             //0024 SPIM Address
+    DATA         : longWord;             //0028 SPIM Data
+    RESERVED5    : longWord;
+    DBGCTRL      : byte;                 //0030 SPIM Debug Control
+  end;
+
+  TSERCOMUSART_EXT_Registers = record
+    CTRLA        : longWord;             //0000 USART_EXT Control A
+    CTRLB        : longWord;             //0004 USART_EXT Control B
+    CTRLC        : longWord;             //0008 USART_EXT Control C
+    BAUD         : word;                 //000C USART_EXT Baud Rate
+    RXPL         : byte;                 //000E USART_EXT Receive Pulse Length
+    RESERVED0    : array[1..5] of byte;
+    INTENCLR     : byte;                 //0014 USART_EXT Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 USART_EXT Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 USART_EXT Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A USART_EXT Status
+    SYNCBUSY     : longWord;             //001C USART_EXT Synchronization Busy
+    RXERRCNT     : byte;                 //0020 USART_EXT Receive Error Count
+    RESERVED4    : byte;
+    LENGTH       : word;                 //0022 USART_EXT Length
+    RESERVED5    : longWord;
+    DATA         : longWord;             //0028 USART_EXT Data
+    RESERVED6    : longWord;
+    DBGCTRL      : byte;                 //0030 USART_EXT Debug Control
+  end;
+
+  TSERCOMUSART_INT_Registers = record
+    CTRLA        : longWord;             //0000 USART_INT Control A
+    CTRLB        : longWord;             //0004 USART_INT Control B
+    CTRLC        : longWord;             //0008 USART_INT Control C
+    BAUD         : word;                 //000C USART_INT Baud Rate
+    RXPL         : byte;                 //000E USART_INT Receive Pulse Length
+    RESERVED0    : array[1..5] of byte;
+    INTENCLR     : byte;                 //0014 USART_INT Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 USART_INT Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 USART_INT Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A USART_INT Status
+    SYNCBUSY     : longWord;             //001C USART_INT Synchronization Busy
+    RXERRCNT     : byte;                 //0020 USART_INT Receive Error Count
+    RESERVED4    : byte;
+    LENGTH       : word;                 //0022 USART_INT Length
+    RESERVED5    : longWord;
+    DATA         : longWord;             //0028 USART_INT Data
+    RESERVED6    : longWord;
+    DBGCTRL      : byte;                 //0030 USART_INT Debug Control
+  end;
+
+  TSUPC_Registers = record
+    INTENCLR     : longWord;             //0000 Interrupt Enable Clear
+    INTENSET     : longWord;             //0004 Interrupt Enable Set
+    INTFLAG      : longWord;             //0008 Interrupt Flag Status and Clear
+    STATUS       : longWord;             //000C Power and Clocks Status
+    BOD33        : longWord;             //0010 BOD33 Control
+    RESERVED0    : longWord;
+    VREG         : longWord;             //0018 VREG Control
+    VREF         : longWord;             //001C VREF Control
+    BBPS         : longWord;             //0020 Battery Backup Power Switch
+    BKOUT        : longWord;             //0024 Backup Output Control
+    BKIN         : longWord;             //0028 Backup Input Control
+  end;
+
+  TTCCOUNT8_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    EVCTRL       : word;                 //0006 Event Control
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    STATUS       : byte;                 //000B Status
+    WAVE         : byte;                 //000C Waveform Generation Control
+    DRVCTRL      : byte;                 //000D Control C
+    RESERVED0    : byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+    SYNCBUSY     : longWord;             //0010 Synchronization Status
+    COUNT        : byte;                 //0014 COUNT8 Count
+    RESERVED1    : array[1..6] of byte;
+    PER          : byte;                 //001B COUNT8 Period
+    CC           : array[0..1] of byte;  //001C COUNT8 Compare and Capture
+    RESERVED2    : array[1..17] of byte;
+    PERBUF       : byte;                 //002F COUNT8 Period Buffer
+    CCBUF        : array[0..1] of byte;  //0030 COUNT8 Compare and Capture Buffer
+  end;
+
+  TTCCOUNT16_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    EVCTRL       : word;                 //0006 Event Control
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    STATUS       : byte;                 //000B Status
+    WAVE         : byte;                 //000C Waveform Generation Control
+    DRVCTRL      : byte;                 //000D Control C
+    RESERVED0    : byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+    SYNCBUSY     : longWord;             //0010 Synchronization Status
+    COUNT        : word;                 //0014 COUNT16 Count
+    RESERVED1    : array[1..6] of byte;
+    CC           : array[0..1] of word;  //001C COUNT16 Compare and Capture
+    RESERVED2    : array[1..16] of byte;
+    CCBUF        : array[0..1] of word;  //0030 COUNT16 Compare and Capture Buffer
+  end;
+
+  TTCCOUNT32_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    EVCTRL       : word;                 //0006 Event Control
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    STATUS       : byte;                 //000B Status
+    WAVE         : byte;                 //000C Waveform Generation Control
+    DRVCTRL      : byte;                 //000D Control C
+    RESERVED0    : byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+    SYNCBUSY     : longWord;             //0010 Synchronization Status
+    COUNT        : longWord;             //0014 COUNT32 Count
+    RESERVED1    : longWord;
+    CC           : array[0..1] of longWord; //001C COUNT32 Compare and Capture
+    RESERVED2    : array[1..12] of byte;
+    CCBUF        : array[0..1] of longWord; //0030 COUNT32 Compare and Capture Buffer
+  end;
+
+  TTCC_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    RESERVED0    : word;
+    SYNCBUSY     : longWord;             //0008 Synchronization Busy
+    FCTRLA       : longWord;             //000C Recoverable Fault A Configuration
+    FCTRLB       : longWord;             //0010 Recoverable Fault B Configuration
+    WEXCTRL      : longWord;             //0014 Waveform Extension Configuration
+    DRVCTRL      : longWord;             //0018 Driver Control
+    RESERVED1    : word;
+    DBGCTRL      : byte;                 //001E Debug Control
+    RESERVED2    : byte;
+    EVCTRL       : longWord;             //0020 Event Control
+    INTENCLR     : longWord;             //0024 Interrupt Enable Clear
+    INTENSET     : longWord;             //0028 Interrupt Enable Set
+    INTFLAG      : longWord;             //002C Interrupt Flag Status and Clear
+    STATUS       : longWord;             //0030 Status
+    COUNT        : longWord;             //0034 Count
+    PATT         : word;                 //0038 Pattern
+    RESERVED3    : word;
+    WAVE         : longWord;             //003C Waveform Control
+    PER          : longWord;             //0040 Period
+    CC           : array[0..5] of longWord; //0044 Compare and Capture
+    RESERVED4    : array[1..8] of byte;
+    PATTBUF      : word;                 //0064 Pattern Buffer
+    RESERVED5    : array[1..6] of byte;
+    PERBUF       : longWord;             //006C Period Buffer
+    CCBUF        : array[0..5] of longWord; //0070 Compare and Capture Buffer
+  end;
+
+  TTRNG_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    RESERVED0    : array[1..3] of byte;
+    EVCTRL       : byte;                 //0004 Event Control
+    RESERVED1    : array[1..3] of byte;
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    RESERVED2    : array[1..21] of byte;
+    DATA         : longWord;             //0020 Output Data
+  end;
+
+  TUSB_DEVICE_DESC_BANK_Registers = record
+    ADDR         : longWord;             //0000 DEVICE_DESC_BANK Endpoint Bank, Adress of Data Buffer
+    PCKSIZE      : longWord;             //0004 DEVICE_DESC_BANK Endpoint Bank, Packet Size
+    EXTREG       : word;                 //0008 DEVICE_DESC_BANK Endpoint Bank, Extended
+    STATUS_BK    : byte;                 //000A DEVICE_DESC_BANK Enpoint Bank, Status of Bank
+  end;
+
+  TUSB_HOST_DESC_BANK_Registers = record
+    ADDR         : longWord;             //0000 HOST_DESC_BANK Host Bank, Adress of Data Buffer
+    PCKSIZE      : longWord;             //0004 HOST_DESC_BANK Host Bank, Packet Size
+    EXTREG       : word;                 //0008 HOST_DESC_BANK Host Bank, Extended
+    STATUS_BK    : byte;                 //000A HOST_DESC_BANK Host Bank, Status of Bank
+    RESERVED0    : byte;
+    CTRL_PIPE    : word;                 //000C HOST_DESC_BANK Host Bank, Host Control Pipe
+    STATUS_PIPE  : word;                 //000E HOST_DESC_BANK Host Bank, Host Status Pipe
+  end;
+
+  TUSB_DEVICE_ENDPOINT_Registers = record
+    EPCFG        : byte;                 //0000 DEVICE_ENDPOINT End Point Configuration
+    RESERVED0    : array[1..3] of byte;
+    EPSTATUSCLR  : byte;                 //0004 DEVICE_ENDPOINT End Point Pipe Status Clear
+    EPSTATUSSET  : byte;                 //0005 DEVICE_ENDPOINT End Point Pipe Status Set
+    EPSTATUS     : byte;                 //0006 DEVICE_ENDPOINT End Point Pipe Status
+    EPINTFLAG    : byte;                 //0007 DEVICE_ENDPOINT End Point Interrupt Flag
+    EPINTENCLR   : byte;                 //0008 DEVICE_ENDPOINT End Point Interrupt Clear Flag
+    EPINTENSET   : byte;                 //0009 DEVICE_ENDPOINT End Point Interrupt Set Flag
+  end;
+
+  TUSB_HOST_PIPE_Registers = record
+    PCFG         : byte;                 //0000 HOST_PIPE End Point Configuration
+    RESERVED0    : word;
+    BINTERVAL    : byte;                 //0003 HOST_PIPE Bus Access Period of Pipe
+    PSTATUSCLR   : byte;                 //0004 HOST_PIPE End Point Pipe Status Clear
+    PSTATUSSET   : byte;                 //0005 HOST_PIPE End Point Pipe Status Set
+    PSTATUS      : byte;                 //0006 HOST_PIPE End Point Pipe Status
+    PINTFLAG     : byte;                 //0007 HOST_PIPE Pipe Interrupt Flag
+    PINTENCLR    : byte;                 //0008 HOST_PIPE Pipe Interrupt Flag Clear
+    PINTENSET    : byte;                 //0009 HOST_PIPE Pipe Interrupt Flag Set
+  end;
+
+  TUSBDEVICE_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    RESERVED0    : byte;
+    SYNCBUSY     : byte;                 //0002 Synchronization Busy
+    QOSCTRL      : byte;                 //0003 USB Quality Of Service
+    RESERVED1    : longWord;
+    CTRLB        : word;                 //0008 DEVICE Control B
+    DADD         : byte;                 //000A DEVICE Device Address
+    RESERVED2    : byte;
+    STATUS       : byte;                 //000C DEVICE Status
+    FSMSTATUS    : byte;                 //000D Finite State Machine Status
+    RESERVED3    : word;
+    FNUM         : word;                 //0010 DEVICE Device Frame Number
+    RESERVED4    : word;
+    INTENCLR     : word;                 //0014 DEVICE Device Interrupt Enable Clear
+    RESERVED5    : word;
+    INTENSET     : word;                 //0018 DEVICE Device Interrupt Enable Set
+    RESERVED6    : word;
+    INTFLAG      : word;                 //001C DEVICE Device Interrupt Flag
+    RESERVED7    : word;
+    EPINTSMRY    : word;                 //0020 DEVICE End Point Interrupt Summary
+    RESERVED8    : word;
+    DESCADD      : longWord;             //0024 Descriptor Address
+    PADCAL       : word;                 //0028 USB PAD Calibration
+    RESERVED9    : array[1..214] of byte;
+    HOST_PIPE    : array[0..7] of TUSB_HOST_PIPE_Registers;  //0100 
+  end;
+
+  TUSBHOST_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    RESERVED0    : byte;
+    SYNCBUSY     : byte;                 //0002 Synchronization Busy
+    QOSCTRL      : byte;                 //0003 USB Quality Of Service
+    RESERVED1    : longWord;
+    CTRLB        : word;                 //0008 HOST Control B
+    HSOFC        : byte;                 //000A HOST Host Start Of Frame Control
+    RESERVED2    : byte;
+    STATUS       : byte;                 //000C HOST Status
+    FSMSTATUS    : byte;                 //000D Finite State Machine Status
+    RESERVED3    : word;
+    FNUM         : word;                 //0010 HOST Host Frame Number
+    FLENHIGH     : byte;                 //0012 HOST Host Frame Length
+    RESERVED4    : byte;
+    INTENCLR     : word;                 //0014 HOST Host Interrupt Enable Clear
+    RESERVED5    : word;
+    INTENSET     : word;                 //0018 HOST Host Interrupt Enable Set
+    RESERVED6    : word;
+    INTFLAG      : word;                 //001C HOST Host Interrupt Flag
+    RESERVED7    : word;
+    PINTSMRY     : word;                 //0020 HOST Pipe Interrupt Summary
+    RESERVED8    : word;
+    DESCADD      : longWord;             //0024 Descriptor Address
+    PADCAL       : word;                 //0028 USB PAD Calibration
+    RESERVED9    : array[1..214] of byte;
+    HOST_PIPE    : array[0..7] of TUSB_HOST_PIPE_Registers;  //0100 
+  end;
+
+  TUSB_DESCRIPTORDEVICE_Registers = record
+    HOST_DESC_BANK : array[0..1] of TUSB_HOST_DESC_BANK_Registers;  //0000 
+  end;
+
+  TUSB_DESCRIPTORHOST_Registers = record
+    HOST_DESC_BANK : array[0..1] of TUSB_HOST_DESC_BANK_Registers;  //0000 
+  end;
+
+  TWDT_Registers = record
+    CTRLA        : byte;                 //0000 Control
+    CONFIG       : byte;                 //0001 Configuration
+    EWCTRL       : byte;                 //0002 Early Warning Interrupt Control
+    RESERVED0    : byte;
+    INTENCLR     : byte;                 //0004 Interrupt Enable Clear
+    INTENSET     : byte;                 //0005 Interrupt Enable Set
+    INTFLAG      : byte;                 //0006 Interrupt Flag Status and Clear
+    RESERVED1    : byte;
+    SYNCBUSY     : longWord;             //0008 Synchronization Busy
+    CLEAR        : byte;                 //000C Clear
+  end;
+
+  TETM_Registers = record
+    CR           : longWord;             //0000 ETM Main Control Register
+    CCR          : longWord;             //0004 ETM Configuration Code Register
+    TRIGGER      : longWord;             //0008 ETM Trigger Event Register
+    RESERVED0    : longWord;
+    SR           : longWord;             //0010 ETM Status Register
+    SCR          : longWord;             //0014 ETM System Configuration Register
+    RESERVED1    : array[1..8] of byte;
+    TEEVR        : longWord;             //0020 ETM TraceEnable Event Register
+    TECR1        : longWord;             //0024 ETM TraceEnable Control 1 Register
+    FFLR         : longWord;             //0028 ETM FIFO Full Level Register
+    RESERVED2    : array[1..276] of byte;
+    CNTRLDVR1    : longWord;             //0140 ETM Free-running Counter Reload Value
+    RESERVED3    : array[1..156] of byte;
+    SYNCFR       : longWord;             //01E0 ETM Synchronization Frequency Register
+    IDR          : longWord;             //01E4 ETM ID Register
+    CCER         : longWord;             //01E8 ETM Configuration Code Extension Register
+    RESERVED4    : longWord;
+    TESSEICR     : longWord;             //01F0 ETM TraceEnable Start/Stop EmbeddedICE Control Register
+    RESERVED5    : longWord;
+    TSEVT        : longWord;             //01F8 ETM TimeStamp Event Register
+    RESERVED6    : longWord;
+    TRACEIDR     : longWord;             //0200 ETM CoreSight Trace ID Register
+    RESERVED7    : longWord;
+    IDR2         : longWord;             //0208 ETM ID Register 2
+    RESERVED8    : array[1..264] of byte;
+    PDSR         : longWord;             //0314 ETM Device Power-Down Status Register
+    RESERVED9    : array[1..3016] of byte;
+    ITMISCIN     : longWord;             //0EE0 ETM Integration Test Miscellaneous Inputs
+    RESERVED10   : longWord;
+    ITTRIGOUT    : longWord;             //0EE8 ETM Integration Test Trigger Out
+    RESERVED11   : longWord;
+    ITATBCTR2    : longWord;             //0EF0 ETM Integration Test ATB Control 2
+    RESERVED12   : longWord;
+    ITATBCTR0    : longWord;             //0EF8 ETM Integration Test ATB Control 0
+    RESERVED13   : longWord;
+    ITCTRL       : longWord;             //0F00 ETM Integration Mode Control Register
+    RESERVED14   : array[1..156] of byte;
+    CLAIMSET     : longWord;             //0FA0 ETM Claim Tag Set Register
+    CLAIMCLR     : longWord;             //0FA4 ETM Claim Tag Clear Register
+    RESERVED15   : array[1..8] of byte;
+    LAR          : longWord;             //0FB0 ETM Lock Access Register
+    LSR          : longWord;             //0FB4 ETM Lock Status Register
+    AUTHSTATUS   : longWord;             //0FB8 ETM Authentication Status Register
+    RESERVED16   : array[1..16] of byte;
+    DEVTYPE      : longWord;             //0FCC ETM CoreSight Device Type Register
+    PIDR4        : longWord;             //0FD0 ETM Peripheral Identification Register #4
+    PIDR5        : longWord;             //0FD4 ETM Peripheral Identification Register #5
+    PIDR6        : longWord;             //0FD8 ETM Peripheral Identification Register #6
+    PIDR7        : longWord;             //0FDC ETM Peripheral Identification Register #7
+    PIDR0        : longWord;             //0FE0 ETM Peripheral Identification Register #0
+    PIDR1        : longWord;             //0FE4 ETM Peripheral Identification Register #1
+    PIDR2        : longWord;             //0FE8 ETM Peripheral Identification Register #2
+    PIDR3        : longWord;             //0FEC ETM Peripheral Identification Register #3
+    CIDR0        : longWord;             //0FF0 ETM Component  Identification Register #0
+    CIDR1        : longWord;             //0FF4 ETM Component  Identification Register #1
+    CIDR2        : longWord;             //0FF8 ETM Component  Identification Register #2
+    CIDR3        : longWord;             //0FFC ETM Component  Identification Register #3
+  end;
+
+  TMPU_Registers = record
+    &TYPE        : longWord;             //0000 MPU Type Register
+    CTRL         : longWord;             //0004 MPU Control Register
+    RNR          : longWord;             //0008 MPU Region Number Register
+    RBAR         : longWord;             //000C MPU Region Base Address Register
+    RASR         : longWord;             //0010 MPU Region Attribute and Size Register
+    RBAR_A1      : longWord;             //0014 MPU Alias 1 Region Base Address Register
+    RASR_A1      : longWord;             //0018 MPU Alias 1 Region Attribute and Size Register
+    RBAR_A2      : longWord;             //001C MPU Alias 2 Region Base Address Register
+    RASR_A2      : longWord;             //0020 MPU Alias 2 Region Attribute and Size Register
+    RBAR_A3      : longWord;             //0024 MPU Alias 3 Region Base Address Register
+    RASR_A3      : longWord;             //0028 MPU Alias 3 Region Attribute and Size Register
+  end;
+
+  TSystemControl_Registers = record
+    ICTR         : longWord;             //0004 Interrupt Controller Type Register
+    ACTLR        : longWord;             //0008 Auxiliary Control Register
+    RESERVED0    : array[1..3316] of byte;
+    CPUID        : longWord;             //0D00 CPUID Base Register
+    ICSR         : longWord;             //0D04 Interrupt Control and State Register
+    VTOR         : longWord;             //0D08 Vector Table Offset Register
+    AIRCR        : longWord;             //0D0C Application Interrupt and Reset Control Register
+    SCR          : longWord;             //0D10 System Control Register
+    CCR          : longWord;             //0D14 Configuration and Control Register
+    SHPR1        : longWord;             //0D18 System Handler Priority Register 1
+    SHPR2        : longWord;             //0D1C System Handler Priority Register 2
+    SHPR3        : longWord;             //0D20 System Handler Priority Register 3
+    SHCSR        : longWord;             //0D24 System Handler Control and State Register
+    CFSR         : longWord;             //0D28 Configurable Fault Status Register
+    HFSR         : longWord;             //0D2C HardFault Status Register
+    DFSR         : longWord;             //0D30 Debug Fault Status Register
+    MMFAR        : longWord;             //0D34 MemManage Fault Address Register
+    BFAR         : longWord;             //0D38 BusFault Address Register
+    AFSR         : longWord;             //0D3C Auxiliary Fault Status Register
+    PFR          : array[0..1] of longWord; //0D40 Processor Feature Register
+    DFR          : longWord;             //0D48 Debug Feature Register
+    ADR          : longWord;             //0D4C Auxiliary Feature Register
+    MMFR         : array[0..3] of longWord; //0D50 Memory Model Feature Register
+    ISAR         : array[0..4] of longWord; //0D60 Instruction Set Attributes Register
+    RESERVED1    : array[1..20] of byte;
+    CPACR        : longWord;             //0D88 Coprocessor Access Control Register
+  end;
+
+  TTPIU_Registers = record
+    SSPSR        : longWord;             //0000 Supported Parallel Port Size Register
+    CSPSR        : longWord;             //0004 Current Parallel Port Size Register
+    RESERVED0    : array[1..8] of byte;
+    ACPR         : longWord;             //0010 Asynchronous Clock Prescaler Register
+    RESERVED1    : array[1..220] of byte;
+    SPPR         : longWord;             //00F0 Selected Pin Protocol Register
+    RESERVED2    : array[1..524] of byte;
+    FFSR         : longWord;             //0300 Formatter and Flush Status Register
+    FFCR         : longWord;             //0304 Formatter and Flush Control Register
+    FSCR         : longWord;             //0308 Formatter Synchronization Counter Register
+    RESERVED3    : array[1..3036] of byte;
+    TRIGGER      : longWord;             //0EE8 TRIGGER
+    FIFO0        : longWord;             //0EEC Integration ETM Data
+    ITATBCTR2    : longWord;             //0EF0 ITATBCTR2
+    RESERVED4    : longWord;
+    ITATBCTR0    : longWord;             //0EF8 ITATBCTR0
+    FIFO1        : longWord;             //0EFC Integration ITM Data
+    ITCTRL       : longWord;             //0F00 Integration Mode Control
+    RESERVED5    : array[1..156] of byte;
+    CLAIMSET     : longWord;             //0FA0 Claim tag set
+    CLAIMCLR     : longWord;             //0FA4 Claim tag clear
+    RESERVED6    : array[1..32] of byte;
+    DEVID        : longWord;             //0FC8 TPIU_DEVID
+    DEVTYPE      : longWord;             //0FCC TPIU_DEVTYPE
+  end;
+
+  TRTC_Registers = record
+  case byte of
+    0: ( MODE0 : TRTCMODE0_Registers );
+    1: ( MODE1 : TRTCMODE1_Registers );
+    2: ( MODE2 : TRTCMODE2_Registers );
+    end;
+
+  TSERCOM_Registers = record
+  case byte of
+    0: ( I2CM : TSERCOMI2CM_Registers );
+    1: ( I2CS : TSERCOMI2CS_Registers );
+    2: ( SPIS : TSERCOMSPIS_Registers );
+    3: ( SPIM : TSERCOMSPIM_Registers );
+    4: ( USART_EXT : TSERCOMUSART_EXT_Registers );
+    5: ( USART_INT : TSERCOMUSART_INT_Registers );
+    end;
+
+  TTC_Registers = record
+  case byte of
+    0: ( COUNT8 : TTCCOUNT8_Registers );
+    1: ( COUNT16 : TTCCOUNT16_Registers );
+    2: ( COUNT32 : TTCCOUNT32_Registers );
+    end;
+
+  TUSB_Registers = record
+  case byte of
+    0: ( DEVICE : TUSBDEVICE_Registers );
+    1: ( HOST : TUSBHOST_Registers );
+    end;
+
+  TUSB_DESCRIPTOR_Registers = record
+  case byte of
+    0: ( DEVICE : TUSB_DESCRIPTORDEVICE_Registers );
+    1: ( HOST : TUSB_DESCRIPTORHOST_Registers );
+    end;
+
+const
+  AC_BASE             = $42002000;
+  ADC0_BASE           = $43001c00;
+  ADC1_BASE           = $43002000;
+  AES_BASE            = $42002400;
+  CCL_BASE            = $42003800;
+  CMCC_BASE           = $41006000;
+  DAC_BASE            = $43002400;
+  DMAC_BASE           = $4100a000;
+  DSU_BASE            = $41002000;
+  EIC_BASE            = $40002800;
+  ETM_BASE            = $e0041000;
+  EVSYS_BASE          = $4100e000;
+  FREQM_BASE          = $40002c00;
+  GCLK_BASE           = $40001c00;
+  HMATRIX_BASE        = $4100c000;
+  I2S_BASE            = $43002800;
+  ICM_BASE            = $42002c00;
+  MCLK_BASE           = $40000800;
+  MPU_BASE            = $e000ed90;
+  NVMCTRL_BASE        = $41004000;
+  OSC32KCTRL_BASE     = $40001400;
+  OSCCTRL_BASE        = $40001000;
+  PAC_BASE            = $40000000;
+  PCC_BASE            = $43002c00;
+  PDEC_BASE           = $42001c00;
+  PM_BASE             = $40000400;
+  PORT_BASE           = $41008000;
+  QSPI_BASE           = $42003400;
+  RAMECC_BASE         = $41020000;
+  RSTC_BASE           = $40000c00;
+  RTC_BASE            = $40002400;
+  SDHC0_BASE          = $45000000;
+  SDHC1_BASE          = $46000000;
+  SERCOM0_BASE        = $40003000;
+  SERCOM1_BASE        = $40003400;
+  SERCOM2_BASE        = $41012000;
+  SERCOM3_BASE        = $41014000;
+  SERCOM4_BASE        = $43000000;
+  SERCOM5_BASE        = $43000400;
+  SERCOM6_BASE        = $43000800;
+  SERCOM7_BASE        = $43000c00;
+  SUPC_BASE           = $40001800;
+  SW0_FUSES_BASE      = $00800080;
+  SystemControl_BASE  = $e000e000;
+  TC0_BASE            = $40003800;
+  TC1_BASE            = $40003c00;
+  TC2_BASE            = $4101a000;
+  TC3_BASE            = $4101c000;
+  TC4_BASE            = $42001400;
+  TC5_BASE            = $42001800;
+  TC6_BASE            = $43001400;
+  TC7_BASE            = $43001800;
+  TCC0_BASE           = $41016000;
+  TCC1_BASE           = $41018000;
+  TCC2_BASE           = $42000c00;
+  TCC3_BASE           = $42001000;
+  TCC4_BASE           = $43001000;
+  TEMP_LOG_FUSES_BASE = $00800100;
+  TPIU_BASE           = $e0040000;
+  TRNG_BASE           = $42002800;
+  USB_BASE            = $41000000;
+  USER_FUSES_BASE     = $00804000;
+  WDT_BASE            = $40002000;
+
+var
+  AC                  : TAC_Registers        absolute AC_BASE;
+  ADC0                : TADC_Registers       absolute ADC0_BASE;
+  ADC1                : TADC_Registers       absolute ADC1_BASE;
+  AES                 : TAES_Registers       absolute AES_BASE;
+  CCL                 : TCCL_Registers       absolute CCL_BASE;
+  CMCC                : TCMCC_Registers      absolute CMCC_BASE;
+  DAC                 : TDAC_Registers       absolute DAC_BASE;
+  DMAC                : TDMAC_Registers      absolute DMAC_BASE;
+  DSU                 : TDSU_Registers       absolute DSU_BASE;
+  EIC                 : TEIC_Registers       absolute EIC_BASE;
+  ETM                 : TETM_Registers       absolute ETM_BASE;
+  EVSYS               : TEVSYS_Registers     absolute EVSYS_BASE;
+  FREQM               : TFREQM_Registers     absolute FREQM_BASE;
+  GCLK                : TGCLK_Registers      absolute GCLK_BASE;
+  HMATRIX             : THMATRIXB_Registers  absolute HMATRIX_BASE;
+  I2S                 : TI2S_Registers       absolute I2S_BASE;
+  ICM                 : TICM_Registers       absolute ICM_BASE;
+  MCLK                : TMCLK_Registers      absolute MCLK_BASE;
+  MPU                 : TMPU_Registers       absolute MPU_BASE;
+  NVMCTRL             : TNVMCTRL_Registers   absolute NVMCTRL_BASE;
+  OSC32KCTRL          : TOSC32KCTRL_Registers absolute OSC32KCTRL_BASE;
+  OSCCTRL             : TOSCCTRL_Registers   absolute OSCCTRL_BASE;
+  PAC                 : TPAC_Registers       absolute PAC_BASE;
+  PCC                 : TPCC_Registers       absolute PCC_BASE;
+  PDEC                : TPDEC_Registers      absolute PDEC_BASE;
+  PM                  : TPM_Registers        absolute PM_BASE;
+  PORT                : TPORT_Registers      absolute PORT_BASE;
+  QSPI                : TQSPI_Registers      absolute QSPI_BASE;
+  RAMECC              : TRAMECC_Registers    absolute RAMECC_BASE;
+  RSTC                : TRSTC_Registers      absolute RSTC_BASE;
+  RTC                 : TRTC_Registers       absolute RTC_BASE;
+  SDHC0               : TSDHC_Registers      absolute SDHC0_BASE;
+  SDHC1               : TSDHC_Registers      absolute SDHC1_BASE;
+  SERCOM0             : TSERCOM_Registers    absolute SERCOM0_BASE;
+  SERCOM1             : TSERCOM_Registers    absolute SERCOM1_BASE;
+  SERCOM2             : TSERCOM_Registers    absolute SERCOM2_BASE;
+  SERCOM3             : TSERCOM_Registers    absolute SERCOM3_BASE;
+  SERCOM4             : TSERCOM_Registers    absolute SERCOM4_BASE;
+  SERCOM5             : TSERCOM_Registers    absolute SERCOM5_BASE;
+  SERCOM6             : TSERCOM_Registers    absolute SERCOM6_BASE;
+  SERCOM7             : TSERCOM_Registers    absolute SERCOM7_BASE;
+  SUPC                : TSUPC_Registers      absolute SUPC_BASE;
+  SW0_FUSES           : TSW0_FUSES_Registers absolute SW0_FUSES_BASE;
+  SystemControl       : TSystemControl_Registers absolute SystemControl_BASE;
+  TC0                 : TTC_Registers        absolute TC0_BASE;
+  TC1                 : TTC_Registers        absolute TC1_BASE;
+  TC2                 : TTC_Registers        absolute TC2_BASE;
+  TC3                 : TTC_Registers        absolute TC3_BASE;
+  TC4                 : TTC_Registers        absolute TC4_BASE;
+  TC5                 : TTC_Registers        absolute TC5_BASE;
+  TC6                 : TTC_Registers        absolute TC6_BASE;
+  TC7                 : TTC_Registers        absolute TC7_BASE;
+  TCC0                : TTCC_Registers       absolute TCC0_BASE;
+  TCC1                : TTCC_Registers       absolute TCC1_BASE;
+  TCC2                : TTCC_Registers       absolute TCC2_BASE;
+  TCC3                : TTCC_Registers       absolute TCC3_BASE;
+  TCC4                : TTCC_Registers       absolute TCC4_BASE;
+  TEMP_LOG_FUSES      : TTEMP_LOG_FUSES_Registers absolute TEMP_LOG_FUSES_BASE;
+  TPIU                : TTPIU_Registers      absolute TPIU_BASE;
+  TRNG                : TTRNG_Registers      absolute TRNG_BASE;
+  USB                 : TUSB_Registers       absolute USB_BASE;
+  USER_FUSES          : TUSER_FUSES_Registers absolute USER_FUSES_BASE;
+  WDT                 : TWDT_Registers       absolute WDT_BASE;
+
+implementation
+
+{$DEFINE IMPLEMENTATION}
+{$UNDEF INTERFACE}
+
+procedure NonMaskableInt_interrupt;   external name 'NonMaskableInt_interrupt';
+procedure HardFault_interrupt;        external name 'HardFault_interrupt';
+procedure MemoryManagement_interrupt; external name 'MemoryManagement_interrupt';
+procedure BusFault_interrupt;         external name 'BusFault_interrupt';
+procedure UsageFault_interrupt;       external name 'UsageFault_interrupt';
+procedure SVCall_interrupt;           external name 'SVCall_interrupt';
+procedure DebugMonitor_interrupt;     external name 'DebugMonitor_interrupt';
+procedure PendSV_interrupt;           external name 'PendSV_interrupt';
+procedure SysTick_interrupt;          external name 'SysTick_interrupt';
+procedure PM_interrupt;               external name 'PM_interrupt';
+procedure MCLK_interrupt;             external name 'MCLK_interrupt';
+procedure OSCCTRL_0_interrupt;        external name 'OSCCTRL_0_interrupt';
+procedure OSCCTRL_1_interrupt;        external name 'OSCCTRL_1_interrupt';
+procedure OSCCTRL_2_interrupt;        external name 'OSCCTRL_2_interrupt';
+procedure OSCCTRL_3_interrupt;        external name 'OSCCTRL_3_interrupt';
+procedure OSCCTRL_4_interrupt;        external name 'OSCCTRL_4_interrupt';
+procedure OSC32KCTRL_interrupt;       external name 'OSC32KCTRL_interrupt';
+procedure SUPC_0_interrupt;           external name 'SUPC_0_interrupt';
+procedure SUPC_1_interrupt;           external name 'SUPC_1_interrupt';
+procedure WDT_interrupt;              external name 'WDT_interrupt';
+procedure RTC_interrupt;              external name 'RTC_interrupt';
+procedure EIC_0_interrupt;            external name 'EIC_0_interrupt';
+procedure EIC_1_interrupt;            external name 'EIC_1_interrupt';
+procedure EIC_2_interrupt;            external name 'EIC_2_interrupt';
+procedure EIC_3_interrupt;            external name 'EIC_3_interrupt';
+procedure EIC_4_interrupt;            external name 'EIC_4_interrupt';
+procedure EIC_5_interrupt;            external name 'EIC_5_interrupt';
+procedure EIC_6_interrupt;            external name 'EIC_6_interrupt';
+procedure EIC_7_interrupt;            external name 'EIC_7_interrupt';
+procedure EIC_8_interrupt;            external name 'EIC_8_interrupt';
+procedure EIC_9_interrupt;            external name 'EIC_9_interrupt';
+procedure EIC_10_interrupt;           external name 'EIC_10_interrupt';
+procedure EIC_11_interrupt;           external name 'EIC_11_interrupt';
+procedure EIC_12_interrupt;           external name 'EIC_12_interrupt';
+procedure EIC_13_interrupt;           external name 'EIC_13_interrupt';
+procedure EIC_14_interrupt;           external name 'EIC_14_interrupt';
+procedure EIC_15_interrupt;           external name 'EIC_15_interrupt';
+procedure FREQM_interrupt;            external name 'FREQM_interrupt';
+procedure NVMCTRL_0_interrupt;        external name 'NVMCTRL_0_interrupt';
+procedure NVMCTRL_1_interrupt;        external name 'NVMCTRL_1_interrupt';
+procedure DMAC_0_interrupt;           external name 'DMAC_0_interrupt';
+procedure DMAC_1_interrupt;           external name 'DMAC_1_interrupt';
+procedure DMAC_2_interrupt;           external name 'DMAC_2_interrupt';
+procedure DMAC_3_interrupt;           external name 'DMAC_3_interrupt';
+procedure DMAC_4_interrupt;           external name 'DMAC_4_interrupt';
+procedure EVSYS_0_interrupt;          external name 'EVSYS_0_interrupt';
+procedure EVSYS_1_interrupt;          external name 'EVSYS_1_interrupt';
+procedure EVSYS_2_interrupt;          external name 'EVSYS_2_interrupt';
+procedure EVSYS_3_interrupt;          external name 'EVSYS_3_interrupt';
+procedure EVSYS_4_interrupt;          external name 'EVSYS_4_interrupt';
+procedure PAC_interrupt;              external name 'PAC_interrupt';
+procedure RAMECC_interrupt;           external name 'RAMECC_interrupt';
+procedure SERCOM0_0_interrupt;        external name 'SERCOM0_0_interrupt';
+procedure SERCOM0_1_interrupt;        external name 'SERCOM0_1_interrupt';
+procedure SERCOM0_2_interrupt;        external name 'SERCOM0_2_interrupt';
+procedure SERCOM0_3_interrupt;        external name 'SERCOM0_3_interrupt';
+procedure SERCOM1_0_interrupt;        external name 'SERCOM1_0_interrupt';
+procedure SERCOM1_1_interrupt;        external name 'SERCOM1_1_interrupt';
+procedure SERCOM1_2_interrupt;        external name 'SERCOM1_2_interrupt';
+procedure SERCOM1_3_interrupt;        external name 'SERCOM1_3_interrupt';
+procedure SERCOM2_0_interrupt;        external name 'SERCOM2_0_interrupt';
+procedure SERCOM2_1_interrupt;        external name 'SERCOM2_1_interrupt';
+procedure SERCOM2_2_interrupt;        external name 'SERCOM2_2_interrupt';
+procedure SERCOM2_3_interrupt;        external name 'SERCOM2_3_interrupt';
+procedure SERCOM3_0_interrupt;        external name 'SERCOM3_0_interrupt';
+procedure SERCOM3_1_interrupt;        external name 'SERCOM3_1_interrupt';
+procedure SERCOM3_2_interrupt;        external name 'SERCOM3_2_interrupt';
+procedure SERCOM3_3_interrupt;        external name 'SERCOM3_3_interrupt';
+procedure SERCOM4_0_interrupt;        external name 'SERCOM4_0_interrupt';
+procedure SERCOM4_1_interrupt;        external name 'SERCOM4_1_interrupt';
+procedure SERCOM4_2_interrupt;        external name 'SERCOM4_2_interrupt';
+procedure SERCOM4_3_interrupt;        external name 'SERCOM4_3_interrupt';
+procedure SERCOM5_0_interrupt;        external name 'SERCOM5_0_interrupt';
+procedure SERCOM5_1_interrupt;        external name 'SERCOM5_1_interrupt';
+procedure SERCOM5_2_interrupt;        external name 'SERCOM5_2_interrupt';
+procedure SERCOM5_3_interrupt;        external name 'SERCOM5_3_interrupt';
+procedure SERCOM6_0_interrupt;        external name 'SERCOM6_0_interrupt';
+procedure SERCOM6_1_interrupt;        external name 'SERCOM6_1_interrupt';
+procedure SERCOM6_2_interrupt;        external name 'SERCOM6_2_interrupt';
+procedure SERCOM6_3_interrupt;        external name 'SERCOM6_3_interrupt';
+procedure SERCOM7_0_interrupt;        external name 'SERCOM7_0_interrupt';
+procedure SERCOM7_1_interrupt;        external name 'SERCOM7_1_interrupt';
+procedure SERCOM7_2_interrupt;        external name 'SERCOM7_2_interrupt';
+procedure SERCOM7_3_interrupt;        external name 'SERCOM7_3_interrupt';
+procedure USB_0_interrupt;            external name 'USB_0_interrupt';
+procedure USB_1_interrupt;            external name 'USB_1_interrupt';
+procedure USB_2_interrupt;            external name 'USB_2_interrupt';
+procedure USB_3_interrupt;            external name 'USB_3_interrupt';
+procedure TCC0_0_interrupt;           external name 'TCC0_0_interrupt';
+procedure TCC0_1_interrupt;           external name 'TCC0_1_interrupt';
+procedure TCC0_2_interrupt;           external name 'TCC0_2_interrupt';
+procedure TCC0_3_interrupt;           external name 'TCC0_3_interrupt';
+procedure TCC0_4_interrupt;           external name 'TCC0_4_interrupt';
+procedure TCC0_5_interrupt;           external name 'TCC0_5_interrupt';
+procedure TCC0_6_interrupt;           external name 'TCC0_6_interrupt';
+procedure TCC1_0_interrupt;           external name 'TCC1_0_interrupt';
+procedure TCC1_1_interrupt;           external name 'TCC1_1_interrupt';
+procedure TCC1_2_interrupt;           external name 'TCC1_2_interrupt';
+procedure TCC1_3_interrupt;           external name 'TCC1_3_interrupt';
+procedure TCC1_4_interrupt;           external name 'TCC1_4_interrupt';
+procedure TCC2_0_interrupt;           external name 'TCC2_0_interrupt';
+procedure TCC2_1_interrupt;           external name 'TCC2_1_interrupt';
+procedure TCC2_2_interrupt;           external name 'TCC2_2_interrupt';
+procedure TCC2_3_interrupt;           external name 'TCC2_3_interrupt';
+procedure TCC3_0_interrupt;           external name 'TCC3_0_interrupt';
+procedure TCC3_1_interrupt;           external name 'TCC3_1_interrupt';
+procedure TCC3_2_interrupt;           external name 'TCC3_2_interrupt';
+procedure TCC4_0_interrupt;           external name 'TCC4_0_interrupt';
+procedure TCC4_1_interrupt;           external name 'TCC4_1_interrupt';
+procedure TCC4_2_interrupt;           external name 'TCC4_2_interrupt';
+procedure TC0_interrupt;              external name 'TC0_interrupt';
+procedure TC1_interrupt;              external name 'TC1_interrupt';
+procedure TC2_interrupt;              external name 'TC2_interrupt';
+procedure TC3_interrupt;              external name 'TC3_interrupt';
+procedure TC4_interrupt;              external name 'TC4_interrupt';
+procedure TC5_interrupt;              external name 'TC5_interrupt';
+procedure TC6_interrupt;              external name 'TC6_interrupt';
+procedure TC7_interrupt;              external name 'TC7_interrupt';
+procedure PDEC_0_interrupt;           external name 'PDEC_0_interrupt';
+procedure PDEC_1_interrupt;           external name 'PDEC_1_interrupt';
+procedure PDEC_2_interrupt;           external name 'PDEC_2_interrupt';
+procedure ADC0_0_interrupt;           external name 'ADC0_0_interrupt';
+procedure ADC0_1_interrupt;           external name 'ADC0_1_interrupt';
+procedure ADC1_0_interrupt;           external name 'ADC1_0_interrupt';
+procedure ADC1_1_interrupt;           external name 'ADC1_1_interrupt';
+procedure AC_interrupt;               external name 'AC_interrupt';
+procedure DAC_0_interrupt;            external name 'DAC_0_interrupt';
+procedure DAC_1_interrupt;            external name 'DAC_1_interrupt';
+procedure DAC_2_interrupt;            external name 'DAC_2_interrupt';
+procedure DAC_3_interrupt;            external name 'DAC_3_interrupt';
+procedure DAC_4_interrupt;            external name 'DAC_4_interrupt';
+procedure I2S_interrupt;              external name 'I2S_interrupt';
+procedure PCC_interrupt;              external name 'PCC_interrupt';
+procedure AES_interrupt;              external name 'AES_interrupt';
+procedure TRNG_interrupt;             external name 'TRNG_interrupt';
+procedure ICM_interrupt;              external name 'ICM_interrupt';
+procedure PUKCC_interrupt;            external name 'PUKCC_interrupt';
+procedure QSPI_interrupt;             external name 'QSPI_interrupt';
+procedure SDHC0_interrupt;            external name 'SDHC0_interrupt';
+procedure SDHC1_interrupt;            external name 'SDHC1_interrupt';
+
+{$i    cortexm4f_start.inc}
+
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+  .section ".init.interrupt_vectors"
+  interrupt_vectors:
+  .long _stack_top
+  .long Startup
+  .long NonMaskableInt_interrupt;
+  .long HardFault_interrupt;
+  .long MemoryManagement_interrupt;
+  .long BusFault_interrupt;
+  .long UsageFault_interrupt;
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long SVCall_interrupt;
+  .long DebugMonitor_interrupt;
+  .long 0
+  .long PendSV_interrupt;
+  .long SysTick_interrupt;
+  .long PM_interrupt;
+  .long MCLK_interrupt;
+  .long OSCCTRL_0_interrupt;
+  .long OSCCTRL_1_interrupt;
+  .long OSCCTRL_2_interrupt;
+  .long OSCCTRL_3_interrupt;
+  .long OSCCTRL_4_interrupt;
+  .long OSC32KCTRL_interrupt;
+  .long SUPC_0_interrupt;
+  .long SUPC_1_interrupt;
+  .long WDT_interrupt;
+  .long RTC_interrupt;
+  .long EIC_0_interrupt;
+  .long EIC_1_interrupt;
+  .long EIC_2_interrupt;
+  .long EIC_3_interrupt;
+  .long EIC_4_interrupt;
+  .long EIC_5_interrupt;
+  .long EIC_6_interrupt;
+  .long EIC_7_interrupt;
+  .long EIC_8_interrupt;
+  .long EIC_9_interrupt;
+  .long EIC_10_interrupt;
+  .long EIC_11_interrupt;
+  .long EIC_12_interrupt;
+  .long EIC_13_interrupt;
+  .long EIC_14_interrupt;
+  .long EIC_15_interrupt;
+  .long FREQM_interrupt;
+  .long NVMCTRL_0_interrupt;
+  .long NVMCTRL_1_interrupt;
+  .long DMAC_0_interrupt;
+  .long DMAC_1_interrupt;
+  .long DMAC_2_interrupt;
+  .long DMAC_3_interrupt;
+  .long DMAC_4_interrupt;
+  .long EVSYS_0_interrupt;
+  .long EVSYS_1_interrupt;
+  .long EVSYS_2_interrupt;
+  .long EVSYS_3_interrupt;
+  .long EVSYS_4_interrupt;
+  .long PAC_interrupt;
+  .long 0
+  .long 0
+  .long 0
+  .long RAMECC_interrupt;
+  .long SERCOM0_0_interrupt;
+  .long SERCOM0_1_interrupt;
+  .long SERCOM0_2_interrupt;
+  .long SERCOM0_3_interrupt;
+  .long SERCOM1_0_interrupt;
+  .long SERCOM1_1_interrupt;
+  .long SERCOM1_2_interrupt;
+  .long SERCOM1_3_interrupt;
+  .long SERCOM2_0_interrupt;
+  .long SERCOM2_1_interrupt;
+  .long SERCOM2_2_interrupt;
+  .long SERCOM2_3_interrupt;
+  .long SERCOM3_0_interrupt;
+  .long SERCOM3_1_interrupt;
+  .long SERCOM3_2_interrupt;
+  .long SERCOM3_3_interrupt;
+  .long SERCOM4_0_interrupt;
+  .long SERCOM4_1_interrupt;
+  .long SERCOM4_2_interrupt;
+  .long SERCOM4_3_interrupt;
+  .long SERCOM5_0_interrupt;
+  .long SERCOM5_1_interrupt;
+  .long SERCOM5_2_interrupt;
+  .long SERCOM5_3_interrupt;
+  .long SERCOM6_0_interrupt;
+  .long SERCOM6_1_interrupt;
+  .long SERCOM6_2_interrupt;
+  .long SERCOM6_3_interrupt;
+  .long SERCOM7_0_interrupt;
+  .long SERCOM7_1_interrupt;
+  .long SERCOM7_2_interrupt;
+  .long SERCOM7_3_interrupt;
+  .long 0
+  .long 0
+  .long USB_0_interrupt;
+  .long USB_1_interrupt;
+  .long USB_2_interrupt;
+  .long USB_3_interrupt;
+  .long 0
+  .long TCC0_0_interrupt;
+  .long TCC0_1_interrupt;
+  .long TCC0_2_interrupt;
+  .long TCC0_3_interrupt;
+  .long TCC0_4_interrupt;
+  .long TCC0_5_interrupt;
+  .long TCC0_6_interrupt;
+  .long TCC1_0_interrupt;
+  .long TCC1_1_interrupt;
+  .long TCC1_2_interrupt;
+  .long TCC1_3_interrupt;
+  .long TCC1_4_interrupt;
+  .long TCC2_0_interrupt;
+  .long TCC2_1_interrupt;
+  .long TCC2_2_interrupt;
+  .long TCC2_3_interrupt;
+  .long TCC3_0_interrupt;
+  .long TCC3_1_interrupt;
+  .long TCC3_2_interrupt;
+  .long TCC4_0_interrupt;
+  .long TCC4_1_interrupt;
+  .long TCC4_2_interrupt;
+  .long TC0_interrupt;
+  .long TC1_interrupt;
+  .long TC2_interrupt;
+  .long TC3_interrupt;
+  .long TC4_interrupt;
+  .long TC5_interrupt;
+  .long TC6_interrupt;
+  .long TC7_interrupt;
+  .long PDEC_0_interrupt;
+  .long PDEC_1_interrupt;
+  .long PDEC_2_interrupt;
+  .long ADC0_0_interrupt;
+  .long ADC0_1_interrupt;
+  .long ADC1_0_interrupt;
+  .long ADC1_1_interrupt;
+  .long AC_interrupt;
+  .long DAC_0_interrupt;
+  .long DAC_1_interrupt;
+  .long DAC_2_interrupt;
+  .long DAC_3_interrupt;
+  .long DAC_4_interrupt;
+  .long I2S_interrupt;
+  .long PCC_interrupt;
+  .long AES_interrupt;
+  .long TRNG_interrupt;
+  .long ICM_interrupt;
+  .long PUKCC_interrupt;
+  .long QSPI_interrupt;
+  .long SDHC0_interrupt;
+  .long SDHC1_interrupt;
+
+  .weak NonMaskableInt_interrupt;
+  .weak HardFault_interrupt;
+  .weak MemoryManagement_interrupt;
+  .weak BusFault_interrupt;
+  .weak UsageFault_interrupt;
+  .weak SVCall_interrupt;
+  .weak DebugMonitor_interrupt;
+  .weak PendSV_interrupt;
+  .weak SysTick_interrupt;
+  .weak PM_interrupt;
+  .weak MCLK_interrupt;
+  .weak OSCCTRL_0_interrupt;
+  .weak OSCCTRL_1_interrupt;
+  .weak OSCCTRL_2_interrupt;
+  .weak OSCCTRL_3_interrupt;
+  .weak OSCCTRL_4_interrupt;
+  .weak OSC32KCTRL_interrupt;
+  .weak SUPC_0_interrupt;
+  .weak SUPC_1_interrupt;
+  .weak WDT_interrupt;
+  .weak RTC_interrupt;
+  .weak EIC_0_interrupt;
+  .weak EIC_1_interrupt;
+  .weak EIC_2_interrupt;
+  .weak EIC_3_interrupt;
+  .weak EIC_4_interrupt;
+  .weak EIC_5_interrupt;
+  .weak EIC_6_interrupt;
+  .weak EIC_7_interrupt;
+  .weak EIC_8_interrupt;
+  .weak EIC_9_interrupt;
+  .weak EIC_10_interrupt;
+  .weak EIC_11_interrupt;
+  .weak EIC_12_interrupt;
+  .weak EIC_13_interrupt;
+  .weak EIC_14_interrupt;
+  .weak EIC_15_interrupt;
+  .weak FREQM_interrupt;
+  .weak NVMCTRL_0_interrupt;
+  .weak NVMCTRL_1_interrupt;
+  .weak DMAC_0_interrupt;
+  .weak DMAC_1_interrupt;
+  .weak DMAC_2_interrupt;
+  .weak DMAC_3_interrupt;
+  .weak DMAC_4_interrupt;
+  .weak EVSYS_0_interrupt;
+  .weak EVSYS_1_interrupt;
+  .weak EVSYS_2_interrupt;
+  .weak EVSYS_3_interrupt;
+  .weak EVSYS_4_interrupt;
+  .weak PAC_interrupt;
+  .weak RAMECC_interrupt;
+  .weak SERCOM0_0_interrupt;
+  .weak SERCOM0_1_interrupt;
+  .weak SERCOM0_2_interrupt;
+  .weak SERCOM0_3_interrupt;
+  .weak SERCOM1_0_interrupt;
+  .weak SERCOM1_1_interrupt;
+  .weak SERCOM1_2_interrupt;
+  .weak SERCOM1_3_interrupt;
+  .weak SERCOM2_0_interrupt;
+  .weak SERCOM2_1_interrupt;
+  .weak SERCOM2_2_interrupt;
+  .weak SERCOM2_3_interrupt;
+  .weak SERCOM3_0_interrupt;
+  .weak SERCOM3_1_interrupt;
+  .weak SERCOM3_2_interrupt;
+  .weak SERCOM3_3_interrupt;
+  .weak SERCOM4_0_interrupt;
+  .weak SERCOM4_1_interrupt;
+  .weak SERCOM4_2_interrupt;
+  .weak SERCOM4_3_interrupt;
+  .weak SERCOM5_0_interrupt;
+  .weak SERCOM5_1_interrupt;
+  .weak SERCOM5_2_interrupt;
+  .weak SERCOM5_3_interrupt;
+  .weak SERCOM6_0_interrupt;
+  .weak SERCOM6_1_interrupt;
+  .weak SERCOM6_2_interrupt;
+  .weak SERCOM6_3_interrupt;
+  .weak SERCOM7_0_interrupt;
+  .weak SERCOM7_1_interrupt;
+  .weak SERCOM7_2_interrupt;
+  .weak SERCOM7_3_interrupt;
+  .weak USB_0_interrupt;
+  .weak USB_1_interrupt;
+  .weak USB_2_interrupt;
+  .weak USB_3_interrupt;
+  .weak TCC0_0_interrupt;
+  .weak TCC0_1_interrupt;
+  .weak TCC0_2_interrupt;
+  .weak TCC0_3_interrupt;
+  .weak TCC0_4_interrupt;
+  .weak TCC0_5_interrupt;
+  .weak TCC0_6_interrupt;
+  .weak TCC1_0_interrupt;
+  .weak TCC1_1_interrupt;
+  .weak TCC1_2_interrupt;
+  .weak TCC1_3_interrupt;
+  .weak TCC1_4_interrupt;
+  .weak TCC2_0_interrupt;
+  .weak TCC2_1_interrupt;
+  .weak TCC2_2_interrupt;
+  .weak TCC2_3_interrupt;
+  .weak TCC3_0_interrupt;
+  .weak TCC3_1_interrupt;
+  .weak TCC3_2_interrupt;
+  .weak TCC4_0_interrupt;
+  .weak TCC4_1_interrupt;
+  .weak TCC4_2_interrupt;
+  .weak TC0_interrupt;
+  .weak TC1_interrupt;
+  .weak TC2_interrupt;
+  .weak TC3_interrupt;
+  .weak TC4_interrupt;
+  .weak TC5_interrupt;
+  .weak TC6_interrupt;
+  .weak TC7_interrupt;
+  .weak PDEC_0_interrupt;
+  .weak PDEC_1_interrupt;
+  .weak PDEC_2_interrupt;
+  .weak ADC0_0_interrupt;
+  .weak ADC0_1_interrupt;
+  .weak ADC1_0_interrupt;
+  .weak ADC1_1_interrupt;
+  .weak AC_interrupt;
+  .weak DAC_0_interrupt;
+  .weak DAC_1_interrupt;
+  .weak DAC_2_interrupt;
+  .weak DAC_3_interrupt;
+  .weak DAC_4_interrupt;
+  .weak I2S_interrupt;
+  .weak PCC_interrupt;
+  .weak AES_interrupt;
+  .weak TRNG_interrupt;
+  .weak ICM_interrupt;
+  .weak PUKCC_interrupt;
+  .weak QSPI_interrupt;
+  .weak SDHC0_interrupt;
+  .weak SDHC1_interrupt;
+
+  .set NonMaskableInt_interrupt,  Haltproc
+  .set HardFault_interrupt,       Haltproc
+  .set MemoryManagement_interrupt,Haltproc
+  .set BusFault_interrupt,        Haltproc
+  .set UsageFault_interrupt,      Haltproc
+  .set SVCall_interrupt,          Haltproc
+  .set DebugMonitor_interrupt,    Haltproc
+  .set PendSV_interrupt,          Haltproc
+  .set SysTick_interrupt,         Haltproc
+  .set PM_interrupt,              Haltproc
+  .set MCLK_interrupt,            Haltproc
+  .set OSCCTRL_0_interrupt,       Haltproc
+  .set OSCCTRL_1_interrupt,       Haltproc
+  .set OSCCTRL_2_interrupt,       Haltproc
+  .set OSCCTRL_3_interrupt,       Haltproc
+  .set OSCCTRL_4_interrupt,       Haltproc
+  .set OSC32KCTRL_interrupt,      Haltproc
+  .set SUPC_0_interrupt,          Haltproc
+  .set SUPC_1_interrupt,          Haltproc
+  .set WDT_interrupt,             Haltproc
+  .set RTC_interrupt,             Haltproc
+  .set EIC_0_interrupt,           Haltproc
+  .set EIC_1_interrupt,           Haltproc
+  .set EIC_2_interrupt,           Haltproc
+  .set EIC_3_interrupt,           Haltproc
+  .set EIC_4_interrupt,           Haltproc
+  .set EIC_5_interrupt,           Haltproc
+  .set EIC_6_interrupt,           Haltproc
+  .set EIC_7_interrupt,           Haltproc
+  .set EIC_8_interrupt,           Haltproc
+  .set EIC_9_interrupt,           Haltproc
+  .set EIC_10_interrupt,          Haltproc
+  .set EIC_11_interrupt,          Haltproc
+  .set EIC_12_interrupt,          Haltproc
+  .set EIC_13_interrupt,          Haltproc
+  .set EIC_14_interrupt,          Haltproc
+  .set EIC_15_interrupt,          Haltproc
+  .set FREQM_interrupt,           Haltproc
+  .set NVMCTRL_0_interrupt,       Haltproc
+  .set NVMCTRL_1_interrupt,       Haltproc
+  .set DMAC_0_interrupt,          Haltproc
+  .set DMAC_1_interrupt,          Haltproc
+  .set DMAC_2_interrupt,          Haltproc
+  .set DMAC_3_interrupt,          Haltproc
+  .set DMAC_4_interrupt,          Haltproc
+  .set EVSYS_0_interrupt,         Haltproc
+  .set EVSYS_1_interrupt,         Haltproc
+  .set EVSYS_2_interrupt,         Haltproc
+  .set EVSYS_3_interrupt,         Haltproc
+  .set EVSYS_4_interrupt,         Haltproc
+  .set PAC_interrupt,             Haltproc
+  .set RAMECC_interrupt,          Haltproc
+  .set SERCOM0_0_interrupt,       Haltproc
+  .set SERCOM0_1_interrupt,       Haltproc
+  .set SERCOM0_2_interrupt,       Haltproc
+  .set SERCOM0_3_interrupt,       Haltproc
+  .set SERCOM1_0_interrupt,       Haltproc
+  .set SERCOM1_1_interrupt,       Haltproc
+  .set SERCOM1_2_interrupt,       Haltproc
+  .set SERCOM1_3_interrupt,       Haltproc
+  .set SERCOM2_0_interrupt,       Haltproc
+  .set SERCOM2_1_interrupt,       Haltproc
+  .set SERCOM2_2_interrupt,       Haltproc
+  .set SERCOM2_3_interrupt,       Haltproc
+  .set SERCOM3_0_interrupt,       Haltproc
+  .set SERCOM3_1_interrupt,       Haltproc
+  .set SERCOM3_2_interrupt,       Haltproc
+  .set SERCOM3_3_interrupt,       Haltproc
+  .set SERCOM4_0_interrupt,       Haltproc
+  .set SERCOM4_1_interrupt,       Haltproc
+  .set SERCOM4_2_interrupt,       Haltproc
+  .set SERCOM4_3_interrupt,       Haltproc
+  .set SERCOM5_0_interrupt,       Haltproc
+  .set SERCOM5_1_interrupt,       Haltproc
+  .set SERCOM5_2_interrupt,       Haltproc
+  .set SERCOM5_3_interrupt,       Haltproc
+  .set SERCOM6_0_interrupt,       Haltproc
+  .set SERCOM6_1_interrupt,       Haltproc
+  .set SERCOM6_2_interrupt,       Haltproc
+  .set SERCOM6_3_interrupt,       Haltproc
+  .set SERCOM7_0_interrupt,       Haltproc
+  .set SERCOM7_1_interrupt,       Haltproc
+  .set SERCOM7_2_interrupt,       Haltproc
+  .set SERCOM7_3_interrupt,       Haltproc
+  .set USB_0_interrupt,           Haltproc
+  .set USB_1_interrupt,           Haltproc
+  .set USB_2_interrupt,           Haltproc
+  .set USB_3_interrupt,           Haltproc
+  .set TCC0_0_interrupt,          Haltproc
+  .set TCC0_1_interrupt,          Haltproc
+  .set TCC0_2_interrupt,          Haltproc
+  .set TCC0_3_interrupt,          Haltproc
+  .set TCC0_4_interrupt,          Haltproc
+  .set TCC0_5_interrupt,          Haltproc
+  .set TCC0_6_interrupt,          Haltproc
+  .set TCC1_0_interrupt,          Haltproc
+  .set TCC1_1_interrupt,          Haltproc
+  .set TCC1_2_interrupt,          Haltproc
+  .set TCC1_3_interrupt,          Haltproc
+  .set TCC1_4_interrupt,          Haltproc
+  .set TCC2_0_interrupt,          Haltproc
+  .set TCC2_1_interrupt,          Haltproc
+  .set TCC2_2_interrupt,          Haltproc
+  .set TCC2_3_interrupt,          Haltproc
+  .set TCC3_0_interrupt,          Haltproc
+  .set TCC3_1_interrupt,          Haltproc
+  .set TCC3_2_interrupt,          Haltproc
+  .set TCC4_0_interrupt,          Haltproc
+  .set TCC4_1_interrupt,          Haltproc
+  .set TCC4_2_interrupt,          Haltproc
+  .set TC0_interrupt,             Haltproc
+  .set TC1_interrupt,             Haltproc
+  .set TC2_interrupt,             Haltproc
+  .set TC3_interrupt,             Haltproc
+  .set TC4_interrupt,             Haltproc
+  .set TC5_interrupt,             Haltproc
+  .set TC6_interrupt,             Haltproc
+  .set TC7_interrupt,             Haltproc
+  .set PDEC_0_interrupt,          Haltproc
+  .set PDEC_1_interrupt,          Haltproc
+  .set PDEC_2_interrupt,          Haltproc
+  .set ADC0_0_interrupt,          Haltproc
+  .set ADC0_1_interrupt,          Haltproc
+  .set ADC1_0_interrupt,          Haltproc
+  .set ADC1_1_interrupt,          Haltproc
+  .set AC_interrupt,              Haltproc
+  .set DAC_0_interrupt,           Haltproc
+  .set DAC_1_interrupt,           Haltproc
+  .set DAC_2_interrupt,           Haltproc
+  .set DAC_3_interrupt,           Haltproc
+  .set DAC_4_interrupt,           Haltproc
+  .set I2S_interrupt,             Haltproc
+  .set PCC_interrupt,             Haltproc
+  .set AES_interrupt,             Haltproc
+  .set TRNG_interrupt,            Haltproc
+  .set ICM_interrupt,             Haltproc
+  .set PUKCC_interrupt,           Haltproc
+  .set QSPI_interrupt,            Haltproc
+  .set SDHC0_interrupt,           Haltproc
+  .set SDHC1_interrupt,           Haltproc
+  .text
+  end;
+end.

+ 0 - 4
rtl/inc/compproc.inc

@@ -422,11 +422,7 @@ Function fpc_Char_To_UChar(const c : Char): UnicodeChar; compilerproc;
 Function fpc_UChar_To_Char(const c : UnicodeChar): Char; compilerproc;
 Function fpc_UChar_To_UnicodeStr(const c : UnicodeChar): UnicodeString; compilerproc;
 Function fpc_UChar_To_AnsiStr(const c : UnicodeChar{$ifdef FPC_HAS_CPSTRING};cp : TSystemCodePage{$endif FPC_HAS_CPSTRING}): AnsiString; compilerproc;
-{$ifdef VER2_6}
-procedure fpc_UChar_To_ShortStr(out result : shortstring;const c : WideChar) compilerproc;
-{$else}
 function fpc_UChar_To_ShortStr(const c : WideChar): shortstring; compilerproc;
-{$endif}
 
 Function fpc_PWideChar_To_UnicodeStr(const p : pwidechar): unicodestring; compilerproc;
 {$ifdef FPC_HAS_FEATURE_ANSISTRINGS}

+ 7 - 7
rtl/inc/dynlib.inc

@@ -156,7 +156,7 @@ const
   SNoDynLibs = 'This binary has no dynamic library support compiled in.';
   SRecompileWithDynLibs = 'Recompile the application with a dynamic-library-driver in the program uses clause before other units using dynamic libraries.';
 
-Procedure NoDynLibsError; {$ifndef ver2_6}noreturn;{$endif}
+Procedure NoDynLibsError; noreturn;
 begin
 {$ifndef EMBEDDED}
 {$ifdef FPC_HAS_FEATURE_CONSOLEIO}
@@ -170,32 +170,32 @@ begin
   RunError(235)
 end;
 
-Function NoLoadLibraryU(const Name: UnicodeString): TLibHandle; {$ifndef ver2_6}noreturn;{$endif}
+Function NoLoadLibraryU(const Name: UnicodeString): TLibHandle; noreturn;
 begin
   NoDynLibsError;
 end;
 
-Function NoLoadLibraryA(const Name: RawByteString): TLibHandle; {$ifndef ver2_6}noreturn;{$endif}
+Function NoLoadLibraryA(const Name: RawByteString): TLibHandle; noreturn;
 begin
   NoDynLibsError;
 end;
 
-function NoGetProcAddress(Lib: TLibHandle; const Proc: AnsiString): {$ifdef cpui8086}FarPointer{$else}Pointer{$endif}; {$ifndef ver2_6}noreturn;{$endif}
+function NoGetProcAddress(Lib: TLibHandle; const Proc: AnsiString): {$ifdef cpui8086}FarPointer{$else}Pointer{$endif}; noreturn;
 begin
   NoDynLibsError;
 end;
 
-function NoGetProcAddressOrdinal(Lib: TLibHandle; Ordinal: TOrdinalEntry): {$ifdef cpui8086}FarPointer{$else}Pointer{$endif}; {$ifndef ver2_6}noreturn;{$endif}
+function NoGetProcAddressOrdinal(Lib: TLibHandle; Ordinal: TOrdinalEntry): {$ifdef cpui8086}FarPointer{$else}Pointer{$endif}; noreturn;
 begin
   NoDynLibsError;
 end;
 
-function NoGetLoadErrorStr: String; {$ifndef ver2_6}noreturn;{$endif}
+function NoGetLoadErrorStr: String; noreturn;
 begin
   NoDynLibsError;
 end;
 
-function NoUnloadLibrary(Lib: TLibHandle): Boolean; {$ifndef ver2_6}noreturn;{$endif}
+function NoUnloadLibrary(Lib: TLibHandle): Boolean; noreturn;
 begin
   NoDynLibsError;
 end;

+ 1 - 1
rtl/inc/filerec.inc

@@ -29,7 +29,7 @@ const
 type
  { using packed makes the compiler to generate ugly code on some CPUs, further
     using packed causes the compiler to handle arrays of text wrongly, see  see tw0754 e.g. on arm  }
-  FileRec = {$ifdef VER2_6} packed {$endif} Record
+  FileRec = Record
     Handle    : THandle;
 {$if defined(CPU8) or defined(CPU16)}
     Mode      : Word;

+ 0 - 12
rtl/inc/generic.inc

@@ -3341,20 +3341,8 @@ function fpc_PopCnt_dword(AValue : DWord): DWord;[Public,Alias:'FPC_POPCNT_DWORD
 
 {$ifndef FPC_SYSTEM_HAS_POPCNT_QWORD}
 function fpc_PopCnt_qword(AValue : QWord): QWord;[Public,Alias:'FPC_POPCNT_QWORD'];compilerproc;
-{$ifdef VER2_6}
-  var
-    i : SizeInt;
-  begin
-    Result:=0;
-    for i:=0 to 15 do
-      begin
-        inc(Result,PopCntData[AValue and $f]);
-        AValue:=AValue shr 4;
-      end;
-{$else VER2_6}
   begin
     Result:=PopCnt(lo(AValue))+PopCnt(hi(AValue))
-{$endif VER2_6}
   end;
 {$endif}
 

+ 0 - 27
rtl/inc/rtti.inc

@@ -21,11 +21,7 @@ begin
 {$else VER3_0}
   typeInfo:=aligntoqword(typeInfo+2+PByte(typeInfo)[1]);
 {$endif VER3_0}
-  {$ifdef VER2_6}
-  result:=PArrayInfo(typeInfo)^.Size*PArrayInfo(typeInfo)^.ElCount;
-  {$else}
   result:=PArrayInfo(typeInfo)^.Size;
-  {$endif}
 end;
 
 function RTTIRecordSize(typeInfo: Pointer): SizeInt;
@@ -148,23 +144,8 @@ end;
 
 
 { if you modify this procedure, fpc_copy must be probably modified as well }
-{$ifdef VER2_6}
 procedure ArrayRTTI(Data,TypeInfo:Pointer;rttiproc:TRTTIProc);
 var
-  i: SizeInt;
-begin
-{$ifdef VER3_0}
-  typeInfo:=aligntoptr(typeInfo+2+PByte(typeInfo)[1]);
-{$else VER3_0}
-  typeInfo:=aligntoqword(typeInfo+2+PByte(typeInfo)[1]);
-{$endif VER3_0}
-  { Process elements }
-  for I:=0 to PArrayInfo(typeInfo)^.ElCount-1 do
-    rttiproc(Data+(I*PArrayInfo(typeInfo)^.Size),PArrayInfo(typeInfo)^.ElInfo);
-end;
-{$else}
-procedure ArrayRTTI(Data,TypeInfo:Pointer;rttiproc:TRTTIProc);
-var  
   i,Count,ElSize: SizeInt;
   Info: Pointer;
 begin
@@ -183,7 +164,6 @@ begin
   for I:=0 to Count-1 do
     rttiproc(Data+(I*ElSize),Info);
 end;
-{$endif}
 
 Procedure fpc_Initialize (Data,TypeInfo : pointer);[Public,Alias : 'FPC_INITIALIZE'];  compilerproc;
 begin
@@ -363,12 +343,6 @@ begin
 {$else VER3_0}
         Temp:=aligntoqword(typeInfo+2+PByte(typeInfo)[1]);
 {$endif VER3_0}
-      {$ifdef VER2_6}
-        { Process elements }
-        for I:=0 to PArrayInfo(Temp)^.ElCount-1 do
-          fpc_Copy_internal(Src+(I*PArrayInfo(Temp)^.Size),Dest+(I*PArrayInfo(Temp)^.Size),PArrayInfo(Temp)^.ElInfo);
-        Result:=PArrayInfo(Temp)^.Size*PArrayInfo(Temp)^.ElCount;
-      {$else}
         Result:=PArrayInfo(Temp)^.Size;
         EleCount:=PArrayInfo(Temp)^.ElCount;
         { no elements to process => exit }
@@ -383,7 +357,6 @@ begin
             fpc_Copy_internal(Src+Offset,Dest+Offset,Info);
             inc(Offset,copiedsize);
           end;
-      {$endif}
       end;
 {$ifdef FPC_HAS_FEATURE_OBJECTS}
     tkobject,

+ 0 - 7
rtl/inc/rttidecl.inc

@@ -19,9 +19,6 @@
 {$ifndef FPC_REQUIRES_PROPER_ALIGNMENT}
   {$define USE_PACKED}
 {$endif}
-{$ifdef VER2_6}
-  {$define USE_PACKED}
-{$endif}
 
 {$ifndef VER3_0}
 { 3.1.1 and newer also (re)stores $MinEnumSize and $PackSet upon $Push/$Pop }
@@ -54,11 +51,7 @@ type
     {$else}
     TypeInfo: PPointer;
     {$endif}
-    {$ifdef VER2_6}
-    Offset: Longint;
-    {$else}
     Offset: SizeInt;
-    {$endif}
   end;
 
   PRecordInfoFull=^TRecordInfoFull;

+ 1 - 2
rtl/inc/system.inc

@@ -1066,8 +1066,7 @@ type
   end;
   TInitFinalTable = record
     TableCount,
-    InitCount  : {$if defined(VER2)}longint
-                 {$elseif defined(VER3_0)}sizeint
+    InitCount  : {$if defined(VER3_0)}sizeint
                  {$else}ALUUInt{$endif}
                  ;
     Procs      : array[1..maxunits] of TInitFinalRec;

+ 2 - 14
rtl/inc/systemh.inc

@@ -82,11 +82,6 @@
 {$define FPC_HAS_FEATURE_UNICODESTRINGS}
 {$endif FPC_HAS_FEATURE_SUPPORT}
 
-{ bootstrapping, the starting compiler cannot be a downstripped compiler without unicodestring support }
-{$ifdef VER2_6}
-{$define FPC_HAS_FEATURE_UNICODESTRINGS}
-{$endif VER2_6}
-
 { for now, the presence of unicode strings is just an approximation,
   USE_FILEREC_FULLNAME can be also enabled for other targets if
   they need file names longer than 255 chars }
@@ -140,9 +135,7 @@ Type
     ValReal = Extended;
   {$endif}
 
-  {$ifndef VER2_6}
   FarPointer = NearFsPointer;
-  {$endif}
 {$endif CPUI386}
 
 {$ifdef CPUI8086}
@@ -472,7 +465,7 @@ Type
   TExitCode = Word;
 {$endif CPU16}
 
-{$if defined(VER2) or defined(VER3_0)}
+{$if defined(VER3_0)}
 {$if defined(CPU16)}
 {$define CPUINT16}
 {$elseif defined(CPU32)}
@@ -480,7 +473,7 @@ Type
 {$elseif defined(CPU64)}
 {$define CPUINT64}
 {$endif defined(CPU64)}
-{$endif defined(VER2) or defined(VER3_0)}
+{$endif defined(VER3_0)}
 
 {$if defined(CPUINT8)}
   ALUSInt = ShortInt;
@@ -667,11 +660,6 @@ Type
 
   TSystemCodePage     = Word;
 
-{$ifdef VER2_6}
-  { the size of textrec/filerec is hardcoded in the 2.6 compiler binary }
-  {$define FPC_ANSI_TEXTFILEREC}
-{$endif}
-
   TFileTextRecChar    = {$if defined(FPC_ANSI_TEXTFILEREC) or not(defined(FPC_HAS_FEATURE_WIDESTRINGS))}AnsiChar{$else}UnicodeChar{$endif};
   PFileTextRecChar    = ^TFileTextRecChar;
 

+ 1 - 1
rtl/inc/textrec.inc

@@ -34,7 +34,7 @@ type
 
   { using packed makes the compiler to generate ugly code on some CPUs, further
     using packed causes the compiler to handle arrays of text wrongly, see  see tw0754 e.g. on arm  }
-  TextRec = {$ifdef VER2_6} packed {$endif} Record
+  TextRec = Record
     Handle    : THandle;
 {$if defined(CPU8) or defined(CPU16)}
     Mode      : Word;

+ 1 - 1
rtl/java/jsystemh.inc

@@ -512,7 +512,7 @@ function  pos(const substr : shortstring;c:char; Offset : Sizeint=1): SizeInt;
 ****************************************************************************}
 
 {$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
-Procedure UniqueString(var S : RawByteString);{$ifdef FPC_HAS_CPSTRING}rtlproc;{$endif FPC_HAS_CPSTRING}external name 'FPC_ANSISTR_UNIQUE';
+Procedure UniqueString(var S : RawByteString);{$ifdef FPC_HAS_CPSTRING}rtlproc;{$endif FPC_HAS_CPSTRING}{$ifdef SYSTEMINLINE}inline;{$endif}
 Function  Pos (const Substr : RawByteString; const Source : RawByteString; Offset: Sizeint = 1) : SizeInt;
 Function  Pos (c : AnsiChar; const s : RawByteString; Offset: Sizeint = 1) : SizeInt;
 {$ifdef VER3_0}

+ 3 - 4
rtl/objpas/character.pas

@@ -20,7 +20,7 @@
 unit Character;
 
 interface
-{$ifndef VER2_4}
+
 {$mode objfpc}
 {$H+}
 {$PACKENUM 1}
@@ -187,10 +187,10 @@ type
   function ToLower(const AString : UnicodeString) : UnicodeString; overload;
   function ToUpper(AChar : UnicodeChar) : UnicodeChar; overload;
   function ToUpper(const AString : UnicodeString) : UnicodeString; overload;
-{$endif VER2_4}
+
 
 implementation
-{$ifndef VER2_4}
+
 uses
   SysUtils,
   RtlConsts;
@@ -851,5 +851,4 @@ begin
     raise EArgumentException.Create(SInvalidUnicodeCodePointSequence);
 end;
 
-{$endif VER2_4}
 end.

+ 1 - 1
rtl/objpas/classes/classesh.inc

@@ -2466,7 +2466,7 @@ procedure ObjectTextToResource(Input, Output: TStream);
 { Utility routines }
 
 function LineStart(Buffer, BufPos: PChar): PChar;
-procedure BinToHex(BinValue, HexValue: PChar; BinBufSize: Integer);
+procedure BinToHex(BinValue, HexValue: PChar; BinBufSize: Integer); deprecated 'use procedures from unit StrUtils';
 function HexToBin(HexValue, BinValue: PChar; BinBufSize: Integer): Integer;
 function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings; AddEmptyStrings : Boolean = False): Integer;
 

+ 1 - 1
rtl/objpas/classes/lists.inc

@@ -11,7 +11,7 @@
 
  **********************************************************************}
 
-{$if defined(VER2_0) or not defined(FPC_TESTGENERICS)}
+{$if not defined(FPC_TESTGENERICS)}
 
 {****************************************************************************}
 {*                           TFPListEnumerator                              *}

+ 12 - 22
rtl/objpas/fgl.pp

@@ -28,10 +28,6 @@ interface
 uses
   types, sysutils, sortbase;
 
-{$IF defined(VER2_4)}
-  {$DEFINE OldSyntax}
-{$IFEND}
-
 const
   MaxListSize = Maxint div 16;
 
@@ -127,7 +123,8 @@ type
       PT = ^T;
       TTypeList = PT;
       PTypeList = ^TTypeList;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnCompare: TCompareFunc;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure Deref(Item: Pointer); override;
@@ -152,10 +149,8 @@ type
     function IndexOf(const Item: T): Integer;
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     property Last: T read GetLast write SetLast;
-{$ifndef VER2_4}
     procedure Assign(Source: TFPGList);
     procedure AddList(Source: TFPGList);
-{$endif VER2_4}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
@@ -171,7 +166,8 @@ type
       TTypeList = PT;
       PTypeList = ^TTypeList;
       TFPGListEnumeratorSpec = specialize TFPGListEnumerator<T>;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnCompare: TCompareFunc;
       FFreeObjects: Boolean;
     procedure CopyItem(Src, Dest: Pointer); override;
@@ -193,10 +189,8 @@ type
     function IndexOf(const Item: T): Integer;
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     property Last: T read GetLast write SetLast;
-{$ifndef VER2_4}
     procedure AddList(Source: TFPGObjectList);
     procedure Assign(Source: TFPGObjectList);
-{$endif VER2_4}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
@@ -213,7 +207,8 @@ type
       TTypeList = PT;
       PTypeList = ^TTypeList;
       TFPGListEnumeratorSpec = specialize TFPGListEnumerator<T>;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnCompare: TCompareFunc;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure Deref(Item: Pointer); override;
@@ -234,10 +229,8 @@ type
     function IndexOf(const Item: T): Integer;
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     property Last: T read GetLast write SetLast;
-{$ifndef VER2_4}
     procedure Assign(Source: TFPGInterfacedObjectList);
     procedure AddList(Source: TFPGInterfacedObjectList);
-{$endif VER2_4}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
@@ -303,7 +296,8 @@ type
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       PKey = ^TKey;
 // unsed      PData = ^TData;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnKeyCompare: TKeyCompareFunc;
       FOnDataCompare: TDataCompareFunc;
     procedure CopyItem(Src, Dest: Pointer); override;
@@ -350,7 +344,8 @@ type
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       PKey = ^TKey;
 // unsed      PData = ^TData;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnKeyCompare: TKeyCompareFunc;
       FOnDataCompare: TDataCompareFunc;
       FFreeObjects: Boolean;
@@ -399,7 +394,8 @@ type
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       PKey = ^TKey;
 // unsed      PData = ^TData;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnKeyCompare: TKeyCompareFunc;
       FOnDataCompare: TDataCompareFunc;
     procedure CopyItem(Src, Dest: Pointer); override;
@@ -1009,7 +1005,6 @@ begin
   inherited SetLast(@Value);
 end;
 
-{$ifndef VER2_4}
 procedure TFPGList.AddList(Source: TFPGList);
 
 var
@@ -1036,7 +1031,6 @@ begin
   else
     Inherited Assign(TFPSList(source))
 end;
-{$endif VER2_4}
 
 function TFPGList.Remove(const Item: T): Integer;
 begin
@@ -1149,7 +1143,6 @@ begin
   inherited SetLast(@Value);
 end;
 
-{$ifndef VER2_4}
 procedure TFPGObjectList.AddList(Source: TFPGObjectList);
 var
   i: Integer;
@@ -1163,7 +1156,6 @@ begin
   Clear;
   AddList(Source);
 end;
-{$endif VER2_4}
 
 function TFPGObjectList.Remove(const Item: T): Integer;
 begin
@@ -1279,7 +1271,6 @@ begin
   inherited SetLast(@Value);
 end;
 
-{$ifndef VER2_4}
 procedure TFPGInterfacedObjectList.Assign(Source: TFPGInterfacedObjectList);
 
 begin
@@ -1294,7 +1285,6 @@ begin
   for I := 0 to Source.Count - 1 do
     Add(Source[i]);
 end;
-{$endif VER2_4}
 
 function TFPGInterfacedObjectList.Remove(const Item: T): Integer;
 begin

+ 1 - 1
rtl/objpas/objpas.pp

@@ -370,7 +370,7 @@ Type
    end;
 
    TResStrInitTable = packed record
-     Count: {$ifdef VER2_6}longint{$else}sizeint{$endif};
+     Count: sizeint;
      Tables: packed array[1..{$ifdef cpu16}8191{$else cpu16}32767{$endif cpu16}] of PResStrInitEntry;
    end;
    PResStrInitTable = ^TResStrInitTable;

+ 0 - 3
rtl/objpas/sysutils/sysencoding.inc

@@ -12,7 +12,6 @@
     *********************************************************************
 }
 
-{$ifndef VER2_4}
 { TEncoding }
 
 class function TEncoding.GetANSI: TEncoding;
@@ -856,5 +855,3 @@ begin
       Inc(I, 2);
     end;
 end;
-
-{$endif VER2_4}

+ 0 - 2
rtl/objpas/sysutils/sysencodingh.inc

@@ -12,7 +12,6 @@
     *********************************************************************
 }
 
-{$ifndef VER2_4}
 type
   EEncodingError = class(Exception);
 
@@ -189,4 +188,3 @@ type
     function Clone: TEncoding; override;
     function GetPreamble: TBytes; override;
   end;
-{$endif VER2_4}

+ 0 - 5
rtl/objpas/sysutils/sysstr.inc

@@ -1394,11 +1394,6 @@ const
   maxdigits = 15;
 {$endif}
 
-{ deactive aligned function for 2.6 }
-{$ifdef VER2_6}
-{$macro on}
-{$define aligned:= }
-{$endif VER2_6}
 Function FloatToStrFIntl(const Value; format: TFloatFormat; Precision, Digits: Integer; ValueType: TFloatValue; Const FormatSettings: TFormatSettings): String;
 Var
   P, PE, Q, Exponent: Integer;

+ 6 - 18
rtl/win/systhrd.inc

@@ -509,56 +509,44 @@ Const
   wrAbandoned= 2;
   wrError    = 3;
 
-type Tbasiceventstate=record
-                        fhandle    : THandle;
-                        flasterror : longint;
-                       end;
-     plocaleventrec= ^tbasiceventstate;
-
 function intBasicEventCreate(EventAttributes : Pointer;
 AManualReset,InitialState : Boolean;const Name : ansistring):pEventState;
 var
   n : PChar;
 begin
-  new(plocaleventrec(result));
   if Length(Name) = 0 then
     n := Nil
   else
     n := PChar(Name);
-  plocaleventrec(result)^.FHandle := CreateEvent(EventAttributes, AManualReset, InitialState,n);
+  Result := PEventState(CreateEvent(EventAttributes, AManualReset, InitialState,n));
 end;
 
 procedure intbasiceventdestroy(state:peventstate);
 
 begin
-  closehandle(plocaleventrec(state)^.fhandle);
-  dispose(plocaleventrec(state));
+  closehandle(THandle(state));
 end;
 
 procedure intbasiceventResetEvent(state:peventstate);
 
 begin
-  ResetEvent(plocaleventrec(state)^.FHandle)
+  ResetEvent(THandle(state))
 end;
 
 procedure intbasiceventSetEvent(state:peventstate);
 
 begin
-  SetEvent(plocaleventrec(state)^.FHandle);
+  SetEvent(THandle(state));
 end;
 
 function intbasiceventWaitFor(Timeout : Cardinal;state:peventstate) : longint;
 
 begin
-  case WaitForSingleObject(plocaleventrec(state)^.fHandle, Timeout) of
+  case WaitForSingleObject(THandle(state), Timeout) of
     WAIT_ABANDONED: Result := wrAbandoned;
     WAIT_OBJECT_0: Result := wrSignaled;
     WAIT_TIMEOUT: Result := wrTimeout;
-    WAIT_FAILED:
-        begin
-        Result := wrError;
-        plocaleventrec(state)^.FLastError := GetLastError;
-       end;
+    WAIT_FAILED: Result := wrError;
   else
     Result := wrError;
   end;

+ 2 - 2
tests/Makefile

@@ -2468,13 +2468,13 @@ ifndef CONCAT
 CONCAT=utils/concat
 endif
 ifndef GPARMAKE
-GPARMAKE=./gparmake$(EXEEXT)
+GPARMAKE=./gparmake$(SRCEXEEXT)
 endif
 ifndef PREPUP
 PREPUP=utils/prepup
 endif
 ifndef CREATELST
-CREATELST=./createlst$(EXEEXT)
+CREATELST=./createlst$(SRCEXEEXT)
 endif
 tstunits:
 ifdef inOS2

+ 2 - 2
tests/Makefile.fpc

@@ -210,7 +210,7 @@ CONCAT=utils/concat
 endif
 
 ifndef GPARMAKE
-GPARMAKE=./gparmake$(EXEEXT)
+GPARMAKE=./gparmake$(SRCEXEEXT)
 endif
 
 ifndef PREPUP
@@ -218,7 +218,7 @@ PREPUP=utils/prepup
 endif
 
 ifndef CREATELST
-CREATELST=./createlst$(EXEEXT)
+CREATELST=./createlst$(SRCEXEEXT)
 endif
 
 

+ 26 - 0
tests/test/trtti21.pp

@@ -0,0 +1,26 @@
+{ GetTypeKind() of an enumeration with holes returns tkEnumeration and
+  TypeInfo() returns Nil, but *only* inside a generic/specialization when used
+  with a generic parameter }
+
+program trtti21;
+
+{$mode objfpc}
+
+type
+  TEnum = (teOne = 1, teTwo);
+
+  generic TTest<T> = class
+    class function Test: Pointer;
+  end;
+
+class function TTest.Test: Pointer;
+begin
+  Result := TypeInfo(T);
+end;
+
+begin
+  if GetTypeKind(TEnum) <> tkEnumeration then
+    Halt(1);
+  if specialize TTest<TEnum>.Test <> Nil then
+    Halt(2);
+end.

+ 17 - 0
tests/test/trtti22.pp

@@ -0,0 +1,17 @@
+{ %FAIl }
+
+{ outside of generics TypeInfo() of types without type information (e.g. enums
+  with holes) throws a compile error }
+
+program trtti22;
+
+{$mode objfpc}
+
+type
+  TEnum = (teOne = 1, teTwo);
+
+var
+  p: Pointer;
+begin
+  p := TypeInfo(TEnum);
+end.

+ 27 - 0
tests/test/trtti23.pp

@@ -0,0 +1,27 @@
+{ %FAIl }
+
+{ inside of generics TypeInfo() of types without type information (e.g. enums
+  with holes) that are not generic parameters throws a compile error }
+
+program trtti23;
+
+{$mode objfpc}
+
+type
+  TEnum = (teOne = 1, teTwo);
+
+  generic TTest<T> = class
+    procedure Test;
+  end;
+
+{ TTest }
+
+procedure TTest.Test;
+var
+  ti: Pointer;
+begin
+  ti := TypeInfo(TEnum);
+end;
+
+begin
+end.

+ 15 - 0
tests/webtbs/tw28640.pp

@@ -0,0 +1,15 @@
+{ %cpu=x86_64 }
+function test : int64;assembler;
+  {$ASMMODE INTEL}
+  asm
+        MOV RAX,'=TXEHTAP' // FAIL: LONG STRING "PATHEXT="
+  end;
+var
+  s : string[8];
+  l : int64 absolute s[1];
+begin
+  l:=test;
+  s[0]:=#8;
+  if s<>'PATHEXT=' then
+    halt(1);
+end.

+ 14 - 0
tests/webtbs/tw28640a.pp

@@ -0,0 +1,14 @@
+{ %cpu=x86_64 }
+function test : int64;assembler;
+  asm
+        MOV $'=TXEHTAP',%RAX // FAIL: LONG STRING "PATHEXT="
+  end;
+var
+  s : string[8];
+  l : int64 absolute s[1];
+begin
+  l:=test;
+  s[0]:=#8;
+  if s<>'PATHEXT=' then
+    halt(1);
+end.

+ 16 - 0
tests/webtbs/tw34232.pp

@@ -0,0 +1,16 @@
+program Project1;
+{$mode objfpc}{$H+}
+type
+generic TTest<TKey, TValue> = packed object
+    type
+    TPair = packed record
+      key: TKey;
+      value: TValue;
+    end;
+    TPairSizeEquivalent = packed array[1..sizeof(TPair)] of byte;
+end;
+TTestStringString = specialize TTest<string, string>;
+
+begin
+  writeln(sizeof(TTestStringString.TPairSizeEquivalent));
+end.

+ 21 - 0
tests/webtbs/tw38636.pp

@@ -0,0 +1,21 @@
+{$mode objfpc}
+program Project1;
+
+{$ifdef cpu64}
+const
+    lowlimit = 536879040;
+
+procedure test(i : integer);
+const
+  myarray : array[lowlimit..lowlimit+2] of integer = (1,2,3);
+begin
+  if @myarray[i]<>@myarray then
+    halt(1);
+end;
+
+begin
+  test(lowlimit);
+{$else}
+begin
+{$endif}
+end.

+ 14 - 0
tests/webtbs/tw38642.pp

@@ -0,0 +1,14 @@
+{ %NORUN }
+
+program tw38642;
+{$mode delphi}{$H+}
+uses
+  classes,
+  generics.collections;
+type
+  TMonthType = (January, February, May=10, June, July);
+  TMonthList = TList<TMonthType>;
+var
+  myList : TMonthList;
+begin
+end.

+ 1 - 1
utils/fpmake.pp

@@ -50,7 +50,7 @@ begin
   With Installer do
     begin
     P:=AddPackage('utils');
-    P.ShortName := 'tils';
+    P.ShortName := 'utils';
     P.OSes:=AllOSes-[embedded,msdos,win16,macosclassic,palmos,zxspectrum,msxdos,amstradcpc];
     if Defaults.CPU=jvm then
       P.OSes := P.OSes - [java,android];

+ 8 - 0
utils/pas2js/dist/rtl.js

@@ -1040,6 +1040,14 @@ var rtl = {
     }
   },
 
+  arrayInsert: function(item, arr, index){
+    if (arr){
+      return arr.splice(index,0,item);
+    } else {
+      return [item];
+    }
+  },
+
   setCharAt: function(s,index,c){
     return s.substr(0,index)+c+s.substr(index+1);
   },

+ 1 - 2
utils/pas2js/httpcompiler.pp

@@ -558,13 +558,12 @@ begin
   S:=Checkoptions('shqd:ni:p:wP::cm:',['help','quiet','noindexpage','directory:','port:','indexpage:','watch','project::','config:','simpleserver','mimetypes:']);
   if (S<>'') or HasOption('h','help') then
     usage(S);
-  FServeOnly:=HasOption('s','simpleserver');
+  FServeOnly:=HasOption('s','serve-only');
   Quiet:=HasOption('q','quiet');
   Port:=StrToIntDef(GetOptionValue('p','port'),3000);
   D:=GetOptionValue('d','directory');
   if D='' then
     D:=GetCurrentDir;
-  D:=ExpandFileName(D);
   if HasOption('m','mimetypes') then
     MimeTypesFile:=GetOptionValue('m','mimetypes');
   if MimeTypesFile='' then