@@ -100,7 +100,7 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,
100
100
unsigned MachineReg, unsigned MaxSize) {
101
101
if (!llvm::Register::isPhysicalRegister (MachineReg)) {
102
102
if (isFrameRegister (TRI, MachineReg)) {
103
- DwarfRegs.push_back ({ -1 , 0 , nullptr } );
103
+ DwarfRegs.push_back (Register::createRegister ( -1 , nullptr ) );
104
104
return true ;
105
105
}
106
106
return false ;
@@ -110,7 +110,7 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,
110
110
111
111
// If this is a valid register number, emit it.
112
112
if (Reg >= 0 ) {
113
- DwarfRegs.push_back ({ Reg, 0 , nullptr } );
113
+ DwarfRegs.push_back (Register::createRegister ( Reg, nullptr ) );
114
114
return true ;
115
115
}
116
116
@@ -122,7 +122,7 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,
122
122
unsigned Idx = TRI.getSubRegIndex (*SR, MachineReg);
123
123
unsigned Size = TRI.getSubRegIdxSize (Idx);
124
124
unsigned RegOffset = TRI.getSubRegIdxOffset (Idx);
125
- DwarfRegs.push_back ({ Reg, 0 , " super-register" } );
125
+ DwarfRegs.push_back (Register::createRegister ( Reg, " super-register" ) );
126
126
// Use a DW_OP_bit_piece to describe the sub-register.
127
127
setSubRegisterPiece (Size, RegOffset);
128
128
return true ;
@@ -149,8 +149,8 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,
149
149
if (Reg < 0 )
150
150
continue ;
151
151
152
- // Intersection between the bits we already emitted and the bits
153
- // covered by this subregister.
152
+ // Used to build the intersection between the bits we already
153
+ // emitted and the bits covered by this subregister.
154
154
SmallBitVector CurSubReg (RegSize, false );
155
155
CurSubReg.set (Offset, Offset + Size);
156
156
@@ -159,10 +159,13 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,
159
159
if (Offset < MaxSize && CurSubReg.test (Coverage)) {
160
160
// Emit a piece for any gap in the coverage.
161
161
if (Offset > CurPos)
162
- DwarfRegs.push_back (
163
- {-1 , Offset - CurPos, " no DWARF register encoding" });
164
- DwarfRegs.push_back (
165
- {Reg, std::min<unsigned >(Size, MaxSize - Offset), " sub-register" });
162
+ DwarfRegs.push_back (Register::createSubRegister (
163
+ -1 , Offset - CurPos, " no DWARF register encoding" ));
164
+ if (Offset == 0 && Size >= MaxSize)
165
+ DwarfRegs.push_back (Register::createRegister (Reg, " sub-register" ));
166
+ else
167
+ DwarfRegs.push_back (Register::createSubRegister (
168
+ Reg, std::min<unsigned >(Size, MaxSize - Offset), " sub-register" ));
166
169
}
167
170
// Mark it as emitted.
168
171
Coverage.set (Offset, Offset + Size);
@@ -173,7 +176,8 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,
173
176
return false ;
174
177
// Found a partial or complete DWARF encoding.
175
178
if (CurPos < RegSize)
176
- DwarfRegs.push_back ({-1 , RegSize - CurPos, " no DWARF register encoding" });
179
+ DwarfRegs.push_back (Register::createSubRegister (
180
+ -1 , RegSize - CurPos, " no DWARF register encoding" ));
177
181
return true ;
178
182
}
179
183
@@ -249,7 +253,7 @@ bool DwarfExpression::addMachineRegExpression(const TargetRegisterInfo &TRI,
249
253
for (auto &Reg : DwarfRegs) {
250
254
if (Reg.DwarfRegNo >= 0 )
251
255
addReg (Reg.DwarfRegNo , Reg.Comment );
252
- addOpPiece (Reg.Size );
256
+ addOpPiece (Reg.SubRegSize );
253
257
}
254
258
255
259
if (isEntryValue ())
@@ -276,7 +280,7 @@ bool DwarfExpression::addMachineRegExpression(const TargetRegisterInfo &TRI,
276
280
auto Reg = DwarfRegs[0 ];
277
281
bool FBReg = isFrameRegister (TRI, MachineReg);
278
282
int SignedOffset = 0 ;
279
- assert (Reg.Size == 0 && " subregister has same size as superregister " );
283
+ assert (! Reg.isSubRegister () && " full register expected " );
280
284
281
285
// Pattern-match combinations for which more efficient representations exist.
282
286
// [Reg, DW_OP_plus_uconst, Offset] --> [DW_OP_breg, Offset].
0 commit comments