[flang] [llvm] [flang/flang-rt] Implement PERROR intrinsic form GNU Extension (PR #132406)
Jean-Didier PAILLEUX via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 21 07:56:09 PDT 2025
https://github.com/JDPailleux updated https://github.com/llvm/llvm-project/pull/132406
>From 0e6e0e2429061024e5ec466f9a0981541bd5048c Mon Sep 17 00:00:00 2001
From: Jean-Didier Pailleux <jean-didier.pailleux at sipearl.com>
Date: Thu, 20 Mar 2025 11:33:18 +0100
Subject: [PATCH] [flang/flang-rt] Implement PERROR intrinsic form GNU
Extension
---
flang-rt/lib/runtime/extensions.cpp | 4 ++++
flang/docs/Intrinsics.md | 12 ++++++++++++
flang/include/flang/Runtime/extensions.h | 3 +++
flang/test/Lower/Intrinsics/perror.f90 | 14 ++++++++++++++
4 files changed, 33 insertions(+)
create mode 100644 flang/test/Lower/Intrinsics/perror.f90
diff --git a/flang-rt/lib/runtime/extensions.cpp b/flang-rt/lib/runtime/extensions.cpp
index 7e9e512778a75..f7b1388655257 100644
--- a/flang-rt/lib/runtime/extensions.cpp
+++ b/flang-rt/lib/runtime/extensions.cpp
@@ -17,6 +17,7 @@
#include "flang/Runtime/entry-names.h"
#include "flang/Runtime/io-api.h"
#include <chrono>
+#include <cstdio>
#include <cstring>
#include <ctime>
#include <signal.h>
@@ -268,5 +269,8 @@ void FORTRAN_PROCEDURE_NAME(qsort)(int *array, int *len, int *isize,
qsort(array, *len, *isize, compar);
}
+// PERROR(STRING)
+void FORTRAN_PROCEDURE_NAME(perror)(const char *str) { perror(str); }
+
} // namespace Fortran::runtime
} // extern "C"
diff --git a/flang/docs/Intrinsics.md b/flang/docs/Intrinsics.md
index eb09d550504d0..1ac20d7caf82f 100644
--- a/flang/docs/Intrinsics.md
+++ b/flang/docs/Intrinsics.md
@@ -1137,3 +1137,15 @@ by `ISIZE`.
- **Standard:** lib3f (section 3f of old man pages).
- **Class:** subroutine
- **Syntax:** `CALL QSORT(ARRAY, LEN, ISIZE, COMPAR)`
+
+### Non-Standard Intrinsics: PERROR
+
+#### Description
+`PERROR(STRING)` prints (on the C stderr stream) a newline-terminated error message corresponding to the last system error.
+This is prefixed by `STRING`, a colon and a space.
+
+#### Usage and Info
+
+- **Standard:** GNU extension
+- **Class:** subroutine
+- **Syntax:** `CALL PERROR(STRING)`
diff --git a/flang/include/flang/Runtime/extensions.h b/flang/include/flang/Runtime/extensions.h
index 133194dea87cf..b218b9b97ce10 100644
--- a/flang/include/flang/Runtime/extensions.h
+++ b/flang/include/flang/Runtime/extensions.h
@@ -75,5 +75,8 @@ int RTNAME(Chdir)(const char *name);
// GNU extension function IERRNO()
int FORTRAN_PROCEDURE_NAME(ierrno)();
+// GNU extension subroutine PERROR(STRING)
+void FORTRAN_PROCEDURE_NAME(perror)(const char *str);
+
} // extern "C"
#endif // FORTRAN_RUNTIME_EXTENSIONS_H_
diff --git a/flang/test/Lower/Intrinsics/perror.f90 b/flang/test/Lower/Intrinsics/perror.f90
new file mode 100644
index 0000000000000..e42c109f6491c
--- /dev/null
+++ b/flang/test/Lower/Intrinsics/perror.f90
@@ -0,0 +1,14 @@
+! 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_perror(
+subroutine test_perror()
+ character(len=10) :: string
+ call perror(string)
+ ! CHECK: %[[C10:.*]] = arith.constant 10 : index
+ ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.char<1,10> {bindc_name = "string", uniq_name = "_QFtest_perrorEstring"}
+ ! CHECK: %[[VAL_1:.*]] = fir.declare %[[VAL_0]] typeparams %[[C10]] {uniq_name = "_QFtest_perrorEstring"} : (!fir.ref<!fir.char<1,10>>, index) -> !fir.ref<!fir.char<1,10>>
+ ! CHECK: %[[VAL_2:.*]] = fir.emboxchar %[[VAL_1]], %[[C10]] : (!fir.ref<!fir.char<1,10>>, index) -> !fir.boxchar<1>
+ ! CHECK: fir.call @_QPperror(%[[VAL_2]]) fastmath<contract> : (!fir.boxchar<1>) -> ()
+ ! CHECK: return
+end subroutine test_perror
More information about the llvm-commits
mailing list