Thread overview
testsuite: optimization dependent test
Mar 25, 2013
Johannes Pfau
Mar 25, 2013
Iain Buclaw
Mar 26, 2013
Johannes Pfau
Mar 26, 2013
Iain Buclaw
Mar 28, 2013
Kagamin
Mar 28, 2013
Kagamin
Mar 29, 2013
Iain Buclaw
Apr 01, 2013
Kagamin
March 25, 2013
In runnable/test42.d test7290 checks if a scope delegate is really allocated on the stack. To verify this it obtains the EBP pointer and compares that to the delegates .ptr.

The problem is that as soon as we enable optimization gcc no
longer adjusts the EBP pointer when calling the helper functions and
the test fails...

This test seems to be very fragile in general so what should we do about this?


BTW: I introduced a small typo in test7290 when porting to GCC asm:
The test in the main test7290 function should check "assert(dg.ptr <=
p);", not "assert(p < dg.ptr);"
March 25, 2013
On 25 March 2013 18:36, Johannes Pfau <nospam@example.com> wrote:

> In runnable/test42.d test7290 checks if a scope delegate is really allocated on the stack. To verify this it obtains the EBP pointer and compares that to the delegates .ptr.
>
> The problem is that as soon as we enable optimization gcc no
> longer adjusts the EBP pointer when calling the helper functions and
> the test fails...
>
> This test seems to be very fragile in general so what should we do about this?
>
>
> BTW: I introduced a small typo in test7290 when porting to GCC asm:
> The test in the main test7290 function should check "assert(dg.ptr <=
> p);", not "assert(p < dg.ptr);"
>


1.  Revert your typo.

2. Raise with a thread in dmd-internals about it. -O2 in GDC triggers -fomit-frame-pointer.  I'm 90% certain that Walter will say that any function with assembly inside requires that a frame pointer must always be present (except in naked function), but that is absolute rubbish.  For x86_64 (at least), the ABI encourages the absence of a frame pointer.


Regards
-- 
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';


March 26, 2013
Am Mon, 25 Mar 2013 19:26:10 +0000
schrieb Iain Buclaw <ibuclaw@ubuntu.com>:

> On 25 March 2013 18:36, Johannes Pfau <nospam@example.com> wrote:
> 
> > In runnable/test42.d test7290 checks if a scope delegate is really allocated on the stack. To verify this it obtains the EBP pointer and compares that to the delegates .ptr.
> >
> > The problem is that as soon as we enable optimization gcc no
> > longer adjusts the EBP pointer when calling the helper functions and
> > the test fails...
> >
> > This test seems to be very fragile in general so what should we do about this?
> >
> >
> > BTW: I introduced a small typo in test7290 when porting to GCC asm:
> > The test in the main test7290 function should check "assert(dg.ptr
> > <= p);", not "assert(p < dg.ptr);"
> >
> 
> 
> 1.  Revert your typo.
> 
> 2. Raise with a thread in dmd-internals about it. -O2 in GDC triggers -fomit-frame-pointer.  I'm 90% certain that Walter will say that any function with assembly inside requires that a frame pointer must always be present (except in naked function), but that is absolute rubbish.  For x86_64 (at least), the ABI encourages the absence of a frame pointer.
> 
> 
> Regards

2 doesn't sound very promising though. We could just move that test to another file and make sure it's compiled with -fno-inline and fno-omit-frame-pointer. Even if dmd asm may require the frame pointer that needn't be true for gcc asm.

BTW: Do we allow backports of specific frontend fixes into gdc? I'd like to merge the fix for the final methods in interfaces problem.
March 26, 2013
On 26 March 2013 18:30, Johannes Pfau <nospam@example.com> wrote:

> Am Mon, 25 Mar 2013 19:26:10 +0000
> schrieb Iain Buclaw <ibuclaw@ubuntu.com>:
>
> > On 25 March 2013 18:36, Johannes Pfau <nospam@example.com> wrote:
> >
> > > In runnable/test42.d test7290 checks if a scope delegate is really allocated on the stack. To verify this it obtains the EBP pointer and compares that to the delegates .ptr.
> > >
> > > The problem is that as soon as we enable optimization gcc no
> > > longer adjusts the EBP pointer when calling the helper functions and
> > > the test fails...
> > >
> > > This test seems to be very fragile in general so what should we do about this?
> > >
> > >
> > > BTW: I introduced a small typo in test7290 when porting to GCC asm:
> > > The test in the main test7290 function should check "assert(dg.ptr
> > > <= p);", not "assert(p < dg.ptr);"
> > >
> >
> >
> > 1.  Revert your typo.
> >
> > 2. Raise with a thread in dmd-internals about it. -O2 in GDC triggers -fomit-frame-pointer.  I'm 90% certain that Walter will say that any function with assembly inside requires that a frame pointer must always be present (except in naked function), but that is absolute rubbish.  For x86_64 (at least), the ABI encourages the absence of a frame pointer.
> >
> >
> > Regards
>
> 2 doesn't sound very promising though. We could just move that test to another file and make sure it's compiled with -fno-inline and fno-omit-frame-pointer. Even if dmd asm may require the frame pointer that needn't be true for gcc asm.
>
> BTW: Do we allow backports of specific frontend fixes into gdc? I'd like to merge the fix for the final methods in interfaces problem.
>

Have no objections.  Have done that for __vector's before ahead of release.

-- 
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';


March 28, 2013
Are you trying to get stack top?

void test(scope void delegate() dg)
{
  int[2] top;
  void* p=top.ptr;
  assert(p < dg.ptr);
  assert(dg.ptr !is null);
  //also check that ptr is not in heap
  assert(gc_addrOf(dg.ptr) is null);
}
March 28, 2013
core.memory.GC.addrOf(dg.ptr);
March 29, 2013
On 28 March 2013 04:47, Kagamin <spam@here.lot> wrote:

> core.memory.GC.addrOf(dg.ptr);
>

Done and already merged in.

https://github.com/D-Programming-Language/dmd/pull/1809


Regards
-- 
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';


April 01, 2013
On Friday, 29 March 2013 at 13:24:42 UTC, Iain Buclaw wrote:
> https://github.com/D-Programming-Language/dmd/pull/1809

lol, put imports after test3.