This is an archive of the discontinued LLVM Phabricator instance.

[HWASan] Port HWASan to Linux x86-64 (LLVM)
ClosedPublic

Authored by alekseyshl on Mar 20 2018, 2:01 PM.

Details

Summary

Porting HWASan to Linux x86-64, first of the three patches, LLVM part.

The approach is similar to ARM case, trap signal is used to communicate
memory tag check failure. int3 instruction is used to generate a signal,
access parameters are stored in nop [eax + offset] instruction immediately
following the int3 one.

One notable difference is that x86-64 has to untag the pointer before use
due to the lack of feature comparable to ARM's TBI (Top Byte Ignore).

Diff Detail

Event Timeline

alekseyshl created this revision.Mar 20 2018, 2:01 PM
eugenis added inline comments.Mar 21 2018, 4:37 PM
lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
381

the condition should be not-arm64, not is-x86.

399

I'd move untagging to a separate function. It does not need to be tied to tag checking. In the future we'll probably want to untag other stuff, like pointers in external function call arguments.

test/Instrumentation/HWAddressSanitizer/X86/basic.ll
2

That's a lot of copy-paste, and most of it is covered by aarch64 tests.
Lets only test the parts that differ: trap instruction sequence (one or two cases would be enough), and pointer untagging.

alekseyshl marked 2 inline comments as done.
  • Move pointer operand untagging into a separate function.
lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
399

Not sure what the future API would be for this function, settled for the most efficient for the current use case.

eugenis accepted this revision.Mar 22 2018, 1:52 PM
This revision is now accepted and ready to land.Mar 22 2018, 1:52 PM
alekseyshl updated this revision to Diff 139507.EditedMar 22 2018, 2:17 PM
  • Remove shared code checks from X86 specific tests.
alekseyshl marked an inline comment as done.Mar 22 2018, 2:17 PM
This revision was automatically updated to reflect the committed changes.