Hi ports -- The attached diff allows lang/flang to build and run on arm64. The entire NIST Fortran 77 test suite passes on arm64 with this. My Raspberry Pi 3B+ is happy with this.
Does anyone want to try it out before I commit? Apologies to the arm64 package builders; this took quite a while to build on my RPi 3B+. OK? ~Brian
Index: Makefile.inc =================================================================== RCS file: /cvs/ports/lang/flang/Makefile.inc,v retrieving revision 1.2 diff -u -p -r1.2 Makefile.inc --- Makefile.inc 9 May 2018 22:27:41 -0000 1.2 +++ Makefile.inc 24 Jun 2018 23:31:00 -0000 @@ -1,7 +1,7 @@ # $OpenBSD: Makefile.inc,v 1.2 2018/05/09 22:27:41 bcallah Exp $ # Also ppc64le -ONLY_FOR_ARCHS = amd64 #arm64 +ONLY_FOR_ARCHS = amd64 arm64 CATEGORIES ?= lang Index: flang/Makefile =================================================================== RCS file: /cvs/ports/lang/flang/flang/Makefile,v retrieving revision 1.13 diff -u -p -r1.13 Makefile --- flang/Makefile 23 Jun 2018 01:10:35 -0000 1.13 +++ flang/Makefile 24 Jun 2018 23:31:00 -0000 @@ -2,6 +2,7 @@ COMMENT = LLVM Fortran compiler passes and runtime library DISTNAME = flang-6.0.0.20180621 +REVISION = 0 SHARED_LIBS += flang 1.1 # 6.0 SHARED_LIBS += flangrti 1.0 # 6.0 @@ -33,9 +34,5 @@ CONFIGURE_ARGS = -DCMAKE_Fortran_COMPILE -DFLANG_LIBOMP="${WRKBUILD}/lib/libompstub.a" \ -DLIBPGMATH="${LOCALBASE}/lib/libpgmath.a" \ -DWITH_WERROR=OFF - -post-patch: - @cp -R ${WRKSRC}/tools/flang2/flang2exe/x86_64-Linux \ - ${WRKSRC}/tools/flang2/flang2exe/x86_64-OpenBSD .include <bsd.port.mk> Index: flang/patches/patch-CMakeLists_txt =================================================================== RCS file: /cvs/ports/lang/flang/flang/patches/patch-CMakeLists_txt,v retrieving revision 1.2 diff -u -p -r1.2 patch-CMakeLists_txt --- flang/patches/patch-CMakeLists_txt 9 May 2018 22:27:41 -0000 1.2 +++ flang/patches/patch-CMakeLists_txt 24 Jun 2018 23:31:00 -0000 @@ -1,11 +1,11 @@ $OpenBSD: patch-CMakeLists_txt,v 1.2 2018/05/09 22:27:41 bcallah Exp $ -Add OpenBSD/amd64 +Add OpenBSD/amd64 and OpenBSD/arm64 Index: CMakeLists.txt --- CMakeLists.txt.orig +++ CMakeLists.txt -@@ -49,6 +49,15 @@ if( ${TARGET_OS} STREQUAL "Linux" ) +@@ -49,6 +49,20 @@ if( ${TARGET_OS} STREQUAL "Linux" ) message("Unsupported architecture: ${TARGET_ARCHITECTURE}" ) return() endif() @@ -17,6 +17,11 @@ Index: CMakeLists.txt + set(ARCH X86) + set(WRDSZ 64) + set(TARGET_ARCHITECTURE x86_64) ++ elseif( ${TARGET_ARCHITECTURE} STREQUAL "arm64" ) ++ set(ARCHNAME aarch64) ++ set(ARCH ARM) ++ set(WRDSZ 64) ++ set(TARGET_ARCHITECTURE aarch64) + endif() else() message("Unsupported OS: ${TARGET_OS}" ) Index: flang/patches/patch-runtime_flang_CMakeLists_txt =================================================================== RCS file: /cvs/ports/lang/flang/flang/patches/patch-runtime_flang_CMakeLists_txt,v retrieving revision 1.3 diff -u -p -r1.3 patch-runtime_flang_CMakeLists_txt --- flang/patches/patch-runtime_flang_CMakeLists_txt 16 Jun 2018 20:08:28 -0000 1.3 +++ flang/patches/patch-runtime_flang_CMakeLists_txt 24 Jun 2018 23:31:00 -0000 @@ -2,6 +2,7 @@ $OpenBSD: patch-runtime_flang_CMakeLists No -lrt Appease lld +Work around standalone preprocessing of F95 files with C compiler Index: runtime/flang/CMakeLists.txt --- runtime/flang/CMakeLists.txt.orig @@ -15,6 +16,24 @@ Index: runtime/flang/CMakeLists.txt # We are using Fortran driver to build this library with fresh compiler # components, so point its binary directory to the build directory to pick up +@@ -420,7 +420,7 @@ set(I8_FILES_DIR I8_sources) + # Fortran files with macros as module names need to be preprocessed. + add_custom_command( + OUTPUT "${I8_FILES_DIR}/ieee_arithmetic.F95" +- COMMAND "${CMAKE_C_COMPILER}" -E ++ COMMAND "${CMAKE_C_COMPILER}" -E -x c + "${CMAKE_CURRENT_SOURCE_DIR}/ieee_arithmetic.F95" -DDESC_I8 + > "${I8_FILES_DIR}/ieee_arithmetic.F95" + COMMENT "Preprocessing ieee_arithmetic.F95" +@@ -429,7 +429,7 @@ add_custom_command( + + add_custom_command( + OUTPUT "${I8_FILES_DIR}/ieee_exceptions.F95" +- COMMAND "${CMAKE_C_COMPILER}" -E ++ COMMAND "${CMAKE_C_COMPILER}" -E -x c + "${CMAKE_CURRENT_SOURCE_DIR}/ieee_exceptions.F95" -DDESC_I8 + > "${I8_FILES_DIR}/ieee_exceptions.F95" + COMMENT "Preprocessing ieee_exceptions.F95" @@ -479,7 +479,7 @@ add_flang_library(flang_shared set_property(TARGET flang_shared PROPERTY OUTPUT_NAME flang) target_link_libraries(flang_shared ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib/libflangrti.so) Index: flang/patches/patch-runtime_flangrti_aarch64-Linux_dumpregs_c =================================================================== RCS file: flang/patches/patch-runtime_flangrti_aarch64-Linux_dumpregs_c diff -N flang/patches/patch-runtime_flangrti_aarch64-Linux_dumpregs_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ flang/patches/patch-runtime_flangrti_aarch64-Linux_dumpregs_c 24 Jun 2018 23:31:00 -0000 @@ -0,0 +1,34 @@ +$OpenBSD$ + +No ucontext on OpenBSD. + +Index: runtime/flangrti/aarch64-Linux/dumpregs.c +--- runtime/flangrti/aarch64-Linux/dumpregs.c.orig ++++ runtime/flangrti/aarch64-Linux/dumpregs.c +@@ -15,6 +15,7 @@ + * + */ + ++#ifndef __OpenBSD__ + #include <sys/ucontext.h> + + void +@@ -29,3 +30,18 @@ getRegs(ucontext_t *u) + return (gregset_t *)0; + } + ++#else ++ ++void ++dumpregs(void *regs) ++{ ++} ++ ++ ++void * ++getRegs(void *u) ++{ ++ return (void *)0; ++} ++ ++#endif Index: flang/patches/patch-runtime_flangrti_aarch64-Linux_flt_env_c =================================================================== RCS file: flang/patches/patch-runtime_flangrti_aarch64-Linux_flt_env_c diff -N flang/patches/patch-runtime_flangrti_aarch64-Linux_flt_env_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ flang/patches/patch-runtime_flangrti_aarch64-Linux_flt_env_c 24 Jun 2018 23:31:00 -0000 @@ -0,0 +1,85 @@ +$OpenBSD$ + +Workaround glibc nonsense + +Index: runtime/flangrti/aarch64-Linux/flt_env.c +--- runtime/flangrti/aarch64-Linux/flt_env.c.orig ++++ runtime/flangrti/aarch64-Linux/flt_env.c +@@ -21,7 +21,6 @@ + + #include <stdint.h> + #include <fenv.h> +-#include <fpu_control.h> + + int + __fenv_fegetround(void) +@@ -115,14 +114,14 @@ __fenv_feupdateenv(fenv_t *env) + int + __fenv_fesetzerodenorm(int uflow) + { +- uint64_t cw; ++ fenv_t fenv; + +- _FPU_GETCW(cw); ++ fegetenv(&fenv); + if (uflow) +- cw |= (1ULL << 24); ++ fenv |= (1ULL << 24); + else +- cw &= ~(1ULL << 24); +- _FPU_SETCW(cw); ++ fenv &= ~(1ULL << 24); ++ fesetenv(&fenv); + return 0; + } + +@@ -133,10 +132,10 @@ __fenv_fesetzerodenorm(int uflow) + int + __fenv_fegetzerodenorm(void) + { +- uint64_t cw; ++ fenv_t fenv; + +- _FPU_GETCW(cw); +- return (cw & (1ULL << 24)) ? 1 : 0; ++ fegetenv(&fenv); ++ return (fenv & (1ULL << 24)) ? 1 : 0; + } + + /** \brief +@@ -150,16 +149,16 @@ __fenv_fegetzerodenorm(void) + void + __fenv_mask_fz(int mask, int *psv) + { +- uint64_t tmp; ++ fenv_t tmp; + +- _FPU_GETCW(tmp); ++ fegetenv(&tmp); + if (psv) + *psv = ((tmp & (1ULL << 24)) ? 1 : 0); + if (mask) + tmp |= (1ULL << 24); + else + tmp &= ~(1ULL << 24); +- _FPU_SETCW(tmp); ++ fesetenv(&tmp); + } + + /** \brief +@@ -168,12 +167,12 @@ __fenv_mask_fz(int mask, int *psv) + void + __fenv_restore_fz(int sv) + { +- uint64_t tmp; ++ fenv_t tmp; + +- _FPU_GETCW(tmp); ++ fegetenv(&tmp); + if (sv) + tmp |= (1ULL << 24); + else + tmp &= ~(1ULL << 24); +- _FPU_SETCW(tmp); ++ fesetenv(&tmp); + } Index: flang/patches/patch-tools_flang2_CMakeLists_txt =================================================================== RCS file: flang/patches/patch-tools_flang2_CMakeLists_txt diff -N flang/patches/patch-tools_flang2_CMakeLists_txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ flang/patches/patch-tools_flang2_CMakeLists_txt 24 Jun 2018 23:31:00 -0000 @@ -0,0 +1,18 @@ +$OpenBSD$ + +We should do this too. + +Index: tools/flang2/CMakeLists.txt +--- tools/flang2/CMakeLists.txt.orig ++++ tools/flang2/CMakeLists.txt +@@ -33,8 +33,8 @@ set(FLANG2_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/ + + include_directories(${FLANG2_INCLUDE_DIR}) + +-if( ${TARGET_OS} STREQUAL "Linux" ) +- if( ${TARGET_ARCHITECTURE} STREQUAL "x86_64" ) ++if( ${TARGET_OS} STREQUAL "Linux|OpenBSD" ) ++ if( ${TARGET_ARCHITECTURE} STREQUAL "x86_64|amd64" ) + set(X86_64 ON) + set(LINUX86 ON) + endif() Index: flang/patches/patch-tools_flang2_flang2exe_CMakeLists_txt =================================================================== RCS file: flang/patches/patch-tools_flang2_flang2exe_CMakeLists_txt diff -N flang/patches/patch-tools_flang2_flang2exe_CMakeLists_txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ flang/patches/patch-tools_flang2_flang2exe_CMakeLists_txt 24 Jun 2018 23:31:00 -0000 @@ -0,0 +1,16 @@ +$OpenBSD$ + +Eliminate the need for a post-patch copy. + +Index: tools/flang2/flang2exe/CMakeLists.txt +--- tools/flang2/flang2exe/CMakeLists.txt.orig ++++ tools/flang2/flang2exe/CMakeLists.txt +@@ -101,7 +101,7 @@ set(INCLUDE_DIRS + ${FLANG_SOURCE_DIR}/lib/scutil + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +- ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_ARCHITECTURE}-${TARGET_OS} ++ ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_ARCHITECTURE}-Linux + ${UTILS_SYMTAB_BIN_DIR} # Symbol table headers + ${UTILS_ILI_BIN_DIR} # ILI IR headers + ${UTILS_ILM_BIN_DIR} # ILM IR headers Index: flang/pkg/PLIST =================================================================== RCS file: /cvs/ports/lang/flang/flang/pkg/PLIST,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 PLIST --- flang/pkg/PLIST 31 Dec 2017 18:06:38 -0000 1.1.1.1 +++ flang/pkg/PLIST 24 Jun 2018 23:31:00 -0000 @@ -2,7 +2,9 @@ @bin bin/flang1 @bin bin/flang2 include/ieee_arithmetic.mod +include/ieee_arithmetic_la.mod include/ieee_exceptions.mod +include/ieee_exceptions_la.mod include/ieee_features.mod include/iso_c_binding.mod include/iso_fortran_env.mod Index: libpgmath/Makefile =================================================================== RCS file: /cvs/ports/lang/flang/libpgmath/Makefile,v retrieving revision 1.3 diff -u -p -r1.3 Makefile --- libpgmath/Makefile 23 Jun 2018 01:10:35 -0000 1.3 +++ libpgmath/Makefile 24 Jun 2018 23:31:00 -0000 @@ -4,6 +4,7 @@ COMMENT = LLVM Fortran math library DISTNAME = flang-6.0.0.20180621 PKGNAME = ${DISTNAME:S/flang/libpgmath/} +REVISION = 0 SHARED_LIBS += pgmath 1.0 # 6.0 Index: libpgmath/patches/patch-lib_CMakeLists_txt =================================================================== RCS file: /cvs/ports/lang/flang/libpgmath/patches/patch-lib_CMakeLists_txt,v retrieving revision 1.2 diff -u -p -r1.2 patch-lib_CMakeLists_txt --- libpgmath/patches/patch-lib_CMakeLists_txt 16 Jun 2018 20:08:28 -0000 1.2 +++ libpgmath/patches/patch-lib_CMakeLists_txt 24 Jun 2018 23:31:00 -0000 @@ -41,6 +41,21 @@ Index: lib/CMakeLists.txt # common # Definitions and compiler flags for level 1 directories +@@ -151,12 +154,12 @@ else() + set(DEFINITIONS_L1 HOST_LINUX MAXCPUS=256 MAXCPUSL=8 MAXCPUSR=8 TARGET_LINUX + TARGET_LINUX_64 TARGET_LLVM TARGET_LLVM_64 TARGET_LLVM_LINUX64 + TARGET_LINUX_GENERIC TARGET_64 PG_PIC) +- set(FLAGS_L1 "-O3 -mfma -ffp-contract=fast ") ++ set(FLAGS_L1 " ") + + set(DEFINITIONS_L2 HOST_LINUX MAXCPUS=256 MAXCPUSL=8 MAXCPUSR=8 TARGET_LINUX + TARGET_LINUX_64 TARGET_LLVM TARGET_LLVM_64 TARGET_LLVM_LINUX64 + TARGET_LINUX_GENERIC TARGET_64 PG_PIC) +- set(FLAGS_L2 "-O3 -mfma -ffp-contract=fast ") ++ set(FLAGS_L2 " ") + + # common + # Definitions and compiler flags for level 1 directories @@ -180,7 +183,7 @@ else() endif()