diff options
| author | Victor Hernandez <vhernandez@apple.com> | 2009-12-18 20:09:14 +0000 |
|---|---|---|
| committer | Victor Hernandez <vhernandez@apple.com> | 2009-12-18 20:09:14 +0000 |
| commit | 0471abd58bf916538dc6e4e1099ddbcf0d7af820 (patch) | |
| tree | ee4e23a25cd2a7834db78d1dbde345e01c4922a0 /llvm/include | |
| parent | 45281870ef126385ec4e7d838ee78cbb9b6919ea (diff) | |
| download | bcm5719-llvm-0471abd58bf916538dc6e4e1099ddbcf0d7af820.tar.gz bcm5719-llvm-0471abd58bf916538dc6e4e1099ddbcf0d7af820.zip | |
Formalize MDNode's function-localness:
- an MDNode is designated as function-local when created, and continues to be even if its operands are modified not to refer to function-local IR
- function-localness is designated via lowest bit in SubclassData
- getLocalFunction() descends MDNode tree to see if it is consistently function-local
Add verification of MDNodes to checks that MDNodes are consistently function-local.
Update AsmWriter to use isFunctionLocal().
llvm-svn: 91708
Diffstat (limited to 'llvm/include')
| -rw-r--r-- | llvm/include/llvm/Metadata.h | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/llvm/include/llvm/Metadata.h b/llvm/include/llvm/Metadata.h index 32c7fad203d..fd8ea0c13b2 100644 --- a/llvm/include/llvm/Metadata.h +++ b/llvm/include/llvm/Metadata.h @@ -19,6 +19,7 @@ #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/ilist_node.h" #include "llvm/Support/ValueHandle.h" @@ -106,21 +107,22 @@ 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); ElementVH *Node; unsigned NodeSize; - Function *LocalFunction; protected: explicit MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals, - Function *LocalFunc = NULL); + bool isFunctionLocal); public: // Constructors and destructors. - static MDNode *get(LLVMContext &Context, - Value *const *Vals, unsigned NumVals, - Function *LocalFunction = NULL); + static MDNode *get(LLVMContext &Context, Value *const *Vals, unsigned NumVals, + bool isFunctionLocal = false); /// ~MDNode - Destroy MDNode. ~MDNode(); @@ -135,7 +137,17 @@ public: unsigned getNumElements() const { return NodeSize; } /// isFunctionLocal - Return whether MDNode is local to a function. - bool isFunctionLocal() const { return LocalFunction; } + /// 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<MDNode *, 32> *VisitedMDNodes = NULL); /// Profile - calculate a unique identifier for this MDNode to collapse /// duplicates |

