blob: 244fe4ac9e70385ceb2a6ad70fc8b078c6bf5948 [file] [log] [blame]
Jim Stichnothdd6dcfa2016-04-18 12:52:09 -07001//===- 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; }
Jim Stichnothfd07ad02016-04-20 10:12:46 -070062 // 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);
Jim Stichnothdd6dcfa2016-04-18 12:52:09 -070068
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