diff --git a/llvm/test/tools/dsymutil/Inputs/alias/bar.o b/llvm/test/tools/dsymutil/Inputs/alias/bar.o new file mode 100644 index 000000000000..d98632f64308 Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/alias/bar.o differ diff --git a/llvm/test/tools/dsymutil/Inputs/alias/foo.o b/llvm/test/tools/dsymutil/Inputs/alias/foo.o new file mode 100644 index 000000000000..aff057285888 Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/alias/foo.o differ diff --git a/llvm/test/tools/dsymutil/Inputs/alias/foobar b/llvm/test/tools/dsymutil/Inputs/alias/foobar new file mode 100755 index 000000000000..8f3891decfde Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/alias/foobar differ diff --git a/llvm/test/tools/dsymutil/X86/alias.test b/llvm/test/tools/dsymutil/X86/alias.test new file mode 100644 index 000000000000..9625b308647c --- /dev/null +++ b/llvm/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 diff --git a/llvm/tools/dsymutil/MachODebugMapParser.cpp b/llvm/tools/dsymutil/MachODebugMapParser.cpp index 75ae67cd53fe..866196fb27eb 100644 --- a/llvm/tools/dsymutil/MachODebugMapParser.cpp +++ b/llvm/tools/dsymutil/MachODebugMapParser.cpp @@ -70,6 +70,7 @@ private: 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 @@ void MachODebugMapParser::handleStabSymbolTableEntry(uint32_t StringIndex, } 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 @@ uint64_t MachODebugMapParser::getMainBinarySymbolAddress(StringRef Name) { 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(