aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenTypes.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-04-22 10:28:39 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-04-22 10:28:39 +0000
commit412f59b23fc502b199b9ca96c72ef5d5ad21d62b (patch)
tree0a359e672859bbb876eb4c96af40d1b8f61b6e8a /lib/CodeGen/CodeGenTypes.cpp
parent84ad77a8f83121713ea69d8002d1fd19565f87ab (diff)
Don't convert interface types (to structs) as part of CodeGenTypes.
- This has pros and cons, but for now the pros seem to significantly outway the con. The con is that we will always need to cast in the runtime implementation to a struct type, if we wish to access an interface directly. The pros are: - Avoid the cost of generating types which are used. Most manipulation of Objective-C objects is done through messages, and only the implementation of a class will directly access memory. Previously, we would convert the type even if it only appear as a function parameter, for example. - We don't need to worry about incomplete types, and UpdateCompletedType for interfaces is gone. - It becomes easier to narrow the interface to the shadow struct for Objective-C interfaces (so it can be eliminated). Currently the runtimes still use the CodeGenTypes machinery to generate the LLVM structure they need via ConvertTagDecl, but this can eventually be replaced. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69797 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenTypes.cpp')
-rw-r--r--lib/CodeGen/CodeGenTypes.cpp42
1 files changed, 7 insertions, 35 deletions
diff --git a/lib/CodeGen/CodeGenTypes.cpp b/lib/CodeGen/CodeGenTypes.cpp
index f8d6436cc4..94853b2e86 100644
--- a/lib/CodeGen/CodeGenTypes.cpp
+++ b/lib/CodeGen/CodeGenTypes.cpp
@@ -197,39 +197,6 @@ void CodeGenTypes::UpdateCompletedType(const TagDecl *TD) {
}
}
-void CodeGenTypes::UpdateCompletedType(const ObjCInterfaceDecl *OID) {
- // Check to see if we have already laid this type out, if not, just return.
- QualType OIDTy = Context.getObjCInterfaceType(OID);
- llvm::DenseMap<Type *, llvm::PATypeHolder>::iterator TCI =
- TypeCache.find(OIDTy.getTypePtr());
- if (TCI == TypeCache.end()) return;
-
- // Remember the opaque LLVM type for this interface.
- llvm::PATypeHolder OpaqueHolder = TCI->second;
- assert(isa<llvm::OpaqueType>(OpaqueHolder.get()) &&
- "Updating compilation of an already non-opaque type?");
-
- // Remove it from TagDeclTypes so that it will be regenerated.
- TypeCache.erase(TCI);
-
- // Update the "shadow" struct that is laid out.
- // FIXME: REMOVE THIS.
- const RecordDecl *RD = Context.addRecordToClass(OID);
- UpdateCompletedType(RD);
-
- // Generate the new type.
- const llvm::Type *NT = ConvertType(OIDTy);
- assert(!isa<llvm::OpaqueType>(NT) && "Didn't do layout!");
-
- // FIXME: Remove this check when shadow structs go away.
- if (isa<llvm::OpaqueType>(OpaqueHolder)) {
-
- // Refine the old opaque type to its new definition.
- cast<llvm::OpaqueType>(OpaqueHolder.get())->refineAbstractTypeTo(NT);
- }
-}
-
-
static const llvm::Type* getTypeForFormat(const llvm::fltSemantics &format) {
if (&format == &llvm::APFloat::IEEEsingle)
return llvm::Type::FloatTy;
@@ -373,8 +340,13 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
}
case Type::ObjCInterface: {
- ObjCInterfaceDecl *ID = cast<ObjCInterfaceType>(Ty).getDecl();
- return ConvertTagDeclType(Context.addRecordToClass(ID));
+ // Objective-C interfaces are always opaque (outside of the
+ // runtime, which can do whatever it likes); we never refine
+ // these.
+ const llvm::Type *&T = InterfaceTypes[cast<ObjCInterfaceType>(&Ty)];
+ if (!T)
+ T = llvm::OpaqueType::get();
+ return T;
}
case Type::ObjCQualifiedId: