Revert r151049 cos it broke the buildbots.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151052 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jay Foad
2012-02-21 11:44:46 +00:00
parent c5f18d34c3
commit e6e258fe38
2 changed files with 34 additions and 131 deletions

View File

@@ -29,7 +29,6 @@
#include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringMap.h"
#include "llvm/ADT/Hashing.h"
#include <vector> #include <vector>
namespace llvm { namespace llvm {
@@ -90,107 +89,6 @@ struct DenseMapAPFloatKeyInfo {
} }
}; };
struct AnonStructTypeKeyInfo {
struct KeyTy {
ArrayRef<Type*> ETypes;
bool isPacked;
KeyTy(const ArrayRef<Type*>& E, bool P) :
ETypes(E), isPacked(P) {}
KeyTy(const KeyTy& that) :
ETypes(that.ETypes), isPacked(that.isPacked) {}
KeyTy(const StructType* ST) :
ETypes(ArrayRef<Type*>(ST->element_begin(), ST->element_end())),
isPacked(ST->isPacked()) {}
bool operator==(const KeyTy& that) const {
if (isPacked != that.isPacked)
return false;
if (ETypes != that.ETypes)
return false;
return true;
}
bool operator!=(const KeyTy& that) const {
return !this->operator==(that);
}
};
static inline StructType* getEmptyKey() {
return DenseMapInfo<StructType*>::getEmptyKey();
}
static inline StructType* getTombstoneKey() {
return DenseMapInfo<StructType*>::getTombstoneKey();
}
static unsigned getHashValue(const KeyTy& Key) {
GeneralHash Hash;
Hash.add(Key.ETypes);
Hash.add(Key.isPacked);
return Hash.finish();
}
static unsigned getHashValue(const StructType *ST) {
return getHashValue(KeyTy(ST));
}
static bool isEqual(const KeyTy& LHS, const StructType *RHS) {
if (RHS == getEmptyKey() || RHS == getTombstoneKey())
return false;
return LHS == KeyTy(RHS);
}
static bool isEqual(const StructType *LHS, const StructType *RHS) {
return LHS == RHS;
}
};
struct FunctionTypeKeyInfo {
struct KeyTy {
const Type *ReturnType;
ArrayRef<Type*> Params;
bool isVarArg;
KeyTy(const Type* R, const ArrayRef<Type*>& P, bool V) :
ReturnType(R), Params(P), isVarArg(V) {}
KeyTy(const KeyTy& that) :
ReturnType(that.ReturnType),
Params(that.Params),
isVarArg(that.isVarArg) {}
KeyTy(const FunctionType* FT) :
ReturnType(FT->getReturnType()),
Params(ArrayRef<Type*>(FT->param_begin(), FT->param_end())),
isVarArg(FT->isVarArg()) {}
bool operator==(const KeyTy& that) const {
if (ReturnType != that.ReturnType)
return false;
if (isVarArg != that.isVarArg)
return false;
if (Params != that.Params)
return false;
return true;
}
bool operator!=(const KeyTy& that) const {
return !this->operator==(that);
}
};
static inline FunctionType* getEmptyKey() {
return DenseMapInfo<FunctionType*>::getEmptyKey();
}
static inline FunctionType* getTombstoneKey() {
return DenseMapInfo<FunctionType*>::getTombstoneKey();
}
static unsigned getHashValue(const KeyTy& Key) {
GeneralHash Hash;
Hash.add(Key.ReturnType);
Hash.add(Key.Params);
Hash.add(Key.isVarArg);
return Hash.finish();
}
static unsigned getHashValue(const FunctionType *FT) {
return getHashValue(KeyTy(FT));
}
static bool isEqual(const KeyTy& LHS, const FunctionType *RHS) {
if (RHS == getEmptyKey() || RHS == getTombstoneKey())
return false;
return LHS == KeyTy(RHS);
}
static bool isEqual(const FunctionType *LHS, const FunctionType *RHS) {
return LHS == RHS;
}
};
/// DebugRecVH - This is a CallbackVH used to keep the Scope -> index maps /// DebugRecVH - This is a CallbackVH used to keep the Scope -> index maps
/// up to date as MDNodes mutate. This class is implemented in DebugLoc.cpp. /// up to date as MDNodes mutate. This class is implemented in DebugLoc.cpp.
class DebugRecVH : public CallbackVH { class DebugRecVH : public CallbackVH {
@@ -282,10 +180,9 @@ public:
DenseMap<unsigned, IntegerType*> IntegerTypes; DenseMap<unsigned, IntegerType*> IntegerTypes;
typedef DenseMap<FunctionType*, bool, FunctionTypeKeyInfo> FunctionTypeMap; // TODO: Optimize FunctionTypes/AnonStructTypes!
FunctionTypeMap FunctionTypes; std::map<std::vector<Type*>, FunctionType*> FunctionTypes;
typedef DenseMap<StructType*, bool, AnonStructTypeKeyInfo> StructTypeMap; std::map<std::vector<Type*>, StructType*> AnonStructTypes;
StructTypeMap AnonStructTypes;
StringMap<StructType*> NamedStructTypes; StringMap<StructType*> NamedStructTypes;
unsigned NamedStructTypesUniqueID; unsigned NamedStructTypesUniqueID;

View File

@@ -390,20 +390,24 @@ FunctionType::FunctionType(Type *Result, ArrayRef<Type*> Params,
// FunctionType::get - The factory function for the FunctionType class. // FunctionType::get - The factory function for the FunctionType class.
FunctionType *FunctionType::get(Type *ReturnType, FunctionType *FunctionType::get(Type *ReturnType,
ArrayRef<Type*> Params, bool isVarArg) { ArrayRef<Type*> Params, bool isVarArg) {
// TODO: This is brutally slow.
unsigned ParamsSize = Params.size();
std::vector<Type*> Key;
Key.reserve(ParamsSize + 2);
Key.push_back(const_cast<Type*>(ReturnType));
for (unsigned i = 0, e = ParamsSize; i != e; ++i)
Key.push_back(const_cast<Type*>(Params[i]));
if (isVarArg)
Key.push_back(0);
LLVMContextImpl *pImpl = ReturnType->getContext().pImpl; LLVMContextImpl *pImpl = ReturnType->getContext().pImpl;
FunctionTypeKeyInfo::KeyTy Key(ReturnType, Params, isVarArg); FunctionType *&FT = pImpl->FunctionTypes[Key];
LLVMContextImpl::FunctionTypeMap::iterator I =
pImpl->FunctionTypes.find_as(Key); if (FT == 0) {
FunctionType *FT;
if (I == pImpl->FunctionTypes.end()) {
FT = (FunctionType*) pImpl->TypeAllocator. FT = (FunctionType*) pImpl->TypeAllocator.
Allocate(sizeof(FunctionType) + sizeof(Type*) * (Params.size() + 1), Allocate(sizeof(FunctionType) + sizeof(Type*) * (ParamsSize + 1),
AlignOf<FunctionType>::Alignment); AlignOf<FunctionType>::Alignment);
new (FT) FunctionType(ReturnType, Params, isVarArg); new (FT) FunctionType(ReturnType, Params, isVarArg);
pImpl->FunctionTypes[FT] = true;
} else {
FT = I->first;
} }
return FT; return FT;
@@ -436,22 +440,24 @@ bool FunctionType::isValidArgumentType(Type *ArgTy) {
StructType *StructType::get(LLVMContext &Context, ArrayRef<Type*> ETypes, StructType *StructType::get(LLVMContext &Context, ArrayRef<Type*> ETypes,
bool isPacked) { bool isPacked) {
LLVMContextImpl *pImpl = Context.pImpl; // FIXME: std::vector is horribly inefficient for this probe.
AnonStructTypeKeyInfo::KeyTy Key(ETypes, isPacked); unsigned ETypesSize = ETypes.size();
LLVMContextImpl::StructTypeMap::iterator I = std::vector<Type*> Key(ETypesSize);
pImpl->AnonStructTypes.find_as(Key); for (unsigned i = 0, e = ETypesSize; i != e; ++i) {
StructType *ST; assert(isValidElementType(ETypes[i]) &&
"Invalid type for structure element!");
if (I == pImpl->AnonStructTypes.end()) { Key[i] = ETypes[i];
// Value not found. Create a new type!
ST = new (Context.pImpl->TypeAllocator) StructType(Context);
ST->setSubclassData(SCDB_IsLiteral); // Literal struct.
ST->setBody(ETypes, isPacked);
Context.pImpl->AnonStructTypes[ST] = true;
} else {
ST = I->first;
} }
if (isPacked)
Key.push_back(0);
StructType *&ST = Context.pImpl->AnonStructTypes[Key];
if (ST) return ST;
// Value not found. Create a new type!
ST = new (Context.pImpl->TypeAllocator) StructType(Context);
ST->setSubclassData(SCDB_IsLiteral); // Literal struct.
ST->setBody(ETypes, isPacked);
return ST; return ST;
} }