function(use_llvm_toolchain)
    if(CMAKE_C_COMPILER_ID STREQUAL Clang)
        set(compiler "${CMAKE_C_COMPILER}")
    elseif(CMAKE_CXX_COMPILER_ID STREQUAL Clang)
        set(compiler "${CMAKE_CXX_COMPILER}")
    else()
        return()
    endif()

    foreach(tool ar ranlib ld nm objdump as)
        execute_process(
            COMMAND "${compiler}" -print-prog-name=llvm-${tool}
            OUTPUT_VARIABLE prog_path
            OUTPUT_STRIP_TRAILING_WHITESPACE
        )

        # for FreeBSD
        if(NOT prog_path MATCHES "^/")
            get_filename_component(
                abs_path ${prog_path} ABSOLUTE
                BASE_DIR /usr/local/llvm-devel/bin
            )

            if(EXISTS ${abs_path})
                set(prog_path ${abs_path})
            endif()
        endif()

        if(prog_path MATCHES "^/")
            if(tool STREQUAL ld)
                set(tool linker)
            elseif(tool STREQUAL as)
                set(tool asm_compiler)
            endif()

            string(TOUPPER ${tool} utool)

            set(CMAKE_${utool} "${prog_path}" PARENT_SCOPE)
            set(CMAKE_${utool} "${prog_path}" CACHE FILEPATH "${tool}" FORCE)
        endif()
    endforeach()
endfunction()

use_llvm_toolchain()