123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- LegacyPassNameParser.h -----------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file contains the PassNameParser and FilteredPassNameParser<> classes,
- // which are used to add command line arguments to a utility for all of the
- // passes that have been registered into the system.
- //
- // The PassNameParser class adds ALL passes linked into the system (that are
- // creatable) as command line arguments to the tool (when instantiated with the
- // appropriate command line option template). The FilteredPassNameParser<>
- // template is used for the same purposes as PassNameParser, except that it only
- // includes passes that have a PassType that are compatible with the filter
- // (which is the template argument).
- //
- // Note that this is part of the legacy pass manager infrastructure and will be
- // (eventually) going away.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_IR_LEGACYPASSNAMEPARSER_H
- #define LLVM_IR_LEGACYPASSNAMEPARSER_H
- #include "llvm/ADT/STLExtras.h"
- #include "llvm/Pass.h"
- #include "llvm/Support/CommandLine.h"
- #include "llvm/Support/ErrorHandling.h"
- #include "llvm/Support/raw_ostream.h"
- #include <cstring>
- namespace llvm {
- //===----------------------------------------------------------------------===//
- // PassNameParser class - Make use of the pass registration mechanism to
- // automatically add a command line argument to opt for each pass.
- //
- class PassNameParser : public PassRegistrationListener,
- public cl::parser<const PassInfo*> {
- public:
- PassNameParser(cl::Option &O);
- ~PassNameParser() override;
- void initialize() {
- cl::parser<const PassInfo*>::initialize();
- // Add all of the passes to the map that got initialized before 'this' did.
- enumeratePasses();
- }
- // ignorablePassImpl - Can be overriden in subclasses to refine the list of
- // which passes we want to include.
- //
- virtual bool ignorablePassImpl(const PassInfo *P) const { return false; }
- inline bool ignorablePass(const PassInfo *P) const {
- // Ignore non-selectable and non-constructible passes! Ignore
- // non-optimizations.
- return P->getPassArgument().empty() || P->getNormalCtor() == nullptr ||
- ignorablePassImpl(P);
- }
- // Implement the PassRegistrationListener callbacks used to populate our map
- //
- void passRegistered(const PassInfo *P) override {
- if (ignorablePass(P)) return;
- if (findOption(P->getPassArgument().data()) != getNumOptions()) {
- errs() << "Two passes with the same argument (-"
- << P->getPassArgument() << ") attempted to be registered!\n";
- llvm_unreachable(nullptr);
- }
- addLiteralOption(P->getPassArgument().data(), P, P->getPassName().data());
- }
- void passEnumerate(const PassInfo *P) override { passRegistered(P); }
- // printOptionInfo - Print out information about this option. Override the
- // default implementation to sort the table before we print...
- void printOptionInfo(const cl::Option &O, size_t GlobalWidth) const override {
- PassNameParser *PNP = const_cast<PassNameParser*>(this);
- array_pod_sort(PNP->Values.begin(), PNP->Values.end(), ValCompare);
- cl::parser<const PassInfo*>::printOptionInfo(O, GlobalWidth);
- }
- private:
- // ValCompare - Provide a sorting comparator for Values elements...
- static int ValCompare(const PassNameParser::OptionInfo *VT1,
- const PassNameParser::OptionInfo *VT2) {
- return VT1->Name.compare(VT2->Name);
- }
- };
- } // End llvm namespace
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|