Index: verbose.pas
===================================================================
--- verbose.pas	(revision 4805)
+++ verbose.pas	(working copy)
@@ -68,6 +68,9 @@
     var
       msg : pmessage;
 
+    type
+      tmsgqueueevent = procedure(s:string;v,w:longint) of object;
+
     const
       msgfilename : string = '';
 
@@ -84,16 +87,16 @@
     procedure Internalerror(i:longint);
     procedure Comment(l:longint;s:string);
     function  MessagePchar(w:longint):pchar;
-    procedure Message(w:longint);
-    procedure Message1(w:longint;const s1:string);
-    procedure Message2(w:longint;const s1,s2:string);
-    procedure Message3(w:longint;const s1,s2,s3:string);
-    procedure Message4(w:longint;const s1,s2,s3,s4:string);
-    procedure MessagePos(const pos:tfileposinfo;w:longint);
-    procedure MessagePos1(const pos:tfileposinfo;w:longint;const s1:string);
-    procedure MessagePos2(const pos:tfileposinfo;w:longint;const s1,s2:string);
-    procedure MessagePos3(const pos:tfileposinfo;w:longint;const s1,s2,s3:string);
-    procedure MessagePos4(const pos:tfileposinfo;w:longint;const s1,s2,s3,s4:string);
+    procedure Message(w:longint;onqueue:tmsgqueueevent=nil);
+    procedure Message1(w:longint;const s1:string;onqueue:tmsgqueueevent=nil);
+    procedure Message2(w:longint;const s1,s2:string;onqueue:tmsgqueueevent=nil);
+    procedure Message3(w:longint;const s1,s2,s3:string;onqueue:tmsgqueueevent=nil);
+    procedure Message4(w:longint;const s1,s2,s3,s4:string;onqueue:tmsgqueueevent=nil);
+    procedure MessagePos(const pos:tfileposinfo;w:longint;onqueue:tmsgqueueevent=nil);
+    procedure MessagePos1(const pos:tfileposinfo;w:longint;const s1:string;onqueue:tmsgqueueevent=nil);
+    procedure MessagePos2(const pos:tfileposinfo;w:longint;const s1,s2:string;onqueue:tmsgqueueevent=nil);
+    procedure MessagePos3(const pos:tfileposinfo;w:longint;const s1,s2,s3:string;onqueue:tmsgqueueevent=nil);
+    procedure MessagePos4(const pos:tfileposinfo;w:longint;const s1,s2,s3,s4:string;onqueue:tmsgqueueevent=nil);
 
     { message calls with codegenerror support }
     procedure cgmessage(t : longint);
@@ -486,13 +489,15 @@
       end;
 
 
-    Procedure Msg2Comment(s:string);
+    Procedure Msg2Comment(s:string;w:longint;onqueue:tmsgqueueevent);
       var
         idx,i,v : longint;
         dostop  : boolean;
+        doqueue : boolean;
       begin
       {Reset}
         dostop:=false;
+        doqueue:=false;
         v:=0;
       {Parse options}
         idx:=pos('_',s);
@@ -564,13 +569,22 @@
         Delete(s,1,idx);
       { check verbosity level }
         if not CheckVerbosity(v) then
-          exit;
+        begin
+          doqueue := onqueue <> nil;
+          if not doqueue then
+            exit;
+        end;
         if (v and V_LineInfoMask)<>0 then
           v:=v or V_LineInfo;
       { fix status }
         UpdateStatus;
       { Fix replacements }
         DefaultReplacements(s);
+        if doqueue then
+        begin
+          onqueue(s,v,w);
+          exit;
+        end;
       { show comment }
         if do_comment(v,s) or dostop then
           raise ECompilerAbort.Create;
@@ -590,98 +604,98 @@
       end;
 
 
-    procedure Message(w:longint);
+    procedure Message(w:longint;onqueue:tmsgqueueevent=nil);
       begin
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[]));
+        Msg2Comment(msg^.Get(w,[]),w,onqueue);
       end;
 
 
-    procedure Message1(w:longint;const s1:string);
+    procedure Message1(w:longint;const s1:string;onqueue:tmsgqueueevent=nil);
 
       begin
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[s1]));
+        Msg2Comment(msg^.Get(w,[s1]),w,onqueue);
       end;
 
 
-    procedure Message2(w:longint;const s1,s2:string);
+    procedure Message2(w:longint;const s1,s2:string;onqueue:tmsgqueueevent=nil);
       begin
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[s1,s2]));
+        Msg2Comment(msg^.Get(w,[s1,s2]),w,onqueue);
       end;
 
 
-    procedure Message3(w:longint;const s1,s2,s3:string);
+    procedure Message3(w:longint;const s1,s2,s3:string;onqueue:tmsgqueueevent=nil);
       begin
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[s1,s2,s3]));
+        Msg2Comment(msg^.Get(w,[s1,s2,s3]),w,onqueue);
       end;
 
 
-    procedure Message4(w:longint;const s1,s2,s3,s4:string);
+    procedure Message4(w:longint;const s1,s2,s3,s4:string;onqueue:tmsgqueueevent=nil);
       begin
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[s1,s2,s3,s4]));
+        Msg2Comment(msg^.Get(w,[s1,s2,s3,s4]),w,onqueue);
       end;
 
 
-    procedure MessagePos(const pos:tfileposinfo;w:longint);
+    procedure MessagePos(const pos:tfileposinfo;w:longint;onqueue:tmsgqueueevent=nil);
       var
         oldpos : tfileposinfo;
       begin
         oldpos:=aktfilepos;
         aktfilepos:=pos;
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[]));
+        Msg2Comment(msg^.Get(w,[]),w,onqueue);
         aktfilepos:=oldpos;
       end;
 
 
-    procedure MessagePos1(const pos:tfileposinfo;w:longint;const s1:string);
+    procedure MessagePos1(const pos:tfileposinfo;w:longint;const s1:string;onqueue:tmsgqueueevent=nil);
       var
         oldpos : tfileposinfo;
       begin
         oldpos:=aktfilepos;
         aktfilepos:=pos;
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[s1]));
+        Msg2Comment(msg^.Get(w,[s1]),w,onqueue);
         aktfilepos:=oldpos;
       end;
 
 
-    procedure MessagePos2(const pos:tfileposinfo;w:longint;const s1,s2:string);
+    procedure MessagePos2(const pos:tfileposinfo;w:longint;const s1,s2:string;onqueue:tmsgqueueevent=nil);
       var
         oldpos : tfileposinfo;
       begin
         oldpos:=aktfilepos;
         aktfilepos:=pos;
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[s1,s2]));
+        Msg2Comment(msg^.Get(w,[s1,s2]),w,onqueue);
         aktfilepos:=oldpos;
       end;
 
 
-    procedure MessagePos3(const pos:tfileposinfo;w:longint;const s1,s2,s3:string);
+    procedure MessagePos3(const pos:tfileposinfo;w:longint;const s1,s2,s3:string;onqueue:tmsgqueueevent=nil);
       var
         oldpos : tfileposinfo;
       begin
         oldpos:=aktfilepos;
         aktfilepos:=pos;
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[s1,s2,s3]));
+        Msg2Comment(msg^.Get(w,[s1,s2,s3]),w,onqueue);
         aktfilepos:=oldpos;
       end;
 
 
-    procedure MessagePos4(const pos:tfileposinfo;w:longint;const s1,s2,s3,s4:string);
+    procedure MessagePos4(const pos:tfileposinfo;w:longint;const s1,s2,s3,s4:string;onqueue:tmsgqueueevent=nil);
       var
         oldpos : tfileposinfo;
       begin
         oldpos:=aktfilepos;
         aktfilepos:=pos;
         MaybeLoadMessageFile;
-        Msg2Comment(msg^.Get(w,[s1,s2,s3,s4]));
+        Msg2Comment(msg^.Get(w,[s1,s2,s3,s4]),w,onqueue);
         aktfilepos:=oldpos;
       end;
 
Index: fppu.pas
===================================================================
--- fppu.pas	(revision 4805)
+++ fppu.pas	(working copy)
@@ -43,6 +43,7 @@
        tppumodule = class(tmodule)
           ppufile    : tcompilerppufile; { the PPU file }
           sourcefn   : pstring; { Source specified with "uses .. in '..'" }
+          comments   : tstringlist;
 {$ifdef Test_Double_checksum}
           crc_array  : pointer;
           crc_size   : longint;
@@ -63,6 +64,8 @@
           procedure load_implementation;
           procedure load_symtable_refs;
           procedure load_usedunits;
+          procedure printcomments;
+          procedure queuecomment(s:string;v,w:longint);
           procedure writesourcefiles;
           procedure writeusedunit(intf:boolean);
           procedure writelinkcontainer(var p:tlinkcontainer;id:byte;strippath:boolean);
@@ -93,7 +96,8 @@
   symtable, symsym,
   scanner,
   aasmbase,ogbase,
-  parser;
+  parser,
+  comphook;
 
 {****************************************************************************
                                  Helpers
@@ -121,6 +125,7 @@
     constructor tppumodule.create(LoadedFrom:TModule;const s:string;const fn:string;_is_unit:boolean);
       begin
         inherited create(LoadedFrom,s,_is_unit);
+        comments:=tstringlist.create;
         ppufile:=nil;
         sourcefn:=stringdup(fn);
       end;
@@ -131,6 +136,8 @@
         if assigned(ppufile) then
          ppufile.free;
         ppufile:=nil;
+        comments.free;
+        comments:=nil;
         stringdispose(sourcefn);
         inherited Destroy;
       end;
@@ -146,13 +153,30 @@
         inherited reset;
       end;
 
+    procedure tppumodule.queuecomment(s:string;v,w:longint);
+    begin
+      comments.insert(s);
+    end;
 
+    procedure tppumodule.printcomments;
+    var
+      comment: string;
+    begin
+      { comments are inserted in reverse order }
+      repeat
+        comment := comments.getlast;
+        if length(comment) = 0 then
+          exit;
+        do_comment(v_normal, comment);
+      until false;
+    end;
+
     function tppumodule.openppu:boolean;
       var
         ppufiletime : longint;
       begin
         openppu:=false;
-        Message1(unit_t_ppu_loading,ppufilename^);
+        Message1(unit_t_ppu_loading,ppufilename^,@queuecomment);
       { Get ppufile time (also check if the file exists) }
         ppufiletime:=getnamedfiletime(ppufilename^);
         if ppufiletime=-1 then
@@ -178,7 +202,7 @@
       { check for allowed PPU versions }
         if not (ppufile.GetPPUVersion = CurrentPPUVersion) then
          begin
-           Message1(unit_u_ppu_invalid_version,tostr(ppufile.GetPPUVersion));
+           Message1(unit_u_ppu_invalid_version,tostr(ppufile.GetPPUVersion),@queuecomment);
            ppufile.free;
            ppufile:=nil;
            exit;
@@ -188,7 +212,7 @@
          begin
            ppufile.free;
            ppufile:=nil;
-           Message(unit_u_ppu_invalid_processor);
+           Message(unit_u_ppu_invalid_processor,@queuecomment);
            exit;
          end;
       { check target }
@@ -196,7 +220,7 @@
          begin
            ppufile.free;
            ppufile:=nil;
-           Message(unit_u_ppu_invalid_target);
+           Message(unit_u_ppu_invalid_target,@queuecomment);
            exit;
          end;
 {$ifdef cpufpemu}
@@ -1211,7 +1235,7 @@
                   (pu.u.crc<>pu.checksum)
                  ) then
                begin
-                 Message2(unit_u_recompile_crc_change,realmodulename^,pu.u.realmodulename^);
+                 Message2(unit_u_recompile_crc_change,realmodulename^,pu.u.realmodulename^,@queuecomment);
                  recompile_reason:=rr_crcchanged;
                  do_compile:=true;
                  exit;
@@ -1256,7 +1280,7 @@
               { need to recompile the current unit ? }
               if (pu.u.interface_crc<>pu.interface_checksum) then
                 begin
-                  Message2(unit_u_recompile_crc_change,realmodulename^,pu.u.realmodulename^+' {impl}');
+                  Message2(unit_u_recompile_crc_change,realmodulename^,pu.u.realmodulename^+' {impl}',@queuecomment);
                   recompile_reason:=rr_crcchanged;
                   do_compile:=true;
                   exit;
@@ -1445,6 +1469,7 @@
                    search_unit(true,true);
                  if not(sources_avail) then
                   begin
+                    printcomments;
                     if recompile_reason=rr_noppu then
                       Message1(unit_f_cant_find_ppu,realmodulename^)
                     else
