Browse Source

* 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 -

Jonas Maebe 9 years ago
parent
commit
2148a20d6a
2 changed files with 17 additions and 0 deletions
  1. 11 0
      compiler/llvm/aasmllvm.pas
  2. 6 0
      compiler/llvm/hlcgllvm.pas

+ 11 - 0
compiler/llvm/aasmllvm.pas

@@ -71,6 +71,9 @@ interface
         { dst = bitcast size undef to size }
         { dst = bitcast size undef to size }
         constructor op_reg_size_undef(op: tllvmop; dst: tregister; size: tdef);
         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 }
         { 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);
         constructor op_reg_size_ref_size(op:tllvmop;dst:tregister;fromsize:tdef;const src:treference;tosize:tdef);
         { e.g. store fromsize src, ptrsize toref}
         { e.g. store fromsize src, ptrsize toref}
@@ -762,6 +765,14 @@ uses
         loaddef(3,size);
         loaddef(3,size);
       end;
       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);
     constructor taillvm.op_reg_size_ref_size(op: tllvmop; dst: tregister; fromsize: tdef; const src: treference; tosize: tdef);
       begin
       begin

+ 6 - 0
compiler/llvm/hlcgllvm.pas

@@ -1277,6 +1277,12 @@ implementation
                       end;
                       end;
                    end;
                    end;
                 list.concat(taillvm.op_size_reg(la_ret,retdef,retreg))
                 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
               end
             else
             else
               { todo: complex returns }
               { todo: complex returns }