From 2c1ce0755e09909c41db93845c4c3f42457cb9c8 Mon Sep 17 00:00:00 2001 From: Jean Perier Date: Thu, 30 Sep 2021 06:26:00 -0700 Subject: [PATCH] [flang] Add a wrapper for Fortran main program Add a C wrapper that calls the Fortran runtime initialization and finalization routines as well as the compiled Fortran main program _QQmain. Place it in its own library to satisfy shared library builds since it contains a C main function. - https://github.com/flang-compiler/f18-llvm-project/commit/cc7ac498f916d32a9b197d3ace816f4de5d36aad#diff-fa35a5efa62731fd2845e5e982eca9a2e36439783e11a4e4a463753c2160ec10R53 - was created in flang/test/Examples/main.c in Eric's branch --- flang/cmake/modules/AddFlang.cmake | 4 ++-- flang/runtime/CMakeLists.txt | 14 ++++++-------- flang/runtime/Fortran_main.c | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 flang/runtime/Fortran_main.c diff --git a/flang/cmake/modules/AddFlang.cmake b/flang/cmake/modules/AddFlang.cmake index 5da58a5..82a3142 100644 --- a/flang/cmake/modules/AddFlang.cmake +++ b/flang/cmake/modules/AddFlang.cmake @@ -17,7 +17,7 @@ endmacro() macro(add_flang_library name) cmake_parse_arguments(ARG - "SHARED" + "SHARED;STATIC" "" "ADDITIONAL_HEADERS" ${ARGN}) @@ -52,7 +52,7 @@ macro(add_flang_library name) else() # llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set, # so we need to handle it here. - if (BUILD_SHARED_LIBS) + if (BUILD_SHARED_LIBS AND NOT ARG_STATIC) set(LIBTYPE SHARED OBJECT) else() set(LIBTYPE STATIC OBJECT) diff --git a/flang/runtime/CMakeLists.txt b/flang/runtime/CMakeLists.txt index b3e96fa..d7b6b79 100644 --- a/flang/runtime/CMakeLists.txt +++ b/flang/runtime/CMakeLists.txt @@ -1,15 +1,9 @@ -#===-- runtime/CMakeLists.txt ----------------------------------------------===# -# -# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -# See https://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#===------------------------------------------------------------------------===# include(CheckCXXSymbolExists) include(CheckCXXSourceCompiles) check_cxx_symbol_exists(strerror string.h HAVE_STRERROR) check_cxx_symbol_exists(strerror_r string.h HAVE_STRERROR_R) + # Can't use symbol exists here as the function is overloaded in C++ check_cxx_source_compiles( "#include @@ -30,7 +24,7 @@ configure_file(config.h.cmake config.h) # with different names include_directories(AFTER ${CMAKE_CURRENT_BINARY_DIR}) -add_flang_library(FortranRuntime +add_flang_library(FortranRuntime PARTIAL_SOURCES_INTENDED ISO_Fortran_binding.cpp allocatable.cpp assign.cpp @@ -82,3 +76,7 @@ add_flang_library(FortranRuntime LINK_LIBS FortranDecimal ) + +add_flang_library(Fortran_main STATIC PARTIAL_SOURCES_INTENDED + Fortran_main.c +) diff --git a/flang/runtime/Fortran_main.c b/flang/runtime/Fortran_main.c new file mode 100644 index 0000000..88f0cdb --- /dev/null +++ b/flang/runtime/Fortran_main.c @@ -0,0 +1,14 @@ +#include "flang/Runtime/main.h" +#include "flang/Runtime/stop.h" + +/* main entry into PROGRAM */ +void _QQmain(); + +/* C main stub */ +int main(int argc, const char *argv[], const char *envp[]) +{ + RTNAME(ProgramStart)(argc, argv, envp); + _QQmain(); + RTNAME(ProgramEndStatement)(); + return 0; +} -- 2.7.4