diff options
author | Devang Patel <dpatel@apple.com> | 2007-10-24 20:38:06 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-10-24 20:38:06 +0000 |
commit | bc50aab635b31e5b6ea905f878333c075dea2142 (patch) | |
tree | 78bf5bc8e7a05b9a01e5f96f0f8a1588171cb4b2 /clang/CodeGen/CodeGenTypes.cpp | |
parent | 4d06391c477b922484d4bd979bfb6c2ea15c4c4a (diff) | |
download | bcm5719-llvm-bc50aab635b31e5b6ea905f878333c075dea2142.tar.gz bcm5719-llvm-bc50aab635b31e5b6ea905f878333c075dea2142.zip |
Move RecordOrganizer into CodeGenTypes.cpp
llvm-svn: 43310
Diffstat (limited to 'clang/CodeGen/CodeGenTypes.cpp')
-rw-r--r-- | clang/CodeGen/CodeGenTypes.cpp | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/clang/CodeGen/CodeGenTypes.cpp b/clang/CodeGen/CodeGenTypes.cpp index ec8b69ecb48..31c76b3306a 100644 --- a/clang/CodeGen/CodeGenTypes.cpp +++ b/clang/CodeGen/CodeGenTypes.cpp @@ -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"); |