@@ -109,10 +109,37 @@ void RemarkStreamer::emit(const DiagnosticInfoOptimizationBase &Diag) {
109
109
110
110
char RemarkSetupFileError::ID = 0 ;
111
111
char RemarkSetupPatternError::ID = 0 ;
112
+ char RemarkSetupFormatError::ID = 0 ;
113
+
114
+ static std::unique_ptr<remarks::Serializer>
115
+ formatToSerializer (RemarksSerializerFormat RemarksFormat, raw_ostream &OS) {
116
+ switch (RemarksFormat) {
117
+ default :
118
+ llvm_unreachable (" Unknown remark serializer format." );
119
+ return nullptr ;
120
+ case RemarksSerializerFormat::YAML:
121
+ return llvm::make_unique<remarks::YAMLSerializer>(OS);
122
+ };
123
+ }
124
+
125
+ Expected<RemarksSerializerFormat>
126
+ llvm::parseSerializerFormat (StringRef StrFormat) {
127
+ auto Format = StringSwitch<RemarksSerializerFormat>(StrFormat)
128
+ .Cases (" " , " yaml" , RemarksSerializerFormat::YAML)
129
+ .Default (RemarksSerializerFormat::Unknown);
130
+
131
+ if (Format == RemarksSerializerFormat::Unknown)
132
+ return createStringError (std::make_error_code (std::errc::invalid_argument),
133
+ " Unknown remark serializer format: '%s'" ,
134
+ StrFormat.data ());
135
+
136
+ return Format;
137
+ }
112
138
113
139
Expected<std::unique_ptr<ToolOutputFile>>
114
140
llvm::setupOptimizationRemarks (LLVMContext &Context, StringRef RemarksFilename,
115
- StringRef RemarksPasses, bool RemarksWithHotness,
141
+ StringRef RemarksPasses, StringRef RemarksFormat,
142
+ bool RemarksWithHotness,
116
143
unsigned RemarksHotnessThreshold) {
117
144
if (RemarksWithHotness)
118
145
Context.setDiagnosticsHotnessRequested (true );
@@ -131,9 +158,13 @@ llvm::setupOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename,
131
158
if (EC)
132
159
return make_error<RemarkSetupFileError>(errorCodeToError (EC));
133
160
161
+ Expected<RemarksSerializerFormat> Format =
162
+ parseSerializerFormat (RemarksFormat);
163
+ if (Error E = Format.takeError ())
164
+ return make_error<RemarkSetupFormatError>(std::move (E));
165
+
134
166
Context.setRemarkStreamer (llvm::make_unique<RemarkStreamer>(
135
- RemarksFilename,
136
- llvm::make_unique<remarks::YAMLSerializer>(RemarksFile->os ())));
167
+ RemarksFilename, formatToSerializer (*Format, RemarksFile->os ())));
137
168
138
169
if (!RemarksPasses.empty ())
139
170
if (Error E = Context.getRemarkStreamer ()->setFilter (RemarksPasses))
0 commit comments