1 //===-- runtime/main.cpp ----------------------------------------*- 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 #include "main.h" 10 #include "environment.h" 11 #include "terminator.h" 12 #include <cfenv> 13 #include <cstdio> 14 #include <cstdlib> 15 ConfigureFloatingPoint()16static void ConfigureFloatingPoint() { 17 #ifdef feclearexcept // a macro in some environments; omit std:: 18 feclearexcept(FE_ALL_EXCEPT); 19 #else 20 std::feclearexcept(FE_ALL_EXCEPT); 21 #endif 22 #ifdef fesetround 23 fesetround(FE_TONEAREST); 24 #else 25 std::fesetround(FE_TONEAREST); 26 #endif 27 } 28 29 extern "C" { RTNAME(ProgramStart)30void RTNAME(ProgramStart)(int argc, const char *argv[], const char *envp[]) { 31 std::atexit(Fortran::runtime::NotifyOtherImagesOfNormalEnd); 32 Fortran::runtime::executionEnvironment.Configure(argc, argv, envp); 33 ConfigureFloatingPoint(); 34 // I/O is initialized on demand so that it works for non-Fortran main(). 35 } 36 RTNAME(ByteswapOption)37void RTNAME(ByteswapOption)() { 38 if (Fortran::runtime::executionEnvironment.conversion == 39 Fortran::runtime::Convert::Unknown) { 40 // The environment variable overrides the command-line option; 41 // either of them take precedence over explicit OPEN(CONVERT=) specifiers. 42 Fortran::runtime::executionEnvironment.conversion = 43 Fortran::runtime::Convert::Swap; 44 } 45 } 46 } 47