HomePhabricator

[compiler-rt][asan] Fix incorrect macro preventing ICF with MSVC

Description

[compiler-rt][asan] Fix incorrect macro preventing ICF with MSVC

Summary:
The DLL thunks are stubs added to an instrumented DLL to redirect ASAN API calls
to the real ones in the main executable. These thunks must contain dummy
code before __asan_init got called. Unfortunately, MSVC linker is doing ICF and is
merging functions with the same body.

In our case, this two ASAN thunks were incorrectly merged:

asan_interface.inc:16
INTERFACE_FUNCTION(__asan_before_dynamic_init)
sanitizer_common_interface.inc:16
INTERFACE_FUNCTION(__sanitizer_verify_contiguous_container)

The same thunk got patched twice. After the second patching, calls to
__asan_before_dynamic_init are redirected to __sanitizer_verify_contiguous_container
and trigger a DCHECK on incorrect operands/

The problem was caused by the macro that is only using LINE to prevent
collapsing code.

#define INTERCEPT_SANITIZER_FUNCTION(name)
  extern "C" __declspec(noinline) void name() {
  volatile int prevent_icf = (__LINE__ << 8); (void)prevent_icf;

The current patch is adding COUNTER which is safer than LINE.

Also, to precent ICF (guarantee that code is different), we are using a unique attribute:

  • the name of the function

Reviewers: rnk

Reviewed By: rnk

Subscribers: llvm-commits, kubamracek, chrisha, dberris

Differential Revision: https://reviews.llvm.org/D30219

Details

Committed
etiennebFeb 21 2017, 12:04 PM
Reviewer
rnk
Differential Revision
D30219: [compiler-rt][asan] Fix incorrect macro preventing ICF with MSVC
Branches
Unknown
Tags
Unknown