* write derefdata in a separate ppu entry

This commit is contained in:
peter 2003-10-22 20:39:59 +00:00
parent 28c96ab8e2
commit 6878c55c80
21 changed files with 829 additions and 233 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 (i<len) do
@ -862,7 +914,10 @@ finalization
end.
{
$Log$
Revision 1.30 2003-10-22 15:22:33 peter
Revision 1.31 2003-10-22 20:40:00 peter
* write derefdata in a separate ppu entry
Revision 1.30 2003/10/22 15:22:33 peter
* fixed unitsym-globalsymtable relation so the uses of a unit
is counted correctly

View File

@ -30,7 +30,7 @@ uses
const
Version = 'Version 1.10';
Title = 'PPU-Analyser';
Copyright = 'Copyright (c) 1998-2002 by the Free Pascal Development Team';
Copyright = 'Copyright (c) 1998-2003 by the Free Pascal Development Team';
{ verbosity }
v_none = $0;
@ -59,8 +59,11 @@ var
ppufile : tppufile;
space : string;
read_member : boolean;
unitnumber,
unitindex : longint;
verbose : longint;
derefdata : pbyte;
derefdatalen : longint;
{****************************************************************************
Helper Routines
@ -344,6 +347,35 @@ begin
end;
procedure ReadLoadUnit;
var
ucrc,uintfcrc : longint;
begin
while not ppufile.EndOfEntry do
begin
inc(unitnumber);
write('Uses unit: ',ppufile.getstring,' (Number: ',unitnumber,')');
ucrc:=ppufile.getlongint;
uintfcrc:=ppufile.getlongint;
write(' (Crc: ',hexstr(ucrc,8),', IntfcCrc: ',hexstr(uintfcrc,8),')');
end;
end;
Procedure ReadDerefdata;
begin
derefdatalen:=ppufile.entrysize;
if derefdatalen=0 then
begin
writeln('!! Error: derefdatalen=0');
exit;
end;
Writeln('Derefdata length: ',derefdatalen);
derefdata:=allocmem(derefdatalen);
ppufile.getdata(derefdata^,derefdatalen);
end;
Procedure ReadRef;
begin
if (verbose and v_browser)=0 then
@ -454,40 +486,50 @@ var
b : tdereftype;
first : boolean;
idx : word;
typ,
i,n : byte;
s : string;
pdata : pbyte;
begin
if not assigned(derefdata) then
exit;
first:=true;
idx:=ppufile.getlongint;
if (idx>derefdatalen) 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<n) do
begin
if not first then
write(', ')
else
first:=false;
b:=tdereftype(ppufile.getbyte);
b:=tdereftype(pdata[i]);
inc(i);
case b of
deref_nil :
write('Nil');
deref_def :
begin
idx:=ppufile.getbyte shl 8;
idx:=idx or ppufile.getbyte;
idx:=pdata[i] shl 8;
idx:=idx or pdata[i+1];
inc(i,2);
write('Definition ',idx);
end;
deref_sym :
begin
idx:=ppufile.getbyte shl 8;
idx:=idx or ppufile.getbyte;
idx:=pdata[i] shl 8;
idx:=idx or pdata[i+1];
inc(i,2);
write('Symbol ',idx);
end;
@ -503,8 +545,8 @@ begin
write('AktPara');
deref_unit :
begin
idx:=ppufile.getbyte shl 8;
idx:=idx or ppufile.getbyte;
idx:=pdata[i] shl 8;
idx:=idx or pdata[i+1];
inc(i,2);
write('Unit ',idx);
end;
@ -1127,80 +1169,6 @@ end;
Read defintions Part
****************************************************************************}
procedure getusedregisters_i386;
type
tregister = (R_NO,
R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
R_AL,R_CL,R_DL,R_BL,R_AH,R_CH,R_BH,R_DH,
R_CS,R_DS,R_ES,R_SS,R_FS,R_GS,
R_ST,R_ST0,R_ST1,R_ST2,R_ST3,R_ST4,R_ST5,R_ST6,R_ST7,
R_DR0,R_DR1,R_DR2,R_DR3,R_DR6,R_DR7,
R_CR0,R_CR2,R_CR3,R_CR4,
R_TR3,R_TR4,R_TR5,R_TR6,R_TR7,
R_MM0,R_MM1,R_MM2,R_MM3,R_MM4,R_MM5,R_MM6,R_MM7,
R_XMM0,R_XMM1,R_XMM2,R_XMM3,R_XMM4,R_XMM5,R_XMM6,R_XMM7
);
tregisterset = set of tregister;
reg2strtable = array[tregister] of string[6];
const
std_reg2str : reg2strtable = ('',
'eax','ecx','edx','ebx','esp','ebp','esi','edi',
'ax','cx','dx','bx','sp','bp','si','di',
'al','cl','dl','bl','ah','ch','bh','dh',
'cs','ds','es','ss','fs','gs',
'st','st(0)','st(1)','st(2)','st(3)','st(4)','st(5)','st(6)','st(7)',
'dr0','dr1','dr2','dr3','dr6','dr7',
'cr0','cr2','cr3','cr4',
'tr3','tr4','tr5','tr6','tr7',
'mm0','mm1','mm2','mm3','mm4','mm5','mm6','mm7',
'xmm0','xmm1','xmm2','xmm3','xmm4','xmm5','xmm6','xmm7'
);
firstsaveintreg = R_EAX;
lastsaveintreg = R_EBX;
firstsavefpureg = R_NO;
lastsavefpureg = R_NO;
firstsavemmreg = R_MM0;
lastsavemmreg = R_MM7;
var
regs: tregisterset;
r: tregister;
first: boolean;
begin
first := true;
ppufile.getnormalset(regs);
for r := firstsaveintreg to lastsaveintreg do
if r in regs then
begin
if not first then
write(', ')
else
first := false;
write(std_reg2str[r])
end;
if (firstsavefpureg <> 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('<not yet implemented>');
write (space,' Used OtherRegs : ');
getnormalset(regs);
writeln('<not yet implemented>');
{$ifdef OLDRA}
case ttargetcpu(header.cpu) of
i386 :
getusedregisters_i386
else
begin
getnormalset(regs);
writeln('<not yet implemented>');
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

View File

@ -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