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

Martin Storsjö via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Aug 13 13:42:12 PDT 2023


mstorsjo added a comment.

In D150646#4581664 <https://reviews.llvm.org/D150646#4581664>, @rnk wrote:

> I think we should be exposing the `__cpudex` builtin any time we are being MSVC-like, not under `fms-compatibility`. Would that make things sensible again?

I think that might sound reasonable - what do we do for other MSVC-specific builtins today?

In D150646#4581672 <https://reviews.llvm.org/D150646#4581672>, @aidengrossman wrote:

> The main issue here is that there's no way to reliably detect whether the built in is defined (can't check if a function is defined in the preprocessor, preprocessor macro isn't exposed correctly in all configurations), which ends up breaking some configurations.

That's indeed the issue

> I wouldn't be opposed to exposing things more often, but I'm fine with the builtins being exposed under `-fms-extensions`, we just need to expose the preprocessor macro when we expose the builtins.

As far as I can see, @rnk's suggestion is the opposite - to tie whether the builtin is enabled to the target only, not to `-fms-extensions`. I.e. mingw + `-fms-extensions` doesn't get the builtin. Then the preprocessor check for it would simply be `!defined(_MSC_VER)`.

Unfortunately, for Clang tests that invoke `clang -cc1` directly, with an MSVC target triple, don't get `_MSC_VER` defined automatically, only if they pass `-fms-compatibility-version=` (which the Driver usually passes), so in such test conditions, the main way of detecting MSVC right now is `defined(_WIN32) && !defined(__MINGW32__)` which isn't very pretty either.

I played with a patch to make Clang always define `_MSC_VER` for MSVC targets, even if `-fms-compatibility-version=` wasn't set. That broke quite a few tests, since `_MSC_VER` unlocks lots of codepaths that only work when `-fms-extensions` is set (which the Driver usually does for MSVC targets, but usually isn't set in `%clang_cc1` tests). So if we want to default to defining `_MSC_VER` on the cc1 level without an explicit `-fms-compatibility-version=`, we'd also need to imply `-fms-extensions` for MSVC targets, which I guess would go against a lot of the driver/frontend logic split.


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