Skip to content

Commit 1bb6894

Browse files
authored
Generate proper DWARF reg num for ARM32 (#57443)
After introduction of VFP-v3 ARM S0-S31 no longer can be generated using LLVM because numbering of registers to start from 256 and only D0-D31 are used. So this change encode S0 as D0, S2 as D1, etc. Also use reg nums for DXX registers. This change fix generation of CFI codes, which trigger issue with generation of DWARF using LLVM in NativeAOT See https://developer.arm.com/documentation/ihi0040/c/?lang=en#dwarf-register-names See dotnet/runtimelab#1388
1 parent 26b20d0 commit 1bb6894

File tree

2 files changed

+31
-66
lines changed

2 files changed

+31
-66
lines changed

src/coreclr/jit/unwind.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ void Compiler::unwindPushPopMaskCFI(regMaskTP regMask, bool isFloat)
186186
{
187187
regMaskTP regBit = isFloat ? genRegMask(REG_FP_FIRST) : 1;
188188

189-
for (regNumber regNum = isFloat ? REG_FP_FIRST : REG_FIRST; regNum < REG_COUNT;
190-
regNum = REG_NEXT(regNum), regBit <<= 1)
189+
regNumber regNum = isFloat ? REG_FP_FIRST : REG_FIRST;
190+
for (; regNum < REG_COUNT;)
191191
{
192192
if (regBit > regMask)
193193
{
@@ -198,6 +198,19 @@ void Compiler::unwindPushPopMaskCFI(regMaskTP regMask, bool isFloat)
198198
{
199199
unwindPushPopCFI(regNum);
200200
}
201+
202+
#if TARGET_ARM
203+
// JIT for ARM emit local variables in S0-S31 registers,
204+
// which cannot be emitted to DWARF when using LLVM,
205+
// because LLVM only know about D0-D31.
206+
// As such pairs Sx,Sx+1 are referenced as D0-D15 registers in DWARF
207+
// For that we process registers in pairs.
208+
regNum = isFloat ? REG_NEXT(REG_NEXT(regNum)) : REG_NEXT(regNum);
209+
regBit <<= isFloat ? 2 : 1;
210+
#else
211+
regNum = REG_NEXT(regNum);
212+
regBit <<= 1;
213+
#endif
201214
}
202215
}
203216

src/coreclr/jit/unwindarm.cpp

Lines changed: 16 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -71,100 +71,52 @@ short Compiler::mapRegNumToDwarfReg(regNumber reg)
7171
dwarfReg = 15;
7272
break;
7373
case REG_F0:
74-
dwarfReg = 64;
75-
break;
76-
case REG_F1:
77-
dwarfReg = 65;
74+
dwarfReg = 256;
7875
break;
7976
case REG_F2:
80-
dwarfReg = 66;
81-
break;
82-
case REG_F3:
83-
dwarfReg = 67;
77+
dwarfReg = 257;
8478
break;
8579
case REG_F4:
86-
dwarfReg = 68;
87-
break;
88-
case REG_F5:
89-
dwarfReg = 69;
80+
dwarfReg = 258;
9081
break;
9182
case REG_F6:
92-
dwarfReg = 70;
93-
break;
94-
case REG_F7:
95-
dwarfReg = 71;
83+
dwarfReg = 259;
9684
break;
9785
case REG_F8:
98-
dwarfReg = 72;
99-
break;
100-
case REG_F9:
101-
dwarfReg = 73;
86+
dwarfReg = 260;
10287
break;
10388
case REG_F10:
104-
dwarfReg = 74;
105-
break;
106-
case REG_F11:
107-
dwarfReg = 75;
89+
dwarfReg = 261;
10890
break;
10991
case REG_F12:
110-
dwarfReg = 76;
111-
break;
112-
case REG_F13:
113-
dwarfReg = 77;
92+
dwarfReg = 262;
11493
break;
11594
case REG_F14:
116-
dwarfReg = 78;
117-
break;
118-
case REG_F15:
119-
dwarfReg = 79;
95+
dwarfReg = 263;
12096
break;
12197
case REG_F16:
122-
dwarfReg = 80;
123-
break;
124-
case REG_F17:
125-
dwarfReg = 81;
98+
dwarfReg = 264;
12699
break;
127100
case REG_F18:
128-
dwarfReg = 82;
129-
break;
130-
case REG_F19:
131-
dwarfReg = 83;
101+
dwarfReg = 265;
132102
break;
133103
case REG_F20:
134-
dwarfReg = 84;
135-
break;
136-
case REG_F21:
137-
dwarfReg = 85;
104+
dwarfReg = 266;
138105
break;
139106
case REG_F22:
140-
dwarfReg = 86;
141-
break;
142-
case REG_F23:
143-
dwarfReg = 87;
107+
dwarfReg = 267;
144108
break;
145109
case REG_F24:
146-
dwarfReg = 88;
147-
break;
148-
case REG_F25:
149-
dwarfReg = 89;
110+
dwarfReg = 268;
150111
break;
151112
case REG_F26:
152-
dwarfReg = 90;
153-
break;
154-
case REG_F27:
155-
dwarfReg = 91;
113+
dwarfReg = 269;
156114
break;
157115
case REG_F28:
158-
dwarfReg = 92;
159-
break;
160-
case REG_F29:
161-
dwarfReg = 93;
116+
dwarfReg = 270;
162117
break;
163118
case REG_F30:
164-
dwarfReg = 94;
165-
break;
166-
case REG_F31:
167-
dwarfReg = 95;
119+
dwarfReg = 271;
168120
break;
169121
default:
170122
noway_assert(!"unexpected REG_NUM");

0 commit comments

Comments
 (0)