mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 00:29:20 +00:00
Aside from moving the actual files, this patch only updates the build system and the source file comments under lib/... that are relevant. I'll be updating other docs and other files in smaller subsequnet commits. While I've tried to test this, but it is entirely possible that there will still be some build system fallout. Also, note that I've not changed the library name itself: libLLVMCore.a is still the library name. I'd be interested in others' opinions about whether we should rename this as well (I think we should, just not sure what it might break) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171359 91177308-0d34-0410-b5e6-96231b3b80d8
91 lines
3.3 KiB
C++
91 lines
3.3 KiB
C++
//===-- User.cpp - Implement the User class -------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/User.h"
|
|
#include "llvm/Constant.h"
|
|
#include "llvm/GlobalValue.h"
|
|
#include "llvm/Operator.h"
|
|
|
|
namespace llvm {
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// User Class
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void User::anchor() {}
|
|
|
|
// replaceUsesOfWith - Replaces all references to the "From" definition with
|
|
// references to the "To" definition.
|
|
//
|
|
void User::replaceUsesOfWith(Value *From, Value *To) {
|
|
if (From == To) return; // Duh what?
|
|
|
|
assert((!isa<Constant>(this) || isa<GlobalValue>(this)) &&
|
|
"Cannot call User::replaceUsesOfWith on a constant!");
|
|
|
|
for (unsigned i = 0, E = getNumOperands(); i != E; ++i)
|
|
if (getOperand(i) == From) { // Is This operand is pointing to oldval?
|
|
// The side effects of this setOperand call include linking to
|
|
// "To", adding "this" to the uses list of To, and
|
|
// most importantly, removing "this" from the use list of "From".
|
|
setOperand(i, To); // Fix it now...
|
|
}
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// User allocHungoffUses Implementation
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Use *User::allocHungoffUses(unsigned N) const {
|
|
// Allocate the array of Uses, followed by a pointer (with bottom bit set) to
|
|
// the User.
|
|
size_t size = N * sizeof(Use) + sizeof(Use::UserRef);
|
|
Use *Begin = static_cast<Use*>(::operator new(size));
|
|
Use *End = Begin + N;
|
|
(void) new(End) Use::UserRef(const_cast<User*>(this), 1);
|
|
return Use::initTags(Begin, End);
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// User operator new Implementations
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void *User::operator new(size_t s, unsigned Us) {
|
|
void *Storage = ::operator new(s + sizeof(Use) * Us);
|
|
Use *Start = static_cast<Use*>(Storage);
|
|
Use *End = Start + Us;
|
|
User *Obj = reinterpret_cast<User*>(End);
|
|
Obj->OperandList = Start;
|
|
Obj->NumOperands = Us;
|
|
Use::initTags(Start, End);
|
|
return Obj;
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// User operator delete Implementation
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void User::operator delete(void *Usr) {
|
|
User *Start = static_cast<User*>(Usr);
|
|
Use *Storage = static_cast<Use*>(Usr) - Start->NumOperands;
|
|
// If there were hung-off uses, they will have been freed already and
|
|
// NumOperands reset to 0, so here we just free the User itself.
|
|
::operator delete(Storage);
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Operator Class
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Operator::~Operator() {
|
|
llvm_unreachable("should never destroy an Operator");
|
|
}
|
|
|
|
} // End llvm namespace
|