* 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:
olle 2002-11-04 18:24:53 +00:00
parent 9284b36d3b
commit c5ac9e90af

View File

@ -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