rewrite pgo-branch-weights to rmake · rust-lang/rust@17b0771 (original) (raw)
``
1
`+
use std::path::{Path, PathBuf};
`
``
2
+
``
3
`+
use crate::{env_var, Command};
`
``
4
+
``
5
`` +
/// Construct a new llvm-readobj
invocation. This assumes that llvm-readobj
is available
``
``
6
`` +
/// at $LLVM_BIN_DIR/llvm-readobj
.
``
``
7
`+
pub fn llvm_readobj() -> LlvmReadobj {
`
``
8
`+
LlvmReadobj::new()
`
``
9
`+
}
`
``
10
+
``
11
`` +
/// Construct a new llvm-profdata
invocation. This assumes that llvm-profdata
is available
``
``
12
`` +
/// at $LLVM_BIN_DIR/llvm-profdata
.
``
``
13
`+
pub fn llvm_profdata() -> LlvmProfdata {
`
``
14
`+
LlvmProfdata::new()
`
``
15
`+
}
`
``
16
+
``
17
`` +
/// Construct a new llvm-filecheck
invocation. This assumes that llvm-filecheck
is available
``
``
18
`` +
/// at $LLVM_FILECHECK
.
``
``
19
`+
pub fn llvm_filecheck() -> LlvmFilecheck {
`
``
20
`+
LlvmFilecheck::new()
`
``
21
`+
}
`
``
22
+
``
23
`` +
/// A llvm-readobj
invocation builder.
``
``
24
`+
#[derive(Debug)]
`
``
25
`+
#[must_use]
`
``
26
`+
pub struct LlvmReadobj {
`
``
27
`+
cmd: Command,
`
``
28
`+
}
`
``
29
+
``
30
`` +
/// A llvm-profdata
invocation builder.
``
``
31
`+
#[derive(Debug)]
`
``
32
`+
#[must_use]
`
``
33
`+
pub struct LlvmProfdata {
`
``
34
`+
cmd: Command,
`
``
35
`+
}
`
``
36
+
``
37
`` +
/// A llvm-filecheck
invocation builder.
``
``
38
`+
#[derive(Debug)]
`
``
39
`+
#[must_use]
`
``
40
`+
pub struct LlvmFilecheck {
`
``
41
`+
cmd: Command,
`
``
42
`+
}
`
``
43
+
``
44
`+
crate::impl_common_helpers!(LlvmReadobj);
`
``
45
`+
crate::impl_common_helpers!(LlvmProfdata);
`
``
46
`+
crate::impl_common_helpers!(LlvmFilecheck);
`
``
47
+
``
48
`+
/// Generate the path to the bin directory of LLVM.
`
``
49
`+
#[must_use]
`
``
50
`+
pub fn llvm_bin_dir() -> PathBuf {
`
``
51
`+
let llvm_bin_dir = env_var("LLVM_BIN_DIR");
`
``
52
`+
PathBuf::from(llvm_bin_dir)
`
``
53
`+
}
`
``
54
+
``
55
`+
impl LlvmReadobj {
`
``
56
`` +
/// Construct a new llvm-readobj
invocation. This assumes that llvm-readobj
is available
``
``
57
`` +
/// at $LLVM_BIN_DIR/llvm-readobj
.
``
``
58
`+
pub fn new() -> Self {
`
``
59
`+
let llvm_readobj = llvm_bin_dir().join("llvm-readobj");
`
``
60
`+
let cmd = Command::new(llvm_readobj);
`
``
61
`+
Self { cmd }
`
``
62
`+
}
`
``
63
+
``
64
`+
/// Provide an input file.
`
``
65
`+
pub fn input<P: AsRef
`
``
66
`+
self.cmd.arg(path.as_ref());
`
``
67
`+
self
`
``
68
`+
}
`
``
69
+
``
70
`` +
/// Pass --file-header
to display file headers.
``
``
71
`+
pub fn file_header(&mut self) -> &mut Self {
`
``
72
`+
self.cmd.arg("--file-header");
`
``
73
`+
self
`
``
74
`+
}
`
``
75
`+
}
`
``
76
+
``
77
`+
impl LlvmProfdata {
`
``
78
`` +
/// Construct a new llvm-profdata
invocation. This assumes that llvm-profdata
is available
``
``
79
`` +
/// at $LLVM_BIN_DIR/llvm-profdata
.
``
``
80
`+
pub fn new() -> Self {
`
``
81
`+
let llvm_profdata = llvm_bin_dir().join("llvm-profdata");
`
``
82
`+
let cmd = Command::new(llvm_profdata);
`
``
83
`+
Self { cmd }
`
``
84
`+
}
`
``
85
+
``
86
`+
/// Provide an input file.
`
``
87
`+
pub fn input<P: AsRef
`
``
88
`+
self.cmd.arg(path.as_ref());
`
``
89
`+
self
`
``
90
`+
}
`
``
91
+
``
92
`+
/// Specify the output file path.
`
``
93
`+
pub fn output<P: AsRef
`
``
94
`+
self.cmd.arg("-o");
`
``
95
`+
self.cmd.arg(path.as_ref());
`
``
96
`+
self
`
``
97
`+
}
`
``
98
+
``
99
`+
/// Take several profile data files generated by PGO instrumentation and merge them
`
``
100
`+
/// together into a single indexed profile data file.
`
``
101
`+
pub fn merge(&mut self) -> &mut Self {
`
``
102
`+
self.cmd.arg("merge");
`
``
103
`+
self
`
``
104
`+
}
`
``
105
`+
}
`
``
106
+
``
107
`+
impl LlvmFilecheck {
`
``
108
`` +
/// Construct a new llvm-filecheck
invocation. This assumes that llvm-filecheck
is available
``
``
109
`` +
/// at $LLVM_FILECHECK
.
``
``
110
`+
pub fn new() -> Self {
`
``
111
`+
let llvm_filecheck = env_var("LLVM_FILECHECK");
`
``
112
`+
let cmd = Command::new(llvm_filecheck);
`
``
113
`+
Self { cmd }
`
``
114
`+
}
`
``
115
+
``
116
`+
/// Pipe a read file into standard input containing patterns that will be matched against the .patterns(path) call.
`
``
117
`+
pub fn stdin<I: AsRef<[u8]>>(&mut self, input: I) -> &mut Self {
`
``
118
`+
self.cmd.set_stdin(input.as_ref().to_vec().into_boxed_slice());
`
``
119
`+
self
`
``
120
`+
}
`
``
121
+
``
122
`+
/// Provide the patterns that need to be matched.
`
``
123
`+
pub fn patterns<P: AsRef
`
``
124
`+
self.cmd.arg(path.as_ref());
`
``
125
`+
self
`
``
126
`+
}
`
``
127
`+
}
`