Merge "Print undemanglable symbols in vndk-vtable-dumper"

This commit is contained in:
Treehugger Robot
2018-08-03 06:18:55 +00:00
committed by Gerrit Code Review

View File

@@ -53,17 +53,21 @@ using llvm::Error;
using llvm::make_unique; using llvm::make_unique;
static std::string demangle(const std::string &MangledName) { static std::string demangle(const std::string &MangledName) {
char *Str = __cxxabiv1::__cxa_demangle( // If demangling result is NULL then MangledName may be __cxa_pure_virtual
MangledName.c_str(), // or __cxa_deleted_virtual or other C symbol names.
nullptr, // __cxa_pure_virtual indicates a pure virtual function and
0, // __cxa_deleted_virtual indicates a deleted virtual function. (though
// this is very unlikely to happen)
// What we do here is to return MangledName when we cannot demangle it,
// assuming undemangable names are C symbols that don't need demangling.
char *Str = abi::__cxa_demangle(MangledName.c_str(), nullptr, nullptr,
nullptr); nullptr);
if (Str) { if (Str) {
std::string DemangledString(Str); std::string DemangledName(Str);
free(Str); free(Str);
return DemangledString; return DemangledName;
} }
return ""; return MangledName;
} }
@@ -299,14 +303,10 @@ bool ELFSharedObject<ELFT>::absoluteRelocation(
} }
SymbolRef Symbol = *Symi; SymbolRef Symbol = *Symi;
uint64_t RelOffset = Relocation.getOffset(); uint64_t RelOffset = Relocation.getOffset();
StringRef SymbolName = UnWrap(Symbol.getName()); std::string SymbolName(UnWrap(Symbol.getName()).str());
std::string DemangledName = demangle(SymbolName.str()); Vtablep->addVFunction(SymbolName, demangle(SymbolName), RelOffset);
if (!DemangledName.empty()) {
Vtablep->addVFunction(SymbolName.str(), DemangledName, RelOffset);
return true; return true;
} }
return false;
}
template <typename ELFT> template <typename ELFT>
bool ELFSharedObject<ELFT>::relativeRelocation( bool ELFSharedObject<ELFT>::relativeRelocation(
@@ -330,14 +330,10 @@ bool ELFSharedObject<ELFT>::relativeRelocation(
return false; return false;
} }
SymbolRef Symbol = matchValueToSymbol(It->second, Vtablep); SymbolRef Symbol = matchValueToSymbol(It->second, Vtablep);
StringRef SymbolName = UnWrap(Symbol.getName()); std::string SymbolName(UnWrap(Symbol.getName()).str());
std::string DemangledName = demangle(SymbolName.str()); Vtablep->addVFunction(SymbolName, demangle(SymbolName), RelOffset);
if (!DemangledName.empty()) {
Vtablep->addVFunction(SymbolName.str(), DemangledName, RelOffset);
return true; return true;
} }
return false;
}
template <typename ELFT> template <typename ELFT>
SymbolRef ELFSharedObject<ELFT>::matchValueToSymbol( SymbolRef ELFSharedObject<ELFT>::matchValueToSymbol(