about summary refs log tree commit diff
diff options
context:
space:
mode:
authorIvan Lozano <ivanlozano@google.com>2020-05-26 13:41:40 -0400
committerIvan Lozano <ivanlozano@google.com>2020-05-27 14:10:40 -0400
commit0c1ef853bb6ff87c2179b5e41b7e044b6c5b79cb (patch)
tree49c8ddc2d0a0988315b2cb38dda4200e3d2cd4fc
parentaeca4d6428c52cbf2c8d1f28657b0bdf92e4ea7c (diff)
downloadrust-0c1ef853bb6ff87c2179b5e41b7e044b6c5b79cb.tar.gz
rust-0c1ef853bb6ff87c2179b5e41b7e044b6c5b79cb.zip
Add -Z profile-emit=<path> for Gcov gcda output.
Adds a -Z flag to control the file path that the Gcov gcda output is
written to during runtime. This flag expects a path and filename, e.g.
-Z profile-emit=gcov/out/lib.gcda.

This works similar to GCC/Clang's -fprofile-dir flag which allows
control over the output path for gcda coverage files.
-rw-r--r--src/librustc_codegen_llvm/debuginfo/metadata.rs8
-rw-r--r--src/librustc_interface/tests.rs1
-rw-r--r--src/librustc_session/options.rs3
-rw-r--r--src/test/run-make-fulldeps/profile/Makefile3
4 files changed, 11 insertions, 4 deletions
diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs
index 0cce0b25e58..333eb805221 100644
--- a/src/librustc_codegen_llvm/debuginfo/metadata.rs
+++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs
@@ -959,16 +959,16 @@ pub fn compile_unit_metadata(
         if tcx.sess.opts.debugging_opts.profile {
             let cu_desc_metadata =
                 llvm::LLVMRustMetadataAsValue(debug_context.llcontext, unit_metadata);
+            let default_gcda_path = &tcx.output_filenames(LOCAL_CRATE).with_extension("gcda");
+            let gcda_path =
+                tcx.sess.opts.debugging_opts.profile_emit.as_ref().unwrap_or(default_gcda_path);
 
             let gcov_cu_info = [
                 path_to_mdstring(
                     debug_context.llcontext,
                     &tcx.output_filenames(LOCAL_CRATE).with_extension("gcno"),
                 ),
-                path_to_mdstring(
-                    debug_context.llcontext,
-                    &tcx.output_filenames(LOCAL_CRATE).with_extension("gcda"),
-                ),
+                path_to_mdstring(debug_context.llcontext, &gcda_path),
                 cu_desc_metadata,
             ];
             let gcov_metadata = llvm::LLVMMDNodeInContext(
diff --git a/src/librustc_interface/tests.rs b/src/librustc_interface/tests.rs
index d573e11fc4b..91a4bc2b868 100644
--- a/src/librustc_interface/tests.rs
+++ b/src/librustc_interface/tests.rs
@@ -557,6 +557,7 @@ fn test_debugging_options_tracking_hash() {
     tracked!(plt, Some(true));
     tracked!(print_fuel, Some("abc".to_string()));
     tracked!(profile, true);
+    tracked!(profile_emit, Some(PathBuf::from("abc")));
     tracked!(relro_level, Some(RelroLevel::Full));
     tracked!(report_delayed_bugs, true);
     tracked!(run_dsymutil, false);
diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs
index 95f9ff00fb8..a38e7f063d7 100644
--- a/src/librustc_session/options.rs
+++ b/src/librustc_session/options.rs
@@ -955,6 +955,9 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
         "print layout information for each type encountered (default: no)"),
     profile: bool = (false, parse_bool, [TRACKED],
         "insert profiling code (default: no)"),
+    profile_emit: Option<PathBuf> = (None, parse_opt_pathbuf, [TRACKED],
+        "file path to emit profiling data at runtime when using 'profile' \
+        (default based on relative source path)"),
     query_dep_graph: bool = (false, parse_bool, [UNTRACKED],
         "enable queries of the dependency graph for regression testing (default: no)"),
     query_stats: bool = (false, parse_bool, [UNTRACKED],
diff --git a/src/test/run-make-fulldeps/profile/Makefile b/src/test/run-make-fulldeps/profile/Makefile
index c12712590e4..04d382b475e 100644
--- a/src/test/run-make-fulldeps/profile/Makefile
+++ b/src/test/run-make-fulldeps/profile/Makefile
@@ -7,3 +7,6 @@ all:
 	$(call RUN,test) || exit 1
 	[ -e "$(TMPDIR)/test.gcno" ] || (echo "No .gcno file"; exit 1)
 	[ -e "$(TMPDIR)/test.gcda" ] || (echo "No .gcda file"; exit 1)
+	$(RUSTC) -g -Z profile -Z profile-emit=$(TMPDIR)/abc/abc.gcda test.rs
+	$(call RUN,test) || exit 1
+	[ -e "$(TMPDIR)/abc/abc.gcda" ] || (echo "gcda file not emitted to defined path"; exit 1)