This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [gnat] reuse of ASTs already constructed


On 2009-05-04, at 07:36 +0200, Oliver Kellogg wrote:
> Robert Dewar wrote:
> > 
> > >>>> How about not doing the name expansion in-place but rather
> > >>>> storing the expanded name in an extra node field?
> > 
> > You could have a separate vector for expanded names I suppose ...
> 
> So be it. I will change the code to not overwrite the Name field
> with the expanded name but rather store the expanded name in a
> data structure separate from the Node.
> 

Luckily, this change was limited to the Exp_Dbug package body.
FYI I am appending the diff.
The new Q_E_Name array holds the Name_Id for the expanded name
of a given entity. The implementation as a fixed array is
preliminary and I would appreciate suggestions on a better
data structure to use.

Oliver


Index: exp_dbug.adb
===================================================================
--- exp_dbug.adb	(revision 147319)
+++ exp_dbug.adb	(working copy)
@@ -55,6 +55,31 @@
      Table_Increment      => Alloc.Name_Qualify_Units_Increment,
      Table_Name           => "Name_Qualify_Units");
 
+   --  Qualified Entity Name array is indexed by Entity_Id and
+   --  returns the Name_Id of the qualified name.
+
+   subtype Q_E_Name_Id is Entity_Id
+      range Entity_Id'First .. Entity_Id'First + 399999;
+
+   Q_E_Name : array (Q_E_Name_Id) of Name_Id := (others => No_Name);
+
+   function Get_Qualified_Name (E : Entity_Id) return Name_Id;
+
+   function Get_Qualified_Name (E : Entity_Id) return Name_Id is
+   begin
+      if Original_Operating_Mode /= Generate_Code then
+         return Chars (E);
+      else
+         pragma Assert (E in Q_E_Name_Id);
+         if Q_E_Name (E) = No_Name then
+            --  Write_Str ("Exp_Dbug.Get_Qualified_Name: returning Chars");
+            --  Write_Eol;
+            return Chars (E);
+         end if;
+      end if;
+      return Q_E_Name (E);
+   end Get_Qualified_Name;
+
    --------------------------------
    -- Use of Qualification Flags --
    --------------------------------
@@ -82,7 +107,7 @@
    --       B : Ddd.Ttt;
    --       procedure Y is ..
 
-   --  Here B is a procedure local variable, so it does not need fully
+   --  Here B is a procedure local variable, so it does not need full
    --  qualification. The flag Has_Qualified_Name will be set on the
    --  first attempt to qualify B, to indicate that the job is done
    --  and need not be redone.
@@ -143,8 +168,8 @@
    --  Prepend image of universal integer to Name_Buffer, updating Name_Len
 
    procedure Qualify_Entity_Name (Ent : Entity_Id);
-   --  If not already done, replaces the Chars field of the given entity
-   --  with the appropriate fully qualified name.
+   --  If not already done, puts the appropriate fully qualified name in the
+   --  Q_E_Name array element of the given entity.
 
    procedure Strip_Suffixes (BNPE_Suffix_Found : in out Boolean);
    --  Given an qualified entity name in Name_Buffer, remove any plain X or
@@ -512,7 +537,7 @@
          return;
       end if;
 
-      Get_Name_String (Chars (E));
+      Get_Name_String (Get_Qualified_Name (E));
 
       --  Nothing to do if we do not have a type
 
@@ -619,7 +644,8 @@
                if Lo_Con then
                   Add_Uint_To_Buffer (Expr_Rep_Value (Lo));
                elsif Lo_Discr then
-                  Get_Name_String_And_Append (Chars (Entity (Lo)));
+                  Get_Name_String_And_Append
+                    (Get_Qualified_Name (Entity (Lo)));
                end if;
 
                if Lo_Encode and Hi_Encode then
@@ -629,7 +655,8 @@
                if Hi_Con then
                   Add_Uint_To_Buffer (Expr_Rep_Value (Hi));
                elsif Hi_Discr then
-                  Get_Name_String_And_Append (Chars (Entity (Hi)));
+                  Get_Name_String_And_Append
+                    (Get_Qualified_Name (Entity (Hi)));
                end if;
             end if;
          end;
@@ -670,7 +697,7 @@
       procedure Get_Qualified_Name_And_Append (Entity : Entity_Id) is
       begin
          --  If the entity is a compilation unit, its scope is Standard,
-         --  there is no outer scope, and the no further qualification
+         --  there is no outer scope, and no further qualification
          --  is required.
 
          --  If the front end has already computed a fully qualified name,
@@ -682,11 +709,11 @@
          then
             Get_Qualified_Name_And_Append (Scope (Entity));
             Add_Str_To_Name_Buffer ("__");
-            Get_Name_String_And_Append (Chars (Entity));
+            Get_Name_String_And_Append (Get_Qualified_Name (Entity));
             Append_Homonym_Number (Entity);
 
          else
-            Get_Name_String_And_Append (Chars (Entity));
+            Get_Name_String_And_Append (Get_Qualified_Name (Entity));
          end if;
       end Get_Qualified_Name_And_Append;
 
@@ -935,7 +962,7 @@
       return  Name_Id
    is
    begin
-      Get_Name_String (Chars (Typ));
+      Get_Name_String (Get_Qualified_Name (Typ));
       Add_Str_To_Name_Buffer ("___XP");
       Add_Uint_To_Buffer (Csize);
       return Name_Find;
@@ -1077,9 +1104,6 @@
       BNPE_Suffix_Needed : Boolean := False;
       --  Set true if a body-nested package entity suffix is required
 
-      Save_Chars : constant Name_Id := Chars (Ent);
-      --  Save original name
-
       ------------------------
       -- Fully_Qualify_Name --
       ------------------------
@@ -1110,7 +1134,7 @@
          --  If we reached fully qualified name, then just copy it
 
          if Has_Fully_Qualified_Name (E) then
-            Get_Name_String (Chars (E));
+            Get_Name_String (Get_Qualified_Name (E));
             Strip_Suffixes (Discard);
             Full_Qualify_Name (1 .. Name_Len) := Name_Buffer (1 .. Name_Len);
             Full_Qualify_Len := Name_Len;
@@ -1221,7 +1245,7 @@
          --  will be separately put on later.
 
          if Has_Qualified_Name (E) then
-            Get_Name_String_And_Append (Chars (E));
+            Get_Name_String_And_Append (Get_Qualified_Name (E));
             Strip_Suffixes (BNPE_Suffix_Needed);
 
             --  If the top level name we are adding is itself fully
@@ -1306,13 +1330,13 @@
             Name_Len := Name_Len + Insert_Len;
          end;
 
-         --  Reset the name of the variable to the new name that includes the
+         --  Store in Q_E_Name the new name that includes the
          --  name of the renamed entity.
 
-         Set_Chars (Ent, Name_Enter);
+         Q_E_Name (Ent) := Name_Enter;
 
          --  If the entity needs qualification by its scope then develop it
-         --  here, add the variable's name, and again reset the entity name.
+         --  here, add the variable's name, and store it in Q_E_Name.
 
          if Qualify_Needed (Scope (Ent)) then
             Name_Len := 0;
@@ -1321,7 +1345,7 @@
 
             Get_Name_String_And_Append (Chars (Ent));
 
-            Set_Chars (Ent, Name_Enter);
+            Q_E_Name (Ent) := Name_Enter;
          end if;
 
          Set_Has_Qualified_Name (Ent);
@@ -1365,14 +1389,14 @@
          Name_Len := Name_Len - 1;
       end if;
 
-      Set_Chars (Ent, Name_Enter);
+      Q_E_Name (Ent) := Name_Enter;
       Set_Has_Qualified_Name (Ent);
 
       if Debug_Flag_BB then
          Write_Str ("*** ");
-         Write_Name (Save_Chars);
+         Write_Name (Chars (Ent));
          Write_Str (" qualified as ");
-         Write_Name (Chars (Ent));
+         Write_Name (Q_E_Name (Ent));
          Write_Eol;
       end if;
    end Qualify_Entity_Name;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]