Move RecordOrganizer into CodeGenTypes.cpp

llvm-svn: 43310
This commit is contained in:
Devang Patel 2007-10-24 20:38:06 +00:00
parent 4d06391c47
commit bc50aab635
2 changed files with 40 additions and 45 deletions

View File

@ -20,6 +20,41 @@
using namespace clang;
using namespace CodeGen;
namespace {
/// RecordOrganizer - This helper class, used by RecordLayoutInfo, layouts
/// structs and unions. It manages transient information used during layout.
/// FIXME : At the moment assume
/// - one to one mapping between AST FieldDecls and
/// llvm::StructType elements.
/// - Ignore bit fields
/// - Ignore field aligments
/// - Ignore packed structs
class RecordOrganizer {
public:
RecordOrganizer() : STy(NULL) {}
/// addField - Add new field.
void addField(const FieldDecl *FD);
/// layoutFields - Do the actual work and lay out all fields. Create
/// corresponding llvm struct type. This should be invoked only after
/// all fields are added.
void layoutFields(CodeGenTypes &CGT);
/// getLLVMType - Return associated llvm struct type. This may be NULL
/// if fields are not laid out.
llvm::Type *getLLVMType() const {
return STy;
}
/// Clear private data so that this object can be reused.
void clear();
private:
llvm::Type *STy;
llvm::SmallVector<const FieldDecl *, 8> FieldDecls;
};
}
CodeGenTypes::CodeGenTypes(ASTContext &Ctx, llvm::Module& M)
: Context(Ctx), Target(Ctx.Target), TheModule(M) {
}
@ -188,7 +223,7 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) {
RO.layoutFields(*this);
// Get llvm::StructType.
RecordLayoutInfo *RLI = new RecordLayoutInfo(&RO);
RecordLayoutInfo *RLI = new RecordLayoutInfo(RO.getLLVMType());
ResultType = RLI->getLLVMType();
RecordLayouts[ResultType] = RLI;
@ -275,16 +310,6 @@ CodeGenTypes::getRecordLayoutInfo(const llvm::Type* Ty) const {
return I->second;
}
/// RecordLayoutInfo - Construct record layout info object using layout
/// organized by record organizer.
RecordLayoutInfo::RecordLayoutInfo(RecordOrganizer *RO) {
STy = RO->getLLVMType();
assert (STy && "Record layout is incomplete to determine llvm::Type");
// FIXME : Collect info about fields that requires adjustments
// (i.e. fields that do not directly map to llvm struct fields.)
}
/// addField - Add new field.
void RecordOrganizer::addField(const FieldDecl *FD) {
assert (!STy && "Record fields are already laid out");

View File

@ -36,45 +36,15 @@ namespace clang {
namespace CodeGen {
class CodeGenTypes;
/// RecordOrganizer - This helper class, used by RecordLayoutInfo, layouts
/// structs and unions. It manages transient information used during layout.
/// FIXME : At the moment assume
/// - one to one mapping between AST FieldDecls and
/// llvm::StructType elements.
/// - Ignore bit fields
/// - Ignore field aligments
/// - Ignore packed structs
class RecordOrganizer {
public:
RecordOrganizer() : STy(NULL) {}
/// addField - Add new field.
void addField(const FieldDecl *FD);
/// layoutFields - Do the actual work and lay out all fields. Create
/// corresponding llvm struct type. This should be invoked only after
/// all fields are added.
void layoutFields(CodeGenTypes &CGT);
/// getLLVMType - Return associated llvm struct type. This may be NULL
/// if fields are not laid out.
llvm::Type *getLLVMType() const {
return STy;
}
/// Clear private data so that this object can be reused.
void clear();
private:
llvm::Type *STy;
llvm::SmallVector<const FieldDecl *, 8> FieldDecls;
};
/// RecordLayoutInfo - This class handles struct and union layout info while
/// lowering AST types to LLVM types.
class RecordLayoutInfo {
RecordLayoutInfo(); // DO NOT IMPLEMENT
public:
RecordLayoutInfo(RecordOrganizer *RO);
RecordLayoutInfo(llvm::Type *T) : STy(T) {
// FIXME : Collect info about fields that requires adjustments
// (i.e. fields that do not directly map to llvm struct fields.)
}
/// getLLVMType - Return llvm type associated with this record.
llvm::Type *getLLVMType() const {