summaryrefslogtreecommitdiffstats
path: root/tests/run-make/lto-linkage-used-attr
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run-make/lto-linkage-used-attr')
-rw-r--r--tests/run-make/lto-linkage-used-attr/Makefile9
-rw-r--r--tests/run-make/lto-linkage-used-attr/lib.rs50
-rw-r--r--tests/run-make/lto-linkage-used-attr/main.rs10
3 files changed, 69 insertions, 0 deletions
diff --git a/tests/run-make/lto-linkage-used-attr/Makefile b/tests/run-make/lto-linkage-used-attr/Makefile
new file mode 100644
index 000000000..e78b83890
--- /dev/null
+++ b/tests/run-make/lto-linkage-used-attr/Makefile
@@ -0,0 +1,9 @@
+include ../tools.mk
+
+# Verify that the impl_* symbols are preserved. #108030
+# only-x86_64-unknown-linux-gnu
+# min-llvm-version: 17
+
+all:
+ $(RUSTC) -Cdebuginfo=0 -Copt-level=3 lib.rs
+ $(RUSTC) -Clto=fat -Cdebuginfo=0 -Copt-level=3 main.rs
diff --git a/tests/run-make/lto-linkage-used-attr/lib.rs b/tests/run-make/lto-linkage-used-attr/lib.rs
new file mode 100644
index 000000000..0a92ea9cd
--- /dev/null
+++ b/tests/run-make/lto-linkage-used-attr/lib.rs
@@ -0,0 +1,50 @@
+#![crate_type = "rlib"]
+#![crate_type = "cdylib"]
+
+#[macro_export]
+macro_rules! asm_func {
+ ($name:expr, $body:expr $(, $($args:tt)*)?) => {
+ core::arch::global_asm!(
+ concat!(
+ ".p2align 4\n",
+ ".hidden ", $name, "\n",
+ ".global ", $name, "\n",
+ ".type ", $name, ",@function\n",
+ $name, ":\n",
+ $body,
+ ".size ", $name, ",.-", $name,
+ )
+ $(, $($args)*)?
+ );
+ };
+}
+
+macro_rules! libcall_trampoline {
+ ($libcall:ident ; $libcall_impl:ident) => {
+ asm_func!(
+ stringify!($libcall),
+ concat!(
+ "
+ .cfi_startproc simple
+ .cfi_def_cfa_offset 0
+ jmp {}
+ .cfi_endproc
+ ",
+ ),
+ sym $libcall_impl
+ );
+ };
+}
+
+pub mod trampolines {
+ extern "C" {
+ pub fn table_fill_funcref();
+ pub fn table_fill_externref();
+ }
+
+ unsafe extern "C" fn impl_table_fill_funcref() {}
+ unsafe extern "C" fn impl_table_fill_externref() {}
+
+ libcall_trampoline!(table_fill_funcref ; impl_table_fill_funcref);
+ libcall_trampoline!(table_fill_externref ; impl_table_fill_externref);
+}
diff --git a/tests/run-make/lto-linkage-used-attr/main.rs b/tests/run-make/lto-linkage-used-attr/main.rs
new file mode 100644
index 000000000..256b02e5b
--- /dev/null
+++ b/tests/run-make/lto-linkage-used-attr/main.rs
@@ -0,0 +1,10 @@
+extern crate lib;
+
+use lib::trampolines::*;
+
+fn main() {
+ unsafe {
+ table_fill_externref();
+ table_fill_funcref();
+ }
+}