#ifndef VALUE_ENUMERATOR_H
#define VALUE_ENUMERATOR_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/Attributes.h"
#include <vector>
namespace llvm {
class Type;
class Value;
class BasicBlock;
class Function;
class Module;
class AttrListPtr;
class TypeSymbolTable;
class ValueSymbolTable;
class ValueEnumerator {
public:
typedef std::vector<std::pair<const Type*, unsigned> > TypeList;
typedef std::vector<std::pair<const Value*, unsigned> > ValueList;
private:
typedef DenseMap<const Type*, unsigned> TypeMapType;
TypeMapType TypeMap;
TypeList Types;
typedef DenseMap<const Value*, unsigned> ValueMapType;
ValueMapType ValueMap;
ValueList Values;
typedef DenseMap<void*, unsigned> AttributeMapType;
AttributeMapType AttributeMap;
std::vector<AttrListPtr> Attributes;
std::vector<const BasicBlock*> BasicBlocks;
unsigned NumModuleValues;
unsigned FirstFuncConstantID;
unsigned FirstInstID;
ValueEnumerator(const ValueEnumerator &); void operator=(const ValueEnumerator &); public:
ValueEnumerator(const Module *M);
unsigned getValueID(const Value *V) const {
ValueMapType::const_iterator I = ValueMap.find(V);
assert(I != ValueMap.end() && "Value not in slotcalculator!");
return I->second-1;
}
unsigned getTypeID(const Type *T) const {
TypeMapType::const_iterator I = TypeMap.find(T);
assert(I != TypeMap.end() && "Type not in ValueEnumerator!");
return I->second-1;
}
unsigned getAttributeID(const AttrListPtr &PAL) const {
if (PAL.isEmpty()) return 0; AttributeMapType::const_iterator I = AttributeMap.find(PAL.getRawPointer());
assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!");
return I->second;
}
void getFunctionConstantRange(unsigned &Start, unsigned &End) const {
Start = FirstFuncConstantID;
End = FirstInstID;
}
const ValueList &getValues() const { return Values; }
const TypeList &getTypes() const { return Types; }
const std::vector<const BasicBlock*> &getBasicBlocks() const {
return BasicBlocks;
}
const std::vector<AttrListPtr> &getAttributes() const {
return Attributes;
}
int PurgeAggregateValues();
void incorporateFunction(const Function &F);
void purgeFunction();
private:
void OptimizeConstants(unsigned CstStart, unsigned CstEnd);
void EnumerateValue(const Value *V);
void EnumerateType(const Type *T);
void EnumerateOperandType(const Value *V);
void EnumerateAttributes(const AttrListPtr &PAL);
void EnumerateTypeSymbolTable(const TypeSymbolTable &ST);
void EnumerateValueSymbolTable(const ValueSymbolTable &ST);
};
}
#endif