فهرست منبع

* allow targets to keep certain type conversions for equal types in
inserttypeconv()
o keep typeconversions between structurally equivalent but semantically
different procvardefs for LLVM and JVM, because they're different
types there

git-svn-id: trunk@32904 -

Jonas Maebe 9 سال پیش
والد
کامیت
49a83b2872
3فایلهای تغییر یافته به همراه45 افزوده شده و 2 حذف شده
  1. 15 0
      compiler/jvm/njvmcnv.pas
  2. 18 1
      compiler/llvm/nllvmcnv.pas
  3. 12 1
      compiler/ncnv.pas

+ 15 - 0
compiler/jvm/njvmcnv.pas

@@ -30,6 +30,8 @@ interface
 
     type
        tjvmtypeconvnode = class(tcgtypeconvnode)
+          class function target_specific_need_equal_typeconv(fromdef, todef: tdef): boolean; override;
+
           function typecheck_dynarray_to_openarray: tnode; override;
           function typecheck_string_to_chararray: tnode; override;
           function typecheck_string_to_string: tnode;override;
@@ -148,6 +150,19 @@ implementation
       end;
 
 
+   class function tjvmtypeconvnode.target_specific_need_equal_typeconv(fromdef, todef: tdef): boolean;
+     begin
+       result:=
+         (fromdef<>todef) and
+         { two procdefs that are structurally the same but semantically different
+           still need a convertion }
+         (
+          ((fromdef.typ=procvardef) and
+           (todef.typ=procvardef))
+         );
+     end;
+
+
    function tjvmtypeconvnode.typecheck_dynarray_to_openarray: tnode;
      begin
        { all arrays are equal in Java }

+ 18 - 1
compiler/llvm/nllvmcnv.pas

@@ -26,10 +26,13 @@ unit nllvmcnv;
 interface
 
     uses
+      symtype,
       node,ncnv,ncgcnv,defcmp;
 
     type
        tllvmtypeconvnode = class(tcgtypeconvnode)
+         public
+          class function target_specific_need_equal_typeconv(fromdef, todef: tdef): boolean; override;
          protected
           function first_int_to_real: tnode; override;
           function first_int_to_bool: tnode; override;
@@ -64,11 +67,25 @@ uses
   aasmbase,aasmdata,
   llvmbase,aasmllvm,
   procinfo,
-  symconst,symtype,symdef,defutil,
+  symconst,symdef,defutil,
   cgbase,cgutils,tgobj,hlcgobj,pass_2;
 
 { tllvmtypeconvnode }
 
+
+class function tllvmtypeconvnode.target_specific_need_equal_typeconv(fromdef, todef: tdef): boolean;
+  begin
+    result:=
+      (fromdef<>todef) and
+      { two procdefs that are structurally the same but semantically different
+        still need a convertion }
+      (
+       ((fromdef.typ=procvardef) and
+        (todef.typ=procvardef))
+      );
+  end;
+
+
 function tllvmtypeconvnode.first_int_to_real: tnode;
   begin
     expectloc:=LOC_FPUREGISTER;

+ 12 - 1
compiler/ncnv.pas

@@ -65,6 +65,10 @@ interface
             replace this explicit type conversion with a different node, or to
             reject it after all }
           function target_specific_explicit_typeconv: boolean;virtual;
+
+          { called when inserttypeconv is used to convert to a def that is equal
+            according to compare_defs() }
+          class function target_specific_need_equal_typeconv(fromdef, todef: tdef): boolean; virtual;
        protected
           function typecheck_int_to_int : tnode; virtual;
           function typecheck_cord_to_pointer : tnode; virtual;
@@ -326,7 +330,8 @@ implementation
           still expects the resultdef of the node to be a stringdef) }
         if equal_defs(p.resultdef,def) and
            (p.resultdef.typ=def.typ) and
-           not is_bitpacked_access(p) then
+           not is_bitpacked_access(p) and
+           not ctypeconvnode.target_specific_need_equal_typeconv(p.resultdef,def) then
           begin
             { don't replace encoded string constants to rawbytestring encoding.
               preserve the codepage }
@@ -1988,6 +1993,12 @@ implementation
       end;
 
 
+    class function ttypeconvnode.target_specific_need_equal_typeconv(fromdef, todef: tdef): boolean;
+      begin
+        result:=false;
+      end;
+
+
     function ttypeconvnode.typecheck_proc_to_procvar : tnode;
       var
         pd : tabstractprocdef;