Skip to content

Commit e137b55

Browse files
committed
[llvm-jitlink] Don't demote unreferenced definitions in -harness mode.
Demoting unreferenced externals is unsafe if multiple interdependent test objects are used, including objects loaded from archives.
1 parent adaadbf commit e137b55

File tree

1 file changed

+4
-9
lines changed

1 file changed

+4
-9
lines changed

llvm/tools/llvm-jitlink/llvm-jitlink.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ static Error applyHarnessPromotions(Session &S, LinkGraph &G) {
187187

188188
// If this graph is part of the test then promote any symbols referenced by
189189
// the harness to default scope, remove all symbols that clash with harness
190-
// definitions, demote all other definitions.
190+
// definitions.
191191
std::vector<Symbol *> DefinitionsToRemove;
192192
for (auto *Sym : G.defined_symbols()) {
193193

@@ -219,10 +219,6 @@ static Error applyHarnessPromotions(Session &S, LinkGraph &G) {
219219
} else if (S.HarnessDefinitions.count(Sym->getName())) {
220220
LLVM_DEBUG(dbgs() << " Externalizing " << Sym->getName() << "\n");
221221
DefinitionsToRemove.push_back(Sym);
222-
} else {
223-
LLVM_DEBUG(dbgs() << " Demoting " << Sym->getName() << "\n");
224-
Sym->setScope(Scope::Local);
225-
Sym->setLive(false);
226222
}
227223
}
228224

@@ -521,7 +517,8 @@ Error LLVMJITLinkObjectLinkingLayer::add(JITDylib &JD,
521517
return SymFlagsOrErr.takeError();
522518

523519
// Skip symbols not defined in this object file.
524-
if (*SymFlagsOrErr & object::BasicSymbolRef::SF_Undefined)
520+
if ((*SymFlagsOrErr & object::BasicSymbolRef::SF_Undefined) ||
521+
!(*SymFlagsOrErr & object::BasicSymbolRef::SF_Global))
525522
continue;
526523

527524
auto Name = Sym.getName();
@@ -551,10 +548,8 @@ Error LLVMJITLinkObjectLinkingLayer::add(JITDylib &JD,
551548
*SymFlags &= ~JITSymbolFlags::Exported;
552549
} else if (S.HarnessExternals.count(*Name)) {
553550
*SymFlags |= JITSymbolFlags::Exported;
554-
} else {
555-
// Skip symbols that aren't in the HarnessExternals set.
551+
} else if (S.HarnessDefinitions.count(*Name))
556552
continue;
557-
}
558553

559554
auto InternedName = S.ES.intern(*Name);
560555
SymbolFlags[InternedName] = std::move(*SymFlags);

0 commit comments

Comments
 (0)