aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-02-16 21:58:21 +0000
committerDouglas Gregor <dgregor@apple.com>2009-02-16 21:58:21 +0000
commitb1152d842c6599e41581302a85a0f53928253add (patch)
tree914c0ca178ba4ac606b2f787dd2c3ee8b8c76a20
parentf81895f963f0910c7df422709f7f1668eb9f7c4f (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.def54
-rw-r--r--include/clang/AST/Builtins.h6
-rw-r--r--lib/AST/Builtins.cpp20
-rw-r--r--lib/Basic/Targets.cpp7
-rw-r--r--lib/Sema/SemaDecl.cpp2
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)