Memoize CGFunctionInfo construction.

llvm-svn: 63576
This commit is contained in:
Daniel Dunbar 2009-02-03 00:07:12 +00:00
parent 7403751e16
commit e0be82956b
3 changed files with 30 additions and 2 deletions

View File

@ -86,7 +86,18 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
const llvm::SmallVector<QualType, 16> &ArgTys) {
return *new CGFunctionInfo(ResTy, ArgTys);
// Lookup or create unique function info.
llvm::FoldingSetNodeID ID;
CGFunctionInfo::Profile(ID, ResTy, ArgTys.begin(), ArgTys.end());
void *InsertPos = 0;
CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos);
if (FI)
return *FI;
FI = new CGFunctionInfo(ResTy, ArgTys);
FunctionInfos.InsertNode(FI, InsertPos);
return *FI;
}
/***/

View File

@ -15,6 +15,7 @@
#ifndef CLANG_CODEGEN_CGCALL_H
#define CLANG_CODEGEN_CGCALL_H
#include <llvm/ADT/FoldingSet.h>
#include "clang/AST/Type.h"
#include "CGValue.h"
@ -49,7 +50,7 @@ namespace CodeGen {
/// CGFunctionInfo - Class to encapsulate the information about a
/// function definition.
class CGFunctionInfo {
class CGFunctionInfo : public llvm::FoldingSetNode {
llvm::SmallVector<QualType, 16> ArgTypes;
public:
@ -62,6 +63,19 @@ namespace CodeGen {
arg_iterator arg_end() const;
QualType getReturnType() const { return ArgTypes[0]; }
void Profile(llvm::FoldingSetNodeID &ID) {
Profile(ID, getReturnType(), arg_begin(), arg_end());
}
template<class Iterator>
static void Profile(llvm::FoldingSetNodeID &ID,
QualType ResTy,
Iterator begin,
Iterator end) {
ResTy.Profile(ID);
for (; begin != end; ++begin)
begin->Profile(ID);
}
};
} // end namespace CodeGen
} // end namespace clang

View File

@ -100,6 +100,9 @@ class CodeGenTypes {
/// field no. This info is populated by record organizer.
llvm::DenseMap<const FieldDecl *, unsigned> FieldInfo;
/// FunctionInfos - Hold memoized CGFunctionInfo results.
llvm::FoldingSet<CGFunctionInfo> FunctionInfos;
public:
class BitFieldInfo {
public: