| //===- 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 |