Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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/ErrorHandling.h" |
||
32 | #include "llvm/Support/raw_ostream.h" |
||
33 | #include <cstring> |
||
34 | |||
35 | namespace llvm { |
||
36 | |||
37 | //===----------------------------------------------------------------------===// |
||
38 | // PassNameParser class - Make use of the pass registration mechanism to |
||
39 | // automatically add a command line argument to opt for each pass. |
||
40 | // |
||
41 | class PassNameParser : public PassRegistrationListener, |
||
42 | public cl::parser<const PassInfo*> { |
||
43 | public: |
||
44 | PassNameParser(cl::Option &O); |
||
45 | ~PassNameParser() override; |
||
46 | |||
47 | void initialize() { |
||
48 | cl::parser<const PassInfo*>::initialize(); |
||
49 | |||
50 | // Add all of the passes to the map that got initialized before 'this' did. |
||
51 | enumeratePasses(); |
||
52 | } |
||
53 | |||
54 | // ignorablePassImpl - Can be overriden in subclasses to refine the list of |
||
55 | // which passes we want to include. |
||
56 | // |
||
57 | virtual bool ignorablePassImpl(const PassInfo *P) const { return false; } |
||
58 | |||
59 | inline bool ignorablePass(const PassInfo *P) const { |
||
60 | // Ignore non-selectable and non-constructible passes! Ignore |
||
61 | // non-optimizations. |
||
62 | return P->getPassArgument().empty() || P->getNormalCtor() == nullptr || |
||
63 | ignorablePassImpl(P); |
||
64 | } |
||
65 | |||
66 | // Implement the PassRegistrationListener callbacks used to populate our map |
||
67 | // |
||
68 | void passRegistered(const PassInfo *P) override { |
||
69 | if (ignorablePass(P)) return; |
||
70 | if (findOption(P->getPassArgument().data()) != getNumOptions()) { |
||
71 | errs() << "Two passes with the same argument (-" |
||
72 | << P->getPassArgument() << ") attempted to be registered!\n"; |
||
73 | llvm_unreachable(nullptr); |
||
74 | } |
||
75 | addLiteralOption(P->getPassArgument().data(), P, P->getPassName().data()); |
||
76 | } |
||
77 | void passEnumerate(const PassInfo *P) override { passRegistered(P); } |
||
78 | |||
79 | // printOptionInfo - Print out information about this option. Override the |
||
80 | // default implementation to sort the table before we print... |
||
81 | void printOptionInfo(const cl::Option &O, size_t GlobalWidth) const override { |
||
82 | PassNameParser *PNP = const_cast<PassNameParser*>(this); |
||
83 | array_pod_sort(PNP->Values.begin(), PNP->Values.end(), ValCompare); |
||
84 | cl::parser<const PassInfo*>::printOptionInfo(O, GlobalWidth); |
||
85 | } |
||
86 | |||
87 | private: |
||
88 | // ValCompare - Provide a sorting comparator for Values elements... |
||
89 | static int ValCompare(const PassNameParser::OptionInfo *VT1, |
||
90 | const PassNameParser::OptionInfo *VT2) { |
||
91 | return VT1->Name.compare(VT2->Name); |
||
92 | } |
||
93 | }; |
||
94 | |||
95 | } // End llvm namespace |
||
96 | |||
97 | #endif |