Linker error with -flto

$ cat test.c
struct Foo
{
  int x, y;
};

int main( void )
{
  struct Foo f = { 0, 0 };
  return 0;
}

$ llvm-gcc-4.2 test.c
$ llvm-gcc-4.2 test.c -flto
$ clang test.c
$ clang test.c -flto
Intrinsic prototype has incorrect number of arguments!
void (i8*, i8, i64, i32, i1)* @llvm.memset.p0i8.i64
Broken module found, compilation aborted!
Stack dump:
0. Running pass 'Function Pass Manager' on module 'ld-temp.o'.
1. Running pass 'Module Verifier' on function '@main'
clang: error: linker command failed due to signal 6 (use -v to see invocation)

$ clang --version
Apple clang version 1.5 (tags/Apple/clang-60)
Target: x86_64-apple-darwin10
Thread model: posix

With debugging info turned on, the error message is different:
$ clang test.c -flto -gdwarf2
ld: in /var/folders/88/88AKX+F62RWmd++8ZOxBkU+++TQ/-Tmp-/cc-qjdqFJ.o, could not parse object file /var/folders/88/88AKX+F62RWmd++8ZOxBkU+++TQ/-Tmp-/cc-qjdqFJ.o: Unknown instruction
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Robert P.

$ cat test.c
struct Foo
{
  int x, y;
};

int main( void )
{
  struct Foo f = { 0, 0 };
  return 0;
}

$ llvm-gcc-4.2 test.c
$ llvm-gcc-4.2 test.c -flto
$ clang test.c
$ clang test.c -flto
Intrinsic prototype has incorrect number of arguments!
void (i8*, i8, i64, i32, i1)* @llvm.memset.p0i8.i64
Broken module found, compilation aborted!
Stack dump:
0. Running pass 'Function Pass Manager' on module 'ld-temp.o'.
1. Running pass 'Module Verifier' on function '@main'
clang: error: linker command failed due to signal 6 (use -v to see invocation)

This sounds like you're using clang with an old liblto. Try replacing the liblto (in /usr/lib/libLTO.dylib and /Developer/usr/lib/libLTO.dylib) with the one built when you built clang.

-Chris

Chris Lattner wrote:

$ cat test.c
struct Foo
{
  int x, y;
};

int main( void )
{
  struct Foo f = { 0, 0 };
  return 0;
}

$ llvm-gcc-4.2 test.c
$ llvm-gcc-4.2 test.c -flto
$ clang test.c
$ clang test.c -flto
Intrinsic prototype has incorrect number of arguments!
void (i8*, i8, i64, i32, i1)* @llvm.memset.p0i8.i64
Broken module found, compilation aborted!
Stack dump:
0. Running pass 'Function Pass Manager' on module 'ld-temp.o'.
1. Running pass 'Module Verifier' on function '@main'
clang: error: linker command failed due to signal 6 (use -v to see invocation)

This sounds like you're using clang with an old liblto. Try replacing the liblto (in /usr/lib/libLTO.dylib and /Developer/usr/lib/libLTO.dylib) with the one built when you built clang.

I didn't build it. Everything is from the recent Xcode 3.2.3 release

$ ls -l /usr/lib/libLTO.dylib
-rwxrwxr-x 1 root admin 25934400 11 May 11:49 /usr/lib/libLTO.dylib
$ ls -l /Developer/usr/lib/libLTO.dylib
-rwxrwxr-x 1 root admin 25934400 11 May 11:49 /Developer/usr/lib/libLTO.dylib

$ clang --version
Apple clang version 1.5 (tags/Apple/clang-60)

Robert P.

That turns out to be a serious bug in Xcode 3.2.3. I'll file a bug internally, thanks!

-Chris