about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2018-03-19 22:29:58 +0100
committerEmilio Cobos Álvarez <emilio@crisal.io>2018-03-25 03:30:07 +0200
commit96b87296ce89d5b5cb53f21cd7893b3ae3d80c10 (patch)
treed8d7e4a1bd362d7a85ae08349d6997b077323d9a
parente155ecdc9714f3ac76b554dc15ba06e219f576e0 (diff)
downloadrust-96b87296ce89d5b5cb53f21cd7893b3ae3d80c10.tar.gz
rust-96b87296ce89d5b5cb53f21cd7893b3ae3d80c10.zip
Move linker code to the Linker trait instead.
-rw-r--r--src/librustc_trans/back/link.rs16
-rw-r--r--src/librustc_trans/back/linker.rs30
2 files changed, 32 insertions, 14 deletions
diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs
index 19f0d5866ef..75ba83a7c62 100644
--- a/src/librustc_trans/back/link.rs
+++ b/src/librustc_trans/back/link.rs
@@ -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
diff --git a/src/librustc_trans/back/linker.rs b/src/librustc_trans/back/linker.rs
index 9bd7d83a191..c8bbfed41eb 100644
--- a/src/librustc_trans/back/linker.rs
+++ b/src/librustc_trans/back/linker.rs
@@ -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);
@@ -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.
     }
@@ -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.
@@ -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 {
@@ -877,6 +904,9 @@ impl Linker for WasmLd {
     fn optimize(&mut self) {
     }
 
+    fn pgo_gen(&mut self) {
+    }
+
     fn debuginfo(&mut self) {
     }