summaryrefslogtreecommitdiff
path: root/unittests/Support
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-03-30 11:20:25 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-03-30 11:20:25 +0000
commit6da21c0e335bca3186358f85948555f62eb8b375 (patch)
tree79ae5430691e23d9e7d77afed6b5d4f95a1ebfd1 /unittests/Support
parent1f408b1474188dfd1d234ade9ec8e5cbec000459 (diff)
downloadllvm-6da21c0e335bca3186358f85948555f62eb8b375.tar.gz
llvm-6da21c0e335bca3186358f85948555f62eb8b375.tar.bz2
llvm-6da21c0e335bca3186358f85948555f62eb8b375.tar.xz
Don't mark the declarations of the TSan annotation functions as weak.
That causes references to them to be weak references which can collapse to null if no definition is provided. We call these functions unconditionally, so a definition *must* be provided. Make the definitions provided in the .cpp file weak by re-declaring them as weak just prior to defining them. This should keep compilers which cannot attach the weak attribute to the definition happy while actually resolving the symbols correctly during the link. You might ask yourself upon reading this commit log: how did *any* of this work before? Well, fun story. It turns out we have some code in Support (BumpPtrAllocator) which both uses virtual dispatch and has out-of-line vtables used by that virtual dispatch. If you move the virtual dispatch into its header in *just* the right way, the optimizer gets to devirtualize, and remove all references to the vtable. Then the sad part: the references to this one vtable were the only strong symbol uses in the support library for llvm-tblgen AFAICT. At least, after doing something just like this, these symbols stopped getting their weak definition and random calls to them would segfault instead. Yay software. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205137 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Support')
0 files changed, 0 insertions, 0 deletions