| Index: src/IceRangeSpec.h
|
| diff --git a/src/IceRangeSpec.h b/src/IceRangeSpec.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cdd9c35738794b69bf7699beccd2275088fdf655
|
| --- /dev/null
|
| +++ b/src/IceRangeSpec.h
|
| @@ -0,0 +1,73 @@
|
| +//===- 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; }
|
| +
|
| +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
|
|
|