llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-support @llvm/pr-subscribers-clang Author: Luca Versari (veluca93) <details> <summary>Changes</summary> This PR modifies the LLVM source code to compile (and run) in a WASI environment. The question of whether having WASI support in LLVM is one that doesn't have a clear answer for me (although of course I can see some use cases), but since the patch ended up being small enough I figured I'd create a PR and see what the LLVM community would make of it :-) The code compiles & runs successfully when compiled with an unmodified wasi-libc (I only tested running clang++ and wasm-ld). Caveats: - a bunch of things are not supported. Most importantly, executing binaries is not supported, but also memory mapping, signals, dynamic linking, set/longjump, and JIT. - There are no tests. I also would not know how to go about adding tests. - Some projects are disabled on WASI. --- Patch is 35.82 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/91051.diff 19 Files Affected: - (modified) clang/CMakeLists.txt (+1-1) - (modified) clang/lib/Driver/Driver.cpp (+1-1) - (modified) libcxxabi/src/CMakeLists.txt (+2-2) - (modified) llvm/cmake/modules/HandleLLVMOptions.cmake (+4) - (modified) llvm/include/llvm/ADT/bit.h (+2-2) - (modified) llvm/include/llvm/Support/Memory.h (+2) - (modified) llvm/lib/CMakeLists.txt (+2) - (modified) llvm/lib/Support/CrashRecoveryContext.cpp (+30-18) - (modified) llvm/lib/Support/LockFileManager.cpp (+11-8) - (modified) llvm/lib/Support/Unix/Memory.inc (+20) - (modified) llvm/lib/Support/Unix/Path.inc (+41-3) - (modified) llvm/lib/Support/Unix/Process.inc (+14-1) - (modified) llvm/lib/Support/Unix/Program.inc (+16-1) - (modified) llvm/lib/Support/Unix/Signals.inc (+14) - (modified) llvm/lib/Support/Unix/Unix.h (+9-6) - (modified) llvm/lib/Support/Unix/Watchdog.inc (+2-2) - (modified) llvm/lib/Support/raw_socket_stream.cpp (+22-2) - (modified) llvm/lib/Transforms/CMakeLists.txt (+2) - (modified) llvm/tools/CMakeLists.txt (+4) ``````````diff diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 2ac0bccb42f50..e1da8297ddd5f 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -426,7 +426,7 @@ CMAKE_DEPENDENT_OPTION(CLANG_PLUGIN_SUPPORT # If libstdc++ is statically linked, clang-repl needs to statically link libstdc++ # itself, which is not possible in many platforms because of current limitations in # JIT stack. (more platforms need to be supported by JITLink) -if(NOT LLVM_STATIC_LINK_CXX_STDLIB) +if(NOT LLVM_STATIC_LINK_CXX_STDLIB AND NOT WASI) set(HAVE_CLANG_REPL_SUPPORT ON) endif() diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index f5ea73a04ae5c..4f117a1d3a5ca 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1577,7 +1577,7 @@ bool Driver::getCrashDiagnosticFile(StringRef ReproCrashFilename, CrashDiagDir = "/"; path::append(CrashDiagDir, "Library/Logs/DiagnosticReports"); int PID = -#if LLVM_ON_UNIX +#if LLVM_ON_UNIX && !defined(__wasi__) getpid(); #else 0; diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt index c54ced4dc3ea8..f96d23b3c0315 100644 --- a/libcxxabi/src/CMakeLists.txt +++ b/libcxxabi/src/CMakeLists.txt @@ -36,8 +36,8 @@ else() ) endif() -if (LIBCXXABI_ENABLE_THREADS AND (UNIX OR FUCHSIA) AND NOT (APPLE OR CYGWIN) - AND NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX")) +if (LIBCXXABI_ENABLE_THREADS AND (UNIX OR FUCHSIA OR WASI) AND NOT + (APPLE OR CYGWIN) AND NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX")) list(APPEND LIBCXXABI_SOURCES cxa_thread_atexit.cpp ) diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 5ca580fbb59c5..11cc1af78b9ba 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -217,6 +217,10 @@ elseif(FUCHSIA OR UNIX) else() set(LLVM_HAVE_LINK_VERSION_SCRIPT 1) endif() +elseif(WASI) + set(LLVM_ON_WIN32 0) + set(LLVM_ON_UNIX 1) + set(LLVM_HAVE_LINK_VERSION_SCRIPT 0) elseif(CMAKE_SYSTEM_NAME STREQUAL "Generic") set(LLVM_ON_WIN32 0) set(LLVM_ON_UNIX 0) diff --git a/llvm/include/llvm/ADT/bit.h b/llvm/include/llvm/ADT/bit.h index c42b5e686bdc9..8dcf6a8bfbb0a 100644 --- a/llvm/include/llvm/ADT/bit.h +++ b/llvm/include/llvm/ADT/bit.h @@ -24,12 +24,12 @@ #endif #if defined(_MSC_VER) && !defined(_DEBUG) -#include <cstdlib> // for _byteswap_{ushort,ulong,uint64} +#include <cstdlib> // for _byteswap_{ushort,ulong,uint64} #endif #if defined(__linux__) || defined(__GNU__) || defined(__HAIKU__) || \ defined(__Fuchsia__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__) || \ - defined(__OpenBSD__) || defined(__DragonFly__) + defined(__OpenBSD__) || defined(__DragonFly__) || defined(__wasi__) #include <endian.h> #elif defined(_AIX) #include <sys/machine.h> diff --git a/llvm/include/llvm/Support/Memory.h b/llvm/include/llvm/Support/Memory.h index d7d60371d315f..2d61f6da225b6 100644 --- a/llvm/include/llvm/Support/Memory.h +++ b/llvm/include/llvm/Support/Memory.h @@ -41,7 +41,9 @@ namespace sys { private: void *Address; ///< Address of first byte of memory area size_t AllocatedSize; ///< Size, in bytes of the memory area +#ifndef __wasi__ unsigned Flags = 0; +#endif friend class Memory; }; diff --git a/llvm/lib/CMakeLists.txt b/llvm/lib/CMakeLists.txt index 74e2d03c07953..b32411ae0b860 100644 --- a/llvm/lib/CMakeLists.txt +++ b/llvm/lib/CMakeLists.txt @@ -31,7 +31,9 @@ add_subdirectory(Remarks) add_subdirectory(Debuginfod) add_subdirectory(DebugInfo) add_subdirectory(DWP) +if (NOT WASI) add_subdirectory(ExecutionEngine) +endif () add_subdirectory(Target) add_subdirectory(AsmParser) add_subdirectory(LineEditor) diff --git a/llvm/lib/Support/CrashRecoveryContext.cpp b/llvm/lib/Support/CrashRecoveryContext.cpp index f53aea177d612..858ec64b7d53c 100644 --- a/llvm/lib/Support/CrashRecoveryContext.cpp +++ b/llvm/lib/Support/CrashRecoveryContext.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/CrashRecoveryContext.h" + #include "llvm/Config/llvm-config.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ExitCodes.h" @@ -14,7 +15,9 @@ #include "llvm/Support/thread.h" #include <cassert> #include <mutex> +#ifndef __wasi__ #include <setjmp.h> +#endif using namespace llvm; @@ -31,7 +34,9 @@ struct CrashRecoveryContextImpl { const CrashRecoveryContextImpl *Next; CrashRecoveryContext *CRC; +#ifndef __wasi__ ::jmp_buf JumpBuffer; +#endif volatile unsigned Failed : 1; unsigned SwitchedThread : 1; unsigned ValidJumpBuffer : 1; @@ -72,9 +77,11 @@ struct CrashRecoveryContextImpl { CRC->RetCode = RetCode; +#ifndef __wasi__ // Jump back to the RunSafely we were called under. if (ValidJumpBuffer) longjmp(JumpBuffer, 1); +#endif // Otherwise let the caller decide of the outcome of the crash. Currently // this occurs when using SEH on Windows with MSVC or clang-cl. @@ -118,7 +125,7 @@ CrashRecoveryContext::~CrashRecoveryContext() { } IsRecoveringFromCrash = PC; - CrashRecoveryContextImpl *CRCI = (CrashRecoveryContextImpl *) Impl; + CrashRecoveryContextImpl *CRCI = (CrashRecoveryContextImpl *)Impl; delete CRCI; } @@ -154,8 +161,8 @@ void CrashRecoveryContext::Disable() { uninstallExceptionOrSignalHandlers(); } -void CrashRecoveryContext::registerCleanup(CrashRecoveryContextCleanup *cleanup) -{ +void CrashRecoveryContext::registerCleanup( + CrashRecoveryContextCleanup *cleanup) { if (!cleanup) return; if (head) @@ -164,16 +171,15 @@ void CrashRecoveryContext::registerCleanup(CrashRecoveryContextCleanup *cleanup) head = cleanup; } -void -CrashRecoveryContext::unregisterCleanup(CrashRecoveryContextCleanup *cleanup) { +void CrashRecoveryContext::unregisterCleanup( + CrashRecoveryContextCleanup *cleanup) { if (!cleanup) return; if (cleanup == head) { head = cleanup->next; if (head) head->prev = nullptr; - } - else { + } else { cleanup->prev->next = cleanup->next; if (cleanup->next) cleanup->next->prev = cleanup->prev; @@ -263,16 +269,14 @@ bool CrashRecoveryContext::RunSafely(function_ref<void()> Fn) { #include "llvm/Support/Windows/WindowsSupport.h" -static LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) -{ +static LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) { // DBG_PRINTEXCEPTION_WIDE_C is not properly defined on all supported // compilers and platforms, so we define it manually. constexpr ULONG DbgPrintExceptionWideC = 0x4001000AL; - switch (ExceptionInfo->ExceptionRecord->ExceptionCode) - { + switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case DBG_PRINTEXCEPTION_C: case DbgPrintExceptionWideC: - case 0x406D1388: // set debugger thread name + case 0x406D1388: // set debugger thread name return EXCEPTION_CONTINUE_EXECUTION; } @@ -307,7 +311,7 @@ static LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) // CrashRecoveryContext at all. So we make use of a thread-local // exception table. The handles contained in here will either be // non-NULL, valid VEH handles, or NULL. -static LLVM_THREAD_LOCAL const void* sCurrentExceptionHandle; +static LLVM_THREAD_LOCAL const void *sCurrentExceptionHandle; static void installExceptionOrSignalHandlers() { // We can set up vectored exception handling now. We will install our @@ -342,10 +346,11 @@ static void uninstallExceptionOrSignalHandlers() { // reliable fashion -- if we get a signal outside of a crash recovery context we // simply disable crash recovery and raise the signal again. +#ifndef __wasi__ #include <signal.h> -static const int Signals[] = - { SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGSEGV, SIGTRAP }; +static const int Signals[] = {SIGABRT, SIGBUS, SIGFPE, + SIGILL, SIGSEGV, SIGTRAP}; static const unsigned NumSignals = std::size(Signals); static struct sigaction PrevActions[NumSignals]; @@ -389,8 +394,10 @@ static void CrashRecoverySignalHandler(int Signal) { if (CRCI) const_cast<CrashRecoveryContextImpl *>(CRCI)->HandleCrash(RetCode, Signal); } +#endif static void installExceptionOrSignalHandlers() { +#ifndef __wasi__ // Setup the signal handler. struct sigaction Handler; Handler.sa_handler = CrashRecoverySignalHandler; @@ -400,12 +407,15 @@ static void installExceptionOrSignalHandlers() { for (unsigned i = 0; i != NumSignals; ++i) { sigaction(Signals[i], &Handler, &PrevActions[i]); } +#endif } static void uninstallExceptionOrSignalHandlers() { +#ifndef __wasi__ // Restore the previous signal handlers. for (unsigned i = 0; i != NumSignals; ++i) sigaction(Signals[i], &PrevActions[i], nullptr); +#endif } #endif // !_WIN32 @@ -418,9 +428,11 @@ bool CrashRecoveryContext::RunSafely(function_ref<void()> Fn) { Impl = CRCI; CRCI->ValidJumpBuffer = true; +#ifndef __wasi__ if (setjmp(CRCI->JumpBuffer) != 0) { return false; } +#endif } Fn(); @@ -469,7 +481,7 @@ bool CrashRecoveryContext::throwIfCrash(int RetCode) { return false; #if defined(_WIN32) ::RaiseException(RetCode, 0, 0, NULL); -#else +#elif !defined(__wasi__) llvm::sys::unregisterHandlers(); raise(RetCode - 128); #endif @@ -502,7 +514,7 @@ struct RunSafelyOnThreadInfo { static void RunSafelyOnThread_Dispatch(void *UserData) { RunSafelyOnThreadInfo *Info = - reinterpret_cast<RunSafelyOnThreadInfo*>(UserData); + reinterpret_cast<RunSafelyOnThreadInfo *>(UserData); if (Info->UseBackgroundPriority) setThreadBackgroundPriority(); @@ -512,7 +524,7 @@ static void RunSafelyOnThread_Dispatch(void *UserData) { bool CrashRecoveryContext::RunSafelyOnThread(function_ref<void()> Fn, unsigned RequestedStackSize) { bool UseBackgroundPriority = hasThreadBackgroundPriority(); - RunSafelyOnThreadInfo Info = { Fn, this, UseBackgroundPriority, false }; + RunSafelyOnThreadInfo Info = {Fn, this, UseBackgroundPriority, false}; llvm::thread Thread(RequestedStackSize == 0 ? std::nullopt : std::optional<unsigned>(RequestedStackSize), diff --git a/llvm/lib/Support/LockFileManager.cpp b/llvm/lib/Support/LockFileManager.cpp index 3169aa25ec0d9..06b778a1d9dc7 100644 --- a/llvm/lib/Support/LockFileManager.cpp +++ b/llvm/lib/Support/LockFileManager.cpp @@ -34,7 +34,9 @@ #include <unistd.h> #endif -#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1050) +#if defined(__APPLE__) && \ + defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \ + (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1050) #define USE_OSX_GETHOSTUUID 1 #else #define USE_OSX_GETHOSTUUID 0 @@ -94,7 +96,7 @@ static std::error_code getHostID(SmallVectorImpl<char> &HostID) { StringRef UUIDRef(UUIDStr); HostID.append(UUIDRef.begin(), UUIDRef.end()); -#elif LLVM_ON_UNIX +#elif LLVM_ON_UNIX && !defined(__wasi__) char HostName[256]; HostName[255] = 0; HostName[0] = 0; @@ -116,9 +118,11 @@ bool LockFileManager::processStillExecuting(StringRef HostID, int PID) { if (getHostID(StoredHostID)) return true; // Conservatively assume it's executing on error. - // Check whether the process is dead. If so, we're done. + // Check whether the process is dead. If so, we're done. +#ifndef __wasi__ // no other processes anyway if (StoredHostID == HostID && getsid(PID) == -1 && errno == ESRCH) return false; +#endif #endif return true; @@ -136,9 +140,10 @@ namespace { class RemoveUniqueLockFileOnSignal { StringRef Filename; bool RemoveImmediately; + public: RemoveUniqueLockFileOnSignal(StringRef Name) - : Filename(Name), RemoveImmediately(true) { + : Filename(Name), RemoveImmediately(true) { sys::RemoveFileOnSignal(Filename, nullptr); } @@ -157,8 +162,7 @@ class RemoveUniqueLockFileOnSignal { } // end anonymous namespace -LockFileManager::LockFileManager(StringRef FileName) -{ +LockFileManager::LockFileManager(StringRef FileName) { this->FileName = FileName; if (std::error_code EC = sys::fs::make_absolute(this->FileName)) { std::string S("failed to obtain absolute path for "); @@ -217,8 +221,7 @@ LockFileManager::LockFileManager(StringRef FileName) while (true) { // Create a link from the lock file name. If this succeeds, we're done. - std::error_code EC = - sys::fs::create_link(UniqueLockFileName, LockFileName); + std::error_code EC = sys::fs::create_link(UniqueLockFileName, LockFileName); if (!EC) { RemoveUniqueFile.lockAcquired(); return; diff --git a/llvm/lib/Support/Unix/Memory.inc b/llvm/lib/Support/Unix/Memory.inc index bac208a7d543c..4172886e66f82 100644 --- a/llvm/lib/Support/Unix/Memory.inc +++ b/llvm/lib/Support/Unix/Memory.inc @@ -36,6 +36,7 @@ extern "C" void sys_icache_invalidate(const void *Addr, size_t len); extern "C" void __clear_cache(void *, void *); #endif +#ifndef __wasi__ static int getPosixProtectionFlags(unsigned Flags) { switch (Flags & llvm::sys::Memory::MF_RWE_MASK) { case llvm::sys::Memory::MF_READ: @@ -66,6 +67,7 @@ static int getPosixProtectionFlags(unsigned Flags) { // Provide a default return value as required by some compilers. return PROT_NONE; } +#endif namespace llvm { namespace sys { @@ -77,6 +79,17 @@ MemoryBlock Memory::allocateMappedMemory(size_t NumBytes, if (NumBytes == 0) return MemoryBlock(); +#ifdef __wasi__ + MemoryBlock Result; + Result.Address = malloc(NumBytes); + if (!Result.Address) { + EC = errnoAsErrorCode(); + Result.AllocatedSize = 0; + } else { + Result.AllocatedSize = NumBytes; + } + return Result; +#else // On platforms that have it, we can use MAP_ANON to get a memory-mapped // page without file backing, but we need a fallback of opening /dev/zero // for strictly POSIX platforms instead. @@ -146,14 +159,19 @@ MemoryBlock Memory::allocateMappedMemory(size_t NumBytes, } return Result; +#endif } std::error_code Memory::releaseMappedMemory(MemoryBlock &M) { +#ifdef __wasi__ + free(M.Address); +#else if (M.Address == nullptr || M.AllocatedSize == 0) return std::error_code(); if (0 != ::munmap(M.Address, M.AllocatedSize)) return errnoAsErrorCode(); +#endif M.Address = nullptr; M.AllocatedSize = 0; @@ -163,6 +181,7 @@ std::error_code Memory::releaseMappedMemory(MemoryBlock &M) { std::error_code Memory::protectMappedMemory(const MemoryBlock &M, unsigned Flags) { +#ifndef __wasi__ static const Align PageSize = Align(Process::getPageSizeEstimate()); if (M.Address == nullptr || M.AllocatedSize == 0) return std::error_code(); @@ -200,6 +219,7 @@ std::error_code Memory::protectMappedMemory(const MemoryBlock &M, if (InvalidateCache) Memory::InvalidateInstructionCache(M.Address, M.AllocatedSize); +#endif return std::error_code(); } diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc index 6e679f74869f0..32d4b9e66682f 100644 --- a/llvm/lib/Support/Unix/Path.inc +++ b/llvm/lib/Support/Unix/Path.inc @@ -32,7 +32,9 @@ #endif #include <dirent.h> +#ifndef __wasi__ #include <pwd.h> +#endif #include <sys/file.h> #ifdef __APPLE__ @@ -191,7 +193,9 @@ static char *getprogpath(char ret[PATH_MAX], const char *bin) { /// GetMainExecutable - Return the path to the main executable, given the /// value of argv[0] from program startup. std::string getMainExecutable(const char *argv0, void *MainAddr) { -#if defined(__APPLE__) +#if defined(__wasi__) + return argv0; +#elif defined(__APPLE__) // On OS X the executable path is saved to the stack by dyld. Reading it // from there is much faster than calling dladdr, especially for large // binaries with symbols. @@ -505,7 +509,7 @@ static bool is_local_impl(struct STATVFS &Vfs) { #elif defined(__Fuchsia__) // Fuchsia doesn't yet support remote filesystem mounts. return true; -#elif defined(__EMSCRIPTEN__) +#elif defined(__EMSCRIPTEN__) || defined(__wasi__) // Emscripten doesn't currently support remote filesystem mounts. return true; #elif defined(__HAIKU__) @@ -651,6 +655,7 @@ std::error_code equivalent(const Twine &A, const Twine &B, bool &result) { } static void expandTildeExpr(SmallVectorImpl<char> &Path) { +#ifndef __wasi__ StringRef PathStr(Path.begin(), Path.size()); if (PathStr.empty() || !PathStr.starts_with("~")) return; @@ -694,6 +699,7 @@ static void expandTildeExpr(SmallVectorImpl<char> &Path) { Path.clear(); Path.append(Entry->pw_dir, Entry->pw_dir + strlen(Entry->pw_dir)); llvm::sys::path::append(Path, Storage); +#endif } void expand_tilde(const Twine &path, SmallVectorImpl<char> &dest) { @@ -770,11 +776,15 @@ std::error_code status(int FD, file_status &Result) { } unsigned getUmask() { +#ifdef __wasi__ + return 0644; +#else // Chose arbitary new mask and reset the umask to the old mask. // umask(2) never fails so ignore the return of the second call. unsigned Mask = ::umask(0); (void)::umask(Mask); return Mask; +#endif } std::error_code setPermissions(const Twine &Path, perms Permissions) { @@ -829,6 +839,9 @@ std::error_code setLastAccessAndModificationTime(int FD, TimePoint<> AccessTime, std::error_code mapped_file_region::init(int FD, uint64_t Offset, mapmode Mode) { +#ifdef __wasi__ + return std::error_code(ENOTSUP, std::generic_category()); +#else assert(Size != 0); int flags = (Mode == readwrite) ? MAP_SHARED : MAP_PRIVATE; @@ -860,6 +873,7 @@ std::error_code mapped_file_region::init(int FD, uint64_t Offset, if (Mapping == MAP_FAILED) return errnoAsErrorCode(); return std::error_code(); +#endif } mapped_file_region::mapped_file_region(int fd, mapmode mode, size_t length, @@ -872,11 +886,14 @@ mapped_file_region::mapped_file_region(int fd, mapmode mode, size_t length, } void mapped_file_region::unmapImpl() { +#ifndef __wasi__ if (Mapping) ::munmap(Mapping, Size); +#endif } void mapped_file_region::dontNeedImpl() { +#ifndef __wasi__ assert(Mode == mapped_file_region::readonly); if (!Mapping) return; @@ -887,6 +904,7 @@ void mapped_file_region::dontNeedImpl() { #else ::madvise(Mapping, Size, MADV_DONTNEED); #endif +#endif } int mapped_file_region::alignment() { return Process::getPageSizeEstimate(); } @@ -920,7 +938,7 @@ static file_type direntType(dirent *Entry) { // Note that while glibc provides a macro to see if this is supported, // _DIRENT_HAVE_D_TYPE, it's not defined on BSD/Mac, so we test for the // d_type-to-mode_t conversion macro instead. -#if defined(DTTOIF) +#if defined(DTTOIF) && !defined(__wasi__) return typeForMode(DTTOIF(Entry->d_type)); #else // Other platforms such as Solaris require a stat() to get the type. @@ -1224,6 +1242,9 @@ Expected<size_t> readNativeFileSlice(file_t FD, MutableArrayRef<char> Buf, } std::error_code tryLockFile(int FD, std::chrono::milliseconds Timeout) { +#if defined(__wasi__) + return std::error_code(); +#else auto Start = std::chrono::steady_clock::now(); auto End = Start + Timeout; do { @@ -1241,9 +1262,13 @@ std::error_code tryLockFile(int FD, std::chrono::milliseconds Timeout) { usleep(1000); } while (std::chrono::steady_clock::now() < End); return make_error_code(errc::no_lock_available); +#endif } std::error_code lockFile(int FD) { +#if defined(__wasi__) + return std::error_code(); +#else struct flock Lock; memset(&Lock, 0, sizeof(Lock)); Lock.l_type = F_WRLCK; @@ -1253,9 +1278,13 @@ std::error_code lockFile(int FD) { if (::fcntl(FD, F_SETLKW, &Lock) != -1) return std::error_code(); return errnoAsErrorCode(); +#endif } std::error_code unlockFile(int FD) { +#if defined(__wasi__) + return std::error_code(); +#else struct flock Lock; Lock.l_type = F_UNLCK; Lock.l_whence = SEEK_SET; @@ -1264,6 +1293,7 @@ std::error_code unlockFile(int FD) { if (::fcntl(FD, F_SETLK, ... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/91051 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits