<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Apr 2, 2019 at 8:55 AM Jason MacDonald via libcxx-dev <<a href="mailto:libcxx-dev@lists.llvm.org">libcxx-dev@lists.llvm.org</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 lang="EN-US">
<div class="gmail-m_-1713898647314262823WordSection1">
<p class="MsoNormal">Hello all,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">First, apologizes if this is the wrong mailing list for this discussion.</p></div></div></blockquote><div><br></div><div>This is not a terrible place.</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"><div lang="EN-US"><div class="gmail-m_-1713898647314262823WordSection1"><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> I am using the TI 18.1.5 compiler to compile for the TM4C1294NCPDT chip. A longer/better explanation of my problems might be obtained from the TI forums of my issue, which didn’t gain traction:
<a href="https://e2e.ti.com/support/tools/ccs/f/81/t/787948" target="_blank">https://e2e.ti.com/support/tools/ccs/f/81/t/787948</a></p><p class="MsoNormal"><u></u></p>
<p class="MsoNormal">So I am trying to go upstream for more discussion.<u></u><u></u></p>
<p class="MsoNormal"><u></u>  </p><p class="MsoNormal"><u></u></p>
<p class="MsoNormal">Summary of my problem: Using deque::push_back on structures over 64 bytes will cause a crash.<u></u><u></u></p>
<p class="MsoNormal">Example code:<u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">#include <deque>
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">struct</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)">
</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">s {
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">    char</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)">
</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">d[65];
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">};
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">int</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)">
</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">main()
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">{
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">    int</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)">
</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">size = sizeof(s);
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">    
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">    std::deque<s> test;
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">    test.push_back(s());
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">    test.push_back(s()); // will crash here
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">    while</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)">
</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">(1){}
</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(85,85,85)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">}</span></p></div></div></blockquote><div><br></div><div>I tried this on my desktop, and it did not crash.</div><div>I also turned on address sanitizer to see if there might be an out-of-bounds read or write, but it didn't report any.</div><div><br></div><div>I tried your second program (again, on my desktop), and added some printf statements, and I got:</div><div><br></div><div>back_spare  cap<br></div><div><div>61  62</div><div>61  62</div><div>62  62</div><div>62  62</div></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"><div lang="EN-US"><div class="gmail-m_-1713898647314262823WordSection1"><p class="MsoNormal">TI’s implementation of the struct __deque_block_size allows a minimum size of 1. Not sure if this should cause a problem or not.<u></u><u></u></p>
<p class="MsoNormal">TI:<u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New"">template <class _ValueType, class _DiffType><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New"">struct __deque_block_size {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New"">  enum __attribute__((__packed__)) { _MAX_BYTES = 32 * sizeof(void*) };<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New"">  static const _DiffType value = sizeof(_ValueType) < _MAX_BYTES ? (_MAX_BYTES / sizeof(_ValueType)) : 1;<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New"">};</span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">So, is this a problem in LLVM’s __add_back_capacity() or TI’s block_size?</p></div></div></blockquote><div><div><br></div><div>I'm suspecting TI's block_size. </div><br class="gmail-Apple-interchange-newline"></div><div>here's the one from trunk:</div><div> </div><div><div>template <class _ValueType, class _DiffType></div><div>struct __deque_block_size {</div><div>  static const _DiffType value = sizeof(_ValueType) < 256 ? 4096 / sizeof(_ValueType) : 16;</div><div>};</div></div><div><br></div><div>Note that it never is smaller than 16.</div><div><br></div><div>-- Marshall</div><div><br></div></div></div></div></div></div>