[flang][cmake] Make CMake copy "omp_lib.h" into the build directory

Any header or module file in the Flang source directory is of no use to
the compiler unless it is copied into the build directory. Indeed, all
compiler search paths are relative to the compiler executable (flang-new
in our case). Hence, "omp_lib.h" should be copied into the build
directory alongside other compiler-provided files that can be "included"
(header files) or "used" (module files).

For now, "omp_lib.h" is copied into "<build-dir>/include/flang/OpenMP".
We may decide to change this in future. For example, Clang copies a
bunch of runtime headers into “<build-dir>/lib/clang/<version-number>”.
We could also consider using a similar header from a different
sub-project.

Flang's driver search path is updated accordingly. A rule for
"installing" the "omp_lib.h" header is _yet to be added_ (we will also
need to determine the suitable location for this).

Differential Revision: https://reviews.llvm.org/D122015
This commit is contained in:
Andrzej Warzynski 2022-03-18 16:20:56 +00:00
parent d2ca2b94fd
commit dda366ed37
3 changed files with 51 additions and 0 deletions

View File

@ -381,6 +381,15 @@ static std::string getIntrinsicDir() {
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 @@ void CompilerInvocation::SetDefaultFortranOpts() {
std::vector<std::string> 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;
}

View File

@ -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

View File

@ -57,3 +57,6 @@ if (NOT WIN32)
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)