Przeglądaj źródła

Merged revisions 8592-8594,8596-8597,8600,8605,8607,8615,8618-8621,8623,8625,8630-8638,8640-8641,8659,8665,8667,8681-8682,8686-8687,8702,8705,8710-8714,8719,8721-8723,8727,8730-8731,8743,8747-8751,8766-8769,8797,8822,8831,8848-8849,8851,8879,8885-8889,8891-8893,8895,8897,8912,8917,8921,8926,8942,8950-8951,8964 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r8592 | vincents | 2007-09-21 16:07:35 +0200 (Fri, 21 Sep 2007) | 1 line

* improved recursive benchmark
........
r8597 | tom_at_work | 2007-09-21 19:01:39 +0200 (Fri, 21 Sep 2007) | 1 line

* fixed tw9673
........
r8615 | florian | 2007-09-23 16:05:44 +0200 (Sun, 23 Sep 2007) | 2 lines

+ fasta benchmark added
........
r8618 | florian | 2007-09-23 16:36:26 +0200 (Sun, 23 Sep 2007) | 2 lines

+ -B added to get timing info
........
r8619 | florian | 2007-09-23 16:36:51 +0200 (Sun, 23 Sep 2007) | 2 lines

* standalone timing program for systems not having a time command
........
r8620 | florian | 2007-09-23 16:39:53 +0200 (Sun, 23 Sep 2007) | 2 lines

* write output to stderr
........
r8621 | peter | 2007-09-23 16:55:58 +0200 (Sun, 23 Sep 2007) | 2 lines

* code from shootout
........
r8623 | vincents | 2007-09-23 19:25:02 +0200 (Sun, 23 Sep 2007) | 1 line

added fptime to the makefile for all targets
........
r8921 | micha | 2007-10-24 00:02:16 +0200 (Wed, 24 Oct 2007) | 1 line

* increase default timeout for cpu intensive tests on slow cpus
........
r8926 | vincents | 2007-10-25 16:34:01 +0200 (Thu, 25 Oct 2007) | 1 line

* added mode objfpc to prevent alignment problems
........
r8951 | micha | 2007-10-26 20:46:35 +0200 (Fri, 26 Oct 2007) | 1 line

* add make option V to show dotest commandline for testsuite
........
r8964 | florian | 2007-10-28 11:15:31 +0100 (Sun, 28 Oct 2007) | 2 lines

* updated to latest shootout version
........

git-svn-id: branches/fixes_2_2@9077 -

peter 18 lat temu
rodzic
commit
2b031d229b

+ 5 - 0
.gitattributes

@@ -5659,12 +5659,15 @@ tests/bench/shootout/obsolete/wc.pp svneol=native#text/plain
 tests/bench/shootout/src/bench.c -text
 tests/bench/shootout/src/binarytrees.pp svneol=native#text/plain
 tests/bench/shootout/src/chameneos.pp svneol=native#text/plain
+tests/bench/shootout/src/fasta.pp svneol=native#text/plain
 tests/bench/shootout/src/hello.pp svneol=native#text/plain
 tests/bench/shootout/src/knucleotide.pp svneol=native#text/plain
 tests/bench/shootout/src/mandelbrot.pp svneol=native#text/plain
+tests/bench/shootout/src/message.pp svneol=native#text/plain
 tests/bench/shootout/src/meteorshower.pp svneol=native#text/x-pascal
 tests/bench/shootout/src/nsieve.pp svneol=native#text/plain
 tests/bench/shootout/src/partialsums.pp svneol=native#text/plain
+tests/bench/shootout/src/recursive.lpi svneol=native#text/plain
 tests/bench/shootout/src/recursive.pp svneol=native#text/plain
 tests/bench/shootout/src/regexdna.pp svneol=native#text/plain
 tests/bench/shootout/src/simple_hash.pp svneol=native#text/plain
@@ -7231,11 +7234,13 @@ tests/units/popuperr.pp svneol=native#text/plain
 tests/units/win32err.pp svneol=native#text/plain
 tests/utils/Makefile svneol=native#text/plain
 tests/utils/Makefile.fpc svneol=native#text/plain
+tests/utils/bench.pp svneol=native#text/plain
 tests/utils/dbdigest.pp svneol=native#text/plain
 tests/utils/dbtests.pp svneol=native#text/plain
 tests/utils/digest.pp svneol=native#text/plain
 tests/utils/dotest.pp svneol=native#text/plain
 tests/utils/fail.pp svneol=native#text/plain
+tests/utils/fptime.pp svneol=native#text/plain
 tests/utils/libtar.pas svneol=native#text/plain
 tests/utils/macos/LinkRunDir -text
 tests/utils/macos/LinkRunTests -text

+ 33 - 4
tests/Makefile

@@ -1,11 +1,12 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/10/21]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/10/29]
 #
 default: allexectests
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos 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 m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
 FORCE:
 .PHONY: FORCE
 override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
@@ -56,6 +57,11 @@ else
 SRCBATCHEXT=.bat
 endif
 endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
 ifdef inUnix
 PATHSEP=/
 else
@@ -102,7 +108,11 @@ ifndef FPC
 FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
 ifneq ($(FPCPROG),)
 FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
 FPC:=$(shell $(FPCPROG) -PB)
+endif
 ifneq ($(findstring Error,$(FPC)),)
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
 endif
@@ -992,7 +1002,7 @@ override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
 endif
 ifndef CROSSBOOTSTRAP
 ifneq ($(BINUTILSPREFIX),)
-override FPCOPT+=-XP$(BINUTILSPREFIX) 
+override FPCOPT+=-XP$(BINUTILSPREFIX)
 endif
 ifneq ($(BINUTILSPREFIX),)
 override FPCOPT+=-Xr$(RLINKPATH)
@@ -1124,9 +1134,13 @@ ifeq (,$(findstring -s ,$(COMPILER)))
 EXECPPAS=
 else
 ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
 EXECPPAS:=@$(PPAS)
 endif
 endif
+endif
 ifdef TARGET_RSTS
 override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
 override CLEANRSTFILES+=$(RSTFILES)
@@ -1442,12 +1456,25 @@ endif
 ifdef TEST_REMOTEPATH
 override DOTESTOPT+=-P$(TEST_REMOTEPATH)
 endif
+ifdef TEST_DELBEFORE
+override DOTESTOPT+=-B
+endif
 ifdef TEST_DELTEMP
 override DOTESTOPT+=-Z
 endif
+ifdef TEST_TIMEOUT
+override DOTESTOPT+=-O
+endif
 ifdef TEST_VERBOSE
 override DOTESTOPT+=-V
 endif
+ifdef V
+Q=
+QECHO=
+else
+Q=@
+QECHO=@echo $(1)
+endif
 ifdef TEST_REMOTEOPT
 override DOTESTOPT+="-U$(TEST_REMOTEOPT)"
 endif
@@ -1476,9 +1503,11 @@ DIRS=webtbs webtbf tbs tbf $(TESTDIRS)
 vpath %.log $(TEST_OUTPUTDIR)
 vpath %.elg $(TEST_OUTPUTDIR)
 %.log : %.pp
-	$(DOTEST) $(DOTESTOPT) $<
+	$(call QECHO,"  COMPILE $<")
+	$(Q)$(DOTEST) $(DOTESTOPT) $<
 %.elg : %.pp
-	$(DOTEST) $(DOTESTOPT) -e $<
+	$(call QECHO,"  EXECUTE $<")
+	$(Q)$(DOTEST) $(DOTESTOPT) -e $<
 .PHONY: alltbs alltbf allwebtbs allwebtbf alltest alltests
 alltbs : testprep $(patsubst %.pp,%.log,$(wildcard tbs/t*.pp))
 alltbf : testprep $(patsubst %.pp,%.log,$(wildcard tbf/t*.pp))

+ 17 - 2
tests/Makefile.fpc

@@ -194,12 +194,25 @@ endif
 ifdef TEST_REMOTEPATH
 override DOTESTOPT+=-P$(TEST_REMOTEPATH)
 endif
+ifdef TEST_DELBEFORE
+override DOTESTOPT+=-B
+endif
 ifdef TEST_DELTEMP
 override DOTESTOPT+=-Z
 endif
+ifdef TEST_TIMEOUT
+override DOTESTOPT+=-O
+endif
 ifdef TEST_VERBOSE
 override DOTESTOPT+=-V
 endif
+ifdef V
+Q=
+QECHO=
+else
+Q=@
+QECHO=@echo $(1)
+endif
 ifdef TEST_REMOTEOPT
 override DOTESTOPT+="-U$(TEST_REMOTEOPT)"
 endif
@@ -245,10 +258,12 @@ vpath %.log $(TEST_OUTPUTDIR)
 vpath %.elg $(TEST_OUTPUTDIR)
 
 %.log : %.pp
-        $(DOTEST) $(DOTESTOPT) $<
+	$(call QECHO,"  COMPILE $<")
+	$(Q)$(DOTEST) $(DOTESTOPT) $<
 
 %.elg : %.pp
-        $(DOTEST) $(DOTESTOPT) -e $<
+	$(call QECHO,"  EXECUTE $<")
+	$(Q)$(DOTEST) $(DOTESTOPT) -e $<
 
 
 ################################

+ 151 - 0
tests/bench/shootout/src/fasta.pp

@@ -0,0 +1,151 @@
+{ The Computer Language Shootout
+  http://shootout.alioth.debian.org
+
+  contributed by Ian Osgood
+  modified by Vincent Snijders
+}
+{$mode objfpc}{$inline on}{$I-}
+
+program fasta;
+
+uses Math;
+
+const ALU : AnsiString =
+  'GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG' +
+  'GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA' +
+  'CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT' +
+  'ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA' +
+  'GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG' +
+  'AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC' +
+  'AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA';
+
+const codes = 'acgtBDHKMNRSVWY';
+
+const IUB : array[0..14] of double = ( 0.27, 0.12, 0.12, 0.27,
+  0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02 );
+
+const HomoSap : array[0..3] of double = (
+  0.3029549426680, 0.1979883004921, 0.1975473066391,  0.3015094502008 );
+
+const LineLen = 60;
+
+type
+  TGene=record
+    prob: double;
+    code: char;
+    dummy: array[1..7] of char;
+  end;
+  PGene = ^TGene;
+
+var
+  n : longint;
+  Genes: array of TGene;
+  TextBuf: array[0..$FFF] of byte;
+
+procedure fastaRepeat(n : integer);
+var
+  sourceALU: ansistring;
+  line, wrapALU : pchar;
+  nulled : char;
+  lenALU : integer;
+begin
+  sourceALU := ALU + copy(ALU, 1, LineLen);
+  line := PChar(sourceALU);
+  lenALU := length(ALU);
+  wrapALU := @sourceALU[lenALU];
+  repeat
+    nulled := line[LineLen];
+    line[LineLen] := #0;
+    writeln(line);
+    inc(line, LineLen);
+    line^ := nulled;
+    if line>wrapALU then
+      dec(line, lenALU);
+    n := n - LineLen;
+  until n <= LineLen;
+  line[n] := #0;
+  writeln(line);
+end;
+
+function genRandom(limit : integer): double;
+const
+  seed : integer = 42;
+  IM = 139968;
+  IA = 3877;
+  IC = 29573;
+begin
+  seed := (seed * IA + IC) mod IM;
+  genRandom := limit * seed * (1 / IM);
+end;
+
+procedure InitGenes(const probs: array of double);
+var
+  i : integer;
+  SumProb: double;
+begin
+  SetLength(Genes, length(probs));
+  SumProb := 0;
+  for i := low(probs) to high(probs) do begin
+    SumProb := SumProb + probs[i];
+    Genes[i].prob := SumProb;
+    Genes[i].code := codes[i-low(probs)+1];
+  end;
+
+end;
+
+procedure fastaRandom(n : integer; const probs: array of double);
+var
+  line : string;
+  p : pchar;
+
+  function chooseCode : char; inline;
+  var r : double;
+      Gene: PGene;
+  begin
+    r := genRandom(1);
+
+    Gene := @Genes[low(Genes)];
+    while (r>=Gene^.prob) do
+      inc(Gene);
+   result := Gene^.Code;
+  end;
+
+begin
+  { make gene array}
+  InitGenes(probs);
+
+  SetLength(line,lineLen);
+  while n > lineLen do
+  begin
+    p := @line[1];
+    while (p<=@line[lineLen]) do begin
+      p^ := chooseCode;
+      inc(p);
+    end;
+    writeln(line);
+    n := n - lineLen;
+  end;
+
+  SetLength(line,n);
+  p := @line[1];
+  while (p<=@line[n]) do begin
+    p^ := chooseCode;
+    inc(p);
+  end;
+  writeln(line);
+end;
+
+begin
+  SetTextBuf(output, TextBuf, sizeof(TextBuf));
+  val(paramstr(1), n);
+
+  writeln('>ONE Homo sapiens alu');
+  fastaRepeat(n*2);
+
+  writeln('>TWO IUB ambiguity codes');
+  fastaRandom(n*3, IUB);
+
+  writeln('>THREE Homo sapiens frequency');
+  fastaRandom(n*5, HomoSap);
+end.
+

+ 98 - 0
tests/bench/shootout/src/message.pp

@@ -0,0 +1,98 @@
+{ The Computer Language Shootout
+  http://shootout.alioth.debian.org
+  contributed by Marc Weustink
+}
+program message;
+{$mode objfpc}{$h-}
+uses
+  PThreads;
+
+var
+  PostOffice: array[0..499] of record
+    Queue: array[0..15] of Integer;  // queuelength must be power of 2
+    ReadIdx, WriteIdx: Integer;
+    ReadSem, WriteSem: TSemaphore;
+  end;
+  ThreadAttr: TThreadAttr;
+  ThreadFuncAddr: TStartRoutine;
+  Sum: Integer = 0;
+  FinishedSem: TSemaphore;
+
+procedure PostMessage(AIndex, AMessage: Integer);
+begin
+  with PostOffice[AIndex] do begin
+    sem_wait(WriteSem);
+    Queue[WriteIdx] := AMessage;
+    sem_post(ReadSem);
+    WriteIdx := (WriteIdx + 1) and (Length(Queue) - 1);
+  end;
+end;
+
+function ReadMessage(AIndex: Integer): Integer;
+begin
+  with PostOffice[AIndex] do begin
+    sem_wait(ReadSem);
+    Result := Queue[ReadIdx];
+    sem_post(WriteSem);
+    ReadIdx := (ReadIdx + 1) and (Length(Queue) - 1);
+  end;
+end;
+
+function ThreadFunc(ANum: PtrInt): Pointer; cdecl;
+var
+  Value: Integer;
+  Id: TThreadID;
+begin
+  if ANum <> 0
+  then pthread_create(@Id, @ThreadAttr, ThreadFuncAddr, Pointer(ANum-1));
+
+  repeat
+    Value := ReadMessage(ANum);
+    if Value <> -1
+    then begin
+      Inc(Value);
+      if ANum = 0
+      then Inc(Sum, Value)
+      else PostMessage(ANum-1, Value);
+    end
+    else begin
+      if ANum = 0
+      then sem_post(@FinishedSem)
+      else PostMessage(ANum-1, Value);
+      //Break;
+    end;
+  until False;
+end;
+
+
+var
+  n, count: Integer;
+  Id: TThreadId;
+begin
+  Val(paramstr(1), count, n);
+  if n <> 0 then exit;
+
+  for n := 0 to High(PostOffice) do with PostOffice[n] do begin
+    ReadIdx := 0;
+    WriteIdx := 0;
+    sem_init(@ReadSem, 0, 0);
+    sem_init(@WriteSem, 0, Length(Queue));
+  end;
+  
+  sem_init(FinishedSem, 0, 0);
+
+  pthread_attr_init(@ThreadAttr);
+  pthread_attr_setdetachstate(@ThreadAttr, 1);
+  pthread_attr_setstacksize(@ThreadAttr, 1024 * 16);
+  
+  ThreadFuncAddr := TStartRoutine(@ThreadFunc);
+  pthread_create(@Id, @ThreadAttr, ThreadFuncAddr, Pointer(High(PostOffice)));
+
+  for n := 1 to count do
+    PostMessage(High(PostOffice), 0);
+
+  PostMessage(High(PostOffice), -1);
+  
+  sem_wait(FinishedSem);
+  WriteLn(Sum);
+end.

+ 75 - 0
tests/bench/shootout/src/recursive.lpi

@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <PathDelim Value="\"/>
+    <Version Value="6"/>
+    <General>
+      <Flags>
+        <MainUnitHasUsesSectionForAllUnits Value="False"/>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <MainUnitHasTitleStatement Value="False"/>
+      </Flags>
+      <SessionStorage Value="InIDEConfig"/>
+      <MainUnit Value="0"/>
+      <IconPath Value="./"/>
+      <TargetFileExt Value=".exe"/>
+    </General>
+    <VersionInfo>
+      <ProjectVersion Value=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <Units Count="2">
+      <Unit0>
+        <Filename Value="recursive.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="recursive"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="run.bat"/>
+        <IsPartOfProject Value="True"/>
+      </Unit1>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="5"/>
+    <PathDelim Value="\"/>
+    <Parsing>
+      <SyntaxOptions>
+        <D2Extensions Value="False"/>
+        <CStyleOperator Value="False"/>
+        <AllowLabel Value="False"/>
+        <CPPInline Value="False"/>
+      </SyntaxOptions>
+    </Parsing>
+    <CodeGeneration>
+      <Generate Value="Faster"/>
+      <TargetCPU Value="i386"/>
+      <Optimizations>
+        <OptimizationLevel Value="3"/>
+      </Optimizations>
+    </CodeGeneration>
+    <Linking>
+      <Debugging>
+        <UseLineInfoUnit Value="False"/>
+      </Debugging>
+      <LinkSmart Value="True"/>
+    </Linking>
+    <Other>
+      <CustomOptions Value="-Cppentium4
+-Oppentium4
+-Cs512000
+"/>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+</CONFIG>

+ 8 - 7
tests/bench/shootout/src/recursive.pp

@@ -1,4 +1,4 @@
-(* The Computer Language Shootout
+(* The Computer Language Benchmarks Game
    http://shootout.alioth.debian.org/
 
    contributed by Josh Goldfoot
@@ -7,12 +7,12 @@
 
 program recursive;
 
-{$I-}
+{$mode objfpc}{$I-}{$OPTIMIZATION TAILREC}
 
 var
-   n : integer;
+   n : longint;
 
-function Ack(x : integer; y : integer): integer;
+function Ack(x : longint; y : longint): longint;
 begin
    if x = 0 then
       Ack := y + 1
@@ -21,21 +21,21 @@ begin
    else Ack := Ack(x-1, Ack(x, y-1));
 end; { Ack }
 
-function Fib(n : integer): integer;
+function Fib(n : longint): longint;
 begin
    if n < 2 then
       Fib := 1
    else Fib := Fib(n - 2) + Fib(n - 1)
 end; { Fib }
 
-function FibFP(n : double): double;
+function FibFP(n : double): double; inline;
 begin
    if n < 2 then
       FibFP := 1
    else FibFP := FibFP(n - 2) + FibFP(n - 1)
 end; { FibFP }
 
-function Tak(x : integer; y: integer; z : integer): integer;
+function Tak(x : longint; y: longint; z : longint): longint;
 begin
    if y < x then
       Tak := Tak( Tak(x-1, y, z), Tak(y-1, z, x), Tak(z-1, x, y) )
@@ -62,3 +62,4 @@ begin
    writeLn('Fib(3): ', Fib(3));
    writeLn('Tak(3.0,2.0,1.0): ', TakFP(3.0,2.0,1.0):1:1);
 end.
+

+ 1 - 0
tests/readme.txt

@@ -102,6 +102,7 @@ TEST_CCOMPILER         defaults to installed gcc compiler, but only
                        if driver and test full-targets are the same.
 TEST_VERBOSE           let dotest be more verbose, only usefull for debugging
 TEST_DELTEMP           delete temporary executable/object/ppu file, default is off
+V                      print dotest commandline
 
   (Please add more test options if needed)
 

+ 68 - 54
tests/utils/Makefile

@@ -1,11 +1,12 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/10/21]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/10/29]
 #
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos 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 m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
 FORCE:
 .PHONY: FORCE
 override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
@@ -56,6 +57,11 @@ else
 SRCBATCHEXT=.bat
 endif
 endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
 ifdef inUnix
 PATHSEP=/
 else
@@ -102,7 +108,11 @@ ifndef FPC
 FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
 ifneq ($(FPCPROG),)
 FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
 FPC:=$(shell $(FPCPROG) -PB)
+endif
 ifneq ($(findstring Error,$(FPC)),)
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
 endif
@@ -231,160 +241,160 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)  prepup
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)  prepup
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)  prepup
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)  prepup
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_PROGRAMS+=dotest fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
 endif
 override INSTALL_FPCPACKAGE=y
 ifdef REQUIRE_UNITSDIR
@@ -1148,7 +1158,7 @@ override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
 endif
 ifndef CROSSBOOTSTRAP
 ifneq ($(BINUTILSPREFIX),)
-override FPCOPT+=-XP$(BINUTILSPREFIX) 
+override FPCOPT+=-XP$(BINUTILSPREFIX)
 endif
 ifneq ($(BINUTILSPREFIX),)
 override FPCOPT+=-Xr$(RLINKPATH)
@@ -1280,9 +1290,13 @@ ifeq (,$(findstring -s ,$(COMPILER)))
 EXECPPAS=
 else
 ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
 EXECPPAS:=@$(PPAS)
 endif
 endif
+endif
 .PHONY: fpc_exes
 ifndef CROSSINSTALL
 ifneq ($(TARGET_PROGRAMS),)

+ 1 - 1
tests/utils/Makefile.fpc

@@ -13,7 +13,7 @@ fpcdir=../..
 nortl=y
 
 [target]
-programs=dotest fail testfail digest $(DBDIGEST)
+programs=dotest fptime fail testfail digest $(DBDIGEST)
 programs_win32=prepup
 programs_win64=prepup
 

+ 39 - 0
tests/utils/bench.pp

@@ -0,0 +1,39 @@
+{
+    This file is part of the Free Pascal test suite.
+    Copyright (c) 1999-2002 by the Free Pascal development team.
+
+    This program makes the compilation and
+    execution of individual test sources.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+{$mode objfpc}
+unit bench;
+
+
+  interface
+
+    function GetMicroSTicks : int64;
+
+  implementation
+
+    uses
+      sysutils;
+
+    function GetMicroSTicks : int64;
+      var
+         h,m,s,s1000 : word;
+      begin
+         decodetime(time,h,m,s,s1000);
+         result:=(int64(h)*3600000+int64(m)*60000+int64(s)*1000+int64(s1000))*1000;
+      end;
+
+
+end.
+

+ 46 - 11
tests/utils/dotest.pp

@@ -22,7 +22,8 @@ uses
 {$endif}
   teststr,
   testu,
-  redir;
+  redir,
+  bench;
 
 {$ifdef go32v2}
   {$define LIMIT83FS}
@@ -33,6 +34,8 @@ uses
 
 type
   tcompinfo = (compver,comptarget,compcpu);
+  tdelexecutable = (deBefore, deAfter);
+  tdelexecutables = set of tdelexecutable;
 
 const
   ObjExt='o';
@@ -46,6 +49,7 @@ const
   ExeExt='exe';
 {$endif MACOS}
 {$endif UNIX}
+  DefaultTimeout=60;
 
 var
   Config : TConfig;
@@ -75,14 +79,16 @@ const
   DoAll : boolean = false;
   DoUsual : boolean = true;
   TargetDir : string = '';
+  BenchmarkInfo : boolean = false;
   ExtraCompilerOpts : string = '';
-  DelExecutable : boolean = false;
+  DelExecutable : TDelExecutables = [];
   RemoteAddr : string = '';
   RemotePath : string = '/tmp';
   RemotePara : string = '';
   rshprog : string = 'rsh';
   rcpprog : string = 'rcp';
   rquote : char = '''';
+  UseTimeout : boolean = false;
   emulatorname : string = '';
 
 Function FileExists (Const F : String) : Boolean;
@@ -691,18 +697,24 @@ var
   FullExeLogFile,
   TestRemoteExe,
   TestExe  : string;
+  execcmd  : string;
   execres  : boolean;
-
+  EndTicks,
+  StartTicks : int64;
   function ExecuteRemote(const prog,args:string):boolean;
     begin
       Verbose(V_Debug,'RemoteExecuting '+Prog+' '+args);
+      StartTicks:=GetMicroSTicks;
       ExecuteRemote:=ExecuteRedir(prog,args,'',EXELogFile,'stdout');
+      EndTicks:=GetMicroSTicks;
     end;
 
   function ExecuteEmulated(const prog,args:string):boolean;
     begin
       Verbose(V_Debug,'EmulatorExecuting '+Prog+' '+args);
+      StartTicks:=GetMicroSTicks;
       ExecuteEmulated:=ExecuteRedir(prog,args,'',FullExeLogFile,'stdout');
+      EndTicks:=GetMicroSTicks;
    end;
 
 begin
@@ -735,12 +747,26 @@ begin
     begin
       { We don't want to create subdirs, remove paths from the test }
       TestRemoteExe:=RemotePath+'/'+SplitFileName(TestExe);
-      ExecuteRemote(rshprog,RemotePara+' '+RemoteAddr+' rm -f '+TestRemoteExe);
+      if deBefore in DelExecutable then
+        ExecuteRemote(rshprog,RemotePara+' '+RemoteAddr+' rm -f '+TestRemoteExe);
       ExecuteRemote(rcpprog,RemotePara+' '+TestExe+' '+RemoteAddr+':'+TestRemoteExe);
       { rsh doesn't pass the exitcode, use a second command to print the exitcode
         on the remoteshell to stdout }
-      execres:=ExecuteRemote(rshprog,RemotePara+' '+RemoteAddr+' '+rquote+'chmod 755 '+TestRemoteExe+
-        ' ; cd '+RemotePath+' ; '+TestRemoteExe+' ; echo "TestExitCode: $?"'+rquote);
+      execcmd:=RemotePara+' '+RemoteAddr+' '+rquote+'chmod 755 '+TestRemoteExe+
+        ' ; cd '+RemotePath+' ;';
+      if UseTimeout then
+      begin
+        execcmd:=execcmd+'timeout -9 ';
+        if Config.Timeout=0 then
+          Config.Timeout:=DefaultTimeout;
+        str(Config.Timeout,s);
+        execcmd:=execcmd+s;
+      end;
+      execcmd:=execcmd+' '+TestRemoteExe+' ; echo "TestExitCode: $?"';
+      if deAfter in DelExecutable then
+        execcmd:=execcmd+' ; rm -f '+TestRemoteExe;
+      execcmd:=execcmd+rquote;
+      execres:=ExecuteRemote(rshprog,execcmd);
       { Check for TestExitCode error in output, sets ExecuteResult }
       CheckTestExitCode(EXELogFile);
     end
@@ -756,10 +782,12 @@ begin
       {$I+}
       ioresult;
       { don't redirect interactive and graph programs }
+      StartTicks:=GetMicroSTicks;
       if Config.IsInteractive or Config.UsesGraph then
         execres:=ExecuteRedir(CurrDir+SplitFileName(TestExe),'','','','')
       else
         execres:=ExecuteRedir(CurrDir+SplitFileName(TestExe),'','',FullExeLogFile,'stdout');
+      EndTicks:=GetMicroSTicks;
       {$I-}
        ChDir(OldDir);
       {$I+}
@@ -768,6 +796,10 @@ begin
 
   { Error during execution? }
   Verbose(V_Debug,'Exitcode '+ToStr(ExecuteResult));
+  if BenchmarkInfo then
+    begin
+      Verbose(V_Normal,'Execution took '+ToStr(EndTicks-StartTicks)+' us');
+    end;
   if (not execres) and (ExecuteResult=0) then
     begin
       AddLog(FailLogFile,TestName);
@@ -810,11 +842,9 @@ begin
      RunExecutable:=true;
    end;
 
-  if DelExecutable then
+  if deAfter in DelExecutable then
     begin
       Verbose(V_Debug,'Deleting executable '+TestExe);
-      if RemoteAddr<>'' then
-        ExecuteRemote(rshprog,RemotePara+' '+RemoteAddr+' rm -f '+TestRemoteExe);
       RemoveFile(TestExe);
       RemoveFile(ForceExtension(TestExe,ObjExt));
       RemoveFile(ForceExtension(TestExe,PPUExt));
@@ -833,6 +863,7 @@ var
     writeln('dotest [Options] <File>');
     writeln;
     writeln('Options can be:');
+    writeln('  -B            delete executable before remote upload');
     writeln('  -C<compiler>  set compiler to use');
     writeln('  -V            verbose');
     writeln('  -E            execute test also');
@@ -841,6 +872,7 @@ var
     writeln('  -G            include graph tests');
     writeln('  -K            include known bug tests');
     writeln('  -I            include interactive tests');
+    writeln('  -O            use timeout wrapper for (remote) execution');
     writeln('  -M<emulator>  run the tests using the given emulator');
     writeln('  -R<remote>    run the tests remotely with the given rsh/ssh address');
     writeln('  -S            use ssh instead of rsh');
@@ -877,6 +909,8 @@ begin
              DoAll:=true;
            end;
 
+         'B' : Include(DelExecutable,deBefore);
+
          'C' : CompilerBin:=Para;
 
          'E' : DoExecute:=true;
@@ -901,6 +935,8 @@ begin
 
          'M' : EmulatorName:=Para;
 
+         'O' : UseTimeout:=true;
+
          'P' : RemotePath:=Para;
 
          'R' : RemoteAddr:=Para;
@@ -939,8 +975,7 @@ begin
 
          'Y' : ExtraCompilerOpts:= ExtraCompilerOpts +' '+ Para;
 
-         'Z' :
-           DelExecutable:=true;
+         'Z' : Include(DelExecutable,deAfter);
         end;
      end
     else

+ 16 - 0
tests/utils/fptime.pp

@@ -0,0 +1,16 @@
+uses
+  bench,sysutils;
+var
+  i : longint;
+  ps : ansistring;
+  sticks : int64;
+begin
+  if paramcount>0 then
+    begin
+      for i:=2 to paramcount do
+        ps:=ps+' '+paramstr(i);
+      sticks:=GetMicroSTicks;
+      ExecuteProcess(paramstr(1),ps);
+      writeln(stderr,(GetMicroSTicks-sticks)/1000:0:3,' ms');
+    end;
+end.