forked from OSchip/llvm-project
parent
3434d492b3
commit
e49e9c3a52
|
@ -97,10 +97,6 @@ class ASTContext {
|
||||||
|
|
||||||
llvm::DenseMap<unsigned, FixedWidthIntType*> SignedFixedWidthIntTypes;
|
llvm::DenseMap<unsigned, FixedWidthIntType*> SignedFixedWidthIntTypes;
|
||||||
llvm::DenseMap<unsigned, FixedWidthIntType*> UnsignedFixedWidthIntTypes;
|
llvm::DenseMap<unsigned, FixedWidthIntType*> UnsignedFixedWidthIntTypes;
|
||||||
|
|
||||||
// FIXME: ASTRecordForInterface/ASTFieldForIvarRef and addRecordToClass and
|
|
||||||
// getFieldDecl be part of the backend (i.e. CodeGenTypes)?
|
|
||||||
llvm::DenseMap<const ObjCInterfaceDecl*, RecordDecl*> ASTRecordForInterface;
|
|
||||||
|
|
||||||
/// BuiltinVaListType - built-in va list type.
|
/// BuiltinVaListType - built-in va list type.
|
||||||
/// This is initially null and set by Sema::LazilyCreateBuiltin when
|
/// This is initially null and set by Sema::LazilyCreateBuiltin when
|
||||||
|
@ -539,7 +535,6 @@ public:
|
||||||
const ASTRecordLayout &
|
const ASTRecordLayout &
|
||||||
getASTObjCImplementationLayout(const ObjCImplementationDecl *D);
|
getASTObjCImplementationLayout(const ObjCImplementationDecl *D);
|
||||||
|
|
||||||
const RecordDecl *addRecordToClass(const ObjCInterfaceDecl *D);
|
|
||||||
void CollectObjCIvars(const ObjCInterfaceDecl *OI,
|
void CollectObjCIvars(const ObjCInterfaceDecl *OI,
|
||||||
llvm::SmallVectorImpl<FieldDecl*> &Fields);
|
llvm::SmallVectorImpl<FieldDecl*> &Fields);
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace clang {
|
||||||
/// This class contains layout information for one RecordDecl,
|
/// This class contains layout information for one RecordDecl,
|
||||||
/// which is a struct/union/class. The decl represented must be a definition,
|
/// which is a struct/union/class. The decl represented must be a definition,
|
||||||
/// not a forward declaration.
|
/// not a forward declaration.
|
||||||
/// This class is also used to contain layout informaiton for one
|
/// This class is also used to contain layout information for one
|
||||||
/// ObjCInterfaceDecl. FIXME - Find appropriate name.
|
/// ObjCInterfaceDecl. FIXME - Find appropriate name.
|
||||||
/// These objects are managed by ASTContext.
|
/// These objects are managed by ASTContext.
|
||||||
class ASTRecordLayout {
|
class ASTRecordLayout {
|
||||||
|
|
|
@ -71,15 +71,6 @@ ASTContext::~ASTContext() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
llvm::DenseMap<const ObjCInterfaceDecl*, RecordDecl*>::iterator
|
|
||||||
I = ASTRecordForInterface.begin(), E = ASTRecordForInterface.end();
|
|
||||||
while (I != E) {
|
|
||||||
RecordDecl *R = (I++)->second;
|
|
||||||
R->Destroy(*this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destroy nested-name-specifiers.
|
// Destroy nested-name-specifiers.
|
||||||
for (llvm::FoldingSet<NestedNameSpecifier>::iterator
|
for (llvm::FoldingSet<NestedNameSpecifier>::iterator
|
||||||
NNS = NestedNameSpecifiers.begin(),
|
NNS = NestedNameSpecifiers.begin(),
|
||||||
|
@ -676,7 +667,10 @@ static void CollectLocalObjCIvars(ASTContext *Ctx,
|
||||||
if (!IVDecl->isInvalidDecl())
|
if (!IVDecl->isInvalidDecl())
|
||||||
Fields.push_back(cast<FieldDecl>(IVDecl));
|
Fields.push_back(cast<FieldDecl>(IVDecl));
|
||||||
}
|
}
|
||||||
// look into properties.
|
// Look into properties.
|
||||||
|
//
|
||||||
|
// FIXME: This needs to go away, synthesized ivars shouldn't be
|
||||||
|
// accessible from the interface decl.
|
||||||
for (ObjCInterfaceDecl::prop_iterator I = OI->prop_begin(*Ctx),
|
for (ObjCInterfaceDecl::prop_iterator I = OI->prop_begin(*Ctx),
|
||||||
E = OI->prop_end(*Ctx); I != E; ++I) {
|
E = OI->prop_end(*Ctx); I != E; ++I) {
|
||||||
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
|
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
|
||||||
|
@ -691,51 +685,6 @@ void ASTContext::CollectObjCIvars(const ObjCInterfaceDecl *OI,
|
||||||
CollectLocalObjCIvars(this, OI, Fields);
|
CollectLocalObjCIvars(this, OI, Fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// addRecordToClass - produces record info. for the class for its
|
|
||||||
/// ivars and all those inherited.
|
|
||||||
///
|
|
||||||
const RecordDecl *ASTContext::addRecordToClass(const ObjCInterfaceDecl *D) {
|
|
||||||
assert(!D->isForwardDecl() && "Invalid decl!");
|
|
||||||
|
|
||||||
RecordDecl *&RD = ASTRecordForInterface[D];
|
|
||||||
if (RD)
|
|
||||||
return RD;
|
|
||||||
|
|
||||||
llvm::SmallVector<FieldDecl*, 32> RecFields;
|
|
||||||
CollectLocalObjCIvars(this, D, RecFields);
|
|
||||||
|
|
||||||
RD = RecordDecl::Create(*this, TagDecl::TK_struct, 0, D->getLocation(),
|
|
||||||
D->getIdentifier());
|
|
||||||
const RecordDecl *SRD;
|
|
||||||
if (const ObjCInterfaceDecl *SuperClass = D->getSuperClass()) {
|
|
||||||
SRD = addRecordToClass(SuperClass);
|
|
||||||
} else {
|
|
||||||
SRD = RecordDecl::Create(*this, TagDecl::TK_struct, 0, SourceLocation(), 0);
|
|
||||||
const_cast<RecordDecl*>(SRD)->completeDefinition(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
RD->addDecl(*this,
|
|
||||||
FieldDecl::Create(*this, RD,
|
|
||||||
SourceLocation(),
|
|
||||||
0,
|
|
||||||
getTagDeclType(const_cast<RecordDecl*>(SRD)),
|
|
||||||
0, false));
|
|
||||||
|
|
||||||
/// FIXME! Can do collection of ivars and adding to the record while
|
|
||||||
/// doing it.
|
|
||||||
for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
|
|
||||||
RD->addDecl(*this,
|
|
||||||
FieldDecl::Create(*this, RD,
|
|
||||||
RecFields[i]->getLocation(),
|
|
||||||
RecFields[i]->getIdentifier(),
|
|
||||||
RecFields[i]->getType(),
|
|
||||||
RecFields[i]->getBitWidth(), false));
|
|
||||||
}
|
|
||||||
|
|
||||||
RD->completeDefinition(*this);
|
|
||||||
return RD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// getInterfaceLayoutImpl - Get or compute information about the
|
/// getInterfaceLayoutImpl - Get or compute information about the
|
||||||
/// layout of the given interface.
|
/// layout of the given interface.
|
||||||
///
|
///
|
||||||
|
|
Loading…
Reference in New Issue