O LLVM originalmente significava "máquina virtual de baixo nível", apesar de agora apenas representar a si mesmo, pois cresceu para ser algo diferente de uma máquina virtual tradicional. É um conjunto de bibliotecas e ferramentas, bem como uma representação intermediária padronizada, que pode ser usada para ajudar a construir compiladores e compiladores just-in-time. Ele não pode compilar nada além de sua própria representação intermediária; ele precisa de um front-end específico do idioma para fazer isso. Se as pessoas se referem ao LLVM, provavelmente significam apenas a biblioteca e as ferramentas de baixo nível. Algumas pessoas podem se referir a Clang ou llvm-gcc incorretamente como "LLVM", o que pode causar alguma confusão.
O llvm-gcc é uma versão modificada do GCC, que usa o LLVM como back-end em vez do próprio GCC. Agora está obsoleto, em favor do DragonEgg, que usa o novo sistema de plug-ins do GCC para fazer a mesma coisa sem usar o GCC.
Clang é um compilador C / C ++ / Objective-C totalmente novo, que usa seu próprio front-end e LLVM como back-end. As vantagens que ele oferece são melhores mensagens de erro, tempo de compilação mais rápido e uma maneira mais fácil de outras ferramentas se conectarem ao processo de compilação (como o depurador LLDB e o analisador estático Clang ). Também é razoavelmente modular e, portanto, pode ser usado como uma biblioteca para outro software que precisa analisar o código C, C ++ ou Objective-C.
Cada uma dessas abordagens (GCC simples, GCC + LLVM e Clang) tem suas vantagens e desvantagens. Os últimos conjuntos de benchmarks que eu vi mostraram que o GCC produzia código um pouco mais rápido na maioria dos casos de teste (embora o LLVM tivesse uma leve vantagem em alguns), enquanto o LLVM e o Clang proporcionaram tempos de compilação significativamente melhores. O GCC e os combos GCC / LLVM têm a vantagem de muito mais código ter sido testado e funcionar com o sabor C do GCC; existem algumas extensões específicas do compilador que apenas o GCC possui e alguns locais em que o padrão permite que a implementação varie, mas o código depende de uma implementação específica. É muito mais provável que, se você obtiver uma grande quantidade de código C legado, ele funcione no GCC do que em Clang, embora isso melhore ao longo do tempo.