From 6131df64cbc996f57ec01c4d4a2eeb71585f0c96 Mon Sep 17 00:00:00 2001 From: Michael Neumann Date: Sun, 14 Dec 2014 18:01:25 +0100 Subject: [PATCH 1/4] Several fixes for DragonFly --- src/liblibc/lib.rs | 12 ++++++++++++ src/librustc_back/rpath.rs | 17 +---------------- .../target/x86_64_unknown_dragonfly.rs | 11 ++++++++--- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/liblibc/lib.rs b/src/liblibc/lib.rs index 8825099e36c35..671e552e08cf5 100644 --- a/src/liblibc/lib.rs +++ b/src/liblibc/lib.rs @@ -1095,6 +1095,7 @@ pub mod types { pub type sighandler_t = size_t; } pub mod bsd44 { + use types::common::c95::{c_void}; use types::os::arch::c95::{c_char, c_int, c_uint}; pub type socklen_t = u32; @@ -1167,6 +1168,17 @@ pub mod types { pub sun_family: sa_family_t, pub sun_path: [c_char, ..104] } + #[repr(C)] + #[deriving(Copy)] pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut c_char, + pub ifa_flags: c_uint, + pub ifa_addr: *mut sockaddr, + pub ifa_netmask: *mut sockaddr, + pub ifa_dstaddr: *mut sockaddr, + pub ifa_data: *mut c_void + } + } } diff --git a/src/librustc_back/rpath.rs b/src/librustc_back/rpath.rs index 1f8549098d949..10ba023c6193d 100644 --- a/src/librustc_back/rpath.rs +++ b/src/librustc_back/rpath.rs @@ -215,22 +215,7 @@ mod test { } #[test] - #[cfg(target_os = "freebsd")] - fn test_rpath_relative() { - let config = &mut RPathConfig { - used_crates: Vec::new(), - has_rpath: true, - is_like_osx: false, - out_filename: Path::new("bin/rustc"), - get_install_prefix_lib_path: || panic!(), - realpath: |p| Ok(p.clone()) - }; - let res = get_rpath_relative_to_output(config, &Path::new("lib/libstd.so")); - assert_eq!(res, "$ORIGIN/../lib"); - } - - #[test] - #[cfg(target_os = "dragonfly")] + #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] fn test_rpath_relative() { let config = &mut RPathConfig { used_crates: Vec::new(), diff --git a/src/librustc_back/target/x86_64_unknown_dragonfly.rs b/src/librustc_back/target/x86_64_unknown_dragonfly.rs index 79f09a3b00bdb..75dbff9428b3e 100644 --- a/src/librustc_back/target/x86_64_unknown_dragonfly.rs +++ b/src/librustc_back/target/x86_64_unknown_dragonfly.rs @@ -11,13 +11,18 @@ use target::Target; pub fn target() -> Target { + let mut base = super::dragonfly_base::opts(); + base.pre_link_args.push("-m64".to_string()); + Target { - data_layout: "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string(), + data_layout: "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".to_string(), llvm_target: "x86_64-unknown-dragonfly".to_string(), target_endian: "little".to_string(), - target_word_size: "32".to_string(), + target_word_size: "64".to_string(), arch: "x86_64".to_string(), target_os: "dragonfly".to_string(), - options: super::dragonfly_base::opts() + options: base, } } From 31ae4f1ad072a88351deba907e91a1adfd11e084 Mon Sep 17 00:00:00 2001 From: Michael Neumann Date: Mon, 15 Dec 2014 16:25:52 +0100 Subject: [PATCH 2/4] On DragonFly use procfs for self_exe_name() Using /proc/curproc/file does not resolve mount-points as sysctl(3) with KERN_PROC_PATHNAME does, which gave back paths containing colons like /pfs/@@-1:00004/usr/bin. This led to problems when joining paths based on it. --- src/libstd/os.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libstd/os.rs b/src/libstd/os.rs index a3ecfb49acee0..8ae237850da09 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -665,7 +665,7 @@ pub fn dll_filename(base: &str) -> String { /// ``` pub fn self_exe_name() -> Option { - #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] + #[cfg(target_os = "freebsd")] fn load_self() -> Option> { unsafe { use libc::funcs::bsd44::*; @@ -691,6 +691,16 @@ pub fn self_exe_name() -> Option { } } + #[cfg(target_os = "dragonfly")] + fn load_self() -> Option> { + use std::io; + + match io::fs::readlink(&Path::new("/proc/curproc/file")) { + Ok(path) => Some(path.into_vec()), + Err(..) => None + } + } + #[cfg(any(target_os = "linux", target_os = "android"))] fn load_self() -> Option> { use std::io; From 6f4a4066266436fbe88f506aad6232b752cf0cee Mon Sep 17 00:00:00 2001 From: Michael Neumann Date: Mon, 15 Dec 2014 21:42:15 +0100 Subject: [PATCH 3/4] DragonFly 4.0 linker path changed to lib/gcc48 --- src/librustc_back/target/dragonfly_base.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/librustc_back/target/dragonfly_base.rs b/src/librustc_back/target/dragonfly_base.rs index 4e982b2b76eba..8ebbc4da7fd6e 100644 --- a/src/librustc_back/target/dragonfly_base.rs +++ b/src/librustc_back/target/dragonfly_base.rs @@ -20,8 +20,7 @@ pub fn opts() -> TargetOptions { has_rpath: true, pre_link_args: vec!( "-L/usr/local/lib".to_string(), - "-L/usr/local/lib/gcc47".to_string(), - "-L/usr/local/lib/gcc44".to_string(), + "-L/usr/local/lib/gcc48".to_string(), ), .. Default::default() From ecd2d11c4f611ab09f2fc87800a973f33938d825 Mon Sep 17 00:00:00 2001 From: Michael Neumann Date: Tue, 16 Dec 2014 11:50:02 +0100 Subject: [PATCH 4/4] Revert "DragonFly 4.0 linker path changed to lib/gcc48" This reverts commit 6f4a4066266436fbe88f506aad6232b752cf0cee. Paths only moved from /usr/local/lib to /usr/lib. --- src/librustc_back/target/dragonfly_base.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/librustc_back/target/dragonfly_base.rs b/src/librustc_back/target/dragonfly_base.rs index 8ebbc4da7fd6e..4e982b2b76eba 100644 --- a/src/librustc_back/target/dragonfly_base.rs +++ b/src/librustc_back/target/dragonfly_base.rs @@ -20,7 +20,8 @@ pub fn opts() -> TargetOptions { has_rpath: true, pre_link_args: vec!( "-L/usr/local/lib".to_string(), - "-L/usr/local/lib/gcc48".to_string(), + "-L/usr/local/lib/gcc47".to_string(), + "-L/usr/local/lib/gcc44".to_string(), ), .. Default::default()