php crash


I was trying to build php using LLVM/Clang (trunk) on Mac OS X, 10.5.6.

Apple gcc works.

Clang generates a buggy executable. under php source root,
CC=clang ./configure --disable-all
make test

The resulting `php' will crash, even with an empty php file.

Argument strings on the stack at: c0000000
#1 0x00164db7 in execute ()
#2 0x001436fd in zend_execute_scripts ()
#3 0x000ee779 in php_execute_script ()
#4 0x001c18c2 in main ()

Clang works well when building php in debug mode.
CC=clang ./configure --disable-all --enable-debug

Is this a problem with the LLVM optimizer or the Clang front-end? Thanks.

- xi


I downloaded the file here, and used the same commands.

This is what I got:

Number of tests : 9537 5371
Tests skipped : 4166 ( 43.7%) --------
Tests warned : 0 ( 0.0%) ( 0.0%)
Tests failed : 7 ( 0.1%) ( 0.1%)
Expected fail : 3 ( 0.0%) ( 0.1%)
Tests passed : 5361 ( 56.2%) ( 99.8%)

I'm on linux x86_64 with clang version: "clang version 1.0
( 68002M)". Not sure why
it's working here...

- Anders

It is impossible to tell with this amount of detail. Does it work correctly if you build with -O0 ?


Thanks! I only tried Mac OS X and Linux, both 32 bit. I will find a
linux x86_64.

- xi

Yes, with -O0 the resulting executable looks fine. --enable-debug
actually sets -O0 (otherwise -O2).

Clang can build/test php 5.2.9 with either -O0 or -O2, but not for php
5.3RC0 with -O2. I further looked into the php code. It seems that
php 5.3 is using inline asm. Is that the reason?

- xi

What version of clang are you using? It could be a regression between
head and the version I used. (some days old)

- Anders

I tried the version you used, too. the resulting executable was still broken.

I guess the reason is due to fastcall on function pointers, which
Clang does not recognize. Consider the following snippet.

#include <stdio.h>

void __attribute__((fastcall)) f(int i)
    printf("%d\n", i);

typedef void (*__attribute__((fastcall)) f_t)(int i);
//typedef void __attribute__((fastcall)) (*f_t)(int i);

int main()
    f_t fp = f;

Clang does not catch the attribute on f_t; instead it produces a
warning "'fastcall' attribute only applies to function types". so the
function pointer might be miscompiled.

stdcall should cause the similar problem as well.

On x64 there is no use of fastcall or stdcall. so Clang produces a
correct php executable.

- xi

a quick patch and a test file attached.

1. eliminate warnings of fastcall/stdcall on function pointers.
2. set TargetDecl to typedef declaration.
3. set correct calling convention when emitting call.

- xi

call.patch (2.84 KB)

test.c (195 Bytes)