[LLVMdev] ARM eabi calling convention
Akira Hatanaka
ahatanak at gmail.com
Mon Aug 6 15:21:21 PDT 2012
When I compile this program
*$ cat vararg1-main.c
typedef struct {
double d;
} S0;
S0 g1;
void foo0(int a, ...);
int main(int argc, char **argv) {
S0 s0 = { 2.0 };
foo0(1, s0);
printf("%f\n", g1.d);
* * return 0;
}*
with this command,
*$ clang -target arm-none-linux-gnueabi-gcc -ccc-clang-archs armv7
-emit-llvm vararg1-main.c -S -o vararg1-main.ll -O3*
I get this bitcode.
*$ cat vararg1-main.ll
define arm_aapcscc i32 @main(i32 %argc, i8** nocapture %argv) nounwind {
entry:
%0 = load [2 x i32]* bitcast (%struct.S0* @main.s0 to [2 x i32]*), align 8
tail call arm_aapcscc void (i32, ...)* @foo0(i32 1, [2 x i32] %0)
nounwind
%1 = load double* getelementptr inbounds (%struct.S0* @g1, i32 0, i32 0),
align 8, !tbaa !0
%call = tail call arm_aapcscc i32 (i8*, ...)* @printf(i8* getelementptr
inbounds ([4 x i8]* @.str, i32 0, i32 0), double %1) nounwind
ret i32 0
}*
My understanding is that ARM eabi requires that structure S0 be 8-byte
aligned when it is passed to function foo0, i.e. it should be passed in
register r2 and r3.
Is there anything in the call to foo0 that informs the backend that %0
should be 8-byte aligned?
* tail call arm_aapcscc void (i32, ...)* @foo0(i32 1, [2 x i32] %0)
nounwind
*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120806/d511df1f/attachment.html>
More information about the llvm-dev
mailing list