1 | //===- LegacyPassNameParser.h -----------------------------------*- C++ -*-===// |
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 | // This file contains the PassNameParser and FilteredPassNameParser<> classes, |
10 | // which are used to add command line arguments to a utility for all of the |
11 | // passes that have been registered into the system. |
12 | // |
13 | // The PassNameParser class adds ALL passes linked into the system (that are |
14 | // creatable) as command line arguments to the tool (when instantiated with the |
15 | // appropriate command line option template). The FilteredPassNameParser<> |
16 | // template is used for the same purposes as PassNameParser, except that it only |
17 | // includes passes that have a PassType that are compatible with the filter |
18 | // (which is the template argument). |
19 | // |
20 | // Note that this is part of the legacy pass manager infrastructure and will be |
21 | // (eventually) going away. |
22 | // |
23 | //===----------------------------------------------------------------------===// |
24 | |
25 | #ifndef LLVM_IR_LEGACYPASSNAMEPARSER_H |
26 | #define LLVM_IR_LEGACYPASSNAMEPARSER_H |
27 | |
28 | #include "llvm/ADT/STLExtras.h" |
29 | #include "llvm/Pass.h" |
30 | #include "llvm/Support/CommandLine.h" |
31 | #include "llvm/Support/Compiler.h" |
32 | #include "llvm/Support/ErrorHandling.h" |
33 | #include "llvm/Support/raw_ostream.h" |
34 | #include <cstring> |
35 | |
36 | namespace llvm { |
37 | |
38 | //===----------------------------------------------------------------------===// |
39 | // PassNameParser class - Make use of the pass registration mechanism to |
40 | // automatically add a command line argument to opt for each pass. |
41 | // |
42 | class LLVM_ABI PassNameParser : public PassRegistrationListener, |
43 | public cl::parser<const PassInfo *> { |
44 | public: |
45 | PassNameParser(cl::Option &O); |
46 | ~PassNameParser() override; |
47 | |
48 | void initialize() { |
49 | cl::parser<const PassInfo*>::initialize(); |
50 | |
51 | // Add all of the passes to the map that got initialized before 'this' did. |
52 | enumeratePasses(); |
53 | } |
54 | |
55 | // ignorablePassImpl - Can be overriden in subclasses to refine the list of |
56 | // which passes we want to include. |
57 | // |
58 | virtual bool ignorablePassImpl(const PassInfo *P) const { return false; } |
59 | |
60 | inline bool ignorablePass(const PassInfo *P) const { |
61 | // Ignore non-selectable and non-constructible passes! Ignore |
62 | // non-optimizations. |
63 | return P->getPassArgument().empty() || P->getNormalCtor() == nullptr || |
64 | ignorablePassImpl(P); |
65 | } |
66 | |
67 | // Implement the PassRegistrationListener callbacks used to populate our map |
68 | // |
69 | void passRegistered(const PassInfo *P) override { |
70 | if (ignorablePass(P)) return; |
71 | if (findOption(Name: P->getPassArgument().data()) != getNumOptions()) { |
72 | errs() << "Two passes with the same argument (-" |
73 | << P->getPassArgument() << ") attempted to be registered!\n" ; |
74 | llvm_unreachable(nullptr); |
75 | } |
76 | addLiteralOption(Name: P->getPassArgument().data(), V: P, HelpStr: P->getPassName().data()); |
77 | } |
78 | void passEnumerate(const PassInfo *P) override { passRegistered(P); } |
79 | |
80 | // printOptionInfo - Print out information about this option. Override the |
81 | // default implementation to sort the table before we print... |
82 | void printOptionInfo(const cl::Option &O, size_t GlobalWidth) const override { |
83 | PassNameParser *PNP = const_cast<PassNameParser*>(this); |
84 | array_pod_sort(Start: PNP->Values.begin(), End: PNP->Values.end(), Compare: ValCompare); |
85 | cl::parser<const PassInfo*>::printOptionInfo(O, GlobalWidth); |
86 | } |
87 | |
88 | private: |
89 | // ValCompare - Provide a sorting comparator for Values elements... |
90 | static int ValCompare(const PassNameParser::OptionInfo *VT1, |
91 | const PassNameParser::OptionInfo *VT2) { |
92 | return VT1->Name.compare(RHS: VT2->Name); |
93 | } |
94 | }; |
95 | |
96 | } // End llvm namespace |
97 | |
98 | #endif |
99 | |