Merge "Print undemanglable symbols in vndk-vtable-dumper"
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user