https://github.com/sarnex updated https://github.com/llvm/llvm-project/pull/121839
>From 997373350540448d91f9884b98cbdc0df058a7a3 Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Mon, 6 Jan 2025 11:48:07 -0800 Subject: [PATCH 1/5] [Clang] __has_builtin should return false for aux triple builtins Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/include/clang/Basic/Builtins.h | 5 +++++ clang/lib/Basic/Builtins.cpp | 19 +++++++++++++++++++ clang/lib/Lex/PPMacroExpansion.cpp | 20 +++++++++++++++++--- clang/test/Preprocessor/builtin_aux_info.cpp | 12 ++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 clang/test/Preprocessor/builtin_aux_info.cpp diff --git a/clang/include/clang/Basic/Builtins.h b/clang/include/clang/Basic/Builtins.h index 63559d977ce6b6..0939f95b0922c1 100644 --- a/clang/include/clang/Basic/Builtins.h +++ b/clang/include/clang/Basic/Builtins.h @@ -74,6 +74,7 @@ struct Info { const char *Features; HeaderDesc Header; LanguageID Langs; + bool operator==(const Info &Other) const; }; /// Holds information about both target-independent and @@ -268,6 +269,10 @@ class Context { /// for AuxTarget). unsigned getAuxBuiltinID(unsigned ID) const { return ID - TSRecords.size(); } + // Return true if the AuxBuiltin ID represents a target-specific builtin that + // is always unsupported on the default target. + bool isAuxBuiltinIDAlwaysUnsupportedOnDefaultTarget(unsigned ID) const; + /// Returns true if this is a libc/libm function without the '__builtin_' /// prefix. static bool isBuiltinFunc(llvm::StringRef Name); diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp index 588183788de322..c6e54b89e848cc 100644 --- a/clang/lib/Basic/Builtins.cpp +++ b/clang/lib/Basic/Builtins.cpp @@ -41,6 +41,14 @@ static constexpr Builtin::Info BuiltinInfo[] = { #include "clang/Basic/Builtins.inc" }; +bool Builtin::Info::operator==(const Builtin::Info &Other) const { + auto StrCompare = [](StringRef A, StringRef B) { return A == B; }; + return Name == Other.Name && StrCompare(Type, Other.Type) && + StrCompare(Attributes, Other.Attributes) && + StrCompare(Features, Other.Features) && Header.ID == Other.Header.ID && + Langs == Other.Langs; +} + const Builtin::Info &Builtin::Context::getRecord(unsigned ID) const { if (ID < Builtin::FirstTSBuiltin) return BuiltinInfo[ID]; @@ -183,6 +191,17 @@ unsigned Builtin::Context::getRequiredVectorWidth(unsigned ID) const { return Width; } +bool Builtin::Context::isAuxBuiltinIDAlwaysUnsupportedOnDefaultTarget( + unsigned ID) const { + assert(isAuxTargetBuiltinID(ID) && "Expected aux target builtin ID"); + const auto &Record = getRecord(ID); + for (const auto &MainTargetBuiltin : TSRecords) + if (Record == MainTargetBuiltin) + return false; + + return true; +} + bool Builtin::Context::isLike(unsigned ID, unsigned &FormatIdx, bool &HasVAListArg, const char *Fmt) const { assert(Fmt && "Not passed a format string"); diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 347c13da0ad215..13d9a0094a5827 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -1804,8 +1804,9 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { diag::err_feature_check_malformed); if (!II) return false; - else if (II->getBuiltinID() != 0) { - switch (II->getBuiltinID()) { + auto BuiltinID = II->getBuiltinID(); + if (BuiltinID != 0) { + switch (BuiltinID) { case Builtin::BI__builtin_cpu_is: return getTargetInfo().supportsCpuIs(); case Builtin::BI__builtin_cpu_init: @@ -1818,8 +1819,21 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { // usual allocation and deallocation functions. Required by libc++ return 201802; default: + // We may get here because of aux builtins which may not be + // supported on the default target, for example if we have an X86 + // specific builtin and the current target is SPIR-V. Sometimes we + // rely on __has_builtin returning true when passed a builtin that + // is not supported on the default target due to LangOpts but is + // supported on the aux target. See + // test/Headers/__cpuidex_conflict.c for an example. If the builtin + // is an aux builtin and it can never be supported on the default + // target, __has_builtin should return false. + if (getBuiltinInfo().isAuxBuiltinID(BuiltinID) && + getBuiltinInfo().isAuxBuiltinIDAlwaysUnsupportedOnDefaultTarget( + BuiltinID)) + return false; return Builtin::evaluateRequiredTargetFeatures( - getBuiltinInfo().getRequiredFeatures(II->getBuiltinID()), + getBuiltinInfo().getRequiredFeatures(BuiltinID), getTargetInfo().getTargetOpts().FeatureMap); } return true; diff --git a/clang/test/Preprocessor/builtin_aux_info.cpp b/clang/test/Preprocessor/builtin_aux_info.cpp new file mode 100644 index 00000000000000..041c7edfdcadac --- /dev/null +++ b/clang/test/Preprocessor/builtin_aux_info.cpp @@ -0,0 +1,12 @@ +// REQUIRES: spirv-registered-target +// REQUIRES: x86-registered-target + +// RUN: %clang_cc1 -fopenmp -triple=spirv64 -fopenmp-is-target-device \ +// RUN: -aux-triple x86_64-linux-unknown -E %s | FileCheck -implicit-check-not=BAD %s + +// CHECK: GOOD +#if __has_builtin(__builtin_ia32_pause) + BAD +#else + GOOD +#endif >From 55c6d061fc7dc4a011df92b99f99f064e7704b11 Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Tue, 7 Jan 2025 01:22:00 -0800 Subject: [PATCH 2/5] Fix build Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/lib/Basic/Builtins.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp index c6e54b89e848cc..bd443b3b371e35 100644 --- a/clang/lib/Basic/Builtins.cpp +++ b/clang/lib/Basic/Builtins.cpp @@ -193,7 +193,7 @@ unsigned Builtin::Context::getRequiredVectorWidth(unsigned ID) const { bool Builtin::Context::isAuxBuiltinIDAlwaysUnsupportedOnDefaultTarget( unsigned ID) const { - assert(isAuxTargetBuiltinID(ID) && "Expected aux target builtin ID"); + assert(isAuxBuiltinID(ID) && "Expected aux target builtin ID"); const auto &Record = getRecord(ID); for (const auto &MainTargetBuiltin : TSRecords) if (Record == MainTargetBuiltin) >From 3ce51118035f1f84ad02898858c95021ff6420d9 Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Wed, 8 Jan 2025 10:11:58 -0800 Subject: [PATCH 3/5] address lit test feedback Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/test/Preprocessor/builtin_aux_info.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/clang/test/Preprocessor/builtin_aux_info.cpp b/clang/test/Preprocessor/builtin_aux_info.cpp index 041c7edfdcadac..60c8c6c492479a 100644 --- a/clang/test/Preprocessor/builtin_aux_info.cpp +++ b/clang/test/Preprocessor/builtin_aux_info.cpp @@ -1,9 +1,15 @@ -// REQUIRES: spirv-registered-target -// REQUIRES: x86-registered-target - // RUN: %clang_cc1 -fopenmp -triple=spirv64 -fopenmp-is-target-device \ // RUN: -aux-triple x86_64-linux-unknown -E %s | FileCheck -implicit-check-not=BAD %s +// RUN: %clang_cc1 -fopenmp -triple=nvptx64 -fopenmp-is-target-device \ +// RUN: -aux-triple x86_64-linux-unknown -E %s | FileCheck -implicit-check-not=BAD %s + +// RUN: %clang_cc1 -fopenmp -triple=amdgcn-amd-amdhsa -fopenmp-is-target-device \ +// RUN: -aux-triple x86_64-linux-unknown -E %s | FileCheck -implicit-check-not=BAD %s + +// RUN: %clang_cc1 -fopenmp -triple=aarch64 -fopenmp-is-target-device \ +// RUN: -aux-triple x86_64-linux-unknown -E %s | FileCheck -implicit-check-not=BAD %s + // CHECK: GOOD #if __has_builtin(__builtin_ia32_pause) BAD >From 69198cae48030e87d0f1e46087f9866d432e678f Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Wed, 22 Jan 2025 12:59:22 -0800 Subject: [PATCH 4/5] check only for aux builtins, expect fail in failing test Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/include/clang/Basic/Builtins.h | 5 ----- clang/lib/Basic/Builtins.cpp | 19 ------------------- clang/lib/Lex/PPMacroExpansion.cpp | 14 ++------------ clang/test/Headers/__cpuidex_conflict.c | 5 ++++- 4 files changed, 6 insertions(+), 37 deletions(-) diff --git a/clang/include/clang/Basic/Builtins.h b/clang/include/clang/Basic/Builtins.h index 0939f95b0922c1..63559d977ce6b6 100644 --- a/clang/include/clang/Basic/Builtins.h +++ b/clang/include/clang/Basic/Builtins.h @@ -74,7 +74,6 @@ struct Info { const char *Features; HeaderDesc Header; LanguageID Langs; - bool operator==(const Info &Other) const; }; /// Holds information about both target-independent and @@ -269,10 +268,6 @@ class Context { /// for AuxTarget). unsigned getAuxBuiltinID(unsigned ID) const { return ID - TSRecords.size(); } - // Return true if the AuxBuiltin ID represents a target-specific builtin that - // is always unsupported on the default target. - bool isAuxBuiltinIDAlwaysUnsupportedOnDefaultTarget(unsigned ID) const; - /// Returns true if this is a libc/libm function without the '__builtin_' /// prefix. static bool isBuiltinFunc(llvm::StringRef Name); diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp index bd443b3b371e35..588183788de322 100644 --- a/clang/lib/Basic/Builtins.cpp +++ b/clang/lib/Basic/Builtins.cpp @@ -41,14 +41,6 @@ static constexpr Builtin::Info BuiltinInfo[] = { #include "clang/Basic/Builtins.inc" }; -bool Builtin::Info::operator==(const Builtin::Info &Other) const { - auto StrCompare = [](StringRef A, StringRef B) { return A == B; }; - return Name == Other.Name && StrCompare(Type, Other.Type) && - StrCompare(Attributes, Other.Attributes) && - StrCompare(Features, Other.Features) && Header.ID == Other.Header.ID && - Langs == Other.Langs; -} - const Builtin::Info &Builtin::Context::getRecord(unsigned ID) const { if (ID < Builtin::FirstTSBuiltin) return BuiltinInfo[ID]; @@ -191,17 +183,6 @@ unsigned Builtin::Context::getRequiredVectorWidth(unsigned ID) const { return Width; } -bool Builtin::Context::isAuxBuiltinIDAlwaysUnsupportedOnDefaultTarget( - unsigned ID) const { - assert(isAuxBuiltinID(ID) && "Expected aux target builtin ID"); - const auto &Record = getRecord(ID); - for (const auto &MainTargetBuiltin : TSRecords) - if (Record == MainTargetBuiltin) - return false; - - return true; -} - bool Builtin::Context::isLike(unsigned ID, unsigned &FormatIdx, bool &HasVAListArg, const char *Fmt) const { assert(Fmt && "Not passed a format string"); diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 13d9a0094a5827..9cf29668f251fc 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -1819,18 +1819,8 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { // usual allocation and deallocation functions. Required by libc++ return 201802; default: - // We may get here because of aux builtins which may not be - // supported on the default target, for example if we have an X86 - // specific builtin and the current target is SPIR-V. Sometimes we - // rely on __has_builtin returning true when passed a builtin that - // is not supported on the default target due to LangOpts but is - // supported on the aux target. See - // test/Headers/__cpuidex_conflict.c for an example. If the builtin - // is an aux builtin and it can never be supported on the default - // target, __has_builtin should return false. - if (getBuiltinInfo().isAuxBuiltinID(BuiltinID) && - getBuiltinInfo().isAuxBuiltinIDAlwaysUnsupportedOnDefaultTarget( - BuiltinID)) + // __has_builtin should return false for aux builtins. + if (getBuiltinInfo().isAuxBuiltinID(BuiltinID)) return false; return Builtin::evaluateRequiredTargetFeatures( getBuiltinInfo().getRequiredFeatures(BuiltinID), diff --git a/clang/test/Headers/__cpuidex_conflict.c b/clang/test/Headers/__cpuidex_conflict.c index 8687a6aa2f897a..96e8f61cfdbb80 100644 --- a/clang/test/Headers/__cpuidex_conflict.c +++ b/clang/test/Headers/__cpuidex_conflict.c @@ -3,7 +3,10 @@ // RUN: %clang_cc1 %s -ffreestanding -fms-extensions -fms-compatibility \ // RUN: -fms-compatibility-version=19.00 -triple x86_64-pc-windows-msvc -emit-llvm -o - // %clang_cc1 %s -ffreestanding -triple x86_64-w64-windows-gnu -fms-extensions -emit-llvm -o - -// RUN: %clang_cc1 %s -ffreestanding -fopenmp -fopenmp-is-target-device -aux-triple x86_64-unknown-linux-gnu +// +// TODO(boomanaiden154) +// See https://github.com/llvm/llvm-project/pull/121839 +// RUN: not %clang_cc1 %s -ffreestanding -fopenmp -fopenmp-is-target-device -aux-triple x86_64-unknown-linux-gnu typedef __SIZE_TYPE__ size_t; >From 0ee8d8cd4b3d61fc6cf6e740a54dd5a23c921048 Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Thu, 23 Jan 2025 08:15:49 -0800 Subject: [PATCH 5/5] update comment Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/test/Headers/__cpuidex_conflict.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/test/Headers/__cpuidex_conflict.c b/clang/test/Headers/__cpuidex_conflict.c index 96e8f61cfdbb80..0f5e6e5e0a0ff4 100644 --- a/clang/test/Headers/__cpuidex_conflict.c +++ b/clang/test/Headers/__cpuidex_conflict.c @@ -4,8 +4,7 @@ // RUN: -fms-compatibility-version=19.00 -triple x86_64-pc-windows-msvc -emit-llvm -o - // %clang_cc1 %s -ffreestanding -triple x86_64-w64-windows-gnu -fms-extensions -emit-llvm -o - // -// TODO(boomanaiden154) -// See https://github.com/llvm/llvm-project/pull/121839 +// FIXME: See https://github.com/llvm/llvm-project/pull/121839 // RUN: not %clang_cc1 %s -ffreestanding -fopenmp -fopenmp-is-target-device -aux-triple x86_64-unknown-linux-gnu typedef __SIZE_TYPE__ size_t; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits