Issues with __buildtin_offsetof() and workarounds

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear GCC folks,

we are in the process of porting the Symbian codebase to GCC 4.4.1 and we have a number of issues with __builtin_offsetof().

I was wondering whether there is any good porting advice around: others must have had similar issues in the past. What I am looking for is a mixture of advice and our assumptions being verified. The aim is to facilitate a smooth transition to GCC.

1) Cannot pass objects of non-POD type to __builtin_offsetof()
Related to http://gcc.gnu.org/ml/gcc/2003-04/msg00970.html - the key issue with __builtin_offsetof() seems to be that for virtual base classes it is not possible to calculate the offset.

Now we only use simple inheritance and also do not use virtual bases, so we should be safe. Is this a true assumption? I came across http://www2.research.att.com/~bs/C++0xFAQ.html#PODs, which would at least vindicate that view partly.

Thus we were thinking of using "-Wno-invalid-offsetof" for now to supress these warnings.

2) Arrays in __builtin_offsetof() are not const address expressions (as the C/C++ standard requires)
In most cases I can work around this by using the following pattern:

   offsetoff(myclass, member) + arrayindex*typeof(member)

Unfortunately this is pretty ugly and the meaning of the code is obfuscated. Is there a more readable convention in C++ which compiles?

3) Other non const address expressions in __builtin_offsetof() (as the C/C++ standard requires) We have quite a few instances of low-level code in the OS where offsetof() is used to make assertions about how objects are layed out. This mainly happens where C++ code interfaces with assembler code. Many of these assertions have a non-const expression in the member argument of offsetof. It would be a shame to get rid of this safety net.

The proprietary compiler that we use still defines offsetof as

   #define _FOFF(c,f) (((TInt)&(((c *)0x1000)->f))-0x1000)

and works. GCC falls over in many instances, thus we switched to __builtin_offsetof(). However the old definition still appears to works in the cases mentioned if we locally overwrite the definition of offsetof(). Is there any convention in C++ to handle these?

I was thinking along the lines of introducing for these cases

#define _FOFF_UNSAFE(c,f) (((TInt)&(((c *)0x1000)->f))-0x1000) // ... OR

   #define unsafe_offsetof(c,f) (((TInt)&(((c *)0x1000)->f))-0x1000)

That way we would make clear that this macro is used at the users own risk and we will be able to spot and replace such instances easily in future.

Any help, experiences others that have ported a large codebase to GCC would be appreciated

Best Regards
Lars
Symbian Foundation Limited is a Company Limited by Guarantee and not having a Share Capital registered in England and Wales under its number 6683783 whose registered address is 1 Boundary Row, Southwark, London SE1 8HP.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux