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