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