[asan] Fix dead stripping of globals on Linux.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Thu, 27 Apr 2017 20:27:27 +0000 (20:27 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Thu, 27 Apr 2017 20:27:27 +0000 (20:27 +0000)
commit964f4663c42c42fb958b14cb3b510daa5ce54252
treee61cdb2e59d0ffef56d7f5328198dbd77f71ca99
parent716f0ff2228a7f1117f4c8ad718225d6e303b212
[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).

This is a second re-land of r298158. This time, this feature is
limited to -fdata-sections builds.

llvm-svn: 301587
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/global_metadata_windows.ll
llvm/test/Instrumentation/AddressSanitizer/instrument_global.ll
llvm/test/Instrumentation/AddressSanitizer/no-globals.ll