diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index d24d836975110..d7849e8f555ba 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -954,6 +954,9 @@ fn link_args(cmd: &mut Linker, // Pass optimization flags down to the linker. cmd.optimize(); + // Pass debuginfo flags down to the linker. + cmd.debuginfo(); + // We want to prevent the compiler from accidentally leaking in any system // libraries, so we explicitly ask gcc to not link to any libraries by // default. Note that this does not happen for windows because windows pulls diff --git a/src/librustc_trans/back/linker.rs b/src/librustc_trans/back/linker.rs index a272e7c4c8f04..3a709955098c3 100644 --- a/src/librustc_trans/back/linker.rs +++ b/src/librustc_trans/back/linker.rs @@ -16,6 +16,7 @@ use std::fs; use back::archive; use session::Session; use session::config; +use session::config::DebugInfoLevel::{NoDebugInfo, LimitedDebugInfo, FullDebugInfo}; /// Linker abstraction used by back::link to build up the command to invoke a /// linker. @@ -39,6 +40,7 @@ pub trait Linker { fn gc_sections(&mut self, is_dylib: bool); fn position_independent_executable(&mut self); fn optimize(&mut self); + fn debuginfo(&mut self); fn no_default_libraries(&mut self); fn build_dylib(&mut self, out_filename: &Path); fn args(&mut self, args: &[String]); @@ -143,6 +145,10 @@ impl<'a> Linker for GnuLinker<'a> { } } + fn debuginfo(&mut self) { + // Don't do anything special here for GNU-style linkers. + } + fn no_default_libraries(&mut self) { // Unfortunately right now passing -nodefaultlibs to gcc on windows // doesn't work so hot (in terms of native dependencies). This if @@ -265,6 +271,21 @@ impl<'a> Linker for MsvcLinker<'a> { fn optimize(&mut self) { // Needs more investigation of `/OPT` arguments } + + fn debuginfo(&mut self) { + match self.sess.opts.debuginfo { + NoDebugInfo => { + // Do nothing if debuginfo is disabled + }, + LimitedDebugInfo | + FullDebugInfo => { + // This will cause the Microsoft linker to generate a PDB file + // from the CodeView line tables in the object files. + self.cmd.arg("/DEBUG"); + } + } + } + fn whole_archives(&mut self) { // hints not supported? }