|
@@ -47,6 +47,7 @@ interface
|
|
|
procedure WriteAsmFileHeader;
|
|
|
private
|
|
|
procedure GenProcedureHeader(var hp:tai);
|
|
|
+ procedure WriteDataExportHeader(var s:string; isGlobal, isConst:boolean);
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -110,7 +111,6 @@ var
|
|
|
|
|
|
var
|
|
|
s : string;
|
|
|
- i,b:boolean;
|
|
|
begin
|
|
|
with ref do
|
|
|
begin
|
|
@@ -158,7 +158,7 @@ var
|
|
|
if (offset=0) then
|
|
|
s:=s+gas_regname(base)+','+gas_regname(index)
|
|
|
else
|
|
|
- internalerror(19992);
|
|
|
+ internalerror(19992); // *** ???
|
|
|
end;
|
|
|
end;
|
|
|
getreferencestring:=s;
|
|
@@ -258,7 +258,7 @@ var
|
|
|
branchmode(op)+#9;
|
|
|
case c.cond of
|
|
|
C_LT..C_NU:
|
|
|
- cond2str := tempstr+gas_regname(newreg(R_SPECIALREGISTER,c.cr,R_SUBNONE));
|
|
|
+ cond2str := tempstr+gas_regname(newreg(R_SPECIALREGISTER,c.cr,R_SUBNONE)); // *** R_SUBWHOLE ???
|
|
|
C_T..C_DZF:
|
|
|
cond2str := tempstr+tostr(c.crbit);
|
|
|
end;
|
|
@@ -422,25 +422,43 @@ var
|
|
|
s:= tai_symbol(hp).sym.name;
|
|
|
replaced:= ReplaceForbiddenChars(s);
|
|
|
|
|
|
- if replaced then
|
|
|
+ if not use_PR then
|
|
|
begin
|
|
|
- if not use_PR then
|
|
|
- AsmWriteLn(#9'export'#9'.'+s+' => ''.'+tai_symbol(hp).sym.name+'''');
|
|
|
- AsmWriteLn(#9'export'#9+s+'[DS] => '''+tai_symbol(hp).sym.name+'[DS]''');
|
|
|
- end
|
|
|
- else
|
|
|
+ AsmWrite(#9'export'#9'.');
|
|
|
+ AsmWrite(s);
|
|
|
+ if replaced then
|
|
|
+ begin
|
|
|
+ AsmWrite(' => ''.');
|
|
|
+ AsmWrite(tai_symbol(hp).sym.name);
|
|
|
+ AsmWrite('''');
|
|
|
+ end;
|
|
|
+ AsmLn;
|
|
|
+ end;
|
|
|
+
|
|
|
+ AsmWrite(#9'export'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWrite('[DS]');
|
|
|
+ if replaced then
|
|
|
begin
|
|
|
- if not use_PR then
|
|
|
- AsmWriteLn(#9'export'#9'.'+s);
|
|
|
- AsmWriteLn(#9'export'#9+s+'[DS]');
|
|
|
+ AsmWrite(' => ''');
|
|
|
+ AsmWrite(tai_symbol(hp).sym.name);
|
|
|
+ AsmWrite('[DS]''');
|
|
|
end;
|
|
|
+ AsmLn;
|
|
|
+
|
|
|
{Entry in transition vector: }
|
|
|
- AsmWriteLn(#9'csect'#9+s+'[DS]');
|
|
|
- AsmWriteLn(#9'dc.l'#9'.'+s);
|
|
|
+ AsmWrite(#9'csect'#9); AsmWrite(s); AsmWriteLn('[DS]');
|
|
|
+
|
|
|
+ AsmWrite(#9'dc.l'#9'.'); AsmWriteLn(s);
|
|
|
+
|
|
|
AsmWriteln(#9'dc.l'#9'TOC[tc0]');
|
|
|
+
|
|
|
{Entry in TOC: }
|
|
|
AsmWriteLn(#9'toc');
|
|
|
- AsmWriteLn(#9'tc'#9+s+'[TC],'+s+'[DS]');
|
|
|
+
|
|
|
+ AsmWrite(#9'tc'#9);
|
|
|
+ AsmWrite(s); AsmWrite('[TC],');
|
|
|
+ AsmWrite(s); AsmWriteln('[DS]');
|
|
|
end;
|
|
|
|
|
|
function GetAdjacentTaiSymbol(var hp:tai):Boolean;
|
|
@@ -485,13 +503,27 @@ var
|
|
|
replaced:= ReplaceForbiddenChars(s);
|
|
|
|
|
|
if use_PR then
|
|
|
- if replaced then
|
|
|
- AsmWriteLn(#9'export'#9'.'+s+'[PR] => ''.'+tai_symbol(last).sym.name+'[PR]''')
|
|
|
- else
|
|
|
- AsmWriteLn(#9'export'#9'.'+s+'[PR]');
|
|
|
+ begin
|
|
|
+ AsmWrite(#9'export'#9'.'); AsmWrite(s); AsmWrite('[PR]');
|
|
|
+ if replaced then
|
|
|
+ begin
|
|
|
+ AsmWrite(' => ''.');
|
|
|
+ AsmWrite(tai_symbol(last).sym.name);
|
|
|
+ AsmWrite('[PR]''');
|
|
|
+ end;
|
|
|
+ AsmLn;
|
|
|
+ end;
|
|
|
+
|
|
|
+ {Starts the section: }
|
|
|
+ AsmWrite(#9'csect'#9'.');
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWriteLn('[PR]');
|
|
|
+
|
|
|
+ {Info for the debugger: }
|
|
|
+ AsmWrite(#9'function'#9'.');
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWriteLn('[PR]');
|
|
|
|
|
|
- AsmWriteLn(#9'csect'#9'.'+s+'[PR]'); //starts the section
|
|
|
- AsmWriteLn(#9'function'#9'.'+s+'[PR]'); //info for debugger
|
|
|
{$ifdef GDB}
|
|
|
if ((cs_debuginfo in aktmoduleswitches) or
|
|
|
(cs_gdb_lineinfo in aktglobalswitches)) then
|
|
@@ -507,43 +539,67 @@ var
|
|
|
repeat
|
|
|
s:= tai_symbol(hp).sym.name;
|
|
|
ReplaceForbiddenChars(s);
|
|
|
- AsmWriteLn('.'+s+':');
|
|
|
+ AsmWrite('.'); AsmWrite(s); AsmWriteLn(':');
|
|
|
until not GetAdjacentTaiSymbol(hp);
|
|
|
end;
|
|
|
|
|
|
- (*
|
|
|
- procedure TPPCMPWAssembler.GenProcedureHeader(hp:tai);
|
|
|
-
|
|
|
+ procedure TPPCMPWAssembler.WriteDataExportHeader(var s:string; isGlobal, isConst:boolean);
|
|
|
+ // Returns in s the changed string
|
|
|
var
|
|
|
- s: string;
|
|
|
+ sym: string;
|
|
|
replaced: boolean;
|
|
|
|
|
|
begin
|
|
|
- s:= tai_symbol(hp).sym.name;
|
|
|
+ sym:= s;
|
|
|
replaced:= ReplaceForbiddenChars(s);
|
|
|
- if replaced then
|
|
|
+
|
|
|
+ if isGlobal then
|
|
|
+ begin
|
|
|
+ AsmWrite(#9'export'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ if isConst then
|
|
|
+ AsmWrite(const_storage_class)
|
|
|
+ else
|
|
|
+ AsmWrite('[RW]');
|
|
|
+ if replaced then
|
|
|
+ begin
|
|
|
+ AsmWrite(' => ''');
|
|
|
+ AsmWrite(sym);
|
|
|
+ AsmWrite('''');
|
|
|
+ end;
|
|
|
+ AsmLn;
|
|
|
+ end;
|
|
|
+
|
|
|
+ if not macos_direct_globals then
|
|
|
begin
|
|
|
- AsmWriteLn(#9'export'#9'.'+s+'[PR] => ''.'+tai_symbol(hp).sym.name+'[PR]''');
|
|
|
- AsmWriteLn(#9'export'#9+s+'[DS] => '''+tai_symbol(hp).sym.name+'[DS]''');
|
|
|
+ AsmWriteLn(#9'toc');
|
|
|
+
|
|
|
+ AsmWrite(#9'tc'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWrite('[TC], ');
|
|
|
+ AsmWrite(s);
|
|
|
+ if isConst then
|
|
|
+ AsmWrite(const_storage_class)
|
|
|
+ else
|
|
|
+ AsmWrite('[RW]');
|
|
|
+ AsmLn;
|
|
|
+
|
|
|
+ AsmWrite(#9'csect'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ if isConst then
|
|
|
+ AsmWrite(const_storage_class)
|
|
|
+ else
|
|
|
+ AsmWrite('[RW]');
|
|
|
end
|
|
|
else
|
|
|
begin
|
|
|
- AsmWriteLn(#9'export'#9'.'+s+'[PR]');
|
|
|
- AsmWriteLn(#9'export'#9+s+'[DS]');
|
|
|
+ AsmWrite(#9'csect'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWrite('[TC]');
|
|
|
end;
|
|
|
- {Entry in transition vector: }
|
|
|
- AsmWriteLn(#9'csect'#9+s+'[DS]');
|
|
|
- AsmWriteLn(#9'dc.l'#9'.'+s);
|
|
|
- AsmWriteln(#9'dc.l'#9'TOC[tc0]');
|
|
|
- {Entry in TOC: }
|
|
|
- AsmWriteLn(#9'toc');
|
|
|
- AsmWriteLn(#9'tc'#9+s+'[TC],'+s+'[DS]');
|
|
|
- {Start the section of the body of the proc: }
|
|
|
- AsmWriteLn(#9'csect'#9'.'+s+'[PR]');
|
|
|
|
|
|
- AsmWriteLn('.'+s+':');
|
|
|
+ AsmLn;
|
|
|
end;
|
|
|
- *)
|
|
|
|
|
|
var
|
|
|
LasTSec : TSection;
|
|
@@ -778,24 +834,15 @@ var
|
|
|
ait_datablock:
|
|
|
begin
|
|
|
s:= tai_datablock(hp).sym.name;
|
|
|
- replaced:= ReplaceForbiddenChars(s);
|
|
|
- if tai_datablock(hp).is_global then
|
|
|
- if replaced then
|
|
|
- AsmWriteLn(#9'export'#9+s+'[RW] => '''+tai_datablock(hp).sym.name+'''')
|
|
|
- else
|
|
|
- AsmWriteLn(#9'export'#9+s+'[RW]');
|
|
|
|
|
|
+ WriteDataExportHeader(s, tai_datablock(hp).is_global, false);
|
|
|
|
|
|
if not macos_direct_globals then
|
|
|
begin
|
|
|
- AsmWriteLn(#9'toc');
|
|
|
- AsmWriteLn(#9'tc'#9+s+'[TC], '+s+'[RW]');
|
|
|
- AsmWriteLn(#9'csect'#9+s+'[RW]');
|
|
|
AsmWriteLn(#9'ds.b '+tostr(tai_datablock(hp).size));
|
|
|
end
|
|
|
else
|
|
|
begin
|
|
|
- AsmWriteLn(#9'csect'#9+s+'[TC]');
|
|
|
AsmWriteLn(PadTabs(s+':',#0)+'ds.b '+tostr(tai_datablock(hp).size));
|
|
|
{TODO: ? PadTabs(s,#0) }
|
|
|
end;
|
|
@@ -821,32 +868,27 @@ var
|
|
|
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;
|
|
|
- *)
|
|
|
-
|
|
|
s:= tai_const_symbol(hp).sym.name;
|
|
|
ReplaceForbiddenChars(s);
|
|
|
|
|
|
-
|
|
|
+ AsmWrite(#9'dc.l'#9);
|
|
|
if tai_const_symbol(hp).sym.typ = AT_FUNCTION then
|
|
|
begin
|
|
|
if use_PR then
|
|
|
- AsmWriteLn(#9'dc.l'#9'.'+ s +'[PR]')
|
|
|
+ AsmWrite('.');
|
|
|
+
|
|
|
+ AsmWrite(s);
|
|
|
+
|
|
|
+ if use_PR then
|
|
|
+ AsmWriteLn('[PR]')
|
|
|
else
|
|
|
- AsmWriteLn(#9'dc.l'#9 + s + '[DS]')
|
|
|
+ AsmWriteLn('[DS]')
|
|
|
end
|
|
|
else
|
|
|
begin
|
|
|
- if macos_direct_globals then
|
|
|
- AsmWriteLn(#9'dc.l'#9+s)
|
|
|
- else
|
|
|
- AsmWriteLn(#9'dc.l'#9+s+const_storage_class);
|
|
|
+ AsmWrite(s);
|
|
|
+ if not macos_direct_globals then
|
|
|
+ AsmWriteLn(const_storage_class);
|
|
|
end;
|
|
|
|
|
|
(* TODO: the following might need to be included. Temporaily we
|
|
@@ -871,7 +913,9 @@ var
|
|
|
begin
|
|
|
{NOTE When a single quote char is encountered, it is
|
|
|
replaced with a numeric ascii value. It could also
|
|
|
- have been replaced with the escape seq of double quotes.}
|
|
|
+ have been replaced with the escape seq of double quotes.
|
|
|
+ Backslash seems to be used as an escape char, although
|
|
|
+ this is not mentioned in the PPCAsm documentation.}
|
|
|
counter := 0;
|
|
|
lines := tai_string(hp).len div line_length;
|
|
|
{ separate lines in different parts }
|
|
@@ -886,7 +930,8 @@ var
|
|
|
{ it is an ascii character. }
|
|
|
if (ord(tai_string(hp).str[i])>31) and
|
|
|
(ord(tai_string(hp).str[i])<128) and
|
|
|
- (tai_string(hp).str[i]<>'''') then
|
|
|
+ (tai_string(hp).str[i]<>'''') and
|
|
|
+ (tai_string(hp).str[i]<>'\') then
|
|
|
begin
|
|
|
if not(quoted) then
|
|
|
begin
|
|
@@ -908,7 +953,7 @@ var
|
|
|
end;
|
|
|
end; { end for i:=0 to... }
|
|
|
if quoted then AsmWrite('''');
|
|
|
- AsmWrite(target_info.newline);
|
|
|
+ AsmWrite(target_info.newline);
|
|
|
counter := counter+line_length;
|
|
|
end; { end for j:=0 ... }
|
|
|
{ do last line of lines }
|
|
@@ -919,8 +964,8 @@ var
|
|
|
{ it is an ascii character. }
|
|
|
if (ord(tai_string(hp).str[i])>31) and
|
|
|
(ord(tai_string(hp).str[i])<128) and
|
|
|
- (tai_string(hp).str[i]<>'''') then
|
|
|
- begin
|
|
|
+ (tai_string(hp).str[i]<>'''') and
|
|
|
+ (tai_string(hp).str[i]<>'\') then begin
|
|
|
if not(quoted) then
|
|
|
begin
|
|
|
if i>counter then
|
|
@@ -952,18 +997,26 @@ var
|
|
|
s:= tai_label(hp).l.name;
|
|
|
ReplaceForbiddenChars(s);
|
|
|
if s[1] = '@' then
|
|
|
+ //Local labels:
|
|
|
AsmWriteLn(s+':')
|
|
|
else
|
|
|
begin
|
|
|
+ //Procedure entry points:
|
|
|
if not macos_direct_globals then
|
|
|
begin
|
|
|
AsmWriteLn(#9'toc');
|
|
|
- AsmWriteLn(#9'tc'#9+s+'[TC], '+s+const_storage_class);
|
|
|
- AsmWriteLn(#9'csect'#9+s+const_storage_class);
|
|
|
+ AsmWrite(#9'tc'#9); AsmWrite(s);
|
|
|
+ AsmWrite('[TC], '); AsmWrite(s);
|
|
|
+ AsmWriteLn(const_storage_class);
|
|
|
+
|
|
|
+ AsmWrite(#9'csect'#9); AsmWrite(s);
|
|
|
+ AsmWriteLn(const_storage_class);
|
|
|
end
|
|
|
else
|
|
|
begin
|
|
|
- AsmWriteLn(#9'csect'#9+s+'[TC]');
|
|
|
+ AsmWrite(#9'csect'#9); AsmWrite(s);
|
|
|
+ AsmWriteLn('[TC]');
|
|
|
+
|
|
|
AsmWriteLn(PadTabs(s+':',#0));
|
|
|
end;
|
|
|
end;
|
|
@@ -981,24 +1034,13 @@ var
|
|
|
else if tai_symbol(hp).sym.typ=AT_DATA then
|
|
|
begin
|
|
|
s:= tai_symbol(hp).sym.name;
|
|
|
- replaced:= ReplaceForbiddenChars(s);
|
|
|
- if tai_symbol(hp).is_global then
|
|
|
- if replaced then
|
|
|
- AsmWriteLn(#9'export'#9+s+'[RW] => '''+tai_symbol(hp).sym.name+'''')
|
|
|
- else
|
|
|
- AsmWriteLn(#9'export'#9+s+'[RW]');
|
|
|
|
|
|
+ WriteDataExportHeader(s, tai_symbol(hp).is_global, true);
|
|
|
|
|
|
- if not macos_direct_globals then
|
|
|
- begin
|
|
|
- AsmWriteLn(#9'toc');
|
|
|
- AsmWriteLn(#9'tc'#9+s+'[TC], '+s+ const_storage_class);
|
|
|
- AsmWriteLn(#9'csect'#9+s+ const_storage_class);
|
|
|
- end
|
|
|
- else
|
|
|
+ if macos_direct_globals then
|
|
|
begin
|
|
|
- AsmWriteLn(#9'csect'#9+s+'[TC]');
|
|
|
- AsmWriteLn(s+':');
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWriteLn(':');
|
|
|
end;
|
|
|
end
|
|
|
else
|
|
@@ -1084,44 +1126,77 @@ var
|
|
|
|
|
|
var
|
|
|
s:string;
|
|
|
+ replaced: boolean;
|
|
|
|
|
|
begin
|
|
|
if tasmsymbol(p).defbind=AB_EXTERNAL then
|
|
|
begin
|
|
|
//Writeln('ZZZ ',p.name,' ',p.classname,' ',Ord(tasmsymbol(p).typ));
|
|
|
s:= p.name;
|
|
|
- case tasmsymbol(p).typ of
|
|
|
- AT_FUNCTION:
|
|
|
- begin
|
|
|
- if ReplaceForbiddenChars(s) then
|
|
|
+ replaced:= ReplaceForbiddenChars(s);
|
|
|
+
|
|
|
+ with currentasmlist do
|
|
|
+ case tasmsymbol(p).typ of
|
|
|
+ AT_FUNCTION:
|
|
|
+ begin
|
|
|
+ AsmWrite(#9'import'#9'.');
|
|
|
+ AsmWrite(s);
|
|
|
+ if use_PR then
|
|
|
+ AsmWrite('[PR]');
|
|
|
+
|
|
|
+ if replaced then
|
|
|
begin
|
|
|
- if not use_PR then
|
|
|
- currentasmlist.AsmWriteLn(#9'import'#9'.'+s+' <= ''.'+p.name+'''')
|
|
|
- else
|
|
|
- currentasmlist.AsmWriteLn(#9'import'#9'.'+s+'[PR] <= ''.'+p.name+'[PR]''');
|
|
|
- currentasmlist.AsmWriteLn(#9'import'#9+s+'[DS] <= '''+p.name+'[DS]''');
|
|
|
- end
|
|
|
- else
|
|
|
+ AsmWrite(' <= ''.');
|
|
|
+ AsmWrite(p.name);
|
|
|
+ if use_PR then
|
|
|
+ AsmWrite('[PR]''')
|
|
|
+ else
|
|
|
+ AsmWrite('''');
|
|
|
+ end;
|
|
|
+ AsmLn;
|
|
|
+
|
|
|
+ AsmWrite(#9'import'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWrite('[DS]');
|
|
|
+ if replaced then
|
|
|
begin
|
|
|
- if not use_PR then
|
|
|
- currentasmlist.AsmWriteLn(#9'import'#9'.'+s)
|
|
|
- else
|
|
|
- currentasmlist.AsmWriteLn(#9'import'#9'.'+s+'[PR]');
|
|
|
- currentasmlist.AsmWriteLn(#9'import'#9+s+'[DS]');
|
|
|
+ AsmWrite(' <= ''');
|
|
|
+ AsmWrite(p.name);
|
|
|
+ AsmWrite('[DS]''');
|
|
|
end;
|
|
|
- currentasmlist.AsmWriteLn(#9'toc');
|
|
|
- currentasmlist.AsmWriteLn(#9'tc'#9+s+'[TC],'+s+'[DS]');
|
|
|
- end
|
|
|
- else
|
|
|
- begin
|
|
|
- if ReplaceForbiddenChars(s) then
|
|
|
- currentasmlist.AsmWriteLn(#9'import'#9+s+'[RW] <= '''+p.name+'''')
|
|
|
- else
|
|
|
- currentasmlist.AsmWriteLn(#9'import'#9+s+'[RW]');
|
|
|
- currentasmlist.AsmWriteLn(#9'toc');
|
|
|
- currentasmlist.AsmWriteLn(#9'tc'#9+s+'[TC],'+s+'[RW]');
|
|
|
- end;
|
|
|
- end;
|
|
|
+ AsmLn;
|
|
|
+
|
|
|
+ AsmWriteLn(#9'toc');
|
|
|
+
|
|
|
+ AsmWrite(#9'tc'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWrite('[TC],');
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWriteLn('[DS]');
|
|
|
+ end;
|
|
|
+ AT_DATA:
|
|
|
+ begin
|
|
|
+ AsmWrite(#9'import'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWrite('[RW]');
|
|
|
+ if replaced then
|
|
|
+ begin
|
|
|
+ AsmWrite(' <= ''');
|
|
|
+ AsmWrite(p.name);
|
|
|
+ AsmWrite('''');
|
|
|
+ end;
|
|
|
+ AsmLn;
|
|
|
+
|
|
|
+ AsmWriteLn(#9'toc');
|
|
|
+ AsmWrite(#9'tc'#9);
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWrite('[TC],');
|
|
|
+ AsmWrite(s);
|
|
|
+ AsmWriteLn('[RW]');
|
|
|
+ end
|
|
|
+ else
|
|
|
+ InternalError(2003090901);
|
|
|
+ end;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
@@ -1262,7 +1337,11 @@ initialization
|
|
|
end.
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.24 2003-09-03 19:35:24 peter
|
|
|
+ Revision 1.25 2003-09-12 12:30:27 olle
|
|
|
+ * max lenght of symbols increased to 255
|
|
|
+ * emitted strings can now contain backslashes
|
|
|
+
|
|
|
+ Revision 1.24 2003/09/03 19:35:24 peter
|
|
|
* powerpc compiles again
|
|
|
|
|
|
Revision 1.23 2003/08/24 21:40:12 olle
|