On Mon, 21 Feb 2011 22:26:09 -0500
Edmon Begoli <ebeg...@gmail.com> wrote:

> Hi,
> 
> My name is Edmon Begoli and I am a graduate student in computer science.
> 
> I am writing a graduate research paper on how are concurrent routines complied
> in different languages. I want to start with a sort of a base case showing how
> are Mutexes and thread initiation routines in C compiled by GCC into 
> assembler.
> 

You question very probably belongs more to gcc-help@

> I tried to look into a assembly and I did search for several days
> forums and forums and manuals
> but I could not find some simple example or a piece of a source code
> that shows how may
> piece of code like this:
> 
> http://www.cs.cf.ac.uk/Dave/C/node31.html#SECTION003117100000000000000
> 
> be compiled into for example some basic version of Intel x86 assembler
> on Linux 2.6 kernel.

your example there is

#include <pthread.h> 
pthread_mutex_t count_mutex; 
long long count; 
void increment_count() 
   { pthread_mutex_lock(&count_mutex); 
     count = count + 1;
     pthread_mutex_unlock(&count_mutex); 
   }   

As far as I know, there is nothing special in GCC to compile such a code. All 
the interesting stuff happens in pthread routines (like pthread_mutex_lock). To 
understand in detail what GCC is doing, you could save the above code chunk in 
a file lockedcount.c -inside an otherwise emptyy directory- and compile that 
file with
  gcc -phtread -S -O2 -fdump-tree-all -fverbose-asm lockedcount.c

Then you'll see the generated assembly code lockedcount.s and many "dump" files 
which are showing the various internal representations (Gimple, Gimple/SSA, 
...) of the code within GCC.

On my computer the function gets compiled to

        .p2align 4,,15
.globl increment_count
        .type   increment_count, @function
increment_count:
.LFB1:
        .cfi_startproc
        subq    $8, %rsp        #,
        .cfi_def_cfa_offset 16
        movl    $count_mutex, %edi      #,
        call    pthread_mutex_lock      #
        addq    $1, count(%rip) #, count
        movl    $count_mutex, %edi      #,
        addq    $8, %rsp        #,
        .cfi_def_cfa_offset 8
        jmp     pthread_mutex_unlock    #
        .cfi_endproc
.LFE1:

As you can see, the synchronisation routines (pthread_mutex_lock...) get called 
like any other ordinary routine. All the synchronisation magic happens inside 
them (in the libpthread.so library). You'll need to dig the source code of 
glibc/NPTL to understand the details.

When your work is done, please publish it (in English) on some publicly 
accessible web page. I'm sure that would interest some people. 

Regards, good luck.
-- 
Basile STARYNKEVITCH         http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mine, sont seulement les miennes} ***

Reply via email to