diff --git a/compiler/powerpc/agppcmpw.pas b/compiler/powerpc/agppcmpw.pas index 86fa003735..083a890147 100644 --- a/compiler/powerpc/agppcmpw.pas +++ b/compiler/powerpc/agppcmpw.pas @@ -48,7 +48,9 @@ interface private procedure WriteInstruction(hp : tai); procedure WriteProcedureHeader(var hp:tai); - procedure WriteDataExportHeader(var s:string; isGlobal, isConst:boolean); + procedure WriteDataHeader(var s:string; isExported, isConst:boolean); + cur_CSECT_name: String; + cur_CSECT_class: String; end; @@ -67,11 +69,16 @@ interface {Whether internal procedure references should be xxx[PR]: } use_PR = false; - const_storage_class = '[RW]'; + const_storage_class = ''; + var_storage_class = ''; - secnames : array[TAsmSectionType] of string[10] = ('', - 'csect','csect [TC]','csect [TC]', {TODO: Perhaps use other section types.} - '','','','','','','','','','','','','' + secnames : array[TAsmSectionType] of string[10] = ( + '', {none} + 'csect', {code} + 'csect', {data} + 'csect', {read only data} + 'csect', {bss} + 'csect','csect','csect','csect','','','','','','','','' ); {$ifdef GDB} @@ -465,6 +472,24 @@ var fixline:=Copy(s,j,i-j+1); end; + Function PadTabs(const p:string;addch:char):string; + var + s : string; + i : longint; + begin + i:=length(p); + if addch<>#0 then + begin + inc(i); + s:=p+addch; + end + else + s:=p; + if i<8 then + PadTabs:=s+#9#9 + else + PadTabs:=s+#9; + end; {**************************************************************************** PowerPC MPW Assembler @@ -605,7 +630,7 @@ var until not GetAdjacentTaiSymbol(hp); end; - procedure TPPCMPWAssembler.WriteDataExportHeader(var s:string; isGlobal, isConst:boolean); + procedure TPPCMPWAssembler.WriteDataHeader(var s:string; isExported, isConst:boolean); // Returns in s the changed string var sym: string; @@ -615,14 +640,14 @@ var sym:= s; replaced:= ReplaceForbiddenChars(s); - if isGlobal then + if isExported then begin AsmWrite(#9'export'#9); AsmWrite(s); if isConst then AsmWrite(const_storage_class) else - AsmWrite('[RW]'); + AsmWrite(var_storage_class); if replaced then begin AsmWrite(' => '''); @@ -634,6 +659,7 @@ var if not macos_direct_globals then begin + {The actual section is here interrupted, by inserting a "tc" entry} AsmWriteLn(#9'toc'); AsmWrite(#9'tc'#9); @@ -643,15 +669,13 @@ var if isConst then AsmWrite(const_storage_class) else - AsmWrite('[RW]'); + AsmWrite(var_storage_class); AsmLn; + {The interrupted section is here continued.} AsmWrite(#9'csect'#9); - AsmWrite(s); - if isConst then - AsmWrite(const_storage_class) - else - AsmWrite('[RW]'); + AsmWriteln(cur_CSECT_name+cur_CSECT_class); + AsmWrite(PadTabs(s+':',#0)); end else begin @@ -673,24 +697,6 @@ var ait_const2str:array[ait_const_32bit..ait_const_8bit] of string[8]= (#9'dc.l'#9,#9'dc.w'#9,#9'dc.b'#9); - Function PadTabs(const p:string;addch:char):string; - var - s : string; - i : longint; - begin - i:=length(p); - if addch<>#0 then - begin - inc(i); - s:=p+addch; - end - else - s:=p; - if i<8 then - PadTabs:=s+#9#9 - else - PadTabs:=s+#9; - end; {$ifdef GDB} procedure TPPCMPWAssembler.WriteFileLineInfo(var fileinfo : tfileposinfo); @@ -876,12 +882,26 @@ var begin {if LasTSec<>sec_none then AsmWriteLn('_'+target_asm.secnames[LasTSec]+#9#9'ENDS');} + if tai_section(hp).sectype<>sec_none then begin + if tai_section(hp).sectype in [sec_data,sec_rodata,sec_bss] then + cur_CSECT_class:= '[RW]' + else if tai_section(hp).sectype in [sec_code] then + cur_CSECT_class:= '' + else + cur_CSECT_class:= '[RO]'; + + s:= tai_section(hp).name^; + if s = '' then + InternalError(2004101001); {Nameless sections should not occur on MPW} + ReplaceForbiddenChars(s); + cur_CSECT_name:= s; + AsmLn; - AsmWriteLn(#9+secnames[tai_section(hp).sectype]); + AsmWriteLn(#9+secnames[tai_section(hp).sectype]+' '+cur_CSECT_name+cur_CSECT_class); {$ifdef GDB} - lastfileinfo.line:=-1; + lastfileinfo.line:=-1; {$endif GDB} end; LasTSec:=tai_section(hp).sectype; @@ -895,12 +915,11 @@ var otherwise internalerror(2002110302); end; end; - ait_datablock: + ait_datablock: {Storage for global variables.} begin s:= tai_datablock(hp).sym.name; - WriteDataExportHeader(s, tai_datablock(hp).is_global, false); - + WriteDataHeader(s, tai_datablock(hp).is_global, false); if not macos_direct_globals then begin AsmWriteLn(#9'ds.b '+tostr(tai_datablock(hp).size)); @@ -950,36 +969,34 @@ var repeat if assigned(tai_const(hp).sym) then begin - if assigned(tai_const(hp).endsym) then + if assigned(tai_const(hp).endsym) then begin - if (tai_const(hp).endsym.typ = AT_FUNCTION) and use_PR then - AsmWrite('.'); + if (tai_const(hp).endsym.typ = AT_FUNCTION) and use_PR then + AsmWrite('.'); - s:=tai_const(hp).endsym.name; - ReplaceForbiddenChars(s); - AsmWrite(s); + s:=tai_const(hp).endsym.name; + ReplaceForbiddenChars(s); + AsmWrite(s); inc(l,length(s)); - if tai_const(hp).endsym.typ = AT_FUNCTION then - begin - if use_PR then - AsmWrite('[PR]') - else - AsmWrite('[DS]'); - end - else if not macos_direct_globals then - AsmWrite(const_storage_class); + if tai_const(hp).endsym.typ = AT_FUNCTION then + begin + if use_PR then + AsmWrite('[PR]') + else + AsmWrite('[DS]'); + end; AsmWrite('-'); - inc(l,5); {Approx 5 extra, no need to be exactly} - end; + inc(l,5); {Approx 5 extra, no need to be exactly} + end; if (tai_const(hp).sym.typ = AT_FUNCTION) and use_PR then AsmWrite('.'); s:= tai_const(hp).sym.name; - ReplaceForbiddenChars(s); - AsmWrite(s); + ReplaceForbiddenChars(s); + AsmWrite(s); inc(l,length(s)); if tai_const(hp).sym.typ = AT_FUNCTION then @@ -988,9 +1005,7 @@ var AsmWrite('[PR]') else AsmWrite('[DS]'); - end - else if not macos_direct_globals then - AsmWrite(const_storage_class); + end; inc(l,5); {Approx 5 extra, no need to be exactly} if tai_const(hp).value > 0 then @@ -1021,7 +1036,7 @@ var until false; AsmLn; end; - + ait_real_64bit : begin AsmWriteLn(target_asm.comment+'value: '+double2str(tai_real_64bit(hp).value)); @@ -1107,65 +1122,62 @@ var end; { end for j:=0 ... } { do last line of lines } - if counter < tai_string(hp).len then - AsmWrite(#9'dc.b'#9); - quoted:=false; - for i:=counter to tai_string(hp).len-1 do - begin + if counter < tai_string(hp).len then + AsmWrite(#9'dc.b'#9); + quoted:=false; + for i:=counter to tai_string(hp).len-1 do + begin { it is an ascii character. } - if (ord(tai_string(hp).str[i])>31) and + if (ord(tai_string(hp).str[i])>31) and (ord(tai_string(hp).str[i])<128) and (tai_string(hp).str[i]<>'''') and (tai_string(hp).str[i]<>'\') then - begin - if not(quoted) then - begin - if i>counter then - AsmWrite(','); - AsmWrite(''''); - end; - AsmWrite(tai_string(hp).str[i]); - quoted:=true; - end { if > 31 and < 128 and " } - else - begin - if quoted then - AsmWrite(''''); - if i>counter then - AsmWrite(','); - quoted:=false; - AsmWrite(tostr(ord(tai_string(hp).str[i]))); - end; - end; { end for i:=0 to... } - if quoted then - AsmWrite(''''); + begin + if not(quoted) then + begin + if i>counter then + AsmWrite(','); + AsmWrite(''''); + end; + AsmWrite(tai_string(hp).str[i]); + quoted:=true; + end { if > 31 and < 128 and " } + else + begin + if quoted then + AsmWrite(''''); + if i>counter then + AsmWrite(','); + quoted:=false; + AsmWrite(tostr(ord(tai_string(hp).str[i]))); + end; + end; { end for i:=0 to... } + if quoted then + AsmWrite(''''); end; - AsmLn; + AsmLn; end; ait_label: begin if tai_label(hp).l.is_used then begin s:= tai_label(hp).l.name; - ReplaceForbiddenChars(s); if s[1] = '@' then - //Local labels: - AsmWriteLn(s+':') + begin + ReplaceForbiddenChars(s); + //Local labels: + AsmWriteLn(s+':') + end else begin //Procedure entry points: if not macos_direct_globals then begin - AsmWriteLn(#9'toc'); - AsmWrite(#9'tc'#9); AsmWrite(s); - AsmWrite('[TC], '); AsmWrite(s); - AsmWriteLn(const_storage_class); - - AsmWrite(#9'csect'#9); AsmWrite(s); - AsmWriteLn(const_storage_class); + WriteDataHeader(s, tai_label(hp).is_global, true); end else begin + ReplaceForbiddenChars(s); AsmWrite(#9'csect'#9); AsmWrite(s); AsmWriteLn('[TC]'); @@ -1186,9 +1198,7 @@ var else if tai_symbol(hp).sym.typ=AT_DATA then begin s:= tai_symbol(hp).sym.name; - - WriteDataExportHeader(s, tai_symbol(hp).is_global, true); - + WriteDataHeader(s, tai_symbol(hp).is_global, true); if macos_direct_globals then begin AsmWrite(s); @@ -1223,41 +1233,9 @@ var {$endif GDB} ait_cutobject : begin - { only reset buffer if nothing has changed } - if AsmSize=AsmStartSize then - AsmClear - else - begin - { - if LasTSec<>sec_none then - AsmWriteLn('_'+target_asm.secnames[LasTSec]+#9#9'ends'); - AsmLn; - } - AsmWriteLn(#9'end'); - AsmClose; - DoAssemble; - AsmCreate(tai_cutobject(hp).place); - end; - { avoid empty files } - while assigned(hp.next) and (tai(hp.next).typ in [ait_cutobject,ait_section,ait_comment]) do - begin - if tai(hp.next).typ=ait_section then - begin - lasTSec:=tai_section(hp.next).sectype; - end; - hp:=tai(hp.next); - end; - WriteAsmFileHeader; - - if lasTSec<>sec_none then - AsmWriteLn(#9+secnames[lasTSec]); - { AsmWriteLn('_'+target_asm.secnames[lasTSec]+#9#9+ - 'SEGMENT'#9'PARA PUBLIC USE32 '''+ - target_asm.secnames[lasTSec]+''''); - } - AsmStartSize:=AsmSize; - end; - ait_marker : + InternalError(2004101101); {Smart linking is done transparently by the MPW linker.} + end; + ait_marker : begin if tai_marker(hp).kind=InlineStart then inc(InlineLevel) @@ -1330,7 +1308,7 @@ var begin AsmWrite(#9'import'#9); AsmWrite(s); - AsmWrite('[RW]'); + AsmWrite(var_storage_class); if replaced then begin AsmWrite(' <= '''); @@ -1344,7 +1322,7 @@ var AsmWrite(s); AsmWrite('[TC],'); AsmWrite(s); - AsmWriteLn('[RW]'); + AsmWriteLn(var_storage_class); end else InternalError(2003090901); @@ -1484,7 +1462,11 @@ initialization end. { $Log$ - Revision 1.40 2004-10-15 09:30:13 mazen + Revision 1.41 2004-10-31 15:32:13 olle + + Change of the way global variables, with multiple entrypoints, + are referenced, fixes a lot of failed tests + + Revision 1.40 2004/10/15 09:30:13 mazen - remove $IFDEF DELPHI and related code - remove $IFDEF FPCPROCVAR and related code