diff --git a/CHANGELOG.md b/CHANGELOG.md index d1551b6..0b9bb91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Enable flang architecture flags + ### Deprecated ## [5.7.0] - 2026-03-09 diff --git a/compiler/flags/LLVMFlang_Fortran.cmake b/compiler/flags/LLVMFlang_Fortran.cmake index 0dc17d1..1137d95 100644 --- a/compiler/flags/LLVMFlang_Fortran.cmake +++ b/compiler/flags/LLVMFlang_Fortran.cmake @@ -35,20 +35,29 @@ set (ARCH_CONSISTENCY "") set (FTZ "") set (ALIGN_ALL "") set (NO_ALIAS "") +set (STACK_ARRAYS "-fstack-arrays") set (NO_RANGE_CHECK "") +set(NO_FMA "-ffp-contract=off") + +# NOTE: There is currently a bug(?) in flang that says you have to pass +# -fno-integrated-as when doing save temps (see https://github.com/llvm/llvm-project/pull/119624) +# It does seem to work, but a PR says this might have issues with offloading: +# NOTE 2: I found a bug with this and flang: https://github.com/llvm/llvm-project/issues/184802 +# Turning off for now. +#set(SAVE_TEMPS "-fno-integrated-as -save-temps=obj") + cmake_host_system_information(RESULT proc_description QUERY PROCESSOR_DESCRIPTION) -# NOT SURE ABOUT ANY OF THIS... if ( ${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL aarch64 ) - set (FLANG_TARGET_ARCH "-mcpu=armv8.2-a+crypto+crc+fp16+rcpc+dotprod") + set (FLANG_TARGET_ARCH "armv8.2-a+crypto+crc+fp16+rcpc+dotprod") elseif (${proc_description} MATCHES "Apple M") - set (FLANG_TARGET_ARCH "-mcpu=apple-m1") + set (FLANG_TARGET_ARCH "apple-m1") elseif (${proc_description} MATCHES "EPYC") - set (FLANG_TARGET_ARCH "-mcpu=znver2") + set (FLANG_TARGET_ARCH "znver2") elseif (${proc_description} MATCHES "Intel|INTEL") - set (FLANG_TARGET_ARCH "-mcpu=haswell") + set (FLANG_TARGET_ARCH "haswell") elseif ( ${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64" ) message(WARNING "Unknown processor type. Defaulting to a generic x86_64 processor. Performance may be suboptimal.") set (FLANG_TARGET_ARCH "x86-64") @@ -56,9 +65,6 @@ else () message(FATAL_ERROR "Unknown processor. Please file an issue at https://github.com/GEOS-ESM/ESMA_cmake") endif () -# ...SO WE JUST TURN OFF FLANG_TARGET_ARCH FOR NOW -set (FLANG_TARGET_ARCH "") - #################################################### # Common Fortran Flags @@ -68,12 +74,12 @@ set (common_Fortran_fpe_flags "${TRACEBACK}") # GEOS Debug # ---------- -set (GEOS_Fortran_Debug_Flags "${FOPT0} ${DEBINFO}") +set (GEOS_Fortran_Debug_Flags "${FOPT0} ${DEBINFO} ${SAVE_TEMPS} ${NO_FMA}") set (GEOS_Fortran_Debug_FPE_Flags "${common_Fortran_fpe_flags}") # GEOS Release # ------------ -set (GEOS_Fortran_Release_Flags "${FOPT3} ${FLANG_TARGET_ARCH} ${DEBINFO}") +set (GEOS_Fortran_Release_Flags "${FOPT3} -march=${FLANG_TARGET_ARCH} -funroll-loops ${STACK_ARRAYS} ${DEBINFO}") set (GEOS_Fortran_Release_FPE_Flags "${common_Fortran_fpe_flags}") # Create a NoVectorize version for consistency. No difference from Release for Flang diff --git a/operating_system/osx_extras.cmake b/operating_system/osx_extras.cmake index 063db8d..38adbe0 100644 --- a/operating_system/osx_extras.cmake +++ b/operating_system/osx_extras.cmake @@ -56,3 +56,13 @@ set (ENABLE_RELATIVE_RPATHS FALSE) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-headerpad_max_install_names") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-headerpad_max_install_names") + +# 5) Flang compiler workarounds for macOS shared libraries +# CMake natively uses Apple's '-dynamiclib' and '-install_name' for shared libraries, +# but the LLVM flang frontend strictly rejects them. +# We force flang to use '-shared' (which it correctly translates down to the linker) +# and use -Xlinker to safely pass the soname without space-parsing errors. +if(CMAKE_Fortran_COMPILER_ID MATCHES "Flang" OR CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang") + set(CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS "-shared -Wl,-headerpad_max_install_names") + set(CMAKE_SHARED_LIBRARY_SONAME_Fortran_FLAG "-Xlinker -install_name -Xlinker ") +endif()