//===- subzero/src/IceRangeSpec.h - Include/exclude specs -------*- C++ -*-===// // // The Subzero Code Generator // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief Declares a class for specifying inclusion/exclusion of values, such /// as functions to match. /// //===----------------------------------------------------------------------===// #ifndef SUBZERO_SRC_ICERANGESPEC_H #define SUBZERO_SRC_ICERANGESPEC_H #include "IceStringPool.h" #include <string> #include <unordered_set> #include <vector> #include "llvm/ADT/BitVector.h" namespace Ice { class RangeSpec { RangeSpec(const RangeSpec &) = delete; RangeSpec &operator=(const RangeSpec &) = delete; public: static constexpr char DELIM_LIST = ','; static constexpr char DELIM_RANGE = ':'; static constexpr uint32_t RangeMax = std::numeric_limits<uint32_t>::max(); RangeSpec() = default; struct Desc { // Set of names explicitly provided. std::unordered_set<std::string> Names; // Set of numbers explicitly provided. llvm::BitVector Numbers; // The smallest X for which the open-ended interval "X:" was provided. This // is needed because the intervals are parsed before we know the largest // number that might be matched against, and we can't make the Numbers // bitvector infinitely long. uint32_t AllFrom = RangeMax; // Whether a clause was explicitly provided. bool IsExplicit = false; }; void init(const std::string &Spec); bool match(const std::string &Name, uint32_t Number) const; bool match(GlobalString Name, uint32_t Number) const { return match(Name.toStringOrEmpty(), Number); } // Returns true if any RangeSpec object has had init() called with an explicit // name rather than (or in addition to) a numeric range. If so, we want to // construct explicit names for functions even in a non-DUMP build so that // matching on function name works correctly. Note that this is not // thread-safe, so we count on all this being handled by the startup thread. static bool hasNames() { return HasNames; } // Helper function to tokenize a string into a vector of string tokens, given // a single delimiter character. An empty string produces an empty token // vector. Zero-length tokens are allowed, e.g. ",a,,,b," may tokenize to // {"","a","","","b",""}. static std::vector<std::string> tokenize(const std::string &Spec, char Delimiter); private: void include(const std::string &Token); void exclude(const std::string &Token); Desc Includes; Desc Excludes; static bool HasNames; }; } // end of namespace Ice #endif // SUBZERO_SRC_ICERANGESPEC_H