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