diff --git a/compiler/cgbase.pas b/compiler/cgbase.pas index 41ee78fb3b..d45bc39717 100644 --- a/compiler/cgbase.pas +++ b/compiler/cgbase.pas @@ -72,11 +72,6 @@ unit cgbase; frame pointer from the outer procedure is stored. } framepointer_offset : longint; - {# offset from frame pointer to get self reference } - selfpointer_offset : longint; - {# offset from frame pointer to get vmt reference (constructors only) } - inheritedflag_offset, - vmtpointer_offset : longint; {# result value offset in stack (functions only) } return_offset : longint; {# firsttemp position } @@ -352,9 +347,6 @@ implementation parent:=aparent; procdef:=nil; framepointer_offset:=0; - selfpointer_offset:=0; - vmtpointer_offset:=0; - inheritedflag_offset:=0; return_offset:=0; firsttemp_offset:=0; flags:=[]; @@ -424,60 +416,7 @@ implementation begin { Retrieve function result offset } if assigned(procdef.funcretsym) then - begin - current_procinfo.return_offset:=tvarsym(procdef.funcretsym).address+ - tvarsym(procdef.funcretsym).owner.address_fixup; - if tvarsym(procdef.funcretsym).owner.symtabletype=localsymtable then - current_procinfo.return_offset:=tg.direction*current_procinfo.return_offset; - end; - { retrieve offsets of self/vmt } - if assigned(procdef._class) then - begin - if (po_containsself in procdef.procoptions) then - begin - inc(current_procinfo.selfpointer_offset,tvarsym(procdef.selfpara.parasym).address); - end - else - { self isn't pushed in nested procedure of methods } - if (procdef.parast.symtablelevel=normal_function_level) then - begin - srsym:=tvarsym(procdef.parast.search('self')); - if not assigned(srsym) then - internalerror(200305058); - selfpointer_offset:=tvarsym(srsym).address+srsym.owner.address_fixup; - end; - - { Special parameters for de-/constructors } - case procdef.proctypeoption of - potype_constructor : - begin - srsym:=tvarsym(procdef.parast.search('vmt')); - if not assigned(srsym) then - internalerror(200305058); - vmtpointer_offset:=tvarsym(srsym).address+srsym.owner.address_fixup; - end; - potype_destructor : - begin - if is_object(procdef._class) then - begin - srsym:=tvarsym(procdef.parast.search('vmt')); - if not assigned(srsym) then - internalerror(200305058); - vmtpointer_offset:=tvarsym(srsym).address+srsym.owner.address_fixup; - end - else - if is_class(procdef._class) then - begin - srsym:=tvarsym(procdef.parast.search('vmt')); - if not assigned(srsym) then - internalerror(200305058); - inheritedflag_offset:=tvarsym(srsym).address+srsym.owner.address_fixup; - end - else - internalerror(200303261); - end; - end; - end; + current_procinfo.return_offset:=tvarsym(procdef.funcretsym).adjusted_address; end; @@ -640,7 +579,13 @@ implementation end. { $Log$ - Revision 1.47 2003-05-13 19:14:41 peter + Revision 1.48 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.47 2003/05/13 19:14:41 peter * failn removed * inherited result code check moven to pexpr diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas index 4ef67a56ee..202eee47ac 100644 --- a/compiler/cgobj.pas +++ b/compiler/cgobj.pas @@ -374,7 +374,7 @@ unit cgobj; a routine declared as @var(interrupt). The default behavior does nothing, should be overriden as required. } - procedure g_interrupt_stackframe_exit(list : taasmoutput;selfused,accused,acchiused:boolean);virtual; + procedure g_interrupt_stackframe_exit(list : taasmoutput;accused,acchiused:boolean);virtual; {# Emits instructions when compilation is done in profile mode (this is set as a command line option). The default @@ -424,7 +424,7 @@ unit cgobj; } procedure g_restore_standard_registers(list:Taasmoutput;usedinproc:Tsupregset);virtual;abstract; procedure g_save_all_registers(list : taasmoutput);virtual;abstract; - procedure g_restore_all_registers(list : taasmoutput;selfused,accused,acchiused:boolean);virtual;abstract; + procedure g_restore_all_registers(list : taasmoutput;accused,acchiused:boolean);virtual;abstract; end; {# @abstract(Abstract code generator for 64 Bit operations) @@ -1635,7 +1635,7 @@ unit cgobj; end; - procedure tcg.g_interrupt_stackframe_exit(list : taasmoutput;selfused,accused,acchiused:boolean); + procedure tcg.g_interrupt_stackframe_exit(list : taasmoutput;accused,acchiused:boolean); begin end; @@ -1697,7 +1697,13 @@ finalization end. { $Log$ - Revision 1.97 2003-05-13 19:14:41 peter + Revision 1.98 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.97 2003/05/13 19:14:41 peter * failn removed * inherited result code check moven to pexpr diff --git a/compiler/defcmp.pas b/compiler/defcmp.pas index 33fdff50d1..736553e807 100644 --- a/compiler/defcmp.pas +++ b/compiler/defcmp.pas @@ -1175,7 +1175,7 @@ implementation exit; end; { check return value and options, methodpointer is already checked } - po_comp:=[po_staticmethod,po_containsself,po_interrupt, + po_comp:=[po_staticmethod,po_interrupt, po_iocheck,po_varargs]; if (m_delphi in aktmodeswitches) then exclude(po_comp,po_varargs); @@ -1211,7 +1211,13 @@ implementation end. { $Log$ - Revision 1.24 2003-05-09 17:47:02 peter + Revision 1.25 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.24 2003/05/09 17:47:02 peter * self moved to hidden parameter * removed hdisposen,hnewn,selfn diff --git a/compiler/globals.pas b/compiler/globals.pas index 7ed91419bd..db1ca008be 100644 --- a/compiler/globals.pas +++ b/compiler/globals.pas @@ -130,7 +130,6 @@ interface do_build, do_release, do_make : boolean; - not_unit_proc : boolean; { path for searching units, different paths can be seperated by ; } exepath : dirstr; { Path to ppc } librarysearchpath, @@ -154,18 +153,14 @@ interface block_type : tblock_type; { type of currently parsed block } - in_args : boolean; { arguments must be checked especially } parsing_para_level : integer; { parameter level, used to convert proc calls to proc loads in firstcalln } compile_level : word; make_ref : boolean; resolving_forward : boolean; { used to add forward reference as second ref } - use_esp_stackframe : boolean; { to test for call with ESP as stack frame } inlining_procedure : boolean; { are we inlining a procedure } - statement_level : integer; exceptblockcounter : integer; { each except block gets a unique number check gotos } aktexceptblock : integer; { the exceptblock number of the current block (0 if none) } - have_local_threadvars : boolean; { set if a table of local threadvars-tables is present and has to be initialized } { commandline values } initdefines : tstringlist; @@ -1448,7 +1443,6 @@ implementation DLLsource:=false; inlining_procedure:=false; resolving_forward:=false; - in_args:=false; make_ref:=false; { Output } @@ -1515,20 +1509,19 @@ implementation stacksize:=0; heapsize:=0; - { compile state } - in_args:=false; - { must_be_valid:=true; obsolete PM } - not_unit_proc:=true; - apptype:=app_cui; - - have_local_threadvars := false; end; end. { $Log$ - Revision 1.88 2003-04-27 11:21:32 peter + Revision 1.89 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.88 2003/04/27 11:21:32 peter * aktprocdef renamed to current_procdef * procinfo renamed to current_procinfo * procinfo will now be stored in current_module so it can be diff --git a/compiler/i386/n386obj.pas b/compiler/i386/n386obj.pas index 2d4d55c960..ff20e8ced3 100644 --- a/compiler/i386/n386obj.pas +++ b/compiler/i386/n386obj.pas @@ -167,7 +167,7 @@ begin if procdef.proctypeoption<>potype_none then Internalerror(200006137); if not assigned(procdef._class) or - (procdef.procoptions*[po_containsself, po_classmethod, po_staticmethod, + (procdef.procoptions*[po_classmethod, po_staticmethod, po_methodpointer, po_interrupt, po_iocheck]<>[]) then Internalerror(200006138); if procdef.owner.symtabletype<>objectsymtable then @@ -247,7 +247,13 @@ initialization end. { $Log$ - Revision 1.18 2003-04-22 14:33:38 peter + Revision 1.19 2003-05-15 18:58:54 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.18 2003/04/22 14:33:38 peter * removed some notes/hints Revision 1.17 2003/01/13 14:54:34 daniel diff --git a/compiler/ncgcal.pas b/compiler/ncgcal.pas index 858cc626e3..5a646ef777 100644 --- a/compiler/ncgcal.pas +++ b/compiler/ncgcal.pas @@ -805,14 +805,10 @@ implementation if (po_methodpointer in procdefinition.procoptions) then begin - { push self, but not if it's already explicitly pushed } - if not(po_containsself in procdefinition.procoptions) then - begin - { push self } - href:=right.location.reference; - inc(href.offset,POINTER_SIZE); - cg.a_param_ref(exprasmlist,OS_ADDR,href,paramanager.getintparaloc(1)); - end; + { push self } + href:=right.location.reference; + inc(href.offset,POINTER_SIZE); + cg.a_param_ref(exprasmlist,OS_ADDR,href,paramanager.getintparaloc(1)); rg.saveintregvars(exprasmlist,ALL_INTREGISTERS); rg.saveotherregvars(exprasmlist,ALL_REGISTERS); @@ -1022,7 +1018,10 @@ implementation if st.datasize>0 then begin tg.GetTemp(exprasmlist,st.datasize,tt_persistant,localsref); - st.address_fixup:=localsref.offset+st.datasize; + if tg.direction>0 then + st.address_fixup:=localsref.offset + else + st.address_fixup:=localsref.offset+st.datasize; {$ifdef extdebug} Comment(V_debug,'local symtable is at offset '+tostr(st.address_fixup)); exprasmList.concat(tai_comment.Create(strpnew( @@ -1129,7 +1128,13 @@ begin end. { $Log$ - Revision 1.64 2003-05-14 19:36:54 jonas + Revision 1.65 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.64 2003/05/14 19:36:54 jonas * patch from Peter for int64 function results Revision 1.63 2003/05/13 19:14:41 peter diff --git a/compiler/ncgld.pas b/compiler/ncgld.pas index dd5c2e41eb..6147a17115 100644 --- a/compiler/ncgld.pas +++ b/compiler/ncgld.pas @@ -192,25 +192,8 @@ implementation inlineparasymtable : begin location.reference.base:=current_procinfo.framepointer; - if (symtabletype in [inlinelocalsymtable, - localsymtable]) - then - location.reference.offset:= - tvarsym(symtableentry).address+tg.direction*symtable.address_fixup - else - location.reference.offset:= - tvarsym(symtableentry).address+symtable.address_fixup; + location.reference.offset:=tvarsym(symtableentry).adjusted_address; -{$ifndef powerpc} - if (symtabletype in [localsymtable,inlinelocalsymtable]) then - begin - if use_esp_stackframe then - dec(location.reference.offset, - tvarsym(symtableentry).getvaluesize) - else - location.reference.offset:=-location.reference.offset; - end; -{$endif powerpc} if (current_procdef.parast.symtablelevel>symtable.symtablelevel) then begin hregister:=rg.getaddressregister(exprasmlist); @@ -932,7 +915,13 @@ begin end. { $Log$ - Revision 1.58 2003-05-12 17:22:00 jonas + Revision 1.59 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.58 2003/05/12 17:22:00 jonas * fixed (last?) remaining -tvarsym(X).address to tg.direction*tvarsym(X).address... diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas index 379a2e1876..165fe10070 100644 --- a/compiler/ncgutil.pas +++ b/compiler/ncgutil.pas @@ -975,13 +975,13 @@ implementation (tvarsym(p).varspez=vs_value) and (paramanager.push_addr_param(tvarsym(p).vartype.def,current_procinfo.procdef.proccalloption)) then begin - reference_reset_base(href1,current_procinfo.framepointer,tvarsym(p).address+tvarsym(p).owner.address_fixup); + reference_reset_base(href1,current_procinfo.framepointer,tvarsym(p).adjusted_address); if is_open_array(tvarsym(p).vartype.def) or is_array_of_const(tvarsym(p).vartype.def) then cg.g_copyvaluepara_openarray(list,href1,tarraydef(tvarsym(p).vartype.def).elesize) else begin - reference_reset_base(href2,current_procinfo.framepointer,tg.direction*tvarsym(p).localvarsym.address+tvarsym(p).localvarsym.owner.address_fixup); + reference_reset_base(href2,current_procinfo.framepointer,tvarsym(p).localvarsym.adjusted_address); if is_shortstring(tvarsym(p).vartype.def) then cg.g_copyshortstring(list,href1,href2,tstringdef(tvarsym(p).vartype.def).len,false,true) else @@ -1007,7 +1007,7 @@ implementation if (cs_implicit_exceptions in aktmoduleswitches) then include(current_procinfo.flags,pi_needs_implicit_finally); if tsym(p).owner.symtabletype in [localsymtable,inlinelocalsymtable] then - reference_reset_base(href,current_procinfo.framepointer,tg.direction*tvarsym(p).address+tvarsym(p).owner.address_fixup) + reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).adjusted_address) else reference_reset_symbol(href,objectlibrary.newasmsymboldata(tvarsym(p).mangledname),0); cg.g_initialize(list,tvarsym(p).vartype.def,href,false); @@ -1032,7 +1032,7 @@ implementation tvarsym(p).vartype.def.needs_inittable then begin if tsym(p).owner.symtabletype in [localsymtable,inlinelocalsymtable] then - reference_reset_base(href,current_procinfo.framepointer,tg.direction*tvarsym(p).address+tvarsym(p).owner.address_fixup) + reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).adjusted_address) else reference_reset_symbol(href,objectlibrary.newasmsymboldata(tvarsym(p).mangledname),0); cg.g_finalize(list,tvarsym(p).vartype.def,href,false); @@ -1070,15 +1070,14 @@ implementation if (cs_implicit_exceptions in aktmoduleswitches) then include(current_procinfo.flags,pi_needs_implicit_finally); if assigned(tvarsym(p).localvarsym) then - reference_reset_base(href,current_procinfo.framepointer, - tg.direction*tvarsym(p).localvarsym.address+tvarsym(p).localvarsym.owner.address_fixup) + reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).localvarsym.adjusted_address) else - reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).address+tvarsym(p).owner.address_fixup); + reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).adjusted_address); cg.g_incrrefcount(list,tvarsym(p).vartype.def,href,is_open_array(tvarsym(p).vartype.def)); end; vs_out : begin - reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).address+tvarsym(p).owner.address_fixup); + reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).adjusted_address); {$ifdef newra} tmpreg:=rg.getaddressregister(list); {$else} @@ -1111,10 +1110,9 @@ implementation if (tvarsym(p).varspez=vs_value) then begin if assigned(tvarsym(p).localvarsym) then - reference_reset_base(href,current_procinfo.framepointer, - tg.direction*tvarsym(p).localvarsym.address+tvarsym(p).localvarsym.owner.address_fixup) + reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).localvarsym.adjusted_address) else - reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).address+tvarsym(p).owner.address_fixup); + reference_reset_base(href,current_procinfo.framepointer,tvarsym(p).adjusted_address); cg.g_decrrefcount(list,tvarsym(p).vartype.def,href,is_open_array(tvarsym(p).vartype.def)); end; end; @@ -1357,11 +1355,10 @@ implementation cg.a_loadfpu_reg_reg(list,hp.paraloc.register,tvarsym(hp.parasym).reg); end else if (hp.paraloc.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER, - LOC_CREGISTER,LOC_CFPUREGISTER,LOC_CMMREGISTER]) and - (tvarsym(hp.parasym).reg.enum=R_NO) then + LOC_CREGISTER,LOC_CFPUREGISTER,LOC_CMMREGISTER]) and + (tvarsym(hp.parasym).reg.enum=R_NO) then begin - reference_reset_base(href,current_procinfo.framepointer,tvarsym(hp.parasym).address+ - tvarsym(hp.parasym).owner.address_fixup); + reference_reset_base(href,current_procinfo.framepointer,tvarsym(hp.parasym).adjusted_address); case hp.paraloc.loc of LOC_CREGISTER, LOC_REGISTER: @@ -1620,13 +1617,13 @@ implementation stabsendlabel : tasmlabel; mangled_length : longint; p : pchar; - st : string[2]; {$endif GDB} okexitlabel : tasmlabel; href : treference; + srsym : tsym; usesacc, usesacchi, - usesself,usesfpu : boolean; + usesfpu : boolean; rsp,r : Tregister; begin if aktexit2label.is_used and @@ -1639,7 +1636,7 @@ implementation end; if aktexitlabel.is_used then - list.concat(Tai_label.Create(aktexitlabel)); + cg.a_label(list,aktexitlabel); cleanup_regvars(list); @@ -1680,7 +1677,6 @@ implementation they didn't reference the result variable } usesacc:=false; usesacchi:=false; - usesself:=false; if not(po_assembler in current_procdef.procoptions) or (assigned(current_procdef.funcretsym) and (tvarsym(current_procdef.funcretsym).refcount>1)) then @@ -1695,7 +1691,10 @@ implementation r.number:=NR_ACCUMULATOR; cg.a_reg_alloc(list,r); { return the self pointer } - reference_reset_base(href, current_procinfo.framepointer,current_procinfo.selfpointer_offset); + srsym:=tvarsym(current_procdef.parast.search('self')); + if not assigned(srsym) then + internalerror(200305058); + reference_reset_base(href,current_procinfo.framepointer,tvarsym(srsym).adjusted_address); cg.a_load_ref_reg(list,OS_ADDR,href,r); cg.a_reg_dealloc(list,r); usesacc:=true; @@ -1730,7 +1729,7 @@ implementation { for the save all registers we can simply use a pusha,popa which push edi,esi,ebp,esp(ignored),ebx,edx,ecx,eax } if (po_saveregisters in current_procdef.procoptions) then - cg.g_restore_all_registers(list,usesself,usesacc,usesacchi) + cg.g_restore_all_registers(list,usesacc,usesacchi) else { should we restore edi ? } if (po_savestdregs in current_procdef.procoptions) then @@ -1753,7 +1752,7 @@ implementation if not inlined then begin if (po_interrupt in current_procdef.procoptions) then - cg.g_interrupt_stackframe_exit(list,usesself,usesacc,usesacchi) + cg.g_interrupt_stackframe_exit(list,usesacc,usesacchi) else begin {$ifndef i386} @@ -1773,42 +1772,6 @@ implementation {$ifdef GDB} if (cs_debuginfo in aktmoduleswitches) and not inlined then begin - if assigned(current_procdef._class) then - if (not assigned(current_procinfo.parent) or - not assigned(current_procinfo.parent.procdef._class)) then - begin - if (po_classmethod in current_procdef.procoptions) or - ((po_virtualmethod in current_procdef.procoptions) and - (potype_constructor=current_procdef.proctypeoption)) or - (po_staticmethod in current_procdef.procoptions) then - begin - list.concat(Tai_stabs.Create(strpnew( - '"pvmt:p'+tstoreddef(pvmttype.def).numberstring+'",'+ - tostr(N_tsym)+',0,0,'+tostr(current_procinfo.selfpointer_offset)))); - end - else - begin - if not(is_class(current_procdef._class)) then - st:='v' - else - st:='p'; - list.concat(Tai_stabs.Create(strpnew( - '"$t:'+st+current_procdef._class.numberstring+'",'+ - tostr(N_tsym)+',0,0,'+tostr(current_procinfo.selfpointer_offset)))); - end; - end - else - begin - if not is_class(current_procdef._class) then - st:='*' - else - st:=''; -{$warning GDB self} - {list.concat(Tai_stabs.Create(strpnew( - '"$t:r'+st+current_procdef._class.numberstring+'",'+ - tostr(N_RSYM)+',0,0,'+tostr(stab_regindex[SELF_POINTER_REG]))));} - end; - { define calling EBP as pseudo local var PM } { this enables test if the function is a local one !! } if assigned(current_procinfo.parent) and @@ -1872,7 +1835,13 @@ implementation end. { $Log$ - Revision 1.103 2003-05-14 19:37:25 jonas + Revision 1.104 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.103 2003/05/14 19:37:25 jonas * patch from Peter for int64 function results Revision 1.102 2003/05/13 19:14:41 peter diff --git a/compiler/parser.pas b/compiler/parser.pas index 4fd5c7820b..6a18dfb5aa 100644 --- a/compiler/parser.pas +++ b/compiler/parser.pas @@ -287,7 +287,6 @@ implementation old_compiled_module : tmodule; oldaktdefproccall : tproccalloption; oldsourcecodepage : tcodepagestring; - oldstatement_level : integer; {$ifdef GDB} store_dbx : plongint; {$endif GDB} @@ -363,7 +362,6 @@ implementation oldaktinterfacetype:=aktinterfacetype; oldaktfilepos:=aktfilepos; oldaktmodeswitches:=aktmodeswitches; - oldstatement_level:=statement_level; {$ifdef GDB} store_dbx:=dbx_counter; dbx_counter:=nil; @@ -379,7 +377,6 @@ implementation refsymtable:=nil; aktdefproccall:=initdefproccall; registerdef:=true; - statement_level:=0; aktexceptblock:=0; exceptblockcounter:=0; aktmaxfpuregisters:=-1; @@ -548,7 +545,6 @@ implementation aktinterfacetype:=oldaktinterfacetype; aktfilepos:=oldaktfilepos; aktmodeswitches:=oldaktmodeswitches; - statement_level:=oldstatement_level; aktexceptblock:=0; exceptblockcounter:=0; {$ifdef GDB} @@ -622,7 +618,13 @@ implementation end. { $Log$ - Revision 1.52 2003-04-27 11:21:33 peter + Revision 1.53 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.52 2003/04/27 11:21:33 peter * aktprocdef renamed to current_procdef * procinfo renamed to current_procinfo * procinfo will now be stored in current_module so it can be diff --git a/compiler/pass_2.pas b/compiler/pass_2.pas index aebb752706..4310891cdc 100644 --- a/compiler/pass_2.pas +++ b/compiler/pass_2.pas @@ -264,7 +264,6 @@ implementation rg.t_times:=100; { clear register count } rg.clearregistercount; - use_esp_stackframe:=false; symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}clearrefs,nil); symtablestack.next.foreach_static({$ifdef FPCPROCVAR}@{$endif}clearrefs,nil); { firstpass everything } @@ -302,7 +301,13 @@ implementation end. { $Log$ - Revision 1.51 2003-05-13 19:14:41 peter + Revision 1.52 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.51 2003/05/13 19:14:41 peter * failn removed * inherited result code check moven to pexpr diff --git a/compiler/pbase.pas b/compiler/pbase.pas index 4521d79411..3e07a8e1af 100644 --- a/compiler/pbase.pas +++ b/compiler/pbase.pas @@ -40,6 +40,12 @@ interface { true, if we are after an assignement } afterassignment : boolean = false; + { true, if we are parsing arguments } + in_args : boolean = false; + + { true, if we got an @ to get the address } + got_addrn : boolean = false; + { special for handling procedure vars } getprocvardef : tprocvardef = nil; @@ -267,7 +273,13 @@ implementation end. { $Log$ - Revision 1.23 2003-03-17 18:55:30 peter + Revision 1.24 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.23 2003/03/17 18:55:30 peter * allow more tokens instead of only semicolon after inherited Revision 1.22 2002/12/05 19:28:05 carl diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index ebf294e8f8..4a7b9b05df 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -45,8 +45,6 @@ interface procedure insert_funcret_local(pd:tprocdef); - procedure check_self_para(pd:tabstractprocdef); - function proc_add_definition(var pd:tprocdef):boolean; procedure handle_calling_convention(pd:tabstractprocdef); @@ -132,16 +130,13 @@ implementation if (pd.deftype=procvardef) and pd.is_methodpointer then begin - if not(po_containsself in pd.procoptions) then - begin - { Generate self variable } - tt:=voidpointertype; - vs:=tvarsym.create('$self',vs_value,tt); - include(vs.varoptions,vo_is_self); - { Insert as hidden parameter } - pd.parast.insert(vs); - pd.insertpara(vs.vartype,vs,nil,true); - end; + { Generate self variable } + tt:=voidpointertype; + vs:=tvarsym.create('$self',vs_value,tt); + include(vs.varoptions,vo_is_self); + { Insert as hidden parameter } + pd.parast.insert(vs); + pd.insertpara(vs.vartype,vs,nil,true); end else begin @@ -167,29 +162,25 @@ implementation { Generate self variable, for classes we need to use the generic voidpointer to be compatible with - methodpointers. - Only needed when there is no explicit self para } - if not(po_containsself in pd.procoptions) then - begin - vsp:=vs_value; - if (po_staticmethod in pd.procoptions) or - (po_classmethod in pd.procoptions) then - begin - tt.setdef(tprocdef(pd)._class); - tt.setdef(tclassrefdef.create(tt)); - end - else - begin - if is_object(tprocdef(pd)._class) then - vsp:=vs_var; - tt.setdef(tprocdef(pd)._class); - end; - vs:=tvarsym.create('$self',vsp,tt); - include(vs.varoptions,vo_is_self); - { Insert as hidden parameter } - pd.parast.insert(vs); - pd.insertpara(vs.vartype,vs,nil,true); - end; + methodpointers } + vsp:=vs_value; + if (po_staticmethod in pd.procoptions) or + (po_classmethod in pd.procoptions) then + begin + tt.setdef(tprocdef(pd)._class); + tt.setdef(tclassrefdef.create(tt)); + end + else + begin + if is_object(tprocdef(pd)._class) then + vsp:=vs_var; + tt.setdef(tprocdef(pd)._class); + end; + vs:=tvarsym.create('$self',vsp,tt); + include(vs.varoptions,vo_is_self); + { Insert as hidden parameter } + pd.parast.insert(vs); + pd.insertpara(vs.vartype,vs,nil,true); akttokenpos:=storepos; end; @@ -337,36 +328,6 @@ implementation end; - procedure check_self_para(pd:tabstractprocdef); - var - hpara : tparaitem; - vs : tvarsym; - begin - hpara:=pd.selfpara; - if assigned(hpara) and - ( - ((pd.deftype=procvardef) and - (po_methodpointer in pd.procoptions)) or - ((pd.deftype=procdef) and - assigned(tprocdef(pd)._class)) - ) then - begin - include(pd.procoptions,po_containsself); - if hpara.paratyp <> vs_value then - CGMessage(parser_e_self_call_by_value); - if (pd.deftype=procdef) then - begin - if compare_defs(hpara.paratype.def,tprocdef(pd)._class,nothingn)=te_incompatible then - CGMessage2(type_e_incompatible_types,hpara.paratype.def.typename,tprocdef(pd)._class.typename); - end; - { add an alias for $self which is for internal use } - vs:=tabsolutesym.create_ref('$self',hpara.paratype,tstoredsym(hpara.parasym)); - include(vs.varoptions,vo_is_self); - pd.parast.insert(vs); - end; - end; - - procedure parse_parameter_dec(pd:tabstractprocdef); { handle_procvar needs the same changes @@ -524,19 +485,11 @@ implementation include(vs.varoptions,vo_regable); end; hpara:=pd.concatpara(nil,tt,vs,tdefaultvalue,false); - { save position of self parameter } - if vs.name='SELF' then - pd.selfpara:=hpara; vs:=tvarsym(vs.listnext); end; until not try_to_consume(_SEMICOLON); { remove parasymtable from stack } sc.free; - { check for a self parameter which is needed to allow message - directive, only for normal procedures. For procvars we need - to wait until the 'of object' is parsed } - if not is_procvar then - check_self_para(pd); { reset object options } dec(testcurobject); current_object_option:=old_object_option; @@ -1107,8 +1060,7 @@ begin if not is_class(tprocdef(pd)._class) then Message(parser_e_msg_only_for_classes); { check parameter type } - if not(po_containsself in pd.procoptions) and - ((pd.minparacount<>1) or + if ((pd.minparacount<>1) or (pd.maxparacount<>1) or (TParaItem(pd.Para.first).paratyp<>vs_var)) then Message(parser_e_ill_msg_param); @@ -1946,9 +1898,6 @@ const begin pdflags:=pd_object; parse_proc_directives(pd,pdflags); - if (po_containsself in pd.procoptions) and - (([po_msgstr,po_msgint]*pd.procoptions)=[]) then - Message(parser_e_self_in_non_message_handler); end; @@ -2074,9 +2023,9 @@ const { Check procedure options, Delphi requires that class is repeated in the implementation for class methods } if (m_fpc in aktmodeswitches) then - po_comp:=[po_varargs,po_methodpointer,po_containsself,po_interrupt,po_clearstack] + po_comp:=[po_varargs,po_methodpointer,po_interrupt,po_clearstack] else - po_comp:=[po_classmethod,po_methodpointer,po_containsself]; + po_comp:=[po_classmethod,po_methodpointer]; if ((po_comp * hd.procoptions)<>(po_comp * pd.procoptions)) then begin @@ -2224,7 +2173,13 @@ const end. { $Log$ - Revision 1.123 2003-05-13 15:18:49 peter + Revision 1.124 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.123 2003/05/13 15:18:49 peter * fixed various crashes Revision 1.122 2003/05/09 17:47:03 peter diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas index 6fa1610461..0c9521ea46 100644 --- a/compiler/pexpr.pas +++ b/compiler/pexpr.pas @@ -90,9 +90,8 @@ implementation function sub_expr(pred_level:Toperator_precedence;accept_equal : boolean):tnode;forward; const - got_addrn : boolean = false; - anon_inherited : boolean = false; - + { true, if the inherited call is anonymous } + anon_inherited : boolean = false; @@ -2400,7 +2399,13 @@ implementation end. { $Log$ - Revision 1.119 2003-05-13 20:54:39 peter + Revision 1.120 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.119 2003/05/13 20:54:39 peter * ifdef'd code that checked for failed inherited constructors Revision 1.118 2003/05/13 19:14:41 peter diff --git a/compiler/pmodules.pas b/compiler/pmodules.pas index 377d6ec39e..37a210a0c7 100644 --- a/compiler/pmodules.pas +++ b/compiler/pmodules.pas @@ -209,8 +209,6 @@ implementation dataSegment.concat(Tai_cut.Create); dataSegment.concatlist(ltvTables); ltvTables.free; - if count > 0 then - have_local_threadvars := true; end; @@ -1484,7 +1482,13 @@ So, all parameters are passerd into registers in sparc architecture.} end. { $Log$ - Revision 1.105 2003-05-11 19:31:28 florian + Revision 1.106 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.105 2003/05/11 19:31:28 florian * fixed implicit init/final code for units, stack frame was wrong for ppc Revision 1.104 2003/04/28 21:19:02 peter diff --git a/compiler/pstatmnt.pas b/compiler/pstatmnt.pas index 1b075a4864..bb339c13d7 100644 --- a/compiler/pstatmnt.pas +++ b/compiler/pstatmnt.pas @@ -205,7 +205,6 @@ implementation end; consume(_OF); - inc(statement_level); root:=nil; instruc:=nil; repeat @@ -293,7 +292,6 @@ implementation elseblock:=nil; consume(_END); end; - dec(statement_level); code:=ccasenode.create(caseexpr,instruc,root); @@ -311,7 +309,6 @@ implementation begin consume(_REPEAT); first:=nil; - inc(statement_level); while token<>_UNTIL do begin @@ -330,7 +327,6 @@ implementation consume_emptystats; end; consume(_UNTIL); - dec(statement_level); first:=cblocknode.create(first,true); p_e:=comp_expr(true); @@ -593,7 +589,6 @@ implementation inc(exceptblockcounter); oldaktexceptblock := aktexceptblock; aktexceptblock := exceptblockcounter; - inc(statement_level); while (token<>_FINALLY) and (token<>_EXCEPT) do begin @@ -619,7 +614,6 @@ implementation aktexceptblock := exceptblockcounter; p_finally_block:=statements_til_end; try_statement:=ctryfinallynode.create(p_try_block,p_finally_block); - dec(statement_level); end else begin @@ -755,7 +749,6 @@ implementation { catch all exceptions } p_default:=statements_til_end; end; - dec(statement_level); block_type:=old_block_type; try_statement:=ctryexceptnode.create(p_try_block,p_specific,p_default); @@ -1009,7 +1002,6 @@ implementation first:=nil; filepos:=akttokenpos; consume(starttoken); - inc(statement_level); while not(token in [_END,_FINALIZATION]) do begin @@ -1044,8 +1036,6 @@ implementation if (starttoken<>_INITIALIZATION) or (token<>_FINALIZATION) then consume(_END); - dec(statement_level); - last:=cblocknode.create(first,true); last.set_tree_filepos(filepos); statement_block:=last; @@ -1185,7 +1175,13 @@ implementation end. { $Log$ - Revision 1.98 2003-05-13 19:14:41 peter + Revision 1.99 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.98 2003/05/13 19:14:41 peter * failn removed * inherited result code check moven to pexpr diff --git a/compiler/ptype.pas b/compiler/ptype.pas index b2d25baba1..5dab594fac 100644 --- a/compiler/ptype.pas +++ b/compiler/ptype.pas @@ -612,7 +612,6 @@ implementation consume(_OF); consume(_OBJECT); include(pd.procoptions,po_methodpointer); - check_self_para(pd); end; { Add implicit hidden parameters and function result } calc_parast(pd); @@ -628,7 +627,13 @@ implementation end. { $Log$ - Revision 1.54 2003-05-09 17:47:03 peter + Revision 1.55 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.54 2003/05/09 17:47:03 peter * self moved to hidden parameter * removed hdisposen,hnewn,selfn diff --git a/compiler/rautils.pas b/compiler/rautils.pas index f61ba38cf1..f8fe189a4a 100644 --- a/compiler/rautils.pas +++ b/compiler/rautils.pas @@ -759,15 +759,9 @@ Function TOperand.SetupSelf:boolean; Begin SetupSelf:=false; if assigned(current_procdef._class) then - Begin - opr.typ:=OPR_REFERENCE; - opr.ref.offset:=current_procinfo.selfpointer_offset; - opr.ref.base:=current_procinfo.framepointer; - opr.ref.options:=ref_selffixup; - SetupSelf:=true; - end + SetupSelf:=setupvar('self',false) else - Message(asmr_e_cannot_use_SELF_outside_a_method); + Message(asmr_e_cannot_use_SELF_outside_a_method); end; @@ -775,15 +769,9 @@ Function TOperand.SetupOldEBP:boolean; Begin SetupOldEBP:=false; if current_procdef.parast.symtablelevel>normal_function_level then - Begin - opr.typ:=OPR_REFERENCE; - opr.ref.offset:=current_procinfo.framepointer_offset; - opr.ref.base:=current_procinfo.framepointer; - opr.ref.options:=ref_parafixup; - SetupOldEBP:=true; - end + SetupOldEBP:=setupvar('parentframe',false) else - Message(asmr_e_cannot_use_OLDEBP_outside_nested_procedure); + Message(asmr_e_cannot_use_OLDEBP_outside_nested_procedure); end; @@ -877,7 +865,7 @@ Begin else message1(asmr_e_local_para_unreachable,s); end; - opr.ref.offset:=tg.direction*(tvarsym(sym).address); + opr.ref.offset:=tvarsym(sym).address; if (current_procdef.localst.symtablelevel=tvarsym(sym).owner.symtablelevel) then begin opr.ref.offsetfixup:=current_procdef.localst.address_fixup; @@ -1574,7 +1562,13 @@ end; end. { $Log$ - Revision 1.59 2003-05-12 17:22:00 jonas + Revision 1.60 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.59 2003/05/12 17:22:00 jonas * fixed (last?) remaining -tvarsym(X).address to tg.direction*tvarsym(X).address... diff --git a/compiler/regvars.pas b/compiler/regvars.pas index 85a2139a12..84eb393144 100644 --- a/compiler/regvars.pas +++ b/compiler/regvars.pas @@ -303,12 +303,7 @@ implementation { possible that it's been modified (JM) } if not(vsym.varspez in [vs_const,vs_var,vs_out]) then begin - reference_reset(hr); - if vsym.owner.symtabletype in [inlinelocalsymtable,localsymtable] then - hr.offset:=tg.direction*vsym.address+vsym.owner.address_fixup - else - hr.offset:=vsym.address+vsym.owner.address_fixup; - hr.base:=current_procinfo.framepointer; + reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address); cg.a_load_reg_ref(asml,def_cgsize(vsym.vartype.def),vsym.reg,hr); end; asml.concat(tai_regalloc.dealloc(rg.makeregsize(reg,OS_INT))); @@ -330,12 +325,7 @@ implementation if not rg.regvar_loaded[reg.enum] then begin asml.concat(tai_regalloc.alloc(reg)); - reference_reset(hr); - if vsym.owner.symtabletype in [inlinelocalsymtable,localsymtable] then - hr.offset:=tg.direction*vsym.address+vsym.owner.address_fixup - else - hr.offset:=vsym.address+vsym.owner.address_fixup; - hr.base:=current_procinfo.framepointer; + reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address); if (vsym.varspez in [vs_var,vs_out]) or ((vsym.varspez=vs_const) and paramanager.push_addr_param(vsym.vartype.def,current_procdef.proccalloption)) then @@ -500,7 +490,13 @@ end. { $Log$ - Revision 1.48 2003-05-12 17:22:00 jonas + Revision 1.49 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.48 2003/05/12 17:22:00 jonas * fixed (last?) remaining -tvarsym(X).address to tg.direction*tvarsym(X).address... diff --git a/compiler/symdef.pas b/compiler/symdef.pas index 0de0131f41..44706c9d8f 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -414,7 +414,6 @@ interface rettype : ttype; parast : tsymtable; para : tlinkedlist; - selfpara : tparaitem; proctypeoption : tproctypeoption; proccalloption : tproccalloption; procoptions : tprocoptions; @@ -3060,7 +3059,6 @@ implementation parast:=tparasymtable.create(level); parast.defowner:=self; para:=TLinkedList.Create; - selfpara:=nil; minparacount:=0; maxparacount:=0; proctypeoption:=potype_none; @@ -3207,7 +3205,6 @@ implementation inherited ppuloaddef(ppufile); parast:=nil; Para:=TLinkedList.Create; - selfpara:=nil; minparacount:=0; maxparacount:=0; ppufile.gettype(rettype); @@ -5764,7 +5761,13 @@ implementation end. { $Log$ - Revision 1.143 2003-05-13 08:13:16 jonas + Revision 1.144 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.143 2003/05/13 08:13:16 jonas * patch from Peter for rtti symbols Revision 1.142 2003/05/11 21:37:03 peter diff --git a/compiler/symsym.pas b/compiler/symsym.pas index f3ac722210..5723ea6a3f 100644 --- a/compiler/symsym.pas +++ b/compiler/symsym.pas @@ -195,6 +195,7 @@ interface procedure set_mangledname(const s:string); function getsize : longint; function getvaluesize : longint; + function adjusted_address : longint; procedure trigger_notifications(what:Tnotification_flag); function register_notification(flags:Tnotification_flags; callback:Tnotification_callback):cardinal; @@ -1707,6 +1708,12 @@ implementation end; + function tvarsym.adjusted_address : longint; + begin + result:=address+owner.address_fixup; + end; + + procedure Tvarsym.trigger_notifications(what:Tnotification_flag); var n:Tnotification; @@ -1803,7 +1810,7 @@ implementation end; stabstring := strpnew('"'+name+':'+st+'",'+ tostr(N_tsym)+',0,'+tostr(fileinfo.line)+','+ - tostr(address+owner.address_fixup)); + tostr(adjusted_address)); {offset to ebp => will not work if the framepointer is esp so some optimizing will make things harder to debug } end @@ -1825,31 +1832,54 @@ implementation tostr(N_LCSYM)+',0,'+tostr(fileinfo.line)+','+mangledname) else stabstring := strpnew('"'+name+':'+st+'",'+ - tostr(N_LSYM)+',0,'+tostr(fileinfo.line)+','+tostr(tg.direction*address+owner.address_fixup)) + tostr(N_LSYM)+',0,'+tostr(fileinfo.line)+','+tostr(adjusted_address)) else stabstring := inherited stabstring; end; procedure tvarsym.concatstabto(asmlist : taasmoutput); - var stab_str : pchar; + var + stab_str : pchar; + c : char; begin if (owner.symtabletype in [parasymtable,inlineparasymtable]) and (copy(name,1,6)='hidden') then exit; - inherited concatstabto(asmlist); - if (owner.symtabletype=parasymtable) and - (reg.enum<>R_NO) then + if (vo_is_self in varoptions) then begin - if reg.enum>lastreg then - internalerror(2003010801); - { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "eip", "ps", "cs", "ss", "ds", "es", "fs", "gs", } - { this is the register order for GDB} - stab_str:=strpnew('"'+name+':r' - +tstoreddef(vartype.def).numberstring+'",'+ - tostr(N_RSYM)+',0,'+ - tostr(fileinfo.line)+','+tostr(stab_regindex[reg.enum])); - asmList.concat(Tai_stabs.Create(stab_str)); - end; + if (po_classmethod in current_procdef.procoptions) or + (po_staticmethod in current_procdef.procoptions) then + begin + asmlist.concat(Tai_stabs.Create(strpnew( + '"pvmt:p'+tstoreddef(pvmttype.def).numberstring+'",'+ + tostr(N_tsym)+',0,0,'+tostr(adjusted_address)))); + end + else + begin + if not(is_class(current_procdef._class)) then + c:='v' + else + c:='p'; + asmlist.concat(Tai_stabs.Create(strpnew( + '"$t:'+c+current_procdef._class.numberstring+'",'+ + tostr(N_tsym)+',0,0,'+tostr(adjusted_address)))); + end; + end + else + if (reg.enum<>R_NO) then + begin + if reg.enum>lastreg then + internalerror(2003010801); + { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "eip", "ps", "cs", "ss", "ds", "es", "fs", "gs", } + { this is the register order for GDB} + stab_str:=strpnew('"'+name+':r' + +tstoreddef(vartype.def).numberstring+'",'+ + tostr(N_RSYM)+',0,'+ + tostr(fileinfo.line)+','+tostr(stab_regindex[reg.enum])); + asmList.concat(Tai_stabs.Create(stab_str)); + end + else + inherited concatstabto(asmlist); end; {$endif GDB} @@ -2558,7 +2588,13 @@ implementation end. { $Log$ - Revision 1.103 2003-05-12 18:13:57 peter + Revision 1.104 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.103 2003/05/12 18:13:57 peter * create rtti label using newasmsymboldata and update binding only when calling tai_symbol.create * tai_symbol.create_global added diff --git a/compiler/symtable.pas b/compiler/symtable.pas index 0a74089c69..bce69311ea 100644 --- a/compiler/symtable.pas +++ b/compiler/symtable.pas @@ -1311,7 +1311,7 @@ implementation l:=tvarsym(sym).getvaluesize; varalign:=size_2_align(l); varalign:=used_align(varalign,aktalignment.localalignmin,aktalignment.localalignmax); - if (tg.direction = 1) then + if (tg.direction>0) then begin { on the powerpc, the local variables are accessed with a positiv offset } tvarsym(sym).address:=align(datasize,varalign); @@ -1319,8 +1319,8 @@ implementation end else begin - tvarsym(sym).address:=align(datasize+l,varalign); - datasize:=tvarsym(sym).address; + datasize:=align(datasize+l,varalign); + tvarsym(sym).address:=-datasize; end; end; end; @@ -2420,7 +2420,13 @@ implementation end. { $Log$ - Revision 1.99 2003-05-13 15:17:13 peter + Revision 1.100 2003-05-15 18:58:53 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.99 2003/05/13 15:17:13 peter * fix crash with hiding function result. The function result is now inserted as last so the symbol that we are going to insert is the result and needs to be renamed instead of the already existing diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas index e49fda19a3..e76c9a44af 100644 --- a/compiler/x86/cgx86.pas +++ b/compiler/x86/cgx86.pas @@ -110,7 +110,7 @@ unit cgx86; { entry/exit code helpers } procedure g_copyvaluepara_openarray(list : taasmoutput;const ref:treference;elesize:integer);override; procedure g_interrupt_stackframe_entry(list : taasmoutput);override; - procedure g_interrupt_stackframe_exit(list : taasmoutput;selfused,accused,acchiused:boolean);override; + procedure g_interrupt_stackframe_exit(list : taasmoutput;accused,acchiused:boolean);override; procedure g_profilecode(list : taasmoutput);override; procedure g_stackpointer_alloc(list : taasmoutput;localsize : longint);override; procedure g_stackframe_entry(list : taasmoutput;localsize : longint);override; @@ -119,7 +119,7 @@ unit cgx86; procedure g_save_standard_registers(list:Taasmoutput;usedinproc:Tsupregset);override; procedure g_restore_standard_registers(list:Taasmoutput;usedinproc:Tsupregset);override; procedure g_save_all_registers(list : taasmoutput);override; - procedure g_restore_all_registers(list : taasmoutput;selfused,accused,acchiused:boolean);override; + procedure g_restore_all_registers(list : taasmoutput;accused,acchiused:boolean);override; procedure g_overflowcheck(list: taasmoutput; const p: tnode);override; @@ -1667,7 +1667,7 @@ unit cgx86; end; - procedure tcgx86.g_interrupt_stackframe_exit(list : taasmoutput;selfused,accused,acchiused:boolean); + procedure tcgx86.g_interrupt_stackframe_exit(list : taasmoutput;accused,acchiused:boolean); var r:Tregister; @@ -1697,16 +1697,6 @@ unit cgx86; r.number:=NR_EDX; list.concat(Taicpu.Op_reg(A_POP,S_L,r)); end; - if selfused then - begin - r.number:=NR_ESP; - list.concat(Taicpu.Op_const_reg(A_ADD,S_L,4,r)) - end - else - begin - r.number:=NR_ESI; - list.concat(Taicpu.Op_reg(A_POP,S_L,r)); - end; r.number:=NR_EDI; list.concat(Taicpu.Op_reg(A_POP,S_L,r)); { .... also the segment registers } @@ -1893,7 +1883,7 @@ unit cgx86; end; - procedure tcgx86.g_restore_all_registers(list : taasmoutput;selfused,accused,acchiused:boolean); + procedure tcgx86.g_restore_all_registers(list : taasmoutput;accused,acchiused:boolean); var href : treference; r,rsp: Tregister; @@ -1901,12 +1891,6 @@ unit cgx86; rsp.enum:=R_INTREGISTER; rsp.number:=NR_ESP; r.enum:=R_INTREGISTER; - if selfused then - begin - reference_reset_base(href,rsp,4); - r.number:=NR_ESI; - list.concat(Taicpu.Op_reg_ref(A_MOV,S_L,r,href)); - end; if acchiused then begin reference_reset_base(href,rsp,20); @@ -1955,7 +1939,13 @@ unit cgx86; end. { $Log$ - Revision 1.44 2003-04-30 20:53:32 florian + Revision 1.45 2003-05-15 18:58:54 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.44 2003/04/30 20:53:32 florian * error when address of an abstract method is taken * fixed some x86-64 problems * merged some more x86-64 and i386 code diff --git a/compiler/x86/radirect.pas b/compiler/x86/radirect.pas index 0b1d4440ad..5fd360b38e 100644 --- a/compiler/x86/radirect.pas +++ b/compiler/x86/radirect.pas @@ -58,6 +58,7 @@ interface function assemble : tnode; var + uhs, retstr,s,hs : string; c : char; ende : boolean; @@ -96,202 +97,242 @@ interface retstr:=upper(tostr(current_procinfo.return_offset)+'('+gas_reg2str[framereg.enum]+')') else retstr:=''; - c:=current_scanner.asmgetchar; - code:=TAAsmoutput.Create; - while not(ende) do - begin - { wrong placement - current_scanner.gettokenpos; } - case c of - 'A'..'Z','a'..'z','_' : begin - current_scanner.gettokenpos; - i:=0; - hs:=''; - while ((ord(c)>=ord('A')) and (ord(c)<=ord('Z'))) - or ((ord(c)>=ord('a')) and (ord(c)<=ord('z'))) - or ((ord(c)>=ord('0')) and (ord(c)<=ord('9'))) - or (c='_') do - begin - inc(i); - hs[i]:=c; - c:=current_scanner.asmgetchar; - end; - hs[0]:=chr(i); - if upper(hs)='END' then - ende:=true - else - begin - if c=':' then - begin - searchsym(upper(hs),srsym,srsymtable); - if srsym<>nil then - if (srsym.typ = labelsym) then - Begin - hs:=tlabelsym(srsym).lab.name; - tlabelsym(srsym).lab.is_set:=true; - end - else - Message(asmr_w_using_defined_as_local); - end - else if upper(hs)='FWAIT' then - FwaitWarning - else - { access to local variables } - if assigned(current_procdef) then - begin - { is the last written character an special } - { char ? } - if (s[length(s)]='%') and - (not paramanager.ret_in_param(current_procdef.rettype.def,current_procdef.proccalloption)) and - ((pos('AX',upper(hs))>0) or - (pos('AL',upper(hs))>0)) then - tvarsym(current_procdef.funcretsym).varstate:=vs_assigned; - if (s[length(s)]<>'%') and - (s[length(s)]<>'$') and - (s[length(s)]<>'.') and - ((s[length(s)]<>'0') or (hs[1]<>'x')) then - begin - if assigned(current_procdef.localst) and - (current_procdef.localst.symtablelevel>=normal_function_level) then - sym:=tsym(current_procdef.localst.search(upper(hs))) - else - sym:=nil; - if assigned(sym) then - begin - if (sym.typ = labelsym) then - Begin - hs:=tlabelsym(sym).lab.name; - end - else if sym.typ=varsym then - begin - {variables set are after a comma } - {like in movl %eax,I } - if pos(',',s) > 0 then - tvarsym(sym).varstate:=vs_used - else - if (pos('MOV',upper(s)) > 0) and (tvarsym(sym).varstate=vs_declared) then - Message1(sym_n_uninitialized_local_variable,hs); - if (vo_is_external in tvarsym(sym).varoptions) then - hs:=tvarsym(sym).mangledname - else - hs:='-'+tostr(tvarsym(sym).address)+ - '('+gas_reg2str[framereg.enum]+')'; - end + c:=current_scanner.asmgetchar; + code:=TAAsmoutput.Create; + while not(ende) do + begin + { wrong placement + current_scanner.gettokenpos; } + case c of + 'A'..'Z','a'..'z','_' : begin + current_scanner.gettokenpos; + i:=0; + hs:=''; + while ((ord(c)>=ord('A')) and (ord(c)<=ord('Z'))) + or ((ord(c)>=ord('a')) and (ord(c)<=ord('z'))) + or ((ord(c)>=ord('0')) and (ord(c)<=ord('9'))) + or (c='_') do + begin + inc(i); + hs[i]:=c; + c:=current_scanner.asmgetchar; + end; + hs[0]:=chr(i); + if upper(hs)='END' then + ende:=true + else + begin + if c=':' then + begin + searchsym(upper(hs),srsym,srsymtable); + if srsym<>nil then + if (srsym.typ = labelsym) then + Begin + hs:=tlabelsym(srsym).lab.name; + tlabelsym(srsym).lab.is_set:=true; + end + else + Message(asmr_w_using_defined_as_local); + end + else if upper(hs)='FWAIT' then + FwaitWarning + else + { access to local variables } + if assigned(current_procdef) then + begin + { is the last written character an special } + { char ? } + if (s[length(s)]='%') and + (not paramanager.ret_in_param(current_procdef.rettype.def,current_procdef.proccalloption)) and + ((pos('AX',upper(hs))>0) or + (pos('AL',upper(hs))>0)) then + tvarsym(current_procdef.funcretsym).varstate:=vs_assigned; + if (s[length(s)]<>'%') and + (s[length(s)]<>'$') and + (s[length(s)]<>'.') and + ((s[length(s)]<>'0') or (hs[1]<>'x')) then + begin + if assigned(current_procdef.localst) and + (current_procdef.localst.symtablelevel>=normal_function_level) then + sym:=tsym(current_procdef.localst.search(upper(hs))) + else + sym:=nil; + if assigned(sym) then + begin + if (sym.typ = labelsym) then + Begin + hs:=tlabelsym(sym).lab.name; + end + else if sym.typ=varsym then + begin + {variables set are after a comma } + {like in movl %eax,I } + if pos(',',s) > 0 then + tvarsym(sym).varstate:=vs_used else - { call to local function } - if (sym.typ=procsym) and ((pos('CALL',upper(s))>0) or - (pos('LEA',upper(s))>0)) then - begin - hs:=tprocsym(sym).first_procdef.mangledname; - end; - end - else - begin - if assigned(current_procdef.parast) then - sym:=tsym(current_procdef.parast.search(upper(hs))) + if (pos('MOV',upper(s)) > 0) and (tvarsym(sym).varstate=vs_declared) then + Message1(sym_n_uninitialized_local_variable,hs); + if (vo_is_external in tvarsym(sym).varoptions) then + hs:=tvarsym(sym).mangledname else - sym:=nil; - if assigned(sym) then - begin - if sym.typ=varsym then - begin - l:=tvarsym(sym).address; - { set offset } - inc(l,current_procdef.parast.address_fixup); - hs:=tostr(l)+'('+gas_reg2str[framereg.enum]+')'; - if pos(',',s) > 0 then - tvarsym(sym).varstate:=vs_used; - end; - end - { I added that but it creates a problem in line.ppi - because there is a local label wbuffer and - a static variable WBUFFER ... - what would you decide, florian ?} - else - - begin - searchsym(upper(hs),sym,srsymtable); - if assigned(sym) and (sym.owner.symtabletype in [globalsymtable,staticsymtable]) then - begin - case sym.typ of - varsym : - begin - Message2(asmr_h_direct_global_to_mangled,hs,tvarsym(sym).mangledname); - hs:=tvarsym(sym).mangledname; - inc(tvarsym(sym).refs); - end; - typedconstsym : - begin - Message2(asmr_h_direct_global_to_mangled,hs,ttypedconstsym(sym).mangledname); - hs:=ttypedconstsym(sym).mangledname; - end; - procsym : - begin - { procs can be called or the address can be loaded } - if ((pos('CALL',upper(s))>0) or (pos('LEA',upper(s))>0)) then - begin - if tprocsym(sym).procdef_count>1 then - Message1(asmr_w_direct_global_is_overloaded_func,hs); - Message2(asmr_h_direct_global_to_mangled,hs,tprocsym(sym).first_procdef.mangledname); - hs:=tprocsym(sym).first_procdef.mangledname; - end; - end; - else - Message(asmr_e_wrong_sym_type); - end; - end - else if upper(hs)='__SELF' then - begin - if assigned(current_procdef._class) then - hs:=tostr(current_procinfo.selfpointer_offset)+ - '('+gas_reg2str[framereg.enum]+')' - else - Message(asmr_e_cannot_use_SELF_outside_a_method); - end - else if upper(hs)='__RESULT' then - begin - if (not is_void(current_procdef.rettype.def)) then - hs:=retstr - else - Message(asmr_e_void_function); - end - else if upper(hs)='__OLDEBP' then - begin - { complicate to check there } - { we do it: } - if current_procdef.parast.symtablelevel>normal_function_level then - hs:=tostr(current_procinfo.framepointer_offset)+ - '('+gas_reg2str[framereg.enum]+')' - else - Message(asmr_e_cannot_use_OLDEBP_outside_nested_procedure); - end; + hs:='-'+tostr(tvarsym(sym).address)+ + '('+gas_reg2str[framereg.enum]+')'; + end + else + { call to local function } + if (sym.typ=procsym) and ((pos('CALL',upper(s))>0) or + (pos('LEA',upper(s))>0)) then + begin + hs:=tprocsym(sym).first_procdef.mangledname; end; - end; - end; - end; - s:=s+hs; - end; - end; - '{',';',#10,#13 : begin - if pos(retstr,s) > 0 then - tvarsym(current_procdef.funcretsym).varstate:=vs_assigned; - writeasmline; - c:=current_scanner.asmgetchar; - end; - #26 : Message(scan_f_end_of_file); - else - begin - current_scanner.gettokenpos; - inc(byte(s[0])); - s[length(s)]:=c; - c:=current_scanner.asmgetchar; - end; - end; + end + else + begin + if assigned(current_procdef.parast) then + sym:=tsym(current_procdef.parast.search(upper(hs))) + else + sym:=nil; + if assigned(sym) then + begin + if sym.typ=varsym then + begin + l:=tvarsym(sym).address; + { set offset } + inc(l,current_procdef.parast.address_fixup); + hs:=tostr(l)+'('+gas_reg2str[framereg.enum]+')'; + if pos(',',s) > 0 then + tvarsym(sym).varstate:=vs_used; + end; + end + { I added that but it creates a problem in line.ppi + because there is a local label wbuffer and + a static variable WBUFFER ... + what would you decide, florian ?} + else + + begin + uhs:=upper(hs); + if (uhs='__SELF') then + begin + if assigned(current_procdef._class) then + uhs:='self' + else + begin + Message(asmr_e_cannot_use_SELF_outside_a_method); + uhs:=''; + end; + end + else + if (uhs='__OLDEBP') then + begin + if current_procdef.parast.symtablelevel>normal_function_level then + uhs:='parentframe' + else + begin + Message(asmr_e_cannot_use_OLDEBP_outside_nested_procedure); + uhs:=''; + end; + end + else + if uhs='__RESULT' then + begin + if (not is_void(current_procdef.rettype.def)) then + uhs:='result' + else + begin + Message(asmr_e_void_function); + uhs:=''; + end; + end; + + if uhs<>'' then + searchsym(uhs,sym,srsymtable) + else + sym:=nil; + if assigned(sym) then + begin + case sym.owner.symtabletype of + globalsymtable, + staticsymtable : + begin + case sym.typ of + varsym : + begin + Message2(asmr_h_direct_global_to_mangled,hs,tvarsym(sym).mangledname); + hs:=tvarsym(sym).mangledname; + inc(tvarsym(sym).refs); + end; + typedconstsym : + begin + Message2(asmr_h_direct_global_to_mangled,hs,ttypedconstsym(sym).mangledname); + hs:=ttypedconstsym(sym).mangledname; + end; + procsym : + begin + { procs can be called or the address can be loaded } + if ((pos('CALL',upper(s))>0) or (pos('LEA',upper(s))>0)) then + begin + if tprocsym(sym).procdef_count>1 then + Message1(asmr_w_direct_global_is_overloaded_func,hs); + Message2(asmr_h_direct_global_to_mangled,hs,tprocsym(sym).first_procdef.mangledname); + hs:=tprocsym(sym).first_procdef.mangledname; + end; + end; + else + Message(asmr_e_wrong_sym_type); + end; + end; + parasymtable, + localsymtable : + begin + case sym.typ of + varsym : + begin + hs:=tostr(tvarsym(sym).adjusted_address)+ + '('+gas_reg2str[framereg.enum]+')'; + inc(tvarsym(sym).refs); + end; + typedconstsym : + begin + Message2(asmr_h_direct_global_to_mangled,hs,ttypedconstsym(sym).mangledname); + hs:=ttypedconstsym(sym).mangledname; + end; + else + Message(asmr_e_wrong_sym_type); + end; + end; + end; + end + end; + end; + end; + end; + s:=s+hs; + end; + end; + '{',';',#10,#13 : + begin + if pos(retstr,s) > 0 then + tvarsym(current_procdef.funcretsym).varstate:=vs_assigned; + writeasmline; + c:=current_scanner.asmgetchar; + end; + #26 : + Message(scan_f_end_of_file); + else + begin + current_scanner.gettokenpos; + inc(byte(s[0])); + s[length(s)]:=c; + c:=current_scanner.asmgetchar; + end; + end; end; writeasmline; assemble:=casmnode.create(code); end; + {***************************************************************************** Initialize *****************************************************************************} @@ -320,7 +361,13 @@ initialization end. { $Log$ - Revision 1.3 2003-05-13 19:15:28 peter + Revision 1.4 2003-05-15 18:58:54 peter + * removed selfpointer_offset, vmtpointer_offset + * tvarsym.adjusted_address + * address in localsymtable is now in the real direction + * removed some obsolete globals + + Revision 1.3 2003/05/13 19:15:28 peter * removed radirect Revision 1.2 2003/05/01 07:59:43 florian