[PATCH] Select new undefined atom rather than old one if other conditions are the same.
Rui Ueyama
ruiu at google.com
Thu Nov 14 16:34:54 PST 2013
Ping. Anyone?
On Tue, Nov 12, 2013 at 10:25 PM, Rui Ueyama <ruiu at google.com> wrote:
>
>
>> __lseek. When the linker tries to resolve _read, it supposed to read the
>> file
>>
>
> There's a typo in this line: s/_read/_lseek/
>
>
>> from OLDNAMES.LIB and use the new fallback from the file. Currently LLD
>> cannot
>> handle such case because duplicate undefined atoms with the same
>> attributes are
>> ignored.
>>
>> http://llvm-reviews.chandlerc.com/D2161
>>
>> Files:
>> lib/Core/SymbolTable.cpp
>> test/core/undef-weak-coalesce.objtxt
>>
>> Index: lib/Core/SymbolTable.cpp
>> ===================================================================
>> --- lib/Core/SymbolTable.cpp
>> +++ lib/Core/SymbolTable.cpp
>> @@ -178,20 +178,34 @@
>> dyn_cast<UndefinedAtom>(&newAtom);
>> assert(existingUndef != nullptr);
>> assert(newUndef != nullptr);
>> - if ( existingUndef->canBeNull() == newUndef->canBeNull() ) {
>> - useNew = false;
>> + if (existingUndef->canBeNull() != newUndef->canBeNull() &&
>> + _context.warnIfCoalesableAtomsHaveDifferentCanBeNull()) {
>> + // FIXME: need diagonstics interface for writing warning
>> messages
>> + llvm::errs() << "lld warning: undefined symbol "
>> + << existingUndef->name()
>> + << " has different weakness in "
>> + << existingUndef->file().path()
>> + << " and in "
>> + << newUndef->file().path();
>> }
>> - else {
>> - if (_context.warnIfCoalesableAtomsHaveDifferentCanBeNull()) {
>> - // FIXME: need diagonstics interface for writing warning
>> messages
>> - llvm::errs() << "lld warning: undefined symbol "
>> - << existingUndef->name()
>> - << " has different weakness in "
>> - << existingUndef->file().path()
>> - << " and in "
>> - << newUndef->file().path();
>> - }
>> - useNew = (newUndef->canBeNull() <
>> existingUndef->canBeNull());
>> + useNew = (newUndef->canBeNull() <= existingUndef->canBeNull());
>> +
>> + // Warn if the fallback atom is being overriden.
>> + const UndefinedAtom *existingFallback =
>> existingUndef->fallback();
>> + if (useNew && existingFallback) {
>> + const UndefinedAtom *newFallback = newUndef->fallback();
>> + if (!newFallback) {
>> + llvm::errs() << "lld warning: new undefined atom removes
>> the "
>> + << "existing fallback atom "
>> + << existingUndef->name() << " ("
>> + << existingFallback->name() << ")";
>> + } else if (existingFallback->name() != newFallback->name())
>> + llvm::errs() << "lld warning: new undefined atom "
>> + << newUndef->name() << " ("
>> + << newFallback->name() << ")"
>> + << " shadows the existing fallback atom "
>> + << existingUndef->name() << " ("
>> + << existingFallback->name() << ")";
>> }
>> }
>> break;
>> Index: test/core/undef-weak-coalesce.objtxt
>> ===================================================================
>> --- test/core/undef-weak-coalesce.objtxt
>> +++ test/core/undef-weak-coalesce.objtxt
>> @@ -8,86 +8,66 @@
>> undefined-atoms:
>> - name: regular_func
>> can-be-null: never
>> -
>> - name: weak_import_func
>> can-be-null: at-runtime
>> -
>> - name: weak_func
>> can-be-null: at-buildtime
>> -
>> - name: bar1
>> can-be-null: never
>> -
>> - name: bar2
>> can-be-null: at-runtime
>> -
>> - name: bar3
>> can-be-null: at-buildtime
>> -
>> - name: bar4
>> can-be-null: never
>> -
>> - name: bar5
>> can-be-null: at-runtime
>> -
>> - name: bar6
>> can-be-null: at-buildtime
>> -
>> - name: bar7
>> can-be-null: never
>> -
>> - name: bar8
>> can-be-null: at-runtime
>> -
>> - name: bar9
>> can-be-null: at-buildtime
>> -
>> ---
>> undefined-atoms:
>> - name: bar1
>> can-be-null: never
>> -
>> - name: bar2
>> can-be-null: at-runtime
>> -
>> - name: bar3
>> can-be-null: at-buildtime
>> -
>> - name: bar4
>> can-be-null: at-runtime
>> -
>> - name: bar5
>> can-be-null: at-buildtime
>> -
>> - name: bar6
>> can-be-null: never
>> -
>> - name: bar7
>> can-be-null: at-buildtime
>> -
>> - name: bar8
>> can-be-null: never
>> -
>> - name: bar9
>> can-be-null: at-runtime
>> ...
>>
>> -# CHECK: - name: regular_func
>> -# CHECK: - name: weak_import_func
>> -# CHECK: can-be-null: at-runtime
>> -# CHECK: - name: weak_func
>> -# CHECK: can-be-null: at-buildtime
>> -# CHECK: - name: bar1
>> -# CHECK: - name: bar2
>> -# CHECK: can-be-null: at-runtime
>> -# CHECK: - name: bar3
>> -# CHECK: can-be-null: at-buildtime
>> -# CHECK: - name: bar4
>> -# CHECK: - name: bar5
>> -# CHECK: can-be-null: at-runtime
>> -# CHECK: - name: bar7
>> -# CHECK: - name: bar6
>> -# CHECK: - name: bar8
>> -# CHECK: - name: bar9
>> -# CHECK: can-be-null: at-runtime
>> -# CHECK: ...
>> +# CHECK: - name: regular_func
>> +# CHECK-NEXT: - name: weak_import_func
>> +# CHECK-NEXT: can-be-null: at-runtime
>> +# CHECK-NEXT: - name: weak_func
>> +# CHECK-NEXT: can-be-null: at-buildtime
>> +# CHECK-NEXT: - name: bar4
>> +# CHECK-NEXT: - name: bar5
>> +# CHECK-NEXT: can-be-null: at-runtime
>> +# CHECK-NEXT: - name: bar7
>> +# CHECK-NEXT: - name: bar1
>> +# CHECK-NEXT: - name: bar2
>> +# CHECK-NEXT: can-be-null: at-runtime
>> +# CHECK-NEXT: - name: bar3
>> +# CHECK-NEXT: can-be-null: at-buildtime
>> +# CHECK-NEXT: - name: bar6
>> +# CHECK-NEXT: - name: bar8
>> +# CHECK-NEXT: - name: bar9
>> +# CHECK-NEXT: can-be-null: at-runtime
>> +# CHECK-NEXT: ...
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131114/34cfe140/attachment.html>
More information about the llvm-commits
mailing list