www.digitalmars.com         C & C++   DMDScript  

D.gnu - testsuite: optimization dependent test

reply Johannes Pfau <nospam example.com> writes:
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);"
Mar 25 2013
next sibling parent reply Iain Buclaw <ibuclaw ubuntu.com> writes:
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';
Mar 25 2013
parent reply Johannes Pfau <nospam example.com> writes:
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.
Mar 26 2013
parent Iain Buclaw <ibuclaw ubuntu.com> writes:
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';
Mar 26 2013
prev sibling parent reply "Kagamin" <spam here.lot> writes:
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);
}
Mar 27 2013
parent reply "Kagamin" <spam here.lot> writes:
core.memory.GC.addrOf(dg.ptr);
Mar 27 2013
parent reply Iain Buclaw <ibuclaw ubuntu.com> writes:
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';
Mar 29 2013
parent "Kagamin" <spam here.lot> writes:
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.
Apr 01 2013