diff --git a/llvm/include/llvm/IR/BasicBlock.h b/llvm/include/llvm/IR/BasicBlock.h --- a/llvm/include/llvm/IR/BasicBlock.h +++ b/llvm/include/llvm/IR/BasicBlock.h @@ -89,6 +89,14 @@ 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::iterator Instruction::eraseFromParent(); + friend BasicBlock::iterator Instruction::insertAt(BasicBlock *BB, + BasicBlock::iterator It); + friend class llvm::SymbolTableListTraits; + friend class llvm::ilist_node_with_parent; + /// Creates a new BasicBlock. /// /// If the Parent parameter is specified, the basic block is automatically @@ -366,18 +374,21 @@ } iterator_range 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(); diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -482,7 +482,7 @@ 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) {