diff options
| author | Andy Russell <arussell123@gmail.com> | 2021-11-08 18:03:55 -0500 |
|---|---|---|
| committer | Andy Russell <arussell123@gmail.com> | 2021-12-06 12:03:47 -0500 |
| commit | 923f939791a08d3f58566b0fc755381de031f43e (patch) | |
| tree | 7c917c17e680e325b4d2e014051afa25679cba80 /compiler/rustc_plugin_impl | |
| parent | 0fb1c371d4a14f9ce7a721d8aea683a6e6774f6c (diff) | |
| download | rust-923f939791a08d3f58566b0fc755381de031f43e.tar.gz rust-923f939791a08d3f58566b0fc755381de031f43e.zip | |
replace dynamic library module with libloading
Diffstat (limited to 'compiler/rustc_plugin_impl')
| -rw-r--r-- | compiler/rustc_plugin_impl/Cargo.toml | 1 | ||||
| -rw-r--r-- | compiler/rustc_plugin_impl/src/load.rs | 42 |
2 files changed, 18 insertions, 25 deletions
diff --git a/compiler/rustc_plugin_impl/Cargo.toml b/compiler/rustc_plugin_impl/Cargo.toml index 4e666e7e93d..f5071eb6e8f 100644 --- a/compiler/rustc_plugin_impl/Cargo.toml +++ b/compiler/rustc_plugin_impl/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" doctest = false [dependencies] +libloading = "0.7.1" rustc_middle = { path = "../rustc_middle" } rustc_errors = { path = "../rustc_errors" } rustc_hir = { path = "../rustc_hir" } diff --git a/compiler/rustc_plugin_impl/src/load.rs b/compiler/rustc_plugin_impl/src/load.rs index c21075a443c..618682da4e5 100644 --- a/compiler/rustc_plugin_impl/src/load.rs +++ b/compiler/rustc_plugin_impl/src/load.rs @@ -1,6 +1,7 @@ //! Used by `rustc` when loading a plugin. use crate::Registry; +use libloading::Library; use rustc_ast::Crate; use rustc_errors::struct_span_err; use rustc_metadata::locator; @@ -56,37 +57,28 @@ fn load_plugin( ident: Ident, ) { let lib = locator::find_plugin_registrar(sess, metadata_loader, ident.span, ident.name); - let fun = dylink_registrar(sess, ident.span, lib); + let fun = dylink_registrar(lib).unwrap_or_else(|err| { + // This is fatal: there are almost certainly macros we need inside this crate, so + // continuing would spew "macro undefined" errors. + sess.span_fatal(ident.span, &err.to_string()); + }); plugins.push(fun); } -// Dynamically link a registrar function into the compiler process. -fn dylink_registrar(sess: &Session, span: Span, path: PathBuf) -> PluginRegistrarFn { - use rustc_metadata::dynamic_lib::DynamicLibrary; - +/// Dynamically link a registrar function into the compiler process. +fn dylink_registrar(lib_path: PathBuf) -> Result<PluginRegistrarFn, libloading::Error> { // Make sure the path contains a / or the linker will search for it. - let path = env::current_dir().unwrap().join(&path); + let lib_path = env::current_dir().unwrap().join(&lib_path); - let lib = match DynamicLibrary::open(&path) { - Ok(lib) => lib, - // this is fatal: there are almost certainly macros we need - // inside this crate, so continue would spew "macro undefined" - // errors - Err(err) => sess.span_fatal(span, &err), - }; + let lib = unsafe { Library::new(&lib_path) }?; - unsafe { - let registrar = match lib.symbol("__rustc_plugin_registrar") { - Ok(registrar) => mem::transmute::<*mut u8, PluginRegistrarFn>(registrar), - // again fatal if we can't register macros - Err(err) => sess.span_fatal(span, &err), - }; + let registrar_sym = unsafe { lib.get::<PluginRegistrarFn>(b"__rustc_plugin_registrar") }?; - // Intentionally leak the dynamic library. We can't ever unload it - // since the library can make things that will live arbitrarily long - // (e.g., an Rc cycle or a thread). - mem::forget(lib); + // Intentionally leak the dynamic library. We can't ever unload it + // since the library can make things that will live arbitrarily long + // (e.g., an Rc cycle or a thread). + let registrar_sym = unsafe { registrar_sym.into_raw() }; + mem::forget(lib); - registrar - } + Ok(*registrar_sym) } |
