mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 15:39:24 +01:00 
			
		
		
		
	* smartlinking works for win32
* some defines to exclude some compiler parts
This commit is contained in:
		
							parent
							
								
									837c1582a3
								
							
						
					
					
						commit
						f98459e1fb
					
				@ -123,6 +123,7 @@ unit aasm;
 | 
				
			|||||||
       plabel = ^tlabel;
 | 
					       plabel = ^tlabel;
 | 
				
			||||||
       tlabel = record
 | 
					       tlabel = record
 | 
				
			||||||
                  nb       : longint;
 | 
					                  nb       : longint;
 | 
				
			||||||
 | 
					                  is_data  : boolean;
 | 
				
			||||||
                  is_used  : boolean;
 | 
					                  is_used  : boolean;
 | 
				
			||||||
                  is_set   : boolean;
 | 
					                  is_set   : boolean;
 | 
				
			||||||
                  refcount : word;
 | 
					                  refcount : word;
 | 
				
			||||||
@ -285,6 +286,8 @@ type
 | 
				
			|||||||
    function lab2str(l : plabel) : string;
 | 
					    function lab2str(l : plabel) : string;
 | 
				
			||||||
    { make l as a new label }
 | 
					    { make l as a new label }
 | 
				
			||||||
    procedure getlabel(var l : plabel);
 | 
					    procedure getlabel(var l : plabel);
 | 
				
			||||||
 | 
					    { make l as a new label and flag is_data }
 | 
				
			||||||
 | 
					    procedure getdatalabel(var l : plabel);
 | 
				
			||||||
    { frees the label if unused }
 | 
					    { frees the label if unused }
 | 
				
			||||||
    procedure freelabel(var l : plabel);
 | 
					    procedure freelabel(var l : plabel);
 | 
				
			||||||
    { make a new zero label }
 | 
					    { make a new zero label }
 | 
				
			||||||
@ -585,18 +588,15 @@ uses
 | 
				
			|||||||
          typ:=ait_label;
 | 
					          typ:=ait_label;
 | 
				
			||||||
          l:=_l;
 | 
					          l:=_l;
 | 
				
			||||||
          l^.is_set:=true;
 | 
					          l^.is_set:=true;
 | 
				
			||||||
          { suggestion of JM:
 | 
					 | 
				
			||||||
            inc(l^.refcount); }
 | 
					 | 
				
			||||||
       end;
 | 
					       end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    destructor tai_label.done;
 | 
					    destructor tai_label.done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
         { suggestion of JM:
 | 
					 | 
				
			||||||
         dec(l^.refcount);  }
 | 
					 | 
				
			||||||
         if (l^.is_used) then
 | 
					         if (l^.is_used) then
 | 
				
			||||||
           l^.is_set:=false
 | 
					           l^.is_set:=false
 | 
				
			||||||
         else dispose(l);
 | 
					         else
 | 
				
			||||||
 | 
					           dispose(l);
 | 
				
			||||||
         inherited done;
 | 
					         inherited done;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -751,15 +751,20 @@ uses
 | 
				
			|||||||
    function lab2str(l : plabel) : string;
 | 
					    function lab2str(l : plabel) : string;
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
         if (l=nil) or (l^.nb=0) then
 | 
					         if (l=nil) or (l^.nb=0) then
 | 
				
			||||||
 | 
					           begin
 | 
				
			||||||
{$ifdef EXTDEBUG}
 | 
					{$ifdef EXTDEBUG}
 | 
				
			||||||
           lab2str:='ILLEGAL'
 | 
					             lab2str:='ILLEGAL'
 | 
				
			||||||
         else
 | 
					 | 
				
			||||||
           lab2str:=target_asm.labelprefix+tostr(l^.nb);
 | 
					 | 
				
			||||||
{$else EXTDEBUG}
 | 
					{$else EXTDEBUG}
 | 
				
			||||||
         internalerror(2000);
 | 
					             internalerror(2000);
 | 
				
			||||||
         lab2str:=target_asm.labelprefix+tostr(l^.nb);
 | 
					 | 
				
			||||||
{$endif EXTDEBUG}
 | 
					{$endif EXTDEBUG}
 | 
				
			||||||
         { was missed: }
 | 
					           end
 | 
				
			||||||
 | 
					         else
 | 
				
			||||||
 | 
					           begin
 | 
				
			||||||
 | 
					             if (l^.is_data) and (cs_smartlink in aktswitches) then
 | 
				
			||||||
 | 
					              lab2str:='_$'+current_module^.modulename^+'$_L'+tostr(l^.nb)
 | 
				
			||||||
 | 
					             else
 | 
				
			||||||
 | 
					              lab2str:=target_asm.labelprefix+tostr(l^.nb);
 | 
				
			||||||
 | 
					           end;
 | 
				
			||||||
         inc(l^.refcount);
 | 
					         inc(l^.refcount);
 | 
				
			||||||
         l^.is_used:=true;
 | 
					         l^.is_used:=true;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
@ -771,6 +776,19 @@ uses
 | 
				
			|||||||
         l^.nb:=nextlabelnr;
 | 
					         l^.nb:=nextlabelnr;
 | 
				
			||||||
         l^.is_used:=false;
 | 
					         l^.is_used:=false;
 | 
				
			||||||
         l^.is_set:=false;
 | 
					         l^.is_set:=false;
 | 
				
			||||||
 | 
					         l^.is_data:=false;
 | 
				
			||||||
 | 
					         l^.refcount:=0;
 | 
				
			||||||
 | 
					         inc(nextlabelnr);
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    procedure getdatalabel(var l : plabel);
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					         new(l);
 | 
				
			||||||
 | 
					         l^.nb:=nextlabelnr;
 | 
				
			||||||
 | 
					         l^.is_used:=false;
 | 
				
			||||||
 | 
					         l^.is_set:=false;
 | 
				
			||||||
 | 
					         l^.is_data:=true;
 | 
				
			||||||
         l^.refcount:=0;
 | 
					         l^.refcount:=0;
 | 
				
			||||||
         inc(nextlabelnr);
 | 
					         inc(nextlabelnr);
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
@ -791,6 +809,7 @@ uses
 | 
				
			|||||||
           nb:=0;
 | 
					           nb:=0;
 | 
				
			||||||
           is_used:=false;
 | 
					           is_used:=false;
 | 
				
			||||||
           is_set:=false;
 | 
					           is_set:=false;
 | 
				
			||||||
 | 
					           is_data:=false;
 | 
				
			||||||
           refcount:=0;
 | 
					           refcount:=0;
 | 
				
			||||||
         end;
 | 
					         end;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
@ -802,6 +821,7 @@ uses
 | 
				
			|||||||
         l^.nb:=0;
 | 
					         l^.nb:=0;
 | 
				
			||||||
         l^.is_used:=false;
 | 
					         l^.is_used:=false;
 | 
				
			||||||
         l^.is_set:=false;
 | 
					         l^.is_set:=false;
 | 
				
			||||||
 | 
					         l^.is_data:=false;
 | 
				
			||||||
         l^.refcount:=0;
 | 
					         l^.refcount:=0;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -817,7 +837,11 @@ uses
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.9  1998-06-04 23:51:26  peter
 | 
					  Revision 1.10  1998-06-08 22:59:41  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.9  1998/06/04 23:51:26  peter
 | 
				
			||||||
    * m68k compiles
 | 
					    * m68k compiles
 | 
				
			||||||
    + .def file creation moved to gendef.pas so it could also be used
 | 
					    + .def file creation moved to gendef.pas so it could also be used
 | 
				
			||||||
      for win32
 | 
					      for win32
 | 
				
			||||||
 | 
				
			|||||||
@ -45,6 +45,7 @@ type
 | 
				
			|||||||
    srcfile,
 | 
					    srcfile,
 | 
				
			||||||
    as_bin   : string;
 | 
					    as_bin   : string;
 | 
				
			||||||
  {outfile}
 | 
					  {outfile}
 | 
				
			||||||
 | 
					    AsmSize,
 | 
				
			||||||
    outcnt   : longint;
 | 
					    outcnt   : longint;
 | 
				
			||||||
    outbuf   : array[0..AsmOutSize-1] of char;
 | 
					    outbuf   : array[0..AsmOutSize-1] of char;
 | 
				
			||||||
    outfile  : file;
 | 
					    outfile  : file;
 | 
				
			||||||
@ -82,10 +83,26 @@ uses
 | 
				
			|||||||
{$endif}
 | 
					{$endif}
 | 
				
			||||||
  ,strings
 | 
					  ,strings
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
  ,ag386att,ag386int,ag386nsm
 | 
					  {$ifndef NoAg386Att}
 | 
				
			||||||
 | 
					    ,ag386att
 | 
				
			||||||
 | 
					  {$endif NoAg386Att}
 | 
				
			||||||
 | 
					  {$ifndef NoAg386Nsm}
 | 
				
			||||||
 | 
					    ,ag386nsm
 | 
				
			||||||
 | 
					  {$endif NoAg386Nsm}
 | 
				
			||||||
 | 
					  {$ifndef NoAg386Int}
 | 
				
			||||||
 | 
					    ,ag386int
 | 
				
			||||||
 | 
					  {$endif NoAg386Int}
 | 
				
			||||||
{$endif}
 | 
					{$endif}
 | 
				
			||||||
{$ifdef m68k}
 | 
					{$ifdef m68k}
 | 
				
			||||||
  ,ag68kmot,ag68kgas,ag68kmit
 | 
					  {$ifndef NoAg68kGas}
 | 
				
			||||||
 | 
					    ,ag68kgas
 | 
				
			||||||
 | 
					  {$endif NoAg68kGas}
 | 
				
			||||||
 | 
					  {$ifndef NoAg68kMot}
 | 
				
			||||||
 | 
					    ,ag68kmot
 | 
				
			||||||
 | 
					  {$endif NoAg68kMot}
 | 
				
			||||||
 | 
					  {$ifndef NoAg68kMit}
 | 
				
			||||||
 | 
					    ,ag68kmit
 | 
				
			||||||
 | 
					  {$endif NoAg68kMit}
 | 
				
			||||||
{$endif}
 | 
					{$endif}
 | 
				
			||||||
  ;
 | 
					  ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -231,6 +248,7 @@ begin
 | 
				
			|||||||
   AsmFlush;
 | 
					   AsmFlush;
 | 
				
			||||||
  Move(s[1],OutBuf[OutCnt],length(s));
 | 
					  Move(s[1],OutBuf[OutCnt],length(s));
 | 
				
			||||||
  inc(OutCnt,length(s));
 | 
					  inc(OutCnt,length(s));
 | 
				
			||||||
 | 
					  inc(AsmSize,length(s));
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -254,6 +272,7 @@ begin
 | 
				
			|||||||
      AsmFlush;
 | 
					      AsmFlush;
 | 
				
			||||||
     Move(p[0],OutBuf[OutCnt],i);
 | 
					     Move(p[0],OutBuf[OutCnt],i);
 | 
				
			||||||
     inc(OutCnt,i);
 | 
					     inc(OutCnt,i);
 | 
				
			||||||
 | 
					     inc(AsmSize,i);
 | 
				
			||||||
     dec(j,i);
 | 
					     dec(j,i);
 | 
				
			||||||
     p:=pchar(@p[i]);
 | 
					     p:=pchar(@p[i]);
 | 
				
			||||||
   end;
 | 
					   end;
 | 
				
			||||||
@ -266,10 +285,12 @@ begin
 | 
				
			|||||||
   AsmFlush;
 | 
					   AsmFlush;
 | 
				
			||||||
  OutBuf[OutCnt]:=target_os.newline[1];
 | 
					  OutBuf[OutCnt]:=target_os.newline[1];
 | 
				
			||||||
  inc(OutCnt);
 | 
					  inc(OutCnt);
 | 
				
			||||||
 | 
					  inc(AsmSize);
 | 
				
			||||||
  if length(target_os.newline)>1 then
 | 
					  if length(target_os.newline)>1 then
 | 
				
			||||||
   begin
 | 
					   begin
 | 
				
			||||||
     OutBuf[OutCnt]:=target_os.newline[2];
 | 
					     OutBuf[OutCnt]:=target_os.newline[2];
 | 
				
			||||||
     inc(OutCnt);
 | 
					     inc(OutCnt);
 | 
				
			||||||
 | 
					     inc(AsmSize);
 | 
				
			||||||
   end;
 | 
					   end;
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -295,6 +316,7 @@ begin
 | 
				
			|||||||
      Message1(exec_d_cant_create_asmfile,asmfile);
 | 
					      Message1(exec_d_cant_create_asmfile,asmfile);
 | 
				
			||||||
   end;
 | 
					   end;
 | 
				
			||||||
  outcnt:=0;
 | 
					  outcnt:=0;
 | 
				
			||||||
 | 
					  AsmSize:=0;
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -380,20 +402,32 @@ var
 | 
				
			|||||||
begin
 | 
					begin
 | 
				
			||||||
  case aktoutputformat of
 | 
					  case aktoutputformat of
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
 | 
					  {$ifndef NoAg386Att}
 | 
				
			||||||
        as_o : a:=new(pi386attasmlist,Init(fn));
 | 
					        as_o : a:=new(pi386attasmlist,Init(fn));
 | 
				
			||||||
 | 
					  {$endif NoAg386Att}
 | 
				
			||||||
 | 
					  {$ifndef NoAg386Nsm}
 | 
				
			||||||
 as_nasmcoff,
 | 
					 as_nasmcoff,
 | 
				
			||||||
  as_nasmelf,
 | 
					  as_nasmelf,
 | 
				
			||||||
  as_nasmobj : a:=new(pi386nasmasmlist,Init(fn));
 | 
					  as_nasmobj : a:=new(pi386nasmasmlist,Init(fn));
 | 
				
			||||||
 | 
					  {$endif NoAg386Nsm}
 | 
				
			||||||
 | 
					  {$ifndef NoAg386Int}
 | 
				
			||||||
     as_tasm : a:=new(pi386intasmlist,Init(fn));
 | 
					     as_tasm : a:=new(pi386intasmlist,Init(fn));
 | 
				
			||||||
 | 
					  {$endif NoAg386Int}
 | 
				
			||||||
{$endif}
 | 
					{$endif}
 | 
				
			||||||
{$ifdef m68k}
 | 
					{$ifdef m68k}
 | 
				
			||||||
 | 
					  {$ifndef NoAg68kGas}
 | 
				
			||||||
     as_o,
 | 
					     as_o,
 | 
				
			||||||
   as_gas : a:=new(pm68kgasasmlist,Init(fn));
 | 
					   as_gas : a:=new(pm68kgasasmlist,Init(fn));
 | 
				
			||||||
 | 
					  {$endif NoAg86KGas}
 | 
				
			||||||
 | 
					  {$ifndef NoAg68kMot}
 | 
				
			||||||
   as_mot : a:=new(pm68kmotasmlist,Init(fn));
 | 
					   as_mot : a:=new(pm68kmotasmlist,Init(fn));
 | 
				
			||||||
 | 
					  {$endif NoAg86kMot}
 | 
				
			||||||
 | 
					  {$ifndef NoAg68kMit}
 | 
				
			||||||
   as_mit : a:=new(pm68kmitasmlist,Init(fn));
 | 
					   as_mit : a:=new(pm68kmitasmlist,Init(fn));
 | 
				
			||||||
 | 
					  {$endif NoAg86KMot}
 | 
				
			||||||
{$endif}
 | 
					{$endif}
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
   internalerror(30000);
 | 
					   Comment(V_Fatal,'Selected assembler output not supported!');
 | 
				
			||||||
  end;
 | 
					  end;
 | 
				
			||||||
  a^.AsmCreate;
 | 
					  a^.AsmCreate;
 | 
				
			||||||
  a^.WriteAsmList;
 | 
					  a^.WriteAsmList;
 | 
				
			||||||
@ -416,7 +450,11 @@ end;
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.10  1998-06-04 23:51:33  peter
 | 
					  Revision 1.11  1998-06-08 22:59:43  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.10  1998/06/04 23:51:33  peter
 | 
				
			||||||
    * m68k compiles
 | 
					    * m68k compiles
 | 
				
			||||||
    + .def file creation moved to gendef.pas so it could also be used
 | 
					    + .def file creation moved to gendef.pas so it could also be used
 | 
				
			||||||
      for win32
 | 
					      for win32
 | 
				
			||||||
 | 
				
			|||||||
@ -1,63 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
    $Id$
 | 
					 | 
				
			||||||
    Copyright (c) 1993-98 by Florian Klaempfl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This unit generates i386 (or better) assembler from the parse tree
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or modify
 | 
					 | 
				
			||||||
    it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
    the Free Software Foundation; either version 2 of the License, or
 | 
					 | 
				
			||||||
    (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    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.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
    along with this program; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 ****************************************************************************
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
{$ifdef tp}
 | 
					 | 
				
			||||||
  {$E+,F+,N+,D+,L+,Y+}
 | 
					 | 
				
			||||||
{$endif}
 | 
					 | 
				
			||||||
unit cgi3862;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uses
 | 
					 | 
				
			||||||
       verbose,cobjects,systems,globals,tree,
 | 
					 | 
				
			||||||
       symtable,types,strings,pass_1,hcodegen,
 | 
					 | 
				
			||||||
       aasm,i386,tgeni386,files,cgai386;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    procedure secondadd(var p : ptree);
 | 
					 | 
				
			||||||
    procedure secondaddstring(var p : ptree);
 | 
					 | 
				
			||||||
    procedure secondas(var p : ptree);
 | 
					 | 
				
			||||||
    procedure secondis(var p : ptree);
 | 
					 | 
				
			||||||
    procedure secondloadvmt(var p : ptree);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  implementation
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uses
 | 
					 | 
				
			||||||
       cgi386;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{$I cgi386ad.inc}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
end.
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  $Log$
 | 
					 | 
				
			||||||
  Revision 1.2  1998-04-21 10:16:47  peter
 | 
					 | 
				
			||||||
    * patches from strasbourg
 | 
					 | 
				
			||||||
    * objects is not used anymore in the fpc compiled version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.1.1.1  1998/03/25 11:18:12  root
 | 
					 | 
				
			||||||
  * Restored version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.9  1998/03/10 01:17:18  peter
 | 
					 | 
				
			||||||
    * all files have the same header
 | 
					 | 
				
			||||||
    * messages are fully implemented, EXTDEBUG uses Comment()
 | 
					 | 
				
			||||||
    + AG... files for the Assembler generation
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -304,7 +304,7 @@ begin
 | 
				
			|||||||
                       AddSharedLibrary('c');
 | 
					                       AddSharedLibrary('c');
 | 
				
			||||||
                     end;
 | 
					                     end;
 | 
				
			||||||
                  end;
 | 
					                  end;
 | 
				
			||||||
{$endif}                
 | 
					{$endif}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  end;
 | 
					  end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -434,19 +434,23 @@ end;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Procedure TLinker.MakeStaticLibrary(const path:string;filescnt:longint);
 | 
					Procedure TLinker.MakeStaticLibrary(const path:string;filescnt:longint);
 | 
				
			||||||
var
 | 
					var
 | 
				
			||||||
 | 
					  s,
 | 
				
			||||||
  arbin   : string;
 | 
					  arbin   : string;
 | 
				
			||||||
  arfound : boolean;
 | 
					  arfound : boolean;
 | 
				
			||||||
  cnt     : longint;
 | 
					  cnt     : longint;
 | 
				
			||||||
  i       : word;
 | 
					  i       : word;
 | 
				
			||||||
  f       : file;
 | 
					  f       : file;
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
  arbin:=FindExe('ar',arfound);
 | 
					  arbin:=FindExe(target_ar.arbin,arfound);
 | 
				
			||||||
  if (not arfound) and (not externlink) then
 | 
					  if (not arfound) and (not externlink) then
 | 
				
			||||||
   begin
 | 
					   begin
 | 
				
			||||||
     Message(exec_w_ar_not_found);
 | 
					     Message(exec_w_ar_not_found);
 | 
				
			||||||
     externlink:=true;
 | 
					     externlink:=true;
 | 
				
			||||||
   end;
 | 
					   end;
 | 
				
			||||||
  DoExec(arbin,'rs '+staticlibname+' '+FixPath(path)+'*'+target_info.objext,false,true);
 | 
					  s:=target_ar.arcmd;
 | 
				
			||||||
 | 
					  Replace(s,'$LIB',staticlibname);
 | 
				
			||||||
 | 
					  Replace(s,'$FILES',FixPath(path)+'*'+target_info.objext);
 | 
				
			||||||
 | 
					  DoExec(arbin,s,false,true);
 | 
				
			||||||
{ Clean up }
 | 
					{ Clean up }
 | 
				
			||||||
  if (not writeasmfile) and (not externlink) then
 | 
					  if (not writeasmfile) and (not externlink) then
 | 
				
			||||||
   begin
 | 
					   begin
 | 
				
			||||||
@ -475,7 +479,11 @@ end;
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.12  1998-06-04 23:51:44  peter
 | 
					  Revision 1.13  1998-06-08 22:59:46  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.12  1998/06/04 23:51:44  peter
 | 
				
			||||||
    * m68k compiles
 | 
					    * m68k compiles
 | 
				
			||||||
    + .def file creation moved to gendef.pas so it could also be used
 | 
					    + .def file creation moved to gendef.pas so it could also be used
 | 
				
			||||||
      for win32
 | 
					      for win32
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@ unit parser;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    uses
 | 
					    uses
 | 
				
			||||||
      systems,cobjects,globals,verbose,
 | 
					      systems,cobjects,globals,verbose,
 | 
				
			||||||
      symtable,files,aasm,hcodegen,import,
 | 
					      symtable,files,aasm,hcodegen,
 | 
				
			||||||
      assemble,link,script,gendef,
 | 
					      assemble,link,script,gendef,
 | 
				
			||||||
      scanner,pbase,pdecl,psystem,pmodules;
 | 
					      scanner,pbase,pdecl,psystem,pmodules;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -312,9 +312,6 @@ unit parser;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
         if status.errorcount=0 then
 | 
					         if status.errorcount=0 then
 | 
				
			||||||
           begin
 | 
					           begin
 | 
				
			||||||
             if current_module^.uses_imports then
 | 
					 | 
				
			||||||
              importlib^.generatelib;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
             GenerateAsm(filename);
 | 
					             GenerateAsm(filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             if (cs_smartlink in aktswitches) then
 | 
					             if (cs_smartlink in aktswitches) then
 | 
				
			||||||
@ -442,7 +439,11 @@ done:
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.22  1998-06-05 17:47:28  peter
 | 
					  Revision 1.23  1998-06-08 22:59:48  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.22  1998/06/05 17:47:28  peter
 | 
				
			||||||
    * some better uses clauses
 | 
					    * some better uses clauses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision 1.21  1998/06/04 23:51:49  peter
 | 
					  Revision 1.21  1998/06/04 23:51:49  peter
 | 
				
			||||||
 | 
				
			|||||||
@ -39,7 +39,7 @@ unit pmodules;
 | 
				
			|||||||
    uses
 | 
					    uses
 | 
				
			||||||
       cobjects,verbose,systems,globals,
 | 
					       cobjects,verbose,systems,globals,
 | 
				
			||||||
       symtable,aasm,hcodegen,
 | 
					       symtable,aasm,hcodegen,
 | 
				
			||||||
       link,assemble
 | 
					       link,assemble,import
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
       ,i386
 | 
					       ,i386
 | 
				
			||||||
{$endif}
 | 
					{$endif}
 | 
				
			||||||
@ -63,6 +63,15 @@ unit pmodules;
 | 
				
			|||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    procedure insertsegment;
 | 
					    procedure insertsegment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        procedure fixseg(p:paasmoutput;sec:tsection);
 | 
				
			||||||
 | 
					        begin
 | 
				
			||||||
 | 
					          p^.insert(new(pai_section,init(sec)));
 | 
				
			||||||
 | 
					          if (cs_smartlink in aktswitches) then
 | 
				
			||||||
 | 
					           p^.insert(new(pai_cut,init));
 | 
				
			||||||
 | 
					          p^.concat(new(pai_section,init(sec_none)));
 | 
				
			||||||
 | 
					        end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
      {Insert Ident of the compiler}
 | 
					      {Insert Ident of the compiler}
 | 
				
			||||||
        if (not (cs_smartlink in aktswitches))
 | 
					        if (not (cs_smartlink in aktswitches))
 | 
				
			||||||
@ -75,15 +84,10 @@ unit pmodules;
 | 
				
			|||||||
           datasegment^.insert(new(pai_string,init('FPC '+version_string+' for '+target_string+' - '+target_info.short_name)));
 | 
					           datasegment^.insert(new(pai_string,init('FPC '+version_string+' for '+target_string+' - '+target_info.short_name)));
 | 
				
			||||||
         end;
 | 
					         end;
 | 
				
			||||||
      { Insert start and end of sections }
 | 
					      { Insert start and end of sections }
 | 
				
			||||||
        codesegment^.insert(new(pai_section,init(sec_code)));
 | 
					        fixseg(codesegment,sec_code);
 | 
				
			||||||
        codesegment^.concat(new(pai_section,init(sec_none)));
 | 
					        fixseg(datasegment,sec_data);
 | 
				
			||||||
        datasegment^.insert(new(pai_section,init(sec_data)));
 | 
					        fixseg(bsssegment,sec_bss);
 | 
				
			||||||
        datasegment^.concat(new(pai_section,init(sec_none)));
 | 
					        fixseg(consts,sec_data);
 | 
				
			||||||
        bsssegment^.insert(new(pai_section,init(sec_bss)));
 | 
					 | 
				
			||||||
        bsssegment^.concat(new(pai_section,init(sec_none)));
 | 
					 | 
				
			||||||
        consts^.insert(new(pai_asm_comment,init('Constants')));
 | 
					 | 
				
			||||||
        consts^.insert(new(pai_section,init(sec_data)));
 | 
					 | 
				
			||||||
        consts^.concat(new(pai_section,init(sec_none)));
 | 
					 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    procedure insertheap;
 | 
					    procedure insertheap;
 | 
				
			||||||
@ -101,14 +105,11 @@ unit pmodules;
 | 
				
			|||||||
          not output a pointer }
 | 
					          not output a pointer }
 | 
				
			||||||
         case target_info.target of
 | 
					         case target_info.target of
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
 | 
					 | 
				
			||||||
          target_OS2 : ;
 | 
					          target_OS2 : ;
 | 
				
			||||||
{$endif i386}
 | 
					{$endif i386}
 | 
				
			||||||
{$ifdef m68k}
 | 
					{$ifdef m68k}
 | 
				
			||||||
 | 
					 | 
				
			||||||
       target_Mac68K : bsssegment^.concat(new(pai_datablock,init_global('HEAP',4)));
 | 
					       target_Mac68K : bsssegment^.concat(new(pai_datablock,init_global('HEAP',4)));
 | 
				
			||||||
{$endif m68k}
 | 
					{$endif m68k}
 | 
				
			||||||
 | 
					 | 
				
			||||||
         else
 | 
					         else
 | 
				
			||||||
           bsssegment^.concat(new(pai_datablock,init_global('HEAP',heapsize)));
 | 
					           bsssegment^.concat(new(pai_datablock,init_global('HEAP',heapsize)));
 | 
				
			||||||
         end;
 | 
					         end;
 | 
				
			||||||
@ -122,7 +123,6 @@ unit pmodules;
 | 
				
			|||||||
        i : longint;
 | 
					        i : longint;
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
 | 
					 | 
				
			||||||
        case target_info.target of
 | 
					        case target_info.target of
 | 
				
			||||||
       target_GO32V2 : begin
 | 
					       target_GO32V2 : begin
 | 
				
			||||||
                       { stacksize can be specified }
 | 
					                       { stacksize can be specified }
 | 
				
			||||||
@ -130,14 +130,17 @@ unit pmodules;
 | 
				
			|||||||
                         datasegment^.concat(new(pai_const,init_32bit(stacksize)));
 | 
					                         datasegment^.concat(new(pai_const,init_32bit(stacksize)));
 | 
				
			||||||
                       end;
 | 
					                       end;
 | 
				
			||||||
        target_WIN32 : begin
 | 
					        target_WIN32 : begin
 | 
				
			||||||
                       { generate the last entry for the imports directory }
 | 
					                       { Generate an external entry to be sure that _mainCRTStarup will be
 | 
				
			||||||
                         if not(assigned(importssection)) then
 | 
					                         linked, can't use concat_external because those aren't written for
 | 
				
			||||||
 | 
					                         asw (PFV) }
 | 
				
			||||||
 | 
					                         datasegment^.concat(new(pai_const,init_symbol('_mainCRTStartup')));
 | 
				
			||||||
 | 
					                       { generate the last entry for the imports directory, is done
 | 
				
			||||||
 | 
					                         in the ld script }
 | 
				
			||||||
 | 
					                       {  if not(assigned(importssection)) then
 | 
				
			||||||
                           importssection:=new(paasmoutput,init);
 | 
					                           importssection:=new(paasmoutput,init);
 | 
				
			||||||
                       { $3 ensure that it is the last entry, all other entries }
 | 
					 | 
				
			||||||
                       { are written to $2                                      }
 | 
					 | 
				
			||||||
                         importssection^.concat(new(pai_section,init_idata(3)));
 | 
					                         importssection^.concat(new(pai_section,init_idata(3)));
 | 
				
			||||||
                         for i:=1 to 5 do
 | 
					                         for i:=1 to 5 do
 | 
				
			||||||
                           importssection^.concat(new(pai_const,init_32bit(0)));
 | 
					                           importssection^.concat(new(pai_const,init_32bit(0))); }
 | 
				
			||||||
                       end;
 | 
					                       end;
 | 
				
			||||||
        end;
 | 
					        end;
 | 
				
			||||||
{$endif i386}
 | 
					{$endif i386}
 | 
				
			||||||
@ -845,6 +848,11 @@ unit pmodules;
 | 
				
			|||||||
              pu:=pused_unit(pu^.next);
 | 
					              pu:=pused_unit(pu^.next);
 | 
				
			||||||
           end;
 | 
					           end;
 | 
				
			||||||
         inc(datasize,symtablestack^.datasize);
 | 
					         inc(datasize,symtablestack^.datasize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         { generate imports }
 | 
				
			||||||
 | 
					         if current_module^.uses_imports then
 | 
				
			||||||
 | 
					          importlib^.generatelib;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         { finish asmlist by adding segment starts }
 | 
					         { finish asmlist by adding segment starts }
 | 
				
			||||||
         insertsegment;
 | 
					         insertsegment;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
@ -967,7 +975,13 @@ unit pmodules;
 | 
				
			|||||||
         else
 | 
					         else
 | 
				
			||||||
          current_module^.linkofiles.insert(current_module^.objfilename^);
 | 
					          current_module^.linkofiles.insert(current_module^.objfilename^);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         { insert heap }
 | 
				
			||||||
         insertheap;
 | 
					         insertheap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         { generate imports }
 | 
				
			||||||
 | 
					         if current_module^.uses_imports then
 | 
				
			||||||
 | 
					          importlib^.generatelib;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         inserttargetspecific;
 | 
					         inserttargetspecific;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         datasize:=symtablestack^.datasize;
 | 
					         datasize:=symtablestack^.datasize;
 | 
				
			||||||
@ -979,7 +993,11 @@ unit pmodules;
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.24  1998-06-08 13:13:44  pierre
 | 
					  Revision 1.25  1998-06-08 22:59:49  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.24  1998/06/08 13:13:44  pierre
 | 
				
			||||||
    + temporary variables now in temp_gen.pas unit
 | 
					    + temporary variables now in temp_gen.pas unit
 | 
				
			||||||
      because it is processor independent
 | 
					      because it is processor independent
 | 
				
			||||||
    * mppc68k.bat modified to undefine i386 and support_mmx
 | 
					    * mppc68k.bat modified to undefine i386 and support_mmx
 | 
				
			||||||
@ -1000,8 +1018,6 @@ end.
 | 
				
			|||||||
  Revision 1.20  1998/06/04 09:55:42  pierre
 | 
					  Revision 1.20  1998/06/04 09:55:42  pierre
 | 
				
			||||||
    * demangled name of procsym reworked to become independant of the mangling scheme
 | 
					    * demangled name of procsym reworked to become independant of the mangling scheme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Come test_funcret improvements (not yet working)S: ----------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.19  1998/06/03 23:40:38  peter
 | 
					  Revision 1.19  1998/06/03 23:40:38  peter
 | 
				
			||||||
    + unlimited file support, release tempclose
 | 
					    + unlimited file support, release tempclose
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -39,42 +39,42 @@ unit pstatmnt;
 | 
				
			|||||||
  implementation
 | 
					  implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uses
 | 
					    uses
 | 
				
			||||||
       cobjects,scanner,globals,symtable,aasm,pass_1,
 | 
					       cobjects,globals,files,verbose,systems,
 | 
				
			||||||
       types,hcodegen,files,verbose,systems
 | 
					       symtable,aasm,pass_1,types,scanner,hcodegen
 | 
				
			||||||
{$ifdef NEWPPU}
 | 
					{$ifdef NEWPPU}
 | 
				
			||||||
       ,ppu
 | 
					       ,ppu
 | 
				
			||||||
{$endif}
 | 
					{$endif}
 | 
				
			||||||
       { processor specific stuff }
 | 
					       ,pbase,pexpr,pdecl
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
       ,i386
 | 
					       ,i386,tgeni386
 | 
				
			||||||
 | 
					  {$ifndef NoRa386Int}
 | 
				
			||||||
       ,rai386
 | 
					       ,rai386
 | 
				
			||||||
 | 
					  {$endif NoRa386Int}
 | 
				
			||||||
 | 
					  {$ifndef NoRa386Att}
 | 
				
			||||||
       ,ratti386
 | 
					       ,ratti386
 | 
				
			||||||
 | 
					  {$endif NoRa386Att}
 | 
				
			||||||
 | 
					  {$ifndef NoRa386Dir}
 | 
				
			||||||
       ,radi386
 | 
					       ,radi386
 | 
				
			||||||
       ,tgeni386
 | 
					  {$endif NoRa386Dir}
 | 
				
			||||||
{$endif}
 | 
					{$endif i386}
 | 
				
			||||||
{$ifdef m68k}
 | 
					{$ifdef m68k}
 | 
				
			||||||
       ,m68k
 | 
					       ,m68k,tgen68k
 | 
				
			||||||
       ,tgen68k
 | 
					  {$ifndef NoRa68kMot}
 | 
				
			||||||
       ,ag68kmit
 | 
					 | 
				
			||||||
       ,ra68k
 | 
					       ,ra68k
 | 
				
			||||||
       ,ag68kgas
 | 
					  {$endif NoRa68kMot}
 | 
				
			||||||
       ,ag68kmot
 | 
					{$endif m68k}
 | 
				
			||||||
{$endif}
 | 
					       ;
 | 
				
			||||||
       { parser specific stuff, be careful consume is also defined to }
 | 
					
 | 
				
			||||||
       { read assembler tokens                                        }
 | 
					 | 
				
			||||||
       ,pbase,pexpr,pdecl;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const
 | 
					    const
 | 
				
			||||||
 | 
					 | 
				
			||||||
      statement_level : longint = 0;
 | 
					      statement_level : longint = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function statement : ptree;forward;
 | 
					    function statement : ptree;forward;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function if_statement : ptree;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function if_statement : ptree;
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
         ex,if_a,else_a : ptree;
 | 
					         ex,if_a,else_a : ptree;
 | 
				
			||||||
 | 
					 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
         consume(_IF);
 | 
					         consume(_IF);
 | 
				
			||||||
         ex:=comp_expr(true);
 | 
					         ex:=comp_expr(true);
 | 
				
			||||||
@ -257,6 +257,7 @@ unit pstatmnt;
 | 
				
			|||||||
         case_statement:=code;
 | 
					         case_statement:=code;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function repeat_statement : ptree;
 | 
					    function repeat_statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
@ -293,6 +294,7 @@ unit pstatmnt;
 | 
				
			|||||||
         repeat_statement:=genloopnode(repeatn,p_e,first,nil,false);
 | 
					         repeat_statement:=genloopnode(repeatn,p_e,first,nil,false);
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function while_statement : ptree;
 | 
					    function while_statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
@ -306,6 +308,7 @@ unit pstatmnt;
 | 
				
			|||||||
         while_statement:=genloopnode(whilen,p_e,p_a,nil,false);
 | 
					         while_statement:=genloopnode(whilen,p_e,p_a,nil,false);
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function for_statement : ptree;
 | 
					    function for_statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
@ -334,6 +337,7 @@ unit pstatmnt;
 | 
				
			|||||||
         for_statement:=genloopnode(forn,p_e,tovalue,p_a,backward);
 | 
					         for_statement:=genloopnode(forn,p_e,tovalue,p_a,backward);
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function _with_statement : ptree;
 | 
					    function _with_statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
@ -434,6 +438,7 @@ unit pstatmnt;
 | 
				
			|||||||
         _with_statement:=genwithnode(withsymtable,p,right,levelcount);
 | 
					         _with_statement:=genwithnode(withsymtable,p,right,levelcount);
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function with_statement : ptree;
 | 
					    function with_statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
@ -441,6 +446,7 @@ unit pstatmnt;
 | 
				
			|||||||
         with_statement:=_with_statement;
 | 
					         with_statement:=_with_statement;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function raise_statement : ptree;
 | 
					    function raise_statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
@ -467,6 +473,7 @@ unit pstatmnt;
 | 
				
			|||||||
         raise_statement:=gennode(raisen,p1,p2);
 | 
					         raise_statement:=gennode(raisen,p1,p2);
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function try_statement : ptree;
 | 
					    function try_statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
@ -558,6 +565,7 @@ unit pstatmnt;
 | 
				
			|||||||
           end;
 | 
					           end;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function exit_statement : ptree;
 | 
					    function exit_statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
@ -581,11 +589,9 @@ unit pstatmnt;
 | 
				
			|||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{$ifdef i386}
 | 
					 | 
				
			||||||
    function _asm_statement : ptree;
 | 
					    function _asm_statement : ptree;
 | 
				
			||||||
 | 
					      var
 | 
				
			||||||
      var asm_stat : ptree;
 | 
					        asmstat : ptree;
 | 
				
			||||||
      
 | 
					 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
         if (aktprocsym^.definition^.options and poinline)<>0 then
 | 
					         if (aktprocsym^.definition^.options and poinline)<>0 then
 | 
				
			||||||
           Begin
 | 
					           Begin
 | 
				
			||||||
@ -594,25 +600,38 @@ unit pstatmnt;
 | 
				
			|||||||
              aktprocsym^.definition^.options:= aktprocsym^.definition^.options and not poinline;
 | 
					              aktprocsym^.definition^.options:= aktprocsym^.definition^.options and not poinline;
 | 
				
			||||||
           End;
 | 
					           End;
 | 
				
			||||||
         case aktasmmode of
 | 
					         case aktasmmode of
 | 
				
			||||||
            I386_ATT : asm_stat:=ratti386.assemble;
 | 
					{$ifdef i386}
 | 
				
			||||||
            I386_INTEL : asm_stat:=rai386.assemble;
 | 
					  {$ifndef NoRA386Att}
 | 
				
			||||||
            I386_DIRECT : asm_stat:=radi386.assemble;
 | 
					            I386_ATT : asmstat:=ratti386.assemble;
 | 
				
			||||||
            else internalerror(30004);
 | 
					  {$endif NoRA386Att}
 | 
				
			||||||
 | 
					  {$ifndef NoRA386Int}
 | 
				
			||||||
 | 
					          I386_INTEL : asmstat:=rai386.assemble;
 | 
				
			||||||
 | 
					  {$endif NoRA386Int}
 | 
				
			||||||
 | 
					  {$ifndef NoRA386Dir}
 | 
				
			||||||
 | 
					         I386_DIRECT : asmstat:=radi386.assemble;
 | 
				
			||||||
 | 
					  {$endif NoRA386Dir}
 | 
				
			||||||
 | 
					{$endif}
 | 
				
			||||||
 | 
					{$ifdef m68k}
 | 
				
			||||||
 | 
					  {$ifndef NoRA68kMot}
 | 
				
			||||||
 | 
					            M68K_MOT : asmstat:=ra68k.assemble;
 | 
				
			||||||
 | 
					  {$endif NoRA68kMot}
 | 
				
			||||||
 | 
					{$endif}
 | 
				
			||||||
 | 
					         else
 | 
				
			||||||
 | 
					           Comment(V_Fatal,'Selected assembler reader not supported');
 | 
				
			||||||
         end;
 | 
					         end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         { Erst am Ende _ASM konsumieren, da der Scanner sonst die }
 | 
					         { Read first the _ASM statement }
 | 
				
			||||||
         { erste Assemblerstatement zu lesen versucht! }
 | 
					 | 
				
			||||||
         consume(_ASM);
 | 
					         consume(_ASM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         { (END is read) }
 | 
					         { END is read }
 | 
				
			||||||
         if token=LECKKLAMMER then
 | 
					         if token=LECKKLAMMER then
 | 
				
			||||||
           begin
 | 
					           begin
 | 
				
			||||||
              { it's possible to specify the modified registers }
 | 
					              { it's possible to specify the modified registers }
 | 
				
			||||||
              consume(LECKKLAMMER);
 | 
					              consume(LECKKLAMMER);
 | 
				
			||||||
              asm_stat^.object_preserved:=true;
 | 
					              asmstat^.object_preserved:=true;
 | 
				
			||||||
              if token<>RECKKLAMMER then
 | 
					              if token<>RECKKLAMMER then
 | 
				
			||||||
                repeat
 | 
					                repeat
 | 
				
			||||||
                  pattern:=upper(pattern);
 | 
					{$ifdef i386}
 | 
				
			||||||
                  if pattern='EAX' then
 | 
					                  if pattern='EAX' then
 | 
				
			||||||
                    usedinproc:=usedinproc or ($80 shr byte(R_EAX))
 | 
					                    usedinproc:=usedinproc or ($80 shr byte(R_EAX))
 | 
				
			||||||
                  else if pattern='EBX' then
 | 
					                  else if pattern='EBX' then
 | 
				
			||||||
@ -624,41 +643,12 @@ unit pstatmnt;
 | 
				
			|||||||
                  else if pattern='ESI' then
 | 
					                  else if pattern='ESI' then
 | 
				
			||||||
                    begin
 | 
					                    begin
 | 
				
			||||||
                       usedinproc:=usedinproc or ($80 shr byte(R_ESI));
 | 
					                       usedinproc:=usedinproc or ($80 shr byte(R_ESI));
 | 
				
			||||||
                       asm_stat^.object_preserved:=false;
 | 
					                       asmstat^.object_preserved:=false;
 | 
				
			||||||
                    end
 | 
					                    end
 | 
				
			||||||
                  else if pattern='EDI' then
 | 
					                  else if pattern='EDI' then
 | 
				
			||||||
                    usedinproc:=usedinproc or ($80 shr byte(R_EDI))
 | 
					                    usedinproc:=usedinproc or ($80 shr byte(R_EDI))
 | 
				
			||||||
                  else consume(RECKKLAMMER);
 | 
					{$endif i386}
 | 
				
			||||||
                  consume(CSTRING);
 | 
					 | 
				
			||||||
                  if token=COMMA then consume(COMMA)
 | 
					 | 
				
			||||||
                    else break;
 | 
					 | 
				
			||||||
                until false;
 | 
					 | 
				
			||||||
              consume(RECKKLAMMER);
 | 
					 | 
				
			||||||
           end
 | 
					 | 
				
			||||||
         else usedinproc:=$ff;
 | 
					 | 
				
			||||||
         _asm_statement:=asm_stat;
 | 
					 | 
				
			||||||
      end;
 | 
					 | 
				
			||||||
{$endif}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{$ifdef m68k}
 | 
					{$ifdef m68k}
 | 
				
			||||||
    function _asm_statement : ptree;
 | 
					 | 
				
			||||||
    begin
 | 
					 | 
				
			||||||
         _asm_statement:= ra68k.assemble;
 | 
					 | 
				
			||||||
         { Erst am Ende _ASM konsumieren, da der Scanner sonst die }
 | 
					 | 
				
			||||||
         { erste Assemblerstatement zu lesen versucht! }
 | 
					 | 
				
			||||||
         consume(_ASM);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
         { (END is read) }
 | 
					 | 
				
			||||||
         if token=LECKKLAMMER then
 | 
					 | 
				
			||||||
           begin
 | 
					 | 
				
			||||||
              { it's possible to specify the modified registers }
 | 
					 | 
				
			||||||
              { we only check the registers which are not reserved }
 | 
					 | 
				
			||||||
              { and which can be used. This is done for future     }
 | 
					 | 
				
			||||||
              { optimizations.                                     }
 | 
					 | 
				
			||||||
              consume(LECKKLAMMER);
 | 
					 | 
				
			||||||
              if token<>RECKKLAMMER then
 | 
					 | 
				
			||||||
                repeat
 | 
					 | 
				
			||||||
                  pattern:=upper(pattern);
 | 
					 | 
				
			||||||
                  if pattern='D0' then
 | 
					                  if pattern='D0' then
 | 
				
			||||||
                    usedinproc:=usedinproc or ($800 shr word(R_D0))
 | 
					                    usedinproc:=usedinproc or ($800 shr word(R_D0))
 | 
				
			||||||
                  else if pattern='D1' then
 | 
					                  else if pattern='D1' then
 | 
				
			||||||
@ -669,6 +659,7 @@ unit pstatmnt;
 | 
				
			|||||||
                    usedinproc:=usedinproc or ($800 shr word(R_A0))
 | 
					                    usedinproc:=usedinproc or ($800 shr word(R_A0))
 | 
				
			||||||
                  else if pattern='A1' then
 | 
					                  else if pattern='A1' then
 | 
				
			||||||
                    usedinproc:=usedinproc or ($800 shr word(R_A1))
 | 
					                    usedinproc:=usedinproc or ($800 shr word(R_A1))
 | 
				
			||||||
 | 
					{$endif m68k}
 | 
				
			||||||
                  else consume(RECKKLAMMER);
 | 
					                  else consume(RECKKLAMMER);
 | 
				
			||||||
                  consume(CSTRING);
 | 
					                  consume(CSTRING);
 | 
				
			||||||
                  if token=COMMA then consume(COMMA)
 | 
					                  if token=COMMA then consume(COMMA)
 | 
				
			||||||
@ -676,155 +667,153 @@ unit pstatmnt;
 | 
				
			|||||||
                until false;
 | 
					                until false;
 | 
				
			||||||
              consume(RECKKLAMMER);
 | 
					              consume(RECKKLAMMER);
 | 
				
			||||||
           end
 | 
					           end
 | 
				
			||||||
         else usedinproc:=$ffff;
 | 
					         else usedinproc:=$ff;
 | 
				
			||||||
    end;
 | 
					         _asm_statement:=asmstat;
 | 
				
			||||||
{$endif}
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function new_dispose_statement : ptree;
 | 
					        function new_dispose_statement : ptree;
 | 
				
			||||||
 | 
					        var
 | 
				
			||||||
 | 
					          p,p2 : ptree;
 | 
				
			||||||
 | 
					          ht : ttoken;
 | 
				
			||||||
 | 
					          again : boolean; { dummy for do_proc_call }
 | 
				
			||||||
 | 
					          destrukname : stringid;
 | 
				
			||||||
 | 
					          sym : psym;
 | 
				
			||||||
 | 
					          classh : pobjectdef;
 | 
				
			||||||
 | 
					          pd,pd2 : pdef;
 | 
				
			||||||
 | 
					          store_valid : boolean;
 | 
				
			||||||
 | 
					          tt : ttreetyp;
 | 
				
			||||||
 | 
					        begin
 | 
				
			||||||
 | 
					          ht:=token;
 | 
				
			||||||
 | 
					          if token=_NEW then consume(_NEW)
 | 
				
			||||||
 | 
					            else consume(_DISPOSE);
 | 
				
			||||||
 | 
					          if ht=_NEW then
 | 
				
			||||||
 | 
					            tt:=hnewn
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					            tt:=hdisposen;
 | 
				
			||||||
 | 
					          consume(LKLAMMER);
 | 
				
			||||||
 | 
					          p:=comp_expr(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          var
 | 
					          { calc return type }
 | 
				
			||||||
                 p,p2 : ptree;
 | 
					          cleartempgen;
 | 
				
			||||||
                 ht : ttoken;
 | 
					          Store_valid := Must_be_valid;
 | 
				
			||||||
         again : boolean; { dummy for do_proc_call }
 | 
					          Must_be_valid := False;
 | 
				
			||||||
                 destrukname : stringid;
 | 
					          do_firstpass(p);
 | 
				
			||||||
                 sym : psym;
 | 
					          Must_be_valid := Store_valid;
 | 
				
			||||||
                 classh : pobjectdef;
 | 
					 | 
				
			||||||
                 pd,pd2 : pdef;
 | 
					 | 
				
			||||||
                 store_valid : boolean;
 | 
					 | 
				
			||||||
                 tt : ttreetyp;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
          begin
 | 
					  {var o:Pobject;
 | 
				
			||||||
                 ht:=token;
 | 
					           begin
 | 
				
			||||||
                 if token=_NEW then consume(_NEW)
 | 
					               new(o,init);        (*Also a valid new statement*)
 | 
				
			||||||
                   else consume(_DISPOSE);
 | 
					           end;}
 | 
				
			||||||
                 if ht=_NEW then
 | 
					 | 
				
			||||||
                   tt:=hnewn
 | 
					 | 
				
			||||||
                 else
 | 
					 | 
				
			||||||
                   tt:=hdisposen;
 | 
					 | 
				
			||||||
                 consume(LKLAMMER);
 | 
					 | 
				
			||||||
                 p:=comp_expr(true);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 { calc return type }
 | 
					          if token=COMMA then
 | 
				
			||||||
                 cleartempgen;
 | 
					            begin
 | 
				
			||||||
                 Store_valid := Must_be_valid;
 | 
					                   { extended syntax of new and dispose }
 | 
				
			||||||
                 Must_be_valid := False;
 | 
					                   { function styled new is handled in factor }
 | 
				
			||||||
                 do_firstpass(p);
 | 
					                   consume(COMMA);
 | 
				
			||||||
                 Must_be_valid := Store_valid;
 | 
					                   { destructors have no parameters }
 | 
				
			||||||
 | 
					                   destrukname:=pattern;
 | 
				
			||||||
 | 
					                   consume(ID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         {var o:Pobject;
 | 
					                   pd:=p^.resulttype;
 | 
				
			||||||
 | 
					                   pd2:=pd;
 | 
				
			||||||
 | 
					                   if (p^.resulttype = nil) or (pd^.deftype<>pointerdef) then
 | 
				
			||||||
 | 
					                     begin
 | 
				
			||||||
 | 
					                        Message(parser_e_pointer_type_expected);
 | 
				
			||||||
 | 
					                        p:=factor(false);
 | 
				
			||||||
 | 
					                        consume(RKLAMMER);
 | 
				
			||||||
 | 
					                        new_dispose_statement:=genzeronode(errorn);
 | 
				
			||||||
 | 
					                        exit;
 | 
				
			||||||
 | 
					                     end;
 | 
				
			||||||
 | 
					                   { first parameter must be an object or class }
 | 
				
			||||||
 | 
					                   if ppointerdef(pd)^.definition^.deftype<>objectdef then
 | 
				
			||||||
 | 
					                     begin
 | 
				
			||||||
 | 
					                        Message(parser_e_pointer_to_class_expected);
 | 
				
			||||||
 | 
					                        new_dispose_statement:=factor(false);
 | 
				
			||||||
 | 
					                        consume_all_until(RKLAMMER);
 | 
				
			||||||
 | 
					                        consume(RKLAMMER);
 | 
				
			||||||
 | 
					                        exit;
 | 
				
			||||||
 | 
					                     end;
 | 
				
			||||||
 | 
					                   { check, if the first parameter is a pointer to a _class_ }
 | 
				
			||||||
 | 
					                   classh:=pobjectdef(ppointerdef(pd)^.definition);
 | 
				
			||||||
 | 
					                   if (classh^.options and oois_class)<>0 then
 | 
				
			||||||
 | 
					                         begin
 | 
				
			||||||
 | 
					                            Message(parser_e_no_new_or_dispose_for_classes);
 | 
				
			||||||
 | 
					                            new_dispose_statement:=factor(false);
 | 
				
			||||||
 | 
					                            { while token<>RKLAMMER do
 | 
				
			||||||
 | 
					                                  consume(token); }
 | 
				
			||||||
 | 
					                            consume_all_until(RKLAMMER);
 | 
				
			||||||
 | 
					                            consume(RKLAMMER);
 | 
				
			||||||
 | 
					                            exit;
 | 
				
			||||||
 | 
					                         end;
 | 
				
			||||||
 | 
					                   { search cons-/destructor, also in parent classes }
 | 
				
			||||||
 | 
					                   sym:=nil;
 | 
				
			||||||
 | 
					                   while assigned(classh) do
 | 
				
			||||||
 | 
					                         begin
 | 
				
			||||||
 | 
					                            sym:=classh^.publicsyms^.search(pattern);
 | 
				
			||||||
 | 
					                            srsymtable:=classh^.publicsyms;
 | 
				
			||||||
 | 
					                            if assigned(sym) then
 | 
				
			||||||
 | 
					                                  break;
 | 
				
			||||||
 | 
					                            classh:=classh^.childof;
 | 
				
			||||||
 | 
					                         end;
 | 
				
			||||||
 | 
					                   { the second parameter of new/dispose must be a call }
 | 
				
			||||||
 | 
					                   { to a cons-/destructor                                }
 | 
				
			||||||
 | 
					                   if (sym^.typ<>procsym) then
 | 
				
			||||||
 | 
					                         begin
 | 
				
			||||||
 | 
					                            Message(parser_e_expr_have_to_be_destructor_call);
 | 
				
			||||||
 | 
					                            new_dispose_statement:=genzeronode(errorn);
 | 
				
			||||||
 | 
					                         end
 | 
				
			||||||
 | 
					                   else
 | 
				
			||||||
 | 
					                         begin
 | 
				
			||||||
 | 
					                           p2:=gensinglenode(tt,p);
 | 
				
			||||||
 | 
					                           if ht=_NEW then
 | 
				
			||||||
 | 
					                                 begin
 | 
				
			||||||
 | 
					                                    { Constructors can take parameters.}
 | 
				
			||||||
 | 
					                                    p2^.resulttype:=ppointerdef(pd)^.definition;
 | 
				
			||||||
 | 
					                                    do_member_read(sym,p2,pd,again);
 | 
				
			||||||
 | 
					                                 end
 | 
				
			||||||
 | 
					                           else
 | 
				
			||||||
 | 
					                             { destructors can't.}
 | 
				
			||||||
 | 
					                             p2:=genmethodcallnode(pprocsym(sym),srsymtable,p2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  begin
 | 
					                           { we need the real called method }
 | 
				
			||||||
                      new(o,init);        (*Also a valid new statement*)
 | 
					                           cleartempgen;
 | 
				
			||||||
                  end;}
 | 
					                           do_firstpass(p2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 if token=COMMA then
 | 
					                           if (ht=_NEW) and ((p2^.procdefinition^.options and poconstructor)=0) then
 | 
				
			||||||
                   begin
 | 
					                                  Message(parser_e_expr_have_to_be_constructor_call);
 | 
				
			||||||
                          { extended syntax of new and dispose }
 | 
					                           if (ht=_DISPOSE) and ((p2^.procdefinition^.options and podestructor)=0) then
 | 
				
			||||||
                          { function styled new is handled in factor }
 | 
					                                  Message(parser_e_expr_have_to_be_destructor_call);
 | 
				
			||||||
                          consume(COMMA);
 | 
					 | 
				
			||||||
                          { destructors have no parameters }
 | 
					 | 
				
			||||||
                          destrukname:=pattern;
 | 
					 | 
				
			||||||
                          consume(ID);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                          pd:=p^.resulttype;
 | 
					                           if ht=_NEW then
 | 
				
			||||||
                          pd2:=pd;
 | 
					                                 begin
 | 
				
			||||||
                          if (p^.resulttype = nil) or (pd^.deftype<>pointerdef) then
 | 
					                                         p2:=gennode(assignn,getcopy(p),gensinglenode(newn,p2));
 | 
				
			||||||
                            begin
 | 
					                                         p2^.right^.resulttype:=pd2;
 | 
				
			||||||
                               Message(parser_e_pointer_type_expected);
 | 
					                                 end;
 | 
				
			||||||
                               p:=factor(false);
 | 
					                           new_dispose_statement:=p2;
 | 
				
			||||||
                               consume(RKLAMMER);
 | 
					                         end;
 | 
				
			||||||
                               new_dispose_statement:=genzeronode(errorn);
 | 
					            end
 | 
				
			||||||
                               exit;
 | 
					          else
 | 
				
			||||||
                            end;
 | 
					            begin
 | 
				
			||||||
                          { first parameter must be an object or class }
 | 
					               if (p^.resulttype=nil) or (p^.resulttype^.deftype<>pointerdef) then
 | 
				
			||||||
                          if ppointerdef(pd)^.definition^.deftype<>objectdef then
 | 
					                 Begin
 | 
				
			||||||
                            begin
 | 
					                    Message(parser_e_pointer_type_expected);
 | 
				
			||||||
                               Message(parser_e_pointer_to_class_expected);
 | 
					                    new_dispose_statement:=genzeronode(errorn);
 | 
				
			||||||
                               new_dispose_statement:=factor(false);
 | 
					                 end
 | 
				
			||||||
                               consume_all_until(RKLAMMER);
 | 
					               else
 | 
				
			||||||
                               consume(RKLAMMER);
 | 
					                 begin
 | 
				
			||||||
                               exit;
 | 
					                    if (ppointerdef(p^.resulttype)^.definition^.deftype=objectdef) then
 | 
				
			||||||
                            end;
 | 
					                     Message(parser_w_use_extended_syntax_for_objects);
 | 
				
			||||||
                          { check, if the first parameter is a pointer to a _class_ }
 | 
					 | 
				
			||||||
                          classh:=pobjectdef(ppointerdef(pd)^.definition);
 | 
					 | 
				
			||||||
                          if (classh^.options and oois_class)<>0 then
 | 
					 | 
				
			||||||
                                begin
 | 
					 | 
				
			||||||
                                   Message(parser_e_no_new_or_dispose_for_classes);
 | 
					 | 
				
			||||||
                                   new_dispose_statement:=factor(false);
 | 
					 | 
				
			||||||
                                   { while token<>RKLAMMER do
 | 
					 | 
				
			||||||
                                         consume(token); }
 | 
					 | 
				
			||||||
                                   consume_all_until(RKLAMMER);
 | 
					 | 
				
			||||||
                                   consume(RKLAMMER);
 | 
					 | 
				
			||||||
                                   exit;
 | 
					 | 
				
			||||||
                                end;
 | 
					 | 
				
			||||||
                          { search cons-/destructor, also in parent classes }
 | 
					 | 
				
			||||||
                          sym:=nil;
 | 
					 | 
				
			||||||
                          while assigned(classh) do
 | 
					 | 
				
			||||||
                                begin
 | 
					 | 
				
			||||||
                                   sym:=classh^.publicsyms^.search(pattern);
 | 
					 | 
				
			||||||
                                   srsymtable:=classh^.publicsyms;
 | 
					 | 
				
			||||||
                                   if assigned(sym) then
 | 
					 | 
				
			||||||
                                         break;
 | 
					 | 
				
			||||||
                                   classh:=classh^.childof;
 | 
					 | 
				
			||||||
                                end;
 | 
					 | 
				
			||||||
                          { the second parameter of new/dispose must be a call }
 | 
					 | 
				
			||||||
                          { to a cons-/destructor                                }
 | 
					 | 
				
			||||||
                          if (sym^.typ<>procsym) then
 | 
					 | 
				
			||||||
                                begin
 | 
					 | 
				
			||||||
                                   Message(parser_e_expr_have_to_be_destructor_call);
 | 
					 | 
				
			||||||
                                   new_dispose_statement:=genzeronode(errorn);
 | 
					 | 
				
			||||||
                                end
 | 
					 | 
				
			||||||
                          else
 | 
					 | 
				
			||||||
                                begin
 | 
					 | 
				
			||||||
                                  p2:=gensinglenode(tt,p);
 | 
					 | 
				
			||||||
                                  if ht=_NEW then
 | 
					 | 
				
			||||||
                                        begin
 | 
					 | 
				
			||||||
                                           { Constructors can take parameters.}
 | 
					 | 
				
			||||||
                                           p2^.resulttype:=ppointerdef(pd)^.definition;
 | 
					 | 
				
			||||||
                                           do_member_read(sym,p2,pd,again);
 | 
					 | 
				
			||||||
                                        end
 | 
					 | 
				
			||||||
                                  else
 | 
					 | 
				
			||||||
                                    { destructors can't.}
 | 
					 | 
				
			||||||
                                    p2:=genmethodcallnode(pprocsym(sym),srsymtable,p2);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                  { we need the real called method }
 | 
					                     case ht of
 | 
				
			||||||
                                  cleartempgen;
 | 
					                        _NEW : new_dispose_statement:=gensinglenode(simplenewn,p);
 | 
				
			||||||
                                  do_firstpass(p2);
 | 
					                        _DISPOSE : new_dispose_statement:=gensinglenode(simpledisposen,p);
 | 
				
			||||||
 | 
					                     end;
 | 
				
			||||||
 | 
					                 end;
 | 
				
			||||||
 | 
					            end;
 | 
				
			||||||
 | 
					          consume(RKLAMMER);
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                  if (ht=_NEW) and ((p2^.procdefinition^.options and poconstructor)=0) then
 | 
					 | 
				
			||||||
                                         Message(parser_e_expr_have_to_be_constructor_call);
 | 
					 | 
				
			||||||
                                  if (ht=_DISPOSE) and ((p2^.procdefinition^.options and podestructor)=0) then
 | 
					 | 
				
			||||||
                                         Message(parser_e_expr_have_to_be_destructor_call);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                  if ht=_NEW then
 | 
					 | 
				
			||||||
                                        begin
 | 
					 | 
				
			||||||
                                                p2:=gennode(assignn,getcopy(p),gensinglenode(newn,p2));
 | 
					 | 
				
			||||||
                                                p2^.right^.resulttype:=pd2;
 | 
					 | 
				
			||||||
                                        end;
 | 
					 | 
				
			||||||
                                  new_dispose_statement:=p2;
 | 
					 | 
				
			||||||
                                end;
 | 
					 | 
				
			||||||
                   end
 | 
					 | 
				
			||||||
                 else
 | 
					 | 
				
			||||||
                   begin
 | 
					 | 
				
			||||||
                      if (p^.resulttype=nil) or (p^.resulttype^.deftype<>pointerdef) then
 | 
					 | 
				
			||||||
                        Begin
 | 
					 | 
				
			||||||
                           Message(parser_e_pointer_type_expected);
 | 
					 | 
				
			||||||
                           new_dispose_statement:=genzeronode(errorn);
 | 
					 | 
				
			||||||
                        end
 | 
					 | 
				
			||||||
                      else
 | 
					 | 
				
			||||||
                        begin
 | 
					 | 
				
			||||||
                           if (ppointerdef(p^.resulttype)^.definition^.deftype=objectdef) then
 | 
					 | 
				
			||||||
                            Message(parser_w_use_extended_syntax_for_objects);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                            case ht of
 | 
					 | 
				
			||||||
                               _NEW : new_dispose_statement:=gensinglenode(simplenewn,p);
 | 
					 | 
				
			||||||
                               _DISPOSE : new_dispose_statement:=gensinglenode(simpledisposen,p);
 | 
					 | 
				
			||||||
                            end;
 | 
					 | 
				
			||||||
                        end;
 | 
					 | 
				
			||||||
                   end;
 | 
					 | 
				
			||||||
                 consume(RKLAMMER);
 | 
					 | 
				
			||||||
          end;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function statement_block : ptree;
 | 
					    function statement_block : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -874,6 +863,7 @@ unit pstatmnt;
 | 
				
			|||||||
         statement_block:=last;
 | 
					         statement_block:=last;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function statement : ptree;
 | 
					    function statement : ptree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var
 | 
					      var
 | 
				
			||||||
@ -1146,15 +1136,17 @@ unit pstatmnt;
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.18  1998-06-05 14:37:35  pierre
 | 
					  Revision 1.19  1998-06-08 22:59:50  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.18  1998/06/05 14:37:35  pierre
 | 
				
			||||||
    * fixes for inline for operators
 | 
					    * fixes for inline for operators
 | 
				
			||||||
    * inline procedure more correctly restricted
 | 
					    * inline procedure more correctly restricted
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision 1.17  1998/06/04 09:55:43  pierre
 | 
					  Revision 1.17  1998/06/04 09:55:43  pierre
 | 
				
			||||||
    * demangled name of procsym reworked to become independant of the mangling scheme
 | 
					    * demangled name of procsym reworked to become independant of the mangling scheme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Come test_funcret improvements (not yet working)S: ----------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.16  1998/06/02 17:03:04  pierre
 | 
					  Revision 1.16  1998/06/02 17:03:04  pierre
 | 
				
			||||||
    *  with node corrected for objects
 | 
					    *  with node corrected for objects
 | 
				
			||||||
    * small bugs for SUPPORT_MMX fixed
 | 
					    * small bugs for SUPPORT_MMX fixed
 | 
				
			||||||
 | 
				
			|||||||
@ -156,52 +156,56 @@ unit ptconst;
 | 
				
			|||||||
              if p^.treetype=niln then
 | 
					              if p^.treetype=niln then
 | 
				
			||||||
                datasegment^.concat(new(pai_const,init_32bit(0)))
 | 
					                datasegment^.concat(new(pai_const,init_32bit(0)))
 | 
				
			||||||
              { maybe pchar ? }
 | 
					              { maybe pchar ? }
 | 
				
			||||||
              else if (ppointerdef(def)^.definition^.deftype=orddef) and
 | 
					              else
 | 
				
			||||||
 | 
					                if (ppointerdef(def)^.definition^.deftype=orddef) and
 | 
				
			||||||
                   (porddef(ppointerdef(def)^.definition)^.typ=uchar) then
 | 
					                   (porddef(ppointerdef(def)^.definition)^.typ=uchar) then
 | 
				
			||||||
                begin
 | 
					                  begin
 | 
				
			||||||
                   getlabel(ll);
 | 
					                    getlabel(ll);
 | 
				
			||||||
                   { insert string at the begin }
 | 
					                    datasegment^.concat(new(pai_const,init_symbol(strpnew(lab2str(ll)))));
 | 
				
			||||||
                   if p^.treetype=stringconstn then
 | 
					                    datasegment^.concat(new(pai_label,init(ll)));
 | 
				
			||||||
                     generate_ascii_insert((p^.values^)+#0)
 | 
					                    { insert string at the begin }
 | 
				
			||||||
                   else if is_constcharnode(p) then
 | 
					                    if p^.treetype=stringconstn then
 | 
				
			||||||
                     datasegment^.insert(new(pai_string,init(char(byte(p^.value))+#0)))
 | 
					                      datasegment^.concat(new(pai_string,init(p^.values^+#0)))
 | 
				
			||||||
                   else Message(cg_e_illegal_expression);
 | 
					                    else
 | 
				
			||||||
                   datasegment^.insert(new(pai_label,init(ll)));
 | 
					                      if is_constcharnode(p) then
 | 
				
			||||||
                   { insert label }
 | 
					                        datasegment^.concat(new(pai_string,init(char(byte(p^.value))+#0)))
 | 
				
			||||||
                   datasegment^.concat(new(pai_const,init_symbol(strpnew(lab2str(ll)))));
 | 
					                    else
 | 
				
			||||||
 | 
					                      Message(cg_e_illegal_expression);
 | 
				
			||||||
 | 
					                    { insert label }
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
              else if p^.treetype=addrn then
 | 
					              else
 | 
				
			||||||
                begin
 | 
					                if p^.treetype=addrn then
 | 
				
			||||||
                   if (is_equal(ppointerdef(p^.resulttype)^.definition,ppointerdef(def)^.definition) or
 | 
					                  begin
 | 
				
			||||||
                      (is_equal(ppointerdef(p^.resulttype)^.definition,voiddef)) or
 | 
					                    if (is_equal(ppointerdef(p^.resulttype)^.definition,ppointerdef(def)^.definition) or
 | 
				
			||||||
                      (is_equal(ppointerdef(def)^.definition,voiddef))) and
 | 
					                       (is_equal(ppointerdef(p^.resulttype)^.definition,voiddef)) or
 | 
				
			||||||
                      (p^.left^.treetype = loadn) then
 | 
					                       (is_equal(ppointerdef(def)^.definition,voiddef))) and
 | 
				
			||||||
                     begin
 | 
					                       (p^.left^.treetype = loadn) then
 | 
				
			||||||
 | 
					                      begin
 | 
				
			||||||
                        datasegment^.concat(new(pai_const,init_symbol(
 | 
					                        datasegment^.concat(new(pai_const,init_symbol(
 | 
				
			||||||
                          strpnew(p^.left^.symtableentry^.mangledname))));
 | 
					                          strpnew(p^.left^.symtableentry^.mangledname))));
 | 
				
			||||||
                        maybe_concat_external(p^.left^.symtableentry^.owner,
 | 
					                        maybe_concat_external(p^.left^.symtableentry^.owner,
 | 
				
			||||||
                          p^.left^.symtableentry^.mangledname);
 | 
					                          p^.left^.symtableentry^.mangledname);
 | 
				
			||||||
                     end
 | 
					                      end
 | 
				
			||||||
                   else
 | 
					                    else
 | 
				
			||||||
                     Message(cg_e_illegal_expression);
 | 
					                      Message(cg_e_illegal_expression);
 | 
				
			||||||
                end
 | 
					                  end
 | 
				
			||||||
              else
 | 
					              else
 | 
				
			||||||
              { allow typeof(Object type)}
 | 
					              { allow typeof(Object type)}
 | 
				
			||||||
                if (p^.treetype=inlinen) and
 | 
					                if (p^.treetype=inlinen) and
 | 
				
			||||||
                   (p^.inlinenumber=in_typeof_x) then
 | 
					                   (p^.inlinenumber=in_typeof_x) then
 | 
				
			||||||
                  if (p^.left^.treetype=typen) then
 | 
					                  begin
 | 
				
			||||||
                    begin
 | 
					                    if (p^.left^.treetype=typen) then
 | 
				
			||||||
                       datasegment^.concat(new(pai_const,init_symbol(
 | 
					                      begin
 | 
				
			||||||
                         strpnew(pobjectdef(p^.left^.resulttype)^.vmt_mangledname))));
 | 
					                        datasegment^.concat(new(pai_const,init_symbol(
 | 
				
			||||||
                       if pobjectdef(p^.left^.resulttype)^.owner^.symtabletype=unitsymtable then
 | 
					                          strpnew(pobjectdef(p^.left^.resulttype)^.vmt_mangledname))));
 | 
				
			||||||
 | 
					                        if pobjectdef(p^.left^.resulttype)^.owner^.symtabletype=unitsymtable then
 | 
				
			||||||
                          concat_external(pobjectdef(p^.left^.resulttype)^.vmt_mangledname,EXT_NEAR);
 | 
					                          concat_external(pobjectdef(p^.left^.resulttype)^.vmt_mangledname,EXT_NEAR);
 | 
				
			||||||
                    end
 | 
					                      end
 | 
				
			||||||
                  else
 | 
					                    else
 | 
				
			||||||
                    begin
 | 
					                      Message(cg_e_illegal_expression);
 | 
				
			||||||
                       Message(cg_e_illegal_expression);
 | 
					                  end
 | 
				
			||||||
                    end
 | 
					              else
 | 
				
			||||||
                else
 | 
					                Message(cg_e_illegal_expression);
 | 
				
			||||||
                  Message(cg_e_illegal_expression);
 | 
					 | 
				
			||||||
              disposetree(p);
 | 
					              disposetree(p);
 | 
				
			||||||
           end;
 | 
					           end;
 | 
				
			||||||
         setdef:
 | 
					         setdef:
 | 
				
			||||||
@ -215,9 +219,8 @@ unit ptconst;
 | 
				
			|||||||
                     Message(cg_e_illegal_expression)
 | 
					                     Message(cg_e_illegal_expression)
 | 
				
			||||||
                   else
 | 
					                   else
 | 
				
			||||||
                     begin
 | 
					                     begin
 | 
				
			||||||
                        for l:=0 to def^.savesize-1 do
 | 
					                       for l:=0 to def^.savesize-1 do
 | 
				
			||||||
                          datasegment^.concat(
 | 
					                         datasegment^.concat(new(pai_const,init_8bit(p^.constset^[l])));
 | 
				
			||||||
                        new(pai_const,init_8bit(p^.constset^[l])));
 | 
					 | 
				
			||||||
                     end;
 | 
					                     end;
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
              else
 | 
					              else
 | 
				
			||||||
@ -225,15 +228,13 @@ unit ptconst;
 | 
				
			|||||||
              disposetree(p);
 | 
					              disposetree(p);
 | 
				
			||||||
           end;
 | 
					           end;
 | 
				
			||||||
         enumdef:
 | 
					         enumdef:
 | 
				
			||||||
       begin
 | 
					           begin
 | 
				
			||||||
              p:=comp_expr(true);
 | 
					              p:=comp_expr(true);
 | 
				
			||||||
              do_firstpass(p);
 | 
					              do_firstpass(p);
 | 
				
			||||||
              if p^.treetype=ordconstn then
 | 
					              if p^.treetype=ordconstn then
 | 
				
			||||||
                begin
 | 
					                begin
 | 
				
			||||||
                   if is_equal(p^.resulttype,def) then
 | 
					                   if is_equal(p^.resulttype,def) then
 | 
				
			||||||
                     begin
 | 
					                     datasegment^.concat(new(pai_const,init_32bit(p^.value)))
 | 
				
			||||||
                        datasegment^.concat(new(pai_const,init_32bit(p^.value)));
 | 
					 | 
				
			||||||
                     end
 | 
					 | 
				
			||||||
                   else
 | 
					                   else
 | 
				
			||||||
                     Message(cg_e_illegal_expression);
 | 
					                     Message(cg_e_illegal_expression);
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
@ -450,7 +451,11 @@ unit ptconst;
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.5  1998-06-03 22:49:01  peter
 | 
					  Revision 1.6  1998-06-08 22:59:52  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.5  1998/06/03 22:49:01  peter
 | 
				
			||||||
    + wordbool,longbool
 | 
					    + wordbool,longbool
 | 
				
			||||||
    * rename bis,von -> high,low
 | 
					    * rename bis,von -> high,low
 | 
				
			||||||
    * moved some systemunit loading/creating to psystem.pas
 | 
					    * moved some systemunit loading/creating to psystem.pas
 | 
				
			||||||
@ -467,77 +472,4 @@ end.
 | 
				
			|||||||
    + started inline procedures
 | 
					    + started inline procedures
 | 
				
			||||||
    + added starstarn : use ** for exponentiation (^ gave problems)
 | 
					    + added starstarn : use ** for exponentiation (^ gave problems)
 | 
				
			||||||
    + started UseTokenInfo cond to get accurate positions
 | 
					    + started UseTokenInfo cond to get accurate positions
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.2  1998/04/07 13:19:48  pierre
 | 
					 | 
				
			||||||
    * bugfixes for reset_gdb_info
 | 
					 | 
				
			||||||
      in MEM parsing for go32v2
 | 
					 | 
				
			||||||
      better external symbol creation
 | 
					 | 
				
			||||||
      support for rhgdb.exe (lowercase file names)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.1.1.1  1998/03/25 11:18:15  root
 | 
					 | 
				
			||||||
  * Restored version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.13  1998/03/20 23:31:35  florian
 | 
					 | 
				
			||||||
    * bug0113 fixed
 | 
					 | 
				
			||||||
    * problem with interdepened units fixed ("options.pas problem")
 | 
					 | 
				
			||||||
    * two small extensions for future AMD 3D support
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.12  1998/03/18 22:50:11  florian
 | 
					 | 
				
			||||||
    + fstp/fld optimization
 | 
					 | 
				
			||||||
    * routines which contains asm aren't longer optimzed
 | 
					 | 
				
			||||||
    * wrong ifdef TEST_FUNCRET corrected
 | 
					 | 
				
			||||||
    * wrong data generation for array[0..n] of char = '01234'; fixed
 | 
					 | 
				
			||||||
    * bug0097 is fixed partial
 | 
					 | 
				
			||||||
    * bug0116 fixed (-Og doesn't use enter of the stack frame is greater than
 | 
					 | 
				
			||||||
      65535)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.11  1998/03/13 22:45:59  florian
 | 
					 | 
				
			||||||
    * small bug fixes applied
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.10  1998/03/11 11:23:57  florian
 | 
					 | 
				
			||||||
    * bug0081 and bug0109 fixed
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.9  1998/03/10 01:17:25  peter
 | 
					 | 
				
			||||||
    * all files have the same header
 | 
					 | 
				
			||||||
    * messages are fully implemented, EXTDEBUG uses Comment()
 | 
					 | 
				
			||||||
    + AG... files for the Assembler generation
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.8  1998/03/06 00:52:50  peter
 | 
					 | 
				
			||||||
    * replaced all old messages from errore.msg, only ExtDebug and some
 | 
					 | 
				
			||||||
      Comment() calls are left
 | 
					 | 
				
			||||||
    * fixed options.pas
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.7  1998/03/02 01:49:10  peter
 | 
					 | 
				
			||||||
    * renamed target_DOS to target_GO32V1
 | 
					 | 
				
			||||||
    + new verbose system, merged old errors and verbose units into one new
 | 
					 | 
				
			||||||
      verbose.pas, so errors.pas is obsolete
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.6  1998/02/13 10:35:33  daniel
 | 
					 | 
				
			||||||
  * Made Motorola version compilable.
 | 
					 | 
				
			||||||
  * Fixed optimizer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.5  1998/02/12 11:50:32  daniel
 | 
					 | 
				
			||||||
  Yes! Finally! After three retries, my patch!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Changes:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Complete rewrite of psub.pas.
 | 
					 | 
				
			||||||
  Added support for DLL's.
 | 
					 | 
				
			||||||
  Compiler requires less memory.
 | 
					 | 
				
			||||||
  Platform units for each platform.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.4  1998/01/24 23:08:19  carl
 | 
					 | 
				
			||||||
    + compile time range checking should logically always be on!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.3  1998/01/23 17:12:20  pierre
 | 
					 | 
				
			||||||
    * added some improvements for as and ld :
 | 
					 | 
				
			||||||
      - doserror and dosexitcode treated separately
 | 
					 | 
				
			||||||
      - PATH searched if doserror=2
 | 
					 | 
				
			||||||
    + start of long and ansi string (far from complete)
 | 
					 | 
				
			||||||
      in conditionnal UseLongString and UseAnsiString
 | 
					 | 
				
			||||||
    * options.pas cleaned (some variables shifted to globals)gl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.2  1998/01/09 09:10:03  michael
 | 
					 | 
				
			||||||
  + Initial implementation, second try
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1269,10 +1269,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      procedure ttypedconstsym.really_insert_in_data;
 | 
					      procedure ttypedconstsym.really_insert_in_data;
 | 
				
			||||||
        begin
 | 
					        begin
 | 
				
			||||||
           if (cs_smartlink in aktswitches) then
 | 
					 | 
				
			||||||
             datasegment^.concat(new(pai_cut,init));
 | 
					 | 
				
			||||||
           if owner^.symtabletype=globalsymtable then
 | 
					           if owner^.symtabletype=globalsymtable then
 | 
				
			||||||
             begin
 | 
					             begin
 | 
				
			||||||
 | 
					                if (cs_smartlink in aktswitches) then
 | 
				
			||||||
 | 
					                  datasegment^.concat(new(pai_cut,init));
 | 
				
			||||||
{$ifdef GDB}
 | 
					{$ifdef GDB}
 | 
				
			||||||
                if cs_debuginfo in aktswitches then
 | 
					                if cs_debuginfo in aktswitches then
 | 
				
			||||||
                  concatstabto(datasegment);
 | 
					                  concatstabto(datasegment);
 | 
				
			||||||
@ -1282,6 +1282,8 @@
 | 
				
			|||||||
           else
 | 
					           else
 | 
				
			||||||
             if owner^.symtabletype<>unitsymtable then
 | 
					             if owner^.symtabletype<>unitsymtable then
 | 
				
			||||||
               begin
 | 
					               begin
 | 
				
			||||||
 | 
					                 if (cs_smartlink in aktswitches) then
 | 
				
			||||||
 | 
					                   datasegment^.concat(new(pai_cut,init));
 | 
				
			||||||
{$ifdef GDB}
 | 
					{$ifdef GDB}
 | 
				
			||||||
                 if cs_debuginfo in aktswitches then
 | 
					                 if cs_debuginfo in aktswitches then
 | 
				
			||||||
                   concatstabto(datasegment);
 | 
					                   concatstabto(datasegment);
 | 
				
			||||||
@ -1692,7 +1694,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.5  1998-06-04 23:52:02  peter
 | 
					  Revision 1.6  1998-06-08 22:59:53  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.5  1998/06/04 23:52:02  peter
 | 
				
			||||||
    * m68k compiles
 | 
					    * m68k compiles
 | 
				
			||||||
    + .def file creation moved to gendef.pas so it could also be used
 | 
					    + .def file creation moved to gendef.pas so it could also be used
 | 
				
			||||||
      for win32
 | 
					      for win32
 | 
				
			||||||
@ -1700,8 +1706,6 @@
 | 
				
			|||||||
  Revision 1.4  1998/06/04 09:55:46  pierre
 | 
					  Revision 1.4  1998/06/04 09:55:46  pierre
 | 
				
			||||||
    * demangled name of procsym reworked to become independant of the mangling scheme
 | 
					    * demangled name of procsym reworked to become independant of the mangling scheme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Come test_funcret improvements (not yet working)S: ----------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Revision 1.3  1998/06/03 22:14:20  florian
 | 
					  Revision 1.3  1998/06/03 22:14:20  florian
 | 
				
			||||||
    * problem with sizes of classes fixed (if the anchestor was declared
 | 
					    * problem with sizes of classes fixed (if the anchestor was declared
 | 
				
			||||||
      forward, the compiler doesn't update the child classes size)
 | 
					      forward, the compiler doesn't update the child classes size)
 | 
				
			||||||
 | 
				
			|||||||
@ -76,6 +76,15 @@ unit systems;
 | 
				
			|||||||
       {$endif}
 | 
					       {$endif}
 | 
				
			||||||
       );
 | 
					       );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       tar = (
 | 
				
			||||||
 | 
					       {$ifdef i386}
 | 
				
			||||||
 | 
					              ar_ar,ar_arw
 | 
				
			||||||
 | 
					       {$endif}
 | 
				
			||||||
 | 
					       {$ifdef m68k}
 | 
				
			||||||
 | 
					              ar_ar
 | 
				
			||||||
 | 
					       {$endif}
 | 
				
			||||||
 | 
					       );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       tos = (
 | 
					       tos = (
 | 
				
			||||||
       {$ifdef i386}
 | 
					       {$ifdef i386}
 | 
				
			||||||
@ -127,6 +136,11 @@ unit systems;
 | 
				
			|||||||
          libprefix     : string[2];
 | 
					          libprefix     : string[2];
 | 
				
			||||||
       end;
 | 
					       end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       tarinfo = record
 | 
				
			||||||
 | 
					          arbin   : string[8];
 | 
				
			||||||
 | 
					          arcmd   : string[50];
 | 
				
			||||||
 | 
					       end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       ttargetinfo = record
 | 
					       ttargetinfo = record
 | 
				
			||||||
          target      : ttarget;
 | 
					          target      : ttarget;
 | 
				
			||||||
          short_name  : string[8];
 | 
					          short_name  : string[8];
 | 
				
			||||||
@ -141,6 +155,7 @@ unit systems;
 | 
				
			|||||||
          os          : tos;
 | 
					          os          : tos;
 | 
				
			||||||
          link        : tlink;
 | 
					          link        : tlink;
 | 
				
			||||||
          assem       : tasm;
 | 
					          assem       : tasm;
 | 
				
			||||||
 | 
					          ar          : tar;
 | 
				
			||||||
       end;
 | 
					       end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       tasmmodeinfo=record
 | 
					       tasmmodeinfo=record
 | 
				
			||||||
@ -153,6 +168,7 @@ unit systems;
 | 
				
			|||||||
       target_os   : tosinfo;
 | 
					       target_os   : tosinfo;
 | 
				
			||||||
       target_asm  : tasminfo;
 | 
					       target_asm  : tasminfo;
 | 
				
			||||||
       target_link : tlinkinfo;
 | 
					       target_link : tlinkinfo;
 | 
				
			||||||
 | 
					       target_ar   : tarinfo;
 | 
				
			||||||
       source_os   : tosinfo;
 | 
					       source_os   : tosinfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function set_string_target(const s : string) : boolean;
 | 
					    function set_string_target(const s : string) : boolean;
 | 
				
			||||||
@ -168,7 +184,6 @@ implementation
 | 
				
			|||||||
****************************************************************************}
 | 
					****************************************************************************}
 | 
				
			||||||
       os_infos : array[tos] of tosinfo = (
 | 
					       os_infos : array[tos] of tosinfo = (
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
 | 
					 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            name         : 'GO32 V1 DOS extender';
 | 
					            name         : 'GO32 V1 DOS extender';
 | 
				
			||||||
            sharedlibext : '.DLL';
 | 
					            sharedlibext : '.DLL';
 | 
				
			||||||
@ -234,8 +249,7 @@ implementation
 | 
				
			|||||||
            endian       : endian_little;
 | 
					            endian       : endian_little;
 | 
				
			||||||
            use_function_relative_addresses : true
 | 
					            use_function_relative_addresses : true
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
{$endif i386}   
 | 
					{$endif i386}
 | 
				
			||||||
 | 
					 | 
				
			||||||
{$ifdef m68k}
 | 
					{$ifdef m68k}
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            name         : 'Commodore Amiga';
 | 
					            name         : 'Commodore Amiga';
 | 
				
			||||||
@ -291,7 +305,7 @@ implementation
 | 
				
			|||||||
          )
 | 
					          )
 | 
				
			||||||
{$endif m68k}
 | 
					{$endif m68k}
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{****************************************************************************
 | 
					{****************************************************************************
 | 
				
			||||||
                             Assembler Info
 | 
					                             Assembler Info
 | 
				
			||||||
@ -493,8 +507,29 @@ implementation
 | 
				
			|||||||
            inputend   : ')';
 | 
					            inputend   : ')';
 | 
				
			||||||
            libprefix  : '-l'
 | 
					            libprefix  : '-l'
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
{$endif m68k}   
 | 
					{$endif m68k}
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{****************************************************************************
 | 
				
			||||||
 | 
					                                 Ar Info
 | 
				
			||||||
 | 
					****************************************************************************}
 | 
				
			||||||
 | 
					       ar_infos : array[tar] of tarinfo = (
 | 
				
			||||||
 | 
					{$ifdef i386}
 | 
				
			||||||
 | 
					          (
 | 
				
			||||||
 | 
					            arbin : 'ar';
 | 
				
			||||||
 | 
					            arcmd : 'rs $LIB $FILES'
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					          (
 | 
				
			||||||
 | 
					            arbin : 'arw';
 | 
				
			||||||
 | 
					            arcmd : 'rs $LIB $FILES'
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					{$endif i386}
 | 
				
			||||||
 | 
					{$ifdef m68k}
 | 
				
			||||||
 | 
					          (
 | 
				
			||||||
 | 
					            arbin : 'ar';
 | 
				
			||||||
 | 
					            arcmd : 'rs $LIB $FILES'
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					{$endif m68k}
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{****************************************************************************
 | 
					{****************************************************************************
 | 
				
			||||||
@ -502,7 +537,6 @@ implementation
 | 
				
			|||||||
****************************************************************************}
 | 
					****************************************************************************}
 | 
				
			||||||
       target_infos : array[ttarget] of ttargetinfo = (
 | 
					       target_infos : array[ttarget] of ttargetinfo = (
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
 | 
					 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_GO32V1;
 | 
					            target      : target_GO32V1;
 | 
				
			||||||
            short_name  : 'GO32V1';
 | 
					            short_name  : 'GO32V1';
 | 
				
			||||||
@ -516,7 +550,8 @@ implementation
 | 
				
			|||||||
            exeext      : ''; { The linker procedures a.out }
 | 
					            exeext      : ''; { The linker procedures a.out }
 | 
				
			||||||
            os          : os_GO32V1;
 | 
					            os          : os_GO32V1;
 | 
				
			||||||
            link        : link_ldgo32v1;
 | 
					            link        : link_ldgo32v1;
 | 
				
			||||||
            assem       : as_o
 | 
					            assem       : as_o;
 | 
				
			||||||
 | 
					            ar          : ar_ar
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_GO32V2;
 | 
					            target      : target_GO32V2;
 | 
				
			||||||
@ -540,7 +575,8 @@ implementation
 | 
				
			|||||||
      {$endif UseAnsiString}
 | 
					      {$endif UseAnsiString}
 | 
				
			||||||
            os          : os_GO32V2;
 | 
					            os          : os_GO32V2;
 | 
				
			||||||
            link        : link_ldgo32v2;
 | 
					            link        : link_ldgo32v2;
 | 
				
			||||||
            assem       : as_o
 | 
					            assem       : as_o;
 | 
				
			||||||
 | 
					            ar          : ar_ar
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_LINUX;
 | 
					            target      : target_LINUX;
 | 
				
			||||||
@ -555,7 +591,8 @@ implementation
 | 
				
			|||||||
            exeext      : '';
 | 
					            exeext      : '';
 | 
				
			||||||
            os          : os_Linux;
 | 
					            os          : os_Linux;
 | 
				
			||||||
            link        : link_ld;
 | 
					            link        : link_ld;
 | 
				
			||||||
            assem       : as_o
 | 
					            assem       : as_o;
 | 
				
			||||||
 | 
					            ar          : ar_ar
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_OS2;
 | 
					            target      : target_OS2;
 | 
				
			||||||
@ -570,7 +607,8 @@ implementation
 | 
				
			|||||||
            exeext      : ''; { The linker procedures a.out }
 | 
					            exeext      : ''; { The linker procedures a.out }
 | 
				
			||||||
            os          : os_OS2;
 | 
					            os          : os_OS2;
 | 
				
			||||||
            link        : link_ldos2;
 | 
					            link        : link_ldos2;
 | 
				
			||||||
            assem       : as_o
 | 
					            assem       : as_o;
 | 
				
			||||||
 | 
					            ar          : ar_ar
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_WIN32;
 | 
					            target      : target_WIN32;
 | 
				
			||||||
@ -585,10 +623,10 @@ implementation
 | 
				
			|||||||
            exeext      : '.exe';
 | 
					            exeext      : '.exe';
 | 
				
			||||||
            os          : os_Win32;
 | 
					            os          : os_Win32;
 | 
				
			||||||
            link        : link_ldw;
 | 
					            link        : link_ldw;
 | 
				
			||||||
            assem       : as_asw
 | 
					            assem       : as_asw;
 | 
				
			||||||
 | 
					            ar          : ar_arw
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
{$endif i386}
 | 
					{$endif i386}
 | 
				
			||||||
 | 
					 | 
				
			||||||
{$ifdef m68k}
 | 
					{$ifdef m68k}
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_Amiga;
 | 
					            target      : target_Amiga;
 | 
				
			||||||
@ -603,7 +641,8 @@ implementation
 | 
				
			|||||||
            exeext      : '';
 | 
					            exeext      : '';
 | 
				
			||||||
            os          : os_Amiga;
 | 
					            os          : os_Amiga;
 | 
				
			||||||
            link        : link_ld;
 | 
					            link        : link_ld;
 | 
				
			||||||
            assem       : as_o
 | 
					            assem       : as_o;
 | 
				
			||||||
 | 
					            ar          : ar_ar
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_Atari;
 | 
					            target      : target_Atari;
 | 
				
			||||||
@ -618,7 +657,8 @@ implementation
 | 
				
			|||||||
            exeext      : '';
 | 
					            exeext      : '';
 | 
				
			||||||
            os          : os_Atari;
 | 
					            os          : os_Atari;
 | 
				
			||||||
            link        : link_ld;
 | 
					            link        : link_ld;
 | 
				
			||||||
            assem       : as_o
 | 
					            assem       : as_o;
 | 
				
			||||||
 | 
					            ar          : ar_ar
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_Mac68k;
 | 
					            target      : target_Mac68k;
 | 
				
			||||||
@ -633,7 +673,8 @@ implementation
 | 
				
			|||||||
            exeext      : '';
 | 
					            exeext      : '';
 | 
				
			||||||
            os          : os_Mac68k;
 | 
					            os          : os_Mac68k;
 | 
				
			||||||
            link        : link_ld;
 | 
					            link        : link_ld;
 | 
				
			||||||
            assem       : as_o
 | 
					            assem       : as_o;
 | 
				
			||||||
 | 
					            ar          : ar_ar
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          (
 | 
					          (
 | 
				
			||||||
            target      : target_Linux;
 | 
					            target      : target_Linux;
 | 
				
			||||||
@ -648,7 +689,8 @@ implementation
 | 
				
			|||||||
            exeext      : '';
 | 
					            exeext      : '';
 | 
				
			||||||
            os          : os_Linux;
 | 
					            os          : os_Linux;
 | 
				
			||||||
            link        : link_ld;
 | 
					            link        : link_ld;
 | 
				
			||||||
            assem       : as_o
 | 
					            assem       : as_o;
 | 
				
			||||||
 | 
					            ar          : ar_ar
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
{$endif m68k}
 | 
					{$endif m68k}
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
@ -689,6 +731,7 @@ begin
 | 
				
			|||||||
  target_os:=os_infos[target_info.os];
 | 
					  target_os:=os_infos[target_info.os];
 | 
				
			||||||
  target_asm:=as_infos[target_info.assem];
 | 
					  target_asm:=as_infos[target_info.assem];
 | 
				
			||||||
  target_link:=link_infos[target_info.link];
 | 
					  target_link:=link_infos[target_info.link];
 | 
				
			||||||
 | 
					  target_ar:=ar_infos[target_info.ar];
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -757,19 +800,15 @@ begin
 | 
				
			|||||||
    {$ifdef GO32V2}
 | 
					    {$ifdef GO32V2}
 | 
				
			||||||
      default_os(target_GO32V2);
 | 
					      default_os(target_GO32V2);
 | 
				
			||||||
    {$else}
 | 
					    {$else}
 | 
				
			||||||
 | 
					 | 
				
			||||||
      {$ifdef OS2}
 | 
					      {$ifdef OS2}
 | 
				
			||||||
        default_os(target_OS2);
 | 
					        default_os(target_OS2);
 | 
				
			||||||
      {$else}
 | 
					      {$else}
 | 
				
			||||||
 | 
					 | 
				
			||||||
        {$ifdef LINUX}
 | 
					        {$ifdef LINUX}
 | 
				
			||||||
          default_os(target_LINUX);
 | 
					          default_os(target_LINUX);
 | 
				
			||||||
        {$else}
 | 
					        {$else}
 | 
				
			||||||
 | 
					 | 
				
			||||||
           {$ifdef WIN32}
 | 
					           {$ifdef WIN32}
 | 
				
			||||||
             default_os(target_WIN32);
 | 
					             default_os(target_WIN32);
 | 
				
			||||||
           {$else}
 | 
					           {$else}
 | 
				
			||||||
 | 
					 | 
				
			||||||
              default_os(target_GO32V2);
 | 
					              default_os(target_GO32V2);
 | 
				
			||||||
           {$endif win32}
 | 
					           {$endif win32}
 | 
				
			||||||
        {$endif linux}
 | 
					        {$endif linux}
 | 
				
			||||||
@ -781,14 +820,12 @@ begin
 | 
				
			|||||||
  {$ifdef AMIGA}
 | 
					  {$ifdef AMIGA}
 | 
				
			||||||
    default_os(target_Amiga);
 | 
					    default_os(target_Amiga);
 | 
				
			||||||
  {$else}
 | 
					  {$else}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    {$ifdef ATARI}
 | 
					    {$ifdef ATARI}
 | 
				
			||||||
      default_os(target_Atari);
 | 
					      default_os(target_Atari);
 | 
				
			||||||
    {$else}
 | 
					    {$else}
 | 
				
			||||||
      {$ifdef MACOS}
 | 
					      {$ifdef MACOS}
 | 
				
			||||||
        default_os(target_MAC68k);
 | 
					        default_os(target_MAC68k);
 | 
				
			||||||
      {$else}
 | 
					      {$else}
 | 
				
			||||||
 | 
					 | 
				
			||||||
        default_os(target_Amiga);
 | 
					        default_os(target_Amiga);
 | 
				
			||||||
      {$endif macos}
 | 
					      {$endif macos}
 | 
				
			||||||
    {$endif atari}
 | 
					    {$endif atari}
 | 
				
			||||||
@ -797,7 +834,11 @@ begin
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.17  1998-06-04 23:52:04  peter
 | 
					  Revision 1.18  1998-06-08 22:59:54  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.17  1998/06/04 23:52:04  peter
 | 
				
			||||||
    * m68k compiles
 | 
					    * m68k compiles
 | 
				
			||||||
    + .def file creation moved to gendef.pas so it could also be used
 | 
					    + .def file creation moved to gendef.pas so it could also be used
 | 
				
			||||||
      for win32
 | 
					      for win32
 | 
				
			||||||
 | 
				
			|||||||
@ -39,6 +39,9 @@ unit win_targ;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    uses
 | 
					    uses
 | 
				
			||||||
       aasm,files,strings,globals,cobjects
 | 
					       aasm,files,strings,globals,cobjects
 | 
				
			||||||
 | 
					{$ifdef GDB}
 | 
				
			||||||
 | 
					       ,gdb
 | 
				
			||||||
 | 
					{$endif}
 | 
				
			||||||
{$ifdef i386}
 | 
					{$ifdef i386}
 | 
				
			||||||
       ,i386
 | 
					       ,i386
 | 
				
			||||||
{$endif}
 | 
					{$endif}
 | 
				
			||||||
@ -83,42 +86,48 @@ unit win_targ;
 | 
				
			|||||||
         hp2 : pimported_procedure;
 | 
					         hp2 : pimported_procedure;
 | 
				
			||||||
         l1,l2,l3,l4 : plabel;
 | 
					         l1,l2,l3,l4 : plabel;
 | 
				
			||||||
         r : preference;
 | 
					         r : preference;
 | 
				
			||||||
 | 
					 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
         hp1:=pimportlist(current_module^.imports^.first);
 | 
					         hp1:=pimportlist(current_module^.imports^.first);
 | 
				
			||||||
         while assigned(hp1) do
 | 
					         while assigned(hp1) do
 | 
				
			||||||
           begin
 | 
					           begin
 | 
				
			||||||
 | 
					              { Insert cuts for smartlinking }
 | 
				
			||||||
 | 
					              if (cs_smartlink in aktswitches) then
 | 
				
			||||||
 | 
					                begin
 | 
				
			||||||
 | 
					                  importssection^.concat(new(pai_cut,init));
 | 
				
			||||||
 | 
					                  codesegment^.concat(new(pai_cut,init));
 | 
				
			||||||
 | 
					                end;
 | 
				
			||||||
 | 
					{$IfDef GDB}
 | 
				
			||||||
 | 
					              if (cs_debuginfo in aktswitches) then
 | 
				
			||||||
 | 
					                codesegment^.concat(new(pai_stab_function_name,init(nil)));
 | 
				
			||||||
 | 
					{$EndIf GDB}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              { Get labels for the sections }
 | 
				
			||||||
              getlabel(l1);
 | 
					              getlabel(l1);
 | 
				
			||||||
              getlabel(l2);
 | 
					              getlabel(l2);
 | 
				
			||||||
              getlabel(l3);
 | 
					              getlabel(l3);
 | 
				
			||||||
              { create import directory entry }
 | 
					 | 
				
			||||||
              importssection^.concat(new(pai_section,init_idata(2)));
 | 
					              importssection^.concat(new(pai_section,init_idata(2)));
 | 
				
			||||||
              { pointer to procedure names }
 | 
					              { pointer to procedure names }
 | 
				
			||||||
              importssection^.concat(new(pai_const,init_rva(strpnew(lab2str
 | 
					              importssection^.concat(new(pai_const,init_rva(strpnew(lab2str(l2)))));
 | 
				
			||||||
                (l2)))));
 | 
					 | 
				
			||||||
              { two empty entries follow }
 | 
					              { two empty entries follow }
 | 
				
			||||||
              importssection^.concat(new(pai_const,init_32bit(0)));
 | 
					              importssection^.concat(new(pai_const,init_32bit(0)));
 | 
				
			||||||
              importssection^.concat(new(pai_const,init_32bit(0)));
 | 
					              importssection^.concat(new(pai_const,init_32bit(0)));
 | 
				
			||||||
              { pointer to dll name }
 | 
					              { pointer to dll name }
 | 
				
			||||||
              importssection^.concat(new(pai_const,init_rva(strpnew(lab2str
 | 
					              importssection^.concat(new(pai_const,init_rva(strpnew(lab2str(l1)))));
 | 
				
			||||||
                (l1)))));
 | 
					 | 
				
			||||||
              { pointer to fixups }
 | 
					              { pointer to fixups }
 | 
				
			||||||
              importssection^.concat(new(pai_const,init_rva(strpnew(lab2str
 | 
					              importssection^.concat(new(pai_const,init_rva(strpnew(lab2str(l3)))));
 | 
				
			||||||
                (l3)))));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
              { now walk through all imported procedures }
 | 
					              { only create one section for each else it will
 | 
				
			||||||
              { we could that do in one while loop, but  }
 | 
					                create a lot of idata* }
 | 
				
			||||||
              { this would give too much idata* entries  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
              { first write the name references }
 | 
					              { first write the name references }
 | 
				
			||||||
              importssection^.concat(new(pai_section,init_idata(4)));
 | 
					              importssection^.concat(new(pai_section,init_idata(4)));
 | 
				
			||||||
              importssection^.concat(new(pai_label,init(l2)));
 | 
					              importssection^.concat(new(pai_label,init(l2)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              hp2:=pimported_procedure(hp1^.imported_procedures^.first);
 | 
					              hp2:=pimported_procedure(hp1^.imported_procedures^.first);
 | 
				
			||||||
              while assigned(hp2) do
 | 
					              while assigned(hp2) do
 | 
				
			||||||
                begin
 | 
					                begin
 | 
				
			||||||
                   getlabel(plabel(hp2^.lab));
 | 
					                   getlabel(plabel(hp2^.lab));
 | 
				
			||||||
                   importssection^.concat(new(pai_const,init_rva(strpnew(lab2str
 | 
					                   importssection^.concat(new(pai_const,init_rva(strpnew(lab2str(hp2^.lab)))));
 | 
				
			||||||
                     (hp2^.lab)))));
 | 
					 | 
				
			||||||
                   hp2:=pimported_procedure(hp2^.next);
 | 
					                   hp2:=pimported_procedure(hp2^.next);
 | 
				
			||||||
                end;
 | 
					                end;
 | 
				
			||||||
              { finalize the names ... }
 | 
					              { finalize the names ... }
 | 
				
			||||||
@ -130,20 +139,18 @@ unit win_targ;
 | 
				
			|||||||
              hp2:=pimported_procedure(hp1^.imported_procedures^.first);
 | 
					              hp2:=pimported_procedure(hp1^.imported_procedures^.first);
 | 
				
			||||||
              while assigned(hp2) do
 | 
					              while assigned(hp2) do
 | 
				
			||||||
                begin
 | 
					                begin
 | 
				
			||||||
                   getlabel(l4);
 | 
					                   getdatalabel(l4);
 | 
				
			||||||
                   { text segment should be aligned }
 | 
					                   { create indirect jump }
 | 
				
			||||||
                   codesegment^.concat(new(pai_align,init_op(4,$90)));
 | 
					 | 
				
			||||||
                   codesegment^.concat(new(pai_symbol,init_global(hp2^.func^)));
 | 
					 | 
				
			||||||
                   { the indirect jump }
 | 
					 | 
				
			||||||
                   new(r);
 | 
					                   new(r);
 | 
				
			||||||
                   reset_reference(r^);
 | 
					                   reset_reference(r^);
 | 
				
			||||||
                   r^.symbol:=stringdup(lab2str(l4));
 | 
					                   r^.symbol:=stringdup(lab2str(l4));
 | 
				
			||||||
{$ifdef i386}
 | 
					                   { place jump in codesegment }
 | 
				
			||||||
 | 
					                   codesegment^.concat(new(pai_align,init_op(4,$90)));
 | 
				
			||||||
 | 
					                   codesegment^.concat(new(pai_symbol,init_global(hp2^.func^)));
 | 
				
			||||||
                   codesegment^.concat(new(pai386,op_ref(A_JMP,S_NO,r)));
 | 
					                   codesegment^.concat(new(pai386,op_ref(A_JMP,S_NO,r)));
 | 
				
			||||||
{$endif}
 | 
					                   { add jump field to importsection }
 | 
				
			||||||
                   importssection^.concat(new(pai_label,init(l4)));
 | 
					                   importssection^.concat(new(pai_label,init(l4)));
 | 
				
			||||||
                   importssection^.concat(new(pai_const,init_rva(strpnew(lab2str
 | 
					                   importssection^.concat(new(pai_const,init_rva(strpnew(lab2str(hp2^.lab)))));
 | 
				
			||||||
                      (hp2^.lab)))));
 | 
					 | 
				
			||||||
                   hp2:=pimported_procedure(hp2^.next);
 | 
					                   hp2:=pimported_procedure(hp2^.next);
 | 
				
			||||||
                end;
 | 
					                end;
 | 
				
			||||||
              { finalize the addresses }
 | 
					              { finalize the addresses }
 | 
				
			||||||
@ -172,7 +179,11 @@ unit win_targ;
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.3  1998-06-04 23:52:06  peter
 | 
					  Revision 1.4  1998-06-08 22:59:56  peter
 | 
				
			||||||
 | 
					    * smartlinking works for win32
 | 
				
			||||||
 | 
					    * some defines to exclude some compiler parts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.3  1998/06/04 23:52:06  peter
 | 
				
			||||||
    * m68k compiles
 | 
					    * m68k compiles
 | 
				
			||||||
    + .def file creation moved to gendef.pas so it could also be used
 | 
					    + .def file creation moved to gendef.pas so it could also be used
 | 
				
			||||||
      for win32
 | 
					      for win32
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user