@@ -99,7 +99,7 @@ class AArch64AsmPrinter : public AsmPrinter {
99
99
void LowerPATCHABLE_FUNCTION_EXIT (const MachineInstr &MI);
100
100
void LowerPATCHABLE_TAIL_CALL (const MachineInstr &MI);
101
101
102
- std::map<std::pair <unsigned , uint32_t >, MCSymbol *> HwasanMemaccessSymbols;
102
+ std::map<std::tuple <unsigned , bool , uint32_t >, MCSymbol *> HwasanMemaccessSymbols;
103
103
void LowerHWASAN_CHECK_MEMACCESS (const MachineInstr &MI);
104
104
void EmitHwasanMemaccessSymbols (Module &M);
105
105
@@ -237,15 +237,19 @@ void AArch64AsmPrinter::EmitSled(const MachineInstr &MI, SledKind Kind)
237
237
238
238
void AArch64AsmPrinter::LowerHWASAN_CHECK_MEMACCESS (const MachineInstr &MI) {
239
239
Register Reg = MI.getOperand (0 ).getReg ();
240
+ bool IsShort =
241
+ MI.getOpcode () == AArch64::HWASAN_CHECK_MEMACCESS_SHORTGRANULES;
240
242
uint32_t AccessInfo = MI.getOperand (1 ).getImm ();
241
- MCSymbol *&Sym = HwasanMemaccessSymbols[{Reg, AccessInfo}];
243
+ MCSymbol *&Sym = HwasanMemaccessSymbols[{Reg, IsShort, AccessInfo}];
242
244
if (!Sym) {
243
245
// FIXME: Make this work on non-ELF.
244
246
if (!TM.getTargetTriple ().isOSBinFormatELF ())
245
247
report_fatal_error (" llvm.hwasan.check.memaccess only supported on ELF" );
246
248
247
249
std::string SymName = " __hwasan_check_x" + utostr (Reg - AArch64::X0) + " _" +
248
250
utostr (AccessInfo);
251
+ if (IsShort)
252
+ SymName += " _short" ;
249
253
Sym = OutContext.getOrCreateSymbol (SymName);
250
254
}
251
255
@@ -263,15 +267,22 @@ void AArch64AsmPrinter::EmitHwasanMemaccessSymbols(Module &M) {
263
267
std::unique_ptr<MCSubtargetInfo> STI (
264
268
TM.getTarget ().createMCSubtargetInfo (TT.str (), " " , " " ));
265
269
266
- MCSymbol *HwasanTagMismatchSym =
270
+ MCSymbol *HwasanTagMismatchV1Sym =
267
271
OutContext.getOrCreateSymbol (" __hwasan_tag_mismatch" );
272
+ MCSymbol *HwasanTagMismatchV2Sym =
273
+ OutContext.getOrCreateSymbol (" __hwasan_tag_mismatch_v2" );
268
274
269
- const MCSymbolRefExpr *HwasanTagMismatchRef =
270
- MCSymbolRefExpr::create (HwasanTagMismatchSym, OutContext);
275
+ const MCSymbolRefExpr *HwasanTagMismatchV1Ref =
276
+ MCSymbolRefExpr::create (HwasanTagMismatchV1Sym, OutContext);
277
+ const MCSymbolRefExpr *HwasanTagMismatchV2Ref =
278
+ MCSymbolRefExpr::create (HwasanTagMismatchV2Sym, OutContext);
271
279
272
280
for (auto &P : HwasanMemaccessSymbols) {
273
- unsigned Reg = P.first .first ;
274
- uint32_t AccessInfo = P.first .second ;
281
+ unsigned Reg = std::get<0 >(P.first );
282
+ bool IsShort = std::get<1 >(P.first );
283
+ uint32_t AccessInfo = std::get<2 >(P.first );
284
+ const MCSymbolRefExpr *HwasanTagMismatchRef =
285
+ IsShort ? HwasanTagMismatchV2Ref : HwasanTagMismatchV1Ref;
275
286
MCSymbol *Sym = P.second ;
276
287
277
288
OutStreamer->SwitchSection (OutContext.getELFSection (
@@ -304,82 +315,86 @@ void AArch64AsmPrinter::EmitHwasanMemaccessSymbols(Module &M) {
304
315
.addReg (Reg)
305
316
.addImm (AArch64_AM::getShifterImm (AArch64_AM::LSR, 56 )),
306
317
*STI);
307
- MCSymbol *HandlePartialSym = OutContext.createTempSymbol ();
318
+ MCSymbol *HandleMismatchOrPartialSym = OutContext.createTempSymbol ();
308
319
OutStreamer->EmitInstruction (
309
320
MCInstBuilder (AArch64::Bcc)
310
321
.addImm (AArch64CC::NE)
311
- .addExpr (MCSymbolRefExpr::create (HandlePartialSym, OutContext)),
322
+ .addExpr (MCSymbolRefExpr::create (HandleMismatchOrPartialSym,
323
+ OutContext)),
312
324
*STI);
313
325
MCSymbol *ReturnSym = OutContext.createTempSymbol ();
314
326
OutStreamer->EmitLabel (ReturnSym);
315
327
OutStreamer->EmitInstruction (
316
328
MCInstBuilder (AArch64::RET).addReg (AArch64::LR), *STI);
329
+ OutStreamer->EmitLabel (HandleMismatchOrPartialSym);
317
330
318
- OutStreamer->EmitLabel (HandlePartialSym);
319
- OutStreamer->EmitInstruction (MCInstBuilder (AArch64::SUBSWri)
320
- .addReg (AArch64::WZR)
321
- .addReg (AArch64::W16)
322
- .addImm (15 )
323
- .addImm (0 ),
324
- *STI);
325
- MCSymbol *HandleMismatchSym = OutContext.createTempSymbol ();
326
- OutStreamer->EmitInstruction (
327
- MCInstBuilder (AArch64::Bcc)
328
- .addImm (AArch64CC::HI)
329
- .addExpr (MCSymbolRefExpr::create (HandleMismatchSym, OutContext)),
330
- *STI);
331
-
332
- OutStreamer->EmitInstruction (
333
- MCInstBuilder (AArch64::ANDXri)
334
- .addReg (AArch64::X17)
335
- .addReg (Reg)
336
- .addImm (AArch64_AM::encodeLogicalImmediate (0xf , 64 )),
337
- *STI);
338
- unsigned Size = 1 << (AccessInfo & 0xf );
339
- if (Size != 1 )
340
- OutStreamer->EmitInstruction (MCInstBuilder (AArch64::ADDXri)
341
- .addReg (AArch64::X17)
342
- .addReg (AArch64::X17)
343
- .addImm (Size - 1 )
331
+ if (IsShort) {
332
+ OutStreamer->EmitInstruction (MCInstBuilder (AArch64::SUBSWri)
333
+ .addReg (AArch64::WZR)
334
+ .addReg (AArch64::W16)
335
+ .addImm (15 )
344
336
.addImm (0 ),
345
337
*STI);
346
- OutStreamer->EmitInstruction (MCInstBuilder (AArch64::SUBSWrs)
347
- .addReg (AArch64::WZR)
348
- .addReg (AArch64::W16)
349
- .addReg (AArch64::W17)
350
- .addImm (0 ),
351
- *STI);
352
- OutStreamer->EmitInstruction (
353
- MCInstBuilder (AArch64::Bcc)
354
- .addImm (AArch64CC::LS)
355
- .addExpr (MCSymbolRefExpr::create (HandleMismatchSym, OutContext)),
356
- *STI);
357
-
358
- OutStreamer->EmitInstruction (
359
- MCInstBuilder (AArch64::ORRXri)
360
- .addReg (AArch64::X16)
361
- .addReg (Reg)
362
- .addImm (AArch64_AM::encodeLogicalImmediate (0xf , 64 )),
363
- *STI);
364
- OutStreamer->EmitInstruction (MCInstBuilder (AArch64::LDRBBui)
365
- .addReg (AArch64::W16)
366
- .addReg (AArch64::X16)
367
- .addImm (0 ),
368
- *STI);
369
- OutStreamer->EmitInstruction (
370
- MCInstBuilder (AArch64::SUBSXrs)
371
- .addReg (AArch64::XZR)
372
- .addReg (AArch64::X16)
373
- .addReg (Reg)
374
- .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSR, 56 )),
375
- *STI);
376
- OutStreamer->EmitInstruction (
377
- MCInstBuilder (AArch64::Bcc)
378
- .addImm (AArch64CC::EQ)
379
- .addExpr (MCSymbolRefExpr::create (ReturnSym, OutContext)),
380
- *STI);
338
+ MCSymbol *HandleMismatchSym = OutContext.createTempSymbol ();
339
+ OutStreamer->EmitInstruction (
340
+ MCInstBuilder (AArch64::Bcc)
341
+ .addImm (AArch64CC::HI)
342
+ .addExpr (MCSymbolRefExpr::create (HandleMismatchSym, OutContext)),
343
+ *STI);
344
+
345
+ OutStreamer->EmitInstruction (
346
+ MCInstBuilder (AArch64::ANDXri)
347
+ .addReg (AArch64::X17)
348
+ .addReg (Reg)
349
+ .addImm (AArch64_AM::encodeLogicalImmediate (0xf , 64 )),
350
+ *STI);
351
+ unsigned Size = 1 << (AccessInfo & 0xf );
352
+ if (Size != 1 )
353
+ OutStreamer->EmitInstruction (MCInstBuilder (AArch64::ADDXri)
354
+ .addReg (AArch64::X17)
355
+ .addReg (AArch64::X17)
356
+ .addImm (Size - 1 )
357
+ .addImm (0 ),
358
+ *STI);
359
+ OutStreamer->EmitInstruction (MCInstBuilder (AArch64::SUBSWrs)
360
+ .addReg (AArch64::WZR)
361
+ .addReg (AArch64::W16)
362
+ .addReg (AArch64::W17)
363
+ .addImm (0 ),
364
+ *STI);
365
+ OutStreamer->EmitInstruction (
366
+ MCInstBuilder (AArch64::Bcc)
367
+ .addImm (AArch64CC::LS)
368
+ .addExpr (MCSymbolRefExpr::create (HandleMismatchSym, OutContext)),
369
+ *STI);
370
+
371
+ OutStreamer->EmitInstruction (
372
+ MCInstBuilder (AArch64::ORRXri)
373
+ .addReg (AArch64::X16)
374
+ .addReg (Reg)
375
+ .addImm (AArch64_AM::encodeLogicalImmediate (0xf , 64 )),
376
+ *STI);
377
+ OutStreamer->EmitInstruction (MCInstBuilder (AArch64::LDRBBui)
378
+ .addReg (AArch64::W16)
379
+ .addReg (AArch64::X16)
380
+ .addImm (0 ),
381
+ *STI);
382
+ OutStreamer->EmitInstruction (
383
+ MCInstBuilder (AArch64::SUBSXrs)
384
+ .addReg (AArch64::XZR)
385
+ .addReg (AArch64::X16)
386
+ .addReg (Reg)
387
+ .addImm (AArch64_AM::getShifterImm (AArch64_AM::LSR, 56 )),
388
+ *STI);
389
+ OutStreamer->EmitInstruction (
390
+ MCInstBuilder (AArch64::Bcc)
391
+ .addImm (AArch64CC::EQ)
392
+ .addExpr (MCSymbolRefExpr::create (ReturnSym, OutContext)),
393
+ *STI);
394
+
395
+ OutStreamer->EmitLabel (HandleMismatchSym);
396
+ }
381
397
382
- OutStreamer->EmitLabel (HandleMismatchSym);
383
398
OutStreamer->EmitInstruction (MCInstBuilder (AArch64::STPXpre)
384
399
.addReg (AArch64::SP)
385
400
.addReg (AArch64::X0)
@@ -414,16 +429,16 @@ void AArch64AsmPrinter::EmitHwasanMemaccessSymbols(Module &M) {
414
429
MCInstBuilder (AArch64::ADRP)
415
430
.addReg (AArch64::X16)
416
431
.addExpr (AArch64MCExpr::create (
417
- HwasanTagMismatchRef,
418
- AArch64MCExpr::VariantKind::VK_GOT_PAGE, OutContext)),
432
+ HwasanTagMismatchRef, AArch64MCExpr::VariantKind::VK_GOT_PAGE,
433
+ OutContext)),
419
434
*STI);
420
435
OutStreamer->EmitInstruction (
421
436
MCInstBuilder (AArch64::LDRXui)
422
437
.addReg (AArch64::X16)
423
438
.addReg (AArch64::X16)
424
439
.addExpr (AArch64MCExpr::create (
425
- HwasanTagMismatchRef,
426
- AArch64MCExpr::VariantKind::VK_GOT_LO12, OutContext)),
440
+ HwasanTagMismatchRef, AArch64MCExpr::VariantKind::VK_GOT_LO12,
441
+ OutContext)),
427
442
*STI);
428
443
OutStreamer->EmitInstruction (
429
444
MCInstBuilder (AArch64::BR).addReg (AArch64::X16), *STI);
@@ -1096,6 +1111,7 @@ void AArch64AsmPrinter::EmitInstruction(const MachineInstr *MI) {
1096
1111
return ;
1097
1112
1098
1113
case AArch64::HWASAN_CHECK_MEMACCESS:
1114
+ case AArch64::HWASAN_CHECK_MEMACCESS_SHORTGRANULES:
1099
1115
LowerHWASAN_CHECK_MEMACCESS (*MI);
1100
1116
return ;
1101
1117
0 commit comments