diff options
| author | Jonathan Roelofs <jonathan@codesourcery.com> | 2017-01-18 18:12:39 +0000 |
|---|---|---|
| committer | Jonathan Roelofs <jonathan@codesourcery.com> | 2017-01-18 18:12:39 +0000 |
| commit | 8829e961e6e3946972a14a69d44eaf92826af22c (patch) | |
| tree | 5ce9da84c90ac1e9d47a9874d84acb08c1bcc044 | |
| parent | ae5d7bb4f5a20e550ed204d71b633616731466a4 (diff) | |
| download | llvm-8829e961e6e3946972a14a69d44eaf92826af22c.zip llvm-8829e961e6e3946972a14a69d44eaf92826af22c.tar.gz llvm-8829e961e6e3946972a14a69d44eaf92826af22c.tar.bz2 | |
Revert r286788
The Itanium ABI [1] specifies that __cxa_demangle accept either:
1) symbol names, which start with "_Z"
2) type manglings, which do not start with "_Z"
r286788 erroneously assumes that it should only handle symbols, so this patch
reverts it and adds a counterexample to the testcase.
1: https://mentorembedded.github.io/cxx-abi/abi.html#demangler
Reviewers: zygoloid, EricWF
llvm-svn: 292418
| -rw-r--r-- | libcxxabi/src/cxa_demangle.cpp | 12 | ||||
| -rw-r--r-- | libcxxabi/test/test_demangle.pass.cpp | 3 |
2 files changed, 4 insertions, 11 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index ed43cb2..402ee0c03 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -4979,22 +4979,12 @@ __cxa_demangle(const char *mangled_name, char *buf, size_t *n, int *status) { return nullptr; } - size_t len = std::strlen(mangled_name); - if (len < 2 || strncmp(mangled_name, "_Z", 2)) - { - if (len < 4 || strncmp(mangled_name, "___Z", 4)) - { - if (status) - *status = invalid_mangled_name; - return nullptr; - } - } - size_t internal_size = buf != nullptr ? *n : 0; arena<bs> a; Db db(a); db.template_param.emplace_back(a); int internal_status = success; + size_t len = std::strlen(mangled_name); demangle(mangled_name, mangled_name + len, db, internal_status); if (internal_status == success && db.fix_forward_references && diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index af16b561eb..effe5c0 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29594,6 +29594,9 @@ const char* cases[][2] = // NOTE: disable this test since it is a negative test case, you cannot demangle a non-mangled symbol // {"\x6D", nullptr}, // This use to crash with ASAN {"_ZTIU4_farrVKPi", "typeinfo for int* const volatile restrict _far"}, + + // mangled names can include type manglings too, which don't start with _Z: + {"i", "int"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); |
