1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceRangeSpec.h - Include/exclude specs -------*- C++ -*-===// 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // The Subzero Code Generator 4*03ce13f7SAndroid Build Coastguard Worker // 5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*03ce13f7SAndroid Build Coastguard Worker // 8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*03ce13f7SAndroid Build Coastguard Worker /// 10*03ce13f7SAndroid Build Coastguard Worker /// \file 11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares a class for specifying inclusion/exclusion of values, such 12*03ce13f7SAndroid Build Coastguard Worker /// as functions to match. 13*03ce13f7SAndroid Build Coastguard Worker /// 14*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 15*03ce13f7SAndroid Build Coastguard Worker 16*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICERANGESPEC_H 17*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICERANGESPEC_H 18*03ce13f7SAndroid Build Coastguard Worker 19*03ce13f7SAndroid Build Coastguard Worker #include "IceStringPool.h" 20*03ce13f7SAndroid Build Coastguard Worker 21*03ce13f7SAndroid Build Coastguard Worker #include <string> 22*03ce13f7SAndroid Build Coastguard Worker #include <unordered_set> 23*03ce13f7SAndroid Build Coastguard Worker #include <vector> 24*03ce13f7SAndroid Build Coastguard Worker 25*03ce13f7SAndroid Build Coastguard Worker #include "llvm/ADT/BitVector.h" 26*03ce13f7SAndroid Build Coastguard Worker 27*03ce13f7SAndroid Build Coastguard Worker namespace Ice { 28*03ce13f7SAndroid Build Coastguard Worker 29*03ce13f7SAndroid Build Coastguard Worker class RangeSpec { 30*03ce13f7SAndroid Build Coastguard Worker RangeSpec(const RangeSpec &) = delete; 31*03ce13f7SAndroid Build Coastguard Worker RangeSpec &operator=(const RangeSpec &) = delete; 32*03ce13f7SAndroid Build Coastguard Worker 33*03ce13f7SAndroid Build Coastguard Worker public: 34*03ce13f7SAndroid Build Coastguard Worker static constexpr char DELIM_LIST = ','; 35*03ce13f7SAndroid Build Coastguard Worker static constexpr char DELIM_RANGE = ':'; 36*03ce13f7SAndroid Build Coastguard Worker static constexpr uint32_t RangeMax = std::numeric_limits<uint32_t>::max(); 37*03ce13f7SAndroid Build Coastguard Worker RangeSpec() = default; 38*03ce13f7SAndroid Build Coastguard Worker struct Desc { 39*03ce13f7SAndroid Build Coastguard Worker // Set of names explicitly provided. 40*03ce13f7SAndroid Build Coastguard Worker std::unordered_set<std::string> Names; 41*03ce13f7SAndroid Build Coastguard Worker // Set of numbers explicitly provided. 42*03ce13f7SAndroid Build Coastguard Worker llvm::BitVector Numbers; 43*03ce13f7SAndroid Build Coastguard Worker // The smallest X for which the open-ended interval "X:" was provided. This 44*03ce13f7SAndroid Build Coastguard Worker // is needed because the intervals are parsed before we know the largest 45*03ce13f7SAndroid Build Coastguard Worker // number that might be matched against, and we can't make the Numbers 46*03ce13f7SAndroid Build Coastguard Worker // bitvector infinitely long. 47*03ce13f7SAndroid Build Coastguard Worker uint32_t AllFrom = RangeMax; 48*03ce13f7SAndroid Build Coastguard Worker // Whether a clause was explicitly provided. 49*03ce13f7SAndroid Build Coastguard Worker bool IsExplicit = false; 50*03ce13f7SAndroid Build Coastguard Worker }; 51*03ce13f7SAndroid Build Coastguard Worker void init(const std::string &Spec); 52*03ce13f7SAndroid Build Coastguard Worker bool match(const std::string &Name, uint32_t Number) const; match(GlobalString Name,uint32_t Number)53*03ce13f7SAndroid Build Coastguard Worker bool match(GlobalString Name, uint32_t Number) const { 54*03ce13f7SAndroid Build Coastguard Worker return match(Name.toStringOrEmpty(), Number); 55*03ce13f7SAndroid Build Coastguard Worker } 56*03ce13f7SAndroid Build Coastguard Worker // Returns true if any RangeSpec object has had init() called with an explicit 57*03ce13f7SAndroid Build Coastguard Worker // name rather than (or in addition to) a numeric range. If so, we want to 58*03ce13f7SAndroid Build Coastguard Worker // construct explicit names for functions even in a non-DUMP build so that 59*03ce13f7SAndroid Build Coastguard Worker // matching on function name works correctly. Note that this is not 60*03ce13f7SAndroid Build Coastguard Worker // thread-safe, so we count on all this being handled by the startup thread. hasNames()61*03ce13f7SAndroid Build Coastguard Worker static bool hasNames() { return HasNames; } 62*03ce13f7SAndroid Build Coastguard Worker // Helper function to tokenize a string into a vector of string tokens, given 63*03ce13f7SAndroid Build Coastguard Worker // a single delimiter character. An empty string produces an empty token 64*03ce13f7SAndroid Build Coastguard Worker // vector. Zero-length tokens are allowed, e.g. ",a,,,b," may tokenize to 65*03ce13f7SAndroid Build Coastguard Worker // {"","a","","","b",""}. 66*03ce13f7SAndroid Build Coastguard Worker static std::vector<std::string> tokenize(const std::string &Spec, 67*03ce13f7SAndroid Build Coastguard Worker char Delimiter); 68*03ce13f7SAndroid Build Coastguard Worker 69*03ce13f7SAndroid Build Coastguard Worker private: 70*03ce13f7SAndroid Build Coastguard Worker void include(const std::string &Token); 71*03ce13f7SAndroid Build Coastguard Worker void exclude(const std::string &Token); 72*03ce13f7SAndroid Build Coastguard Worker Desc Includes; 73*03ce13f7SAndroid Build Coastguard Worker Desc Excludes; 74*03ce13f7SAndroid Build Coastguard Worker static bool HasNames; 75*03ce13f7SAndroid Build Coastguard Worker }; 76*03ce13f7SAndroid Build Coastguard Worker 77*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice 78*03ce13f7SAndroid Build Coastguard Worker 79*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICERANGESPEC_H 80