From: Johan K. <joh...@id...> - 2001-09-09 23:59:04
|
> > Now you really can do something like: > > > > char code * data * * xdata cpdpgp_x; > > > > data char i; > > > > void test () { > > i = ***cpdpgp_x; > > } > > I believe the generated code is not correct. As I understand, > cpdpgp_x is 3 bytes in xdata, pointing to a 1 byte pointer in > data (compiled w/ --model-small), pointing to a 2 byte pointer > in data, which ultimately points to 1 byte in code. No. You should read it from left to right. So, a code pointer (two bytes) to a data pointer (one byte) to a generic pointer (three bytes) in xseg. > Adding _generic to make things clearer, this is what we > should have: char code * data * _generic * xdata cpdpgp_x; That's exactly what it is, but you can't do that anymore, _generic will now be seen as an identifier. Maybe we should warn about this. In fact that was the whole point. E.g. xdata valids from left to right, whereas _xdata used to read from right to left (but was never implemented correctly, that's why I wanted to remove it). > Also, I tried compiling in large model, and I get the exact > same assembly output. As I understand it, the middle pointer > should be allocated in xdata with large model, right? No, only the last type specifier (in fact it's a storage specifier) between the last '*' and the declarator determines the storage. That one is set (xdata), so it won't make any difference in large or small model. Johan |