Browse Source

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

Jonas Maebe 14 years ago
parent
commit
466f6751c8
9 changed files with 40 additions and 10 deletions
  1. 5 0
      compiler/fmodule.pas
  2. 2 2
      compiler/nadd.pas
  3. 2 2
      compiler/ncal.pas
  4. 1 1
      compiler/nld.pas
  5. 2 2
      compiler/nmem.pas
  6. 1 1
      compiler/pexpr.pas
  7. 2 0
      compiler/ptype.pas
  8. 2 2
      compiler/symcreat.pas
  9. 23 0
      compiler/symdef.pas

+ 5 - 0
compiler/fmodule.pas

@@ -143,6 +143,7 @@ interface
         checkforwarddefs,
         checkforwarddefs,
         deflist,
         deflist,
         symlist       : TFPObjectList;
         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 }
         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 }
         globalsymtable,           { pointer to the global symtable of this unit }
         localsymtable : TSymtable;{ pointer to the local symtable of this unit }
         localsymtable : TSymtable;{ pointer to the local symtable of this unit }
@@ -525,6 +526,7 @@ implementation
         derefdataintflen:=0;
         derefdataintflen:=0;
         deflist:=TFPObjectList.Create(false);
         deflist:=TFPObjectList.Create(false);
         symlist:=TFPObjectList.Create(false);
         symlist:=TFPObjectList.Create(false);
+        ptrdefs:=THashSet.Create(64,true,false);
         wpoinfo:=nil;
         wpoinfo:=nil;
         checkforwarddefs:=TFPObjectList.Create(false);
         checkforwarddefs:=TFPObjectList.Create(false);
         extendeddefs := TFPHashObjectList.Create(true);
         extendeddefs := TFPHashObjectList.Create(true);
@@ -640,6 +642,7 @@ implementation
         derefdata.free;
         derefdata.free;
         deflist.free;
         deflist.free;
         symlist.free;
         symlist.free;
+        ptrdefs.free;
         wpoinfo.free;
         wpoinfo.free;
         checkforwarddefs.free;
         checkforwarddefs.free;
         globalsymtable.free;
         globalsymtable.free;
@@ -699,6 +702,8 @@ implementation
         deflist:=TFPObjectList.Create(false);
         deflist:=TFPObjectList.Create(false);
         symlist.free;
         symlist.free;
         symlist:=TFPObjectList.Create(false);
         symlist:=TFPObjectList.Create(false);
+        ptrdefs.free;
+        ptrdefs:=THashSet.Create(64,true,false);
         wpoinfo.free;
         wpoinfo.free;
         wpoinfo:=nil;
         wpoinfo:=nil;
         checkforwarddefs.free;
         checkforwarddefs.free;

+ 2 - 2
compiler/nadd.pas

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

+ 2 - 2
compiler/ncal.pas

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

+ 1 - 1
compiler/nld.pas

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

+ 2 - 2
compiler/nmem.pas

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

+ 1 - 1
compiler/pexpr.pas

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

+ 2 - 0
compiler/ptype.pas

@@ -1568,6 +1568,8 @@ implementation
               begin
               begin
                 consume(_CARET);
                 consume(_CARET);
                 single_type(tt2,SingleTypeOptionsInTypeBlock[block_type=bt_type]);
                 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);
                 def:=tpointerdef.create(tt2);
                 if tt2.typ=forwarddef then
                 if tt2.typ=forwarddef then
                   current_module.checkforwarddefs.add(def);
                   current_module.checkforwarddefs.add(def);

+ 2 - 2
compiler/symcreat.pas

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

+ 23 - 0
compiler/symdef.pas

@@ -928,6 +928,10 @@ interface
 
 
     function use_vectorfpu(def : tdef) : boolean;
     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
 implementation
 
 
     uses
     uses
@@ -6480,4 +6484,23 @@ implementation
 {$endif}
 {$endif}
       end;
       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.
 end.