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 |