sink more of the type related code into CodeGenTypes.
llvm-svn: 46801
This commit is contained in:
parent
8b945ee058
commit
68be60694e
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue