X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FBitcode%2FWriter%2FValueEnumerator.h;h=9fb8325150e933bf0c8d1820c384e23a48b5e404;hp=1c9f38e07b447a391edca0c0b184bbe3f08f919b;hb=8a32dc47d61f3c12f95f5cf7dd1d67ed7c6c00cd;hpb=c8a1169c935ad9d3dfbdd4f72d80abf8f5acb03c diff --git a/lib/Bitcode/Writer/ValueEnumerator.h b/lib/Bitcode/Writer/ValueEnumerator.h index 1c9f38e07b4..9fb8325150e 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.h +++ b/lib/Bitcode/Writer/ValueEnumerator.h @@ -11,13 +11,14 @@ // //===----------------------------------------------------------------------===// -#ifndef VALUE_ENUMERATOR_H -#define VALUE_ENUMERATOR_H +#ifndef LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H +#define LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/UniqueVector.h" #include "llvm/IR/Attributes.h" +#include "llvm/IR/UseListOrder.h" #include namespace llvm { @@ -29,6 +30,8 @@ class BasicBlock; class Comdat; class Function; class Module; +class Metadata; +class LocalAsMetadata; class MDNode; class NamedMDNode; class AttributeSet; @@ -42,6 +45,9 @@ public: // For each value, we remember its Value* and occurrence frequency. typedef std::vector > ValueList; + + UseListOrderStack UseListOrders; + private: typedef DenseMap TypeMapType; TypeMapType TypeMap; @@ -54,9 +60,14 @@ private: typedef UniqueVector ComdatSetType; ComdatSetType Comdats; - ValueList MDValues; - SmallVector FunctionLocalMDs; - ValueMapType MDValueMap; + std::vector MDs; + SmallVector FunctionLocalMDs; + typedef DenseMap MetadataMapType; + MetadataMapType MetadataMap; + bool HasMDString; + bool HasDILocation; + bool HasGenericDINode; + bool ShouldPreserveUseListOrder; typedef DenseMap AttributeGroupMapType; AttributeGroupMapType AttributeGroupMap; @@ -82,22 +93,39 @@ private: /// before incorporation. unsigned NumModuleValues; - /// When a function is incorporated, this is the size of the MDValues list + /// When a function is incorporated, this is the size of the Metadatas list /// before incorporation. - unsigned NumModuleMDValues; + unsigned NumModuleMDs; unsigned FirstFuncConstantID; unsigned FirstInstID; - ValueEnumerator(const ValueEnumerator &) LLVM_DELETED_FUNCTION; - void operator=(const ValueEnumerator &) LLVM_DELETED_FUNCTION; + ValueEnumerator(const ValueEnumerator &) = delete; + void operator=(const ValueEnumerator &) = delete; public: - ValueEnumerator(const Module *M); + ValueEnumerator(const Module &M, bool ShouldPreserveUseListOrder); void dump() const; void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const; + void print(raw_ostream &OS, const MetadataMapType &Map, + const char *Name) const; unsigned getValueID(const Value *V) const; + unsigned getMetadataID(const Metadata *MD) const { + auto ID = getMetadataOrNullID(MD); + assert(ID != 0 && "Metadata not in slotcalculator!"); + return ID - 1; + } + unsigned getMetadataOrNullID(const Metadata *MD) const { + return MetadataMap.lookup(MD); + } + unsigned numMDs() const { return MDs.size(); } + + bool hasMDString() const { return HasMDString; } + bool hasDILocation() const { return HasDILocation; } + bool hasGenericDINode() const { return HasGenericDINode; } + + bool shouldPreserveUseListOrder() const { return ShouldPreserveUseListOrder; } unsigned getTypeID(Type *T) const { TypeMapType::const_iterator I = TypeMap.find(T); @@ -130,8 +158,8 @@ public: } const ValueList &getValues() const { return Values; } - const ValueList &getMDValues() const { return MDValues; } - const SmallVectorImpl &getFunctionLocalMDValues() const { + const std::vector &getMDs() const { return MDs; } + const SmallVectorImpl &getFunctionLocalMDs() const { return FunctionLocalMDs; } const TypeList &getTypes() const { return Types; } @@ -158,13 +186,14 @@ public: /// void incorporateFunction(const Function &F); void purgeFunction(); + uint64_t computeBitsRequiredForTypeIndicies() const; private: void OptimizeConstants(unsigned CstStart, unsigned CstEnd); void EnumerateMDNodeOperands(const MDNode *N); - void EnumerateMetadata(const Value *MD); - void EnumerateFunctionLocalMetadata(const MDNode *N); + void EnumerateMetadata(const Metadata *MD); + void EnumerateFunctionLocalMetadata(const LocalAsMetadata *Local); void EnumerateNamedMDNode(const NamedMDNode *NMD); void EnumerateValue(const Value *V); void EnumerateType(Type *T); @@ -172,7 +201,7 @@ private: void EnumerateAttributes(AttributeSet PAL); void EnumerateValueSymbolTable(const ValueSymbolTable &ST); - void EnumerateNamedMetadata(const Module *M); + void EnumerateNamedMetadata(const Module &M); }; } // End llvm namespace