Procházet zdrojové kódy

Add tsym parameter to ttgobj.getlocal method.

  * tgobj.pas: Change virtula method getlocal to
    add tsym paramter to allow for bettter warning when
    required alignment is more than localalignmax.
  * hlcgobj.pas: Adapt thlcgobj.getlocal method to new ttgobj.getlocal
  * ncgflw.pas: Add exceptvarsym as new parameter to getlocal methos
  * jvm/tgcpu.pas: Adapt to added parameter for overloaded virtual method
  * wasm32/tgcpu.pas: Same.
  * llvm/tgllvm.pas: Same.
Pierre Muller před 1 měsícem
rodič
revize
6724e3dec8

+ 1 - 1
compiler/hlcgobj.pas

@@ -5359,7 +5359,7 @@ implementation
 
   procedure thlcgobj.getlocal(list: TAsmList; sym: tsym; size: asizeint; alignment: shortint; def: tdef; out ref: treference);
     begin
-      tg.getlocal(list,size,alignment,def,ref);
+      tg.getlocal(list,size,alignment,def,sym,ref);
       recordnewsymloc(list,sym,def,ref,true);
     end;
 

+ 2 - 2
compiler/jvm/tgcpu.pas

@@ -45,7 +45,7 @@ unit tgcpu;
          procedure alloctemp(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref: treference); override;
         public
          procedure setfirsttemp(l : asizeint); override;
-         procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref: treference); override;
+         procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; sym : tsym; var ref: treference); override;
          procedure gethltemp(list: TAsmList; def: tdef; forcesize: asizeint; temptype: ttemptype; out ref: treference); override;
          procedure gethltempmanaged(list: TAsmList; def: tdef; temptype: ttemptype; out ref: treference); override;
        end;
@@ -250,7 +250,7 @@ unit tgcpu;
       end;
 
 
-    procedure ttgjvm.getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref: treference);
+    procedure ttgjvm.getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; sym : tsym; var ref: treference);
       begin
         if not getifspecialtemp(list,def,size,tt_persistent,ref) then
           inherited;

+ 2 - 2
compiler/llvm/tgllvm.pas

@@ -67,7 +67,7 @@ unit tgllvm;
         destructor destroy; override;
         procedure setfirsttemp(l: asizeint); override;
         procedure temp_to_ref(p: ptemprecord; out ref: treference); override;
-        procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref: treference); override;
+        procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; sym : tsym; var ref: treference); override;
         procedure gethltemp(list: TAsmList; def: tdef; forcesize: asizeint; temptype: ttemptype; out ref: treference); override;
       end;
 
@@ -203,7 +203,7 @@ implementation
       end;
 
 
-    procedure ttgllvm.getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref: treference);
+    procedure ttgllvm.getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; sym : tsym; var ref: treference);
       begin
         alignment:=used_align(alignment,current_settings.alignment.localalignmin,current_settings.alignment.localalignmax);
         gethltempintern(list,def,alignment,size,tt_persistent,ref);

+ 1 - 1
compiler/ncgflw.pas

@@ -767,7 +767,7 @@ implementation
          if assigned(exceptvarsym) then
            begin
              location_reset_ref(exceptvarsym.localloc, LOC_REFERENCE, def_cgsize(voidpointertype), voidpointertype.alignment, []);
-             tg.GetLocal(current_asmdata.CurrAsmList, exceptvarsym.vardef.size, exceptvarsym.vardef, exceptvarsym.localloc.reference);
+             tg.GetLocal(current_asmdata.CurrAsmList, exceptvarsym.vardef.size, voidpointertype.alignment, exceptvarsym.vardef, exceptvarsym, exceptvarsym.localloc.reference);
              hlcg.a_load_reg_ref(current_asmdata.CurrAsmList, exceptlocdef, exceptvarsym.vardef, exceptlocreg, exceptvarsym.localloc.reference);
            end;
          { in the case that another exception is risen

+ 12 - 5
compiler/tgobj.pas

@@ -125,7 +125,7 @@ unit tgobj;
 
           { Allocate space for a local }
           procedure getlocal(list: TAsmList; size: asizeint; def: tdef; var ref : treference);
-          procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref : treference); virtual;
+          procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; sym : tsym; var ref : treference); virtual;
           procedure UnGetLocal(list: TAsmList; const ref : treference);
        end;
        ttgobjclass = class of ttgobj;
@@ -742,14 +742,21 @@ implementation
 
     procedure ttgobj.getlocal(list: TAsmList; size: asizeint; def: tdef; var ref : treference);
       begin
-        getlocal(list, size, def.alignment, def, ref);
+        getlocal(list, size, def.alignment, def, nil, ref);
       end;
 
 
-    procedure ttgobj.getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref : treference);
+    procedure ttgobj.getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; sym : tsym; var ref : treference);
+      var
+        lalign : shortint;
       begin
-        alignment:=used_align(alignment,current_settings.alignment.localalignmin,current_settings.alignment.localalignmax);
-        alloctemp(list,size,alignment,tt_persistent,def,false,ref);
+        lalign:=used_align(alignment,current_settings.alignment.localalignmin,current_settings.alignment.localalignmax);
+        if (alignment>lalign) then
+          if assigned(sym) then
+            CGMessage1(scanner_w_local_alignment_large_than_max,sym.name)
+          else
+            CGMessage1(scanner_w_local_alignment_large_than_max,def.typename);
+        alloctemp(list,size,lalign,tt_persistent,def,false,ref);
       end;
 
 

+ 2 - 2
compiler/wasm32/tgcpu.pas

@@ -86,7 +86,7 @@ unit tgcpu;
          procedure ungettemp(list: TAsmList; const ref : treference); override;
          procedure allocframepointer(list: TAsmList; out ref: treference);
          procedure allocbasepointer(list: TAsmList; out ref: treference);
-         procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref : treference); override;
+         procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; sym : tsym; var ref : treference); override;
        end;
 
     function defToWasmBasic(def: tdef; var wbt: TWasmBasicType): Boolean;
@@ -300,7 +300,7 @@ unit tgcpu;
         updateFirstTemp;
       end;
 
-    procedure ttgwasm.getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref : treference);
+    procedure ttgwasm.getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; sym : tsym; var ref : treference);
       var
         wbt: TWasmBasicType;
       begin