================
@@ -0,0 +1,41 @@
+/// Tests that getBuiltinVaListKind() delegates to the host target, verified
+/// via sizeof(__builtin_va_list) and struct layout containing va_list.
+
+// RUN: %clang_cc1 -triple spirv64-unknown-unknown -aux-triple
x86_64-unknown-linux-gnu \
+// RUN: -fsycl-is-device -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple spirv64-unknown-unknown -aux-triple
x86_64-pc-windows-msvc \
+// RUN: -fsycl-is-device -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple spirv64-unknown-unknown -aux-triple
aarch64-unknown-linux-gnu \
+// RUN: -fsycl-is-device -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple spirv64-unknown-unknown \
+// RUN: -fsycl-is-device -fsyntax-only -verify %s
+
+// expected-no-diagnostics
+
+struct has_valist { int x; __builtin_va_list ap; int y; };
+
+#if defined(_WIN32)
+// Windows x86_64: CharPtrBuiltinVaList (char*)
+static_assert(sizeof(__builtin_va_list) == 8, "Windows: va_list is char*");
+static_assert(sizeof(has_valist) == 24, "Windows: struct layout with char*
va_list");
+static_assert(__builtin_offsetof(has_valist, y) == 16,
+ "Windows: field after char* va_list");
+#elif defined(__aarch64__)
+// AArch64 Linux: AArch64ABIBuiltinVaList (struct, 32 bytes)
+static_assert(sizeof(__builtin_va_list) == 32, "AArch64: va_list is struct");
+static_assert(sizeof(has_valist) == 48, "AArch64: struct layout with 32-byte
va_list");
+static_assert(__builtin_offsetof(has_valist, y) == 40,
+ "AArch64: field after 32-byte va_list");
+#elif defined(__x86_64__)
+// x86_64 Linux: X86_64ABIBuiltinVaList (struct __va_list_tag, 24 bytes)
+static_assert(sizeof(__builtin_va_list) == 24, "Linux x86_64: va_list is
struct");
+static_assert(sizeof(has_valist) == 40, "Linux x86_64: struct layout with
24-byte va_list");
+static_assert(__builtin_offsetof(has_valist, y) == 32,
+ "Linux x86_64: field after 24-byte va_list");
+#else
+// No host: VoidPtrBuiltinVaList (void*)
+static_assert(sizeof(__builtin_va_list) == 8, "No host: va_list is void*");
+static_assert(sizeof(has_valist) == 24, "No host: struct layout with void*
va_list");
+static_assert(__builtin_offsetof(has_valist, y) == 16,
+ "No host: field after void* va_list");
+#endif
----------------
tahonermann wrote:
Ah, I commented on the SPIR version of this test with a different way to test.
I don't have a preference between validation via IR and validation via
`static_assert`. I don't think we need to check as much as is being checked
above though. I think a same-type check would suffice.
```
template<typename T, typename U>
struct same_type;
template<typename T>
struct same_type<T, T> {
using type = int;
};
template<typename T, typename U, typename = same_type<T, U>::type>
constexpr bool is_same_type(int) { return true; }
template<typename T, typename U>
constexpr bool is_same_type(...) { return false; }
#if defined(_WIN32)
static_assert(is_same_type<__builtin_va_list, char*>(0));
#else
static_assert(!is_same_type<__builtin_va_list, char*>(0));
#endif
```
https://github.com/llvm/llvm-project/pull/208196
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits