[asan] Fix dead stripping of globals on Linux.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 17 Mar 2017 22:17:29 +0000 (22:17 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 17 Mar 2017 22:17:29 +0000 (22:17 +0000)
commitc5aa6b94115d12986af7feff180f2ddf53498b06
tree06a75d13b55084777afc16d77a4916970d4e9fc4
parent51c962f72e9569d54dc9c853abf99e2c34fc41cf
[asan] Fix dead stripping of globals on Linux.

Use a combination of !associated, comdat, @llvm.compiler.used and
custom sections to allow dead stripping of globals and their asan
metadata. Sometimes.

Currently this works on LLD, which supports SHF_LINK_ORDER with
sh_link pointing to the associated section.

This also works on BFD, which seems to treat comdats as
all-or-nothing with respect to linker GC. There is a weird quirk
where the "first" global in each link is never GC-ed because of the
section symbols.

At this moment it does not work on Gold (as in the globals are never
stripped).

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

llvm-svn: 298158
llvm/include/llvm/Transforms/Utils/ModuleUtils.h
llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
llvm/lib/Transforms/Utils/ModuleUtils.cpp
llvm/test/Instrumentation/AddressSanitizer/global_metadata.ll
llvm/test/Instrumentation/AddressSanitizer/global_metadata_darwin.ll
llvm/test/Instrumentation/AddressSanitizer/instrument_global.ll