On Fri, Oct 9, 2015 at 11:37 AM, Dimitry Andric <dim_at_freebsd.org> wrote: > > I have committed a (hopefully temporary) workaround in r289072. If you > don't want to do a full buildworld, first rebuild clang and install it, > then rebuild libc++ and install it. > After some back-and-forth about the cause, I am now reasonably convinced > that it is due to a bug in clang 3.7.0, as I noted in the commit message: > > Some further explanation: libc++'s iostream.cpp contains the definitions > of std::cout, std::cerr and so on. These global objects are effectively > declared with an alignment of 8 bytes. When an executable is linked > against libc++.so, it can sometimes get a copy of the global object, > which is then at the same alignment. > > However, with clang 3.7.0, the initialization of these global objects > will incorrectly use SSE instructions (e.g. movdqa), whenever the > optimization level is high enough, and SSE is enabled, such as on amd64. > When any of these objects is not aligned to 16 bytes, this will result > in a SIGBUS during iostream initialization. In contrast, clang 3.6.x > and earlier took the 8 byte alignment into consideration, and avoided > SSE for those particular operations. > > After bisecting of upstream changes, I found that the above revision > [llvm r240144] caused the change of this behavior, so I am reverting it > now as a workaround, while a discussion and test case is being prepared > for upstream. > > -Dimitry > > Thank you for analyzing and fixing the problem. You have excellent detective skills and worked hard to fix this! -- CraigReceived on Sat Oct 10 2015 - 16:00:23 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:00 UTC