forked from OSchip/llvm-project
[lldb] Fix RichManglingContext::FromCxxMethodName() leak
`RichManglingContext::FromCxxMethodName` allocates a m_cxx_method_parser, but never deletes it. This fixes a `-DLLVM_USE_SANITIZER=Leaks` failure. Reviewed By: teemperor Differential Revision: https://reviews.llvm.org/D100795
This commit is contained in:
parent
62cdcd6c5a
commit
eb5e11f460
|
@ -29,7 +29,7 @@ public:
|
|||
m_ipd_buf[0] = '\0';
|
||||
}
|
||||
|
||||
~RichManglingContext() { std::free(m_ipd_buf); }
|
||||
~RichManglingContext();
|
||||
|
||||
/// Use the ItaniumPartialDemangler to obtain rich mangling information from
|
||||
/// the given mangled name.
|
||||
|
@ -77,6 +77,9 @@ private:
|
|||
|
||||
/// Members for ItaniumPartialDemangler
|
||||
llvm::ItaniumPartialDemangler m_ipd;
|
||||
/// Note: m_ipd_buf is a raw pointer due to being resized by realloc via
|
||||
/// ItaniumPartialDemangler. It should be managed with malloc/free, not
|
||||
/// new/delete.
|
||||
char *m_ipd_buf;
|
||||
size_t m_ipd_buf_size;
|
||||
|
||||
|
@ -86,6 +89,9 @@ private:
|
|||
/// dependency. Instead keep a llvm::Any and cast it on-access in the cpp.
|
||||
llvm::Any m_cxx_method_parser;
|
||||
|
||||
/// Clean up memory when using PluginCxxLanguage
|
||||
void ResetCxxMethodParser();
|
||||
|
||||
/// Clean up memory and set a new info provider for this instance.
|
||||
void ResetProvider(InfoProvider new_provider);
|
||||
|
||||
|
|
|
@ -19,7 +19,12 @@ using namespace lldb;
|
|||
using namespace lldb_private;
|
||||
|
||||
// RichManglingContext
|
||||
void RichManglingContext::ResetProvider(InfoProvider new_provider) {
|
||||
RichManglingContext::~RichManglingContext() {
|
||||
std::free(m_ipd_buf);
|
||||
ResetCxxMethodParser();
|
||||
}
|
||||
|
||||
void RichManglingContext::ResetCxxMethodParser() {
|
||||
// If we want to support parsers for other languages some day, we need a
|
||||
// switch here to delete the correct parser type.
|
||||
if (m_cxx_method_parser.hasValue()) {
|
||||
|
@ -27,6 +32,10 @@ void RichManglingContext::ResetProvider(InfoProvider new_provider) {
|
|||
delete get<CPlusPlusLanguage::MethodName>(m_cxx_method_parser);
|
||||
m_cxx_method_parser.reset();
|
||||
}
|
||||
}
|
||||
|
||||
void RichManglingContext::ResetProvider(InfoProvider new_provider) {
|
||||
ResetCxxMethodParser();
|
||||
|
||||
assert(new_provider != None && "Only reset to a valid provider");
|
||||
m_provider = new_provider;
|
||||
|
|
Loading…
Reference in New Issue