From 9ca3a03969cda2b5cbaabecd3f9634266fdaa2ca Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 7 Jul 2015 15:05:09 +0000 Subject: [PATCH] Common symbols don't have a value. At least not in the interface exposed by ObjectFile. This matches what ELF and COFF implement. Adjust existing code that was expecting them to have values. No overall functionality change intended. Another option would be to change the interface and the ELF and COFF implementations to say that the value of a common symbol is its size. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241593 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/MachOObjectFile.cpp | 5 ++--- tools/dsymutil/DebugMap.cpp | 6 +++++- tools/dsymutil/MachODebugMapParser.cpp | 12 ++++++++---- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 54e4624af13..3c82d7bf3e2 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -369,11 +369,10 @@ std::error_code MachOObjectFile::getIndirectName(DataRefImpl Symb, } uint64_t MachOObjectFile::getSymbolValue(DataRefImpl Sym) const { - uint64_t NValue = getNValue(Sym); MachO::nlist_base Entry = getSymbolTableEntryBase(this, Sym); - if ((Entry.n_type & MachO::N_TYPE) == MachO::N_UNDF && NValue == 0) + if ((Entry.n_type & MachO::N_TYPE) == MachO::N_UNDF) return UnknownAddress; - return NValue; + return getNValue(Sym); } ErrorOr MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const { diff --git a/tools/dsymutil/DebugMap.cpp b/tools/dsymutil/DebugMap.cpp index e5cc87b3f31..46b269dc267 100644 --- a/tools/dsymutil/DebugMap.cpp +++ b/tools/dsymutil/DebugMap.cpp @@ -216,7 +216,11 @@ MappingTraits::YamlDMO::denormalize(IO &IO) { // during the test, we can't hardcode the symbols addresses, so // look them up here and rewrite them. for (const auto &Sym : ErrOrObjectFile->symbols()) { - uint64_t Address = Sym.getValue(); + uint64_t Address; + if (Sym.getFlags() & SymbolRef::SF_Common) + Address = Sym.getCommonSize(); + else + Address = Sym.getValue(); ErrorOr Name = Sym.getName(); if (!Name) continue; diff --git a/tools/dsymutil/MachODebugMapParser.cpp b/tools/dsymutil/MachODebugMapParser.cpp index bec95915a0f..76fc7612e68 100644 --- a/tools/dsymutil/MachODebugMapParser.cpp +++ b/tools/dsymutil/MachODebugMapParser.cpp @@ -197,10 +197,14 @@ void MachODebugMapParser::loadCurrentObjectFileSymbols() { CurrentObjectAddresses.clear(); for (auto Sym : CurrentObjectHolder.Get().symbols()) { - - uint64_t Addr = Sym.getValue(); - if (Addr == UnknownAddress) - continue; + uint64_t Addr; + if (Sym.getFlags() & SymbolRef::SF_Common) { + Addr = Sym.getCommonSize(); + } else { + Addr = Sym.getValue(); + if (Addr == UnknownAddress) + continue; + } ErrorOr Name = Sym.getName(); if (!Name) continue; -- 2.34.1