diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index f1984708b66..7d50e6f6917 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -99,14 +99,8 @@ pub mod diagnostics; pub mod back { pub use rustc_back::abi; - pub use rustc_back::arm; - pub use rustc_back::mips; - pub use rustc_back::mipsel; pub use rustc_back::rpath; pub use rustc_back::svh; - pub use rustc_back::target_strs; - pub use rustc_back::x86; - pub use rustc_back::x86_64; } pub mod ast_map; diff --git a/src/librustc_back/arm.rs b/src/librustc_back/arm.rs deleted file mode 100644 index 9e288f6ddb2..00000000000 --- a/src/librustc_back/arm.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use target_strs; -use syntax::abi; - -pub fn get_target_strs(target_triple: String, target_os: abi::Os) -> target_strs::t { - let cc_args = if target_triple.contains("thumb") { - vec!("-mthumb".to_string()) - } else { - vec!("-marm".to_string()) - }; - return target_strs::t { - module_asm: "".to_string(), - - data_layout: match target_os { - abi::OsMacos => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsiOS => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsWindows => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsLinux => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsAndroid => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsFreebsd | abi::OsDragonfly | abi::OsBitrig | abi::OsOpenbsd | abi::OsNetbsd => { - "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\ - -a:0:64-n32".to_string() - } - }, - - target_triple: target_triple, - - cc_args: cc_args, - }; -} diff --git a/src/librustc_back/lib.rs b/src/librustc_back/lib.rs index ef5ba625e11..ecba37c2315 100644 --- a/src/librustc_back/lib.rs +++ b/src/librustc_back/lib.rs @@ -52,13 +52,7 @@ extern crate rustc_llvm; pub mod abi; pub mod tempdir; -pub mod arm; -pub mod mips; -pub mod mipsel; pub mod rpath; pub mod sha2; pub mod svh; -pub mod target_strs; -pub mod x86; -pub mod x86_64; pub mod target; diff --git a/src/librustc_back/mips.rs b/src/librustc_back/mips.rs deleted file mode 100644 index e1edff817d6..00000000000 --- a/src/librustc_back/mips.rs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use target_strs; -use syntax::abi; - -pub fn get_target_strs(target_triple: String, target_os: abi::Os) -> target_strs::t { - return target_strs::t { - module_asm: "".to_string(), - - data_layout: match target_os { - abi::OsMacos => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsiOS => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsWindows => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsLinux => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsAndroid => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsBitrig | abi::OsDragonfly | abi::OsFreebsd | abi::OsNetbsd | abi::OsOpenbsd => { - "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\ - -a:0:64-n32".to_string() - } - }, - - target_triple: target_triple, - - cc_args: Vec::new(), - }; -} diff --git a/src/librustc_back/mipsel.rs b/src/librustc_back/mipsel.rs deleted file mode 100644 index ca52a9e56ff..00000000000 --- a/src/librustc_back/mipsel.rs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use target_strs; -use syntax::abi; - -pub fn get_target_strs(target_triple: String, target_os: abi::Os) -> target_strs::t { - return target_strs::t { - module_asm: "".to_string(), - - data_layout: match target_os { - abi::OsMacos => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsiOS => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsWindows => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsLinux => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsAndroid => { - "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\ - -a:0:64-n32".to_string() - } - - abi::OsFreebsd | abi::OsDragonfly | abi::OsBitrig | abi::OsOpenbsd | abi::OsNetbsd => { - "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\ - -a:0:64-n32".to_string() - } - }, - - target_triple: target_triple, - - cc_args: Vec::new(), - }; -} diff --git a/src/librustc_back/target/aarch64_apple_ios.rs b/src/librustc_back/target/aarch64_apple_ios.rs index dd6bc672a03..e87cb43128d 100644 --- a/src/librustc_back/target/aarch64_apple_ios.rs +++ b/src/librustc_back/target/aarch64_apple_ios.rs @@ -13,10 +13,6 @@ use super::apple_ios_base::{opts, Arch}; pub fn target() -> Target { Target { - // reference layout: e-m:o-i64:64-i128:128-n32:64-S128 - data_layout: "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-\ - i128:128-f32:32:32-f64:64:64-v64:64:64-v128:128:128-\ - a:0:64-n32:64-S128".to_string(), llvm_target: "arm64-apple-ios".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/aarch64_linux_android.rs b/src/librustc_back/target/aarch64_linux_android.rs index 67194e7ac5c..8c350e8b287 100644 --- a/src/librustc_back/target/aarch64_linux_android.rs +++ b/src/librustc_back/target/aarch64_linux_android.rs @@ -12,9 +12,6 @@ use target::Target; pub fn target() -> Target { Target { - 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-a:0:64-\ - n32:64-S128".to_string(), llvm_target: "aarch64-linux-android".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/aarch64_unknown_linux_gnu.rs b/src/librustc_back/target/aarch64_unknown_linux_gnu.rs index 18e67d066d0..ed79caf4869 100644 --- a/src/librustc_back/target/aarch64_unknown_linux_gnu.rs +++ b/src/librustc_back/target/aarch64_unknown_linux_gnu.rs @@ -13,9 +13,6 @@ use target::Target; pub fn target() -> Target { let base = super::linux_base::opts(); Target { - 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-a:0:64-\ - n32:64-S128".to_string(), llvm_target: "aarch64-unknown-linux-gnu".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/arm_linux_androideabi.rs b/src/librustc_back/target/arm_linux_androideabi.rs index cbaa2b205b0..0770fe70e8a 100644 --- a/src/librustc_back/target/arm_linux_androideabi.rs +++ b/src/librustc_back/target/arm_linux_androideabi.rs @@ -15,9 +15,6 @@ pub fn target() -> Target { base.features = "+v7".to_string(); Target { - data_layout: "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-a:0:64-\ - n32".to_string(), llvm_target: "arm-linux-androideabi".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/arm_unknown_linux_gnueabi.rs b/src/librustc_back/target/arm_unknown_linux_gnueabi.rs index 30015c4a7e6..084f989277f 100644 --- a/src/librustc_back/target/arm_unknown_linux_gnueabi.rs +++ b/src/librustc_back/target/arm_unknown_linux_gnueabi.rs @@ -13,11 +13,6 @@ use target::{Target, TargetOptions}; pub fn target() -> Target { let base = super::linux_base::opts(); Target { - data_layout: "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\ - -a:0:64-n32".to_string(), llvm_target: "arm-unknown-linux-gnueabi".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/arm_unknown_linux_gnueabihf.rs b/src/librustc_back/target/arm_unknown_linux_gnueabihf.rs index 8f8c7114e6e..08f1aa5ade8 100644 --- a/src/librustc_back/target/arm_unknown_linux_gnueabihf.rs +++ b/src/librustc_back/target/arm_unknown_linux_gnueabihf.rs @@ -13,11 +13,6 @@ use target::{Target, TargetOptions}; pub fn target() -> Target { let base = super::linux_base::opts(); Target { - data_layout: "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\ - -a:0:64-n32".to_string(), llvm_target: "arm-unknown-linux-gnueabihf".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/armv7_apple_ios.rs b/src/librustc_back/target/armv7_apple_ios.rs index 3b55993659d..a6d649ea162 100644 --- a/src/librustc_back/target/armv7_apple_ios.rs +++ b/src/librustc_back/target/armv7_apple_ios.rs @@ -13,7 +13,6 @@ use super::apple_ios_base::{opts, Arch}; pub fn target() -> Target { Target { - data_layout: "e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32".to_string(), llvm_target: "armv7-apple-ios".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/armv7s_apple_ios.rs b/src/librustc_back/target/armv7s_apple_ios.rs index 5a67e3fe127..264385512ad 100644 --- a/src/librustc_back/target/armv7s_apple_ios.rs +++ b/src/librustc_back/target/armv7s_apple_ios.rs @@ -13,7 +13,6 @@ use super::apple_ios_base::{opts, Arch}; pub fn target() -> Target { Target { - data_layout: "e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32".to_string(), llvm_target: "armv7s-apple-ios".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/i386_apple_ios.rs b/src/librustc_back/target/i386_apple_ios.rs index a9a073e2a8c..d17aa915461 100644 --- a/src/librustc_back/target/i386_apple_ios.rs +++ b/src/librustc_back/target/i386_apple_ios.rs @@ -13,11 +13,6 @@ use super::apple_ios_base::{opts, Arch}; pub fn target() -> Target { Target { - data_layout: "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16\ - -i32:32:32-i64:32:64\ - -f32:32:32-f64:32:64-v64:64:64\ - -v128:128:128-a:0:64-f80:128:128\ - -n8:16:32".to_string(), llvm_target: "i386-apple-ios".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/i686_apple_darwin.rs b/src/librustc_back/target/i686_apple_darwin.rs index 47b329982d4..9fe15e76942 100644 --- a/src/librustc_back/target/i686_apple_darwin.rs +++ b/src/librustc_back/target/i686_apple_darwin.rs @@ -16,11 +16,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m32".to_string()); Target { - data_layout: "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16\ - -i32:32:32-i64:32:64\ - -f32:32:32-f64:32:64-v64:64:64\ - -v128:128:128-a:0:64-f80:128:128\ - -n8:16:32".to_string(), llvm_target: "i686-apple-darwin".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/i686_pc_windows_gnu.rs b/src/librustc_back/target/i686_pc_windows_gnu.rs index 9e2aa20085c..ae1b4d450a5 100644 --- a/src/librustc_back/target/i686_pc_windows_gnu.rs +++ b/src/librustc_back/target/i686_pc_windows_gnu.rs @@ -24,7 +24,6 @@ pub fn target() -> Target { options.pre_link_args.push("-shared-libgcc".to_string()); Target { - data_layout: "e-p:32:32-f64:64:64-i64:64:64-f80:32:32-n8:16:32".to_string(), llvm_target: "i686-pc-windows-gnu".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/i686_pc_windows_msvc.rs b/src/librustc_back/target/i686_pc_windows_msvc.rs index d71aa152666..f2ae799bd24 100644 --- a/src/librustc_back/target/i686_pc_windows_msvc.rs +++ b/src/librustc_back/target/i686_pc_windows_msvc.rs @@ -15,7 +15,6 @@ pub fn target() -> Target { base.cpu = "i686".to_string(); Target { - data_layout: "e-p:32:32-f64:64:64-i64:64:64-f80:32:32-n8:16:32".to_string(), llvm_target: "i686-pc-windows-msvc".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/i686_unknown_dragonfly.rs b/src/librustc_back/target/i686_unknown_dragonfly.rs index ecabe71ad4c..f2478e6d0db 100644 --- a/src/librustc_back/target/i686_unknown_dragonfly.rs +++ b/src/librustc_back/target/i686_unknown_dragonfly.rs @@ -16,7 +16,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m32".to_string()); Target { - data_layout: "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string(), llvm_target: "i686-unknown-dragonfly".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/i686_unknown_freebsd.rs b/src/librustc_back/target/i686_unknown_freebsd.rs index d3477402cef..68fee41e2cf 100644 --- a/src/librustc_back/target/i686_unknown_freebsd.rs +++ b/src/librustc_back/target/i686_unknown_freebsd.rs @@ -17,7 +17,6 @@ pub fn target() -> Target { base.morestack = false; Target { - data_layout: "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string(), llvm_target: "i686-unknown-freebsd".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/i686_unknown_linux_gnu.rs b/src/librustc_back/target/i686_unknown_linux_gnu.rs index 21094ad905e..074d5b2b9ed 100644 --- a/src/librustc_back/target/i686_unknown_linux_gnu.rs +++ b/src/librustc_back/target/i686_unknown_linux_gnu.rs @@ -16,7 +16,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m32".to_string()); Target { - data_layout: "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string(), llvm_target: "i686-unknown-linux-gnu".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/mips_unknown_linux_gnu.rs b/src/librustc_back/target/mips_unknown_linux_gnu.rs index 4662ff1958b..3f3da6d6c91 100644 --- a/src/librustc_back/target/mips_unknown_linux_gnu.rs +++ b/src/librustc_back/target/mips_unknown_linux_gnu.rs @@ -12,11 +12,6 @@ use target::Target; pub fn target() -> Target { Target { - data_layout: "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\ - -a:0:64-n32".to_string(), llvm_target: "mips-unknown-linux-gnu".to_string(), target_endian: "big".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/mipsel_unknown_linux_gnu.rs b/src/librustc_back/target/mipsel_unknown_linux_gnu.rs index 80e38c5ddea..d7f286c8aa4 100644 --- a/src/librustc_back/target/mipsel_unknown_linux_gnu.rs +++ b/src/librustc_back/target/mipsel_unknown_linux_gnu.rs @@ -12,11 +12,6 @@ use target::Target; pub fn target() -> Target { Target { - data_layout: "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\ - -a:0:64-n32".to_string(), llvm_target: "mipsel-unknown-linux-gnu".to_string(), target_endian: "little".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs index 185d1c9428e..39e42913ff6 100644 --- a/src/librustc_back/target/mod.rs +++ b/src/librustc_back/target/mod.rs @@ -67,8 +67,6 @@ mod windows_msvc_base; /// Every field here must be specified, and has no default value. #[derive(Clone, Debug)] pub struct Target { - /// [Data layout](http://llvm.org/docs/LangRef.html#data-layout) to pass to LLVM. - pub data_layout: String, /// Target triple to pass to LLVM. pub llvm_target: String, /// String to use as the `target_endian` `cfg` variable. @@ -92,6 +90,8 @@ pub struct Target { /// these try to take "minimal defaults" that don't assume anything about the runtime they run in. #[derive(Clone, Debug)] pub struct TargetOptions { + /// [Data layout](http://llvm.org/docs/LangRef.html#data-layout) to pass to LLVM. + pub data_layout: String, /// Linker to invoke. Defaults to "cc". pub linker: String, /// Archive utility to use when managing archives. Defaults to "ar". @@ -178,6 +178,7 @@ impl Default for TargetOptions { /// incomplete, and if used for compilation, will certainly not work. fn default() -> TargetOptions { TargetOptions { + data_layout: String::new(), linker: "cc".to_string(), ar: "ar".to_string(), pre_link_args: Vec::new(), @@ -245,7 +246,6 @@ impl Target { }; let mut base = Target { - data_layout: get_req_field("data-layout"), llvm_target: get_req_field("llvm-target"), target_endian: get_req_field("target-endian"), target_pointer_width: get_req_field("target-pointer-width"), @@ -289,6 +289,7 @@ impl Target { key!(staticlib_prefix); key!(staticlib_suffix); key!(features); + key!(data_layout); key!(dynamic_linking, bool); key!(executables, bool); key!(morestack, bool); diff --git a/src/librustc_back/target/powerpc_unknown_linux_gnu.rs b/src/librustc_back/target/powerpc_unknown_linux_gnu.rs index 3a2b4bd1606..896824eba0e 100644 --- a/src/librustc_back/target/powerpc_unknown_linux_gnu.rs +++ b/src/librustc_back/target/powerpc_unknown_linux_gnu.rs @@ -15,7 +15,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m32".to_string()); Target { - data_layout: "E-S8-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string(), llvm_target: "powerpc-unknown-linux-gnu".to_string(), target_endian: "big".to_string(), target_pointer_width: "32".to_string(), diff --git a/src/librustc_back/target/x86_64_apple_darwin.rs b/src/librustc_back/target/x86_64_apple_darwin.rs index 89a67da2d8b..ef40c2f2006 100644 --- a/src/librustc_back/target/x86_64_apple_darwin.rs +++ b/src/librustc_back/target/x86_64_apple_darwin.rs @@ -17,9 +17,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m64".to_string()); Target { - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64".to_string(), llvm_target: "x86_64-apple-darwin".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_apple_ios.rs b/src/librustc_back/target/x86_64_apple_ios.rs index 74491629ed8..7aca8c554da 100644 --- a/src/librustc_back/target/x86_64_apple_ios.rs +++ b/src/librustc_back/target/x86_64_apple_ios.rs @@ -13,9 +13,6 @@ use super::apple_ios_base::{opts, Arch}; pub fn target() -> Target { Target { - 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".to_string(), llvm_target: "x86_64-apple-ios".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_pc_windows_gnu.rs b/src/librustc_back/target/x86_64_pc_windows_gnu.rs index bea7d16e9df..e4d7b4bc9b0 100644 --- a/src/librustc_back/target/x86_64_pc_windows_gnu.rs +++ b/src/librustc_back/target/x86_64_pc_windows_gnu.rs @@ -18,10 +18,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m64".to_string()); Target { - // FIXME: Test this. Copied from linux (#2398) - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(), llvm_target: "x86_64-pc-windows-gnu".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_pc_windows_msvc.rs b/src/librustc_back/target/x86_64_pc_windows_msvc.rs index f7c3ca4b3f6..addaaeb1b63 100644 --- a/src/librustc_back/target/x86_64_pc_windows_msvc.rs +++ b/src/librustc_back/target/x86_64_pc_windows_msvc.rs @@ -15,13 +15,6 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); Target { - // This is currently in sync with the specification for - // x86_64-pc-windows-gnu but there's a comment in that file questioning - // whether this is valid or not. Sounds like the two should stay in sync - // at least for now. - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(), llvm_target: "x86_64-pc-windows-msvc".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_unknown_bitrig.rs b/src/librustc_back/target/x86_64_unknown_bitrig.rs index 201c56b2e15..6ecf885aba3 100644 --- a/src/librustc_back/target/x86_64_unknown_bitrig.rs +++ b/src/librustc_back/target/x86_64_unknown_bitrig.rs @@ -15,9 +15,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m64".to_string()); Target { - 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-bitrig".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_unknown_dragonfly.rs b/src/librustc_back/target/x86_64_unknown_dragonfly.rs index c590f0297b9..f0e665967ec 100644 --- a/src/librustc_back/target/x86_64_unknown_dragonfly.rs +++ b/src/librustc_back/target/x86_64_unknown_dragonfly.rs @@ -16,9 +16,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m64".to_string()); Target { - 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-a: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_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_unknown_freebsd.rs b/src/librustc_back/target/x86_64_unknown_freebsd.rs index 0d8ea90a2ab..f742ebfde1d 100644 --- a/src/librustc_back/target/x86_64_unknown_freebsd.rs +++ b/src/librustc_back/target/x86_64_unknown_freebsd.rs @@ -16,9 +16,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m64".to_string()); Target { - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(), llvm_target: "x86_64-unknown-freebsd".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_unknown_linux_gnu.rs b/src/librustc_back/target/x86_64_unknown_linux_gnu.rs index ba945afc564..4749e481fd8 100644 --- a/src/librustc_back/target/x86_64_unknown_linux_gnu.rs +++ b/src/librustc_back/target/x86_64_unknown_linux_gnu.rs @@ -16,9 +16,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m64".to_string()); Target { - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(), llvm_target: "x86_64-unknown-linux-gnu".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_unknown_linux_musl.rs b/src/librustc_back/target/x86_64_unknown_linux_musl.rs index 3debad2e8f2..c66192c28b1 100644 --- a/src/librustc_back/target/x86_64_unknown_linux_musl.rs +++ b/src/librustc_back/target/x86_64_unknown_linux_musl.rs @@ -70,9 +70,6 @@ pub fn target() -> Target { base.position_independent_executables = false; Target { - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(), llvm_target: "x86_64-unknown-linux-musl".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_unknown_netbsd.rs b/src/librustc_back/target/x86_64_unknown_netbsd.rs index 3f5bd39949a..e13e58e3a18 100644 --- a/src/librustc_back/target/x86_64_unknown_netbsd.rs +++ b/src/librustc_back/target/x86_64_unknown_netbsd.rs @@ -15,9 +15,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m64".to_string()); Target { - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(), llvm_target: "x86_64-unknown-netbsd".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target/x86_64_unknown_openbsd.rs b/src/librustc_back/target/x86_64_unknown_openbsd.rs index 7f64259adf9..a404db48b22 100644 --- a/src/librustc_back/target/x86_64_unknown_openbsd.rs +++ b/src/librustc_back/target/x86_64_unknown_openbsd.rs @@ -15,9 +15,6 @@ pub fn target() -> Target { base.pre_link_args.push("-m64".to_string()); Target { - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(), llvm_target: "x86_64-unknown-openbsd".to_string(), target_endian: "little".to_string(), target_pointer_width: "64".to_string(), diff --git a/src/librustc_back/target_strs.rs b/src/librustc_back/target_strs.rs deleted file mode 100644 index 7928f3d8db0..00000000000 --- a/src/librustc_back/target_strs.rs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#![allow(non_camel_case_types)] - -pub struct t { - pub module_asm: String, - pub data_layout: String, - pub target_triple: String, - pub cc_args: Vec , -} diff --git a/src/librustc_back/x86.rs b/src/librustc_back/x86.rs deleted file mode 100644 index 46e0a83ac03..00000000000 --- a/src/librustc_back/x86.rs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - - -use target_strs; -use syntax::abi; - -pub fn get_target_strs(target_triple: String, target_os: abi::Os) - -> target_strs::t { - return target_strs::t { - module_asm: "".to_string(), - - data_layout: match target_os { - abi::OsMacos => { - "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16\ - -i32:32:32-i64:32:64\ - -f32:32:32-f64:32:64-v64:64:64\ - -v128:128:128-a:0:64-f80:128:128\ - -n8:16:32".to_string() - } - - abi::OsiOS => { - "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16\ - -i32:32:32-i64:32:64\ - -f32:32:32-f64:32:64-v64:64:64\ - -v128:128:128-a:0:64-f80:128:128\ - -n8:16:32".to_string() - } - - abi::OsWindows => { - "e-p:32:32-f64:64:64-i64:64:64-f80:32:32-n8:16:32".to_string() - } - - abi::OsLinux => { - "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string() - } - abi::OsAndroid => { - "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string() - } - - abi::OsFreebsd | abi::OsDragonfly | abi::OsBitrig | abi::OsOpenbsd | abi::OsNetbsd => { - "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string() - } - - }, - - target_triple: target_triple, - - cc_args: vec!("-m32".to_string()), - }; -} diff --git a/src/librustc_back/x86_64.rs b/src/librustc_back/x86_64.rs deleted file mode 100644 index abdcd564442..00000000000 --- a/src/librustc_back/x86_64.rs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - - -use target_strs; -use syntax::abi; - -pub fn get_target_strs(target_triple: String, target_os: abi::Os) -> target_strs::t { - return target_strs::t { - module_asm: "".to_string(), - - data_layout: match target_os { - abi::OsMacos => { - "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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64".to_string() - } - - abi::OsiOS => { - "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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64".to_string() - } - - abi::OsWindows => { - // FIXME: Test this. Copied from Linux (#2398) - "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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string() - } - - abi::OsLinux => { - "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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string() - } - 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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string() - } - - abi::OsBitrig | abi::OsDragonfly | abi::OsFreebsd | abi::OsNetbsd | abi::OsOpenbsd => { - "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-a:0:64-\ - s0:64:64-f80:128:128-n8:16:32:64-S128".to_string() - } - - }, - - target_triple: target_triple, - - cc_args: vec!("-m64".to_string()), - }; -} diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index 051cc1c5bb2..7734704b021 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -2134,6 +2134,10 @@ extern { Name: *const c_char, Child: ArchiveChildRef) -> RustArchiveMemberRef; pub fn LLVMRustArchiveMemberFree(Member: RustArchiveMemberRef); + + pub fn LLVMRustSetDataLayoutFromTargetMachine(M: ModuleRef, + TM: TargetMachineRef); + pub fn LLVMRustGetModuleDataLayout(M: ModuleRef) -> TargetDataRef; } // LLVM requires symbols from this library, but apparently they're not printed diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index 0a9db8a651e..1f97a9b93ed 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -163,7 +163,7 @@ fn get_llvm_opt_level(optimize: config::OptLevel) -> llvm::CodeGenOptLevel { } } -fn create_target_machine(sess: &Session) -> TargetMachineRef { +pub fn create_target_machine(sess: &Session) -> TargetMachineRef { let reloc_model_arg = match sess.opts.cg.relocation_model { Some(ref s) => &s[..], None => &sess.target.target.options.relocation_model[..], @@ -591,10 +591,6 @@ pub fn run_passes(sess: &Session, // Sanity check assert!(trans.modules.len() == sess.opts.cg.codegen_units); - unsafe { - configure_llvm(sess); - } - let tm = create_target_machine(sess); // Figure out what we actually need to build. @@ -943,10 +939,7 @@ pub fn run_assembler(sess: &Session, outputs: &OutputFilenames) { } } -unsafe fn configure_llvm(sess: &Session) { - use std::sync::Once; - static INIT: Once = Once::new(); - +pub unsafe fn configure_llvm(sess: &Session) { let mut llvm_c_strs = Vec::new(); let mut llvm_args = Vec::new(); @@ -968,46 +961,44 @@ unsafe fn configure_llvm(sess: &Session) { } } - INIT.call_once(|| { - llvm::LLVMInitializePasses(); + llvm::LLVMInitializePasses(); - // Only initialize the platforms supported by Rust here, because - // using --llvm-root will have multiple platforms that rustllvm - // doesn't actually link to and it's pointless to put target info - // into the registry that Rust cannot generate machine code for. - llvm::LLVMInitializeX86TargetInfo(); - llvm::LLVMInitializeX86Target(); - llvm::LLVMInitializeX86TargetMC(); - llvm::LLVMInitializeX86AsmPrinter(); - llvm::LLVMInitializeX86AsmParser(); + // Only initialize the platforms supported by Rust here, because + // using --llvm-root will have multiple platforms that rustllvm + // doesn't actually link to and it's pointless to put target info + // into the registry that Rust cannot generate machine code for. + llvm::LLVMInitializeX86TargetInfo(); + llvm::LLVMInitializeX86Target(); + llvm::LLVMInitializeX86TargetMC(); + llvm::LLVMInitializeX86AsmPrinter(); + llvm::LLVMInitializeX86AsmParser(); - llvm::LLVMInitializeARMTargetInfo(); - llvm::LLVMInitializeARMTarget(); - llvm::LLVMInitializeARMTargetMC(); - llvm::LLVMInitializeARMAsmPrinter(); - llvm::LLVMInitializeARMAsmParser(); + llvm::LLVMInitializeARMTargetInfo(); + llvm::LLVMInitializeARMTarget(); + llvm::LLVMInitializeARMTargetMC(); + llvm::LLVMInitializeARMAsmPrinter(); + llvm::LLVMInitializeARMAsmParser(); - llvm::LLVMInitializeAArch64TargetInfo(); - llvm::LLVMInitializeAArch64Target(); - llvm::LLVMInitializeAArch64TargetMC(); - llvm::LLVMInitializeAArch64AsmPrinter(); - llvm::LLVMInitializeAArch64AsmParser(); + llvm::LLVMInitializeAArch64TargetInfo(); + llvm::LLVMInitializeAArch64Target(); + llvm::LLVMInitializeAArch64TargetMC(); + llvm::LLVMInitializeAArch64AsmPrinter(); + llvm::LLVMInitializeAArch64AsmParser(); - llvm::LLVMInitializeMipsTargetInfo(); - llvm::LLVMInitializeMipsTarget(); - llvm::LLVMInitializeMipsTargetMC(); - llvm::LLVMInitializeMipsAsmPrinter(); - llvm::LLVMInitializeMipsAsmParser(); + llvm::LLVMInitializeMipsTargetInfo(); + llvm::LLVMInitializeMipsTarget(); + llvm::LLVMInitializeMipsTargetMC(); + llvm::LLVMInitializeMipsAsmPrinter(); + llvm::LLVMInitializeMipsAsmParser(); - llvm::LLVMInitializePowerPCTargetInfo(); - llvm::LLVMInitializePowerPCTarget(); - llvm::LLVMInitializePowerPCTargetMC(); - llvm::LLVMInitializePowerPCAsmPrinter(); - llvm::LLVMInitializePowerPCAsmParser(); + llvm::LLVMInitializePowerPCTargetInfo(); + llvm::LLVMInitializePowerPCTarget(); + llvm::LLVMInitializePowerPCTargetMC(); + llvm::LLVMInitializePowerPCAsmPrinter(); + llvm::LLVMInitializePowerPCAsmParser(); - llvm::LLVMRustSetLLVMOptions(llvm_args.len() as c_int, - llvm_args.as_ptr()); - }); + llvm::LLVMRustSetLLVMOptions(llvm_args.len() as c_int, + llvm_args.as_ptr()); } unsafe fn populate_llvm_passes(fpm: llvm::PassManagerRef, diff --git a/src/librustc_trans/lib.rs b/src/librustc_trans/lib.rs index 0e425e1fd99..af894b218ef 100644 --- a/src/librustc_trans/lib.rs +++ b/src/librustc_trans/lib.rs @@ -68,14 +68,8 @@ pub use rustc::util; pub mod back { pub use rustc_back::abi; - pub use rustc_back::arm; - pub use rustc_back::mips; - pub use rustc_back::mipsel; pub use rustc_back::rpath; pub use rustc_back::svh; - pub use rustc_back::target_strs; - pub use rustc_back::x86; - pub use rustc_back::x86_64; pub mod archive; pub mod linker; diff --git a/src/librustc_trans/trans/base.rs b/src/librustc_trans/trans/base.rs index edb61b0d3cf..4aeba2fe062 100644 --- a/src/librustc_trans/trans/base.rs +++ b/src/librustc_trans/trans/base.rs @@ -2666,6 +2666,8 @@ pub fn trans_crate(tcx: &ty::ctxt, analysis: ty::CrateAnalysis) -> CrateTranslat // cannot proceed despite the Once not running more than once. POISONED = true; } + + ::back::write::configure_llvm(&tcx.sess); }); if POISONED { diff --git a/src/librustc_trans/trans/context.rs b/src/librustc_trans/trans/context.rs index cf9d70cc657..5a4bd7ff3a1 100644 --- a/src/librustc_trans/trans/context.rs +++ b/src/librustc_trans/trans/context.rs @@ -10,8 +10,6 @@ use llvm; use llvm::{ContextRef, ModuleRef, ValueRef, BuilderRef}; -use llvm::TargetData; -use llvm::mk_target_data; use metadata::common::LinkMeta; use middle::def::ExportMap; use middle::traits; @@ -83,7 +81,6 @@ pub struct SharedCrateContext<'a, 'tcx: 'a> { pub struct LocalCrateContext<'tcx> { llmod: ModuleRef, llcx: ContextRef, - td: TargetData, tn: TypeNames, externs: RefCell, item_vals: RefCell>, @@ -226,9 +223,15 @@ unsafe fn create_context_and_module(sess: &Session, mod_name: &str) -> (ContextR let mod_name = CString::new(mod_name).unwrap(); let llmod = llvm::LLVMModuleCreateWithNameInContext(mod_name.as_ptr(), llcx); - let data_layout = sess.target.target.data_layout.as_bytes(); - let data_layout = CString::new(data_layout).unwrap(); - llvm::LLVMSetDataLayout(llmod, data_layout.as_ptr()); + let custom_data_layout = &sess.target.target.options.data_layout[..]; + if custom_data_layout.len() > 0 { + let data_layout = CString::new(custom_data_layout).unwrap(); + llvm::LLVMSetDataLayout(llmod, data_layout.as_ptr()); + } else { + let tm = ::back::write::create_target_machine(sess); + llvm::LLVMRustSetDataLayoutFromTargetMachine(llmod, tm); + llvm::LLVMRustDisposeTargetMachine(tm); + } let llvm_target = sess.target.target.llvm_target.as_bytes(); let llvm_target = CString::new(llvm_target).unwrap(); @@ -419,13 +422,6 @@ impl<'tcx> LocalCrateContext<'tcx> { unsafe { let (llcx, llmod) = create_context_and_module(&shared.tcx.sess, name); - let td = mk_target_data(&shared.tcx - .sess - .target - .target - .data_layout - ); - let dbg_cx = if shared.tcx.sess.opts.debuginfo != NoDebugInfo { Some(debuginfo::CrateDebugContext::new(llmod)) } else { @@ -435,7 +431,6 @@ impl<'tcx> LocalCrateContext<'tcx> { let mut local_ccx = LocalCrateContext { llmod: llmod, llcx: llcx, - td: td, tn: TypeNames::new(), externs: RefCell::new(FnvHashMap()), item_vals: RefCell::new(NodeMap()), @@ -581,8 +576,8 @@ impl<'b, 'tcx> CrateContext<'b, 'tcx> { self.local.llcx } - pub fn td<'a>(&'a self) -> &'a TargetData { - &self.local.td + pub fn td(&self) -> llvm::TargetDataRef { + unsafe { llvm::LLVMRustGetModuleDataLayout(self.llmod()) } } pub fn tn<'a>(&'a self) -> &'a TypeNames { diff --git a/src/librustc_trans/trans/machine.rs b/src/librustc_trans/trans/machine.rs index 39bc547a1a7..691fba42d57 100644 --- a/src/librustc_trans/trans/machine.rs +++ b/src/librustc_trans/trans/machine.rs @@ -27,7 +27,7 @@ pub type llalign = u32; // Returns the number of bytes clobbered by a Store to this type. pub fn llsize_of_store(cx: &CrateContext, ty: Type) -> llsize { unsafe { - return llvm::LLVMStoreSizeOfType(cx.td().lltd, ty.to_ref()); + return llvm::LLVMStoreSizeOfType(cx.td(), ty.to_ref()); } } @@ -35,7 +35,7 @@ pub fn llsize_of_store(cx: &CrateContext, ty: Type) -> llsize { // array of T. This is the "ABI" size. It includes any ABI-mandated padding. pub fn llsize_of_alloc(cx: &CrateContext, ty: Type) -> llsize { unsafe { - return llvm::LLVMABISizeOfType(cx.td().lltd, ty.to_ref()); + return llvm::LLVMABISizeOfType(cx.td(), ty.to_ref()); } } @@ -51,7 +51,7 @@ pub fn llsize_of_alloc(cx: &CrateContext, ty: Type) -> llsize { // below. pub fn llsize_of_real(cx: &CrateContext, ty: Type) -> llsize { unsafe { - let nbits = llvm::LLVMSizeOfTypeInBits(cx.td().lltd, ty.to_ref()); + let nbits = llvm::LLVMSizeOfTypeInBits(cx.td(), ty.to_ref()); if nbits & 7 != 0 { // Not an even number of bytes, spills into "next" byte. 1 + (nbits >> 3) @@ -64,7 +64,7 @@ pub fn llsize_of_real(cx: &CrateContext, ty: Type) -> llsize { /// Returns the "real" size of the type in bits. pub fn llbitsize_of_real(cx: &CrateContext, ty: Type) -> llbits { unsafe { - llvm::LLVMSizeOfTypeInBits(cx.td().lltd, ty.to_ref()) + llvm::LLVMSizeOfTypeInBits(cx.td(), ty.to_ref()) } } @@ -86,7 +86,7 @@ pub fn llsize_of(cx: &CrateContext, ty: Type) -> ValueRef { // allocations inside a stack frame, which LLVM has a free hand in. pub fn llalign_of_pref(cx: &CrateContext, ty: Type) -> llalign { unsafe { - return llvm::LLVMPreferredAlignmentOfType(cx.td().lltd, ty.to_ref()); + return llvm::LLVMPreferredAlignmentOfType(cx.td(), ty.to_ref()); } } @@ -95,13 +95,13 @@ pub fn llalign_of_pref(cx: &CrateContext, ty: Type) -> llalign { // and similar ABI-mandated things. pub fn llalign_of_min(cx: &CrateContext, ty: Type) -> llalign { unsafe { - return llvm::LLVMABIAlignmentOfType(cx.td().lltd, ty.to_ref()); + return llvm::LLVMABIAlignmentOfType(cx.td(), ty.to_ref()); } } pub fn llelement_offset(cx: &CrateContext, struct_ty: Type, element: usize) -> u64 { unsafe { - return llvm::LLVMOffsetOfElement(cx.td().lltd, + return llvm::LLVMOffsetOfElement(cx.td(), struct_ty.to_ref(), element as u32); } diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 2c0240eb8f9..6513fdfd2f2 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -21,6 +21,8 @@ #else #include "llvm/Target/TargetLibraryInfo.h" #endif +#include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetSubtargetInfo.h" #include "llvm/Transforms/IPO/PassManagerBuilder.h" @@ -327,3 +329,28 @@ LLVMRustMarkAllFunctionsNounwind(LLVMModuleRef M) { } } } + +extern "C" void +LLVMRustSetDataLayoutFromTargetMachine(LLVMModuleRef Module, + LLVMTargetMachineRef TMR) { + TargetMachine *Target = unwrap(TMR); +#if LLVM_VERSION_MINOR >= 7 + if (const DataLayout *DL = Target->getDataLayout()) + unwrap(Module)->setDataLayout(*DL); +#elif LLVM_VERSION_MINOR >= 6 + if (const DataLayout *DL = Target->getSubtargetImpl()->getDataLayout()) + unwrap(Module)->setDataLayout(DL); +#else + if (const DataLayout *DL = Target->getDataLayout()) + unwrap(Module)->setDataLayout(DL); +#endif +} + +extern "C" LLVMTargetDataRef +LLVMRustGetModuleDataLayout(LLVMModuleRef M) { +#if LLVM_VERSION_MINOR >= 7 + return wrap(&unwrap(M)->getDataLayout()); +#else + return wrap(unwrap(M)->getDataLayout()); +#endif +}