aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/Builtins.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-02-11 12:38:04 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-02-11 12:38:11 +0000
commite3b557809604d036af6e00c60f012c2025b59a5e (patch)
tree8a11ba2269a3b669601e2fd41145b174008f4da8 /clang/lib/Basic/Builtins.cpp
parent08e8dd7b9db7bb4a9de26d44c1cbfd24e869c014 (diff)
Diffstat (limited to 'clang/lib/Basic/Builtins.cpp')
-rw-r--r--clang/lib/Basic/Builtins.cpp95
1 files changed, 61 insertions, 34 deletions
diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index b42e8f416cfc..74081a7c2ec6 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -18,14 +18,26 @@
#include "llvm/ADT/StringRef.h"
using namespace clang;
-static const Builtin::Info BuiltinInfo[] = {
- { "not a builtin function", nullptr, nullptr, nullptr, ALL_LANGUAGES,nullptr},
+const char *HeaderDesc::getName() const {
+ switch (ID) {
+#define HEADER(ID, NAME) \
+ case ID: \
+ return NAME;
+#include "clang/Basic/BuiltinHeaders.def"
+#undef HEADER
+ };
+ llvm_unreachable("Unknown HeaderDesc::HeaderID enum");
+}
+
+static constexpr Builtin::Info BuiltinInfo[] = {
+ {"not a builtin function", nullptr, nullptr, nullptr, HeaderDesc::NO_HEADER,
+ ALL_LANGUAGES},
#define BUILTIN(ID, TYPE, ATTRS) \
- { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
+ {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
#define LANGBUILTIN(ID, TYPE, ATTRS, LANGS) \
- { #ID, TYPE, ATTRS, nullptr, LANGS, nullptr },
+ {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, LANGS},
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER, LANGS) \
- { #ID, TYPE, ATTRS, HEADER, LANGS, nullptr },
+ {#ID, TYPE, ATTRS, nullptr, HeaderDesc::HEADER, LANGS},
#include "clang/Basic/Builtins.def"
};
@@ -63,37 +75,51 @@ bool Builtin::Context::isBuiltinFunc(llvm::StringRef FuncName) {
/// Is this builtin supported according to the given language options?
static bool builtinIsSupported(const Builtin::Info &BuiltinInfo,
const LangOptions &LangOpts) {
- bool BuiltinsUnsupported =
- LangOpts.NoBuiltin && strchr(BuiltinInfo.Attributes, 'f') != nullptr;
- bool CorBuiltinsUnsupported =
- !LangOpts.Coroutines && (BuiltinInfo.Langs & COR_LANG);
- bool MathBuiltinsUnsupported =
- LangOpts.NoMathBuiltin && BuiltinInfo.HeaderName &&
- llvm::StringRef(BuiltinInfo.HeaderName).equals("math.h");
- bool GnuModeUnsupported = !LangOpts.GNUMode && (BuiltinInfo.Langs & GNU_LANG);
- bool MSModeUnsupported =
- !LangOpts.MicrosoftExt && (BuiltinInfo.Langs & MS_LANG);
- bool ObjCUnsupported = !LangOpts.ObjC && BuiltinInfo.Langs == OBJC_LANG;
- bool OclCUnsupported =
- !LangOpts.OpenCL && (BuiltinInfo.Langs & ALL_OCL_LANGUAGES);
- bool OclGASUnsupported =
- !LangOpts.OpenCLGenericAddressSpace && (BuiltinInfo.Langs & OCL_GAS);
- bool OclPipeUnsupported =
- !LangOpts.OpenCLPipes && (BuiltinInfo.Langs & OCL_PIPE);
+ /* Builtins Unsupported */
+ if (LangOpts.NoBuiltin && strchr(BuiltinInfo.Attributes, 'f') != nullptr)
+ return false;
+ /* CorBuiltins Unsupported */
+ if (!LangOpts.Coroutines && (BuiltinInfo.Langs & COR_LANG))
+ return false;
+ /* MathBuiltins Unsupported */
+ if (LangOpts.NoMathBuiltin && BuiltinInfo.Header.ID == HeaderDesc::MATH_H)
+ return false;
+ /* GnuMode Unsupported */
+ if (!LangOpts.GNUMode && (BuiltinInfo.Langs & GNU_LANG))
+ return false;
+ /* MSMode Unsupported */
+ if (!LangOpts.MicrosoftExt && (BuiltinInfo.Langs & MS_LANG))
+ return false;
+ /* ObjC Unsupported */
+ if (!LangOpts.ObjC && BuiltinInfo.Langs == OBJC_LANG)
+ return false;
+ /* OpenCLC Unsupported */
+ if (!LangOpts.OpenCL && (BuiltinInfo.Langs & ALL_OCL_LANGUAGES))
+ return false;
+ /* OopenCL GAS Unsupported */
+ if (!LangOpts.OpenCLGenericAddressSpace && (BuiltinInfo.Langs & OCL_GAS))
+ return false;
+ /* OpenCL Pipe Unsupported */
+ if (!LangOpts.OpenCLPipes && (BuiltinInfo.Langs & OCL_PIPE))
+ return false;
+
// Device side enqueue is not supported until OpenCL 2.0. In 2.0 and higher
// support is indicated with language option for blocks.
- bool OclDSEUnsupported =
- (LangOpts.getOpenCLCompatibleVersion() < 200 || !LangOpts.Blocks) &&
- (BuiltinInfo.Langs & OCL_DSE);
- bool OpenMPUnsupported = !LangOpts.OpenMP && BuiltinInfo.Langs == OMP_LANG;
- bool CUDAUnsupported = !LangOpts.CUDA && BuiltinInfo.Langs == CUDA_LANG;
- bool CPlusPlusUnsupported =
- !LangOpts.CPlusPlus && BuiltinInfo.Langs == CXX_LANG;
- return !BuiltinsUnsupported && !CorBuiltinsUnsupported &&
- !MathBuiltinsUnsupported && !OclCUnsupported && !OclGASUnsupported &&
- !OclPipeUnsupported && !OclDSEUnsupported && !OpenMPUnsupported &&
- !GnuModeUnsupported && !MSModeUnsupported && !ObjCUnsupported &&
- !CPlusPlusUnsupported && !CUDAUnsupported;
+
+ /* OpenCL DSE Unsupported */
+ if ((LangOpts.getOpenCLCompatibleVersion() < 200 || !LangOpts.Blocks) &&
+ (BuiltinInfo.Langs & OCL_DSE))
+ return false;
+ /* OpenMP Unsupported */
+ if (!LangOpts.OpenMP && BuiltinInfo.Langs == OMP_LANG)
+ return false;
+ /* CUDA Unsupported */
+ if (!LangOpts.CUDA && BuiltinInfo.Langs == CUDA_LANG)
+ return false;
+ /* CPlusPlus Unsupported */
+ if (!LangOpts.CPlusPlus && BuiltinInfo.Langs == CXX_LANG)
+ return false;
+ return true;
}
/// initializeBuiltins - Mark the identifiers for all the builtins with their
@@ -209,6 +235,7 @@ bool Builtin::Context::performsCallback(unsigned ID,
bool Builtin::Context::canBeRedeclared(unsigned ID) const {
return ID == Builtin::NotBuiltin || ID == Builtin::BI__va_start ||
+ ID == Builtin::BI__builtin_assume_aligned ||
(!hasReferenceArgsOrResult(ID) && !hasCustomTypechecking(ID)) ||
isInStdNamespace(ID);
}