summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-opt-report/OptReport.cpp
diff options
context:
space:
mode:
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>2019-07-16 15:25:05 +0000
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>2019-07-16 15:25:05 +0000
commit94bad22c2c66f2178e0364c5f502f0225c1ede8e (patch)
treeba3911e18bd3da2f96290dcc3048287946fa5f31 /llvm/tools/llvm-opt-report/OptReport.cpp
parentcc909812a39d26ba4bcc8aaa49096155802c4521 (diff)
downloadbcm5719-llvm-94bad22c2c66f2178e0364c5f502f0225c1ede8e.tar.gz
bcm5719-llvm-94bad22c2c66f2178e0364c5f502f0225c1ede8e.zip
[Remarks] Simplify and refactor the RemarkParser interface
Before, everything was based on some kind of type erased parser implementation which container a lot of boilerplate code when multiple formats were to be supported. This simplifies it by: * the remark now owns its arguments * *always* returning an error from the implementation side * working around the way the YAML parser reports errors: catch them through callbacks and re-insert them in a proper llvm::Error * add a CParser wrapper that is used when implementing the C API to avoid cluttering the C++ API with useless state * LLVMRemarkParserGetNext now returns an object that needs to be released to avoid leaking resources * add a new API to dispose of a remark entry: LLVMRemarkEntryDispose llvm-svn: 366217
Diffstat (limited to 'llvm/tools/llvm-opt-report/OptReport.cpp')
-rw-r--r--llvm/tools/llvm-opt-report/OptReport.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/llvm/tools/llvm-opt-report/OptReport.cpp b/llvm/tools/llvm-opt-report/OptReport.cpp
index 80d0b73664d..5662c9fbd7b 100644
--- a/llvm/tools/llvm-opt-report/OptReport.cpp
+++ b/llvm/tools/llvm-opt-report/OptReport.cpp
@@ -150,20 +150,32 @@ static bool readLocationInfo(LocationInfoTy &LocationInfo) {
return false;
}
- remarks::Parser Parser(remarks::Format::YAML, (*Buf)->getBuffer());
+ Expected<std::unique_ptr<remarks::Parser>> MaybeParser =
+ remarks::createRemarkParser(remarks::Format::YAML, (*Buf)->getBuffer());
+ if (!MaybeParser) {
+ handleAllErrors(MaybeParser.takeError(), [&](const ErrorInfoBase &PE) {
+ PE.log(WithColor::error());
+ });
+ return false;
+ }
+ remarks::Parser &Parser = **MaybeParser;
while (true) {
- Expected<const remarks::Remark *> RemarkOrErr = Parser.getNext();
- if (!RemarkOrErr) {
- handleAllErrors(RemarkOrErr.takeError(), [&](const ErrorInfoBase &PE) {
+ Expected<std::unique_ptr<remarks::Remark>> MaybeRemark = Parser.next();
+ if (!MaybeRemark) {
+ Error E = MaybeRemark.takeError();
+ if (E.isA<remarks::EndOfFileError>()) {
+ // EOF.
+ consumeError(std::move(E));
+ break;
+ }
+ handleAllErrors(MaybeRemark.takeError(), [&](const ErrorInfoBase &PE) {
PE.log(WithColor::error());
});
return false;
}
- if (!*RemarkOrErr) // End of file.
- break;
- const remarks::Remark &Remark = **RemarkOrErr;
+ const remarks::Remark &Remark = **MaybeRemark;
bool Transformed = Remark.RemarkType == remarks::Type::Passed;
OpenPOWER on IntegriCloud