sink more of the type related code into CodeGenTypes.

llvm-svn: 46801
This commit is contained in:
Chris Lattner 2008-02-06 05:08:19 +00:00
parent 8b945ee058
commit 68be60694e
5 changed files with 18 additions and 30 deletions

View File

@ -261,24 +261,9 @@ void CodeGenModule::EmitGlobalVarDeclarator(const FileVarDecl *D) {
EmitGlobalVar(D);
}
void CodeGenModule::EmitType(const TypeDecl *D) {
if (isa<TypedefDecl>(D)) {
// TODO: Emit debug info.
return;
}
assert(!isa<ObjCInterfaceDecl>(D) && "FIXME: ADD OBJC SUPPORT");
// This must be a tag decl.
const TagDecl *TD = cast<TagDecl>(D);
// Get the LLVM type for this TagDecl. If it is non-opaque or if this decl
// is still a forward declaration, just return.
QualType NewTy = Context.getTagDeclType(const_cast<TagDecl *>(TD));
const llvm::Type *T = Types.ConvertType(NewTy);
if (isa<llvm::OpaqueType>(T) && TD->isDefinition())
// Make sure that this type is translated.
Types.ForceTypeCompilation(NewTy);
void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
// Make sure that this type is translated.
Types.UpdateCompletedType(TD);
}

View File

@ -88,7 +88,7 @@ public:
void EmitFunction(const FunctionDecl *FD);
void EmitGlobalVar(const FileVarDecl *D);
void EmitGlobalVarDeclarator(const FileVarDecl *D);
void EmitType(const TypeDecl *D);
void UpdateCompletedType(const TagDecl *D);
llvm::Constant *EmitGlobalInit(const Expr *E);
llvm::Constant *EmitConstantExpr(const Expr *E);

View File

@ -125,11 +125,15 @@ const llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T) {
}
/// ForceTypeCompilation - When we find the definition for a type, we require
/// it to be recompiled, to update the lazy understanding of what it is in our
/// maps.
void CodeGenTypes::ForceTypeCompilation(QualType T) {
const TagDecl *TD = cast<TagType>(T)->getDecl();
/// UpdateCompletedType - When we find the full definition for a TagDecl,
/// replace the 'opaque' type we previously made for it if applicable.
void CodeGenTypes::UpdateCompletedType(const TagDecl *TD) {
// Get the LLVM type for this TagDecl. If it is non-opaque or if this decl
// is still a forward declaration, just return.
QualType NewTy = Context.getTagDeclType(const_cast<TagDecl *>(TD));
const llvm::Type *T = ConvertType(NewTy);
if (!isa<llvm::OpaqueType>(T))
return;
// Remember the opaque LLVM type for this tagdecl.
llvm::DenseMap<const TagDecl*, llvm::PATypeHolder>::iterator TDTI =
@ -141,7 +145,7 @@ void CodeGenTypes::ForceTypeCompilation(QualType T) {
// Remove it from TagDeclTypes so that it will be regenerated.
TagDeclTypes.erase(TDTI);
const llvm::Type *NT = ConvertNewType(T);
const llvm::Type *NT = ConvertNewType(NewTy);
// If getting the type didn't itself refine it, refine it to its actual type
// now.

View File

@ -138,10 +138,9 @@ public:
unsigned getLLVMFieldNo(const FieldDecl *FD);
/// ForceTypeCompilation - When we find the definition for a type, we require
/// it to be recompiled, to update the lazy understanding of what it is in our
/// maps.
void ForceTypeCompilation(QualType T);
/// UpdateCompletedType - When we find the full definition for a TagDecl,
/// replace the 'opaque' type we previously made for it if applicable.
void UpdateCompletedType(const TagDecl *TD);
public: // These are internal details of CGT that shouldn't be used externally.
void DecodeArgumentTypes(const FunctionTypeProto &FTP,

View File

@ -81,7 +81,7 @@ namespace {
/// hack on the type, which can occur at any point in the file (because these
/// can be defined in declspecs).
virtual void HandleTagDeclDefinition(TagDecl *D) {
Builder->EmitType(D);
Builder->UpdateCompletedType(D);
}
};