Преглед изворни кода

* External assemblers: moved some common code into the base class, 4 copies reduced to one.

git-svn-id: trunk@17561 -
sergei пре 14 година
родитељ
комит
5bda700410
5 измењених фајлова са 106 додато и 299 уклоњено
  1. 5 76
      compiler/aggas.pas
  2. 75 0
      compiler/assemble.pas
  3. 9 79
      compiler/i386/ag386nsm.pas
  4. 7 68
      compiler/powerpc/agppcmpw.pas
  5. 10 76
      compiler/x86/agx86int.pas

+ 5 - 76
compiler/aggas.pas

@@ -121,25 +121,6 @@ implementation
 {                          Support routines                                  }
 {****************************************************************************}
 
-   function fixline(s:string):string;
-   {
-     return s with all leading and ending spaces and tabs removed
-   }
-     var
-       i,j,k : integer;
-     begin
-       i:=length(s);
-       while (i>0) and (s[i] in [#9,' ']) do
-        dec(i);
-       j:=1;
-       while (j<i) and (s[j] in [#9,' ']) do
-        inc(j);
-       for k:=j to i do
-        if s[k] in [#0..#31,#127..#255] then
-         s[k]:='.';
-       fixline:=Copy(s,j,i-j+1);
-     end;
-
     function single2str(d : single) : string;
       var
          hs : string;
@@ -587,7 +568,6 @@ implementation
     var
       ch       : char;
       hp       : tai;
-      hp1      : tailineinfo;
       constdef : taiconst_type;
       s,t      : string;
       i,pos,l  : longint;
@@ -618,52 +598,10 @@ implementation
          prefetch(pointer(hp.next)^);
          if not(hp.typ in SkipLineInfo) then
           begin
-            hp1 := hp as tailineinfo;
-            current_filepos:=hp1.fileinfo;
-             { no line info for inlined code }
-             if do_line and (inlinelevel=0) then
-              begin
-                { load infile }
-                if lastfileinfo.fileindex<>hp1.fileinfo.fileindex then
-                 begin
-                   infile:=current_module.sourcefiles.get_file(hp1.fileinfo.fileindex);
-                   if assigned(infile) then
-                    begin
-                      { open only if needed !! }
-                      if (cs_asm_source in current_settings.globalswitches) then
-                       infile.open;
-                    end;
-                   { avoid unnecessary reopens of the same file !! }
-                   lastfileinfo.fileindex:=hp1.fileinfo.fileindex;
-                   { be sure to change line !! }
-                   lastfileinfo.line:=-1;
-                 end;
-              { write source }
-                if (cs_asm_source in current_settings.globalswitches) and
-                   assigned(infile) then
-                 begin
-                   if (infile<>lastinfile) then
-                     begin
-                       AsmWriteLn(target_asm.comment+'['+infile.name^+']');
-                       if assigned(lastinfile) then
-                         lastinfile.close;
-                     end;
-                   if (hp1.fileinfo.line<>lastfileinfo.line) and
-                      ((hp1.fileinfo.line<infile.maxlinebuf) or (InlineLevel>0)) then
-                     begin
-                       if (hp1.fileinfo.line<>0) and
-                          ((infile.linebuf^[hp1.fileinfo.line]>=0) or (InlineLevel>0)) then
-                         AsmWriteLn(target_asm.comment+'['+tostr(hp1.fileinfo.line)+'] '+
-                           fixline(infile.GetLineStr(hp1.fileinfo.line)));
-                       { set it to a negative value !
-                       to make that is has been read already !! PM }
-                       if (infile.linebuf^[hp1.fileinfo.line]>=0) then
-                         infile.linebuf^[hp1.fileinfo.line]:=-infile.linebuf^[hp1.fileinfo.line]-1;
-                     end;
-                 end;
-                lastfileinfo:=hp1.fileinfo;
-                lastinfile:=infile;
-              end;
+            current_filepos:=tailineinfo(hp).fileinfo;
+            { no line info for inlined code }
+            if do_line and (inlinelevel=0) then
+              WriteSourceLine(hp as tailineinfo);
           end;
 
          case hp.typ of
@@ -697,16 +635,7 @@ implementation
            ait_tempalloc :
              begin
                if (cs_asm_tempalloc in current_settings.globalswitches) then
-                 begin
-{$ifdef EXTDEBUG}
-                   if assigned(tai_tempalloc(hp).problem) then
-                     AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
-                       tostr(tai_tempalloc(hp).tempsize)+' '+tai_tempalloc(hp).problem^)
-                   else
-{$endif EXTDEBUG}
-                     AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
-                       tostr(tai_tempalloc(hp).tempsize)+' '+tempallocstr[tai_tempalloc(hp).allocation]);
-                 end;
+                 WriteTempalloc(tai_tempalloc(hp));
              end;
 
            ait_align :

+ 75 - 0
compiler/assemble.pas

@@ -81,6 +81,8 @@ interface
         lastinfile   : tinputfile;
       {last section type written}
         lastsectype : TAsmSectionType;
+        procedure WriteSourceLine(hp: tailineinfo);
+        procedure WriteTempalloc(hp: tai_tempalloc);
       public
         {# Returns the complete path and executable name of the assembler
            program.
@@ -189,6 +191,24 @@ Implementation
     var
       CAssembler : array[tasm] of TAssemblerClass;
 
+    function fixline(s:string):string;
+     {
+       return s with all leading and ending spaces and tabs removed
+     }
+      var
+        i,j,k : integer;
+      begin
+        i:=length(s);
+        while (i>0) and (s[i] in [#9,' ']) do
+          dec(i);
+        j:=1;
+        while (j<i) and (s[j] in [#9,' ']) do
+          inc(j);
+        for k:=j to i do
+          if s[k] in [#0..#31,#127..#255] then
+            s[k]:='.';
+        fixline:=Copy(s,j,i-j+1);
+      end;
 
 {*****************************************************************************
                                    TAssembler
@@ -603,6 +623,61 @@ Implementation
          end;
       end;
 
+    procedure TExternalAssembler.WriteSourceLine(hp: tailineinfo);
+      begin
+        { load infile }
+        if lastfileinfo.fileindex<>hp.fileinfo.fileindex then
+          begin
+            infile:=current_module.sourcefiles.get_file(hp.fileinfo.fileindex);
+            if assigned(infile) then
+              begin
+                { open only if needed !! }
+                if (cs_asm_source in current_settings.globalswitches) then
+                  infile.open;
+              end;
+            { avoid unnecessary reopens of the same file !! }
+            lastfileinfo.fileindex:=hp.fileinfo.fileindex;
+            { be sure to change line !! }
+            lastfileinfo.line:=-1;
+          end;
+        { write source }
+        if (cs_asm_source in current_settings.globalswitches) and
+          assigned(infile) then
+          begin
+            if (infile<>lastinfile) then
+              begin
+                AsmWriteLn(target_asm.comment+'['+infile.name^+']');
+                if assigned(lastinfile) then
+                  lastinfile.close;
+              end;
+            if (hp.fileinfo.line<>lastfileinfo.line) and
+              (hp.fileinfo.line<infile.maxlinebuf) then
+              begin
+                if (hp.fileinfo.line<>0) and
+                  (infile.linebuf^[hp.fileinfo.line]>=0) then
+                  AsmWriteLn(target_asm.comment+'['+tostr(hp.fileinfo.line)+'] '+
+                  fixline(infile.GetLineStr(hp.fileinfo.line)));
+                { set it to a negative value !
+                  to make that is has been read already !! PM }
+                if (infile.linebuf^[hp.fileinfo.line]>=0) then
+                  infile.linebuf^[hp.fileinfo.line]:=-infile.linebuf^[hp.fileinfo.line]-1;
+              end;
+          end;
+        lastfileinfo:=hp.fileinfo;
+        lastinfile:=infile;
+      end;
+
+    procedure TExternalAssembler.WriteTempalloc(hp: tai_tempalloc);
+      begin
+{$ifdef EXTDEBUG}
+        if assigned(hp.problem) then
+          AsmWriteLn(target_asm.comment+'Temp '+tostr(hp.temppos)+','+
+          tostr(hp.tempsize)+' '+hp.problem^)
+        else
+{$endif EXTDEBUG}
+          AsmWriteLn(target_asm.comment+'Temp '+tostr(hp.temppos)+','+
+            tostr(hp.tempsize)+' '+tempallocstr[hp.allocation]);
+      end;
 
     procedure TExternalAssembler.WriteTree(p:TAsmList);
       begin

+ 9 - 79
compiler/i386/ag386nsm.pas

@@ -78,26 +78,6 @@ interface
           result:=generic_regname(r);
       end;
 
-
-   function fixline(s:string):string;
-   {
-     return s with all leading and ending spaces and tabs removed
-   }
-     var
-       i,j,k : longint;
-     begin
-       i:=length(s);
-       while (i>0) and (s[i] in [#9,' ']) do
-        dec(i);
-       j:=1;
-       while (j<i) and (s[j] in [#9,' ']) do
-        inc(j);
-       for k:=j to i do
-        if s[k] in [#0..#31,#127..#255] then
-         s[k]:='.';
-       fixline:=Copy(s,j,i-j+1);
-     end;
-
     function single2str(d : single) : string;
       var
          hs : string;
@@ -521,7 +501,6 @@ interface
     var
       s : string;
       hp       : tai;
-      hp1      : tailineinfo;
       counter,
       lines,
       i,j,l    : longint;
@@ -546,55 +525,15 @@ interface
       hp:=tai(p.first);
       while assigned(hp) do
        begin
-
+         prefetch(pointer(hp.next)^);
          if not(hp.typ in SkipLineInfo) then
-           begin
-             hp1:=hp as tailineinfo;
-             current_filepos:=hp1.fileinfo;
-             if do_line and (InlineLevel=0) then
-              begin
-              { load infile }
-                if lastfileinfo.fileindex<>hp1.fileinfo.fileindex then
-                 begin
-                   infile:=current_module.sourcefiles.get_file(hp1.fileinfo.fileindex);
-                   if assigned(infile) then
-                    begin
-                      { open only if needed !! }
-                      if (cs_asm_source in current_settings.globalswitches) then
-                       infile.open;
-                    end;
-                   { avoid unnecessary reopens of the same file !! }
-                   lastfileinfo.fileindex:=hp1.fileinfo.fileindex;
-                   { be sure to change line !! }
-                   lastfileinfo.line:=-1;
-                 end;
-              { write source }
-                if (cs_asm_source in current_settings.globalswitches) and
-                   assigned(infile) then
-                 begin
-                   if (infile<>lastinfile) then
-                     begin
-                       AsmWriteLn(target_asm.comment+'['+infile.name^+']');
-                       if assigned(lastinfile) then
-                         lastinfile.close;
-                     end;
-                   if (hp1.fileinfo.line<>lastfileinfo.line) and
-                      ((hp1.fileinfo.line<infile.maxlinebuf) or (InlineLevel>0)) then
-                     begin
-                       if (hp1.fileinfo.line<>0) and
-                          ((infile.linebuf^[hp1.fileinfo.line]>=0) or (InlineLevel>0)) then
-                         AsmWriteLn(target_asm.comment+'['+tostr(hp1.fileinfo.line)+'] '+
-                           fixline(infile.GetLineStr(hp1.fileinfo.line)));
-                       { set it to a negative value !
-                       to make that is has been read already !! PM }
-                       if (infile.linebuf^[hp1.fileinfo.line]>=0) then
-                         infile.linebuf^[hp1.fileinfo.line]:=-infile.linebuf^[hp1.fileinfo.line]-1;
-                     end;
-                 end;
-                lastfileinfo:=hp1.fileinfo;
-                lastinfile:=infile;
-              end;
-           end;
+          begin
+            current_filepos:=tailineinfo(hp).fileinfo;
+            { no line info for inlined code }
+            if do_line and (inlinelevel=0) then
+              WriteSourceLine(hp as tailineinfo);
+          end;
+
          case hp.typ of
            ait_comment :
              Begin
@@ -613,16 +552,7 @@ interface
            ait_tempalloc :
              begin
                if (cs_asm_tempalloc in current_settings.globalswitches) then
-                 begin
-{$ifdef EXTDEBUG}
-                   if assigned(tai_tempalloc(hp).problem) then
-                     AsmWriteLn(target_asm.comment+tai_tempalloc(hp).problem^+' ('+tostr(tai_tempalloc(hp).temppos)+','+
-                       tostr(tai_tempalloc(hp).tempsize)+')')
-                   else
-{$endif EXTDEBUG}
-                     AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
-                       tostr(tai_tempalloc(hp).tempsize)+tempallocstr[tai_tempalloc(hp).allocation]);
-                 end;
+                 WriteTempalloc(tai_tempalloc(hp));
              end;
 
            ait_section :

+ 7 - 68
compiler/powerpc/agppcmpw.pas

@@ -479,25 +479,6 @@ interface
       t[3]:= b;
     end;
 
-   function fixline(s:string):string;
-   {
-     return s with all leading and ending spaces and tabs removed
-   }
-     var
-       i,j,k : longint;
-     begin
-       i:=length(s);
-       while (i>0) and (s[i] in [#9,' ']) do
-        dec(i);
-       j:=1;
-       while (j<i) and (s[j] in [#9,' ']) do
-        inc(j);
-       for k:=j to i do
-        if s[k] in [#0..#31,#127..#255] then
-         s[k]:='.';
-       fixline:=Copy(s,j,i-j+1);
-     end;
-
     Function PadTabs(const p:string;addch:char):string;
     var
       s : string;
@@ -712,7 +693,6 @@ interface
     var
       s        : string;
       hp       : tai;
-      hp1      : tailineinfo;
       counter,
       lines,
       InlineLevel : longint;
@@ -735,54 +715,13 @@ interface
       hp:=tai(p.first);
       while assigned(hp) do
        begin
-         if not(hp.typ in SkipLineInfo) and
-            not DoNotSplitLine then
-           begin
-             hp1 := hp as tailineinfo;
-
-             if do_line then
-              begin
-           { load infile }
-             if lastfileinfo.fileindex<>hp1.fileinfo.fileindex then
-              begin
-                infile:=current_module.sourcefiles.get_file(hp1.fileinfo.fileindex);
-                if assigned(infile) then
-                 begin
-                   { open only if needed !! }
-                   if (cs_asm_source in current_settings.globalswitches) then
-                    infile.open;
-                 end;
-                { avoid unnecessary reopens of the same file !! }
-                lastfileinfo.fileindex:=hp1.fileinfo.fileindex;
-                { be sure to change line !! }
-                lastfileinfo.line:=-1;
-              end;
-           { write source }
-             if (cs_asm_source in current_settings.globalswitches) and
-                assigned(infile) then
-              begin
-                if (infile<>lastinfile) then
-                  begin
-                    AsmWriteLn(target_asm.comment+'['+infile.name^+']');
-                    if assigned(lastinfile) then
-                      lastinfile.close;
-                  end;
-                if (hp1.fileinfo.line<>lastfileinfo.line) and
-                   ((hp1.fileinfo.line<infile.maxlinebuf) or (InlineLevel>0)) then
-                  begin
-                    if (hp1.fileinfo.line<>0) and
-                       ((infile.linebuf^[hp1.fileinfo.line]>=0) or (InlineLevel>0)) then
-                      AsmWriteLn(target_asm.comment+'['+tostr(hp1.fileinfo.line)+'] '+
-                        fixline(infile.GetLineStr(hp1.fileinfo.line)));
-                    { set it to a negative value !
-                    to make that is has been read already !! PM }
-                    if (infile.linebuf^[hp1.fileinfo.line]>=0) then
-                      infile.linebuf^[hp1.fileinfo.line]:=-infile.linebuf^[hp1.fileinfo.line]-1;
-                  end;
-              end;
-             lastfileinfo:=hp1.fileinfo;
-             lastinfile:=infile;
-           end;
+         prefetch(pointer(hp.next)^);
+         if not(hp.typ in SkipLineInfo) then
+          begin
+            current_filepos:=tailineinfo(hp).fileinfo;
+            { no line info for inlined code }
+            if do_line and (inlinelevel=0) and not DoNotSplitLine then
+              WriteSourceLine(hp as tailineinfo);
           end;
 
          DoNotSplitLine:=false;

+ 10 - 76
compiler/x86/agx86int.pas

@@ -221,26 +221,6 @@ implementation
       end;
 
 
-   function fixline(s:string):string;
-   {
-     return s with all leading and ending spaces and tabs removed
-   }
-     var
-       i,j,k : longint;
-     begin
-       i:=length(s);
-       while (i>0) and (s[i] in [#9,' ']) do
-        dec(i);
-       j:=1;
-       while (j<i) and (s[j] in [#9,' ']) do
-        inc(j);
-       for k:=j to i do
-        if s[k] in [#0..#31,#127..#255] then
-         s[k]:='.';
-       fixline:=Copy(s,j,i-j+1);
-     end;
-
-
 {****************************************************************************
                                tx86IntelAssembler
  ****************************************************************************}
@@ -453,7 +433,6 @@ implementation
       prefix,
       suffix   : string;
       hp       : tai;
-      hp1      : tailineinfo;
       counter,
       lines,
       InlineLevel : longint;
@@ -473,52 +452,16 @@ implementation
       hp:=tai(p.first);
       while assigned(hp) do
        begin
-         if do_line and not(hp.typ in SkipLineInfo) and
-            not DoNotSplitLine and (InlineLevel=0) then
-           begin
-              hp1:=hp as tailineinfo;
-           { load infile }
-             if lastfileinfo.fileindex<>hp1.fileinfo.fileindex then
-              begin
-                infile:=current_module.sourcefiles.get_file(hp1.fileinfo.fileindex);
-                if assigned(infile) then
-                 begin
-                   { open only if needed !! }
-                   if (cs_asm_source in current_settings.globalswitches) then
-                    infile.open;
-                 end;
-                { avoid unnecessary reopens of the same file !! }
-                lastfileinfo.fileindex:=hp1.fileinfo.fileindex;
-                { be sure to change line !! }
-                lastfileinfo.line:=-1;
-              end;
-           { write source }
-             if (cs_asm_source in current_settings.globalswitches) and
-                assigned(infile) then
-              begin
-                if (infile<>lastinfile) then
-                  begin
-                    AsmWriteLn(target_asm.comment+'['+infile.name^+']');
-                    if assigned(lastinfile) then
-                      lastinfile.close;
-                  end;
-                if (hp1.fileinfo.line<>lastfileinfo.line) and
-                   ((hp1.fileinfo.line<infile.maxlinebuf) or (InlineLevel>0)) then
-                  begin
-                    if (hp1.fileinfo.line<>0) and
-                       ((infile.linebuf^[hp1.fileinfo.line]>=0) or (InlineLevel>0)) then
-                      AsmWriteLn(target_asm.comment+'['+tostr(hp1.fileinfo.line)+'] '+
-                        fixline(infile.GetLineStr(hp1.fileinfo.line)));
-                    { set it to a negative value !
-                    to make that is has been read already !! PM }
-                    if (infile.linebuf^[hp1.fileinfo.line]>=0) then
-                      infile.linebuf^[hp1.fileinfo.line]:=-infile.linebuf^[hp1.fileinfo.line]-1;
-                  end;
-              end;
-             lastfileinfo:=hp1.fileinfo;
-             lastinfile:=infile;
-           end;
+         prefetch(pointer(hp.next)^);
+         if not(hp.typ in SkipLineInfo) then
+          begin
+            current_filepos:=tailineinfo(hp).fileinfo;
+            { no line info for inlined code }
+            if do_line and (inlinelevel=0) and not DoNotSplitLine then
+              WriteSourceLine(hp as tailineinfo);
+          end;
          DoNotSplitLine:=false;
+
          case hp.typ of
            ait_comment :
              Begin
@@ -537,16 +480,7 @@ implementation
            ait_tempalloc :
              begin
                if (cs_asm_tempalloc in current_settings.globalswitches) then
-                 begin
-{$ifdef EXTDEBUG}
-                   if assigned(tai_tempalloc(hp).problem) then
-                     AsmWriteLn(target_asm.comment+tai_tempalloc(hp).problem^+' ('+tostr(tai_tempalloc(hp).temppos)+','+
-                       tostr(tai_tempalloc(hp).tempsize)+')')
-                   else
-{$endif EXTDEBUG}
-                     AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
-                       tostr(tai_tempalloc(hp).tempsize)+tempallocstr[tai_tempalloc(hp).allocation]);
-                 end;
+                 WriteTempalloc(tai_tempalloc(hp));
              end;
 
            ait_section :