Stop increasing alignment of externally-visible globals on ELF
authorJames Y Knight <jyknight@google.com>
Fri, 15 Jan 2016 16:33:06 +0000 (16:33 +0000)
committerJames Y Knight <jyknight@google.com>
Fri, 15 Jan 2016 16:33:06 +0000 (16:33 +0000)
commitac03dca41245fe4cf308e7405d6e947b45341547
tree618e6891cf0bf5d04e375a798b99cd46c101dcbd
parent0771b18257a6bd33ec9f9890d8cb0eed01e729d3
Stop increasing alignment of externally-visible globals on ELF
platforms.

With ELF, the alignment of a global variable in a shared library will
get copied into an executables linked against it, if the executable even
accesss the variable. So, it's not possible to implicitly increase
alignment based on access patterns, or you'll break existing binaries.

This happened to affect libc++'s std::cout symbol, for example. See
thread: http://thread.gmane.org/gmane.comp.compilers.clang.devel/45311

(This is a re-commit of r257719, without the bug reported in
PR26144. I've tweaked the code to not assert-fail in
enforceKnownAlignment when computeKnownBits doesn't recurse far enough
to find the underlying Alloca/GlobalObject value.)

Differential Revision: http://reviews.llvm.org/D16145

llvm-svn: 257902
llvm/include/llvm/IR/GlobalValue.h
llvm/lib/CodeGen/CodeGenPrepare.cpp
llvm/lib/IR/Globals.cpp
llvm/lib/Transforms/Utils/Local.cpp
llvm/test/CodeGen/ARM/memfunc.ll