[llvm] r256552 - [ptr-traits] Provide a real MCFragment address for the sentinel instead

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 29 01:32:18 PST 2015

Author: chandlerc
Date: Tue Dec 29 03:32:18 2015
New Revision: 256552

URL: http://llvm.org/viewvc/llvm-project?rev=256552&view=rev
[ptr-traits] Provide a real MCFragment address for the sentinel instead
of casting the integer '4' to such a pointer. There is no reason to
expect '4' to be a portable or reliable pointer of this form. The only
reason this ever worked is because the PointerIntPair that this actually
gets used with has an artificially *low* presumed alignment that allowed
it to work. When the alignment of PointerIntPair is derived from the
actual type's alignment, the asserts start firing on this pointer. I'm
amazed we never managed to do anything that triggered the alignment
sanitizer with it, as this is just flat out UB.

If folks dislike this approach to providing a sentinel fragment address,
there are a myriad of other alternatives, suggestions welcome. But this
one has the distinct advantage of not requiring the friend dance of
ilist's sentinel (which I'll point out is *also* in play for
MCFragment!) and seems to be using a nicely provided facility in
MCFragment to establish just such dummy nodes.

This is part of a series of patches to allow LLVM to check for complete
pointee types when computing its pointer traits. This is absolutely
necessary to get correct (or reproducible) results for things like how
many low bits are guaranteed to be zero.


Modified: llvm/trunk/lib/MC/MCSymbol.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCSymbol.cpp?rev=256552&r1=256551&r2=256552&view=diff
--- llvm/trunk/lib/MC/MCSymbol.cpp (original)
+++ llvm/trunk/lib/MC/MCSymbol.cpp Tue Dec 29 03:32:18 2015
@@ -16,9 +16,11 @@
 #include "llvm/Support/raw_ostream.h"
 using namespace llvm;
+// Only the address of this fragment is ever actually used.
+static MCDummyFragment SentinelFragment(nullptr);
 // Sentinel value for the absolute pseudo fragment.
-MCFragment *MCSymbol::AbsolutePseudoFragment =
-    reinterpret_cast<MCFragment *>(4);
+MCFragment *MCSymbol::AbsolutePseudoFragment = &SentinelFragment;
 void *MCSymbol::operator new(size_t s, const StringMapEntry<bool> *Name,
                              MCContext &Ctx) {

More information about the llvm-commits mailing list