[prev in list] [next in list] [prev in thread] [next in thread]
List: cfe-dev
Subject: Re: [cfe-dev] Fwd: Assertion failure when mangling complex decltype
From: Richard Smith via cfe-dev <cfe-dev () lists ! llvm ! org>
Date: 2019-01-28 17:26:08
Message-ID: CAOfiQqmmFyXourc6=9uri0849fmXFbaDSm+B3Dca+N_sQfGumw () mail ! gmail ! com
[Download RAW message or body]
[Attachment #2 (multipart/alternative)]
The mangler is only designed to produce mangled names for declarations that
have symbols. You cannot expect to be able to pass other declarations to it
and get a meaningful result back (or even for it to not crash).
If you want a unique identifier for an arbitrary declaration for some
reason, USRs may be a better fit.
On Mon, 28 Jan 2019, 05:28 Ding Fei via cfe-dev, <cfe-dev@lists.llvm.org>
wrote:
> Reproducible on TOT. Confirmed!
>
> Thanks!
>
> On Fri, Jan 25, 2019 at 10:10 AM Ding Fei <danix800@gmail.com> wrote:
>
>> Also found crashes on the snippet from
>> llvm/tools/yaml2obj/yaml2coff.cpp:305-314, simplified as:
>>
>> *template <typename value_type>*
>> *struct binary_le_impl {*
>> * value_type Value;*
>> *};*
>>
>> *template <typename value_type>*
>> *void op_left_shift(const binary_le_impl<value_type> &BLE) {*
>> * char Buffer[sizeof(BLE.Value)];*
>> *}*
>>
>>
>> when mangling local *Buffer*.
>>
>> Thanks!
>>
>> On Fri, Jan 25, 2019 at 9:39 AM Ding Fei <danix800@gmail.com> wrote:
>>
>>> Sorry I didn't make it clear enough.
>>>
>>> We are developing set of clang-tidy rules for code checking, one of
>>> which tries to mangle
>>> every var declared and dump mangled names out for further analysis.
>>>
>>> Usually this is not required for entities within function definition but
>>> they are well defined
>>> according Itanium C++ ABI
>>> <http://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling> *[5.1.7]
>>> Scope Encoding*. So we mangled every local vars too
>>> the check matcher sees.
>>>
>>> Our code is based on release_70 [llvm + clang + clang-tools-extra]
>>>
>>> The possible check prototype might look like:
>>>
>>> *void Check_XXX::registerMatchers(ast_matchers::MatchFinder *Finder) {*
>>> * using namespace ast_matchers;*
>>> * Finder->addMatcher(varDecl(unless(parmVarDecl())).bind("V"), this);*
>>> *}*
>>>
>>> *void Check_XXX::check(const ast_matchers::MatchFinder::MatchResult
>>> &Result) {*
>>> * auto &MangleCtx = getMangleCtx(); // an ItaniumMangleContext*
>>> * auto *V = Result.Nodes.getNodeAs<VarDecl>("V");*
>>>
>>> * if (!V || !MangleCtx.shouldMangleCXXName(V)) {*
>>>
>>> * return;*
>>>
>>> * }*
>>>
>>> * SmallString<64> Buffer;*
>>> * llvm::raw_svector_ostream Stream(Buffer);*
>>> * MangleCtx.MangleCXXName(V, Stream);*
>>> * llvm::outs() << "Mangled var: " << Buffer.str() << "\n";*
>>> *}*
>>>
>>>
>>> The example code that triggers the assertion (sampled from
>>> *llvm/lib/Analysis/LazyCallGraph.cpp:1557-1564*):
>>>
>>> *#include <type_traits>*
>>>
>>> *class Node {};*
>>>
>>> *template<typename GetBeginT>*
>>> *void buildGenericSCCs(GetBeginT &&GetBegin) {*
>>> * decltype(GetBegin(std::declval<Node &>())) DFSStack;*
>>> *}*
>>>
>>>
>>> The assertion triggered is
>>>
>>> *tools/clang/lib/AST/ItaniumMangle.cpp:4317: void (anonymous
>>> namespace)::*
>>> *CXXNameMangler::**mangleFunctionParam(const clang::ParmVarDecl *):*
>>> *Assertion `parmDepth < FunctionTypeDepth.getDepth()' failed.*
>>>
>>>
>>> Hope those info is enough for you, thanks!
>>>
>>> On Fri, Jan 25, 2019 at 2:07 AM Erik Pilkington <
>>> erik.pilkington@gmail.com> wrote:
>>>
>>>> Wait, why are we trying to mangle the local var decl here? Doesn't seem
>>>> to repro on TOT for me, can you provide a backtrace/preprocessed source/a
>>>> clang invocation for this?
>>>>
>>>> Erik
>>>>
>>>> On 1/24/19 3:22 AM, Ding Fei via cfe-dev wrote:
>>>>
>>>> Hi all,
>>>>
>>>> On release_70, for the example code:
>>>>
>>>> *#include <type_traits>*
>>>> *class Node {};*
>>>>
>>>> *template<typename GetBeginT> *
>>>> *void buildGenericSCCs(GetBeginT &&GetBegin) { *
>>>> * decltype(GetBegin(std::declval<Node &>())) DFSStack; *
>>>> *} *
>>>>
>>>> In Mangle.h when calling mangleCXXName() on VarDecl of DFSStack,
>>>> assertion triggered:
>>>>
>>>> *tools/clang/lib/AST/ItaniumMangle.cpp:4317: void (anonymous
>>>> namespace)::CXXNameMangler::mangleFunctionParam(const clang::ParmVarDecl
>>>> *): Assertion `parmDepth < FunctionTypeDepth.getDepth()' failed.*
>>>>
>>>> Do anyone have any ideas on the cause of it? Thanks
>>>> --
>>>> Best Regards
>>>>
>>>> Ding Fei
>>>> E-mail: danix800@gmail.com
>>>>
>>>> _______________________________________________
>>>> cfe-dev mailing listcfe-dev@lists.llvm.orghttps://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>>
>>>>
>>>>
>>>
>>> --
>>> Best Regards
>>>
>>> Ding Fei
>>> E-mail: danix800@gmail.com
>>>
>>
>>
>> --
>> Best Regards
>>
>> Ding Fei
>> E-mail: danix800@gmail.com
>>
>
>
> --
> Best Regards
>
> Ding Fei
> E-mail: danix800@gmail.com
>
>
> --
> Best Regards
>
> Ding Fei
> E-mail: danix800@gmail.com
> _______________________________________________
> cfe-dev mailing list
> cfe-dev@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
[Attachment #5 (text/html)]
<div dir="auto"><div>The mangler is only designed to produce mangled names for \
declarations that have symbols. You cannot expect to be able to pass other \
declarations to it and get a meaningful result back (or even for it to not \
crash).<div dir="auto"><br></div><div dir="auto">If you want a unique identifier for \
an arbitrary declaration for some reason, USRs may be a better fit.</div><br><br><div \
class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 28 Jan 2019, 05:28 Ding \
Fei via cfe-dev, <<a \
href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> \
wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 \
.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div \
class="gmail_quote"><div dir="ltr">Reproducible on TOT. \
Confirmed!<div><br></div><div>Thanks!</div></div><br><div class="gmail_quote"><div \
dir="ltr" class="m_4045713076921883239m_-5760086726204221299gmail_attr">On Fri, Jan \
25, 2019 at 10:10 AM Ding Fei <<a href="mailto:danix800@gmail.com" target="_blank" \
rel="noreferrer">danix800@gmail.com</a>> wrote:<br></div><blockquote \
class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid \
rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Also found crashes \
on the snippet from llvm/tools/yaml2obj/yaml2coff.cpp:305-314, simplified \
as:<div><div><br></div></div></div><blockquote style="margin:0px 0px 0px \
40px;border:none;padding:0px"><div><div><div><b>template <typename \
value_type></b></div></div></div><div><div><div><b>struct binary_le_impl \
{</b></div></div></div><div><div><div><b> value_type \
Value;</b></div></div></div><div><div><div><b>};</b></div></div></div><div><div><div><b><br></b></div></div></div><div><div><div><b>template \
<typename value_type></b></div></div></div><div><div><div><b>void \
op_left_shift(const binary_le_impl<value_type> &BLE) \
{</b></div></div></div><div><div><div><b> char \
Buffer[sizeof(BLE.Value)];</b></div></div></div><div><div><div><b>}</b></div></div></div></blockquote><div \
dir="ltr"><div><br></div><div>when mangling local \
<i>Buffer</i>.</div><div><br></div><div>Thanks!</div></div></div><br><div \
class="gmail_quote"><div dir="ltr" \
class="m_4045713076921883239m_-5760086726204221299gmail-m_-3855851119047846886gmail_attr">On \
Fri, Jan 25, 2019 at 9:39 AM Ding Fei <<a href="mailto:danix800@gmail.com" \
target="_blank" rel="noreferrer">danix800@gmail.com</a>> \
wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px \
0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div \
dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div \
dir="ltr"><div dir="ltr"><div dir="ltr">Sorry I didn't make it clear \
enough.<div><br></div><div>We are developing set of clang-tidy rules for code \
checking, one of which tries to mangle</div><div>every var declared and dump mangled \
names out for further analysis.</div><div><br></div><div>Usually this is not required \
for entities within function definition but they are well defined</div><div>according \
<a href="http://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling" target="_blank" \
rel="noreferrer">Itanium C++ ABI</a> <i>[5.1.7] Scope Encoding</i>. So we mangled \
every local vars too</div><div>the check matcher sees.</div><div><br></div><div>Our \
code is based on release_70 [llvm + clang + \
clang-tools-extra]</div><div><br></div><div>The possible check prototype might look \
like:</div><div><br></div></div></div></div></div></div></div></div></div><blockquote \
style="margin:0px 0px 0px \
40px;border:none;padding:0px"><div><div><div><div><div><div><div><div><div><div><b>void \
Check_XXX::registerMatchers(ast_matchers::MatchFinder *Finder) \
{</b></div></div></div></div></div></div></div></div></div></div><div><div><div><div><div><div><div><div><div><b> \
using namespace ast_matchers;</b></div></div></div></div></div></div></div></div></div><div><div><div><div><div><div><div><div><div><div><b> \
Finder->addMatcher(varDecl(unless(parmVarDecl())).bind("V"), \
this);</b></div></div></div></div></div></div></div></div></div></div><div><div><div>< \
div><div><div><div><div><div><b>}</b></div></div></div></div></div></div></div></div>< \
/div><div><div><div><div><div><div><div><div><div><b><br></b></div></div></div></div>< \
/div></div></div></div></div><div><div><div><div><div><div><div><div><div><div><b>void \
Check_XXX::check(const ast_matchers::MatchFinder::MatchResult &Result) \
{</b></div></div></div></div></div></div></div></div></div></div><div><div><div><div><div><div><div><div><div><b> \
auto &MangleCtx = getMangleCtx(); // an \
ItaniumMangleContext</b></div></div></div></div></div></div></div></div></div><div><div><div><div><div><div><div><div><div><b> \
auto *V = Result.Nodes.getNodeAs<VarDecl>("V");</b></div></div></div>< \
/div></div></div></div></div></div><div><b><br></b></div><div><div><div><div><div><div><div><div><div><b> \
if (!V || !MangleCtx.shouldMangleCXXName(V)) \
{</b></div></div></div></div></div></div></div></div></div></blockquote><blockquote \
style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><b> \
return;</b></div></blockquote><blockquote style="margin:0px 0px 0px \
40px;border:none;padding:0px"><div><b> \
}</b></div><div><b><br></b></div><div><div><div><div><div><div><div><div><div><b> \
SmallString<64> \
Buffer;</b></div></div></div></div></div></div></div></div></div><div><div><div><div><div><div><div><div><div><b> \
llvm::raw_svector_ostream \
Stream(Buffer);</b></div></div></div></div></div></div></div></div></div><div><div><div><div><div><div><div><div><div><b> \
MangleCtx.MangleCXXName(V, \
Stream);</b></div></div></div></div></div></div></div></div></div><div><div><div><div><div><div><div><div><div><b> \
llvm::outs() << "Mangled var: " << Buffer.str() << \
"\n";</b></div></div></div></div></div></div></div></div></div><div><div><di \
v><div><div><div><div><div><div><b>}</b></div></div></div></div></div></div></div></div></div></blockquote><div \
dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div \
dir="ltr"><div dir="ltr"><div dir="ltr"><div><br></div><div>The example code that \
triggers the assertion (sampled from \
<b>llvm/lib/Analysis/LazyCallGraph.cpp:1557-1564</b>):</div><div><br></div><blockquote \
style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><b>#include \
<type_traits></b></div><div><b><br></b></div><div><b>class Node \
{};</b></div><div><b><br></b></div><div><b>template<typename \
GetBeginT></b></div><div><b>void buildGenericSCCs(GetBeginT &&GetBegin) \
{</b></div><div><b> decltype(GetBegin(std::declval<Node &>())) \
DFSStack;</b></div><div><b>}</b></div></blockquote><div><br></div><div>The assertion \
triggered is</div><div><br></div></div></div></div></div></div></div></div></div><blockquote \
style="margin:0px 0px 0px \
40px;border:none;padding:0px"><div><div><div><div><div><div><div><div><div><b>tools/clang/lib/AST/ItaniumMangle.cpp:4317: \
void (anonymous namespace)::</b></div></div></div></div></div></div></div></div></div> \
<div><div><div><div><div><div><div><div><div><b>CXXNameMangler::</b><b>mangleFunctionParam(const \
clang::ParmVarDecl *):</b></div><div><b>Assertion `parmDepth < \
FunctionTypeDepth.getDepth()' \
failed.</b></div></div></div></div></div></div></div></div></div></blockquote><div \
dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div \
dir="ltr"><div dir="ltr"><div dir="ltr"><div><br></div><div>Hope those info is enough \
for you, thanks!</div></div></div></div></div></div></div></div></div></div><br><div \
class="gmail_quote"><div dir="ltr" \
class="m_4045713076921883239m_-5760086726204221299gmail-m_-3855851119047846886gmail-m_1834665693723466420gmail_attr">On \
Fri, Jan 25, 2019 at 2:07 AM Erik Pilkington <<a \
href="mailto:erik.pilkington@gmail.com" target="_blank" \
rel="noreferrer">erik.pilkington@gmail.com</a>> wrote:<br></div><blockquote \
class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid \
rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF">
Wait, why are we trying to mangle the local var decl here? Doesn't
seem to repro on TOT for me, can you provide a
backtrace/preprocessed source/a clang invocation for this?<br>
<br>
Erik<br>
<br>
<div class="m_4045713076921883239m_-5760086726204221299gmail-m_-3855851119047846886gmail-m_1834665693723466420gmail-m_7259464656414262120moz-cite-prefix">On \
1/24/19 3:22 AM, Ding Fei via cfe-dev wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hi all,<br>
<br>
On release_70, for the example code:<br>
<b><br>
</b>
<blockquote style="margin:0px 0px 0px \
40px;border:none;padding:0px"><b>#include <type_traits></b><b><br>
</b><b>class Node {};</b><b><br>
</b><b>template<typename GetBeginT><br>
</b><b>void buildGenericSCCs(GetBeginT &&GetBegin) {<br>
</b><b> decltype(GetBegin(std::declval<Node &>()))
DFSStack;<br>
</b><b>}<br>
</b><br>
</blockquote>
In Mangle.h when calling mangleCXXName() on VarDecl of DFSStack,
assertion triggered:<br>
<br>
<b>tools/clang/lib/AST/ItaniumMangle.cpp:4317: void (anonymous
namespace)::CXXNameMangler::mangleFunctionParam(const
clang::ParmVarDecl *): Assertion `parmDepth <
FunctionTypeDepth.getDepth()' failed.</b>
<div><b><br>
</b>Do anyone have any ideas on the cause of it? Thanks<br>
--<br>
Best Regards<br>
<br>
Ding Fei<br>
E-mail: <a href="mailto:danix800@gmail.com" target="_blank" \
rel="noreferrer">danix800@gmail.com</a></div> </div>
<br>
<fieldset class="m_4045713076921883239m_-5760086726204221299gmail-m_-38558511190 \
47846886gmail-m_1834665693723466420gmail-m_7259464656414262120mimeAttachmentHeader"></fieldset>
<pre class="m_4045713076921883239m_-5760086726204221299gmail-m_-3855851119047846886g \
mail-m_1834665693723466420gmail-m_7259464656414262120moz-quote-pre">_______________________________________________
cfe-dev mailing list
<a class="m_4045713076921883239m_-5760086726204221299gmail-m_-3855851119047846886gmail-m_1834665693723466420gmail-m_7259464656414262120moz-txt-link-abbreviated" \
href="mailto:cfe-dev@lists.llvm.org" target="_blank" \
rel="noreferrer">cfe-dev@lists.llvm.org</a> <a \
class="m_4045713076921883239m_-5760086726204221299gmail-m_-3855851119047846886gmail-m_1834665693723466420gmail-m_7259464656414262120moz-txt-link-freetext" \
href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank" \
rel="noreferrer">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a> </pre>
</blockquote>
<br>
</div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" \
class="m_4045713076921883239m_-5760086726204221299gmail-m_-3855851119047846886gmail-m_1834665693723466420gmail_signature">Best \
Regards<br> <br>Ding Fei<br>E-mail: <a href="mailto:danix800@gmail.com" \
target="_blank" rel="noreferrer">danix800@gmail.com</a></div> </blockquote></div><br \
clear="all"><div><br></div>-- <br><div dir="ltr" \
class="m_4045713076921883239m_-5760086726204221299gmail-m_-3855851119047846886gmail_signature">Best \
Regards<br> <br>Ding Fei<br>E-mail: <a href="mailto:danix800@gmail.com" \
target="_blank" rel="noreferrer">danix800@gmail.com</a></div> </blockquote></div><br \
clear="all"><div><br></div>-- <br><div dir="ltr" \
class="m_4045713076921883239m_-5760086726204221299gmail_signature">Best Regards<br> \
<br>Ding Fei<br>E-mail: <a href="mailto:danix800@gmail.com" target="_blank" \
rel="noreferrer">danix800@gmail.com</a></div> </div><br clear="all"><div><br></div>-- \
<br><div dir="ltr" class="m_4045713076921883239gmail_signature" \
data-smartmail="gmail_signature">Best Regards<br> <br>Ding Fei<br>E-mail: <a \
href="mailto:danix800@gmail.com" target="_blank" \
rel="noreferrer">danix800@gmail.com</a></div></div> \
_______________________________________________<br> cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank" \
rel="noreferrer">cfe-dev@lists.llvm.org</a><br> <a \
href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer \
noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div></div>
[Attachment #6 (text/plain)]
_______________________________________________
cfe-dev mailing list
cfe-dev@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic