+ getpointerdef() function that returns a pointerdef for the passed def.

Multiple calls to getpointerdef() for the same def in a single module
    return the same pointerdef

git-svn-id: branches/jvmbackend@18644 -
This commit is contained in:
Jonas Maebe 2011-08-20 08:20:51 +00:00
parent 9d4162d840
commit 466f6751c8
9 changed files with 40 additions and 10 deletions

View File

@ -143,6 +143,7 @@ interface
checkforwarddefs,
deflist,
symlist : TFPObjectList;
ptrdefs : THashSet; { list of pointerdefs created in this module so we can reuse them (not saved/restored) }
wpoinfo : tunitwpoinfobase; { whole program optimization-related information that is generated during the current run for this unit }
globalsymtable, { pointer to the global symtable of this unit }
localsymtable : TSymtable;{ pointer to the local symtable of this unit }
@ -525,6 +526,7 @@ implementation
derefdataintflen:=0;
deflist:=TFPObjectList.Create(false);
symlist:=TFPObjectList.Create(false);
ptrdefs:=THashSet.Create(64,true,false);
wpoinfo:=nil;
checkforwarddefs:=TFPObjectList.Create(false);
extendeddefs := TFPHashObjectList.Create(true);
@ -640,6 +642,7 @@ implementation
derefdata.free;
deflist.free;
symlist.free;
ptrdefs.free;
wpoinfo.free;
checkforwarddefs.free;
globalsymtable.free;
@ -699,6 +702,8 @@ implementation
deflist:=TFPObjectList.Create(false);
symlist.free;
symlist:=TFPObjectList.Create(false);
ptrdefs.free;
ptrdefs:=THashSet.Create(64,true,false);
wpoinfo.free;
wpoinfo:=nil;
checkforwarddefs.free;

View File

@ -1752,7 +1752,7 @@ implementation
begin
if is_zero_based_array(rd) then
begin
resultdef:=tpointerdef.create(tarraydef(rd).elementdef);
resultdef:=getpointerdef(tarraydef(rd).elementdef);
inserttypeconv(right,resultdef);
end
else
@ -1782,7 +1782,7 @@ implementation
begin
if is_zero_based_array(ld) then
begin
resultdef:=tpointerdef.create(tarraydef(ld).elementdef);
resultdef:=getpointerdef(tarraydef(ld).elementdef);
inserttypeconv(left,resultdef);
end
else

View File

@ -1451,7 +1451,7 @@ implementation
is_object(p.resultdef);
if usederef then
hdef:=tpointerdef.create(p.resultdef)
hdef:=getpointerdef(p.resultdef)
else
hdef:=p.resultdef;
@ -3715,7 +3715,7 @@ implementation
{ temp }
else if (paracomplexity > 1) then
begin
ptrtype:=tpointerdef.create(para.left.resultdef);
ptrtype:=getpointerdef(para.left.resultdef);
tempnode := ctempcreatenode.create(ptrtype,ptrtype.size,tt_persistent,tparavarsym(para.parasym).is_regvar(true));
addstatement(inlineinitstatement,tempnode);
addstatement(inlinecleanupstatement,ctempdeletenode.create(tempnode));

View File

@ -312,7 +312,7 @@ implementation
resultdef:=tclassrefdef.create(resultdef)
else if (is_object(resultdef) or is_record(resultdef)) and
(nf_load_self_pointer in flags) then
resultdef:=tpointerdef.create(resultdef);
resultdef:=getpointerdef(resultdef);
end
else if vo_is_vmt in tabstractvarsym(symtableentry).varoptions then
begin

View File

@ -573,7 +573,7 @@ implementation
(tabsolutevarsym(tloadnode(hp).symtableentry).abstyp=toaddr) then
begin
if nf_typedaddr in flags then
result:=cpointerconstnode.create(tabsolutevarsym(tloadnode(hp).symtableentry).addroffset,tpointerdef.create(left.resultdef))
result:=cpointerconstnode.create(tabsolutevarsym(tloadnode(hp).symtableentry).addroffset,getpointerdef(left.resultdef))
else
result:=cpointerconstnode.create(tabsolutevarsym(tloadnode(hp).symtableentry).addroffset,voidpointertype);
exit;
@ -584,7 +584,7 @@ implementation
if not(nf_typedaddr in flags) then
resultdef:=voidpointertype
else
resultdef:=tpointerdef.create(left.resultdef);
resultdef:=getpointerdef(left.resultdef);
end
else
CGMessage(type_e_variable_id_expected);

View File

@ -242,7 +242,7 @@ implementation
begin
typecheckpass(p1);
result:=internalstatements(newstatement);
hdef:=tpointerdef.create(p1.resultdef);
hdef:=getpointerdef(p1.resultdef);
temp:=ctempcreatenode.create(hdef,sizeof(pint),tt_persistent,false);
addstatement(newstatement,temp);
addstatement(newstatement,cassignmentnode.create(ctemprefnode.create(temp),caddrnode.create_internal(p1)));

View File

@ -1568,6 +1568,8 @@ implementation
begin
consume(_CARET);
single_type(tt2,SingleTypeOptionsInTypeBlock[block_type=bt_type]);
{ don't use getpointerdef() here, since this is a type
declaration (-> must create new typedef) }
def:=tpointerdef.create(tt2);
if tt2.typ=forwarddef then
current_module.checkforwarddefs.add(def);

View File

@ -692,7 +692,7 @@ implementation
{$endif}
symtablestack.free;
symtablestack:=old_symtablestack.getcopyuntil(pd.localst);
pnestedvarsdef:=tpointerdef.create(nestedvarsdef);
pnestedvarsdef:=getpointerdef(nestedvarsdef);
nestedvars:=tlocalvarsym.create('$nestedvars',vs_var,nestedvarsdef,[]);
pd.localst.insert(nestedvars);
pd.parentfpstruct:=nestedvars;
@ -723,7 +723,7 @@ implementation
nestedvarsst:=trecorddef(nestedvarsdef).symtable;
{ indicate whether or not this is a var/out/constref/... parameter }
if addrparam then
fieldvardef:=tpointerdef.create(vardef)
fieldvardef:=getpointerdef(vardef)
else
fieldvardef:=vardef;
result:=tfieldvarsym.create(sym.realname,vs_value,fieldvardef,[]);

View File

@ -928,6 +928,10 @@ interface
function use_vectorfpu(def : tdef) : boolean;
{ returns a pointerdef for def, reusing an existing one in case it exists
in the current module }
function getpointerdef(def: tdef): tpointerdef;
implementation
uses
@ -6480,4 +6484,23 @@ implementation
{$endif}
end;
function getpointerdef(def: tdef): tpointerdef;
var
res: PHashSetItem;
begin
if not assigned(current_module) then
internalerror(2011071101);
res:=current_module.ptrdefs.FindOrAdd(@def,sizeof(def));
if not assigned(res^.Data) then
begin
{ since these pointerdefs can be reused anywhere in the current
unit, add them to the global/staticsymtable }
symtablestack.push(current_module.localsymtable);
res^.Data:=tpointerdef.create(def);
symtablestack.pop(current_module.localsymtable);
end;
result:=tpointerdef(res^.Data);
end;
end.