|
| 1 | +# |
| 2 | +#[[ |
| 3 | +
|
| 4 | +Macro to manually compile with Enzyme |
| 5 | +
|
| 6 | +Author(s): |
| 7 | +- Asher Mancinelli <ashermancinelli@gmail.com> |
| 8 | +- Nicholson Koukpaizan <koukpaizannk@ornl.gov> |
| 9 | +
|
| 10 | +]] |
| 11 | + |
| 12 | +macro(enzyme_build_object) |
| 13 | + set(options) |
| 14 | + set(oneValueArgs NAME) |
| 15 | + set(multiValueArgs SOURCES LINK_LIBRARIES INCLUDE_DIRECTORIES) |
| 16 | + cmake_parse_arguments(enzyme_build_object "${options}" "${oneValueArgs}" |
| 17 | + "${multiValueArgs}" ${ARGN}) |
| 18 | + |
| 19 | + set(PHASE2 "${CMAKE_CURRENT_BINARY_DIR}/${enzyme_build_object_NAME}.bc") |
| 20 | + set(PHASE3 "${CMAKE_CURRENT_BINARY_DIR}/${enzyme_build_object_NAME}_enzyme.ll") |
| 21 | + set(PHASE4 "${CMAKE_CURRENT_BINARY_DIR}/${enzyme_build_object_NAME}_opt.ll") |
| 22 | + set(PHASE5 "${CMAKE_CURRENT_BINARY_DIR}/${enzyme_build_object_NAME}") |
| 23 | + |
| 24 | + set(OBJS "") |
| 25 | + set(includes "${enzyme_build_object_INCLUDE_DIRECTORIES}") |
| 26 | + |
| 27 | + foreach(lib ${enzyme_build_object_LINK_LIBRARIES}) |
| 28 | + get_target_property(include ${lib} INCLUDE_DIRECTORIES) |
| 29 | + set(includes "${includes}" ${include}) |
| 30 | + |
| 31 | + get_target_property(libsource ${lib} SOURCES) |
| 32 | + string(FIND "${libsource}" "TARGET" found) |
| 33 | + if(NOT(${found} EQUAL -1)) |
| 34 | + list(APPEND LINKER_FLAGS "-Wl,${libsource}") |
| 35 | + endif() |
| 36 | + endforeach() |
| 37 | + |
| 38 | + foreach(dir ${includes}) |
| 39 | + if(EXISTS ${dir}) |
| 40 | + list(APPEND INCLUDE_COMPILER_LIST "-I${dir}") |
| 41 | + endif() |
| 42 | + endforeach() |
| 43 | + |
| 44 | + foreach(SRC ${enzyme_build_object_SOURCES}) |
| 45 | + set(PHASE0 "${CMAKE_CURRENT_SOURCE_DIR}/${SRC}") |
| 46 | + set(PHASE1 "${CMAKE_CURRENT_BINARY_DIR}/${enzyme_build_object_NAME}_${SRC}_compile.o") |
| 47 | + add_custom_command( |
| 48 | + DEPENDS ${PHASE0} |
| 49 | + OUTPUT ${PHASE1} |
| 50 | + COMMAND ${CMAKE_CXX_COMPILER} -flto -c ${PHASE0} ${INCLUDE_COMPILER_LIST} -O2 -fno-vectorize -ffast-math -fno-unroll-loops -fpass-plugin=${ENZYME_CLANG_PLUGIN_LIBRARY} -Xclang -load -Xclang ${ENZYME_CLANG_PLUGIN_LIBRARY} -mllvm -enable-load-pre=0 -mllvm -enzyme-auto-sparsity=1 -o ${PHASE1} |
| 51 | + COMMENT "Compiling ${SRC} to object file for target ${enzyme_build_object_NAME}" |
| 52 | + ) |
| 53 | + set(OBJS "${OBJS} ${PHASE1}") |
| 54 | + endforeach() |
| 55 | + |
| 56 | + cmake_language(EVAL CODE " |
| 57 | + add_custom_command( |
| 58 | + DEPENDS ${OBJS} |
| 59 | + OUTPUT ${PHASE2} |
| 60 | + COMMAND ${GRIDKIT_LLVM_LINK} ${OBJS} -o ${PHASE2} |
| 61 | + COMMENT \"Linking object files to LLVM bytecode for target ${enzyme_build_object_NAME}\" |
| 62 | + ) |
| 63 | + ") |
| 64 | + |
| 65 | + add_custom_command( |
| 66 | + DEPENDS ${PHASE2} |
| 67 | + OUTPUT ${PHASE3} |
| 68 | + COMMAND ${GRIDKIT_OPT} ${PHASE2} -load-pass-plugin=${ENZYME_LLVM_PLUGIN_LIBRARY} -passes=enzyme -o ${PHASE3} -S |
| 69 | + COMMENT "Running Enzyme opt pass on target ${enzyme_build_object_NAME}" |
| 70 | + ) |
| 71 | + |
| 72 | + add_custom_command( |
| 73 | + DEPENDS ${PHASE3} |
| 74 | + OUTPUT ${PHASE4} |
| 75 | + COMMAND ${GRIDKIT_OPT} ${PHASE3} -O2 -o ${PHASE4} -S |
| 76 | + COMMENT "Running remaining opt passes on target ${enzyme_build_object_NAME}" |
| 77 | + ) |
| 78 | + |
| 79 | + add_custom_command( |
| 80 | + DEPENDS ${PHASE4} |
| 81 | + OUTPUT ${PHASE5} |
| 82 | + COMMAND ${CMAKE_CXX_COMPILER} -c ${PHASE4} -o ${PHASE5} |
| 83 | + COMMENT "Generating optimized object file for target ${enzyme_build_object_NAME}" |
| 84 | + ) |
| 85 | +endmacro() |
| 86 | + |
| 87 | +macro(enzyme_add_executable) |
| 88 | + set(options) |
| 89 | + set(oneValueArgs NAME) |
| 90 | + set(multiValueArgs SOURCES LINK_LIBRARIES INCLUDE_DIRECTORIES) |
| 91 | + cmake_parse_arguments(enzyme_add_executable "${options}" "${oneValueArgs}" |
| 92 | + "${multiValueArgs}" ${ARGN}) |
| 93 | + |
| 94 | + enzyme_build_object( |
| 95 | + NAME "${enzyme_add_executable_NAME}.o" |
| 96 | + SOURCES ${enzyme_add_executable_SOURCES} |
| 97 | + LINK_LIBRARIES ${enzyme_add_executable_LINK_LIBRARIES} |
| 98 | + INCLUDE_DIRECTORIES ${enzyme_add_executable_INCLUDE_DIRECTORIES} |
| 99 | + ) |
| 100 | + |
| 101 | + add_executable("${enzyme_add_executable_NAME}" "${enzyme_add_executable_NAME}.o") |
| 102 | + set_target_properties("${enzyme_add_executable_NAME}" PROPERTIES LINKER_LANGUAGE CXX) |
| 103 | + target_link_libraries("${enzyme_add_executable_NAME}" ${enzyme_add_executable_LINK_LIBRARIES}) |
| 104 | +endmacro() |
| 105 | + |
| 106 | +macro(enzyme_add_library) |
| 107 | + set(options) |
| 108 | + set(oneValueArgs NAME) |
| 109 | + set(multiValueArgs SOURCES LINK_LIBRARIES INCLUDE_DIRECTORIES) |
| 110 | + cmake_parse_arguments(enzyme_add_library "${options}" "${oneValueArgs}" |
| 111 | + "${multiValueArgs}" ${ARGN}) |
| 112 | + |
| 113 | + enzyme_build_object( |
| 114 | + NAME "${enzyme_add_library_NAME}.o" |
| 115 | + SOURCES ${enzyme_add_library_SOURCES} |
| 116 | + LINK_LIBRARIES ${enzyme_add_library_LINK_LIBRARIES} |
| 117 | + INCLUDE_DIRECTORIES ${enzyme_add_library_INCLUDE_DIRECTORIES} |
| 118 | + ) |
| 119 | + |
| 120 | + add_library("${enzyme_add_library_NAME}" "${enzyme_add_library_NAME}.o") |
| 121 | + set_target_properties("${enzyme_add_library_NAME}" PROPERTIES LINKER_LANGUAGE CXX) |
| 122 | + target_link_libraries("${enzyme_add_library_NAME}" ${enzyme_add_library_LINK_LIBRARIES}) |
| 123 | +endmacro() |
0 commit comments