<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>