<div dir="ltr"><div dir="ltr">Yes, this is what I meant modulo a few details.</div><div><br></div><div>This would print out something like</div><div><br></div><div>duplicate2.s(20): error: duplicate symbol: bar</div><div>>>> defined at duplicate.s:20</div><div>>>> duplicate2.o(.text+0x4000)</div><div><br></div><div>, but isn't the second line redundant?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jul 26, 2019 at 10:29 PM Igor Kudrin via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">ikudrin updated this revision to Diff 211929.<br>
ikudrin added a comment.<br>
<br>
- Updated to use a regex to parse the original message and reconstruct two separate messages if both source locations are known.<br>
<br>
@ruiu, is that what you meant?<br>
<br>
<br>
CHANGES SINCE LAST ACTION<br>
  <a href="https://reviews.llvm.org/D65213/new/" rel="noreferrer" target="_blank">https://reviews.llvm.org/D65213/new/</a><br>
<br>
<a href="https://reviews.llvm.org/D65213" rel="noreferrer" target="_blank">https://reviews.llvm.org/D65213</a><br>
<br>
Files:<br>
  Common/ErrorHandler.cpp<br>
  include/lld/Common/ErrorHandler.h<br>
  test/ELF/vs-diagnostics-duplicate.s<br>
<br>
<br>
Index: test/ELF/vs-diagnostics-duplicate.s<br>
===================================================================<br>
--- test/ELF/vs-diagnostics-duplicate.s<br>
+++ test/ELF/vs-diagnostics-duplicate.s<br>
@@ -8,8 +8,9 @@<br>
 // CHECK:      duplicate.s(15): error: duplicate symbol: bar<br>
 // CHECK-NEXT: >>> defined at duplicate.s:15<br>
 // CHECK-NEXT: >>>{{.*}}1.o:(.text+0x{{.+}})<br>
-// CHECK: >>> defined at duplicate2.s:20<br>
-// CHECK: >>>{{.*}}2.o:(.text+0x{{.+}})<br>
+// CHECK:      duplicate2.s(20): error: duplicate symbol: bar<br>
+// CHECK-NEXT: >>> defined at duplicate2.s:20<br>
+// CHECK-NEXT: >>>{{.*}}2.o:(.text+0x{{.+}})<br>
<br>
 // Case 2. The source locations are unknown for both symbols.<br>
 // CHECK:      {{.*}}ld.lld{{.*}}: error: duplicate symbol: foo<br>
Index: include/lld/Common/ErrorHandler.h<br>
===================================================================<br>
--- include/lld/Common/ErrorHandler.h<br>
+++ include/lld/Common/ErrorHandler.h<br>
@@ -103,6 +103,7 @@<br>
<br>
 private:<br>
   void printHeader(StringRef s, raw_ostream::Colors c, const Twine &msg);<br>
+  void printError(const Twine &msg);<br>
 };<br>
<br>
 /// Returns the default error handler.<br>
Index: Common/ErrorHandler.cpp<br>
===================================================================<br>
--- Common/ErrorHandler.cpp<br>
+++ Common/ErrorHandler.cpp<br>
@@ -145,7 +145,7 @@<br>
<br>
 void ErrorHandler::warn(const Twine &msg) {<br>
   if (fatalWarnings) {<br>
-    error(msg);<br>
+    printError(msg);<br>
     return;<br>
   }<br>
<br>
@@ -155,7 +155,7 @@<br>
   *errorOS << msg << "\n";<br>
 }<br>
<br>
-void ErrorHandler::error(const Twine &msg) {<br>
+void ErrorHandler::printError(const Twine &msg) {<br>
   std::lock_guard<std::mutex> lock(mu);<br>
<br>
   if (errorLimit == 0 || errorCount < errorLimit) {<br>
@@ -173,7 +173,24 @@<br>
   ++errorCount;<br>
 }<br>
<br>
+void ErrorHandler::error(const Twine &msg) {<br>
+  if (vsDiagnostics) {<br>
+    static std::regex reDuplicateSymbol(<br>
+        R"(^(duplicate symbol: .*))"<br>
+        R"((\n>>> defined at \S+:\d+\n>>>.*))"<br>
+        R"((\n>>> defined at \S+:\d+\n>>>.*))");<br>
+    std::string msgStr = msg.str();<br>
+    std::smatch match;<br>
+    if (std::regex_match(msgStr, match, reDuplicateSymbol)) {<br>
+      printError(match.str(1) + match.str(2));<br>
+      printError(match.str(1) + match.str(3));<br>
+      return;<br>
+    }<br>
+  }<br>
+  printError(msg);<br>
+}<br>
+<br>
 void ErrorHandler::fatal(const Twine &msg) {<br>
-  error(msg);<br>
+  printError(msg);<br>
   exitLld(1);<br>
 }<br>
<br>
<br>
</blockquote></div></div>