From 721fe3b43c93927ab2cd4bcf99daeb5f157cdc54 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Fri, 4 Oct 2019 14:39:14 +0200 Subject: [PATCH] Predefine all local functions before codegen Otherwise only calls to previously codegened functions use relative addressing instead of the GOT Fixes #692 --- src/driver.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/driver.rs b/src/driver.rs index f02ba35904ff..b8e91b936576 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -307,7 +307,19 @@ fn codegen_mono_items<'tcx>( mono_items: FxHashMap, (RLinkage, Visibility)>, ) { let mut cx = CodegenCx::new(tcx, module, debug_context); + time("codegen mono items", move || { + for (&mono_item, &(linkage, visibility)) in &mono_items { + match mono_item { + MonoItem::Fn(instance) => { + let (name, sig) = get_function_name_and_sig(tcx, instance, false); + let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility); + cx.module.declare_function(&name, linkage, &sig).unwrap(); + } + MonoItem::Static(_) | MonoItem::GlobalAsm(_) => {} + } + } + for (mono_item, (linkage, visibility)) in mono_items { crate::unimpl::try_unimpl(tcx, log, || { let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility);