Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-09-13 Thread Mark Morgan Lloyd

Mark Morgan Lloyd wrote:

Sven Barth wrote:

It will be interesting to see what minimal code will trigger the 
problem. Maybe it will point to a more serious problem inside the 
compiler.


I've now got a standalone test_fpregs.pas which fails to compile in 
the expected way, i.e. a compile-time error in ncgld.pas. I've got 
other jobs to do for a few hours but will see what I can rip out 
without losing the erroneous behaviour.




Take your time. A few hours/days more or less won't hurt and at least 
we already know a fix for the resulting problem, but I'd also like to 
fix the cause :)


It's not triggered by fpregs.pas. It's triggered by importing one or 
more of FPViews FPVars FPDebug which suggests to me that it's in some 
common file that those three (but not FPConst) themselves import.


Wrong. The problem with that approach is that those three files 
themselves import an unmodified fpregs.pas, so investigation has to be 
done in vivo.


The divide-by-zero is caused when the compiler attempts to compile an 
assignment of a tVectorregs inside TVectorView.Draw, i.e. as minimal code:


  procedure TVectorView.Draw;

var
   rs : tVectorregs; { stuff commented out here }

begin
  rs := rs; { more stuff commented out here }
end;

All of the tVectorregs assignments in that method cause the problem, not 
just the artificial one I show above.


I ended up doing a full build for tests, since I think I found a 
situation where once a compiler was OK it stayed OK and I wanted to be 
absolutely certain of my facts rather than crying wolf over a problem 
that might be difficult to reproduce.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-09-13 Thread Sven Barth
Am 13.09.2013 12:20 schrieb Mark Morgan Lloyd 
markmll.fpc-de...@telemetry.co.uk:

 Mark Morgan Lloyd wrote:

 Sven Barth wrote:

 It will be interesting to see what minimal code will trigger the
problem. Maybe it will point to a more serious problem inside the compiler.


 I've now got a standalone test_fpregs.pas which fails to compile in
the expected way, i.e. a compile-time error in ncgld.pas. I've got other
jobs to do for a few hours but will see what I can rip out without losing
the erroneous behaviour.


 Take your time. A few hours/days more or less won't hurt and at least
we already know a fix for the resulting problem, but I'd also like to fix
the cause :)


 It's not triggered by fpregs.pas. It's triggered by importing one or
more of FPViews FPVars FPDebug which suggests to me that it's in some
common file that those three (but not FPConst) themselves import.


 Wrong. The problem with that approach is that those three files
themselves import an unmodified fpregs.pas, so investigation has to be done
in vivo.

 The divide-by-zero is caused when the compiler attempts to compile an
assignment of a tVectorregs inside TVectorView.Draw, i.e. as minimal code:

   procedure TVectorView.Draw;

 var
rs : tVectorregs; { stuff commented out here }

 begin
   rs := rs; { more stuff commented out here }
 end;

 All of the tVectorregs assignments in that method cause the problem, not
just the artificial one I show above.

 I ended up doing a full build for tests, since I think I found a
situation where once a compiler was OK it stayed OK and I wanted to be
absolutely certain of my facts rather than crying wolf over a problem that
might be difficult to reproduce.


So if you put the declaration of TVectorRegs in a program and add a
function that does the above assignment, you can reproduce it as well?

Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-09-13 Thread Mark Morgan Lloyd

Apologies for my lousy threading, but the gateway here drops some messages.

Sven Barth wrote:
The divide-by-zero is caused when the compiler attempts to compile an 
assignment of a tVectorregs inside TVectorView.Draw, i.e. as minimal code:


  procedure TVectorView.Draw;

var
   rs : tVectorregs; { stuff commented out here }

begin
  rs := rs; { more stuff commented out here }
end;

All of the tVectorregs assignments in that method cause the problem, not 
just the artificial one I show above.


I ended up doing a full build for tests, since I think I found a 
situation where once a compiler was OK it stayed OK and I wanted to be 
absolutely certain of my facts rather than crying wolf over a problem 
that might be difficult to reproduce.


 So if you put the declaration of TVectorRegs in a program and add a
 function that does the above assignment, you can reproduce it as well?

So far, no :-( But I'll keep trying.

I can confirm that a stripped-down function as above still triggers the 
problem, i.e. it's not something odd in the commented-out bits.


I can also say, with more confidence than earlier, that the full build 
is necessary since otherwise once the IDE has built successfully it 
keeps on building even if fpregs.pas is modified to induce the fault and 
a compiler  make cycle  is done (but the machine running the build is in 
somebody else's office, so I'm not the one with the extra heat :-)


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-27 Thread Mark Morgan Lloyd

Sven Barth wrote:

It will be interesting to see what minimal code will trigger the 
problem. Maybe it will point to a more serious problem inside the 
compiler.


I've now got a standalone test_fpregs.pas which fails to compile in 
the expected way, i.e. a compile-time error in ncgld.pas. I've got 
other jobs to do for a few hours but will see what I can rip out 
without losing the erroneous behaviour.




Take your time. A few hours/days more or less won't hurt and at least we 
already know a fix for the resulting problem, but I'd also like to fix 
the cause :)


It's not triggered by fpregs.pas. It's triggered by importing one or 
more of FPViews FPVars FPDebug which suggests to me that it's in some 
common file that those three (but not FPConst) themselves import.


I wish I'd got one of my elderly ARM systems available, since it would 
be interesting to know if it happens on another architecture that's 
picky about alignment.


Work continues intermittently.

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-26 Thread Mark Morgan Lloyd

Mark Morgan Lloyd wrote:

Sven Barth wrote:


Would it help if I were to build a cross-compiler here and try building
the IDE both with and without libgdb?


It would help more if you'd be able to reduce the problem from 
compile IDE with libgdb to compile this simple unit/program. Thus 
could you please try to reduce the ide/fpregs.pp unit (which contains 
the suspicious TVectorRegs record) so far that it can be compiled 
standalone (no further dependencies), but still triggers the exception?


I'll be back.


This isn't quite what you've asked, but I can duplicate it with a 
minimal program:


program test_fp_ide;

(* This is a specific test of the fp IDE interface to libgdb, which 
fails   *)
(* to compile on SPARC using fpc later than 2.4.x. MarkMLl. 
*)


uses FPRegs;

// var  vr: TVectorRegs;

begin
//  WriteLn(SizeOf(vr));

end.

#0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE 
(this=0xf58d6a40) at ncgld.pas:785

#1  0x0014d9c4 in SECONDPASS (P=0xf58d6a40) at pass_2.pas:195
..

which takes us back to the same line

if (right.location.reference.offset mod alignmentrequirement0) or

with the implication that alignmentrequirement is unexpectedly zero.

Above is based on 2.6.2, running on SPARC Debian Lenny. I'm omitting 
details of the paths etc. pending confirmation that what I've got is of 
some use.


-

I'm having problems reducing fpregs to a simple program, I'll post more 
details once I've been able to look at it on the machine I've moved onto 
for test purposes.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-26 Thread Sven Barth

Am 26.08.2013 11:55, schrieb Mark Morgan Lloyd:

Mark Morgan Lloyd wrote:

Sven Barth wrote:

Would it help if I were to build a cross-compiler here and try 
building

the IDE both with and without libgdb?


It would help more if you'd be able to reduce the problem from 
compile IDE with libgdb to compile this simple unit/program. 
Thus could you please try to reduce the ide/fpregs.pp unit (which 
contains the suspicious TVectorRegs record) so far that it can be 
compiled standalone (no further dependencies), but still triggers 
the exception?


I'll be back.


This isn't quite what you've asked, but I can duplicate it with a 
minimal program:



Well, at least it isn't *that* bad. You should now be able to just cycle 
the compiler (cd compiler  make cycle) and then compile the test 
program to check when things go wrong.
I'm having problems reducing fpregs to a simple program, I'll post 
more details once I've been able to look at it on the machine I've 
moved onto for test purposes.


It will be interesting to see what minimal code will trigger the 
problem. Maybe it will point to a more serious problem inside the compiler.


Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-26 Thread Mark Morgan Lloyd

Sven Barth wrote:

Am 26.08.2013 11:55, schrieb Mark Morgan Lloyd:

Mark Morgan Lloyd wrote:

Sven Barth wrote:

Would it help if I were to build a cross-compiler here and try 
building

the IDE both with and without libgdb?


It would help more if you'd be able to reduce the problem from 
compile IDE with libgdb to compile this simple unit/program. 
Thus could you please try to reduce the ide/fpregs.pp unit (which 
contains the suspicious TVectorRegs record) so far that it can be 
compiled standalone (no further dependencies), but still triggers 
the exception?


I'll be back.


This isn't quite what you've asked, but I can duplicate it with a 
minimal program:



Well, at least it isn't *that* bad. You should now be able to just cycle 
the compiler (cd compiler  make cycle) and then compile the test 
program to check when things go wrong.
I'm having problems reducing fpregs to a simple program, I'll post 
more details once I've been able to look at it on the machine I've 
moved onto for test purposes.


It will be interesting to see what minimal code will trigger the 
problem. Maybe it will point to a more serious problem inside the compiler.


I've now got a standalone test_fpregs.pas which fails to compile in the 
expected way, i.e. a compile-time error in ncgld.pas. I've got other 
jobs to do for a few hours but will see what I can rip out without 
losing the erroneous behaviour.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-26 Thread Sven Barth

Am 26.08.2013 14:11, schrieb Mark Morgan Lloyd:

Sven Barth wrote:

Am 26.08.2013 11:55, schrieb Mark Morgan Lloyd:

Mark Morgan Lloyd wrote:

Sven Barth wrote:

Would it help if I were to build a cross-compiler here and try 
building

the IDE both with and without libgdb?


It would help more if you'd be able to reduce the problem from 
compile IDE with libgdb to compile this simple unit/program. 
Thus could you please try to reduce the ide/fpregs.pp unit (which 
contains the suspicious TVectorRegs record) so far that it can be 
compiled standalone (no further dependencies), but still triggers 
the exception?


I'll be back.


This isn't quite what you've asked, but I can duplicate it with a 
minimal program:



Well, at least it isn't *that* bad. You should now be able to just 
cycle the compiler (cd compiler  make cycle) and then compile the 
test program to check when things go wrong.
I'm having problems reducing fpregs to a simple program, I'll post 
more details once I've been able to look at it on the machine I've 
moved onto for test purposes.


It will be interesting to see what minimal code will trigger the 
problem. Maybe it will point to a more serious problem inside the 
compiler.


I've now got a standalone test_fpregs.pas which fails to compile in 
the expected way, i.e. a compile-time error in ncgld.pas. I've got 
other jobs to do for a few hours but will see what I can rip out 
without losing the erroneous behaviour.




Take your time. A few hours/days more or less won't hurt and at least we 
already know a fix for the resulting problem, but I'd also like to fix 
the cause :)


Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-26 Thread Jonas Maebe


On 26 Aug 2013, at 14:34, Sven Barth wrote:

Take your time. A few hours/days more or less won't hurt and at  
least we already know a fix for the resulting problem, but I'd also  
like to fix the cause :)


It's already fixed in trunk in r19338


Jonas___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-26 Thread Sven Barth

Am 26.08.2013 14:38, schrieb Jonas Maebe:


On 26 Aug 2013, at 14:34, Sven Barth wrote:

Take your time. A few hours/days more or less won't hurt and at least 
we already know a fix for the resulting problem, but I'd also like to 
fix the cause :)


It's already fixed in trunk in r19338
No, the fix is the one added by you (the one with if len = 0 then 
...), but the record in question does not fit the criteria mentioned 
and thus I'd like to know why as this could point to a more serious 
problem on Sparc that we aren't aware of yet.


Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-12 Thread Mark Morgan Lloyd

Sven Barth wrote:


It seems to be a bug in the Sparc code generator nevertheless, because
the IDE compiles (not assembles/links though :P ) using a Sparc cross
compiler...


Hold on: the IDE without libgdb compiles OK natively on SPARC. It's only
adding libgdb which screws things.



This might be, but the problem nevertheless suggests a potentially 
serious compiler bug as the compiler should not raise exceptions (or 
internal errors) on valid code.


OK, but I'm betting that it would fail if the SPARC cross compiler were 
asked to build with libgdb... is this something you can or do do?


Would it help if I were to build a cross-compiler here and try building 
the IDE both with and without libgdb?


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-12 Thread Sven Barth

On 12.08.2013 16:06, Mark Morgan Lloyd wrote:

Sven Barth wrote:


It seems to be a bug in the Sparc code generator nevertheless, because
the IDE compiles (not assembles/links though :P ) using a Sparc cross
compiler...


Hold on: the IDE without libgdb compiles OK natively on SPARC. It's only
adding libgdb which screws things.



This might be, but the problem nevertheless suggests a potentially
serious compiler bug as the compiler should not raise exceptions (or
internal errors) on valid code.


OK, but I'm betting that it would fail if the SPARC cross compiler were
asked to build with libgdb... is this something you can or do do?


It's not the libgdb itself which triggers problems (well, aside the 
missing dependency), but the inclusion of the fpregs unit which is not 
added if the IDE is not compiled with libgdb support.



Would it help if I were to build a cross-compiler here and try building
the IDE both with and without libgdb?



It would help more if you'd be able to reduce the problem from compile 
IDE with libgdb to compile this simple unit/program. Thus could you 
please try to reduce the ide/fpregs.pp unit (which contains the 
suspicious TVectorRegs record) so far that it can be compiled standalone 
(no further dependencies), but still triggers the exception?


Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-12 Thread Mark Morgan Lloyd

Sven Barth wrote:


Would it help if I were to build a cross-compiler here and try building
the IDE both with and without libgdb?


It would help more if you'd be able to reduce the problem from compile 
IDE with libgdb to compile this simple unit/program. Thus could you 
please try to reduce the ide/fpregs.pp unit (which contains the 
suspicious TVectorRegs record) so far that it can be compiled standalone 
(no further dependencies), but still triggers the exception?


I'll be back.

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-11 Thread Sven Barth

On 11.08.2013 15:15, Mark Morgan Lloyd wrote:

Sven Barth wrote:

On 09.08.2013 19:05, Mark Morgan Lloyd wrote:

Sven Barth wrote:


So you changed the len = 0 to len = 0? Then this is very strange,
because that almost surely shouldn't happen. Could you please print
somehow (either debugging or Writeln) the value of left.resultdef.typ
(yes, without e at the end!) when len = 0? Then we could at least
check which def produces problematic results here (is suspect records,
but just to be sure).


On the other hand the only def that I've found so far that does indeed
return -1 in certain cases is the array... hmm...


Noting Pierre's comments from earlier, TIntRegs contains arrays for
SPARC and PPC (and also for the catch-all case) but not for i386 or 68k.



It seems to be a bug in the Sparc code generator nevertheless, because
the IDE compiles (not assembles/links though :P ) using a Sparc cross
compiler...


Hold on: the IDE without libgdb compiles OK natively on SPARC. It's only
adding libgdb which screws things.



This might be, but the problem nevertheless suggests a potentially 
serious compiler bug as the compiler should not raise exceptions (or 
internal errors) on valid code.


Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Pierre Free Pascal wrote:

  Hi,

I am sorry, but Ihave no access to a sprac machine anymore.
But I remember that we already had a problem like this coming
from the fact that we declare somewhere an empty record
and this lead to troubles...
  TVectorREgss from fpregs unit might still be empty for sparc.

This was fixed in
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/compiler/ncgld.pas?sortby
=dater1=19338r2=19337pathrev=19338
in May 2011...

  But I was hoping it was fixed in 2.6.2 ...

  Could you try to recompile trunk compiler and check that that one
does not crash.


Trunk /does/ crash- that's where we started. I only reverted to 2.6.2 
since it's slightly easier to put a debugger on it to get a backtrace.


 ../fpc-trunk/ide$ make GDB_V603=1 OPT='-O- -gl -Xd' all
 ./fpmake compile --localunitdir=.. -...
..
 Fatal: Compilation aborted
 An unhandled exception occurred at $001E61C0 :
 EDivByZero : Division by zero
   $001E61C0  TCGASSIGNMENTNODE__PASS_GENERATE_CODE,  line 785 of 
ncgld.pas


 At this point: what's actually running, i.e. what command should I
 apply gdb to to get a decent backtrace?

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Sven Barth

Am 08.08.2013 22:22, schrieb Mark Morgan Lloyd:

Sven Barth wrote:

If I revert to 2.6.2 and run ppcsparc under gdb, I get this as a 
backtrace:


Program received signal SIGFPE, Arithmetic exception.
0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE 
(this=0xf5d6abe0) at

ncgld.pas:785
785 if (right.location.reference.offset
mod alignmentrequirement0) or
(gdb) bt
#0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE
(this=0xf5d6abe0) at ncgld.pas:785



Also (if I'm doing this right)

(gdb) print alignmentrequirement
$1 = 0

Any thoughts appreciated.



This is strange. If you take a look at the code there are at least 
two checks that should ensure that alignmentrequirement is not 0... 
Could you maybe step into Min and Max to check whether they produce 
sane results? (you'll likely need to recompile the RTL with debug 
information; I'd suggest you to use 2.7.1 for debugging)
If you can't recompile the RTL with debug information you could try 
to break up the assignment statement for alignmentrequirement into 
single steps and print the values so that we can have a complete 
picture.


I'll take a look at that in the morning, probably by printing 
temporary values etc. since I'm not very confident trying to 
single-step somebody else's complex code. Allowing that this is 
apparently a compiler rather than an fp/libgdb issue, is there test 
code for this case anywhere?

We don't have an explicit test case for Min/Max.
Misbehaving min()/max() rings a horrible bell, but I can't remember 
the context.
Maybe it isn't Min/Max itself, but the direct passing of the result of 
the inner call to the outer call that's faulty on Sparc...


Maybe you could compile a test program with a similar situation as the 
alignmentrequirement situation and check the parameter passing (if you 
can read Sparc assembly language)


Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Sven Barth wrote:

Am 08.08.2013 22:22, schrieb Mark Morgan Lloyd:

Sven Barth wrote:

If I revert to 2.6.2 and run ppcsparc under gdb, I get this as a 
backtrace:


Program received signal SIGFPE, Arithmetic exception.
0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE 
(this=0xf5d6abe0) at

ncgld.pas:785
785 if (right.location.reference.offset
mod alignmentrequirement0) or
(gdb) bt
#0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE
(this=0xf5d6abe0) at ncgld.pas:785



Also (if I'm doing this right)

(gdb) print alignmentrequirement
$1 = 0

Any thoughts appreciated.



This is strange. If you take a look at the code there are at least 
two checks that should ensure that alignmentrequirement is not 0... 
Could you maybe step into Min and Max to check whether they produce 
sane results? (you'll likely need to recompile the RTL with debug 
information; I'd suggest you to use 2.7.1 for debugging)
If you can't recompile the RTL with debug information you could try 
to break up the assignment statement for alignmentrequirement into 
single steps and print the values so that we can have a complete 
picture.


I'll take a look at that in the morning, probably by printing 
temporary values etc. since I'm not very confident trying to 
single-step somebody else's complex code. Allowing that this is 
apparently a compiler rather than an fp/libgdb issue, is there test 
code for this case anywhere?

We don't have an explicit test case for Min/Max.
Misbehaving min()/max() rings a horrible bell, but I can't remember 
the context.
Maybe it isn't Min/Max itself, but the direct passing of the result of 
the inner call to the outer call that's faulty on Sparc...


Maybe you could compile a test program with a similar situation as the 
alignmentrequirement situation and check the parameter passing (if you 
can read Sparc assembly language)


Generally working on it. I'll be back.

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Pierre Free Pascal wrote:

  Hi,

I am sorry, but Ihave no access to a sprac machine anymore.
But I remember that we already had a problem like this coming
from the fact that we declare somewhere an empty record
and this lead to troubles...
  TVectorREgss from fpregs unit might still be empty for sparc.

This was fixed in
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/compiler/ncgld.pas?sortby
=dater1=19338r2=19337pathrev=19338
in May 2011...

  But I was hoping it was fixed in 2.6.2 ...


In both 2.6.2 and trunk registers are defined for SPARC, and even if 
they weren't it looks to my inexpert eye that there's a default of 128 
dummies so I'd not expect the record to be empty.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Mark Morgan Lloyd wrote:

Sven Barth wrote:

Am 08.08.2013 22:22, schrieb Mark Morgan Lloyd:

Sven Barth wrote:

If I revert to 2.6.2 and run ppcsparc under gdb, I get this as a 
backtrace:


Program received signal SIGFPE, Arithmetic exception.
0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE 
(this=0xf5d6abe0) at

ncgld.pas:785
785 if 
(right.location.reference.offset

mod alignmentrequirement0) or
(gdb) bt
#0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE
(this=0xf5d6abe0) at ncgld.pas:785



Also (if I'm doing this right)

(gdb) print alignmentrequirement
$1 = 0

Any thoughts appreciated.



This is strange. If you take a look at the code there are at least 
two checks that should ensure that alignmentrequirement is not 0... 
Could you maybe step into Min and Max to check whether they produce 
sane results? (you'll likely need to recompile the RTL with debug 
information; I'd suggest you to use 2.7.1 for debugging)
If you can't recompile the RTL with debug information you could try 
to break up the assignment statement for alignmentrequirement into 
single steps and print the values so that we can have a complete 
picture.


I'll take a look at that in the morning, probably by printing 
temporary values etc. since I'm not very confident trying to 
single-step somebody else's complex code. Allowing that this is 
apparently a compiler rather than an fp/libgdb issue, is there test 
code for this case anywhere?

We don't have an explicit test case for Min/Max.
Misbehaving min()/max() rings a horrible bell, but I can't remember 
the context.
Maybe it isn't Min/Max itself, but the direct passing of the result of 
the inner call to the outer call that's faulty on Sparc...


Maybe you could compile a test program with a similar situation as the 
alignmentrequirement situation and check the parameter passing (if you 
can read Sparc assembly language)


Generally working on it. I'll be back.


I think min() and parameter passing are OK. The problem appears to be 
that the length of [whatever] is zero, and this is propagating via 
alignmentrequirement to the mod operation. From debugging output, this 
/only/ appears to happen when building fp with libgdb, 2.6.2 will 
compile e.g. Lazarus 1.0 and produce something which looks generally OK.


If as the worst-possible kind of hack I do this

else
  begin
{ TODO: HACK: unaligned test, maybe remove all unaligned locations 
(array of char) from the compiler}
{ Use unaligned copy when the offset is not 
aligned }

len:=left.resultdef.size;
if len = 0 then
  len := sizeof(aint);
{ data smaller than an aint has less 
alignment requirements }


it fixes the compilation problem.

If nobody has any head-slappingly obvious quick fixes, is there any 
comparatively-simple way that I can at least report on what it's trying 
to compile that's causing the fault?


I'm left with issues like

..
Using assembler: /usr/bin/as
/usr/local/src/fpc/fpcbuild-2.6.2/fpcsrc/libgdb/linux/sparc/libgdb.a(ada-lang.o): 
In function `scaling_factor':
/usr/local/src/fpc/libgdb/gdb-6.7.1/gdb/ada-lang.c:8651: undefined 
reference to `_Q_utoq'
/usr/local/src/fpc/libgdb/gdb-6.7.1/gdb/ada-lang.c:8651: undefined 
reference to `_Q_utoq'

..

which I've not seen previously. Unless anybody has any suggestions (and 
time permitting) I'll take a look at older versions and try to work out 
when things started going wrong.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Sven Barth

On 09.08.2013 18:04, Sven Barth wrote:

On 09.08.2013 14:55, Mark Morgan Lloyd wrote:

Mark Morgan Lloyd wrote:

Sven Barth wrote:

Am 08.08.2013 22:22, schrieb Mark Morgan Lloyd:

Sven Barth wrote:


If I revert to 2.6.2 and run ppcsparc under gdb, I get this as a
backtrace:

Program received signal SIGFPE, Arithmetic exception.
0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE
(this=0xf5d6abe0) at
ncgld.pas:785
785 if
(right.location.reference.offset
mod alignmentrequirement0) or
(gdb) bt
#0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE
(this=0xf5d6abe0) at ncgld.pas:785



Also (if I'm doing this right)

(gdb) print alignmentrequirement
$1 = 0

Any thoughts appreciated.



This is strange. If you take a look at the code there are at least
two checks that should ensure that alignmentrequirement is not 0...
Could you maybe step into Min and Max to check whether they produce
sane results? (you'll likely need to recompile the RTL with debug
information; I'd suggest you to use 2.7.1 for debugging)
If you can't recompile the RTL with debug information you could try
to break up the assignment statement for alignmentrequirement
into single steps and print the values so that we can have a
complete picture.


I'll take a look at that in the morning, probably by printing
temporary values etc. since I'm not very confident trying to
single-step somebody else's complex code. Allowing that this is
apparently a compiler rather than an fp/libgdb issue, is there test
code for this case anywhere?

We don't have an explicit test case for Min/Max.

Misbehaving min()/max() rings a horrible bell, but I can't remember
the context.

Maybe it isn't Min/Max itself, but the direct passing of the result
of the inner call to the outer call that's faulty on Sparc...

Maybe you could compile a test program with a similar situation as
the alignmentrequirement situation and check the parameter passing
(if you can read Sparc assembly language)


Generally working on it. I'll be back.


I think min() and parameter passing are OK. The problem appears to be
that the length of [whatever] is zero, and this is propagating via
alignmentrequirement to the mod operation. From debugging output, this
/only/ appears to happen when building fp with libgdb, 2.6.2 will
compile e.g. Lazarus 1.0 and produce something which looks generally OK.

If as the worst-possible kind of hack I do this

 else
   begin
{ TODO: HACK: unaligned test, maybe remove all unaligned locations
(array of char) from the compiler}
 { Use unaligned copy when the offset is not
aligned }
 len:=left.resultdef.size;
if len = 0 then
   len := sizeof(aint);
 { data smaller than an aint has less
alignment requirements }

it fixes the compilation problem.

If nobody has any head-slappingly obvious quick fixes, is there any
comparatively-simple way that I can at least report on what it's trying
to compile that's causing the fault?


So you changed the len = 0 to len = 0? Then this is very strange,
because that almost surely shouldn't happen. Could you please print
somehow (either debugging or Writeln) the value of left.resultdef.typ
(yes, without e at the end!) when len = 0? Then we could at least
check which def produces problematic results here (is suspect records,
but just to be sure).


On the other hand the only def that I've found so far that does indeed 
return -1 in certain cases is the array... hmm...


Regards,
Sven

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Sven Barth wrote:


So you changed the len = 0 to len = 0? Then this is very strange,
because that almost surely shouldn't happen. Could you please print
somehow (either debugging or Writeln) the value of left.resultdef.typ
(yes, without e at the end!) when len = 0? Then we could at least
check which def produces problematic results here (is suspect records,
but just to be sure).


On the other hand the only def that I've found so far that does indeed 
return -1 in certain cases is the array... hmm...


Noting Pierre's comments from earlier, TIntRegs contains arrays for 
SPARC and PPC (and also for the catch-all case) but not for i386 or 68k.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Sven Barth

On 09.08.2013 19:05, Mark Morgan Lloyd wrote:

Sven Barth wrote:


So you changed the len = 0 to len = 0? Then this is very strange,
because that almost surely shouldn't happen. Could you please print
somehow (either debugging or Writeln) the value of left.resultdef.typ
(yes, without e at the end!) when len = 0? Then we could at least
check which def produces problematic results here (is suspect records,
but just to be sure).


On the other hand the only def that I've found so far that does indeed
return -1 in certain cases is the array... hmm...


Noting Pierre's comments from earlier, TIntRegs contains arrays for
SPARC and PPC (and also for the catch-all case) but not for i386 or 68k.



It seems to be a bug in the Sparc code generator nevertheless, because 
the IDE compiles (not assembles/links though :P ) using a Sparc cross 
compiler...


Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Sven Barth wrote:

On 09.08.2013 19:05, Mark Morgan Lloyd wrote:

Sven Barth wrote:


So you changed the len = 0 to len = 0? Then this is very strange,
because that almost surely shouldn't happen. Could you please print
somehow (either debugging or Writeln) the value of left.resultdef.typ
(yes, without e at the end!) when len = 0? Then we could at least
check which def produces problematic results here (is suspect records,
but just to be sure).


On the other hand the only def that I've found so far that does indeed
return -1 in certain cases is the array... hmm...


Noting Pierre's comments from earlier, TIntRegs contains arrays for
SPARC and PPC (and also for the catch-all case) but not for i386 or 68k.



It seems to be a bug in the Sparc code generator nevertheless, because 
the IDE compiles (not assembles/links though :P ) using a Sparc cross 
compiler...


But so far it appears to affect only this one bit of the compiler: 
nothing else. If I were paranoid I'd be invoking Ken Thompson's 
Trusting Trust paper http://cm.bell-labs.com/who/ken/trust.html


I'll put a bit more time on IDE+libgdb on various platforms, and might 
look at slightly older versions on SPARC. In the past I've had it 
running reasonably successfully on everything except ARM... which is an 
unfortunate exception since the sort of alignment problems which affect 
SPARC also affect at least some ARM variants.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Sven Barth wrote:


if len = 0 then
   len := sizeof(aint);


So you changed the len = 0 to len = 0? Then this is very strange, 
because that almost surely shouldn't happen.


No, I /added/ those two lines to make sure that len was never zero. I'm 
not saying that it's a valid hack, but after seeing that len == 0 only 
in that one place (i.e. never when compiling the remainder of the 
compiler etc.) I thought it a worthwhile experiment.


 Could you please print
 somehow (either debugging or Writeln) the value of left.resultdef.typ
 (yes, without e at the end!) when len = 0? Then we could at least
 check which def produces problematic results here (is suspect records,
 but just to be sure).

That of course was one of the things I was asking :-) With code as below 
(reformatted to avoid problems with wrap)


else
  begin
{ TODO: HACK: unaligned test, maybe remove all unaligned locations 
(array of char) from the compiler}

{ Use unaligned copy when the offset is not aligned }
len:=left.resultdef.size;

if len = 0 then begin
  WriteLn('= len: ', len);
  WriteLn('= typ: ', left.resultdef.typ)
end;
// if len = 0 then
//   len := sizeof(aint);

{ data smaller than an aint has less alignment requirements }
alignmentrequirement:=min(len,sizeof(aint));
if (right.location.reference.offset mod alignmentrequirement0) or
..

I get

= len: 0
= typ: recorddef

But it does appear to build properly on x86, without any zero-length types.


/usr/local/src/fpc/libgdb/gdb-6.7.1/gdb/ada-lang.c:8651: undefined
reference to `_Q_utoq'
..

which I've not seen previously. Unless anybody has any suggestions (and
time permitting) I'll take a look at older versions and try to work out
when things started going wrong.



This isn't related to FPC itself however. Here libgdb has some 
unresolved symbols.


[Nod] I'm investigating, but I /think/ I've had this version (6.7) 
working in the past. Fixing up the gcc-lib path in fpc.cfg doesn't help, 
in fact -vt output suggests that fpc automagically finds the right file 
irrespective.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Sven Barth

On 09.08.2013 21:03, Mark Morgan Lloyd wrote:

Sven Barth wrote:


if len = 0 then
   len := sizeof(aint);



So you changed the len = 0 to len = 0? Then this is very strange,
because that almost surely shouldn't happen.


No, I /added/ those two lines to make sure that len was never zero. I'm
not saying that it's a valid hack, but after seeing that len == 0 only
in that one place (i.e. never when compiling the remainder of the
compiler etc.) I thought it a worthwhile experiment.


Ah, 2.7.1 already contains (since April 2012) the check for len = 0, 
but this was never merged to 2.6.x, because it was part of the JVM port.



  Could you please print
  somehow (either debugging or Writeln) the value of left.resultdef.typ
  (yes, without e at the end!) when len = 0? Then we could at least
  check which def produces problematic results here (is suspect records,
  but just to be sure).

That of course was one of the things I was asking :-) With code as below
(reformatted to avoid problems with wrap)

else
   begin
{ TODO: HACK: unaligned test, maybe remove all unaligned locations
(array of char) from the compiler}
{ Use unaligned copy when the offset is not aligned }
 len:=left.resultdef.size;

if len = 0 then begin
   WriteLn('= len: ', len);
   WriteLn('= typ: ', left.resultdef.typ)
end;
// if len = 0 then
//   len := sizeof(aint);

{ data smaller than an aint has less alignment requirements }
 alignmentrequirement:=min(len,sizeof(aint));
 if (right.location.reference.offset mod alignmentrequirement0) or
..

I get

= len: 0
= typ: recorddef

But it does appear to build properly on x86, without any zero-length types.


Ok, so it is indeed a record that calculates the wrong size. Could you 
please add the following code after the assignment of len and tell me 
the output, so that we'll know which record exactly is the one that fails?


=== code begin ===

if len=0 then
  begin
if left.resultdef.typ=recorddef then
  writeln('=== objname: ',trecorddef(left.resultdef).objname^);
len:=sizeof(pint);
  end;

=== code end ===

I'll meanwhile investigate how a record calculates its size.

Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Sven Barth

On 09.08.2013 21:20, Sven Barth wrote:

  Could you please print
  somehow (either debugging or Writeln) the value of left.resultdef.typ
  (yes, without e at the end!) when len = 0? Then we could at least
  check which def produces problematic results here (is suspect records,
  but just to be sure).

That of course was one of the things I was asking :-) With code as below
(reformatted to avoid problems with wrap)

else
   begin
{ TODO: HACK: unaligned test, maybe remove all unaligned locations
(array of char) from the compiler}
{ Use unaligned copy when the offset is not aligned }
 len:=left.resultdef.size;

if len = 0 then begin
   WriteLn('= len: ', len);
   WriteLn('= typ: ', left.resultdef.typ)
end;
// if len = 0 then
//   len := sizeof(aint);

{ data smaller than an aint has less alignment requirements }
 alignmentrequirement:=min(len,sizeof(aint));
 if (right.location.reference.offset mod alignmentrequirement0) or
..

I get

= len: 0
= typ: recorddef

But it does appear to build properly on x86, without any zero-length
types.


Ok, so it is indeed a record that calculates the wrong size. Could you
please add the following code after the assignment of len and tell me
the output, so that we'll know which record exactly is the one that fails?

=== code begin ===

if len=0 then
   begin
 if left.resultdef.typ=recorddef then
   writeln('=== objname: ',trecorddef(left.resultdef).objname^);
 len:=sizeof(pint);
   end;

=== code end ===

I'll meanwhile investigate how a record calculates its size.


You might additionally add the following code to the end of the these 
methods of tabstractsymtable in unit symtable:

- setdatasize
- addfield
- addalignmentpadding
and also to trecordsymtable.insertunionst (also unit symtable):

=== code begin ===

if _datasize=0 then
  begin
write('== _datasize = 0 @', {$I %LINE%}, ': ');
if assigned(defowner) and (defowner.typ=recorddef) then
  writeln(trecorddef(defowner).objname^)
else
  writeln('unknown');
  end;

=== code end ===

Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Sven Barth wrote:

Ok, so it is indeed a record that calculates the wrong size. Could you 
please add the following code after the assignment of len and tell me 
the output, so that we'll know which record exactly is the one that fails?


=== code begin ===

if len=0 then
  begin
if left.resultdef.typ=recorddef then
  writeln('=== objname: ',trecorddef(left.resultdef).objname^);
len:=sizeof(pint);
  end;

=== code end ===

I'll meanwhile investigate how a record calculates its size.


Code reads (indent adjusted):

len:=left.resultdef.size;

if len = 0 then begin
  WriteLn('= len: ', len);
  WriteLn('= typ: ', left.resultdef.typ)
end;
if len=0 then
  begin
if left.resultdef.typ=recorddef then
  writeln('=== objname: ',trecorddef(left.resultdef).objname^);
len:=sizeof(pint);
  end;
// if len = 0 then
//   len := sizeof(aint);
{ data smaller than an aint has less alignment requirements }
alignmentrequirement:=min(len,sizeof(aint));
if (right.location.reference.offset mod alignmentrequirement0) or
..

Output is:

..
Using assembler: /usr/bin/as
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
/usr/local/src/fpc/fpcbuild-2.6.2/fpcsrc/libgdb/linux/sparc/libgdb.a(ada-lang.o): 
In function `scaling_factor':

..

I'm just about to add your next tests and redo. Recompilation is slow, 
and I don't think that firing up a bigger machine and using make -j 
helps that much.


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]

p.s. I now seem to have a Mac Classic II with a 68030. Wonder if it's 
any use for anything?

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Sven Barth

On 09.08.2013 23:19, Mark Morgan Lloyd wrote:

Sven Barth wrote:


Ok, so it is indeed a record that calculates the wrong size. Could you
please add the following code after the assignment of len and tell
me the output, so that we'll know which record exactly is the one that
fails?

=== code begin ===

if len=0 then
  begin
if left.resultdef.typ=recorddef then
  writeln('=== objname: ',trecorddef(left.resultdef).objname^);
len:=sizeof(pint);
  end;

=== code end ===

I'll meanwhile investigate how a record calculates its size.


Code reads (indent adjusted):

len:=left.resultdef.size;

if len = 0 then begin
   WriteLn('= len: ', len);
   WriteLn('= typ: ', left.resultdef.typ)
end;
if len=0 then
   begin
 if left.resultdef.typ=recorddef then
   writeln('=== objname: ',trecorddef(left.resultdef).objname^);
 len:=sizeof(pint);
   end;
// if len = 0 then
//   len := sizeof(aint);
{ data smaller than an aint has less alignment requirements }
alignmentrequirement:=min(len,sizeof(aint));
if (right.location.reference.offset mod alignmentrequirement0) or
..

Output is:

..
Using assembler: /usr/bin/as
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
/usr/local/src/fpc/fpcbuild-2.6.2/fpcsrc/libgdb/linux/sparc/libgdb.a(ada-lang.o):
In function `scaling_factor':
..

I'm just about to add your next tests and redo. Recompilation is slow,
and I don't think that firing up a bigger machine and using make -j
helps that much.



Ok, we now know that TVectorRegs is the culprit so we could try a 
simpler testcase than the whole IDE. Could you please try whether the 
following example triggers the exception as well? You can also speed up 
the compilation by just doing a make cycle in the compiler directory 
if this example works as intended.


=== code begin ===

program test;

const
  MaxRegs = 128;

type
  TVectorRegs = record
reg : array [0..MaxRegs-1] of string;
  end;

  TVectorView = object
OldRegs,NewRegs: TVectorRegs;
  end;

procedure DoAssignment(var aView: TVectorView);
begin
  aView.NewRegs := aView.OldRegs;
end;

var
  v: TVectorView;
begin
  DoAssignment(v);
end.

=== code end ===

Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-09 Thread Mark Morgan Lloyd

Sven Barth wrote:

On 09.08.2013 21:20, Sven Barth wrote:

  Could you please print
  somehow (either debugging or Writeln) the value of left.resultdef.typ
  (yes, without e at the end!) when len = 0? Then we could at least
  check which def produces problematic results here (is suspect 
records,

  but just to be sure).

That of course was one of the things I was asking :-) With code as below
(reformatted to avoid problems with wrap)

else
   begin
{ TODO: HACK: unaligned test, maybe remove all unaligned locations
(array of char) from the compiler}
{ Use unaligned copy when the offset is not aligned }
 len:=left.resultdef.size;

if len = 0 then begin
   WriteLn('= len: ', len);
   WriteLn('= typ: ', left.resultdef.typ)
end;
// if len = 0 then
//   len := sizeof(aint);

{ data smaller than an aint has less alignment requirements }
 alignmentrequirement:=min(len,sizeof(aint));
 if (right.location.reference.offset mod alignmentrequirement0) or
..

I get

= len: 0
= typ: recorddef

But it does appear to build properly on x86, without any zero-length
types.


Ok, so it is indeed a record that calculates the wrong size. Could you
please add the following code after the assignment of len and tell me
the output, so that we'll know which record exactly is the one that 
fails?


=== code begin ===

if len=0 then
   begin
 if left.resultdef.typ=recorddef then
   writeln('=== objname: ',trecorddef(left.resultdef).objname^);
 len:=sizeof(pint);
   end;

=== code end ===

I'll meanwhile investigate how a record calculates its size.


You might additionally add the following code to the end of the these 
methods of tabstractsymtable in unit symtable:

- setdatasize
- addfield
- addalignmentpadding
and also to trecordsymtable.insertunionst (also unit symtable):

=== code begin ===

if _datasize=0 then
  begin
write('== _datasize = 0 @', {$I %LINE%}, ': ');
if assigned(defowner) and (defowner.typ=recorddef) then
  writeln(trecorddef(defowner).objname^)
else
  writeln('unknown');
  end;

=== code end ===


== _datasize = 0 @1138:
== _datasize = 0 @1138:
== _datasize = 0 @1068: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
= len: 0
= typ: recorddef
=== objname: TVECTORREGS
== _datasize = 0 @1068:
== _datasize = 0 @1068:
== _datasize = 0 @1068:
== _datasize = 0 @1068:
== _datasize = 0 @1068:
== _datasize = 0 @1068:
== _datasize = 0 @1068:
== _datasize = 0 @1068:
/usr/local/src/fpc/fpcbuild-2.6.2/fpcsrc/libgdb/linux/sparc/libgdb.a(ada-lang.o): 
In function `scaling_factor':
/usr/local/src/fpc/libgdb/gdb-6.7.1/gdb/ada-lang.c:8651: undefined 
reference to `_Q_utoq'


1027 .addfield
1068 .addalignmentpadding
1138 .setdatasize

More later.

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


RE: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-08 Thread Pierre Free Pascal
  Hi Mark,

this is one of the problems with fpmake, sometimes we seems to loose
the output of the calls to the assembler or the linker :(

  Could you try to run make inside ide directory
and add -Xd option to OPT?
Does this solve your problem?

I get the same kind of error on i386-linux system because 
the compiler chooses  a system library for libreadline.a
instead of the one that is in GDBLIBDIR...


Pierre Muller


 -Message d'origine-
 De : fpc-devel-boun...@lists.freepascal.org [mailto:fpc-devel-
 boun...@lists.freepascal.org] De la part de Mark Morgan Lloyd
 Envoyé : jeudi 8 août 2013 11:02
 À : fpc-devel@lists.freepascal.org
 Objet : [fpc-devel] Compiling for libgdb, and using make -j on larger
SPARC
 systems
 
 I'm having one of my periodic attempts to check FPC trunk on various
 architectures, this was going to be a question about an exception when
 trying to link libgdb into 2.6.2 but I find the behaviour has changed so
 I mention that for information only. Also for information only, when I
 used -j 8 for 2.6.2 there was a message about left-over directories, I
 similarly don't get that with trunk (or it's intermittent) so let's
 leave it.
 
 So the current situation is this: when building FPC trunk on Debian
 Linux on SPARC, everything is fine if I use NOGDB=1. However, if I try
 to use libgdb (which has in the past but not particularly recently
 worked OK on this system) I get this
 
 make GDB_V603=1 OPT='-O- -gl' all
 ..
 ./fpmake compile --localunitdir=.. --globalunitdir=../packages
 --os=linux --cpu=sparc -o -Ur -o -Xs -o -O2 -o -n -o
 -Fu/usr/local/src/fpc/fpc-trunk/rtl/units/sparc-linux -o
 -Fu/usr/local/src/fpc/fpc-trunk/packages/paszlib/units/sparc-linux -o
 -Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-process/units/sparc-linux
 -o -Fu/usr/local/src/fpc/fpc-trunk/packages/hash/units/sparc-linux -o
 -Fu/usr/local/src/fpc/fpc-trunk/packages/libtar/units/sparc-linux -o
 -Fu/usr/local/src/fpc/fpc-trunk/packages/fpmkunit/units/sparc-linux -o
 -O- -o -gl -o -vt -o -dRELEASE
 --compiler=/usr/local/src/fpc/fpc-trunk/compiler/ppcsparc -bu
 Start compiling package ide for target sparc-linux.
 LibGDB was found, build IDE with debugger support
 Warning: Unable to determine the libgcc path.
 Compiling compiler/compunit.pas
 Compiling /usr/local/src/fpc/fpc-trunk/compiler/ppheap.pas
 Compiling /usr/local/src/fpc/fpc-trunk/compiler/cutils.pas
 ..
 Compiling /usr/local/src/fpc/fpc-trunk/compiler/dbgdwarf.pas
 Compiling /usr/local/src/fpc/fpc-trunk/compiler/browcol.pas
 Warning: Unable to determine the libgcc path.
 Compiling fp.pas
 Compiling fpcatch.pas
 Compiling fpcompil.pas
 ..
 Compiling fpcodtmp.pas
 Compiling fptemplt.pas
 Linking bin/sparc-linux/fp
 The installer encountered the following error:
 External command /usr/local/src/fpc/fpc-trunk/compiler/ppcsparc -Tlinux
 -FEbin/sparc-linux -FUunits/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/rtl/units/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/packages/fv/units/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/packages/chm/units/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-xml/units/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-base/units/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-res/units/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/packages/iconvenc/units/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/packages/regexpr/units/sparc-linux/
 -Fu/usr/local/src/fpc/fpc-trunk/packages/gdbint/units/sparc-linux/ -Fl
 -Ur -Xs -O2 -n -Fu/usr/local/src/fpc/fpc-trunk/rtl/units/sparc-linux
 -Fu/usr/local/src/fpc/fpc-trunk/packages/paszlib/units/sparc-linux
 -Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-process/units/sparc-linux
 -Fu/usr/local/src/fpc/fpc-trunk/packages/hash/units/sparc-linux
 -Fu/usr/local/src/fpc/fpc-trunk/packages/libtar/units/sparc-linux
 -Fu/usr/local/src/fpc/fpc-trunk/packages/fpmkunit/units/sparc-linux -O-
 -gl -vt -dRELEASE -Ur -dNOCATCH -dBrowserCol -dGDB -dsparc
 -Fu../compiler -Fu../compiler/sparc -Fu../compiler/targets
 -Fu../compiler/systems -Fi../compiler/sparc -Fi../compiler -Sg
 -Fl../libgdb/linux/sparc/ -viq fp.pas failed with exit code 1. Console
 output:
 Target OS: Linux for SPARC
 Compiling fp.pas
 fp.pas(27,2)  (2004) Start reading includefile globdir.inc
 Compiling fpcatch.pas
 ..
 Writing Resource String Table file: fpcatch.rst
 Assembling fpcatch
 Writing Resource String Table file: fp.rst
 Assembling fp
 Linking bin/sparc-linux/fp
 fp.pas(554) Error: Error while linking
 fp.pas(554) Fatal: There were 1 errors compiling module, stopping
 Fatal: Compilation aborted
 
 make[2]: Leaving directory `/usr/local/src/fpc/fpc-trunk/ide'
 make[1]: Leaving directory `/usr/local/src/fpc/fpc-trunk'
 
 The obvious first question is: are those references to libgcc
 significant, and what file is being looked for? The normal binary
 installer hasn't been run on this system since FPC's been built 

Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-08 Thread Mark Morgan Lloyd

Pierre Free Pascal wrote:


-Message d'origine-
De : fpc-devel-boun...@lists.freepascal.org [mailto:fpc-devel-
boun...@lists.freepascal.org] De la part de Mark Morgan Lloyd
Envoyé : jeudi 8 août 2013 11:02
À : fpc-devel@lists.freepascal.org
Objet : [fpc-devel] Compiling for libgdb, and using make -j on larger

SPARC

systems

I'm having one of my periodic attempts to check FPC trunk on various
architectures, this was going to be a question about an exception when
trying to link libgdb into 2.6.2 but I find the behaviour has changed so
I mention that for information only. Also for information only, when I
used -j 8 for 2.6.2 there was a message about left-over directories, I
similarly don't get that with trunk (or it's intermittent) so let's
leave it.

So the current situation is this: when building FPC trunk on Debian
Linux on SPARC, everything is fine if I use NOGDB=1. However, if I try
to use libgdb (which has in the past but not particularly recently
worked OK on this system) I get this

make GDB_V603=1 OPT='-O- -gl' all
..
./fpmake compile --localunitdir=.. --globalunitdir=../packages
--os=linux --cpu=sparc -o -Ur -o -Xs -o -O2 -o -n -o
-Fu/usr/local/src/fpc/fpc-trunk/rtl/units/sparc-linux -o
-Fu/usr/local/src/fpc/fpc-trunk/packages/paszlib/units/sparc-linux -o
-Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-process/units/sparc-linux
-o -Fu/usr/local/src/fpc/fpc-trunk/packages/hash/units/sparc-linux -o
-Fu/usr/local/src/fpc/fpc-trunk/packages/libtar/units/sparc-linux -o
-Fu/usr/local/src/fpc/fpc-trunk/packages/fpmkunit/units/sparc-linux -o
-O- -o -gl -o -vt -o -dRELEASE
--compiler=/usr/local/src/fpc/fpc-trunk/compiler/ppcsparc -bu
Start compiling package ide for target sparc-linux.
LibGDB was found, build IDE with debugger support
Warning: Unable to determine the libgcc path.
Compiling compiler/compunit.pas
Compiling /usr/local/src/fpc/fpc-trunk/compiler/ppheap.pas
Compiling /usr/local/src/fpc/fpc-trunk/compiler/cutils.pas
..
Compiling /usr/local/src/fpc/fpc-trunk/compiler/dbgdwarf.pas
Compiling /usr/local/src/fpc/fpc-trunk/compiler/browcol.pas
Warning: Unable to determine the libgcc path.
Compiling fp.pas
Compiling fpcatch.pas
Compiling fpcompil.pas
..
Compiling fpcodtmp.pas
Compiling fptemplt.pas
Linking bin/sparc-linux/fp
The installer encountered the following error:
External command /usr/local/src/fpc/fpc-trunk/compiler/ppcsparc -Tlinux
-FEbin/sparc-linux -FUunits/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/rtl/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/fv/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/chm/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-xml/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-base/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-res/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/iconvenc/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/regexpr/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/gdbint/units/sparc-linux/ -Fl
-Ur -Xs -O2 -n -Fu/usr/local/src/fpc/fpc-trunk/rtl/units/sparc-linux
-Fu/usr/local/src/fpc/fpc-trunk/packages/paszlib/units/sparc-linux
-Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-process/units/sparc-linux
-Fu/usr/local/src/fpc/fpc-trunk/packages/hash/units/sparc-linux
-Fu/usr/local/src/fpc/fpc-trunk/packages/libtar/units/sparc-linux
-Fu/usr/local/src/fpc/fpc-trunk/packages/fpmkunit/units/sparc-linux -O-
-gl -vt -dRELEASE -Ur -dNOCATCH -dBrowserCol -dGDB -dsparc
-Fu../compiler -Fu../compiler/sparc -Fu../compiler/targets
-Fu../compiler/systems -Fi../compiler/sparc -Fi../compiler -Sg
-Fl../libgdb/linux/sparc/ -viq fp.pas failed with exit code 1. Console
output:
Target OS: Linux for SPARC
Compiling fp.pas
fp.pas(27,2)  (2004) Start reading includefile globdir.inc
Compiling fpcatch.pas
..
Writing Resource String Table file: fpcatch.rst
Assembling fpcatch
Writing Resource String Table file: fp.rst
Assembling fp
Linking bin/sparc-linux/fp
fp.pas(554) Error: Error while linking
fp.pas(554) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted

make[2]: Leaving directory `/usr/local/src/fpc/fpc-trunk/ide'
make[1]: Leaving directory `/usr/local/src/fpc/fpc-trunk'

The obvious first question is: are those references to libgcc
significant, and what file is being looked for? The normal binary
installer hasn't been run on this system since FPC's been built on it
from source since something like 2.0.

Any and all suggestions appreciated.


   Hi Mark,

 this is one of the problems with fpmake, sometimes we seems to loose
 the output of the calls to the assembler or the linker :(

   Could you try to run make inside ide directory
 and add -Xd option to OPT?
 Does this solve your problem?

 I get the same kind of error on i386-linux system because
 the compiler chooses  a system library for libreadline.a
 instead of the one that is in 

Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-08 Thread Sven Barth
 External command /usr/local/bin/ppcsparc -Tlinux -FEbin/sparc-linux
-FUunits/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/rtl/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/fv/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/chm/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-xml/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-base/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/fcl-res/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/iconvenc/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/regexpr/units/sparc-linux/
-Fu/usr/local/src/fpc/fpc-trunk/packages/gdbint/units/sparc-linux/ -Fl
-Fu../rtl/units/sparc-linux -Fu../packages/paszlib/units/sparc-linux
-Fu../packages/fcl-process/units/sparc-linux
-Fu../packages/hash/units/sparc-linux
-Fu../packages/libtar/units/sparc-linux
-Fu../packages/fpmkunit/units/sparc-linux -O- -gl -Xd -Ur -dNOCATCH
-dBrowserCol -dGDB -dsparc -Fu../compiler -Fu../compiler/sparc
-Fu../compiler/targets -Fu../compiler/systems -Fi../compiler/sparc
-Fi../compiler -Sg -Fl../libgdb/linux/sparc/ -viq fp.pas failed with exit
code 217. Console output:
 Free Pascal Compiler version 2.6.2 [2013/08/05] for sparc
 Copyright (c) 1993-2012 by Florian Klaempfl and others

 Target OS: Linux for SPARC
 Compiling fp.pas
 ..
 Compiling /usr/local/src/fpc/fpc-trunk/compiler/sparc/itcpugas.pas
 Assembling itcpugas
 Compiling fpswitch.pas
 Compiling fpvars.pas
 Compiling fpdebug.pas
 Compiling fpregs.pas
 Compiling fpvars.pas
 Compiling fputils.pas
 Compiling fpvars.pas
 Compiling fpcalc.pas
 fpcalc.pas(236,3) Note: Local variable fpucw not used
 Writing Resource String Table file: fpcalc.rst
 Assembling fpcalc
 Assembling fpvars
 fputils.pas(239,5) Note: Local variable C is assigned but never used
 Assembling fputils
 fpregs.pas(281,8) Note: Local variable code is assigned but never used
 fpregs.pas(822,12) Note: Local variable value not used
 fpregs.pas(825,8) Note: Local variable res is assigned but never used
 fpregs.pas(827,8) Note: Local variable err is assigned but never used
 fpregs.pas(997,8) Note: Local variable top not used
 fpregs.pas(1002,7) Note: Local variable TypeStr not used
 fpregs.pas(1251,8) Note: Local variable reg is assigned but never used
 fpregs.pas(1251,12) Note: Local variable value not used
 fpregs.pas(1254,8) Note: Local variable res is assigned but never used
 fpregs.pas(1256,8) Note: Local variable err is assigned but never used
 fpregs.pas(1381,8) Note: Local variable top not used
 fpregs.pas(1382,8) Note: Local variable color is assigned but never used
 fpregs.pas(1384,8) Note: Local variable i not used
 fpregs.pas(1386,7) Note: Local variable TypeStr not used
 Fatal: Compilation aborted
 An unhandled exception occurred at $001E61C0 :
 EDivByZero : Division by zero
   $001E61C0  TCGASSIGNMENTNODE__PASS_GENERATE_CODE,  line 785 of ncgld.pas

 At this point: what's actually running, i.e. what command should I apply
gdb to to get a decent backtrace?

I think the command at the top is running, because tcgassignmentnode is a
class in the compiler.

Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-08 Thread Mark Morgan Lloyd

Mark Morgan Lloyd wrote:


Fatal: Compilation aborted
An unhandled exception occurred at $001E61C0 :
EDivByZero : Division by zero
  $001E61C0  TCGASSIGNMENTNODE__PASS_GENERATE_CODE,  line 785 of ncgld.pas

At this point: what's actually running, i.e. what command should I apply 
gdb to to get a decent backtrace?


If I revert to 2.6.2 and run ppcsparc under gdb, I get this as a backtrace:

Program received signal SIGFPE, Arithmetic exception.
0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE (this=0xf5d6abe0) at 
ncgld.pas:785
785 if (right.location.reference.offset 
mod alignmentrequirement0) or

(gdb) bt
#0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE 
(this=0xf5d6abe0) at ncgld.pas:785

#1  0x0014d9c4 in SECONDPASS (P=0xf5d6abe0) at pass_2.pas:195
#2  0x001daf94 in TCGBLOCKNODE__PASS_GENERATE_CODE (this=0xf5b1d320) at 
ncgbas.pas:366

#3  0x0014d9c4 in SECONDPASS (P=0xf5b1d320) at pass_2.pas:195
#4  0x001dc2b4 in TCGIFNODE__PASS_GENERATE_CODE (this=0xf5d737f0) at 
ncgflw.pas:275

#5  0x0014d9c4 in SECONDPASS (P=0xf5d737f0) at pass_2.pas:195
#6  0x001daf94 in TCGBLOCKNODE__PASS_GENERATE_CODE (this=0xf5b1c0a0) at 
ncgbas.pas:366

#7  0x0014d9c4 in SECONDPASS (P=0xf5b1c0a0) at pass_2.pas:195
#8  0x001daf94 in TCGBLOCKNODE__PASS_GENERATE_CODE (this=0xf5b1eaa0) at 
ncgbas.pas:366

#9  0x0014d9c4 in SECONDPASS (P=0xf5b1eaa0) at pass_2.pas:195
#10 0x0014db14 in DO_SECONDPASS (P=0xf5b1eaa0) at pass_2.pas:227
#11 0x0016a368 in TCGPROCINFO__GENERATE_CODE (this=0xf6357cd0) at 
psub.pas:1048
#12 0x0016c170 in DO_GENERATE_CODE (PI=0xf6357cd0, parentfp=0xffed8790) 
at psub.pas:1557

..

Also (if I'm doing this right)

(gdb) print alignmentrequirement
$1 = 0

Any thoughts appreciated.

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-08 Thread Sven Barth

On 08.08.2013 19:08, Mark Morgan Lloyd wrote:

Mark Morgan Lloyd wrote:


Fatal: Compilation aborted
An unhandled exception occurred at $001E61C0 :
EDivByZero : Division by zero
  $001E61C0  TCGASSIGNMENTNODE__PASS_GENERATE_CODE,  line 785 of
ncgld.pas

At this point: what's actually running, i.e. what command should I
apply gdb to to get a decent backtrace?


If I revert to 2.6.2 and run ppcsparc under gdb, I get this as a backtrace:

Program received signal SIGFPE, Arithmetic exception.
0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE (this=0xf5d6abe0) at
ncgld.pas:785
785 if (right.location.reference.offset
mod alignmentrequirement0) or
(gdb) bt
#0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE
(this=0xf5d6abe0) at ncgld.pas:785
#1  0x0014d9c4 in SECONDPASS (P=0xf5d6abe0) at pass_2.pas:195
#2  0x001daf94 in TCGBLOCKNODE__PASS_GENERATE_CODE (this=0xf5b1d320) at
ncgbas.pas:366
#3  0x0014d9c4 in SECONDPASS (P=0xf5b1d320) at pass_2.pas:195
#4  0x001dc2b4 in TCGIFNODE__PASS_GENERATE_CODE (this=0xf5d737f0) at
ncgflw.pas:275
#5  0x0014d9c4 in SECONDPASS (P=0xf5d737f0) at pass_2.pas:195
#6  0x001daf94 in TCGBLOCKNODE__PASS_GENERATE_CODE (this=0xf5b1c0a0) at
ncgbas.pas:366
#7  0x0014d9c4 in SECONDPASS (P=0xf5b1c0a0) at pass_2.pas:195
#8  0x001daf94 in TCGBLOCKNODE__PASS_GENERATE_CODE (this=0xf5b1eaa0) at
ncgbas.pas:366
#9  0x0014d9c4 in SECONDPASS (P=0xf5b1eaa0) at pass_2.pas:195
#10 0x0014db14 in DO_SECONDPASS (P=0xf5b1eaa0) at pass_2.pas:227
#11 0x0016a368 in TCGPROCINFO__GENERATE_CODE (this=0xf6357cd0) at
psub.pas:1048
#12 0x0016c170 in DO_GENERATE_CODE (PI=0xf6357cd0, parentfp=0xffed8790)
at psub.pas:1557
..

Also (if I'm doing this right)

(gdb) print alignmentrequirement
$1 = 0

Any thoughts appreciated.



This is strange. If you take a look at the code there are at least two 
checks that should ensure that alignmentrequirement is not 0... Could 
you maybe step into Min and Max to check whether they produce sane 
results? (you'll likely need to recompile the RTL with debug 
information; I'd suggest you to use 2.7.1 for debugging)
If you can't recompile the RTL with debug information you could try to 
break up the assignment statement for alignmentrequirement into single 
steps and print the values so that we can have a complete picture.


Regards,
Sven
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-08 Thread Mark Morgan Lloyd

Sven Barth wrote:

If I revert to 2.6.2 and run ppcsparc under gdb, I get this as a 
backtrace:


Program received signal SIGFPE, Arithmetic exception.
0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE (this=0xf5d6abe0) at
ncgld.pas:785
785 if (right.location.reference.offset
mod alignmentrequirement0) or
(gdb) bt
#0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE
(this=0xf5d6abe0) at ncgld.pas:785



Also (if I'm doing this right)

(gdb) print alignmentrequirement
$1 = 0

Any thoughts appreciated.



This is strange. If you take a look at the code there are at least two 
checks that should ensure that alignmentrequirement is not 0... Could 
you maybe step into Min and Max to check whether they produce sane 
results? (you'll likely need to recompile the RTL with debug 
information; I'd suggest you to use 2.7.1 for debugging)
If you can't recompile the RTL with debug information you could try to 
break up the assignment statement for alignmentrequirement into single 
steps and print the values so that we can have a complete picture.


I'll take a look at that in the morning, probably by printing temporary 
values etc. since I'm not very confident trying to single-step somebody 
else's complex code. Allowing that this is apparently a compiler rather 
than an fp/libgdb issue, is there test code for this case anywhere?


Misbehaving min()/max() rings a horrible bell, but I can't remember the 
context.


I'm glad to say that at least removing the -O- has no beneficial effect :-)

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


RE: [fpc-devel] Compiling for libgdb, and using make -j on larger SPARC systems

2013-08-08 Thread Pierre Free Pascal
  Hi,

I am sorry, but Ihave no access to a sprac machine anymore.
But I remember that we already had a problem like this coming
from the fact that we declare somewhere an empty record
and this lead to troubles...
  TVectorREgss from fpregs unit might still be empty for sparc.

This was fixed in
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/compiler/ncgld.pas?sortby
=dater1=19338r2=19337pathrev=19338
in May 2011...

  But I was hoping it was fixed in 2.6.2 ...

  Could you try to recompile trunk compiler and check that that one
does not crash.

Pierre

PS :Test bug is tiny:
Try to compile the following, with either 2.6.2 or current trunk binary,

type
  emptyrec = record
  end;

var
  x, y : emptyrec;

begin
  x:=y;
end.

 -Message d'origine-
 De : fpc-devel-boun...@lists.freepascal.org [mailto:fpc-devel-
 boun...@lists.freepascal.org] De la part de Mark Morgan Lloyd
 Envoyé : jeudi 8 août 2013 22:22
 À : fpc-devel@lists.freepascal.org
 Objet : Re: [fpc-devel] Compiling for libgdb, and using make -j on larger
 SPARC systems
 
 Sven Barth wrote:
 
  If I revert to 2.6.2 and run ppcsparc under gdb, I get this as a
  backtrace:
 
  Program received signal SIGFPE, Arithmetic exception.
  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE (this=0xf5d6abe0)
at
  ncgld.pas:785
  785 if (right.location.reference.offset
  mod alignmentrequirement0) or
  (gdb) bt
  #0  0x001e61c0 in TCGASSIGNMENTNODE__PASS_GENERATE_CODE
  (this=0xf5d6abe0) at ncgld.pas:785
 
  Also (if I'm doing this right)
 
  (gdb) print alignmentrequirement
  $1 = 0
 
  Any thoughts appreciated.
 
 
  This is strange. If you take a look at the code there are at least two
  checks that should ensure that alignmentrequirement is not 0... Could
  you maybe step into Min and Max to check whether they produce sane
  results? (you'll likely need to recompile the RTL with debug
  information; I'd suggest you to use 2.7.1 for debugging)
  If you can't recompile the RTL with debug information you could try to
  break up the assignment statement for alignmentrequirement into single
  steps and print the values so that we can have a complete picture.
 
 I'll take a look at that in the morning, probably by printing temporary
 values etc. since I'm not very confident trying to single-step somebody
 else's complex code. Allowing that this is apparently a compiler rather
 than an fp/libgdb issue, is there test code for this case anywhere?
 
 Misbehaving min()/max() rings a horrible bell, but I can't remember the
 context.
 
 I'm glad to say that at least removing the -O- has no beneficial effect
:-)
 
 --
 Mark Morgan Lloyd
 markMLl .AT. telemetry.co .DOT. uk
 
 [Opinions above are the author's, not those of his employers or
colleagues]
 ___
 fpc-devel maillist  -  fpc-devel@lists.freepascal.org
 http://lists.freepascal.org/mailman/listinfo/fpc-devel

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel