[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Topics about GNUstep/libobjc2
From: |
David Chisnall |
Subject: |
Re: Topics about GNUstep/libobjc2 |
Date: |
Tue, 25 Oct 2016 09:55:46 +0100 |
Hi Rolf,
From your code snippets, it looks as if it should work and you’ve probably
found either a compiler or runtime bug. If you can put together a reduced test
case (ideally something that doesn’t depend on anything other than libobjc)
I’ll take a look.
David
> On 24 Oct 2016, at 23:38, Dr. Rolf Jansen <rj@obsigna.com> wrote:
>
> Hi David,
>
> many thanks for the reply.
>
> Does this mean, that it is not advised to use arbitrary C structs as
> Objective-C instance variables?
>
> The code is more than 10 years old, and at that time I started learning
> Objective-C, and I heavily intermixed C data structures and algorithms into a
> hollow OOP construct. It is a calculator engine with more than 10000 lines of
> code.
>
> The code (without #pragma pack, and -O1,-O2,-O3, or -Ofast) crashes
> consistently on FreeBSD when accessing one instance variable indicated below
> from within the respective object.
>
> ...
>
> typedef struct
> {
> ErrorFlags flag;
> unsigned begin, count;
> char *field;
> } ErrorRecord;
>
> typedef struct ResultType
> {
> ResultTypeFlags f;
> unsigned n;
> boolean b;
> long long i;
> long double r;
> long double complex z;
> struct ResultType *v;
> char *s;
> ErrorRecord e;
> } ResultType;
>
> @interface CalcObject : MyObject
> {
> boolean isPercent;
> TokenPtr itsToken;
> Precedence itsPrecedence;
> OpKind itsOpKind;
> CalcObject *itsParent;
> Calculator *itsCalculator;
> }
>
> ...
> - many instance methods;
> ...
>
> @end
>
>
> @interface CalcFactor : CalcObject
> {
> ResultType itsValue; <<<<<<<<<<<< accessing this one gives Bus Error
> }
>
> ...
> - some more instance methods;
> ...
>
> @end
>
>
> Questions:
>
> As said already, on Mac OS X this code does not crash with Apple's
> non-fragile ABI. Is this only by coincidence and other similar constructs may
> crash? Or, may I continue to use my 10000 line of code, without a major
> rewrite?
>
> Likewise on FreeBSD, is it safe to rely on the magic of #pragma pack(8) or is
> my code too fragil for the non-fragil ABI?
>
> AFAIK, 8 byte struct packing/padding is standard for 64bit architectures and
> 4 byte packing/padding for 32bit architectures. Isn't it possible to do this
> reliable for C structs included as Objective-C instance variables?
>
> Best regards
>
> Rolf
>
>> Am 24.10.2016 um 17:09 schrieb David Chisnall <David.Chisnall@cl.cam.ac.uk>:
>>
>> Hi Rolf,
>>
>> With the non-fragile ABI, it isn’t safe to assume that classes have the same
>> layout as C structs. This works with the fragile ABI, because the compiler
>> is entirely responsible for layout there. It sounds as if #pragma pack is
>> removing some padding that the ABI mandates for C structs, but which the
>> Objective-C runtime is not adding.
>>
>> David
>>
>>> On 24 Oct 2016, at 17:52, Dr. Rolf Jansen <rj@obsigna.com> wrote:
>>>
>>> Would it be OK to discuss on this list topics about Objective-C development
>>> involving clang + GNUstep/libobjc2, but almost nothing else from GNUstep?
>>>
>>> I constructed my own root class having only the bare basic methods that are
>>> needed by a quite old project, that I revamped for inclusion into a new
>>> plain C project. My class/code is working well on FreeBSD 11.0 RELEASE-p1
>>> (amd64) when compiled with clang 3.8 (system) with -O0 or -Os and linked
>>> against libobjc2 1.8.1 (ports). Once compiled with any other optimization
>>> mode, it crashes (Bus Error) when accessing a certain instance variable
>>> struct.
>>>
>>> It is working well on Mac OS X 11.12 when compiled in any -O mode with my
>>> root class and linked against the native ObjC runtime. It is almost always
>>> working on FreeBSD 11 in any -O mode when using NSObject as the root class
>>> and linked against libobjc2 1.8.1 and gnustep-base (ports), although, I saw
>>> 2 random crashes.
>>>
>>> After some debugging I found a workaround. Once I add a #pragma pack(8)
>>> directive at the top of the headers that declare my class hierarchy + all
>>> the C structs that are used throughout, the code with my root class works
>>> well on FreeBSD 11 when compiled in any -O mode -- a pack(4) does work as
>>> well.
>>>
>>> It is still possible that something is wrong with my code. However, after
>>> these many experiments, I tend to assume that the Objective-C runtime and
>>> the compiler sometimes disagree on correct packing/alignment of instance
>>> variables in instantiated objects. I can't tell, though, if the runtime or
>>> the compiler is responsible for this.
>>>
>>> In the case that it is appropriate to discuss this further on this list, I
>>> am ready to send more information. If this is not the appropriate list,
>>> then please may I ask for advise on which location this topic may be
>>> discussed.
>>>
>>> The #pragma pack(8) does neither cost anything nor is it a very ugly hack,
>>> so perhaps, it isn't even worth to discuss this issue furthermore, given
>>> that clang 4.0 may be out soon.
>>>
>>> Best regards
>>>
>>> Rolf
>
>
> _______________________________________________
> Discuss-gnustep mailing list
> Discuss-gnustep@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnustep