On Jul 3, 2010, at 2:25 AM, John McCall wrote: > Author: rjmccall > Date: Sat Jul 3 04:25:20 2010 > New Revision: 107570 > > URL: http://llvm.org/viewvc/llvm-project?rev=107570&view=rev > Log: > Provide convenience routines to save and restore the current insertion > point.
Hi John, Why not implement this in the main IRBuilder class? There doesn't seem anything clang-specific here. -Chris > > > Modified: > cfe/trunk/lib/CodeGen/CGBuilder.h > > Modified: cfe/trunk/lib/CodeGen/CGBuilder.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuilder.h?rev=107570&r1=107569&r2=107570&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGBuilder.h (original) > +++ cfe/trunk/lib/CodeGen/CGBuilder.h Sat Jul 3 04:25:20 2010 > @@ -14,12 +14,61 @@ > > namespace clang { > namespace CodeGen { > - // Don't preserve names on values in an optimized build. > + > +// Don't preserve names on values in an optimized build. > #ifdef NDEBUG > - typedef llvm::IRBuilder<false> CGBuilderTy; > +typedef llvm::IRBuilder<false> CGBuilderSuperTy; > #else > - typedef llvm::IRBuilder<> CGBuilderTy; > +typedef llvm::IRBuilder<> CGBuilderSuperTy; > #endif > + > +/// IR generation's wrapper around an LLVM IRBuilder. > +class CGBuilderTy : public CGBuilderSuperTy { > +public: > + CGBuilderTy(llvm::LLVMContext &Context) : CGBuilderSuperTy(Context) {} > + CGBuilderTy(llvm::BasicBlock *Block) : CGBuilderSuperTy(Block) {} > + CGBuilderTy(llvm::BasicBlock *Block, llvm::BasicBlock::iterator Point) > + : CGBuilderSuperTy(Block, Point) {} > + > + CGBuilderTy(const CGBuilderTy &Builder) > + : CGBuilderSuperTy(Builder.getContext()) { > + > + if (Builder.GetInsertBlock()) > + SetInsertPoint(Builder.GetInsertBlock(), Builder.GetInsertPoint()); > + } > + > + /// A saved insertion point. > + class InsertPoint { > + llvm::BasicBlock *Block; > + llvm::BasicBlock::iterator Point; > + > + public: > + InsertPoint(llvm::BasicBlock *Block, llvm::BasicBlock::iterator Point) > + : Block(Block), Point(Point) {} > + > + bool isSet() const { return (Block != 0); } > + llvm::BasicBlock *getBlock() const { return Block; } > + llvm::BasicBlock::iterator getPoint() const { return Point; } > + }; > + > + InsertPoint saveIP() const { > + return InsertPoint(GetInsertBlock(), GetInsertPoint()); > + } > + > + InsertPoint saveAndClearIP() { > + InsertPoint IP(GetInsertBlock(), GetInsertPoint()); > + ClearInsertionPoint(); > + return IP; > + } > + > + void restoreIP(InsertPoint IP) { > + if (IP.isSet()) > + SetInsertPoint(IP.getBlock(), IP.getPoint()); > + else > + ClearInsertionPoint(); > + } > +}; > + > } // end namespace CodeGen > } // end namespace clang > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
