Constify methods and reuse RecordOrganizer object.

llvm-svn: 43284
This commit is contained in:
Devang Patel 2007-10-24 00:56:23 +00:00
parent 790afb0444
commit ea37aa7d64
4 changed files with 21 additions and 12 deletions

View File

@ -127,7 +127,7 @@ void CodeGenFunction::StartBlock(const char *N) {
} }
/// getRecordLayoutInfo - Return record layout info. /// getRecordLayoutInfo - Return record layout info.
RecordLayoutInfo *CodeGenFunction::getRecordLayoutInfo(CodeGenTypes &CGT, const RecordLayoutInfo *CodeGenFunction::getRecordLayoutInfo(CodeGenTypes &CGT,
QualType RTy) { QualType RTy) {
assert (isa<RecordType>(RTy) assert (isa<RecordType>(RTy)
&& "Unexpected type. RecordType expected here."); && "Unexpected type. RecordType expected here.");

View File

@ -299,7 +299,7 @@ public:
void StartBlock(const char *N); void StartBlock(const char *N);
/// getRecordLayoutInfo - Return record layout info. /// getRecordLayoutInfo - Return record layout info.
RecordLayoutInfo *getRecordLayoutInfo(CodeGenTypes &CGT, QualType RTy); const RecordLayoutInfo *getRecordLayoutInfo(CodeGenTypes &CGT, QualType RTy);
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
// Declaration Emission // Declaration Emission
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//

View File

@ -182,13 +182,13 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) {
RecordTypesToResolve[RD] = OpaqueTy; RecordTypesToResolve[RD] = OpaqueTy;
// Layout fields. // Layout fields.
RecordOrganizer *RO = new RecordOrganizer(); RecordOrganizer RO;
for (unsigned i = 0, e = RD->getNumMembers(); i != e; ++i) for (unsigned i = 0, e = RD->getNumMembers(); i != e; ++i)
RO->addField(RD->getMember(i)); RO.addField(RD->getMember(i));
RO->layoutFields(*this); RO.layoutFields(*this);
// Get llvm::StructType. // Get llvm::StructType.
RecordLayoutInfo *RLI = new RecordLayoutInfo(RO); RecordLayoutInfo *RLI = new RecordLayoutInfo(&RO);
ResultType = RLI->getLLVMType(); ResultType = RLI->getLLVMType();
RecordLayouts[ResultType] = RLI; RecordLayouts[ResultType] = RLI;
@ -199,7 +199,7 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) {
&& "Expected RecordDecl in RecordTypesToResolve"); && "Expected RecordDecl in RecordTypesToResolve");
RecordTypesToResolve.erase(OpaqueI); RecordTypesToResolve.erase(OpaqueI);
delete RO; RO.clear();
} else if (TD->getKind() == Decl::Union) { } else if (TD->getKind() == Decl::Union) {
const RecordDecl *RD = cast<const RecordDecl>(TD); const RecordDecl *RD = cast<const RecordDecl>(TD);
// Just use the largest element of the union, breaking ties with the // Just use the largest element of the union, breaking ties with the
@ -260,13 +260,14 @@ unsigned CodeGenTypes::getLLVMFieldNo(const FieldDecl *FD) {
return I->second; return I->second;
} }
/// addFieldInfo - Assign field number to field FD. /// addFieldInfo - Assign field number to field FD.
void CodeGenTypes::addFieldInfo(const FieldDecl *FD, unsigned No) { void CodeGenTypes::addFieldInfo(const FieldDecl *FD, unsigned No) {
FieldInfo[FD] = No; FieldInfo[FD] = No;
} }
/// getRecordLayoutInfo - Return record layout info for the given llvm::Type. /// getRecordLayoutInfo - Return record layout info for the given llvm::Type.
RecordLayoutInfo *CodeGenTypes::getRecordLayoutInfo(const llvm::Type* Ty) { const RecordLayoutInfo *
CodeGenTypes::getRecordLayoutInfo(const llvm::Type* Ty) const {
llvm::DenseMap<const llvm::Type*, RecordLayoutInfo *>::iterator I llvm::DenseMap<const llvm::Type*, RecordLayoutInfo *>::iterator I
= RecordLayouts.find(Ty); = RecordLayouts.find(Ty);
assert (I != RecordLayouts.end() assert (I != RecordLayouts.end()
@ -315,3 +316,9 @@ void RecordOrganizer::layoutFields(CodeGenTypes &CGT) {
} }
STy = llvm::StructType::get(Fields); STy = llvm::StructType::get(Fields);
} }
/// Clear private data so that this object can be reused.
void RecordOrganizer::clear() {
STy = NULL;
FieldDecls.clear();
}

View File

@ -58,10 +58,12 @@ namespace CodeGen {
/// getLLVMType - Return associated llvm struct type. This may be NULL /// getLLVMType - Return associated llvm struct type. This may be NULL
/// if fields are not laid out. /// if fields are not laid out.
llvm::Type *getLLVMType() { llvm::Type *getLLVMType() const {
return STy; return STy;
} }
/// Clear private data so that this object can be reused.
void clear();
private: private:
llvm::Type *STy; llvm::Type *STy;
llvm::SmallVector<const FieldDecl *, 8> FieldDecls; llvm::SmallVector<const FieldDecl *, 8> FieldDecls;
@ -75,7 +77,7 @@ namespace CodeGen {
RecordLayoutInfo(RecordOrganizer *RO); RecordLayoutInfo(RecordOrganizer *RO);
/// getLLVMType - Return llvm type associated with this record. /// getLLVMType - Return llvm type associated with this record.
llvm::Type *getLLVMType() { llvm::Type *getLLVMType() const {
return STy; return STy;
} }
@ -117,7 +119,7 @@ public:
void DecodeArgumentTypes(const FunctionTypeProto &FTP, void DecodeArgumentTypes(const FunctionTypeProto &FTP,
std::vector<const llvm::Type*> &ArgTys); std::vector<const llvm::Type*> &ArgTys);
RecordLayoutInfo *getRecordLayoutInfo(const llvm::Type*); const RecordLayoutInfo *getRecordLayoutInfo(const llvm::Type*) const;
/// getLLVMFieldNo - Return llvm::StructType element number /// getLLVMFieldNo - Return llvm::StructType element number
/// that corresponds to the field FD. /// that corresponds to the field FD.