<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 18 January 2017 at 10:12, Jonathan Roelofs via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: jroelofs<br>
Date: Wed Jan 18 12:12:39 2017<br>
New Revision: 292418<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=292418&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=292418&view=rev</a><br>
Log:<br>
Revert r286788<br>
<br>
The Itanium ABI [1] specifies that __cxa_demangle accept either:<br>
<br>
   1) symbol names, which start with "_Z"<br>
   2) type manglings, which do not start with "_Z"<br>
<br>
r286788 erroneously assumes that it should only handle symbols, so this patch<br>
reverts it and adds a counterexample to the testcase.<br>
<br>
1: <a href="https://mentorembedded.github.io/cxx-abi/abi.html#demangler" rel="noreferrer" target="_blank">https://mentorembedded.github.<wbr>io/cxx-abi/abi.html#demangler</a></blockquote><div><br></div><div>Thanks! Just FYI, the ABI document now lives here: <a href="https://itanium-cxx-abi.github.io/cxx-abi/">https://itanium-cxx-abi.github.io/cxx-abi/</a></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Reviewers: zygoloid, EricWF<br>
<br>
Modified:<br>
    libcxxabi/trunk/src/cxa_<wbr>demangle.cpp<br>
    libcxxabi/trunk/test/test_<wbr>demangle.pass.cpp<br>
<br>
Modified: libcxxabi/trunk/src/cxa_<wbr>demangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=292418&r1=292417&r2=292418&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxxabi/trunk/src/<wbr>cxa_demangle.cpp?rev=292418&<wbr>r1=292417&r2=292418&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxxabi/trunk/src/cxa_<wbr>demangle.cpp (original)<br>
+++ libcxxabi/trunk/src/cxa_<wbr>demangle.cpp Wed Jan 18 12:12:39 2017<br>
@@ -4979,22 +4979,12 @@ __cxa_demangle(const char *mangled_name,<br>
         return nullptr;<br>
     }<br>
<br>
-    size_t len = std::strlen(mangled_name);<br>
-    if (len < 2 || strncmp(mangled_name, "_Z", 2))<br>
-    {<br>
-        if (len < 4 || strncmp(mangled_name, "___Z", 4))<br>
-        {<br>
-            if (status)<br>
-                *status = invalid_mangled_name;<br>
-            return nullptr;<br>
-        }<br>
-    }<br>
-<br>
     size_t internal_size = buf != nullptr ? *n : 0;<br>
     arena<bs> a;<br>
     Db db(a);<br>
     db.template_param.emplace_<wbr>back(a);<br>
     int internal_status = success;<br>
+    size_t len = std::strlen(mangled_name);<br>
     demangle(mangled_name, mangled_name + len, db,<br>
              internal_status);<br>
     if (internal_status == success && db.fix_forward_references &&<br>
<br>
Modified: libcxxabi/trunk/test/test_<wbr>demangle.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.pass.cpp?rev=292418&r1=292417&r2=292418&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxxabi/trunk/test/<wbr>test_demangle.pass.cpp?rev=<wbr>292418&r1=292417&r2=292418&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxxabi/trunk/test/test_<wbr>demangle.pass.cpp (original)<br>
+++ libcxxabi/trunk/test/test_<wbr>demangle.pass.cpp Wed Jan 18 12:12:39 2017<br>
@@ -29594,6 +29594,9 @@ const char* cases[][2] =<br>
     // NOTE: disable this test since it is a negative test case, you cannot demangle a non-mangled symbol<br>
     // {"\x6D", nullptr},      // This use to crash with ASAN<br>
     {"_ZTIU4_farrVKPi", "typeinfo for int* const volatile restrict _far"},<br>
+<br>
+    // mangled names can include type manglings too, which don't start with _Z:<br>
+    {"i", "int"},<br>
 };<br>
<br>
 const unsigned N = sizeof(cases) / sizeof(cases[0]);<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>