1 //===-- runtime/main.cpp --------------------------------------------------===// 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 "flang/Runtime/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 const EnvironmentDefaultList *envDefaults) { 32 std::atexit(Fortran::runtime::NotifyOtherImagesOfNormalEnd); 33 Fortran::runtime::executionEnvironment.Configure( 34 argc, argv, envp, envDefaults); 35 ConfigureFloatingPoint(); 36 // I/O is initialized on demand so that it works for non-Fortran main(). 37 } 38 RTNAME(ByteswapOption)39void RTNAME(ByteswapOption)() { 40 if (Fortran::runtime::executionEnvironment.conversion == 41 Fortran::runtime::Convert::Unknown) { 42 // The environment variable overrides the command-line option; 43 // either of them take precedence over explicit OPEN(CONVERT=) specifiers. 44 Fortran::runtime::executionEnvironment.conversion = 45 Fortran::runtime::Convert::Swap; 46 } 47 } 48 } 49