lib.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #![feature(drop_types_in_const)]
  2. extern crate libloading;
  3. use std::sync::{Once, ONCE_INIT};
  4. use libloading::Library;
  5. static mut GCC_S: Option<Library> = None;
  6. #[cfg(not(windows))]
  7. fn gcc_s() -> &'static Library {
  8. #[cfg(not(target_os = "macos"))]
  9. const LIBGCC_S: &'static str = "libgcc_s.so.1";
  10. #[cfg(target_os = "macos")]
  11. const LIBGCC_S: &'static str = "libgcc_s.1.dylib";
  12. unsafe {
  13. static INIT: Once = ONCE_INIT;
  14. INIT.call_once(|| {
  15. GCC_S = Some(Library::new(LIBGCC_S).unwrap());
  16. });
  17. GCC_S.as_ref().unwrap()
  18. }
  19. }
  20. #[cfg(windows)]
  21. macro_rules! declare {
  22. ($symbol:ident: fn($($i:ty),+) -> $o:ty) => {
  23. pub fn $symbol() -> Option<unsafe extern fn($($i),+) -> $o> {
  24. None
  25. }
  26. }
  27. }
  28. #[cfg(not(windows))]
  29. macro_rules! declare {
  30. ($symbol:ident: fn($($i:ty),+) -> $o:ty) => {
  31. pub fn $symbol() -> Option<unsafe extern fn($($i),+) -> $o> {
  32. unsafe {
  33. gcc_s().get(concat!("__", stringify!($symbol)).as_bytes()).ok().map(|s| *s)
  34. }
  35. }
  36. }
  37. }
  38. declare!(ashldi3: fn(u64, u32) -> u64);
  39. declare!(ashrdi3: fn(i64, u32) -> i64);
  40. declare!(divdi3: fn(i64, i64) -> i64);
  41. declare!(divmoddi4: fn(i64, i64, &mut i64) -> i64);
  42. declare!(divmodsi4: fn(i32, i32, &mut i32) -> i32);
  43. declare!(divsi3: fn(i32, i32) -> i32);
  44. declare!(lshrdi3: fn(u64, u32) -> u64);
  45. declare!(moddi3: fn(i64, i64) -> i64);
  46. declare!(modsi3: fn(i32, i32) -> i32);
  47. declare!(muldi3: fn(u64, u64) -> u64);
  48. declare!(mulodi4: fn(i64, i64, &mut i32) -> i64);
  49. declare!(mulosi4: fn(i32, i32, &mut i32) -> i32);
  50. declare!(udivdi3: fn(u64, u64) -> u64);
  51. declare!(udivmoddi4: fn(u64, u64, Option<&mut u64>) -> u64);
  52. declare!(udivmodsi4: fn(u32, u32, Option<&mut u32>) -> u32);
  53. declare!(udivsi3: fn(u32, u32) -> u32);
  54. declare!(umoddi3: fn(u64, u64) -> u64);
  55. declare!(umodsi3: fn(u32, u32) -> u32);
  56. declare!(addsf3: fn(f32, f32) -> f32);
  57. declare!(adddf3: fn(f64, f64) -> f64);