diff options
author | Peter Steinfeld <psteinfeld@nvidia.com> | 2022-10-12 12:41:51 -0700 |
---|---|---|
committer | Peter Steinfeld <psteinfeld@nvidia.com> | 2022-10-14 12:27:48 -0700 |
commit | 1cfae76ed91a91aac9444e5a07d31965aae9a628 (patch) | |
tree | 3e7656a9b844e6bfdd0f3541b8f789e538d858d9 /flang/lib/Frontend/CompilerInvocation.cpp | |
parent | d877e3fe71676b0ff10410d80456b35cdd5bf796 (diff) | |
download | llvm-1cfae76ed91a91aac9444e5a07d31965aae9a628.zip llvm-1cfae76ed91a91aac9444e5a07d31965aae9a628.tar.gz llvm-1cfae76ed91a91aac9444e5a07d31965aae9a628.tar.bz2 |
[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
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | flang/lib/Frontend/CompilerInvocation.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
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<semantics::SemanticsContext>( 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); } |