<div dir="ltr">Thanks for the suggestion, David.<div><div>It's a step in the right direction, but it still doesn't quite work for me. The checks in Sema::AddAlignedAttr are performed when the alignment attribute is applied to a declaration, but not when a declared variable is implicitly aligned because it has an aligned type. My goal is to detect aligned variables.</div>



<div>For instance, consider the following code:</div><div><br></div><div>struct A { int x; };</div><div>struct __attribute__(( aligned (64) )) B { int y; };</div><div>template <typename T> struct __attribute__(( aligned (64) )) C { int z; void foo (T t) {} };</div>


<div>A a;</div><div>A al_a __attribute__(( aligned (64) ));</div>
<div>B b;</div><div>C<long> c;</div><div><br></div><div>If the checks are performed in Sema::AddAlignedAttr, they will flag the definition of "struct B" and the template "struct C", plus the explicitly aligned variable "al_a", but they will not flag the definition of either variable "b" or "c".</div>


<div>So it's performing the check for templates too, which is great, but only when the type is defined, not when a variable is defined.</div><div><div><br></div><div>For the check I actually want to perform, things are even more complex as I need to flag "over-aligned" variables only in some cases (I need to check some other properties of the variable). In my use case having an "over-aligned" type is allowed provided that no "problematic" variables are defined using it. </div>



<div>So I need the check to be performed on the variable, not on the attribute (which is why I was doing the check in Sema::ActOnVariableDeclarator).</div><div><br></div><div>Cheers,<br></div><div>    Dario Domizioli</div>


<div>    SN Systems - Sony Computer Entertainment Group</div><div><br></div><div>
<br></div><div><br></div><div><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On 4 January 2014 21:20, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</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">We perform similar alignment checks in 'Sema::AddAlignedAttr' like ensuring that the number is a power-of-two and less than 8192. <div>



If I understand you correctly, you would want to add your checks there.<br>
</div></div><div class="gmail_extra"><br><br><div class="gmail_quote"><div><div>On Fri, Jan 3, 2014 at 9:58 AM, Dario Domizioli <span dir="ltr"><<a href="mailto:dario.domizioli@gmail.com" target="_blank">dario.domizioli@gmail.com</a>></span> wrote:<br>




</div></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><div><div dir="ltr">Hello again, cfe-dev.<br>


<div><br></div><div>I'm back from holidays and I'm looking at this again.</div>

<div>I'm also having trouble performing the checks at CodeGen time since there are many places where variables are emitted; but still it feels wrong to perform checks during CodeGen.</div>
<div><br></div><div>Any ideas where it would be best to perform alignment checks?</div><div><div><div>Thanks,</div><div>    Dario Domizioli</div><div>    SN Systems - Sony Computer Entertainment Group</div></div>
<div><br></div>
<div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On 18 December 2013 12:05, Dario Domizioli <span dir="ltr"><<a href="mailto:dario.domizioli@gmail.com" target="_blank">dario.domizioli@gmail.com</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>Hello cfe-dev.</div><div><br></div><div>


I am trying to perform additional checks on the alignment of C++ variables (outputting diagnostic messages if the checks trigger), and the place where it feels more natural to do so is in Sema::ActOnVariableDeclarator. There is already a check for under-alignment there (a call to Sema::CheckAlignasUnderalignment) so I thought I was on the right track.</div>






<div>However I am finding that my checks don't trigger when the variable being declared/defined is a template instantiation.</div><div><br></div><div>Suppose for the sake of example that I wanted to add a check that warns if the alignment exceeds a certain number of CharUnits, say 32. If I put the check in ActOnVariableDeclarator right after the under-alignment check, it does catch this case:</div>






<div><br></div><div>struct __attribute__(( aligned(64) )) my_aligned { int x; }</div><div>// ...</div><div>my_aligned my_variable; // Diagnostic here</div><div><br></div><div>However it does not catch this case:</div><div>






<br></div><div>template <typename T> class __attribute__(( aligned(64) )) my_aligned_template {</div><div>    int x;</div><div>    void foo (T param) { /* some code */ }</div><div>}</div><div>// ...</div><div>my_aligned_template<float> my_variable; // No diagnostic here, but the IR has the right alignment (64)</div>






<div><br></div><div>I am using ASTContext::getDeclAlign to get the alignment of the variable in the declaration, as the documentation says that it returns a conservative alignment for the variable, and it's actually the same function used at CodeGen time to determine the alignment.</div>






<div>However I seem to understand that at that point (when ActOnVariableDeclarator runs) the template instantiation hasn't been processed yet and therefore the type of the variable is still a dependent type (despite the fact that the layout of my_aligned_template does not in fact depend on T, but I accept that in the general case it can do). This means that the alignment is unknown at that stage and I can't really check it.</div>






<div>In fact, I have noticed that Sema::CheckAlignasUnderalignment (which is my reference for implementing the checks) also skips dependent and incomplete types.</div><div><br></div><div>Of course when ASTContext::getDeclAlign is used later on in CodeGen everything is known about variables and their types, so I could move my checks there, but it would feel wrong to do the checks while IR is being generated, I think Sema should be the right place to perform semantic checks.</div>






<div><br></div><div>Can anyone point me in the right direction? Is there a more sensible place than ActOnVariableDeclarator where I can put my additional alignment checks?</div><div><br></div><div>Thanks,</div><div>    Dario Domizioli</div>






<div>    SN Systems - Sony Computer Entertainment Group</div></div>
</blockquote></div><br></div>
</div></div><br></div></div>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div></div></div></div>