On Fri, May 06, 2016 at 03:17:23PM +0200, Martin Liška wrote: > On 05/06/2016 01:48 PM, Yury Gribov wrote: > > On 05/06/2016 02:04 PM, Martin Liška wrote: > >> I've started working on the patch couple of month go, basically after > >> a brief discussion with Jakub on IRC. > >> > >> I'm sending the initial version which can successfully run instrumented > >> tramp3d, postgresql server and Inkscape. It catches the basic set of > >> examples which are added in following patch. > >> > >> The implementation is quite straightforward as works in following steps: > >> > >> 1) Every local variable stack slot is poisoned at the very beginning of a > >> function (RTL emission) > >> 2) In gimplifier, once we spot a DECL_EXPR, a variable is unpoisoned (by > >> emitting ASAN_MARK builtin) > >> and the variable is marked as addressable > >> 3) Similarly, BIND_EXPR is the place where we poison the variable (scope > >> exit) > >> 4) At the very end of the function, we clean up the poisoned memory > >> 5) The builtins are expanded to call to libsanitizer run-time library > >> (__asan_poison_stack_memory, __asan_unpoison_stack_memory) > > > > Can we inline these? > > Currently not as libasan is a shared library that an instrumented executable > is linked with. > Possible solution would be to directly emit gimple instruction that would > poison/unpoison the memory. > But it's not a trivial job which is done in the poisoning code (ALWAYS_INLINE > void FastPoisonShadow(uptr aligned_beg, uptr aligned_size, u8 value)
Well, we already have the gimple poisoning/unpoisoning code on RTL (emitted after the prologue and before the epilogue), so it shouldn't be that hard. I'd only do the most common/easy cases inline though, like 1/2/4/8/16/32 bytes long variables. Jakub