Да, вы правы. Clang — фронтэнд генерирующий промежуточное представление. LLVM берёт промежуточное представление (уже вне зависимости от языка на котором писался код оригинально), оптимизирует и генерирует бинарный файл.
GCC использует схожую систему (до clang LLVM вообще принимала IF от GCC). Это позволяет иметь один бэкэнд для множества языков. Разрабатывать заного фактически приходится только парсер.