浏览代码

* support for marking arraydefs as vectors

git-svn-id: trunk@43782 -
Jonas Maebe 5 年之前
父节点
当前提交
f5833dc048
共有 3 个文件被更改,包括 51 次插入8 次删除
  1. 2 1
      compiler/symconst.pas
  2. 47 6
      compiler/symdef.pas
  3. 2 1
      compiler/utils/ppuutils/ppudump.pp

+ 2 - 1
compiler/symconst.pas

@@ -555,7 +555,8 @@ type
     ado_IsConstructor,      // array constructor (e.g. something = [1,2,3])
     ado_IsConstructor,      // array constructor (e.g. something = [1,2,3])
     ado_IsArrayOfConst,     // array of const
     ado_IsArrayOfConst,     // array of const
     ado_IsConstString,      // string constant
     ado_IsConstString,      // string constant
-    ado_IsBitPacked         // bitpacked array
+    ado_IsBitPacked,        // bitpacked array
+    ado_IsVector            // Vector
   );
   );
   tarraydefoptions=set of tarraydefoption;
   tarraydefoptions=set of tarraydefoption;
 
 

+ 47 - 6
compiler/symdef.pas

@@ -558,19 +558,23 @@ interface
           _elementdef      : tdef;
           _elementdef      : tdef;
           _elementdefderef : tderef;
           _elementdefderef : tderef;
           procedure setelementdef(def:tdef);
           procedure setelementdef(def:tdef);
+          class function getreusable_intern(def: tdef; elems: asizeint; const options: tarraydefoptions): tarraydef;
        public
        public
           function elesize : asizeint;
           function elesize : asizeint;
           function elepackedbitsize : asizeint;
           function elepackedbitsize : asizeint;
           function elecount : asizeuint;
           function elecount : asizeuint;
-          constructor create_from_pointer(def:tpointerdef);virtual;
-          constructor create(l,h:asizeint;def:tdef);virtual;
+          constructor create_from_pointer(def: tpointerdef);virtual;
+          constructor create(l, h: asizeint; def: tdef);virtual;
+          constructor create_vector(l,h:asizeint; def:tdef);
           constructor create_openarray;virtual;
           constructor create_openarray;virtual;
-          class function getreusable(def: tdef; elems: asizeint): tarraydef; virtual;
+          class function getreusable(def: tdef; elems: asizeint): tarraydef;
+          class function getreusable_vector(def: tdef; elems: asizeint): tarraydef;
           { same as above, but in case the def must never be freed after the
           { same as above, but in case the def must never be freed after the
             current module has been compiled -- even if the def was not written
             current module has been compiled -- even if the def was not written
             to the ppu file (for defs in para locations, as we don't reset them
             to the ppu file (for defs in para locations, as we don't reset them
             so we don't have to recalculate them all the time) }
             so we don't have to recalculate them all the time) }
           class function getreusable_no_free(def: tdef; elems: asizeint): tarraydef;
           class function getreusable_no_free(def: tdef; elems: asizeint): tarraydef;
+          class function getreusable_no_free_vector(def: tdef; elems: asizeint): tarraydef;
           constructor ppuload(ppufile:tcompilerppufile);
           constructor ppuload(ppufile:tcompilerppufile);
           destructor destroy; override;
           destructor destroy; override;
           function getcopy : tstoreddef;override;
           function getcopy : tstoreddef;override;
@@ -588,6 +592,7 @@ interface
           function needs_separate_initrtti : 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;
+          function is_hwvector: boolean;
        end;
        end;
        tarraydefclass = class of tarraydef;
        tarraydefclass = class of tarraydef;
 
 
@@ -4035,7 +4040,7 @@ implementation
                            TARRAYDEF
                            TARRAYDEF
 ***************************************************************************}
 ***************************************************************************}
 
 
-    constructor tarraydef.create(l,h:asizeint;def:tdef);
+    constructor tarraydef.create(l, h: asizeint; def: tdef);
       begin
       begin
          inherited create(arraydef,true);
          inherited create(arraydef,true);
          lowrange:=l;
          lowrange:=l;
@@ -4048,6 +4053,12 @@ implementation
          symtable:=tarraysymtable.create(self);
          symtable:=tarraysymtable.create(self);
       end;
       end;
 
 
+    constructor tarraydef.create_vector(l ,h: asizeint; def: tdef);
+      begin
+        self.create(l,h,def);
+        include(arrayoptions,ado_IsVector);
+      end;
+
 
 
     constructor tarraydef.create_openarray;
     constructor tarraydef.create_openarray;
       begin
       begin
@@ -4055,19 +4066,21 @@ implementation
       end;
       end;
 
 
 
 
-    class function tarraydef.getreusable(def: tdef; elems: asizeint): tarraydef;
+    class function tarraydef.getreusable_intern(def: tdef; elems: asizeint; const options: tarraydefoptions): tarraydef;
       var
       var
         res: PHashSetItem;
         res: PHashSetItem;
         oldsymtablestack: tsymtablestack;
         oldsymtablestack: tsymtablestack;
         arrdesc: packed record
         arrdesc: packed record
           def: tdef;
           def: tdef;
           elecount: asizeint;
           elecount: asizeint;
+          options: tarraydefoptions
         end;
         end;
       begin
       begin
         if not assigned(current_module) then
         if not assigned(current_module) then
           internalerror(2011081301);
           internalerror(2011081301);
         arrdesc.def:=def;
         arrdesc.def:=def;
         arrdesc.elecount:=elems;
         arrdesc.elecount:=elems;
+        arrdesc.options:=options;
         res:=current_module.arraydefs.FindOrAdd(@arrdesc,sizeof(arrdesc));
         res:=current_module.arraydefs.FindOrAdd(@arrdesc,sizeof(arrdesc));
         if not assigned(res^.Data) then
         if not assigned(res^.Data) then
           begin
           begin
@@ -4082,6 +4095,7 @@ implementation
             symtablestack:=nil;
             symtablestack:=nil;
             result:=carraydef.create(0,elems-1,sizesinttype);
             result:=carraydef.create(0,elems-1,sizesinttype);
             result.elementdef:=def;
             result.elementdef:=def;
+            result.arrayoptions:=options;
             setup_reusable_def(def,result,res,oldsymtablestack);
             setup_reusable_def(def,result,res,oldsymtablestack);
             { res^.Data may still be nil -> don't overwrite result }
             { res^.Data may still be nil -> don't overwrite result }
             exit;
             exit;
@@ -4090,6 +4104,18 @@ implementation
       end;
       end;
 
 
 
 
+    class function tarraydef.getreusable(def: tdef; elems: asizeint): tarraydef;
+      begin
+        result:=getreusable_intern(def,elems,[]);
+      end;
+
+
+    class function tarraydef.getreusable_vector(def: tdef; elems: asizeint): tarraydef;
+      begin
+        result:=getreusable_intern(def,elems,[ado_IsVector]);
+      end;
+
+
     class function tarraydef.getreusable_no_free(def: tdef; elems: asizeint): tarraydef;
     class function tarraydef.getreusable_no_free(def: tdef; elems: asizeint): tarraydef;
       begin
       begin
         result:=getreusable(def,elems);
         result:=getreusable(def,elems);
@@ -4097,6 +4123,13 @@ implementation
           include(result.defoptions,df_not_registered_no_free);
           include(result.defoptions,df_not_registered_no_free);
       end;
       end;
 
 
+    class function tarraydef.getreusable_no_free_vector(def: tdef; elems: asizeint): tarraydef;
+      begin
+        result:=getreusable_vector(def,elems);
+        if not result.is_registered then
+          include(result.defoptions,df_not_registered_no_free);
+      end;
+
 
 
     destructor tarraydef.destroy;
     destructor tarraydef.destroy;
       begin
       begin
@@ -4295,8 +4328,10 @@ implementation
 
 
     function tarraydef.alignment : shortint;
     function tarraydef.alignment : shortint;
       begin
       begin
+        if ado_IsVector in arrayoptions then
+           alignment:=size
          { alignment of dyn. arrays doesn't depend on the element size }
          { alignment of dyn. arrays doesn't depend on the element size }
-         if (ado_IsDynamicArray in arrayoptions) then
+         else if ado_IsDynamicArray in arrayoptions then
            alignment:=voidpointertype.alignment
            alignment:=voidpointertype.alignment
          { alignment is the target alignment for the used load size }
          { alignment is the target alignment for the used load size }
          else if (ado_IsBitPacked in arrayoptions) and
          else if (ado_IsBitPacked in arrayoptions) and
@@ -4368,6 +4403,12 @@ implementation
         Result:=ado_IsDynamicArray in arrayoptions;
         Result:=ado_IsDynamicArray in arrayoptions;
       end;
       end;
 
 
+
+    function tarraydef.is_hwvector: boolean;
+      begin
+        result:=ado_IsVector in arrayoptions;
+      end;
+
 {***************************************************************************
 {***************************************************************************
                               tabstractrecorddef
                               tabstractrecorddef
 ***************************************************************************}
 ***************************************************************************}

+ 2 - 1
compiler/utils/ppuutils/ppudump.pp

@@ -3251,7 +3251,8 @@ const
    { ado_IsConstructor      } 'IsConstructor',
    { ado_IsConstructor      } 'IsConstructor',
    { ado_IsArrayOfConst     } 'ArrayOfConst',
    { ado_IsArrayOfConst     } 'ArrayOfConst',
    { ado_IsConstString      } 'ConstString',
    { ado_IsConstString      } 'ConstString',
-   { ado_IsBitPacked        } 'BitPacked'
+   { ado_IsBitPacked        } 'BitPacked',
+   { ado_IsVector           } 'Vector'
   );
   );
 var
 var
   symoptions: tarraydefoptions;
   symoptions: tarraydefoptions;