[PATCH] D150646: [clang][X86] Add __cpuidex function to cpuid.h

Martin Storsjö via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon May 29 23:56:46 PDT 2023


mstorsjo added a comment.

In D150646#4379543 <https://reviews.llvm.org/D150646#4379543>, @glandium wrote:

> There seem to still be two problems with this change, with mingw:
>
> - with `-fms-extensions`:
>
>   echo '#include "cpuid.h"' | ./clang/bin/clang++ --target=x86_64-w64-windows-gnu -xc++ - -fms-extensions
>   In file included from <stdin>:1:
>   /tmp/clang/lib/clang/17/include/cpuid.h:334:22: error: definition of builtin function '__cpuidex'
>   static __inline void __cpuidex (int __cpu_info[4], int __leaf, int __subleaf)
>                        ^
>   1 error generated.

Ouch - this one is tricky, as `-fms-extensions` doesn't seem to set any define (it doesn't set `_MSC_EXTENSIONS` at least - and I don't know if it would unlock surprises all around if it started doing that?); the main noticable difference in the output of `clang -E -dM - < /dev/null` seems to be that `__stdcall` and `__cdecl` and other calling conventions no longer are defines. But that's a rather brittle thing to check against.

> - conflict with mingw headers without the extensions:
>
>   $ echo '#include "intrin.h"' | ./clang/bin/x86_64-w64-mingw32-clang++ -xc++ -
>   In file included from <stdin>:1:
>   In file included from /tmp/clang/lib/clang/17/include/intrin.h:12:
>   In file included from /tmp/clang/bin/../x86_64-w64-mingw32/include/intrin.h:70:
>   /tmp/clang/lib/clang/17/include/cpuid.h:334:22: error: static declaration of '__cpuidex' follows non-static declaration
>   static __inline void __cpuidex (int __cpu_info[4], int __leaf, int __subleaf)
>                        ^
>   /tmp/clang/bin/../x86_64-w64-mingw32/include/psdk_inc/intrin-impl.h:2031:6: note: previous definition is here
>   void __cpuidex(int CPUInfo[4], int function_id, int subfunction_id) {
>        ^
>   1 error generated.
>
> Although, for the latter, this was "fixed" in https://sourceforge.net/p/mingw-w64/mingw-w64/ci/2b6c9247613aa830374e3686e09d3b8d582a92a6/

Regarding "fixed" - do you see any better way of fixing it there? As it's a static inline function, there's no simple way of knowing whether it was already defined or not; I went with the same pattern used for the existing version check for GCC.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150646/new/

https://reviews.llvm.org/D150646



More information about the cfe-commits mailing list