Don't keep alloc_map locked while calling data_id_for_static

Fixes #670
This commit is contained in:
bjorn3 2019-08-17 12:31:10 +02:00
parent 480db7dd9e
commit 21141eb235

View file

@ -186,8 +186,9 @@ fn data_id_for_static(
def_id: DefId,
linkage: Linkage,
) -> DataId {
let symbol_name = tcx.symbol_name(Instance::mono(tcx, def_id)).as_str();
let ty = tcx.type_of(def_id);
let instance = Instance::mono(tcx, def_id);
let symbol_name = tcx.symbol_name(instance).as_str();
let ty = instance.ty(tcx);
let is_mutable = if tcx.is_mutable_static(def_id) {
true
} else {
@ -200,7 +201,7 @@ fn data_id_for_static(
.unwrap();
if linkage == Linkage::Preemptible {
if let ty::RawPtr(_) = tcx.type_of(def_id).sty {
if let ty::RawPtr(_) = ty.sty {
} else {
tcx.sess.span_fatal(tcx.def_span(def_id), "must have type `*const T` or `*mut T` due to `#[linkage]` attribute")
}
@ -297,7 +298,8 @@ fn define_all_allocs(
read_target_uint(endianness, bytes).unwrap()
};
let data_id = match tcx.alloc_map.lock().get(reloc).unwrap() {
let reloc_target_alloc = tcx.alloc_map.lock().get(reloc).unwrap();
let data_id = match reloc_target_alloc {
GlobalAlloc::Function(instance) => {
assert_eq!(addend, 0);
let func_id = crate::abi::import_function(tcx, module, instance);