@@ -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,97 @@ 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
+ bool isLDRS (const MCInst &Inst) const {
324
+ return (Inst.getOpcode () == AArch64::LDRSui ||
325
+ Inst.getOpcode () == AArch64::LDRSroW ||
326
+ Inst.getOpcode () == AArch64::LDRSroX ||
327
+ Inst.getOpcode () == AArch64::LDURSi ||
328
+ Inst.getOpcode () == AArch64::LDPSi ||
329
+ Inst.getOpcode () == AArch64::LDNPSi ||
330
+ Inst.getOpcode () == AArch64::LDRSpre ||
331
+ Inst.getOpcode () == AArch64::LDRSpost ||
332
+ Inst.getOpcode () == AArch64::LDPSpost ||
333
+ Inst.getOpcode () == AArch64::LDPSpre);
334
+ }
335
+
336
+ bool isLDRD (const MCInst &Inst) const {
337
+ return (Inst.getOpcode () == AArch64::LDRDui ||
338
+ Inst.getOpcode () == AArch64::LDRDpre ||
339
+ Inst.getOpcode () == AArch64::LDRDpost ||
340
+ Inst.getOpcode () == AArch64::LDRDroW ||
341
+ Inst.getOpcode () == AArch64::LDRDroX ||
342
+ Inst.getOpcode () == AArch64::LDURDi ||
343
+ Inst.getOpcode () == AArch64::LDPDi ||
344
+ Inst.getOpcode () == AArch64::LDNPDi ||
345
+ Inst.getOpcode () == AArch64::LDPDpost ||
346
+ Inst.getOpcode () == AArch64::LDPDpre);
347
+ }
348
+
349
+ bool isLDRQ (const MCInst &Inst) const {
350
+ return (Inst.getOpcode () == AArch64::LDRQui ||
351
+ Inst.getOpcode () == AArch64::LDRQpre ||
352
+ Inst.getOpcode () == AArch64::LDRQpost ||
353
+ Inst.getOpcode () == AArch64::LDRQroW ||
354
+ Inst.getOpcode () == AArch64::LDRQroX ||
355
+ Inst.getOpcode () == AArch64::LDURQi ||
356
+ Inst.getOpcode () == AArch64::LDPQi ||
357
+ Inst.getOpcode () == AArch64::LDNPQi ||
358
+ Inst.getOpcode () == AArch64::LDPQpost ||
359
+ Inst.getOpcode () == AArch64::LDPQpre);
266
360
}
267
361
268
362
bool mayLoad (const MCInst &Inst) const override {
269
- return isLDRB (Inst) || isLDRH (Inst) || isLDRW (Inst) || isLDRX (Inst);
363
+ return isLDRB (Inst) || isLDRH (Inst) || isLDRW (Inst) || isLDRX (Inst) ||
364
+ isLDRQ (Inst) || isLDRD (Inst) || isLDRS (Inst);
270
365
}
271
366
272
367
bool isAArch64ExclusiveLoad (const MCInst &Inst) const override {
@@ -1140,7 +1235,229 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
1140
1235
Inst.addOperand (MCOperand::createImm (0 ));
1141
1236
}
1142
1237
1143
- bool mayStore (const MCInst &Inst) const override { return false ; }
1238
+ bool isStorePair (const MCInst &Inst) const {
1239
+ const unsigned opcode = Inst.getOpcode ();
1240
+
1241
+ auto isStorePairImmOffset = [&]() {
1242
+ bool isStorePair = false ;
1243
+ switch (opcode) {
1244
+ case AArch64::STPWi:
1245
+ case AArch64::STPXi:
1246
+ case AArch64::STPSi:
1247
+ case AArch64::STPDi:
1248
+ case AArch64::STPQi:
1249
+ case AArch64::STNPWi:
1250
+ case AArch64::STNPXi:
1251
+ case AArch64::STNPSi:
1252
+ case AArch64::STNPDi:
1253
+ case AArch64::STNPQi:
1254
+ isStorePair = true ;
1255
+ break ;
1256
+
1257
+ default :
1258
+ break ;
1259
+ }
1260
+
1261
+ return isStorePair;
1262
+ };
1263
+
1264
+ auto isStorePairPostIndex = [&]() {
1265
+ bool isStorePair = false ;
1266
+ switch (opcode) {
1267
+ case AArch64::STPWpost:
1268
+ case AArch64::STPXpost:
1269
+ case AArch64::STPSpost:
1270
+ case AArch64::STPDpost:
1271
+ case AArch64::STPQpost:
1272
+ isStorePair = true ;
1273
+ break ;
1274
+
1275
+ default :
1276
+ break ;
1277
+ }
1278
+
1279
+ return isStorePair;
1280
+ };
1281
+
1282
+ auto isStorePairPreIndex = [&]() {
1283
+ bool isStorePair = false ;
1284
+ switch (opcode) {
1285
+ case AArch64::STPWpre:
1286
+ case AArch64::STPXpre:
1287
+ case AArch64::STPSpre:
1288
+ case AArch64::STPDpre:
1289
+ case AArch64::STPQpre:
1290
+ isStorePair = true ;
1291
+ break ;
1292
+
1293
+ default :
1294
+ break ;
1295
+ }
1296
+
1297
+ return isStorePair;
1298
+ };
1299
+
1300
+ return isStorePairImmOffset () || isStorePairPostIndex () ||
1301
+ isStorePairPreIndex ();
1302
+ }
1303
+
1304
+ bool isStoreReg (const MCInst &Inst) const {
1305
+ const unsigned opcode = Inst.getOpcode ();
1306
+ bool isStore = false ;
1307
+
1308
+ auto isStoreRegUnscaleImm = [&]() {
1309
+ switch (opcode) {
1310
+ case AArch64::STURBi:
1311
+ case AArch64::STURBBi:
1312
+ case AArch64::STURHi:
1313
+ case AArch64::STURHHi:
1314
+ case AArch64::STURWi:
1315
+ case AArch64::STURXi:
1316
+ case AArch64::STURSi:
1317
+ case AArch64::STURDi:
1318
+ case AArch64::STURQi:
1319
+ isStore = true ;
1320
+ break ;
1321
+
1322
+ default :
1323
+ break ;
1324
+ }
1325
+
1326
+ return isStore;
1327
+ };
1328
+
1329
+ auto isStoreRegScaledImm = [&]() {
1330
+ switch (opcode) {
1331
+ case AArch64::STRBui:
1332
+ case AArch64::STRBBui:
1333
+ case AArch64::STRHui:
1334
+ case AArch64::STRHHui:
1335
+ case AArch64::STRWui:
1336
+ case AArch64::STRXui:
1337
+ case AArch64::STRSui:
1338
+ case AArch64::STRDui:
1339
+ case AArch64::STRQui:
1340
+ isStore = true ;
1341
+ break ;
1342
+
1343
+ default :
1344
+ break ;
1345
+ }
1346
+
1347
+ return isStore;
1348
+ };
1349
+
1350
+ auto isStoreRegImmPostIndexed = [&]() {
1351
+ switch (opcode) {
1352
+ case AArch64::STRBpost:
1353
+ case AArch64::STRBBpost:
1354
+ case AArch64::STRHpost:
1355
+ case AArch64::STRHHpost:
1356
+ case AArch64::STRWpost:
1357
+ case AArch64::STRXpost:
1358
+ case AArch64::STRSpost:
1359
+ case AArch64::STRDpost:
1360
+ case AArch64::STRQpost:
1361
+ isStore = true ;
1362
+ break ;
1363
+
1364
+ default :
1365
+ break ;
1366
+ }
1367
+
1368
+ return isStore;
1369
+ };
1370
+
1371
+ auto isStoreRegImmPreIndexed = [&]() {
1372
+ switch (opcode) {
1373
+ case AArch64::STRBpre:
1374
+ case AArch64::STRBBpre:
1375
+ case AArch64::STRHpre:
1376
+ case AArch64::STRHHpre:
1377
+ case AArch64::STRWpre:
1378
+ case AArch64::STRXpre:
1379
+ case AArch64::STRSpre:
1380
+ case AArch64::STRDpre:
1381
+ case AArch64::STRQpre:
1382
+ isStore = true ;
1383
+ break ;
1384
+
1385
+ default :
1386
+ break ;
1387
+ }
1388
+
1389
+ return isStore;
1390
+ };
1391
+
1392
+ auto isStoreRegUnscaleUnpriv = [&]() {
1393
+ switch (opcode) {
1394
+ case AArch64::STTRBi:
1395
+ case AArch64::STTRHi:
1396
+ case AArch64::STTRWi:
1397
+ case AArch64::STTRXi:
1398
+ isStore = true ;
1399
+ break ;
1400
+
1401
+ default :
1402
+ break ;
1403
+ }
1404
+
1405
+ return isStore;
1406
+ };
1407
+
1408
+ auto isStoreRegTrunc = [&]() {
1409
+ switch (opcode) {
1410
+ case AArch64::STRBBroW:
1411
+ case AArch64::STRBBroX:
1412
+ case AArch64::STRBroW:
1413
+ case AArch64::STRBroX:
1414
+ case AArch64::STRDroW:
1415
+ case AArch64::STRDroX:
1416
+ case AArch64::STRHHroW:
1417
+ case AArch64::STRHHroX:
1418
+ case AArch64::STRHroW:
1419
+ case AArch64::STRHroX:
1420
+ case AArch64::STRQroW:
1421
+ case AArch64::STRQroX:
1422
+ case AArch64::STRSroW:
1423
+ case AArch64::STRSroX:
1424
+ case AArch64::STRWroW:
1425
+ case AArch64::STRWroX:
1426
+ case AArch64::STRXroW:
1427
+ case AArch64::STRXroX:
1428
+ isStore = true ;
1429
+ break ;
1430
+
1431
+ default :
1432
+ break ;
1433
+ }
1434
+
1435
+ return isStore;
1436
+ };
1437
+
1438
+ return isStoreRegUnscaleImm () || isStoreRegScaledImm () ||
1439
+ isStoreRegImmPreIndexed () || isStoreRegImmPostIndexed () ||
1440
+ isStoreRegUnscaleUnpriv () || isStoreRegTrunc ();
1441
+ }
1442
+
1443
+ bool mayStore (const MCInst &Inst) const override {
1444
+ return isStorePair (Inst) || isStoreReg (Inst) ||
1445
+ isAArch64ExclusiveStore (Inst);
1446
+ }
1447
+
1448
+ bool isStoreToStack (const MCInst &Inst) const {
1449
+ if (!mayStore (Inst))
1450
+ return false ;
1451
+ for (const MCOperand &Operand : useOperands (Inst)) {
1452
+ if (!Operand.isReg ())
1453
+ continue ;
1454
+ unsigned Reg = Operand.getReg ();
1455
+ if (Reg == AArch64::SP || Reg == AArch64::WSP || Reg == AArch64::FP ||
1456
+ Reg == AArch64::W29)
1457
+ return true ;
1458
+ }
1459
+ return false ;
1460
+ }
1144
1461
1145
1462
void createDirectCall (MCInst &Inst, const MCSymbol *Target, MCContext *Ctx,
1146
1463
bool IsTailCall) override {
0 commit comments