Skip to content

Commit

Permalink
[ELF] With --vs-diagnostics, print a separate message for each locati…
Browse files Browse the repository at this point in the history
…on of a duplicate symbol.

We extract and print the source location in the message header so that
Visual Studio is able to parse it and jump there. As duplicate symbols
are defined in several locations, it is more convenient to have separate
error messages, which allows a user to easily access all the locations.

Differential Revision: https://reviews.llvm.org/D65213

llvm-svn: 367536
  • Loading branch information
igorkudrin committed Aug 1, 2019
1 parent 8a40ced commit 07ceadd
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
27 changes: 24 additions & 3 deletions lld/Common/ErrorHandler.cpp
Expand Up @@ -153,13 +153,34 @@ void ErrorHandler::warn(const Twine &msg) {
*errorOS << msg << "\n";
}

void ErrorHandler::printErrorMsg(const Twine &msg) {
newline(errorOS, msg);
printHeader("error: ", raw_ostream::RED, msg);
*errorOS << msg << "\n";
}

void ErrorHandler::printError(const Twine &msg) {
if (vsDiagnostics) {
static std::regex reDuplicateSymbol(
R"(^(duplicate symbol: .*))"
R"((\n>>> defined at \S+:\d+\n>>>.*))"
R"((\n>>> defined at \S+:\d+\n>>>.*))");
std::string msgStr = msg.str();
std::smatch match;
if (std::regex_match(msgStr, match, reDuplicateSymbol)) {
printErrorMsg(match.str(1) + match.str(2));
printErrorMsg(match.str(1) + match.str(3));
return;
}
}
printErrorMsg(msg);
}

void ErrorHandler::error(const Twine &msg) {
std::lock_guard<std::mutex> lock(mu);

if (errorLimit == 0 || errorCount < errorLimit) {
newline(errorOS, msg);
printHeader("error: ", raw_ostream::RED, msg);
*errorOS << msg << "\n";
printError(msg);
} else if (errorCount == errorLimit) {
newline(errorOS, msg);
printHeader("error: ", raw_ostream::RED, msg);
Expand Down
2 changes: 2 additions & 0 deletions lld/include/lld/Common/ErrorHandler.h
Expand Up @@ -103,6 +103,8 @@ class ErrorHandler {

private:
void printHeader(StringRef s, raw_ostream::Colors c, const Twine &msg);
void printErrorMsg(const Twine &msg);
void printError(const Twine &msg);
};

/// Returns the default error handler.
Expand Down
5 changes: 3 additions & 2 deletions lld/test/ELF/vs-diagnostics-duplicate.s
Expand Up @@ -8,8 +8,9 @@
// CHECK: duplicate.s(15): error: duplicate symbol: bar
// CHECK-NEXT: >>> defined at duplicate.s:15
// CHECK-NEXT: >>>{{.*}}1.o:(.text+0x{{.+}})
// CHECK: >>> defined at duplicate2.s:20
// CHECK: >>>{{.*}}2.o:(.text+0x{{.+}})
// CHECK: duplicate2.s(20): error: duplicate symbol: bar
// CHECK-NEXT: >>> defined at duplicate2.s:20
// CHECK-NEXT: >>>{{.*}}2.o:(.text+0x{{.+}})

// Case 2. The source locations are unknown for both symbols.
// CHECK: {{.*}}ld.lld{{.*}}: error: duplicate symbol: foo
Expand Down

0 comments on commit 07ceadd

Please sign in to comment.