From 1cfae76ed91a91aac9444e5a07d31965aae9a628 Mon Sep 17 00:00:00 2001 From: Peter Steinfeld Date: Wed, 12 Oct 2022 12:41:51 -0700 Subject: [PATCH] [Flang] Adjust preprocessing to build modules correctly Several module files in .../llvm-project/flang/module check for the existence of the macro "__x86_64__" to conditionally compile Fortran code. Unfortunately, this macro was not being defined anywhere. This patch fixes that for compilations targeting 64 bit x86 machines. I made the following changes -- -- Removed the test for 32 bit X86 targets. The rest of the compiler and runtime do not support X86 32 bits. -- Added predefined macros to define "__x86_64__" and "__x86__64" to be 1 when the target architecture is 64 bit x86 and the "-cpp" option is on the command line. -- Changed the cmake file for creating the Fortran module files to use the "-cpp" option so that the macro "__x86_64__" will be defined when building the module files. -- Added a test. Differential Revision: https://reviews.llvm.org/D135810 --- flang/lib/Frontend/CompilerInvocation.cpp | 10 +++++++--- flang/test/Driver/predefined-macros-x86.f90 | 16 ++++++++++++++++ flang/tools/f18/CMakeLists.txt | 2 +- 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 flang/test/Driver/predefined-macros-x86.f90 diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index c182418..761300b 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -784,6 +784,11 @@ void CompilerInvocation::setDefaultPredefinitions() { Fortran::common::LanguageFeature::OpenMP)) { fortranOptions.predefinitions.emplace_back("_OPENMP", "201511"); } + llvm::Triple targetTriple{llvm::Triple(this->targetOpts.triple)}; + if (targetTriple.getArch() == llvm::Triple::ArchType::x86_64) { + fortranOptions.predefinitions.emplace_back("__x86_64__", "1"); + fortranOptions.predefinitions.emplace_back("__x86_64", "1"); + } } void CompilerInvocation::setFortranOpts() { @@ -837,7 +842,7 @@ void CompilerInvocation::setFortranOpts() { void CompilerInvocation::setSemanticsOpts( Fortran::parser::AllCookedSources &allCookedSources) { - const auto &fortranOptions = getFortranOpts(); + auto &fortranOptions = getFortranOpts(); semanticsContext = std::make_unique( getDefaultKinds(), fortranOptions.features, allCookedSources); @@ -851,8 +856,7 @@ void CompilerInvocation::setSemanticsOpts( llvm::Triple targetTriple{llvm::Triple(this->targetOpts.triple)}; // FIXME: Handle real(3) ? - if (targetTriple.getArch() != llvm::Triple::ArchType::x86 && - targetTriple.getArch() != llvm::Triple::ArchType::x86_64) { + if (targetTriple.getArch() != llvm::Triple::ArchType::x86_64) { semanticsContext->targetCharacteristics().DisableType( Fortran::common::TypeCategory::Real, /*kind=*/10); } diff --git a/flang/test/Driver/predefined-macros-x86.f90 b/flang/test/Driver/predefined-macros-x86.f90 new file mode 100644 index 0000000..29243fd --- /dev/null +++ b/flang/test/Driver/predefined-macros-x86.f90 @@ -0,0 +1,16 @@ +! Test predefined macro for 64 bit X86 architecture + +! REQUIRES: x86-registered-target + +! RUN: %flang_fc1 -triple x86_64-unknown-linux-gnu -cpp -E %s | FileCheck %s + +! CHECK: integer :: var1 = 1 +! CHECK: integer :: var2 = 1 + +#if __x86_64__ + integer :: var1 = __x86_64__ +#endif +#if __x86_64__ + integer :: var2 = __x86_64 +#endif +end program diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt index e7a826e0..b046850 100644 --- a/flang/tools/f18/CMakeLists.txt +++ b/flang/tools/f18/CMakeLists.txt @@ -39,7 +39,7 @@ if (NOT CMAKE_CROSSCOMPILING) endif() add_custom_command(OUTPUT ${base}.mod COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR} - COMMAND flang-new -fc1 -fsyntax-only -module-dir ${FLANG_INTRINSIC_MODULES_DIR} + COMMAND flang-new -fc1 -cpp -fsyntax-only -module-dir ${FLANG_INTRINSIC_MODULES_DIR} ${FLANG_SOURCE_DIR}/module/${filename}.f90 DEPENDS flang-new ${FLANG_SOURCE_DIR}/module/${filename}.f90 ${depends} ) -- 2.7.4