Skip to content

Commit 148fd66

Browse files
committed
[flang] Generate quadmath_wrapper.h for Flang Evaluate.
When building Flang with Clang, we need to do the same quadmath.h wrapping as we do for flang-rt. I extracted the CMake code into FlangCommon.cmake, and cleaned up the arguments passing to execute_process (note that `-###` was treated as `-` in the original code, because `#` starts a comment). I believe the Clang command does not require the input source file, so I removed it as well.
1 parent fd0e20a commit 148fd66

File tree

9 files changed

+78
-47
lines changed

9 files changed

+78
-47
lines changed

flang-rt/CMakeLists.txt

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -261,44 +261,6 @@ set(HAVE_BACKTRACE ${Backtrace_FOUND})
261261
set(BACKTRACE_HEADER ${Backtrace_HEADER})
262262

263263

264-
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
265-
if (NOT DEFINED FLANG_RT_GCC_RESOURCE_DIR)
266-
set(FLANG_RT_GCC_RESOURCE_DIR "FLANG_RT_GCC_RESOURCE_DIR-NOTFOUND")
267-
execute_process(
268-
COMMAND "${CMAKE_CXX_COMPILER}" -v -c "${FLANG_RT_SOURCE_DIR}/cmake/clang_gcc_root.cpp" ${CMAKE_CXX_FLAGS} -###
269-
ERROR_FILE "${CMAKE_CURRENT_BINARY_DIR}/clang_gcc_root_result"
270-
)
271-
file(STRINGS "${CMAKE_CURRENT_BINARY_DIR}/clang_gcc_root_result" _errorresult)
272-
foreach (_line IN LISTS _errorresult)
273-
string(REGEX MATCH
274-
"^Selected GCC installation: (.+)$"
275-
_match
276-
"${_line}")
277-
if (CMAKE_MATCH_1)
278-
set(FLANG_RT_GCC_RESOURCE_DIR "${CMAKE_MATCH_1}")
279-
message(STATUS "Found GCC installation selected by Clang: ${FLANG_RT_GCC_RESOURCE_DIR}")
280-
break()
281-
endif ()
282-
endforeach ()
283-
set(FLANG_RT_GCC_RESOURCE_DIR "${FLANG_RT_GCC_RESOURCE_DIR}" CACHE INTERNAL "Path to GCC's resource dir selected by Clang" FORCE)
284-
endif ()
285-
endif ()
286-
287-
check_include_file("quadmath.h" FOUND_QUADMATH_H)
288-
if (FOUND_QUADMATH_H)
289-
message(STATUS "quadmath.h found without additional include paths")
290-
set(FLANG_RT_INCLUDE_QUADMATH_H "<quadmath.h>")
291-
elseif (FLANG_RT_GCC_RESOURCE_DIR)
292-
cmake_push_check_state()
293-
list(APPEND CMAKE_REQUIRED_INCLUDES "${FLANG_RT_GCC_RESOURCE_DIR}/include")
294-
check_include_file("quadmath.h" FOUND_GCC_QUADMATH_H)
295-
cmake_pop_check_state()
296-
if (FOUND_GCC_QUADMATH_H)
297-
message(STATUS "quadmath.h found in Clang's selected GCC installation")
298-
set(FLANG_RT_INCLUDE_QUADMATH_H "\"${FLANG_RT_GCC_RESOURCE_DIR}/include/quadmath.h\"")
299-
endif ()
300-
endif ()
301-
302264
#####################
303265
# Build Preparation #
304266
#####################
@@ -320,7 +282,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED YES)
320282

321283

322284
configure_file(cmake/config.h.cmake.in config.h)
323-
if (FLANG_RT_INCLUDE_QUADMATH_H)
285+
if (FLANG_INCLUDE_QUADMATH_H)
324286
configure_file("cmake/quadmath_wrapper.h.in" "${FLANG_RT_BINARY_DIR}/quadmath_wrapper.h")
325287
endif ()
326288

flang-rt/cmake/clang_gcc_root.cpp

Lines changed: 0 additions & 1 deletion
This file was deleted.

flang-rt/cmake/quadmath_wrapper.h.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66
*
77
*===----------------------------------------------------------------------===*/
88

9-
#include ${FLANG_RT_INCLUDE_QUADMATH_H}
9+
#include ${FLANG_INCLUDE_QUADMATH_H}

flang-rt/lib/quadmath/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ target_include_directories(FortranFloat128MathILib INTERFACE
7878

7979
if (FLANG_RUNTIME_F128_MATH_LIB)
8080
if (${FLANG_RUNTIME_F128_MATH_LIB} STREQUAL "libquadmath")
81-
if(FLANG_RT_INCLUDE_QUADMATH_H)
81+
if(FLANG_INCLUDE_QUADMATH_H)
8282
add_compile_definitions(HAS_QUADMATHLIB)
8383
else()
8484
message(FATAL_ERROR

flang/cmake/modules/FlangCommon.cmake

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,50 @@ if (IS_BIGENDIAN)
4545
else ()
4646
add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
4747
endif ()
48+
49+
# Discover the GCC installation, when the build compiler is Clang,
50+
# and try to find quadmath.h there. Set FLANG_INCLUDE_QUADMATH_H
51+
# to the path to quadmath.h, if found.
52+
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
53+
if (NOT DEFINED FLANG_GCC_RESOURCE_DIR)
54+
set(FLANG_GCC_RESOURCE_DIR "FLANG_GCC_RESOURCE_DIR-NOTFOUND")
55+
# Prepare CMAKE_CXX_FLAGS so that they can be passed to execute_process
56+
# as separate flags.
57+
separate_arguments(flags UNIX_COMMAND "${CMAKE_CXX_FLAGS}")
58+
set(hash_flag "-###")
59+
set(command ${CMAKE_CXX_COMPILER} ${flags} ${hash_flag} -v)
60+
execute_process(
61+
COMMAND ${command}
62+
ERROR_FILE "${CMAKE_CURRENT_BINARY_DIR}/clang_gcc_root_result"
63+
)
64+
file(STRINGS "${CMAKE_CURRENT_BINARY_DIR}/clang_gcc_root_result" _errorresult)
65+
foreach (_line IN LISTS _errorresult)
66+
string(REGEX MATCH
67+
"^Selected GCC installation: (.+)$"
68+
_match
69+
"${_line}")
70+
if (CMAKE_MATCH_1)
71+
set(FLANG_GCC_RESOURCE_DIR "${CMAKE_MATCH_1}")
72+
message(STATUS "Found GCC installation selected by Clang: ${FLANG_GCC_RESOURCE_DIR}")
73+
break()
74+
endif ()
75+
endforeach ()
76+
set(FLANG_GCC_RESOURCE_DIR "${FLANG_GCC_RESOURCE_DIR}" CACHE INTERNAL "Path to GCC's resource dir selected by Clang" FORCE)
77+
endif ()
78+
endif ()
79+
80+
check_include_file("quadmath.h" FOUND_QUADMATH_H)
81+
if (FOUND_QUADMATH_H)
82+
message(STATUS "quadmath.h found without additional include paths")
83+
set(FLANG_INCLUDE_QUADMATH_H "<quadmath.h>")
84+
elseif (FLANG_GCC_RESOURCE_DIR)
85+
cmake_push_check_state()
86+
list(APPEND CMAKE_REQUIRED_INCLUDES "${FLANG_GCC_RESOURCE_DIR}/include")
87+
check_include_file("quadmath.h" FOUND_GCC_QUADMATH_H)
88+
cmake_pop_check_state()
89+
if (FOUND_GCC_QUADMATH_H)
90+
message(STATUS "quadmath.h found in Clang's selected GCC installation")
91+
set(FLANG_INCLUDE_QUADMATH_H "\"${FLANG_GCC_RESOURCE_DIR}/include/quadmath.h\"")
92+
endif ()
93+
endif ()
94+

flang/cmake/quadmath_wrapper.h.in

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*===-- cmake/quadmath_wrapper.h.in ---------------------=-----------*- C -*-===
2+
*
3+
* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
* See https://llvm.org/LICENSE.txt for license information.
5+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
*
7+
*===----------------------------------------------------------------------===*/
8+
9+
#ifdef __clang_major__
10+
/*
11+
* _Complex inside quadmath.h triggers c99-extension warnings,
12+
* when this header file is included into a C++ file.
13+
* Disable them just during the inclusion of quadmath.h.
14+
*/
15+
#pragma clang diagnostic push
16+
#pragma clang diagnostic ignored "-Wc99-extensions"
17+
#endif
18+
19+
#include ${FLANG_INCLUDE_QUADMATH_H}
20+
21+
#ifdef __clang_major__
22+
#pragma clang diagnostic pop
23+
#endif

flang/lib/Evaluate/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ if (LIBPGMATH_DIR)
2121
endif()
2222
endif()
2323

24-
check_include_file(quadmath.h FOUND_QUADMATH_HEADER)
2524
check_library_exists(quadmath sinq "" FOUND_QUADMATH_LIB)
26-
if(FOUND_QUADMATH_HEADER AND FOUND_QUADMATH_LIB)
25+
if (FLANG_INCLUDE_QUADMATH_H AND FOUND_QUADMATH_LIB)
26+
configure_file("${FLANG_SOURCE_DIR}/cmake/quadmath_wrapper.h.in" "${CMAKE_CURRENT_BINARY_DIR}/quadmath_wrapper.h")
2727
add_compile_definitions(HAS_QUADMATHLIB)
2828
set(QUADMATHLIB quadmath)
29-
endif()
29+
endif ()
3030

3131
add_flang_library(FortranEvaluate
3232
call.cpp

flang/lib/Evaluate/host.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
// to safely refer to this hardware type.
1919

2020
#if HAS_QUADMATHLIB
21-
#include "quadmath.h"
21+
#include "quadmath_wrapper.h"
2222
#include "flang/Common/float128.h"
2323
#endif
2424
#include "flang/Evaluate/type.h"

flang/lib/Evaluate/intrinsics-library.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include <complex>
2424
#include <functional>
2525
#if HAS_QUADMATHLIB
26-
#include "quadmath.h"
26+
#include "quadmath_wrapper.h"
2727
#endif
2828
#include "flang/Common/float128.h"
2929
#include "flang/Common/float80.h"

0 commit comments

Comments
 (0)