Coverage Report

Created: 2019-03-22 08:08

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/clang/include/clang/Frontend/SerializedDiagnosticReader.h
Line
Count
Source (jump to first uncovered line)
1
//===- SerializedDiagnosticReader.h - Reads diagnostics ---------*- 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
9
#ifndef LLVM_CLANG_FRONTEND_SERIALIZEDDIAGNOSTICREADER_H
10
#define LLVM_CLANG_FRONTEND_SERIALIZEDDIAGNOSTICREADER_H
11
12
#include "clang/Basic/LLVM.h"
13
#include "llvm/Bitcode/BitstreamReader.h"
14
#include "llvm/ADT/StringRef.h"
15
#include "llvm/Support/ErrorOr.h"
16
#include <system_error>
17
18
namespace clang {
19
namespace serialized_diags {
20
21
enum class SDError {
22
  CouldNotLoad = 1,
23
  InvalidSignature,
24
  InvalidDiagnostics,
25
  MalformedTopLevelBlock,
26
  MalformedSubBlock,
27
  MalformedBlockInfoBlock,
28
  MalformedMetadataBlock,
29
  MalformedDiagnosticBlock,
30
  MalformedDiagnosticRecord,
31
  MissingVersion,
32
  VersionMismatch,
33
  UnsupportedConstruct,
34
  /// A generic error for subclass handlers that don't want or need to define
35
  /// their own error_category.
36
  HandlerFailed
37
};
38
39
const std::error_category &SDErrorCategory();
40
41
2
inline std::error_code make_error_code(SDError E) {
42
2
  return std::error_code(static_cast<int>(E), SDErrorCategory());
43
2
}
44
45
/// A location that is represented in the serialized diagnostics.
46
struct Location {
47
  unsigned FileID;
48
  unsigned Line;
49
  unsigned Col;
50
  unsigned Offset;
51
52
  Location(unsigned FileID, unsigned Line, unsigned Col, unsigned Offset)
53
169
      : FileID(FileID), Line(Line), Col(Col), Offset(Offset) {}
54
};
55
56
/// A base class that handles reading serialized diagnostics from a file.
57
///
58
/// Subclasses should override the visit* methods with their logic for handling
59
/// the various constructs that are found in serialized diagnostics.
60
class SerializedDiagnosticReader {
61
public:
62
16
  SerializedDiagnosticReader() = default;
63
16
  virtual ~SerializedDiagnosticReader() = default;
64
65
  /// Read the diagnostics in \c File
66
  std::error_code readDiagnostics(StringRef File);
67
68
private:
69
  enum class Cursor;
70
71
  /// Read to the next record or block to process.
72
  llvm::ErrorOr<Cursor> skipUntilRecordOrBlock(llvm::BitstreamCursor &Stream,
73
                                               unsigned &BlockOrRecordId);
74
75
  /// Read a metadata block from \c Stream.
76
  std::error_code readMetaBlock(llvm::BitstreamCursor &Stream);
77
78
  /// Read a diagnostic block from \c Stream.
79
  std::error_code readDiagnosticBlock(llvm::BitstreamCursor &Stream);
80
81
protected:
82
  /// Visit the start of a diagnostic block.
83
0
  virtual std::error_code visitStartOfDiagnostic() { return {}; }
84
85
  /// Visit the end of a diagnostic block.
86
0
  virtual std::error_code visitEndOfDiagnostic() { return {}; }
87
88
  /// Visit a category. This associates the category \c ID to a \c Name.
89
0
  virtual std::error_code visitCategoryRecord(unsigned ID, StringRef Name) {
90
0
    return {};
91
0
  }
92
93
  /// Visit a flag. This associates the flag's \c ID to a \c Name.
94
0
  virtual std::error_code visitDiagFlagRecord(unsigned ID, StringRef Name) {
95
0
    return {};
96
0
  }
97
98
  /// Visit a diagnostic.
99
  virtual std::error_code
100
  visitDiagnosticRecord(unsigned Severity, const Location &Location,
101
0
                        unsigned Category, unsigned Flag, StringRef Message) {
102
0
    return {};
103
0
  }
104
105
  /// Visit a filename. This associates the file's \c ID to a \c Name.
106
  virtual std::error_code visitFilenameRecord(unsigned ID, unsigned Size,
107
                                              unsigned Timestamp,
108
0
                                              StringRef Name) {
109
0
    return {};
110
0
  }
111
112
  /// Visit a fixit hint.
113
  virtual std::error_code
114
0
  visitFixitRecord(const Location &Start, const Location &End, StringRef Text) {
115
0
    return {};
116
0
  }
117
118
  /// Visit a source range.
119
  virtual std::error_code visitSourceRangeRecord(const Location &Start,
120
0
                                                 const Location &End) {
121
0
    return {};
122
0
  }
123
124
  /// Visit the version of the set of diagnostics.
125
0
  virtual std::error_code visitVersionRecord(unsigned Version) { return {}; }
126
};
127
128
} // namespace serialized_diags
129
} // namespace clang
130
131
namespace std {
132
133
template <>
134
struct is_error_code_enum<clang::serialized_diags::SDError> : std::true_type {};
135
136
} // namespace std
137
138
#endif // LLVM_CLANG_FRONTEND_SERIALIZEDDIAGNOSTICREADER_H