[flang-commits] [flang] 1d4238b - [flang] Support GNU extensions IARGC and GETARG in runtime
via flang-commits
flang-commits at lists.llvm.org
Mon Oct 10 19:31:56 PDT 2022
Author: Peixin-Qiao
Date: 2022-10-11T10:29:23+08:00
New Revision: 1d4238be528acdd8a521465e93ed6a6238a2cd4e
URL: https://github.com/llvm/llvm-project/commit/1d4238be528acdd8a521465e93ed6a6238a2cd4e
DIFF: https://github.com/llvm/llvm-project/commit/1d4238be528acdd8a521465e93ed6a6238a2cd4e.diff
LOG: [flang] Support GNU extensions IARGC and GETARG in runtime
The GNU extension intrinsic IARGC is equivalent to
COMMAND_ARGUMENT_COUNT, and the GETARG is similar to
GET_COMMAND_ARGUMENT, but with less arguments. Reuse the runtime of
COMMAND_ARGUMENT_COUNT and GET_COMMAND_ARGUMENT for IARGC and GETARG.
Reviewed By: klausler
Differential Revision: https://reviews.llvm.org/D133558
Added:
Modified:
flang/include/flang/Runtime/extensions.h
flang/runtime/extensions.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Runtime/extensions.h b/flang/include/flang/Runtime/extensions.h
index c0edfd90a460e..ad592814e5acb 100644
--- a/flang/include/flang/Runtime/extensions.h
+++ b/flang/include/flang/Runtime/extensions.h
@@ -12,12 +12,21 @@
#ifndef FORTRAN_RUNTIME_EXTENSIONS_H_
#define FORTRAN_RUNTIME_EXTENSIONS_H_
-#define FORTRAN_SUBROUTINE_NAME(name) name##_
+#define FORTRAN_PROCEDURE_NAME(name) name##_
+
+#include <cstdint>
extern "C" {
// CALL FLUSH(n) antedates the Fortran 2003 FLUSH statement.
-void FORTRAN_SUBROUTINE_NAME(flush)(const int &unit);
+void FORTRAN_PROCEDURE_NAME(flush)(const int &unit);
+
+// GNU Fortran 77 compatibility function IARGC.
+std::int32_t FORTRAN_PROCEDURE_NAME(iargc)();
+
+// GNU Fortran 77 compatibility subroutine GETARG(N, ARG).
+void FORTRAN_PROCEDURE_NAME(getarg)(
+ std::int32_t &n, std::int8_t *arg, std::int64_t length);
} // extern "C"
#endif // FORTRAN_RUNTIME_EXTENSIONS_H_
diff --git a/flang/runtime/extensions.cpp b/flang/runtime/extensions.cpp
index 2769c7c584772..b8e9b6eae1320 100644
--- a/flang/runtime/extensions.cpp
+++ b/flang/runtime/extensions.cpp
@@ -10,17 +10,32 @@
// extensions that will eventually be implemented in Fortran.
#include "flang/Runtime/extensions.h"
+#include "flang/Runtime/command.h"
+#include "flang/Runtime/descriptor.h"
#include "flang/Runtime/io-api.h"
extern "C" {
+namespace Fortran::runtime {
+namespace io {
// SUBROUTINE FLUSH(N)
// FLUSH N
// END
-namespace Fortran::runtime::io {
-void FORTRAN_SUBROUTINE_NAME(flush)(const int &unit) {
+void FORTRAN_PROCEDURE_NAME(flush)(const int &unit) {
Cookie cookie{IONAME(BeginFlush)(unit, __FILE__, __LINE__)};
IONAME(EndIoStatement)(cookie);
}
-} // namespace Fortran::runtime::io
+} // namespace io
+
+// RESULT = IARGC()
+std::int32_t FORTRAN_PROCEDURE_NAME(iargc)() { return RTNAME(ArgumentCount)(); }
+
+// CALL GETARG(N, ARG)
+void FORTRAN_PROCEDURE_NAME(getarg)(
+ std::int32_t &n, std::int8_t *arg, std::int64_t length) {
+ Descriptor value{*Descriptor::Create(1, length, arg, 0)};
+ (void)RTNAME(GetCommandArgument)(
+ n, &value, nullptr, nullptr, __FILE__, __LINE__);
+}
+} // namespace Fortran::runtime
} // extern "C"
More information about the flang-commits
mailing list