From 8afbf24980bb1f47f633286169f96a0711db4442 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Wed, 12 Mar 2014 18:06:18 +0800 Subject: [PATCH] Add OS unknown as a supported triple. First step in supporting bare-metal targets, allows for cfg annotations and ignores dylib crate-type annotations. --- src/librustc/back/arm.rs | 8 ++++++++ src/librustc/back/link.rs | 2 ++ src/librustc/back/mips.rs | 8 ++++++++ src/librustc/back/rpath.rs | 11 ++++++++--- src/librustc/back/x86.rs | 5 +++++ src/librustc/back/x86_64.rs | 7 +++++++ src/librustc/driver/driver.rs | 4 +++- src/librustc/driver/session.rs | 7 ++++++- src/librustc/metadata/loader.rs | 12 ++++++++---- src/libstd/os.rs | 12 ++++++++++++ src/libsyntax/abi.rs | 2 +- 11 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/librustc/back/arm.rs b/src/librustc/back/arm.rs index f86c87af72674..9de61721febb0 100644 --- a/src/librustc/back/arm.rs +++ b/src/librustc/back/arm.rs @@ -64,6 +64,14 @@ pub fn get_target_strs(target_triple: ~str, target_os: abi::Os) -> target_strs:: "-v64:64:64-v128:64:128" + "-a0:0:64-n32" } + + abi::OsUnknown => { + ~"e-p:32:32:32" + + "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" + + "-f32:32:32-f64:64:64" + + "-v64:64:64-v128:64:128" + + "-a0:0:64-n32" + } }, target_triple: target_triple, diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index c15c55927a9c8..666c7891c396e 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -824,6 +824,8 @@ pub fn filename_for_input(sess: &Session, crate_type: session::CrateType, abi::OsLinux => (linux::DLL_PREFIX, linux::DLL_SUFFIX), abi::OsAndroid => (android::DLL_PREFIX, android::DLL_SUFFIX), abi::OsFreebsd => (freebsd::DLL_PREFIX, freebsd::DLL_SUFFIX), + abi::OsUnknown => + sess.fatal("output dylib not available with unknown OS"), }; out_filename.with_filename(format!("{}{}{}", prefix, libname, suffix)) } diff --git a/src/librustc/back/mips.rs b/src/librustc/back/mips.rs index bc24660e30673..92da9ded5da82 100644 --- a/src/librustc/back/mips.rs +++ b/src/librustc/back/mips.rs @@ -60,6 +60,14 @@ pub fn get_target_strs(target_triple: ~str, target_os: abi::Os) -> target_strs:: "-v64:64:64-v128:64:128" + "-a0:0:64-n32" } + + abi::OsUnknown => { + ~"e-p:32:32:32" + + "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" + + "-f32:32:32-f64:64:64" + + "-v64:64:64-v128:64:128" + + "-a0:0:64-n32" + } }, target_triple: target_triple, diff --git a/src/librustc/back/rpath.rs b/src/librustc/back/rpath.rs index 9b543bb50cc5c..42e129556710f 100644 --- a/src/librustc/back/rpath.rs +++ b/src/librustc/back/rpath.rs @@ -22,11 +22,15 @@ fn not_win32(os: abi::Os) -> bool { os != abi::OsWin32 } +fn not_unknown(os: abi::Os) -> bool { + os != abi::OsUnknown +} + pub fn get_rpath_flags(sess: session::Session, out_filename: &Path) -> Vec<~str> { let os = sess.targ_cfg.os; - // No rpath on windows - if os == abi::OsWin32 { + // No rpath on windows or unknown + if os == abi::OsWin32 || os == abi::OsUnknown { return Vec::new(); } @@ -127,13 +131,14 @@ pub fn get_rpath_relative_to_output(os: abi::Os, use std::os; assert!(not_win32(os)); + assert!(not_unknown(os)); // Mac doesn't appear to support $ORIGIN let prefix = match os { abi::OsAndroid | abi::OsLinux | abi::OsFreebsd => "$ORIGIN", abi::OsMacos => "@loader_path", - abi::OsWin32 => unreachable!() + abi::OsWin32 | abi::OsUnknown => unreachable!() }; let mut lib = os::make_absolute(lib); diff --git a/src/librustc/back/x86.rs b/src/librustc/back/x86.rs index 9b22c82e91776..0e97f97ecbbb5 100644 --- a/src/librustc/back/x86.rs +++ b/src/librustc/back/x86.rs @@ -35,6 +35,7 @@ pub fn get_target_strs(target_triple: ~str, target_os: abi::Os) -> target_strs:: abi::OsLinux => { ~"e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32" } + abi::OsAndroid => { ~"e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32" } @@ -42,6 +43,10 @@ pub fn get_target_strs(target_triple: ~str, target_os: abi::Os) -> target_strs:: abi::OsFreebsd => { ~"e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32" } + + abi::OsUnknown => { + ~"e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32" + } }, target_triple: target_triple, diff --git a/src/librustc/back/x86_64.rs b/src/librustc/back/x86_64.rs index 524ae5e552484..ab92c50d80616 100644 --- a/src/librustc/back/x86_64.rs +++ b/src/librustc/back/x86_64.rs @@ -39,6 +39,7 @@ pub fn get_target_strs(target_triple: ~str, target_os: abi::Os) -> target_strs:: "f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-"+ "s0:64:64-f80:128:128-n8:16:32:64-S128" } + abi::OsAndroid => { ~"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"+ "f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-"+ @@ -50,6 +51,12 @@ pub fn get_target_strs(target_triple: ~str, target_os: abi::Os) -> target_strs:: "f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-"+ "s0:64:64-f80:128:128-n8:16:32:64-S128" } + + abi::OsUnknown => { + ~"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"+ + "f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-"+ + "s0:64:64-f80:128:128-n8:16:32:64-S128" + } }, target_triple: target_triple, diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index 2a92ef496c7be..2ab1cc2abbca1 100644 --- a/src/librustc/driver/driver.rs +++ b/src/librustc/driver/driver.rs @@ -89,6 +89,7 @@ pub fn default_configuration(sess: Session) -> abi::OsLinux => InternedString::new("linux"), abi::OsAndroid => InternedString::new("android"), abi::OsFreebsd => InternedString::new("freebsd"), + abi::OsUnknown => InternedString::new("unknown"), }; // ARM is bi-endian, however using NDK seems to default @@ -696,7 +697,8 @@ static os_names : &'static [(&'static str, abi::Os)] = &'static [ ("darwin", abi::OsMacos), ("android", abi::OsAndroid), ("linux", abi::OsLinux), - ("freebsd", abi::OsFreebsd)]; + ("freebsd", abi::OsFreebsd), + ("unknown", abi::OsUnknown)]; pub fn get_arch(triple: &str) -> Option { for &(arch, abi) in architecture_abis.iter() { diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs index 4845060dd12a3..fe63cef79311c 100644 --- a/src/librustc/driver/session.rs +++ b/src/librustc/driver/session.rs @@ -511,7 +511,11 @@ pub fn collect_crate_types(session: &Session, } else { None } + }).filter(|a| { + // Filter out dylib attrs in the create for unknown os + session.targ_cfg.os != abi::OsUnknown || *a != CrateTypeDylib }); + base.extend(&mut iter); if base.len() == 0 { base.push(CrateTypeExecutable); @@ -529,6 +533,7 @@ pub fn sess_os_to_meta_os(os: abi::Os) -> metadata::loader::Os { abi::OsLinux => loader::OsLinux, abi::OsAndroid => loader::OsAndroid, abi::OsMacos => loader::OsMacos, - abi::OsFreebsd => loader::OsFreebsd + abi::OsFreebsd => loader::OsFreebsd, + abi::OsUnknown => loader::OsUnknown } } diff --git a/src/librustc/metadata/loader.rs b/src/librustc/metadata/loader.rs index 7628c90d95df1..4be730ba27aa7 100644 --- a/src/librustc/metadata/loader.rs +++ b/src/librustc/metadata/loader.rs @@ -28,7 +28,7 @@ use std::c_str::ToCStr; use std::cast; use std::cmp; use std::io; -use std::os::consts::{macos, freebsd, linux, android, win32}; +use std::os::consts::{macos, freebsd, linux, android, win32, unknown}; use std::str; use std::vec; use std::vec_ng::Vec; @@ -42,7 +42,8 @@ pub enum Os { OsWin32, OsLinux, OsAndroid, - OsFreebsd + OsFreebsd, + OsUnknown } pub struct Context<'a> { @@ -348,6 +349,7 @@ impl<'a> Context<'a> { OsLinux => (linux::DLL_PREFIX, linux::DLL_SUFFIX), OsAndroid => (android::DLL_PREFIX, android::DLL_SUFFIX), OsFreebsd => (freebsd::DLL_PREFIX, freebsd::DLL_SUFFIX), + OsUnknown => (unknown::DLL_PREFIX, unknown::DLL_SUFFIX), } } } @@ -460,7 +462,8 @@ pub fn meta_section_name(os: Os) -> &'static str { OsWin32 => ".note.rustc", OsLinux => ".note.rustc", OsAndroid => ".note.rustc", - OsFreebsd => ".note.rustc" + OsFreebsd => ".note.rustc", + OsUnknown => ".note.rustc" } } @@ -470,7 +473,8 @@ pub fn read_meta_section_name(os: Os) -> &'static str { OsWin32 => ".note.rustc", OsLinux => ".note.rustc", OsAndroid => ".note.rustc", - OsFreebsd => ".note.rustc" + OsFreebsd => ".note.rustc", + OsUnknown => ".note.rustc" } } diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 8efa9763ba9ff..4286a645740db 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -1305,6 +1305,9 @@ pub mod consts { #[cfg(target_os = "win32")] pub use os::consts::win32::*; + #[cfg(target_os = "unknown")] + pub use os::consts::unknown::*; + #[cfg(target_arch = "x86")] pub use os::consts::x86::*; @@ -1370,6 +1373,15 @@ pub mod consts { pub static EXE_EXTENSION: &'static str = "exe"; } + pub mod unknown { + pub static SYSNAME: &'static str = "unknown"; + pub static DLL_PREFIX: &'static str = ""; + pub static DLL_SUFFIX: &'static str = ""; + pub static DLL_EXTENSION: &'static str = ""; + pub static EXE_SUFFIX: &'static str = ""; + pub static EXE_EXTENSION: &'static str = ""; + } + pub mod x86 { pub static ARCH: &'static str = "x86"; diff --git a/src/libsyntax/abi.rs b/src/libsyntax/abi.rs index a06415bc083a8..56f0b7c5ab482 100644 --- a/src/libsyntax/abi.rs +++ b/src/libsyntax/abi.rs @@ -13,7 +13,7 @@ use std::vec_ng::Vec; use std::fmt::Show; #[deriving(Eq)] -pub enum Os { OsWin32, OsMacos, OsLinux, OsAndroid, OsFreebsd, } +pub enum Os { OsWin32, OsMacos, OsLinux, OsAndroid, OsFreebsd, OsUnknown, } #[deriving(Eq, Hash)] pub enum Abi {