LLVM  14.0.0git
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 =
57  Text.take_while([](char C) { return llvm::isAlnum(C) || C == '_'; });
58  Text = Text.drop_front(Name->size());
59  continue;
60  }
61  Code.push_back(Text.front());
62  Text = Text.drop_front();
63  }
64  Require(!Name, "unterminated $name");
65  Require(OpenRanges.empty(), "unmatched [[");
66 }
67 
69  auto I = Points.find(Name);
70  require(I != Points.end() && I->getValue().size() == 1,
71  "expected exactly one point", Code);
72  return I->getValue()[0];
73 }
74 
75 std::vector<size_t> Annotations::points(llvm::StringRef Name) const {
76  auto I = Points.find(Name);
77  if (I == Points.end())
78  return {};
79  return {I->getValue().begin(), I->getValue().end()};
80 }
81 
83  auto I = Ranges.find(Name);
84  require(I != Ranges.end() && I->getValue().size() == 1,
85  "expected exactly one range", Code);
86  return I->getValue()[0];
87 }
88 
89 std::vector<Annotations::Range>
91  auto I = Ranges.find(Name);
92  if (I == Ranges.end())
93  return {};
94  return {I->getValue().begin(), I->getValue().end()};
95 }
96 
98  const llvm::Annotations::Range &R) {
99  return O << llvm::formatv("[{0}, {1})", R.Begin, R.End);
100 }
llvm
---------------------— PointerInfo ------------------------------------—
Definition: AllocatorList.h:23
llvm::StringRef::empty
LLVM_NODISCARD bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:153
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1168
llvm::Annotations::point
size_t point(llvm::StringRef Name="") const
Returns the position of the point marked by ^ (or $name^) in the text.
llvm::StringRef::take_while
LLVM_NODISCARD StringRef take_while(function_ref< bool(char)> F) const
Return the longest prefix of 'this' such that every character in the prefix satisfies the given predi...
Definition: StringRef.h:639
llvm::StringRef::consume_front
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition: StringRef.h:682
llvm::StringMap::end
iterator end()
Definition: StringMap.h:203
llvm::Annotations::points
std::vector< size_t > points(llvm::StringRef Name="") const
Returns the position of all points marked by ^ (or $name^) in the text.
llvm::Optional< llvm::StringRef >
llvm::errs
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
Definition: raw_ostream.cpp:892
llvm::StringMap::find
iterator find(StringRef Key)
Definition: StringMap.h:216
llvm::Annotations::ranges
std::vector< Range > ranges(llvm::StringRef Name="") const
Returns the location of all ranges marked by [[ ]] (or $name[[ ]]).
llvm::RISCVFenceField::R
@ R
Definition: RISCVBaseInfo.h:198
llvm::formatv
auto formatv(const char *Fmt, Ts &&... Vals) -> formatv_object< decltype(std::make_tuple(detail::build_format_adapter(std::forward< Ts >(Vals))...))>
Definition: FormatVariadic.h:250
C
(vector float) vec_cmpeq(*A, *B) C
Definition: README_ALTIVEC.txt:86
llvm::Annotations::Annotations
Annotations(llvm::StringRef Text)
Parses the annotations from Text. Crashes if it's malformed.
Definition: Annotations.cpp:26
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
llvm::operator<<
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:230
FormatVariadic.h
llvm::None
const NoneType None
Definition: None.h:23
llvm::Annotations::Range
Two offsets pointing to a continuous substring.
Definition: Annotations.h:50
llvm::RISCVFenceField::O
@ O
Definition: RISCVBaseInfo.h:197
llvm::StringRef::front
LLVM_NODISCARD char front() const
front - Get the first character in the string.
Definition: StringRef.h:161
I
#define I(x, y, z)
Definition: MD5.cpp:59
StringExtras.h
Annotations.h
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:58
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition: ErrorHandling.h:136
llvm::GraphProgram::Name
Name
Definition: GraphWriter.h:52
llvm::StringRef::drop_front
LLVM_NODISCARD StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
Definition: StringRef.h:653
require
static void require(bool Assertion, const char *Msg, llvm::StringRef Code)
Definition: Annotations.cpp:19
llvm::Annotations::range
Range range(llvm::StringRef Name="") const
Returns the location of the range marked by [[ ]] (or $name[[ ]]).
raw_ostream.h
llvm::StringRef::size
LLVM_NODISCARD size_t size() const
size - Get the string size.
Definition: StringRef.h:157
llvm::SmallVectorImpl::emplace_back
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:908