From f94f9f44e4fd26b54dad3a3ee4f72b9cb70ee130 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Tue, 7 Apr 2015 19:35:08 +0000 Subject: [PATCH] * convert all arguments to integers in case of comparisons of pointers with constants on llvm, as you can only compare with "null" in that case * convert all arguments to integers in case of pointer subtractions, as pointer subtractions are not supported by llvm git-svn-id: trunk@30485 - --- compiler/llvm/nllvmadd.pas | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/compiler/llvm/nllvmadd.pas b/compiler/llvm/nllvmadd.pas index ab68126b44..efffbc570d 100644 --- a/compiler/llvm/nllvmadd.pas +++ b/compiler/llvm/nllvmadd.pas @@ -69,10 +69,25 @@ implementation procedure tllvmaddnode.force_reg_left_right(allow_swap, allow_constant: boolean); begin + { comparison with pointer -> no immediate, as icmp can't handle pointer + immediates (except for nil as "null", but we don't generate that) } + if (nodetype in [equaln,unequaln,gtn,gten,ltn,lten]) and + ((left.nodetype in [pointerconstn,niln]) or + (right.nodetype in [pointerconstn,niln])) then + allow_constant:=false; inherited; + { pointer - pointer = integer -> make all defs pointer since we can't + subtract pointers } + if (nodetype=subn) and + (left.resultdef.typ=pointerdef) and + (right.resultdef.typ=pointerdef) then + begin + hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,resultdef,true); + hlcg.location_force_reg(current_asmdata.CurrAsmList,right.location,right.resultdef,resultdef,true); + end { pointer +/- integer -> make defs the same since a_op_* only gets a single type as argument } - if (left.resultdef.typ=pointerdef)<>(right.resultdef.typ=pointerdef) then + else if (left.resultdef.typ=pointerdef)<>(right.resultdef.typ=pointerdef) then begin { the result is a pointerdef -> typecast both arguments to pointer; a_op_*_reg will convert them back to integer as needed }