diff options
author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-10-16 15:40:59 +0000 |
---|---|---|
committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-10-16 15:40:59 +0000 |
commit | 684605ec0ea2e9b162e353e13708b01e2decf3f0 (patch) | |
tree | b2a94f560cf7a3a88ec2e60362fa587c114ab504 /llvm/lib/Remarks | |
parent | ec51851026a55e1cfc7f006f0e75f0a19acb32d3 (diff) | |
download | llvm-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.cpp | 22 | ||||
-rw-r--r-- | llvm/lib/Remarks/BitstreamRemarkParser.h | 6 | ||||
-rw-r--r-- | llvm/lib/Remarks/RemarkParser.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/Remarks/YAMLRemarkParser.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/Remarks/YAMLRemarkParser.h | 3 |
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 |