diff options
author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-07-30 16:01:40 +0000 |
---|---|---|
committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-07-30 16:01:40 +0000 |
commit | 5ed3d146f87e3103ea5bbdb27bca8d6b1b1f714a (patch) | |
tree | 2a160ee7506a668a00cba88f5058eeac01bc3d32 /llvm/lib | |
parent | de0b6339991dcbaeab4a97a96fbf1570118b06ae (diff) | |
download | bcm5719-llvm-5ed3d146f87e3103ea5bbdb27bca8d6b1b1f714a.tar.gz bcm5719-llvm-5ed3d146f87e3103ea5bbdb27bca8d6b1b1f714a.zip |
[Remarks] Add two serialization modes for remarks: separate and standalone
The default mode is separate, where the metadata is serialized
separately from the remarks.
Another mode is the standalone mode, where the metadata is serialized
before the remarks, on the same stream.
llvm-svn: 367328
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/IR/RemarkStreamer.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Remarks/RemarkSerializer.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/Remarks/YAMLRemarkSerializer.cpp | 13 |
3 files changed, 20 insertions, 9 deletions
diff --git a/llvm/lib/IR/RemarkStreamer.cpp b/llvm/lib/IR/RemarkStreamer.cpp index 450453fc680..4bbbfe839c9 100644 --- a/llvm/lib/IR/RemarkStreamer.cpp +++ b/llvm/lib/IR/RemarkStreamer.cpp @@ -136,7 +136,7 @@ llvm::setupOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename, return make_error<RemarkSetupFormatError>(std::move(E)); Expected<std::unique_ptr<remarks::RemarkSerializer>> RemarkSerializer = - remarks::createRemarkSerializer(*Format, RemarksFile->os()); + remarks::createRemarkSerializer(*Format, remarks::SerializerMode::Separate, RemarksFile->os()); if (Error E = RemarkSerializer.takeError()) return make_error<RemarkSetupFormatError>(std::move(E)); diff --git a/llvm/lib/Remarks/RemarkSerializer.cpp b/llvm/lib/Remarks/RemarkSerializer.cpp index aa68b497ef2..73cec4fbf9b 100644 --- a/llvm/lib/Remarks/RemarkSerializer.cpp +++ b/llvm/lib/Remarks/RemarkSerializer.cpp @@ -17,22 +17,23 @@ using namespace llvm; using namespace llvm::remarks; Expected<std::unique_ptr<RemarkSerializer>> -remarks::createRemarkSerializer(Format RemarksFormat, raw_ostream &OS) { +remarks::createRemarkSerializer(Format RemarksFormat, SerializerMode Mode, + raw_ostream &OS) { switch (RemarksFormat) { case Format::Unknown: return createStringError(std::errc::invalid_argument, "Unknown remark serializer format."); case Format::YAML: - return llvm::make_unique<YAMLRemarkSerializer>(OS); + return llvm::make_unique<YAMLRemarkSerializer>(OS, Mode); case Format::YAMLStrTab: - return llvm::make_unique<YAMLStrTabRemarkSerializer>(OS); + return llvm::make_unique<YAMLStrTabRemarkSerializer>(OS, Mode); } llvm_unreachable("Unknown remarks::Format enum"); } Expected<std::unique_ptr<RemarkSerializer>> -remarks::createRemarkSerializer(Format RemarksFormat, raw_ostream &OS, - remarks::StringTable StrTab) { +remarks::createRemarkSerializer(Format RemarksFormat, SerializerMode Mode, + raw_ostream &OS, remarks::StringTable StrTab) { switch (RemarksFormat) { case Format::Unknown: return createStringError(std::errc::invalid_argument, @@ -42,7 +43,8 @@ remarks::createRemarkSerializer(Format RemarksFormat, raw_ostream &OS, "Unable to use a string table with the yaml " "format. Use 'yaml-strtab' instead."); case Format::YAMLStrTab: - return llvm::make_unique<YAMLStrTabRemarkSerializer>(OS, std::move(StrTab)); + return llvm::make_unique<YAMLStrTabRemarkSerializer>(OS, Mode, + std::move(StrTab)); } llvm_unreachable("Unknown remarks::Format enum"); } diff --git a/llvm/lib/Remarks/YAMLRemarkSerializer.cpp b/llvm/lib/Remarks/YAMLRemarkSerializer.cpp index 725ac15d7ea..f8ed7407259 100644 --- a/llvm/lib/Remarks/YAMLRemarkSerializer.cpp +++ b/llvm/lib/Remarks/YAMLRemarkSerializer.cpp @@ -149,10 +149,19 @@ template <> struct MappingTraits<Argument> { LLVM_YAML_IS_SEQUENCE_VECTOR(Argument) -YAMLRemarkSerializer::YAMLRemarkSerializer(raw_ostream &OS) - : RemarkSerializer(OS), YAMLOutput(OS, reinterpret_cast<void *>(this)) {} +YAMLRemarkSerializer::YAMLRemarkSerializer(raw_ostream &OS, SerializerMode Mode) + : RemarkSerializer(OS, Mode), YAMLOutput(OS, reinterpret_cast<void *>(this)) {} void YAMLRemarkSerializer::emit(const Remark &Remark) { + // In standalone mode, emit the metadata first and set DidEmitMeta to avoid + // emitting it again. + if (Mode == SerializerMode::Standalone) { + std::unique_ptr<MetaSerializer> MetaSerializer = + metaSerializer(OS, /*ExternalFilename=*/None); + MetaSerializer->emit(); + DidEmitMeta = true; + } + // Again, YAMLTraits expect a non-const object for inputting, but we're not // using that here. auto R = const_cast<remarks::Remark *>(&Remark); |