Skip to content

Commit cbf8ad4

Browse files
committed
Make Session.crate_types thread-safe
1 parent 046af1c commit cbf8ad4

File tree

6 files changed

+18
-14
lines changed

6 files changed

+18
-14
lines changed

src/librustc/session/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ pub struct Session {
9292
pub one_time_diagnostics: RefCell<FxHashSet<(DiagnosticMessageId, Option<Span>, String)>>,
9393
pub plugin_llvm_passes: OneThread<RefCell<Vec<String>>>,
9494
pub plugin_attributes: OneThread<RefCell<Vec<(String, AttributeType)>>>,
95-
pub crate_types: RefCell<Vec<config::CrateType>>,
95+
pub crate_types: Once<Vec<config::CrateType>>,
9696
pub dependency_formats: RefCell<dependency_format::Dependencies>,
9797
/// The crate_disambiguator is constructed out of all the `-C metadata`
9898
/// arguments passed to the compiler. Its value together with the crate-name
@@ -1096,7 +1096,7 @@ pub fn build_session_(
10961096
one_time_diagnostics: RefCell::new(FxHashSet()),
10971097
plugin_llvm_passes: OneThread::new(RefCell::new(Vec::new())),
10981098
plugin_attributes: OneThread::new(RefCell::new(Vec::new())),
1099-
crate_types: RefCell::new(Vec::new()),
1099+
crate_types: Once::new(),
11001100
dependency_formats: RefCell::new(FxHashMap()),
11011101
crate_disambiguator: Once::new(),
11021102
features: Once::new(),

src/librustc_driver/driver.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,8 @@ pub fn phase_2_configure_and_expand_inner<'a, F>(sess: &'a Session,
652652
// these need to be set "early" so that expansion sees `quote` if enabled.
653653
sess.init_features(features);
654654

655-
*sess.crate_types.borrow_mut() = collect_crate_types(sess, &krate.attrs);
655+
let crate_types = collect_crate_types(sess, &krate.attrs);
656+
sess.crate_types.set(crate_types);
656657

657658
let disambiguator = compute_crate_disambiguator(sess);
658659
sess.crate_disambiguator.set(disambiguator);

src/librustc_trans/back/write.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,16 @@ fn get_llvm_opt_size(optimize: config::OptLevel) -> llvm::CodeGenOptSize {
154154
}
155155
}
156156

157-
pub fn create_target_machine(sess: &Session) -> TargetMachineRef {
158-
target_machine_factory(sess)().unwrap_or_else(|err| {
157+
pub fn create_target_machine(sess: &Session, find_features: bool) -> TargetMachineRef {
158+
target_machine_factory(sess, find_features)().unwrap_or_else(|err| {
159159
llvm_err(sess.diagnostic(), err).raise()
160160
})
161161
}
162162

163-
pub fn target_machine_factory(sess: &Session)
163+
// If find_features is true this won't access `sess.crate_types` by assuming
164+
// that `is_pie_binary` is false. When we discover LLVM target features
165+
// `sess.crate_types` is uninitialized so we cannot access it.
166+
pub fn target_machine_factory(sess: &Session, find_features: bool)
164167
-> Arc<Fn() -> Result<TargetMachineRef, String> + Send + Sync>
165168
{
166169
let reloc_model = get_reloc_model(sess);
@@ -201,7 +204,7 @@ pub fn target_machine_factory(sess: &Session)
201204
};
202205
let cpu = CString::new(cpu.as_bytes()).unwrap();
203206
let features = CString::new(target_feature(sess).as_bytes()).unwrap();
204-
let is_pie_binary = is_pie_binary(sess);
207+
let is_pie_binary = !find_features && is_pie_binary(sess);
205208
let trap_unreachable = sess.target.target.options.trap_unreachable;
206209

207210
Arc::new(move || {
@@ -1510,7 +1513,7 @@ fn start_executing_work(tcx: TyCtxt,
15101513
regular_module_config: modules_config,
15111514
metadata_module_config: metadata_config,
15121515
allocator_module_config: allocator_config,
1513-
tm_factory: target_machine_factory(tcx.sess),
1516+
tm_factory: target_machine_factory(tcx.sess, false),
15141517
total_cgus,
15151518
msvc_imps_needed: msvc_imps_needed(tcx),
15161519
target_pointer_width: tcx.sess.target.target.target_pointer_width.clone(),

src/librustc_trans/base.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
737737
source: ModuleSource::Translated(ModuleLlvm {
738738
llcx: metadata_llcx,
739739
llmod: metadata_llmod,
740-
tm: create_target_machine(tcx.sess),
740+
tm: create_target_machine(tcx.sess, false),
741741
}),
742742
kind: ModuleKind::Metadata,
743743
};
@@ -803,7 +803,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
803803
let modules = ModuleLlvm {
804804
llmod,
805805
llcx,
806-
tm: create_target_machine(tcx.sess),
806+
tm: create_target_machine(tcx.sess, false),
807807
};
808808
time(tcx.sess, "write allocator module", || {
809809
allocator::trans(tcx, &modules, kind)
@@ -1260,7 +1260,7 @@ fn compile_codegen_unit<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
12601260
let llvm_module = ModuleLlvm {
12611261
llcx: cx.llcx,
12621262
llmod: cx.llmod,
1263-
tm: create_target_machine(cx.sess()),
1263+
tm: create_target_machine(cx.sess(), false),
12641264
};
12651265

12661266
ModuleTranslation {

src/librustc_trans/context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ pub unsafe fn create_context_and_module(sess: &Session, mod_name: &str) -> (Cont
162162

163163
// Ensure the data-layout values hardcoded remain the defaults.
164164
if sess.target.target.options.is_builtin {
165-
let tm = ::back::write::create_target_machine(sess);
165+
let tm = ::back::write::create_target_machine(sess, false);
166166
llvm::LLVMRustSetDataLayoutFromTargetMachine(llmod, tm);
167167
llvm::LLVMRustDisposeTargetMachine(tm);
168168

src/librustc_trans/llvm_util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ pub fn to_llvm_feature<'a>(sess: &Session, s: &'a str) -> &'a str {
140140
}
141141

142142
pub fn target_features(sess: &Session) -> Vec<Symbol> {
143-
let target_machine = create_target_machine(sess);
143+
let target_machine = create_target_machine(sess, true);
144144
target_feature_whitelist(sess)
145145
.iter()
146146
.filter(|feature| {
@@ -178,7 +178,7 @@ pub fn print_passes() {
178178

179179
pub(crate) fn print(req: PrintRequest, sess: &Session) {
180180
require_inited();
181-
let tm = create_target_machine(sess);
181+
let tm = create_target_machine(sess, true);
182182
unsafe {
183183
match req {
184184
PrintRequest::TargetCPUs => llvm::LLVMRustPrintTargetCPUs(tm),

0 commit comments

Comments
 (0)