> the libraries are vast, don't have stable binary interfaces, and don't validate parameters, which means that if you get anything wrong it tends to just segfault deep inside somewhere.
Did you compile LLVM in Debug+Asserts mode? I rarely ever get segfaults from LLVM in this mode: I just get assertions when constructing invalid IR nodes.
> Plus, distribution support has always been pretty poor. e.g. Debian's 3.3 package's llvm-config tries to link your program against the static libraries rather than the dynamic ones, which leads to painfully large link times.
The link times aren't so bad if you use gold.
> You have a standardised intermediate format which you can throw at any compiler, which is trivially verifiable
I wouldn't say it's trivially verifiable. The undefined behavior rules of C are vast, and compiler authors have to know them incredibly well.
> But biggest of all, you don't have to keep knowledge of the LLVM API in your brain while you're trying to get work done.
But you have to keep C's undefined behavior rules in the back of your brain (such as signed overflow == UB!), which is worse.
Did you compile LLVM in Debug+Asserts mode? I rarely ever get segfaults from LLVM in this mode: I just get assertions when constructing invalid IR nodes.
> Plus, distribution support has always been pretty poor. e.g. Debian's 3.3 package's llvm-config tries to link your program against the static libraries rather than the dynamic ones, which leads to painfully large link times.
The link times aren't so bad if you use gold.
> You have a standardised intermediate format which you can throw at any compiler, which is trivially verifiable
I wouldn't say it's trivially verifiable. The undefined behavior rules of C are vast, and compiler authors have to know them incredibly well.
> But biggest of all, you don't have to keep knowledge of the LLVM API in your brain while you're trying to get work done.
But you have to keep C's undefined behavior rules in the back of your brain (such as signed overflow == UB!), which is worse.