-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Migrate run-make/pgo-branch-weights
to rmake
#125165
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
use std::path::{Path, PathBuf}; | ||
|
||
use crate::{env_var, Command}; | ||
|
||
/// Construct a new `llvm-readobj` invocation. This assumes that `llvm-readobj` is available | ||
/// at `$LLVM_BIN_DIR/llvm-readobj`. | ||
pub fn llvm_readobj() -> LlvmReadobj { | ||
LlvmReadobj::new() | ||
} | ||
|
||
/// Construct a new `llvm-profdata` invocation. This assumes that `llvm-profdata` is available | ||
/// at `$LLVM_BIN_DIR/llvm-profdata`. | ||
pub fn llvm_profdata() -> LlvmProfdata { | ||
LlvmProfdata::new() | ||
} | ||
|
||
/// Construct a new `llvm-filecheck` invocation. This assumes that `llvm-filecheck` is available | ||
/// at `$LLVM_FILECHECK`. | ||
pub fn llvm_filecheck() -> LlvmFilecheck { | ||
LlvmFilecheck::new() | ||
} | ||
|
||
/// A `llvm-readobj` invocation builder. | ||
#[derive(Debug)] | ||
#[must_use] | ||
pub struct LlvmReadobj { | ||
cmd: Command, | ||
} | ||
|
||
/// A `llvm-profdata` invocation builder. | ||
#[derive(Debug)] | ||
#[must_use] | ||
pub struct LlvmProfdata { | ||
cmd: Command, | ||
} | ||
|
||
/// A `llvm-filecheck` invocation builder. | ||
#[derive(Debug)] | ||
#[must_use] | ||
pub struct LlvmFilecheck { | ||
cmd: Command, | ||
} | ||
|
||
crate::impl_common_helpers!(LlvmReadobj); | ||
crate::impl_common_helpers!(LlvmProfdata); | ||
crate::impl_common_helpers!(LlvmFilecheck); | ||
|
||
/// Generate the path to the bin directory of LLVM. | ||
#[must_use] | ||
pub fn llvm_bin_dir() -> PathBuf { | ||
Oneirical marked this conversation as resolved.
Show resolved
Hide resolved
|
||
let llvm_bin_dir = env_var("LLVM_BIN_DIR"); | ||
PathBuf::from(llvm_bin_dir) | ||
} | ||
|
||
impl LlvmReadobj { | ||
/// Construct a new `llvm-readobj` invocation. This assumes that `llvm-readobj` is available | ||
/// at `$LLVM_BIN_DIR/llvm-readobj`. | ||
pub fn new() -> Self { | ||
let llvm_readobj = llvm_bin_dir().join("llvm-readobj"); | ||
let cmd = Command::new(llvm_readobj); | ||
Self { cmd } | ||
} | ||
|
||
/// Provide an input file. | ||
pub fn input<P: AsRef<Path>>(&mut self, path: P) -> &mut Self { | ||
self.cmd.arg(path.as_ref()); | ||
self | ||
} | ||
|
||
/// Pass `--file-header` to display file headers. | ||
pub fn file_header(&mut self) -> &mut Self { | ||
self.cmd.arg("--file-header"); | ||
self | ||
} | ||
} | ||
|
||
impl LlvmProfdata { | ||
/// Construct a new `llvm-profdata` invocation. This assumes that `llvm-profdata` is available | ||
/// at `$LLVM_BIN_DIR/llvm-profdata`. | ||
pub fn new() -> Self { | ||
let llvm_profdata = llvm_bin_dir().join("llvm-profdata"); | ||
let cmd = Command::new(llvm_profdata); | ||
Self { cmd } | ||
} | ||
|
||
/// Provide an input file. | ||
pub fn input<P: AsRef<Path>>(&mut self, path: P) -> &mut Self { | ||
self.cmd.arg(path.as_ref()); | ||
self | ||
} | ||
|
||
/// Specify the output file path. | ||
pub fn output<P: AsRef<Path>>(&mut self, path: P) -> &mut Self { | ||
self.cmd.arg("-o"); | ||
self.cmd.arg(path.as_ref()); | ||
self | ||
} | ||
|
||
/// Take several profile data files generated by PGO instrumentation and merge them | ||
/// together into a single indexed profile data file. | ||
pub fn merge(&mut self) -> &mut Self { | ||
self.cmd.arg("merge"); | ||
self | ||
} | ||
} | ||
|
||
impl LlvmFilecheck { | ||
/// Construct a new `llvm-filecheck` invocation. This assumes that `llvm-filecheck` is available | ||
/// at `$LLVM_FILECHECK`. | ||
pub fn new() -> Self { | ||
let llvm_filecheck = env_var("LLVM_FILECHECK"); | ||
let cmd = Command::new(llvm_filecheck); | ||
Self { cmd } | ||
} | ||
|
||
/// Pipe a read file into standard input containing patterns that will be matched against the .patterns(path) call. | ||
pub fn stdin<I: AsRef<[u8]>>(&mut self, input: I) -> &mut Self { | ||
self.cmd.set_stdin(input.as_ref().to_vec().into_boxed_slice()); | ||
self | ||
} | ||
|
||
/// Provide the patterns that need to be matched. | ||
pub fn patterns<P: AsRef<Path>>(&mut self, path: P) -> &mut Self { | ||
self.cmd.arg(path.as_ref()); | ||
self | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// This test generates an instrumented binary - a program which | ||
// will keep track of how many times it calls each function, a useful | ||
// feature for optimization. Then, an argument (aaaaaaaaaaaa2bbbbbbbbbbbb2bbbbbbbbbbbbbbbbcc) | ||
// is passed into the instrumented binary, which should react with a number of function calls | ||
// fully known in advance. (For example, the letter 'a' results in calling f1()) | ||
|
||
// If the test passes, the expected function call count was added to the use-phase LLVM-IR. | ||
// See https://github.com/rust-lang/rust/pull/66631 | ||
|
||
//@ needs-profiler-support | ||
//@ ignore-cross-compile | ||
|
||
// FIXME(Oneirical): This test has problems generating profdata on mingw. | ||
// For more information, see https://github.com/rust-lang/rust/pull/122613 | ||
//@ ignore-windows-gnu | ||
jieyouxu marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
use run_make_support::{fs_wrapper, llvm_filecheck, llvm_profdata, run_with_args, rustc}; | ||
use std::path::Path; | ||
|
||
fn main() { | ||
let path_prof_data_dir = Path::new("prof_data_dir"); | ||
let path_merged_profdata = path_prof_data_dir.join("merged.profdata"); | ||
rustc().input("opaque.rs").run(); | ||
fs_wrapper::create_dir_all(&path_prof_data_dir); | ||
rustc() | ||
.input("interesting.rs") | ||
.profile_generate(&path_prof_data_dir) | ||
.opt() | ||
.codegen_units(1) | ||
.run(); | ||
rustc().input("main.rs").profile_generate(&path_prof_data_dir).opt().run(); | ||
run_with_args("main", &["aaaaaaaaaaaa2bbbbbbbbbbbb2bbbbbbbbbbbbbbbbcc"]); | ||
llvm_profdata().merge().output(&path_merged_profdata).input(path_prof_data_dir).run(); | ||
rustc() | ||
.input("interesting.rs") | ||
.profile_use(path_merged_profdata) | ||
.opt() | ||
.codegen_units(1) | ||
.emit("llvm-ir") | ||
.run(); | ||
llvm_filecheck() | ||
.patterns("filecheck-patterns.txt") | ||
.stdin(fs_wrapper::read("interesting.ll")) | ||
.run(); | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.