[PATCH] D21611: Fix small structures calling convention issue for some big endian architectures

Daniel Sanders via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 23 03:33:04 PDT 2016

dsanders added a comment.

This change agrees with what I think the calling convention is and the documentation. However, I've hit quite a few discrepancies between the documented calling convention and the de-facto one implemented by gcc so I'm wary of going by that alone.

Have you tried putting the caller and callee side of this test in different compilation units and then linking a gcc-compiled caller with a clang-compiled callee (and then repeating that for the other three combinations) like the test generator in tools/clang/utils/ABITest does? Does this produce a program that executes correctly for all four combinations?

> > Hmm.  On MIPS64, a slot is 64 bits, right?  How is a float passed?

>  Oh, floats are promoted to doubles in varargs, of course, which neatly makes that an impossible situation.


> My inclination is that the right condition here is that only integer types should be right-justified in their slot, but I'll admit to not having an easy example of a type for which your condition doesn't work.

Floats are left justified according to the 'MIPSproTM N32 ABI Handbook' (which also discusses the O32 and N64 ABI's) but I can't think of a test case that would expose a problem due to the promotion to double.

Comment at: test/CodeGen/struct-union-BE.c:1-3
@@ +1,4 @@
+// RUN: %clang -O2 -target mips-linux-gnu  -EB -S -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS
+// RUN: %clang -O2 -target mips64-linux-gnu  -EB -S -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS64
+// RUN: %clang -O2 -target armeb-linux-gnueabihf -march=armv7a  -EB -S -emit-llvm %s -o - | FileCheck %s -check-prefix=ARM
Do we need %clang and -O2? Can we use %clang_cc1 and the default optimization level instead?


More information about the cfe-commits mailing list