1f79470583759d20c20268711e6111461aefa8461Jim Grosbach// REQUIRES: arm-registered-target
2e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola// RUN: %clang_cc1 -triple arm -target-abi aapcs %s -emit-llvm -o - | FileCheck -check-prefix=AAPCS %s
3e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola// RUN: %clang_cc1 -triple arm -target-abi apcs-gnu %s -emit-llvm -o - | FileCheck -check-prefix=APCS-GNU %s
4e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola/*
5e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola * Check that va_arg accesses stack according to ABI alignment
6e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola * long long and double require 8-byte alignment under AAPCS
7e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola * however, they only require 4-byte alignment under APCS
8e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola */
9e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindolalong long t1(int i, ...) {
10e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // AAPCS: t1
11e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // APCS-GNU: t1
12e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    __builtin_va_list ap;
13e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    __builtin_va_start(ap, i);
14e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // AAPCS: add i32 %{{.*}} 7
15e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // AAPCS: and i32 %{{.*}} -8
16e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // APCS-GNU-NOT: add i32 %{{.*}} 7
17e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // APCS-GNU-NOT: and i32 %{{.*}} -8
18e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    long long ll = __builtin_va_arg(ap, long long);
19e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    __builtin_va_end(ap);
20e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    return ll;
21e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola}
22e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindoladouble t2(int i, ...) {
23e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // AAPCS: t2
24e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // APCS-GNU: t2
25e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    __builtin_va_list ap;
26e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    __builtin_va_start(ap, i);
27e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // AAPCS: add i32 %{{.*}} 7
28e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // AAPCS: and i32 %{{.*}} -8
29e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // APCS-GNU-NOT: add i32 %{{.*}} 7
30e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    // APCS-GNU-NOT: and i32 %{{.*}} -8
31e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    double ll = __builtin_va_arg(ap, double);
32e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    __builtin_va_end(ap);
33e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola    return ll;
34e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola}
35