[llvm-dev] RFC: Absolute or "fixed address" symbols as immediate operands

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 26 15:48:04 PDT 2016



On 10/26/2016 10:10 AM, Chandler Carruth via llvm-dev wrote:
> To what Reid said, I'm not really worried about impact on the middle 
> end of any of this. We can handle the code changes, etc.
>
> I agree with Chris about what we're trading off here:
>
> On Tue, Oct 25, 2016 at 10:48 PM Chris Lattner via llvm-dev 
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
>     I’d argue the other side of it. The quality of the code is higher
>     if we have invariants (like all globals are pointers) because that
>     simplifies assumptions by eliminating cases where “is a pointer”
>     appears to be true, but isn’t actually true in all cases.  I’m not
>     an expert on CFI or how widely it will ultimately impact the
>     compiler hacker consciousness, but I’m pretty sure that the
>     current model for globals and functions will remain more
>     prominent.  If you choose to break this invariant, you’ll be
>     continually swimming upstream against assumptions made throughout
>     the compiler, both in code written today but also in code written
>     in the future.
>
>
> I agree that mental assumptions the developers on the middle end hold 
> are the primary challenge here. But I think we are going to run into 
> challenges either way.
>
> If the type of these entities is an integer, we will have a 
> non-pointer global, yes. But as Peter points out, this is caught 
> effectively by asserts in the cast infrastructure and other 
> programming aids. Essentially, the checking of LLVM's type system 
> helps protect the random middle end developer from getting this wrong.
>
> On the other hand, if the type of these entities remains consistently 
> pointers, we will still break assumptions that middle end developers 
> routinely make about pointers to globals:
> - They aren't dereferencable
> - They aren't aligned
> - They may be null
> - The difference between them might not be representable in a 
> pointer-sized-integer
>
> In essence, their *values* won't behave like pointers even if we make 
> the LLVM IR type a pointer. So the wrong assumption will shift from an 
> IR type system error to a value error. I would generally much prefer 
> the LLVM IR's type system catch this kind of error. Even if these 
> wrong assumptions about the values are much less common, I would 
> prefer the more common but easily caught type system error.
>
>
> To Rafael's point, while I agree that at the object file level these 
> are indeed addresses, I personally am much more interested in the IR 
> modeling things in ways convenient to the middle end optimizer than to 
> the linker. And there, the above seems like the dominant tradeoff.
>
>
> Anyways, if Reid, Chris, and Rafael all strongly feel like keeping the 
> types consistent is actually the right tradeoff, I don't want to stand 
> in the way. So far, I just find the arguments for why this is the 
> right tradeoff unconvincing.
I agree with Chandler here on pretty much all of this (including the 
willingness to be ignored if consensus goes the other way.)
>
> -Chandler
>
>
> PS: In case it isn't clear, I'm totally fine with having the range 
> metadata available for the case where globals are mapped into very 
> specific regions for bare metal / embedded architectures, but *should* 
> be treated as actual addresses of objects that can be loaded and 
> stored through. And those seem unambiguously like they should be 
> pointers. But that seems like a separate use case and discussion...
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161026/7b14d16e/attachment.html>


More information about the llvm-dev mailing list