LLVM 17.0.0git
MCRegisterInfo.cpp
Go to the documentation of this file.
1//===- MC/MCRegisterInfo.cpp - Target Register Description ----------------===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements MCRegisterInfo functions.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/DenseMap.h"
15#include "llvm/ADT/Twine.h"
17#include <algorithm>
18#include <cassert>
19#include <cstdint>
20
21using namespace llvm;
22
25 const MCRegisterClass *RC) const {
26 for (MCSuperRegIterator Supers(Reg, this); Supers.isValid(); ++Supers)
27 if (RC->contains(*Supers) && Reg == getSubReg(*Supers, SubIdx))
28 return *Supers;
29 return 0;
30}
31
34 "This is not a subregister index");
35 // Get a pointer to the corresponding SubRegIndices list. This list has the
36 // name of each sub-register in the same order as MCSubRegIterator.
37 const uint16_t *SRI = SubRegIndices + get(Reg).SubRegIndices;
38 for (MCSubRegIterator Subs(Reg, this); Subs.isValid(); ++Subs, ++SRI)
39 if (*SRI == Idx)
40 return *Subs;
41 return 0;
42}
43
45 MCRegister SubReg) const {
46 assert(SubReg && SubReg < getNumRegs() && "This is not a register");
47 // Get a pointer to the corresponding SubRegIndices list. This list has the
48 // name of each sub-register in the same order as MCSubRegIterator.
49 const uint16_t *SRI = SubRegIndices + get(Reg).SubRegIndices;
50 for (MCSubRegIterator Subs(Reg, this); Subs.isValid(); ++Subs, ++SRI)
51 if (*Subs == SubReg)
52 return *SRI;
53 return 0;
54}
55
56unsigned MCRegisterInfo::getSubRegIdxSize(unsigned Idx) const {
58 "This is not a subregister index");
59 return SubRegIdxRanges[Idx].Size;
60}
61
62unsigned MCRegisterInfo::getSubRegIdxOffset(unsigned Idx) const {
64 "This is not a subregister index");
65 return SubRegIdxRanges[Idx].Offset;
66}
67
68int MCRegisterInfo::getDwarfRegNum(MCRegister RegNum, bool isEH) const {
69 const DwarfLLVMRegPair *M = isEH ? EHL2DwarfRegs : L2DwarfRegs;
70 unsigned Size = isEH ? EHL2DwarfRegsSize : L2DwarfRegsSize;
71
72 if (!M)
73 return -1;
74 DwarfLLVMRegPair Key = { RegNum, 0 };
75 const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, Key);
76 if (I == M+Size || I->FromReg != RegNum)
77 return -1;
78 return I->ToReg;
79}
80
81std::optional<unsigned> MCRegisterInfo::getLLVMRegNum(unsigned RegNum,
82 bool isEH) const {
83 const DwarfLLVMRegPair *M = isEH ? EHDwarf2LRegs : Dwarf2LRegs;
84 unsigned Size = isEH ? EHDwarf2LRegsSize : Dwarf2LRegsSize;
85
86 if (!M)
87 return std::nullopt;
88 DwarfLLVMRegPair Key = { RegNum, 0 };
89 const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, Key);
90 if (I != M + Size && I->FromReg == RegNum)
91 return I->ToReg;
92 return std::nullopt;
93}
94
96 // On ELF platforms, DWARF EH register numbers are the same as DWARF
97 // other register numbers. On Darwin x86, they differ and so need to be
98 // mapped. The .cfi_* directives accept integer literals as well as
99 // register names and should generate exactly what the assembly code
100 // asked for, so there might be DWARF/EH register numbers that don't have
101 // a corresponding LLVM register number at all. So if we can't map the
102 // EH register number to an LLVM register number, assume it's just a
103 // valid DWARF register number as is.
104 if (std::optional<unsigned> LRegNum = getLLVMRegNum(RegNum, true))
105 return getDwarfRegNum(*LRegNum, false);
106 return RegNum;
107}
108
110 const DenseMap<MCRegister, int>::const_iterator I = L2SEHRegs.find(RegNum);
111 if (I == L2SEHRegs.end()) return (int)RegNum;
112 return I->second;
113}
114
116 if (L2CVRegs.empty())
117 report_fatal_error("target does not implement codeview register mapping");
118 const DenseMap<MCRegister, int>::const_iterator I = L2CVRegs.find(RegNum);
119 if (I == L2CVRegs.end())
120 report_fatal_error("unknown codeview register " + (RegNum < getNumRegs()
121 ? getName(RegNum)
122 : Twine(RegNum)));
123 return I->second;
124}
125
127 // Regunits are numerically ordered. Find a common unit.
128 MCRegUnitIterator RUA(RegA, this);
129 MCRegUnitIterator RUB(RegB, this);
130 do {
131 if (*RUA == *RUB)
132 return true;
133 } while (*RUA < *RUB ? (++RUA).isValid() : (++RUB).isValid());
134 return false;
135}
unsigned SubReg
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
uint64_t Size
#define I(x, y, z)
Definition: MD5.cpp:58
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
MCRegisterClass - Base class of TargetRegisterClass.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
unsigned getNumSubRegIndices() const
Return the number of sub-register indices understood by the target.
unsigned getSubRegIdxSize(unsigned Idx) const
Get the size of the bit range covered by a sub-register index.
int getDwarfRegNum(MCRegister RegNum, bool isEH) const
Map a target register to an equivalent dwarf register number.
bool regsOverlap(MCRegister RegA, MCRegister RegB) const
Returns true if the two registers are equal or alias each other.
MCRegister getMatchingSuperReg(MCRegister Reg, unsigned SubIdx, const MCRegisterClass *RC) const
Return a super-register of the specified register Reg so its sub-register of index SubIdx is Reg.
int getCodeViewRegNum(MCRegister RegNum) const
Map a target register to an equivalent CodeView register number.
std::optional< unsigned > getLLVMRegNum(unsigned RegNum, bool isEH) const
Map a dwarf register back to a target register.
const MCRegisterDesc & get(MCRegister RegNo) const
Provide a get method, equivalent to [], but more useful with a pointer to this object.
int getSEHRegNum(MCRegister RegNum) const
Map a target register to an equivalent SEH register number.
const char * getName(MCRegister RegNo) const
Return the human-readable symbolic target-specific name for the specified physical register.
int getDwarfRegNumFromDwarfEHRegNum(unsigned RegNum) const
Map a target EH register number to an equivalent DWARF register number.
unsigned getSubRegIndex(MCRegister RegNo, MCRegister SubRegNo) const
For a given register pair, return the sub-register index if the second register is a sub-register of ...
unsigned getSubRegIdxOffset(unsigned Idx) const
Get the offset of the bit range covered by a sub-register index.
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:24
MCSubRegIterator enumerates all sub-registers of Reg.
MCSuperRegIterator enumerates all super-registers of Reg.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:145
DwarfLLVMRegPair - Emitted by tablegen so Dwarf<->LLVM reg mappings can be performed with a binary se...