<div dir="ltr">Ping. Anyone?</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 12, 2013 at 10:25 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"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div class="im"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


__lseek. When the linker tries to resolve _read, it supposed to read the file<br></blockquote><div><br></div></div><div>There's a typo in this line: s/_read/_lseek/</div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



from OLDNAMES.LIB and use the new fallback from the file. Currently LLD cannot<br>
handle such case because duplicate undefined atoms with the same attributes are<br>
ignored.<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D2161" target="_blank">http://llvm-reviews.chandlerc.com/D2161</a><br>
<br>
Files:<br>
  lib/Core/SymbolTable.cpp<br>
  test/core/undef-weak-coalesce.objtxt<br>
<br>
Index: lib/Core/SymbolTable.cpp<br>
===================================================================<br>
--- lib/Core/SymbolTable.cpp<br>
+++ lib/Core/SymbolTable.cpp<br>
@@ -178,20 +178,34 @@<br>
             dyn_cast<UndefinedAtom>(&newAtom);<br>
           assert(existingUndef != nullptr);<br>
           assert(newUndef != nullptr);<br>
-          if ( existingUndef->canBeNull() == newUndef->canBeNull() ) {<br>
-            useNew = false;<br>
+          if (existingUndef->canBeNull() != newUndef->canBeNull() &&<br>
+              _context.warnIfCoalesableAtomsHaveDifferentCanBeNull()) {<br>
+            // FIXME: need diagonstics interface for writing warning messages<br>
+            llvm::errs() << "lld warning: undefined symbol "<br>
+                         << existingUndef->name()<br>
+                         << " has different weakness in "<br>
+                         << existingUndef->file().path()<br>
+                         << " and in "<br>
+                         << newUndef->file().path();<br>
           }<br>
-          else {<br>
-            if (_context.warnIfCoalesableAtomsHaveDifferentCanBeNull()) {<br>
-              // FIXME: need diagonstics interface for writing warning messages<br>
-              llvm::errs() << "lld warning: undefined symbol "<br>
-                           << existingUndef->name()<br>
-                           << " has different weakness in "<br>
-                           << existingUndef->file().path()<br>
-                           << " and in "<br>
-                           << newUndef->file().path();<br>
-            }<br>
-            useNew = (newUndef->canBeNull() < existingUndef->canBeNull());<br>
+          useNew = (newUndef->canBeNull() <= existingUndef->canBeNull());<br>
+<br>
+          // Warn if the fallback atom is being overriden.<br>
+          const UndefinedAtom *existingFallback = existingUndef->fallback();<br>
+          if (useNew && existingFallback) {<br>
+            const UndefinedAtom *newFallback = newUndef->fallback();<br>
+            if (!newFallback) {<br>
+              llvm::errs() << "lld warning: new undefined atom removes the "<br>
+                           << "existing fallback atom "<br>
+                           << existingUndef->name() << " ("<br>
+                           << existingFallback->name() << ")";<br>
+            } else if (existingFallback->name() != newFallback->name())<br>
+              llvm::errs() << "lld warning: new undefined atom "<br>
+                           << newUndef->name() << " ("<br>
+                           << newFallback->name() << ")"<br>
+                           << " shadows the existing fallback atom "<br>
+                           << existingUndef->name() << " ("<br>
+                           << existingFallback->name() << ")";<br>
           }<br>
         }<br>
         break;<br>
Index: test/core/undef-weak-coalesce.objtxt<br>
===================================================================<br>
--- test/core/undef-weak-coalesce.objtxt<br>
+++ test/core/undef-weak-coalesce.objtxt<br>
@@ -8,86 +8,66 @@<br>
 undefined-atoms:<br>
     - name:              regular_func<br>
       can-be-null:       never<br>
-<br>
     - name:              weak_import_func<br>
       can-be-null:       at-runtime<br>
-<br>
     - name:              weak_func<br>
       can-be-null:       at-buildtime<br>
-<br>
     - name:              bar1<br>
       can-be-null:       never<br>
-<br>
     - name:              bar2<br>
       can-be-null:       at-runtime<br>
-<br>
     - name:              bar3<br>
       can-be-null:       at-buildtime<br>
-<br>
     - name:              bar4<br>
       can-be-null:       never<br>
-<br>
     - name:              bar5<br>
       can-be-null:       at-runtime<br>
-<br>
     - name:              bar6<br>
       can-be-null:       at-buildtime<br>
-<br>
     - name:              bar7<br>
       can-be-null:       never<br>
-<br>
     - name:              bar8<br>
       can-be-null:       at-runtime<br>
-<br>
     - name:              bar9<br>
       can-be-null:       at-buildtime<br>
-<br>
 ---<br>
 undefined-atoms:<br>
     - name:              bar1<br>
       can-be-null:       never<br>
-<br>
     - name:              bar2<br>
       can-be-null:       at-runtime<br>
-<br>
     - name:              bar3<br>
       can-be-null:       at-buildtime<br>
-<br>
     - name:              bar4<br>
       can-be-null:       at-runtime<br>
-<br>
     - name:              bar5<br>
       can-be-null:       at-buildtime<br>
-<br>
     - name:              bar6<br>
       can-be-null:       never<br>
-<br>
     - name:              bar7<br>
       can-be-null:       at-buildtime<br>
-<br>
     - name:              bar8<br>
       can-be-null:       never<br>
-<br>
     - name:              bar9<br>
       can-be-null:       at-runtime<br>
 ...<br>
<br>
-# CHECK:   - name:       regular_func<br>
-# CHECK:   - name:       weak_import_func<br>
-# CHECK:     can-be-null:  at-runtime<br>
-# CHECK:   - name:       weak_func<br>
-# CHECK:     can-be-null:  at-buildtime<br>
-# CHECK:   - name:       bar1<br>
-# CHECK:   - name:       bar2<br>
-# CHECK:     can-be-null:  at-runtime<br>
-# CHECK:   - name:       bar3<br>
-# CHECK:     can-be-null:  at-buildtime<br>
-# CHECK:   - name:       bar4<br>
-# CHECK:   - name:       bar5<br>
-# CHECK:     can-be-null:  at-runtime<br>
-# CHECK:   - name:       bar7<br>
-# CHECK:   - name:       bar6<br>
-# CHECK:   - name:       bar8<br>
-# CHECK:   - name:       bar9<br>
-# CHECK:     can-be-null:  at-runtime<br>
-# CHECK:       ...<br>
+# CHECK:        - name:       regular_func<br>
+# CHECK-NEXT:   - name:       weak_import_func<br>
+# CHECK-NEXT:     can-be-null:  at-runtime<br>
+# CHECK-NEXT:   - name:       weak_func<br>
+# CHECK-NEXT:     can-be-null:  at-buildtime<br>
+# CHECK-NEXT:   - name:       bar4<br>
+# CHECK-NEXT:   - name:       bar5<br>
+# CHECK-NEXT:     can-be-null:  at-runtime<br>
+# CHECK-NEXT:   - name:       bar7<br>
+# CHECK-NEXT:   - name:       bar1<br>
+# CHECK-NEXT:   - name:       bar2<br>
+# CHECK-NEXT:     can-be-null:  at-runtime<br>
+# CHECK-NEXT:   - name:       bar3<br>
+# CHECK-NEXT:     can-be-null:  at-buildtime<br>
+# CHECK-NEXT:   - name:       bar6<br>
+# CHECK-NEXT:   - name:       bar8<br>
+# CHECK-NEXT:   - name:       bar9<br>
+# CHECK-NEXT:     can-be-null:  at-runtime<br>
+# CHECK-NEXT:       ...<br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div>