This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: alias of structure members


On 13/02/12 02:13, Ian Lance Taylor wrote:
> The linker tends to only complain if an undefined symbol is used.  I
> don't know if that explains what you are seeing, but perhaps it does.
>
> Ian
It does. The appearance of working on gcc3 was indeed misleading.
Adding an assignment to Localfoo it relents to produces
 [Linker error] undefined reference to `Foo.Foodata' 


I was finally able to perform the aliasing doing it directly in assembler.
 
For reference , this is what worked for me
#define ALIAS_MEMBER(name, instance,member) \
 static void instance ## __ ## alias__ ## member ## __ ## function
(void) __attribute__((used)); \
 static void instance ## __ ## alias__ ## member ## __ ## function
(void) { \
 const size_t member_offset = offsetof(typeof(instance), member); \
 asm(".global " # member "\n" "\t.set " #name "," #instance " +  %0\n" : \
     /* No output */ : /* input */ "g" ( member_offset ) ); } \
 extern typeof(instance.member) name;
 
Some notes:
 - You need to enable optimizations, so the constant is converted into a
literal (doesn't work in -O0)
 - The instance shall have an initialiser (even if you don't care about
the value), so that
 the variable it's placed in .bss, and not as a .comm (it may produce a
'can't be equated to 
 common symbol' error or silently skip your symbol)
 - It doesn't seem to work for all targets. YMMV.
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]