[llvm] r205479 - Fix a nomenclature error in llvm-nm.

Rafael Espindola rafael.espindola at gmail.com
Wed Apr 2 15:52:47 PDT 2014


Author: rafael
Date: Wed Apr  2 17:52:46 2014
New Revision: 205479

URL: http://llvm.org/viewvc/llvm-project?rev=205479&view=rev
Log:
Fix a nomenclature error in llvm-nm.

What llvm-nm prints depends on the file format. On ELF for example, if the
file is relocatable, it prints offsets. If it is not, it prints addresses.
Since it doesn't really need to care what it is that it is printing, use the
generic term value.

Fix or implement getSymbolValue to keep llvm-nm working.

Modified:
    llvm/trunk/include/llvm/Object/ELFObjectFile.h
    llvm/trunk/lib/Object/COFFObjectFile.cpp
    llvm/trunk/lib/Object/MachOObjectFile.cpp
    llvm/trunk/tools/llvm-nm/llvm-nm.cpp

Modified: llvm/trunk/include/llvm/Object/ELFObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFObjectFile.h?rev=205479&r1=205478&r2=205479&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Wed Apr  2 17:52:46 2014
@@ -417,7 +417,15 @@ template <class ELFT>
 error_code ELFObjectFile<ELFT>::getSymbolValue(DataRefImpl Symb,
                                                uint64_t &Val) const {
   const Elf_Sym *ESym = getSymbol(Symb);
-  Val = ESym->st_value;
+  switch (EF.getSymbolTableIndex(ESym)) {
+  default:
+    Val = ESym->st_value;
+    break;
+  case ELF::SHN_COMMON:
+  case ELF::SHN_UNDEF:
+    Val = UnknownAddressOrSize;
+    break;
+  }
   return object_error::success;
 }
 

Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=205479&r1=205478&r2=205479&view=diff
==============================================================================
--- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/COFFObjectFile.cpp Wed Apr  2 17:52:46 2014
@@ -253,8 +253,15 @@ error_code COFFObjectFile::getSymbolSect
 }
 
 error_code COFFObjectFile::getSymbolValue(DataRefImpl Ref,
-                                          uint64_t &Val) const {
-  report_fatal_error("getSymbolValue unimplemented in COFFObjectFile");
+                                          uint64_t &Result) const {
+  const coff_symbol *Symb = toSymb(Ref);
+
+  if (Symb->SectionNumber == COFF::IMAGE_SYM_UNDEFINED)
+    Result = UnknownAddressOrSize;
+  else
+    Result = Symb->Value;
+
+  return object_error::success;
 }
 
 void COFFObjectFile::moveSectionNext(DataRefImpl &Ref) const {

Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=205479&r1=205478&r2=205479&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Wed Apr  2 17:52:46 2014
@@ -633,7 +633,8 @@ MachOObjectFile::getSymbolSection(DataRe
 
 error_code MachOObjectFile::getSymbolValue(DataRefImpl Symb,
                                            uint64_t &Val) const {
-  report_fatal_error("getSymbolValue unimplemented in MachOObjectFile");
+  // In MachO both relocatable and non-relocatable objects have addresses.
+  return getSymbolAddress(Symb, Val);
 }
 
 void MachOObjectFile::moveSectionNext(DataRefImpl &Sec) const {

Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=205479&r1=205478&r2=205479&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)
+++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Wed Apr  2 17:52:46 2014
@@ -95,7 +95,7 @@ cl::opt<bool> DebugSyms("debug-syms",
 cl::alias DebugSymsa("a", cl::desc("Alias for --debug-syms"),
                      cl::aliasopt(DebugSyms));
 
-cl::opt<bool> NumericSort("numeric-sort", cl::desc("Sort symbols by address"));
+cl::opt<bool> NumericSort("numeric-sort", cl::desc("Sort symbols by value"));
 cl::alias NumericSortn("n", cl::desc("Alias for --numeric-sort"),
                        cl::aliasopt(NumericSort));
 cl::alias NumericSortv("v", cl::desc("Alias for --numeric-sort"),
@@ -105,7 +105,7 @@ cl::opt<bool> NoSort("no-sort", cl::desc
 cl::alias NoSortp("p", cl::desc("Alias for --no-sort"), cl::aliasopt(NoSort));
 
 cl::opt<bool> PrintSize("print-size",
-                        cl::desc("Show symbol size instead of address"));
+                        cl::desc("Show symbol size instead of value"));
 cl::alias PrintSizeS("S", cl::desc("Alias for --print-size"),
                      cl::aliasopt(PrintSize));
 
@@ -117,7 +117,7 @@ cl::opt<bool> WithoutAliases("without-al
 cl::opt<bool> ArchiveMap("print-armap", cl::desc("Print the archive map"));
 cl::alias ArchiveMaps("s", cl::desc("Alias for --print-armap"),
                       cl::aliasopt(ArchiveMap));
-bool PrintAddress = true;
+bool PrintValue = true;
 
 bool MultipleFiles = false;
 
@@ -141,19 +141,19 @@ static bool error(error_code EC, Twine P
 
 namespace {
 struct NMSymbol {
-  uint64_t Address;
+  uint64_t Value;
   uint64_t Size;
   char TypeChar;
   StringRef Name;
 };
 }
 
-static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) {
-  if (A.Address < B.Address)
+static bool compareSymbolValue(const NMSymbol &A, const NMSymbol &B) {
+  if (A.Value < B.Value)
     return true;
-  else if (A.Address == B.Address && A.Name < B.Name)
+  else if (A.Value == B.Value && A.Name < B.Name)
     return true;
-  else if (A.Address == B.Address && A.Name == B.Name && A.Size < B.Size)
+  else if (A.Value == B.Value && A.Name == B.Name && A.Size < B.Size)
     return true;
   else
     return false;
@@ -164,7 +164,7 @@ static bool compareSymbolSize(const NMSy
     return true;
   else if (A.Size == B.Size && A.Name < B.Name)
     return true;
-  else if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address)
+  else if (A.Size == B.Size && A.Name == B.Name && A.Value < B.Value)
     return true;
   else
     return false;
@@ -175,7 +175,7 @@ static bool compareSymbolName(const NMSy
     return true;
   else if (A.Name == B.Name && A.Size < B.Size)
     return true;
-  else if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address)
+  else if (A.Name == B.Name && A.Size == B.Size && A.Value < B.Value)
     return true;
   else
     return false;
@@ -188,7 +188,7 @@ static SymbolListT SymbolList;
 static void sortAndPrintSymbolList() {
   if (!NoSort) {
     if (NumericSort)
-      std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolAddress);
+      std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolValue);
     else if (SizeSort)
       std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolSize);
     else
@@ -211,29 +211,29 @@ static void sortAndPrintSymbolList() {
       continue;
     if ((I->TypeChar == 'U') && DefinedOnly)
       continue;
-    if (SizeSort && !PrintAddress && I->Size == UnknownAddressOrSize)
+    if (SizeSort && !PrintValue && I->Size == UnknownAddressOrSize)
       continue;
 
-    char SymbolAddrStr[10] = "";
+    char SymbolValueStr[10] = "";
     char SymbolSizeStr[10] = "";
 
-    if (OutputFormat == sysv || I->Address == UnknownAddressOrSize)
-      strcpy(SymbolAddrStr, "        ");
+    if (OutputFormat == sysv || I->Value == UnknownAddressOrSize)
+      strcpy(SymbolValueStr, "        ");
     if (OutputFormat == sysv)
       strcpy(SymbolSizeStr, "        ");
 
-    if (I->Address != UnknownAddressOrSize)
-      format("%08" PRIx64, I->Address)
-          .print(SymbolAddrStr, sizeof(SymbolAddrStr));
+    if (I->Value != UnknownAddressOrSize)
+      format("%08" PRIx64, I->Value)
+          .print(SymbolValueStr, sizeof(SymbolValueStr));
     if (I->Size != UnknownAddressOrSize)
       format("%08" PRIx64, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr));
 
     if (OutputFormat == posix) {
-      outs() << I->Name << " " << I->TypeChar << " " << SymbolAddrStr
+      outs() << I->Name << " " << I->TypeChar << " " << SymbolValueStr
              << SymbolSizeStr << "\n";
     } else if (OutputFormat == bsd) {
-      if (PrintAddress)
-        outs() << SymbolAddrStr << ' ';
+      if (PrintValue)
+        outs() << SymbolValueStr << ' ';
       if (PrintSize) {
         outs() << SymbolSizeStr;
         if (I->Size != UnknownAddressOrSize)
@@ -244,7 +244,7 @@ static void sortAndPrintSymbolList() {
       std::string PaddedName(I->Name);
       while (PaddedName.length() < 20)
         PaddedName += " ";
-      outs() << PaddedName << "|" << SymbolAddrStr << "|   " << I->TypeChar
+      outs() << PaddedName << "|" << SymbolValueStr << "|   " << I->TypeChar
              << "  |                  |" << SymbolSizeStr << "|     |\n";
     }
   }
@@ -490,14 +490,14 @@ static void dumpSymbolNamesFromObject(Sy
     }
     NMSymbol S;
     S.Size = UnknownAddressOrSize;
-    S.Address = UnknownAddressOrSize;
+    S.Value = UnknownAddressOrSize;
     if ((PrintSize || SizeSort) && isa<ObjectFile>(Obj)) {
       symbol_iterator SymI = I;
       if (error(SymI->getSize(S.Size)))
         break;
     }
-    if (PrintAddress && isa<ObjectFile>(Obj))
-      if (error(symbol_iterator(I)->getAddress(S.Address)))
+    if (PrintValue && isa<ObjectFile>(Obj))
+      if (error(symbol_iterator(I)->getValue(S.Value)))
         break;
     S.TypeChar = getNMTypeChar(Obj, I);
     if (error(I->printName(OS)))
@@ -602,9 +602,9 @@ int main(int argc, char **argv) {
 
   // The relative order of these is important. If you pass --size-sort it should
   // only print out the size. However, if you pass -S --size-sort, it should
-  // print out both the size and address.
+  // print out both the size and values.
   if (SizeSort && !PrintSize)
-    PrintAddress = false;
+    PrintValue = false;
   if (OutputFormat == sysv || SizeSort)
     PrintSize = true;
 





More information about the llvm-commits mailing list