Hello David,

As a matter of fact, accessing the ResultType ivar itsValue of CalcFactor does 
not crash anymore with the latest libobjc2 from GitHub, however, with that 
another problem has been introduced. When calling -[CalcObject init:::], the 
parameters become assigned to different ivars then requested.

In order to trigger this problem, I modified the file main.m of my test case to:

------------------ main.m ----------------
#import <stdio.h>
#import <stdlib.h>
#import <stdint.h>
#import <math.h>
#import <complex.h>
#import <tmmintrin.h>
#import <objc/Object.h>

#import "BareClass.h"
#import "CalcObject.h"

int main(int argc, const char *argv[])
{
   TokenRecord t = (TokenRecord){0, 2, numDigit, "11", nil, NULL};
   CalcFactor *a = [[CalcFactor alloc] init:&t :factor :param];
   return 0;
}
------------------- END ------------------

In the Makefile I replaced -g0 -Ofast with -g -O0. After building on FreeBSD, I 
ran a debugging session using lldb.

As you can see in the attached screenshot, the expression "itsToken = token" 
actually left itsToken at nil but changed the other instance variable 
itsCalculator from nil to a bogus pointer.

This problem cannot be resolved by changing the optimization switches nor by 
using #pragma pack directives.

For the time being I need to switch back to the previous version of libobjc2.

Best regards

Rolf


> Am 25.10.2016 um 13:52 schrieb David Chisnall <[email protected]>:
> 
> This should now be fixed:
> 
> https://github.com/gnustep/libobjc2/commit/6df23377a02f187e0df8cb359175fb274b34aae1
> 
> It turns out that I’d previously got some code that was slightly wrong for 
> this and then disabled it…
> 
> It needs a lot more testing, but I really should push out the 1.9 release 
> soon as there are a load of improvements since the last one.
> 
> David
> 
>> On 25 Oct 2016, at 15:28, David Chisnall <[email protected]> wrote:
>> 
>> Hi,
>> 
>> It would help if the reduced test case compiled, but adding -march=native 
>> seems to fix that.  It would also help if it were something a bit more 
>> minimal, but from what you’ve sent me:
>> 
>> The crash happens in [CalcFactor evaluate], which simply returns the 
>> ResultType ivar itsValue.  Clang is emitting sse instructions for this, 
>> assuming that the ivar is correctly 128-bit aligned.  The offset is 48, so 
>> it is aligned within the object, but the 64-bit header makes it unaligned 
>> again.
>> 
>> Here is a reduced test case that demonstrates the problem:
>> 
>> #include <objc/runtime.h>
>> #include <stdint.h>
>> #include <assert.h>
>> typedef int v4si __attribute__ ((vector_size (16)));
>> @interface Foo
>> {
>>       Class isa;
>>       v4si var;
>> }
>> - (void)check;
>> + (id)new;
>> @end
>> @implementation Foo
>> + (id)new
>> {
>>       return class_createInstance(self, 0);
>> }
>> - (void)check
>> {
>>       size_t addr = (size_t)&var;
>>       assert(addr & 15 == 0);
>> }
>> @end
>> 
>> int main(void)
>> {
>>       [[Foo new] check];
>> }
>> 
>> It appears that we’re not taking the offset into account correctly.  I 
>> thought I’d fixed this, but apparently I haven’t.  I’ll take a look now.
>> 
>> David
>> 
>>> On 25 Oct 2016, at 14:47, Dr. Rolf Jansen <[email protected]> wrote:
>>> 
>>> Hi David,
>>> 
>>> Attached to this message you will find a .zip-Archive with the stripped 
>>> down test case. It contains a FreeBSD Makefile and a .xcodeproj-package.
>>> 
>>> It should build on FreeBSD against libobjc2 (ports) and Mac OS X (native 
>>> libobjs) out of the box. On Mac OS X it should run fine and it would crash 
>>> on FreeBSD.
>>> 
>>> If you uncomment the #pragma pack() directives in CalcObject.h it builds 
>>> and runs fine also on FreeBSD 11-RELEASE-p1.
>>> 
>>> Best regards
>>> 
>>> Rolf
>>> 
>>>> Am 25.10.2016 um 06:55 schrieb David Chisnall <[email protected]>:
>>>> 
>>>> 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

_______________________________________________
Discuss-gnustep mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/discuss-gnustep

Reply via email to