using reverse_iterator = InstListType::reverse_iterator;
using const_reverse_iterator = InstListType::const_reverse_iterator;
+ // These functions and classes need access to the instruction list.
+ friend void Instruction::removeFromParent();
+ friend iplist<Instruction>::iterator Instruction::eraseFromParent();
+ friend BasicBlock::iterator Instruction::insertAt(BasicBlock *BB,
+ BasicBlock::iterator It);
+ friend class llvm::SymbolTableListTraits<llvm::Instruction>;
+ friend class llvm::ilist_node_with_parent<llvm::Instruction, llvm::BasicBlock>;
+
/// Creates a new BasicBlock.
///
/// If the Parent parameter is specified, the basic block is automatically
}
iterator_range<phi_iterator> phis();
+private:
/// Return the underlying instruction list container.
- ///
- /// Currently you need to access the underlying instruction list container
- /// directly if you want to modify it.
+ /// This is deliberately private because we have implemented an adequate set
+ /// of functions to modify the list, including BasicBlock::splice(),
+ /// BasicBlock::erase(), Instruction::insertAt() etc.
const InstListType &getInstList() const { return InstList; }
- InstListType &getInstList() { return InstList; }
+ InstListType &getInstList() { return InstList; }
/// Returns a pointer to a member of the instruction list.
- static InstListType BasicBlock::*getSublistAccess(Instruction*) {
+ /// This is private on purpose, just like `getInstList()`.
+ static InstListType BasicBlock::*getSublistAccess(Instruction *) {
return &BasicBlock::InstList;
}
+public:
/// Returns a pointer to the symbol table if one exists.
ValueSymbolTable *getValueSymbolTable();
BasicBlock::iterator BasicBlock::erase(BasicBlock::iterator FromIt,
BasicBlock::iterator ToIt) {
- return getInstList().erase(FromIt, ToIt);
+ return InstList.erase(FromIt, ToIt);
}
void BasicBlock::replacePhiUsesWith(BasicBlock *Old, BasicBlock *New) {