From a202d8ec2d13b6cf753eae44dbb4cc36542faf30 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Tue, 29 Dec 2015 09:32:18 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256552 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCSymbol.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/MC/MCSymbol.cpp b/lib/MC/MCSymbol.cpp index c7d6213bc19..ab3b8eb6832 100644 --- a/lib/MC/MCSymbol.cpp +++ b/lib/MC/MCSymbol.cpp @@ -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(4); +MCFragment *MCSymbol::AbsolutePseudoFragment = &SentinelFragment; void *MCSymbol::operator new(size_t s, const StringMapEntry *Name, MCContext &Ctx) { -- 2.34.1