summaryrefslogtreecommitdiffstats
path: root/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:13 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:13 +0000
commit218caa410aa38c29984be31a5229b9fa717560ee (patch)
treec54bd55eeb6e4c508940a30e94c0032fbd45d677 /tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave
parentReleasing progress-linux version 1.67.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-218caa410aa38c29984be31a5229b9fa717560ee.tar.xz
rustc-218caa410aa38c29984be31a5229b9fa717560ee.zip
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave')
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/Cargo.toml12
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs30
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c18
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo_asm.s7
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo_cxx.cpp21
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/CMakeLists.txt33
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo.c26
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo_asm.s7
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo_cxx.cpp29
-rw-r--r--tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs49
10 files changed, 232 insertions, 0 deletions
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/Cargo.toml b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/Cargo.toml
new file mode 100644
index 000000000..3a97c37e9
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "enclave"
+version = "0.1.0"
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+
+[build-dependencies]
+cc = "1.0"
+cmake = "0.1"
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs
new file mode 100644
index 000000000..3a7aa1be8
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs
@@ -0,0 +1,30 @@
+fn main() {
+ cc::Build::new()
+ .file("foo.c")
+ .compile("foo_c");
+
+ cc::Build::new()
+ .file("foo_asm.s")
+ .compile("foo_asm");
+
+ cc::Build::new()
+ .cpp(true)
+ .cpp_set_stdlib(None)
+ .file("foo_cxx.cpp")
+ .compile("foo_cxx");
+
+ // When the cmake crate detects the clang compiler, it passes the
+ // "--target" argument to the linker which subsequently fails. The
+ // `CMAKE_C_COMPILER_FORCED` option makes sure that `cmake` does not
+ // tries to test the compiler. From version 3.6 the option
+ // `CMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY` can be used
+ // https://cmake.org/cmake/help/v3.5/module/CMakeForceCompiler.html
+ let dst = cmake::Config::new("libcmake_foo")
+ .build_target("cmake_foo")
+ .define("CMAKE_C_COMPILER_FORCED", "1")
+ .define("CMAKE_CXX_COMPILER_FORCED", "1")
+ .define("CMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY", "1")
+ .build();
+ println!("cargo:rustc-link-search=native={}/build/", dst.display());
+ println!("cargo:rustc-link-lib=static=cmake_foo");
+}
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c
new file mode 100644
index 000000000..dd76d4f30
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c
@@ -0,0 +1,18 @@
+int cc_plus_one_c(int *arg) {
+ return *arg + 1;
+}
+
+int cc_plus_one_c_asm(int *arg) {
+ int value = 0;
+
+ asm volatile ( " movl (%1), %0\n"
+ " inc %0\n"
+ " jmp 1f\n"
+ " retq\n" // never executed, but a shortcut to determine how
+ // the assembler deals with `ret` instructions
+ "1:\n"
+ : "=r"(value)
+ : "r"(arg) );
+
+ return value;
+}
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo_asm.s b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo_asm.s
new file mode 100644
index 000000000..6d56214e8
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo_asm.s
@@ -0,0 +1,7 @@
+ .text
+ .global cc_plus_one_asm
+ .type cc_plus_one_asm, @function
+cc_plus_one_asm:
+ movl (%rdi), %eax
+ inc %eax
+ retq
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo_cxx.cpp b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo_cxx.cpp
new file mode 100644
index 000000000..ac6f64ac4
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo_cxx.cpp
@@ -0,0 +1,21 @@
+extern "C" int cc_plus_one_cxx(int *arg);
+extern "C" int cc_plus_one_cxx_asm(int *arg);
+
+int cc_plus_one_cxx(int *arg) {
+ return *arg + 1;
+}
+
+int cc_plus_one_cxx_asm(int *arg) {
+ int value = 0;
+
+ asm volatile ( " movl (%1), %0\n"
+ " inc %0\n"
+ " jmp 1f\n"
+ " retq\n" // never executed, but a shortcut to determine how
+ // the assembler deals with `ret` instructions
+ "1:\n"
+ : "=r"(value)
+ : "r"(arg) );
+
+ return value;
+}
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/CMakeLists.txt b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/CMakeLists.txt
new file mode 100644
index 000000000..27cdf2ecf
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/CMakeLists.txt
@@ -0,0 +1,33 @@
+enable_language(C CXX ASM)
+
+set(C_SOURCES
+ src/foo.c
+ )
+
+set_source_files_properties(${C_SOURCES}
+ PROPERTIES
+ LANGUAGE C)
+
+set(CXX_SOURCES
+ src/foo_cxx.cpp
+ )
+
+set_source_files_properties(${CXX_SOURCES}
+ PROPERTIES
+ LANGUAGE CXX)
+
+set(ASM_SOURCES
+ src/foo_asm.s
+ )
+
+set_source_files_properties(${ASM_SOURCES}
+ PROPERTIES
+ LANGUAGE ASM)
+
+set(SOURCES
+ ${C_SOURCES}
+ ${CXX_SOURCES}
+ ${ASM_SOURCES})
+
+add_library(cmake_foo STATIC
+ ${SOURCES})
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo.c b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo.c
new file mode 100644
index 000000000..c3b731a2d
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo.c
@@ -0,0 +1,26 @@
+int cmake_plus_one_c(int *arg) {
+ return *arg + 1;
+}
+
+int cmake_plus_one_c_asm(int *arg) {
+ int value = 0;
+
+ asm volatile ( " movl (%1), %0\n"
+ " inc %0\n"
+ " jmp 1f\n"
+ " retq\n" // never executed, but a shortcut to determine how
+ // the assembler deals with `ret` instructions
+ "1:\n"
+ : "=r"(value)
+ : "r"(arg) );
+
+ return value;
+}
+
+asm(".text\n"
+" .global cmake_plus_one_c_global_asm\n"
+" .type cmake_plus_one_c_global_asm, @function\n"
+"cmake_plus_one_c_global_asm:\n"
+" movl (%rdi), %eax\n"
+" inc %eax\n"
+" retq\n" );
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo_asm.s b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo_asm.s
new file mode 100644
index 000000000..64b6b430e
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo_asm.s
@@ -0,0 +1,7 @@
+ .text
+ .global cmake_plus_one_asm
+ .type cmake_plus_one_asm, @function
+cmake_plus_one_asm:
+ movl (%rdi), %eax
+ inc %eax
+ retq
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo_cxx.cpp b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo_cxx.cpp
new file mode 100644
index 000000000..824e2afeb
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/libcmake_foo/src/foo_cxx.cpp
@@ -0,0 +1,29 @@
+extern "C" int cmake_plus_one_cxx(int *arg);
+extern "C" int cmake_plus_one_cxx_asm(int *arg);
+
+int cmake_plus_one_cxx(int *arg) {
+ return *arg + 1;
+}
+
+int cmake_plus_one_cxx_asm(int *arg) {
+ int value = 0;
+
+ asm volatile ( " movl (%1), %0\n"
+ " inc %0\n"
+ " jmp 1f\n"
+ " retq\n" // never executed, but a shortcut to determine how
+ // the assembler deals with `ret` instructions
+ "1:\n"
+ : "=r"(value)
+ : "r"(arg) );
+
+ return value;
+}
+
+asm(".text\n"
+" .global cmake_plus_one_cxx_global_asm\n"
+" .type cmake_plus_one_cxx_global_asm, @function\n"
+"cmake_plus_one_cxx_global_asm:\n"
+" movl (%rdi), %eax\n"
+" inc %eax\n"
+" retq\n" );
diff --git a/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs
new file mode 100644
index 000000000..cde38aacf
--- /dev/null
+++ b/tests/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs
@@ -0,0 +1,49 @@
+std::arch::global_asm!(
+ r#"
+ .text
+ .global rust_plus_one_global_asm
+ .type rust_plus_one_global_asm, @function
+rust_plus_one_global_asm:
+ movl (%rdi), %eax
+ inc %eax
+ retq
+"#,
+ options(att_syntax)
+);
+
+extern "C" {
+ fn cc_plus_one_c(arg: &u32) -> u32;
+ fn cc_plus_one_c_asm(arg: &u32) -> u32;
+ fn cc_plus_one_cxx(arg: &u32) -> u32;
+ fn cc_plus_one_cxx_asm(arg: &u32) -> u32;
+ fn cc_plus_one_asm(arg: &u32) -> u32;
+ fn cmake_plus_one_c(arg: &u32) -> u32;
+ fn cmake_plus_one_c_asm(arg: &u32) -> u32;
+ fn cmake_plus_one_cxx(arg: &u32) -> u32;
+ fn cmake_plus_one_cxx_asm(arg: &u32) -> u32;
+ fn cmake_plus_one_c_global_asm(arg: &u32) -> u32;
+ fn cmake_plus_one_cxx_global_asm(arg: &u32) -> u32;
+ fn cmake_plus_one_asm(arg: &u32) -> u32;
+ fn rust_plus_one_global_asm(arg: &u32) -> u32;
+}
+
+fn main() {
+ let value: u32 = 41;
+ let question = "Answer to the Ultimate Question of Life, the Universe, and Everything:";
+
+ unsafe {
+ println!("{}: {}!", question, rust_plus_one_global_asm(&value));
+ println!("{}: {}!", question, cc_plus_one_c(&value));
+ println!("{}: {}!", question, cc_plus_one_c_asm(&value));
+ println!("{}: {}!", question, cc_plus_one_cxx(&value));
+ println!("{}: {}!", question, cc_plus_one_cxx_asm(&value));
+ println!("{}: {}!", question, cc_plus_one_asm(&value));
+ println!("{}: {}!", question, cmake_plus_one_c(&value));
+ println!("{}: {}!", question, cmake_plus_one_c_asm(&value));
+ println!("{}: {}!", question, cmake_plus_one_cxx(&value));
+ println!("{}: {}!", question, cmake_plus_one_cxx_asm(&value));
+ println!("{}: {}!", question, cmake_plus_one_c_global_asm(&value));
+ println!("{}: {}!", question, cmake_plus_one_cxx_global_asm(&value));
+ println!("{}: {}!", question, cmake_plus_one_asm(&value));
+ }
+}