diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-02-11 12:38:04 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-02-11 12:38:11 +0000 |
commit | e3b557809604d036af6e00c60f012c2025b59a5e (patch) | |
tree | 8a11ba2269a3b669601e2fd41145b174008f4da8 /clang/lib/Basic/Builtins.cpp | |
parent | 08e8dd7b9db7bb4a9de26d44c1cbfd24e869c014 (diff) |
Diffstat (limited to 'clang/lib/Basic/Builtins.cpp')
-rw-r--r-- | clang/lib/Basic/Builtins.cpp | 95 |
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); } |