[compiler-rt] 8be890b - [ORC-RT] Add two new jit-dlopen testcases, and switch to .c for dlopen tests.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 9 19:11:54 PST 2022


Author: Lang Hames
Date: 2022-02-10T14:11:46+11:00
New Revision: 8be890b8cd3624539568a01f1760171b2674f220

URL: https://github.com/llvm/llvm-project/commit/8be890b8cd3624539568a01f1760171b2674f220
DIFF: https://github.com/llvm/llvm-project/commit/8be890b8cd3624539568a01f1760171b2674f220.diff

LOG: [ORC-RT] Add two new jit-dlopen testcases, and switch to .c for dlopen tests.

We don't need precise control over the low-level behavior of these testcases so
C should be preferred for readability.

The new testcases test (1) the base dlopen case (running initializers and
deinitializers), and (2) the serial case of dlopen; dlclose; dlopen; dlclose,
where we expect the initializers and deinitializers to be run twice.

Added: 
    compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen-nested.c
    compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen.c
    compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-re-dlopen.c

Modified: 
    

Removed: 
    compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen.S


################################################################################
diff  --git a/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen-nested.c b/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen-nested.c
new file mode 100644
index 0000000000000..49d9fb6f37cd4
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen-nested.c
@@ -0,0 +1,55 @@
+// Test that __orc_rt_macho_jit_dlopen and __orc_rt_macho_jit_dlclose work as
+// expected for a dlopen; dlclose; dlopen; dlclose; sequence: the first dlclose
+// should run destructors, and the second dlopen should re-run initializers.
+//
+// RUN: %clang -c -o %t.inits.o %p/Inputs/standalone-ctor-and-cxa-atexit-dtor.S
+// RUN: %clang -c -o %t.test.o %s
+// RUN: %llvm_jitlink \
+// RUN:   -alias _dlopen=___orc_rt_macho_jit_dlopen \
+// RUN:   -alias _dlclose=___orc_rt_macho_jit_dlclose \
+// RUN:   %t.test.o -jd inits %t.inits.o -lmain | FileCheck %s
+
+// CHECK: entering main
+// CHECK-NEXT: first dlopen
+// CHECK-NEXT: constructor
+// CHECK-NEXT: second dlopen
+// CHECK-NEXT: first dlclose
+// CHECK-NEXT: second dlclose
+// CHECK-NEXT: destructor
+// CHECK-NEXT: leaving main
+
+int printf(const char * restrict format, ...);
+void *dlopen(const char* path, int mode);
+int dlclose(void *handle);
+
+int main(int argc, char *argv[]) {
+  printf("entering main\n");
+  printf("first dlopen\n");
+  void *H = dlopen("inits", 0);
+  if (!H) {
+    printf("failed\n");
+    return -1;
+  }
+  printf("second dlopen\n");
+  void *I = dlopen("inits", 0);
+  if (!I) {
+    printf("failed\n");
+    return -1;
+  }
+  if (I != H) {
+    printf("handles do not match\n");
+    return -1;
+  }
+  printf("first dlclose\n");
+  if (dlclose(I) == -1) {
+    printf("failed\n");
+    return -1;
+  }
+  printf("second dlclose\n");
+  if (dlclose(H) == -1) {
+    printf("failed\n");
+    return -1;
+  }
+  printf("leaving main\n");
+  return 0;
+}

diff  --git a/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen.S b/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen.S
deleted file mode 100644
index 5076f72486003..0000000000000
--- a/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen.S
+++ /dev/null
@@ -1,119 +0,0 @@
-// Test that __orc_rt_macho_jit_dlopen and __orc_rt_macho_jit_dlclose run
-// constructors and destructors as expected.
-//
-// This test calls dlopen and dlclose twice. We expect the inner calls to be
-// no-ops.
-//
-// RUN: %clang -c -o %t.inits.o %p/Inputs/standalone-ctor-and-cxa-atexit-dtor.S
-// RUN: %clang -c -o %t.test.o %s
-// RUN: %llvm_jitlink \
-// RUN:   -alias _dlopen=___orc_rt_macho_jit_dlopen \
-// RUN:   -alias _dlclose=___orc_rt_macho_jit_dlclose \
-// RUN:   %t.test.o -jd inits %t.inits.o -lmain | FileCheck %s
-//
-// CHECK: entering main
-// CHECK-NEXT: first dlopen
-// CHECK-NEXT: constructor
-// CHECK-NEXT: second dlopen
-// CHECK-NEXT: first dlclose
-// CHECK-NEXT: second dlclose
-// CHECK-NEXT: destructor
-// CHECK-NEXT: leaving main
-
-	.section	__TEXT,__text,regular,pure_instructions
-	.build_version macos, 12, 0	sdk_version 13, 0
-	.globl	_main
-	.p2align	4, 0x90
-_main:
-
-	pushq	%rbp
-	movq	%rsp, %rbp
-	pushq	%r15
-	pushq	%r14
-	pushq	%rbx
-	pushq	%rax
-	leaq	L_str(%rip), %rdi
-	callq	_puts
-	leaq	L_str.9(%rip), %rdi
-	callq	_puts
-	leaq	L_.str.2(%rip), %rdi
-	movl	$1, %esi
-	callq	_dlopen
-	movl	$-1, %r14d
-	leaq	L_str.17(%rip), %r15
-	testq	%rax, %rax
-	je	LBB0_6
-
-	movq	%rax, %rbx
-	leaq	L_str.11(%rip), %rdi
-	callq	_puts
-	leaq	L_.str.2(%rip), %rdi
-	movl	$1, %esi
-	callq	_dlopen
-	testq	%rax, %rax
-	je	LBB0_6
-
-	cmpq	%rbx, %rax
-	je	LBB0_4
-
-	leaq	L_str.18(%rip), %r15
-	jmp	LBB0_6
-LBB0_4:
-	leaq	L_str.13(%rip), %rdi
-	callq	_puts
-	movq	%rbx, %rdi
-	callq	_dlclose
-	cmpl	$-1, %eax
-	je	LBB0_6
-
-	leaq	L_str.14(%rip), %rdi
-	callq	_puts
-	movq	%rbx, %rdi
-	callq	_dlclose
-	xorl	%r14d, %r14d
-	cmpl	$-1, %eax
-	sete	%r14b
-	leaq	L_str.17(%rip), %rax
-	leaq	L_str.15(%rip), %r15
-	cmoveq	%rax, %r15
-	negl	%r14d
-LBB0_6:
-	movq	%r15, %rdi
-	callq	_puts
-	movl	%r14d, %eax
-	addq	$8, %rsp
-	popq	%rbx
-	popq	%r14
-	popq	%r15
-	popq	%rbp
-	retq
-
-	.section	__TEXT,__cstring,cstring_literals
-L_.str.2:
-	.asciz	"inits"
-
-L_str:
-	.asciz	"entering main"
-
-L_str.9:
-	.asciz	"first dlopen"
-
-L_str.11:
-	.asciz	"second dlopen"
-
-L_str.13:
-	.asciz	"first dlclose"
-
-L_str.14:
-	.asciz	"second dlclose"
-
-L_str.15:
-	.asciz	"leaving main"
-
-L_str.17:
-	.asciz	"failed"
-
-L_str.18:
-	.asciz	"handles do not match"
-
-.subsections_via_symbols

diff  --git a/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen.c b/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen.c
new file mode 100644
index 0000000000000..ee9b9890934ca
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-dlopen.c
@@ -0,0 +1,34 @@
+// Test that __orc_rt_macho_jit_dlopen and __orc_rt_macho_jit_dlclose work as
+// expected for a straightforward dlopen; dlclose sequence: first the
+// constructors should be run, then destructors.
+//
+// RUN: %clang -c -o %t.inits.o %p/Inputs/standalone-ctor-and-cxa-atexit-dtor.S
+// RUN: %clang -c -o %t.test.o %s
+// RUN: %llvm_jitlink \
+// RUN:   -alias _dlopen=___orc_rt_macho_jit_dlopen \
+// RUN:   -alias _dlclose=___orc_rt_macho_jit_dlclose \
+// RUN:   %t.test.o -jd inits %t.inits.o -lmain | FileCheck %s
+
+// CHECK: entering main
+// CHECK-NEXT: constructor
+// CHECK-NEXT: destructor
+// CHECK-NEXT: leaving main
+
+int printf(const char * restrict format, ...);
+void *dlopen(const char* path, int mode);
+int dlclose(void *handle);
+
+int main(int argc, char *argv[]) {
+  printf("entering main\n");
+  void *H = dlopen("inits", 0);
+  if (!H) {
+    printf("failed\n");
+    return -1;
+  }
+  if (dlclose(H) == -1) {
+    printf("failed\n");
+    return -1;
+  }
+  printf("leaving main\n");
+  return 0;
+}

diff  --git a/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-re-dlopen.c b/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-re-dlopen.c
new file mode 100644
index 0000000000000..1f3c88bf9b43d
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Darwin/x86-64/trivial-jit-re-dlopen.c
@@ -0,0 +1,45 @@
+// Test that __orc_rt_macho_jit_dlopen and __orc_rt_macho_jit_dlclose work as
+// expected for a dlopen; dlclose; dlopen; dlclose; sequence: the first dlclose
+// should run destructors, and the second dlopen should re-run initializers.
+//
+// RUN: %clang -c -o %t.inits.o %p/Inputs/standalone-ctor-and-cxa-atexit-dtor.S
+// RUN: %clang -c -o %t.test.o %s
+// RUN: %llvm_jitlink \
+// RUN:   -alias _dlopen=___orc_rt_macho_jit_dlopen \
+// RUN:   -alias _dlclose=___orc_rt_macho_jit_dlclose \
+// RUN:   %t.test.o -jd inits %t.inits.o -lmain | FileCheck %s
+
+// CHECK: entering main
+// CHECK-NEXT: constructor
+// CHECK-NEXT: destructor
+// CHECK-NEXT: constructor
+// CHECK-NEXT: destructor
+// CHECK-NEXT: leaving main
+
+int printf(const char * restrict format, ...);
+void *dlopen(const char* path, int mode);
+int dlclose(void *handle);
+
+int main(int argc, char *argv[]) {
+  printf("entering main\n");
+  void *H = dlopen("inits", 0);
+  if (!H) {
+    printf("failed\n");
+    return -1;
+  }
+  if (dlclose(H) == -1) {
+    printf("failed\n");
+    return -1;
+  }
+  H = dlopen("inits", 0);
+  if (!H) {
+    printf("failed\n");
+    return -1;
+  }
+  if (dlclose(H) == -1) {
+    printf("failed\n");
+    return -1;
+  }
+  printf("leaving main\n");
+  return 0;
+}


        


More information about the llvm-commits mailing list