diff options
Diffstat (limited to 'lib/Basic/Builtins.cpp')
| -rw-r--r-- | lib/Basic/Builtins.cpp | 86 | 
1 files changed, 39 insertions, 47 deletions
diff --git a/lib/Basic/Builtins.cpp b/lib/Basic/Builtins.cpp index 8efcac6d7fe4d..69b10c13ede16 100644 --- a/lib/Basic/Builtins.cpp +++ b/lib/Basic/Builtins.cpp @@ -15,86 +15,78 @@  #include "clang/Basic/IdentifierTable.h"  #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", nullptr, nullptr, nullptr, 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 }, +  { "not a builtin function", nullptr, nullptr, nullptr, ALL_LANGUAGES,nullptr}, +#define BUILTIN(ID, TYPE, ATTRS)                                               \ +  { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, +#define LANGBUILTIN(ID, TYPE, ATTRS, LANGS)                                    \ +  { #ID, TYPE, ATTRS, nullptr, LANGS, nullptr }, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER, LANGS)                             \ +  { #ID, TYPE, ATTRS, HEADER, LANGS, nullptr },  #include "clang/Basic/Builtins.def"  }; -const Builtin::Info &Builtin::Context::GetRecord(unsigned ID) const { +const Builtin::Info &Builtin::Context::getRecord(unsigned ID) const {    if (ID < Builtin::FirstTSBuiltin)      return BuiltinInfo[ID]; -  assert(ID - Builtin::FirstTSBuiltin < NumTSRecords && "Invalid builtin ID!"); +  assert(((ID - Builtin::FirstTSBuiltin) < +          (TSRecords.size() + AuxTSRecords.size())) && +         "Invalid builtin ID!"); +  if (isAuxBuiltinID(ID)) +    return AuxTSRecords[getAuxBuiltinID(ID) - Builtin::FirstTSBuiltin];    return TSRecords[ID - Builtin::FirstTSBuiltin];  } -Builtin::Context::Context() { -  // Get the target specific builtins from the target. -  TSRecords = nullptr; -  NumTSRecords = 0; +void Builtin::Context::InitializeTarget(const TargetInfo &Target, +                                        const TargetInfo *AuxTarget) { +  assert(TSRecords.empty() && "Already initialized target?"); +  TSRecords = Target.getTargetBuiltins(); +  if (AuxTarget) +    AuxTSRecords = AuxTarget->getTargetBuiltins();  } -void Builtin::Context::InitializeTarget(const TargetInfo &Target) { -  assert(NumTSRecords == 0 && "Already initialized target?"); -  Target.getTargetBuiltins(TSRecords, NumTSRecords);   -} - -bool Builtin::Context::BuiltinIsSupported(const Builtin::Info &BuiltinInfo, +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 &&       +    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; +  bool GnuModeUnsupported = !LangOpts.GNUMode && (BuiltinInfo.Langs & GNU_LANG); +  bool MSModeUnsupported = +      !LangOpts.MicrosoftExt && (BuiltinInfo.Langs & MS_LANG); +  bool ObjCUnsupported = !LangOpts.ObjC1 && BuiltinInfo.Langs == OBJC_LANG;    return !BuiltinsUnsupported && !MathBuiltinsUnsupported &&           !GnuModeUnsupported && !MSModeUnsupported && !ObjCUnsupported;  } -/// InitializeBuiltins - Mark the identifiers for all the builtins with their +/// initializeBuiltins - Mark the identifiers for all the builtins with their  /// appropriate builtin ID # and mark any non-portable builtin identifiers as  /// such. -void Builtin::Context::InitializeBuiltins(IdentifierTable &Table, +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 (BuiltinIsSupported(BuiltinInfo[i], LangOpts)) { +    if (builtinIsSupported(BuiltinInfo[i], LangOpts)) {        Table.get(BuiltinInfo[i].Name).setBuiltinID(i);      }    // Step #2: Register target-specific builtins. -  for (unsigned i = 0, e = NumTSRecords; i != e; ++i) -    if (BuiltinIsSupported(TSRecords[i], LangOpts)) -      Table.get(TSRecords[i].Name).setBuiltinID(i+Builtin::FirstTSBuiltin); -} - -void -Builtin::Context::GetBuiltinNames(SmallVectorImpl<const char *> &Names) { -  // Final all target-independent names -  for (unsigned i = Builtin::NotBuiltin+1; i != Builtin::FirstTSBuiltin; ++i) -    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 (!strchr(TSRecords[i].Attributes, 'f')) -      Names.push_back(TSRecords[i].Name); +  for (unsigned i = 0, e = TSRecords.size(); i != e; ++i) +    if (builtinIsSupported(TSRecords[i], LangOpts)) +      Table.get(TSRecords[i].Name).setBuiltinID(i + Builtin::FirstTSBuiltin); + +  // Step #3: Register target-specific builtins for AuxTarget. +  for (unsigned i = 0, e = AuxTSRecords.size(); i != e; ++i) +    Table.get(AuxTSRecords[i].Name) +        .setBuiltinID(i + Builtin::FirstTSBuiltin + TSRecords.size());  } -void Builtin::Context::ForgetBuiltin(unsigned ID, IdentifierTable &Table) { -  Table.get(GetRecord(ID).Name).setBuiltinID(0); +void Builtin::Context::forgetBuiltin(unsigned ID, IdentifierTable &Table) { +  Table.get(getRecord(ID).Name).setBuiltinID(0);  }  bool Builtin::Context::isLike(unsigned ID, unsigned &FormatIdx, @@ -105,7 +97,7 @@ bool Builtin::Context::isLike(unsigned ID, unsigned &FormatIdx,    assert(::toupper(Fmt[0]) == Fmt[1] &&           "Format string is not in the form \"xX\""); -  const char *Like = ::strpbrk(GetRecord(ID).Attributes, Fmt); +  const char *Like = ::strpbrk(getRecord(ID).Attributes, Fmt);    if (!Like)      return false;  | 
