C constant expressions proposals
Geoff Keating
geoffk@geoffk.org
Tue Aug 17 22:21:00 GMT 2004
On Aug 17, 2004, at 2:38 PM, Joseph S. Myers wrote:
> On Tue, 17 Aug 2004, Geoffrey Keating wrote:
>
>> The point of 20010327-1.c is that it's the only way to get certain
>> functionality out of the linker. It's necessary for strange cases
>> involving, for instance, an interface between 32-bit and 64-bit code.
>> It's perfectly OK if this is only accepted in an initializer, but it
>> does need to be accepted.
>
> So what (in terms of target macros if necessary) is the specification
> of
> exactly what cases are meant to be accepted? I gave the examples
>
> static unsigned long x = (unsigned long) ((uintptr_t)&_text + 123) +
> 456;
> static long y = (long) ((intptr_t)((uintptr_t)&_text + 123)) + 456;
>
> which are both of the given form (extend an address constant to a wider
> type, then add a constant), but are they valid? What about converting
> to
> a narrower type?
There doesn't appear to be any target macro that currently exists to
tell you what variants are accepted by a particular target.
I know there are targets can handle expressions of the form
<inttype A> x = (<inttype A>)(<address-linear-expression>)
for any integer type 'inttype A', and any <address-linear-expression>
which is a linear combination of addresses where the computation is of
the same size as an address (yes, including things like '(uintptr_t)&x
* 4 + 3141 + (&z - &t)', or the equivalent but more fun
'(uintptr_t)((int *)3141 + (uintptr_t)&x) + (&z - &t)').
Now, of course not all of those work on all platforms. Some of them
have a restriction on the possible sizes of 'A'. Some of them work
only when parts of the computation can be done by the assembler, so it
depends on exactly what addresses you take, for instance '&x - &y'
might only work if the assembler can compute it or 'y' is the same
section as the object being initialised. Some of them will fail in
output_addr_const when it doesn't know how to multiply. However, I
believe there is at least one assembler/linker combination that can do
the fully general case (in fact, I believe there's one combination that
can handle even nonlinear expressions, although I don't know why you'd
want to use that).
My suggestion is to just permit any expression of the form above and
document that the assembler gets to say whether it's valid or not.
Alternatively, make a target hook that can look at trees.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2410 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc/attachments/20040817/4ca1a641/attachment.p7s>
More information about the Gcc
mailing list