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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205479 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2014-04-02 22:52:46 +00:00
parent d7e2a48153
commit 5a61b72493
4 changed files with 47 additions and 31 deletions

View File

@@ -417,7 +417,15 @@ template <class ELFT>
error_code ELFObjectFile<ELFT>::getSymbolValue(DataRefImpl Symb, error_code ELFObjectFile<ELFT>::getSymbolValue(DataRefImpl Symb,
uint64_t &Val) const { uint64_t &Val) const {
const Elf_Sym *ESym = getSymbol(Symb); 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; return object_error::success;
} }

View File

@@ -253,8 +253,15 @@ error_code COFFObjectFile::getSymbolSection(DataRefImpl Ref,
} }
error_code COFFObjectFile::getSymbolValue(DataRefImpl Ref, error_code COFFObjectFile::getSymbolValue(DataRefImpl Ref,
uint64_t &Val) const { uint64_t &Result) const {
report_fatal_error("getSymbolValue unimplemented in COFFObjectFile"); 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 { void COFFObjectFile::moveSectionNext(DataRefImpl &Ref) const {

View File

@@ -633,7 +633,8 @@ MachOObjectFile::getSymbolSection(DataRefImpl Symb,
error_code MachOObjectFile::getSymbolValue(DataRefImpl Symb, error_code MachOObjectFile::getSymbolValue(DataRefImpl Symb,
uint64_t &Val) const { 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 { void MachOObjectFile::moveSectionNext(DataRefImpl &Sec) const {

View File

@@ -95,7 +95,7 @@ cl::opt<bool> DebugSyms("debug-syms",
cl::alias DebugSymsa("a", cl::desc("Alias for --debug-syms"), cl::alias DebugSymsa("a", cl::desc("Alias for --debug-syms"),
cl::aliasopt(DebugSyms)); 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::alias NumericSortn("n", cl::desc("Alias for --numeric-sort"),
cl::aliasopt(NumericSort)); cl::aliasopt(NumericSort));
cl::alias NumericSortv("v", cl::desc("Alias for --numeric-sort"), cl::alias NumericSortv("v", cl::desc("Alias for --numeric-sort"),
@@ -105,7 +105,7 @@ cl::opt<bool> NoSort("no-sort", cl::desc("Show symbols in order encountered"));
cl::alias NoSortp("p", cl::desc("Alias for --no-sort"), cl::aliasopt(NoSort)); cl::alias NoSortp("p", cl::desc("Alias for --no-sort"), cl::aliasopt(NoSort));
cl::opt<bool> PrintSize("print-size", 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::alias PrintSizeS("S", cl::desc("Alias for --print-size"),
cl::aliasopt(PrintSize)); cl::aliasopt(PrintSize));
@@ -117,7 +117,7 @@ cl::opt<bool> WithoutAliases("without-aliases", cl::Hidden,
cl::opt<bool> ArchiveMap("print-armap", cl::desc("Print the archive map")); cl::opt<bool> ArchiveMap("print-armap", cl::desc("Print the archive map"));
cl::alias ArchiveMaps("s", cl::desc("Alias for --print-armap"), cl::alias ArchiveMaps("s", cl::desc("Alias for --print-armap"),
cl::aliasopt(ArchiveMap)); cl::aliasopt(ArchiveMap));
bool PrintAddress = true; bool PrintValue = true;
bool MultipleFiles = false; bool MultipleFiles = false;
@@ -141,19 +141,19 @@ static bool error(error_code EC, Twine Path = Twine()) {
namespace { namespace {
struct NMSymbol { struct NMSymbol {
uint64_t Address; uint64_t Value;
uint64_t Size; uint64_t Size;
char TypeChar; char TypeChar;
StringRef Name; StringRef Name;
}; };
} }
static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) { static bool compareSymbolValue(const NMSymbol &A, const NMSymbol &B) {
if (A.Address < B.Address) if (A.Value < B.Value)
return true; return true;
else if (A.Address == B.Address && A.Name < B.Name) else if (A.Value == B.Value && A.Name < B.Name)
return true; 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; return true;
else else
return false; return false;
@@ -164,7 +164,7 @@ static bool compareSymbolSize(const NMSymbol &A, const NMSymbol &B) {
return true; return true;
else if (A.Size == B.Size && A.Name < B.Name) else if (A.Size == B.Size && A.Name < B.Name)
return true; 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; return true;
else else
return false; return false;
@@ -175,7 +175,7 @@ static bool compareSymbolName(const NMSymbol &A, const NMSymbol &B) {
return true; return true;
else if (A.Name == B.Name && A.Size < B.Size) else if (A.Name == B.Name && A.Size < B.Size)
return true; 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; return true;
else else
return false; return false;
@@ -188,7 +188,7 @@ static SymbolListT SymbolList;
static void sortAndPrintSymbolList() { static void sortAndPrintSymbolList() {
if (!NoSort) { if (!NoSort) {
if (NumericSort) if (NumericSort)
std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolAddress); std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolValue);
else if (SizeSort) else if (SizeSort)
std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolSize); std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolSize);
else else
@@ -211,29 +211,29 @@ static void sortAndPrintSymbolList() {
continue; continue;
if ((I->TypeChar == 'U') && DefinedOnly) if ((I->TypeChar == 'U') && DefinedOnly)
continue; continue;
if (SizeSort && !PrintAddress && I->Size == UnknownAddressOrSize) if (SizeSort && !PrintValue && I->Size == UnknownAddressOrSize)
continue; continue;
char SymbolAddrStr[10] = ""; char SymbolValueStr[10] = "";
char SymbolSizeStr[10] = ""; char SymbolSizeStr[10] = "";
if (OutputFormat == sysv || I->Address == UnknownAddressOrSize) if (OutputFormat == sysv || I->Value == UnknownAddressOrSize)
strcpy(SymbolAddrStr, " "); strcpy(SymbolValueStr, " ");
if (OutputFormat == sysv) if (OutputFormat == sysv)
strcpy(SymbolSizeStr, " "); strcpy(SymbolSizeStr, " ");
if (I->Address != UnknownAddressOrSize) if (I->Value != UnknownAddressOrSize)
format("%08" PRIx64, I->Address) format("%08" PRIx64, I->Value)
.print(SymbolAddrStr, sizeof(SymbolAddrStr)); .print(SymbolValueStr, sizeof(SymbolValueStr));
if (I->Size != UnknownAddressOrSize) if (I->Size != UnknownAddressOrSize)
format("%08" PRIx64, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr)); format("%08" PRIx64, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr));
if (OutputFormat == posix) { if (OutputFormat == posix) {
outs() << I->Name << " " << I->TypeChar << " " << SymbolAddrStr outs() << I->Name << " " << I->TypeChar << " " << SymbolValueStr
<< SymbolSizeStr << "\n"; << SymbolSizeStr << "\n";
} else if (OutputFormat == bsd) { } else if (OutputFormat == bsd) {
if (PrintAddress) if (PrintValue)
outs() << SymbolAddrStr << ' '; outs() << SymbolValueStr << ' ';
if (PrintSize) { if (PrintSize) {
outs() << SymbolSizeStr; outs() << SymbolSizeStr;
if (I->Size != UnknownAddressOrSize) if (I->Size != UnknownAddressOrSize)
@@ -244,7 +244,7 @@ static void sortAndPrintSymbolList() {
std::string PaddedName(I->Name); std::string PaddedName(I->Name);
while (PaddedName.length() < 20) while (PaddedName.length() < 20)
PaddedName += " "; PaddedName += " ";
outs() << PaddedName << "|" << SymbolAddrStr << "| " << I->TypeChar outs() << PaddedName << "|" << SymbolValueStr << "| " << I->TypeChar
<< " | |" << SymbolSizeStr << "| |\n"; << " | |" << SymbolSizeStr << "| |\n";
} }
} }
@@ -490,14 +490,14 @@ static void dumpSymbolNamesFromObject(SymbolicFile *Obj) {
} }
NMSymbol S; NMSymbol S;
S.Size = UnknownAddressOrSize; S.Size = UnknownAddressOrSize;
S.Address = UnknownAddressOrSize; S.Value = UnknownAddressOrSize;
if ((PrintSize || SizeSort) && isa<ObjectFile>(Obj)) { if ((PrintSize || SizeSort) && isa<ObjectFile>(Obj)) {
symbol_iterator SymI = I; symbol_iterator SymI = I;
if (error(SymI->getSize(S.Size))) if (error(SymI->getSize(S.Size)))
break; break;
} }
if (PrintAddress && isa<ObjectFile>(Obj)) if (PrintValue && isa<ObjectFile>(Obj))
if (error(symbol_iterator(I)->getAddress(S.Address))) if (error(symbol_iterator(I)->getValue(S.Value)))
break; break;
S.TypeChar = getNMTypeChar(Obj, I); S.TypeChar = getNMTypeChar(Obj, I);
if (error(I->printName(OS))) 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 // 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 // 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) if (SizeSort && !PrintSize)
PrintAddress = false; PrintValue = false;
if (OutputFormat == sysv || SizeSort) if (OutputFormat == sysv || SizeSort)
PrintSize = true; PrintSize = true;