Index: Common/ErrorHandler.cpp =================================================================== --- Common/ErrorHandler.cpp +++ Common/ErrorHandler.cpp @@ -145,7 +145,7 @@ void ErrorHandler::warn(const Twine &msg) { if (fatalWarnings) { - error(msg); + printError(msg); return; } @@ -155,7 +155,7 @@ *errorOS << msg << "\n"; } -void ErrorHandler::error(const Twine &msg) { +void ErrorHandler::printError(const Twine &msg) { std::lock_guard lock(mu); if (errorLimit == 0 || errorCount < errorLimit) { @@ -173,7 +173,24 @@ ++errorCount; } +void ErrorHandler::error(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)) { + printError(match.str(1) + match.str(2)); + printError(match.str(1) + match.str(3)); + return; + } + } + printError(msg); +} + void ErrorHandler::fatal(const Twine &msg) { - error(msg); + printError(msg); exitLld(1); } Index: include/lld/Common/ErrorHandler.h =================================================================== --- include/lld/Common/ErrorHandler.h +++ include/lld/Common/ErrorHandler.h @@ -103,6 +103,7 @@ private: void printHeader(StringRef s, raw_ostream::Colors c, const Twine &msg); + void printError(const Twine &msg); }; /// Returns the default error handler. Index: test/ELF/vs-diagnostics-duplicate.s =================================================================== --- test/ELF/vs-diagnostics-duplicate.s +++ test/ELF/vs-diagnostics-duplicate.s @@ -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