Browse Source

* synchronize with trunk

git-svn-id: branches/unicodekvm@40315 -
nickysn 6 years ago
parent
commit
a138d08628

+ 5 - 6
compiler/Makefile

@@ -4220,6 +4220,7 @@ else
 INSTALLEXEFILE=$(EXENAME)
 endif
 PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 mips mipsel avr jvm i8086 aarch64 sparc64 riscv32 riscv64
+PPC_SUFFIXES=386 68k ppc sparc arm armeb x64 ppc64 mips mipsel avr jvm 8086 a64 sparc64 rv32 rv64
 INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
 SYMLINKINSTALL_TARGETS=$(addsuffix _symlink_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
 .PHONY: $(PPC_TARGETS) $(INSTALL_TARGETS)$(SYMLINKINSTALL_TARGETS)
@@ -4258,16 +4259,14 @@ ppuclean:
 tempclean:
 	-$(DEL) $(PPCROSSNAME) $(TEMPNAME) $(TEMPNAME1) $(TEMPNAME2) $(TEMPNAME3) $(MSG2INC) pp1.wpo pp2.wpo
 execlean :
-	-$(DEL) ppc386$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) ppcppc64$(EXEEXT) ppcsparc64$(EXEEXT)
-	-$(DEL) ppcarm$(EXEEXT) ppcavr$(EXEEXT) ppcmips$(EXEEXT) ppcmipsel$(EXEEXT) ppcjvm$(EXEEXT) ppc8086$(EXEEXT) ppca64$(EXEEXT)
-	-$(DEL) ppcross386$(EXEEXT) ppcross68k$(EXEEXT) ppcrossx64$(EXEEXT) ppcrossppc$(EXEEXT) ppcrosssparc$(EXEEXT) ppcrossppc64$(EXEEXT) ppcrosssparc64$(EXEEXT)
-	-$(DEL) ppcrossarm$(EXEEXT) ppcrossavr$(EXEEXT) ppcrossmips$(EXEEXT) ppcrossmipsel$(EXEEXT) ppcrossjvm$(EXEEXT) ppcross8086$(EXEEXT) ppcrossa64$(EXEEXT)
+	-$(DEL) $(addsuffix $(EXEEXT), $(addprefix ppc, $(PPC_SUFFIXES)))
+	-$(DEL) $(addsuffix $(EXEEXT), $(addprefix ppcross, $(PPC_SUFFIXES)))
 	-$(DEL) $(EXENAME) $(TEMPWPONAME1) $(TEMPWPONAME2)
 $(addsuffix _clean,$(ALLTARGETS)):
 	-$(DELTREE) $(addprefix $(subst _clean,,$@),/units)
+	-$(DELTREE) $(addprefix $(subst _clean,,$@),/bin)
 	-$(DEL) $(addprefix $(subst _clean,,$@)/,*$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT))
-	-$(DEL) $(addprefix $(subst _clean,,$@)/,ppc386$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) ppcarv$(EXEEXT) ppcsparc64$(EXEEXT))
-	-$(DEL) $(addprefix $(subst _clean,,$@)/,ppcppc64$(EXEEXT) ppcarm$(EXEEXT) ppcmips$(EXEEXT) ppcmipsel$(EXEEXT) ppcjvm$(EXEEXT) ppc8086$(EXEEXT) ppca64$(EXEEXT) $(EXENAME))
+	-$(DEL) $(addprefix $(subst _clean,,$@)/ppc,$(addsuffix $(EXEEXT), $(PPC_SUFFIXES)))
 cycleclean: cleanall $(addsuffix _clean,$(CPC_TARGET))
 	-$(DEL) $(EXENAME)
 clean: tempclean execlean cleanall $(addsuffix _clean,$(CPC_TARGET)) $(addsuffix _clean,$(TARGET_DIRS))

+ 5 - 6
compiler/Makefile.fpc

@@ -455,6 +455,7 @@ endif
 #####################################################################
 
 PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 mips mipsel avr jvm i8086 aarch64 sparc64 riscv32 riscv64
+PPC_SUFFIXES=386 68k ppc sparc arm armeb x64 ppc64 mips mipsel avr jvm 8086 a64 sparc64 rv32 rv64
 INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
 SYMLINKINSTALL_TARGETS=$(addsuffix _symlink_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
 
@@ -513,17 +514,15 @@ tempclean:
 	-$(DEL) $(PPCROSSNAME) $(TEMPNAME) $(TEMPNAME1) $(TEMPNAME2) $(TEMPNAME3) $(MSG2INC) pp1.wpo pp2.wpo
 
 execlean :
-	-$(DEL) ppc386$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) ppcppc64$(EXEEXT) ppcsparc64$(EXEEXT)
-	-$(DEL) ppcarm$(EXEEXT) ppcavr$(EXEEXT) ppcmips$(EXEEXT) ppcmipsel$(EXEEXT) ppcjvm$(EXEEXT) ppc8086$(EXEEXT) ppca64$(EXEEXT)
-	-$(DEL) ppcross386$(EXEEXT) ppcross68k$(EXEEXT) ppcrossx64$(EXEEXT) ppcrossppc$(EXEEXT) ppcrosssparc$(EXEEXT) ppcrossppc64$(EXEEXT) ppcrosssparc64$(EXEEXT)
-	-$(DEL) ppcrossarm$(EXEEXT) ppcrossavr$(EXEEXT) ppcrossmips$(EXEEXT) ppcrossmipsel$(EXEEXT) ppcrossjvm$(EXEEXT) ppcross8086$(EXEEXT) ppcrossa64$(EXEEXT)
+	-$(DEL) $(addsuffix $(EXEEXT), $(addprefix ppc, $(PPC_SUFFIXES)))
+	-$(DEL) $(addsuffix $(EXEEXT), $(addprefix ppcross, $(PPC_SUFFIXES)))
 	-$(DEL) $(EXENAME) $(TEMPWPONAME1) $(TEMPWPONAME2)
 
 $(addsuffix _clean,$(ALLTARGETS)):
         -$(DELTREE) $(addprefix $(subst _clean,,$@),/units)
+        -$(DELTREE) $(addprefix $(subst _clean,,$@),/bin)
         -$(DEL) $(addprefix $(subst _clean,,$@)/,*$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT))
-        -$(DEL) $(addprefix $(subst _clean,,$@)/,ppc386$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) ppcarv$(EXEEXT) ppcsparc64$(EXEEXT))
-        -$(DEL) $(addprefix $(subst _clean,,$@)/,ppcppc64$(EXEEXT) ppcarm$(EXEEXT) ppcmips$(EXEEXT) ppcmipsel$(EXEEXT) ppcjvm$(EXEEXT) ppc8086$(EXEEXT) ppca64$(EXEEXT) $(EXENAME))
+        -$(DEL) $(addprefix $(subst _clean,,$@)/ppc,$(addsuffix $(EXEEXT), $(PPC_SUFFIXES)))
 
 cycleclean: cleanall $(addsuffix _clean,$(CPC_TARGET))
         -$(DEL) $(EXENAME)

+ 2 - 2
compiler/arm/cgcpu.pas

@@ -1037,7 +1037,7 @@ unit cgcpu;
             { Doing two shifts instead of two bics might allow the peephole optimizer to fold the second shift
               into the following instruction}
             else if (op = OP_AND) and
-                    is_continuous_mask(a, lsb, width) and
+                    is_continuous_mask(aword(a), lsb, width) and
                     ((lsb = 0) or ((lsb + width) = 32)) then
               begin
                 shifterop_reset(so);
@@ -4633,7 +4633,7 @@ unit cgcpu;
               list.concat(taicpu.op_reg_reg(A_UXTH,dst,src))
             else if (op = OP_AND) and is_thumb32_imm(not(dword(a))) then
               list.concat(taicpu.op_reg_reg_const(A_BIC,dst,src,not(dword(a))))
-            else if (op = OP_AND) and is_continuous_mask(not(a), shift, width) then
+            else if (op = OP_AND) and is_continuous_mask(aword(not(a)), shift, width) then
               begin
                 a_load_reg_reg(list,size,size,src,dst);
                 list.concat(taicpu.op_reg_const_const(A_BFC,dst,shift,width))

+ 3 - 3
compiler/arm/cpubase.pas

@@ -377,7 +377,7 @@ unit cpubase;
       doesn't handle ROR_C detection }
     function is_thumb32_imm(d : aint) : boolean;
     function split_into_shifter_const(value : aint;var imm1: dword; var imm2: dword):boolean;
-    function is_continuous_mask(d : aint;var lsb, width: byte) : boolean;
+    function is_continuous_mask(d : aword;var lsb, width: byte) : boolean;
     function dwarf_reg(r:tregister):shortint;
     function dwarf_reg_no_error(r:tregister):shortint;
 
@@ -610,7 +610,7 @@ unit cpubase;
           end;
       end;
     
-    function is_continuous_mask(d : aint;var lsb, width: byte) : boolean;
+    function is_continuous_mask(d : aword;var lsb, width: byte) : boolean;
       var
         msb : byte;
       begin
@@ -619,7 +619,7 @@ unit cpubase;
         
         width:=msb-lsb+1;
         
-        result:=(lsb<>255) and (msb<>255) and ((((1 shl (msb-lsb+1))-1) shl lsb) = d);
+        result:=(lsb<>255) and (msb<>255) and (aword(((1 shl (msb-lsb+1))-1) shl lsb) = d);
       end;
 
 

+ 26 - 8
compiler/ncal.pas

@@ -1903,18 +1903,27 @@ implementation
       var
         lastinitstatement : tstatementnode;
       begin
+        if not assigned(n) then
+          exit;
         if not assigned(callinitblock) then
-          callinitblock:=internalstatements(lastinitstatement)
-        else
-          lastinitstatement:=laststatement(callinitblock);
+          begin
+            callinitblock:=internalstatements(lastinitstatement);
+            lastinitstatement.left.free;
+            lastinitstatement.left:=n;
+            firstpass(tnode(callinitblock));
+            exit;
+          end;
+        lastinitstatement:=laststatement(callinitblock);
         { all these nodes must be immediately typechecked, because this routine }
         { can be called from pass_1 (i.e., after typecheck has already run) and }
         { moreover, the entire blocks themselves are also only typechecked in   }
         { pass_1, while the the typeinfo is already required after the          }
         { typecheck pass for simplify purposes (not yet perfect, because the    }
         { statementnodes themselves are not typechecked this way)               }
-        firstpass(n);
         addstatement(lastinitstatement,n);
+        firstpass(tnode(lastinitstatement));
+        { Update expectloc for callinitblock }
+        callinitblock.expectloc:=lastinitstatement.expectloc;
       end;
 
 
@@ -1922,13 +1931,22 @@ implementation
       var
         lastdonestatement : tstatementnode;
       begin
+        if not assigned(n) then
+          exit;
         if not assigned(callcleanupblock) then
-          callcleanupblock:=internalstatements(lastdonestatement)
-        else
-          lastdonestatement:=laststatement(callcleanupblock);
+          begin
+            callcleanupblock:=internalstatements(lastdonestatement);
+            lastdonestatement.left.free;
+            lastdonestatement.left:=n;
+            firstpass(tnode(callcleanupblock));
+            exit;
+          end;
+        lastdonestatement:=laststatement(callcleanupblock);
         { see comments in add_init_statement }
-        firstpass(n);
         addstatement(lastdonestatement,n);
+        firstpass(tnode(lastdonestatement));
+        { Update expectloc for callcleanupblock }
+        callcleanupblock.expectloc:=lastdonestatement.expectloc;
       end;
 
 

+ 14 - 13
packages/fcl-passrc/src/paswrite.pp

@@ -94,7 +94,7 @@ type
     procedure WriteUsesList(ASection: TPasSection); virtual;
     procedure WriteClass(AClass: TPasClassType); virtual;
     procedure WriteConst(AConst: TPasConst); virtual;
-    procedure WriteVariable(AVar: TPasVariable); virtual;
+    procedure WriteVariable(aVar: TPasVariable); virtual;
     procedure WriteArgument(aArg: TPasArgument); virtual;
     procedure WriteDummyExternalFunctions(aSection: TPasSection); virtual;
     procedure WriteOverloadedProc(aProc : TPasOverloadedProc; ForceBody: Boolean = False; NamePrefix : String = ''); virtual;
@@ -680,27 +680,27 @@ begin
   AddLn(AConst.GetDeclaration(True)+';');
 end;
 
-procedure TPasWriter.WriteVariable(AVar: TPasVariable);
+procedure TPasWriter.WriteVariable(aVar: TPasVariable);
 
 var
   LParentIsClassOrRecord: boolean;
 
 begin
-  LParentIsClassOrRecord:= (AVar.Parent.ClassType = TPasClassType) or
-    (AVar.Parent.ClassType = TPasRecordType);
+  LParentIsClassOrRecord:= (aVar.Parent.ClassType = TPasClassType) or
+    (aVar.Parent.ClassType = TPasRecordType);
   if not LParentIsClassOrRecord then
     PrepareDeclSection('var')
   // handle variables in classes/records
-  else if vmClass in AVar.VarModifiers then
+  else if vmClass in aVar.VarModifiers then
     PrepareDeclSectionInStruct('class var')
   else if CurDeclSection<>'' then
     PrepareDeclSectionInStruct('var');
-  Add(AVar.Name + ': ');
-  if Not Assigned(AVar.VarType) then
-    Raise EWriteError.CreateFmt('No type for variable %s',[AVar.Name]);
-  WriteType(AVar.VarType,False);
-  if (AVar.AbsoluteLocation<>'') then
-    Add(' absolute %s',[AVar.AbsoluteLocation])
+  Add(aVar.Name + ': ');
+  if Not Assigned(aVar.VarType) then
+    Raise EWriteError.CreateFmt('No type for variable %s',[aVar.Name]);
+  WriteType(aVar.VarType,False);
+  if (aVar.AbsoluteExpr<>nil) then
+    Add(' absolute %s',[aVar.AbsoluteExpr.ClassName])
   else if (aVar.LibraryName<>Nil) or Assigned (aVar.ExportName) then
     begin
     if LParentIsClassOrRecord then
@@ -711,8 +711,8 @@ begin
     else if NotOption(woNoExternalVar) then
       begin
       Add('; external ');
-      if (AVar.LibraryName<>Nil) then
-        Add('%s ',[AVar.LibraryName.GetDeclaration(true)]);
+      if (aVar.LibraryName<>Nil) then
+        Add('%s ',[aVar.LibraryName.GetDeclaration(true)]);
       Add('name %s',[aVar.ExportName.GetDeclaration(true)]);
       end;
     end;
@@ -913,6 +913,7 @@ begin
   end;
   AddLn(';');
   IncDeclSectionLevel;
+  PE:=nil;
   for i := 0 to AProc.Locals.Count - 1 do
     begin
     E:=TPasElement(AProc.Locals[i]);

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

@@ -10282,14 +10282,11 @@ end;
 function TPasToJSConverter.ConvertBuiltInStrParam(El: TPasExpr;
   AContext: TConvertContext; IsStrFunc, IsFirst: boolean): TJSElement;
 var
-  ResolvedEl: TPasResolverResult;
-  NeedStrLit: Boolean;
   Add: TJSElement;
-  Call: TJSCallExpression;
-  PlusEl: TJSAdditiveExpressionPlus;
-  Bracket: TJSBracketMemberExpression;
 
   procedure PrependStrLit;
+  var
+    PlusEl: TJSAdditiveExpressionPlus;
   begin
     PlusEl:=TJSAdditiveExpressionPlus(CreateElement(TJSAdditiveExpressionPlus,El));
     PlusEl.A:=CreateLiteralString(El,'');
@@ -10297,6 +10294,12 @@ var
     Add:=PlusEl;
   end;
 
+var
+  ResolvedEl: TPasResolverResult;
+  NeedStrLit: Boolean;
+  Call: TJSCallExpression;
+  Bracket: TJSBracketMemberExpression;
+  Arg: TJSElement;
 begin
   Result:=nil;
   AContext.Resolver.ComputeElement(El,ResolvedEl,[]);
@@ -10305,17 +10308,20 @@ begin
   Bracket:=nil;
   try
     NeedStrLit:=false;
-    if ResolvedEl.BaseType in (btAllJSBooleans+btAllJSInteger) then
+    if ResolvedEl.BaseType in (btAllJSBooleans+btAllJSInteger-[btCurrency]) then
       begin
       NeedStrLit:=true;
       Add:=ConvertElement(El,AContext);
       end
-    else if ResolvedEl.BaseType in btAllJSFloats then
+    else if ResolvedEl.BaseType in (btAllJSFloats+[btCurrency]) then
       begin
       // convert to rtl.floatToStr(El,width,precision)
       Call:=CreateCallExpression(El);
       Call.Expr:=CreateMemberExpression([FBuiltInNames[pbivnRTL],FBuiltInNames[pbifnFloatToStr]]);
-      Call.AddArg(ConvertElement(El,AContext));
+      Arg:=ConvertElement(El,AContext);
+      if ResolvedEl.BaseType=btCurrency then
+        Arg:=CreateDivideNumber(El,Arg,10000);
+      Call.AddArg(Arg);
       if El.format1<>nil then
         Call.AddArg(ConvertElement(El.format1,AContext));
       if El.format2<>nil then

+ 33 - 33
packages/pastojs/src/pas2jscompiler.pp

@@ -4223,47 +4223,47 @@ begin
   if FileCount>0 then
     RaiseInternalError(20170504161340,'internal error: TPas2jsCompiler.Run FileCount>0');
 
-  // ste working directory, need by all relative filenames
-  FileCache.BaseDirectory:=aWorkingDir;
+  try
+    // set working directory, need by all relative filenames
+    FileCache.BaseDirectory:=aWorkingDir;
 
-  CompilerExe:=aCompilerExe; // maybe needed to find the default config
+    CompilerExe:=aCompilerExe; // maybe needed to find the default config
 
-  // quick check command line params
-  for i:=0 to ParamList.Count-1 do
-    ReadParam(ParamList[i],true,true);
-  if WriteDebugLog then
-    Log.OpenDebugLog;
-  if ShowLogo then
-    WriteLogo;
+    // quick check command line params
+    for i:=0 to ParamList.Count-1 do
+      ReadParam(ParamList[i],true,true);
+    if WriteDebugLog then
+      Log.OpenDebugLog;
+    if ShowLogo then
+      WriteLogo;
 
-  // read default config
-  if not SkipDefaultConfig then
-    LoadDefaultConfig;
+    // read default config
+    if not SkipDefaultConfig then
+      LoadDefaultConfig;
 
-  // read command line parameters
-  for i:=0 to ParamList.Count-1 do
-    ReadParam(ParamList[i],false,true);
+    // read command line parameters
+    for i:=0 to ParamList.Count-1 do
+      ReadParam(ParamList[i],false,true);
 
-  // now we know, if the logo can be displayed
-  if ShowLogo then
-    WriteLogo;
+    // now we know, if the logo can be displayed
+    if ShowLogo then
+      WriteLogo;
 
-  // show debug info
-  if ShowDebug then
-  begin
-    WriteOptions;
-    WriteDefines;
-  end;
-  if ShowDebug or ShowTriedUsedFiles then
-    WriteFoldersAndSearchPaths;
+    // show debug info
+    if ShowDebug then
+    begin
+      WriteOptions;
+      WriteDefines;
+    end;
+    if ShowDebug or ShowTriedUsedFiles then
+      WriteFoldersAndSearchPaths;
 
-  if FileCache.MainSrcFile='' then
-    ParamFatal('No source file name in command line');
-  if not DirectoryCache.FileExists(FileCache.MainSrcFile) then
-    ParamFatal('Pascal file not found: "'+FileCache.MainSrcFile+'"');
+    if FileCache.MainSrcFile='' then
+      ParamFatal('No source file name in command line');
+    if not DirectoryCache.FileExists(FileCache.MainSrcFile) then
+      ParamFatal('Pascal file not found: "'+FileCache.MainSrcFile+'"');
 
-  // compile
-  try
+    // compile
     Compile(StartTime);
   except
     on E: ECompilerTerminate do

+ 4 - 0
packages/pastojs/tests/tcmodules.pas

@@ -5617,6 +5617,8 @@ begin
   '  j:=c;',
   '  Write(c);',
   '  c:=default(currency);',
+  '  j:=str(c);',
+  '  j:=str(c:0:3);',
   '']);
   ConvertProgram;
   CheckSource('TestCurrency',
@@ -5684,6 +5686,8 @@ begin
     '$mod.j = $mod.c / 10000;',
     '$mod.Write($mod.c / 10000);',
     '$mod.c = 0;',
+    '$mod.j = rtl.floatToStr($mod.c / 10000);',
+    '$mod.j = rtl.floatToStr($mod.c / 10000, 0, 3);',
     '']));
 end;
 

+ 5 - 5
rtl/linux/arm/sysnr.inc

@@ -415,8 +415,8 @@ Const
  * The following SWIs are ARM private.
  *}
   __ARM_NR_BASE                         = syscall_nr_base+$f0000;
-  __ARM_NR_breakpoint                   = __ARM_NR_BASE+1;
-  __ARM_NR_cacheflush                   = __ARM_NR_BASE+2;
-  __ARM_NR_usr26                        = __ARM_NR_BASE+3;
-  __ARM_NR_usr32                        = __ARM_NR_BASE+4;
-  __ARM_NR_set_tls                      = __ARM_NR_BASE+5;
+  syscall_nr___ARM_NR_breakpoint        = __ARM_NR_BASE+1;
+  syscall_nr___ARM_NR_cacheflush        = __ARM_NR_BASE+2;
+  syscall_nr___ARM_NR_usr26             = __ARM_NR_BASE+3;
+  syscall_nr___ARM_NR_usr32             = __ARM_NR_BASE+4;
+  syscall_nr___ARM_NR_set_tls           = __ARM_NR_BASE+5;

+ 1 - 1
rtl/linux/system.pp

@@ -446,7 +446,7 @@ end;
 {$define INITTLS}
 Function fpset_tls(p : pointer;size : SizeUInt):cint;
 begin
-  Result:=do_syscall(__ARM_NR_set_tls,TSysParam(p));
+  Result:=do_syscall(syscall_nr___ARM_NR_set_tls,TSysParam(p));
 end;
 {$endif defined(CPUARM)}
 

+ 29 - 66
tests/Makefile

@@ -5,7 +5,7 @@ default: allexectests
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-darwin aarch64-android wasm-wasm sparc64-linux riscv32-linux riscv32-embedded riscv64-linux riscv64-embedded
 BSDs = freebsd netbsd openbsd darwin dragonfly
 UNIXs = linux $(BSDs) solaris qnx haiku aix
-LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari
+LIMIT83fs = go32v2 os2 emx watcom msdos
 OSNeedsComspecToRunBatch = go32v2 watcom
 FORCE:
 .PHONY: FORCE
@@ -184,12 +184,6 @@ $(error When compiling for arm-embedded, a sub-architecture (e.g. SUBARCH=armv4t
 endif
 override FPCOPT+=-Cp$(SUBARCH)
 endif
-ifeq ($(FULL_TARGET),avr-embedded)
-ifeq ($(SUBARCH),)
-$(error When compiling for avr-embedded, a sub-architecture (e.g. SUBARCH=avr25 or SUBARCH=avr35) must be defined)
-endif
-override FPCOPT+=-Cp$(SUBARCH)
-endif
 ifeq ($(FULL_TARGET),mipsel-embedded)
 ifeq ($(SUBARCH),)
 $(error When compiling for mipsel-embedded, a sub-architecture (e.g. SUBARCH=pic32mx) must be defined)
@@ -232,7 +226,7 @@ endif
 export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
 ifdef FPCDIR
 override FPCDIR:=$(subst \,/,$(FPCDIR))
-ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 override FPCDIR=wrong
 endif
 else
@@ -241,7 +235,7 @@ endif
 ifdef DEFAULT_FPCDIR
 ifeq ($(FPCDIR),wrong)
 override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
-ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 override FPCDIR=wrong
 endif
 endif
@@ -255,11 +249,11 @@ endif
 else
 override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
 override FPCDIR:=$(FPCDIR)/..
-ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 override FPCDIR:=$(FPCDIR)/..
-ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 override FPCDIR:=$(BASEDIR)
-ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 override FPCDIR=c:/pp
 endif
 endif
@@ -304,7 +298,7 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
 ifeq ($(UNITSDIR),)
 UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
-PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages)
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 ifndef FPCFPMAKE
 ifdef CROSSCOMPILE
 ifeq ($(strip $(wildcard $(addsuffix /compiler/ppc$(SRCEXEEXT),$(FPCDIR)))),)
@@ -356,6 +350,9 @@ endif
 ifeq ($(FULL_TARGET),i386-solaris)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_PROGRAMS+=gparmake createlst
+endif
 ifeq ($(FULL_TARGET),i386-netware)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
@@ -401,6 +398,9 @@ endif
 ifeq ($(FULL_TARGET),m68k-linux)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_PROGRAMS+=gparmake createlst
+endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
@@ -410,10 +410,10 @@ endif
 ifeq ($(FULL_TARGET),m68k-atari)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
-ifeq ($(FULL_TARGET),m68k-palmos)
+ifeq ($(FULL_TARGET),m68k-openbsd)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
-ifeq ($(FULL_TARGET),m68k-macos)
+ifeq ($(FULL_TARGET),m68k-palmos)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
@@ -497,9 +497,6 @@ endif
 ifeq ($(FULL_TARGET),arm-linux)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
-ifeq ($(FULL_TARGET),arm-netbsd)
-override TARGET_PROGRAMS+=gparmake createlst
-endif
 ifeq ($(FULL_TARGET),arm-palmos)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
@@ -524,9 +521,6 @@ endif
 ifeq ($(FULL_TARGET),arm-android)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
-ifeq ($(FULL_TARGET),arm-aros)
-override TARGET_PROGRAMS+=gparmake createlst
-endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
@@ -566,9 +560,6 @@ endif
 ifeq ($(FULL_TARGET),jvm-android)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
-ifeq ($(FULL_TARGET),i8086-embedded)
-override TARGET_PROGRAMS+=gparmake createlst
-endif
 ifeq ($(FULL_TARGET),i8086-msdos)
 override TARGET_PROGRAMS+=gparmake createlst
 endif
@@ -999,21 +990,6 @@ STATICLIBPREFIX=
 STATICLIBEXT=.a
 SHORTSUFFIX=d16
 endif
-ifeq ($(OS_TARGET),embedded)
-ifeq ($(CPU_TARGET),i8086)
-STATICLIBPREFIX=
-STATICLIBEXT=.a
-else
-EXEEXT=.bin
-endif
-SHORTSUFFIX=emb
-endif
-ifeq ($(OS_TARGET),win16)
-STATICLIBPREFIX=
-STATICLIBEXT=.a
-SHAREDLIBEXT=.dll
-SHORTSUFFIX=w16
-endif
 ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 FPCMADE=fpcmade.$(SHORTSUFFIX)
 ZIPSUFFIX=$(SHORTSUFFIX)
@@ -1296,6 +1272,9 @@ endif
 ifeq ($(FULL_TARGET),i386-solaris)
 REQUIRE_PACKAGES_RTL=1
 endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
 ifeq ($(FULL_TARGET),i386-netware)
 REQUIRE_PACKAGES_RTL=1
 endif
@@ -1341,6 +1320,9 @@ endif
 ifeq ($(FULL_TARGET),m68k-linux)
 REQUIRE_PACKAGES_RTL=1
 endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 REQUIRE_PACKAGES_RTL=1
 endif
@@ -1350,10 +1332,10 @@ endif
 ifeq ($(FULL_TARGET),m68k-atari)
 REQUIRE_PACKAGES_RTL=1
 endif
-ifeq ($(FULL_TARGET),m68k-palmos)
+ifeq ($(FULL_TARGET),m68k-openbsd)
 REQUIRE_PACKAGES_RTL=1
 endif
-ifeq ($(FULL_TARGET),m68k-macos)
+ifeq ($(FULL_TARGET),m68k-palmos)
 REQUIRE_PACKAGES_RTL=1
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
@@ -1437,9 +1419,6 @@ endif
 ifeq ($(FULL_TARGET),arm-linux)
 REQUIRE_PACKAGES_RTL=1
 endif
-ifeq ($(FULL_TARGET),arm-netbsd)
-REQUIRE_PACKAGES_RTL=1
-endif
 ifeq ($(FULL_TARGET),arm-palmos)
 REQUIRE_PACKAGES_RTL=1
 endif
@@ -1464,9 +1443,6 @@ endif
 ifeq ($(FULL_TARGET),arm-android)
 REQUIRE_PACKAGES_RTL=1
 endif
-ifeq ($(FULL_TARGET),arm-aros)
-REQUIRE_PACKAGES_RTL=1
-endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 endif
@@ -1506,9 +1482,6 @@ endif
 ifeq ($(FULL_TARGET),jvm-android)
 REQUIRE_PACKAGES_RTL=1
 endif
-ifeq ($(FULL_TARGET),i8086-embedded)
-REQUIRE_PACKAGES_RTL=1
-endif
 ifeq ($(FULL_TARGET),i8086-msdos)
 REQUIRE_PACKAGES_RTL=1
 endif
@@ -1592,7 +1565,6 @@ endif
 ifeq ($(OS_SOURCE),openbsd)
 override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
 override FPCMAKEOPT+=-FD$(NEW_BINUTILS_PATH)
-override FPMAKE_BUILD_OPT+=-FD$(NEW_BINUTILS_PATH)
 endif
 ifndef CROSSBOOTSTRAP
 ifneq ($(BINUTILSPREFIX),)
@@ -1605,7 +1577,6 @@ endif
 ifndef CROSSCOMPILE
 ifneq ($(BINUTILSPREFIX),)
 override FPCMAKEOPT+=-XP$(BINUTILSPREFIX)
-override FPMAKE_BUILD_OPT+=-XP$(BINUTILSPREFIX)
 endif
 endif
 ifdef UNITDIR
@@ -1705,9 +1676,6 @@ endif
 ifdef OPT
 override FPCOPT+=$(OPT)
 endif
-ifdef FPMAKEBUILDOPT
-override FPMAKE_BUILD_OPT+=$(FPMAKEBUILDOPT)
-endif
 ifdef FPCOPTDEF
 override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
 endif
@@ -1850,11 +1818,7 @@ ifdef INSTALL_BUILDUNIT
 override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
 endif
 ifdef INSTALLPPUFILES
-ifneq ($(IMPORTLIBPREFIX)-$(STATICLIBEXT),$(STATICLIBPREFIX)-$(STATICLIBEXT))
 override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
-else
-override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
-endif
 ifneq ($(UNITTARGETDIRPREFIX),)
 override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
 override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
@@ -1903,7 +1867,7 @@ endif
 fpc_sourceinstall: distclean
 	$(MKDIR) $(INSTALL_SOURCEDIR)
 	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
-fpc_exampleinstall: $(EXAMPLEINSTALLTARGET) $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
 ifdef HASEXAMPLES
 	$(MKDIR) $(INSTALL_EXAMPLEDIR)
 endif
@@ -1956,7 +1920,7 @@ ifdef LIB_NAME
 	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
 endif
 	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
-	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT) ppas$(BATCHEXT) ppaslink$(BATCHEXT)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
 fpc_cleanall: $(CLEANTARGET)
 ifdef CLEANEXEFILES
 	-$(DEL) $(CLEANEXEFILES)
@@ -1982,17 +1946,13 @@ ifneq ($(PPUEXT),.ppu)
 endif
 	-$(DELTREE) *$(SMARTEXT)
 	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
-	-$(DEL) *_ppas$(BATCHEXT) ppas$(BATCHEXT) ppaslink$(BATCHEXT)
+	-$(DEL) *_ppas$(BATCHEXT)
 ifdef AOUTEXT
 	-$(DEL) *$(AOUTEXT)
 endif
 ifdef DEBUGSYMEXT
 	-$(DEL) *$(DEBUGSYMEXT)
 endif
-ifdef LOCALFPMAKEBIN
-	-$(DEL) $(LOCALFPMAKEBIN)
-	-$(DEL) $(FPMAKEBINOBJ)
-endif
 fpc_distclean: cleanall
 .PHONY: fpc_baseinfo
 override INFORULES+=fpc_baseinfo
@@ -2350,6 +2310,9 @@ endif
 ifdef TEST_VERBOSE
 override DOTESTOPT+=-V
 endif
+ifdef TEST_PARALLEL
+override DOTESTOPT+=-L
+endif
 ifdef TEST_BENCH
 override DOTESTOPT+=-D
 endif

+ 3 - 0
tests/Makefile.fpc

@@ -333,6 +333,9 @@ endif
 ifdef TEST_VERBOSE
 override DOTESTOPT+=-V
 endif
+ifdef TEST_PARALLEL
+override DOTESTOPT+=-L
+endif
 # Also display benchmarks
 ifdef TEST_BENCH
 override DOTESTOPT+=-D