Structure Returns


In my LLVM IR I am returning a structure from a function but it gave me an assertion failure when I was trying to compile the resulting bitcode.

Specifically, I had following function definition

define {i32,i32,i32} @func(i32 a)

ret {i32,i32,i32} %retStruct

llc gave me following assertion failure:

Return operand#2 has unhandled type i32 in AnalyzeReturn function

On digging out from LLVM website, I found

“Note that the code generator does not yet fully support large return values. The specific sizes that are currently supported are dependent on the target. For integers, on 32-bit targets the limit is often 64 bits, and on 64-bit targets the limit is often 128 bits. For aggregate types, the current limits are dependent on the element types; for example targets are often limited to 2 total integer elements and 2 total floating-point elements.”

So, does this mean that I can’t have a return type with more than two integers? Is there any other way to support longer return structure?

– Kapil

That's what it means (at least until someone like you contributes a
patch to support larger return structs). To work around it, imitate
what the C compiler does.

Try typing:

struct Big {
int a, b, c;

struct Big foo() {
  struct Big result = {1, 2, 3};
  return result;