xref: /freebsd/contrib/llvm-project/llvm/tools/llvm-remarkutil/RemarkUtilHelpers.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- RemarkUtilHelpers.h ------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Helpers for remark utilites
10 //
11 //===----------------------------------------------------------------------===//
12 #include "llvm-c/Remarks.h"
13 #include "llvm/ADT/StringRef.h"
14 #include "llvm/Remarks/Remark.h"
15 #include "llvm/Remarks/RemarkFormat.h"
16 #include "llvm/Remarks/RemarkParser.h"
17 #include "llvm/Remarks/YAMLRemarkSerializer.h"
18 #include "llvm/Support/CommandLine.h"
19 #include "llvm/Support/Error.h"
20 #include "llvm/Support/FileSystem.h"
21 #include "llvm/Support/MemoryBuffer.h"
22 #include "llvm/Support/Regex.h"
23 #include "llvm/Support/ToolOutputFile.h"
24 
25 // Keep input + output help + names consistent across the various modes via a
26 // hideous macro.
27 #define INPUT_OUTPUT_COMMAND_LINE_OPTIONS(SUBOPT)                              \
28   static cl::opt<std::string> InputFileName(cl::Positional, cl::init("-"),     \
29                                             cl::desc("<input file>"),          \
30                                             cl::sub(SUBOPT));                  \
31   static cl::opt<std::string> OutputFileName(                                  \
32       "o", cl::init("-"), cl::desc("Output"), cl::value_desc("filename"),      \
33       cl::sub(SUBOPT));
34 
35 // Keep Input format and names consistent accross the modes via a macro.
36 #define INPUT_FORMAT_COMMAND_LINE_OPTIONS(SUBOPT)                              \
37   static cl::opt<Format> InputFormat(                                          \
38       "parser", cl::init(Format::Auto),                                        \
39       cl::desc("Input remark format to parse"),                                \
40       cl::values(                                                              \
41           clEnumValN(Format::Auto, "auto", "Automatic detection (default)"),   \
42           clEnumValN(Format::YAML, "yaml", "YAML"),                            \
43           clEnumValN(Format::Bitstream, "bitstream", "Bitstream")),            \
44       cl::sub(SUBOPT));
45 
46 #define DEBUG_LOC_INFO_COMMAND_LINE_OPTIONS(SUBOPT)                            \
47   static cl::opt<bool> UseDebugLoc(                                            \
48       "use-debug-loc",                                                         \
49       cl::desc(                                                                \
50           "Add debug loc information when generating tables for "              \
51           "functions. The loc is represented as (path:line number:column "     \
52           "number)"),                                                          \
53       cl::init(false), cl::sub(SUBOPT));
54 
55 namespace llvm {
56 namespace remarks {
57 Expected<std::unique_ptr<MemoryBuffer>>
58 getInputMemoryBuffer(StringRef InputFileName);
59 Expected<std::unique_ptr<ToolOutputFile>>
60 getOutputFileWithFlags(StringRef OutputFileName, sys::fs::OpenFlags Flags);
61 Expected<std::unique_ptr<ToolOutputFile>>
62 getOutputFileForRemarks(StringRef OutputFileName, Format OutputFormat);
63 
64 /// Filter object which can be either a string or a regex to match with the
65 /// remark properties.
66 class FilterMatcher {
67   Regex FilterRE;
68   std::string FilterStr;
69   bool IsRegex;
70 
FilterMatcher(StringRef Filter,bool IsRegex)71   FilterMatcher(StringRef Filter, bool IsRegex)
72       : FilterRE(Filter), FilterStr(Filter), IsRegex(IsRegex) {}
73 
74   static Expected<FilterMatcher> createRE(StringRef Arg, StringRef Value);
75 
76 public:
createExact(StringRef Filter)77   static FilterMatcher createExact(StringRef Filter) { return {Filter, false}; }
78 
79   static Expected<FilterMatcher>
80   createRE(const llvm::cl::opt<std::string> &Arg);
81 
82   static Expected<FilterMatcher> createRE(StringRef Filter,
83                                           const cl::list<std::string> &Arg);
84 
85   static Expected<std::optional<FilterMatcher>>
86   createExactOrRE(const llvm::cl::opt<std::string> &ExactArg,
87                   const llvm::cl::opt<std::string> &REArg);
88 
createAny()89   static FilterMatcher createAny() { return {".*", true}; }
90 
match(StringRef StringToMatch)91   bool match(StringRef StringToMatch) const {
92     if (IsRegex)
93       return FilterRE.match(StringToMatch);
94     return FilterStr == StringToMatch.trim().str();
95   }
96 };
97 
98 } // namespace remarks
99 } // namespace llvm
100