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>(&mut self, path: P) -> &mut Self {

`

``

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>(&mut self, path: P) -> &mut Self {

`

``

88

`+

self.cmd.arg(path.as_ref());

`

``

89

`+

self

`

``

90

`+

}

`

``

91

+

``

92

`+

/// Specify the output file path.

`

``

93

`+

pub fn output<P: AsRef>(&mut self, path: P) -> &mut Self {

`

``

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>(&mut self, path: P) -> &mut Self {

`

``

124

`+

self.cmd.arg(path.as_ref());

`

``

125

`+

self

`

``

126

`+

}

`

``

127

`+

}

`