1*9880d681SAndroid Build Coastguard Worker //===-- llvm/CodeGen/PseudoSourceValue.cpp ----------------------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the PseudoSourceValue class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/PseudoSourceValue.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFrameInfo.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
21*9880d681SAndroid Build Coastguard Worker using namespace llvm;
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker static const char *const PSVNames[] = {
24*9880d681SAndroid Build Coastguard Worker "Stack", "GOT", "JumpTable", "ConstantPool", "FixedStack",
25*9880d681SAndroid Build Coastguard Worker "GlobalValueCallEntry", "ExternalSymbolCallEntry"};
26*9880d681SAndroid Build Coastguard Worker
PseudoSourceValue(PSVKind Kind)27*9880d681SAndroid Build Coastguard Worker PseudoSourceValue::PseudoSourceValue(PSVKind Kind) : Kind(Kind) {}
28*9880d681SAndroid Build Coastguard Worker
~PseudoSourceValue()29*9880d681SAndroid Build Coastguard Worker PseudoSourceValue::~PseudoSourceValue() {}
30*9880d681SAndroid Build Coastguard Worker
printCustom(raw_ostream & O) const31*9880d681SAndroid Build Coastguard Worker void PseudoSourceValue::printCustom(raw_ostream &O) const {
32*9880d681SAndroid Build Coastguard Worker O << PSVNames[Kind];
33*9880d681SAndroid Build Coastguard Worker }
34*9880d681SAndroid Build Coastguard Worker
isConstant(const MachineFrameInfo *) const35*9880d681SAndroid Build Coastguard Worker bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const {
36*9880d681SAndroid Build Coastguard Worker if (isStack())
37*9880d681SAndroid Build Coastguard Worker return false;
38*9880d681SAndroid Build Coastguard Worker if (isGOT() || isConstantPool() || isJumpTable())
39*9880d681SAndroid Build Coastguard Worker return true;
40*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown PseudoSourceValue!");
41*9880d681SAndroid Build Coastguard Worker }
42*9880d681SAndroid Build Coastguard Worker
isAliased(const MachineFrameInfo *) const43*9880d681SAndroid Build Coastguard Worker bool PseudoSourceValue::isAliased(const MachineFrameInfo *) const {
44*9880d681SAndroid Build Coastguard Worker if (isStack() || isGOT() || isConstantPool() || isJumpTable())
45*9880d681SAndroid Build Coastguard Worker return false;
46*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown PseudoSourceValue!");
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker
mayAlias(const MachineFrameInfo *) const49*9880d681SAndroid Build Coastguard Worker bool PseudoSourceValue::mayAlias(const MachineFrameInfo *) const {
50*9880d681SAndroid Build Coastguard Worker return !(isGOT() || isConstantPool() || isJumpTable());
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker
isConstant(const MachineFrameInfo * MFI) const53*9880d681SAndroid Build Coastguard Worker bool FixedStackPseudoSourceValue::isConstant(
54*9880d681SAndroid Build Coastguard Worker const MachineFrameInfo *MFI) const {
55*9880d681SAndroid Build Coastguard Worker return MFI && MFI->isImmutableObjectIndex(FI);
56*9880d681SAndroid Build Coastguard Worker }
57*9880d681SAndroid Build Coastguard Worker
isAliased(const MachineFrameInfo * MFI) const58*9880d681SAndroid Build Coastguard Worker bool FixedStackPseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const {
59*9880d681SAndroid Build Coastguard Worker if (!MFI)
60*9880d681SAndroid Build Coastguard Worker return true;
61*9880d681SAndroid Build Coastguard Worker return MFI->isAliasedObjectIndex(FI);
62*9880d681SAndroid Build Coastguard Worker }
63*9880d681SAndroid Build Coastguard Worker
mayAlias(const MachineFrameInfo * MFI) const64*9880d681SAndroid Build Coastguard Worker bool FixedStackPseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const {
65*9880d681SAndroid Build Coastguard Worker if (!MFI)
66*9880d681SAndroid Build Coastguard Worker return true;
67*9880d681SAndroid Build Coastguard Worker // Spill slots will not alias any LLVM IR value.
68*9880d681SAndroid Build Coastguard Worker return !MFI->isSpillSlotObjectIndex(FI);
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker
printCustom(raw_ostream & OS) const71*9880d681SAndroid Build Coastguard Worker void FixedStackPseudoSourceValue::printCustom(raw_ostream &OS) const {
72*9880d681SAndroid Build Coastguard Worker OS << "FixedStack" << FI;
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker
CallEntryPseudoSourceValue(PSVKind Kind)75*9880d681SAndroid Build Coastguard Worker CallEntryPseudoSourceValue::CallEntryPseudoSourceValue(PSVKind Kind)
76*9880d681SAndroid Build Coastguard Worker : PseudoSourceValue(Kind) {}
77*9880d681SAndroid Build Coastguard Worker
isConstant(const MachineFrameInfo *) const78*9880d681SAndroid Build Coastguard Worker bool CallEntryPseudoSourceValue::isConstant(const MachineFrameInfo *) const {
79*9880d681SAndroid Build Coastguard Worker return false;
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker
isAliased(const MachineFrameInfo *) const82*9880d681SAndroid Build Coastguard Worker bool CallEntryPseudoSourceValue::isAliased(const MachineFrameInfo *) const {
83*9880d681SAndroid Build Coastguard Worker return false;
84*9880d681SAndroid Build Coastguard Worker }
85*9880d681SAndroid Build Coastguard Worker
mayAlias(const MachineFrameInfo *) const86*9880d681SAndroid Build Coastguard Worker bool CallEntryPseudoSourceValue::mayAlias(const MachineFrameInfo *) const {
87*9880d681SAndroid Build Coastguard Worker return false;
88*9880d681SAndroid Build Coastguard Worker }
89*9880d681SAndroid Build Coastguard Worker
GlobalValuePseudoSourceValue(const GlobalValue * GV)90*9880d681SAndroid Build Coastguard Worker GlobalValuePseudoSourceValue::GlobalValuePseudoSourceValue(
91*9880d681SAndroid Build Coastguard Worker const GlobalValue *GV)
92*9880d681SAndroid Build Coastguard Worker : CallEntryPseudoSourceValue(GlobalValueCallEntry), GV(GV) {}
93*9880d681SAndroid Build Coastguard Worker
ExternalSymbolPseudoSourceValue(const char * ES)94*9880d681SAndroid Build Coastguard Worker ExternalSymbolPseudoSourceValue::ExternalSymbolPseudoSourceValue(const char *ES)
95*9880d681SAndroid Build Coastguard Worker : CallEntryPseudoSourceValue(ExternalSymbolCallEntry), ES(ES) {}
96*9880d681SAndroid Build Coastguard Worker
PseudoSourceValueManager()97*9880d681SAndroid Build Coastguard Worker PseudoSourceValueManager::PseudoSourceValueManager()
98*9880d681SAndroid Build Coastguard Worker : StackPSV(PseudoSourceValue::Stack), GOTPSV(PseudoSourceValue::GOT),
99*9880d681SAndroid Build Coastguard Worker JumpTablePSV(PseudoSourceValue::JumpTable),
100*9880d681SAndroid Build Coastguard Worker ConstantPoolPSV(PseudoSourceValue::ConstantPool) {}
101*9880d681SAndroid Build Coastguard Worker
getStack()102*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *PseudoSourceValueManager::getStack() {
103*9880d681SAndroid Build Coastguard Worker return &StackPSV;
104*9880d681SAndroid Build Coastguard Worker }
105*9880d681SAndroid Build Coastguard Worker
getGOT()106*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *PseudoSourceValueManager::getGOT() { return &GOTPSV; }
107*9880d681SAndroid Build Coastguard Worker
getConstantPool()108*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *PseudoSourceValueManager::getConstantPool() {
109*9880d681SAndroid Build Coastguard Worker return &ConstantPoolPSV;
110*9880d681SAndroid Build Coastguard Worker }
111*9880d681SAndroid Build Coastguard Worker
getJumpTable()112*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *PseudoSourceValueManager::getJumpTable() {
113*9880d681SAndroid Build Coastguard Worker return &JumpTablePSV;
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker
getFixedStack(int FI)116*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *PseudoSourceValueManager::getFixedStack(int FI) {
117*9880d681SAndroid Build Coastguard Worker std::unique_ptr<FixedStackPseudoSourceValue> &V = FSValues[FI];
118*9880d681SAndroid Build Coastguard Worker if (!V)
119*9880d681SAndroid Build Coastguard Worker V = llvm::make_unique<FixedStackPseudoSourceValue>(FI);
120*9880d681SAndroid Build Coastguard Worker return V.get();
121*9880d681SAndroid Build Coastguard Worker }
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *
getGlobalValueCallEntry(const GlobalValue * GV)124*9880d681SAndroid Build Coastguard Worker PseudoSourceValueManager::getGlobalValueCallEntry(const GlobalValue *GV) {
125*9880d681SAndroid Build Coastguard Worker std::unique_ptr<const GlobalValuePseudoSourceValue> &E =
126*9880d681SAndroid Build Coastguard Worker GlobalCallEntries[GV];
127*9880d681SAndroid Build Coastguard Worker if (!E)
128*9880d681SAndroid Build Coastguard Worker E = llvm::make_unique<GlobalValuePseudoSourceValue>(GV);
129*9880d681SAndroid Build Coastguard Worker return E.get();
130*9880d681SAndroid Build Coastguard Worker }
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *
getExternalSymbolCallEntry(const char * ES)133*9880d681SAndroid Build Coastguard Worker PseudoSourceValueManager::getExternalSymbolCallEntry(const char *ES) {
134*9880d681SAndroid Build Coastguard Worker std::unique_ptr<const ExternalSymbolPseudoSourceValue> &E =
135*9880d681SAndroid Build Coastguard Worker ExternalCallEntries[ES];
136*9880d681SAndroid Build Coastguard Worker if (!E)
137*9880d681SAndroid Build Coastguard Worker E = llvm::make_unique<ExternalSymbolPseudoSourceValue>(ES);
138*9880d681SAndroid Build Coastguard Worker return E.get();
139*9880d681SAndroid Build Coastguard Worker }
140