119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- User.cpp - Implement the User class -------------------------------===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Constant.h"
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/GlobalValue.h"
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/User.h"
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm {
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                                 User Class
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// replaceUsesOfWith - Replaces all references to the "From" definition with
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// references to the "To" definition.
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid User::replaceUsesOfWith(Value *From, Value *To) {
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (From == To) return;   // Duh what?
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert((!isa<Constant>(this) || isa<GlobalValue>(this)) &&
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman         "Cannot call User::replaceUsesOfWith on a constant!");
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (unsigned i = 0, E = getNumOperands(); i != E; ++i)
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (getOperand(i) == From) {  // Is This operand is pointing to oldval?
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // The side effects of this setOperand call include linking to
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // "To", adding "this" to the uses list of To, and
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // most importantly, removing "this" from the use list of "From".
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      setOperand(i, To); // Fix it now...
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                         User allocHungoffUses Implementation
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanUse *User::allocHungoffUses(unsigned N) const {
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Allocate the array of Uses, followed by a pointer (with bottom bit set) to
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // the User.
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  size_t size = N * sizeof(Use) + sizeof(Use::UserRef);
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Use *Begin = static_cast<Use*>(::operator new(size));
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Use *End = Begin + N;
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  (void) new(End) Use::UserRef(const_cast<User*>(this), 1);
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return Use::initTags(Begin, End);
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                         User operator new Implementations
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid *User::operator new(size_t s, unsigned Us) {
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void *Storage = ::operator new(s + sizeof(Use) * Us);
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Use *Start = static_cast<Use*>(Storage);
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Use *End = Start + Us;
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  User *Obj = reinterpret_cast<User*>(End);
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Obj->OperandList = Start;
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Obj->NumOperands = Us;
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Use::initTags(Start, End);
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return Obj;
6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                         User operator delete Implementation
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid User::operator delete(void *Usr) {
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  User *Start = static_cast<User*>(Usr);
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Use *Storage = static_cast<Use*>(Usr) - Start->NumOperands;
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If there were hung-off uses, they will have been freed already and
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // NumOperands reset to 0, so here we just free the User itself.
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ::operator delete(Storage);
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // End llvm namespace
80