[fpc-devel] porting fpc to Blue Gene/P: a cthreads bug

Peter Popov ppopov99 at gmail.com
Wed Jul 29 15:50:53 CEST 2009

Hi All
I've been porting fpc 2.3.1 to a Blue Gene/P system (BG/P) and I hit a  
bizarre bug in cthreads which I have no clue about. Needless to say, it  
occurs only on the BG/P backend - this is the massivel parallel computing  
part. To make the story short: these are thousands of powerpc chips which  
run a "linux-like" stripped down kernel, no terminal in my case, debugging  
is very limited.

Basically I figured how to create the posix thread right. However when the  
thread function (ThreadMain) is about to return it calls  
pthread_exit(...). Now this results in a failed assertation in gcc, signal  
6 and a coredump.

I was able to trace it to the unwinding of the gcc exception handler for  
the terminating thread. An obvious assertation fails (in unwind-dw2.c),  
which means that some basic startup data of gcc is either 1) messed up 2)  
not initialized.

So, I have two related questions:
1. Is the pthread_exit(...) call essential in ThreadMain?
2. This bug is either in the setup of some basic unit (system, initc,  
basicunix, unix), or something in gcc needs to be initialized. Am I  
missing anything?

What I've done so far is this (short story): I made a very simple example  
in which pthread_create is called directly with very simple thread  
function. It is along the lines of this  
http://bugs.freepascal.org/view.php?id=14176 . This time however I removed  
all I/O and no obvious threadvars. It runs fine on a regular linux-powerpc  
and crashes on the BG/P computing nodes. I then compiled the function  
which call pthread_create(...) along with the thread functions with gcc  
and then linked against a pascal main function with fpc. The idea was to  
have fpc start the main function and then execute the same code with gcc.  
This one worked fine on BG/P. This makes me think initialization of GCC is  
OK, e.g. cprt0.as is fine.

Could anyone suggest a good debugging strategy? I am wondering if it is  
easy to generate a "bare bone" system unit which only makes the compiler  
happy, no functions, no threadvars, etc. That is, nothing, except orderly  
initialization of libc.

I will welcome any suggestions

Peter Popov

More information about the fpc-devel mailing list