diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Basic/Builtins.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Basic/Builtins.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/contrib/llvm/tools/clang/lib/Basic/Builtins.cpp b/contrib/llvm/tools/clang/lib/Basic/Builtins.cpp index 242c204..c84dd6d 100644 --- a/contrib/llvm/tools/clang/lib/Basic/Builtins.cpp +++ b/contrib/llvm/tools/clang/lib/Basic/Builtins.cpp @@ -16,11 +16,13 @@ #include "clang/Basic/LangOptions.h" #include "clang/Basic/TargetInfo.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringRef.h" using namespace clang; static const Builtin::Info BuiltinInfo[] = { { "not a builtin function", 0, 0, 0, ALL_LANGUAGES }, #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, +#define LANGBUILTIN(ID, TYPE, ATTRS, BUILTIN_LANG) { #ID, TYPE, ATTRS, 0, BUILTIN_LANG }, #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER, BUILTIN_LANG) { #ID, TYPE, ATTRS, HEADER,\ BUILTIN_LANG }, #include "clang/Basic/Builtins.def" @@ -44,6 +46,23 @@ void Builtin::Context::InitializeTarget(const TargetInfo &Target) { Target.getTargetBuiltins(TSRecords, NumTSRecords); } +bool Builtin::Context::BuiltinIsSupported(const Builtin::Info &BuiltinInfo, + const LangOptions &LangOpts) { + bool BuiltinsUnsupported = LangOpts.NoBuiltin && + strchr(BuiltinInfo.Attributes, 'f'); + bool MathBuiltinsUnsupported = + LangOpts.NoMathBuiltin && BuiltinInfo.HeaderName && + llvm::StringRef(BuiltinInfo.HeaderName).equals("math.h"); + bool GnuModeUnsupported = !LangOpts.GNUMode && + (BuiltinInfo.builtin_lang & GNU_LANG); + bool MSModeUnsupported = !LangOpts.MicrosoftExt && + (BuiltinInfo.builtin_lang & MS_LANG); + bool ObjCUnsupported = !LangOpts.ObjC1 && + BuiltinInfo.builtin_lang == OBJC_LANG; + return !BuiltinsUnsupported && !MathBuiltinsUnsupported && + !GnuModeUnsupported && !MSModeUnsupported && !ObjCUnsupported; +} + /// InitializeBuiltins - Mark the identifiers for all the builtins with their /// appropriate builtin ID # and mark any non-portable builtin identifiers as /// such. @@ -51,10 +70,8 @@ void Builtin::Context::InitializeBuiltins(IdentifierTable &Table, const LangOptions& LangOpts) { // Step #1: mark all target-independent builtins with their ID's. for (unsigned i = Builtin::NotBuiltin+1; i != Builtin::FirstTSBuiltin; ++i) - if (!LangOpts.NoBuiltin || !strchr(BuiltinInfo[i].Attributes, 'f')) { - if (LangOpts.ObjC1 || - BuiltinInfo[i].builtin_lang != clang::OBJC_LANG) - Table.get(BuiltinInfo[i].Name).setBuiltinID(i); + if (BuiltinIsSupported(BuiltinInfo[i], LangOpts)) { + Table.get(BuiltinInfo[i].Name).setBuiltinID(i); } // Step #2: Register target-specific builtins. @@ -64,16 +81,15 @@ void Builtin::Context::InitializeBuiltins(IdentifierTable &Table, } void -Builtin::Context::GetBuiltinNames(SmallVectorImpl<const char *> &Names, - bool NoBuiltins) { +Builtin::Context::GetBuiltinNames(SmallVectorImpl<const char *> &Names) { // Final all target-independent names for (unsigned i = Builtin::NotBuiltin+1; i != Builtin::FirstTSBuiltin; ++i) - if (!NoBuiltins || !strchr(BuiltinInfo[i].Attributes, 'f')) + if (!strchr(BuiltinInfo[i].Attributes, 'f')) Names.push_back(BuiltinInfo[i].Name); // Find target-specific names. for (unsigned i = 0, e = NumTSRecords; i != e; ++i) - if (!NoBuiltins || !strchr(TSRecords[i].Attributes, 'f')) + if (!strchr(TSRecords[i].Attributes, 'f')) Names.push_back(TSRecords[i].Name); } |