* lineinfo fixed for binary writer

* add tai_directive to replace old tai_direct calls
    in powerpc

git-svn-id: trunk@1139 -
This commit is contained in:
peter 2005-09-19 11:47:30 +00:00
parent 1f8c074ab4
commit 82faa95118
19 changed files with 180 additions and 331 deletions

View File

@ -1,5 +1,5 @@
#
# Don't edit, this file is generated by FPCMake Version 2.0.0 [2005/08/10]
# Don't edit, this file is generated by FPCMake Version 2.0.0 [2005/09/08]
#
default: all
MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-emx i386-watcom i386-netwlibc i386-wince m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos powerpc-linux powerpc-netbsd powerpc-macos powerpc-darwin powerpc-morphos sparc-linux sparc-netbsd sparc-solaris x86_64-linux x86_64-freebsd x86_64-win64 arm-linux arm-wince
@ -234,6 +234,7 @@ override PACKAGE_NAME=compiler
override PACKAGE_VERSION=2.0.0
unexport FPC_VERSION FPC_COMPILERINFO
CYCLETARGETS=i386 powerpc sparc arm x86_64
ALLTARGETS=$(CYCLETARGETS) m68k
ifdef ALPHA
PPC_TARGET=alpha
endif
@ -2617,14 +2618,14 @@ tempclean:
-$(DEL) $(PPCROSSNAME) $(TEMPNAME) $(TEMPNAME1) $(TEMPNAME2) $(TEMPNAME3) $(MSG2INC)
execlean :
-$(DEL) ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) $(EXENAME)
$(addsuffix _clean,$(CYCLETARGETS)):
$(addsuffix _clean,$(ALLTARGETS)):
-$(DELTREE) $(addprefix $(subst _clean,,$@),/units)
-$(DEL) $(addprefix $(subst _clean,,$@)/,*$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT))
-$(DEL) $(addprefix $(subst _clean,,$@)/,ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcppc$(EXEEXT) $(EXENAME))
cycleclean: cleanall $(addsuffix _clean,$(PPC_TARGET))
-$(DEL) $(EXENAME)
clean: tempclean execlean cleanall $(addsuffix _clean,$(PPC_TARGET)) $(addsuffix _clean,$(TARGET_DIRS))
distclean: tempclean execlean cleanall $(addsuffix _clean,$(CYCLETARGETS)) $(addsuffix _distclean,$(TARGET_DIRS))
distclean: tempclean execlean cleanall $(addsuffix _clean,$(ALLTARGETS)) $(addsuffix _distclean,$(TARGET_DIRS))
$(MSG2INC): $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(COMPILERUTILSDIR)/msg2inc.pp
$(COMPILER) -FE. $(COMPILERUTILSDIR)/msg2inc.pp
msgtxt.inc: $(MSGFILE)

View File

@ -34,6 +34,9 @@ unexport FPC_VERSION FPC_COMPILERINFO
# Which platforms are ready for inclusion in the cycle
CYCLETARGETS=i386 powerpc sparc arm x86_64
# All supported targets used for clean
ALLTARGETS=$(CYCLETARGETS) m68k
# Allow ALPHA, POWERPC, M68K, I386 defines for target cpu
ifdef ALPHA
PPC_TARGET=alpha
@ -294,7 +297,7 @@ tempclean:
execlean :
-$(DEL) ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) $(EXENAME)
$(addsuffix _clean,$(CYCLETARGETS)):
$(addsuffix _clean,$(ALLTARGETS)):
-$(DELTREE) $(addprefix $(subst _clean,,$@),/units)
-$(DEL) $(addprefix $(subst _clean,,$@)/,*$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT))
-$(DEL) $(addprefix $(subst _clean,,$@)/,ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcppc$(EXEEXT) $(EXENAME))
@ -304,7 +307,7 @@ cycleclean: cleanall $(addsuffix _clean,$(PPC_TARGET))
clean: tempclean execlean cleanall $(addsuffix _clean,$(PPC_TARGET)) $(addsuffix _clean,$(TARGET_DIRS))
distclean: tempclean execlean cleanall $(addsuffix _clean,$(CYCLETARGETS)) $(addsuffix _distclean,$(TARGET_DIRS))
distclean: tempclean execlean cleanall $(addsuffix _clean,$(ALLTARGETS)) $(addsuffix _distclean,$(TARGET_DIRS))
#####################################################################

View File

@ -50,6 +50,7 @@ interface
sec_code,sec_data,sec_rodata,sec_bss,sec_threadvar,
sec_common, { used for executable creation }
sec_custom, { custom section, no prefix }
sec_stub, { used for darwin import stubs }
{ stabs }
sec_stab,sec_stabstr,
{ win32 }
@ -185,8 +186,7 @@ interface
procedure writebytes(var data;len:aint);
procedure writereloc(data,len:aint;p:tasmsymbol;relative:TAsmRelocationType);virtual;abstract;
procedure writesymbol(p:tasmsymbol);virtual;abstract;
procedure writestabs(offset:aint;p:pchar;nidx,nother,line:longint;reloc:boolean);virtual;abstract;
procedure writesymstabs(offset:aint;p:pchar;ps:tasmsymbol;nidx,nother,line:longint;reloc:boolean);virtual;abstract;
procedure writestab(offset:aint;ps:tasmsymbol;nidx,nother,line:longint;p:pchar);virtual;abstract;
procedure beforealloc;virtual;
procedure beforewrite;virtual;
procedure afteralloc;virtual;
@ -575,6 +575,7 @@ implementation
'code','data','rodata','bss','threadvar',
'common',
'note',
'text',
'stab','stabstr',
'idata2','idata4','idata5','idata6','idata7','edata',
'eh_frame',

View File

@ -50,6 +50,7 @@ interface
ait_datablock,
ait_symbol,
ait_symbol_end, { needed to calc the size of a symbol }
ait_directive,
ait_label,
{ the const_xx must be below each other so it can be used as
array index }
@ -87,9 +88,7 @@ interface
ait_regalloc,
ait_tempalloc,
{ used to mark assembler blocks and inlined functions }
ait_marker,
{ special symbol for darwin pic code }
ait_non_lazy_symbol_pointer
ait_marker
);
const
@ -111,6 +110,7 @@ interface
'datablock',
'symbol',
'symbol_end',
'symbol_directive',
'label',
'const_128bit',
'const_64bit',
@ -144,8 +144,7 @@ interface
'cut',
'regalloc',
'tempalloc',
'marker',
'non_lazy_symbol_pointer'
'marker'
);
type
@ -158,7 +157,7 @@ interface
{$endif arm}
{$ifdef m68k}
{ m68k only }
,top_reglist
,top_regset
{$endif m68k}
{ i386 only});
@ -204,7 +203,7 @@ interface
const
SkipInstr = [ait_comment, ait_symbol,ait_section
,ait_stab, ait_function_name, ait_force_line
,ait_regalloc, ait_tempalloc, ait_symbol_end];
,ait_regalloc, ait_tempalloc, ait_symbol_end, ait_directive];
{ ait_* types which do not have line information (and hence which are of type
tai, otherwise, they are of type tailineinfo }
@ -215,8 +214,7 @@ interface
ait_const_8bit,ait_const_16bit,ait_const_32bit,ait_const_64bit,ait_const_128bit,
ait_const_sleb128bit,ait_const_uleb128bit,
ait_const_rva_symbol,ait_const_indirect_symbol,
ait_real_32bit,ait_real_64bit,ait_real_80bit,ait_comp_64bit,ait_real_128bit,
ait_non_lazy_symbol_pointer
ait_real_32bit,ait_real_64bit,ait_real_80bit,ait_comp_64bit,ait_real_128bit
];
@ -303,6 +301,18 @@ interface
procedure derefimpl;override;
end;
tasmdirective=(asd_non_lazy_symbol_pointer,asd_indirect_symbol,asd_lazy_symbol_pointer,
asd_extern,asd_nasm_import);
tai_directive = class(tailineinfo)
name : pstring;
directive : tasmdirective;
constructor Create(_directive:tasmdirective;const _name:string);
destructor Destroy;override;
constructor ppuload(t:taitype;ppufile:tcompilerppufile);override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
{ Generates an assembler label }
tai_label = class(tai)
is_global : boolean;
@ -624,6 +634,10 @@ interface
regallocstr : array[tregalloctype] of string[10]=('allocated','released','sync','resized');
tempallocstr : array[boolean] of string[10]=('released','allocated');
stabtypestr : array[tstabtype] of string[5]=('stabs','stabn','stabd');
directivestr : array[tasmdirective] of string[24]=(
'non_lazy_symbol_pointer','indirect_symbol','lazy_symbol_pointer',
'extern','nasm_import'
);
var
{ array with all class types for tais }
@ -1040,6 +1054,41 @@ implementation
end;
{****************************************************************************
TAI_SYMBOL_END
****************************************************************************}
constructor tai_directive.Create(_directive:tasmdirective;const _name:string);
begin
inherited Create;
typ:=ait_directive;
name:=stringdup(_name);
directive:=_directive;
end;
destructor tai_directive.Destroy;
begin
stringdispose(name);
end;
constructor tai_directive.ppuload(t:taitype;ppufile:tcompilerppufile);
begin
inherited ppuload(t,ppufile);
name:=stringdup(ppufile.getstring);
directive:=tasmdirective(ppufile.getbyte);
end;
procedure tai_directive.ppuwrite(ppufile:tcompilerppufile);
begin
inherited ppuwrite(ppufile);
ppufile.putstring(name^);
ppufile.putbyte(byte(directive));
end;
{****************************************************************************
TAI_CONST
****************************************************************************}

View File

@ -197,6 +197,7 @@ implementation
'.text','.data','.data','.bss','.threadvar',
'common',
'.note',
'__TEXT', { stubs }
'.stab','.stabstr',
'.idata$2','.idata$4','.idata$5','.idata$6','.idata$7','.edata',
'.eh_frame',
@ -218,14 +219,27 @@ implementation
begin
AsmLn;
case target_info.system of
system_powerpc_darwin, system_i386_OS2, system_i386_EMX: ;
system_i386_OS2,
system_i386_EMX : ;
system_powerpc_darwin :
begin
if atype=sec_stub then
AsmWrite('.section ');
end;
else
AsmWrite('.section ');
end;
s:=sectionname(atype,aname);
AsmWrite(s);
if atype=sec_fpc then
AsmWrite(', "a", @progbits');
case atype of
sec_fpc :
AsmWrite(', "a", @progbits');
sec_stub :
begin
if target_info.system=system_powerpc_darwin then
AsmWrite(',__symbol_stub1,symbol_stubs,pure_instructions,16');
end;
end;
AsmLn;
CurrSecType:=atype;
end;
@ -753,8 +767,13 @@ implementation
else if tai_marker(hp).kind=InlineEnd then
dec(InlineLevel);
ait_non_lazy_symbol_pointer:
AsmWriteLn('.non_lazy_symbol_pointer');
ait_directive :
begin
AsmWrite('.'+directivestr[tai_directive(hp).directive]+' ');
if assigned(tai_directive(hp).name) then
AsmWrite(tai_directive(hp).name^);
AsmLn;
end;
else
internalerror(10000);

View File

@ -877,7 +877,7 @@ Unit AoptObj;
{$define rangewason}
{$r-}
{$endif}
function tAOptObj.getjumplabelwithsym(sym: tasmlabel): tai;
function tAOptObj.getlabelwithsym(sym: tasmlabel): tai;
begin
if (sym.labelnr >= labelinfo^.lowlabel) and
(sym.labelnr <= labelinfo^.highlabel) then { range check, a jump can go past an assembler block! }

View File

@ -741,7 +741,7 @@ Implementation
inc(p);
case p^ of
#0 :
break;
break;
' ' :
inc(p);
'0'..'9' :
@ -777,24 +777,24 @@ Implementation
begin
if (relocsym.section<>sym.section) then
internalerror(2005091810);
relocsym:=nil;
relocsym:=nil;
end
else
begin
relocsym:=sym;
end;
end;
exprvalue:=sym.address;
end;
'+' :
begin
{ nothing, by default addition is done }
inc(p);
end;
end;
'-' :
begin
gotmin:=true;
inc(p);
end;
end;
else
internalerror(200509189);
end;
@ -806,6 +806,8 @@ Implementation
result:=true;
end;
const
N_Function = $24; { function or const }
var
ofs,
nline,
@ -843,7 +845,7 @@ Implementation
if currpass=1 then
objectdata.allocstab(pstr)
else
begin
begin
{ Stabs format: nidx,nother,nline[,offset] }
if not consumenumber(pcurr,nidx) then
internalerror(200509182);
@ -862,15 +864,10 @@ Implementation
ofs:=0;
relocsym:=nil;
end;
{ External references (AB_EXTERNAL and AB_COMMON) need a symbol relocation }
if assigned(relocsym) then
begin
objectdata.writesymbol(relocsym);
objectoutput.exportsymbol(relocsym);
objectdata.writeSymStabs(ofs,pstr,relocsym,nidx,nother,nline,true);
end
else
objectdata.writeStabs(ofs,pstr,nidx,nother,nline,false);
if (nidx=N_Function) and
target_info.use_function_relative_addresses then
ofs:=0;
objectdata.writestab(ofs,relocsym,nidx,nother,nline,pstr);
end;
if assigned(pendquote) then
pendquote^:='"';

View File

@ -107,4 +107,14 @@ implementation
CDebugInfo[t]:=c;
end;
const
dbg_none_info : tdbginfo =
(
id : dbg_none;
idtxt : 'NONE';
);
initialization
RegisterDebugInfo(dbg_none_info,tdebuginfo);
end.

View File

@ -358,6 +358,7 @@ interface
'.text','.data','.rodata','.bss','.tbss',
'common',
'.note',
'.text',
'.stab','.stabstr',
'.idata2','.idata4','.idata5','.idata6','.idata7','.edata',
'.eh_frame',
@ -380,9 +381,6 @@ interface
end;
procedure T386NasmAssembler.WriteTree(p:taasmoutput);
const
regallocstr : array[tregalloctype] of string[10]=(' allocated',' released',' sync',' resized');
tempallocstr : array[boolean] of string[10]=(' released',' allocated');
var
s : string;
hp : tai;
@ -747,6 +745,21 @@ interface
else if tai_marker(hp).kind=InlineEnd then
dec(InlineLevel);
ait_directive :
begin
case tai_directive(hp).directive of
asd_nasm_import :
AsmWrite('import ');
asd_extern :
AsmWrite('EXTERN ');
else
internalerror(200509191);
end;
if assigned(tai_directive(hp).name) then
AsmWrite(tai_directive(hp).name^);
AsmLn;
end;
else
internalerror(10000);
end;

View File

@ -70,8 +70,7 @@ interface
function sectionname(atype:tasmsectiontype;const aname:string):string;override;
procedure writereloc(data,len:aint;p:tasmsymbol;relative:TAsmRelocationType);override;
procedure writesymbol(p:tasmsymbol);override;
procedure writestabs(offset:aint;p:pchar;nidx,nother,line:longint;reloc:boolean);override;
procedure writesymstabs(offset:aint;p:pchar;ps:tasmsymbol;nidx,nother,line:longint;reloc:boolean);override;
procedure writestab(offset:aint;ps:tasmsymbol;nidx,nother,line:longint;p:pchar);override;
procedure beforealloc;override;
procedure beforewrite;override;
procedure afteralloc;override;
@ -557,6 +556,7 @@ const go32v2stub : array[0..2047] of byte=(
'.text','.data','.data','.bss','.threadvar',
'common',
'.note',
'.text',
'.stab','.stabstr',
'.idata$2','.idata$4','.idata$5','.idata$6','.idata$7','.edata',
'.eh_frame',
@ -660,74 +660,14 @@ const go32v2stub : array[0..2047] of byte=(
end;
procedure tcoffobjectdata.writestabs(offset:aint;p:pchar;nidx,nother,line:longint;reloc : boolean);
procedure tcoffobjectdata.writestab(offset:aint;ps:tasmsymbol;nidx,nother,line:longint;p:pchar);
var
stab : coffstab;
curraddr : longint;
begin
{ local var can be at offset -1 !! PM }
if reloc then
begin
if (offset=-1) then
begin
if currsec=nil then
offset:=0
else
offset:=currsec.datasize;
end;
if (currsec<>nil) then
inc(offset,currsec.datapos);
end;
if assigned(p) and (p[0]<>#0) then
begin
stab.strpos:=stabstrsec.datasize;
stabstrsec.write(p^,strlen(p)+1);
end
else
stab.strpos:=0;
stab.ntype:=nidx;
stab.ndesc:=line;
stab.nother:=nother;
stab.nvalue:=offset;
StabsSec.write(stab,sizeof(stab));
{ when the offset is not 0 then write a relocation, take also the
hdrstab into account with the offset }
if reloc then
begin
{ current address }
curraddr:=StabsSec.mempos+StabsSec.datasize;
if DLLSource and RelocSection then
{ avoid relocation in the .stab section
because it ends up in the .reloc section instead }
StabsSec.addsectionreloc(curraddr-4,currsec,RELOC_RVA)
else
StabsSec.addsectionreloc(curraddr-4,currsec,RELOC_ABSOLUTE);
end;
end;
procedure tcoffobjectdata.writesymstabs(offset:aint;p:pchar;ps:tasmsymbol;nidx,nother,line:longint;reloc:boolean);
var
stab : coffstab;
curraddr : longint;
begin
{ do not use the size stored in offset field
this is DJGPP specific ! PM }
if win32 then
{ Win32 does not need an offset if a symbol is provided }
if win32 and assigned(ps) then
offset:=0;
{ local var can be at offset -1 !! PM }
if reloc then
begin
if (offset=-1) then
begin
if currsec=nil then
offset:=0
else
offset:=currsec.datasize;
end;
if (currsec<>nil) then
inc(offset,currsec.mempos);
end;
if assigned(p) and (p[0]<>#0) then
begin
stab.strpos:=StabStrSec.datasize;
@ -740,9 +680,7 @@ const go32v2stub : array[0..2047] of byte=(
stab.nother:=nother;
stab.nvalue:=offset;
StabsSec.write(stab,sizeof(stab));
{ when the offset is not 0 then write a relocation, take also the
hdrstab into account with the offset }
if reloc then
if assigned(ps) then
begin
{ current address }
curraddr:=StabsSec.mempos+StabsSec.datasize;
@ -786,7 +724,7 @@ const go32v2stub : array[0..2047] of byte=(
{ create stabs sections if debugging }
if (cs_debuginfo in aktmoduleswitches) then
begin
writestabs(0,nil,0,0,0,false);
writestab(0,nil,0,0,0,nil);
{ write zero pchar and name together (PM) }
s:=#0+SplitFileName(current_module.mainsource^)+#0;
stabstrsec.write(s[1],length(s));
@ -1077,7 +1015,7 @@ const go32v2stub : array[0..2047] of byte=(
if StabsSec<>nil then
begin
{ first stabs for main source }
writestabs(0,nil,0,0,0,false);
writestab(0,nil,0,0,0,nil);
s:=#0+SplitFileName(current_module.mainsource^)+#0;
stabstrsec.write(s[1],length(s));
{ header stab }

View File

@ -72,8 +72,7 @@ interface
function sectionname(atype:tasmsectiontype;const aname:string):string;override;
procedure writereloc(data,len:aint;p:tasmsymbol;relative:TAsmRelocationType);override;
procedure writesymbol(p:tasmsymbol);override;
procedure writestabs(offset:aint;p:pchar;nidx,nother,line:longint;reloc:boolean);override;
procedure writesymstabs(offset:aint;p:pchar;ps:tasmsymbol;nidx,nother,line:longint;reloc:boolean);override;
procedure writestab(offset:aint;ps:tasmsymbol;nidx,nother,line:longint;p:pchar);override;
procedure beforealloc;override;
procedure beforewrite;override;
end;
@ -355,6 +354,7 @@ implementation
{$endif userodata}
'common',
'.note',
'.text', { darwin stubs }
'.stab','.stabstr',
'.idata$2','.idata$4','.idata$5','.idata$6','.idata$7','.edata',
'.eh_frame',
@ -429,20 +429,10 @@ implementation
end;
procedure telf32objectdata.writestabs(offset:aint;p:pchar;nidx,nother,line:longint;reloc : boolean);
procedure telf32objectdata.writestab(offset:aint;ps:tasmsymbol;nidx,nother,line:longint;p:pchar);
var
stab : telf32stab;
begin
if reloc then
begin
if (offset=-1) then
begin
if currsec=nil then
offset:=0
else
offset:=currsec.datasize;
end;
end;
fillchar(stab,sizeof(telf32stab),0);
if assigned(p) and (p[0]<>#0) then
begin
@ -454,32 +444,8 @@ implementation
stab.nother:=nother;
stab.nvalue:=offset;
stabssec.write(stab,sizeof(stab));
{ when the offset is not 0 then write a relocation, take also the
hdrstab into account with the offset }
if reloc then
stabssec.addsectionreloc(stabssec.datasize-4,currsec,RELOC_ABSOLUTE);
end;
procedure telf32objectdata.writesymstabs(offset:aint;p:pchar;ps:tasmsymbol;nidx,nother,line:longint;reloc:boolean);
var
stab : telf32stab;
begin
fillchar(stab,sizeof(telf32stab),0);
if assigned(p) and (p[0]<>#0) then
begin
stab.strpos:=stabstrsec.datasize;
stabstrsec.write(p^,strlen(p)+1);
end;
stab.ntype:=nidx;
stab.ndesc:=line;
stab.nother:=nother;
stab.nvalue:=0;
stabssec.write(stab,sizeof(stab));
{ when the offset is not 0 then write a relocation, take also the
hdrstab into account with the offset }
if reloc then
stabssec.addsymreloc(stabssec.datasize-4,ps,RELOC_ABSOLUTE);
if assigned(ps) then
stabssec.addsymreloc(stabssec.datasize-4,ps,RELOC_ABSOLUTE);
end;
@ -501,7 +467,7 @@ implementation
{ create stabs sections if debugging }
if (cs_debuginfo in aktmoduleswitches) then
begin
writestabs(0,nil,0,0,0,false);
writestab(0,nil,0,0,0,nil);
{ write zero pchar and name together (PM) }
s:=#0+SplitFileName(current_module.mainsource^)+#0;
stabstrsec.write(s[1],length(s));

View File

@ -257,7 +257,7 @@ implementation
{ PIC data }
{$ifdef powerpc}
if target_info.system=system_powerpc_darwin then
asmlist[al_picdata].concat(tai_simple.create(ait_non_lazy_symbol_pointer));
asmlist[al_picdata].concat(tai_directive.create(asd_non_lazy_symbol_pointer,''));
{$endif powerpc}
{ Resource strings }

View File

@ -39,10 +39,6 @@ interface
procedure WriteAsmList;override;
Function DoAssemble:boolean;override;
procedure WriteExternals;
{$ifdef GDB}
procedure WriteFileLineInfo(var fileinfo : tfileposinfo);
procedure WriteFileEndInfo;
{$endif}
procedure WriteAsmFileHeader;
private
procedure WriteInstruction(hp : tai);
@ -77,20 +73,9 @@ interface
'csect', {data}
'csect', {read only data}
'csect', {bss} 'csect',
'csect','csect','csect','csect','','','','','','','','',''
'csect','csect','csect','csect','','','','','','','','','',''
);
{$ifdef GDB}
var
n_line : byte; { different types of source lines }
linecount,
includecount : longint;
funcname : pchar;
stabslastfileinfo : tfileposinfo;
isInFunction: Boolean;
firstLineInFunction: longint;
{$endif}
type
t64bitarray = array[0..7] of byte;
t32bitarray = array[0..3] of byte;
@ -559,7 +544,7 @@ var
GetAdjacentTaiSymbol:= true;
Break;
end;
ait_stab_function_name:
ait_function_name:
hp:=tai(hp.next);
else
begin
@ -610,16 +595,6 @@ var
AsmWrite(s);
AsmWriteLn('[PR]');
{$ifdef GDB}
if ((cs_debuginfo in aktmoduleswitches) or
(cs_gdb_lineinfo in aktglobalswitches)) then
begin
//info for debuggers:
firstLineInFunction:= stabslastfileinfo.line;
AsmWriteLn(#9'beginf ' + tostr(firstLineInFunction));
isInFunction:= true;
end;
{$endif}
{Write all labels: }
hp:= first;
repeat
@ -697,85 +672,6 @@ var
(#9'dc.l'#9,#9'dc.w'#9,#9'dc.b'#9);
{$ifdef GDB}
procedure TPPCMPWAssembler.WriteFileLineInfo(var fileinfo : tfileposinfo);
var
curr_n : byte;
begin
if not ((cs_debuginfo in aktmoduleswitches) or
(cs_gdb_lineinfo in aktglobalswitches)) then
exit;
{ file changed ? (must be before line info) }
if (fileinfo.fileindex<>0) and
(stabslastfileinfo.fileindex<>fileinfo.fileindex) then
begin
infile:=current_module.sourcefiles.get_file(fileinfo.fileindex);
if assigned(infile) then
begin
(*
if includecount=0 then
curr_n:=n_sourcefile
else
curr_n:=n_includefile;
if (infile.path^<>'') then
begin
AsmWriteLn(#9'.stabs "'+lower(BsToSlash(FixPath(infile.path^,false)))+'",'+
tostr(curr_n)+',0,0,'+target_asm.labelprefix+'text'+ToStr(IncludeCount));
end;
AsmWriteLn(#9'.stabs "'+lower(FixFileName(infile.name^))+'",'+
tostr(curr_n)+',0,0,'+target_asm.labelprefix+'text'+ToStr(IncludeCount));
*)
AsmWriteLn(#9'file '''+lower(FixFileName(infile.name^))+'''');
(*
AsmWriteLn(target_asm.labelprefix+'text'+ToStr(IncludeCount)+':');
*)
inc(includecount);
{ force new line info }
stabslastfileinfo.line:=-1;
end;
end;
{ line changed ? }
if (stabslastfileinfo.line<>fileinfo.line) and (fileinfo.line<>0) then
begin
(*
if (n_line=n_textline) and assigned(funcname) and
(target_info.use_function_relative_addresses) then
begin
AsmWriteLn(target_asm.labelprefix+'l'+tostr(linecount)+':');
AsmWrite(#9'.stabn '+tostr(n_line)+',0,'+tostr(fileinfo.line)+','+
target_asm.labelprefix+'l'+tostr(linecount)+' - ');
AsmWritePChar(FuncName);
AsmLn;
inc(linecount);
end
else
AsmWriteLn(#9'.stabd'#9+tostr(n_line)+',0,'+tostr(fileinfo.line));
*)
if isInFunction then
AsmWriteln(#9'line '+ tostr(fileinfo.line - firstLineInFunction + 1));
end;
stabslastfileinfo:=fileinfo;
end;
procedure TPPCMPWAssembler.WriteFileEndInfo;
begin
if not ((cs_debuginfo in aktmoduleswitches) or
(cs_gdb_lineinfo in aktglobalswitches)) then
exit;
AsmLn;
(*
AsmWriteLn(ait_section2str(sec_code));
AsmWriteLn(#9'.stabs "",'+tostr(n_sourcefile)+',0,0,'+target_asm.labelprefix+'etext');
AsmWriteLn(target_asm.labelprefix+'etext:');
*)
end;
{$endif}
procedure TPPCMPWAssembler.WriteTree(p:TAAsmoutput);
var
s,
@ -813,13 +709,6 @@ var
begin
hp1 := hp as tailineinfo;
{$ifdef GDB}
{ write debug info }
if (cs_debuginfo in aktmoduleswitches) or
(cs_gdb_lineinfo in aktglobalswitches) then
WriteFileLineInfo(hp1.fileinfo);
{$endif GDB}
if do_line then
begin
{ load infile }
@ -899,9 +788,6 @@ var
AsmLn;
AsmWriteLn(#9+secnames[tai_section(hp).sectype]+' '+cur_CSECT_name+cur_CSECT_class);
{$ifdef GDB}
lastfileinfo.line:=-1;
{$endif GDB}
end;
LasTSec:=tai_section(hp).sectype;
end;
@ -1185,11 +1071,6 @@ var
end;
end;
end;
ait_direct:
begin
AsmWritePChar(tai_direct(hp).str);
AsmLn;
end;
ait_symbol:
begin
if tai_symbol(hp).sym.typ=AT_FUNCTION then
@ -1208,16 +1089,6 @@ var
InternalError(2003071301);
end;
ait_symbol_end:
{$ifdef GDB}
if isInFunction then
if ((cs_debuginfo in aktmoduleswitches) or
(cs_gdb_lineinfo in aktglobalswitches)) then
begin
//info for debuggers:
AsmWriteLn(#9'endf ' + tostr(stabslastfileinfo.line));
isInFunction:= false;
end
{$endif GDB}
;
ait_instruction:
WriteInstruction(hp);
@ -1374,12 +1245,7 @@ var
end;
procedure TPPCMPWAssembler.WriteAsmList;
{$ifdef GDB}
var
fileinfo : tfileposinfo;
{$endif GDB}
hal : tasmlist;
begin
{$ifdef EXTDEBUG}
@ -1387,24 +1253,6 @@ var
comment(v_info,'Start writing MPW-styled assembler output for '+current_module.mainsource^);
{$endif}
LasTSec:=sec_none;
{$ifdef GDB}
FillChar(stabslastfileinfo,sizeof(stabslastfileinfo),0);
{$endif GDB}
{$ifdef GDB}
//n_line:=n_bssline;
funcname:=nil;
linecount:=1;
includecount:=0;
fileinfo.fileindex:=1;
fileinfo.line:=1;
isInFunction:= false;
firstLineInFunction:= 0;
{ Write main file }
WriteFileLineInfo(fileinfo);
{$endif GDB}
WriteAsmFileHeader;
WriteExternals;
@ -1416,10 +1264,6 @@ var
AsmWriteLn(target_asm.comment+'End asmlist '+TasmlistStr[hal]);
end;
{$ifdef GDB}
WriteFileEndInfo;
{$ENDIF}
AsmWriteLn(#9'end');
AsmLn;

View File

@ -369,14 +369,13 @@ const
asmlist[al_imports]:=TAAsmoutput.create;
asmlist[al_imports].concat(Tai_section.Create(sec_data,'',0));
asmlist[al_imports].concat(Tai_direct.create(strpnew('.section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16')));
asmlist[al_imports].concat(Tai_section.create(sec_stub,'',0));
asmlist[al_imports].concat(Tai_align.Create(4));
result := objectlibrary.newasmsymbol(stubname,AB_EXTERNAL,AT_FUNCTION);
asmlist[al_imports].concat(Tai_symbol.Create(result,0));
asmlist[al_imports].concat(Tai_direct.create(strpnew((#9+'.indirect_symbol ')+s)));
asmlist[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
l1 := objectlibrary.newasmsymbol('L'+s+'$lazy_ptr',AB_EXTERNAL,AT_FUNCTION);
reference_reset_symbol(href,l1,0);
{$ifdef powerpc}
href.refaddr := addr_hi;
asmlist[al_imports].concat(taicpu.op_reg_ref(A_LIS,NR_R11,href));
href.refaddr := addr_lo;
@ -384,13 +383,10 @@ const
asmlist[al_imports].concat(taicpu.op_reg_ref(A_LWZU,NR_R12,href));
asmlist[al_imports].concat(taicpu.op_reg(A_MTCTR,NR_R12));
asmlist[al_imports].concat(taicpu.op_none(A_BCTR));
{$else powerpc}
internalerror(2004010502);
{$endif powerpc}
asmlist[al_imports].concat(Tai_section.Create(sec_data,'',0));
asmlist[al_imports].concat(Tai_direct.create(strpnew('.lazy_symbol_pointer')));
asmlist[al_imports].concat(tai_directive.create(asd_lazy_symbol_pointer,''));
asmlist[al_imports].concat(Tai_symbol.Create(l1,0));
asmlist[al_imports].concat(Tai_direct.create(strpnew((#9+'.indirect_symbol ')+s)));
asmlist[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
asmlist[al_imports].concat(tai_const.createname(strpnew('dyld_stub_binding_helper'),AT_FUNCTION,0));
end;

View File

@ -123,7 +123,7 @@ implementation
{$ifdef cpufpemu}
{ Normal types }
{ we use the same types as without emulator, the only
(* we use the same types as without emulator, the only
difference is that direct calls to the emulator are generated
if (cs_fp_emulation in aktmoduleswitches) then
begin
@ -135,7 +135,7 @@ implementation
addtype('Extended',pbestrealtype^);
end
else
}
*)
{$endif cpufpemu}
begin
addtype('Single',s32floattype);
@ -510,6 +510,7 @@ implementation
aiclass[ait_datablock]:=tai_datablock;
aiclass[ait_symbol]:=tai_symbol;
aiclass[ait_symbol_end]:=tai_symbol_end;
aiclass[ait_directive]:=tai_directive;
aiclass[ait_label]:=tai_label;
aiclass[ait_const_64bit]:=tai_const;
aiclass[ait_const_32bit]:=tai_const;

View File

@ -848,7 +848,7 @@ Begin
arraydef,
floatdef :
SetSize(tabstractvarsym(sym).getsize,false);
{ makes no sense when using sse instructions (FK)
(* makes no sense when using sse instructions (FK)
arraydef :
begin
{ for arrays try to get the element size, take care of
@ -859,7 +859,7 @@ Begin
harrdef:=tarraydef(harrdef.elementtype.def);
SetSize(harrdef.elesize,false);
end;
}
*)
end;
hasvar:=true;
SetupVar:=true;

View File

@ -209,6 +209,7 @@ const
{$ifdef powerpc}platform_select='-b elf32-powerpc -m elf32ppclinux';{$endif}
{$ifdef sparc} platform_select='-b elf32-sparc -m elf32_sparc';{$endif}
{$ifdef arm} platform_select='';{$endif} {unknown :( }
{$ifdef m68k} platform_select='';{$endif} {unknown :( }
{$ifdef m68k}
var

View File

@ -241,14 +241,8 @@ implementation
hp2:=twin32imported_item(hp1.imported_items.first);
while assigned(hp2) do
begin
{$warning TODO nasm lib, tai_direct not supported}
{if (aktoutputformat in [as_i386_tasm,as_i386_masm]) then
p:=strpnew(#9+'EXTRN '+hp2.func^)
else
p:=strpnew(#9+'EXTERN '+hp2.func^);
asmlist[al_imports].concat(tai_direct.create(p));
p:=strpnew(#9+'import '+hp2.func^+' '+hp1.dllname^+' '+hp2.name^);
asmlist[al_imports].concat(tai_direct.create(p));}
asmlist[al_imports].concat(tai_directive.create(asd_extern,hp2.func^));
asmlist[al_imports].concat(tai_directive.create(asd_nasm_import,hp2.func^+' '+hp1.dllname^+' '+hp2.name^));
hp2:=twin32imported_item(hp2.next);
end;
hp1:=timportlist(hp1.next);

View File

@ -60,13 +60,13 @@ implementation
secnames : array[TAsmSectionType] of string[4] = ('',
'CODE','DATA','DATA','BSS','',
'','','','','','',
'','','','','','','',
'','','','','','',''
);
secnamesml64 : array[TAsmSectionType] of string[7] = ('',
'_TEXT','_DATE','_DATA','_BSS','',
'','','','',
'','','','','',
'idata$2','idata$4','idata$5','idata$6','idata$7','edata',
'','',''
);
@ -787,6 +787,22 @@ implementation
else if tai_marker(hp).kind=InlineEnd then
dec(InlineLevel);
end;
ait_directive :
begin
case tai_directive(hp).directive of
asd_nasm_import :
AsmWrite('import ');
asd_extern :
AsmWrite('EXTRN ');
else
internalerror(200509192);
end;
if assigned(tai_directive(hp).name) then
AsmWrite(tai_directive(hp).name^);
AsmLn;
end;
else
internalerror(10000);
end;