Skip to content

Commit

Permalink
Move linker code to the Linker trait instead.
Browse files Browse the repository at this point in the history
  • Loading branch information
emilio committed Mar 25, 2018
1 parent e155ecd commit 96b8729
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 14 deletions.
16 changes: 2 additions & 14 deletions src/librustc_trans/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1085,20 +1085,8 @@ fn link_args(cmd: &mut Linker,
cmd.build_static_executable();
}

// If we're doing PGO generation stuff and on a GNU-like linker, use the
// "-u" flag to properly pull in the profiler runtime bits.
//
// This is because LLVM otherwise won't add the needed initialization for us
// on Linux (though the extra flag should be harmless if it does).
//
// See https://reviews.llvm.org/D14033 and https://reviews.llvm.org/D14030.
//
// Though it may be worth to try to revert those changes upstream, since the
// overhead of the initialization should be minor.
if sess.opts.debugging_opts.pgo_gen.is_some() &&
sess.target.target.options.linker_is_gnu
{
cmd.args(&["-u".to_owned(), "__llvm_profile_runtime".to_owned()]);
if sess.opts.debugging_opts.pgo_gen.is_some() {
cmd.pgo_gen();
}

// FIXME (#2397): At some point we want to rpath our guesses as to
Expand Down
30 changes: 30 additions & 0 deletions src/librustc_trans/back/linker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ pub trait Linker {
fn partial_relro(&mut self);
fn no_relro(&mut self);
fn optimize(&mut self);
fn pgo_gen(&mut self);
fn debuginfo(&mut self);
fn no_default_libraries(&mut self);
fn build_dylib(&mut self, out_filename: &Path);
Expand Down Expand Up @@ -280,6 +281,24 @@ impl<'a> Linker for GccLinker<'a> {
}
}

fn pgo_gen(&mut self) {
if !self.sess.target.target.options.linker_is_gnu { return }

// If we're doing PGO generation stuff and on a GNU-like linker, use the
// "-u" flag to properly pull in the profiler runtime bits.
//
// This is because LLVM otherwise won't add the needed initialization
// for us on Linux (though the extra flag should be harmless if it
// does).
//
// See https://reviews.llvm.org/D14033 and https://reviews.llvm.org/D14030.
//
// Though it may be worth to try to revert those changes upstream, since
// the overhead of the initialization should be minor.
self.cmd.arg("-u");
self.cmd.arg("__llvm_profile_runtime");
}

fn debuginfo(&mut self) {
// Don't do anything special here for GNU-style linkers.
}
Expand Down Expand Up @@ -509,6 +528,10 @@ impl<'a> Linker for MsvcLinker<'a> {
// Needs more investigation of `/OPT` arguments
}

fn pgo_gen(&mut self) {
// Nothing needed here.
}

fn debuginfo(&mut self) {
// This will cause the Microsoft linker to generate a PDB file
// from the CodeView line tables in the object files.
Expand Down Expand Up @@ -712,6 +735,10 @@ impl<'a> Linker for EmLinker<'a> {
self.cmd.args(&["--memory-init-file", "0"]);
}

fn pgo_gen(&mut self) {
// noop, but maybe we need something like the gnu linker?
}

fn debuginfo(&mut self) {
// Preserve names or generate source maps depending on debug info
self.cmd.arg(match self.sess.opts.debuginfo {
Expand Down Expand Up @@ -877,6 +904,9 @@ impl Linker for WasmLd {
fn optimize(&mut self) {
}

fn pgo_gen(&mut self) {
}

fn debuginfo(&mut self) {
}

Expand Down

0 comments on commit 96b8729

Please sign in to comment.