[flang-commits] [flang] [llvm] [flang] Implement external routine usage of hostnm() (PR #134900)
Eugene Epshteyn via flang-commits
flang-commits at lists.llvm.org
Tue Apr 8 11:18:45 PDT 2025
https://github.com/eugeneepshteyn created https://github.com/llvm/llvm-project/pull/134900
Previously, `hostnm` extended intrinsic was implemented as proper intrinsic. Since then we found out that some applications use `hostnm` as external routine via "external hostnm". This prevents `hostnm` from being recognized as an intrinsic. This PR implements `hostnm` as external routine.
>From 3619245b149cbf02893aa502c1d311d2afae5791 Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Tue, 8 Apr 2025 13:39:23 -0400
Subject: [PATCH 1/2] Implemented hostnm that could be called as an external
function.
modified: flang-rt/lib/runtime/extensions.cpp
---
flang-rt/lib/runtime/extensions.cpp | 37 +++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/flang-rt/lib/runtime/extensions.cpp b/flang-rt/lib/runtime/extensions.cpp
index 6b553ff97e5ab..4134931c58fc1 100644
--- a/flang-rt/lib/runtime/extensions.cpp
+++ b/flang-rt/lib/runtime/extensions.cpp
@@ -264,6 +264,43 @@ int RTNAME(Chdir)(const char *name) {
#endif
}
+int FORTRAN_PROCEDURE_NAME(hostnm)(char* hn, int length) {
+
+ std::int32_t status{0};
+
+ if (!hn || length < 0) {
+ return EINVAL;
+ }
+
+#ifdef _WIN32
+
+ DWORD dwSize{length};
+
+ // Note: Winsock has gethostname(), but use Win32 API GetComputerNameEx(),
+ // in order to avoid adding dependency on Winsock.
+ if (!GetComputerNameExA(ComputerNameDnsHostname, hn, &dwSize)) {
+ status = GetLastError();
+ }
+
+#else
+
+ if (gethostname(hn, sizeof(length)) < 0) {
+ status = errno;
+ }
+
+#endif
+
+ if (status == 0) {
+ // Find zero terminator and fill the string from the
+ // zero terminator to the end with spaces
+ const char* str_end = hn + length;
+ const char* str_zero = std::find(hn, str_end, '\0');
+ std::fill(str_zero, str_end, ' ');
+ }
+
+ return status;
+}
+
int FORTRAN_PROCEDURE_NAME(ierrno)() { return errno; }
void FORTRAN_PROCEDURE_NAME(qsort)(int *array, int *len, int *isize,
>From 3ca7fa32e3a33cfe8e4e133bc7eb63c076272b5b Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Tue, 8 Apr 2025 14:13:57 -0400
Subject: [PATCH 2/2] Compilation and bug fixes
modified: flang-rt/lib/runtime/extensions.cpp
modified: flang/include/flang/Runtime/extensions.h
---
flang-rt/lib/runtime/extensions.cpp | 6 +++---
flang/include/flang/Runtime/extensions.h | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/flang-rt/lib/runtime/extensions.cpp b/flang-rt/lib/runtime/extensions.cpp
index 4134931c58fc1..d1c426435f3db 100644
--- a/flang-rt/lib/runtime/extensions.cpp
+++ b/flang-rt/lib/runtime/extensions.cpp
@@ -284,7 +284,7 @@ int FORTRAN_PROCEDURE_NAME(hostnm)(char* hn, int length) {
#else
- if (gethostname(hn, sizeof(length)) < 0) {
+ if (gethostname(hn, length) < 0) {
status = errno;
}
@@ -293,8 +293,8 @@ int FORTRAN_PROCEDURE_NAME(hostnm)(char* hn, int length) {
if (status == 0) {
// Find zero terminator and fill the string from the
// zero terminator to the end with spaces
- const char* str_end = hn + length;
- const char* str_zero = std::find(hn, str_end, '\0');
+ char* str_end = hn + length;
+ char* str_zero = std::find(hn, str_end, '\0');
std::fill(str_zero, str_end, ' ');
}
diff --git a/flang/include/flang/Runtime/extensions.h b/flang/include/flang/Runtime/extensions.h
index db2245875e85a..06ae7f35d9b5b 100644
--- a/flang/include/flang/Runtime/extensions.h
+++ b/flang/include/flang/Runtime/extensions.h
@@ -60,7 +60,7 @@ uid_t RTNAME(GetUID)();
void FORTRAN_PROCEDURE_NAME(getlog)(char *name, std::int64_t length);
// GNU extension subroutine HOSTNM(C)
-void FORTRAN_PROCEDURE_NAME(hostnm)(char *name, std::int64_t length);
+int FORTRAN_PROCEDURE_NAME(hostnm)(char *hn, int length);
std::intptr_t RTNAME(Malloc)(std::size_t size);
More information about the flang-commits
mailing list