瀏覽代碼

Use global_asm for setjmp instead

jD91mZM2 6 年之前
父節點
當前提交
ad324a0e4d
共有 38 個文件被更改,包括 31 次插入89 次删除
  1. 0 3
      Cargo.lock
  2. 2 2
      include/setjmp.h
  3. 0 4
      src/setjmp/Cargo.toml
  4. 0 72
      src/setjmp/build.rs
  5. 0 6
      src/setjmp/cbindgen.toml
  6. 0 0
      src/setjmp/src/impl/README.md
  7. 0 0
      src/setjmp/src/impl/aarch64/longjmp.s
  8. 0 0
      src/setjmp/src/impl/aarch64/setjmp.s
  9. 0 0
      src/setjmp/src/impl/arm/longjmp.s
  10. 0 0
      src/setjmp/src/impl/arm/setjmp.s
  11. 0 0
      src/setjmp/src/impl/bin/.gitignore
  12. 0 0
      src/setjmp/src/impl/i386/longjmp.s
  13. 0 0
      src/setjmp/src/impl/i386/setjmp.s
  14. 0 0
      src/setjmp/src/impl/m68k/longjmp.s
  15. 0 0
      src/setjmp/src/impl/m68k/setjmp.s
  16. 0 0
      src/setjmp/src/impl/microblaze/longjmp.s
  17. 0 0
      src/setjmp/src/impl/microblaze/setjmp.s
  18. 0 0
      src/setjmp/src/impl/mips/longjmp.S
  19. 0 0
      src/setjmp/src/impl/mips/setjmp.S
  20. 0 0
      src/setjmp/src/impl/mips64/longjmp.S
  21. 0 0
      src/setjmp/src/impl/mips64/setjmp.S
  22. 0 0
      src/setjmp/src/impl/mipsn32/longjmp.S
  23. 0 0
      src/setjmp/src/impl/mipsn32/setjmp.S
  24. 0 0
      src/setjmp/src/impl/or1k/longjmp.s
  25. 0 0
      src/setjmp/src/impl/or1k/setjmp.s
  26. 0 0
      src/setjmp/src/impl/powerpc/longjmp.S
  27. 0 0
      src/setjmp/src/impl/powerpc/setjmp.S
  28. 0 0
      src/setjmp/src/impl/powerpc64/longjmp.s
  29. 0 0
      src/setjmp/src/impl/powerpc64/setjmp.s
  30. 0 0
      src/setjmp/src/impl/s390x/longjmp.s
  31. 0 0
      src/setjmp/src/impl/s390x/setjmp.s
  32. 0 0
      src/setjmp/src/impl/sh/longjmp.S
  33. 0 0
      src/setjmp/src/impl/sh/setjmp.S
  34. 0 0
      src/setjmp/src/impl/x32/longjmp.s
  35. 0 0
      src/setjmp/src/impl/x32/setjmp.s
  36. 0 0
      src/setjmp/src/impl/x86_64/longjmp.s
  37. 0 0
      src/setjmp/src/impl/x86_64/setjmp.s
  38. 29 2
      src/setjmp/src/lib.rs

+ 0 - 3
Cargo.lock

@@ -367,9 +367,6 @@ dependencies = [
 [[package]]
 name = "setjmp"
 version = "0.1.0"
-dependencies = [
- "cbindgen 0.5.2",
-]
 
 [[package]]
 name = "signal"

+ 2 - 2
include/bits/setjmp.h → include/setjmp.h

@@ -1,5 +1,5 @@
-#ifndef _BITS_SETJMP_H
-#define _BITS_SETJMP_H
+#ifndef _SETJMP_H
+#define _SETJMP_H
 
 #ifdef __arch64__
 typedef unsigned long jmp_buf[22];

+ 0 - 4
src/setjmp/Cargo.toml

@@ -2,7 +2,3 @@
 name = "setjmp"
 version = "0.1.0"
 authors = ["Jeremy Soller <jackpot51@gmail.com>"]
-build = "build.rs"
-
-[build-dependencies]
-cbindgen = { path = "../../cbindgen" }

+ 0 - 72
src/setjmp/build.rs

@@ -1,72 +0,0 @@
-extern crate cbindgen;
-
-use std::{env, fs, process::Command};
-
-fn compile(file: &str, object: &str, output: &str) {
-    let status = Command::new("gcc")
-        .args(&["-c", file, "-o", object])
-        .status()
-        .expect("failed to run gcc to compile assembly");
-
-    if !status.success() {
-        panic!("compilation error");
-    }
-
-    let status = Command::new("ar")
-        .args(&["rcs", output, object])
-        .status()
-        .expect("failed to run ar to convert object to a static library");
-
-    if !status.success() {
-        panic!("error converting object to static library");
-    }
-}
-
-fn main() {
-    println!("cargo:rustc-link-lib=static=setjmp");
-    println!("cargo:rustc-link-lib=static=longjmp");
-
-    macro_rules! detect_arch {
-        ($($($token:tt);+),+) => {
-            $(
-                detect_arch!(inner $($token);+);
-            )+
-        };
-        (inner $arch:expr) => {
-            detect_arch!(inner $arch; ".s");
-        };
-        (inner $arch:expr; $ext:expr) => {
-            #[cfg(target_arch = $arch)] {
-                compile(concat!("impl/", $arch, "/setjmp", $ext), "impl/bin/setjmp.o", "impl/bin/libsetjmp.a");
-                compile(concat!("impl/", $arch, "/longjmp", $ext), "impl/bin/longjmp.o", "impl/bin/liblongjmp.a");
-
-                let dir = env::current_dir().expect("failed to find current directory");
-                println!("cargo:rustc-link-search=native={}/impl/bin", dir.display());
-            }
-        };
-    }
-
-    detect_arch! {
-        "aarch64",
-        "arm",
-        "i386",
-        "m68k",
-        "microblaze",
-        "mips"; ".S",
-        "mips64"; ".S",
-        "mipsn32"; ".S",
-        "or1k",
-        "powerpc"; ".S",
-        "powerpc64",
-        "s390x",
-        "sh"; ".S",
-        "x32",
-        "x86_64"
-    }
-
-    let crate_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set");
-    fs::create_dir_all("../../target/include").expect("failed to create include directory");
-    cbindgen::generate(crate_dir)
-        .expect("failed to generate bindings")
-        .write_to_file("../../target/include/setjmp.h");
-}

+ 0 - 6
src/setjmp/cbindgen.toml

@@ -1,6 +0,0 @@
-include_guard = "_SETJMP_H"
-trailer = "#include <bits/setjmp.h>"
-language = "C"
-
-[enum]
-prefix_with_name = true

+ 0 - 0
src/setjmp/impl/README.md → src/setjmp/src/impl/README.md


+ 0 - 0
src/setjmp/impl/aarch64/longjmp.s → src/setjmp/src/impl/aarch64/longjmp.s


+ 0 - 0
src/setjmp/impl/aarch64/setjmp.s → src/setjmp/src/impl/aarch64/setjmp.s


+ 0 - 0
src/setjmp/impl/arm/longjmp.s → src/setjmp/src/impl/arm/longjmp.s


+ 0 - 0
src/setjmp/impl/arm/setjmp.s → src/setjmp/src/impl/arm/setjmp.s


+ 0 - 0
src/setjmp/impl/bin/.gitignore → src/setjmp/src/impl/bin/.gitignore


+ 0 - 0
src/setjmp/impl/i386/longjmp.s → src/setjmp/src/impl/i386/longjmp.s


+ 0 - 0
src/setjmp/impl/i386/setjmp.s → src/setjmp/src/impl/i386/setjmp.s


+ 0 - 0
src/setjmp/impl/m68k/longjmp.s → src/setjmp/src/impl/m68k/longjmp.s


+ 0 - 0
src/setjmp/impl/m68k/setjmp.s → src/setjmp/src/impl/m68k/setjmp.s


+ 0 - 0
src/setjmp/impl/microblaze/longjmp.s → src/setjmp/src/impl/microblaze/longjmp.s


+ 0 - 0
src/setjmp/impl/microblaze/setjmp.s → src/setjmp/src/impl/microblaze/setjmp.s


+ 0 - 0
src/setjmp/impl/mips/longjmp.S → src/setjmp/src/impl/mips/longjmp.S


+ 0 - 0
src/setjmp/impl/mips/setjmp.S → src/setjmp/src/impl/mips/setjmp.S


+ 0 - 0
src/setjmp/impl/mips64/longjmp.S → src/setjmp/src/impl/mips64/longjmp.S


+ 0 - 0
src/setjmp/impl/mips64/setjmp.S → src/setjmp/src/impl/mips64/setjmp.S


+ 0 - 0
src/setjmp/impl/mipsn32/longjmp.S → src/setjmp/src/impl/mipsn32/longjmp.S


+ 0 - 0
src/setjmp/impl/mipsn32/setjmp.S → src/setjmp/src/impl/mipsn32/setjmp.S


+ 0 - 0
src/setjmp/impl/or1k/longjmp.s → src/setjmp/src/impl/or1k/longjmp.s


+ 0 - 0
src/setjmp/impl/or1k/setjmp.s → src/setjmp/src/impl/or1k/setjmp.s


+ 0 - 0
src/setjmp/impl/powerpc/longjmp.S → src/setjmp/src/impl/powerpc/longjmp.S


+ 0 - 0
src/setjmp/impl/powerpc/setjmp.S → src/setjmp/src/impl/powerpc/setjmp.S


+ 0 - 0
src/setjmp/impl/powerpc64/longjmp.s → src/setjmp/src/impl/powerpc64/longjmp.s


+ 0 - 0
src/setjmp/impl/powerpc64/setjmp.s → src/setjmp/src/impl/powerpc64/setjmp.s


+ 0 - 0
src/setjmp/impl/s390x/longjmp.s → src/setjmp/src/impl/s390x/longjmp.s


+ 0 - 0
src/setjmp/impl/s390x/setjmp.s → src/setjmp/src/impl/s390x/setjmp.s


+ 0 - 0
src/setjmp/impl/sh/longjmp.S → src/setjmp/src/impl/sh/longjmp.S


+ 0 - 0
src/setjmp/impl/sh/setjmp.S → src/setjmp/src/impl/sh/setjmp.S


+ 0 - 0
src/setjmp/impl/x32/longjmp.s → src/setjmp/src/impl/x32/longjmp.s


+ 0 - 0
src/setjmp/impl/x32/setjmp.s → src/setjmp/src/impl/x32/setjmp.s


+ 0 - 0
src/setjmp/impl/x86_64/longjmp.s → src/setjmp/src/impl/x86_64/longjmp.s


+ 0 - 0
src/setjmp/impl/x86_64/setjmp.s → src/setjmp/src/impl/x86_64/setjmp.s


+ 29 - 2
src/setjmp/src/lib.rs

@@ -1,6 +1,33 @@
 //! setjmp implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/setjmp.h.html
 
 #![no_std]
+#![feature(global_asm)]
 
-// EMPTY FILE.
-// This project is here because of the build.rs file which will compile musl's existing code for setjmp.
+macro_rules! platform_specific {
+    ($($arch:expr,$ext:expr;)+) => {
+        $(
+            #[cfg(target_arch = $arch)]
+            global_asm!(include_str!(concat!("impl/", $arch, "/setjmp.", $ext)));
+            #[cfg(target_arch = $arch)]
+            global_asm!(include_str!(concat!("impl/", $arch, "/longjmp.", $ext)));
+        )+
+    }
+}
+
+platform_specific! {
+    "aarch64","s";
+    "arm","s";
+    "i386","s";
+    "m68k","s";
+    "microblaze","s";
+    "mips","S";
+    "mips64","S";
+    "mipsn32","S";
+    "or1k","s";
+    "powerpc","S";
+    "powerpc64","s";
+    "s390x","s";
+    "sh","S";
+    "x32","s";
+    "x86_64","s";
+}