diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-02-16 21:58:21 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-02-16 21:58:21 +0000 |
commit | b1152d842c6599e41581302a85a0f53928253add (patch) | |
tree | 914c0ca178ba4ac606b2f787dd2c3ee8b8c76a20 | |
parent | f81895f963f0910c7df422709f7f1668eb9f7c4f (diff) |
Supply the header corresponding to a library builtin as a separate argument to the LIBBUILTIN macro
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64676 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/Builtins.def | 54 | ||||
-rw-r--r-- | include/clang/AST/Builtins.h | 6 | ||||
-rw-r--r-- | lib/AST/Builtins.cpp | 20 | ||||
-rw-r--r-- | lib/Basic/Targets.cpp | 7 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 2 |
5 files changed, 40 insertions, 49 deletions
diff --git a/include/clang/AST/Builtins.def b/include/clang/AST/Builtins.def index c9289ab4b3..bdcdab15b4 100644 --- a/include/clang/AST/Builtins.def +++ b/include/clang/AST/Builtins.def @@ -66,7 +66,7 @@ // FIXME: gcc has nonnull #if defined(BUILTIN) && !defined(LIBBUILTIN) -# define LIBBUILTIN(ID, TYPE, ATTRS) BUILTIN(ID, TYPE, ATTRS) +# define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) BUILTIN(ID, TYPE, ATTRS) #endif // Standard libc/libm functions: @@ -186,32 +186,32 @@ BUILTIN(__sync_val_compare_and_swap,"ii*ii", "n") BUILTIN(__builtin_llvm_memory_barrier,"vbbbbb", "n") // Builtin library functions -LIBBUILTIN(alloca, "v*z", "f:stdlib.h:") -LIBBUILTIN(calloc, "v*zz", "f:stdlib.h:") -LIBBUILTIN(malloc, "v*z", "f:stdlib.h:") -LIBBUILTIN(realloc, "v*v*z", "f:stdlib.h") -LIBBUILTIN(memcpy, "v*v*vC*z", "f:string.h:") -LIBBUILTIN(memmove, "v*v*vC*z", "f:string.h:") -LIBBUILTIN(memset, "v*v*iz", "f:string.h:") -LIBBUILTIN(strcat, "c*c*cC*", "f:string.h:") -LIBBUILTIN(strchr, "c*cC*i", "f:string.h:") -LIBBUILTIN(strcpy, "c*c*cC*", "f:string.h:") -LIBBUILTIN(strcspn, "zcC*cC*", "f:string.h:") -LIBBUILTIN(strlen, "zcC*", "f:string.h:") -LIBBUILTIN(strncat, "c*c*cC*z", "f:string.h:") -LIBBUILTIN(strncpy, "c*c*cC*z", "f:string.h:") -LIBBUILTIN(strpbrk, "c*cC*cC*", "f:string.h:") -LIBBUILTIN(strrchr, "c*cC*i", "f:string.h:") -LIBBUILTIN(strspn, "zcC*cC*", "f:string.h:") -LIBBUILTIN(strstr, "c*cC*cC*", "f:string.h:") -LIBBUILTIN(printf, "icC*.", "f:stdio.h:p:0:") -LIBBUILTIN(fprintf, "iP*cC*.", "f:stdio.h:p:1:") -LIBBUILTIN(snprintf, "ic*zcC*.", "f:stdio.h:p:2:") -LIBBUILTIN(sprintf, "ic*cC*.", "f:stdio.h:p:1:") -LIBBUILTIN(vprintf, "icC*a", "f:stdio.h:P:0:") -LIBBUILTIN(vfprintf, "iP*cC*a", "f:stdio.h:P:1:") -LIBBUILTIN(vsnprintf, "ic*zcC*a", "f:stdio.h:P:2:") -LIBBUILTIN(vsprintf, "ic*cC*a", "f:stdio.h:P:1:") +LIBBUILTIN(alloca, "v*z", "f", "stdlib.h") +LIBBUILTIN(calloc, "v*zz", "f", "stdlib.h") +LIBBUILTIN(malloc, "v*z", "f", "stdlib.h") +LIBBUILTIN(realloc, "v*v*z", "f", "stdlib.h") +LIBBUILTIN(memcpy, "v*v*vC*z", "f", "string.h") +LIBBUILTIN(memmove, "v*v*vC*z", "f", "string.h") +LIBBUILTIN(memset, "v*v*iz", "f", "string.h") +LIBBUILTIN(strcat, "c*c*cC*", "f", "string.h") +LIBBUILTIN(strchr, "c*cC*i", "f", "string.h") +LIBBUILTIN(strcpy, "c*c*cC*", "f", "string.h") +LIBBUILTIN(strcspn, "zcC*cC*", "f", "string.h") +LIBBUILTIN(strlen, "zcC*", "f", "string.h") +LIBBUILTIN(strncat, "c*c*cC*z", "f", "string.h") +LIBBUILTIN(strncpy, "c*c*cC*z", "f", "string.h") +LIBBUILTIN(strpbrk, "c*cC*cC*", "f", "string.h") +LIBBUILTIN(strrchr, "c*cC*i", "f", "string.h") +LIBBUILTIN(strspn, "zcC*cC*", "f", "string.h") +LIBBUILTIN(strstr, "c*cC*cC*", "f", "string.h") +LIBBUILTIN(printf, "icC*.", "fp:0:", "stdio.h") +LIBBUILTIN(fprintf, "iP*cC*.", "fp:1:", "stdio.h") +LIBBUILTIN(snprintf, "ic*zcC*.", "fp:2:", "stdio.h") +LIBBUILTIN(sprintf, "ic*cC*.", "fp:1:", "stdio.h") +LIBBUILTIN(vprintf, "icC*a", "fP:0:", "stdio.h") +LIBBUILTIN(vfprintf, "iP*cC*a", "fP:1:", "stdio.h") +LIBBUILTIN(vsnprintf, "ic*zcC*a", "fP:2:", "stdio.h") +LIBBUILTIN(vsprintf, "ic*cC*a", "fP:1:", "stdio.h") // FIXME: asprintf and vasprintf aren't C99 functions. Should they be // target-specific builtins, perhaps? diff --git a/include/clang/AST/Builtins.h b/include/clang/AST/Builtins.h index dfc44c50cd..6af8d750a4 100644 --- a/include/clang/AST/Builtins.h +++ b/include/clang/AST/Builtins.h @@ -33,7 +33,7 @@ enum ID { }; struct Info { - const char *Name, *Type, *Attributes; + const char *Name, *Type, *Attributes, *HeaderName; bool Suppressed; bool operator==(const Info &RHS) const { @@ -90,7 +90,9 @@ public: /// \brief If this is a library function that comes from a specific /// header, retrieve that header name. - std::string getHeaderName(unsigned ID) const; + const char *getHeaderName(unsigned ID) const { + return GetRecord(ID).HeaderName; + } /// \brief Determine whether this builtin is like printf in its /// formatting rules and, if so, set the index to the format string diff --git a/lib/AST/Builtins.cpp b/lib/AST/Builtins.cpp index 4a8a338e63..e4a79e4a38 100644 --- a/lib/AST/Builtins.cpp +++ b/lib/AST/Builtins.cpp @@ -19,8 +19,9 @@ using namespace clang; static const Builtin::Info BuiltinInfo[] = { - { "not a builtin function", 0, 0, false }, -#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, false }, + { "not a builtin function", 0, 0, 0, false }, +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false }, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false }, #include "clang/AST/Builtins.def" }; @@ -57,21 +58,6 @@ void Builtin::Context::InitializeBuiltins(IdentifierTable &Table, Table.get(TSRecords[i].Name).setBuiltinID(i+Builtin::FirstTSBuiltin); } -std::string Builtin::Context::getHeaderName(unsigned ID) const { - const char *Name = strchr(GetRecord(ID).Attributes, 'f'); - if (!Name) - return 0; - ++Name; - - if (*Name != ':') - return 0; - - ++Name; - const char *NameEnd = strchr(Name, ':'); - assert(NameEnd && "Missing ':' after header name"); - return std::string(Name, NameEnd); -} - bool Builtin::Context::isPrintfLike(unsigned ID, unsigned &FormatIdx, bool &HasVAListArg) { diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 3e724eb396..7b6723befa 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +// FIXME: Layering violation #include "clang/AST/Builtins.h" #include "clang/AST/TargetBuiltins.h" #include "clang/Basic/TargetInfo.h" @@ -296,7 +297,8 @@ public: }; const Builtin::Info PPCTargetInfo::BuiltinInfo[] = { -#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, false }, +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false }, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false }, #include "clang/AST/PPCBuiltins.def" }; @@ -438,7 +440,8 @@ public: namespace { // Namespace for x86 abstract base class const Builtin::Info BuiltinInfo[] = { -#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, false }, +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false }, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false }, #include "clang/AST/X86Builtins.def" }; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index b194c9e2ec..5d02b66f36 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -315,7 +315,7 @@ NamedDecl *Sema::LazilyCreateBuiltin(IdentifierInfo *II, unsigned bid, Diag(Loc, diag::ext_implicit_lib_function_decl) << Context.BuiltinInfo.GetName(BID) << R; - if (!Context.BuiltinInfo.getHeaderName(BID).empty() && + if (Context.BuiltinInfo.getHeaderName(BID) && Diags.getDiagnosticMapping(diag::ext_implicit_lib_function_decl) != diag::MAP_IGNORE) Diag(Loc, diag::note_please_include_header) |