// Identify symbols exported dynamically, and that therefore could be
// referenced by a shared library not visible to the linker.
r.ExportDynamic = sym->computeBinding() != STB_LOCAL &&
- (sym->isExportDynamic(sym->kind(), sym->visibility) ||
+ (sym->isExportDynamic(sym->kind()) ||
sym->exportDynamic || sym->inDynamicList);
const auto *dr = dyn_cast<Defined>(sym);
r.FinalDefinitionInLinkageUnit =
// non-lazy object causes a runtime error.
void extract() const;
- static bool isExportDynamic(Kind k, uint8_t visibility) {
- if (k == SharedKind)
- return visibility == llvm::ELF::STV_DEFAULT;
- return config->shared || config->exportDynamic;
+ static bool isExportDynamic(Kind k) {
+ return k == SharedKind || config->shared || config->exportDynamic;
}
private:
binding(binding), type(type), stOther(stOther), symbolKind(k),
visibility(stOther & 3),
isUsedInRegularObj(!file || file->kind() == InputFile::ObjKind),
- exportDynamic(isExportDynamic(k, visibility)), inDynamicList(false),
+ exportDynamic(isExportDynamic(k)), inDynamicList(false),
canInline(false), referenced(false), traced(false),
hasVersionSuffix(false), isInIplt(false), gotInIgot(false),
isPreemptible(false), used(!config->gcSections), folded(false),
; RUN: ld.lld %t.o %t2.so -o %t.so -save-temps -shared
; RUN: llvm-dis %t.so.0.2.internalize.bc -o - | FileCheck %s
-; This documents a small limitation of lld's internalization logic. We decide
-; that bar should be in the symbol table because if it is it will preempt the
-; one in the shared library.
-; We could add one extra bit for ODR so that we know that preemption is not
-; necessary, but that is probably not worth it.
-
-; CHECK: @foo = internal unnamed_addr constant i8 42
+; CHECK: @foo = weak_odr unnamed_addr constant i8 42
; CHECK: @bar = weak_odr unnamed_addr constant i8 42
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"