<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">> Does every target guarantee at least 4-byte alignment of stack/heap objects?</div><div dir="ltr"><br></div><div>The short answer is no, for example, check here: <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf">http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf</a></div><div>paragraph 6.2.8, point 1</div><div>There are "informal" rules though e.g., malloc is assumed to return at least 4-byte aligned pointers.</div><div><br></div><div>> I presume that compilers impose alignments anyway, but are they consistent enough to rely on?</div><div><br></div><div>It depends on what you mean "rely on". If you have less alignment from one compiler to another, your code won't compile because `static_assert`'s are going to fire [1]. So, you can rely on</div><div>that in the sense that you won't get a runtime error. However, the way I understand it, you can't rely on not even getting a compile error across compilers.</div><div><br></div><div>In practice, however, you'll almost never get an error because the alignments are for the most part consistent.</div><div><br></div><div>[1] Here's the actual place in the code: <a href="https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/ADT/PointerIntPair.h#L148">https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/ADT/PointerIntPair.h#L148</a></div><div>If you follow what this is based on (i.e. the traits), you eventually end up here for the default case: <a href="https://llvm.org/doxygen/PointerLikeTypeTraits_8h_source.html#l00056">https://llvm.org/doxygen/PointerLikeTypeTraits_8h_source.html#l00056</a></div><div><br></div><div>Best,</div><div>Stefanos</div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Στις Πέμ, 31 Δεκ 2020 στις 9:13 μ.μ., ο/η Paul C. Anagnostopoulos via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> έγραψε:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The bits are orthogonal, so I think an enum makes more sense. I take it from your response that you think a PointerIntPair is a fine thing to use.<br>
<br>
There are no alignment requirements on an X86, for example. I presume that compilers impose alignments anyway, but are they consistent enough to rely on?<br>
<br>
At 12/31/2020 01:51 PM, Craig Topper wrote:<br>
>A PointerIntPair can be placed in the pointer part of another PointerIntPair. So you can nest them to have 2 booleans without creating an enum. This works because PointerIntPair always puts the bit in the highest bit possible leaving the low bits free to be used by another int.<br>
><br>
>The number of bits available in a pointer depends on the alignment requirement of the type the pointer points to. If it’s a class/struct it depends on the largest alignment required by its fields. The alignof operator is used to check the alignment.<br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>