[flang-commits] [flang] Revert "[flang][runtime] Add ACCESS library procedure" (PR #88507)
via flang-commits
flang-commits at lists.llvm.org
Fri Apr 12 05:50:45 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-runtime
Author: Tom Eccles (tblah)
<details>
<summary>Changes</summary>
Reverts llvm/llvm-project#<!-- -->88395
This broke the powerpc buildbot. That build doesn't support using `std::filesystem` in flang unit tests.
---
Full diff: https://github.com/llvm/llvm-project/pull/88507.diff
5 Files Affected:
- (modified) flang/docs/Intrinsics.md (-8)
- (modified) flang/include/flang/Runtime/extensions.h (-7)
- (modified) flang/runtime/extensions.cpp (-73)
- (removed) flang/unittests/Runtime/AccessTest.cpp (-390)
- (modified) flang/unittests/Runtime/CMakeLists.txt (-1)
``````````diff
diff --git a/flang/docs/Intrinsics.md b/flang/docs/Intrinsics.md
index 848619cb65d909..ccb93e104dab65 100644
--- a/flang/docs/Intrinsics.md
+++ b/flang/docs/Intrinsics.md
@@ -657,14 +657,6 @@ CALL CO_REDUCE
CALL CO_SUM
```
-### Inquiry Functions
-ACCESS (GNU extension) is not supported on Windows. Otherwise:
-```
-CHARACTER(LEN=*) :: path = 'path/to/file'
-IF (ACCESS(path, 'rwx')) &
- ...
-```
-
## Non-standard intrinsics
### PGI
```
diff --git a/flang/include/flang/Runtime/extensions.h b/flang/include/flang/Runtime/extensions.h
index fef651f3b2eedb..7d0952206fc195 100644
--- a/flang/include/flang/Runtime/extensions.h
+++ b/flang/include/flang/Runtime/extensions.h
@@ -44,12 +44,5 @@ std::int64_t RTNAME(Signal)(std::int64_t number, void (*handler)(int));
// GNU extension subroutine SLEEP(SECONDS)
void RTNAME(Sleep)(std::int64_t seconds);
-// GNU extension function ACCESS(NAME, MODE)
-// TODO: not supported on Windows
-#ifndef _WIN32
-std::int64_t FORTRAN_PROCEDURE_NAME(access)(const char *name,
- std::int64_t nameLength, const char *mode, std::int64_t modeLength);
-#endif
-
} // extern "C"
#endif // FORTRAN_RUNTIME_EXTENSIONS_H_
diff --git a/flang/runtime/extensions.cpp b/flang/runtime/extensions.cpp
index 12498b502ae1cf..3ac98000335d7d 100644
--- a/flang/runtime/extensions.cpp
+++ b/flang/runtime/extensions.cpp
@@ -17,7 +17,6 @@
#include "flang/Runtime/entry-names.h"
#include "flang/Runtime/io-api.h"
#include <chrono>
-#include <cstring>
#include <ctime>
#include <signal.h>
#include <thread>
@@ -139,77 +138,5 @@ void RTNAME(Sleep)(std::int64_t seconds) {
std::this_thread::sleep_for(std::chrono::seconds(seconds));
}
-// TODO: not supported on Windows
-#ifndef _WIN32
-std::int64_t FORTRAN_PROCEDURE_NAME(access)(const char *name,
- std::int64_t nameLength, const char *mode, std::int64_t modeLength) {
- std::int64_t ret{-1};
- if (nameLength <= 0 || modeLength <= 0 || !name || !mode) {
- return ret;
- }
-
- // ensure name is null terminated
- char *newName{nullptr};
- if (name[nameLength - 1] != '\0') {
- newName = static_cast<char *>(std::malloc(nameLength + 1));
- std::memcpy(newName, name, nameLength);
- newName[nameLength] = '\0';
- name = newName;
- }
-
- // calculate mode
- bool read{false};
- bool write{false};
- bool execute{false};
- bool exists{false};
- int imode{0};
-
- for (std::int64_t i = 0; i < modeLength; ++i) {
- switch (mode[i]) {
- case 'r':
- read = true;
- break;
- case 'w':
- write = true;
- break;
- case 'x':
- execute = true;
- break;
- case ' ':
- exists = true;
- break;
- default:
- // invalid mode
- goto cleanup;
- }
- }
- if (!read && !write && !execute && !exists) {
- // invalid mode
- goto cleanup;
- }
-
- if (!read && !write && !execute) {
- imode = F_OK;
- } else {
- if (read) {
- imode |= R_OK;
- }
- if (write) {
- imode |= W_OK;
- }
- if (execute) {
- imode |= X_OK;
- }
- }
- ret = access(name, imode);
-
-cleanup:
- if (newName) {
- free(newName);
- }
- return ret;
-}
-#endif
-
} // namespace Fortran::runtime
} // extern "C"
diff --git a/flang/unittests/Runtime/AccessTest.cpp b/flang/unittests/Runtime/AccessTest.cpp
deleted file mode 100644
index 5c8a634192d92b..00000000000000
--- a/flang/unittests/Runtime/AccessTest.cpp
+++ /dev/null
@@ -1,390 +0,0 @@
-//===-- flang/unittests/Runtime/AccessTest.cpp ----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-// TODO: ACCESS is not yet implemented on Windows
-#ifndef _WIN32
-
-#include "CrashHandlerFixture.h"
-#include "gtest/gtest.h"
-#include "flang/Runtime/extensions.h"
-
-#include <fcntl.h>
-#include <filesystem>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-namespace {
-
-struct AccessTests : public CrashHandlerFixture {};
-
-struct AccessType {
- bool read{false};
- bool write{false};
- bool execute{false};
- bool exists{false};
-};
-
-} // namespace
-
-static std::string addPIDSuffix(const char *name) {
- std::stringstream ss;
- ss << name;
- ss << '.';
-
- ss << getpid();
-
- return ss.str();
-}
-
-static std::filesystem::path createTemporaryFile(
- const char *name, const AccessType &accessType) {
- std::filesystem::path path{
- std::filesystem::temp_directory_path() / addPIDSuffix(name)};
-
- // O_CREAT | O_EXCL enforces that this file is newly created by this call.
- // This feels risky. If we don't have permission to create files in the
- // temporary directory or if the files already exist, the test will fail.
- // But we can't use std::tmpfile() because we need a path to the file and
- // to control the filesystem permissions
- mode_t mode{0};
- if (accessType.read) {
- mode |= S_IRUSR;
- }
- if (accessType.write) {
- mode |= S_IWUSR;
- }
- if (accessType.execute) {
- mode |= S_IXUSR;
- }
-
- int file = open(path.c_str(), O_CREAT | O_EXCL, mode);
- if (file == -1) {
- return {};
- }
-
- close(file);
-
- return path;
-}
-
-static std::int64_t callAccess(
- const std::filesystem::path &path, const AccessType &accessType) {
- const char *cpath{path.c_str()};
- std::int64_t pathlen = std::strlen(cpath);
-
- std::string mode;
- if (accessType.read) {
- mode += 'r';
- }
- if (accessType.write) {
- mode += 'w';
- }
- if (accessType.execute) {
- mode += 'x';
- }
- if (accessType.exists) {
- mode += ' ';
- }
-
- const char *cmode = mode.c_str();
- std::int64_t modelen = std::strlen(cmode);
-
- return FORTRAN_PROCEDURE_NAME(access)(cpath, pathlen, cmode, modelen);
-}
-
-TEST(AccessTests, TestExists) {
- AccessType accessType;
- accessType.exists = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_EQ(res, 0);
-}
-
-TEST(AccessTests, TestNotExists) {
- std::filesystem::path nonExistant{addPIDSuffix(__func__)};
- ASSERT_FALSE(std::filesystem::exists(nonExistant));
-
- AccessType accessType;
- accessType.exists = true;
- std::int64_t res = callAccess(nonExistant, accessType);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestRead) {
- AccessType accessType;
- accessType.read = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_EQ(res, 0);
-}
-
-TEST(AccessTests, TestNotRead) {
- AccessType accessType;
- accessType.read = false;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestWrite) {
- AccessType accessType;
- accessType.write = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_EQ(res, 0);
-}
-
-TEST(AccessTests, TestNotWrite) {
- AccessType accessType;
- accessType.write = false;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.write = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestReadWrite) {
- AccessType accessType;
- accessType.read = true;
- accessType.write = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_EQ(res, 0);
-}
-
-TEST(AccessTests, TestNotReadWrite0) {
- AccessType accessType;
- accessType.read = false;
- accessType.write = false;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- accessType.write = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestNotReadWrite1) {
- AccessType accessType;
- accessType.read = true;
- accessType.write = false;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- accessType.write = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestNotReadWrite2) {
- AccessType accessType;
- accessType.read = false;
- accessType.write = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- accessType.write = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestExecute) {
- AccessType accessType;
- accessType.execute = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_EQ(res, 0);
-}
-
-TEST(AccessTests, TestNotExecute) {
- AccessType accessType;
- accessType.execute = false;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.execute = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestRWX) {
- AccessType accessType;
- accessType.read = true;
- accessType.write = true;
- accessType.execute = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_EQ(res, 0);
-}
-
-TEST(AccessTests, TestNotRWX0) {
- AccessType accessType;
- accessType.read = false;
- accessType.write = false;
- accessType.execute = false;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- accessType.write = true;
- accessType.execute = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestNotRWX1) {
- AccessType accessType;
- accessType.read = true;
- accessType.write = false;
- accessType.execute = false;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- accessType.write = true;
- accessType.execute = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestNotRWX2) {
- AccessType accessType;
- accessType.read = true;
- accessType.write = true;
- accessType.execute = false;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- accessType.write = true;
- accessType.execute = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestNotRWX3) {
- AccessType accessType;
- accessType.read = true;
- accessType.write = false;
- accessType.execute = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- accessType.write = true;
- accessType.execute = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-TEST(AccessTests, TestNotRWX4) {
- AccessType accessType;
- accessType.read = false;
- accessType.write = true;
- accessType.execute = true;
-
- std::filesystem::path path = createTemporaryFile(__func__, accessType);
- ASSERT_FALSE(path.empty());
-
- accessType.read = true;
- accessType.write = true;
- accessType.execute = true;
- std::int64_t res = callAccess(path, accessType);
-
- std::filesystem::remove(path);
-
- ASSERT_NE(res, 0);
-}
-
-#endif // !_WIN32
diff --git a/flang/unittests/Runtime/CMakeLists.txt b/flang/unittests/Runtime/CMakeLists.txt
index f7caacad3a598f..23f02aa751246b 100644
--- a/flang/unittests/Runtime/CMakeLists.txt
+++ b/flang/unittests/Runtime/CMakeLists.txt
@@ -1,5 +1,4 @@
add_flang_unittest(FlangRuntimeTests
- AccessTest.cpp
Allocatable.cpp
ArrayConstructor.cpp
BufferTest.cpp
``````````
</details>
https://github.com/llvm/llvm-project/pull/88507
More information about the flang-commits
mailing list