Common symbols don't have a value.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 7 Jul 2015 15:05:09 +0000 (15:05 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 7 Jul 2015 15:05:09 +0000 (15:05 +0000)
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
tools/dsymutil/DebugMap.cpp
tools/dsymutil/MachODebugMapParser.cpp

index 54e4624af1388d97dffd72ae0f6a246d82d2a45f..3c82d7bf3e242aca215754fb0a0706d0bd2d3635 100644 (file)
@@ -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<uint64_t> MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const {
index e5cc87b3f3181edc09cfa21db71f62bec364bb5b..46b269dc267238edf0ce86177671c5d90202621b 100644 (file)
@@ -216,7 +216,11 @@ MappingTraits<dsymutil::DebugMapObject>::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<StringRef> Name = Sym.getName();
       if (!Name)
         continue;
index bec95915a0fb4c39de78262cc298de6ab2050b3f..76fc7612e68b5749ca397a2e2c08bb2f2831bdf4 100644 (file)
@@ -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<StringRef> Name = Sym.getName();
     if (!Name)
       continue;