forked from OSchip/llvm-project
Fix the signature of the getcontext builtin. Patch by Dimitry Andric.
llvm-svn: 144505
This commit is contained in:
parent
8e1d906734
commit
6cfa82bc5f
|
@ -228,6 +228,9 @@ class ASTContext : public llvm::RefCountedBase<ASTContext> {
|
|||
/// \brief The type for the C sigjmp_buf type.
|
||||
TypeDecl *sigjmp_bufDecl;
|
||||
|
||||
/// \brief The type for the C ucontext_t type.
|
||||
TypeDecl *ucontext_tDecl;
|
||||
|
||||
/// \brief Type for the Block descriptor for Blocks CodeGen.
|
||||
///
|
||||
/// Since this is only used for generation of debug info, it is not
|
||||
|
@ -963,6 +966,18 @@ public:
|
|||
return QualType();
|
||||
}
|
||||
|
||||
/// \brief Set the type for the C ucontext_t type.
|
||||
void setucontext_tDecl(TypeDecl *ucontext_tDecl) {
|
||||
this->ucontext_tDecl = ucontext_tDecl;
|
||||
}
|
||||
|
||||
/// \brief Retrieve the C ucontext_t type.
|
||||
QualType getucontext_tType() const {
|
||||
if (ucontext_tDecl)
|
||||
return getTypeDeclType(ucontext_tDecl);
|
||||
return QualType();
|
||||
}
|
||||
|
||||
/// \brief The result type of logical operations, '<', '>', '!=', etc.
|
||||
QualType getLogicalOperationType() const {
|
||||
return getLangOptions().CPlusPlus ? BoolTy : IntTy;
|
||||
|
@ -1107,7 +1122,8 @@ public:
|
|||
enum GetBuiltinTypeError {
|
||||
GE_None, //< No error
|
||||
GE_Missing_stdio, //< Missing a type from <stdio.h>
|
||||
GE_Missing_setjmp //< Missing a type from <setjmp.h>
|
||||
GE_Missing_setjmp, //< Missing a type from <setjmp.h>
|
||||
GE_Missing_ucontext //< Missing a type from <ucontext.h>
|
||||
};
|
||||
|
||||
/// GetBuiltinType - Return the type for the specified builtin. If
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
// P -> FILE
|
||||
// J -> jmp_buf
|
||||
// SJ -> sigjmp_buf
|
||||
// K -> ucontext_t
|
||||
// . -> "...". This may only occur at the end of the function list.
|
||||
//
|
||||
// Types may be prefixed with the following modifiers:
|
||||
|
@ -686,7 +687,7 @@ LIBBUILTIN(sigsetjmp, "iSJi", "fj", "setjmp.h", ALL_LANGUAGES)
|
|||
LIBBUILTIN(setjmp_syscall, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(savectx, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(qsetjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(getcontext, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(getcontext, "iK*", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
|
||||
LIBBUILTIN(_longjmp, "vJi", "fr", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(siglongjmp, "vSJi", "fr", "setjmp.h", ALL_LANGUAGES)
|
||||
|
|
|
@ -26,6 +26,7 @@ def : DiagGroup<"attributes">;
|
|||
def : DiagGroup<"bad-function-cast">;
|
||||
def Availability : DiagGroup<"availability">;
|
||||
def BoolConversions : DiagGroup<"bool-conversions">;
|
||||
def BuiltinRequiresHeader : DiagGroup<"builtin-requires-header">;
|
||||
def CXXCompat: DiagGroup<"c++-compat">;
|
||||
def CastAlign : DiagGroup<"cast-align">;
|
||||
def : DiagGroup<"cast-qual">;
|
||||
|
|
|
@ -257,10 +257,16 @@ def note_please_include_header : Note<
|
|||
def note_previous_builtin_declaration : Note<"%0 is a builtin with type %1">;
|
||||
def warn_implicit_decl_requires_stdio : Warning<
|
||||
"declaration of built-in function '%0' requires inclusion of the header "
|
||||
"<stdio.h>">;
|
||||
"<stdio.h>">,
|
||||
InGroup<BuiltinRequiresHeader>;
|
||||
def warn_implicit_decl_requires_setjmp : Warning<
|
||||
"declaration of built-in function '%0' requires inclusion of the header "
|
||||
"<setjmp.h>">;
|
||||
"<setjmp.h>">,
|
||||
InGroup<BuiltinRequiresHeader>;
|
||||
def warn_implicit_decl_requires_ucontext : Warning<
|
||||
"declaration of built-in function '%0' requires inclusion of the header "
|
||||
"<ucontext.h>">,
|
||||
InGroup<BuiltinRequiresHeader>;
|
||||
def warn_redecl_library_builtin : Warning<
|
||||
"incompatible redeclaration of library function %0">;
|
||||
def err_builtin_definition : Error<"definition of builtin function %0">;
|
||||
|
|
|
@ -700,7 +700,9 @@ namespace clang {
|
|||
/// \brief Objective-C "Class" redefinition type
|
||||
SPECIAL_TYPE_OBJC_CLASS_REDEFINITION = 7,
|
||||
/// \brief Objective-C "SEL" redefinition type
|
||||
SPECIAL_TYPE_OBJC_SEL_REDEFINITION = 8
|
||||
SPECIAL_TYPE_OBJC_SEL_REDEFINITION = 8,
|
||||
/// \brief C ucontext_t typedef type
|
||||
SPECIAL_TYPE_UCONTEXT_T = 9
|
||||
};
|
||||
|
||||
/// \brief The number of special type IDs.
|
||||
|
|
|
@ -227,8 +227,9 @@ ASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM,
|
|||
ObjCIdDecl(0), ObjCSelDecl(0), ObjCClassDecl(0),
|
||||
CFConstantStringTypeDecl(0), ObjCInstanceTypeDecl(0),
|
||||
FILEDecl(0),
|
||||
jmp_bufDecl(0), sigjmp_bufDecl(0), BlockDescriptorType(0),
|
||||
BlockDescriptorExtendedType(0), cudaConfigureCallDecl(0),
|
||||
jmp_bufDecl(0), sigjmp_bufDecl(0), ucontext_tDecl(0),
|
||||
BlockDescriptorType(0), BlockDescriptorExtendedType(0),
|
||||
cudaConfigureCallDecl(0),
|
||||
NullTypeSourceInfo(QualType()),
|
||||
SourceMgr(SM), LangOpts(LOpts),
|
||||
AddrSpaceMap(0), Target(t), PrintingPolicy(LOpts),
|
||||
|
@ -6336,6 +6337,15 @@ static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,
|
|||
return QualType();
|
||||
}
|
||||
break;
|
||||
case 'K':
|
||||
assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!");
|
||||
Type = Context.getucontext_tType();
|
||||
|
||||
if (Type.isNull()) {
|
||||
Error = ASTContext::GE_Missing_ucontext;
|
||||
return QualType();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// If there are modifiers and if we're allowed to parse them, go for it.
|
||||
|
|
|
@ -1312,6 +1312,12 @@ NamedDecl *Sema::LazilyCreateBuiltin(IdentifierInfo *II, unsigned bid,
|
|||
Diag(Loc, diag::warn_implicit_decl_requires_setjmp)
|
||||
<< Context.BuiltinInfo.GetName(BID);
|
||||
return 0;
|
||||
|
||||
case ASTContext::GE_Missing_ucontext:
|
||||
if (ForRedeclaration)
|
||||
Diag(Loc, diag::warn_implicit_decl_requires_ucontext)
|
||||
<< Context.BuiltinInfo.GetName(BID);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ForRedeclaration && Context.BuiltinInfo.isPredefinedLibFunction(BID)) {
|
||||
|
@ -3661,6 +3667,8 @@ Sema::ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *NewTD,
|
|||
Context.setjmp_bufDecl(NewTD);
|
||||
else if (II->isStr("sigjmp_buf"))
|
||||
Context.setsigjmp_bufDecl(NewTD);
|
||||
else if (II->isStr("ucontext_t"))
|
||||
Context.setucontext_tDecl(NewTD);
|
||||
else if (II->isStr("__builtin_va_list"))
|
||||
Context.setBuiltinVaListType(Context.getTypedefType(NewTD));
|
||||
}
|
||||
|
|
|
@ -2660,6 +2660,24 @@ void ASTReader::InitializeContext() {
|
|||
if (Context.ObjCSelRedefinitionType.isNull())
|
||||
Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
|
||||
}
|
||||
|
||||
if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
|
||||
QualType Ucontext_tType = GetType(Ucontext_t);
|
||||
if (Ucontext_tType.isNull()) {
|
||||
Error("ucontext_t type is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Context.ucontext_tDecl) {
|
||||
if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
|
||||
Context.setucontext_tDecl(Typedef->getDecl());
|
||||
else {
|
||||
const TagType *Tag = Ucontext_tType->getAs<TagType>();
|
||||
assert(Tag && "Invalid ucontext_t type in AST file");
|
||||
Context.setucontext_tDecl(Tag->getDecl());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ReadPragmaDiagnosticMappings(Context.getDiagnostics());
|
||||
|
|
|
@ -3005,6 +3005,7 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
|
|||
AddTypeRef(Context.ObjCIdRedefinitionType, SpecialTypes);
|
||||
AddTypeRef(Context.ObjCClassRedefinitionType, SpecialTypes);
|
||||
AddTypeRef(Context.ObjCSelRedefinitionType, SpecialTypes);
|
||||
AddTypeRef(Context.getucontext_tType(), SpecialTypes);
|
||||
|
||||
// Keep writing types and declarations until all types and
|
||||
// declarations have been written.
|
||||
|
|
|
@ -17,7 +17,7 @@ This test serves two purposes:
|
|||
|
||||
The list of warnings below should NEVER grow. It should gradually shrink to 0.
|
||||
|
||||
CHECK: Warnings without flags (277):
|
||||
CHECK: Warnings without flags (275):
|
||||
CHECK-NEXT: ext_anon_param_requires_type_specifier
|
||||
CHECK-NEXT: ext_anonymous_struct_union_qualified
|
||||
CHECK-NEXT: ext_array_init_copy
|
||||
|
@ -183,8 +183,6 @@ CHECK-NEXT: warn_hex_escape_too_large
|
|||
CHECK-NEXT: warn_ignoring_ftabstop_value
|
||||
CHECK-NEXT: warn_illegal_constant_array_size
|
||||
CHECK-NEXT: warn_implements_nscopying
|
||||
CHECK-NEXT: warn_implicit_decl_requires_setjmp
|
||||
CHECK-NEXT: warn_implicit_decl_requires_stdio
|
||||
CHECK-NEXT: warn_incompatible_qualified_id
|
||||
CHECK-NEXT: warn_initializer_string_for_char_array_too_long
|
||||
CHECK-NEXT: warn_inline_namespace_reopened_noninline
|
||||
|
|
Loading…
Reference in New Issue