<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 4, 2016 at 12:26 AM, Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>On Tue, May 3, 2016 at 12:51 PM, Dmitry Polukhin 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-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">DmitryPolukhin added a comment.<br>
<br>
Richard, could you please share your counterexample so I could test it on my patch and GCC?<br></blockquote><div><br></div></span><div>Sure:</div><div><br></div><div>  struct __attribute__((abi_tag("X"))) Foo {};</div><div>  void __attribute__((abi_tag("X"))) f(Foo) {}</div><div><br></div><div>This should not generate an ABI tag for 'f', because there's one implied by the first parameter type. But as far as I can see, this patch doesn't look at the parameter types at all until after it's already streamed out the mangling for the function name.</div></div></div></div></blockquote><div><br></div><div>In this example ABI tag X is explicit tag for function 'f' so it must be always emitted. Moreover even implicit tag case handled correctly i.e. no implicit tag for function if the tag is already used in function parameters. Here is my example and both GCC and Clang with my patch gives identical mangling:</div><div><br></div><div>struct __attribute__((abi_tag("X"))) Foo {};<br></div><div><div><br></div><div>// _Z1fB1X3FooB1X pretty printed 'f[abi:X](Foo[abi:X])'</div><div>void __attribute__((abi_tag("X"))) f(Foo) {}</div><div><br></div><div>// _Z2f13FooB1X pretty printed 'f1(Foo[abi:X])'</div><div>Foo f1(Foo) {}</div></div><div><br></div><div>As for not looking for function arguments before emitting function name. Please take a look to makeAdditionalTagsForFunction that handles this case. It calls getTagsFromPrefixAndTemplateArguments also takes into account function parameters (it disables implicit tags from return type and mangles function declaration).</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>I think a reasonable way to deal with this is:<br></div><div><br></div><div>1) Collect the ABI tags for the overall entity. Whenever we subsequently emit an ABI tag (or emit an inline namespace and suppress emitting its ABI tags), remove that tag from our list of ABI tags for the overall entity (if it's there).</div><div>2) Mangle up to and including the name of the entity. If there are any ABI tags left for the entity, do subsequent mangling into a temporary buffer instead of directly into the output stream.</div><div>3) Mangle the rest of the declaration.</div><div>4) If there are any ABI tags left for the overall entity, and we have not already mangled the return type, then mangle it to a scratch buffer (which we'll throw away).</div><div>5) If we mangled to a temporary buffer, emit any remaining ABI tags now followed by the contents of the temporary buffer.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span>
As for separate pass, it was my first reaction on the original patch from Stefan but soon I realized that I'll have to copy parts of magnler to some simplified mangler but with high probability of forgetting something and with code duplication. So now I think approach which runs full mangler in special mode is better and less error prone.<br>
</span><div><div><br>
<br>
<a href="http://reviews.llvm.org/D18035" rel="noreferrer" target="_blank">http://reviews.llvm.org/D18035</a><br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">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/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br></div></div>
</blockquote></div><br></div></div>