瀏覽代碼

* packed tabstractvarsym.addr_taken/different_scope fields into a set

git-svn-id: trunk@43450 -
Jonas Maebe 5 年之前
父節點
當前提交
2f914ee2d8
共有 4 個文件被更改,包括 78 次插入12 次删除
  1. 1 1
      compiler/ppu.pas
  2. 9 0
      compiler/symconst.pas
  3. 41 11
      compiler/symsym.pas
  4. 27 0
      compiler/utils/ppuutils/ppudump.pp

+ 1 - 1
compiler/ppu.pas

@@ -50,7 +50,7 @@ const
   CurrentPPUVersion = 207;
   CurrentPPUVersion = 207;
   { for any other changes to the ppu format, increase this version number
   { for any other changes to the ppu format, increase this version number
     (it's a cardinal) }
     (it's a cardinal) }
-  CurrentPPULongVersion = 7;
+  CurrentPPULongVersion = 8;
 
 
 { unit flags }
 { unit flags }
   uf_big_endian          = $000004;
   uf_big_endian          = $000004;

+ 9 - 0
compiler/symconst.pas

@@ -611,6 +611,15 @@ type
   );
   );
   tvaroptions=set of tvaroption;
   tvaroptions=set of tvaroption;
 
 
+  { variable symbol access flags }
+  tvarsymaccessflag = (
+    { this symbol's address has been taken }
+    vsa_addr_taken,
+    { this symbol is accessed from a different scope }
+    vsa_different_scope
+  );
+  tvarsymaccessflags = set of tvarsymaccessflag;
+
   tmanagementoperator=(mop_none,
   tmanagementoperator=(mop_none,
     mop_initialize,
     mop_initialize,
     mop_finalize,
     mop_finalize,

+ 41 - 11
compiler/symsym.pas

@@ -179,13 +179,9 @@ interface
           varspez       : tvarspez;  { sets the type of access }
           varspez       : tvarspez;  { sets the type of access }
           varregable    : tvarregable;
           varregable    : tvarregable;
           varstate      : tvarstate;
           varstate      : tvarstate;
-          { Has the address of this variable potentially escaped the
-            block in which is was declared?
-            could also be part of tabstractnormalvarsym, but there's
-            one byte left here till the next 4 byte alignment        }
-          addr_taken     : boolean;
-          { true if the variable is accessed in a different scope }
-          different_scope  : boolean;
+          {could also be part of tabstractnormalvarsym, but there's
+           one byte left here till the next 4 byte alignment        }
+          varsymaccess  : tvarsymaccessflags;
           constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
           constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
           constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
           constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
           procedure ppuwrite(ppufile:tcompilerppufile);override;
           procedure ppuwrite(ppufile:tcompilerppufile);override;
@@ -198,11 +194,17 @@ interface
           _vardef     : tdef;
           _vardef     : tdef;
           vardefderef : tderef;
           vardefderef : tderef;
 
 
+          function get_addr_taken: boolean;
+          function get_different_scope: boolean;
           procedure setregable;
           procedure setregable;
           procedure setvardef(const def: tdef);
           procedure setvardef(const def: tdef);
           procedure setvardef_and_regable(def:tdef);
           procedure setvardef_and_regable(def:tdef);
+          procedure set_addr_taken(AValue: boolean);
+          procedure set_different_scope(AValue: boolean);
         public
         public
           property vardef: tdef read _vardef write setvardef_and_regable;
           property vardef: tdef read _vardef write setvardef_and_regable;
+          property addr_taken: boolean read get_addr_taken write set_addr_taken;
+          property different_scope: boolean read get_different_scope write set_different_scope;
       end;
       end;
 
 
       tfieldvarsym = class(tabstractvarsym)
       tfieldvarsym = class(tabstractvarsym)
@@ -1638,8 +1640,7 @@ implementation
          varstate:=vs_readwritten;
          varstate:=vs_readwritten;
          varspez:=tvarspez(ppufile.getbyte);
          varspez:=tvarspez(ppufile.getbyte);
          varregable:=tvarregable(ppufile.getbyte);
          varregable:=tvarregable(ppufile.getbyte);
-         addr_taken:=ppufile.getboolean;
-         different_scope:=ppufile.getboolean;
+         ppufile.getset(tppuset1(varsymaccess));
          ppufile.getderef(vardefderef);
          ppufile.getderef(vardefderef);
          ppufile.getset(tppuset4(varoptions));
          ppufile.getset(tppuset4(varoptions));
       end;
       end;
@@ -1671,8 +1672,7 @@ implementation
          oldintfcrc:=ppufile.do_crc;
          oldintfcrc:=ppufile.do_crc;
          ppufile.do_crc:=false;
          ppufile.do_crc:=false;
          ppufile.putbyte(byte(varregable));
          ppufile.putbyte(byte(varregable));
-         ppufile.putboolean(addr_taken);
-         ppufile.putboolean(different_scope);
+         ppufile.putset(tppuset1(varsymaccess));
          ppufile.do_crc:=oldintfcrc;
          ppufile.do_crc:=oldintfcrc;
          ppufile.putderef(vardefderef);
          ppufile.putderef(vardefderef);
          ppufile.putset(tppuset4(varoptions));
          ppufile.putset(tppuset4(varoptions));
@@ -1731,6 +1731,24 @@ implementation
       end;
       end;
 
 
 
 
+    procedure tabstractvarsym.set_addr_taken(AValue: boolean);
+      begin
+        if AValue then
+          include(varsymaccess, vsa_addr_taken)
+        else
+          exclude(varsymaccess, vsa_addr_taken);
+      end;
+
+
+    procedure tabstractvarsym.set_different_scope(AValue: boolean);
+      begin
+        if AValue then
+          include(varsymaccess, vsa_different_scope)
+        else
+          exclude(varsymaccess, vsa_different_scope);
+      end;
+
+
     procedure tabstractvarsym.setregable;
     procedure tabstractvarsym.setregable;
       begin
       begin
         if vo_volatile in varoptions then
         if vo_volatile in varoptions then
@@ -1771,6 +1789,18 @@ implementation
       end;
       end;
 
 
 
 
+    function tabstractvarsym.get_addr_taken: boolean;
+      begin
+        result:=vsa_addr_taken in varsymaccess;
+      end;
+
+
+    function tabstractvarsym.get_different_scope: boolean;
+      begin
+        result:=vsa_different_scope in varsymaccess;
+      end;
+
+
     procedure tabstractvarsym.setvardef(const def: tdef);
     procedure tabstractvarsym.setvardef(const def: tdef);
       begin
       begin
         _vardef := def;
         _vardef := def;

+ 27 - 0
compiler/utils/ppuutils/ppudump.pp

@@ -3070,8 +3070,20 @@ const
      (mask:vo_is_default_var;  str:'DefaultIntrinsicVar'),
      (mask:vo_is_default_var;  str:'DefaultIntrinsicVar'),
      (mask:vo_is_far;          str:'IsFar')
      (mask:vo_is_far;          str:'IsFar')
   );
   );
+type
+  tvaraccessdesc=record
+    mask: tvarsymaccessflag;
+    str: string[30];
+  end;
+const
+  varaccessstr : array[ord(low(tvarsymaccessflag))..ord(high(tvarsymaccessflag))] of tvaraccessdesc=(
+    (mask: vsa_addr_taken;         str:'Address taken'),
+    (mask: vsa_different_scope;    str:'Accessed from different scope')
+  );
 var
 var
   i : longint;
   i : longint;
+  accessflag: tvarsymaccessflag;
+  varsymaccessflags: tvarsymaccessflags;
   first : boolean;
   first : boolean;
 begin
 begin
   readcommonsym(s, VarDef);
   readcommonsym(s, VarDef);
@@ -3087,6 +3099,21 @@ begin
       end;
       end;
   writeln([space,'         Spez : ',Varspez2Str(i)]);
   writeln([space,'         Spez : ',Varspez2Str(i)]);
   writeln([space,'      Regable : ',Varregable2Str(ppufile.getbyte)]);
   writeln([space,'      Regable : ',Varregable2Str(ppufile.getbyte)]);
+  ppufile.getset(tppuset1(varsymaccessflags));
+  write([space, ' Access Flags : ']);
+  first:=true;
+  for i:=low(varaccessstr) to high(varaccessstr) do
+    begin
+      if varaccessstr[i].mask in varsymaccessflags then
+        begin
+          if first then
+            first:=false
+          else
+            write([', ']);
+          write([varaccessstr[i].str]);
+        end
+    end;
+  writeln;
   writeln([space,'   Addr Taken : ',(ppufile.getbyte<>0)]);
   writeln([space,'   Addr Taken : ',(ppufile.getbyte<>0)]);
   writeln([space,'Escaped Scope : ',(ppufile.getbyte<>0)]);
   writeln([space,'Escaped Scope : ',(ppufile.getbyte<>0)]);
   write  ([space,'     Var Type : ']);
   write  ([space,'     Var Type : ']);