aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Roelofs <jonathan@codesourcery.com>2017-01-18 18:12:39 +0000
committerJonathan Roelofs <jonathan@codesourcery.com>2017-01-18 18:12:39 +0000
commit8829e961e6e3946972a14a69d44eaf92826af22c (patch)
tree5ce9da84c90ac1e9d47a9874d84acb08c1bcc044
parentae5d7bb4f5a20e550ed204d71b633616731466a4 (diff)
downloadllvm-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.cpp12
-rw-r--r--libcxxabi/test/test_demangle.pass.cpp3
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]);