[lli] Add new testcases for lli.
authorLang Hames <lhames@gmail.com>
Fri, 12 May 2023 00:41:30 +0000 (10:41 +1000)
committerLang Hames <lhames@gmail.com>
Fri, 12 May 2023 05:40:04 +0000 (15:40 +1000)
These are an attempt to more systematically test the features covered by the
MCJIT regression tests (though these tests apply to lli's default mode, which
is now -jit-kind=orc).

This first batch of tests includes a basic smoke test (trivial-return-zero),
tests for single function calls and data references, and alignment handling.

llvm/test/ExecutionEngine/Orc/global-variable-alignment.ll [new file with mode: 0644]
llvm/test/ExecutionEngine/Orc/trivial-call-to-function.ll [new file with mode: 0644]
llvm/test/ExecutionEngine/Orc/trivial-call-to-internal-function.ll [new file with mode: 0644]
llvm/test/ExecutionEngine/Orc/trivial-reference-to-global-variable.ll [new file with mode: 0644]
llvm/test/ExecutionEngine/Orc/trivial-reference-to-internal-variable-nonzeroinit.ll [new file with mode: 0644]
llvm/test/ExecutionEngine/Orc/trivial-reference-to-internal-variable-zeroinit.ll [new file with mode: 0644]
llvm/test/ExecutionEngine/Orc/trivial-return-zero.ll [new file with mode: 0644]

diff --git a/llvm/test/ExecutionEngine/Orc/global-variable-alignment.ll b/llvm/test/ExecutionEngine/Orc/global-variable-alignment.ll
new file mode 100644 (file)
index 0000000..eb5bdac
--- /dev/null
@@ -0,0 +1,27 @@
+; Check that lli respects alignment on global variables.
+;
+; Returns ((uint32_t)&B & 0x7) - A + C. Variables A and C have byte-alignment,
+; and are intended to increase the chance of misalignment, but don't contribute
+; to the result, since they have the same initial value.
+;
+; A failure may indicate a problem with alignment handling in the JIT linker or
+; JIT memory manager.
+;
+; RUN: %lli %s
+
+@A = internal global i8 1, align 1
+@B = global i64 1, align 8
+@C = internal global i8 1, align 1
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %0 = ptrtoint i8* @B to i32
+  %1 = and i32 %0, 7
+  %2 = load i8, i8* @A
+  %3 = zext i8 %2 to i32
+  %4 = add i32 %1, %3
+  %5 = load i8, i8* @B
+  %6 = zext i8 %5 to i32
+  %7 = sub i32 %4, %6
+  ret i32 %7
+}
diff --git a/llvm/test/ExecutionEngine/Orc/trivial-call-to-function.ll b/llvm/test/ExecutionEngine/Orc/trivial-call-to-function.ll
new file mode 100644 (file)
index 0000000..57e00a1
--- /dev/null
@@ -0,0 +1,17 @@
+; Check that we can execute a program that makes a single call to an external
+; linkage function that returns zero.
+;
+; Failure may indicate a problem with branch, GOT, or PLT relocation handling
+; in the JIT linker.
+;
+; RUN: %lli %s
+
+define i32 @foo() {
+  ret i32 0
+}
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %0 = call i32 @foo()
+  ret i32 %0
+}
diff --git a/llvm/test/ExecutionEngine/Orc/trivial-call-to-internal-function.ll b/llvm/test/ExecutionEngine/Orc/trivial-call-to-internal-function.ll
new file mode 100644 (file)
index 0000000..c472ae0
--- /dev/null
@@ -0,0 +1,17 @@
+; Check that we can execute a program that makes a single call to an internal
+; linkage function that returns zero.
+;
+; Failure may indicate a problem with branch relocation handling in the JIT
+; linker.
+;
+; RUN: %lli %s
+
+define internal i32 @foo() {
+  ret i32 0
+}
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %0 = call i32 @foo()
+  ret i32 %0
+}
diff --git a/llvm/test/ExecutionEngine/Orc/trivial-reference-to-global-variable.ll b/llvm/test/ExecutionEngine/Orc/trivial-reference-to-global-variable.ll
new file mode 100644 (file)
index 0000000..f609636
--- /dev/null
@@ -0,0 +1,16 @@
+; Check that we can execute a program that makes a single reference to an
+; external linkage global variable that is initialized to a non-zero value.
+;
+; Failure may indicate a problem with data-section or GOT handling.
+;
+; RUN: %lli %s
+
+@X = global i32 1
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %0 = load i32, i32* @X
+  %1 = icmp ne i32 %0, 1
+  %2 = zext i1 %1 to i32
+  ret i32 %2
+}
diff --git a/llvm/test/ExecutionEngine/Orc/trivial-reference-to-internal-variable-nonzeroinit.ll b/llvm/test/ExecutionEngine/Orc/trivial-reference-to-internal-variable-nonzeroinit.ll
new file mode 100644 (file)
index 0000000..a18b106
--- /dev/null
@@ -0,0 +1,16 @@
+; Check that we can execute a program that makes a single reference to an
+; internal linkage global variable that is initialized to a non-zero value.
+;
+; Failure may indicate a problem with data-section handling.
+;
+; RUN: %lli %s
+
+@X = internal global i32 1
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %0 = load i32, i32* @X
+  %1 = icmp ne i32 %0, 1
+  %2 = zext i1 %1 to i32
+  ret i32 %2
+}
diff --git a/llvm/test/ExecutionEngine/Orc/trivial-reference-to-internal-variable-zeroinit.ll b/llvm/test/ExecutionEngine/Orc/trivial-reference-to-internal-variable-zeroinit.ll
new file mode 100644 (file)
index 0000000..7cdb484
--- /dev/null
@@ -0,0 +1,15 @@
+; Check that we can execute a program that makes a single reference to an
+; internal linkage global variable that is zero-initialized.
+;
+; Failure may indicate a problem with zero-initialized sections, or data
+; sections more generally.
+;
+; RUN: %lli %s
+
+@X = internal global i32 0
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %0 = load i32, i32* @X
+  ret i32 %0
+}
diff --git a/llvm/test/ExecutionEngine/Orc/trivial-return-zero.ll b/llvm/test/ExecutionEngine/Orc/trivial-return-zero.ll
new file mode 100644 (file)
index 0000000..1ddefa4
--- /dev/null
@@ -0,0 +1,11 @@
+; Check that we can execute a program that does nothing and just returns zero.
+;
+; This is the simplest possible JIT smoke test. If it fails it indicates a
+; critical failure in the JIT (e.g. failure to set memory permissions) that's
+; likely to affect all programs.
+;
+; RUN: %lli %s
+
+define i32 @main(i32 %argc, i8** %argv)  {
+  ret i32 0
+}