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