[llvm] r205493 - Revert "Fix a nomenclature error in llvm-nm."
Rafael Espindola
rafael.espindola at gmail.com
Wed Apr 2 17:19:35 PDT 2014
Author: rafael
Date: Wed Apr 2 19:19:35 2014
New Revision: 205493
URL: http://llvm.org/viewvc/llvm-project?rev=205493&view=rev
Log:
Revert "Fix a nomenclature error in llvm-nm."
This reverts commit r205479.
It turns out that nm does use addresses, it is just that every reasonable
relocatable ELF object has sections with address 0. I have no idea if those
exist in reality, but it at least it shows that llvm-nm should use the name
address.
The added test was includes an unusual .o file with non 0 section addresses. I
created it by hacking ELFObjectWriter.cpp.
Really sorry for the churn.
Added:
llvm/trunk/test/Object/Inputs/relocatable-with-section-address.elf-x86-64
Modified:
llvm/trunk/include/llvm/Object/ELFObjectFile.h
llvm/trunk/lib/Object/COFFObjectFile.cpp
llvm/trunk/lib/Object/MachOObjectFile.cpp
llvm/trunk/test/Object/nm-trivial-object.test
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=205493&r1=205492&r2=205493&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Wed Apr 2 19:19:35 2014
@@ -417,15 +417,7 @@ template <class ELFT>
error_code ELFObjectFile<ELFT>::getSymbolValue(DataRefImpl Symb,
uint64_t &Val) const {
const Elf_Sym *ESym = getSymbol(Symb);
- switch (EF.getSymbolTableIndex(ESym)) {
- default:
- Val = ESym->st_value;
- break;
- case ELF::SHN_COMMON:
- case ELF::SHN_UNDEF:
- Val = UnknownAddressOrSize;
- break;
- }
+ Val = ESym->st_value;
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=205493&r1=205492&r2=205493&view=diff
==============================================================================
--- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/COFFObjectFile.cpp Wed Apr 2 19:19:35 2014
@@ -253,15 +253,8 @@ error_code COFFObjectFile::getSymbolSect
}
error_code COFFObjectFile::getSymbolValue(DataRefImpl Ref,
- 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;
+ uint64_t &Val) const {
+ report_fatal_error("getSymbolValue unimplemented in COFFObjectFile");
}
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=205493&r1=205492&r2=205493&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Wed Apr 2 19:19:35 2014
@@ -633,8 +633,7 @@ MachOObjectFile::getSymbolSection(DataRe
error_code MachOObjectFile::getSymbolValue(DataRefImpl Symb,
uint64_t &Val) const {
- // In MachO both relocatable and non-relocatable objects have addresses.
- return getSymbolAddress(Symb, Val);
+ report_fatal_error("getSymbolValue unimplemented in MachOObjectFile");
}
void MachOObjectFile::moveSectionNext(DataRefImpl &Sec) const {
Added: llvm/trunk/test/Object/Inputs/relocatable-with-section-address.elf-x86-64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/relocatable-with-section-address.elf-x86-64?rev=205493&view=auto
==============================================================================
Binary files llvm/trunk/test/Object/Inputs/relocatable-with-section-address.elf-x86-64 (added) and llvm/trunk/test/Object/Inputs/relocatable-with-section-address.elf-x86-64 Wed Apr 2 19:19:35 2014 differ
Modified: llvm/trunk/test/Object/nm-trivial-object.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-trivial-object.test?rev=205493&r1=205492&r2=205493&view=diff
==============================================================================
--- llvm/trunk/test/Object/nm-trivial-object.test (original)
+++ llvm/trunk/test/Object/nm-trivial-object.test Wed Apr 2 19:19:35 2014
@@ -16,6 +16,8 @@ RUN: llvm-nm %p/Inputs/trivial-object-te
RUN: | FileCheck %s -check-prefix macho64
RUN: llvm-nm %p/Inputs/common.coff-i386 \
RUN: | FileCheck %s -check-prefix COFF-COMMON
+RUN: llvm-nm %p/Inputs/relocatable-with-section-address.elf-x86-64 \
+RUN: | FileCheck %s -check-prefix ELF-SEC-ADDR
COFF: 00000000 d .data
COFF: 00000000 t .text
@@ -54,3 +56,11 @@ macho64: 00000028 s L_.str
macho64: 00000000 U _SomeOtherFunction
macho64: 00000000 T _main
macho64: 00000000 U _puts
+
+
+Test that nm uses addresses even with ELF .o files.
+ELF-SEC-ADDR: 00000058 D a
+ELF-SEC-ADDR-NEXT: 0000005c D b
+ELF-SEC-ADDR-NEXT: 00000040 T f
+ELF-SEC-ADDR-NEXT: 00000050 T g
+ELF-SEC-ADDR-NEXT: 00000060 D p
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=205493&r1=205492&r2=205493&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)
+++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Wed Apr 2 19:19:35 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 value"));
+cl::opt<bool> NumericSort("numeric-sort", cl::desc("Sort symbols by address"));
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 value"));
+ cl::desc("Show symbol size instead of address"));
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 PrintValue = true;
+bool PrintAddress = true;
bool MultipleFiles = false;
@@ -141,19 +141,19 @@ static bool error(error_code EC, Twine P
namespace {
struct NMSymbol {
- uint64_t Value;
+ uint64_t Address;
uint64_t Size;
char TypeChar;
StringRef Name;
};
}
-static bool compareSymbolValue(const NMSymbol &A, const NMSymbol &B) {
- if (A.Value < B.Value)
+static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) {
+ if (A.Address < B.Address)
return true;
- else if (A.Value == B.Value && A.Name < B.Name)
+ else if (A.Address == B.Address && A.Name < B.Name)
return true;
- else if (A.Value == B.Value && A.Name == B.Name && A.Size < B.Size)
+ else if (A.Address == B.Address && 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.Value < B.Value)
+ else if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address)
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.Value < B.Value)
+ else if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address)
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(), compareSymbolValue);
+ std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolAddress);
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 && !PrintValue && I->Size == UnknownAddressOrSize)
+ if (SizeSort && !PrintAddress && I->Size == UnknownAddressOrSize)
continue;
- char SymbolValueStr[10] = "";
+ char SymbolAddrStr[10] = "";
char SymbolSizeStr[10] = "";
- if (OutputFormat == sysv || I->Value == UnknownAddressOrSize)
- strcpy(SymbolValueStr, " ");
+ if (OutputFormat == sysv || I->Address == UnknownAddressOrSize)
+ strcpy(SymbolAddrStr, " ");
if (OutputFormat == sysv)
strcpy(SymbolSizeStr, " ");
- if (I->Value != UnknownAddressOrSize)
- format("%08" PRIx64, I->Value)
- .print(SymbolValueStr, sizeof(SymbolValueStr));
+ if (I->Address != UnknownAddressOrSize)
+ format("%08" PRIx64, I->Address)
+ .print(SymbolAddrStr, sizeof(SymbolAddrStr));
if (I->Size != UnknownAddressOrSize)
format("%08" PRIx64, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr));
if (OutputFormat == posix) {
- outs() << I->Name << " " << I->TypeChar << " " << SymbolValueStr
+ outs() << I->Name << " " << I->TypeChar << " " << SymbolAddrStr
<< SymbolSizeStr << "\n";
} else if (OutputFormat == bsd) {
- if (PrintValue)
- outs() << SymbolValueStr << ' ';
+ if (PrintAddress)
+ outs() << SymbolAddrStr << ' ';
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 << "|" << SymbolValueStr << "| " << I->TypeChar
+ outs() << PaddedName << "|" << SymbolAddrStr << "| " << I->TypeChar
<< " | |" << SymbolSizeStr << "| |\n";
}
}
@@ -490,14 +490,14 @@ static void dumpSymbolNamesFromObject(Sy
}
NMSymbol S;
S.Size = UnknownAddressOrSize;
- S.Value = UnknownAddressOrSize;
+ S.Address = UnknownAddressOrSize;
if ((PrintSize || SizeSort) && isa<ObjectFile>(Obj)) {
symbol_iterator SymI = I;
if (error(SymI->getSize(S.Size)))
break;
}
- if (PrintValue && isa<ObjectFile>(Obj))
- if (error(symbol_iterator(I)->getValue(S.Value)))
+ if (PrintAddress && isa<ObjectFile>(Obj))
+ if (error(symbol_iterator(I)->getAddress(S.Address)))
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 values.
+ // print out both the size and address.
if (SizeSort && !PrintSize)
- PrintValue = false;
+ PrintAddress = false;
if (OutputFormat == sysv || SizeSort)
PrintSize = true;
More information about the llvm-commits
mailing list