forked from OSchip/llvm-project
[PCH] Serialize info about redeclared objc methods.
llvm-svn: 141964
This commit is contained in:
parent
fc807f84ed
commit
db21596473
|
@ -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())
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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++]);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue