<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 12, 2017 at 1:10 AM, Christian Dietrich <span dir="ltr"><<a href="mailto:dietrich@sra.uni-hannover.de" target="_blank">dietrich@sra.uni-hannover.de</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"><span class="gmail-">Christian Dietrich <<a href="mailto:dietrich@sra.uni-hannover.de">dietrich@sra.uni-hannover.de</a>> writes:<br>
<br>
> Sure, this would definitly be a better option. A quick look into the<br>
> RecursiveASTVisitor tells me that there are at least 76 for (...) loops.<br>
> So we have to add them.<br>
<br>
</span>Unluckily, there is no general approach to get the number of elements in<br>
an iterator_range, but calling std::distance, however:<br>
<br>
  addData(std::distance(S-><wbr>attrs().begin(), S->attrs.end()));<br>
<br>
is kind of ugly, so we better leave that to the implmentor of addData()<br>
by using a template matching iterator_range<> and simply give the child<br>
range to the Collector user:<br>
<br>
  addData(S->attrs());<br>
<br></blockquote><div>Decl::getAttrs() will return a reference to a SmallVector which can be queried for the size.  Decl::hasAttrs() needs to be checked before calling.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
In this case, the user of the collector can do more fancy things on this.<br>
<span class="gmail-"><br>
> Perhaps we can combine both, length-indicators and and<br>
> non-small-integers, by using llvm::hash on the <Decl::getKind()> values.<br>
> As the documentation says, we have to spent less than 20 cycles per<br>
> 32-bit value on this. By this, we avoid the magic numbers. I will start<br>
> on doing the changes to incorporate the length fields.<br>
<br>
</span>Wait a moment. When thinking of it, the number of children is not a<br>
node-local property, so it should be placed in a different category.<br>
Perhaps, we could do something similar to D40781[1]:<br>
<br>
class Collector {<br>
  code Local = [{}];<br>
  code CrossRef = [{}];<br>
<br>
  code CHash = !codeconcat(Local, CrossRef);<br>
}<br>
<br>
class Decl : Collector {<br>
   code Local = [{<br>
      addData(S->getKind());<br>
   }];<br>
<br>
   code CrossRef = [{<br>
      addData(S->attrs());<br>
   }];<br>
}<br>
<br>
However, D40782[2] has to land first in LLVM for this, since TableGen<br>
has no !codeconcat command at the moment. So for the moment, I will put<br>
it into Code = [{}];<br>
<br>
chris<br>
<br>
[1] <a href="https://reviews.llvm.org/D40781" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D40781</a><br>
[2] <a href="https://reviews.llvm.org/D40782" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D40782</a><br>
<div class="gmail-HOEnZb"><div class="gmail-h5">--<br>
Christian Dietrich, M.Sc. (Scientific Staff)<br>
Institute for Systems Engineering (Systems and Computerarchitecture)<br>
Leibniz Universität Hannover<br>
Appelstraße 4<br>
30167 Hannover, Germany<br>
<br>
Tel:    <a href="tel:%2B49%20511%20762-19737" value="+4951176219737">+49 511 762-19737</a><br>
Fax:    <a href="tel:%2B49%20511%20762-19733" value="+4951176219733">+49 511 762-19733</a><br>
eMail:  <a href="mailto:dietrich@sra.uni-hannover.de">dietrich@sra.uni-<wbr>hannover.de</a><br>
WWW:    <a href="https://www.sra.uni-hannover.de" rel="noreferrer" target="_blank">https://www.sra.uni-<wbr>hannover.de</a><br>
</div></div></blockquote></div><br></div></div>