forked from OSchip/llvm-project
Provide convenience routines to save and restore the current insertion
point. llvm-svn: 107570
This commit is contained in:
parent
c8f595212f
commit
1180f8e90f
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue