فهرست منبع

* smartlinking fixes for binary writer
* release alignreg code and moved instruction writing align to cpuasm,
but it doesn't use the specified register yet

peter 26 سال پیش
والد
کامیت
96ed273164
7فایلهای تغییر یافته به همراه234 افزوده شده و 159 حذف شده
  1. 33 18
      compiler/aasm.pas
  2. 70 71
      compiler/ag386bin.pas
  3. 7 2
      compiler/cgai386.pas
  4. 86 46
      compiler/cpuasm.pas
  5. 9 3
      compiler/link.pas
  6. 23 16
      compiler/og386cff.pas
  7. 6 3
      compiler/symtable.pas

+ 33 - 18
compiler/aasm.pas

@@ -87,10 +87,11 @@ unit aasm;
 
   { asm symbol functions }
     type
-       TAsmsymtype=(AS_EXTERNAL,AS_LOCAL,AS_GLOBAL);
+       TAsmsymtype=(AS_NONE,AS_EXTERNAL,AS_LOCAL,AS_GLOBAL);
 
        pasmsymbol = ^tasmsymbol;
        tasmsymbol = object(tnamedindexobject)
+         orgtyp,
          typ     : TAsmsymtype;
          proclocal : boolean;
          { this need to be incremented with every symbol loading into the
@@ -107,6 +108,7 @@ unit aasm;
          constructor init(const s:string;_typ:TAsmsymtype);
          procedure reset;
          function  is_used:boolean;
+         procedure settyp(t:tasmsymtype);
          procedure setaddress(sec:tsection;offset,len:longint);
          procedure GenerateAltSymbol;
        end;
@@ -191,19 +193,16 @@ unit aasm;
 
        { alignment for operator }
 
-{$ifndef alignreg}
-       pai_align = ^tai_align;
-       tai_align = object(tai)
-{$else alignreg}
        pai_align_abstract = ^tai_align_abstract;
        tai_align_abstract = object(tai)
-{$endif alignreg}
+          buf       : array[0..63] of char; { buf used for fill }
           aligntype : byte;   { 1 = no align, 2 = word align, 4 = dword align }
           fillsize  : byte;   { real size to fill }
           fillop    : byte;   { value to fill with - optional }
           use_op    : boolean;
           constructor init(b:byte);
           constructor init_op(b: byte; _op: byte);
+          function getfillbuf:pchar;
        end;
 
        { Insert a section/segment directive }
@@ -706,12 +705,7 @@ uses
                               TAI_ALIGN
  ****************************************************************************}
 
-{$ifndef alignreg}
-     constructor tai_align.init(b: byte);
-{$else alignreg}
      constructor tai_align_abstract.init(b: byte);
-{$endif alignreg}
-
        begin
           inherited init;
           typ:=ait_align;
@@ -725,12 +719,7 @@ uses
        end;
 
 
-{$ifndef alignreg}
-     constructor tai_align.init_op(b: byte; _op: byte);
-{$else alignreg}
      constructor tai_align_abstract.init_op(b: byte; _op: byte);
-{$endif alignreg}
-
        begin
           inherited init;
           typ:=ait_align;
@@ -741,6 +730,13 @@ uses
           fillsize:=0;
           fillop:=_op;
           use_op:=true;
+          fillchar(buf,sizeof(buf),_op)
+       end;
+
+
+     function tai_align_abstract.getfillbuf:pchar;
+       begin
+         getfillbuf:=@buf;
        end;
 
 {****************************************************************************
@@ -831,6 +827,10 @@ uses
 
     procedure tasmsymbol.reset;
       begin
+        { save the original typ if not done yet }
+        if orgtyp=AS_NONE then
+         orgtyp:=typ;
+        { reset section info }
         section:=sec_none;
         address:=0;
         size:=0;
@@ -846,11 +846,21 @@ uses
         is_used:=(refs>0);
       end;
 
+    procedure tasmsymbol.settyp(t:tasmsymtype);
+      begin
+        typ:=t;
+        orgtyp:=t;
+      end;
+
     procedure tasmsymbol.setaddress(sec:tsection;offset,len:longint);
       begin
         section:=sec;
         address:=offset;
         size:=len;
+        { when the typ was reset to External, set it back to the original
+          type it got when defined }
+        if (typ=AS_EXTERNAL) and (orgtyp<>AS_NONE) then
+         typ:=orgtyp;
       end;
 
 
@@ -917,7 +927,7 @@ uses
         hp:=pasmsymbol(asmsymbollist^.search(s));
         if assigned(hp) then
          begin
-           hp^.typ:=_typ;
+           hp^.settyp(_typ);
            newasmsymboltyp:=hp;
            exit;
          end;
@@ -1028,7 +1038,12 @@ uses
 end.
 {
   $Log$
-  Revision 1.70  2000-01-07 01:14:18  peter
+  Revision 1.71  2000-01-12 10:38:16  peter
+    * smartlinking fixes for binary writer
+    * release alignreg code and moved instruction writing align to cpuasm,
+      but it doesn't use the specified register yet
+
+  Revision 1.70  2000/01/07 01:14:18  peter
     * updated copyright to 2000
 
   Revision 1.69  1999/12/22 01:01:46  peter

+ 70 - 71
compiler/ag386bin.pas

@@ -305,7 +305,7 @@ unit ag386bin;
            hp:=newasmsymbol('Ltext'+ToStr(IncludeCount));
            if currpass=1 then
              begin
-                hp^.typ:=AS_LOCAL;
+                hp^.settyp(AS_LOCAL);
                 hp^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
              end
            else
@@ -364,7 +364,6 @@ unit ag386bin;
 
     function ti386binasmlist.TreePass0(hp:pai):pai;
       var
-        lastsec : tsection;
         l : longint;
       begin
         while assigned(hp) do
@@ -421,10 +420,7 @@ unit ag386bin;
              ait_const_symbol :
                objectalloc^.sectionalloc(4);
              ait_section:
-               begin
-                 objectalloc^.setsection(pai_section(hp)^.sec);
-                 lastsec:=pai_section(hp)^.sec;
-               end;
+               objectalloc^.setsection(pai_section(hp)^.sec);
              ait_symbol :
                pai_symbol(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
              ait_label :
@@ -439,10 +435,7 @@ unit ag386bin;
                end;
              ait_cut :
                if SmartAsm then
-                begin
-                  objectalloc^.resetsections;
-                  objectalloc^.setsection(lastsec);
-                end;
+                break;
            end;
            hp:=pai(hp^.next);
          end;
@@ -486,7 +479,7 @@ unit ag386bin;
                   begin
                     if pai_datablock(hp)^.is_global then
                      begin
-                       pai_datablock(hp)^.sym^.typ:=AS_EXTERNAL;
+                       pai_datablock(hp)^.sym^.settyp(AS_EXTERNAL);
                        pai_datablock(hp)^.sym^.setaddress(sec_none,pai_datablock(hp)^.size,pai_datablock(hp)^.size);
                      end
                     else
@@ -496,7 +489,7 @@ unit ag386bin;
                          objectalloc^.sectionalign(4)
                        else if l>1 then
                          objectalloc^.sectionalign(2);
-                       pai_datablock(hp)^.sym^.typ:=AS_LOCAL;
+                       pai_datablock(hp)^.sym^.settyp(AS_LOCAL);
                        pai_datablock(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,
                          pai_datablock(hp)^.size);
                        objectalloc^.sectionalloc(pai_datablock(hp)^.size);
@@ -506,9 +499,9 @@ unit ag386bin;
 {$endif}
                    begin
                      if pai_datablock(hp)^.is_global then
-                      pai_datablock(hp)^.sym^.typ:=AS_GLOBAL
+                      pai_datablock(hp)^.sym^.settyp(AS_GLOBAL)
                      else
-                      pai_datablock(hp)^.sym^.typ:=AS_LOCAL;
+                      pai_datablock(hp)^.sym^.settyp(AS_LOCAL);
                      l:=pai_datablock(hp)^.size;
                      if l>2 then
                        objectalloc^.sectionalign(4)
@@ -565,17 +558,17 @@ unit ag386bin;
              ait_symbol :
                begin
                  if pai_symbol(hp)^.is_global then
-                  pai_symbol(hp)^.sym^.typ:=AS_GLOBAL
+                  pai_symbol(hp)^.sym^.settyp(AS_GLOBAL)
                  else
-                  pai_symbol(hp)^.sym^.typ:=AS_LOCAL;
+                  pai_symbol(hp)^.sym^.settyp(AS_LOCAL);
                  pai_symbol(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
                end;
              ait_label :
                begin
                  if pai_label(hp)^.is_global then
-                  pai_label(hp)^.l^.typ:=AS_GLOBAL
+                  pai_label(hp)^.l^.settyp(AS_GLOBAL)
                  else
-                  pai_label(hp)^.l^.typ:=AS_LOCAL;
+                  pai_label(hp)^.l^.settyp(AS_LOCAL);
                  pai_label(hp)^.l^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
                end;
              ait_string :
@@ -595,18 +588,8 @@ unit ag386bin;
 
 
     function ti386binasmlist.TreePass2(hp:pai):pai;
-      const
-        alignarray:array[0..5] of string[8]=(
-          #$8D#$B4#$26#$00#$00#$00#$00,
-          #$8D#$B6#$00#$00#$00#$00,
-          #$8D#$74#$26#$00,
-          #$8D#$76#$00,
-          #$89#$F6,
-          #$90
-        );
       var
-        l,j : longint;
-        alignoparray:array[0..63] of byte;
+        l  : longint;
 {$ifdef I386}
         co : comp;
 {$endif I386}
@@ -619,7 +602,7 @@ unit ag386bin;
            if cs_debuginfo in aktmoduleswitches then
             begin
               if (objectoutput^.currsec<>sec_none) and
-                 not(hp^.typ in  [
+                 not(hp^.typ in [
                      ait_label,
                      ait_regalloc,ait_tempalloc,
                      ait_stabn,ait_stabs,ait_section,
@@ -629,25 +612,7 @@ unit ag386bin;
 {$endif GDB}
            case hp^.typ of
              ait_align :
-               begin
-                 if not pai_align(hp)^.use_op then
-                  begin
-                    l:=pai_align(hp)^.fillsize;
-                    while (l>0) do
-                     begin
-                       for j:=0to 5 do
-                        if (l>=length(alignarray[j])) then
-                         break;
-                       objectoutput^.writebytes(alignarray[j][1],length(alignarray[j]));
-                       dec(l,length(alignarray[j]));
-                     end;
-                  end
-                 else
-                  begin
-                    fillchar(alignoparray,pai_align(hp)^.fillsize,pai_align(hp)^.fillop);
-                    objectoutput^.writebytes(alignoparray,pai_align(hp)^.fillsize);
-                  end;
-               end;
+               objectoutput^.writebytes(pai_align(hp)^.getfillbuf^,pai_align(hp)^.fillsize);
              ait_section :
                begin
                  objectoutput^.defaultsection(pai_section(hp)^.sec);
@@ -741,11 +706,32 @@ unit ag386bin;
       var
         hp : pai;
       begin
-        objectalloc^.setsection(sec_code);
+      { reset the asmsymbol list }
+        ResetAsmsymbolList;
         objectoutput^.defaultsection(sec_code);
 
+{$ifdef MULTIPASS}
+      { Pass 0 }
+        currpass:=0;
+        objectalloc^.setsection(sec_code);
+        { start with list 1 }
+        currlistidx:=1;
+        currlist:=list[currlistidx];
+        hp:=pai(currlist^.first);
+        while assigned(hp) do
+         begin
+           hp:=TreePass0(hp);
+           MaybeNextList(hp);
+         end;
+        { leave if errors have occured }
+        if errorcount>0 then
+         exit;
+{$endif}
+
       { Pass 1 }
         currpass:=1;
+        objectalloc^.resetsections;
+        objectalloc^.setsection(sec_code);
 {$ifdef GDB}
         StartFileLineInfo;
 {$endif GDB}
@@ -786,17 +772,33 @@ unit ag386bin;
     procedure ti386binasmlist.writetreesmart;
       var
         hp : pai;
+        startsec : tsection;
       begin
-        objectalloc^.setsection(sec_code);
-        objectoutput^.defaultsection(sec_code);
+        startsec:=sec_code;
         { start with list 1 }
         currlistidx:=1;
         currlist:=list[currlistidx];
         hp:=pai(currlist^.first);
         while assigned(hp) do
          begin
+         { reset the asmsymbol list }
+           ResetAsmsymbolList;
+
+{$ifdef MULTIPASS}
+         { Pass 0 }
+           currpass:=0;
+           objectalloc^.resetsections;
+           objectalloc^.setsection(startsec);
+           TreePass0(hp);
+{$endif}
+           { leave if errors have occured }
+           if errorcount>0 then
+            exit;
+
          { Pass 1 }
            currpass:=1;
+           objectalloc^.resetsections;
+           objectalloc^.setsection(startsec);
 {$ifdef GDB}
            StartFileLineInfo;
 {$endif GDB}
@@ -811,37 +813,36 @@ unit ag386bin;
 
          { Pass 2 }
            currpass:=2;
+           objectoutput^.defaultsection(startsec);
 {$ifdef GDB}
            StartFileLineInfo;
 {$endif GDB}
            hp:=TreePass2(hp);
-
-           if not MaybeNextList(hp) then
-            break;
-
            { leave if errors have occured }
            if errorcount>0 then
             exit;
-           { write the current objectfile }
+
+           { end of lists? }
+           if not MaybeNextList(hp) then
+            break;
+           { if not end then write the current objectfile }
            objectoutput^.donewriting;
 
+           { save section for next loop }
+           startsec:=objectalloc^.currsec;
+
            { we will start a new objectfile so reset everything }
            if (hp^.typ=ait_cut) then
             objectoutput^.initwriting(pai_cut(hp)^.place)
            else
             objectoutput^.initwriting(cut_normal);
-           objectalloc^.resetsections;
-           ResetAsmsymbolList;
 
            { avoid empty files }
            while assigned(hp^.next) and
                  (pai(hp^.next)^.typ in [ait_marker,ait_comment,ait_section,ait_cut]) do
             begin
               if pai(hp^.next)^.typ=ait_section then
-                begin
-                  objectalloc^.setsection(pai_section(hp^.next)^.sec);
-                  objectoutput^.defaultsection(pai_section(hp^.next)^.sec);
-                end;
+               startsec:=pai_section(hp^.next)^.sec;
               hp:=pai(hp^.next);
             end;
 
@@ -862,13 +863,6 @@ unit ag386bin;
         end;
 
       begin
-{$ifdef MULTIPASS}
-        { Process the codesegment twice so the short jmp instructions can
-          be optimized }
-        currpass:=0;
-        TreePass0(pai(codesegment^.first));
-{$endif}
-
         objectalloc^.resetsections;
         objectalloc^.setsection(sec_code);
 
@@ -932,7 +926,12 @@ unit ag386bin;
 end.
 {
   $Log$
-  Revision 1.33  2000-01-07 01:14:18  peter
+  Revision 1.34  2000-01-12 10:38:17  peter
+    * smartlinking fixes for binary writer
+    * release alignreg code and moved instruction writing align to cpuasm,
+      but it doesn't use the specified register yet
+
+  Revision 1.33  2000/01/07 01:14:18  peter
     * updated copyright to 2000
 
   Revision 1.32  1999/12/24 15:22:52  peter

+ 7 - 2
compiler/cgai386.pas

@@ -3313,7 +3313,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
           exprasmlist^.insert(new(pai_align,init_op(16,$90)))
          else
           if not(cs_littlesize in aktglobalswitches) then
-           exprasmlist^.insert(new(pai_align,init_op(16,$90)));
+           exprasmlist^.insert(new(pai_align,init(16)));
        end;
       exprasmlist:=oldexprasmlist;
   end;
@@ -3660,7 +3660,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.68  2000-01-09 12:35:02  jonas
+  Revision 1.69  2000-01-12 10:38:17  peter
+    * smartlinking fixes for binary writer
+    * release alignreg code and moved instruction writing align to cpuasm,
+      but it doesn't use the specified register yet
+
+  Revision 1.68  2000/01/09 12:35:02  jonas
     * changed edi allocation to use getexplicitregister32/ungetregister
       (adapted tgeni386 a bit for this) and enabled it by default
     * fixed very big and stupid bug of mine in cg386mat that broke the

+ 86 - 46
compiler/cpuasm.pas

@@ -53,15 +53,14 @@ type
      constructor dealloc(r : tregister);
   end;
 
-{$ifdef alignreg}
-       { alignment for operator }
-       pai_align = ^tai_align;
-       tai_align = object(tai_align_abstract)
-          reg       : tregister;
-          constructor init(b:byte);
-          constructor init_op(b: byte; _op: byte);
-       end;
-{$endif alignreg}
+  { alignment for operator }
+  pai_align = ^tai_align;
+  tai_align = object(tai_align_abstract)
+     reg       : tregister;
+     constructor init(b:byte);
+     constructor init_op(b: byte; _op: byte);
+     function getfillbuf:pchar;
+  end;
 
   paicpu = ^taicpu;
   taicpu = object(tai)
@@ -166,27 +165,53 @@ uses
       end;
 
 
-{$ifdef alignreg}
 {****************************************************************************
                               TAI_ALIGN
  ****************************************************************************}
 
-     constructor tai_align.init(b: byte);
+    constructor tai_align.init(b: byte);
+      begin
+        inherited init(b);
+        reg := R_ECX;
+      end;
 
-       begin
-          inherited init(b);
-          reg := R_ECX;
-       end;
 
+    constructor tai_align.init_op(b: byte; _op: byte);
+      begin
+        inherited init_op(b,_op);
+        reg := R_NO;
+      end;
 
-     constructor tai_align.init_op(b: byte; _op: byte);
 
-       begin
-          inherited init_op(b,_op);
-          reg := R_ECX;
-       end;
-
-{$endif alignreg}
+    function tai_align.getfillbuf:pchar;
+      const
+        alignarray:array[0..5] of string[8]=(
+          #$8D#$B4#$26#$00#$00#$00#$00,
+          #$8D#$B6#$00#$00#$00#$00,
+          #$8D#$74#$26#$00,
+          #$8D#$76#$00,
+          #$89#$F6,
+          #$90
+        );
+      var
+        bufptr : pchar;
+        j : longint;
+      begin
+        if not use_op then
+         begin
+           bufptr:=@buf;
+           while (fillsize>0) do
+            begin
+              for j:=0to 5 do
+               if (fillsize>=length(alignarray[j])) then
+                break;
+              move(alignarray[j][1],bufptr^,length(alignarray[j]));
+              inc(bufptr,length(alignarray[j]));
+              dec(fillsize,length(alignarray[j]));
+            end;
+         end;
+        getfillbuf:=pchar(@buf);
+      end;
 
 
 {*****************************************************************************
@@ -206,6 +231,7 @@ uses
          end;
       end;
 
+
     procedure taicpu.loadsymbol(opidx:longint;s:pasmsymbol;sofs:longint);
       begin
         if opidx>=ops then
@@ -223,6 +249,7 @@ uses
          inc(s^.refs);
       end;
 
+
     procedure taicpu.loadref(opidx:longint;p:preference);
       begin
         if opidx>=ops then
@@ -253,6 +280,7 @@ uses
          end;
       end;
 
+
     procedure taicpu.loadreg(opidx:longint;r:tregister);
       begin
         if opidx>=ops then
@@ -299,9 +327,11 @@ uses
          insentry:=nil;
          LastInsOffset:=-1;
          InsOffset:=0;
+         InsSize:=0;
 {$endif}
       end;
 
+
     constructor taicpu.op_none(op : tasmop;_size : topsize);
       begin
          inherited init;
@@ -395,6 +425,7 @@ uses
          loadref(1,_op2);
       end;
 
+
     constructor taicpu.op_ref_reg(op : tasmop;_size : topsize;_op1 : preference;_op2 : tregister);
       begin
          inherited init;
@@ -435,7 +466,7 @@ uses
          loadreg(2,_op3);
       end;
 
-     constructor taicpu.op_reg_reg_ref(op : tasmop;_size : topsize;_op1,_op2 : tregister;_op3 : preference);
+    constructor taicpu.op_reg_reg_ref(op : tasmop;_size : topsize;_op1,_op2 : tregister;_op3 : preference);
       begin
          inherited init;
          init(op,_size);
@@ -445,7 +476,8 @@ uses
          loadref(2,_op3);
       end;
 
-     constructor taicpu.op_const_ref_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : preference;_op3 : tregister);
+
+    constructor taicpu.op_const_ref_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : preference;_op3 : tregister);
       begin
          inherited init;
          init(op,_size);
@@ -455,7 +487,8 @@ uses
          loadreg(2,_op3);
       end;
 
-     constructor taicpu.op_const_reg_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister;_op3 : preference);
+
+    constructor taicpu.op_const_reg_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister;_op3 : preference);
       begin
          inherited init;
          init(op,_size);
@@ -513,6 +546,7 @@ uses
          loadref(1,_op2);
       end;
 
+
     destructor taicpu.done;
       var
         i : longint;
@@ -528,6 +562,7 @@ uses
         inherited done;
       end;
 
+
     function taicpu.getcopy:plinkedlist_item;
       var
         i : longint;
@@ -622,26 +657,26 @@ uses
       end;
 
 
-procedure taicpu.SwapOperands;
-var
-  p : TOper;
-begin
-  { Fix the operands which are in AT&T style and we need them in Intel style }
-  case ops of
-    2 : begin
-          { 0,1 -> 1,0 }
-          p:=oper[0];
-          oper[0]:=oper[1];
-          oper[1]:=p;
-        end;
-    3 : begin
-          { 0,1,2 -> 2,1,0 }
-          p:=oper[0];
-          oper[0]:=oper[2];
-          oper[2]:=p;
+    procedure taicpu.SwapOperands;
+      var
+        p : TOper;
+      begin
+        { Fix the operands which are in AT&T style and we need them in Intel style }
+        case ops of
+          2 : begin
+                { 0,1 -> 1,0 }
+                p:=oper[0];
+                oper[0]:=oper[1];
+                oper[1]:=p;
+              end;
+          3 : begin
+                { 0,1,2 -> 2,1,0 }
+                p:=oper[0];
+                oper[0]:=oper[2];
+                oper[2]:=p;
+              end;
         end;
-  end;
-end;
+      end;
 
 
 {*****************************************************************************
@@ -831,7 +866,7 @@ begin
      ((InsEntry^.flags and IF_PASS2)<>0) then
    begin
      InsEntry:=nil;
-     InsSize:=-1;
+     InsSize:=0;
    end;
   LastInsOffset:=-1;
 end;
@@ -1565,7 +1600,12 @@ end;
 end.
 {
   $Log$
-  Revision 1.9  2000-01-07 01:14:23  peter
+  Revision 1.10  2000-01-12 10:38:18  peter
+    * smartlinking fixes for binary writer
+    * release alignreg code and moved instruction writing align to cpuasm,
+      but it doesn't use the specified register yet
+
+  Revision 1.9  2000/01/07 01:14:23  peter
     * updated copyright to 2000
 
   Revision 1.8  2000/01/07 00:07:24  peter

+ 9 - 3
compiler/link.pas

@@ -430,13 +430,14 @@ var
   cnt     : longint;
 begin
   MakeStaticLibrary:=false;
-
+{ remove the library, to be sure that it is rewritten }
+  RemoveFile(current_module^.staticlibfilename^);
+{ Call AR }
   smartpath:=current_module^.outputpath^+FixPath(FixFileName(current_module^.modulename^)+target_info.smartext,false);
   SplitBinCmd(target_ar.arcmd,binstr,cmdstr);
   Replace(cmdstr,'$LIB',current_module^.staticlibfilename^);
   Replace(cmdstr,'$FILES',FixFileName(smartpath+current_module^.asmprefix^+'*'+target_info.objext));
   success:=DoExec(FindUtil(binstr),cmdstr,false,true);
-
 { Clean up }
   if not(cs_asm_leave in aktglobalswitches) then
    if not(cs_link_extern in aktglobalswitches) then
@@ -521,7 +522,12 @@ end;
 end.
 {
   $Log$
-  Revision 1.80  2000-01-11 09:52:06  peter
+  Revision 1.81  2000-01-12 10:38:18  peter
+    * smartlinking fixes for binary writer
+    * release alignreg code and moved instruction writing align to cpuasm,
+      but it doesn't use the specified register yet
+
+  Revision 1.80  2000/01/11 09:52:06  peter
     * fixed placing of .sl directories
     * use -b again for base-file selection
     * fixed group writing for linux with smartlinking

+ 23 - 16
compiler/og386cff.pas

@@ -775,22 +775,24 @@ unit og386cff;
         { fix all section }
         mempos:=0;
         for sec:=low(tsection) to high(tsection) do
-         if s[sec]>0 then
-          begin
-            if not assigned(sects[sec]) then
+         begin
+           if (s[sec]>0) and (not assigned(sects[sec])) then
              createsection(sec);
-            sects[sec]^.size:=s[sec];
-            sects[sec]^.mempos:=mempos;
-            { calculate the alignment }
-            align:=sects[sec]^.align;
-            sects[sec]^.fillsize:=align-(sects[sec]^.size and (align-1));
-            if sects[sec]^.fillsize=align then
-             sects[sec]^.fillsize:=0;
-            { next section position, not for win32 which uses
-              relative addresses }
-            if not win32 then
-              inc(mempos,sects[sec]^.size+sects[sec]^.fillsize);
-          end;
+           if assigned(sects[sec]) then
+            begin
+              sects[sec]^.size:=s[sec];
+              sects[sec]^.mempos:=mempos;
+              { calculate the alignment }
+              align:=sects[sec]^.align;
+              sects[sec]^.fillsize:=align-(sects[sec]^.size and (align-1));
+              if sects[sec]^.fillsize=align then
+               sects[sec]^.fillsize:=0;
+              { next section position, not for win32 which uses
+                relative addresses }
+              if not win32 then
+                inc(mempos,sects[sec]^.size+sects[sec]^.fillsize);
+            end;
+         end;
       end;
 
 
@@ -982,7 +984,12 @@ unit og386cff;
 end.
 {
   $Log$
-  Revision 1.17  2000-01-07 01:14:27  peter
+  Revision 1.18  2000-01-12 10:38:18  peter
+    * smartlinking fixes for binary writer
+    * release alignreg code and moved instruction writing align to cpuasm,
+      but it doesn't use the specified register yet
+
+  Revision 1.17  2000/01/07 01:14:27  peter
     * updated copyright to 2000
 
   Revision 1.16  1999/12/20 22:29:26  pierre

+ 6 - 3
compiler/symtable.pas

@@ -484,9 +484,7 @@ implementation
 {$ifdef BrowserLog}
      ,browlog
 {$endif BrowserLog}
-{$ifdef alignreg}
      ,cpuasm
-{$endif alignreg}
      ;
 
   var
@@ -2771,7 +2769,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.74  2000-01-09 00:37:56  pierre
+  Revision 1.75  2000-01-12 10:38:18  peter
+    * smartlinking fixes for binary writer
+    * release alignreg code and moved instruction writing align to cpuasm,
+      but it doesn't use the specified register yet
+
+  Revision 1.74  2000/01/09 00:37:56  pierre
    * avoid testing object types that are simple aliases for unused privates
 
   Revision 1.73  2000/01/07 01:14:41  peter