objective-C modern translator. More fixups for
modern meta-data abi translation. Still wip. // rdar://13138459 llvm-svn: 174672
This commit is contained in:
parent
a9100f3609
commit
e499613d60
|
@ -153,6 +153,7 @@ namespace {
|
||||||
// This container maps an <class, group number for ivar> tuple to the type
|
// This container maps an <class, group number for ivar> tuple to the type
|
||||||
// of the struct where the bitfield belongs.
|
// of the struct where the bitfield belongs.
|
||||||
llvm::DenseMap<std::pair<const ObjCInterfaceDecl*, unsigned>, QualType> GroupRecordType;
|
llvm::DenseMap<std::pair<const ObjCInterfaceDecl*, unsigned>, QualType> GroupRecordType;
|
||||||
|
SmallVector<FunctionDecl*, 32> FunctionDefinitionsSeen;
|
||||||
|
|
||||||
// This maps an original source AST to it's rewritten form. This allows
|
// This maps an original source AST to it's rewritten form. This allows
|
||||||
// us to avoid rewriting the same node twice (which is very uncommon).
|
// us to avoid rewriting the same node twice (which is very uncommon).
|
||||||
|
@ -203,6 +204,18 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FunctionDecl *FDecl = dyn_cast<FunctionDecl>(*I)) {
|
||||||
|
// Under modern abi, we cannot translate body of the function
|
||||||
|
// yet until all class extensions and its implementation is seen.
|
||||||
|
// This is because they may introduce new bitfields which must go
|
||||||
|
// into their grouping struct.
|
||||||
|
if (FDecl->isThisDeclarationADefinition() &&
|
||||||
|
// Not c functions defined inside an objc container.
|
||||||
|
!FDecl->isTopLevelDeclInObjCContainer()) {
|
||||||
|
FunctionDefinitionsSeen.push_back(FDecl);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
HandleTopLevelSingleDecl(*I);
|
HandleTopLevelSingleDecl(*I);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -5268,7 +5281,7 @@ void RewriteModernObjC::RewriteByRefVar(VarDecl *ND, bool firstDecl,
|
||||||
flag |= BLOCK_FIELD_IS_OBJECT;
|
flag |= BLOCK_FIELD_IS_OBJECT;
|
||||||
std::string HF = SynthesizeByrefCopyDestroyHelper(ND, flag);
|
std::string HF = SynthesizeByrefCopyDestroyHelper(ND, flag);
|
||||||
if (!HF.empty())
|
if (!HF.empty())
|
||||||
InsertText(FunLocStart, HF);
|
Preamble += HF;
|
||||||
}
|
}
|
||||||
|
|
||||||
// struct __Block_byref_ND ND =
|
// struct __Block_byref_ND ND =
|
||||||
|
@ -6023,6 +6036,14 @@ void RewriteModernObjC::HandleTranslationUnit(ASTContext &C) {
|
||||||
|
|
||||||
RewriteInclude();
|
RewriteInclude();
|
||||||
|
|
||||||
|
for (unsigned i = 0, e = FunctionDefinitionsSeen.size(); i < e; i++) {
|
||||||
|
// translation of function bodies were postponed untill all class and
|
||||||
|
// their extensions and implementations are seen. This is because, we
|
||||||
|
// cannot build grouping structs for bitfields untill they are all seen.
|
||||||
|
FunctionDecl *FDecl = FunctionDefinitionsSeen[i];
|
||||||
|
HandleTopLevelSingleDecl(FDecl);
|
||||||
|
}
|
||||||
|
|
||||||
// Here's a great place to add any extra declarations that may be needed.
|
// Here's a great place to add any extra declarations that may be needed.
|
||||||
// Write out meta data for each @protocol(<expr>).
|
// Write out meta data for each @protocol(<expr>).
|
||||||
for (llvm::SmallPtrSet<ObjCProtocolDecl *,8>::iterator I = ProtocolExprDecls.begin(),
|
for (llvm::SmallPtrSet<ObjCProtocolDecl *,8>::iterator I = ProtocolExprDecls.begin(),
|
||||||
|
|
|
@ -50,3 +50,51 @@ BOOL objc_collectingEnabled();
|
||||||
return *newArray->_list;
|
return *newArray->_list;
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
// Test2
|
||||||
|
@interface Super {
|
||||||
|
int ivar_super_a : 5;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface A : Super {
|
||||||
|
@public
|
||||||
|
int ivar_a : 5;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
int f0(A *a) {
|
||||||
|
return a->ivar_a;
|
||||||
|
}
|
||||||
|
|
||||||
|
@interface A () {
|
||||||
|
@public
|
||||||
|
int ivar_ext_a : 5;
|
||||||
|
int ivar_ext_b : 5;
|
||||||
|
}@end
|
||||||
|
|
||||||
|
int f1(A *a) {
|
||||||
|
return a->ivar_ext_a + a->ivar_a;
|
||||||
|
}
|
||||||
|
|
||||||
|
@interface A () {
|
||||||
|
@public
|
||||||
|
int ivar_ext2_a : 5;
|
||||||
|
int ivar_ext2_b : 5;
|
||||||
|
}@end
|
||||||
|
|
||||||
|
int f2(A* a) {
|
||||||
|
return a->ivar_ext2_a + a->ivar_ext_a + a->ivar_a;
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation A {
|
||||||
|
@public
|
||||||
|
int ivar_b : 5;
|
||||||
|
int ivar_c : 5;
|
||||||
|
int ivar_d : 5;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
int f3(A *a) {
|
||||||
|
return a->ivar_d + a->ivar_ext2_a + a->ivar_ext_a + a->ivar_a;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue