14 #ifndef LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H
15 #define LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H
35 class LocalAsMetadata;
40 class ValueSymbolTable;
49 typedef std::vector<std::pair<const Value*, unsigned> >
ValueList;
65 std::vector<const Metadata *> MDs;
66 std::vector<const Metadata *> FunctionMDs;
74 explicit MDIndex(
unsigned F) :
F(F) {}
77 bool hasDifferentFunction(
unsigned NewF)
const {
return F && F != NewF; }
81 assert(
ID &&
"Expected non-zero ID");
82 assert(
ID <= MDs.size() &&
"Expected valid ID");
88 MetadataMapType MetadataMap;
96 unsigned NumStrings = 0;
99 explicit MDRange(
unsigned First) : First(First) {}
101 SmallDenseMap<unsigned, MDRange, 1> FunctionMDInfo;
103 bool ShouldPreserveUseListOrder;
105 typedef DenseMap<AttributeSet, unsigned> AttributeGroupMapType;
106 AttributeGroupMapType AttributeGroupMap;
107 std::vector<AttributeSet> AttributeGroups;
109 typedef DenseMap<AttributeSet, unsigned> AttributeMapType;
110 AttributeMapType AttributeMap;
111 std::vector<AttributeSet> Attribute;
115 mutable DenseMap<const BasicBlock*, unsigned> GlobalBasicBlockIDs;
117 typedef DenseMap<const Instruction*, unsigned> InstructionMapType;
118 InstructionMapType InstructionMap;
119 unsigned InstructionCount;
123 std::vector<const BasicBlock*> BasicBlocks;
127 unsigned NumModuleValues;
131 unsigned NumModuleMDs = 0;
132 unsigned NumMDStrings = 0;
134 unsigned FirstFuncConstantID;
135 unsigned FirstInstID;
137 ValueEnumerator(
const ValueEnumerator &) =
delete;
138 void operator=(
const ValueEnumerator &) =
delete;
140 ValueEnumerator(
const Module &M,
bool ShouldPreserveUseListOrder);
143 void print(raw_ostream &OS,
const ValueMapType &Map,
const char *
Name)
const;
144 void print(raw_ostream &OS,
const MetadataMapType &Map,
145 const char *
Name)
const;
150 assert(
ID != 0 &&
"Metadata not in slotcalculator!");
154 return MetadataMap.
lookup(MD).ID;
156 unsigned numMDs()
const {
return MDs.size(); }
162 assert(I != TypeMap.
end() &&
"Type not in ValueEnumerator!");
172 assert(I != AttributeMap.
end() &&
"Attribute not in ValueEnumerator!");
179 assert(I != AttributeGroupMap.
end() &&
"Attribute not in ValueEnumerator!");
186 Start = FirstFuncConstantID;
193 bool hasMDs()
const {
return NumModuleMDs < MDs.size(); }
197 return makeArrayRef(MDs).slice(NumModuleMDs, NumMDStrings);
202 return makeArrayRef(MDs).slice(NumModuleMDs).slice(NumMDStrings);
213 return AttributeGroups;
232 void OptimizeConstants(
unsigned CstStart,
unsigned CstEnd);
238 void organizeMetadata();
247 void incorporateFunctionMetadata(
const Function &
F);
258 unsigned getMetadataFunctionID(
const Function *
F)
const;
276 void EnumerateMetadata(
unsigned F,
const Metadata *MD);
279 void EnumerateFunctionLocalMetadata(
const Function &
F,
281 void EnumerateFunctionLocalMetadata(
unsigned F,
const LocalAsMetadata *Local);
283 void EnumerateValue(
const Value *V);
284 void EnumerateType(
Type *
T);
285 void EnumerateOperandType(
const Value *V);
289 void EnumerateNamedMetadata(
const Module &M);
ArrayRef< const Metadata * > getNonMDStrings() const
Get the non-MDString metadata for this block.
This class provides a symbol table of name/value pairs.
const ComdatSetType & getComdats() const
ValueT lookup(const KeyT &Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
A Module instance is used to store all the information related to an LLVM module. ...
void setInstructionID(const Instruction *I)
std::vector< std::pair< const Value *, unsigned > > ValueList
void incorporateFunction(const Function &F)
incorporateFunction/purgeFunction - If you'd like to deal with a function, use these two methods to g...
ArrayRef< const Metadata * > getMDStrings() const
Get the MDString metadata for this block.
unsigned getComdatID(const Comdat *C) const
bool hasMDs() const
Check whether the current block has any metadata to emit.
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
std::vector< UseListOrder > UseListOrderStack
This file contains the simple types necessary to represent the attributes associated with functions a...
uint64_t computeBitsRequiredForTypeIndicies() const
unsigned getAttributeID(AttributeSet PAL) const
const TypeList & getTypes() const
unsigned getInstructionID(const Instruction *I) const
unsigned getValueID(const Value *V) const
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
void getFunctionConstantRange(unsigned &Start, unsigned &End) const
getFunctionConstantRange - Return the range of values that corresponds to function-local constants...
const ValueList & getValues() const
bool shouldPreserveUseListOrder() const
const std::vector< AttributeSet > & getAttributes() const
unsigned getTypeID(Type *T) const
LLVM Basic Block Representation.
The instances of the Type class are immutable: once they are created, they are never changed...
unsigned getAttributeGroupID(AttributeSet PAL) const
static const unsigned End
const std::vector< AttributeSet > & getAttributeGroups() const
const std::vector< const BasicBlock * > & getBasicBlocks() const
static GCRegistry::Add< ShadowStackGC > C("shadow-stack","Very portable GC for uncooperative code generators")
unsigned getMetadataID(const Metadata *MD) const
UseListOrderStack UseListOrders
unsigned getMetadataOrNullID(const Metadata *MD) const
void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const
iterator find(const KeyT &Val)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
unsigned getGlobalBasicBlockID(const BasicBlock *BB) const
getGlobalBasicBlockID - This returns the function-specific ID for the specified basic block...
LLVM Value Representation.
std::vector< Type * > TypeList
bool isEmpty() const
Return true if there are no attributes.