Skip to content

Commit 315750a

Browse files
ricky26alexcrichton
authored andcommitted
Very hacky MSVC hacks.
Conflicts: mk/platform.mk src/librustc/session/config.rs src/librustc_back/target/aarch64_apple_ios.rs src/librustc_back/target/aarch64_linux_android.rs src/librustc_back/target/arm_linux_androideabi.rs src/librustc_back/target/arm_unknown_linux_gnueabi.rs src/librustc_back/target/arm_unknown_linux_gnueabihf.rs src/librustc_back/target/armv7_apple_ios.rs src/librustc_back/target/armv7s_apple_ios.rs src/librustc_back/target/i386_apple_ios.rs src/librustc_back/target/i686_apple_darwin.rs src/librustc_back/target/i686_pc_windows_gnu.rs src/librustc_back/target/i686_unknown_dragonfly.rs src/librustc_back/target/i686_unknown_linux_gnu.rs src/librustc_back/target/mips_unknown_linux_gnu.rs src/librustc_back/target/mipsel_unknown_linux_gnu.rs src/librustc_back/target/mod.rs src/librustc_back/target/powerpc_unknown_linux_gnu.rs src/librustc_back/target/x86_64_apple_darwin.rs src/librustc_back/target/x86_64_apple_ios.rs src/librustc_back/target/x86_64_pc_windows_gnu.rs src/librustc_back/target/x86_64_unknown_dragonfly.rs src/librustc_back/target/x86_64_unknown_freebsd.rs src/librustc_back/target/x86_64_unknown_linux_gnu.rs src/librustc_back/target/x86_64_unknown_openbsd.rs src/librustc_llvm/lib.rs src/librustc_trans/back/link.rs src/librustc_trans/trans/base.rs src/libstd/os.rs src/rustllvm/RustWrapper.cpp
1 parent 3ca008d commit 315750a

27 files changed

+1535
-29
lines changed

configure

+5-4
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ CFG_TARGET=$(to_llvm_triple $CFG_TARGET)
610610
# there's no rpath. This is where the build system itself puts libraries;
611611
# --libdir is used to configure the installation directory.
612612
# FIXME: This needs to parameterized over target triples. Do it in platform.mk
613-
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ]
613+
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] || [ "$CFG_OSTYPE" = "pc-windows-msvc" ]
614614
then
615615
CFG_LIBDIR_RELATIVE=bin
616616
else
@@ -628,7 +628,8 @@ esac
628628

629629
CFG_LIBDIR_RELATIVE=`echo ${CFG_LIBDIR} | cut -c$((${#CFG_PREFIX}+${CAT_INC}))-`
630630

631-
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] && [ "$CFG_LIBDIR_RELATIVE" != "bin" ]; then
631+
if ( [ "$CFG_OSTYPE" = "pc-windows-gnu" ] || [ "$CFG_OSTYPE" = "pc-windows-msvc" ] ) \
632+
&& [ "$CFG_LIBDIR_RELATIVE" != "bin" ]; then
632633
err "libdir on windows should be set to 'bin'"
633634
fi
634635

@@ -803,7 +804,7 @@ then
803804
fi
804805

805806
BIN_SUF=
806-
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ]
807+
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] || [ "$CFG_OSTYPE" = "pc-windows-msvc" ]
807808
then
808809
BIN_SUF=.exe
809810
fi
@@ -1311,7 +1312,7 @@ do
13111312
# (llvm's configure tries to find pthread first, so we have to disable it explicitly.)
13121313
# Also note that pthreads works badly on mingw-w64 systems: #8996
13131314
case "$CFG_BUILD" in
1314-
(*-windows-*)
1315+
(*-windows-gnu)
13151316
LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
13161317
;;
13171318
esac

mk/cfg/aarch64-apple-ios.mk

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ ifneq ($(findstring darwin,$(CFG_OSTYPE)),)
55
CFG_IOS_SDK_aarch64-apple-ios := $(shell xcrun --show-sdk-path -sdk iphoneos 2>/dev/null)
66
CFG_IOS_SDK_FLAGS_aarch64-apple-ios := -target aarch64-apple-darwin -isysroot $(CFG_IOS_SDK_aarch64-apple-ios) -mios-version-min=7.0 -arch arm64
77
CC_aarch64-apple-ios = $(shell xcrun -find -sdk iphoneos clang)
8+
LINK_aarch64-apple-ios = $(shell xcrun -find -sdk iphoneos clang)
89
CXX_aarch64-apple-ios = $(shell xcrun -find -sdk iphoneos clang++)
910
CPP_aarch64-apple-ios = $(shell xcrun -find -sdk iphoneos clang++)
1011
AR_aarch64-apple-ios = $(shell xcrun -find -sdk iphoneos ar)

mk/cfg/aarch64-linux-android.mk

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# aarch64-linux-android configuration
22
# CROSS_PREFIX_aarch64-linux-android-
33
CC_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-gcc
4+
LINK_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-gcc
45
CXX_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-g++
56
CPP_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-gcc -E
67
AR_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-ar

mk/cfg/aarch64-unknown-linux-gnu.mk

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# aarch64-unknown-linux-gnu configuration
22
CROSS_PREFIX_aarch64-unknown-linux-gnu=aarch64-linux-gnu-
33
CC_aarch64-unknown-linux-gnu=gcc
4+
LINK_aarch64-unknown-linux-gnu=gcc
45
CXX_aarch64-unknown-linux-gnu=g++
56
CPP_aarch64-unknown-linux-gnu=gcc -E
67
AR_aarch64-unknown-linux-gnu=ar

mk/cfg/arm-linux-androideabi.mk

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# arm-linux-androideabi configuration
2+
LINK_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc
23
CC_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc
34
CXX_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-g++
45
CPP_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc -E

mk/cfg/x86_64-pc-windows-gnu.mk

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# x86_64-pc-windows-gnu configuration
22
CROSS_PREFIX_x86_64-pc-windows-gnu=x86_64-w64-mingw32-
33
CC_x86_64-pc-windows-gnu=gcc
4+
LINK_x86_64-pc-windows-gnu=gcc
45
CXX_x86_64-pc-windows-gnu=g++
56
CPP_x86_64-pc-windows-gnu=gcc -E
67
AR_x86_64-pc-windows-gnu=ar

mk/cfg/x86_64-pc-windows-msvc.mk

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# x86_64-pc-windows-msvc configuration
2+
CROSS_PREFIX_x86_64-pc-windows-msvc=
3+
CC_x86_64-pc-windows-msvc=cl
4+
LINK_x86_64-pc-windows-msvc=link
5+
CXX_x86_64-pc-windows-msvc=g++
6+
CPP_x86_64-pc-windows-msvc=gcc -E
7+
AR_x86_64-pc-windows-msvc=llvm-ar
8+
CFG_LIB_NAME_x86_64-pc-windows-msvc=$(1).dll
9+
CFG_STATIC_LIB_NAME_x86_64-pc-windows-msvc=$(1).lib
10+
CFG_LIB_GLOB_x86_64-pc-windows-msvc=$(1)-*.dll
11+
CFG_LIB_DSYM_GLOB_x86_64-pc-windows-msvc=$(1)-*.dylib.dSYM
12+
CFG_JEMALLOC_CFLAGS_x86_64-pc-windows-msvc := $(CFLAGS)
13+
CFG_GCCISH_CFLAGS_x86_64-pc-windows-msvc := $(CFLAGS)
14+
CFG_GCCISH_CXXFLAGS_x86_64-pc-windows-msvc := -fno-rtti $(CXXFLAGS)
15+
CFG_GCCISH_LINK_FLAGS_x86_64-pc-windows-msvc := -shared -g -m64
16+
CFG_GCCISH_DEF_FLAG_x86_64-pc-windows-msvc :=
17+
CFG_GCCISH_PRE_LIB_FLAGS_x86_64-pc-windows-msvc :=
18+
CFG_GCCISH_POST_LIB_FLAGS_x86_64-pc-windows-msvc :=
19+
CFG_DEF_SUFFIX_x86_64-pc-windows-msvc := .windows.def
20+
CFG_LLC_FLAGS_x86_64-pc-windows-msvc :=
21+
CFG_INSTALL_NAME_x86_64-pc-windows-msvc =
22+
CFG_EXE_SUFFIX_x86_64-pc-windows-msvc := .exe
23+
CFG_WINDOWSY_x86_64-pc-windows-msvc := 1
24+
CFG_UNIXY_x86_64-pc-windows-msvc :=
25+
CFG_PATH_MUNGE_x86_64-pc-windows-msvc :=
26+
CFG_LDPATH_x86_64-pc-windows-msvc :=
27+
CFG_RUN_x86_64-pc-windows-msvc=$(2)
28+
CFG_RUN_TARG_x86_64-pc-windows-msvc=$(call CFG_RUN_x86_64-pc-windows-msvc,,$(2))
29+
CFG_GNU_TRIPLE_x86_64-pc-windows-msvc := x86_64-w64-mingw32

mk/platform.mk

+9-8
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,15 @@ FIND_COMPILER = $(word 1,$(1:ccache=))
145145
define CFG_MAKE_TOOLCHAIN
146146
# Prepend the tools with their prefix if cross compiling
147147
ifneq ($(CFG_BUILD),$(1))
148-
CC_$(1)=$(CROSS_PREFIX_$(1))$(CC_$(1))
149-
CXX_$(1)=$(CROSS_PREFIX_$(1))$(CXX_$(1))
150-
CPP_$(1)=$(CROSS_PREFIX_$(1))$(CPP_$(1))
151-
AR_$(1)=$(CROSS_PREFIX_$(1))$(AR_$(1))
152-
RUSTC_CROSS_FLAGS_$(1)=-C linker=$$(call FIND_COMPILER,$$(CC_$(1))) \
153-
-C ar=$$(call FIND_COMPILER,$$(AR_$(1))) $(RUSTC_CROSS_FLAGS_$(1))
154-
155-
RUSTC_FLAGS_$(1)=$$(RUSTC_CROSS_FLAGS_$(1)) $(RUSTC_FLAGS_$(1))
148+
CC_$(1)=$(CROSS_PREFIX_$(1))$(CC_$(1))
149+
CXX_$(1)=$(CROSS_PREFIX_$(1))$(CXX_$(1))
150+
CPP_$(1)=$(CROSS_PREFIX_$(1))$(CPP_$(1))
151+
AR_$(1)=$(CROSS_PREFIX_$(1))$(AR_$(1))
152+
LINK_$(1)=$(CROSS_PREFIX_$(1))$(LINK_$(1))
153+
RUSTC_CROSS_FLAGS_$(1)=-C linker=$$(call FIND_COMPILER,$$(LINK_$(1))) \
154+
-C ar=$$(call FIND_COMPILER,$$(AR_$(1))) $(RUSTC_CROSS_FLAGS_$(1))
155+
156+
RUSTC_FLAGS_$(1)=$$(RUSTC_CROSS_FLAGS_$(1)) $(RUSTC_FLAGS_$(1))
156157
endif
157158

158159
CFG_COMPILE_C_$(1) = $$(CC_$(1)) \

src/librustc/session/config.rs

+1
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,7 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
632632
let mut ret = vec![ // Target bindings.
633633
attr::mk_word_item(fam.clone()),
634634
mk(InternedString::new("target_os"), intern(os)),
635+
mk(InternedString::new("target_abi"), intern(abi)),
635636
mk(InternedString::new("target_family"), fam),
636637
mk(InternedString::new("target_arch"), intern(arch)),
637638
mk(InternedString::new("target_endian"), intern(end)),

src/librustc_back/target/aarch64_unknown_linux_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub fn target() -> Target {
2222
target_env: "gnu".to_string(),
2323
arch: "aarch64".to_string(),
2424
target_os: "linux".to_string(),
25+
target_abi: "".to_string(),
2526
options: base,
2627
}
2728
}

src/librustc_back/target/i686_unknown_linux_gnu.rs

+4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ pub fn target() -> Target {
2222
target_pointer_width: "32".to_string(),
2323
arch: "x86".to_string(),
2424
target_os: "linux".to_string(),
25+
<<<<<<< HEAD
2526
target_env: "gnu".to_string(),
27+
=======
28+
target_abi: "".to_string(),
29+
>>>>>>> 9f1453c... Very hacky MSVC hacks.
2630
options: base,
2731
}
2832
}

src/librustc_back/target/mod.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ pub struct TargetOptions {
145145
/// only really used for figuring out how to find libraries, since Windows uses its own
146146
/// library naming convention. Defaults to false.
147147
pub is_like_windows: bool,
148+
pub is_like_msvc: bool,
148149
/// Whether the target toolchain is like Android's. Only useful for compiling against Android.
149150
/// Defaults to false.
150151
pub is_like_android: bool,
@@ -188,6 +189,7 @@ impl Default for TargetOptions {
188189
is_like_osx: false,
189190
is_like_windows: false,
190191
is_like_android: false,
192+
is_like_msvc: false,
191193
linker_is_gnu: false,
192194
has_rpath: false,
193195
no_compiler_rt: false,
@@ -371,7 +373,9 @@ impl Target {
371373
armv7s_apple_ios,
372374

373375
x86_64_pc_windows_gnu,
374-
i686_pc_windows_gnu
376+
i686_pc_windows_gnu,
377+
378+
x86_64_pc_windows_msvc
375379
);
376380

377381

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
use target::TargetOptions;
12+
use std::default::Default;
13+
14+
pub fn opts() -> TargetOptions {
15+
TargetOptions {
16+
// FIXME(#13846) this should be enabled for windows
17+
function_sections: false,
18+
linker: "link".to_string(),
19+
dynamic_linking: true,
20+
executables: true,
21+
dll_prefix: "".to_string(),
22+
dll_suffix: ".dll".to_string(),
23+
exe_suffix: ".exe".to_string(),
24+
staticlib_prefix: "".to_string(),
25+
staticlib_suffix: ".lib".to_string(),
26+
morestack: false,
27+
is_like_windows: true,
28+
is_like_msvc: true,
29+
pre_link_args: Vec::new(),
30+
31+
.. Default::default()
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
use target::Target;
12+
13+
pub fn target() -> Target {
14+
let mut base = super::windows_msvc_base::opts();
15+
base.cpu = "x86-64".to_string();
16+
17+
Target {
18+
// FIXME: Test this. Copied from linux (#2398)
19+
data_layout: "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-\
20+
f32:32:32-f64:64:64-v64:64:64-v128:128:128-a:0:64-\
21+
s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(),
22+
llvm_target: "x86_64-pc-windows-msvc".to_string(),
23+
target_endian: "little".to_string(),
24+
target_pointer_width: "64".to_string(),
25+
arch: "x86_64".to_string(),
26+
target_os: "windows".to_string(),
27+
target_abi: "msvc".to_string(),
28+
options: base,
29+
}
30+
}

src/librustc_llvm/lib.rs

+14
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub use self::CallConv::*;
5555
pub use self::Visibility::*;
5656
pub use self::DiagnosticSeverity::*;
5757
pub use self::Linkage::*;
58+
pub use self::DLLStorageClass::*;
5859

5960
use std::ffi::CString;
6061
use std::cell::RefCell;
@@ -114,6 +115,13 @@ pub enum Linkage {
114115
CommonLinkage = 14,
115116
}
116117

118+
#[derive(Copy)]
119+
pub enum DLLStorageClass {
120+
DefaultStorageClass = 0,
121+
DLLImportStorageClass = 1,
122+
DLLExportStorageClass = 2,
123+
}
124+
117125
#[repr(C)]
118126
#[derive(Copy, Clone, Debug)]
119127
pub enum DiagnosticSeverity {
@@ -2125,6 +2133,12 @@ pub fn SetLinkage(global: ValueRef, link: Linkage) {
21252133
}
21262134
}
21272135

2136+
pub fn SetDLLStorageClass(global: ValueRef, storage_class: DLLStorageClass) {
2137+
unsafe {
2138+
LLVMRustSetDLLStorageClass(global, storage_class as c_uint);
2139+
}
2140+
}
2141+
21282142
pub fn SetUnnamedAddr(global: ValueRef, unnamed: bool) {
21292143
unsafe {
21302144
LLVMSetUnnamedAddr(global, unnamed as Bool);

src/librustc_trans/back/link.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,21 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use super::archive::{Archive, ArchiveBuilder, ArchiveConfig, METADATA_FILENAME};
12-
use super::archive;
13-
use super::rpath;
14-
use super::rpath::RPathConfig;
11+
use super::archive::{ArchiveBuilder, ArchiveConfig, METADATA_FILENAME};
1512
use super::svh::Svh;
13+
14+
use super::link_gnu;
15+
use super::link_msvc;
16+
1617
use session::config;
17-
use session::config::NoDebugInfo;
1818
use session::config::{OutputFilenames, Input, OutputTypeBitcode, OutputTypeExe, OutputTypeObject};
1919
use session::search_paths::PathKind;
2020
use session::Session;
2121
use metadata::common::LinkMeta;
22-
use metadata::{encoder, cstore, filesearch, csearch, creader};
22+
use metadata::{encoder, cstore, csearch, creader};
2323
use metadata::filesearch::FileDoesntMatch;
2424
use trans::{CrateContext, CrateTranslation, gensym_name};
2525
use middle::ty::{self, Ty};
26-
use util::common::time;
2726
use util::ppaux;
2827
use util::sha2::{Digest, Sha256};
2928
use util::fs::fix_windows_verbatim_for_gcc;

0 commit comments

Comments
 (0)