mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
7045cca7d5
Stop converting implicitly between iterators and pointers/references in lib/IR. For convenience, I've added a `getIterator()` accessor to `ilist_node` so that callers don't need to know how to spell the iterator class (i.e., they can use `X.getIterator()` instead of `Function::iterator(X)`). I'll eventually disallow these implicit conversions entirely, but there's a lot of code, so it doesn't make sense to do it all in one patch. One library or so at a time. Why? To root out cases of `getNextNode()` and `getPrevNode()` being used in iterator logic. The design of `ilist` makes that invalid when the current node could be at the back of the list, but it happens to "work" right now because of a bug where those functions never return `nullptr` if you're using a half-node sentinel. Before I can fix the function, I have to remove uses of it that rely on it misbehaving. (Maybe the function should just be deleted anyway? But I don't want deleting it -- potentially a huge project -- to block fixing ilist/iplist.) llvm-svn: 249782
115 lines
3.8 KiB
C++
115 lines
3.8 KiB
C++
//===-- llvm/SymbolTableListTraitsImpl.h - Implementation ------*- C++ -*--===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the stickier parts of the SymbolTableListTraits class,
|
|
// and is explicitly instantiated where needed to avoid defining all this code
|
|
// in a widely used header.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_IR_SYMBOLTABLELISTTRAITSIMPL_H
|
|
#define LLVM_LIB_IR_SYMBOLTABLELISTTRAITSIMPL_H
|
|
|
|
#include "llvm/IR/SymbolTableListTraits.h"
|
|
#include "llvm/IR/ValueSymbolTable.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// setSymTabObject - This is called when (f.e.) the parent of a basic block
|
|
/// changes. This requires us to remove all the instruction symtab entries from
|
|
/// the current function and reinsert them into the new function.
|
|
template <typename ValueSubClass>
|
|
template <typename TPtr>
|
|
void SymbolTableListTraits<ValueSubClass>::setSymTabObject(TPtr *Dest,
|
|
TPtr Src) {
|
|
// Get the old symtab and value list before doing the assignment.
|
|
ValueSymbolTable *OldST = getSymTab(getListOwner());
|
|
|
|
// Do it.
|
|
*Dest = Src;
|
|
|
|
// Get the new SymTab object.
|
|
ValueSymbolTable *NewST = getSymTab(getListOwner());
|
|
|
|
// If there is nothing to do, quick exit.
|
|
if (OldST == NewST) return;
|
|
|
|
// Move all the elements from the old symtab to the new one.
|
|
ListTy &ItemList = getList(getListOwner());
|
|
if (ItemList.empty()) return;
|
|
|
|
if (OldST) {
|
|
// Remove all entries from the previous symtab.
|
|
for (auto I = ItemList.begin(); I != ItemList.end(); ++I)
|
|
if (I->hasName())
|
|
OldST->removeValueName(I->getValueName());
|
|
}
|
|
|
|
if (NewST) {
|
|
// Add all of the items to the new symtab.
|
|
for (auto I = ItemList.begin(); I != ItemList.end(); ++I)
|
|
if (I->hasName())
|
|
NewST->reinsertValue(&*I);
|
|
}
|
|
|
|
}
|
|
|
|
template <typename ValueSubClass>
|
|
void SymbolTableListTraits<ValueSubClass>::addNodeToList(ValueSubClass *V) {
|
|
assert(!V->getParent() && "Value already in a container!!");
|
|
ItemParentClass *Owner = getListOwner();
|
|
V->setParent(Owner);
|
|
if (V->hasName())
|
|
if (ValueSymbolTable *ST = getSymTab(Owner))
|
|
ST->reinsertValue(V);
|
|
}
|
|
|
|
template <typename ValueSubClass>
|
|
void SymbolTableListTraits<ValueSubClass>::removeNodeFromList(
|
|
ValueSubClass *V) {
|
|
V->setParent(nullptr);
|
|
if (V->hasName())
|
|
if (ValueSymbolTable *ST = getSymTab(getListOwner()))
|
|
ST->removeValueName(V->getValueName());
|
|
}
|
|
|
|
template <typename ValueSubClass>
|
|
void SymbolTableListTraits<ValueSubClass>::transferNodesFromList(
|
|
SymbolTableListTraits &L2, ilist_iterator<ValueSubClass> first,
|
|
ilist_iterator<ValueSubClass> last) {
|
|
// We only have to do work here if transferring instructions between BBs
|
|
ItemParentClass *NewIP = getListOwner(), *OldIP = L2.getListOwner();
|
|
if (NewIP == OldIP) return; // No work to do at all...
|
|
|
|
// We only have to update symbol table entries if we are transferring the
|
|
// instructions to a different symtab object...
|
|
ValueSymbolTable *NewST = getSymTab(NewIP);
|
|
ValueSymbolTable *OldST = getSymTab(OldIP);
|
|
if (NewST != OldST) {
|
|
for (; first != last; ++first) {
|
|
ValueSubClass &V = *first;
|
|
bool HasName = V.hasName();
|
|
if (OldST && HasName)
|
|
OldST->removeValueName(V.getValueName());
|
|
V.setParent(NewIP);
|
|
if (NewST && HasName)
|
|
NewST->reinsertValue(&V);
|
|
}
|
|
} else {
|
|
// Just transferring between blocks in the same function, simply update the
|
|
// parent fields in the instructions...
|
|
for (; first != last; ++first)
|
|
first->setParent(NewIP);
|
|
}
|
|
}
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif
|