Selaa lähdekoodia

+ Reduce the amount of RTTI by not generating 'init' information if it will end up being the same as the 'full' one (which is the case of most simple types). The new behavior can be customized for every tdef by overriding needs_separate_initrtti method.

git-svn-id: trunk@21077 -
sergei 13 vuotta sitten
vanhempi
commit
a54e342060
3 muutettua tiedostoa jossa 29 lisäystä ja 1 poistoa
  1. 3 0
      compiler/ncgrtti.pas
  2. 25 1
      compiler/symdef.pas
  3. 1 0
      compiler/symtype.pas

+ 3 - 0
compiler/ncgrtti.pas

@@ -1208,6 +1208,9 @@ implementation
         { only write rtti of definitions from the current module }
         { only write rtti of definitions from the current module }
         if not findunitsymtable(def.owner).iscurrentunit then
         if not findunitsymtable(def.owner).iscurrentunit then
           exit;
           exit;
+        { check if separate initrtti is actually needed }
+        if (rt=initrtti) and (not def.needs_separate_initrtti) then
+          rt:=fullrtti;
         { prevent recursion }
         { prevent recursion }
         if rttidefstate[rt] in def.defstates then
         if rttidefstate[rt] in def.defstates then
           exit;
           exit;

+ 25 - 1
compiler/symdef.pas

@@ -80,6 +80,7 @@ interface
           function  needs_inittable : boolean;override;
           function  needs_inittable : boolean;override;
           function  rtti_mangledname(rt:trttitype):string;override;
           function  rtti_mangledname(rt:trttitype):string;override;
           function  OwnerHierarchyName: string; override;
           function  OwnerHierarchyName: string; override;
+          function  needs_separate_initrtti:boolean;override;
           function  in_currentunit: boolean;
           function  in_currentunit: boolean;
           { regvars }
           { regvars }
           function is_intregable : boolean;
           function is_intregable : boolean;
@@ -223,6 +224,7 @@ interface
           function  GetTypeName:string;override;
           function  GetTypeName:string;override;
           { debug }
           { debug }
           function  needs_inittable : boolean;override;
           function  needs_inittable : boolean;override;
+          function  needs_separate_initrtti:boolean;override;
           { jvm }
           { jvm }
           function  is_related(d : tdef) : boolean;override;
           function  is_related(d : tdef) : boolean;override;
        end;
        end;
@@ -328,6 +330,7 @@ interface
           function  is_publishable : boolean;override;
           function  is_publishable : boolean;override;
           function  is_related(d : tdef) : boolean;override;
           function  is_related(d : tdef) : boolean;override;
           function  needs_inittable : boolean;override;
           function  needs_inittable : boolean;override;
+          function  needs_separate_initrtti : boolean;override;
           function  rtti_mangledname(rt:trttitype):string;override;
           function  rtti_mangledname(rt:trttitype):string;override;
           function  vmt_mangledname : TSymStr;
           function  vmt_mangledname : TSymStr;
           procedure check_forwards; override;
           procedure check_forwards; override;
@@ -393,6 +396,7 @@ interface
           function alignment : shortint;override;
           function alignment : shortint;override;
           { returns the label of the range check string }
           { returns the label of the range check string }
           function needs_inittable : boolean;override;
           function needs_inittable : boolean;override;
+          function needs_separate_initrtti : boolean;override;
           property elementdef : tdef read _elementdef write setelementdef;
           property elementdef : tdef read _elementdef write setelementdef;
           function is_publishable : boolean;override;
           function is_publishable : boolean;override;
        end;
        end;
@@ -1402,11 +1406,16 @@ implementation
       end;
       end;
 
 
 
 
+    function tstoreddef.needs_separate_initrtti:boolean;
+      begin
+        result:=false;
+      end;
+
     function Tstoreddef.rtti_mangledname(rt:trttitype):string;
     function Tstoreddef.rtti_mangledname(rt:trttitype):string;
       var
       var
         prefix : string[4];
         prefix : string[4];
       begin
       begin
-        if rt=fullrtti then
+        if (rt=fullrtti) or (not needs_separate_initrtti) then
           begin
           begin
             prefix:='RTTI';
             prefix:='RTTI';
             include(defstates,ds_rtti_table_used);
             include(defstates,ds_rtti_table_used);
@@ -3055,6 +3064,13 @@ implementation
          needs_inittable:=(ado_IsDynamicArray in arrayoptions) or elementdef.needs_inittable;
          needs_inittable:=(ado_IsDynamicArray in arrayoptions) or elementdef.needs_inittable;
       end;
       end;
 
 
+    function tarraydef.needs_separate_initrtti : boolean;
+      begin
+        if ado_IsBitPacked in arrayoptions then
+          result:=false
+        else
+          result:=elementdef.needs_separate_initrtti;
+      end;
 
 
     function tarraydef.GetTypeName : string;
     function tarraydef.GetTypeName : string;
       begin
       begin
@@ -3397,6 +3413,10 @@ implementation
         needs_inittable:=trecordsymtable(symtable).needs_init_final
         needs_inittable:=trecordsymtable(symtable).needs_init_final
       end;
       end;
 
 
+    function trecorddef.needs_separate_initrtti : boolean;
+      begin
+        result:=true;
+      end;
 
 
     function trecorddef.is_related(d: tdef): boolean;
     function trecorddef.is_related(d: tdef): boolean;
       begin
       begin
@@ -5846,6 +5866,10 @@ implementation
          end;
          end;
       end;
       end;
 
 
+    function tobjectdef.needs_separate_initrtti : boolean;
+      begin
+        result:=not (objecttype in [odt_interfacecom,odt_interfacecorba,odt_dispinterface]);
+      end;
 
 
     function tobjectdef.rtti_mangledname(rt: trttitype): string;
     function tobjectdef.rtti_mangledname(rt: trttitype): string;
       begin
       begin

+ 1 - 0
compiler/symtype.pas

@@ -82,6 +82,7 @@ interface
          function  geTSymtable(t:tgeTSymtable):TSymtable;virtual;
          function  geTSymtable(t:tgeTSymtable):TSymtable;virtual;
          function  is_publishable:boolean;virtual;abstract;
          function  is_publishable:boolean;virtual;abstract;
          function  needs_inittable:boolean;virtual;abstract;
          function  needs_inittable:boolean;virtual;abstract;
+         function  needs_separate_initrtti:boolean;virtual;abstract;
          function  is_related(def:tdef):boolean;virtual;
          function  is_related(def:tdef):boolean;virtual;
          procedure ChangeOwner(st:TSymtable);
          procedure ChangeOwner(st:TSymtable);
          procedure register_created_object_type;virtual;
          procedure register_created_object_type;virtual;