diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -381,6 +381,15 @@ return std::string(driverPath); } +// Generate the path to look for OpenMP headers +static std::string getOpenMPHeadersDir() { + llvm::SmallString<128> includePath; + includePath.assign(llvm::sys::fs::getMainExecutable(nullptr, nullptr)); + llvm::sys::path::remove_filename(includePath); + includePath.append("/../include/flang/OpenMP/"); + return std::string(includePath); +} + /// Parses all preprocessor input arguments and populates the preprocessor /// options accordingly. /// @@ -626,6 +635,11 @@ std::vector searchDirectories{"."s}; fortranOptions.searchDirectories = searchDirectories; + + // Add the location of omp_lib.h to the search directories. Currently this is + // identical to the modules' directory. + fortranOptions.searchDirectories.emplace_back(getOpenMPHeadersDir()); + fortranOptions.isFixedForm = false; } diff --git a/flang/test/Driver/include-omp-header.f90 b/flang/test/Driver/include-omp-header.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Driver/include-omp-header.f90 @@ -0,0 +1,34 @@ +! Verify that the omp_lib.h header is found and included correctly. This header file should be available at a path: +! * relative to the driver, that's +! * known the driver. +! This is taken care of at the CMake and the driver levels. Note that when searching for header files, the directory of the current +! source file takes precedence over other search paths. Hence adding omp_lib.h in the current directory will make Flang use that +! header file instead of the one shipped with Flang. + +!---------- +! RUN LINES +!---------- +! This should just work +! RUN: not rm omp_lib.h +! RUN: %flang -fsyntax-only -fopenmp %s 2>&1 + +! Create an empty omp_lib.h header that _does not_ define omp_default_mem_alloc - this should lead to semantic errors +! RUN: touch omp_lib.h +! RUN: not %flang -fsyntax-only -fopenmp %s 2>&1 | FileCheck %s +! RUN: rm omp_lib.h + +!-------------------------- +! EXPECTED OUTPUT +!-------------------------- +! CHECK: error: Must have INTEGER type, but is REAL(4) + +!------- +! INPUT +!------- +include "omp_lib.h" + +integer :: x, y + +!$omp allocate(x, y) allocator(omp_default_mem_alloc) + +end diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt --- a/flang/tools/f18/CMakeLists.txt +++ b/flang/tools/f18/CMakeLists.txt @@ -57,3 +57,6 @@ add_custom_target(flang ALL DEPENDS ${CMAKE_BINARY_DIR}/bin/flang) install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/flang DESTINATION "${CMAKE_INSTALL_BINDIR}") endif() + +# TODO Move this to a more suitable location +file(COPY ${FLANG_SOURCE_DIR}/module/omp_lib.h DESTINATION "${CMAKE_BINARY_DIR}/include/flang/OpenMP/" FILE_PERMISSIONS OWNER_READ OWNER_WRITE)