From 49a83b2872cfd3c12492945bd77bee29e574889b Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sun, 10 Jan 2016 14:01:46 +0000 Subject: [PATCH] * 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 - --- compiler/jvm/njvmcnv.pas | 15 +++++++++++++++ compiler/llvm/nllvmcnv.pas | 19 ++++++++++++++++++- compiler/ncnv.pas | 13 ++++++++++++- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/compiler/jvm/njvmcnv.pas b/compiler/jvm/njvmcnv.pas index 957a69fd0e..8d09c8691b 100644 --- a/compiler/jvm/njvmcnv.pas +++ b/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 } diff --git a/compiler/llvm/nllvmcnv.pas b/compiler/llvm/nllvmcnv.pas index 8dfce93ce8..7db9df8aa0 100644 --- a/compiler/llvm/nllvmcnv.pas +++ b/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; diff --git a/compiler/ncnv.pas b/compiler/ncnv.pas index 1a66010213..3cf1d319d8 100644 --- a/compiler/ncnv.pas +++ b/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;