modern objective-c translator: When translating

call to 'super' use __rw_objc_super as type of the
'super' meta-data instead of objc_super.
// rdar://11239894

llvm-svn: 154670
This commit is contained in:
Fariborz Jahanian 2012-04-13 16:20:05 +00:00
parent aa0df2d373
commit 4af0e9efdd
2 changed files with 46 additions and 37 deletions

View File

@ -2270,7 +2270,7 @@ void RewriteModernObjC::RewriteBlockLiteralFunctionDecl(FunctionDecl *FD) {
CurFunctionDeclToDeclareForBlock = 0; CurFunctionDeclToDeclareForBlock = 0;
} }
// SynthSuperContructorFunctionDecl - id objc_super(id obj, id super); // SynthSuperContructorFunctionDecl - id __rw_objc_super(id obj, id super);
void RewriteModernObjC::SynthSuperContructorFunctionDecl() { void RewriteModernObjC::SynthSuperContructorFunctionDecl() {
if (SuperContructorFunctionDecl) if (SuperContructorFunctionDecl)
return; return;
@ -2311,21 +2311,13 @@ void RewriteModernObjC::SynthMsgSendFunctionDecl() {
SC_None, false); SC_None, false);
} }
// SynthMsgSendSuperFunctionDecl - id objc_msgSendSuper(struct objc_super *, SEL op, ...); // SynthMsgSendSuperFunctionDecl - id objc_msgSendSuper(void);
void RewriteModernObjC::SynthMsgSendSuperFunctionDecl() { void RewriteModernObjC::SynthMsgSendSuperFunctionDecl() {
IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSendSuper"); IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSendSuper");
SmallVector<QualType, 16> ArgTys; SmallVector<QualType, 2> ArgTys;
RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl, ArgTys.push_back(Context->VoidTy);
SourceLocation(), SourceLocation(),
&Context->Idents.get("objc_super"));
QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
ArgTys.push_back(argT);
argT = Context->getObjCSelType();
assert(!argT.isNull() && "Can't find 'SEL' type");
ArgTys.push_back(argT);
QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(), QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
&ArgTys[0], ArgTys.size(), &ArgTys[0], 1,
true /*isVariadic*/); true /*isVariadic*/);
MsgSendSuperFunctionDecl = FunctionDecl::Create(*Context, TUDecl, MsgSendSuperFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(), SourceLocation(),
@ -2357,22 +2349,14 @@ void RewriteModernObjC::SynthMsgSendStretFunctionDecl() {
} }
// SynthMsgSendSuperStretFunctionDecl - // SynthMsgSendSuperStretFunctionDecl -
// id objc_msgSendSuper_stret(struct objc_super *, SEL op, ...); // id objc_msgSendSuper_stret(void);
void RewriteModernObjC::SynthMsgSendSuperStretFunctionDecl() { void RewriteModernObjC::SynthMsgSendSuperStretFunctionDecl() {
IdentifierInfo *msgSendIdent = IdentifierInfo *msgSendIdent =
&Context->Idents.get("objc_msgSendSuper_stret"); &Context->Idents.get("objc_msgSendSuper_stret");
SmallVector<QualType, 16> ArgTys; SmallVector<QualType, 2> ArgTys;
RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl, ArgTys.push_back(Context->VoidTy);
SourceLocation(), SourceLocation(),
&Context->Idents.get("objc_super"));
QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
ArgTys.push_back(argT);
argT = Context->getObjCSelType();
assert(!argT.isNull() && "Can't find 'SEL' type");
ArgTys.push_back(argT);
QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(), QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
&ArgTys[0], ArgTys.size(), &ArgTys[0], 1,
true /*isVariadic*/); true /*isVariadic*/);
MsgSendSuperStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl, MsgSendSuperStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(), SourceLocation(),
@ -2925,18 +2909,20 @@ Stmt *RewriteModernObjC::RewriteObjCDictionaryLiteralExpr(ObjCDictionaryLiteral
return CE; return CE;
} }
// struct objc_super { struct objc_object *receiver; struct objc_class *super; }; // struct __rw_objc_super {
// struct objc_object *object; struct objc_object *superClass;
// };
QualType RewriteModernObjC::getSuperStructType() { QualType RewriteModernObjC::getSuperStructType() {
if (!SuperStructDecl) { if (!SuperStructDecl) {
SuperStructDecl = RecordDecl::Create(*Context, TTK_Struct, TUDecl, SuperStructDecl = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
SourceLocation(), SourceLocation(), SourceLocation(), SourceLocation(),
&Context->Idents.get("objc_super")); &Context->Idents.get("__rw_objc_super"));
QualType FieldTypes[2]; QualType FieldTypes[2];
// struct objc_object *receiver; // struct objc_object *object;
FieldTypes[0] = Context->getObjCIdType(); FieldTypes[0] = Context->getObjCIdType();
// struct objc_class *super; // struct objc_object *superClass;
FieldTypes[1] = Context->getObjCClassType(); FieldTypes[1] = Context->getObjCIdType();
// Create fields // Create fields
for (unsigned i = 0; i < 2; ++i) { for (unsigned i = 0; i < 2; ++i) {
@ -3073,7 +3059,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
NoTypeInfoCStyleCastExpr(Context, NoTypeInfoCStyleCastExpr(Context,
Context->getObjCIdType(), Context->getObjCIdType(),
CK_BitCast, Cls)); CK_BitCast, Cls));
// struct objc_super // struct __rw_objc_super
QualType superType = getSuperStructType(); QualType superType = getSuperStructType();
Expr *SuperRep; Expr *SuperRep;
@ -3091,7 +3077,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
// the structure definition in the header. The rewriter has it's own // the structure definition in the header. The rewriter has it's own
// internal definition (__rw_objc_super) that is uses. This is why // internal definition (__rw_objc_super) that is uses. This is why
// we need the cast below. For example: // we need the cast below. For example:
// (struct objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER")) // (struct __rw_objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER"))
// //
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf, SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
Context->getPointerType(SuperRep->getType()), Context->getPointerType(SuperRep->getType()),
@ -3101,7 +3087,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
Context->getPointerType(superType), Context->getPointerType(superType),
CK_BitCast, SuperRep); CK_BitCast, SuperRep);
} else { } else {
// (struct objc_super) { <exprs from above> } // (struct __rw_objc_super) { <exprs from above> }
InitListExpr *ILE = InitListExpr *ILE =
new (Context) InitListExpr(*Context, SourceLocation(), new (Context) InitListExpr(*Context, SourceLocation(),
&InitExprs[0], InitExprs.size(), &InitExprs[0], InitExprs.size(),
@ -3111,7 +3097,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo, SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
superType, VK_LValue, superType, VK_LValue,
ILE, false); ILE, false);
// struct objc_super * // struct __rw_objc_super *
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf, SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
Context->getPointerType(SuperRep->getType()), Context->getPointerType(SuperRep->getType()),
VK_RValue, OK_Ordinary, VK_RValue, OK_Ordinary,
@ -3183,7 +3169,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
// set 'super class', using class_getSuperclass(). // set 'super class', using class_getSuperclass().
NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(), NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
CK_BitCast, Cls)); CK_BitCast, Cls));
// struct objc_super // struct __rw_objc_super
QualType superType = getSuperStructType(); QualType superType = getSuperStructType();
Expr *SuperRep; Expr *SuperRep;
@ -3200,7 +3186,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
// the structure definition in the header. The rewriter has it's own // the structure definition in the header. The rewriter has it's own
// internal definition (__rw_objc_super) that is uses. This is why // internal definition (__rw_objc_super) that is uses. This is why
// we need the cast below. For example: // we need the cast below. For example:
// (struct objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER")) // (struct __rw_objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER"))
// //
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf, SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
Context->getPointerType(SuperRep->getType()), Context->getPointerType(SuperRep->getType()),
@ -3210,7 +3196,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
Context->getPointerType(superType), Context->getPointerType(superType),
CK_BitCast, SuperRep); CK_BitCast, SuperRep);
} else { } else {
// (struct objc_super) { <exprs from above> } // (struct __rw_objc_super) { <exprs from above> }
InitListExpr *ILE = InitListExpr *ILE =
new (Context) InitListExpr(*Context, SourceLocation(), new (Context) InitListExpr(*Context, SourceLocation(),
&InitExprs[0], InitExprs.size(), &InitExprs[0], InitExprs.size(),

View File

@ -0,0 +1,23 @@
// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"id=struct objc_object *" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
// rdar://11239894
extern "C" void *sel_registerName(const char *);
typedef struct objc_class * Class;
@interface Sub
- (void)dealloc;
@end
@interface I : Sub
- (void)dealloc;
@end
@implementation I
- (void)dealloc {
return;
[super dealloc];
}
@end