| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| // RUN: %clang_cc1 -triple wasm32-unknown-unknown -emit-llvm %s -o - \ | ||
| // RUN: | FileCheck %s | ||
| // RUN: %clang_cc1 -triple wasm64-unknown-unknown -emit-llvm %s -o - \ | ||
| // RUN: | FileCheck %s | ||
|
|
||
| void test1_f(void *); | ||
|
|
||
| void test1_g(void) { | ||
| float x[4]; | ||
| test1_f(x); | ||
| } | ||
| // CHECK: @test1_g | ||
| // CHECK: alloca [4 x float], align 16 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| // RUN: %clang_cc1 -triple wasm32-unknown-unknown -O3 -emit-llvm -o - %s \ | ||
| // RUN: | FileCheck %s -check-prefix=WEBASSEMBLY32 | ||
| // RUN: %clang_cc1 -triple wasm64-unknown-unknown -O3 -emit-llvm -o - %s \ | ||
| // RUN: | FileCheck %s -check-prefix=WEBASSEMBLY64 | ||
|
|
||
| __SIZE_TYPE__ f0(void) { | ||
| return __builtin_wasm_page_size(); | ||
| // WEBASSEMBLY32: call {{i.*}} @llvm.wasm.page.size.i32() | ||
| // WEBASSEMBLY64: call {{i.*}} @llvm.wasm.page.size.i64() | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,93 @@ | ||
| // RUN: %clang_cc1 -triple wasm32-unknown-unknown %s -emit-llvm -o - \ | ||
| // RUN: | FileCheck %s -check-prefix=WEBASSEMBLY32 | ||
| // RUN: %clang_cc1 -triple wasm64-unknown-unknown %s -emit-llvm -o - \ | ||
| // RUN: | FileCheck %s -check-prefix=WEBASSEMBLY64 | ||
|
|
||
| // Basic argument/attribute tests for WebAssembly | ||
|
|
||
| // WEBASSEMBLY32: define void @f0(i32 %i, i32 %j, i64 %k, double %l, double %m) | ||
| // WEBASSEMBLY64: define void @f0(i32 %i, i64 %j, i64 %k, double %l, double %m) | ||
| void f0(int i, long j, long long k, double l, long double m) {} | ||
|
|
||
| typedef struct { | ||
| int aa; | ||
| int bb; | ||
| } s1; | ||
| // Structs should be passed byval and not split up. | ||
| // WEBASSEMBLY32: define void @f1(%struct.s1* byval align 4 %i) | ||
| // WEBASSEMBLY64: define void @f1(%struct.s1* byval align 4 %i) | ||
| void f1(s1 i) {} | ||
|
|
||
| typedef struct { | ||
| int cc; | ||
| } s2; | ||
| // Single-element structs should be returned as the one element. | ||
| // WEBASSEMBLY32: define i32 @f2() | ||
| // WEBASSEMBLY64: define i32 @f2() | ||
| s2 f2() { | ||
| s2 foo; | ||
| return foo; | ||
| } | ||
|
|
||
| typedef struct { | ||
| int cc; | ||
| int dd; | ||
| } s3; | ||
| // Structs should be returned sret and not simplified by the frontend. | ||
| // WEBASSEMBLY32: define void @f3(%struct.s3* noalias sret %agg.result) | ||
| // WEBASSEMBLY64: define void @f3(%struct.s3* noalias sret %agg.result) | ||
| s3 f3() { | ||
| s3 foo; | ||
| return foo; | ||
| } | ||
|
|
||
| // WEBASSEMBLY32: define void @f4(i64 %i) | ||
| // WEBASSEMBLY64: define void @f4(i64 %i) | ||
| void f4(long long i) {} | ||
|
|
||
| // i8/i16 should be signext, i32 and higher should not. | ||
| // WEBASSEMBLY32: define void @f5(i8 signext %a, i16 signext %b) | ||
| // WEBASSEMBLY64: define void @f5(i8 signext %a, i16 signext %b) | ||
| void f5(char a, short b) {} | ||
|
|
||
| // WEBASSEMBLY32: define void @f6(i8 zeroext %a, i16 zeroext %b) | ||
| // WEBASSEMBLY64: define void @f6(i8 zeroext %a, i16 zeroext %b) | ||
| void f6(unsigned char a, unsigned short b) {} | ||
|
|
||
|
|
||
| enum my_enum { | ||
| ENUM1, | ||
| ENUM2, | ||
| ENUM3, | ||
| }; | ||
| // Enums should be treated as the underlying i32. | ||
| // WEBASSEMBLY32: define void @f7(i32 %a) | ||
| // WEBASSEMBLY64: define void @f7(i32 %a) | ||
| void f7(enum my_enum a) {} | ||
|
|
||
| enum my_big_enum { | ||
| ENUM4 = 0xFFFFFFFFFFFFFFFF, | ||
| }; | ||
| // Big enums should be treated as the underlying i64. | ||
| // WEBASSEMBLY32: define void @f8(i64 %a) | ||
| // WEBASSEMBLY64: define void @f8(i64 %a) | ||
| void f8(enum my_big_enum a) {} | ||
|
|
||
| union simple_union { | ||
| int a; | ||
| char b; | ||
| }; | ||
| // Unions should be passed as byval structs. | ||
| // WEBASSEMBLY32: define void @f9(%union.simple_union* byval align 4 %s) | ||
| // WEBASSEMBLY64: define void @f9(%union.simple_union* byval align 4 %s) | ||
| void f9(union simple_union s) {} | ||
|
|
||
| typedef struct { | ||
| int b4 : 4; | ||
| int b3 : 3; | ||
| int b8 : 8; | ||
| } bitfield1; | ||
| // Bitfields should be passed as byval structs. | ||
| // WEBASSEMBLY32: define void @f10(%struct.bitfield1* byval align 4 %bf1) | ||
| // WEBASSEMBLY64: define void @f10(%struct.bitfield1* byval align 4 %bf1) | ||
| void f10(bitfield1 bf1) {} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| // RUN: %clang_cc1 -triple wasm32-unknown-unknown %s -fsyntax-only -verify | ||
| // RUN: %clang_cc1 -triple wasm64-unknown-unknown %s -fsyntax-only -verify | ||
|
|
||
| void __attribute__((regparm(2))) fc_f1(int i, int j, int k) {} // expected-error{{'regparm' is not valid on this platform}} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,54 @@ | ||
| // RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -o - %s \ | ||
| // RUN: | FileCheck %s -check-prefix=WEBASSEMBLY32 | ||
| // RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -o - %s \ | ||
| // RUN: | FileCheck %s -check-prefix=WEBASSEMBLY64 | ||
|
|
||
| // Test that we don't create common blocks. | ||
| int tentative; | ||
| // WEBASSEMBLY32: @tentative = global i32 0, align 4 | ||
| // WEBASSEMBLY64: @tentative = global i32 0, align 4 | ||
|
|
||
| // Test that WebAssembly uses the ARM-style ABI in which the static | ||
| // variable's guard variable is tested via "load i8 and test the | ||
| // bottom bit" rather than the Itanium/x86 ABI which uses "load i8 | ||
| // and compare with zero". | ||
| int f(); | ||
| void g() { | ||
| static int a = f(); | ||
| } | ||
| // WEBASSEMBLY32-LABEL: @_Z1gv() | ||
| // WEBASSEMBLY32: %[[R0:.+]] = load atomic i8, i8* bitcast (i32* @_ZGVZ1gvE1a to i8*) acquire, align 1 | ||
| // WEBASSEMBLY32-NEXT: %[[R1:.+]] = and i8 %[[R0]], 1 | ||
| // WEBASSEMBLY32-NEXT: %[[R2:.+]] = icmp eq i8 %[[R1]], 0 | ||
| // WEBASSEMBLY32-NEXT: br i1 %[[R2]], label %[[CHECK:.+]], label %[[END:.+]] | ||
| // WEBASSEMBLY32: [[CHECK]] | ||
| // WEBASSEMBLY32: call i32 @__cxa_guard_acquire | ||
| // WEBASSEMBLY32: [[END]] | ||
| // WEBASSEMBLY32: call void @__cxa_guard_release | ||
| // | ||
| // WEBASSEMBLY64-LABEL: @_Z1gv() | ||
| // WEBASSEMBLY64: %[[R0:.+]] = load atomic i8, i8* bitcast (i64* @_ZGVZ1gvE1a to i8*) acquire, align 1 | ||
| // WEBASSEMBLY64-NEXT: %[[R1:.+]] = and i8 %[[R0]], 1 | ||
| // WEBASSEMBLY64-NEXT: %[[R2:.+]] = icmp eq i8 %[[R1]], 0 | ||
| // WEBASSEMBLY64-NEXT: br i1 %[[R2]], label %[[CHECK:.+]], label %[[END:.+]] | ||
| // WEBASSEMBLY64: [[CHECK]] | ||
| // WEBASSEMBLY64: call i32 @__cxa_guard_acquire | ||
| // WEBASSEMBLY64: [[END]] | ||
| // WEBASSEMBLY64: call void @__cxa_guard_release | ||
|
|
||
| // Test various aspects of static constructor calls. | ||
| struct A { | ||
| A(); | ||
| }; | ||
|
|
||
| A theA; | ||
|
|
||
| // WEBASSEMBLY32: define internal void @__cxx_global_var_init() #0 section ".text.__startup" { | ||
| // WEBASSEMBLY32: call %struct.A* @_ZN1AC1Ev(%struct.A* @theA) | ||
| // WEBASSEMBLY32: define internal void @_GLOBAL__sub_I_static_init_wasm.cpp() #0 section ".text.__startup" { | ||
| // WEBASSEMBLY32: call void @__cxx_global_var_init() | ||
| // | ||
| // WEBASSEMBLY64: define internal void @__cxx_global_var_init() #0 section ".text.__startup" { | ||
| // WEBASSEMBLY64: call %struct.A* @_ZN1AC1Ev(%struct.A* @theA) | ||
| // WEBASSEMBLY64: define internal void @_GLOBAL__sub_I_static_init_wasm.cpp() #0 section ".text.__startup" { | ||
| // WEBASSEMBLY64: call void @__cxx_global_var_init() |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,100 @@ | ||
| // RUN: %clang_cc1 -O1 -triple wasm32-unknown-unknown -emit-llvm -o - %s \ | ||
| // RUN: | FileCheck %s | ||
| // RUN: %clang_cc1 -O1 -triple wasm64-unknown-unknown -emit-llvm -o - %s \ | ||
| // RUN: | FileCheck %s | ||
|
|
||
| #define concat_(x, y) x ## y | ||
| #define concat(x, y) concat_(x, y) | ||
|
|
||
| #define test(T) \ | ||
| T forward(T x) { return x; } \ | ||
| void use(T x); \ | ||
| T concat(def_, T)(void); \ | ||
| void concat(test_, T)(void) { use(concat(def_, T)()); } | ||
|
|
||
| struct one_field { double d; }; | ||
| test(one_field); | ||
| // CHECK: define double @_Z7forward9one_field(double %{{.*}}) | ||
| // | ||
| // CHECK: define void @_Z14test_one_fieldv() | ||
| // CHECK: %[[call:.*]] = tail call double @_Z13def_one_fieldv() | ||
| // CHECK: tail call void @_Z3use9one_field(double %[[call]]) | ||
| // CHECK: ret void | ||
| // | ||
| // CHECK: declare void @_Z3use9one_field(double) | ||
| // CHECK: declare double @_Z13def_one_fieldv() | ||
|
|
||
| struct two_fields { double d, e; }; | ||
| test(two_fields); | ||
| // CHECK: define void @_Z7forward10two_fields(%struct.two_fields* noalias nocapture sret %{{.*}}, %struct.two_fields* byval nocapture readonly align 8 %{{.*}}) | ||
| // | ||
| // CHECK: define void @_Z15test_two_fieldsv() | ||
| // CHECK: %[[tmp:.*]] = alloca %struct.two_fields, align 8 | ||
| // CHECK: call void @_Z14def_two_fieldsv(%struct.two_fields* nonnull sret %[[tmp]]) | ||
| // CHECK: call void @_Z3use10two_fields(%struct.two_fields* byval nonnull align 8 %[[tmp]]) | ||
| // CHECK: ret void | ||
| // | ||
| // CHECK: declare void @_Z3use10two_fields(%struct.two_fields* byval align 8) | ||
| // CHECK: declare void @_Z14def_two_fieldsv(%struct.two_fields* sret) | ||
|
|
||
| struct copy_ctor { | ||
| double d; | ||
| copy_ctor(copy_ctor const&); | ||
| }; | ||
| test(copy_ctor); | ||
| // CHECK: define void @_Z7forward9copy_ctor(%struct.copy_ctor* noalias sret %{{.*}}, %struct.copy_ctor* align 8 %{{.*}}) | ||
| // | ||
| // CHECK: declare %struct.copy_ctor* @_ZN9copy_ctorC1ERKS_(%struct.copy_ctor* returned, %struct.copy_ctor* dereferenceable(8)) | ||
| // | ||
| // CHECK: define void @_Z14test_copy_ctorv() | ||
| // CHECK: %[[tmp:.*]] = alloca %struct.copy_ctor, align 8 | ||
| // CHECK: call void @_Z13def_copy_ctorv(%struct.copy_ctor* nonnull sret %[[tmp]]) | ||
| // CHECK: call void @_Z3use9copy_ctor(%struct.copy_ctor* nonnull align 8 %[[tmp]]) | ||
| // CHECK: ret void | ||
| // | ||
| // CHECK: declare void @_Z3use9copy_ctor(%struct.copy_ctor* align 8) | ||
| // CHECK: declare void @_Z13def_copy_ctorv(%struct.copy_ctor* sret) | ||
|
|
||
| struct __attribute__((aligned(16))) aligned_copy_ctor { | ||
| double d, e; | ||
| aligned_copy_ctor(aligned_copy_ctor const&); | ||
| }; | ||
| test(aligned_copy_ctor); | ||
| // CHECK: define void @_Z7forward17aligned_copy_ctor(%struct.aligned_copy_ctor* noalias sret %{{.*}}, %struct.aligned_copy_ctor* align 16 %{{.*}}) | ||
| // | ||
| // CHECK: declare %struct.aligned_copy_ctor* @_ZN17aligned_copy_ctorC1ERKS_(%struct.aligned_copy_ctor* returned, %struct.aligned_copy_ctor* dereferenceable(16)) | ||
| // | ||
| // CHECK: define void @_Z22test_aligned_copy_ctorv() | ||
| // CHECK: %[[tmp:.*]] = alloca %struct.aligned_copy_ctor, align 16 | ||
| // CHECK: call void @_Z21def_aligned_copy_ctorv(%struct.aligned_copy_ctor* nonnull sret %[[tmp]]) | ||
| // CHECK: call void @_Z3use17aligned_copy_ctor(%struct.aligned_copy_ctor* nonnull align 16 %[[tmp]]) | ||
| // CHECK: ret void | ||
| // | ||
| // CHECK: declare void @_Z3use17aligned_copy_ctor(%struct.aligned_copy_ctor* align 16) | ||
| // CHECK: declare void @_Z21def_aligned_copy_ctorv(%struct.aligned_copy_ctor* sret) | ||
|
|
||
| struct empty {}; | ||
| test(empty); | ||
| // CHECK: define void @_Z7forward5empty() | ||
| // | ||
| // CHECK: define void @_Z10test_emptyv() | ||
| // CHECK: tail call void @_Z9def_emptyv() | ||
| // CHECK: tail call void @_Z3use5empty() | ||
| // CHECK: ret void | ||
| // | ||
| // CHECK: declare void @_Z3use5empty() | ||
| // CHECK: declare void @_Z9def_emptyv() | ||
|
|
||
| struct one_bitfield { | ||
| int d:3; | ||
| }; | ||
| test(one_bitfield); | ||
| // CHECK: define i32 @_Z7forward12one_bitfield(i32 %{{.*}}) | ||
| // | ||
| // CHECK: define void @_Z17test_one_bitfieldv() | ||
| // CHECK: %[[call:.*]] = tail call i32 @_Z16def_one_bitfieldv() | ||
| // CHECK: tail call void @_Z3use12one_bitfield(i32 %[[call]]) | ||
| // CHECK: ret void | ||
| // | ||
| // CHECK: declare void @_Z3use12one_bitfield(i32) | ||
| // CHECK: declare i32 @_Z16def_one_bitfieldv() |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,119 @@ | ||
| // RUN: %clang -target wasm32-unknown-unknown -### %s -emit-llvm-only -c 2>&1 \ | ||
| // RUN: | FileCheck %s -check-prefix=ECHO | ||
| // RUN: %clang -target wasm32-unknown-unknown %s -emit-llvm -S -o - \ | ||
| // RUN: | FileCheck %s | ||
| // RUN: %clang -target wasm32-unknown-unknown %s -emit-llvm -S -pthread -o - \ | ||
| // RUN: | FileCheck %s -check-prefix=THREADS | ||
|
|
||
| // ECHO: {{.*}} "-cc1" {{.*}}wasm32-unknown-unknown.c | ||
|
|
||
| typedef __builtin_va_list va_list; | ||
| typedef __SIZE_TYPE__ size_t; | ||
| typedef __PTRDIFF_TYPE__ ptrdiff_t; | ||
|
|
||
| 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: _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: SwitchILi4 | ||
| Switch<sizeof(va_list)>(); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,119 @@ | ||
| // RUN: %clang -target wasm64-unknown-unknown -### %s -emit-llvm-only -c 2>&1 \ | ||
| // RUN: | FileCheck %s -check-prefix=ECHO | ||
| // RUN: %clang -target wasm64-unknown-unknown %s -emit-llvm -S -o - \ | ||
| // RUN: | FileCheck %s | ||
| // RUN: %clang -target wasm64-unknown-unknown %s -emit-llvm -S -pthread -o - \ | ||
| // RUN: | FileCheck %s -check-prefix=THREADS | ||
|
|
||
| // ECHO: {{.*}} "-cc1" {{.*}}wasm64-unknown-unknown.c | ||
|
|
||
| typedef __builtin_va_list va_list; | ||
| typedef __SIZE_TYPE__ size_t; | ||
| typedef __PTRDIFF_TYPE__ ptrdiff_t; | ||
|
|
||
| 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 8 | ||
| int align_l = __alignof(long); | ||
|
|
||
| // CHECK: @align_ll = global i32 8 | ||
| int align_ll = __alignof(long long); | ||
|
|
||
| // CHECK: @align_p = global i32 8 | ||
| 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 8 | ||
| int align_vl = __alignof(va_list); | ||
|
|
||
| // 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: i64 @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: i64 @check_ulong() | ||
| unsigned long check_ulong() { return 0; } | ||
|
|
||
| // CHECK: i64 @check_ulonglong() | ||
| unsigned long long check_ulonglong() { return 0; } | ||
|
|
||
| // CHECK: i64 @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: SwitchILi8 | ||
| Switch<sizeof(void*)>(); | ||
|
|
||
| // CHECK: SwitchILi8 | ||
| Switch<sizeof(long long)>(); | ||
|
|
||
| // CHECK: SwitchILi8 | ||
| Switch<sizeof(va_list)>(); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| // RUN: %clang -E -dM %s -o - 2>&1 \ | ||
| // RUN: -target wasm32-unknown-unknown -msimd128 \ | ||
| // RUN: | FileCheck %s -check-prefix=SIMD128 | ||
| // RUN: %clang -E -dM %s -o - 2>&1 \ | ||
| // RUN: -target wasm64-unknown-unknown -msimd128 \ | ||
| // RUN: | FileCheck %s -check-prefix=SIMD128 | ||
| // | ||
| // SIMD128:#define __wasm_simd128__ 1{{$}} | ||
| // | ||
| // RUN: %clang -E -dM %s -o - 2>&1 \ | ||
| // RUN: -target wasm32-unknown-unknown -mcpu=mvp \ | ||
| // RUN: | FileCheck %s -check-prefix=MVP | ||
| // RUN: %clang -E -dM %s -o - 2>&1 \ | ||
| // RUN: -target wasm64-unknown-unknown -mcpu=mvp \ | ||
| // RUN: | FileCheck %s -check-prefix=MVP | ||
| // | ||
| // MVP-NOT:#define __wasm_simd128__ | ||
| // | ||
| // RUN: %clang -E -dM %s -o - 2>&1 \ | ||
| // RUN: -target wasm32-unknown-unknown -mcpu=bleeding-edge \ | ||
| // RUN: | FileCheck %s -check-prefix=BLEEDING_EDGE | ||
| // RUN: %clang -E -dM %s -o - 2>&1 \ | ||
| // RUN: -target wasm64-unknown-unknown -mcpu=bleeding-edge \ | ||
| // RUN: | FileCheck %s -check-prefix=BLEEDING_EDGE | ||
| // | ||
| // BLEEDING_EDGE:#define __wasm_simd128__ 1{{$}} | ||
| // | ||
| // RUN: %clang -E -dM %s -o - 2>&1 \ | ||
| // RUN: -target wasm32-unknown-unknown -mcpu=bleeding-edge -mno-simd128 \ | ||
| // RUN: | FileCheck %s -check-prefix=BLEEDING_EDGE_NO_SIMD128 | ||
| // RUN: %clang -E -dM %s -o - 2>&1 \ | ||
| // RUN: -target wasm64-unknown-unknown -mcpu=bleeding-edge -mno-simd128 \ | ||
| // RUN: | FileCheck %s -check-prefix=BLEEDING_EDGE_NO_SIMD128 | ||
| // | ||
| // BLEEDING_EDGE_NO_SIMD128-NOT:#define __wasm_simd128__ |