<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 25, 2015 at 4:22 PM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ruiu<br>
Date: Thu Jun 25 18:22:00 2015<br>
New Revision: 240719<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D240719-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=7p29ZjK4AVLjWzusYxmi0oEkAhNXGZKYqOrfDiBj64I&s=hj6735erZ--MXQQyMou_pVSRNsEMwEnFJXXry8iYmsY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=240719&view=rev</a><br>
Log:<br>
COFF: Better error message for duplicate symbols.<br></blockquote><div><br>Any test coverage here?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Now the symbol table prints out not only symbol names but<br>
also file names for duplicate symbols.<br>
<br>
Modified:<br>
    lld/trunk/COFF/InputFiles.cpp<br>
    lld/trunk/COFF/SymbolTable.cpp<br>
    lld/trunk/COFF/Symbols.cpp<br>
    lld/trunk/COFF/Symbols.h<br>
<br>
Modified: lld/trunk/COFF/InputFiles.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_COFF_InputFiles.cpp-3Frev-3D240719-26r1-3D240718-26r2-3D240719-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=7p29ZjK4AVLjWzusYxmi0oEkAhNXGZKYqOrfDiBj64I&s=TSQyWnYxCitQW1gLdic3qD6UGHQpVPuhLZE2rYKSAo8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=240719&r1=240718&r2=240719&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/InputFiles.cpp (original)<br>
+++ lld/trunk/COFF/InputFiles.cpp Thu Jun 25 18:22:00 2015<br>
@@ -184,7 +184,7 @@ SymbolBody *ObjectFile::createSymbolBody<br>
   if (Sym.isCommon()) {<br>
     auto *C = new (Alloc) CommonChunk(Sym);<br>
     Chunks.push_back(C);<br>
-    return new (Alloc) DefinedCommon(COFFObj.get(), Sym, C);<br>
+    return new (Alloc) DefinedCommon(this, Sym, C);<br>
   }<br>
   if (Sym.isAbsolute()) {<br>
     COFFObj->getSymbolName(Sym, Name);<br>
@@ -215,7 +215,7 @@ SymbolBody *ObjectFile::createSymbolBody<br>
   }<br>
   Chunk *C = SparseChunks[Sym.getSectionNumber()];<br>
   if (auto *SC = cast_or_null<SectionChunk>(C)) {<br>
-    auto *B = new (Alloc) DefinedRegular(COFFObj.get(), Sym, SC);<br>
+    auto *B = new (Alloc) DefinedRegular(this, Sym, SC);<br>
     if (SC->isCOMDAT() && Sym.getValue() == 0 && !AuxP)<br>
       SC->setSymbol(B);<br>
     return B;<br>
<br>
Modified: lld/trunk/COFF/SymbolTable.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_COFF_SymbolTable.cpp-3Frev-3D240719-26r1-3D240718-26r2-3D240719-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=7p29ZjK4AVLjWzusYxmi0oEkAhNXGZKYqOrfDiBj64I&s=XyT9y7ekMB1k-CNPhL30GRJlim4Rogl_UOGh2hWSucY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=240719&r1=240718&r2=240719&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/SymbolTable.cpp (original)<br>
+++ lld/trunk/COFF/SymbolTable.cpp Thu Jun 25 18:22:00 2015<br>
@@ -120,7 +120,8 @@ std::error_code SymbolTable::resolve(Sym<br>
     ++Version;<br>
   }<br>
   if (comp == 0) {<br>
-    llvm::errs() << "duplicate symbol: " << Name << "\n";<br>
+    llvm::errs() << "duplicate symbol: " << Existing->getDebugName()<br>
+                 << " and " << New->getDebugName() << "\n";<br>
     return make_error_code(LLDError::DuplicateSymbols);<br>
   }<br>
<br>
<br>
Modified: lld/trunk/COFF/Symbols.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_COFF_Symbols.cpp-3Frev-3D240719-26r1-3D240718-26r2-3D240719-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=7p29ZjK4AVLjWzusYxmi0oEkAhNXGZKYqOrfDiBj64I&s=oh51hrV0YRsSNTo1H5H4aIzf5pOiDRzJWhexUfisgVk&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Symbols.cpp?rev=240719&r1=240718&r2=240719&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/Symbols.cpp (original)<br>
+++ lld/trunk/COFF/Symbols.cpp Thu Jun 25 18:22:00 2015<br>
@@ -111,16 +111,24 @@ StringRef DefinedRegular::getName() {<br>
   // StringRefs for them (which involves lots of strlen() on the string table)<br>
   // is a waste of time.<br>
   if (Name.empty())<br>
-    COFFFile->getSymbolName(Sym, Name);<br>
+    File->getCOFFObj()->getSymbolName(Sym, Name);<br>
   return Name;<br>
 }<br>
<br>
 StringRef DefinedCommon::getName() {<br>
   if (Name.empty())<br>
-    COFFFile->getSymbolName(Sym, Name);<br>
+    File->getCOFFObj()->getSymbolName(Sym, Name);<br>
   return Name;<br>
 }<br>
<br>
+std::string DefinedRegular::getDebugName() {<br>
+  return (getName() + " " + File->getShortName()).str();<br>
+}<br>
+<br>
+std::string DefinedCommon::getDebugName() {<br>
+  return (getName() + " " + File->getShortName()).str();<br>
+}<br>
+<br>
 ErrorOr<std::unique_ptr<InputFile>> Lazy::getMember() {<br>
   auto MBRefOrErr = File->getMember(&Sym);<br>
   if (auto EC = MBRefOrErr.getError())<br>
<br>
Modified: lld/trunk/COFF/Symbols.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_COFF_Symbols.h-3Frev-3D240719-26r1-3D240718-26r2-3D240719-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=7p29ZjK4AVLjWzusYxmi0oEkAhNXGZKYqOrfDiBj64I&s=qDCP3MP5JwczPaGFYGKhzmYFZjg-7DgrDEMpDIQgAgM&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Symbols.h?rev=240719&r1=240718&r2=240719&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/Symbols.h (original)<br>
+++ lld/trunk/COFF/Symbols.h Thu Jun 25 18:22:00 2015<br>
@@ -23,7 +23,6 @@ namespace lld {<br>
 namespace coff {<br>
<br>
 using llvm::object::Archive;<br>
-using llvm::object::COFFObjectFile;<br>
 using llvm::object::COFFSymbolRef;<br>
 using llvm::object::coff_import_header;<br>
<br>
@@ -80,6 +79,10 @@ public:<br>
   // they are duplicate (conflicting) symbols.<br>
   virtual int compare(SymbolBody *Other) = 0;<br>
<br>
+  // Returns a name of this symbol including source file name.<br>
+  // Used only for debugging and logging.<br>
+  virtual std::string getDebugName() { return getName(); }<br>
+<br>
 protected:<br>
   SymbolBody(Kind K) : SymbolKind(K) {}<br>
<br>
@@ -113,8 +116,8 @@ public:<br>
 // Regular defined symbols read from object file symbol tables.<br>
 class DefinedRegular : public Defined {<br>
 public:<br>
-  DefinedRegular(COFFObjectFile *F, COFFSymbolRef S, SectionChunk *C)<br>
-      : Defined(DefinedRegularKind), COFFFile(F), Sym(S), Data(&C->Ptr),<br>
+  DefinedRegular(ObjectFile *F, COFFSymbolRef S, SectionChunk *C)<br>
+      : Defined(DefinedRegularKind), File(F), Sym(S), Data(&C->Ptr),<br>
         IsCOMDAT(C->isCOMDAT()) {}<br>
<br>
   static bool classof(const SymbolBody *S) {<br>
@@ -129,13 +132,14 @@ public:<br>
   uint64_t getRVA() override { return (*Data)->getRVA() + Sym.getValue(); }<br>
   bool isExternal() override { return Sym.isExternal(); }<br>
   int compare(SymbolBody *Other) override;<br>
+  std::string getDebugName() override;<br>
   bool isCOMDAT() { return IsCOMDAT; }<br>
   void markLive() { (*Data)->markLive(); }<br>
   Chunk *getChunk() { return *Data; }<br>
<br>
 private:<br>
   StringRef Name;<br>
-  COFFObjectFile *COFFFile;<br>
+  ObjectFile *File;<br>
   COFFSymbolRef Sym;<br>
   SectionChunk **Data;<br>
   bool IsCOMDAT;<br>
@@ -143,8 +147,8 @@ private:<br>
<br>
 class DefinedCommon : public Defined {<br>
 public:<br>
-  DefinedCommon(COFFObjectFile *F, COFFSymbolRef S, CommonChunk *C)<br>
-      : Defined(DefinedCommonKind), COFFFile(F), Sym(S), Data(C) {}<br>
+  DefinedCommon(ObjectFile *F, COFFSymbolRef S, CommonChunk *C)<br>
+      : Defined(DefinedCommonKind), File(F), Sym(S), Data(C) {}<br>
<br>
   static bool classof(const SymbolBody *S) {<br>
     return S->kind() == DefinedCommonKind;<br>
@@ -155,12 +159,13 @@ public:<br>
   bool isExternal() override { return Sym.isExternal(); }<br>
   uint64_t getFileOff() override { return Data->getFileOff(); }<br>
   int compare(SymbolBody *Other) override;<br>
+  std::string getDebugName() override;<br>
<br>
 private:<br>
   uint64_t getSize() { return Sym.getValue(); }<br>
<br>
   StringRef Name;<br>
-  COFFObjectFile *COFFFile;<br>
+  ObjectFile *File;<br>
   COFFSymbolRef Sym;<br>
   CommonChunk *Data;<br>
 };<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>