mati865 wrote:

> Defining `_WIN32` in cygwin mode compilations, and including w32api headers 
> from there, feels brittle; I'm not familiar enough with cygwin to know if 
> this is something that one usually can do, or whether it is commonly done, or 
> what caveats that involves (doesn't e.g. cygwin have an incompatible 
> definition of the type `long`?) - so getting rid of that probably is good in 
> itself.

The rule of thumb is to avoid using Win32 APIs unless absolutely necessary, but 
I'm not familiar with the reasons.

> Was this an issue only when building Clang with Clang - did this succeed if 
> building Clang with GCC?

Indeed, it builds fine with GCC.
I think the difference here is Clang being a cross-compiler, has more robust 
headers that cover all targets. GCC can drop bits irrelevant to its target at 
the build time.

If I grep through `/usr` for `_aligned_malloc` there are no matches for GCC and 
Clang guards it based on `_WIN32`:
```
$ grep -R _aligned_malloc /usr -C2
/usr/lib/clang/20/include/mm_malloc.h-  void *__mallocedMemory;
/usr/lib/clang/20/include/mm_malloc.h-#if defined(__MINGW32__)
/usr/lib/clang/20/include/mm_malloc.h:  __mallocedMemory = 
__mingw_aligned_malloc(__size, __align);
/usr/lib/clang/20/include/mm_malloc.h-#elif defined(_WIN32)
/usr/lib/clang/20/include/mm_malloc.h:  __mallocedMemory = 
_aligned_malloc(__size, __align);
/usr/lib/clang/20/include/mm_malloc.h-#else
/usr/lib/clang/20/include/mm_malloc.h-  if (posix_memalign(&__mallocedMemory, 
__align, __size))
--
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/x86_64-pc-msys/bits/c++config.h-/*
 #undef _GLIBCXX_HAVE__ACOSL */
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/x86_64-pc-msys/bits/c++config.h-
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/x86_64-pc-msys/bits/c++config.h:/*
 Define to 1 if you have the `_aligned_malloc' function. */
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/x86_64-pc-msys/bits/c++config.h-/*
 #undef _GLIBCXX_HAVE__ALIGNED_MALLOC */
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/x86_64-pc-msys/bits/c++config.h-
--
/usr/share/aclocal/ax_check_page_aligned_malloc.m4-# 
=================================================================================
/usr/share/aclocal/ax_check_page_aligned_malloc.m4:#  
https://www.gnu.org/software/autoconf-archive/ax_check_page_aligned_malloc.html
/usr/share/aclocal/ax_check_page_aligned_malloc.m4-# 
=================================================================================
/usr/share/aclocal/ax_check_page_aligned_malloc.m4-#
```

GCC has some `_WIN32` checks with special `__CYGWIN__` condition, but I think 
these code paths (except `fs_path.h`) are not that relevant:
```
$ grep -R _WIN32 /usr/lib/gcc
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/bits/fs_path.h:#if 
defined(_WIN32) && !defined(__CYGWIN__)
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/experimental/bits/fs_path.h:#if 
defined(_WIN32) && !defined(__CYGWIN__)
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/experimental/internet:#if 
defined _WIN32 && __has_include(<ws2tcpip.h>)
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/parallel/compatibility.h:#if 
!defined(_WIN32) || defined (__CYGWIN__)
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/parallel/compatibility.h:#if 
defined (_WIN32) && !defined (__CYGWIN__)
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/x86_64-pc-msys/bits/c++config.h:/*
 #undef _GLIBCXX_USE_WIN32_SLEEP */
/usr/lib/gcc/x86_64-pc-msys/13.3.0/include/c++/x86_64-pc-msys/bits/os_defines.h:#define
 _GLIBCXX_THREAD_ATEXIT_WIN32 1
```

It would be possible to apply similar `&& !defined(__CYGWIN__)` here, but I 
don't know how many other places would hit the same problem. While using Win32 
APIs is sometimes necessary, I think defining `_WIN32` is a red flag, although 
I don't have that much experience with Cygwin.

> I presume that the removed codepaths did serve some purpose at some point 
> initially. Can we dig up that purpose from the git history and recheck 
> whether it's needed/relevant still at this point.

It was introduced by 
https://github.com/llvm/llvm-project/commit/aa63fdf3b57ab5701e951b4bf20a9dca3d8da419

I'd expect Cygwin API missing the required bits back then, these days it can 
use the same code as Linux in this file.
@jeremyd2019 pointed that out in: 
https://github.com/llvm/llvm-project/pull/134494#discussion_r2035957416

> While building may be broken right now, the individual issue of missing 
> `_aligned_malloc()` probably is fixable as well, so I'd like to know a bit 
> more about the reasoning for why this cygwin specific codepath should be 
> removed.

There is another error for `_aligned_free` but I didn't include it to shorten 
the message.

https://github.com/llvm/llvm-project/pull/138120
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to