18 #include "llvm/ADT/StringRef.h"
19 using namespace clang;
22 {
"not a builtin function",
nullptr,
nullptr,
nullptr,
ALL_LANGUAGES,
nullptr},
23 #define BUILTIN(ID, TYPE, ATTRS) \
24 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
25 #define LANGBUILTIN(ID, TYPE, ATTRS, LANGS) \
26 { #ID, TYPE, ATTRS, nullptr, LANGS, nullptr },
27 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER, LANGS) \
28 { #ID, TYPE, ATTRS, HEADER, LANGS, nullptr },
29 #include "clang/Basic/Builtins.def"
36 (TSRecords.size() + AuxTSRecords.size())) &&
37 "Invalid builtin ID!");
45 assert(TSRecords.empty() &&
"Already initialized target?");
52 StringRef FuncName(Name);
55 return strchr(
BuiltinInfo[i].Attributes,
'f') !=
nullptr;
62 bool BuiltinsUnsupported =
65 bool MathBuiltinsUnsupported =
66 LangOpts.NoMathBuiltin && BuiltinInfo.
HeaderName &&
67 llvm::StringRef(BuiltinInfo.
HeaderName).equals(
"math.h");
68 bool GnuModeUnsupported = !LangOpts.GNUMode && (BuiltinInfo.
Langs &
GNU_LANG);
69 bool MSModeUnsupported =
71 bool ObjCUnsupported = !LangOpts.ObjC1 && BuiltinInfo.
Langs ==
OBJC_LANG;
72 bool OclCUnsupported = LangOpts.OpenCLVersion != 200 &&
74 return !BuiltinsUnsupported && !MathBuiltinsUnsupported && !OclCUnsupported &&
75 !GnuModeUnsupported && !MSModeUnsupported && !ObjCUnsupported;
85 if (builtinIsSupported(BuiltinInfo[i], LangOpts)) {
90 for (
unsigned i = 0, e = TSRecords.size(); i != e; ++i)
91 if (builtinIsSupported(TSRecords[i], LangOpts))
95 for (
unsigned i = 0, e = AuxTSRecords.size(); i != e; ++i)
96 Table.
get(AuxTSRecords[i].Name)
104 bool Builtin::Context::isLike(
unsigned ID,
unsigned &FormatIdx,
105 bool &HasVAListArg,
const char *Fmt)
const {
106 assert(Fmt &&
"Not passed a format string");
107 assert(::strlen(Fmt) == 2 &&
108 "Format string needs to be two characters long");
109 assert(::toupper(Fmt[0]) == Fmt[1] &&
110 "Format string is not in the form \"xX\"");
112 const char *Like = ::strpbrk(getRecord(ID).Attributes, Fmt);
116 HasVAListArg = (*Like == Fmt[1]);
119 assert(*Like ==
':' &&
"Format specifier must be followed by a ':'");
122 assert(::strchr(Like,
':') &&
"Format specifier must end with a ':'");
123 FormatIdx = ::strtol(Like,
nullptr, 10);
128 bool &HasVAListArg) {
129 return isLike(ID, FormatIdx, HasVAListArg,
"pP");
133 bool &HasVAListArg) {
134 return isLike(ID, FormatIdx, HasVAListArg,
"sS");
static const Builtin::Info BuiltinInfo[]
static bool isBuiltinFunc(const char *Name)
Returns true if this is a libc/libm function without the '__builtin_' prefix.
void forgetBuiltin(unsigned ID, IdentifierTable &Table)
Completely forget that the given ID was ever considered a builtin, e.g., because the user provided a ...
bool isPrintfLike(unsigned ID, unsigned &FormatIdx, bool &HasVAListArg)
Determine whether this builtin is like printf in its formatting rules and, if so, set the index to th...
bool isAuxBuiltinID(unsigned ID) const
Return true if builtin ID belongs to AuxTarget.
class LLVM_ALIGNAS(8) DependentTemplateSpecializationType const IdentifierInfo * Name
Represents a template specialization type whose template cannot be resolved, e.g. ...
bool isNoBuiltinFunc(const char *Name) const
Is this a libc/libm function that is no longer recognized as a builtin because a -fno-builtin-* optio...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Exposes information about the current target.
Defines the clang::LangOptions interface.
Implements an efficient mapping from strings to IdentifierInfo nodes.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
void initializeBuiltins(IdentifierTable &Table, const LangOptions &LangOpts)
Mark the identifiers for all the builtins with their appropriate builtin ID # and mark any non-portab...
unsigned getAuxBuiltinID(unsigned ID) const
Return real buitin ID (i.e.
virtual ArrayRef< Builtin::Info > getTargetBuiltins() const =0
Return information about target-specific builtins for the current primary target, and info about whic...
bool isScanfLike(unsigned ID, unsigned &FormatIdx, bool &HasVAListArg)
Determine whether this builtin is like scanf in its formatting rules and, if so, set the index to the...
void setBuiltinID(unsigned ID)
Defines the clang::TargetInfo interface.
void InitializeTarget(const TargetInfo &Target, const TargetInfo *AuxTarget)
Perform target-specific initialization.
Defines enum values for all the target-independent builtin functions.