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
nullptr); // this is very unlikely to happen)
if (Str) { // What we do here is to return MangledName when we cannot demangle it,
std::string DemangledString(Str); // assuming undemangable names are C symbols that don't need demangling.
free(Str); char *Str = abi::__cxa_demangle(MangledName.c_str(), nullptr, nullptr,
return DemangledString; nullptr);
} if (Str) {
return ""; std::string DemangledName(Str);
free(Str);
return DemangledName;
}
return MangledName;
} }
@@ -299,13 +303,9 @@ 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()) { return true;
Vtablep->addVFunction(SymbolName.str(), DemangledName, RelOffset);
return true;
}
return false;
} }
template <typename ELFT> template <typename ELFT>
@@ -330,13 +330,9 @@ 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()) { return true;
Vtablep->addVFunction(SymbolName.str(), DemangledName, RelOffset);
return true;
}
return false;
} }
template <typename ELFT> template <typename ELFT>