llvm-project/clang/test/Driver/le32-unknown-nacl.cpp
Rafael Espindola fc3fc0c936 The clang driver has a fairly fancy support for executing gcc instead of
clang itself. This dates back to clang's early days and while it looks like
some of it is still used (for kext for example), other parts are probably dead.

Remove the -ccc-clang-archs option and associated code. I don't think there
is any remaining setup where clang doesn't support an architecture but it can
expect an working gcc cross compiler to be available.

A nice side effect is that tests no longer need to differentiate architectures
that are included in production builds of clang and those that are not.

llvm-svn: 165545
2012-10-09 20:46:28 +00:00

147 lines
3.1 KiB
C++

// RUN: %clang -target le32-unknown-nacl -ccc-echo %s -emit-llvm-only -c 2>&1 | FileCheck %s -check-prefix=ECHO
// RUN: %clang -target le32-unknown-nacl %s -emit-llvm -S -c -o - | FileCheck %s
// RUN: %clang -target le32-unknown-nacl %s -emit-llvm -S -c -pthread -o - | FileCheck %s -check-prefix=THREADS
// ECHO: {{.*}} -cc1 {{.*}}le32-unknown-nacl.c
// Check platform defines
#include <stdarg.h>
#include <stddef.h>
extern "C" {
// CHECK: @align_c = global i32 1
int align_c = __alignof(char);
// CHECK: @align_s = global i32 2
int align_s = __alignof(short);
// CHECK: @align_i = global i32 4
int align_i = __alignof(int);
// CHECK: @align_l = global i32 4
int align_l = __alignof(long);
// CHECK: @align_ll = global i32 8
int align_ll = __alignof(long long);
// CHECK: @align_p = global i32 4
int align_p = __alignof(void*);
// CHECK: @align_f = global i32 4
int align_f = __alignof(float);
// CHECK: @align_d = global i32 8
int align_d = __alignof(double);
// CHECK: @align_ld = global i32 8
int align_ld = __alignof(long double);
// CHECK: @align_vl = global i32 4
int align_vl = __alignof(va_list);
// CHECK: __LITTLE_ENDIAN__defined
#ifdef __LITTLE_ENDIAN__
void __LITTLE_ENDIAN__defined() {}
#endif
// CHECK: __native_client__defined
#ifdef __native_client__
void __native_client__defined() {}
#endif
// CHECK: __le32__defined
#ifdef __le32__
void __le32__defined() {}
#endif
// CHECK: __pnacl__defined
#ifdef __pnacl__
void __pnacl__defined() {}
#endif
// CHECK: unixdefined
#ifdef unix
void unixdefined() {}
#endif
// CHECK: __ELF__defined
#ifdef __ELF__
void __ELF__defined() {}
#endif
// CHECK: _GNU_SOURCEdefined
#ifdef _GNU_SOURCE
void _GNU_SOURCEdefined() {}
#endif
// THREADS: _REENTRANTdefined
// CHECK: _REENTRANTundefined
#ifdef _REENTRANT
void _REENTRANTdefined() {}
#else
void _REENTRANTundefined() {}
#endif
// Check types
// CHECK: signext i8 @check_char()
char check_char() { return 0; }
// CHECK: signext i16 @check_short()
short check_short() { return 0; }
// CHECK: i32 @check_int()
int check_int() { return 0; }
// CHECK: i32 @check_long()
long check_long() { return 0; }
// CHECK: i64 @check_longlong()
long long check_longlong() { return 0; }
// CHECK: zeroext i8 @check_uchar()
unsigned char check_uchar() { return 0; }
// CHECK: zeroext i16 @check_ushort()
unsigned short check_ushort() { return 0; }
// CHECK: i32 @check_uint()
unsigned int check_uint() { return 0; }
// CHECK: i32 @check_ulong()
unsigned long check_ulong() { return 0; }
// CHECK: i64 @check_ulonglong()
unsigned long long check_ulonglong() { return 0; }
// CHECK: i32 @check_size_t()
size_t check_size_t() { return 0; }
// CHECK: float @check_float()
float check_float() { return 0; }
// CHECK: double @check_double()
double check_double() { return 0; }
// CHECK: double @check_longdouble()
long double check_longdouble() { return 0; }
}
template<int> void Switch();
template<> void Switch<4>();
template<> void Switch<8>();
template<> void Switch<16>();
void check_pointer_size() {
// CHECK: SwitchILi4
Switch<sizeof(void*)>();
// CHECK: SwitchILi8
Switch<sizeof(long long)>();
// CHECK: SwitchILi16
Switch<sizeof(va_list)>();
}