brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · d102d22 Raw
154 lines · cpp
1//===-- llvm/CodeGen/PseudoSourceValue.cpp ----------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the PseudoSourceValue class.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/CodeGen/PseudoSourceValue.h"14#include "llvm/CodeGen/MachineFrameInfo.h"15#include "llvm/CodeGen/PseudoSourceValueManager.h"16#include "llvm/IR/GlobalValue.h"17#include "llvm/Support/ErrorHandling.h"18#include "llvm/Support/raw_ostream.h"19#include "llvm/Target/TargetMachine.h"20 21using namespace llvm;22 23static const char *const PSVNames[] = {24    "Stack", "GOT", "JumpTable", "ConstantPool", "FixedStack",25    "GlobalValueCallEntry", "ExternalSymbolCallEntry"};26 27PseudoSourceValue::PseudoSourceValue(unsigned Kind, const TargetMachine &TM)28    : Kind(Kind) {29  AddressSpace = TM.getAddressSpaceForPseudoSourceKind(Kind);30}31 32PseudoSourceValue::~PseudoSourceValue() = default;33 34void PseudoSourceValue::printCustom(raw_ostream &O) const {35  if (Kind < TargetCustom)36    O << PSVNames[Kind];37  else38    O << "TargetCustom" << Kind;39}40 41bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const {42  if (isStack())43    return false;44  if (isGOT() || isConstantPool() || isJumpTable())45    return true;46  llvm_unreachable("Unknown PseudoSourceValue!");47}48 49bool PseudoSourceValue::isAliased(const MachineFrameInfo *) const {50  if (isStack() || isGOT() || isConstantPool() || isJumpTable())51    return false;52  llvm_unreachable("Unknown PseudoSourceValue!");53}54 55bool PseudoSourceValue::mayAlias(const MachineFrameInfo *) const {56  return !(isGOT() || isConstantPool() || isJumpTable());57}58 59bool FixedStackPseudoSourceValue::isConstant(60    const MachineFrameInfo *MFI) const {61  return MFI && MFI->isImmutableObjectIndex(FI);62}63 64bool FixedStackPseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const {65  if (!MFI)66    return true;67  return MFI->isAliasedObjectIndex(FI);68}69 70bool FixedStackPseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const {71  if (!MFI)72    return true;73  // Spill slots will not alias any LLVM IR value.74  return !MFI->isSpillSlotObjectIndex(FI);75}76 77void FixedStackPseudoSourceValue::printCustom(raw_ostream &OS) const {78  OS << "FixedStack" << FI;79}80 81CallEntryPseudoSourceValue::CallEntryPseudoSourceValue(unsigned Kind,82                                                       const TargetMachine &TM)83    : PseudoSourceValue(Kind, TM) {}84 85bool CallEntryPseudoSourceValue::isConstant(const MachineFrameInfo *) const {86  return false;87}88 89bool CallEntryPseudoSourceValue::isAliased(const MachineFrameInfo *) const {90  return false;91}92 93bool CallEntryPseudoSourceValue::mayAlias(const MachineFrameInfo *) const {94  return false;95}96 97GlobalValuePseudoSourceValue::GlobalValuePseudoSourceValue(98    const GlobalValue *GV, const TargetMachine &TM)99    : CallEntryPseudoSourceValue(GlobalValueCallEntry, TM), GV(GV) {}100ExternalSymbolPseudoSourceValue::ExternalSymbolPseudoSourceValue(101    const char *ES, const TargetMachine &TM)102    : CallEntryPseudoSourceValue(ExternalSymbolCallEntry, TM), ES(ES) {}103 104PseudoSourceValueManager::PseudoSourceValueManager(const TargetMachine &TMInfo)105    : TM(TMInfo), StackPSV(PseudoSourceValue::Stack, TM),106      GOTPSV(PseudoSourceValue::GOT, TM),107      JumpTablePSV(PseudoSourceValue::JumpTable, TM),108      ConstantPoolPSV(PseudoSourceValue::ConstantPool, TM) {}109 110const PseudoSourceValue *PseudoSourceValueManager::getStack() {111  return &StackPSV;112}113 114const PseudoSourceValue *PseudoSourceValueManager::getGOT() { return &GOTPSV; }115 116const PseudoSourceValue *PseudoSourceValueManager::getConstantPool() {117  return &ConstantPoolPSV;118}119 120const PseudoSourceValue *PseudoSourceValueManager::getJumpTable() {121  return &JumpTablePSV;122}123 124const PseudoSourceValue *125PseudoSourceValueManager::getFixedStack(int FI) {126  // Frame index is often continuously positive, but can be negative. Use127  // zig-zag encoding for dense index into FSValues vector.128  unsigned Idx = (2 * unsigned(FI)) ^ (FI >> (sizeof(FI) * 8 - 1));129  if (FSValues.size() <= Idx)130    FSValues.resize(Idx + 1);131  std::unique_ptr<FixedStackPseudoSourceValue> &V = FSValues[Idx];132  if (!V)133    V = std::make_unique<FixedStackPseudoSourceValue>(FI, TM);134  return V.get();135}136 137const PseudoSourceValue *138PseudoSourceValueManager::getGlobalValueCallEntry(const GlobalValue *GV) {139  std::unique_ptr<const GlobalValuePseudoSourceValue> &E =140      GlobalCallEntries[GV];141  if (!E)142    E = std::make_unique<GlobalValuePseudoSourceValue>(GV, TM);143  return E.get();144}145 146const PseudoSourceValue *147PseudoSourceValueManager::getExternalSymbolCallEntry(const char *ES) {148  std::unique_ptr<const ExternalSymbolPseudoSourceValue> &E =149      ExternalCallEntries[ES];150  if (!E)151    E = std::make_unique<ExternalSymbolPseudoSourceValue>(ES, TM);152  return E.get();153}154