123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- SerializedDiagnosticReader.h - Reads diagnostics ---------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_FRONTEND_SERIALIZEDDIAGNOSTICREADER_H
- #define LLVM_CLANG_FRONTEND_SERIALIZEDDIAGNOSTICREADER_H
- #include "clang/Basic/LLVM.h"
- #include "llvm/Bitstream/BitstreamReader.h"
- #include "llvm/ADT/StringRef.h"
- #include "llvm/Support/ErrorOr.h"
- #include <system_error>
- namespace clang {
- namespace serialized_diags {
- enum class SDError {
- CouldNotLoad = 1,
- InvalidSignature,
- InvalidDiagnostics,
- MalformedTopLevelBlock,
- MalformedSubBlock,
- MalformedBlockInfoBlock,
- MalformedMetadataBlock,
- MalformedDiagnosticBlock,
- MalformedDiagnosticRecord,
- MissingVersion,
- VersionMismatch,
- UnsupportedConstruct,
- /// A generic error for subclass handlers that don't want or need to define
- /// their own error_category.
- HandlerFailed
- };
- const std::error_category &SDErrorCategory();
- inline std::error_code make_error_code(SDError E) {
- return std::error_code(static_cast<int>(E), SDErrorCategory());
- }
- /// A location that is represented in the serialized diagnostics.
- struct Location {
- unsigned FileID;
- unsigned Line;
- unsigned Col;
- unsigned Offset;
- Location(unsigned FileID, unsigned Line, unsigned Col, unsigned Offset)
- : FileID(FileID), Line(Line), Col(Col), Offset(Offset) {}
- };
- /// A base class that handles reading serialized diagnostics from a file.
- ///
- /// Subclasses should override the visit* methods with their logic for handling
- /// the various constructs that are found in serialized diagnostics.
- class SerializedDiagnosticReader {
- public:
- SerializedDiagnosticReader() = default;
- virtual ~SerializedDiagnosticReader() = default;
- /// Read the diagnostics in \c File
- std::error_code readDiagnostics(StringRef File);
- private:
- enum class Cursor;
- /// Read to the next record or block to process.
- llvm::ErrorOr<Cursor> skipUntilRecordOrBlock(llvm::BitstreamCursor &Stream,
- unsigned &BlockOrRecordId);
- /// Read a metadata block from \c Stream.
- std::error_code readMetaBlock(llvm::BitstreamCursor &Stream);
- /// Read a diagnostic block from \c Stream.
- std::error_code readDiagnosticBlock(llvm::BitstreamCursor &Stream);
- protected:
- /// Visit the start of a diagnostic block.
- virtual std::error_code visitStartOfDiagnostic() { return {}; }
- /// Visit the end of a diagnostic block.
- virtual std::error_code visitEndOfDiagnostic() { return {}; }
- /// Visit a category. This associates the category \c ID to a \c Name.
- virtual std::error_code visitCategoryRecord(unsigned ID, StringRef Name) {
- return {};
- }
- /// Visit a flag. This associates the flag's \c ID to a \c Name.
- virtual std::error_code visitDiagFlagRecord(unsigned ID, StringRef Name) {
- return {};
- }
- /// Visit a diagnostic.
- virtual std::error_code
- visitDiagnosticRecord(unsigned Severity, const Location &Location,
- unsigned Category, unsigned Flag, StringRef Message) {
- return {};
- }
- /// Visit a filename. This associates the file's \c ID to a \c Name.
- virtual std::error_code visitFilenameRecord(unsigned ID, unsigned Size,
- unsigned Timestamp,
- StringRef Name) {
- return {};
- }
- /// Visit a fixit hint.
- virtual std::error_code
- visitFixitRecord(const Location &Start, const Location &End, StringRef Text) {
- return {};
- }
- /// Visit a source range.
- virtual std::error_code visitSourceRangeRecord(const Location &Start,
- const Location &End) {
- return {};
- }
- /// Visit the version of the set of diagnostics.
- virtual std::error_code visitVersionRecord(unsigned Version) { return {}; }
- };
- } // namespace serialized_diags
- } // namespace clang
- namespace std {
- template <>
- struct is_error_code_enum<clang::serialized_diags::SDError> : std::true_type {};
- } // namespace std
- #endif // LLVM_CLANG_FRONTEND_SERIALIZEDDIAGNOSTICREADER_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|