Hi Richard,
W dniu 28.06.2023 o 17:44, Richard Earnshaw (lists) pisze:
[-----------]
I think I understand what you're asking for but:
1) You'd need a new ABI specification to handle this, probably involving
register assignments (for the 'segment' addresses), the initialization
of those at startup, assembler and linker extensions to allow for
relocations describing the symbols, etc.
I was thinking about that, and it doesn't look as requiring that deep
rewrites. ABI spec, that could accomodate the functionality could be as
little as one additional attribute to linker segments. Pls consider:
1. having that additional attribute (say "funny-ptr") of a segment.
2. ... from linker one would require only:
2.a) raising an error (fail) if one object has same segment-name WITH
that attribute, and another object has that segment WITHOUT one.
2.b) raise an error (fail) if the resulting output segment would be
larger then "max" (normally, max=64kB).
3. assembler would only need to be able to declare a segment with the
new attribute
4. almost all the implementation changes are within the CC. Those
changes can be broken down into a couple of scenarios:
4.a) for the following explanation, instead of __attribute__(section()),
I will use <FP> shortcut.
4.b) assignment of "normal" to "funny" (char* <FP> x; char* y; x = y);
here compiler would have to substract segment base address before
deposition value at "&x", but for subsequent use of "x", compiler does
NOT need to do anything.
4.c) reverse assignment (y = x); here compiler does nothing special,
just uses "current/adjusted" value of "x".
4.d) comparation (x == y); compiler does nothing special - at this
point, some register will already have "current/adjusted" value of "x".
4.e) comparation to NULL (x; !x; x == NULL); those test have to be done
on "unadjusted" value of "x", so if register containing "x" is already
adjusted, the base address will have to get substracted from "x" before
test. And it may be good to take special care on loops (like "for()").
In case the loop looking like this: "for(;x; x = x->next)" the test is
to be done before adjusting the pointer "x" by segment base address for
the next loop-cycle, so there is no penalty for that test.
I hope I didn't omit any important cases. If so, it doesn't look huge.
Now, I'm NOT trying to persuade anybody, that it's "simple" and thus
should be worth doing. I'm just doing some "intellectual exercise" with
analyzing the challenge.
-R