Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: Jeroen Dobbelaere <jeroen.dobbelaere <at> gmail.com>
Subject: 32bit pointers on a (pure) 64bit architecture
Newsgroups: gmane.comp.compilers.llvm.devel
Date: Thursday 3rd April 2014 22:31:13 UTC (over 3 years ago)
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
 
CD: 2ms