Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- llvm/Remarks/RemarkStreamer.h ----------------------------*- 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. // This file declares the main interface for streaming remarks.
  10. //
  11. // This is used to stream any llvm::remarks::Remark to an open file taking
  12. // advantage of all the serialization capabilities developed for remarks (e.g.
  13. // metadata in a section, bitstream format, etc.).
  14. //
  15. // Typically, a specialized remark emitter should hold a reference to the main
  16. // remark streamer set up in the LLVMContext, and should convert specialized
  17. // diagnostics to llvm::remarks::Remark objects as they get emitted.
  18. //
  19. // Specialized remark emitters can be components like:
  20. // * Remarks from LLVM (M)IR passes
  21. // * Remarks from the frontend
  22. // * Remarks from an intermediate IR
  23. //
  24. // This allows for composition between specialized remark emitters throughout
  25. // the compilation pipeline, that end up in the same file, using the same format
  26. // and serialization techniques.
  27. //
  28. //===----------------------------------------------------------------------===//
  29.  
  30. #ifndef LLVM_REMARKS_REMARKSTREAMER_H
  31. #define LLVM_REMARKS_REMARKSTREAMER_H
  32.  
  33. #include "llvm/Remarks/RemarkSerializer.h"
  34. #include "llvm/Support/Error.h"
  35. #include "llvm/Support/Regex.h"
  36. #include <memory>
  37. #include <optional>
  38.  
  39. namespace llvm {
  40.  
  41. class raw_ostream;
  42.  
  43. namespace remarks {
  44. class RemarkStreamer final {
  45.   /// The regex used to filter remarks based on the passes that emit them.
  46.   std::optional<Regex> PassFilter;
  47.   /// The object used to serialize the remarks to a specific format.
  48.   std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer;
  49.   /// The filename that the remark diagnostics are emitted to.
  50.   const std::optional<std::string> Filename;
  51.  
  52. public:
  53.   RemarkStreamer(std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,
  54.                  std::optional<StringRef> Filename = std::nullopt);
  55.  
  56.   /// Return the filename that the remark diagnostics are emitted to.
  57.   std::optional<StringRef> getFilename() const {
  58.     return Filename ? std::optional<StringRef>(*Filename) : std::nullopt;
  59.   }
  60.   /// Return stream that the remark diagnostics are emitted to.
  61.   raw_ostream &getStream() { return RemarkSerializer->OS; }
  62.   /// Return the serializer used for this stream.
  63.   remarks::RemarkSerializer &getSerializer() { return *RemarkSerializer; }
  64.   /// Set a pass filter based on a regex \p Filter.
  65.   /// Returns an error if the regex is invalid.
  66.   Error setFilter(StringRef Filter);
  67.   /// Check wether the string matches the filter.
  68.   bool matchesFilter(StringRef Str);
  69.   /// Check if the remarks also need to have associated metadata in a section.
  70.   bool needsSection() const;
  71. };
  72. } // end namespace remarks
  73. } // end namespace llvm
  74.  
  75. #endif // LLVM_REMARKS_REMARKSTREAMER_H
  76.