[LLVMdev] 32bit pointers on a (pure) 64bit architecture

Jeroen Dobbelaere
Thu, 03 Apr 2014 22:31:13 -0000

Hi,

I am trying to get llvm working for an architecture that has 64bit
registers, but 32bit addresses.
Because of that, I want the pointers to also be 32bit, although they will
live in a 64 bit register.

On the frontend, I do not encounter any issues, but when I provide a
  ...
  "p:32:32:32"
  ...
DataLayout specification to the backend, things get ugly:
- SelectionDag is producing a mix of 64bit and 32bit nodes, and it seems
that a number of
necessary legalizations/promotions are missing.

After adding support for 'PromoteIntRes_GlobalAddress(...)', I get a
failure, because a 'store' node now has a mix of operands:
- some of the operands were already 'i64' from the beginning,
- others were 'i32' (due to the 32bit pointers) and have been promoted
to
'i64'

Because of the latter, the 'PromoteIntOp_STORE' is called. This uses
'GetPromotedInteger' to access the operands.
But, GetPromotedInteger fails if the operand was not promoted. So it fails
on the operands of the 'store' that were already legal (i64).

What would be the recommended way to fix this ?
(Or did I miss something, and should 32bit pointers on a 64bit architecture
be done in a completely different way)

Greetings,

Jeroen Dobbelaere
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20140404/677041d8/attachment.html>