From 958d5638254958ea42652de7444b63f2e67e7fe3 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 16 Jul 2015 15:48:16 -0700 Subject: [PATCH] trans: Clean up handling the LLVM data layout Turns out for OSX our data layout was subtly wrong and the LLVM update must have exposed this. Instead of fixing this I've removed all data layouts from the compiler to just use the defaults that LLVM provides for all targets. All data layouts (and a number of dead modules) are removed from the compiler here. Custom target specifications can still provide a custom data layout, but it is now an optional key as the default will be used if one isn't specified. --- src/librustc/lib.rs | 6 -- src/librustc_back/arm.rs | 77 ------------------- src/librustc_back/lib.rs | 6 -- src/librustc_back/mips.rs | 72 ----------------- src/librustc_back/mipsel.rs | 72 ----------------- src/librustc_back/target/aarch64_apple_ios.rs | 4 - .../target/aarch64_linux_android.rs | 3 - .../target/aarch64_unknown_linux_gnu.rs | 3 - .../target/arm_linux_androideabi.rs | 3 - .../target/arm_unknown_linux_gnueabi.rs | 5 -- .../target/arm_unknown_linux_gnueabihf.rs | 5 -- src/librustc_back/target/armv7_apple_ios.rs | 1 - src/librustc_back/target/armv7s_apple_ios.rs | 1 - src/librustc_back/target/i386_apple_ios.rs | 5 -- src/librustc_back/target/i686_apple_darwin.rs | 5 -- .../target/i686_pc_windows_gnu.rs | 1 - .../target/i686_pc_windows_msvc.rs | 1 - .../target/i686_unknown_dragonfly.rs | 1 - .../target/i686_unknown_freebsd.rs | 1 - .../target/i686_unknown_linux_gnu.rs | 1 - .../target/mips_unknown_linux_gnu.rs | 5 -- .../target/mipsel_unknown_linux_gnu.rs | 5 -- src/librustc_back/target/mod.rs | 7 +- .../target/powerpc_unknown_linux_gnu.rs | 1 - .../target/x86_64_apple_darwin.rs | 3 - src/librustc_back/target/x86_64_apple_ios.rs | 3 - .../target/x86_64_pc_windows_gnu.rs | 4 - .../target/x86_64_pc_windows_msvc.rs | 7 -- .../target/x86_64_unknown_bitrig.rs | 3 - .../target/x86_64_unknown_dragonfly.rs | 3 - .../target/x86_64_unknown_freebsd.rs | 3 - .../target/x86_64_unknown_linux_gnu.rs | 3 - .../target/x86_64_unknown_linux_musl.rs | 3 - .../target/x86_64_unknown_netbsd.rs | 3 - .../target/x86_64_unknown_openbsd.rs | 3 - src/librustc_back/target_strs.rs | 18 ----- src/librustc_back/x86.rs | 58 -------------- src/librustc_back/x86_64.rs | 62 --------------- src/librustc_llvm/lib.rs | 4 + src/librustc_trans/back/write.rs | 77 ++++++++----------- src/librustc_trans/lib.rs | 6 -- src/librustc_trans/trans/base.rs | 2 + src/librustc_trans/trans/context.rs | 27 +++---- src/librustc_trans/trans/machine.rs | 14 ++-- src/rustllvm/PassWrapper.cpp | 27 +++++++ 45 files changed, 89 insertions(+), 535 deletions(-) delete mode 100644 src/librustc_back/arm.rs delete mode 100644 src/librustc_back/mips.rs delete mode 100644 src/librustc_back/mipsel.rs delete mode 100644 src/librustc_back/target_strs.rs delete mode 100644 src/librustc_back/x86.rs delete mode 100644 src/librustc_back/x86_64.rs diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index f1984708b663..7d50e6f6917c 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 9e288f6ddb2b..000000000000 --- 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 ef5ba625e114..ecba37c23153 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 e1edff817d6c..000000000000 --- 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 ca52a9e56ff5..000000000000 --- 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 dd6bc672a03d..e87cb43128d2 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 67194e7ac5c7..8c350e8b2875 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 18e67d066d03..ed79caf48694 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 cbaa2b205b05..0770fe70e8a5 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 30015c4a7e6f..084f989277f3 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 8f8c7114e6ef..08f1aa5ade84 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 3b55993659de..a6d649ea162f 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 5a67e3fe127d..264385512add 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 a9a073e2a8c6..d17aa915461d 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 47b329982d43..9fe15e769428 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 9e2aa20085c3..ae1b4d450a58 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 d71aa1526660..f2ae799bd243 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 ecabe71ad4c6..f2478e6d0dbf 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 d3477402cefb..68fee41e2cfa 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 21094ad905e9..074d5b2b9ed2 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 4662ff1958ba..3f3da6d6c913 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 80e38c5ddea9..d7f286c8aa40 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 185d1c9428e8..39e42913ff67 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 3a2b4bd16065..896824eba0e5 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 89a67da2d8bb..ef40c2f2006e 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 74491629ed85..7aca8c554dab 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 bea7d16e9dfa..e4d7b4bc9b02 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 f7c3ca4b3f6e..addaaeb1b636 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 201c56b2e15c..6ecf885aba38 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 c590f0297b94..f0e665967ec6 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 0d8ea90a2ab0..f742ebfde1d2 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 ba945afc5649..4749e481fd85 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 3debad2e8f20..c66192c28b13 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 3f5bd39949ab..e13e58e3a186 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 7f64259adf9f..a404db48b22b 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 7928f3d8db09..000000000000 --- 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 46e0a83ac033..000000000000 --- 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 abdcd5644421..000000000000 --- 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 051cc1c5bb24..7734704b021a 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 0a9db8a651e6..1f97a9b93edf 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 0e425e1fd991..af894b218eff 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 edb61b0d3cf3..4aeba2fe0628 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 cf9d70cc6572..5a4bd7ff3a18 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 39bc547a1a76..691fba42d570 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 2c0240eb8f92..6513fdfd2f2c 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 +}