diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas index 7d58625f3d..c3f93913c8 100644 --- a/compiler/ncgutil.pas +++ b/compiler/ncgutil.pas @@ -119,17 +119,11 @@ implementation {$ifdef GDB} gdb, {$endif GDB} - ncon, + pass_1,pass_2, + ncon,nld,nutils, tgobj,cgutils,cgobj; - const - { Please leave this here, this module should NOT use - exprasmlist, the lists are always passed as arguments. - Declaring it as string here results in an error when compiling (PFV) } - exprasmlist = 'error'; - - {***************************************************************************** Misc Helpers *****************************************************************************} @@ -764,10 +758,9 @@ implementation { generates the code for initialisation of local data } procedure initialize_data(p : tnamedindexitem;arg:pointer); var - href : treference; - list:TAAsmoutput; + oldexprasmlist : TAAsmoutput; + hp : tnode; begin - list:=taasmoutput(arg); if (tsym(p).typ=varsym) and (tvarsym(p).refs>0) and assigned(tvarsym(p).vartype.def) and @@ -776,18 +769,13 @@ implementation begin if (cs_implicit_exceptions in aktmoduleswitches) then include(current_procinfo.flags,pi_needs_implicit_finally); - if tvarsym(p).owner.symtabletype=localsymtable then - begin - case tvarsym(p).localloc.loc of - LOC_REFERENCE : - reference_reset_base(href,tvarsym(p).localloc.reference.index,tvarsym(p).localloc.reference.offset); - else - internalerror(2003091810); - end; - end - else - reference_reset_symbol(href,objectlibrary.newasmsymbol(tvarsym(p).mangledname,AB_EXTERNAL,AT_DATA),0); - cg.g_initialize(list,tvarsym(p).vartype.def,href,false); + oldexprasmlist:=exprasmlist; + exprasmlist:=taasmoutput(arg); + hp:=initialize_data_node(cloadnode.create(tsym(p),tsym(p).owner)); + firstpass(hp); + secondpass(hp); + hp.free; + exprasmlist:=oldexprasmlist; end; end; @@ -795,10 +783,11 @@ implementation { generates the code for finalisation of local data } procedure finalize_data(p : tnamedindexitem;arg:pointer); var - href : treference; - list:TAAsmoutput; + oldexprasmlist : TAAsmoutput; + hp : tnode; + dofinalize : boolean; begin - list:=taasmoutput(arg); + dofinalize:=false; case tsym(p).typ of varsym : begin @@ -807,31 +796,25 @@ implementation assigned(tvarsym(p).vartype.def) and not(is_class(tvarsym(p).vartype.def)) and tvarsym(p).vartype.def.needs_inittable then - begin - if tvarsym(p).owner.symtabletype=localsymtable then - begin - case tvarsym(p).localloc.loc of - LOC_REFERENCE : - reference_reset_base(href,tvarsym(p).localloc.reference.index,tvarsym(p).localloc.reference.offset); - else - internalerror(2003091811); - end; - end - else - reference_reset_symbol(href,objectlibrary.newasmsymbol(tvarsym(p).mangledname,AB_EXTERNAL,AT_DATA),0); - cg.g_finalize(list,tvarsym(p).vartype.def,href,false); - end; + dofinalize:=true; end; typedconstsym : begin if ttypedconstsym(p).is_writable and ttypedconstsym(p).typedconsttype.def.needs_inittable then - begin - reference_reset_symbol(href,objectlibrary.newasmsymbol(ttypedconstsym(p).mangledname,AB_EXTERNAL,AT_DATA),0); - cg.g_finalize(list,ttypedconstsym(p).typedconsttype.def,href,false); - end; + dofinalize:=true; end; end; + if dofinalize then + begin + oldexprasmlist:=exprasmlist; + exprasmlist:=taasmoutput(arg); + hp:=finalize_data_node(cloadnode.create(tsym(p),tsym(p).owner)); + firstpass(hp); + secondpass(hp); + hp.free; + exprasmlist:=oldexprasmlist; + end; end; @@ -2141,7 +2124,11 @@ implementation end. { $Log$ - Revision 1.195 2004-03-02 00:36:33 olle + Revision 1.196 2004-03-03 22:02:52 peter + * use loadnode and finalize_data_node for init/final code to support + threadvars correctly + + Revision 1.195 2004/03/02 00:36:33 olle * big transformation of Tai_[const_]Symbol.Create[data]name* Revision 1.194 2004/02/27 10:21:05 florian