]> granicus.if.org Git - clang/commitdiff
Provide convenience routines to save and restore the current insertion
authorJohn McCall <rjmccall@apple.com>
Sat, 3 Jul 2010 09:25:20 +0000 (09:25 +0000)
committerJohn McCall <rjmccall@apple.com>
Sat, 3 Jul 2010 09:25:20 +0000 (09:25 +0000)
point.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107570 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBuilder.h

index ed56bd913779092a137a93696376ebbb4244c0ba..33d868920dcbafaf0de8438c17287d1b69053613 100644 (file)
 
 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