mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-01 18:10:16 +02:00
* globals are located in TOC and relative r2, instead of absolute
* symbols which only differs in case are treated as a single symbol + tai_const_symbol supported * only refs_full accepted
This commit is contained in:
parent
9284b36d3b
commit
c5ac9e90af
@ -141,32 +141,36 @@ interface
|
||||
'crnot', 'mt', 'mf','nop', 'li', 'lis', 'la', 'mr','mr.','not', 'mtcr', 'mtlr', 'mflr',
|
||||
'mtctr', 'mfctr');
|
||||
|
||||
symaddr2str: array[trefsymaddr] of string[3] = ('','@ha','@l');
|
||||
|
||||
function getreferencestring(var ref : treference) : string;
|
||||
function getreferencestring(var ref : treference) : string;
|
||||
var
|
||||
s : string;
|
||||
begin
|
||||
with ref do
|
||||
begin
|
||||
inc(offset,offsetfixup);
|
||||
if ((offset < -32768) or (offset > 32767)) and
|
||||
(symaddr = refs_full) then
|
||||
internalerror(19991);
|
||||
if (symaddr = refs_full) then
|
||||
s := ''
|
||||
else if not assigned(symbol) then
|
||||
s := '('
|
||||
else
|
||||
|
||||
if (symaddr <> refs_full) then
|
||||
InternalError(2002110301)
|
||||
else if ((offset < -32768) or (offset > 32767)) then
|
||||
InternalError(19991);
|
||||
|
||||
|
||||
if assigned(symbol) then
|
||||
begin
|
||||
{s:='('+symbol.name; CHANGED from this to: }
|
||||
s:= symbol.name;
|
||||
ReplaceForbiddenChars(s);
|
||||
s:='('+s;
|
||||
end;
|
||||
{if symbol.typ = AT_FUNCTION then
|
||||
;}
|
||||
|
||||
s:= s+'[TC]' {ref to TOC entry }
|
||||
end
|
||||
else
|
||||
s:= '';
|
||||
|
||||
|
||||
if offset<0 then
|
||||
s:=s+tostr(offset)
|
||||
s:=s+tostr(offset)
|
||||
else
|
||||
if (offset>0) then
|
||||
begin
|
||||
@ -176,23 +180,16 @@ interface
|
||||
s:=s+tostr(offset);
|
||||
end;
|
||||
|
||||
if (symaddr <> refs_full) then
|
||||
s := s+')'+symaddr2str[symaddr];
|
||||
|
||||
if (index=R_NO) and (base<>R_NO) then
|
||||
begin
|
||||
if offset=0 then
|
||||
begin
|
||||
if assigned(symbol) then
|
||||
s:=s+'+0'
|
||||
else
|
||||
s:=s+'0';
|
||||
end;
|
||||
s:=s+'('+mpw_reg2str[base]+')'
|
||||
end
|
||||
else if (index<>R_NO) and (base<>R_NO) and (offset=0) then
|
||||
s:=s+mpw_reg2str[base]+','+mpw_reg2str[index]
|
||||
else if ((index<>R_NO) or (base<>R_NO)) then
|
||||
if (index=R_NO) and (base<>R_NO) then
|
||||
begin
|
||||
if offset=0 then
|
||||
if not assigned(symbol) then
|
||||
s:=s+'0';
|
||||
s:=s+'('+mpw_reg2str[base]+')'
|
||||
end
|
||||
else if (index<>R_NO) and (base<>R_NO) and (offset=0) then
|
||||
s:=s+mpw_reg2str[base]+','+mpw_reg2str[index]
|
||||
else if ((index<>R_NO) or (base<>R_NO)) then
|
||||
internalerror(19992);
|
||||
end;
|
||||
getreferencestring:=s;
|
||||
@ -492,8 +489,6 @@ interface
|
||||
{$endif GDB}
|
||||
ait_cut,ait_marker,ait_align,ait_section];
|
||||
|
||||
{TODO: Perhaps replace internalerror(10000) with something else}
|
||||
|
||||
var
|
||||
s,
|
||||
prefix,
|
||||
@ -596,7 +591,7 @@ interface
|
||||
1:AsmWriteLn(#9'align 0');
|
||||
2:AsmWriteLn(#9'align 1');
|
||||
4:AsmWriteLn(#9'align 2');
|
||||
otherwise internalerror(10000);
|
||||
otherwise internalerror(2002110302);
|
||||
end;
|
||||
end;
|
||||
ait_datablock:
|
||||
@ -608,7 +603,10 @@ interface
|
||||
AsmWriteLn(#9'export'#9+s+' => '''+tai_datablock(hp).sym.name+'''')
|
||||
else
|
||||
AsmWriteLn(#9'export'#9+s);
|
||||
AsmWriteLn(PadTabs(s,#0)+'DS.B '+tostr(tai_datablock(hp).size));
|
||||
|
||||
AsmWriteLn(#9'csect'#9+s+'[TC]');
|
||||
|
||||
AsmWriteLn(PadTabs(s+':',#0)+'ds.b '+tostr(tai_datablock(hp).size));
|
||||
{TODO: ? PadTabs(s,#0) }
|
||||
end;
|
||||
ait_const_32bit,
|
||||
@ -632,13 +630,38 @@ interface
|
||||
end;
|
||||
ait_const_symbol:
|
||||
begin
|
||||
(*
|
||||
AsmWriteLn(#9#9'dd'#9'offset '+tai_const_symbol(hp).sym.name);
|
||||
if tai_const_symbol(hp).offset>0 then
|
||||
AsmWrite('+'+tostr(tai_const_symbol(hp).offset))
|
||||
else if tai_const_symbol(hp).offset<0 then
|
||||
AsmWrite(tostr(tai_const_symbol(hp).offset));
|
||||
AsmLn;
|
||||
end;
|
||||
*)
|
||||
|
||||
s:= tai_const_symbol(hp).sym.name;
|
||||
ReplaceForbiddenChars(s);
|
||||
|
||||
|
||||
if tai_const_symbol(hp).sym.typ = AT_FUNCTION then
|
||||
AsmWriteLn(#9'dc.l'#9'.'+ s +'[PR]')
|
||||
else
|
||||
AsmWriteLn(#9'dc.l'#9+ s);
|
||||
|
||||
(* TODO: the following might need to be included. Temporaily we
|
||||
generate an error
|
||||
|
||||
if tai_const_symbol(hp).offset>0 then
|
||||
AsmWrite('+'+tostr(tai_const_symbol(hp).offset))
|
||||
else if tai_const_symbol(hp).offset<0 then
|
||||
AsmWrite(tostr(tai_const_symbol(hp).offset));
|
||||
*)
|
||||
|
||||
if tai_const_symbol(hp).offset <> 0 then
|
||||
InternalError(2002110101);
|
||||
|
||||
AsmLn;
|
||||
end;
|
||||
ait_real_32bit:
|
||||
AsmWriteLn(#9'dc.l'#9'"'+single2str(tai_real_32bit(hp).value)+'"');
|
||||
ait_real_64bit:
|
||||
@ -727,6 +750,9 @@ interface
|
||||
begin
|
||||
s:= tai_label(hp).l.name;
|
||||
ReplaceForbiddenChars(s);
|
||||
if s[1] <> '@' then
|
||||
AsmWriteLn(#9'csect'#9+s+'[TC]');
|
||||
|
||||
AsmWrite(s);
|
||||
{if assigned(hp.next) and not(tai(hp.next).typ in
|
||||
[ait_const_32bit,ait_const_16bit,ait_const_8bit,
|
||||
@ -745,6 +771,14 @@ interface
|
||||
end;
|
||||
ait_symbol:
|
||||
begin
|
||||
{Two adjacent symbols, which only differ in case, is to be treated as
|
||||
a single symbol, due to the case insensitivity of PPCAsm.}
|
||||
if (not (tai(hp.next)=nil)) and (tai(hp.next).typ=ait_stab_function_name) then
|
||||
if (not (tai(hp.next.next)=nil)) and (tai(hp.next.next).typ=ait_symbol) then
|
||||
if CompareText(tai_label(hp).l.name,tai_label(hp.next.next).l.name) = 0 then
|
||||
hp:=tai(hp.next.next);
|
||||
|
||||
|
||||
s:= tai_label(hp).l.name;
|
||||
replaced:= ReplaceForbiddenChars(s);
|
||||
if tai_label(hp).l.typ=AT_FUNCTION then
|
||||
@ -779,6 +813,7 @@ interface
|
||||
AsmWriteLn(#9'export'#9+s+' => '''+tai_symbol(hp).sym.name+'''')
|
||||
else
|
||||
AsmWriteLn(#9'export'#9+s);
|
||||
AsmWriteLn(#9'csect'#9+s+'[TC]');
|
||||
AsmWrite(s);
|
||||
AsmWriteLn(':');
|
||||
end;
|
||||
@ -836,7 +871,7 @@ ait_stab_function_name : ;
|
||||
dec(InlineLevel);
|
||||
end;
|
||||
else
|
||||
internalerror(10000);
|
||||
internalerror(2002110303);
|
||||
end;
|
||||
hp:=tai(hp.next);
|
||||
end;
|
||||
@ -980,7 +1015,7 @@ ait_stab_function_name : ;
|
||||
labelprefix : '@';
|
||||
comment : '; ';
|
||||
secnames : ('',
|
||||
'csect','csect','csect', {TODO: Perhaps use other section types.}
|
||||
'csect','csect [TC]','csect [TC]', {TODO: Perhaps use other section types.}
|
||||
'','','','','','',
|
||||
'','','')
|
||||
);
|
||||
@ -990,7 +1025,13 @@ initialization
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.12 2002-10-23 15:31:01 olle
|
||||
Revision 1.13 2002-11-04 18:24:53 olle
|
||||
* globals are located in TOC and relative r2, instead of absolute
|
||||
* symbols which only differs in case are treated as a single symbol
|
||||
+ tai_const_symbol supported
|
||||
* only refs_full accepted
|
||||
|
||||
Revision 1.12 2002/10/23 15:31:01 olle
|
||||
* branch b does not jump to dotted symbol now
|
||||
|
||||
Revision 1.11 2002/10/19 23:52:40 olle
|
||||
|
Loading…
Reference in New Issue
Block a user