diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 570b8f9d05906..192a998229e92 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1318,13 +1318,9 @@ void LinkerDriver::convertResources() { } void LinkerDriver::maybeCreateECExportThunk(StringRef name, Symbol *&sym) { - Defined *def; if (!sym) return; - if (auto undef = dyn_cast(sym)) - def = undef->getDefinedWeakAlias(); - else - def = dyn_cast(sym); + Defined *def = sym->getDefined(); if (!def) return; @@ -1356,11 +1352,7 @@ void LinkerDriver::createECExportThunks() { Symbol *sym = ctx.symtab.find(targetName); if (!sym) continue; - Defined *targetSym; - if (auto undef = dyn_cast(sym)) - targetSym = undef->getDefinedWeakAlias(); - else - targetSym = dyn_cast(sym); + Defined *targetSym = sym->getDefined(); if (!targetSym) continue; diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index b571ce9ce432c..ba4f95d14bc64 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -91,6 +91,14 @@ bool Symbol::isLive() const { return true; } +Defined *Symbol::getDefined() { + if (auto d = dyn_cast(this)) + return d; + if (auto u = dyn_cast(this)) + return u->getDefinedWeakAlias(); + return nullptr; +} + void Symbol::replaceKeepingName(Symbol *other, size_t size) { StringRef origName = getName(); memcpy(this, other, size); diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h index fd3d8cec8c113..c86ded860876b 100644 --- a/lld/COFF/Symbols.h +++ b/lld/COFF/Symbols.h @@ -95,6 +95,10 @@ class Symbol { symbolKind == LazyDLLSymbolKind; } + // Get the Defined symbol associated with this symbol, either itself or its + // weak alias. + Defined *getDefined(); + private: void computeName();