Commit 7eb70a99 authored by Lopez Ortiz, Omar's avatar Lopez Ortiz, Omar
Browse files

Fix LLVM commit

parent 4976d019
Loading
Loading
Loading
Loading
+385 −55
Original line number Diff line number Diff line
find_package (NetCDF MODULE REQUIRED)
cmake_minimum_required (VERSION 3.21)

add_library (rays INTERFACE)
target_compile_features (rays
project (rays CXX)

#-------------------------------------------------------------------------------
#  Build Options
#-------------------------------------------------------------------------------
option (USE_PCH "Enable the use of precompiled headers" ON)
option (SAVE_KERNEL_SOURCE "Writes the kernel source code to a file." OFF)
option (USE_INPUT_CACHE "Cache the values kernel input values." OFF)
option (USE_CONSTANT_CACHE "Cache the value of constantants in kernel registers." OFF)
option (SHOW_USE_COUNT "Add a comment showing the use count in kernel sources." OFF)
option (USE_INDEX_CACHE "Cache index values instead of computing them every time." OFF)

#-------------------------------------------------------------------------------
#  Set the cmake module path.
#-------------------------------------------------------------------------------
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake)

#-------------------------------------------------------------------------------
#  Setup build types
#-------------------------------------------------------------------------------
if (NOT CMAKE_BUILD_TYPE)
    set (CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
endif ()
set_property (CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
              Debug
              Release
              MinSizeRel
              RelWithDebInfo
)

#-------------------------------------------------------------------------------
#  GPU config
#-------------------------------------------------------------------------------

if (${APPLE})
    option (USE_METAL "Enable the metal backend" OFF)

    if (${USE_METAL})
        enable_language (OBJCXX)

        add_library (metal_lib INTERFACE)
        target_link_libraries (metal_lib
                               INTERFACE
                               "-framework Metal"
                               "-framework Foundation"
        )

        target_compile_definitions (metal_lib
                                    INTERFACE
                                    USE_METAL
        )
        target_compile_options (metal_lib
                                INTERFACE
                                -fobjc-arc
        )
    endif ()
else ()
    option (USE_CUDA "Enable the cuda backend" ON)

    if (${USE_CUDA})
        add_library (cuda_lib INTERFACE)

        find_package (CUDAToolkit REQUIRED)

        option (USE_CUDA_TEXTURES "Enable the use of cuda textures" OFF)

        target_compile_definitions (cuda_lib
                                    INTERFACE
                                    USE_CUDA
                                    $<$<BOOL:${USE_CUDA_TEXTURES}>:USE_CUDA_TEXTURES>
                                    CUDA_INCLUDE="${CUDAToolkit_INCLUDE_DIRS}"
        )
        target_link_libraries (cuda_lib
                               INTERFACE
                               $<$<BOOL:${CUDAToolkit_FOUND}>:CUDA::cuda_driver>
                               $<$<BOOL:${CUDAToolkit_FOUND}>:CUDA::nvrtc>
        )
    endif ()
endif ()

add_library (gpu_lib INTERFACE)
target_link_libraries (gpu_lib
                       INTERFACE
                       $<$<BOOL:${USE_METAL}>:metal_lib>
                       $<$<BOOL:${USE_CUDA}>:cuda_lib>
)
target_compile_definitions (gpu_lib
                            INTERFACE
                         cxx_std_20
                            $<$<BOOL:${USE_INPUT_CACHE}>:USE_INPUT_CACHE>
)

#  Capture the system include search paths from the compiler used.
find_package (Python REQUIRED COMPONENTS Interpreter)
execute_process (COMMAND ${Python_EXECUTABLE} get_includes.py --compiler=${CMAKE_CXX_COMPILER}
                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../utilities
                 OUTPUT_VARIABLE jit_include_paths
                 OUTPUT_STRIP_TRAILING_WHITESPACE
#-------------------------------------------------------------------------------
#  Sanitizer options
#-------------------------------------------------------------------------------
add_library (sanitizer INTERFACE)
target_compile_options (sanitizer
                        INTERFACE
                        $<$<CONFIG:Sanitized>:-g>
)

target_compile_definitions (rays
macro (register_sanitizer_option name)
    string (TOUPPER ${name} upper_name)

    option (SANITIZE_${upper_name} "Enable the ${name} sanitizer" OFF)

    target_compile_options (sanitizer
                            INTERFACE
                            $<$<PLATFORM_ID:Darwin>:CXX_ARGS="-I${CMAKE_CURRENT_SOURCE_DIR}${jit_include_paths} -fgnuc-version=4.2.1 -std=gnu++2a">
                            $<$<PLATFORM_ID:Linux>:CXX_ARGS="-I${CMAKE_CURRENT_SOURCE_DIR}${jit_include_paths} -std=gnu++2a -fno-use-cxa-atexit">
                            EFIT_FILE="${CMAKE_CURRENT_SOURCE_DIR}/../graph_tests/efit.nc"
                            VMEC_FILE="${CMAKE_CURRENT_SOURCE_DIR}/../graph_tests/vmec.nc"
                            $<$<BOOL:${USE_CUDA}>:HEADER_DIR="$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>">
                            $<$<BOOL:${SAVE_KERNEL_SOURCE}>:SAVE_KERNEL_SOURCE>
                            $<$<BOOL:${USE_CONSTANT_CACHE}>:USE_CONSTANT_CACHE>
                            $<$<BOOL:${SHOW_USE_COUNT}>:SHOW_USE_COUNT>
                            $<$<BOOL:${USE_INDEX_CACHE}>:USE_INDEX_CACHE>
)

target_include_directories (rays
                            $<$<BOOL:${SANITIZE_${upper_name}}>:-fsanitize=${name}>
    )
    target_link_options (sanitizer
                         INTERFACE
                            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                         $<$<BOOL:${SANITIZE_${upper_name}}>:-fsanitize=${name}>
    )
endmacro ()

register_sanitizer_option (address)
register_sanitizer_option (leak)
register_sanitizer_option (memory)
register_sanitizer_option (thread)
register_sanitizer_option (undefined)
register_sanitizer_option (float-divide-by-zero)

#-------------------------------------------------------------------------------
#  Setup access method.
#-------------------------------------------------------------------------------
option (USE_SSH "Use ssh to access git repos" OFF)
if (${USE_SSH})
    set (URL_PROTO "git@")
    set (URL_SEP ":")
else ()
    set (URL_PROTO "https://")
    set (URL_SEP "/")
endif ()

#-------------------------------------------------------------------------------
#  Define a macro to register new projects.
#-------------------------------------------------------------------------------
include (FetchContent)
find_package (Git)

# Modified function to handle hard-coded LLVM commit
function (register_project reg_name dir url default_tag sub_dir)
    # Special handling for LLVM with hard-coded commit
    if (${reg_name} STREQUAL "llvm")
        # Hard-code the specific commit for LLVM
        set (LLVM_COMMIT "a6494a3bbf0620ec472d44db4e79c4c508618a61")
        
        FetchContent_Declare (
            ${reg_name}
            GIT_REPOSITORY ${url}
            GIT_TAG ${LLVM_COMMIT}
            SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${dir}
            SOURCE_SUBDIR ${sub_dir}
        )
        
        FetchContent_MakeAvailable (${reg_name})
        
        if (${GIT_FOUND})
            # Checkout the specific commit to ensure we're on it
            execute_process (
                COMMAND ${GIT_EXECUTABLE} checkout ${LLVM_COMMIT}
                WORKING_DIRECTORY ${${reg_name}_SOURCE_DIR}
            )
            
            # Add a target to pull, but for LLVM it will just verify we're on the right commit
            add_custom_target (
                pull_${reg_name}
                ALL
                COMMAND ${GIT_EXECUTABLE} fetch
                COMMAND ${GIT_EXECUTABLE} checkout ${LLVM_COMMIT}
                WORKING_DIRECTORY ${${reg_name}_SOURCE_DIR}
            )
        endif ()
        
        # Handle LLVM-specific project settings
        set (LLVM_TARGETS_TO_BUILD Native CACHE STRING "" FORCE)
        set (LLVM_ENABLE_PROJECTS clang CACHE STRING "" FORCE)
    else ()
        # Original behavior for non-LLVM projects
        set (BUILD_TAG_${dir} ${default_tag} CACHE STRING "Name of the tag to checkout.")
        
        # Anything after the tag is assumed to be a project setting.
        foreach (i RANGE 6 ${ARGC} 3)
            math (EXPR key "${i} - 1" OUTPUT_FORMAT DECIMAL)
            math (EXPR type "${i} + 1" OUTPUT_FORMAT DECIMAL)
            set (${ARGV${key}} ${ARGV${i}} CACHE ${ARGV${type}} "" FORCE)
        endforeach ()
        
        FetchContent_Declare (
            ${reg_name}
            GIT_REPOSITORY ${url}
            GIT_TAG origin/${BUILD_TAG_${dir}}
            SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${dir}
            SOURCE_SUBDIR ${sub_dir}
        )
        
        FetchContent_MakeAvailable (${reg_name})
        
        if (${GIT_FOUND})
            # By default cmake clones projects in a headless state. After the repo is
            # cloned checkout the requested tag so repo is in a working state.
            execute_process (
                COMMAND ${GIT_EXECUTABLE} checkout ${BUILD_TAG_${dir}}
                WORKING_DIRECTORY ${${reg_name}_SOURCE_DIR}
            )
            
            # Add a target to pull the latest version before building. Note dependency is
            # registered in the sub project CMakeList.txt. Not sure how this should handle
            # multiple targets in a project yet. Name must match the subproject pull_
            # dependency.
            add_custom_target (
                pull_${reg_name}
                ALL
                COMMAND ${GIT_EXECUTABLE} pull
                WORKING_DIRECTORY ${${reg_name}_SOURCE_DIR}
            )
target_link_libraries (rays
        endif ()
    endif ()
endfunction ()

register_project (llvm
                  LLVM
                  ${URL_PROTO}github.com${URL_SEP}llvm/llvm-project.git
                  main
                  llvm
                  LLVM_TARGETS_TO_BUILD Native STRING
                  LLVM_ENABLE_PROJECTS clang STRING
)

#-------------------------------------------------------------------------------
#  Define an llvm dependency target
#-------------------------------------------------------------------------------
FetchContent_GetProperties (
    llvm
    BINARY_DIR llvm_binary_dir
    SOURCE_DIR llvm_source_dir
)

#  Do not build llvm until pull command is finished.
#  Conditionally add dependencies only if targets exist
macro (add_llvm_dependency target)
    if (TARGET ${target})
        add_dependencies (${target} pull_llvm)
    endif ()
endmacro ()

add_llvm_dependency (gpu-resource-headers)
add_llvm_dependency (llvm-offload-resource-headers)
add_llvm_dependency (LLVMDemangle)
add_llvm_dependency (Remarks_exports)
add_llvm_dependency (LLVMSupportBlake3)
add_llvm_dependency (BugpointPasses_exports)
add_llvm_dependency (LTO_exports)
add_llvm_dependency (llvm-PerfectShuffle)
add_llvm_dependency (SecondLib)
add_llvm_dependency (DynamicLibraryLib)
add_llvm_dependency (PipSqueak)
add_llvm_dependency (obj.LLVMTableGenCommon)
add_llvm_dependency (llvm_vcsrevision_h)
add_llvm_dependency (benchmark)
add_llvm_dependency (benchmark_main)
add_llvm_dependency (obj.LLVMTableGenBasic)
add_llvm_dependency (core-resource-headers)
add_llvm_dependency (mips-resource-headers)
add_llvm_dependency (utility-resource-headers)
add_llvm_dependency (ppc-htm-resource-headers)
add_llvm_dependency (loongarch-resource-headers)
add_llvm_dependency (systemz-resource-headers)
add_llvm_dependency (hexagon-resource-headers)
add_llvm_dependency (webassembly-resource-headers)
add_llvm_dependency (riscv-resource-headers)
add_llvm_dependency (hlsl-resource-headers)
add_llvm_dependency (ve-resource-headers)
add_llvm_dependency (opencl-resource-headers)
add_llvm_dependency (llvm-libc-resource-headers)
add_llvm_dependency (openmp-resource-headers)
add_llvm_dependency (windows-resource-headers)
add_llvm_dependency (SampleAnalyzerPlugin_exports)
add_llvm_dependency (CheckerDependencyHandlingAnalyzerPlugin_exports)
add_llvm_dependency (CheckerOptionHandlingAnalyzerPlugin_exports)
add_llvm_dependency (clangAnalysisFlowSensitiveResources)
add_llvm_dependency (ppc-resource-headers)
add_llvm_dependency (hmaptool)
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    add_llvm_dependency (libclang_exports)
endif ()
add_llvm_dependency (hip-resource-headers)
add_llvm_dependency (scan-view)
add_llvm_dependency (scan-build)
add_llvm_dependency (cuda-resource-headers)
add_llvm_dependency (scan-build-py)
add_llvm_dependency (x86-resource-headers)
add_llvm_dependency (obj.clangSupport)
add_llvm_dependency (arm-common-resource-headers)
add_llvm_dependency (arm-resource-headers)
add_llvm_dependency (aarch64-resource-headers)

add_library (llvm_dep INTERFACE)
target_include_directories (llvm_dep
                            INTERFACE
                       sanitizer
                       gpu_lib
                       NetCDF::NetCDF
                       $<$<PLATFORM_ID:Linux>:${CMAKE_DL_LIBS}>
                       $<$<PLATFORM_ID:Linux>:pthread>
                       llvm_dep
)
target_precompile_headers (rays
                            $<BUILD_INTERFACE:${llvm_source_dir}/llvm/include>
                            $<BUILD_INTERFACE:${llvm_source_dir}/clang/include>
                            $<BUILD_INTERFACE:${llvm_binary_dir}/include>
                            $<BUILD_INTERFACE:${llvm_binary_dir}/tools/clang/include>
)

#  Need to manually figure out the native arch.
string(REGEX MATCH "^[^-]*" LLVM_NATIVE_ARCH ${LLVM_HOST_TRIPLE})
if (LLVM_NATIVE_ARCH MATCHES "arm64")
    set (LLVM_NATIVE_ARCH AArch64)
elseif (LLVM_NATIVE_ARCH MATCHES "x86_64")
    set (LLVM_NATIVE_ARCH X86)
else ()
   message (FATAL_ERROR "Unknown native arch ${LLVM_NATIVE_ARCH}")
endif ()

target_link_libraries (llvm_dep
                       INTERFACE
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/arithmetic.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/backend.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dispersion.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/absorption.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/math.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/node.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/solver.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/trigonometry.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vector.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/equilibrium.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/jit.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/workflow.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/register.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/timing.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/cpu_context.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/piecewise.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/newton.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/special_functions.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/output.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/commandline_parser.hpp>>
                           $<$<BOOL:${USE_PCH}>:$<$<BOOL:${USE_METAL}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/metal_context.hpp>>>
                           $<$<BOOL:${USE_PCH}>:$<$<BOOL:${USE_CUDA}>:$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/cuda_context.hpp>>>
                       clangCodeGen
                       LLVM${LLVM_NATIVE_ARCH}CodeGen
                       LLVMOrcJIT
                       LLVMOrcDebugging
                       LLVMOrcTargetProcess
)

#-------------------------------------------------------------------------------
#  Build Documentation
#-------------------------------------------------------------------------------
find_package(Doxygen)

if (DOXYGEN_FOUND)
    set (DOXYGEN_PROJECT_NAME "Graph Framework")
    set (DOXYGEN_EXCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/LLVM ${CMAKE_CURRENT_SOURCE_DIR}/build)
    set (DOXYGEN_GENERATE_TREEVIEW YES)

    doxygen_add_docs (doc)
endif ()

#-------------------------------------------------------------------------------
#  Setup targets
#-------------------------------------------------------------------------------

add_subdirectory (graph_framework)

#-------------------------------------------------------------------------------
#  Setup testing
#-------------------------------------------------------------------------------
enable_testing ()

#-------------------------------------------------------------------------------
#  Tool setup
#-------------------------------------------------------------------------------
macro (add_tool_target target)
    add_executable (${target})
    target_sources (${target}
                    PRIVATE
                    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${target}.cpp>
    )

    if (${USE_METAL})
        set_source_files_properties (${CMAKE_CURRENT_SOURCE_DIR}/${target}.cpp
                                     PROPERTIES
                                     LANGUAGE OBJCXX
        )
    endif ()

    target_link_libraries (${target}
                           PUBLIC
                           rays
    )
endmacro ()

add_subdirectory (graph_driver)
add_subdirectory (graph_benchmark)
add_subdirectory (graph_playground)
add_subdirectory (graph_korc)



#-------------------------------------------------------------------------------
#  Define macro function to register tests.
#-------------------------------------------------------------------------------
macro (add_test_target target)
    add_tool_target (${target})

    add_test (NAME ${target}
              COMMAND ${target}
    )

    if (${USE_PCH})
        target_precompile_headers (${target} REUSE_FROM xrays)
    endif ()
endmacro ()

add_subdirectory (graph_tests)
 No newline at end of file
+35 −33
Original line number Diff line number Diff line
@@ -160,12 +160,14 @@ namespace gpu {
                }
            }

            auto diagnostic_options = llvm::makeIntrusiveRefCnt<clang::DiagnosticOptions> ();
            auto diagnostic_printer = std::make_unique<clang::TextDiagnosticPrinter> (llvm::errs(),
                                                                                      diagnostic_options.get());
            // Create diagnostic options as a regular object, not IntrusiveRefCntPtr
            clang::DiagnosticOptions diagnostic_options;
            auto diagnostic_printer = std::make_unique<clang::TextDiagnosticPrinter>(
                llvm::errs(), diagnostic_options);

            auto diagnostic_ids = llvm::makeIntrusiveRefCnt<clang::DiagnosticIDs>();
            clang::DiagnosticsEngine diagnostic_engine(diagnostic_ids,
            clang::DiagnosticsEngine diagnostic_engine(
                diagnostic_ids,
                diagnostic_options,
                diagnostic_printer.release());