[LLVMdev] Passing and returning aggregates (who is responsible for the ABI?)
Christophe de Dinechin
christophe at dinechin.org
Mon Nov 5 16:19:27 PST 2007
I'm trying to port the XL compiler (http://xlr.sf.net) to use the
LLVM back-end. So far, little trouble doing so. But there is one
aspect of the semantics of the LLVM IR that surprises me. Why are the
call, declare and define "halfway through" ABI conventions?
I think it's the right thing to have a single high level node for
each call, as opposed to separate instructions for pushing individual
argument, for example. But that implies that the call semantics
include a good dose of ABI and calling conventions. This is explicit
in the fact that you tell what the calling conventions are (e.g ccc,
But then, why refuse aggregates as input or output of a call? What is
the rationale? On x86, I think it does not make any difference. But
for Itanium, it's clearly broken (e.g. Itanium can return a struct of
up to 4 ints in registers, and packs input parameters in a "funny"
way). Languages such as Ada or XL have output parameters, and they
are similarly difficult to generate code for (you have to make it
look like C).
I don't think adding aggregate support would break any current IR
producer, and assuming the aggregates are expanded early on, it
probably has very localized impact in the code. Are there other good
reasons not to add this capability, or would a patch adding it stand
a good chance to be accepted?
More information about the llvm-dev