mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 20:29:18 +02:00
* fixed smartlinking
This commit is contained in:
parent
73151c592c
commit
ab7c74f60a
@ -66,6 +66,7 @@ unit ag386bin;
|
||||
procedure WriteFileLineInfo(var fileinfo : tfileposinfo);
|
||||
procedure StartFileLineInfo;
|
||||
{$endif}
|
||||
function MaybeNextList(var hp:pai):boolean;
|
||||
function TreePass0(hp:pai):pai;
|
||||
function TreePass1(hp:pai):pai;
|
||||
function TreePass2(hp:pai):pai;
|
||||
@ -338,6 +339,27 @@ unit ag386bin;
|
||||
{$endif GDB}
|
||||
|
||||
|
||||
function ti386binasmlist.MaybeNextList(var hp:pai):boolean;
|
||||
begin
|
||||
{ maybe end of list }
|
||||
while not assigned(hp) do
|
||||
begin
|
||||
if currlistidx<lists then
|
||||
begin
|
||||
inc(currlistidx);
|
||||
currlist:=list[currlistidx];
|
||||
hp:=pai(currlist^.first);
|
||||
end
|
||||
else
|
||||
begin
|
||||
MaybeNextList:=false;
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
MaybeNextList:=true;
|
||||
end;
|
||||
|
||||
|
||||
function ti386binasmlist.TreePass0(hp:pai):pai;
|
||||
var
|
||||
lastsec : tsection;
|
||||
@ -360,23 +382,28 @@ unit ag386bin;
|
||||
ait_datablock :
|
||||
begin
|
||||
{$ifdef EXTERNALBSS}
|
||||
if not pai_datablock(hp)^.is_global then
|
||||
if not SmartAsm then
|
||||
begin
|
||||
if not pai_datablock(hp)^.is_global then
|
||||
begin
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
objectalloc^.sectionalign(4)
|
||||
else if l>1 then
|
||||
objectalloc^.sectionalign(2);
|
||||
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
objectalloc^.sectionalign(4)
|
||||
else if l>1 then
|
||||
objectalloc^.sectionalign(2);
|
||||
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
|
||||
end;
|
||||
{$else}
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
objectalloc^.sectionalign(4)
|
||||
else if l>1 then
|
||||
objectalloc^.sectionalign(2);
|
||||
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
|
||||
{$endif}
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
objectalloc^.sectionalign(4)
|
||||
else if l>1 then
|
||||
objectalloc^.sectionalign(2);
|
||||
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
|
||||
end;
|
||||
end;
|
||||
ait_const_32bit :
|
||||
objectalloc^.sectionalloc(4);
|
||||
@ -417,16 +444,6 @@ unit ag386bin;
|
||||
end;
|
||||
hp:=pai(hp^.next);
|
||||
|
||||
{ maybe end of list }
|
||||
if not assigned(hp) then
|
||||
begin
|
||||
if currlistidx<lists then
|
||||
begin
|
||||
inc(currlistidx);
|
||||
currlist:=list[currlistidx];
|
||||
hp:=pai(currlist^.first);
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
TreePass0:=hp;
|
||||
@ -469,35 +486,40 @@ unit ag386bin;
|
||||
if objectalloc^.currsec<>sec_bss then
|
||||
Message(asmw_e_alloc_data_only_in_bss);
|
||||
{$ifdef EXTERNALBSS}
|
||||
if pai_datablock(hp)^.is_global then
|
||||
if not SmartAsm then
|
||||
begin
|
||||
pai_datablock(hp)^.sym^.typ:=AS_EXTERNAL;
|
||||
pai_datablock(hp)^.sym^.setaddress(sec_none,pai_datablock(hp)^.size,pai_datablock(hp)^.size);
|
||||
end
|
||||
else
|
||||
begin
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
objectalloc^.sectionalign(4)
|
||||
else if l>1 then
|
||||
objectalloc^.sectionalign(2);
|
||||
pai_datablock(hp)^.sym^.typ:=AS_LOCAL;
|
||||
pai_datablock(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,pai_datablock(hp)^.size);
|
||||
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
|
||||
end;
|
||||
{$else}
|
||||
if pai_datablock(hp)^.is_global then
|
||||
pai_datablock(hp)^.sym^.typ:=AS_GLOBAL
|
||||
else
|
||||
pai_datablock(hp)^.sym^.typ:=AS_LOCAL;
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
objectalloc^.sectionalign(4)
|
||||
else if l>1 then
|
||||
objectalloc^.sectionalign(2);
|
||||
pai_datablock(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,pai_datablock(hp)^.size);
|
||||
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
|
||||
if pai_datablock(hp)^.is_global then
|
||||
begin
|
||||
pai_datablock(hp)^.sym^.typ:=AS_EXTERNAL;
|
||||
pai_datablock(hp)^.sym^.setaddress(sec_none,pai_datablock(hp)^.size,pai_datablock(hp)^.size);
|
||||
end
|
||||
else
|
||||
begin
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
objectalloc^.sectionalign(4)
|
||||
else if l>1 then
|
||||
objectalloc^.sectionalign(2);
|
||||
pai_datablock(hp)^.sym^.typ:=AS_LOCAL;
|
||||
pai_datablock(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,pai_datablock(hp)^.size);
|
||||
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
|
||||
end;
|
||||
end
|
||||
else
|
||||
{$endif}
|
||||
begin
|
||||
if pai_datablock(hp)^.is_global then
|
||||
pai_datablock(hp)^.sym^.typ:=AS_GLOBAL
|
||||
else
|
||||
pai_datablock(hp)^.sym^.typ:=AS_LOCAL;
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
objectalloc^.sectionalign(4)
|
||||
else if l>1 then
|
||||
objectalloc^.sectionalign(2);
|
||||
pai_datablock(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,pai_datablock(hp)^.size);
|
||||
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
|
||||
end;
|
||||
end;
|
||||
ait_const_32bit :
|
||||
objectalloc^.sectionalloc(4);
|
||||
@ -639,9 +661,11 @@ unit ag386bin;
|
||||
ait_datablock :
|
||||
begin
|
||||
objectoutput^.writesymbol(pai_datablock(hp)^.sym);
|
||||
if SmartAsm
|
||||
{$ifdef EXTERNALBSS}
|
||||
if not pai_datablock(hp)^.is_global then
|
||||
or (not pai_datablock(hp)^.is_global)
|
||||
{$endif}
|
||||
then
|
||||
begin
|
||||
l:=pai_datablock(hp)^.size;
|
||||
if l>2 then
|
||||
@ -726,19 +750,8 @@ unit ag386bin;
|
||||
while assigned(hp) do
|
||||
begin
|
||||
hp:=TreePass1(hp);
|
||||
{ maybe end of list }
|
||||
if not assigned(hp) then
|
||||
begin
|
||||
if currlistidx<lists then
|
||||
begin
|
||||
inc(currlistidx);
|
||||
currlist:=list[currlistidx];
|
||||
hp:=pai(currlist^.first);
|
||||
end
|
||||
else
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
MaybeNextList(hp);
|
||||
end;
|
||||
{ set section sizes }
|
||||
objectoutput^.setsectionsizes(objectalloc^.secsize);
|
||||
|
||||
@ -754,19 +767,8 @@ unit ag386bin;
|
||||
while assigned(hp) do
|
||||
begin
|
||||
hp:=TreePass2(hp);
|
||||
{ maybe end of list }
|
||||
if not assigned(hp) then
|
||||
begin
|
||||
if currlistidx<lists then
|
||||
begin
|
||||
inc(currlistidx);
|
||||
currlist:=list[currlistidx];
|
||||
hp:=pai(currlist^.first);
|
||||
end
|
||||
else
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
MaybeNextList(hp);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -798,26 +800,17 @@ unit ag386bin;
|
||||
{$endif GDB}
|
||||
hp:=TreePass2(hp);
|
||||
|
||||
{ maybe end of list }
|
||||
if not assigned(hp) then
|
||||
begin
|
||||
if currlistidx<lists then
|
||||
begin
|
||||
inc(currlistidx);
|
||||
currlist:=list[currlistidx];
|
||||
hp:=pai(currlist^.first);
|
||||
end
|
||||
else
|
||||
break;
|
||||
end;
|
||||
if not MaybeNextList(hp) then
|
||||
break;
|
||||
|
||||
{ write the current objectfile }
|
||||
objectoutput^.donewriting;
|
||||
{ start the writing again }
|
||||
objectoutput^.initwriting;
|
||||
|
||||
{ we will start a new objectfile so reset everything }
|
||||
ResetAsmsymbolList;
|
||||
objectoutput^.initwriting;
|
||||
objectalloc^.resetsections;
|
||||
ResetAsmsymbolList;
|
||||
|
||||
{ avoid empty files }
|
||||
while assigned(hp^.next) and
|
||||
(pai(hp^.next)^.typ in [ait_marker,ait_comment,ait_section,ait_cut]) do
|
||||
@ -829,7 +822,11 @@ unit ag386bin;
|
||||
end;
|
||||
hp:=pai(hp^.next);
|
||||
end;
|
||||
|
||||
hp:=pai(hp^.next);
|
||||
|
||||
if not MaybeNextList(hp) then
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -908,7 +905,10 @@ unit ag386bin;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.19 1999-07-22 09:37:30 florian
|
||||
Revision 1.20 1999-07-31 12:33:11 peter
|
||||
* fixed smartlinking
|
||||
|
||||
Revision 1.19 1999/07/22 09:37:30 florian
|
||||
+ resourcestring implemented
|
||||
+ start of longstring support
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user