================ @@ -16,3 +18,48 @@ void helper(externref_t); void handle(externref_t obj) { helper(obj); } + + +// CHECK-LABEL: @handle_2( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[OBJ_ADDR:%.*]] = alloca ptr addrspace(10), align 1 +// CHECK-NEXT: store ptr addrspace(10) [[OBJ:%.*]], ptr [[OBJ_ADDR]], align 1 +// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(10), ptr [[OBJ_ADDR]], align 1 +// CHECK-NEXT: call void @helper_2(ptr addrspace(10) [[TMP0]]) +// CHECK-NEXT: ret void +// +void handle_2(nn_externref_t obj) { + helper_2(obj); +} + + +nn_externref_t socketpair_js_concat(nn_externref_t, nn_externref_t) +__attribute__((import_module("wasm:js-string"), import_name("concat"))); + +nn_externref_t get_string_ref(const char *s); +void print_string_ref(nn_externref_t); + +// CHECK-LABEL: @socketpair_example( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[STR1:%.*]] = alloca ptr addrspace(10), align 1 +// CHECK-NEXT: [[STR2:%.*]] = alloca ptr addrspace(10), align 1 +// CHECK-NEXT: [[RESULT:%.*]] = alloca ptr addrspace(10), align 1 +// CHECK-NEXT: [[CALL:%.*]] = call ptr addrspace(10) @get_string_ref(ptr noundef @.str) +// CHECK-NEXT: store ptr addrspace(10) [[CALL]], ptr [[STR1]], align 1 +// CHECK-NEXT: [[CALL1:%.*]] = call ptr addrspace(10) @get_string_ref(ptr noundef @.str.1) +// CHECK-NEXT: store ptr addrspace(10) [[CALL1]], ptr [[STR2]], align 1 +// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(10), ptr [[STR1]], align 1 +// CHECK-NEXT: [[TMP1:%.*]] = load ptr addrspace(10), ptr [[STR2]], align 1 +// CHECK-NEXT: [[CALL2:%.*]] = call ptr addrspace(10) @socketpair_js_concat(ptr addrspace(10) [[TMP0]], ptr addrspace(10) [[TMP1]]) +// CHECK-NEXT: store ptr addrspace(10) [[CALL2]], ptr [[RESULT]], align 1 +// CHECK-NEXT: [[TMP2:%.*]] = load ptr addrspace(10), ptr [[RESULT]], align 1 +// CHECK-NEXT: call void @print_string_ref(ptr addrspace(10) [[TMP2]]) +// CHECK-NEXT: ret void +// +void socketpair_example() { + nn_externref_t str1 = get_string_ref("Hello, "); + nn_externref_t str2 = get_string_ref("world!"); + nn_externref_t result = socketpair_js_concat(str1, str2); + print_string_ref(result); +} + ---------------- pmatos wrote:
It would be interesting to have some tests to ensure the semantics of non-null externref. For example, you can't construct a null and assign it to non-null externref. You cannot assign an nullable externref to a non-nullable externref, however the opposite should work. You should be able to assign a non-nullable to a nullable. https://github.com/llvm/llvm-project/pull/148935 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits