forked from OSchip/llvm-project
Allow clang to build __clear_cache on ARM.
__clear_cache is special. It needs no signature, but is a real function in compiler_rt or libgcc. Patch by Andrew Turner. llvm-svn: 183926
This commit is contained in:
parent
12e0332bfd
commit
3b3a166ce6
|
@ -70,6 +70,8 @@
|
|||
// f -> this is a libc/libm function without the '__builtin_' prefix. It can
|
||||
// be followed by ':headername:' to state which header this function
|
||||
// comes from.
|
||||
// i -> this is a runtime library implemented function without the
|
||||
// '__builtin_' prefix. It will be implemented in compiter-rt or libgcc.
|
||||
// p:N: -> this is a printf-like function whose Nth argument is the format
|
||||
// string.
|
||||
// P:N: -> similar to the p:N: attribute, but the function is like vprintf
|
||||
|
|
|
@ -130,6 +130,13 @@ public:
|
|||
return strchr(GetRecord(ID).Attributes, 'f') != 0;
|
||||
}
|
||||
|
||||
/// \brief Determines whether this builtin is a predefined compiler-rt/libgcc
|
||||
/// function, such as "__clear_cache", where we know the signature a
|
||||
/// priori.
|
||||
bool isPredefinedRuntimeFunction(unsigned ID) const {
|
||||
return strchr(GetRecord(ID).Attributes, 'i') != 0;
|
||||
}
|
||||
|
||||
/// \brief Determines whether this builtin has custom typechecking.
|
||||
bool hasCustomTypechecking(unsigned ID) const {
|
||||
return strchr(GetRecord(ID).Attributes, 't') != 0;
|
||||
|
|
|
@ -15,4 +15,4 @@
|
|||
// The format of this database matches clang/Basic/Builtins.def.
|
||||
|
||||
// In libgcc
|
||||
BUILTIN(__clear_cache, "vv*v*", "")
|
||||
BUILTIN(__clear_cache, "vv*v*", "i")
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
// The format of this database matches clang/Basic/Builtins.def.
|
||||
|
||||
// In libgcc
|
||||
BUILTIN(__clear_cache, "vv*v*", "")
|
||||
BUILTIN(__clear_cache, "vv*v*", "i")
|
||||
BUILTIN(__builtin_thread_pointer, "v*", "")
|
||||
|
||||
// Saturating arithmetic
|
||||
|
|
|
@ -8687,7 +8687,8 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D) {
|
|||
|
||||
// Builtin functions cannot be defined.
|
||||
if (unsigned BuiltinID = FD->getBuiltinID()) {
|
||||
if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
|
||||
if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
|
||||
!Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
|
||||
Diag(FD->getLocation(), diag::err_builtin_definition) << FD;
|
||||
FD->setInvalidDecl();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
// RUN: %clang_cc1 -triple armv7-none-linux-gnu -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -fsyntax-only -verify %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
void __clear_cache(void *a, void *b) {}
|
Loading…
Reference in New Issue