From ad324a0e4d202903533667ab2742ad375e9f9a4e Mon Sep 17 00:00:00 2001
From: jD91mZM2 <me@krake.one>
Date: Tue, 26 Jun 2018 10:06:09 +0200
Subject: [PATCH] Use global_asm for setjmp instead

---
 Cargo.lock                                    |  3 -
 include/{bits => }/setjmp.h                   |  4 +-
 src/setjmp/Cargo.toml                         |  4 --
 src/setjmp/build.rs                           | 72 -------------------
 src/setjmp/cbindgen.toml                      |  6 --
 src/setjmp/{ => src}/impl/README.md           |  0
 src/setjmp/{ => src}/impl/aarch64/longjmp.s   |  0
 src/setjmp/{ => src}/impl/aarch64/setjmp.s    |  0
 src/setjmp/{ => src}/impl/arm/longjmp.s       |  0
 src/setjmp/{ => src}/impl/arm/setjmp.s        |  0
 src/setjmp/{ => src}/impl/bin/.gitignore      |  0
 src/setjmp/{ => src}/impl/i386/longjmp.s      |  0
 src/setjmp/{ => src}/impl/i386/setjmp.s       |  0
 src/setjmp/{ => src}/impl/m68k/longjmp.s      |  0
 src/setjmp/{ => src}/impl/m68k/setjmp.s       |  0
 .../{ => src}/impl/microblaze/longjmp.s       |  0
 src/setjmp/{ => src}/impl/microblaze/setjmp.s |  0
 src/setjmp/{ => src}/impl/mips/longjmp.S      |  0
 src/setjmp/{ => src}/impl/mips/setjmp.S       |  0
 src/setjmp/{ => src}/impl/mips64/longjmp.S    |  0
 src/setjmp/{ => src}/impl/mips64/setjmp.S     |  0
 src/setjmp/{ => src}/impl/mipsn32/longjmp.S   |  0
 src/setjmp/{ => src}/impl/mipsn32/setjmp.S    |  0
 src/setjmp/{ => src}/impl/or1k/longjmp.s      |  0
 src/setjmp/{ => src}/impl/or1k/setjmp.s       |  0
 src/setjmp/{ => src}/impl/powerpc/longjmp.S   |  0
 src/setjmp/{ => src}/impl/powerpc/setjmp.S    |  0
 src/setjmp/{ => src}/impl/powerpc64/longjmp.s |  0
 src/setjmp/{ => src}/impl/powerpc64/setjmp.s  |  0
 src/setjmp/{ => src}/impl/s390x/longjmp.s     |  0
 src/setjmp/{ => src}/impl/s390x/setjmp.s      |  0
 src/setjmp/{ => src}/impl/sh/longjmp.S        |  0
 src/setjmp/{ => src}/impl/sh/setjmp.S         |  0
 src/setjmp/{ => src}/impl/x32/longjmp.s       |  0
 src/setjmp/{ => src}/impl/x32/setjmp.s        |  0
 src/setjmp/{ => src}/impl/x86_64/longjmp.s    |  0
 src/setjmp/{ => src}/impl/x86_64/setjmp.s     |  0
 src/setjmp/src/lib.rs                         | 31 +++++++-
 38 files changed, 31 insertions(+), 89 deletions(-)
 rename include/{bits => }/setjmp.h (95%)
 delete mode 100644 src/setjmp/build.rs
 delete mode 100644 src/setjmp/cbindgen.toml
 rename src/setjmp/{ => src}/impl/README.md (100%)
 rename src/setjmp/{ => src}/impl/aarch64/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/aarch64/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/arm/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/arm/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/bin/.gitignore (100%)
 rename src/setjmp/{ => src}/impl/i386/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/i386/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/m68k/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/m68k/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/microblaze/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/microblaze/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/mips/longjmp.S (100%)
 rename src/setjmp/{ => src}/impl/mips/setjmp.S (100%)
 rename src/setjmp/{ => src}/impl/mips64/longjmp.S (100%)
 rename src/setjmp/{ => src}/impl/mips64/setjmp.S (100%)
 rename src/setjmp/{ => src}/impl/mipsn32/longjmp.S (100%)
 rename src/setjmp/{ => src}/impl/mipsn32/setjmp.S (100%)
 rename src/setjmp/{ => src}/impl/or1k/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/or1k/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/powerpc/longjmp.S (100%)
 rename src/setjmp/{ => src}/impl/powerpc/setjmp.S (100%)
 rename src/setjmp/{ => src}/impl/powerpc64/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/powerpc64/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/s390x/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/s390x/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/sh/longjmp.S (100%)
 rename src/setjmp/{ => src}/impl/sh/setjmp.S (100%)
 rename src/setjmp/{ => src}/impl/x32/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/x32/setjmp.s (100%)
 rename src/setjmp/{ => src}/impl/x86_64/longjmp.s (100%)
 rename src/setjmp/{ => src}/impl/x86_64/setjmp.s (100%)

diff --git a/Cargo.lock b/Cargo.lock
index 958708dd..d242203e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -367,9 +367,6 @@ dependencies = [
 [[package]]
 name = "setjmp"
 version = "0.1.0"
-dependencies = [
- "cbindgen 0.5.2",
-]
 
 [[package]]
 name = "signal"
diff --git a/include/bits/setjmp.h b/include/setjmp.h
similarity index 95%
rename from include/bits/setjmp.h
rename to include/setjmp.h
index aa40a2dc..837b21ba 100644
--- a/include/bits/setjmp.h
+++ b/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];
diff --git a/src/setjmp/Cargo.toml b/src/setjmp/Cargo.toml
index ab9cbaa8..2826a4e5 100644
--- a/src/setjmp/Cargo.toml
+++ b/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" }
diff --git a/src/setjmp/build.rs b/src/setjmp/build.rs
deleted file mode 100644
index e24e6d2e..00000000
--- a/src/setjmp/build.rs
+++ /dev/null
@@ -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");
-}
diff --git a/src/setjmp/cbindgen.toml b/src/setjmp/cbindgen.toml
deleted file mode 100644
index 30958dd2..00000000
--- a/src/setjmp/cbindgen.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-include_guard = "_SETJMP_H"
-trailer = "#include <bits/setjmp.h>"
-language = "C"
-
-[enum]
-prefix_with_name = true
diff --git a/src/setjmp/impl/README.md b/src/setjmp/src/impl/README.md
similarity index 100%
rename from src/setjmp/impl/README.md
rename to src/setjmp/src/impl/README.md
diff --git a/src/setjmp/impl/aarch64/longjmp.s b/src/setjmp/src/impl/aarch64/longjmp.s
similarity index 100%
rename from src/setjmp/impl/aarch64/longjmp.s
rename to src/setjmp/src/impl/aarch64/longjmp.s
diff --git a/src/setjmp/impl/aarch64/setjmp.s b/src/setjmp/src/impl/aarch64/setjmp.s
similarity index 100%
rename from src/setjmp/impl/aarch64/setjmp.s
rename to src/setjmp/src/impl/aarch64/setjmp.s
diff --git a/src/setjmp/impl/arm/longjmp.s b/src/setjmp/src/impl/arm/longjmp.s
similarity index 100%
rename from src/setjmp/impl/arm/longjmp.s
rename to src/setjmp/src/impl/arm/longjmp.s
diff --git a/src/setjmp/impl/arm/setjmp.s b/src/setjmp/src/impl/arm/setjmp.s
similarity index 100%
rename from src/setjmp/impl/arm/setjmp.s
rename to src/setjmp/src/impl/arm/setjmp.s
diff --git a/src/setjmp/impl/bin/.gitignore b/src/setjmp/src/impl/bin/.gitignore
similarity index 100%
rename from src/setjmp/impl/bin/.gitignore
rename to src/setjmp/src/impl/bin/.gitignore
diff --git a/src/setjmp/impl/i386/longjmp.s b/src/setjmp/src/impl/i386/longjmp.s
similarity index 100%
rename from src/setjmp/impl/i386/longjmp.s
rename to src/setjmp/src/impl/i386/longjmp.s
diff --git a/src/setjmp/impl/i386/setjmp.s b/src/setjmp/src/impl/i386/setjmp.s
similarity index 100%
rename from src/setjmp/impl/i386/setjmp.s
rename to src/setjmp/src/impl/i386/setjmp.s
diff --git a/src/setjmp/impl/m68k/longjmp.s b/src/setjmp/src/impl/m68k/longjmp.s
similarity index 100%
rename from src/setjmp/impl/m68k/longjmp.s
rename to src/setjmp/src/impl/m68k/longjmp.s
diff --git a/src/setjmp/impl/m68k/setjmp.s b/src/setjmp/src/impl/m68k/setjmp.s
similarity index 100%
rename from src/setjmp/impl/m68k/setjmp.s
rename to src/setjmp/src/impl/m68k/setjmp.s
diff --git a/src/setjmp/impl/microblaze/longjmp.s b/src/setjmp/src/impl/microblaze/longjmp.s
similarity index 100%
rename from src/setjmp/impl/microblaze/longjmp.s
rename to src/setjmp/src/impl/microblaze/longjmp.s
diff --git a/src/setjmp/impl/microblaze/setjmp.s b/src/setjmp/src/impl/microblaze/setjmp.s
similarity index 100%
rename from src/setjmp/impl/microblaze/setjmp.s
rename to src/setjmp/src/impl/microblaze/setjmp.s
diff --git a/src/setjmp/impl/mips/longjmp.S b/src/setjmp/src/impl/mips/longjmp.S
similarity index 100%
rename from src/setjmp/impl/mips/longjmp.S
rename to src/setjmp/src/impl/mips/longjmp.S
diff --git a/src/setjmp/impl/mips/setjmp.S b/src/setjmp/src/impl/mips/setjmp.S
similarity index 100%
rename from src/setjmp/impl/mips/setjmp.S
rename to src/setjmp/src/impl/mips/setjmp.S
diff --git a/src/setjmp/impl/mips64/longjmp.S b/src/setjmp/src/impl/mips64/longjmp.S
similarity index 100%
rename from src/setjmp/impl/mips64/longjmp.S
rename to src/setjmp/src/impl/mips64/longjmp.S
diff --git a/src/setjmp/impl/mips64/setjmp.S b/src/setjmp/src/impl/mips64/setjmp.S
similarity index 100%
rename from src/setjmp/impl/mips64/setjmp.S
rename to src/setjmp/src/impl/mips64/setjmp.S
diff --git a/src/setjmp/impl/mipsn32/longjmp.S b/src/setjmp/src/impl/mipsn32/longjmp.S
similarity index 100%
rename from src/setjmp/impl/mipsn32/longjmp.S
rename to src/setjmp/src/impl/mipsn32/longjmp.S
diff --git a/src/setjmp/impl/mipsn32/setjmp.S b/src/setjmp/src/impl/mipsn32/setjmp.S
similarity index 100%
rename from src/setjmp/impl/mipsn32/setjmp.S
rename to src/setjmp/src/impl/mipsn32/setjmp.S
diff --git a/src/setjmp/impl/or1k/longjmp.s b/src/setjmp/src/impl/or1k/longjmp.s
similarity index 100%
rename from src/setjmp/impl/or1k/longjmp.s
rename to src/setjmp/src/impl/or1k/longjmp.s
diff --git a/src/setjmp/impl/or1k/setjmp.s b/src/setjmp/src/impl/or1k/setjmp.s
similarity index 100%
rename from src/setjmp/impl/or1k/setjmp.s
rename to src/setjmp/src/impl/or1k/setjmp.s
diff --git a/src/setjmp/impl/powerpc/longjmp.S b/src/setjmp/src/impl/powerpc/longjmp.S
similarity index 100%
rename from src/setjmp/impl/powerpc/longjmp.S
rename to src/setjmp/src/impl/powerpc/longjmp.S
diff --git a/src/setjmp/impl/powerpc/setjmp.S b/src/setjmp/src/impl/powerpc/setjmp.S
similarity index 100%
rename from src/setjmp/impl/powerpc/setjmp.S
rename to src/setjmp/src/impl/powerpc/setjmp.S
diff --git a/src/setjmp/impl/powerpc64/longjmp.s b/src/setjmp/src/impl/powerpc64/longjmp.s
similarity index 100%
rename from src/setjmp/impl/powerpc64/longjmp.s
rename to src/setjmp/src/impl/powerpc64/longjmp.s
diff --git a/src/setjmp/impl/powerpc64/setjmp.s b/src/setjmp/src/impl/powerpc64/setjmp.s
similarity index 100%
rename from src/setjmp/impl/powerpc64/setjmp.s
rename to src/setjmp/src/impl/powerpc64/setjmp.s
diff --git a/src/setjmp/impl/s390x/longjmp.s b/src/setjmp/src/impl/s390x/longjmp.s
similarity index 100%
rename from src/setjmp/impl/s390x/longjmp.s
rename to src/setjmp/src/impl/s390x/longjmp.s
diff --git a/src/setjmp/impl/s390x/setjmp.s b/src/setjmp/src/impl/s390x/setjmp.s
similarity index 100%
rename from src/setjmp/impl/s390x/setjmp.s
rename to src/setjmp/src/impl/s390x/setjmp.s
diff --git a/src/setjmp/impl/sh/longjmp.S b/src/setjmp/src/impl/sh/longjmp.S
similarity index 100%
rename from src/setjmp/impl/sh/longjmp.S
rename to src/setjmp/src/impl/sh/longjmp.S
diff --git a/src/setjmp/impl/sh/setjmp.S b/src/setjmp/src/impl/sh/setjmp.S
similarity index 100%
rename from src/setjmp/impl/sh/setjmp.S
rename to src/setjmp/src/impl/sh/setjmp.S
diff --git a/src/setjmp/impl/x32/longjmp.s b/src/setjmp/src/impl/x32/longjmp.s
similarity index 100%
rename from src/setjmp/impl/x32/longjmp.s
rename to src/setjmp/src/impl/x32/longjmp.s
diff --git a/src/setjmp/impl/x32/setjmp.s b/src/setjmp/src/impl/x32/setjmp.s
similarity index 100%
rename from src/setjmp/impl/x32/setjmp.s
rename to src/setjmp/src/impl/x32/setjmp.s
diff --git a/src/setjmp/impl/x86_64/longjmp.s b/src/setjmp/src/impl/x86_64/longjmp.s
similarity index 100%
rename from src/setjmp/impl/x86_64/longjmp.s
rename to src/setjmp/src/impl/x86_64/longjmp.s
diff --git a/src/setjmp/impl/x86_64/setjmp.s b/src/setjmp/src/impl/x86_64/setjmp.s
similarity index 100%
rename from src/setjmp/impl/x86_64/setjmp.s
rename to src/setjmp/src/impl/x86_64/setjmp.s
diff --git a/src/setjmp/src/lib.rs b/src/setjmp/src/lib.rs
index f26f3e5a..0f6392dc 100644
--- a/src/setjmp/src/lib.rs
+++ b/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";
+}
-- 
GitLab