1 //===--- LogDiagnosticPrinter.h - Log Diagnostic Client ---------*- 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_LOGDIAGNOSTICPRINTER_H 10 #define LLVM_CLANG_FRONTEND_LOGDIAGNOSTICPRINTER_H 11 12 #include "clang/Basic/Diagnostic.h" 13 #include "clang/Basic/SourceLocation.h" 14 #include "llvm/ADT/SmallVector.h" 15 #include "llvm/ADT/StringRef.h" 16 17 namespace clang { 18 class DiagnosticOptions; 19 class LangOptions; 20 21 class LogDiagnosticPrinter : public DiagnosticConsumer { 22 struct DiagEntry { 23 /// The primary message line of the diagnostic. 24 std::string Message; 25 26 /// The source file name, if available. 27 std::string Filename; 28 29 /// The source file line number, if available. 30 unsigned Line; 31 32 /// The source file column number, if available. 33 unsigned Column; 34 35 /// The ID of the diagnostic. 36 unsigned DiagnosticID; 37 38 /// The Option Flag for the diagnostic 39 std::string WarningOption; 40 41 /// The level of the diagnostic. 42 DiagnosticsEngine::Level DiagnosticLevel; 43 }; 44 45 void EmitDiagEntry(llvm::raw_ostream &OS, 46 const LogDiagnosticPrinter::DiagEntry &DE); 47 48 // Conditional ownership (when StreamOwner is non-null, it's keeping OS 49 // alive). We might want to replace this with a wrapper for conditional 50 // ownership eventually - it seems to pop up often enough. 51 raw_ostream &OS; 52 std::unique_ptr<raw_ostream> StreamOwner; 53 const LangOptions *LangOpts; 54 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts; 55 56 SourceLocation LastWarningLoc; 57 FullSourceLoc LastLoc; 58 59 SmallVector<DiagEntry, 8> Entries; 60 61 std::string MainFilename; 62 std::string DwarfDebugFlags; 63 64 public: 65 LogDiagnosticPrinter(raw_ostream &OS, DiagnosticOptions *Diags, 66 std::unique_ptr<raw_ostream> StreamOwner); 67 setDwarfDebugFlags(StringRef Value)68 void setDwarfDebugFlags(StringRef Value) { 69 DwarfDebugFlags = std::string(Value); 70 } 71 BeginSourceFile(const LangOptions & LO,const Preprocessor * PP)72 void BeginSourceFile(const LangOptions &LO, const Preprocessor *PP) override { 73 LangOpts = &LO; 74 } 75 76 void EndSourceFile() override; 77 78 void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, 79 const Diagnostic &Info) override; 80 }; 81 82 } // end namespace clang 83 84 #endif 85