Compiling with clang & linking with LLVM-ld

Hello,

I'm aiming to eventually incorporate clang and lld into a program in order to compile native C++ code at runtime. I built LLVM with clang and LLVM-ld in the tools directory with CMake using VS2012 as the generator. Right now I'm just trying to compile and link a simple test program (just an empty main) with clang/lld just to see how things work.

I'm using -c and trying to link with lld manually since clang++ wants to use link.exe.

C:\Program Files (x86)\LLVM\build\bin\Debug>clang++ -o test.o test.cpp -c -v
clang version 3.3 (trunk)
Target: i686-pc-win32
Thread model: posix
"C:/Program Files (x86)/LLVM/build/bin/Debug/clang++.exe" -cc1 -triple i686-pc-win32 -emit-obj -mrelax-all -disable-free -main-file-name test.cpp -mrelocation-model static -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -target-cpu pentium4 -v -coverage-file test.o -resource-dir "C:/Program Files (x86)/LLVM/build/bin/Debug\\..\\lib\\clang\\3.3" -internal-isystem "C:/Program Files (x86)/LLVM/build/bin/Debug/../lib/clang/3.3/include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\include" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\8.0\\\\include" -std=c++11 -fdeprecated-macro -ferror-limit 19 -fmessage-length 150 -mstackrealign -fms-extensions -fms-compatibility -fmsc-version=1300 -fdelayed-template-parsing -fobjc-runtime=gcc -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -backend-option -vectorize-loops -o test.o -x c++ test.cpp
clang -cc1 version 3.3 based upon LLVM 3.3svn default target i686-pc-win32
#include "..." search starts here:
#include <...> search starts here:
C:/Program Files (x86)/LLVM/build/bin/Debug/../lib/clang/3.3/include
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include
C:\Program Files (x86)\Windows Kits\8.0\\include
End of search list.

The .o file is successfully created so I try to run the linker on it. This is where I get this output and lld crashes.

C:\Program Files (x86)\LLVM\build\bin\Debug>lld -flavor core test.o
YAML:1:2: error: Got empty plain scalar
LÔiyQQ.text< P`U‰åP¸ÇEüƒÄ]Ã.text_main
Assertion failed: Val && "isa<> used on a null pointer", file C:\Program Files (x86)\LLVM\include\llvm/Support/Casting.h, line 97
Stack dump:
0. Program arguments: lld -flavor core test.o
0x6E9CA16A (0x0000000A 0x00000000 0x00C0F59C 0x6EAA4074), exit() + 0x13A bytes(s)
0x6EAB47BC (0x00C0F734 0x00C0F5B0 0x00000082 0x00C0EAA4), abort() + 0x1C bytes(s)
0x6EAA4074 (0x01612BC8 0x01612970 0x00000061 0x00C0F748), _wassert() + 0xD4 bytes(s)
0x01505577 (0x00000000 0x00C0F5D0 0x015057E3 0x00C0F5CC), llvm::isa_impl_cl<llvm::yaml::NullNode,llvm::yaml::Node const *>::doit() + 0x27 bytes(s), c:\program files (x86)\llvm\include\llvm\support\casting.h, line 97 + 0x23 byte(s)
0x015057AE (0x00C0F5CC 0x00000000 0x00C0F5DC 0x0150047C), llvm::isa_impl_wrap<llvm::yaml::NullNode,llvm::yaml::Node const *,llvm::yaml::Node const *>::doit() + 0xE bytes(s), c:\program files (x86)\llvm\include\llvm\support\casting.h, line 124 + 0xB byte(s)
0x015057E3 (0x00C0F5F4 0x00C0F600 0x014FD75E 0x00C0F5F4), llvm::isa_impl_wrap<llvm::yaml::NullNode,llvm::yaml::Node * const,llvm::yaml::Node const *>::doit() + 0x23 bytes(s), c:\program files (x86)\llvm\include\llvm\support\casting.h, line 116 + 0x18 byte(s)
0x0150047C (0x00C0F5F4 0xCCCCCCCC 0x00000000 0xCCCCCCCC), llvm::isa<llvm::yaml::NullNode,llvm::yaml::Node *>() + 0xC bytes(s), c:\program files (x86)\llvm\include\llvm\support\casting.h, line 136 + 0x9 byte(s)
0x014FD75E (0xCCCCCCCC 0xCCCCCCCC 0x00000000 0x00C0F734), llvm::yaml::Input::setCurrentDocument() + 0x6E bytes(s), c:\program files (x86)\llvm\lib\support\yamltraits.cpp, line 69 + 0x9 byte(s)
0x0143958A (0x00C0F698 0x00C0F680 0x00C0F7A0 0xCCCCCCCC), llvm::yaml::operator>><std::vector<lld::File const *,std::allocator<lld::File const *> > >() + 0x2A bytes(s), c:\program files (x86)\llvm\include\llvm\support\yamltraits.h, line 944 + 0x8 byte(s)
0x0145241A (0x00C0F960 0x00C0F778 0x00C0F970 0x00C0F76C), lld::yaml::ReaderYAML::parseFile() + 0x7A bytes(s), c:\program files (x86)\llvm\tools\lld\lib\readerwriter\yaml\readerwriteryaml.cpp, line 1360 + 0x13 byte(s)
0x01454A0C (0x00C0F960 0x00C0F778 0x00C0F970 0x00C0F9E0), lld::CoreTargetInfo::parseFile() + 0x7C bytes(s), c:\program files (x86)\llvm\tools\lld\lib\readerwriter\coretargetinfo.cpp, line 365 + 0x29 byte(s)
0x01465185 (0x00C0F960 0x00D52A00 0x00000006 0x00C0F970), lld::TargetInfo::readFile() + 0x95 bytes(s), c:\program files (x86)\llvm\tools\lld\lib\core\targetinfo.cpp, line 36 + 0x1B byte(s)
0x0123D15A (0x00C0F9FC 0x0174AB90 0x00C0FAE8 0xCCCCCCCC), lld::Driver::link() + 0x1BA bytes(s), c:\program files (x86)\llvm\tools\lld\lib\driver\driver.cpp, line 48 + 0x2D byte(s)
0x0123C3AF (0x00000002 0x00D51E98 0x0174AB90 0x00000004), lld::CoreDriver::link() + 0x5F bytes(s), c:\program files (x86)\llvm\tools\lld\lib\driver\coredriver.cpp, line 75 + 0xF byte(s)
0x012332A5 (0x00000004 0x00D4EE48 0x0174AB90 0x00000000), lld::UniversalDriver::link() + 0xE5 bytes(s), c:\program files (x86)\llvm\tools\lld\lib\driver\universaldriver.cpp, line 126 + 0x1B byte(s)
0x01231406 (0x00000004 0x00D4EE48 0x00D4FD38 0x3D2279F5), main() + 0x46 bytes(s), c:\program files (x86)\llvm\tools\lld\tools\lld\lld.cpp, line 36 + 0x13 byte(s)
0x01530799 (0x00C0FB4C 0x77403677 0x7EFDE000 0x00C0FB8C), __tmainCRTStartup() + 0x199 bytes(s), f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c, line 536 + 0x19 byte(s)
0x015308DD (0x7EFDE000 0x00C0FB8C 0x77E89F42 0x7EFDE000), mainCRTStartup() + 0xD bytes(s), f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c, line 377
0x77403677 (0x7EFDE000 0x739C9B37 0x00000000 0x00000000), BaseThreadInitThunk() + 0x12 bytes(s)
0x77E89F42 (0x015308D0 0x7EFDE000 0x00000000 0x00000000), RtlInitializeExceptionChain() + 0x63 bytes(s)
0x77E89F15 (0x015308D0 0x7EFDE000 0x00000000 0x00000000), RtlInitializeExceptionChain() + 0x36 bytes(s)

I have a few questions. Firstly, am I invoking lld correctly? What args should I be using to successfully link a program? How can I configure clang++ to use lld by default?

Secondly and a little more broadly, how complete is LLVM-ld? Is it capable of fully linking programs on its own or does it still rely on GCC?

Thanks a lot for your time.