When Flang is built with multiple target architectures specified for -DLLVM_TARGETS_TO_BUILD, .mod files are created only for the default target architecture and not for other architectures.
This becomes a problem, for example, when building on an X86_64 machine targeting both X86_64 and AArch64.
cmake \
-G Ninja \
-DCMAKE_INSTALL_PREFIX=/<install_dir> \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS="clang;mlir;flang" \
-DLLVM_TARGETS_TO_BUILD="AArch64;X86" \
-DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-unknown-linux-gnu" \
/<llvm_dir>/llvm-project/llvm
In this case, .mod files are likely built by this command, but since no target architecture is specified, they seem to be built only for the default X86_64. This leads to cross-compilation failures like the following:
program main
use, intrinsic :: IEEE_ARITHMETIC
implicit none
end program
$ flang --target=aarch64-unknown-linux-gnu --sysroot=<GCC_TOOLCHAIN_DIR>/libc --gcc-toolchain=<GCC_TOOLCHAIN_DIR> foo.f90 -c -o x86_to_aarch.o
error: Semantic errors in foo.f90
/<install_dir>/bin/../include/flang/ieee_arithmetic.mod:143:1: error: REAL(KIND=10) is not an enabled type for this target
real(10),intent(in)::x
^^^^^^^^^^^^^^^^^^^^^^
/<install_dir>/bin/../include/flang/ieee_arithmetic.mod:183:1: error: REAL(KIND=10) is not an enabled type for this target
real(10),intent(in)::y
^^^^^^^^^^^^^^^^^^^^^^
/<install_dir>/bin/../include/flang/ieee_arithmetic.mod:223:1: error: REAL(KIND=10) is not an enabled type for this target
real(10),intent(in)::y
^^^^^^^^^^^^^^^^^^^^^^
...
This error seems to occur because ieee_arithmetic.mod is built for X86_64 with REAL(KIND=10) included, and then compiled for AArch64. A similar issue was also reported in #146876.
Other modules also contain values that differ from the target architecture because they are built for X86_64. We have confirmed the following:
iso_c_binding.mod
- Built natively for AArch64
integer(4),parameter::c_long_double=16_4
- Built on X86_64 with
-DLLVM_TARGETS_TO_BUILD="AArch64;X86"
integer(4),parameter::c_long_double=10_4
iso_fortran_env_impl.mod
- Built natively for AArch64
integer(4),parameter::__builtin_real_kinds(1_8:*)=[INTEGER(4)::2_4,3_4,4_4,8_4,16_4]
- Built on X86_64 with
-DLLVM_TARGETS_TO_BUILD="AArch64;X86"
integer(4),parameter::__builtin_real_kinds(1_8:*)=[INTEGER(4)::2_4,3_4,4_4,8_4,10_4]
To resolve this, it might be necessary to change the build process to create all .mod files for each target architecture and then select the appropriate .mod file during compilation.
When Flang is built with multiple target architectures specified for
-DLLVM_TARGETS_TO_BUILD,.modfiles are created only for the default target architecture and not for other architectures.This becomes a problem, for example, when building on an X86_64 machine targeting both X86_64 and AArch64.
In this case,
.modfiles are likely built by this command, but since no target architecture is specified, they seem to be built only for the default X86_64. This leads to cross-compilation failures like the following:This error seems to occur because
ieee_arithmetic.modis built for X86_64 withREAL(KIND=10)included, and then compiled for AArch64. A similar issue was also reported in #146876.Other modules also contain values that differ from the target architecture because they are built for X86_64. We have confirmed the following:
iso_c_binding.modinteger(4),parameter::c_long_double=16_4-DLLVM_TARGETS_TO_BUILD="AArch64;X86"integer(4),parameter::c_long_double=10_4iso_fortran_env_impl.modinteger(4),parameter::__builtin_real_kinds(1_8:*)=[INTEGER(4)::2_4,3_4,4_4,8_4,16_4]-DLLVM_TARGETS_TO_BUILD="AArch64;X86"integer(4),parameter::__builtin_real_kinds(1_8:*)=[INTEGER(4)::2_4,3_4,4_4,8_4,10_4]To resolve this, it might be necessary to change the build process to create all
.modfiles for each target architecture and then select the appropriate.modfile during compilation.