[cfe-dev] 32-bit pointers and calls from 64-bit code

John McCall via cfe-dev cfe-dev at lists.llvm.org
Mon Aug 6 15:34:24 PDT 2018



> On Aug 6, 2018, at 5:49 PM, Charles Davis via cfe-dev <cfe-dev at lists.llvm.org> wrote:
> 
> Resending to the new mailing list address...
> 
> ---------- Forwarded message ----------
> From: Charles Davis <cdavis5x at gmail.com <mailto:cdavis5x at gmail.com>>
> Date: Thu, Aug 2, 2018 at 5:59 PM
> Subject: 32-bit pointers and calls from 64-bit code
> To: Clang Developers List <cfe-dev at cs.uiuc.edu <mailto:cfe-dev at cs.uiuc.edu>>
> 
> 
> Hello,
> 
> With Apple's impending 32-bit deprecation, my new employer is having a bit of an existential crisis. We think we've found a way forward, but we need a little help from the compiler to accomplish this.

This is a pretty big project to be throwing together like this, but good luck.

> Basically, what we want to do is have code that is technically x86-64 but that can use 32-bit pointers and that can make calls to 32-bit code.

Sure, this is a relatively well-understood problem.  The most well-known modern example is Linux's support for "x32".

> In a separate thread on llvmdev, I asked about LLVM changes we need for this. Here are the corresponding C language extensions we need:
> (Possibly) a preprocessor macro to be defined when we're building 64-bit code to be called by 32-bit code. This code, while still technically being 64-bit, needs to look and act like 32-bit code to our clients--so we'd like to define __i386__ et al. as though we were building real 32-bit code.
__i386__ generally means, well, the 32-bit Intel target; muddying this by pretending that your variant target is i386 seems like a bad decision.   Can you ask your clients to switch to __LP64__ or some other portable pointer-size macro instead?
> Microsoft's __ptr32 and __ptr64 keywords--to distinguish 32-bit and 64-bit pointers.
I don't know if we actually support those keywords, but conceptually they're just address spaces so it's not a problem.
> A pragma to choose the default pointer size--with this, we can avoid littering our code with lots of __ptr32 keywords.
Doable.  You'll want something that works like the ARC auditing pragmas and tries to force the pragma to stay bounded to a single header, I think.
> Attributes for various 32-bit calling conventions. We can't use the existing ones, because they are defined not to do anything in 64-bit code. I'll probably define new ones that are just the old ones suffixed with '32' (e.g. __attribute__((cdecl32))).
Why do you want this?  You're recompiling all of your code in this new mode, and the default x86_64 CC is more efficient than all of the specialized i386 CCs.  Why not just ignore the attributes?
> An attribute to declare that a function pointer must be called far, and to declare the segment selector to use when calling it. We need this to be able to transition to a 32-bit code segment. I'm currently leaning towards (ab)using Microsoft's __based extension (which originally supported something like this, I believe) for this purpose.
Are you really messing around with segments, or are you just trying to be able to to distinguish 32-bit from 64-bit function pointers?

Is there something specifically pushing you towards using the MS extensions for these things?

Are you planning to actually map all your memory into the first 4GB of address space?

John.

> Questions? Comments? Insinuations that I'm off my rocker? We understand if you don't want any of this, but note that a large chunk of my employer's revenue depends on this, so if need be, we'll maintain our own fork. We would prefer, however, that this be upstreamed.
> 
> Chip
> 
> 
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180806/8d60bb53/attachment.html>


More information about the cfe-dev mailing list