LCOV - code coverage report
Current view: top level - include/llvm/Support - Options.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 8 8 100.0 %
Date: 2017-09-14 15:23:50 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- llvm/Support/Options.h - Debug options support -----------*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : /// \file
      10             : /// This file declares helper objects for defining debug options that can be
      11             : /// configured via the command line. The new API currently builds on the cl::opt
      12             : /// API, but does not require the use of static globals.
      13             : ///
      14             : /// With this API options are registered during initialization. For passes, this
      15             : /// happens during pass initialization. Passes with options will call a static
      16             : /// registerOptions method during initialization that registers options with the
      17             : /// OptionRegistry. An example implementation of registerOptions is:
      18             : ///
      19             : /// static void registerOptions() {
      20             : ///   OptionRegistry::registerOption<bool, Scalarizer,
      21             : ///                                &Scalarizer::ScalarizeLoadStore>(
      22             : ///       "scalarize-load-store",
      23             : ///       "Allow the scalarizer pass to scalarize loads and store", false);
      24             : /// }
      25             : ///
      26             : /// When reading data for options the interface is via the LLVMContext. Option
      27             : /// data for passes should be read from the context during doInitialization. An
      28             : /// example of reading the above option would be:
      29             : ///
      30             : /// ScalarizeLoadStore =
      31             : ///   M.getContext().getOption<bool,
      32             : ///                            Scalarizer,
      33             : ///                            &Scalarizer::ScalarizeLoadStore>();
      34             : ///
      35             : //===----------------------------------------------------------------------===//
      36             : 
      37             : #ifndef LLVM_SUPPORT_OPTIONS_H
      38             : #define LLVM_SUPPORT_OPTIONS_H
      39             : 
      40             : #include "llvm/ADT/DenseMap.h"
      41             : #include "llvm/Support/CommandLine.h"
      42             : 
      43             : namespace llvm {
      44             : 
      45             : namespace detail {
      46             : 
      47             : // Options are keyed of the unique address of a static character synthesized
      48             : // based on template arguments.
      49             : template <typename ValT, typename Base, ValT(Base::*Mem)> class OptionKey {
      50             : public:
      51             :   static char ID;
      52             : };
      53             : 
      54             : template <typename ValT, typename Base, ValT(Base::*Mem)>
      55             : char OptionKey<ValT, Base, Mem>::ID = 0;
      56             : 
      57             : } // namespace detail
      58             : 
      59             : /// \brief Singleton class used to register debug options.
      60             : ///
      61             : /// The OptionRegistry is responsible for managing lifetimes of the options and
      62             : /// provides interfaces for option registration and reading values from options.
      63             : /// This object is a singleton, only one instance should ever exist so that all
      64             : /// options are registered in the same place.
      65             : class OptionRegistry {
      66             : private:
      67             :   DenseMap<void *, cl::Option *> Options;
      68             : 
      69             :   /// \brief Adds a cl::Option to the registry.
      70             :   ///
      71             :   /// \param Key unique key for option
      72             :   /// \param O option to map to \p Key
      73             :   ///
      74             :   /// Allocated cl::Options are owned by the OptionRegistry and are deallocated
      75             :   /// on destruction or removal
      76             :   void addOption(void *Key, cl::Option *O);
      77             : 
      78             : public:
      79             :   ~OptionRegistry();
      80       51446 :   OptionRegistry() {}
      81             : 
      82             :   /// \brief Returns a reference to the singleton instance.
      83             :   static OptionRegistry &instance();
      84             : 
      85             :   /// \brief Registers an option with the OptionRegistry singleton.
      86             :   ///
      87             :   /// \tparam ValT type of the option's data
      88             :   /// \tparam Base class used to key the option
      89             :   /// \tparam Mem member of \p Base used for keying the option
      90             :   ///
      91             :   /// Options are keyed off the template parameters to generate unique static
      92             :   /// characters. The template parameters are (1) the type of the data the
      93             :   /// option stores (\p ValT), the class that will read the option (\p Base),
      94             :   /// and the member that the class will store the data into (\p Mem).
      95             :   template <typename ValT, typename Base, ValT(Base::*Mem)>
      96       25723 :   static void registerOption(StringRef ArgStr, StringRef Desc,
      97             :                              const ValT &InitValue) {
      98       77169 :     cl::opt<ValT> *Option = new cl::opt<ValT>(ArgStr, cl::desc(Desc),
      99       51446 :                                               cl::Hidden, cl::init(InitValue));
     100       25723 :     instance().addOption(&detail::OptionKey<ValT, Base, Mem>::ID, Option);
     101       25723 :   }
     102             : 
     103             :   /// \brief Returns the value of the option.
     104             :   ///
     105             :   /// \tparam ValT type of the option's data
     106             :   /// \tparam Base class used to key the option
     107             :   /// \tparam Mem member of \p Base used for keying the option
     108             :   ///
     109             :   /// Reads option values based on the key generated by the template parameters.
     110             :   /// Keying for get() is the same as keying for registerOption.
     111             :   template <typename ValT, typename Base, ValT(Base::*Mem)> ValT get() const {
     112           8 :     auto It = Options.find(&detail::OptionKey<ValT, Base, Mem>::ID);
     113             :     assert(It != Options.end() && "Option not in OptionRegistry");
     114          16 :     return *(cl::opt<ValT> *)It->second;
     115             :   }
     116             : };
     117             : 
     118             : } // namespace llvm
     119             : 
     120             : #endif

Generated by: LCOV version 1.13