X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FMetadata.h;h=fd8ea0c13b2c0044d1ce5a1b49a2a7753e548fdd;hb=cd0129f5a6f0485ecac525c17a3c5dff0a19ca5f;hp=63b9e5ae83b18c1448ca0a62be3a3131652e48ff;hpb=b5681b22937440dcb8007f4b125f3325d6341fe0;p=oota-llvm.git diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index 63b9e5ae83b..fd8ea0c13b2 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -19,17 +19,16 @@ #include "llvm/Value.h" #include "llvm/Type.h" #include "llvm/ADT/FoldingSet.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/StringMap.h" #include "llvm/ADT/ilist_node.h" -#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ValueHandle.h" namespace llvm { class Constant; class Instruction; class LLVMContext; +class MetadataContextImpl; //===----------------------------------------------------------------------===// // MetadataBase - A base class for MDNode, MDString and NamedMDNode. @@ -62,10 +61,11 @@ protected: public: static MDString *get(LLVMContext &Context, StringRef Str); + static MDString *get(LLVMContext &Context, const char *Str); StringRef getString() const { return Str; } - unsigned getLength() const { return Str.size(); } + unsigned getLength() const { return (unsigned)Str.size(); } typedef StringRef::iterator iterator; @@ -92,7 +92,7 @@ class MDNode : public MetadataBase, public FoldingSetNode { MDNode(const MDNode &); // DO NOT IMPLEMENT friend class ElementVH; - // Use CallbackVH to hold MDNOde elements. + // Use CallbackVH to hold MDNode elements. struct ElementVH : public CallbackVH { MDNode *Parent; ElementVH() {} @@ -107,6 +107,9 @@ class MDNode : public MetadataBase, public FoldingSetNode { Parent->replaceElement(this->operator Value*(), NV); } }; + + static const unsigned short FunctionLocalBit = 1; + // Replace each instance of F from the element list of this node with T. void replaceElement(Value *F, Value *T); @@ -114,11 +117,12 @@ class MDNode : public MetadataBase, public FoldingSetNode { unsigned NodeSize; protected: - explicit MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals); + explicit MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals, + bool isFunctionLocal); public: // Constructors and destructors. - static MDNode *get(LLVMContext &Context, - Value *const *Vals, unsigned NumVals); + static MDNode *get(LLVMContext &Context, Value *const *Vals, unsigned NumVals, + bool isFunctionLocal = false); /// ~MDNode - Destroy MDNode. ~MDNode(); @@ -131,6 +135,19 @@ public: /// getNumElements - Return number of MDNode elements. unsigned getNumElements() const { return NodeSize; } + + /// isFunctionLocal - Return whether MDNode is local to a function. + /// Note: MDNodes are designated as function-local when created, and keep + /// that designation even if their operands are modified to no longer + /// refer to function-local IR. + bool isFunctionLocal() const { return SubclassData & FunctionLocalBit; } + + /// getLocalFunction - Return false if MDNode's recursive function-localness + /// is invalid (local to more than one function). Return true otherwise. + /// If MDNode has one function to which it is local, set LocalFunction to that + /// function. + bool getLocalFunction(Function *LocalFunction, + SmallPtrSet *VisitedMDNodes = NULL); /// Profile - calculate a unique identifier for this MDNode to collapse /// duplicates @@ -193,7 +210,7 @@ public: /// getNumElements - Return number of NamedMDNode elements. unsigned getNumElements() const { - return Node.size(); + return (unsigned)Node.size(); } /// addElement - Add metadata element. @@ -224,20 +241,15 @@ public: /// must start with an alphabet. The regular expression used to check name /// is [a-zA-Z$._][a-zA-Z$._0-9]* class MetadataContext { -public: - typedef std::pair > MDPairTy; - typedef SmallVector MDMapTy; - typedef DenseMap MDStoreTy; - friend class BitcodeReader; -private: - - /// MetadataStore - Collection of metadata used in this context. - MDStoreTy MetadataStore; - - /// MDHandlerNames - Map to hold metadata handler names. - StringMap MDHandlerNames; + // DO NOT IMPLEMENT + MetadataContext(MetadataContext&); + void operator=(MetadataContext&); + MetadataContextImpl *const pImpl; public: + MetadataContext(); + ~MetadataContext(); + /// registerMDKind - Register a new metadata kind and return its ID. /// A metadata kind can be registered only once. unsigned registerMDKind(StringRef Name); @@ -254,7 +266,8 @@ public: MDNode *getMD(unsigned Kind, const Instruction *Inst); /// getMDs - Get the metadata attached to an Instruction. - const MDMapTy *getMDs(const Instruction *Inst); + void getMDs(const Instruction *Inst, + SmallVectorImpl > > &MDs) const; /// addMD - Attach the metadata of given kind to an Instruction. void addMD(unsigned Kind, MDNode *Node, Instruction *Inst); @@ -269,16 +282,14 @@ public: /// the same metadata to In2. void copyMD(Instruction *In1, Instruction *In2); - /// getHandlerNames - Populate client supplied smallvector using custome + /// getHandlerNames - Populate client supplied smallvector using custom /// metadata name and ID. void getHandlerNames(SmallVectorImpl >&) const; /// ValueIsDeleted - This handler is used to update metadata store /// when a value is deleted. void ValueIsDeleted(const Value *) {} - void ValueIsDeleted(Instruction *Inst) { - removeAllMetadata(Inst); - } + void ValueIsDeleted(Instruction *Inst); void ValueIsRAUWd(Value *V1, Value *V2); /// ValueIsCloned - This handler is used to update metadata store