summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-nm/llvm-nm.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-07-06 21:36:23 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-07-06 21:36:23 +0000
commit2d5d23d41d41a1c6a32d0d1c94efc843ca32fa35 (patch)
tree1f8736134d274053ab9cf399c54ad00a0ca4357a /llvm/tools/llvm-nm/llvm-nm.cpp
parent498fff661d9b762bdb883742c582a9fcaadfa443 (diff)
downloadbcm5719-llvm-2d5d23d41d41a1c6a32d0d1c94efc843ca32fa35.tar.gz
bcm5719-llvm-2d5d23d41d41a1c6a32d0d1c94efc843ca32fa35.zip
llvm-nm: treat weak undefined as undefined.
This matches the behavior of gnu ld. llvm-svn: 241512
Diffstat (limited to 'llvm/tools/llvm-nm/llvm-nm.cpp')
-rw-r--r--llvm/tools/llvm-nm/llvm-nm.cpp30
1 files changed, 18 insertions, 12 deletions
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp
index b750b5f755a..26be4f213f2 100644
--- a/llvm/tools/llvm-nm/llvm-nm.cpp
+++ b/llvm/tools/llvm-nm/llvm-nm.cpp
@@ -180,14 +180,16 @@ struct NMSymbol {
uint64_t Size;
char TypeChar;
StringRef Name;
- DataRefImpl Symb;
+ BasicSymbolRef Sym;
};
}
static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) {
- if (A.TypeChar == 'U' && B.TypeChar != 'U')
+ bool AUndefined = A.Sym.getFlags() & SymbolRef::SF_Undefined;
+ bool BUndefined = B.Sym.getFlags() & SymbolRef::SF_Undefined;
+ if (AUndefined && !BUndefined)
return true;
- if (A.TypeChar != 'U' && B.TypeChar == 'U')
+ if (!AUndefined && BUndefined)
return false;
if (A.Address < B.Address)
return true;
@@ -249,11 +251,12 @@ static void darwinPrintSymbol(MachOObjectFile *MachO, SymbolListT::iterator I,
uint16_t NDesc;
uint32_t NStrx;
uint64_t NValue;
+ DataRefImpl SymDRI = I->Sym.getRawDataRefImpl();
if (MachO->is64Bit()) {
H_64 = MachO->MachOObjectFile::getHeader64();
Filetype = H_64.filetype;
Flags = H_64.flags;
- STE_64 = MachO->getSymbol64TableEntry(I->Symb);
+ STE_64 = MachO->getSymbol64TableEntry(SymDRI);
NType = STE_64.n_type;
NSect = STE_64.n_sect;
NDesc = STE_64.n_desc;
@@ -263,7 +266,7 @@ static void darwinPrintSymbol(MachOObjectFile *MachO, SymbolListT::iterator I,
H = MachO->MachOObjectFile::getHeader();
Filetype = H.filetype;
Flags = H.flags;
- STE = MachO->getSymbolTableEntry(I->Symb);
+ STE = MachO->getSymbolTableEntry(SymDRI);
NType = STE.n_type;
NSect = STE.n_sect;
NDesc = STE.n_desc;
@@ -331,7 +334,7 @@ static void darwinPrintSymbol(MachOObjectFile *MachO, SymbolListT::iterator I,
break;
case MachO::N_SECT: {
section_iterator Sec = MachO->section_end();
- MachO->getSymbolSection(I->Symb, Sec);
+ MachO->getSymbolSection(I->Sym.getRawDataRefImpl(), Sec);
DataRefImpl Ref = Sec->getRawDataRefImpl();
StringRef SectionName;
MachO->getSectionName(Ref, SectionName);
@@ -390,7 +393,7 @@ static void darwinPrintSymbol(MachOObjectFile *MachO, SymbolListT::iterator I,
if ((NType & MachO::N_TYPE) == MachO::N_INDR) {
outs() << I->Name << " (for ";
StringRef IndirectName;
- if (MachO->getIndirectName(I->Symb, IndirectName))
+ if (MachO->getIndirectName(I->Sym.getRawDataRefImpl(), IndirectName))
outs() << "?)";
else
outs() << IndirectName << ")";
@@ -473,13 +476,14 @@ static void darwinPrintStab(MachOObjectFile *MachO, SymbolListT::iterator I) {
uint8_t NType;
uint8_t NSect;
uint16_t NDesc;
+ DataRefImpl SymDRI = I->Sym.getRawDataRefImpl();
if (MachO->is64Bit()) {
- STE_64 = MachO->getSymbol64TableEntry(I->Symb);
+ STE_64 = MachO->getSymbol64TableEntry(SymDRI);
NType = STE_64.n_type;
NSect = STE_64.n_sect;
NDesc = STE_64.n_desc;
} else {
- STE = MachO->getSymbolTableEntry(I->Symb);
+ STE = MachO->getSymbolTableEntry(SymDRI);
NType = STE.n_type;
NSect = STE.n_sect;
NDesc = STE.n_desc;
@@ -537,9 +541,11 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName,
for (SymbolListT::iterator I = SymbolList.begin(), E = SymbolList.end();
I != E; ++I) {
- if ((I->TypeChar != 'U') && UndefinedOnly)
+ uint32_t SymFlags = I->Sym.getFlags();
+ bool Undefined = SymFlags & SymbolRef::SF_Undefined;
+ if (!Undefined && UndefinedOnly)
continue;
- if ((I->TypeChar == 'U') && DefinedOnly)
+ if (Undefined && DefinedOnly)
continue;
if (SizeSort && !PrintAddress)
continue;
@@ -895,7 +901,7 @@ static void dumpSymbolNamesFromObject(SymbolicFile &Obj, bool printName,
if (error(Sym.printName(OS)))
break;
OS << '\0';
- S.Symb = Sym.getRawDataRefImpl();
+ S.Sym = Sym;
SymbolList.push_back(S);
}
OpenPOWER on IntegriCloud