================
@@ -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

Reply via email to