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

Reply via email to