Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit 381c09a

Browse files
committed
[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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375008 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent b41a900 commit 381c09a

7 files changed

Lines changed: 58 additions & 22 deletions

File tree

include/llvm/Remarks/RemarkParser.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class EndOfFileError : public ErrorInfo<EndOfFileError> {
3939
struct RemarkParser {
4040
/// The format of the parser.
4141
Format ParserFormat;
42+
/// Path to prepend when opening an external remark file.
43+
std::string ExternalFilePrependPath;
4244

4345
RemarkParser(Format ParserFormat) : ParserFormat(ParserFormat) {}
4446

@@ -82,7 +84,8 @@ createRemarkParser(Format ParserFormat, StringRef Buf,
8284

8385
Expected<std::unique_ptr<RemarkParser>>
8486
createRemarkParserFromMeta(Format ParserFormat, StringRef Buf,
85-
Optional<ParsedStringTable> StrTab = None);
87+
Optional<ParsedStringTable> StrTab = None,
88+
Optional<StringRef> ExternalFilePrependPath = None);
8689

8790
} // end namespace remarks
8891
} // end namespace llvm

lib/Remarks/BitstreamRemarkParser.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "BitstreamRemarkParser.h"
1616
#include "llvm/Remarks/BitstreamRemarkContainer.h"
1717
#include "llvm/Support/MemoryBuffer.h"
18+
#include "llvm/Support/Path.h"
1819

1920
using namespace llvm;
2021
using namespace llvm::remarks;
@@ -304,8 +305,9 @@ static Error advanceToMetaBlock(BitstreamParserHelper &Helper) {
304305
}
305306

306307
Expected<std::unique_ptr<BitstreamRemarkParser>>
307-
remarks::createBitstreamParserFromMeta(StringRef Buf,
308-
Optional<ParsedStringTable> StrTab) {
308+
remarks::createBitstreamParserFromMeta(
309+
StringRef Buf, Optional<ParsedStringTable> StrTab,
310+
Optional<StringRef> ExternalFilePrependPath) {
309311
BitstreamParserHelper Helper(Buf);
310312
Expected<std::array<char, 4>> Magic = Helper.parseMagic();
311313
if (!Magic)
@@ -314,9 +316,14 @@ remarks::createBitstreamParserFromMeta(StringRef Buf,
314316
if (Error E = validateMagicNumber(StringRef(Magic->data(), Magic->size())))
315317
return std::move(E);
316318

317-
return StrTab
318-
? std::make_unique<BitstreamRemarkParser>(Buf, std::move(*StrTab))
319+
auto Parser =
320+
StrTab ? std::make_unique<BitstreamRemarkParser>(Buf, std::move(*StrTab))
319321
: std::make_unique<BitstreamRemarkParser>(Buf);
322+
323+
if (ExternalFilePrependPath)
324+
Parser->ExternalFilePrependPath = *ExternalFilePrependPath;
325+
326+
return std::move(Parser);
320327
}
321328

322329
Expected<std::unique_ptr<Remark>> BitstreamRemarkParser::next() {
@@ -409,13 +416,16 @@ Error BitstreamRemarkParser::processExternalFilePath(
409416
std::make_error_code(std::errc::illegal_byte_sequence),
410417
"Error while parsing BLOCK_META: missing external file path.");
411418

419+
SmallString<80> FullPath(ExternalFilePrependPath);
420+
sys::path::append(FullPath, *ExternalFilePath);
421+
412422
// External file: open the external file, parse it, check if its metadata
413423
// matches the one from the separate metadata, then replace the current parser
414424
// with the one parsing the remarks.
415425
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
416-
MemoryBuffer::getFile(*ExternalFilePath);
426+
MemoryBuffer::getFile(FullPath);
417427
if (std::error_code EC = BufferOrErr.getError())
418-
return errorCodeToError(EC);
428+
return createFileError(FullPath, EC);
419429
TmpRemarkBuffer = std::move(*BufferOrErr);
420430

421431
// Create a separate parser used for parsing the separate file.

lib/Remarks/BitstreamRemarkParser.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ struct BitstreamRemarkParser : public RemarkParser {
7373
Error processExternalFilePath(Optional<StringRef> ExternalFilePath);
7474
};
7575

76-
Expected<std::unique_ptr<BitstreamRemarkParser>>
77-
createBitstreamParserFromMeta(StringRef Buf,
78-
Optional<ParsedStringTable> StrTab = None);
76+
Expected<std::unique_ptr<BitstreamRemarkParser>> createBitstreamParserFromMeta(
77+
StringRef Buf, Optional<ParsedStringTable> StrTab = None,
78+
Optional<StringRef> ExternalFilePrependPath = None);
7979

8080
} // end namespace remarks
8181
} // end namespace llvm

lib/Remarks/RemarkParser.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,19 @@ llvm::remarks::createRemarkParser(Format ParserFormat, StringRef Buf,
8686
}
8787

8888
Expected<std::unique_ptr<RemarkParser>>
89-
llvm::remarks::createRemarkParserFromMeta(Format ParserFormat, StringRef Buf,
90-
Optional<ParsedStringTable> StrTab) {
89+
llvm::remarks::createRemarkParserFromMeta(
90+
Format ParserFormat, StringRef Buf, Optional<ParsedStringTable> StrTab,
91+
Optional<StringRef> ExternalFilePrependPath) {
9192
switch (ParserFormat) {
9293
// Depending on the metadata, the format can be either yaml or yaml-strtab,
9394
// regardless of the input argument.
9495
case Format::YAML:
9596
case Format::YAMLStrTab:
96-
return createYAMLParserFromMeta(Buf, std::move(StrTab));
97+
return createYAMLParserFromMeta(Buf, std::move(StrTab),
98+
std::move(ExternalFilePrependPath));
9799
case Format::Bitstream:
98-
return createBitstreamParserFromMeta(Buf, std::move(StrTab));
100+
return createBitstreamParserFromMeta(Buf, std::move(StrTab),
101+
std::move(ExternalFilePrependPath));
99102
case Format::Unknown:
100103
return createStringError(std::make_error_code(std::errc::invalid_argument),
101104
"Unknown remark parser format.");

lib/Remarks/YAMLRemarkParser.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "llvm/ADT/StringSwitch.h"
1616
#include "llvm/Remarks/RemarkParser.h"
1717
#include "llvm/Support/Endian.h"
18+
#include "llvm/Support/Path.h"
1819

1920
using namespace llvm;
2021
using namespace llvm::remarks;
@@ -109,7 +110,8 @@ static Expected<ParsedStringTable> parseStrTab(StringRef &Buf,
109110

110111
Expected<std::unique_ptr<YAMLRemarkParser>>
111112
remarks::createYAMLParserFromMeta(StringRef Buf,
112-
Optional<ParsedStringTable> StrTab) {
113+
Optional<ParsedStringTable> StrTab,
114+
Optional<StringRef> ExternalFilePrependPath) {
113115
// We now have a magic number. The metadata has to be correct.
114116
Expected<bool> isMeta = parseMagic(Buf);
115117
if (!isMeta)
@@ -138,11 +140,17 @@ remarks::createYAMLParserFromMeta(StringRef Buf,
138140
// If it starts with "---", there is no external file.
139141
if (!Buf.startswith("---")) {
140142
// At this point, we expect Buf to contain the external file path.
143+
StringRef ExternalFilePath = Buf;
144+
SmallString<80> FullPath;
145+
if (ExternalFilePrependPath)
146+
FullPath = *ExternalFilePrependPath;
147+
sys::path::append(FullPath, ExternalFilePath);
148+
141149
// Try to open the file and start parsing from there.
142150
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
143-
MemoryBuffer::getFile(Buf);
151+
MemoryBuffer::getFile(FullPath);
144152
if (std::error_code EC = BufferOrErr.getError())
145-
return errorCodeToError(EC);
153+
return createFileError(FullPath, EC);
146154

147155
// Keep the buffer alive.
148156
SeparateBuf = std::move(*BufferOrErr);

lib/Remarks/YAMLRemarkParser.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ struct YAMLStrTabRemarkParser : public YAMLRemarkParser {
111111

112112
Expected<std::unique_ptr<YAMLRemarkParser>>
113113
createYAMLParserFromMeta(StringRef Buf,
114-
Optional<ParsedStringTable> StrTab = None);
114+
Optional<ParsedStringTable> StrTab = None,
115+
Optional<StringRef> ExternalFilePrependPath = None);
115116

116117
} // end namespace remarks
117118
} // end namespace llvm

unittests/Remarks/YAMLRemarksParsingTest.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,15 @@ bool parseExpectError(const char (&Buf)[N], const char *Error) {
6363
return StringRef(Stream.str()).contains(Error);
6464
}
6565

66-
void parseExpectErrorMeta(StringRef Buf, const char *Error) {
66+
void parseExpectErrorMeta(StringRef Buf, const char *Error,
67+
Optional<StringRef> ExternalFilePrependPath = None) {
6768
std::string ErrorStr;
6869
raw_string_ostream Stream(ErrorStr);
6970

7071
Expected<std::unique_ptr<remarks::RemarkParser>> MaybeParser =
71-
remarks::createRemarkParserFromMeta(remarks::Format::YAML, Buf);
72+
remarks::createRemarkParserFromMeta(remarks::Format::YAML, Buf,
73+
/*StrTab=*/None,
74+
std::move(ExternalFilePrependPath));
7275
handleAllErrors(MaybeParser.takeError(),
7376
[&](const ErrorInfoBase &EIB) { EIB.log(Stream); });
7477

@@ -705,6 +708,14 @@ TEST(YAMLRemarks, ParsingBadMeta) {
705708
"\0\0\0\0\0\0\0\0"
706709
"\0\0\0\0\0\0\0\0"
707710
"/path/",
708-
28),
709-
"No such file or directory");
711+
30),
712+
"'/path/': No such file or directory");
713+
714+
parseExpectErrorMeta(StringRef("REMARKS\0"
715+
"\0\0\0\0\0\0\0\0"
716+
"\0\0\0\0\0\0\0\0"
717+
"/path/",
718+
30),
719+
"'/baddir/path/': No such file or directory",
720+
StringRef("/baddir/"));
710721
}

0 commit comments

Comments
 (0)