
This commit removes the global manager variable which is responsible for storing and allocating pseudo source values and instead it introduces a new manager class named 'PseudoSourceValueManager'. Machine functions now own an instance of the pseudo source value manager class. This commit also modifies the 'get...' methods in the 'MachinePointerInfo' class to construct pseudo source values using the instance of the pseudo source value manager object from the machine function. This commit updates calls to the 'get...' methods from the 'MachinePointerInfo' class in a lot of different files because those calls now need to pass in a reference to a machine function to those methods. This change will make it easier to serialize pseudo source values as it will enable me to transform the mips specific MipsCallEntry PseudoSourceValue subclass into two target independent subclasses. Reviewers: Akira Hatanaka llvm-svn: 244693
104 lines
3.1 KiB
C++
104 lines
3.1 KiB
C++
//===-- llvm/CodeGen/PseudoSourceValue.cpp ----------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the PseudoSourceValue class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/CodeGen/PseudoSourceValue.h"
|
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
|
#include "llvm/IR/DerivedTypes.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/ManagedStatic.h"
|
|
#include "llvm/Support/Mutex.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include <map>
|
|
using namespace llvm;
|
|
|
|
static const char *const PSVNames[] = {
|
|
"Stack", "GOT", "JumpTable", "ConstantPool", "FixedStack", "MipsCallEntry"};
|
|
|
|
PseudoSourceValue::PseudoSourceValue(PSVKind Kind) : Kind(Kind) {}
|
|
|
|
PseudoSourceValue::~PseudoSourceValue() {}
|
|
|
|
void PseudoSourceValue::printCustom(raw_ostream &O) const {
|
|
O << PSVNames[Kind];
|
|
}
|
|
|
|
bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const {
|
|
if (isStack())
|
|
return false;
|
|
if (isGOT() || isConstantPool() || isJumpTable())
|
|
return true;
|
|
llvm_unreachable("Unknown PseudoSourceValue!");
|
|
}
|
|
|
|
bool PseudoSourceValue::isAliased(const MachineFrameInfo *) const {
|
|
if (isStack() || isGOT() || isConstantPool() || isJumpTable())
|
|
return false;
|
|
llvm_unreachable("Unknown PseudoSourceValue!");
|
|
}
|
|
|
|
bool PseudoSourceValue::mayAlias(const MachineFrameInfo *) const {
|
|
if (isGOT() || isConstantPool() || isJumpTable())
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
bool FixedStackPseudoSourceValue::isConstant(
|
|
const MachineFrameInfo *MFI) const {
|
|
return MFI && MFI->isImmutableObjectIndex(FI);
|
|
}
|
|
|
|
bool FixedStackPseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const {
|
|
if (!MFI)
|
|
return true;
|
|
return MFI->isAliasedObjectIndex(FI);
|
|
}
|
|
|
|
bool FixedStackPseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const {
|
|
if (!MFI)
|
|
return true;
|
|
// Spill slots will not alias any LLVM IR value.
|
|
return !MFI->isSpillSlotObjectIndex(FI);
|
|
}
|
|
|
|
void FixedStackPseudoSourceValue::printCustom(raw_ostream &OS) const {
|
|
OS << "FixedStack" << FI;
|
|
}
|
|
|
|
PseudoSourceValueManager::PseudoSourceValueManager()
|
|
: StackPSV(PseudoSourceValue::Stack), GOTPSV(PseudoSourceValue::GOT),
|
|
JumpTablePSV(PseudoSourceValue::JumpTable),
|
|
ConstantPoolPSV(PseudoSourceValue::ConstantPool) {}
|
|
|
|
const PseudoSourceValue *PseudoSourceValueManager::getStack() {
|
|
return &StackPSV;
|
|
}
|
|
|
|
const PseudoSourceValue *PseudoSourceValueManager::getGOT() { return &GOTPSV; }
|
|
|
|
const PseudoSourceValue *PseudoSourceValueManager::getConstantPool() {
|
|
return &ConstantPoolPSV;
|
|
}
|
|
|
|
const PseudoSourceValue *PseudoSourceValueManager::getJumpTable() {
|
|
return &JumpTablePSV;
|
|
}
|
|
|
|
const PseudoSourceValue *PseudoSourceValueManager::getFixedStack(int FI) {
|
|
std::unique_ptr<FixedStackPseudoSourceValue> &V = FSValues[FI];
|
|
if (!V)
|
|
V = llvm::make_unique<FixedStackPseudoSourceValue>(FI);
|
|
return V.get();
|
|
}
|