diff options
author | Chris Lattner <sabre@nondot.org> | 2002-07-23 18:03:11 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-07-23 18:03:11 +0000 |
commit | e9754ef595c74b848e9a2409c758826abbd7d905 (patch) | |
tree | 21aeebe070def9dbe4e2ffc2f12b6e2bb9e2fe32 /lib/Transforms/IPO/SimpleStructMutation.cpp | |
parent | 33494521d35d5eae26cdabc028bdee6d8d7da9c0 (diff) |
* Break the two different behaviors of SimpleStructMutation into two subclasses
* Register the passes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3013 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO/SimpleStructMutation.cpp')
-rw-r--r-- | lib/Transforms/IPO/SimpleStructMutation.cpp | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/lib/Transforms/IPO/SimpleStructMutation.cpp b/lib/Transforms/IPO/SimpleStructMutation.cpp index 7f18f31e9b..354b642c1b 100644 --- a/lib/Transforms/IPO/SimpleStructMutation.cpp +++ b/lib/Transforms/IPO/SimpleStructMutation.cpp @@ -17,28 +17,14 @@ using std::vector; using std::set; using std::pair; -// FIXME: TargetData Hack: Eventually we will have annotations given to us by -// the backend so that we know stuff about type size and alignments. For now -// though, just use this, because it happens to match the model that GCC and the -// Sparc backend use. -// -const TargetData TD("SimpleStructMutation Should be GCC though!"); - namespace { struct SimpleStructMutation : public MutateStructTypes { - enum Transform { SwapElements, SortElements } CurrentXForm; - - SimpleStructMutation(enum Transform XForm) : CurrentXForm(XForm) {} - - const char *getPassName() const { return "Simple Struct Mutation"; } - - virtual bool run(Module &M) { - setTransforms(getTransforms(M, CurrentXForm)); - bool Changed = MutateStructTypes::run(M); - clearTransforms(); - return Changed; - } + enum Transform { SwapElements, SortElements }; + const TargetData &TD; + SimpleStructMutation(const TargetData &td) : TD(td) {} + virtual bool run(Module &M) = 0; + // getAnalysisUsage - This function needs the results of the // FindUsedTypes and FindUnsafePointerTypes analysis passes... // @@ -48,9 +34,31 @@ namespace { MutateStructTypes::getAnalysisUsage(AU); } - private: + protected: TransformsType getTransforms(Module &M, enum Transform); }; + + struct SwapStructElements : public SimpleStructMutation { + SwapStructElements(const TargetData &TD) : SimpleStructMutation(TD) {} + + virtual bool run(Module &M) { + setTransforms(getTransforms(M, SwapElements)); + bool Changed = MutateStructTypes::run(M); + clearTransforms(); + return Changed; + } + }; + + struct SortStructElements : public SimpleStructMutation { + SortStructElements(const TargetData &TD) : SimpleStructMutation(TD) {} + + virtual bool run(Module &M) { + setTransforms(getTransforms(M, SortElements)); + bool Changed = MutateStructTypes::run(M); + clearTransforms(); + return Changed; + } + }; } // end anonymous namespace @@ -91,7 +99,7 @@ static unsigned getIndex(const vector<pair<unsigned, unsigned> > &Vec, if (Vec[i].first == Field) return i; } -static inline void GetTransformation(const StructType *ST, +static inline void GetTransformation(const TargetData &TD, const StructType *ST, vector<int> &Transform, enum SimpleStructMutation::Transform XForm) { unsigned NumElements = ST->getElementTypes().size(); @@ -166,17 +174,25 @@ SimpleStructMutation::TransformsType const StructType *ST = *I; vector<int> &Transform = Transforms[ST]; // Fill in the map directly - GetTransformation(ST, Transform, XForm); + GetTransformation(TD, ST, Transform, XForm); } return Transforms; } -Pass *createSwapElementsPass() { - return new SimpleStructMutation(SimpleStructMutation::SwapElements); +Pass *createSwapElementsPass(const TargetData &TD) { + return new SwapStructElements(TD); } -Pass *createSortElementsPass() { - return new SimpleStructMutation(SimpleStructMutation::SortElements); +Pass *createSortElementsPass(const TargetData &TD) { + return new SortStructElements(TD); } +namespace { + RegisterPass<SwapStructElements> X("swapstructs", + "Swap structure types around", + createSwapElementsPass); + RegisterPass<SortStructElements> Y("sortstructs", + "Sort structure elements by size", + createSortElementsPass); +} |