[Gc] cc under mac os x

Grayson, Daniel R. dan at math.uiuc.edu
Thu Aug 2 08:00:12 PDT 2012


Good point!  I didn't think of that optimization.

On Aug 2, 2012, at 8:04 AM, Ivan Maidanski <ivmai at mail.ru> wrote:

> Hi Daniel,
> 
> Thu, 2 Aug 2012 07:48:38 -0400 "Grayson, Daniel R." <dan at math.uiuc.edu>:
>> Okay, the latest branch still works with clang, and so does
>> 
>> 	gc-7_2-hotfix-3
>> 
>> But I don't see how "volatile" in the line
>> 
>> 	volatile word dummy[CLEAR_SIZE]; 
>> 
>> adds any clarity.  It's confusing, because dummy refers
>> to an ordinary memory location, not an I/O port or a register, and
>> we aren't worried about interference from other threads.  The only
>> access to dummy is through BZERO, so there is no apparent compiler
>> optimization to be feared.
> 
> BZERO could be redirected to builtin_memset thus the code:
> 
> word dummy[SIZE];
> BZERO(dummy, sizeof(dummy));
> 
> could turn into:
> 
> dummy[0] = 0;
> ...
> dummy[SIZE-1] = 0;
> 
> and, since there is no readers of dummy, it is a dead code and code be wiped out.
> 
> 'volatile' says that dummy is used by some other party and the compiler is not allowed to remove any dummy[i] = 0;
> 
> Regards,
> Ivan
> 
>> 
>> 
>> On Aug 2, 2012, at 6:48 AM, Ivan Maidanski <ivmai at mail.ru> wrote:
>> 
>>> Hi Daniel,
>>> 
>>> 1. I removed almost dummy variables (together with volatile, of course).
>>> 2. For clarity (and to prevent potential compiler optimizations), volatile should remain.
>>> 3. I'm not going to prepare a cumulative patch, if you need to fix some other BDWGC source, just apply these 3 patches (not sure that they can be applied to gc7.3alpha2 smoothly):
>>> https://github.com/ivmai/bdwgc/commit/d6acbda22a4f5bdf4340edacdccf01cc7e38aea8
>>> https://github.com/ivmai/bdwgc/commit/57b94a38df8026868010ec2ea0f47cd1f94f0c60
>>> https://github.com/ivmai/bdwgc/commit/f1f2d378a04ac3f1be330ea6df6e553295657e22
>>> 
>>> 4. I've applied the patches to release-7_2 candidate branch as well, please test it: https://github.com/ivmai/bdwgc/tree/gc-7_2-hotfix-3
>>> 
>>> Regards,
>>> Ivan
>>> 
>>> Wed, 1 Aug 2012 18:24:25 -0400 "Grayson, Daniel R." <dan at math.uiuc.edu>:
>>>> That worked for clang.
>>>> 
>>>> But what about undoing the commit that inserted all the "volatile" attributes?
>>>> For clarity.
>>>> 
>>>> On Aug 1, 2012, at 6:10 PM, Ivan Maidanski <ivmai at mail.ru> wrote:
>>>> 
>>>>> Hi Hans and Daniel,
>>>>> 
>>>>> You're right.
>>>>> Done another commit (a group of). Please check it once more.
>>>>> 
>>>>> I finally realized that GC_approx_sp not only clarifies but also fixes (this is not related to compiler optimizations) the algorithm of GC_clear_stack_inner for STACK_GROWS_UP case.
>>>>> 
>>>>> Regards,
>>>>> Ivan
>>>>> 
>>>>> Wed, 1 Aug 2012 17:12:23 +0000 "Boehm, Hans" <hans.boehm at hp.com>:
>>>>>> Ivan -
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Since it's the address, and not the value of dummy that's used, I wouldn't have expected that to have any impact.  I think that switching to GC_approx_sp() clarifies the code and avoids the problem.  It does so at a tiny performance cost, but I doubt that's ever noticeable.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> I didn't look carefully at the other changes, but I think they have similar issues.  I don't see how volatile helps either.  The problem here is that I think C officially disallows comparisons of pointers to different objects.  Hence GC_clear_stack() doesn't play by the rules.  But so long as the compiler doesn't know where the pointers are coming from, it has to generate the expected code, and things will work.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> An alternative would be to write more of this in assembly code, but that's a pain to maintain.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Hans
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> -----Original Message-----
>>>>>> 
>>>>>>> From: gc-bounces at linux.hpl.hp.com [mailto:gc-bounces at linux.hpl.hp.com]
>>>>>> 
>>>>>>> On Behalf Of Grayson, Daniel R.
>>>>>> 
>>>>>>> Sent: Wednesday, August 01, 2012 5:02 AM
>>>>>> 
>>>>>>> To: Ivan Maidanski
>>>>>> 
>>>>>>> Cc: gc at linux.hpl.hp.com
>>>>>> 
>>>>>>> Subject: Re: [Gc] cc under mac os x
>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>> That doesn't help.  I.e., with Apple clang version 4.0, the gc tests
>>>>>> 
>>>>>>> still fail.
>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>> On Aug 1, 2012, at 7:09 AM, Ivan Maidanski <ivmai at mail.ru> wrote:
>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>>> Hi Daniel,
>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>>>>> I've added volatile to dummy, could you please check the code (master
>>>>>> 
>>>>>>> branch): https://github.com/ivmai/bdwgc/
>>>>>> 
>>>>>>>> (The patch itself is:
>>>>>> 
>>>>>>> https://github.com/ivmai/bdwgc/commit/d6acbda22a4f5bdf4340edacdccf01cc7
>>>>>> 
>>>>>>> e38aea8)
>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>>>>> Regards,
>>>>>> 
>>>>>>>> Ivan
>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>>>>> Mon, 30 Jul 2012 20:31:04 -0400 от "Grayson, Daniel R."
>>>>>> 
>>>>>>> <dan at math.uiuc.edu>:
>>>>>> 
>>>>>>>>> That works (with Apple clang version 4.0).
>>>>>> 
>>>>>>>>> 
>>>>>> 
>>>>>>>>> On Jul 30, 2012, at 8:25 PM, "Boehm, Hans" <hans.boehm at hp.com>
>>>>>> 
>>>>>>> wrote:
>>>>>> 
>>>>>>>>> 
>>>>>> 
>>>>>>>>>> Maybe we should just call GC_approx_sp() instead of taking the
>>>>>> 
>>>>>>> address of dummy?  This is all very heuristic, so being off by a few
>>>>>> 
>>>>>>> bytes here shouldn't matter.
>>>>>> 
>>>>>>>>>> 
>>>>>> 
>>>>>>>>>> Hans
>>>>>> 
>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>> -----Original Message-----
>>>>>> 
>>>>>>>>>>> From: Grayson, Daniel R. [mailto:dan at math.uiuc.edu]
>>>>>> 
>>>>>>>>>>> Sent: Monday, July 30, 2012 4:48 PM
>>>>>> 
>>>>>>>>>>> To: Boehm, Hans
>>>>>> 
>>>>>>>>>>> Cc: gc at linux.hpl.hp.com
>>>>>> 
>>>>>>>>>>> Subject: Re: [Gc] cc under mac os x
>>>>>> 
>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>> The problem is that the comparison
>>>>>> 
>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>> 	(word)(&dummy[0]) > (word)limit
>>>>>> 
>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>> in GC_clear_stack_inner is optimized by -O2 to the constant value
>>>>>> 
>>>>>>> FALSE
>>>>>> 
>>>>>>>>>>> (1).  Same
>>>>>> 
>>>>>>>>>>> for any comparison of those two pointers.  The only solution I see
>>>>>> 
>>>>>>> is
>>>>>> 
>>>>>>>>>>> to
>>>>>> 
>>>>>>>>>>> pass &dummy[0] through an identity function compiled in another
>>>>>> 
>>>>>>> file,
>>>>>> 
>>>>>>>>>>> so the
>>>>>> 
>>>>>>>>>>> optimizer can't see it.  That works.
>>>>>> 
>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>> On Jul 30, 2012, at 5:56 PM, "Boehm, Hans" <hans.boehm at hp.com>
>>>>>> 
>>>>>>> wrote:
>>>>>> 
>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>> Note that GC_clear_stack_inner() is a tiny piece of non-portable
>>>>>> 
>>>>>>>>>>> code.  It would be nice to understand why this is failing.
>>>>>> 
>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>> I don't understand the limit value.  It's computed in
>>>>>> 
>>>>>>> GC_clear_stack
>>>>>> 
>>>>>>>>>>> from GC_approx_sp(), which should return the stack pointer.  It
>>>>>> 
>>>>>>> should
>>>>>> 
>>>>>>>>>>> be a few K less than the stack pointer.  It doesn't look like it.
>>>>>> 
>>>>>>>>>>> Stepping through GC_clear_stack() the first time it's called might
>>>>>> 
>>>>>>> be
>>>>>> 
>>>>>>>>>>> helpful.
>>>>>> 
>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>> This is also code that can break with excessively clever whole
>>>>>> 
>>>>>>>>>>> program analysis.  It recourses until the stack pointer is below a
>>>>>> 
>>>>>>>>>>> certain value.  If the compiler manages to recognize that the
>>>>>> 
>>>>>>> function
>>>>>> 
>>>>>>>>>>> is tail recursive (which we intentionally make hard), the stack
>>>>>> 
>>>>>>> may not
>>>>>> 
>>>>>>>>>>> actually grow as a result of the recursion, causing this to loop
>>>>>> 
>>>>>>>>>>> forever.
>>>>>> 
>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>> Stubbing out GC_clear_stack_inner() completely (just return arg)
>>>>>> 
>>>>>>>>>>> should only introduce a performance issue.  That may also be worth
>>>>>> 
>>>>>>>>>>> trying.
>>>>>> 
>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>> Hans
>>>>>> 
>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>>> -----Original Message-----
>>>>>> 
>>>>>>>>>>>>> From: gc-bounces at linux.hpl.hp.com [mailto:gc-
>>>>>> 
>>>>>>>>>>> bounces at linux.hpl.hp.com]
>>>>>> 
>>>>>>>>>>>>> On Behalf Of Grayson, Daniel R.
>>>>>> 
>>>>>>>>>>>>> Sent: Sunday, July 29, 2012 11:59 AM
>>>>>> 
>>>>>>>>>>>>> To: gc at linux.hpl.hp.com
>>>>>> 
>>>>>>>>>>>>> Subject: [Gc] cc under mac os x
>>>>>> 
>>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>>> I discovered today that libgc doesn't work with /usr/bin/cc
>>>>>> 
>>>>>>> under
>>>>>> 
>>>>>>>>>>>>> Mac OS X 10.8.  I usually use gcc, so having it work with cc is
>>>>>> 
>>>>>>> not
>>>>>> 
>>>>>>>>>>>>> important to me, but it might be to others.
>>>>>> 
>>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>>> Most of the tests fail with a segmentation fault.  Gdb shows a
>>>>>> 
>>>>>>> deep
>>>>>> 
>>>>>>>>>>>>> recursion:
>>>>>> 
>>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>>> #0  0x0000000100011086 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>>>>>>>> limit=0x7fff5fbfa0a0 "") at misc.c:306
>>>>>> 
>>>>>>>>>>>>> #1  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #2  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #3  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #4  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #5  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #6  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #7  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #8  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #9  0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #10 0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> #11 0x0000000100011096 in GC_clear_stack_inner (arg=0x0,
>>>>>> 
>>>>>>> limit=0x6a8
>>>>>> 
>>>>>>>>>>>>> <Address 0x6a8 out of bounds>) at misc.c:308
>>>>>> 
>>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>>> 
>>>>>> 
>>>>>>>>>>>>> _______________________________________________
>>>>>> 
>>>>>>>>>>>>> Gc mailing list
>>>>>> 
>>>>>>>>>>>>> Gc at linux.hpl.hp.com
>>>>>> 
>>>>>>>>>>>>> http://www.hpl.hp.com/hosted/linux/mail-archives/gc/
>>>>>> 
>>>>>>>>>> 
>>>>>> 
>>>>>>>>> 
>>>>>> 
>>>>>>>>> 
>>>>>> 
>>>>>>>>> _______________________________________________
>>>>>> 
>>>>>>>>> Gc mailing list
>>>>>> 
>>>>>>>>> Gc at linux.hpl.hp.com
>>>>>> 
>>>>>>>>> http://www.hpl.hp.com/hosted/linux/mail-archives/gc/
>>>>>> 
>>>>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>> _______________________________________________
>>>>>> 
>>>>>>> Gc mailing list
>>>>>> 
>>>>>>> Gc at linux.hpl.hp.com
>>>>>> 
>>>>>>> http://www.hpl.hp.com/hosted/linux/mail-archives/gc/
>>>>>> 
>>>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> Gc mailing list
>>>> Gc at linux.hpl.hp.com
>>>> http://www.hpl.hp.com/hosted/linux/mail-archives/gc/
>>>> 
>> 
>> 




More information about the Gc mailing list