summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-07-01 11:20:56 +0000
committerAlexey Samsonov <samsonov@google.com>2013-07-01 11:20:56 +0000
commit7ef67083ecf12c9b83dffd91eac0b3c739fa7a89 (patch)
tree09f3e6f63362331ea095b93c1076102660d4d23f /lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc
parentf21e025112d5f82b2b475eb1d8e690824883fc97 (diff)
downloadcompiler-rt-7ef67083ecf12c9b83dffd91eac0b3c739fa7a89.tar.gz
compiler-rt-7ef67083ecf12c9b83dffd91eac0b3c739fa7a89.tar.bz2
compiler-rt-7ef67083ecf12c9b83dffd91eac0b3c739fa7a89.tar.xz
Change __sanitizer_symbolize_demangle hook return type to 'int'
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@185326 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc')
-rw-r--r--lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc20
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc b/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc
index 2588dd19..4f0b2ab2 100644
--- a/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc
+++ b/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc
@@ -191,8 +191,8 @@ bool __sanitizer_symbolize_data(const char *ModuleName, u64 ModuleOffset,
SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
void __sanitizer_symbolize_flush();
SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
-void __sanitizer_symbolize_demangle(const char *Name, char *Buffer,
- int MaxLength);
+int __sanitizer_symbolize_demangle(const char *Name, char *Buffer,
+ int MaxLength);
} // extern "C"
class InternalSymbolizer {
@@ -223,10 +223,18 @@ class InternalSymbolizer {
const char *Demangle(const char *name) {
if (__sanitizer_symbolize_demangle) {
- char *res = static_cast<char*>(InternalAlloc(kMaxDemangledNameSize));
- internal_memset(res, 0, kMaxDemangledNameSize);
- __sanitizer_symbolize_demangle(name, res, kMaxDemangledNameSize);
- return res;
+ for (uptr res_length = 1024;
+ res_length <= InternalSizeClassMap::kMaxSize;) {
+ char *res_buff = static_cast<char*>(InternalAlloc(res_length));
+ uptr req_length =
+ __sanitizer_symbolize_demangle(name, res_buff, res_length);
+ if (req_length > res_length) {
+ res_length = req_length + 1;
+ InternalFree(res_buff);
+ continue;
+ }
+ return res_buff;
+ }
}
return name;
}