Path: blob/main/contrib/llvm-project/llvm/lib/Target/ARM/ARMConstantPoolValue.cpp
35266 views
//===- ARMConstantPoolValue.cpp - ARM constantpool value ------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements the ARM specific constantpool value class.9//10//===----------------------------------------------------------------------===//1112#include "ARMConstantPoolValue.h"13#include "llvm/ADT/FoldingSet.h"14#include "llvm/CodeGen/MachineBasicBlock.h"15#include "llvm/Config/llvm-config.h"16#include "llvm/IR/Constant.h"17#include "llvm/IR/Constants.h"18#include "llvm/IR/GlobalValue.h"19#include "llvm/IR/GlobalVariable.h"20#include "llvm/IR/Type.h"21#include "llvm/Support/Casting.h"22#include "llvm/Support/Compiler.h"23#include "llvm/Support/ErrorHandling.h"24#include "llvm/Support/raw_ostream.h"2526using namespace llvm;2728//===----------------------------------------------------------------------===//29// ARMConstantPoolValue30//===----------------------------------------------------------------------===//3132ARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id,33ARMCP::ARMCPKind kind,34unsigned char PCAdj,35ARMCP::ARMCPModifier modifier,36bool addCurrentAddress)37: MachineConstantPoolValue(Ty), LabelId(id), Kind(kind),38PCAdjust(PCAdj), Modifier(modifier),39AddCurrentAddress(addCurrentAddress) {}4041ARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C, unsigned id,42ARMCP::ARMCPKind kind,43unsigned char PCAdj,44ARMCP::ARMCPModifier modifier,45bool addCurrentAddress)46: MachineConstantPoolValue((Type*)Type::getInt32Ty(C)),47LabelId(id), Kind(kind), PCAdjust(PCAdj), Modifier(modifier),48AddCurrentAddress(addCurrentAddress) {}4950ARMConstantPoolValue::~ARMConstantPoolValue() = default;5152StringRef ARMConstantPoolValue::getModifierText() const {53switch (Modifier) {54// FIXME: Are these case sensitive? It'd be nice to lower-case all the55// strings if that's legal.56case ARMCP::no_modifier:57return "none";58case ARMCP::TLSGD:59return "tlsgd";60case ARMCP::GOT_PREL:61return "GOT_PREL";62case ARMCP::GOTTPOFF:63return "gottpoff";64case ARMCP::TPOFF:65return "tpoff";66case ARMCP::SBREL:67return "SBREL";68case ARMCP::SECREL:69return "secrel32";70}71llvm_unreachable("Unknown modifier!");72}7374int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,75Align Alignment) {76llvm_unreachable("Shouldn't be calling this directly!");77}7879void80ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {81ID.AddInteger(LabelId);82ID.AddInteger(PCAdjust);83}8485bool86ARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) {87if (ACPV->Kind == Kind &&88ACPV->PCAdjust == PCAdjust &&89ACPV->Modifier == Modifier &&90ACPV->LabelId == LabelId &&91ACPV->AddCurrentAddress == AddCurrentAddress) {92// Two PC relative constpool entries containing the same GV address or93// external symbols. FIXME: What about blockaddress?94if (Kind == ARMCP::CPValue || Kind == ARMCP::CPExtSymbol)95return true;96}97return false;98}99100#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)101LLVM_DUMP_METHOD void ARMConstantPoolValue::dump() const {102errs() << " " << *this;103}104#endif105106void ARMConstantPoolValue::print(raw_ostream &O) const {107if (Modifier) O << "(" << getModifierText() << ")";108if (PCAdjust != 0) {109O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust;110if (AddCurrentAddress) O << "-.";111O << ")";112}113}114115//===----------------------------------------------------------------------===//116// ARMConstantPoolConstant117//===----------------------------------------------------------------------===//118119ARMConstantPoolConstant::ARMConstantPoolConstant(Type *Ty,120const Constant *C,121unsigned ID,122ARMCP::ARMCPKind Kind,123unsigned char PCAdj,124ARMCP::ARMCPModifier Modifier,125bool AddCurrentAddress)126: ARMConstantPoolValue(Ty, ID, Kind, PCAdj, Modifier, AddCurrentAddress),127CVal(C) {}128129ARMConstantPoolConstant::ARMConstantPoolConstant(const Constant *C,130unsigned ID,131ARMCP::ARMCPKind Kind,132unsigned char PCAdj,133ARMCP::ARMCPModifier Modifier,134bool AddCurrentAddress)135: ARMConstantPoolValue((Type*)C->getType(), ID, Kind, PCAdj, Modifier,136AddCurrentAddress),137CVal(C) {}138139ARMConstantPoolConstant::ARMConstantPoolConstant(const GlobalVariable *GV,140const Constant *C)141: ARMConstantPoolValue((Type *)C->getType(), 0, ARMCP::CPPromotedGlobal, 0,142ARMCP::no_modifier, false), CVal(C) {143GVars.insert(GV);144}145146ARMConstantPoolConstant *147ARMConstantPoolConstant::Create(const Constant *C, unsigned ID) {148return new ARMConstantPoolConstant(C, ID, ARMCP::CPValue, 0,149ARMCP::no_modifier, false);150}151152ARMConstantPoolConstant *153ARMConstantPoolConstant::Create(const GlobalVariable *GVar,154const Constant *Initializer) {155return new ARMConstantPoolConstant(GVar, Initializer);156}157158ARMConstantPoolConstant *159ARMConstantPoolConstant::Create(const GlobalValue *GV,160ARMCP::ARMCPModifier Modifier) {161return new ARMConstantPoolConstant((Type*)Type::getInt32Ty(GV->getContext()),162GV, 0, ARMCP::CPValue, 0,163Modifier, false);164}165166ARMConstantPoolConstant *167ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,168ARMCP::ARMCPKind Kind, unsigned char PCAdj) {169return new ARMConstantPoolConstant(C, ID, Kind, PCAdj,170ARMCP::no_modifier, false);171}172173ARMConstantPoolConstant *174ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,175ARMCP::ARMCPKind Kind, unsigned char PCAdj,176ARMCP::ARMCPModifier Modifier,177bool AddCurrentAddress) {178return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, Modifier,179AddCurrentAddress);180}181182const GlobalValue *ARMConstantPoolConstant::getGV() const {183return dyn_cast_or_null<GlobalValue>(CVal);184}185186const BlockAddress *ARMConstantPoolConstant::getBlockAddress() const {187return dyn_cast_or_null<BlockAddress>(CVal);188}189190int ARMConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP,191Align Alignment) {192int index =193getExistingMachineCPValueImpl<ARMConstantPoolConstant>(CP, Alignment);194if (index != -1) {195auto *CPV = static_cast<ARMConstantPoolValue*>(196CP->getConstants()[index].Val.MachineCPVal);197auto *Constant = cast<ARMConstantPoolConstant>(CPV);198Constant->GVars.insert(GVars.begin(), GVars.end());199}200return index;201}202203bool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) {204const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV);205return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV);206}207208void ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {209ID.AddPointer(CVal);210for (const auto *GV : GVars)211ID.AddPointer(GV);212ARMConstantPoolValue::addSelectionDAGCSEId(ID);213}214215void ARMConstantPoolConstant::print(raw_ostream &O) const {216O << CVal->getName();217ARMConstantPoolValue::print(O);218}219220//===----------------------------------------------------------------------===//221// ARMConstantPoolSymbol222//===----------------------------------------------------------------------===//223224ARMConstantPoolSymbol::ARMConstantPoolSymbol(LLVMContext &C, StringRef s,225unsigned id, unsigned char PCAdj,226ARMCP::ARMCPModifier Modifier,227bool AddCurrentAddress)228: ARMConstantPoolValue(C, id, ARMCP::CPExtSymbol, PCAdj, Modifier,229AddCurrentAddress),230S(std::string(s)) {}231232ARMConstantPoolSymbol *ARMConstantPoolSymbol::Create(LLVMContext &C,233StringRef s, unsigned ID,234unsigned char PCAdj) {235return new ARMConstantPoolSymbol(C, s, ID, PCAdj, ARMCP::no_modifier, false);236}237238int ARMConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP,239Align Alignment) {240return getExistingMachineCPValueImpl<ARMConstantPoolSymbol>(CP, Alignment);241}242243bool ARMConstantPoolSymbol::hasSameValue(ARMConstantPoolValue *ACPV) {244const ARMConstantPoolSymbol *ACPS = dyn_cast<ARMConstantPoolSymbol>(ACPV);245return ACPS && ACPS->S == S && ARMConstantPoolValue::hasSameValue(ACPV);246}247248void ARMConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) {249ID.AddString(S);250ARMConstantPoolValue::addSelectionDAGCSEId(ID);251}252253void ARMConstantPoolSymbol::print(raw_ostream &O) const {254O << S;255ARMConstantPoolValue::print(O);256}257258//===----------------------------------------------------------------------===//259// ARMConstantPoolMBB260//===----------------------------------------------------------------------===//261262ARMConstantPoolMBB::ARMConstantPoolMBB(LLVMContext &C,263const MachineBasicBlock *mbb,264unsigned id, unsigned char PCAdj,265ARMCP::ARMCPModifier Modifier,266bool AddCurrentAddress)267: ARMConstantPoolValue(C, id, ARMCP::CPMachineBasicBlock, PCAdj,268Modifier, AddCurrentAddress),269MBB(mbb) {}270271ARMConstantPoolMBB *ARMConstantPoolMBB::Create(LLVMContext &C,272const MachineBasicBlock *mbb,273unsigned ID,274unsigned char PCAdj) {275return new ARMConstantPoolMBB(C, mbb, ID, PCAdj, ARMCP::no_modifier, false);276}277278int ARMConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP,279Align Alignment) {280return getExistingMachineCPValueImpl<ARMConstantPoolMBB>(CP, Alignment);281}282283bool ARMConstantPoolMBB::hasSameValue(ARMConstantPoolValue *ACPV) {284const ARMConstantPoolMBB *ACPMBB = dyn_cast<ARMConstantPoolMBB>(ACPV);285return ACPMBB && ACPMBB->MBB == MBB &&286ARMConstantPoolValue::hasSameValue(ACPV);287}288289void ARMConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) {290ID.AddPointer(MBB);291ARMConstantPoolValue::addSelectionDAGCSEId(ID);292}293294void ARMConstantPoolMBB::print(raw_ostream &O) const {295O << printMBBReference(*MBB);296ARMConstantPoolValue::print(O);297}298299300