@@ -133,6 +133,14 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
133
133
public:
134
134
using MCPlusBuilder::MCPlusBuilder;
135
135
136
+ bool isPush (const MCInst &Inst) const override {
137
+ return isStoreToStack (Inst);
138
+ };
139
+
140
+ bool isPop (const MCInst &Inst) const override {
141
+ return isLoadFromStack (Inst);
142
+ };
143
+
136
144
bool equals (const MCTargetExpr &A, const MCTargetExpr &B,
137
145
CompFuncTy Comp) const override {
138
146
const auto &AArch64ExprA = cast<AArch64MCExpr>(A);
@@ -214,11 +222,16 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
214
222
}
215
223
216
224
bool isLDRB (const MCInst &Inst) const {
217
- return (Inst.getOpcode () == AArch64::LDRBBpost ||
225
+ return (Inst.getOpcode () == AArch64::LDRBpost ||
226
+ Inst.getOpcode () == AArch64::LDRBBpost ||
218
227
Inst.getOpcode () == AArch64::LDRBBpre ||
219
228
Inst.getOpcode () == AArch64::LDRBBroW ||
229
+ Inst.getOpcode () == AArch64::LDRBroW ||
230
+ Inst.getOpcode () == AArch64::LDRBroX ||
220
231
Inst.getOpcode () == AArch64::LDRBBroX ||
221
232
Inst.getOpcode () == AArch64::LDRBBui ||
233
+ Inst.getOpcode () == AArch64::LDRBui ||
234
+ Inst.getOpcode () == AArch64::LDRBpre ||
222
235
Inst.getOpcode () == AArch64::LDRSBWpost ||
223
236
Inst.getOpcode () == AArch64::LDRSBWpre ||
224
237
Inst.getOpcode () == AArch64::LDRSBWroW ||
@@ -228,15 +241,27 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
228
241
Inst.getOpcode () == AArch64::LDRSBXpre ||
229
242
Inst.getOpcode () == AArch64::LDRSBXroW ||
230
243
Inst.getOpcode () == AArch64::LDRSBXroX ||
231
- Inst.getOpcode () == AArch64::LDRSBXui);
244
+ Inst.getOpcode () == AArch64::LDRSBXui ||
245
+ Inst.getOpcode () == AArch64::LDURBi ||
246
+ Inst.getOpcode () == AArch64::LDURBBi ||
247
+ Inst.getOpcode () == AArch64::LDURSBWi ||
248
+ Inst.getOpcode () == AArch64::LDURSBXi ||
249
+ Inst.getOpcode () == AArch64::LDTRBi ||
250
+ Inst.getOpcode () == AArch64::LDTRSBWi ||
251
+ Inst.getOpcode () == AArch64::LDTRSBXi);
232
252
}
233
253
234
254
bool isLDRH (const MCInst &Inst) const {
235
- return (Inst.getOpcode () == AArch64::LDRHHpost ||
255
+ return (Inst.getOpcode () == AArch64::LDRHpost ||
256
+ Inst.getOpcode () == AArch64::LDRHHpost ||
236
257
Inst.getOpcode () == AArch64::LDRHHpre ||
258
+ Inst.getOpcode () == AArch64::LDRHroW ||
237
259
Inst.getOpcode () == AArch64::LDRHHroW ||
260
+ Inst.getOpcode () == AArch64::LDRHroX ||
238
261
Inst.getOpcode () == AArch64::LDRHHroX ||
239
262
Inst.getOpcode () == AArch64::LDRHHui ||
263
+ Inst.getOpcode () == AArch64::LDRHui ||
264
+ Inst.getOpcode () == AArch64::LDRHpre ||
240
265
Inst.getOpcode () == AArch64::LDRSHWpost ||
241
266
Inst.getOpcode () == AArch64::LDRSHWpre ||
242
267
Inst.getOpcode () == AArch64::LDRSHWroW ||
@@ -246,27 +271,98 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
246
271
Inst.getOpcode () == AArch64::LDRSHXpre ||
247
272
Inst.getOpcode () == AArch64::LDRSHXroW ||
248
273
Inst.getOpcode () == AArch64::LDRSHXroX ||
249
- Inst.getOpcode () == AArch64::LDRSHXui);
274
+ Inst.getOpcode () == AArch64::LDRSHXui ||
275
+ Inst.getOpcode () == AArch64::LDURHi ||
276
+ Inst.getOpcode () == AArch64::LDURHHi ||
277
+ Inst.getOpcode () == AArch64::LDURSHWi ||
278
+ Inst.getOpcode () == AArch64::LDURSHXi ||
279
+ Inst.getOpcode () == AArch64::LDTRHi ||
280
+ Inst.getOpcode () == AArch64::LDTRSHWi ||
281
+ Inst.getOpcode () == AArch64::LDTRSHXi);
250
282
}
251
283
252
284
bool isLDRW (const MCInst &Inst) const {
253
285
return (Inst.getOpcode () == AArch64::LDRWpost ||
254
286
Inst.getOpcode () == AArch64::LDRWpre ||
255
287
Inst.getOpcode () == AArch64::LDRWroW ||
256
288
Inst.getOpcode () == AArch64::LDRWroX ||
257
- Inst.getOpcode () == AArch64::LDRWui);
289
+ Inst.getOpcode () == AArch64::LDRWui ||
290
+ Inst.getOpcode () == AArch64::LDURWi ||
291
+ Inst.getOpcode () == AArch64::LDRSWpost ||
292
+ Inst.getOpcode () == AArch64::LDRSWpre ||
293
+ Inst.getOpcode () == AArch64::LDRSWroW ||
294
+ Inst.getOpcode () == AArch64::LDRSWroX ||
295
+ Inst.getOpcode () == AArch64::LDRSWui ||
296
+ Inst.getOpcode () == AArch64::LDURSWi ||
297
+ Inst.getOpcode () == AArch64::LDTRWi ||
298
+ Inst.getOpcode () == AArch64::LDTRSWi ||
299
+ Inst.getOpcode () == AArch64::LDPWi ||
300
+ Inst.getOpcode () == AArch64::LDPWpost ||
301
+ Inst.getOpcode () == AArch64::LDPWpre ||
302
+ Inst.getOpcode () == AArch64::LDPSWi ||
303
+ Inst.getOpcode () == AArch64::LDPSWpost ||
304
+ Inst.getOpcode () == AArch64::LDPSWpre ||
305
+ Inst.getOpcode () == AArch64::LDNPWi);
258
306
}
259
307
260
308
bool isLDRX (const MCInst &Inst) const {
261
309
return (Inst.getOpcode () == AArch64::LDRXpost ||
262
310
Inst.getOpcode () == AArch64::LDRXpre ||
263
311
Inst.getOpcode () == AArch64::LDRXroW ||
264
312
Inst.getOpcode () == AArch64::LDRXroX ||
265
- Inst.getOpcode () == AArch64::LDRXui);
313
+ Inst.getOpcode () == AArch64::LDRXui ||
314
+ Inst.getOpcode () == AArch64::LDURXi ||
315
+ Inst.getOpcode () == AArch64::LDTRXi ||
316
+ Inst.getOpcode () == AArch64::LDNPXi ||
317
+ Inst.getOpcode () == AArch64::LDPXi ||
318
+ Inst.getOpcode () == AArch64::LDPXpost ||
319
+ Inst.getOpcode () == AArch64::LDPXpre ||
320
+ Inst.getOpcode () == AArch64::LDNPXi);
321
+ }
322
+
323
+
324
+ bool isLDRS (const MCInst &Inst) const {
325
+ return (Inst.getOpcode () == AArch64::LDRSui ||
326
+ Inst.getOpcode () == AArch64::LDRSroW ||
327
+ Inst.getOpcode () == AArch64::LDRSroX ||
328
+ Inst.getOpcode () == AArch64::LDURSi ||
329
+ Inst.getOpcode () == AArch64::LDPSi ||
330
+ Inst.getOpcode () == AArch64::LDNPSi ||
331
+ Inst.getOpcode () == AArch64::LDRSpre ||
332
+ Inst.getOpcode () == AArch64::LDRSpost ||
333
+ Inst.getOpcode () == AArch64::LDPSpost ||
334
+ Inst.getOpcode () == AArch64::LDPSpre);
335
+ }
336
+
337
+ bool isLDRD (const MCInst &Inst) const {
338
+ return (Inst.getOpcode () == AArch64::LDRDui ||
339
+ Inst.getOpcode () == AArch64::LDRDpre ||
340
+ Inst.getOpcode () == AArch64::LDRDpost ||
341
+ Inst.getOpcode () == AArch64::LDRDroW ||
342
+ Inst.getOpcode () == AArch64::LDRDroX ||
343
+ Inst.getOpcode () == AArch64::LDURDi ||
344
+ Inst.getOpcode () == AArch64::LDPDi ||
345
+ Inst.getOpcode () == AArch64::LDNPDi ||
346
+ Inst.getOpcode () == AArch64::LDPDpost ||
347
+ Inst.getOpcode () == AArch64::LDPDpre);
348
+ }
349
+
350
+ bool isLDRQ (const MCInst &Inst) const {
351
+ return (Inst.getOpcode () == AArch64::LDRQui ||
352
+ Inst.getOpcode () == AArch64::LDRQpre ||
353
+ Inst.getOpcode () == AArch64::LDRQpost ||
354
+ Inst.getOpcode () == AArch64::LDRQroW ||
355
+ Inst.getOpcode () == AArch64::LDRQroX ||
356
+ Inst.getOpcode () == AArch64::LDURQi ||
357
+ Inst.getOpcode () == AArch64::LDPQi ||
358
+ Inst.getOpcode () == AArch64::LDNPQi ||
359
+ Inst.getOpcode () == AArch64::LDPQpost ||
360
+ Inst.getOpcode () == AArch64::LDPQpre);
266
361
}
267
362
268
363
bool mayLoad (const MCInst &Inst) const override {
269
- return isLDRB (Inst) || isLDRH (Inst) || isLDRW (Inst) || isLDRX (Inst);
364
+ return isLDRB (Inst) || isLDRH (Inst) || isLDRW (Inst) || isLDRX (Inst) ||
365
+ isLDRQ (Inst) || isLDRD (Inst) || isLDRS (Inst);
270
366
}
271
367
272
368
bool isAArch64ExclusiveLoad (const MCInst &Inst) const override {
@@ -1140,7 +1236,229 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
1140
1236
Inst.addOperand (MCOperand::createImm (0 ));
1141
1237
}
1142
1238
1143
- bool mayStore (const MCInst &Inst) const override { return false ; }
1239
+ bool isStorePair (const MCInst &Inst) const {
1240
+ const unsigned opcode = Inst.getOpcode ();
1241
+
1242
+ auto isStorePairImmOffset = [&]() {
1243
+ bool isStorePair = false ;
1244
+ switch (opcode) {
1245
+ case AArch64::STPWi:
1246
+ case AArch64::STPXi:
1247
+ case AArch64::STPSi:
1248
+ case AArch64::STPDi:
1249
+ case AArch64::STPQi:
1250
+ case AArch64::STNPWi:
1251
+ case AArch64::STNPXi:
1252
+ case AArch64::STNPSi:
1253
+ case AArch64::STNPDi:
1254
+ case AArch64::STNPQi:
1255
+ isStorePair = true ;
1256
+ break ;
1257
+
1258
+ default :
1259
+ break ;
1260
+ }
1261
+
1262
+ return isStorePair;
1263
+ };
1264
+
1265
+ auto isStorePairPostIndex = [&]() {
1266
+ bool isStorePair = false ;
1267
+ switch (opcode) {
1268
+ case AArch64::STPWpost:
1269
+ case AArch64::STPXpost:
1270
+ case AArch64::STPSpost:
1271
+ case AArch64::STPDpost:
1272
+ case AArch64::STPQpost:
1273
+ isStorePair = true ;
1274
+ break ;
1275
+
1276
+ default :
1277
+ break ;
1278
+ }
1279
+
1280
+ return isStorePair;
1281
+ };
1282
+
1283
+ auto isStorePairPreIndex = [&]() {
1284
+ bool isStorePair = false ;
1285
+ switch (opcode) {
1286
+ case AArch64::STPWpre:
1287
+ case AArch64::STPXpre:
1288
+ case AArch64::STPSpre:
1289
+ case AArch64::STPDpre:
1290
+ case AArch64::STPQpre:
1291
+ isStorePair = true ;
1292
+ break ;
1293
+
1294
+ default :
1295
+ break ;
1296
+ }
1297
+
1298
+ return isStorePair;
1299
+ };
1300
+
1301
+ return isStorePairImmOffset () || isStorePairPostIndex () ||
1302
+ isStorePairPreIndex ();
1303
+ }
1304
+
1305
+ bool isStoreReg (const MCInst &Inst) const {
1306
+ const unsigned opcode = Inst.getOpcode ();
1307
+ bool isStore = false ;
1308
+
1309
+ auto isStoreRegUnscaleImm = [&]() {
1310
+ switch (opcode) {
1311
+ case AArch64::STURBi:
1312
+ case AArch64::STURBBi:
1313
+ case AArch64::STURHi:
1314
+ case AArch64::STURHHi:
1315
+ case AArch64::STURWi:
1316
+ case AArch64::STURXi:
1317
+ case AArch64::STURSi:
1318
+ case AArch64::STURDi:
1319
+ case AArch64::STURQi:
1320
+ isStore = true ;
1321
+ break ;
1322
+
1323
+ default :
1324
+ break ;
1325
+ }
1326
+
1327
+ return isStore;
1328
+ };
1329
+
1330
+ auto isStoreRegScaledImm = [&]() {
1331
+ switch (opcode) {
1332
+ case AArch64::STRBui:
1333
+ case AArch64::STRBBui:
1334
+ case AArch64::STRHui:
1335
+ case AArch64::STRHHui:
1336
+ case AArch64::STRWui:
1337
+ case AArch64::STRXui:
1338
+ case AArch64::STRSui:
1339
+ case AArch64::STRDui:
1340
+ case AArch64::STRQui:
1341
+ isStore = true ;
1342
+ break ;
1343
+
1344
+ default :
1345
+ break ;
1346
+ }
1347
+
1348
+ return isStore;
1349
+ };
1350
+
1351
+ auto isStoreRegImmPostIndexed = [&]() {
1352
+ switch (opcode) {
1353
+ case AArch64::STRBpost:
1354
+ case AArch64::STRBBpost:
1355
+ case AArch64::STRHpost:
1356
+ case AArch64::STRHHpost:
1357
+ case AArch64::STRWpost:
1358
+ case AArch64::STRXpost:
1359
+ case AArch64::STRSpost:
1360
+ case AArch64::STRDpost:
1361
+ case AArch64::STRQpost:
1362
+ isStore = true ;
1363
+ break ;
1364
+
1365
+ default :
1366
+ break ;
1367
+ }
1368
+
1369
+ return isStore;
1370
+ };
1371
+
1372
+ auto isStoreRegImmPreIndexed = [&]() {
1373
+ switch (opcode) {
1374
+ case AArch64::STRBpre:
1375
+ case AArch64::STRBBpre:
1376
+ case AArch64::STRHpre:
1377
+ case AArch64::STRHHpre:
1378
+ case AArch64::STRWpre:
1379
+ case AArch64::STRXpre:
1380
+ case AArch64::STRSpre:
1381
+ case AArch64::STRDpre:
1382
+ case AArch64::STRQpre:
1383
+ isStore = true ;
1384
+ break ;
1385
+
1386
+ default :
1387
+ break ;
1388
+ }
1389
+
1390
+ return isStore;
1391
+ };
1392
+
1393
+ auto isStoreRegUnscaleUnpriv = [&]() {
1394
+ switch (opcode) {
1395
+ case AArch64::STTRBi:
1396
+ case AArch64::STTRHi:
1397
+ case AArch64::STTRWi:
1398
+ case AArch64::STTRXi:
1399
+ isStore = true ;
1400
+ break ;
1401
+
1402
+ default :
1403
+ break ;
1404
+ }
1405
+
1406
+ return isStore;
1407
+ };
1408
+
1409
+ auto isStoreRegTrunc = [&]() {
1410
+ switch (opcode) {
1411
+ case AArch64::STRBBroW:
1412
+ case AArch64::STRBBroX:
1413
+ case AArch64::STRBroW:
1414
+ case AArch64::STRBroX:
1415
+ case AArch64::STRDroW:
1416
+ case AArch64::STRDroX:
1417
+ case AArch64::STRHHroW:
1418
+ case AArch64::STRHHroX:
1419
+ case AArch64::STRHroW:
1420
+ case AArch64::STRHroX:
1421
+ case AArch64::STRQroW:
1422
+ case AArch64::STRQroX:
1423
+ case AArch64::STRSroW:
1424
+ case AArch64::STRSroX:
1425
+ case AArch64::STRWroW:
1426
+ case AArch64::STRWroX:
1427
+ case AArch64::STRXroW:
1428
+ case AArch64::STRXroX:
1429
+ isStore = true ;
1430
+ break ;
1431
+
1432
+ default :
1433
+ break ;
1434
+ }
1435
+
1436
+ return isStore;
1437
+ };
1438
+
1439
+ return isStoreRegUnscaleImm () || isStoreRegScaledImm () ||
1440
+ isStoreRegImmPreIndexed () || isStoreRegImmPostIndexed () ||
1441
+ isStoreRegUnscaleUnpriv () || isStoreRegTrunc ();
1442
+ }
1443
+
1444
+ bool mayStore (const MCInst &Inst) const override {
1445
+ return isStorePair (Inst) || isStoreReg (Inst) ||
1446
+ isAArch64ExclusiveStore (Inst);
1447
+ }
1448
+
1449
+ bool isStoreToStack (const MCInst &Inst) const {
1450
+ if (!mayStore (Inst))
1451
+ return false ;
1452
+ for (const MCOperand &Operand : useOperands (Inst)) {
1453
+ if (!Operand.isReg ())
1454
+ continue ;
1455
+ unsigned Reg = Operand.getReg ();
1456
+ if (Reg == AArch64::SP || Reg == AArch64::WSP || Reg == AArch64::FP ||
1457
+ Reg == AArch64::W29)
1458
+ return true ;
1459
+ }
1460
+ return false ;
1461
+ }
1144
1462
1145
1463
void createDirectCall (MCInst &Inst, const MCSymbol *Target, MCContext *Ctx,
1146
1464
bool IsTailCall) override {
0 commit comments