diff --git a/compiler/aasmtai.pas b/compiler/aasmtai.pas index cb2fa78208..bd1c3624e8 100644 --- a/compiler/aasmtai.pas +++ b/compiler/aasmtai.pas @@ -209,6 +209,7 @@ interface constructor Create; constructor ppuload(t:taitype;ppufile:tcompilerppufile);virtual; procedure ppuwrite(ppufile:tcompilerppufile);virtual; + procedure buildderef;virtual; procedure derefimpl;virtual; end; @@ -434,6 +435,7 @@ interface protected procedure ppuloadoper(ppufile:tcompilerppufile;var o:toper);virtual;abstract; procedure ppuwriteoper(ppufile:tcompilerppufile;const o:toper);virtual;abstract; + procedure ppubuildderefoper(var o:toper);virtual;abstract; procedure ppuderefoper(var o:toper);virtual;abstract; public { Condition flags for instruction } @@ -456,6 +458,7 @@ interface function getcopy:TLinkedListItem;override; constructor ppuload(t:taitype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; procedure SetCondition(const c:TAsmCond); procedure allocate_oper(opers:longint); @@ -613,6 +616,11 @@ implementation end; + procedure tai.buildderef; + begin + end; + + procedure tai.derefimpl; begin end; @@ -2006,6 +2014,15 @@ implementation end; + procedure taicpu_abstract.buildderef; + var + i : integer; + begin + for i:=0 to ops-1 do + ppubuildderefoper(oper[i]^); + end; + + procedure taicpu_abstract.derefimpl; var i : integer; @@ -2122,7 +2139,10 @@ implementation end. { $Log$ - Revision 1.45 2003-10-21 15:15:35 peter + Revision 1.46 2003-10-22 20:39:59 peter + * write derefdata in a separate ppu entry + + Revision 1.45 2003/10/21 15:15:35 peter * taicpu_abstract.oper[] changed to pointers Revision 1.44 2003/10/17 14:38:32 peter diff --git a/compiler/cclasses.pas b/compiler/cclasses.pas index 3a0f4afd78..f3df9f4e62 100644 --- a/compiler/cclasses.pas +++ b/compiler/cclasses.pas @@ -266,7 +266,8 @@ interface pos, used : integer; Next : pdynamicblock; - data : array[0..high(integer)-20] of byte; + { can't use sizeof(integer) because it crashes gdb } + data : array[0..1024*1024] of byte; end; tdynamicarray = class @@ -1746,9 +1747,9 @@ end; { not found ? then increase blocks } if not assigned(FPosnblock) then begin - { the current FLastblock is now also fully used } - FLastblock^.used:=blocksize; repeat + { the current FLastblock is now also fully used } + FLastblock^.used:=blocksize; grow; FPosnblock:=FLastblock; until FPosnblock^.pos+blocksize>=i; @@ -1884,7 +1885,10 @@ end; end. { $Log$ - Revision 1.26 2003-10-11 16:06:42 florian + Revision 1.27 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.26 2003/10/11 16:06:42 florian * fixed some MMX<->SSE * started to fix ppc, needs an overhaul + stabs info improve for spilling, not sure if it works correctly/completly diff --git a/compiler/fmodule.pas b/compiler/fmodule.pas index 8acb9aae23..b721aa6a81 100644 --- a/compiler/fmodule.pas +++ b/compiler/fmodule.pas @@ -97,6 +97,7 @@ interface islibrary : boolean; { if it is a library (win32 dll) } map : punitmap; { mapping of all used units } mapsize : longint; { number of units in the map } + derefdata : tdynamicarray; globalsymtable, { pointer to the global symtable of this unit } localsymtable : tsymtable;{ pointer to the local symtable of this unit } scanner : pointer; { scanner object used } @@ -381,6 +382,7 @@ implementation scanner:=nil; map:=nil; mapsize:=0; + derefdata:=TDynamicArray.Create(1024); globalsymtable:=nil; localsymtable:=nil; loaded_from:=LoadedFrom; @@ -515,6 +517,8 @@ implementation localsymtable.free; localsymtable:=nil; end; + derefdata.free; + derefdata:=TDynamicArray.Create(1024); if assigned(map) then begin freemem(map); @@ -683,7 +687,10 @@ implementation end. { $Log$ - Revision 1.39 2003-10-22 15:22:33 peter + Revision 1.40 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.39 2003/10/22 15:22:33 peter * fixed unitsym-globalsymtable relation so the uses of a unit is counted correctly diff --git a/compiler/fppu.pas b/compiler/fppu.pas index 6049f08be5..762da6e34c 100644 --- a/compiler/fppu.pas +++ b/compiler/fppu.pas @@ -69,12 +69,14 @@ interface procedure writesourcefiles; procedure writeusedunit(intf:boolean); procedure writelinkcontainer(var p:tlinkcontainer;id:byte;strippath:boolean); + procedure writederefdata; procedure putasmsymbol_in_idx(s:tnamedindexitem;arg:pointer); procedure writeasmsymbols; procedure readusedmacros; procedure readsourcefiles; procedure readloadunit; procedure readlinkcontainer(var p:tlinkcontainer); + procedure readderefdata; procedure readasmsymbols; end; @@ -479,6 +481,27 @@ uses end; + procedure tppumodule.writederefdata; + var + len,hlen : longint; + buf : array[0..1023] of byte; + begin + len:=derefdata.size; + derefdata.seek(0); + while (len>0) do + begin + if len>1024 then + hlen:=1024 + else + hlen:=len; + derefdata.read(buf,hlen); + ppufile.putdata(buf,hlen); + dec(len,hlen); + end; + ppufile.writeentry(ibderefdata); + end; + + procedure tppumodule.putasmsymbol_in_idx(s:tnamedindexitem;arg:pointer); begin if tasmsymbol(s).ppuidx<>-1 then @@ -714,6 +737,25 @@ uses end; + procedure tppumodule.readderefdata; + var + len,hlen : longint; + buf : array[0..1023] of byte; + begin + len:=ppufile.entrysize; + while (len>0) do + begin + if len>1024 then + hlen:=1024 + else + hlen:=len; + ppufile.getdata(buf,hlen); + derefdata.write(buf,hlen); + dec(len,hlen); + end; + end; + + procedure tppumodule.readasmsymbols; var labelnr, @@ -794,6 +836,8 @@ uses readlinkcontainer(LinkotherStaticLibs); iblinkothersharedlibs : readlinkcontainer(LinkotherSharedLibs); + ibderefdata : + readderefdata; ibendinterface : break; else @@ -914,6 +958,13 @@ uses writelinkcontainer(linkothersharedlibs,iblinkothersharedlibs,true); ppufile.do_crc:=true; + { generate and write deref data } + tstoredsymtable(globalsymtable).buildderef; + if ((flags and uf_local_browser)<>0) and + assigned(localsymtable) then + tstoredsymtable(localsymtable).buildderef; + writederefdata; + ppufile.writeentry(ibendinterface); { write the symtable entries } @@ -1415,7 +1466,10 @@ if modulename^='SYMSYM' then end. { $Log$ - Revision 1.41 2003-10-22 17:38:25 peter + Revision 1.42 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.41 2003/10/22 17:38:25 peter * write implementation units in implementation part of the ppu so it doesn't confuse the unit loading diff --git a/compiler/nbas.pas b/compiler/nbas.pas index 648c271b86..0cb635a0c5 100644 --- a/compiler/nbas.pas +++ b/compiler/nbas.pas @@ -60,6 +60,7 @@ interface destructor destroy;override; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -543,6 +544,20 @@ implementation end; + procedure tasmnode.buildderef; + var + hp : tai; + begin + inherited buildderef; + hp:=tai(p_asm.first); + while assigned(hp) do + begin + hp.buildderef; + hp:=tai(hp.next); + end; + end; + + procedure tasmnode.derefimpl; var hp : tai; @@ -830,7 +845,10 @@ begin end. { $Log$ - Revision 1.67 2003-10-21 18:15:16 peter + Revision 1.68 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.67 2003/10/21 18:15:16 peter * fixed check for $X- result usage Revision 1.66 2003/10/19 01:34:30 florian diff --git a/compiler/ncal.pas b/compiler/ncal.pas index c207cd48b6..e3f59b1c8d 100644 --- a/compiler/ncal.pas +++ b/compiler/ncal.pas @@ -114,6 +114,7 @@ interface destructor destroy;override; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; { Goes through all symbols in a class and subclasses and calls @@ -154,7 +155,6 @@ interface destructor destroy;override; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; - procedure derefimpl;override; function getcopy : tnode;override; procedure insertintolist(l : tnodelist);override; procedure get_paratype; @@ -522,12 +522,6 @@ type end; - procedure tcallparanode.derefimpl; - begin - inherited derefimpl; - end; - - function tcallparanode.getcopy : tnode; var @@ -971,8 +965,8 @@ type procedure tcallnode.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwrite(ppufile); - ppufile.putderef(symtableprocentry,symtableprocentryderef); - ppufile.putderef(procdefinition,procdefinitionderef); + ppufile.putderef(symtableprocentryderef); + ppufile.putderef(procdefinitionderef); ppufile.putbyte(byte(restypeset)); ppuwritenode(ppufile,methodpointer); ppuwritenode(ppufile,_funcretnode); @@ -980,6 +974,20 @@ type end; + procedure tcallnode.buildderef; + begin + inherited buildderef; + symtableprocentryderef.build(symtableprocentry); + procdefinitionderef.build(procdefinition); + if assigned(methodpointer) then + methodpointer.buildderef; + if assigned(_funcretnode) then + _funcretnode.buildderef; + if assigned(inlinecode) then + inlinecode.buildderef; + end; + + procedure tcallnode.derefimpl; begin inherited derefimpl; @@ -2576,7 +2584,10 @@ begin end. { $Log$ - Revision 1.198 2003-10-21 18:17:02 peter + Revision 1.199 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.198 2003/10/21 18:17:02 peter * only search for overloaded constructors in classes Revision 1.197 2003/10/21 15:14:55 peter diff --git a/compiler/ncnv.pas b/compiler/ncnv.pas index cce18d40ca..e181d5cbf6 100644 --- a/compiler/ncnv.pas +++ b/compiler/ncnv.pas @@ -44,6 +44,7 @@ interface constructor create_explicit(node : tnode;const t : ttype); constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -498,6 +499,13 @@ implementation end; + procedure ttypeconvnode.buildderef; + begin + inherited buildderef; + totype.buildderef; + end; + + procedure ttypeconvnode.derefimpl; begin inherited derefimpl; @@ -2103,7 +2111,10 @@ begin end. { $Log$ - Revision 1.124 2003-10-21 18:16:13 peter + Revision 1.125 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.124 2003/10/21 18:16:13 peter * IncompatibleTypes() added that will include unit names when the typenames are the same diff --git a/compiler/ncon.pas b/compiler/ncon.pas index 6ccd6e2530..2b5a851d09 100644 --- a/compiler/ncon.pas +++ b/compiler/ncon.pas @@ -40,6 +40,7 @@ interface constructor create(v : bestreal;const t:ttype);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -60,6 +61,7 @@ interface constructor create(v : tconstexprint;const t:ttype; _rangecheck : boolean);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -75,6 +77,7 @@ interface constructor create(v : TConstPtrUInt;const t:ttype);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -93,6 +96,7 @@ interface constructor createwstr(w : pcompilerwidestring);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; destructor destroy;override; function getcopy : tnode;override; @@ -111,6 +115,7 @@ interface destructor destroy;override; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -365,6 +370,13 @@ implementation end; + procedure trealconstnode.buildderef; + begin + inherited buildderef; + restype.buildderef; + end; + + procedure trealconstnode.derefimpl; begin inherited derefimpl; @@ -451,6 +463,13 @@ implementation end; + procedure tordconstnode.buildderef; + begin + inherited buildderef; + restype.buildderef; + end; + + procedure tordconstnode.derefimpl; begin inherited derefimpl; @@ -529,6 +548,13 @@ implementation end; + procedure tpointerconstnode.buildderef; + begin + inherited buildderef; + restype.buildderef; + end; + + procedure tpointerconstnode.derefimpl; begin inherited derefimpl; @@ -655,6 +681,12 @@ implementation end; + procedure tstringconstnode.buildderef; + begin + inherited buildderef; + end; + + procedure tstringconstnode.derefimpl; begin inherited derefimpl; @@ -773,6 +805,13 @@ implementation end; + procedure tsetconstnode.buildderef; + begin + inherited buildderef; + restype.buildderef; + end; + + procedure tsetconstnode.derefimpl; begin inherited derefimpl; @@ -911,7 +950,10 @@ begin end. { $Log$ - Revision 1.54 2003-10-07 18:17:44 peter + Revision 1.55 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.54 2003/10/07 18:17:44 peter * Give message that constant expr is expected when a none constant is passed to get_ordinal_value diff --git a/compiler/nflw.pas b/compiler/nflw.pas index 0b1c7fbcb2..142703cf8c 100644 --- a/compiler/nflw.pas +++ b/compiler/nflw.pas @@ -60,6 +60,7 @@ interface function getcopy : tnode;override; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; procedure insertintolist(l : tnodelist);override; procedure printnodetree(var t:text);override; @@ -124,6 +125,7 @@ interface { constructor createintern(g:tinterngotolabel);} constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function det_resulttype:tnode;override; @@ -141,6 +143,7 @@ interface constructor create(p : tlabelsym;l:tnode);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function det_resulttype:tnode;override; @@ -154,6 +157,7 @@ interface constructor create(l,taddr,tframe:tnode);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; procedure insertintolist(l : tnodelist);override; @@ -283,6 +287,16 @@ implementation end; + procedure tloopnode.buildderef; + begin + inherited buildderef; + if assigned(t1) then + t1.buildderef; + if assigned(t2) then + t2.buildderef; + end; + + procedure tloopnode.derefimpl; begin inherited derefimpl; @@ -960,11 +974,18 @@ implementation procedure tgotonode.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwrite(ppufile); - ppufile.putderef(labsym,labsymderef); + ppufile.putderef(labsymderef); ppufile.putbyte(exceptionblock); end; + procedure tgotonode.buildderef; + begin + inherited buildderef; + labsymderef.build(labsym); + end; + + procedure tgotonode.derefimpl; begin inherited derefimpl; @@ -1049,12 +1070,19 @@ implementation procedure tlabelnode.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwrite(ppufile); - ppufile.putderef(labsym,labsymderef); + ppufile.putderef(labsymderef); ppufile.putasmsymbol(labelnr); ppufile.putbyte(exceptionblock); end; + procedure tlabelnode.buildderef; + begin + inherited buildderef; + labsymderef.build(labsym); + end; + + procedure tlabelnode.derefimpl; begin inherited derefimpl; @@ -1132,6 +1160,14 @@ implementation end; + procedure traisenode.buildderef; + begin + inherited buildderef; + if assigned(frametree) then + frametree.buildderef; + end; + + procedure traisenode.derefimpl; begin inherited derefimpl; @@ -1431,7 +1467,10 @@ begin end. { $Log$ - Revision 1.83 2003-10-09 21:31:37 daniel + Revision 1.84 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.83 2003/10/09 21:31:37 daniel * Register allocator splitted, ans abstract now Revision 1.82 2003/10/08 19:19:45 peter diff --git a/compiler/nld.pas b/compiler/nld.pas index 6b98d1d49b..b21fb410d9 100644 --- a/compiler/nld.pas +++ b/compiler/nld.pas @@ -44,6 +44,7 @@ interface constructor create_procvar(v : tsym;d:tprocdef;st : tsymtable);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; procedure set_mp(p:tnode); function getcopy : tnode;override; @@ -97,6 +98,7 @@ interface constructor create(t : ttype);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function pass_1 : tnode;override; function det_resulttype:tnode;override; @@ -112,6 +114,7 @@ interface constructor create(def:tstoreddef;rt:trttitype);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -319,8 +322,16 @@ implementation procedure tloadnode.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwrite(ppufile); - ppufile.putderef(symtableentry,symtableentryderef); - ppufile.putderef(procdef,procdefderef); + ppufile.putderef(symtableentryderef); + ppufile.putderef(procdefderef); + end; + + + procedure tloadnode.buildderef; + begin + inherited buildderef; + symtableentryderef.build(symtableentry); + procdefderef.build(procdef); end; @@ -1122,6 +1133,13 @@ implementation end; + procedure ttypenode.buildderef; + begin + inherited buildderef; + restype.buildderef; + end; + + procedure ttypenode.derefimpl; begin inherited derefimpl; @@ -1183,11 +1201,18 @@ implementation procedure trttinode.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwrite(ppufile); - ppufile.putderef(rttidef,rttidefderef); + ppufile.putderef(rttidefderef); ppufile.putbyte(byte(rttitype)); end; + procedure trttinode.buildderef; + begin + inherited buildderef; + rttidefderef.build(rttidef); + end; + + procedure trttinode.derefimpl; begin inherited derefimpl; @@ -1247,7 +1272,10 @@ begin end. { $Log$ - Revision 1.113 2003-10-17 14:38:32 peter + Revision 1.114 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.113 2003/10/17 14:38:32 peter * 64k registers supported * fixed some memory leaks diff --git a/compiler/nmem.pas b/compiler/nmem.pas index 2f78f37432..6496cadfde 100644 --- a/compiler/nmem.pas +++ b/compiler/nmem.pas @@ -55,6 +55,7 @@ interface constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; procedure mark_write;override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -76,6 +77,7 @@ interface constructor create(varsym : tsym;l : tnode);virtual; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; function pass_1 : tnode;override; @@ -227,7 +229,7 @@ implementation procedure taddrnode.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwrite(ppufile); - ppufile.putderef(getprocvardef,getprocvardefderef); + ppufile.putderef(getprocvardefderef); end; procedure Taddrnode.mark_write; @@ -237,6 +239,13 @@ implementation left.mark_write; end; + procedure taddrnode.buildderef; + begin + inherited buildderef; + getprocvardefderef.build(getprocvardef); + end; + + procedure taddrnode.derefimpl; begin inherited derefimpl; @@ -517,7 +526,14 @@ implementation procedure tsubscriptnode.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwrite(ppufile); - ppufile.putderef(vs,vsderef); + ppufile.putderef(vsderef); + end; + + + procedure tsubscriptnode.buildderef; + begin + inherited buildderef; + vsderef.build(vs); end; @@ -904,7 +920,10 @@ begin end. { $Log$ - Revision 1.66 2003-10-21 18:16:13 peter + Revision 1.67 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.66 2003/10/21 18:16:13 peter * IncompatibleTypes() added that will include unit names when the typenames are the same diff --git a/compiler/node.pas b/compiler/node.pas index 5e756ec490..b8ac772f1b 100644 --- a/compiler/node.pas +++ b/compiler/node.pas @@ -296,6 +296,7 @@ interface constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);virtual; destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);virtual; + procedure buildderef;virtual; procedure derefimpl;virtual; { toggles the flag } @@ -356,6 +357,7 @@ interface constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; procedure concattolist(l : tlinkedlist);override; function ischild(p : tnode) : boolean;override; @@ -373,6 +375,7 @@ interface constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; procedure concattolist(l : tlinkedlist);override; function ischild(p : tnode) : boolean;override; @@ -556,6 +559,12 @@ implementation end; + procedure tnode.buildderef; + begin + resulttype.buildderef; + end; + + procedure tnode.derefimpl; begin resulttype.resolve; @@ -735,6 +744,14 @@ implementation end; + procedure tunarynode.buildderef; + begin + inherited buildderef; + if assigned(left) then + left.buildderef; + end; + + procedure tunarynode.derefimpl; begin inherited derefimpl; @@ -832,6 +849,14 @@ implementation end; + procedure tbinarynode.buildderef; + begin + inherited buildderef; + if assigned(right) then + right.buildderef; + end; + + procedure tbinarynode.derefimpl; begin inherited derefimpl; @@ -969,7 +994,10 @@ implementation end. { $Log$ - Revision 1.71 2003-10-18 15:41:26 peter + Revision 1.72 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.71 2003/10/18 15:41:26 peter * made worklists dynamic in size Revision 1.70 2003/10/17 01:22:08 florian diff --git a/compiler/nset.pas b/compiler/nset.pas index 866009eff6..23e1dd4030 100644 --- a/compiler/nset.pas +++ b/compiler/nset.pas @@ -79,6 +79,7 @@ interface destructor destroy;override; constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure derefimpl;override; function getcopy : tnode;override; procedure insertintolist(l : tnodelist);override; @@ -508,7 +509,6 @@ implementation end; - {***************************************************************************** TCASENODE *****************************************************************************} @@ -546,6 +546,15 @@ implementation end; + procedure tcasenode.buildderef; + begin + inherited buildderef; + if assigned(elseblock) then + elseblock.buildderef; + {ppubuildderefcaserecord(nodes);} + end; + + procedure tcasenode.derefimpl; begin inherited derefimpl; @@ -686,7 +695,10 @@ begin end. { $Log$ - Revision 1.47 2003-10-09 21:31:37 daniel + Revision 1.48 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.47 2003/10/09 21:31:37 daniel * Register allocator splitted, ans abstract now Revision 1.46 2003/10/08 19:19:45 peter diff --git a/compiler/ppu.pas b/compiler/ppu.pas index dbfb328236..6328f0dd72 100644 --- a/compiler/ppu.pas +++ b/compiler/ppu.pas @@ -41,7 +41,7 @@ type {$endif Test_Double_checksum} const - CurrentPPUVersion=37; + CurrentPPUVersion=38; { buffer sizes } maxentrysize = 1024; @@ -77,6 +77,7 @@ const ibendsymtablebrowser = 14; ibbeginsymtablebrowser = 15; ibusedmacros = 16; + ibderefdata = 17; {syms} ibtypesym = 20; ibprocsym = 21; @@ -210,6 +211,7 @@ type procedure skipdata(len:integer); function readentry:byte; function EndOfEntry:boolean; + function entrysize:longint; procedure getdatabuf(var b;len:integer;var res:integer); procedure getdata(var b;len:integer); function getbyte:byte; @@ -521,6 +523,12 @@ begin end; +function tppufile.entrysize:longint; +begin + entrysize:=entry.size; +end; + + procedure tppufile.getdatabuf(var b;len:integer;var res:integer); begin if entryidx+len>entry.size then @@ -985,7 +993,10 @@ end; end. { $Log$ - Revision 1.42 2003-09-23 17:56:05 peter + Revision 1.43 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.42 2003/09/23 17:56:05 peter * locals and paras are allocated in the code generation * tvarsym.localloc contains the location of para/local when generating code for the current procedure diff --git a/compiler/symdef.pas b/compiler/symdef.pas index de45b548f9..731af2137a 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -76,6 +76,7 @@ interface function getcopy : tstoreddef;virtual; procedure ppuwritedef(ppufile:tcompilerppufile); procedure ppuwrite(ppufile:tcompilerppufile);virtual;abstract; + procedure buildderef;override; procedure deref;override; procedure derefimpl;override; function size:longint;override; @@ -126,6 +127,7 @@ interface constructor createtyped(const tt : ttype); constructor ppuload(ppufile:tcompilerppufile); procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; function gettypename:string;override; function getmangledparaname:string;override; @@ -193,6 +195,7 @@ interface constructor createfar(const tt : ttype); constructor ppuload(ppufile:tcompilerppufile); procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; function gettypename:string;override; { debug } @@ -227,6 +230,7 @@ interface constructor ppuload(ppufile:tcompilerppufile); destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; function size:longint;override; function alignment : longint;override; @@ -279,6 +283,7 @@ interface destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; function gettypename:string;override; + procedure buildderef;override; procedure deref;override; function getparentdef:tdef;override; function size : longint;override; @@ -322,6 +327,7 @@ interface function searchintf(def: tdef): longint; procedure addintf(def: tdef); + procedure buildderef; procedure deref; { add interface reference loaded from ppu } procedure addintf_deref(const d:tderef); @@ -376,6 +382,7 @@ interface function stabstring : pchar;override; procedure concatstabto(asmlist : taasmoutput);override; {$endif GDB} + procedure buildderef;override; procedure deref;override; function size : longint;override; function alignment : longint;override; @@ -440,6 +447,7 @@ interface constructor ppuload(ppufile:tcompilerppufile); destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; procedure releasemem; function concatpara(afterpara:tparaitem;const tt:ttype;sym : tsym;defval:tsym;vhidden:boolean):tparaitem; @@ -460,6 +468,7 @@ interface constructor create(level:byte); constructor ppuload(ppufile:tcompilerppufile); procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; function getsymtable(t:tgetsymtable):tsymtable;override; function size : longint;override; @@ -534,6 +543,7 @@ interface constructor ppuload(ppufile:tcompilerppufile); destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; procedure derefimpl;override; function getsymtable(t:tgetsymtable):tsymtable;override; @@ -608,6 +618,7 @@ interface constructor ppuload(ppufile:tcompilerppufile); destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; function gettypename:string;override; function is_publishable : boolean;override; @@ -634,6 +645,7 @@ interface constructor ppuload(ppufile:tcompilerppufile); destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; function gettypename:string;override; function is_publishable : boolean;override; @@ -960,12 +972,12 @@ implementation procedure tstoreddef.ppuwritedef(ppufile:tcompilerppufile); begin ppufile.putword(indexnr); - ppufile.putderef(typesym,typesymderef); + ppufile.putderef(typesymderef); ppufile.putsmallset(defoptions); if df_has_rttitable in defoptions then - ppufile.putderef(rttitablesym,rttitablesymderef); + ppufile.putderef(rttitablesymderef); if df_has_inittable in defoptions then - ppufile.putderef(inittablesym,inittablesymderef); + ppufile.putderef(inittablesymderef); {$ifdef GDB} if globalnb = 0 then begin @@ -981,6 +993,14 @@ implementation end; + procedure tstoreddef.buildderef; + begin + typesymderef.build(typesym); + rttitablesymderef.build(rttitablesym); + inittablesymderef.build(inittablesym); + end; + + procedure tstoreddef.deref; begin typesym:=ttypesym(typesymderef.resolve); @@ -1560,6 +1580,13 @@ implementation end; + procedure tenumdef.buildderef; + begin + inherited buildderef; + basedefderef.build(basedef); + end; + + procedure tenumdef.deref; begin inherited deref; @@ -1576,7 +1603,7 @@ implementation procedure tenumdef.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwritedef(ppufile); - ppufile.putderef(basedef,basedefderef); + ppufile.putderef(basedefderef); ppufile.putlongint(min); ppufile.putlongint(max); ppufile.putlongint(savesize); @@ -2067,6 +2094,14 @@ implementation end; + procedure tfiledef.buildderef; + begin + inherited buildderef; + if filetyp=ft_typed then + typedfiletype.buildderef; + end; + + procedure tfiledef.deref; begin inherited deref; @@ -2284,6 +2319,13 @@ implementation end; + procedure tpointerdef.buildderef; + begin + inherited buildderef; + pointertype.buildderef; + end; + + procedure tpointerdef.deref; begin inherited deref; @@ -2523,6 +2565,13 @@ implementation {$endif GDB} + procedure tsetdef.buildderef; + begin + inherited buildderef; + elementtype.buildderef; + end; + + procedure tsetdef.deref; begin inherited deref; @@ -2652,6 +2701,14 @@ implementation end; + procedure tarraydef.buildderef; + begin + inherited buildderef; + _elementtype.buildderef; + rangetype.buildderef; + end; + + procedure tarraydef.deref; begin inherited deref; @@ -2966,6 +3023,19 @@ implementation end; + procedure trecorddef.buildderef; + var + oldrecsyms : tsymtable; + begin + inherited buildderef; + oldrecsyms:=aktrecordsymtable; + aktrecordsymtable:=symtable; + { now build the definitions } + tstoredsymtable(symtable).buildderef; + aktrecordsymtable:=oldrecsyms; + end; + + procedure trecorddef.deref; var oldrecsyms : tsymtable; @@ -3223,6 +3293,26 @@ implementation end; + procedure tabstractprocdef.buildderef; + var + hp : TParaItem; + begin + inherited buildderef; + rettype.buildderef; + { parast } + tparasymtable(parast).buildderef; + { paraitems } + hp:=TParaItem(Para.first); + while assigned(hp) do + begin + hp.paratype.buildderef; + hp.defaultvaluederef.build(hp.defaultvalue); + hp.parasymderef.build(hp.parasym); + hp:=TParaItem(hp.next); + end; + end; + + procedure tabstractprocdef.deref; var hp : TParaItem; @@ -3321,8 +3411,8 @@ implementation begin ppufile.putbyte(byte(hp.paratyp)); ppufile.puttype(hp.paratype); - ppufile.putderef(hp.defaultvalue,hp.defaultvaluederef); - ppufile.putderef(hp.parasym,hp.parasymderef); + ppufile.putderef(hp.defaultvaluederef); + ppufile.putderef(hp.parasymderef); ppufile.putbyte(byte(hp.is_hidden)); hp:=TParaItem(hp.next); end; @@ -3611,8 +3701,8 @@ implementation ppufile.putstring(mangledname); ppufile.putword(overloadnumber); ppufile.putword(extnumber); - ppufile.putderef(_class,_classderef); - ppufile.putderef(procsym,procsymderef); + ppufile.putderef(_classderef); + ppufile.putderef(procsymderef); ppufile.putposinfo(fileinfo); ppufile.putsmallset(symoptions); @@ -3623,7 +3713,7 @@ implementation { inline stuff } if proccalloption=pocall_inline then begin - ppufile.putderef(funcretsym,funcretsymderef); + ppufile.putderef(funcretsymderef); ppuwritenode(ppufile,code); end; ppufile.do_crc:=oldintfcrc; @@ -3825,9 +3915,10 @@ implementation oldlocalsymtable:=aktlocalsymtable; aktparasymtable:=parast; aktlocalsymtable:=localst; - { write address of this symbol } - ppufile.putderef(self,d); - { write refs } + { write address of this symbol } + d.build(self); + ppufile.putderef(d); + { write refs } if assigned(lastwritten) then ref:=lastwritten else @@ -3991,6 +4082,38 @@ implementation {$endif GDB} + procedure tprocdef.buildderef; + var + oldparasymtable, + oldlocalsymtable : tsymtable; + begin + oldparasymtable:=aktparasymtable; + oldlocalsymtable:=aktlocalsymtable; + aktparasymtable:=parast; + aktlocalsymtable:=localst; + + inherited buildderef; + _classderef.build(_class); + { procsym that originaly defined this definition, should be in the + same symtable } + procsymderef.build(procsym); + + { locals } + if assigned(localst) then + begin + tlocalsymtable(localst).buildderef; + funcretsymderef.build(funcretsym); + end; + + { inline tree } + if (proccalloption=pocall_inline) then + code.buildderef; + + aktparasymtable:=oldparasymtable; + aktlocalsymtable:=oldlocalsymtable; + end; + + procedure tprocdef.deref; var oldparasymtable, @@ -4214,6 +4337,23 @@ implementation end; + procedure tprocvardef.buildderef; + var + oldparasymtable, + oldlocalsymtable : tsymtable; + begin + oldparasymtable:=aktparasymtable; + oldlocalsymtable:=aktlocalsymtable; + aktparasymtable:=parast; + aktlocalsymtable:=nil; + + inherited buildderef; + + aktparasymtable:=oldparasymtable; + aktlocalsymtable:=oldlocalsymtable; + end; + + procedure tprocvardef.deref; var oldparasymtable, @@ -4532,7 +4672,7 @@ implementation ppufile.putlongint(size); ppufile.putlongint(vmt_offset); ppufile.putstring(objrealname^); - ppufile.putderef(childof,childofderef); + ppufile.putderef(childofderef); ppufile.putsmallset(objectoptions); if objecttype in [odt_interfacecom,odt_interfacecorba] then begin @@ -4547,7 +4687,7 @@ implementation ppufile.putlongint(implintfcount); for i:=1 to implintfcount do begin - ppufile.putderef(implementedinterfaces.interfaces(i),implementedinterfaces.interfacesderef(i)); + ppufile.putderef(implementedinterfaces.interfacesderef(i)); ppufile.putlongint(implementedinterfaces.ioffsets(i)^); end; end; @@ -4566,6 +4706,21 @@ implementation end; + procedure tobjectdef.buildderef; + var + oldrecsyms : tsymtable; + begin + inherited buildderef; + childofderef.build(childof); + oldrecsyms:=aktrecordsymtable; + aktrecordsymtable:=symtable; + tstoredsymtable(symtable).buildderef; + aktrecordsymtable:=oldrecsyms; + if objecttype in [odt_class,odt_interfacecorba] then + implementedinterfaces.buildderef; + end; + + procedure tobjectdef.deref; var oldrecsyms : tsymtable; @@ -5528,6 +5683,17 @@ implementation searchintf:=-1; end; + + procedure timplementedinterfaces.buildderef; + var + i: longint; + begin + for i:=1 to count do + with timplintfentry(finterfaces.search(i)) do + intfderef.build(intf); + end; + + procedure timplementedinterfaces.deref; var i: longint; @@ -5884,7 +6050,10 @@ implementation end. { $Log$ - Revision 1.182 2003-10-21 18:14:49 peter + Revision 1.183 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.182 2003/10/21 18:14:49 peter * fix counting of parameters when loading ppu Revision 1.181 2003/10/17 15:08:34 peter diff --git a/compiler/symppu.pas b/compiler/symppu.pas index 939253599b..3a827198a9 100644 --- a/compiler/symppu.pas +++ b/compiler/symppu.pas @@ -48,7 +48,7 @@ interface procedure putexprint(v:tconstexprint); procedure PutPtrUInt(v:TConstPtrUInt); procedure putposinfo(const p:tfileposinfo); - procedure putderef(s:tsymtableentry;const d:tderef); + procedure putderef(const d:tderef); procedure putsymlist(p:tsymlist); procedure puttype(const t:ttype); procedure putasmsymbol(s:tasmsymbol); @@ -166,8 +166,7 @@ implementation procedure tcompilerppufile.getderef(var d:tderef); begin - d.len:=getbyte; - getdata(d.data,d.len); + d.dataidx:=getlongint; end; @@ -332,11 +331,9 @@ implementation end; - procedure tcompilerppufile.putderef(s:tsymtableentry;const d:tderef); + procedure tcompilerppufile.putderef(const d:tderef); begin - d.build(s); - putbyte(d.len); - putdata(d.data,d.len); + putlongint(d.dataidx); end; @@ -344,7 +341,7 @@ implementation var hp : psymlistitem; begin - putderef(p.procdef,p.procdefderef); + putderef(p.procdefderef); hp:=p.firstsym; while assigned(hp) do begin @@ -353,7 +350,7 @@ implementation sl_call, sl_load, sl_subscript : - putderef(hp^.sym,hp^.symderef); + putderef(hp^.symderef); sl_vec : putlongint(hp^.value); else @@ -367,22 +364,7 @@ implementation procedure tcompilerppufile.puttype(const t:ttype); begin - { Write symbol references when the symbol is a redefine, - but don't write symbol references for the current unit - and for the system unit } - if assigned(t.sym) and - ( - (t.sym<>t.def.typesym) or - ((t.sym.owner.unitid<>0) and - (t.sym.owner.unitid<>1)) - ) then - begin - putderef(t.sym,t.deref); - end - else - begin - putderef(t.def,t.deref); - end; + putderef(t.deref); end; @@ -405,7 +387,10 @@ implementation end. { $Log$ - Revision 1.20 2003-10-07 16:06:30 peter + Revision 1.21 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.20 2003/10/07 16:06:30 peter * tsymlist.def renamed to tsymlist.procdef * tsymlist.procdef is now only used to store the procdef diff --git a/compiler/symsym.pas b/compiler/symsym.pas index 6af0beabbd..be91e29a73 100644 --- a/compiler/symsym.pas +++ b/compiler/symsym.pas @@ -63,6 +63,7 @@ interface destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);virtual;abstract; procedure writesym(ppufile:tcompilerppufile); + procedure buildderef;override; procedure deref;override; {$ifdef GDB} function stabstring : pchar;virtual; @@ -127,6 +128,7 @@ interface procedure check_forward; procedure unchain_overload; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; procedure addprocdef(p:tprocdef); procedure addprocdef_deref(const d:tderef); @@ -160,6 +162,7 @@ interface constructor create(const n : string;const tt : ttype); constructor ppuload(ppufile:tcompilerppufile); procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; function gettypedef:tdef;override; procedure load_references(ppufile:tcompilerppufile;locals:boolean);override; @@ -186,6 +189,7 @@ interface constructor ppuload(ppufile:tcompilerppufile); destructor destroy;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; procedure generate_mangledname;override; procedure set_mangledname(const s:string); @@ -223,6 +227,7 @@ interface function getsize : longint; procedure ppuwrite(ppufile:tcompilerppufile);override; function gettypedef:tdef;override; + procedure buildderef;override; procedure deref;override; procedure dooverride(overriden:tpropertysym); {$ifdef GDB} @@ -239,6 +244,7 @@ interface constructor create(const n : string;const tt : ttype); constructor create_ref(const n : string;const tt : ttype;sym:tstoredsym); constructor ppuload(ppufile:tcompilerppufile); + procedure buildderef;override; procedure deref;override; function mangledname : string; procedure ppuwrite(ppufile:tcompilerppufile);override; @@ -256,6 +262,7 @@ interface destructor destroy;override; procedure generate_mangledname;override; procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; function getsize:longint; {$ifdef GDB} @@ -284,6 +291,7 @@ interface constructor ppuload(ppufile:tcompilerppufile); destructor destroy;override; function mangledname : string; + procedure buildderef;override; procedure deref;override; procedure ppuwrite(ppufile:tcompilerppufile);override; {$ifdef GDB} @@ -300,6 +308,7 @@ interface constructor create(const n : string;def : tenumdef;v : longint); constructor ppuload(ppufile:tcompilerppufile); procedure ppuwrite(ppufile:tcompilerppufile);override; + procedure buildderef;override; procedure deref;override; procedure order; {$ifdef GDB} @@ -435,6 +444,11 @@ implementation end; + procedure tstoredsym.buildderef; + begin + end; + + procedure tstoredsym.deref; begin end; @@ -489,7 +503,8 @@ implementation { write address to this symbol } if not symref_written then begin - ppufile.putderef(self,d); + d.build(self); + ppufile.putderef(d); symref_written:=true; end; ppufile.putposinfo(ref.posinfo); @@ -795,7 +810,7 @@ implementation to this procsym and are in the global symtable } if (p^.def.procsym=self) and (p^.def.owner.symtabletype in [globalsymtable,objectsymtable]) then - ppufile.putderef(p^.def,p^.defderef); + ppufile.putderef(p^.defderef); p:=p^.next; end; ppufile.writeentry(ibprocsym); @@ -835,6 +850,19 @@ implementation end; + procedure tprocsym.buildderef; + var + p : pprocdeflist; + begin + p:=pdlistfirst; + while assigned(p) do + begin + p^.defderef.build(p^.def); + p:=p^.next; + end; + end; + + procedure tprocsym.deref; var p : pprocdeflist; @@ -1355,6 +1383,23 @@ implementation end; + procedure tpropertysym.buildderef; + begin + if (ppo_is_override in propoptions) then + begin + propoverridenderef.build(propoverriden); + end + else + begin + proptype.buildderef; + indextype.buildderef; + readaccess.buildderef; + writeaccess.buildderef; + storedaccess.buildderef; + end; + end; + + procedure tpropertysym.deref; begin if (ppo_is_override in propoptions) then @@ -1384,7 +1429,7 @@ implementation inherited writesym(ppufile); ppufile.putsmallset(propoptions); if (ppo_is_override in propoptions) then - ppufile.putderef(propoverriden,propoverridenderef) + ppufile.putderef(propoverridenderef) else begin ppufile.puttype(proptype); @@ -1502,6 +1547,13 @@ implementation end; + procedure tabsolutesym.buildderef; + begin + { inheritance of varsym.deref ! } + vartype.buildderef; + end; + + procedure tabsolutesym.deref; var srsym : tsym; @@ -1616,6 +1668,12 @@ implementation end; + procedure tvarsym.buildderef; + begin + vartype.buildderef; + end; + + procedure tvarsym.deref; begin vartype.resolve; @@ -1948,6 +2006,12 @@ implementation end; + procedure ttypedconstsym.buildderef; + begin + typedconsttype.buildderef; + end; + + procedure ttypedconstsym.deref; begin typedconsttype.resolve; @@ -2143,6 +2207,13 @@ implementation end; + procedure tconstsym.buildderef; + begin + if consttyp in [constord,constpointer,constset] then + consttype.buildderef; + end; + + procedure tconstsym.deref; begin if consttyp in [constord,constpointer,constset] then @@ -2266,6 +2337,12 @@ implementation end; + procedure tenumsym.buildderef; + begin + definitionderef.build(definition); + end; + + procedure tenumsym.deref; begin definition:=tenumdef(definitionderef.resolve); @@ -2303,7 +2380,7 @@ implementation procedure tenumsym.ppuwrite(ppufile:tcompilerppufile); begin inherited writesym(ppufile); - ppufile.putderef(definition,definitionderef); + ppufile.putderef(definitionderef); ppufile.putlongint(value); ppufile.writeentry(ibenumsym); end; @@ -2355,6 +2432,12 @@ implementation end; + procedure ttypesym.buildderef; + begin + restype.buildderef; + end; + + procedure ttypesym.deref; begin restype.resolve; @@ -2391,7 +2474,8 @@ implementation because we need it for the symtable } if (restype.def.deftype in [recorddef,objectdef]) then begin - ppufile.putderef(self,d); + d.build(self); + ppufile.putderef(d); ppufile.writeentry(ibsymref); end; end; @@ -2605,7 +2689,10 @@ implementation end. { $Log$ - Revision 1.129 2003-10-22 15:22:33 peter + Revision 1.130 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.129 2003/10/22 15:22:33 peter * fixed unitsym-globalsymtable relation so the uses of a unit is counted correctly diff --git a/compiler/symtable.pas b/compiler/symtable.pas index 07b3660297..6bc24bc4e3 100644 --- a/compiler/symtable.pas +++ b/compiler/symtable.pas @@ -70,6 +70,7 @@ interface procedure ppuwrite(ppufile:tcompilerppufile);virtual; procedure load_references(ppufile:tcompilerppufile;locals:boolean);virtual; procedure write_references(ppufile:tcompilerppufile;locals:boolean);virtual; + procedure buildderef;virtual; procedure deref;virtual; procedure derefimpl;virtual; procedure insert(sym : tsymentry);override; @@ -471,6 +472,28 @@ implementation end; + procedure tstoredsymtable.buildderef; + var + hp : tdef; + hs : tsym; + begin + { interface definitions } + hp:=tdef(defindex.first); + while assigned(hp) do + begin + hp.buildderef; + hp:=tdef(hp.indexnext); + end; + { interface symbols } + hs:=tsym(symindex.first); + while assigned(hs) do + begin + hs.buildderef; + hs:=tsym(hs.indexnext); + end; + end; + + procedure tstoredsymtable.deref; var hp : tdef; @@ -2259,7 +2282,10 @@ implementation end. { $Log$ - Revision 1.118 2003-10-22 15:22:33 peter + Revision 1.119 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.118 2003/10/22 15:22:33 peter * fixed unitsym-globalsymtable relation so the uses of a unit is counted correctly diff --git a/compiler/symtype.pas b/compiler/symtype.pas index ea8898e8f7..8d259241a6 100644 --- a/compiler/symtype.pas +++ b/compiler/symtype.pas @@ -70,6 +70,7 @@ interface typesym : tsym; { which type the definition was generated this def } defoptions : tdefoptions; constructor create; + procedure buildderef;virtual;abstract; procedure deref;virtual;abstract; procedure derefimpl;virtual;abstract; function typename:string; @@ -96,6 +97,7 @@ interface constructor create(const n : string); destructor destroy;override; function realname:string; + procedure buildderef;virtual;abstract; procedure deref;virtual;abstract; function gettypedef:tdef;virtual; end; @@ -104,16 +106,12 @@ interface TDeref ************************************************} - tderefdata = array[0..31] of byte; - tderef = object - len : longint; - data : tderefdata; + dataidx : longint; procedure reset; - procedure setdata(l:longint;var d); procedure build(s:tsymtableentry); - function resolve:tsymtableentry; - end; + function resolve:tsymtableentry; + end; {************************************************ TType @@ -127,6 +125,7 @@ interface procedure setdef(p:tdef); procedure setsym(p:tsym); procedure resolve; + procedure buildderef; end; {************************************************ @@ -156,6 +155,7 @@ interface procedure clear; function getcopy:tsymlist; procedure resolve; + procedure buildderef; end; @@ -360,6 +360,23 @@ implementation end; + procedure ttype.buildderef; + begin + { Write symbol references when the symbol is a redefine, + but don't write symbol references for the current unit + and for the system unit } + if assigned(sym) and + ( + (sym<>def.typesym) or + ((sym.owner.unitid<>0) and + (sym.owner.unitid<>1)) + ) then + deref.build(sym) + else + deref.build(def); + end; + + {**************************************************************************** TSymList ****************************************************************************} @@ -495,6 +512,29 @@ implementation end; + procedure tsymlist.buildderef; + var + hp : psymlistitem; + begin + procdefderef.build(procdef); + hp:=firstsym; + while assigned(hp) do + begin + case hp^.sltype of + sl_call, + sl_load, + sl_subscript : + hp^.symderef.build(hp^.sym); + sl_vec : + ; + else + internalerror(200110205); + end; + hp:=hp^.next; + end; + end; + + {**************************************************************************** Tderef ****************************************************************************} @@ -502,20 +542,14 @@ implementation procedure tderef.reset; begin - len:=0; - end; - - - procedure tderef.setdata(l:longint;var d); - begin - len:=l; - if l>sizeof(tderefdata) then - internalerror(200306068); - move(d,data,len); + dataidx:=-1; end; procedure tderef.build(s:tsymtableentry); + var + len : byte; + data : array[0..255] of byte; function is_child(currdef,ownerdef:tdef):boolean; begin @@ -588,7 +622,7 @@ implementation else internalerror(200306065); end; - if len+3>sizeof(tderefdata) then + if len>252 then internalerror(200306062); end; @@ -649,7 +683,8 @@ implementation end; begin - len:=0; + { skip length byte } + len:=1; if assigned(s) then begin { Static symtable of current unit ? } @@ -712,6 +747,11 @@ implementation data[len]:=0; inc(len); end; + { store data length in first byte } + data[0]:=len-1; + { store index and write to derefdata } + dataidx:=current_module.derefdata.size; + current_module.derefdata.write(data,len); end; @@ -723,11 +763,23 @@ implementation st : tsymtable; idx : word; i : longint; + len : byte; + data : array[0..255] of byte; begin result:=nil; { not initialized } - if len=0 then + if dataidx=-1 then internalerror(200306067); + { read data } + current_module.derefdata.seek(dataidx); + if current_module.derefdata.read(len,1)<>1 then + internalerror(200310221); + if len>0 then + begin + if current_module.derefdata.read(data,len)<>len then + internalerror(200310222); + end; + { process data } st:=nil; i:=0; while (iderefdatalen) then + begin + writeln('!! Error: Deref idx ',idx,' > ',derefdatalen); + exit; + end; + write('(',idx,') '); + pdata:=@derefdata[idx]; i:=0; - n:=ppufile.getbyte; + n:=pdata[i]; + inc(i); if n<1 then - begin - writeln('!! Error, deref len < 1'); - exit; - end; + begin + writeln('!! Error: Deref len < 1'); + exit; + end; while (i R_NO) then - for r := firstsavefpureg to lastsavefpureg do - if r in regs then - begin - if not first then - write(', ') - else - first := false; - write(std_reg2str[r]) - end; - if (firstsavemmreg <> R_NO) then - for r := firstsavemmreg to lastsavemmreg do - if r in regs then - begin - if not first then - write(', ') - else - first := false; - write(std_reg2str[r]) - end; - writeln; -end; - procedure readdefinitions(start_read : boolean); type tsettype = (normset,smallset,varset); @@ -1218,13 +1186,15 @@ type odt_interfacecorba, odt_cppclass ); + tvarianttype = ( + vt_normalvariant,vt_olevariant + ); var b : byte; oldread_member : boolean; totaldefs,l,j, defcnt : longint; calloption : tproccalloption; - regs : set of char; begin defcnt:=0; with ppufile do @@ -1303,23 +1273,6 @@ begin begin readcommondef('Procedure definition'); calloption:=read_abstract_proc_def; - write (space,' Used IntRegs : '); - getnormalset(regs); - writeln(''); - write (space,' Used OtherRegs : '); - getnormalset(regs); - writeln(''); -{$ifdef OLDRA} - case ttargetcpu(header.cpu) of - i386 : - getusedregisters_i386 - else - begin - getnormalset(regs); - writeln(''); - end; - end; -{$endif OLDRA} if (getbyte<>0) then writeln(space,' Mangled name : ',getstring); writeln(space,' Overload Number : ',getword); @@ -1500,10 +1453,20 @@ begin end; end; - ibvariantdef : begin readcommondef('Variant definition'); + write (space,' Varianttype : '); + b:=getbyte; + case tvarianttype(b) of + vt_normalvariant : + writeln('Normal'); + vt_olevariant : + writeln('OLE'); + else + writeln('!! Warning: Invalid varianttype ',b); + end; + end; iberror : @@ -1534,9 +1497,7 @@ end; procedure readinterface; var b : byte; - sourcenumber, - unitnumber : word; - ucrc,uintfcrc : longint; + sourcenumber : longint; begin with ppufile do begin @@ -1574,22 +1535,9 @@ begin writeln; end; end; + ibloadunit : - begin - unitnumber:=1; - while not EndOfEntry do - begin - write('Uses unit: ',getstring,' (Number: ',unitnumber,')'); - ucrc:=getlongint; - uintfcrc:=getlongint; - write(' (Crc: ',hexstr(ucrc,8),', IntfcCrc: ',hexstr(uintfcrc,8),')'); - if getbyte<>0 then - writeln(' (interface)') - else - writeln(' (implementation)'); - inc(unitnumber); - end; - end; + ReadLoadUnit; iblinkunitofiles : ReadLinkContainer('Link unit object file: '); @@ -1609,6 +1557,9 @@ begin iblinkothersharedlibs : ReadLinkContainer('Link other shared lib: '); + ibderefdata : + ReadDerefData; + iberror : begin Writeln('Error in PPU'); @@ -1643,6 +1594,9 @@ begin ibasmsymbols : ReadAsmSymbols; + ibloadunit : + ReadLoadUnit; + iberror : begin Writeln('Error in PPU'); @@ -1945,7 +1899,10 @@ begin end. { $Log$ - Revision 1.46 2003-07-02 22:18:04 peter + Revision 1.47 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.46 2003/07/02 22:18:04 peter * paraloc splitted in callerparaloc,calleeparaloc * sparc calling convention updates diff --git a/compiler/x86/aasmcpu.pas b/compiler/x86/aasmcpu.pas index f1606b78f6..b0f8ee23c5 100644 --- a/compiler/x86/aasmcpu.pas +++ b/compiler/x86/aasmcpu.pas @@ -210,6 +210,7 @@ interface protected procedure ppuloadoper(ppufile:tcompilerppufile;var o:toper);override; procedure ppuwriteoper(ppufile:tcompilerppufile;const o:toper);override; + procedure ppubuildderefoper(var o:toper);override; procedure ppuderefoper(var o:toper);override; private { next fields are filled in pass1, so pass2 is faster } @@ -799,13 +800,22 @@ implementation end; top_local : begin - ppufile.putderef(tvarsym(o.localsym),o.localsymderef); + ppufile.putderef(o.localsymderef); ppufile.putlongint(longint(o.localsymofs)); end; end; end; + procedure taicpu.ppubuildderefoper(var o:toper); + begin + case o.typ of + top_local : + o.localsymderef.build(tvarsym(o.localsym)); + end; + end; + + procedure taicpu.ppuderefoper(var o:toper); begin case o.typ of @@ -2318,7 +2328,10 @@ implementation end. { $Log$ - Revision 1.33 2003-10-21 15:15:36 peter + Revision 1.34 2003-10-22 20:40:00 peter + * write derefdata in a separate ppu entry + + Revision 1.33 2003/10/21 15:15:36 peter * taicpu_abstract.oper[] changed to pointers Revision 1.32 2003/10/17 14:38:32 peter