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