LLVM  10.0.0svn
Annotations.cpp
Go to the documentation of this file.
1 //===--- Annotations.cpp - Annotated source code for unit tests --*- C++-*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
10 
11 #include "llvm/ADT/StringExtras.h"
14 
15 using namespace llvm;
16 
17 // Crash if the assertion fails, printing the message and testcase.
18 // More elegant error handling isn't needed for unit tests.
19 static void require(bool Assertion, const char *Msg, llvm::StringRef Code) {
20  if (!Assertion) {
21  llvm::errs() << "Annotated testcase: " << Msg << "\n" << Code << "\n";
22  llvm_unreachable("Annotated testcase assertion failed!");
23  }
24 }
25 
27  auto Require = [Text](bool Assertion, const char *Msg) {
28  require(Assertion, Msg, Text);
29  };
32 
33  Code.reserve(Text.size());
34  while (!Text.empty()) {
35  if (Text.consume_front("^")) {
36  Points[Name.getValueOr("")].push_back(Code.size());
37  Name = llvm::None;
38  continue;
39  }
40  if (Text.consume_front("[[")) {
41  OpenRanges.emplace_back(Name.getValueOr(""), Code.size());
42  Name = llvm::None;
43  continue;
44  }
45  Require(!Name, "$name should be followed by ^ or [[");
46  if (Text.consume_front("]]")) {
47  Require(!OpenRanges.empty(), "unmatched ]]");
48  Range R;
49  R.Begin = OpenRanges.back().second;
50  R.End = Code.size();
51  Ranges[OpenRanges.back().first].push_back(R);
52  OpenRanges.pop_back();
53  continue;
54  }
55  if (Text.consume_front("$")) {
56  Name = Text.take_while(llvm::isAlnum);
57  Text = Text.drop_front(Name->size());
58  continue;
59  }
60  Code.push_back(Text.front());
61  Text = Text.drop_front();
62  }
63  Require(!Name, "unterminated $name");
64  Require(OpenRanges.empty(), "unmatched [[");
65 }
66 
68  auto I = Points.find(Name);
69  require(I != Points.end() && I->getValue().size() == 1,
70  "expected exactly one point", Code);
71  return I->getValue()[0];
72 }
73 
74 std::vector<size_t> Annotations::points(llvm::StringRef Name) const {
75  auto P = Points.lookup(Name);
76  return {P.begin(), P.end()};
77 }
78 
80  auto I = Ranges.find(Name);
81  require(I != Ranges.end() && I->getValue().size() == 1,
82  "expected exactly one range", Code);
83  return I->getValue()[0];
84 }
85 
86 std::vector<Annotations::Range>
88  auto R = Ranges.lookup(Name);
89  return {R.begin(), R.end()};
90 }
91 
93  const llvm::Annotations::Range &R) {
94  return O << llvm::formatv("[{0}, {1})", R.Begin, R.End);
95 }
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:641
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
This class represents lattice values for constants.
Definition: AllocatorList.h:23
size_t point(llvm::StringRef Name="") const
Returns the position of the point marked by ^ (or $name^) in the text.
Definition: Annotations.cpp:67
amdgpu Simplify well known AMD library false FunctionCallee Value const Twine & Name
constexpr T getValueOr(U &&value) const LLVM_LVALUE_FUNCTION
Definition: Optional.h:266
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition: StringRef.h:663
iterator find(StringRef Key)
Definition: StringMap.h:355
auto formatv(const char *Fmt, Ts &&... Vals) -> formatv_object< decltype(std::make_tuple(detail::build_format_adapter(std::forward< Ts >(Vals))...))>
bool isAlnum(char C)
Checks whether character C is either a decimal digit or an uppercase or lowercase letter as classifie...
Definition: StringExtras.h:88
LLVM_NODISCARD StringRef drop_front(size_t N=1) const
Return a StringRef equal to &#39;this&#39; but with the first N elements dropped.
Definition: StringRef.h:634
Range range(llvm::StringRef Name="") const
Returns the location of the range marked by [[ ]] (or $name[[ ]]).
Definition: Annotations.cpp:79
LLVM_NODISCARD bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:140
LLVM_NODISCARD StringRef take_while(function_ref< bool(char)> F) const
Return the longest prefix of &#39;this&#39; such that every character in the prefix satisfies the given predi...
Definition: StringRef.h:620
LLVM_NODISCARD size_t size() const
size - Get the string size.
Definition: StringRef.h:144
std::vector< size_t > points(llvm::StringRef Name="") const
Returns the position of all points marked by ^ (or $name^) in the text.
Definition: Annotations.cpp:74
#define P(N)
std::vector< Range > ranges(llvm::StringRef Name="") const
Returns the location of all ranges marked by [[ ]] (or $name[[ ]]).
Definition: Annotations.cpp:87
ValueTy lookup(StringRef Key) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition: StringMap.h:369
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static void require(bool Assertion, const char *Msg, llvm::StringRef Code)
Definition: Annotations.cpp:19
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:837
Annotations(llvm::StringRef Text)
Parses the annotations from Text. Crashes if it&#39;s malformed.
Definition: Annotations.cpp:26
LLVM_NODISCARD bool empty() const
Definition: SmallVector.h:55
#define I(x, y, z)
Definition: MD5.cpp:58
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
Definition: APInt.h:2047
LLVM_NODISCARD char front() const
front - Get the first character in the string.
Definition: StringRef.h:148
Two offsets pointing to a continuous substring.
Definition: Annotations.h:50
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:45
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
iterator end()
Definition: StringMap.h:340