aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Remarks
diff options
context:
space:
mode:
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>2019-10-16 15:40:59 +0000
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>2019-10-16 15:40:59 +0000
commit684605ec0ea2e9b162e353e13708b01e2decf3f0 (patch)
treeb2a94f560cf7a3a88ec2e60362fa587c114ab504 /llvm/lib/Remarks
parentec51851026a55e1cfc7f006f0e75f0a19acb32d3 (diff)
downloadllvm-684605ec0ea2e9b162e353e13708b01e2decf3f0.zip
llvm-684605ec0ea2e9b162e353e13708b01e2decf3f0.tar.gz
llvm-684605ec0ea2e9b162e353e13708b01e2decf3f0.tar.bz2
[Remarks] Add support for prepending a path to external files
This helps with testing and debugging for paths that are assumed absolute. It also uses a FileError to provide the file path it's trying to open. llvm-svn: 375008
Diffstat (limited to 'llvm/lib/Remarks')
-rw-r--r--llvm/lib/Remarks/BitstreamRemarkParser.cpp22
-rw-r--r--llvm/lib/Remarks/BitstreamRemarkParser.h6
-rw-r--r--llvm/lib/Remarks/RemarkParser.cpp11
-rw-r--r--llvm/lib/Remarks/YAMLRemarkParser.cpp14
-rw-r--r--llvm/lib/Remarks/YAMLRemarkParser.h3
5 files changed, 39 insertions, 17 deletions
diff --git a/llvm/lib/Remarks/BitstreamRemarkParser.cpp b/llvm/lib/Remarks/BitstreamRemarkParser.cpp
index f57d01f..99a82e1 100644
--- a/llvm/lib/Remarks/BitstreamRemarkParser.cpp
+++ b/llvm/lib/Remarks/BitstreamRemarkParser.cpp
@@ -15,6 +15,7 @@
#include "BitstreamRemarkParser.h"
#include "llvm/Remarks/BitstreamRemarkContainer.h"
#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
using namespace llvm;
using namespace llvm::remarks;
@@ -304,8 +305,9 @@ static Error advanceToMetaBlock(BitstreamParserHelper &Helper) {
}
Expected<std::unique_ptr<BitstreamRemarkParser>>
-remarks::createBitstreamParserFromMeta(StringRef Buf,
- Optional<ParsedStringTable> StrTab) {
+remarks::createBitstreamParserFromMeta(
+ StringRef Buf, Optional<ParsedStringTable> StrTab,
+ Optional<StringRef> ExternalFilePrependPath) {
BitstreamParserHelper Helper(Buf);
Expected<std::array<char, 4>> Magic = Helper.parseMagic();
if (!Magic)
@@ -314,9 +316,14 @@ remarks::createBitstreamParserFromMeta(StringRef Buf,
if (Error E = validateMagicNumber(StringRef(Magic->data(), Magic->size())))
return std::move(E);
- return StrTab
- ? std::make_unique<BitstreamRemarkParser>(Buf, std::move(*StrTab))
+ auto Parser =
+ StrTab ? std::make_unique<BitstreamRemarkParser>(Buf, std::move(*StrTab))
: std::make_unique<BitstreamRemarkParser>(Buf);
+
+ if (ExternalFilePrependPath)
+ Parser->ExternalFilePrependPath = *ExternalFilePrependPath;
+
+ return std::move(Parser);
}
Expected<std::unique_ptr<Remark>> BitstreamRemarkParser::next() {
@@ -409,13 +416,16 @@ Error BitstreamRemarkParser::processExternalFilePath(
std::make_error_code(std::errc::illegal_byte_sequence),
"Error while parsing BLOCK_META: missing external file path.");
+ SmallString<80> FullPath(ExternalFilePrependPath);
+ sys::path::append(FullPath, *ExternalFilePath);
+
// External file: open the external file, parse it, check if its metadata
// matches the one from the separate metadata, then replace the current parser
// with the one parsing the remarks.
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
- MemoryBuffer::getFile(*ExternalFilePath);
+ MemoryBuffer::getFile(FullPath);
if (std::error_code EC = BufferOrErr.getError())
- return errorCodeToError(EC);
+ return createFileError(FullPath, EC);
TmpRemarkBuffer = std::move(*BufferOrErr);
// Create a separate parser used for parsing the separate file.
diff --git a/llvm/lib/Remarks/BitstreamRemarkParser.h b/llvm/lib/Remarks/BitstreamRemarkParser.h
index f1f28b4..7c9cc2f 100644
--- a/llvm/lib/Remarks/BitstreamRemarkParser.h
+++ b/llvm/lib/Remarks/BitstreamRemarkParser.h
@@ -73,9 +73,9 @@ private:
Error processExternalFilePath(Optional<StringRef> ExternalFilePath);
};
-Expected<std::unique_ptr<BitstreamRemarkParser>>
-createBitstreamParserFromMeta(StringRef Buf,
- Optional<ParsedStringTable> StrTab = None);
+Expected<std::unique_ptr<BitstreamRemarkParser>> createBitstreamParserFromMeta(
+ StringRef Buf, Optional<ParsedStringTable> StrTab = None,
+ Optional<StringRef> ExternalFilePrependPath = None);
} // end namespace remarks
} // end namespace llvm
diff --git a/llvm/lib/Remarks/RemarkParser.cpp b/llvm/lib/Remarks/RemarkParser.cpp
index 600f415..c5c3d0b 100644
--- a/llvm/lib/Remarks/RemarkParser.cpp
+++ b/llvm/lib/Remarks/RemarkParser.cpp
@@ -86,16 +86,19 @@ llvm::remarks::createRemarkParser(Format ParserFormat, StringRef Buf,
}
Expected<std::unique_ptr<RemarkParser>>
-llvm::remarks::createRemarkParserFromMeta(Format ParserFormat, StringRef Buf,
- Optional<ParsedStringTable> StrTab) {
+llvm::remarks::createRemarkParserFromMeta(
+ Format ParserFormat, StringRef Buf, Optional<ParsedStringTable> StrTab,
+ Optional<StringRef> ExternalFilePrependPath) {
switch (ParserFormat) {
// Depending on the metadata, the format can be either yaml or yaml-strtab,
// regardless of the input argument.
case Format::YAML:
case Format::YAMLStrTab:
- return createYAMLParserFromMeta(Buf, std::move(StrTab));
+ return createYAMLParserFromMeta(Buf, std::move(StrTab),
+ std::move(ExternalFilePrependPath));
case Format::Bitstream:
- return createBitstreamParserFromMeta(Buf, std::move(StrTab));
+ return createBitstreamParserFromMeta(Buf, std::move(StrTab),
+ std::move(ExternalFilePrependPath));
case Format::Unknown:
return createStringError(std::make_error_code(std::errc::invalid_argument),
"Unknown remark parser format.");
diff --git a/llvm/lib/Remarks/YAMLRemarkParser.cpp b/llvm/lib/Remarks/YAMLRemarkParser.cpp
index 69e8a0d..dd834d8 100644
--- a/llvm/lib/Remarks/YAMLRemarkParser.cpp
+++ b/llvm/lib/Remarks/YAMLRemarkParser.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Remarks/RemarkParser.h"
#include "llvm/Support/Endian.h"
+#include "llvm/Support/Path.h"
using namespace llvm;
using namespace llvm::remarks;
@@ -109,7 +110,8 @@ static Expected<ParsedStringTable> parseStrTab(StringRef &Buf,
Expected<std::unique_ptr<YAMLRemarkParser>>
remarks::createYAMLParserFromMeta(StringRef Buf,
- Optional<ParsedStringTable> StrTab) {
+ Optional<ParsedStringTable> StrTab,
+ Optional<StringRef> ExternalFilePrependPath) {
// We now have a magic number. The metadata has to be correct.
Expected<bool> isMeta = parseMagic(Buf);
if (!isMeta)
@@ -138,11 +140,17 @@ remarks::createYAMLParserFromMeta(StringRef Buf,
// If it starts with "---", there is no external file.
if (!Buf.startswith("---")) {
// At this point, we expect Buf to contain the external file path.
+ StringRef ExternalFilePath = Buf;
+ SmallString<80> FullPath;
+ if (ExternalFilePrependPath)
+ FullPath = *ExternalFilePrependPath;
+ sys::path::append(FullPath, ExternalFilePath);
+
// Try to open the file and start parsing from there.
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
- MemoryBuffer::getFile(Buf);
+ MemoryBuffer::getFile(FullPath);
if (std::error_code EC = BufferOrErr.getError())
- return errorCodeToError(EC);
+ return createFileError(FullPath, EC);
// Keep the buffer alive.
SeparateBuf = std::move(*BufferOrErr);
diff --git a/llvm/lib/Remarks/YAMLRemarkParser.h b/llvm/lib/Remarks/YAMLRemarkParser.h
index ff03abb..0370743 100644
--- a/llvm/lib/Remarks/YAMLRemarkParser.h
+++ b/llvm/lib/Remarks/YAMLRemarkParser.h
@@ -111,7 +111,8 @@ protected:
Expected<std::unique_ptr<YAMLRemarkParser>>
createYAMLParserFromMeta(StringRef Buf,
- Optional<ParsedStringTable> StrTab = None);
+ Optional<ParsedStringTable> StrTab = None,
+ Optional<StringRef> ExternalFilePrependPath = None);
} // end namespace remarks
} // end namespace llvm