1bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===-- User.cpp - Implement the User class -------------------------------===// 2bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// 3bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// The LLVM Compiler Infrastructure 4bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// 5bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// This file is distributed under the University of Illinois Open Source 6bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// License. See LICENSE.TXT for details. 7bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// 8bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 9bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 100b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/User.h" 110b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constant.h" 120b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h" 130b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Operator.h" 14bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 15bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foadnamespace llvm { 16bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 17bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 18bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// User Class 19bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 20bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 210becc96b243da058f6d8901128b173d192db5148David Blaikievoid User::anchor() {} 220becc96b243da058f6d8901128b173d192db5148David Blaikie 23bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// replaceUsesOfWith - Replaces all references to the "From" definition with 24bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// references to the "To" definition. 25bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// 26bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foadvoid User::replaceUsesOfWith(Value *From, Value *To) { 27bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad if (From == To) return; // Duh what? 28bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 29bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad assert((!isa<Constant>(this) || isa<GlobalValue>(this)) && 30bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad "Cannot call User::replaceUsesOfWith on a constant!"); 31bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 32bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad for (unsigned i = 0, E = getNumOperands(); i != E; ++i) 33bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad if (getOperand(i) == From) { // Is This operand is pointing to oldval? 34bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad // The side effects of this setOperand call include linking to 35bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad // "To", adding "this" to the uses list of To, and 36bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad // most importantly, removing "this" from the use list of "From". 37bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad setOperand(i, To); // Fix it now... 38bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad } 39bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} 40bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 41bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 42bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// User allocHungoffUses Implementation 43bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 44bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 45bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay FoadUse *User::allocHungoffUses(unsigned N) const { 4695c3e48f9557adb6064d580684bb14cacec2f826Jay Foad // Allocate the array of Uses, followed by a pointer (with bottom bit set) to 4795c3e48f9557adb6064d580684bb14cacec2f826Jay Foad // the User. 4895c3e48f9557adb6064d580684bb14cacec2f826Jay Foad size_t size = N * sizeof(Use) + sizeof(Use::UserRef); 4995c3e48f9557adb6064d580684bb14cacec2f826Jay Foad Use *Begin = static_cast<Use*>(::operator new(size)); 50bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Use *End = Begin + N; 51691c05bb29d3e2ec9c2ed6b1c082ce5d484b75daJay Foad (void) new(End) Use::UserRef(const_cast<User*>(this), 1); 52bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad return Use::initTags(Begin, End); 53bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} 54bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 55bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 56bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// User operator new Implementations 57bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 58bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 59bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foadvoid *User::operator new(size_t s, unsigned Us) { 60bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad void *Storage = ::operator new(s + sizeof(Use) * Us); 61bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Use *Start = static_cast<Use*>(Storage); 62bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Use *End = Start + Us; 63bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad User *Obj = reinterpret_cast<User*>(End); 64bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Obj->OperandList = Start; 65bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Obj->NumOperands = Us; 66bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Use::initTags(Start, End); 67bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad return Obj; 68bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} 69bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 70bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 71bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// User operator delete Implementation 72bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 73bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 74bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foadvoid User::operator delete(void *Usr) { 75bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad User *Start = static_cast<User*>(Usr); 76bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Use *Storage = static_cast<Use*>(Usr) - Start->NumOperands; 77adede0387b749e58b845afac2979764f928efd74Jay Foad // If there were hung-off uses, they will have been freed already and 78adede0387b749e58b845afac2979764f928efd74Jay Foad // NumOperands reset to 0, so here we just free the User itself. 79adede0387b749e58b845afac2979764f928efd74Jay Foad ::operator delete(Storage); 80bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} 81bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 8230f57da439dc6313e8704dec09da0a3789060608Richard Smith//===----------------------------------------------------------------------===// 8330f57da439dc6313e8704dec09da0a3789060608Richard Smith// Operator Class 8430f57da439dc6313e8704dec09da0a3789060608Richard Smith//===----------------------------------------------------------------------===// 8530f57da439dc6313e8704dec09da0a3789060608Richard Smith 8630f57da439dc6313e8704dec09da0a3789060608Richard SmithOperator::~Operator() { 8730f57da439dc6313e8704dec09da0a3789060608Richard Smith llvm_unreachable("should never destroy an Operator"); 8830f57da439dc6313e8704dec09da0a3789060608Richard Smith} 8930f57da439dc6313e8704dec09da0a3789060608Richard Smith 90bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} // End llvm namespace 91