1 //===-- RemarkSerializer.h - Remark serialization interface -----*- 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 provides an interface for serializing remarks to different formats. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_REMARKS_REMARKSERIALIZER_H 14 #define LLVM_REMARKS_REMARKSERIALIZER_H 15 16 #include "llvm/Remarks/RemarkFormat.h" 17 #include "llvm/Remarks/RemarkStringTable.h" 18 19 namespace llvm { 20 21 class raw_ostream; 22 23 namespace remarks { 24 25 struct Remark; 26 27 enum class SerializerMode { 28 Separate, // A mode where the metadata is serialized separately from the 29 // remarks. Typically, this is used when the remarks need to be 30 // streamed to a side file and the metadata is embedded into the 31 // final result of the compilation. 32 Standalone // A mode where everything can be retrieved in the same 33 // file/buffer. Typically, this is used for storing remarks for 34 // later use. 35 }; 36 37 struct MetaSerializer; 38 39 /// This is the base class for a remark serializer. 40 /// It includes support for using a string table while emitting. 41 struct RemarkSerializer { 42 /// The format of the serializer. 43 Format SerializerFormat; 44 /// The open raw_ostream that the remark diagnostics are emitted to. 45 raw_ostream &OS; 46 /// The serialization mode. 47 SerializerMode Mode; 48 /// The string table containing all the unique strings used in the output. 49 /// The table can be serialized to be consumed after the compilation. 50 Optional<StringTable> StrTab; 51 52 RemarkSerializer(Format SerializerFormat, raw_ostream &OS, 53 SerializerMode Mode) 54 : SerializerFormat(SerializerFormat), OS(OS), Mode(Mode) {} 55 56 /// This is just an interface. 57 virtual ~RemarkSerializer() = default; 58 /// Emit a remark to the stream. 59 virtual void emit(const Remark &Remark) = 0; 60 /// Return the corresponding metadata serializer. 61 virtual std::unique_ptr<MetaSerializer> 62 metaSerializer(raw_ostream &OS, 63 Optional<StringRef> ExternalFilename = None) = 0; 64 }; 65 66 /// This is the base class for a remark metadata serializer. 67 struct MetaSerializer { 68 /// The open raw_ostream that the metadata is emitted to. 69 raw_ostream &OS; 70 71 MetaSerializer(raw_ostream &OS) : OS(OS) {} 72 73 /// This is just an interface. 74 virtual ~MetaSerializer() = default; 75 virtual void emit() = 0; 76 }; 77 78 /// Create a remark serializer. 79 Expected<std::unique_ptr<RemarkSerializer>> 80 createRemarkSerializer(Format RemarksFormat, SerializerMode Mode, 81 raw_ostream &OS); 82 83 /// Create a remark serializer that uses a pre-filled string table. 84 Expected<std::unique_ptr<RemarkSerializer>> 85 createRemarkSerializer(Format RemarksFormat, SerializerMode Mode, 86 raw_ostream &OS, remarks::StringTable StrTab); 87 88 } // end namespace remarks 89 } // end namespace llvm 90 91 #endif // LLVM_REMARKS_REMARKSERIALIZER_H 92