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