Index: llvm/trunk/test/tools/dsymutil/X86/alias.test =================================================================== --- llvm/trunk/test/tools/dsymutil/X86/alias.test +++ llvm/trunk/test/tools/dsymutil/X86/alias.test @@ -0,0 +1,19 @@ +# RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/alias \ +# RUN: %p/../Inputs/alias/foobar -o - 2>&1 | llvm-dwarfdump - | FileCheck %s +# CHECK-NOT: could not find object file symbol for symbol +# CHECK: DW_AT_name ("foo.c") +# CHECK: DW_AT_name ("bar.c") + +# Source: +# $ cat foo.c +# int foo = 1; +# $ cat bar.c +# extern int bar; +# int main() { +# return bar; +# } + +# Compile with: +# $ clang -g -O0 bar.c -c -o bar.o +# $ clang -g -O0 foo.c -c -o foo.o +# $ ld -arch x86_64 -macosx_version_min 10.13.0 foo.o bar.o -lSystem -alias _foo _bar -o foobar Index: llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp =================================================================== --- llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp +++ llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp @@ -70,6 +70,7 @@ sys::TimePoint Timestamp); void resetParserState(); uint64_t getMainBinarySymbolAddress(StringRef Name); + std::vector getMainBinarySymbolNames(uint64_t Value); void loadMainBinarySymbols(const MachOObjectFile &MainBinary); void loadCurrentObjectFileSymbols(const object::MachOObjectFile &Obj); void handleStabSymbolTableEntry(uint32_t StringIndex, uint8_t Type, @@ -382,9 +383,21 @@ } auto ObjectSymIt = CurrentObjectAddresses.find(Name); + + // If the name of a (non-static) symbol is not in the current object, we + // check all its aliases from the main binary. + if (ObjectSymIt == CurrentObjectAddresses.end() && Type != MachO::N_STSYM) { + for (const auto &Alias : getMainBinarySymbolNames(Value)) { + ObjectSymIt = CurrentObjectAddresses.find(Alias); + if (ObjectSymIt != CurrentObjectAddresses.end()) + break; + } + } + if (ObjectSymIt == CurrentObjectAddresses.end()) return Warning("could not find object file symbol for symbol " + Twine(Name)); + if (!CurrentDebugMapObject->addSymbol(Name, ObjectSymIt->getValue(), Value, Size)) return Warning(Twine("failed to insert symbol '") + Name + @@ -429,6 +442,17 @@ return Sym->second; } +/// Get all symbol names in the main binary for the given value. +std::vector +MachODebugMapParser::getMainBinarySymbolNames(uint64_t Value) { + std::vector Names; + for (const auto &Entry : MainBinarySymbolAddresses) { + if (Entry.second == Value) + Names.push_back(Entry.first()); + } + return Names; +} + /// Load the interesting main binary symbols' addresses into /// MainBinarySymbolAddresses. void MachODebugMapParser::loadMainBinarySymbols(