Jelajahi Sumber

Update repository

Curtis Hamilton 4 minggu lalu
induk
melakukan
af595389a6
57 mengubah file dengan 1355 tambahan dan 2183 penghapusan
  1. 1 1
      Makefile
  2. 2 2
      compiler/aasmtai.pas
  3. 13 0
      compiler/aoptutils.pas
  4. 25 4
      compiler/pgenutil.pas
  5. 2 0
      compiler/scandir.pas
  6. 5 2
      compiler/symdef.pas
  7. 5 3
      compiler/symsym.pas
  8. 153 6
      compiler/x86/aoptx86.pas
  9. 8 1
      packages/fpmake.pp
  10. 7 7
      rtl/Makefile
  11. 1 1
      rtl/beos/Makefile
  12. 1 1
      rtl/beos/Makefile.fpc
  13. 5 2
      rtl/bsd/system.pp
  14. 19 18
      rtl/embedded/Makefile
  15. 3 2
      rtl/embedded/Makefile.fpc
  16. 1 1
      rtl/emx/Makefile
  17. 1 1
      rtl/emx/Makefile.fpc
  18. 1 25
      rtl/freebsd/Makefile
  19. 5 0
      rtl/freebsd/Makefile.fpc
  20. 1 2
      rtl/freebsd/powerpc64/cprt0.as
  21. 1 1
      rtl/go32v2/Makefile
  22. 1 1
      rtl/go32v2/Makefile.fpc
  23. 1 1
      rtl/haiku/Makefile
  24. 1 1
      rtl/haiku/Makefile.fpc
  25. 0 1
      rtl/inc/generic.inc
  26. 17 0
      rtl/inc/heap.inc
  27. 1 1
      rtl/inc/systemh.inc
  28. 1 1
      rtl/msxdos/Makefile.fpc
  29. 1 1
      rtl/nativent/Makefile
  30. 1 1
      rtl/nativent/Makefile.fpc
  31. 1 1
      rtl/netware/Makefile
  32. 1 1
      rtl/netware/Makefile.fpc
  33. 1 1
      rtl/netwlibc/Makefile
  34. 1 1
      rtl/netwlibc/Makefile.fpc
  35. 1 1
      rtl/openbsd/Makefile
  36. 2 2
      rtl/openbsd/Makefile.fpc
  37. 1 1
      rtl/os2/Makefile
  38. 1 1
      rtl/os2/Makefile.fpc
  39. 566 2073
      rtl/qnx/Makefile
  40. 1 1
      rtl/qnx/Makefile.fpc
  41. 1 1
      rtl/solaris/Makefile
  42. 1 1
      rtl/solaris/Makefile.fpc
  43. 1 1
      rtl/symbian/Makefile
  44. 1 1
      rtl/symbian/Makefile.fpc
  45. 3 0
      rtl/unix/classes.pp
  46. 1 1
      rtl/watcom/Makefile
  47. 1 1
      rtl/watcom/Makefile.fpc
  48. 4 2
      rtl/win32/buildrtl.pp
  49. 1 1
      rtl/wince/Makefile
  50. 1 1
      rtl/wince/Makefile.fpc
  51. 11 0
      tests/tbs/tb0725.pp
  52. 41 0
      tests/tbs/tb0726.pp
  53. 39 0
      tests/tbs/ub0725.pp
  54. 20 0
      tests/test/tpushpop4.pp
  55. 358 0
      tests/test/units/dateutil/tincdatetime1.pp
  56. 10 1
      utils/build/Makefile
  57. 1 1
      utils/fpcm/fpcmmain.pp

+ 1 - 1
Makefile

@@ -2,7 +2,7 @@
 # Don't edit, this file is generated by FPCMake Version 2.0.0
 #
 default: help
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded m68k-sinclairql m68k-human68k powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix powerpc64-freebsd avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mipsel-ps1 mips64-linux mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-freebsd aarch64-darwin aarch64-win64 aarch64-embedded aarch64-iphonesim aarch64-android aarch64-ios wasm32-embedded wasm32-wasip1 wasm32-wasip1threads wasm32-wasip2 sparc64-linux riscv32-linux riscv32-embedded riscv32-freertos riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos z80-amstradcpc loongarch64-linux
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded m68k-sinclairql m68k-human68k powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-freebsd powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mipsel-ps1 mips64-linux mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-freebsd aarch64-darwin aarch64-win64 aarch64-embedded aarch64-iphonesim aarch64-android aarch64-ios wasm32-embedded wasm32-wasip1 wasm32-wasip1threads wasm32-wasip2 sparc64-linux riscv32-linux riscv32-embedded riscv32-freertos riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos z80-amstradcpc loongarch64-linux
 BSDs = freebsd netbsd openbsd darwin dragonfly
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari human68k

+ 2 - 2
compiler/aasmtai.pas

@@ -1431,7 +1431,7 @@ implementation
             is_global:=true;
           end
         else
-          Create(_name,_size,def,_typ);
+          Create_global(_name,_size,def,_typ);
       end;
 
 
@@ -1546,7 +1546,7 @@ implementation
             is_global:=true;
           end
         else
-          Createname(_name, _symtyp, siz, def);
+          Createname_global(_name, _symtyp, siz, def);
       end;
 
 

+ 13 - 0
compiler/aoptutils.pas

@@ -44,6 +44,10 @@ unit aoptutils;
     { Set Store and Result to Condition (useful as an inline assignment in a conditional block) }
     function SetAndTest(const Condition: Boolean; out Store: Boolean): Boolean; inline;
 
+    { Set result and store to value (useful as an inline assignment in a conditional block).
+      This is the equivalent of the C code "if ((store=value)==...)" }
+    function SetAndPassThrough(const value: integer; out store: integer): integer; inline;
+
   implementation
 
     uses
@@ -102,4 +106,13 @@ unit aoptutils;
         Result := Store;
       end;
 
+
+    { Set result and store to value (useful as an inline assignment in a conditional block).
+      This is the equivalent of the C code "if ((store=value)==...)" }
+    function SetAndPassThrough(const value: integer; out store: integer): integer;
+      begin
+        store := value;
+        result := value;
+      end;
+
 end.

+ 25 - 4
compiler/pgenutil.pas

@@ -1897,10 +1897,31 @@ uses
               end;
           end
         else
-          if current_module.is_unit and current_module.in_interface then
-            specializest:=current_module.globalsymtable
-          else
-            specializest:=current_module.localsymtable;
+          begin
+            { if one of the type parameters is owned by a local- or parasymtable
+              then use the localsymtable for specialization }
+            specializest:=nil;
+            for i:=0 to context.paramlist.count-1 do
+              begin
+                psym:=tsym(context.paramlist[i]);
+                if psym.owner.symtabletype in [localsymtable,parasymtable] then
+                  begin
+                    if (psym.owner.symtabletype=localsymtable) or (psym.owner.defowner.typ<>procdef) then
+                      specializest:=psym.owner
+                    else
+                      specializest:=tprocdef(psym.owner.defowner).getsymtable(gs_local);
+                    if not assigned(specializest) then
+                      internalerror(2025122402);
+                    break;
+                  end;
+              end;
+
+            if not assigned(specializest) then
+              if current_module.is_unit and current_module.in_interface then
+                specializest:=current_module.globalsymtable
+              else
+                specializest:=current_module.localsymtable;
+          end;
         if not assigned(specializest) then
           internalerror(2014050910);
 

+ 2 - 0
compiler/scandir.pas

@@ -2291,8 +2291,10 @@ unit scandir;
         AddDirective('PIC',directive_all, @dir_pic);
         AddDirective('POINTERMATH',directive_all, @dir_pointermath);
         AddDirective('POP',directive_all, @dir_pop);
+        AddDirective('POPOPT',directive_all, @dir_pop);
         AddDirective('PROFILE',directive_all, @dir_profile);
         AddDirective('PUSH',directive_all, @dir_push);
+        AddDirective('PUSHOPT',directive_all, @dir_push);
         AddDirective('R',directive_all, @dir_resource);
         AddDirective('RTTI',directive_all, @dir_rtti);
         AddDirective('RANGECHECKS',directive_all, @dir_rangechecks);

+ 5 - 2
compiler/symdef.pas

@@ -5809,7 +5809,11 @@ implementation
          begin
            hp:=tparavarsym(paras[i]);
            if not(vo_is_hidden_para in hp.varoptions) then
-             result:=result+'$'+hp.vardef.mangledparaname;
+             begin
+               if not assigned(hp.vardef) then
+                 internalerror(2025122401);
+               result:=result+'$'+hp.vardef.mangledparaname;
+             end;
          end;
         { add resultdef, add $$ as separator to make it unique from a
           parameter separator }
@@ -7631,7 +7635,6 @@ implementation
           -> set that one }
         import_name:=stringdup(s);
         include(procoptions,po_has_importname);
-        include(procoptions,po_has_mangledname);
 {$else}
   {$ifdef symansistr}
         _mangledname:=s;

+ 5 - 3
compiler/symsym.pas

@@ -754,10 +754,10 @@ implementation
               begin
                 comment(v_error,'Symbol '+realname+' from module '+tmod.mainsource+' registered with current module '+current_module.mainsource);
               end;
-	    if not assigned(tmod) then
+            if not assigned(tmod) then
               tmod:=current_module;
           end
-	else
+        else
           tmod:=current_module;
         { Register in current_module }
         if assigned(tmod) then
@@ -1049,7 +1049,9 @@ implementation
         for i:=0 to ProcdefList.Count-1 do
           begin
             pd:=tprocdef(ProcdefList[i]);
-            if (pd.owner=owner) and (pd.forwarddef) then
+            { Don't check for is_specialization, but whether it's somehow part
+              of a specialization }
+            if (pd.owner=owner) and (pd.forwarddef) and not (df_specialization in pd.defoptions) then
               begin
                 { For mode macpas. Make implicit externals (procedures declared in the interface
                   section which do not have a counterpart in the implementation)

+ 153 - 6
compiler/x86/aoptx86.pas

@@ -146,6 +146,9 @@ unit aoptx86;
         { Returns true if the given logic instruction can be converted into a BTx instruction (BT not included) }
         class function IsBTXAcceptable(p : tai) : boolean; static;
 
+        { Returns the index of an input operand that can take a register or a
+          reference, or -1 if there isn't one }
+        class function GetRMReadIndex(var p : tai) : integer; static;
 
         { Converts the LEA instruction to ADD/INC/SUB/DEC. Returns True if the
           conversion was successful }
@@ -2885,6 +2888,115 @@ unit aoptx86;
       end;
 
 
+    class function TX86AsmOptimizer.GetRMReadIndex(var p : taI): integer;
+      var
+        hp: taicpu absolute p; { Implicit typecast }
+      begin
+        if p.typ<>ait_instruction then
+          begin
+            Result:=-1;
+            Exit;
+          end;
+
+        { Remember we're looking for input operands that can either be a
+          register or a reference.  If it can take only a register or only a
+          reference, or is read/write, it doesn't count }
+        case hp.opcode of
+          A_MOV,
+          A_ADC,
+          A_ADD,
+          A_AND,
+          A_CMP,
+          A_OR,
+          A_SBB,
+          A_SUB,
+          A_TEST,
+          A_XOR:
+            if (hp.oper[0]^.typ=top_reg) and
+              (hp.oper[1]^.typ=top_reg) and
+              { Don't count "xor %reg,%reg" etc. }
+              (hp.oper[0]^.reg<>hp.oper[1]^.reg) then
+              Result:=0
+            else
+              Result:=-1;
+
+          A_MOVZX,
+          A_MOVSX,
+{$ifdef x86_64}
+          A_MOVSXD,
+{$endif x86_64}
+          A_BSF,
+          A_BSR,
+          A_CMOVcc,
+          A_CVTSI2SS,
+          A_CVTSI2SD,
+          A_LZCNT,
+          A_POPCNT,
+          A_VCVTSI2SS,
+          A_VCVTSI2SD,
+          { BMI1 instructions }
+          A_ANDN, A_BLSI, A_BLSMSK, A_BLSR, A_TZCNT,
+          { BMI2 instructions }
+          A_MULX, A_PDEP, A_PEXT,
+          { ADX }
+          A_ADCX, A_ADOX:
+            Result:=0;
+
+          { BMI1 instructions }
+          A_BEXTR,
+          { BMI2 instructions }
+          A_BZHI, A_RORX, A_SARX, A_SHLX, A_SHRX:
+            Result:=1;
+
+          A_MOVD,
+          A_MOVQ,
+          A_VMOVD,
+          A_VMOVQ:
+            if (hp.oper[0]^.typ = top_reg) and
+              (getregtype(hp.oper[0]^.reg) = R_INTREGISTER) then
+              Result:=0
+            else
+              Result:=-1;
+
+          A_DIV,
+          A_IDIV:
+            if (taicpu(p).oper[0]^.typ=top_reg) and
+              (
+                (getsupreg(taicpu(p).oper[0]^.reg)=RS_EAX) or { EAX is also used implicitly; don't change }
+                (
+                  (hp.opsize<>S_B) and
+                  (getsupreg(taicpu(p).oper[0]^.reg)=RS_EDX) { EDX is also used implicitly; don't change }
+                )
+              ) then
+              Result:=-1
+            else
+              Result:=0;
+
+          A_MUL:
+            if (taicpu(p).oper[0]^.typ=top_reg) and (getsupreg(taicpu(p).oper[0]^.reg)=RS_EAX) then
+              Result:=-1 { EAX is also used implicitly; don't change }
+            else
+              Result:=0;
+
+          A_IMUL:
+            case hp.ops of
+              3:
+                Result:=1;
+              2:
+                Result:=0;
+              else
+                if (taicpu(p).oper[0]^.typ=top_reg) and (getsupreg(taicpu(p).oper[0]^.reg)=RS_EAX) then
+                  Result:=-1 { EAX is also used implicitly; don't change }
+                else
+                  Result:=0;
+            end;
+
+          else
+            Result:=-1;
+        end;
+      end;
+
+
     function TX86AsmOptimizer.ConvertLEA(const p: taicpu): Boolean;
       var
         l: asizeint;
@@ -3268,6 +3380,7 @@ unit aoptx86;
         SourceRef, TargetRef: TReference;
         MovAligned, MovUnaligned: TAsmOp;
         JumpTracking: TLinkedList;
+        op_idx: integer;
       begin
         Result:=false;
 
@@ -3989,17 +4102,43 @@ unit aoptx86;
 
                         <op> ref,reg1
                       }
-                      if MatchOpType(taicpu(hp1),top_reg,top_reg) and
-                        (taicpu(hp1).oper[0]^.reg = p_TargetReg) and
-                        MatchInstruction(hp1, [A_AND, A_OR, A_XOR, A_ADD, A_SUB, A_CMP, A_TEST, A_CMOVcc, A_BSR, A_BSF, A_POPCNT, A_LZCNT], [taicpu(p).opsize]) and
-                        not SuperRegistersEqual(taicpu(hp1).oper[1]^.reg, p_TargetReg) and
+                      op_idx := -1; { Needed to prevent compiler warnings }
+                      if (SetAndPassThrough(GetRMReadIndex(hp1),op_idx)<>-1) and
+                        (taicpu(hp1).oper[op_idx]^.reg = p_TargetReg) and
                         not RefModifiedBetween(taicpu(p).oper[0]^.ref^, topsize2memsize[taicpu(p).opsize] shr 3, p, hp1) then
                         begin
                           TransferUsedRegs(TmpUsedRegs);
                           UpdateUsedRegsBetween(TmpUsedRegs, tai(p.Next), hp1);
-                          if not RegUsedAfterInstruction(p_TargetReg, hp1, TmpUsedRegs) then
+
+                          DoOptimisation := True;
+                          if RegUsedAfterInstruction(p_TargetReg, hp1, TmpUsedRegs) then
                             begin
-                              taicpu(hp1).loadref(0,taicpu(p).oper[0]^.ref^);
+                              { We may still be able to perform the optimisation if we're careful }
+
+                              { A trick so RegLoadedWithNewValue will not return False
+                                if p_TargetReg is read from or appears in the reference }
+                              taicpu(hp1).loadreg(op_idx,NR_NO);
+
+                              TransferUsedRegs(TmpUsedRegs);
+                              UpdateUsedRegsBetween(TmpUsedRegs, tai(p.Next), hp1);
+
+                              { Note, RegReadByInstruction is indirectly called by
+                                RegUsedAfterInstruction and will return True if
+                                another operand reads from p_TargetReg or is read
+                                from implicitly, so RegLoadedWithNewValue will
+                                return False in this situation, and hence
+                                RegUsedAfterInstruction will return True }
+                              if RegUsedAfterInstruction(p_TargetReg, hp1, TmpUsedRegs) then
+                                begin
+                                  { Abort }
+                                  taicpu(hp1).loadreg(op_idx,p_TargetReg);
+                                  DoOptimisation := False;
+                                end;
+                            end;
+
+                          if DoOptimisation then
+                            begin
+                              taicpu(hp1).loadref(op_idx,taicpu(p).oper[0]^.ref^);
 
                               { loadref increases the reference count, so decrement it again }
                               if Assigned(taicpu(p).oper[0]^.ref^.symbol) then
@@ -4013,6 +4152,14 @@ unit aoptx86;
                               if not RegInRef(p_TargetReg, taicpu(p).oper[0]^.ref^) then
                                 TryRemoveRegAlloc(p_TargetReg, p, hp1);
 
+                              { Update the register tracking for the registers inside the reference }
+                              if (taicpu(p).oper[0]^.ref^.base<>NR_NO) then
+                                AllocRegBetween(taicpu(p).oper[0]^.ref^.base, p, hp1, UsedRegs);
+
+                              if (taicpu(p).oper[0]^.ref^.index<>NR_NO) and
+                                (taicpu(p).oper[0]^.ref^.index<>taicpu(p).oper[0]^.ref^.base) then
+                                AllocRegBetween(taicpu(p).oper[0]^.ref^.index, p, hp1, UsedRegs);
+
                               RemoveCurrentp(p);
                               Result:=true;
                               exit;

+ 8 - 1
packages/fpmake.pp

@@ -4,7 +4,14 @@
 {$mode objfpc}{$H+}
 program fpmake;
 
-uses {$ifdef unix}cwstring,cthreads,{$endif} sysutils, Classes, fpmkunit;
+uses
+{$ifdef unix}
+ cwstring,
+{$ifndef NO_THREADING}
+ cthreads,
+{$endif}
+{$endif}
+ sysutils, Classes, fpmkunit;
 
 Var
   TBuild,T : TTarget;

+ 7 - 7
rtl/Makefile

@@ -2,7 +2,7 @@
 # Don't edit, this file is generated by FPCMake Version 2.0.0
 #
 default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded m68k-sinclairql m68k-human68k powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix powerpc64-freebsd avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mipsel-ps1 mips64-linux mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-freebsd aarch64-darwin aarch64-win64 aarch64-embedded aarch64-iphonesim aarch64-android aarch64-ios wasm32-embedded wasm32-wasip1 wasm32-wasip1threads wasm32-wasip2 sparc64-linux riscv32-linux riscv32-embedded riscv32-freertos riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos z80-amstradcpc loongarch64-linux
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded m68k-sinclairql m68k-human68k powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-freebsd powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mipsel-ps1 mips64-linux mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-freebsd aarch64-darwin aarch64-win64 aarch64-embedded aarch64-iphonesim aarch64-android aarch64-ios wasm32-embedded wasm32-wasip1 wasm32-wasip1threads wasm32-wasip2 sparc64-linux riscv32-linux riscv32-embedded riscv32-freertos riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos z80-amstradcpc loongarch64-linux
 BSDs = freebsd netbsd openbsd darwin dragonfly
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari human68k
@@ -581,6 +581,9 @@ endif
 ifeq ($(CPU_OS_TARGET),powerpc64-linux)
 override TARGET_DIRS+=linux
 endif
+ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
+override TARGET_DIRS+=freebsd
+endif
 ifeq ($(CPU_OS_TARGET),powerpc64-darwin)
 override TARGET_DIRS+=darwin
 endif
@@ -590,9 +593,6 @@ endif
 ifeq ($(CPU_OS_TARGET),powerpc64-aix)
 override TARGET_DIRS+=aix
 endif
-ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
-override TARGET_DIRS+=freebsd
-endif
 ifeq ($(CPU_OS_TARGET),avr-embedded)
 override TARGET_DIRS+=embedded
 endif
@@ -2276,6 +2276,9 @@ endif
 ifeq ($(CPU_OS_TARGET),powerpc64-linux)
 TARGET_DIRS_LINUX=1
 endif
+ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
+TARGET_DIRS_FREEBSD=1
+endif
 ifeq ($(CPU_OS_TARGET),powerpc64-darwin)
 TARGET_DIRS_DARWIN=1
 endif
@@ -2285,9 +2288,6 @@ endif
 ifeq ($(CPU_OS_TARGET),powerpc64-aix)
 TARGET_DIRS_AIX=1
 endif
-ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
-TARGET_DIRS_FREEBSD=1
-endif
 ifeq ($(CPU_OS_TARGET),avr-embedded)
 TARGET_DIRS_EMBEDDED=1
 endif

+ 1 - 1
rtl/beos/Makefile

@@ -928,7 +928,7 @@ DYNLIBSINCDIR=$(UNIXINC)
 override FPCOPT+= -dHASUNIX -n -dFPC_USE_LIBC -Si
 OBJPASDIR=$(RTL)/objpas
 ifeq ($(CPU_OS_TARGET),i386-beos)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(BASEUNIXUNIT) $(UNIXTYPEUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(ERRORSUNIT) $(DOSUNIT) $(DLUNIT) $(CTHREADSUNIIT) $(SYSCONSTUNIT) $(SYSUTILSUNIT) $(TYPESUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(TYPINFOUNIT)  $(SORTBASEUNIT) $(CLASSESUNIT) $(FGLUNIT) $(MATHUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(RTLCONSTSUNIT) $(SYSCALLUNIT) $(UNIXUNIT) $(UNIXUTILUNIT) $(TERMIOUNIT) $(INITCUNIT) $(UNIXCPUNIT)  $(CHARACTERUNIT) $(FPWIDESTRINGUNIT) $(CMEMUNIT) $(DYNLIBSUNIT) $(CWSTRINGUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU218UNIT)  $(UFLOAT128UNIT)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(BASEUNIXUNIT) $(UNIXTYPEUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(ERRORSUNIT) $(DOSUNIT) $(DLUNIT) $(CTHREADSUNIIT) $(SYSCONSTUNIT) $(SYSUTILSUNIT) $(TYPESUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(TYPINFOUNIT)  $(SORTBASEUNIT) $(CLASSESUNIT) $(FGLUNIT) $(MATHUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(RTLCONSTSUNIT) $(SYSCALLUNIT) $(UNIXUNIT) $(UNIXUTILUNIT) $(TERMIOUNIT) $(INITCUNIT) $(UNIXCPUNIT)  $(CHARACTERUNIT) $(FPWIDESTRINGUNIT) $(CMEMUNIT) $(DYNLIBSUNIT) $(CWSTRINGUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU218UNIT)  $(UFLOAT128UNIT)
 endif
 ifeq ($(CPU_OS_TARGET),i386-beos)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS) $(UNICODEDATAUNIT)

+ 1 - 1
rtl/beos/Makefile.fpc

@@ -11,7 +11,7 @@ units=$(SYSTEMUNIT) $(UUCHARUNIT) $(BASEUNIXUNIT) $(UNIXTYPEUNIT) $(CTYPESUNIT)
       $(ERRORSUNIT) $(DOSUNIT) $(DLUNIT) $(CTHREADSUNIIT) \
       $(SYSCONSTUNIT) $(SYSUTILSUNIT) \
       $(TYPESUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(TYPINFOUNIT)  $(SORTBASEUNIT) $(CLASSESUNIT) $(FGLUNIT) $(MATHUNIT) \
-      $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) \
+      $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) \
       $(RTLCONSTSUNIT) $(SYSCALLUNIT) $(UNIXUNIT) $(UNIXUTILUNIT) $(TERMIOUNIT) $(INITCUNIT) \
       $(UNIXCPUNIT)  $(CHARACTERUNIT) $(FPWIDESTRINGUNIT) \
       $(CMEMUNIT) \

+ 5 - 2
rtl/bsd/system.pp

@@ -208,8 +208,11 @@ begin
   e[j]:=1 shl i;
   { this routine is called from a signal handler, so must not change errno }
   olderrno:=geterrno;
-  fpsigprocmask(SIG_UNBLOCK,@e,@oe);
-  reenable_signal:=geterrno=0;
+  seterrno(0);
+  if fpsigprocmask(SIG_UNBLOCK,@e,@oe)<>0 then
+    reenable_signal:=geterrno=0
+  else
+    reenable_signal:=true;
   seterrno(olderrno);
 end;
 

+ 19 - 18
rtl/embedded/Makefile

@@ -1083,7 +1083,8 @@ $(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNIT
 endif
 endif
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(MULTIBOOTUNIT) $(INTRINSICSUNIT)
+CPU_UNITS=$(MULTIBOOTUNIT)
+CPU_SPECIFIC_COMMON_UNITS+=$(INTRINSICSUNIT)
 CPU_UNITS_DEFINED=1
 ifeq ($(CPU_UNITS_DEFINED),)
 $(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)
@@ -1265,55 +1266,55 @@ override TARGET_LOADERS+=$(LOADERS)
 endif
 override INSTALL_FPCPACKAGE=y y
 ifeq ($(CPU_OS_TARGET),i386-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),m68k-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),powerpc-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),sparc-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),x86_64-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),arm-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),powerpc64-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),avr-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),armeb-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),mipsel-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),i8086-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),aarch64-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),wasm32-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),riscv32-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),riscv64-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),xtensa-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),z80-embedded)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(ARCH)
 endif
 ifeq ($(CPU_OS_TARGET),i386-embedded)
 override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)

+ 3 - 2
rtl/embedded/Makefile.fpc

@@ -34,7 +34,7 @@ fpcpackage=y
 target=embedded
 
 [compiler]
-includedir=$(INC) $(PROCINC)
+includedir=$(INC) $(PROCINC) $(ARCH)
 sourcedir=$(INC) $(PROCINC) $(COMMON) $(ARCH)
 
 [prerules]
@@ -218,7 +218,8 @@ endif
 endif
 
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(MULTIBOOTUNIT) $(INTRINSICSUNIT)
+CPU_UNITS=$(MULTIBOOTUNIT)
+CPU_SPECIFIC_COMMON_UNITS+=$(INTRINSICSUNIT)
 CPU_UNITS_DEFINED=1
 ifeq ($(CPU_UNITS_DEFINED),)
 $(error No CPUs enabled for given SUBARCH, pass either a SUBARCH or set CPU_UNITS_DEFINED=1 if you know what you are doing)

+ 1 - 1
rtl/emx/Makefile

@@ -931,7 +931,7 @@ SYSTEMUNITEXT=pas
 DOSUNITEXT=pas
 PORTSUNITEXT=pas
 ifeq ($(CPU_OS_TARGET),i386-emx)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(PORTSUNIT) $(OS2DEFUNIT) $(DOSCALLSUNIT) $(DOSCALL2UNIT) $(KBDCALLSUNIT) $(MOUCALLSUNIT) $(VIOCALLSUNIT) $(SO32DLLUNIT) $(PMBITMAPUNIT) $(PMWINUNIT) $(PMGPIUNIT) $(PMSTDDLGUNIT) $(PMHELPUNIT) $(PMDEVUNIT) $(PMSPLUNIT) $(PMSHLUNIT) $(PMWPUNIT) $(PMWSOCKUNIT) $(PMBIDI) $(DOSUNIT) $(SUSITILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(CPUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT)       $(UFLOAT128UNIT)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(PORTSUNIT) $(OS2DEFUNIT) $(DOSCALLSUNIT) $(DOSCALL2UNIT) $(KBDCALLSUNIT) $(MOUCALLSUNIT) $(VIOCALLSUNIT) $(SO32DLLUNIT) $(PMBITMAPUNIT) $(PMWINUNIT) $(PMGPIUNIT) $(PMSTDDLGUNIT) $(PMHELPUNIT) $(PMDEVUNIT) $(PMSPLUNIT) $(PMSHLUNIT) $(PMWPUNIT) $(PMWSOCKUNIT) $(PMBIDI) $(DOSUNIT) $(SUSITILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(CPUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT)       $(UFLOAT128UNIT)
 endif
 ifeq ($(CPU_OS_TARGET),i386-emx)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS) $(UNICODEDATAUNIT)

+ 1 - 1
rtl/emx/Makefile.fpc

@@ -14,7 +14,7 @@ units=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(IS
       $(PMHELPUNIT) $(PMDEVUNIT) $(PMSPLUNIT) $(PMSHLUNIT) $(PMWPUNIT) $(PMWSOCKUNIT) $(PMBIDI) \
       $(DOSUNIT) \
       $(SUSITILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) \
-      $(CHARSETUNIT) $(CPALLUNIT) $(CPUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) \
+      $(CHARSETUNIT) $(CPALLUNIT) $(CPUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) \
       $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) \
       $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) \
       $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) \

+ 1 - 25
rtl/freebsd/Makefile

@@ -2,7 +2,7 @@
 # Don't edit, this file is generated by FPCMake Version 2.0.0
 #
 default: all
-MAKEFILETARGETS=i386-freebsd x86_64-freebsd aarch64-freebsd powerpc64-freebsd
+MAKEFILETARGETS=i386-freebsd x86_64-freebsd aarch64-freebsd
 BSDs = freebsd netbsd openbsd darwin dragonfly
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari human68k
@@ -943,12 +943,6 @@ ifeq ($(ARCH),x86_64)
 CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(INTRINSICSUNIT)
 ASTARGET=--64
 endif
-ifeq ($(ARCH),powerpc64)
-ASTARGET=-a64
-endif
-ifdef RELEASE
-override FPCOPT+=-Ur
-endif
 ifeq ($(ARCH),aarch64)
 CPU_UNITS=$(INTRINSICSUNIT)
 endif
@@ -962,9 +956,6 @@ endif
 ifeq ($(CPU_OS_TARGET),aarch64-freebsd)
 override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(UNIXTYPEUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(SYSCALLUNIT) $(SYSCTLUNIT) $(BASEUNIXUNIT) $(UNIXUTILUNIT) $(CHARACTERUNIT) $(UNIXUNIT) $(RTLCONSTSUNIT) $(INITCUNIT) $(CMEMUNIT) $(DLUNIT) $(TERMIOUNIT) $(SYSUTILSUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(TYPESUNIT) $(SORTBASEUNIT) $(CLASSESUNIT) $(FGLUNIT) $(DYNLIBSUNIT) $(CPU_UNITS) $(CHARSETUNIT) $(CPALLUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LNFODWRFUNIT) $(LINEINFOUNIT) $(ERRORSUNIT) $(BSDUNIT) $(FREEBSDUNIT) $(CONSOLEUNIT) $(SYSCONSTUNIT) $(CTHREADSUNIT) $(DOSUNIT) $(CWSTRINGUNIT) $(FPINTRESUNIT) $(UNIXCPUNIT) $(FPWIDESTRINGUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT) $(UFLOAT128UNIT) $(UNIX98PTYUNIT)
 endif
-ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(UNIXTYPEUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(SYSCALLUNIT) $(SYSCTLUNIT) $(BASEUNIXUNIT) $(UNIXUTILUNIT) $(CHARACTERUNIT) $(UNIXUNIT) $(RTLCONSTSUNIT) $(INITCUNIT) $(CMEMUNIT) $(DLUNIT) $(TERMIOUNIT) $(SYSUTILSUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(TYPESUNIT) $(SORTBASEUNIT) $(CLASSESUNIT) $(FGLUNIT) $(DYNLIBSUNIT) $(CPU_UNITS) $(CHARSETUNIT) $(CPALLUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LNFODWRFUNIT) $(LINEINFOUNIT) $(ERRORSUNIT) $(BSDUNIT) $(FREEBSDUNIT) $(CONSOLEUNIT) $(SYSCONSTUNIT) $(CTHREADSUNIT) $(DOSUNIT) $(CWSTRINGUNIT) $(FPINTRESUNIT) $(UNIXCPUNIT) $(FPWIDESTRINGUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT) $(UFLOAT128UNIT) $(UNIX98PTYUNIT)
-endif
 ifeq ($(CPU_OS_TARGET),i386-freebsd)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS) $(UNICODEDATAUNIT)
 endif
@@ -974,9 +965,6 @@ endif
 ifeq ($(CPU_OS_TARGET),aarch64-freebsd)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS) $(UNICODEDATAUNIT)
 endif
-ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
-override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS) $(UNICODEDATAUNIT)
-endif
 ifeq ($(CPU_OS_TARGET),i386-freebsd)
 override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
@@ -986,9 +974,6 @@ endif
 ifeq ($(CPU_OS_TARGET),aarch64-freebsd)
 override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
-ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
-endif
 ifeq ($(CPU_OS_TARGET),i386-freebsd)
 override TARGET_RSTS+=$(MATHUNIT) $(TYPINFOUNIT) $(CLASSESUNIT) $(SYSCONSTUNIT) $(UNICODEDATAUNIT)
 endif
@@ -998,9 +983,6 @@ endif
 ifeq ($(CPU_OS_TARGET),aarch64-freebsd)
 override TARGET_RSTS+=$(MATHUNIT) $(TYPINFOUNIT) $(CLASSESUNIT) $(SYSCONSTUNIT) $(UNICODEDATAUNIT)
 endif
-ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
-override TARGET_RSTS+=$(MATHUNIT) $(TYPINFOUNIT) $(CLASSESUNIT) $(SYSCONSTUNIT) $(UNICODEDATAUNIT)
-endif
 override INSTALL_FPCPACKAGE=y y y
 ifeq ($(CPU_OS_TARGET),i386-freebsd)
 override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(UNIXINC) $(BSDINC) $(BSDPROCINC) $(OSPROCINC)
@@ -1011,9 +993,6 @@ endif
 ifeq ($(CPU_OS_TARGET),aarch64-freebsd)
 override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(UNIXINC) $(BSDINC) $(BSDPROCINC) $(OSPROCINC)
 endif
-ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
-override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC) $(UNIXINC) $(BSDINC) $(BSDPROCINC) $(OSPROCINC)
-endif
 ifeq ($(CPU_OS_TARGET),i386-freebsd)
 override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(UNIXINC) $(BSDINC) $(COMMON)
 endif
@@ -1023,9 +1002,6 @@ endif
 ifeq ($(CPU_OS_TARGET),aarch64-freebsd)
 override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(UNIXINC) $(BSDINC) $(COMMON)
 endif
-ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
-override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(UNIXINC) $(BSDINC) $(COMMON)
-endif
 ifdef REQUIRE_UNITSDIR
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
 endif

+ 5 - 0
rtl/freebsd/Makefile.fpc

@@ -84,10 +84,15 @@ ifeq ($(ARCH),x86_64)
 CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(INTRINSICSUNIT)
 ASTARGET=--64
 endif
+
 ifeq ($(ARCH),aarch64)
 CPU_UNITS=$(INTRINSICSUNIT)
 endif
 
+ifeq ($(ARCH),powerpc64)
+CPU_UNITS=$(INTRINSICSUNIT)
+endif
+
 # Paths
 OBJPASDIR=$(RTL)/objpas
 

+ 1 - 2
rtl/freebsd/powerpc64/cprt0.as

@@ -6,8 +6,7 @@
         /* FreeBSD/ppc64: avoid @toc@ha/@toc@l relocations (not supported by some assemblers).
            Use full 64-bit absolute address materialization for data symbols. */
         .macro  LOAD_64BIT_ADDR ra, sym
-		addis     \ra,2,\sym@toc@ha
-		ld        \ra,\sym@toc@l(\ra)
+		ld	\ra,(\sym)@got(2)
         .endm
 
         .section .rodata

+ 1 - 1
rtl/go32v2/Makefile

@@ -933,7 +933,7 @@ ifdef NO_EXCEPTIONS_IN_SYSTEM
 override FPCOPT+=-dNO_EXCEPTIONS_IN_SYSTEM
 endif
 ifeq ($(CPU_OS_TARGET),i386-go32v2)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(GO32UNIT) $(DPMIEXCPUNIT) $(INITCUNIT) $(PORTSUNIT) $(PROFILEUNIT) $(DXETYPEUNIT) $(DXELOADUNIT) $(EMU387UNIT) $(DOSUNIT) $(CMEMUNIT) $(SORTBASEUNIT) $(SYSUTILSUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(CTYPESUNIT) $(FGLUNIT) $(MSMOUSEUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(CHARACTERUNIT) $(FPWIDESTRINGUNIT) $(UNICODEDATAUNIT) $(TYPESUNIT) $(SYSCONSTUNIT) $(RTLCONSTSUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT) $(UFLOAT128UNIT)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(GO32UNIT) $(DPMIEXCPUNIT) $(INITCUNIT) $(PORTSUNIT) $(PROFILEUNIT) $(DXETYPEUNIT) $(DXELOADUNIT) $(EMU387UNIT) $(DOSUNIT) $(CMEMUNIT) $(SORTBASEUNIT) $(SYSUTILSUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(CTYPESUNIT) $(FGLUNIT) $(MSMOUSEUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(CHARACTERUNIT) $(FPWIDESTRINGUNIT) $(UNICODEDATAUNIT) $(TYPESUNIT) $(SYSCONSTUNIT) $(RTLCONSTSUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT) $(UFLOAT128UNIT)
 endif
 ifeq ($(CPU_OS_TARGET),i386-go32v2)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS)

+ 1 - 1
rtl/go32v2/Makefile.fpc

@@ -9,7 +9,7 @@ units=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(E
       $(GO32UNIT) $(DPMIEXCPUNIT) $(INITCUNIT) $(PORTSUNIT) $(PROFILEUNIT) $(DXETYPEUNIT) $(DXELOADUNIT) $(EMU387UNIT) \
       $(DOSUNIT) $(CMEMUNIT) $(SORTBASEUNIT) \
       $(SYSUTILSUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) \
-      $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(CTYPESUNIT) $(FGLUNIT) \
+      $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(CTYPESUNIT) $(FGLUNIT) \
       $(MSMOUSEUNIT) $(CHARSETUNIT) $(CPALLUNIT) \
       $(CHARACTERUNIT) $(FPWIDESTRINGUNIT) $(UNICODEDATAUNIT) \
       $(TYPESUNIT) $(SYSCONSTUNIT) $(RTLCONSTSUNIT) \

+ 1 - 1
rtl/haiku/Makefile

@@ -926,7 +926,7 @@ DYNLIBSINCDIR=$(UNIXINC)
 TTHREADINCDIR=$(UNIXINC)
 ifeq ($(ARCH),i386)
 LOADERS=cprt0 dllcprt0
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 ifeq ($(ARCH),x86_64)
 LOADERS=

+ 1 - 1
rtl/haiku/Makefile.fpc

@@ -61,7 +61,7 @@ TTHREADINCDIR=$(UNIXINC)
 
 ifeq ($(ARCH),i386)
 LOADERS=cprt0 dllcprt0
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 
 ifeq ($(ARCH),x86_64)

+ 0 - 1
rtl/inc/generic.inc

@@ -14,7 +14,6 @@
 
  **********************************************************************}
 
-
 function align(addr : PtrUInt;alignment : PtrUInt) : PtrUInt;{$ifdef SYSTEMINLINE}inline;{$endif}
   var
     tmp,am1 : PtrUInt;

+ 17 - 0
rtl/inc/heap.inc

@@ -794,7 +794,17 @@ type
         writeln(f);
         if pVarHeader(p - VarHeaderSize)^.ch.h and LastFlag <> 0 then
           break;
+        if pVarHeader(p - VarHeaderSize)^.ch.h and VarSizeMask = 0 then
+        begin
+          writeln(f,'ERROR: block size is zero, cannot find the next block!');
+          break;
+        end;
         p := p + pVarHeader(p - VarHeaderSize)^.ch.h and VarSizeMask;
+        if p > ((pointer(vOs) + (VarOSChunkDataOffset + VarHeaderSize)) + vOs^.size) then
+        begin
+          writeln(f,'ERROR: previous tail points to ',HexStr(p),' which is outside of this OS chunk!');
+          break;
+        end;
       until false;
       needLE := true;
       vOs := vOs^.next;
@@ -1693,6 +1703,13 @@ type
       p := pointer(vOs) + (VarOSChunkDataOffset + VarHeaderSize);
       repeat
         h := pVarHeader(p - VarHeaderSize)^.ch.h;
+        { bail out if the next pointer points outside of the allocated OS chunk,
+          or if the size is zero, so the next block would point to ourselves }
+        if (h and VarSizeMask = 0) or
+          ((p + (h and VarSizeMask)) > (pointer(vOs) + (VarOSChunkDataOffset + VarHeaderSize)) + vOs^.size) then
+        begin
+          RunError(203);
+        end;
         if (h and UsedFlag = 0) and (h >= MinSearchableVarHeaderAndPayload) then
           gs.varFree.Add(p, pFreeVarChunk(p)^.binIndex);
         inc(p, h and VarSizeMask);

+ 1 - 1
rtl/inc/systemh.inc

@@ -913,7 +913,7 @@ procedure FillQWord(var x;count:SizeInt;value:QWord); {$if defined(cpui386) and
 function  IndexChar(const buf;len:SizeInt;b:ansichar):SizeInt;
 function  IndexChar(const buf;len:SizeInt;b:widechar):SizeInt;
 function  IndexByte(const buf;len:SizeInt;b:byte):SizeInt; {$if defined(cpui386) and not defined(CPUX86_HAS_SSE2)} inline; {$endif}
-function  Indexword(const buf;len:SizeInt;b:word):SizeInt; {$if defined(cpui386) and not defined(CPUX86_HAS_SSE2)} inline; {$endif}
+function  IndexWord(const buf;len:SizeInt;b:word):SizeInt; {$if defined(cpui386) and not defined(CPUX86_HAS_SSE2)} inline; {$endif}
 function  IndexDWord(const buf;len:SizeInt;b:DWord):SizeInt; {$if defined(cpui386) and not defined(CPUX86_HAS_SSE2)} inline; {$endif}
 function  IndexQWord(const buf;len:SizeInt;b:QWord):SizeInt; {$if (defined(cpui386) or defined(cpux86_64)) and not defined(CPUX86_HAS_SSE4_1)} inline; {$endif}
 function  CompareChar(const buf1,buf2;len:SizeInt):SizeInt;

+ 1 - 1
rtl/msxdos/Makefile.fpc

@@ -15,7 +15,7 @@ units=$(SYSTEMUNIT) si_prc $(UUCHARUNIT) $(OBJPASUNIT) $(ISO7185UNIT) $(STRINGSU
 #      $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(UNICODEDATAUNIT)
 #     $(CMEMUNIT)
 #      $(INITCUNIT) profile dxetype dxeload emu387 \
-#      $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) \
+#      $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) \
 #      vesamode \
 # rsts=$(MATHUNIT) $(TYPINFOUNIT) $(CLASSESUNIT) $(SYSCONSTUNIT) $(UNICODEDATAUNIT)
 implicitunits= $(CP_UNITS)

+ 1 - 1
rtl/nativent/Makefile

@@ -922,7 +922,7 @@ NDKINC=ndk
 UNITPREFIX=rtl
 CPU_UNITS=
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 ifeq ($(ARCH),x86_64)
 CPU_UNITS=$(X86UNIT) $(CPUUNIT)

+ 1 - 1
rtl/nativent/Makefile.fpc

@@ -55,7 +55,7 @@ UNITPREFIX=rtl
 CPU_UNITS=
 
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 
 ifeq ($(ARCH),x86_64)

+ 1 - 1
rtl/netware/Makefile

@@ -938,7 +938,7 @@ requestr.imp socklib.imp streams.imp threads.imp \
 tli.imp vollib.imp ws2_32.imp ws2nlm.imp unicode.imp \
 nwpre.imp
 ifeq ($(CPU_OS_TARGET),i386-netware)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(DOSUNIT) $(SYSCONSTUNIT) $(INITCUNIT) $(SYSUTILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CHARSETUNIT) $(CPALLUNIT)  $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) $(CTYPESUNIT)  $(TYPESUNIT) $(RTLCONSTSUNIT) $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(CMEMUNIT) aio nwsnut nwserv nwnit nwprot netware nwcalls nwpre $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT)       $(UFLOAT128UNIT)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(DOSUNIT) $(SYSCONSTUNIT) $(INITCUNIT) $(SYSUTILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CHARSETUNIT) $(CPALLUNIT)  $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) $(CTYPESUNIT)  $(TYPESUNIT) $(RTLCONSTSUNIT) $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(CMEMUNIT) aio nwsnut nwserv nwnit nwprot netware nwcalls nwpre $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT)       $(UFLOAT128UNIT)
 endif
 ifeq ($(CPU_OS_TARGET),i386-netware)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS) $(UNICODEDATAUNIT)

+ 1 - 1
rtl/netware/Makefile.fpc

@@ -10,7 +10,7 @@ loaders=nwpre prelude
 units=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) \
       $(DOSUNIT) $(SYSCONSTUNIT) \
       $(INITCUNIT) $(SYSUTILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) \
-      $(CHARSETUNIT) $(CPALLUNIT)  $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) \
+      $(CHARSETUNIT) $(CPALLUNIT)  $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) \
       $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) \
       $(CTYPESUNIT)  $(TYPESUNIT) $(RTLCONSTSUNIT) \
       $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(CMEMUNIT) \

+ 1 - 1
rtl/netwlibc/Makefile

@@ -926,7 +926,7 @@ CREATESMART=1
 OBJPASDIR=$(RTL)/objpas
 override BINUTILSPREFIX=$(CPU_TARGET)-netware-
 ifeq ($(CPU_OS_TARGET),i386-netwlibc)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT)  $(HEAPTRCUNIT) nwsnut libc $(DOSUNIT) $(SYSCONSTUNIT) $(INITCUNIT) $(SYSUTILSUNIT) $(TYPESUNIT) $(TYPINFOUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(RTLCONSTSUNIT) $(MATHUNIT) $(DYNLIBSUNIT) $(CMEMUNIT) $(CTYPESUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT) $(UFLOAT128UNIT)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT)  $(HEAPTRCUNIT) nwsnut libc $(DOSUNIT) $(SYSCONSTUNIT) $(INITCUNIT) $(SYSUTILSUNIT) $(TYPESUNIT) $(TYPINFOUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(RTLCONSTSUNIT) $(MATHUNIT) $(DYNLIBSUNIT) $(CMEMUNIT) $(CTYPESUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT) $(UFLOAT128UNIT)
 endif
 ifeq ($(CPU_OS_TARGET),i386-netwlibc)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS)

+ 1 - 1
rtl/netwlibc/Makefile.fpc

@@ -11,7 +11,7 @@ units=$(SYSTEMUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(E
       $(LINEINFOUNIT) $(LNFODWRFUNIT)  $(HEAPTRCUNIT) \
       nwsnut libc $(DOSUNIT) $(SYSCONSTUNIT) \
       $(INITCUNIT) $(SYSUTILSUNIT) $(TYPESUNIT) $(TYPINFOUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) \
-      $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) \
+      $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) \
       $(CHARSETUNIT) $(CPALLUNIT) \
       $(RTLCONSTSUNIT) $(MATHUNIT) \
       $(DYNLIBSUNIT) $(CMEMUNIT) $(CTYPESUNIT) \

+ 1 - 1
rtl/openbsd/Makefile

@@ -944,7 +944,7 @@ ifeq ($(ARCH),x86_64)
 CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT)
 endif
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 OBJPASDIR=$(RTL)/objpas
 ifeq ($(CPU_OS_TARGET),i386-openbsd)

+ 2 - 2
rtl/openbsd/Makefile.fpc

@@ -45,7 +45,7 @@ libunits=$(SYSTEMUNIT) $(OBJPASUNIT) $(STRINGSUNIT) \
       $(UNIXUNIT)  \
       $(DOSUNIT)  \
       $(SYSUTILSUNIT) $(TYPINFOUNIT) $(MATHUNIT) \
-      $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) \
+      $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) \
       $(ERRORSUNIT)
 
 [prerules]
@@ -87,7 +87,7 @@ ifeq ($(ARCH),x86_64)
 CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT)
 endif
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 
 # Paths

+ 1 - 1
rtl/os2/Makefile

@@ -930,7 +930,7 @@ RTLCONSTSUNIT=rtlconst
 endif
 OBJPASDIR=$(RTL)/objpas
 ifeq ($(CPU_OS_TARGET),i386-os2)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(PORTSUNIT) $(OS2DEFUNIT) $(DOSCALLSUNIT) $(DOSCALL2UNIT) $(KBDCALLSUNIT) $(MOUCALLSUNIT) $(VIOCALLSUNIT) $(SO32DLLUNIT) $(PMBITMAPUNIT) $(PMWINUNIT) $(PMGPIUNIT) $(PMSTDDLGUNIT) $(PMHELPUNIT) $(PMDEVUNIT) $(PMSPLUNIT) $(PMSHLUNIT) $(PMWPUNIT) $(PMWSOCKUNIT) $(PMBIDI) $(DOSUNIT) $(SUSITILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(CPUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT)       $(UFLOAT128UNIT)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(PORTSUNIT) $(OS2DEFUNIT) $(DOSCALLSUNIT) $(DOSCALL2UNIT) $(KBDCALLSUNIT) $(MOUCALLSUNIT) $(VIOCALLSUNIT) $(SO32DLLUNIT) $(PMBITMAPUNIT) $(PMWINUNIT) $(PMGPIUNIT) $(PMSTDDLGUNIT) $(PMHELPUNIT) $(PMDEVUNIT) $(PMSPLUNIT) $(PMSHLUNIT) $(PMWPUNIT) $(PMWSOCKUNIT) $(PMBIDI) $(DOSUNIT) $(SUSITILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(CPUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT)       $(UFLOAT128UNIT)
 endif
 ifeq ($(CPU_OS_TARGET),i386-os2)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS) $(UNICODEDATAUNIT)

+ 1 - 1
rtl/os2/Makefile.fpc

@@ -14,7 +14,7 @@ units=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(IS
       $(PMHELPUNIT) $(PMDEVUNIT) $(PMSPLUNIT) $(PMSHLUNIT) $(PMWPUNIT) $(PMWSOCKUNIT) $(PMBIDI) \
       $(DOSUNIT) \
       $(SUSITILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) \
-      $(CHARSETUNIT) $(CPALLUNIT) $(CPUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) \
+      $(CHARSETUNIT) $(CPALLUNIT) $(CPUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) \
       $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT) $(DYNLIBSUNIT) \
       $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) \
       $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) \

File diff ditekan karena terlalu besar
+ 566 - 2073
rtl/qnx/Makefile


+ 1 - 1
rtl/qnx/Makefile.fpc

@@ -9,7 +9,7 @@ main=rtl
 loaders=cprt0 crti crtn
 units=$(SYSTEMUNIT) $(UUCHARUNIT) $(DOSUNIT) $(OBJPASUNIT) $(STRINGSUNIT) \
       $(SYSUTILSUNIT) $(TYPINFOUNIT) $(MATHUNIT) \
-      $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) posix
+      $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) posix
 rsts=$(MATHUNIT) $(TYPINFOUNIT)
 
 [require]

+ 1 - 1
rtl/solaris/Makefile

@@ -929,7 +929,7 @@ TERMIO_DEPS_OS=$(UNIXTYPEUNIT)$(PPUEXT)
 SYSUTILSDIR=$(UNIXINC)
 SYSUTILS_DEPS_OS = $(UNIXUNIT)$(PPUEXT) $(ERRORSUNIT)$(PPUEXT)
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 ifeq ($(ARCH),x86_64)
 CPU_UNITS=$(CPUUNIT)

+ 1 - 1
rtl/solaris/Makefile.fpc

@@ -69,7 +69,7 @@ SYSUTILS_DEPS_OS = $(UNIXUNIT)$(PPUEXT) $(ERRORSUNIT)$(PPUEXT)
 
 
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 
 ifeq ($(ARCH),x86_64)

+ 1 - 1
rtl/symbian/Makefile

@@ -925,7 +925,7 @@ RTLCONSTSUNIT=rtlconst
 endif
 OBJPASDIR=$(RTL)/objpas
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 ifeq ($(ARCH),arm)
 CPU_UNITS=$(CPUUNIT) $(INTRINSICSUNIT)

+ 1 - 1
rtl/symbian/Makefile.fpc

@@ -44,7 +44,7 @@ endif
 OBJPASDIR=$(RTL)/objpas
 
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 endif
 
 ifeq ($(ARCH),arm)

+ 3 - 0
rtl/unix/classes.pp

@@ -41,6 +41,9 @@ unit Classes;
 
 interface
 
+{$ifdef NO_FPC_USE_INTRINSICS}
+  {$undef FPC_USE_INTRINSICS}
+{$endif}
 {$IFDEF FPC_DOTTEDUNITS}
 uses
   System.SysUtils,

+ 1 - 1
rtl/watcom/Makefile

@@ -929,7 +929,7 @@ override FPCOPT+=-dEXCEPTIONS_IN_SYSTEM
 endif
 override FPCOPT+=-dNO_EXCEPTIONS_IN_SYSTEM
 ifeq ($(CPU_OS_TARGET),i386-watcom)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(WATCOMUNIT) $(DOSUNIT) $(SYSUTILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT)  $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT)       $(UFLOAT128UNIT)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) $(WATCOMUNIT) $(DOSUNIT) $(SYSUTILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) $(CHARSETUNIT) $(CPALLUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT)  $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) $(SOFTFPUUNIT) $(SFPUX80UNIT) $(UFLOATX80UNIT) $(SFPU128UNIT)       $(UFLOAT128UNIT)
 endif
 ifeq ($(CPU_OS_TARGET),i386-watcom)
 override TARGET_IMPLICITUNITS+=$(EXEINFOUNIT) $(CP_UNITS) $(UNICODEDATAUNIT)

+ 1 - 1
rtl/watcom/Makefile.fpc

@@ -12,7 +12,7 @@ loaders=prt0
 units=$(SYSTEMUNIT) $(UUCHARUNIT) $(CTYPESUNIT) $(OBJPASUNIT) $(MACPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) $(STRINGSUNIT) \
       $(WATCOMUNIT) $(DOSUNIT) \
       $(SYSUTILSUNIT) $(SORTBASEUNIT) $(FGLUNIT) $(CLASSESUNIT) $(MATHUNIT) $(TYPINFOUNIT) \
-      $(CHARSETUNIT) $(CPALLUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICS) $(GETOPTSUNIT) \
+      $(CHARSETUNIT) $(CPALLUNIT) $(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT) $(GETOPTSUNIT) \
       $(HEAPTRCUNIT) $(LINEINFOUNIT) $(LNFODWRFUNIT)  \
       $(TYPESUNIT) $(RTLCONSTSUNIT) $(SYSCONSTUNIT) \
       $(FPWIDESTRINGUNIT) $(CHARACTERUNIT) \

+ 4 - 2
rtl/win32/buildrtl.pp

@@ -11,7 +11,8 @@ unit buildrtl;
       TP.DOS, WinApi.Messages,
       System.RtlConsts, System.SysConst, System.SysUtils, System.Math, System.Types,
       System.TypInfo, System.FGL, System.Classes,    
-      System.CPU, System.CPU.MMX, System.CharSet, System.Character, System.GetOpts,
+      System.CPU, System.CPU.MMX, System.Intrinsics,
+      System.CharSet, System.Character, System.GetOpts,
       System.FPWideString,
       WinApi.WinSysUt, WinApi.ShareMem, fpintres, WinApi.WinDirs,
       System.SoftFPU, System.SoftFpuX80, System.SoftFpu128, System.UFloatX80, System.UFloat128;
@@ -24,7 +25,8 @@ unit buildrtl;
       dos, messages,
       rtlconsts, sysconst, sysutils, math, types,
       typinfo, fgl, classes,
-      cpu, mmx, charset, character, getopts,
+      cpu, mmx, intrinsics,
+      charset, character, getopts,
       fpwidestring,
       winsysut, sharemem, fpintres, windirs,
       softfpu, sfpux80, sfpu128, ufloatx80, ufloat128;

+ 1 - 1
rtl/wince/Makefile

@@ -925,7 +925,7 @@ ifeq ($(ARCH),arm)
 CPU_UNITS=$(INTRINSICSUNIT)
 endif
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 CPU_DEPS_CPU=$(SYSUTILSUNIT)$(PPUEXT)
 MMX_DEPS_CPU=$(CPUUNIT)$(PPUEXT)
 endif

+ 1 - 1
rtl/wince/Makefile.fpc

@@ -58,7 +58,7 @@ ifeq ($(ARCH),arm)
 CPU_UNITS=$(INTRINSICSUNIT)
 endif
 ifeq ($(ARCH),i386)
-CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICS)
+CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(INTRINSICSUNIT)
 CPU_DEPS_CPU=$(SYSUTILSUNIT)$(PPUEXT)
 MMX_DEPS_CPU=$(CPUUNIT)$(PPUEXT)
 endif

+ 11 - 0
tests/tbs/tb0725.pp

@@ -0,0 +1,11 @@
+{ %RECOMPILE }
+{ %NORUN }
+
+program tb0725;
+
+uses
+  ub0725;
+
+begin
+
+end.

+ 41 - 0
tests/tbs/tb0726.pp

@@ -0,0 +1,41 @@
+{ %NORUN }
+
+program tb0726;
+
+{$mode objfpc}{$H+}
+
+type
+  generic TTest1<T> = class
+    procedure Test;
+  end;
+
+  generic TTest2<T> = class
+    procedure Test;
+  end;
+
+procedure TTest1.Test;
+begin
+end;
+
+procedure Test;
+type
+  TArr = packed array [0..1] of Single;
+  TTest1Arr = specialize TTest1<TArr>;
+  TTest2Arr = specialize TTest2<TArr>;
+var
+  a: TTest1Arr;
+  b: TTest2Arr;
+begin
+  a := TTest1Arr.Create;
+  a.Free;
+  b := TTest2Arr.Create;
+  b.Free;
+end;
+
+procedure TTest2.Test;
+begin
+end;
+
+begin
+
+end.

+ 39 - 0
tests/tbs/ub0725.pp

@@ -0,0 +1,39 @@
+unit ub0725;
+
+{$mode objfpc}{$H+}
+{$modeswitch advancedrecords}
+
+interface
+
+type
+  TValue = record
+    f: Pointer;
+    generic class function From<T>(constref aValue: T): TValue; static;
+  end;
+
+procedure Test;
+
+implementation
+
+var
+  { trigger creation of init and fini procs }
+  s: String = 'Hello World';
+
+generic class function TValue.From<T>(constref aValue: T): TValue;
+begin
+  Result.f := TypeInfo(T);
+end;
+
+procedure Test;
+type
+  TArr = array[0..0] of LongInt;
+var
+  v: TValue;
+  arr: TArr;
+begin
+  arr[0] := 42;
+  v := TValue.specialize From<TArr>(arr);
+end;
+
+end.
+

+ 20 - 0
tests/test/tpushpop4.pp

@@ -0,0 +1,20 @@
+program tpushpop1;
+
+type
+{$MinEnumSize 1}
+  TTest1 = (t1One, t1Two, t1Three);
+{$pushopt}
+{$MinEnumSize 2}
+  TTest2 = (t2One, t2Two, t2Three);
+{$popopt}
+  TTest3 = (t3One, t3Two, t3Three);
+
+begin
+  if SizeOf(TTest1) <> 1 then
+    Halt(1);
+  if SizeOf(TTest2) <> 2 then
+    Halt(2);
+  if SizeOf(TTest3) <> 1 then
+    Halt(3);
+  Writeln('ok');
+end.

+ 358 - 0
tests/test/units/dateutil/tincdatetime1.pp

@@ -0,0 +1,358 @@
+program incdatetime_tests;
+
+{$mode objfpc}
+
+uses
+  SysUtils, Math, DateUtils;
+
+const
+  FMT = 'yyyy-mm-dd hh:nn:ss';
+
+  TDateTimeEpsilon = 2.2204460493e-16;  // Copied from FPC 3.3.1 where it is not public
+
+var
+  DateTimeEpsilon_Info: String = '';
+  errorcount : Integer = 0;
+
+
+procedure IncWeek_Test;
+
+  procedure Test(ADateTime: TDateTime; AddWeeks: Integer; Expected: String);
+  var
+    EndDateTime: TDateTime;
+    t1, t2: String;
+  begin
+    EndDateTime := IncWeek(ADateTime, AddWeeks);
+    t1 := FormatDateTime(FMT, ADateTime);
+    t2 := FormatDateTime(FMT, EndDateTime);
+    Write(t1);
+    if AddWeeks > 0 then Write(' + ') else Write(' - ');
+    Write(abs(AddWeeks):5, ' weeks --> ', t2, ', Expected: ', Expected);
+    Write(' Diff: ', WeeksBetween(ADateTime, EndDateTime):5);
+        if t2 = Expected then
+      WriteLn(' --> OK')
+    else
+      begin
+        WriteLn(' --> ERROR');
+        inc(errorcount);
+      end;
+  end;
+
+begin
+  WriteLn('*** TESTING IncWeek ***', DateTimeEpsilon_Info);
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31, 0,0,0,0),      1, '1900-01-07 00:00:00');
+  Test(EncodeDateTime(1899,12,31, 0,0,0,0),    -52, '1899-01-01 00:00:00');
+  Test(EncodeDateTime(1899,12,31, 0,0,0,0), -10000, '1708-05-06 00:00:00');
+  Test(EncodeDateTime(1899,12,31, 0,0,0,0),  -9999, '1708-05-13 00:00:00');
+  Test(EncodeDateTime(1899,12,31, 0,0,0,0),  -9998, '1708-05-20 00:00:00');
+
+  Test(EncodeDateTime(1899,12,30, 0,0,0,0),      1, '1900-01-06 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 0,0,0,0),    -52, '1898-12-31 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 0,0,0,0), -10000, '1708-05-05 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 0,0,0,0),  -9999, '1708-05-12 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 0,0,0,0),  -9998, '1708-05-19 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 0,0,0,0),  -1171, '1877-07-21 00:00:00');
+  WriteLn('--------------------------------------------------------------------------------');
+  WriteLn;
+end;
+
+procedure IncDay_Test;
+
+  procedure Test(ADateTime: TDateTime; AddDays: Integer; Expected: String);
+  var
+    EndDateTime: TDateTime;
+    t1, t2: String;
+  begin
+    EndDateTime := IncDay(ADateTime, AddDays);
+    t1 := FormatDateTime(FMT, ADateTime);
+    t2 := FormatDateTime(FMT, EndDateTime);
+    Write(t1);
+    if AddDays > 0 then Write(' + ') else Write(' - ');
+    Write(abs(AddDays):4, ' days --> ', t2, ', Expected: ', Expected);
+    Write(' Diff: ', DaysBetween(ADateTime, EndDateTime):4);
+    if t2 = Expected then
+      WriteLn(' --> OK')
+    else
+      begin
+        WriteLn(' --> ERROR');
+        inc(errorcount);
+      end;
+  end;
+
+begin
+  WriteLn('*** TESTING IncDay ***', DateTimeEpsilon_Info);
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31,  0,0,0,0),     1, '1900-01-01 00:00:00');
+  Test(EncodeDateTime(1877,07,26,  0,0,0,0),  8193, '1899-12-31 00:00:00');
+  Test(EncodeDateTime(1877,07,26,  6,0,0,0),  8193, '1899-12-31 06:00:00');
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31,  0,0,0,0),    -1, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899,12,31,  0,0,0,0), -8192, '1877-07-27 00:00:00');
+  Test(EncodeDateTime(1899,12,31,  0,0,0,0), -8193, '1877-07-26 00:00:00');
+  Test(EncodeDateTime(1899,12,30,  0,0,0,0),    -1, '1899-12-29 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 6,30,0,0),    -1, '1899-12-29 06:30:00');
+  Test(EncodeDateTime(1899,12,30,  0,0,0,0), -8193, '1877-07-25 00:00:00');
+  Test(EncodeDateTime(1899,12,30,  6,0,0,0), -8193, '1877-07-25 06:00:00');
+  WriteLn('--------------------------------------------------------------------------------');
+  WriteLn;
+end;
+
+procedure IncHour_Test;
+
+  procedure Test(ADateTime: TDateTime; AddHours: Integer; Expected: String);
+  var
+    EndDateTime: TDateTime;
+    t1, t2: String;
+  begin
+    EndDateTime := IncHour(ADateTime, AddHours);
+    t1 := FormatDateTime(FMT, ADateTime);
+    t2 := FormatDateTime(FMT, EndDateTime);
+    Write(t1);
+    if AddHours > 0 then Write(' + ') else Write(' - ');
+    Write(abs(AddHours):4, ' hrs --> ', t2, ', Expected: ', Expected);
+    Write(' Diff: ', HoursBetween(ADateTime, EndDateTime):4);
+    if t2 = Expected then
+      WriteLn(' --> OK')
+    else
+      begin
+        WriteLn(' --> ERROR');
+        inc(errorcount);
+      end;
+  end;
+
+begin
+  WriteLn('*** TESTING IncHour ***', DateTimeEpsilon_Info);
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31, 23,0,0,0), 1, '1900-01-01 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 23,0,0,0), 1, '1899-12-31 00:00:00');
+  Test(EncodeDateTime(1899,12,29, 23,0,0,0), 1, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899,12,28, 23,0,0,0), 1, '1899-12-29 00:00:00');
+  Test(EncodeDateTime(1899,12,27, 23,0,0,0), 1, '1899-12-28 00:00:00');
+  Test(EncodeDateTime(1899,12,26, 23,0,0,0), 1, '1899-12-27 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,25, 23,0,0,0), 1, '1899-12-26 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,24, 23,0,0,0), 1, '1899-12-25 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,23, 23,0,0,0), 1, '1899-12-24 00:00:00');
+  Test(EncodeDateTime(1899,12,22, 23,0,0,0), 1, '1899-12-23 00:00:00');
+  Test(EncodeDateTime(1899,12,21, 23,0,0,0), 1, '1899-12-22 00:00:00');
+  Test(EncodeDateTime(1899,12,20, 23,5,0,0), 1, '1899-12-21 00:05:00');
+  Test(EncodeDateTime(1899,12,29, 15,0,0,0), 9, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899, 1, 1, 15,0,0,0), 1, '1899-01-01 16:00:00');
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31,  1,0,0,0),-1, '1899-12-31 00:00:00');
+  Test(EncodeDateTime(1899,12,30,  1,0,0,0),-1, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899,12,29,  1,0,0,0),-1, '1899-12-29 00:00:00');
+  Test(EncodeDateTime(1899,12,28,  1,0,0,0),-1, '1899-12-28 00:00:00');
+  Test(EncodeDateTime(1899,12,27,  1,0,0,0),-1, '1899-12-27 00:00:00');
+  Test(EncodeDateTime(1899,12,26,  1,0,0,0),-1, '1899-12-26 00:00:00');
+  Test(EncodeDateTime(1899,12,25,  1,0,0,0),-1, '1899-12-25 00:00:00');
+  Test(EncodeDateTime(1899,12,24,  1,0,0,0),-1, '1899-12-24 00:00:00');
+  Test(EncodeDateTime(1899,12,23,  1,0,0,0),-1, '1899-12-23 00:00:00');
+  Test(EncodeDateTime(1899,12,22,  1,0,0,0),-1, '1899-12-22 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,21,  1,0,0,0),-1, '1899-12-21 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,20,  1,0,0,0),-1, '1899-12-20 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,19,  1,0,0,0),-1, '1899-12-19 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,18,  1,5,0,0),-1, '1899-12-18 00:05:00');   // Error
+  WriteLn('--------------------------------------------------------------------------------');
+  WriteLn;
+end;
+
+procedure IncMinute_Test;
+
+  procedure Test(ADateTime: TDateTime; AddMins: Integer; Expected: String);
+  var
+    EndDateTime: TDateTime;
+    t1, t2: String;
+  begin
+    EndDateTime := IncMinute(ADateTime, AddMins);
+    t1 := FormatDateTime(FMT, ADateTime);
+    t2 := FormatDateTime(FMT, EndDateTime);
+    Write(t1);
+    if AddMins > 0 then Write(' + ') else Write(' - ');
+    Write(abs(addMins):4, ' mins --> ', t2, ', Expected: ', Expected);
+    Write(' Diff: ', MinutesBetween(ADateTime, EndDateTime):4);
+    if t2 = Expected then
+      WriteLn(' --> OK')
+    else
+      begin
+        WriteLn(' --> ERROR');
+        inc(errorcount);
+      end;
+  end;
+
+begin
+  WriteLn(' *** TESTING IncMinute ***', DateTimeEpsilon_Info);
+  WriteLn;
+  // Add 20 and 40 minutes -- result must be start of next hour
+  Test(EncodeDateTime(1899,12,30, 23,20,0,0), 40, '1899-12-31 00:00:00');
+
+  Test(EncodeDateTime(1899,12,31, 23,0,0,0), 60, '1900-01-01 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 23,0,0,0), 60, '1899-12-31 00:00:00');
+  Test(EncodeDateTime(1899,12,29, 23,0,0,0), 60, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899,12,28, 23,0,0,0), 60, '1899-12-29 00:00:00');
+  Test(EncodeDateTime(1899,12,27, 23,0,0,0), 60, '1899-12-28 00:00:00');
+  Test(EncodeDateTime(1899,12,26, 23,0,0,0), 60, '1899-12-27 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,25, 23,0,0,0), 60, '1899-12-26 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,24, 23,0,0,0), 60, '1899-12-25 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,23, 23,0,0,0), 60, '1899-12-24 00:00:00');
+  Test(EncodeDateTime(1899,12,22, 23,0,0,0), 60, '1899-12-23 00:00:00');
+  Test(EncodeDateTime(1899,12,21, 23,0,0,0), 60, '1899-12-22 00:00:00');
+  Test(EncodeDateTime(1899,12,20, 23,5,1,0), 60, '1899-12-21 00:05:01');
+  Test(EncodeDateTime(1898,12,30,  1,20,0,0),40, '1898-12-30 02:00:00');
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31,  1,0,0,0),-60, '1899-12-31 00:00:00');
+  Test(EncodeDateTime(1899,12,30,  1,0,0,0),-60, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899,12,29,  1,0,0,0),-60, '1899-12-29 00:00:00');
+  Test(EncodeDateTime(1899,12,28,  1,0,0,0),-60, '1899-12-28 00:00:00');
+  Test(EncodeDateTime(1899,12,27,  1,0,0,0),-60, '1899-12-27 00:00:00');
+  Test(EncodeDateTime(1899,12,26,  1,0,0,0),-60, '1899-12-26 00:00:00');
+  Test(EncodeDateTime(1899,12,25,  1,0,0,0),-60, '1899-12-25 00:00:00');
+  Test(EncodeDateTime(1899,12,24,  1,0,0,0),-60, '1899-12-24 00:00:00');
+  Test(EncodeDateTime(1899,12,23,  1,0,0,0),-60, '1899-12-23 00:00:00');
+  Test(EncodeDateTime(1899,12,22,  1,0,0,0),-60, '1899-12-22 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,21,  1,0,0,0),-60, '1899-12-21 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,20,  1,0,0,0),-60, '1899-12-20 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,19,  1,0,0,0),-60, '1899-12-19 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,18,  1,5,1,0),-60, '1899-12-18 00:05:01');   // Error
+  WriteLn('--------------------------------------------------------------------------------');
+  WriteLn;
+end;
+
+procedure IncSecond_Test;
+
+  procedure Test(ADateTime: TDateTime; AddSeconds: Integer; Expected: String);
+  var
+    EndDateTime: TDateTime;
+    t1, t2: String;
+  begin
+    EndDateTime := IncSecond(ADateTime, AddSeconds);
+    t1 := FormatDateTime(FMT, ADateTime);
+    t2 := FormatDateTime(FMT, EndDateTime);
+    Write(t1);
+    if AddSeconds > 0 then Write(' + ') else Write(' - ');
+    Write(abs(AddSeconds):5, ' secs --> ', t2, ', Expected: ', Expected);
+    Write(' Diff: ', SecondsBetween(ADateTime, EndDateTime):5);
+    if t2 = Expected then
+      WriteLn(' --> OK')
+    else
+      begin
+        WriteLn(' --> ERROR');
+        inc(errorcount);
+      end;
+  end;
+
+begin
+  WriteLn(' *** TESTING IncSecond ***', DateTimeEpsilon_Info);
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31, 23,0,0,0), 3600, '1900-01-01 00:00:00');   // 3600 sec = 1 hour
+  Test(EncodeDateTime(1899,12,30, 23,0,0,0), 3600, '1899-12-31 00:00:00');
+  Test(EncodeDateTime(1899,12,29, 23,0,0,0), 3600, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899,12,28, 23,0,0,0), 3600, '1899-12-29 00:00:00');
+  Test(EncodeDateTime(1899,12,27, 23,0,0,0), 3600, '1899-12-28 00:00:00');
+  Test(EncodeDateTime(1899,12,26, 23,0,0,0), 3600, '1899-12-27 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,25, 23,0,0,0), 3600, '1899-12-26 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,24, 23,0,0,0), 3600, '1899-12-25 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,23, 23,0,0,0), 3600, '1899-12-24 00:00:00');
+  Test(EncodeDateTime(1899,12,22, 23,0,0,0), 3600, '1899-12-23 00:00:00');
+  Test(EncodeDateTime(1899,12,21, 23,0,0,0), 3600, '1899-12-22 00:00:00');
+  Test(EncodeDateTime(1899,12,20, 23,5,1,0), 3600, '1899-12-21 00:05:01');
+  Test(EncodeDateTime(1899,12,20, 23,5,1,0),   59, '1899-12-20 23:06:00');
+  Test(EncodeDateTime(1899,12,29, 23,59,42,0), 18, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899,12,30, 23,59,33,0), 27, '1899-12-31 00:00:00');
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31,  1,0,0,0),-3600, '1899-12-31 00:00:00');
+  Test(EncodeDateTime(1899,12,30,  1,0,0,0),-3600, '1899-12-30 00:00:00');
+  Test(EncodeDateTime(1899,12,29,  1,0,0,0),-3600, '1899-12-29 00:00:00');
+  Test(EncodeDateTime(1899,12,28,  1,0,0,0),-3600, '1899-12-28 00:00:00');
+  Test(EncodeDateTime(1899,12,27,  1,0,0,0),-3600, '1899-12-27 00:00:00');
+  Test(EncodeDateTime(1899,12,26,  1,0,0,0),-3600, '1899-12-26 00:00:00');
+  Test(EncodeDateTime(1899,12,25,  1,0,0,0),-3600, '1899-12-25 00:00:00');
+  Test(EncodeDateTime(1899,12,24,  1,0,0,0),-3600, '1899-12-24 00:00:00');
+  Test(EncodeDateTime(1899,12,23,  1,0,0,0),-3600, '1899-12-23 00:00:00');
+  Test(EncodeDateTime(1899,12,22,  1,0,0,0),-3600, '1899-12-22 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,21,  1,0,0,0),-3600, '1899-12-21 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,20,  1,0,0,0),-3600, '1899-12-20 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,19,  1,0,0,0),-3600, '1899-12-19 00:00:00');   // Error
+  Test(EncodeDateTime(1899,12,18,  1,5,1,0),-3600, '1899-12-18 00:05:01');   // Error
+  WriteLn('--------------------------------------------------------------------------------');
+  WriteLn;
+end;
+
+procedure IncMilliSecond_Test;
+
+  procedure Test(ADateTime: TDateTime; AddMilliSeconds: Integer; Expected: String);
+  var
+    EndDateTime: TDateTime;
+    t1, t2: String;
+  begin
+    EndDateTime := IncMilliSecond(ADateTime, AddMilliSeconds);
+    t1 := FormatDateTime(FMT+'.zzz', ADateTime);
+    t2 := FormatDateTime(FMT+'.zzz', EndDateTime);
+    Write(t1);
+    if AddMilliSeconds > 0 then Write(' + ') else Write(' - ');
+    Write(abs(AddMilliSeconds):7, ' ms --> ', t2, ', Expected: ', Expected);
+    Write(' Diff: ', MilliSecondsBetween(ADateTime, EndDateTime):7);
+    if t2 = Expected then
+      WriteLn(' --> OK')
+    else
+      begin
+        WriteLn(' --> ERROR');
+        inc(errorcount);
+      end;
+  end;
+
+begin
+  WriteLn(' *** TESTING IncMilliSecond ***', DateTimeEpsilon_Info);
+  WriteLn;
+  Test(EncodeDateTime(1899,12,29, 23,59,59,999),   1, '1899-12-30 00:00:00.000');
+  Test(EncodeDateTime(1899,12,30, 23,59,59,999),   1, '1899-12-31 00:00:00.000');
+  Test(EncodeDateTime(1899,12,31, 23,59,59,999),   1, '1900-01-01 00:00:00.000');
+  Test(EncodeDateTime(1899,12,31, 23,0,0,0), 3600000, '1900-01-01 00:00:00.000');   // 3600000 ms = 1 hour
+  Test(EncodeDateTime(1899,12,30, 23,0,0,0), 3600000, '1899-12-31 00:00:00.000');
+  Test(EncodeDateTime(1899,12,29, 23,0,0,0), 3600000, '1899-12-30 00:00:00.000');
+  Test(EncodeDateTime(1899,12,28, 23,0,0,0), 3600000, '1899-12-29 00:00:00.000');
+  Test(EncodeDateTime(1899,12,27, 23,0,0,0), 3600000, '1899-12-28 00:00:00.000');
+  Test(EncodeDateTime(1899,12,26, 23,0,0,0), 3600000, '1899-12-27 00:00:00.000');   // Error
+  Test(EncodeDateTime(1899,12,25, 23,0,0,0), 3600000, '1899-12-26 00:00:00.000');   // Error
+  Test(EncodeDateTime(1899,12,24, 23,0,0,0), 3600000, '1899-12-25 00:00:00.000');   // Error
+  Test(EncodeDateTime(1899,12,23, 23,0,0,0), 3600000, '1899-12-24 00:00:00.000');
+  Test(EncodeDateTime(1899,12,22, 23,0,0,0), 3600000, '1899-12-23 00:00:00.000');
+  Test(EncodeDateTime(1899,12,21, 23,0,0,0), 3600000, '1899-12-22 00:00:00.000');
+  Test(EncodeDateTime(1899,12,20,  1,0,0,700),   300, '1899-12-20 01:00:01.000');
+  Test(EncodeDateTime(1900,1, 1,  23,59,59,100), 900, '1900-01-02 00:00:00.000');
+  WriteLn;
+  Test(EncodeDateTime(1899,12,31,  0,0,0,0),      -1, '1899-12-30 23:59:59.999');
+  Test(EncodeDateTime(1899,12,30,  0,0,0,0),      -1, '1899-12-29 23:59:59.999');
+  Test(EncodeDateTime(1899,12,29,  0,0,0,0),      -1, '1899-12-28 23:59:59.999');
+  Test(EncodeDateTime(1899,12,31,  1,0,0,0),-3600000, '1899-12-31 00:00:00.000');
+  Test(EncodeDateTime(1899,12,30,  1,0,0,0),-3600000, '1899-12-30 00:00:00.000');
+  Test(EncodeDateTime(1899,12,29,  1,0,0,0),-3600000, '1899-12-29 00:00:00.000');
+  Test(EncodeDateTime(1899,12,28,  1,0,0,0),-3600000, '1899-12-28 00:00:00.000');
+  Test(EncodeDateTime(1899,12,27,  1,0,0,0),-3600000, '1899-12-27 00:00:00.000');
+  Test(EncodeDateTime(1899,12,26,  1,0,0,0),-3600000, '1899-12-26 00:00:00.000');
+  Test(EncodeDateTime(1899,12,25,  1,0,0,0),-3600000, '1899-12-25 00:00:00.000');
+  Test(EncodeDateTime(1899,12,24,  1,0,0,0),-3600000, '1899-12-24 00:00:00.000');
+  Test(EncodeDateTime(1899,12,23,  1,0,0,0),-3600000, '1899-12-23 00:00:00.000');
+  Test(EncodeDateTime(1899,12,22,  1,0,0,0),-3600000, '1899-12-22 00:00:00.000');   // Error
+  Test(EncodeDateTime(1899,12,21,  1,0,0,0),-3600000, '1899-12-21 00:00:00.000');   // Error
+  Test(EncodeDateTime(1899,12,20,  1,0,0,0),-3600000, '1899-12-20 00:00:00.000');   // Error
+  Test(EncodeDateTime(1899,12,19,  1,0,0,0),-3600000, '1899-12-19 00:00:00.000');   // Error
+  Test(EncodeDateTime(1899,12,30,  0,0,0,0),     -30, '1899-12-29 23:59:59.970');
+  Test(EncodeDateTime(1899,12,30,  0,0,1,29),    -30, '1899-12-30 00:00:00.999');
+  WriteLn('--------------------------------------------------------------------------------');
+  WriteLn;
+end;
+
+begin
+  Str(TDateTimeEpsilon, DateTimeEpsilon_Info);
+  DateTimeEpsilon_Info := ' (DateTimeEpsilon=' + DateTimeEpsilon_Info + ')';
+
+  IncWeek_Test;
+  IncDay_Test;
+  IncHour_Test;
+  IncMinute_Test;
+  IncSecond_Test;
+  IncMillisecond_Test;
+  WriteLn(errorcount,' errors encountered');
+  Halt(errorcount);
+end.

+ 10 - 1
utils/build/Makefile

@@ -2,7 +2,7 @@
 # Don't edit, this file is generated by FPCMake Version 2.0.0
 #
 default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded m68k-sinclairql m68k-human68k powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mipsel-ps1 mips64-linux mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-freebsd aarch64-darwin aarch64-win64 aarch64-embedded aarch64-iphonesim aarch64-android aarch64-ios wasm32-embedded wasm32-wasip1 wasm32-wasip1threads wasm32-wasip2 sparc64-linux riscv32-linux riscv32-embedded riscv32-freertos riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos z80-amstradcpc loongarch64-linux
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded m68k-sinclairql m68k-human68k powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-freebsd powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mipsel-ps1 mips64-linux mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-freebsd aarch64-darwin aarch64-win64 aarch64-embedded aarch64-iphonesim aarch64-android aarch64-ios wasm32-embedded wasm32-wasip1 wasm32-wasip1threads wasm32-wasip2 sparc64-linux riscv32-linux riscv32-embedded riscv32-freertos riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos z80-amstradcpc loongarch64-linux
 BSDs = freebsd netbsd openbsd darwin dragonfly
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari human68k
@@ -1817,6 +1817,15 @@ REQUIRE_PACKAGES_LIBTAR=1
 REQUIRE_PACKAGES_FPMKUNIT=1
 REQUIRE_PACKAGES_FCL-JSON=1
 endif
+ifeq ($(CPU_OS_TARGET),powerpc64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JSON=1
+endif
 ifeq ($(CPU_OS_TARGET),powerpc64-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_PASZLIB=1

+ 1 - 1
utils/fpcm/fpcmmain.pp

@@ -172,7 +172,7 @@ interface
         { amiga }   ( false, false, true,  true,  false, false, false, false, false, false, false, false, false, false, false,   false, false, false,  false, false, false,  false,  false, false, false),
         { atari }   ( false, false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false,  false, false, false,  false,  false, false, false),
         { solaris } ( false, true,  false, false, true,  true,  false, false, false, false, false, false, false, false, false,   false, false, false,  false, false, false,  false,  false, false, false),
-        { qnx }     ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false,  false, false, false,  false,  false, false, false),
+        { qnx }     ( false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false,  false, false, false,  false,  false, false, false),
         { netware } ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false,  false, false, false,  false,  false, false, false),
         { openbsd } ( false, true,  false, false, false, true,  false, false, false, false, false, false, false, false, false,   false, false, false,  false, false, false,  false,  false, false, false),
         { wdosx }   ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false,  false, false, false,  false,  false, false, false),

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini