diff --git a/flang/docs/Intrinsics.md b/flang/docs/Intrinsics.md index f908a9d661fbf..5b671d1b2c740 100644 --- a/flang/docs/Intrinsics.md +++ b/flang/docs/Intrinsics.md @@ -1095,3 +1095,14 @@ program chdir_func print *, "status: ", status end program chdir_func ``` + +### Non-Standard Intrinsics: IERRNO + +#### Description +`IERRNO()` returns the last system error number, as given by the C `errno` variable. + +#### Usage and Info + +- **Standard:** GNU extension +- **Class:** function +- **Syntax:** `RESULT = IERRNO()` diff --git a/flang/include/flang/Runtime/extensions.h b/flang/include/flang/Runtime/extensions.h index 8c0de3f7354a1..133194dea87cf 100644 --- a/flang/include/flang/Runtime/extensions.h +++ b/flang/include/flang/Runtime/extensions.h @@ -72,5 +72,8 @@ std::int64_t FORTRAN_PROCEDURE_NAME(access)(const char *name, // GNU extension subroutine CHDIR(NAME, [STATUS]) int RTNAME(Chdir)(const char *name); +// GNU extension function IERRNO() +int FORTRAN_PROCEDURE_NAME(ierrno)(); + } // extern "C" #endif // FORTRAN_RUNTIME_EXTENSIONS_H_ diff --git a/flang/runtime/extensions.cpp b/flang/runtime/extensions.cpp index fe71cd9d97fa3..ac19ba7b31d4c 100644 --- a/flang/runtime/extensions.cpp +++ b/flang/runtime/extensions.cpp @@ -260,5 +260,7 @@ int RTNAME(Chdir)(const char *name) { #endif } +int FORTRAN_PROCEDURE_NAME(ierrno)() { return errno; } + } // namespace Fortran::runtime } // extern "C" diff --git a/flang/test/Lower/Intrinsics/ierrno.f90 b/flang/test/Lower/Intrinsics/ierrno.f90 new file mode 100644 index 0000000000000..00e04989f4d59 --- /dev/null +++ b/flang/test/Lower/Intrinsics/ierrno.f90 @@ -0,0 +1,13 @@ +! RUN: bbc -emit-fir %s -o - | FileCheck --check-prefixes=CHECK %s +! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck --check-prefixes=CHECK %s + +! CHECK-LABEL: func @_QPtest_ierrno( +subroutine test_ierrno() + integer :: i + i = ierrno() +! CHECK: %[[VAL_0:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFtest_ierrnoEi"} +! CHECK: %[[VAL_1:.*]] = fir.declare %[[VAL_0]] {uniq_name = "_QFtest_ierrnoEi"} : (!fir.ref) -> !fir.ref +! CHECK: %[[VAL_2:.*]] = fir.call @_QPierrno() fastmath : () -> i32 +! CHECK: fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref +! CHECK: return +end subroutine test_ierrno