* fixed returning results from functions that have a zero-sized result

(e.g. an empty record): return an "undefined" instance of the result
    type (since it's empty, its contents are irrelevant). Before, we
    returned "void", but that means returning nothing rather than returning
    something empty (part of fixing test/tnoext4 for llvm)

git-svn-id: trunk@34119 -
This commit is contained in:
Jonas Maebe 2016-07-14 15:19:09 +00:00
parent 5541fb3f6d
commit 2148a20d6a
2 changed files with 17 additions and 0 deletions

View File

@ -71,6 +71,9 @@ interface
{ dst = bitcast size undef to size }
constructor op_reg_size_undef(op: tllvmop; dst: tregister; size: tdef);
{ return size undef }
constructor op_size_undef(op: tllvmop; size: tdef);
{ e.g. dst = bitcast fromsize src to tosize }
constructor op_reg_size_ref_size(op:tllvmop;dst:tregister;fromsize:tdef;const src:treference;tosize:tdef);
{ e.g. store fromsize src, ptrsize toref}
@ -762,6 +765,14 @@ uses
loaddef(3,size);
end;
constructor taillvm.op_size_undef(op: tllvmop; size: tdef);
begin
create_llvm(op);
ops:=2;
loaddef(0,size);
loadundef(1);
end;
constructor taillvm.op_reg_size_ref_size(op: tllvmop; dst: tregister; fromsize: tdef; const src: treference; tosize: tdef);
begin

View File

@ -1277,6 +1277,12 @@ implementation
end;
end;
list.concat(taillvm.op_size_reg(la_ret,retdef,retreg))
end;
LOC_VOID:
begin
{ zero-sized records: return an undefined zero-sized record of
the correct type }
list.concat(taillvm.op_size_undef(la_ret,retdef));
end
else
{ todo: complex returns }