This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [lambda] Segmentation fault in simple lambda program
- From: Ian Lance Taylor <iant at google dot com>
- To: Esben Mose Hansen <kde at mosehansen dot dk>
- Cc: gcc at gcc dot gnu dot org
- Date: Wed, 29 Apr 2009 17:26:27 -0700
- Subject: Re: [lambda] Segmentation fault in simple lambda program
- References: <200904292143.01805.kde@mosehansen.dk>
Esben Mose Hansen <kde@mosehansen.dk> writes:
> this program SEGFAULTs
>
> #include <algorithm>
>
> int main() {
> int numbers[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
> const std::size_t nn = sizeof(numbers)/sizeof(int);
> int sum = 0;
> int f = 5;
> std::for_each(&numbers[0], &numbers[nn], [&] (int n) {
> sum += n * f;
> });
>
> }
>
> Now, my assembly days are some 15 years past, but the disassembly is
>
> 0x08048424 <_ZZ4mainENK9__lambda0clEiz+0>: push %ebp
> 0x08048425 <_ZZ4mainENK9__lambda0clEiz+1>: mov %esp,%ebp
> 0x08048427 <_ZZ4mainENK9__lambda0clEiz+3>: mov 0x8(%ebp),%eax
> 0x0804842a <_ZZ4mainENK9__lambda0clEiz+6>: mov 0x4(%eax),%eax
> 0x0804842d <_ZZ4mainENK9__lambda0clEiz+9>: mov 0x8(%ebp),%edx
> 0x08048430 <_ZZ4mainENK9__lambda0clEiz+12>: mov 0x4(%edx),%edx
> 0x08048433 <_ZZ4mainENK9__lambda0clEiz+15>: mov (%edx),%ecx
> 0x08048435 <_ZZ4mainENK9__lambda0clEiz+17>: mov 0x8(%ebp),%edx
> 0x08048438 <_ZZ4mainENK9__lambda0clEiz+20>: mov (%edx),%edx
> 0x0804843a <_ZZ4mainENK9__lambda0clEiz+22>: mov (%edx),%edx
> 0x0804843c <_ZZ4mainENK9__lambda0clEiz+24>: imul 0xc(%ebp),%edx
> 0x08048440 <_ZZ4mainENK9__lambda0clEiz+28>: lea (%ecx,%edx,1),%edx
> => SEGFAULT 0x08048443 <_ZZ4mainENK9__lambda0clEiz+31>: mov %edx,(%eax)
> 0x08048445 <_ZZ4mainENK9__lambda0clEiz+33>: pop %ebp
> 0x08048446 <_ZZ4mainENK9__lambda0clEiz+34>: ret
>
> I have marked the segfault spot. I also find 0x0804843a suspicious, but then I
> don't even know how to print register values in gcc.
>
> Any pointers to where I should dig? I am completely new to gcc hacking, just
> dying to get lambda into gcc 4.5 :)
>
> P.S: Shouldn't gcc show the actual lambda function code ( sum+= f*c; ) instead
> of the assembly code in any case?
Since lambda is primarily a front-end construct, you may find it more
useful to use the -fdump-tree-XXX options and to look at the tree dumps
to make sure that they look OK. I haven't looked at the lambda branch,
but I assume that it creates nested functions, which do work in other
languages.
Ian