[PCH] Serialize info about redeclared objc methods.

llvm-svn: 141964
This commit is contained in:
Argyrios Kyrtzidis 2011-10-14 17:41:52 +00:00
parent fc807f84ed
commit db21596473
5 changed files with 26 additions and 5 deletions

View File

@ -1592,7 +1592,8 @@ public:
/// \brief Get the duplicate declaration of a ObjCMethod in the same
/// interface, or null if non exists.
const ObjCMethodDecl *getObjCMethodRedeclaration(ObjCMethodDecl *MD) const {
const ObjCMethodDecl *getObjCMethodRedeclaration(
const ObjCMethodDecl *MD) const {
llvm::DenseMap<const ObjCMethodDecl*, const ObjCMethodDecl*>::const_iterator
I = ObjCMethodRedecls.find(MD);
if (I == ObjCMethodRedecls.end())

View File

@ -128,9 +128,12 @@ private:
// Method has a definition.
unsigned IsDefined : 1;
// Method redeclaration in the same interface.
/// \brief Method redeclaration in the same interface.
unsigned IsRedeclaration : 1;
/// \brief Is redeclared in the same interface.
mutable unsigned HasRedeclaration : 1;
// NOTE: VC++ treats enums as signed, avoid using ImplementationControl enum
/// @required/@optional
unsigned DeclImplementation : 2;
@ -223,7 +226,7 @@ private:
DeclContext(ObjCMethod), Family(InvalidObjCMethodFamily),
IsInstance(isInstance), IsVariadic(isVariadic),
IsSynthesized(isSynthesized),
IsDefined(isDefined), IsRedeclaration(0),
IsDefined(isDefined), IsRedeclaration(0), HasRedeclaration(0),
DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None),
RelatedResultType(HasRelatedResultType),
SelLocsKind(SelLoc_StandardNoSpace),

View File

@ -355,6 +355,7 @@ void ObjCMethodDecl::setAsRedeclaration(const ObjCMethodDecl *PrevMethod) {
assert(PrevMethod);
getASTContext().setObjCMethodRedeclaration(PrevMethod, this);
IsRedeclaration = true;
PrevMethod->HasRedeclaration = true;
}
void ObjCMethodDecl::setParamsAndSelLocs(ASTContext &C,
@ -398,8 +399,9 @@ void ObjCMethodDecl::setMethodParams(ASTContext &C,
/// Otherwise it will return itself.
ObjCMethodDecl *ObjCMethodDecl::getNextRedeclaration() {
ASTContext &Ctx = getASTContext();
ObjCMethodDecl *Redecl =
const_cast<ObjCMethodDecl*>(Ctx.getObjCMethodRedeclaration(this));
ObjCMethodDecl *Redecl = 0;
if (HasRedeclaration)
Redecl = const_cast<ObjCMethodDecl*>(Ctx.getObjCMethodRedeclaration(this));
if (Redecl)
return Redecl;

View File

@ -482,6 +482,13 @@ void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
MD->setVariadic(Record[Idx++]);
MD->setSynthesized(Record[Idx++]);
MD->setDefined(Record[Idx++]);
MD->IsRedeclaration = Record[Idx++];
MD->HasRedeclaration = Record[Idx++];
if (MD->HasRedeclaration)
Reader.getContext().setObjCMethodRedeclaration(MD,
ReadDeclAs<ObjCMethodDecl>(Record, Idx));
MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]);
MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
MD->SetRelatedResultType(Record[Idx++]);

View File

@ -402,6 +402,14 @@ void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
Record.push_back(D->isVariadic());
Record.push_back(D->isSynthesized());
Record.push_back(D->isDefined());
Record.push_back(D->IsRedeclaration);
Record.push_back(D->HasRedeclaration);
if (D->HasRedeclaration) {
assert(Context.getObjCMethodRedeclaration(D));
Writer.AddDeclRef(Context.getObjCMethodRedeclaration(D), Record);
}
// FIXME: stable encoding for @required/@optional
Record.push_back(D->getImplementationControl());
// FIXME: stable encoding for in/out/inout/bycopy/byref/oneway