* 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 -
This commit is contained in:
Jonas Maebe 2016-01-10 14:01:46 +00:00
parent 5aadb149ed
commit 49a83b2872
3 changed files with 45 additions and 2 deletions

View File

@ -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 }

View File

@ -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;

View File

@ -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;