[Win64EH] Write .pdata symbol relocations relative to the temporary begin symbol
authorMartin Storsjö <martin@martin.st>
Tue, 7 Sep 2021 11:56:43 +0000 (14:56 +0300)
committerMartin Storsjö <martin@martin.st>
Tue, 14 Sep 2021 08:05:37 +0000 (11:05 +0300)
commitac3edc4c97ae9de62cdaec5d1acfa627a9a4b6ca
treede6fcc46f9e3eac22d1d7dffa467503f84bc712b
parent63784b9a75eb959a65c8cf644af9565764d8322c
[Win64EH] Write .pdata symbol relocations relative to the temporary begin symbol

Previously the relocations pointed at the public user facing,
possibly external symbol.

When the function itself is weak, that symbol may be overridden at
link time, pointing at another strong implementation of the same
function instead. In that case, there's two conflicting pdata entries
pointing at the same address, and the wrong unwind info might end up
used.

Both GCC/binutils and MSVC produce pdata pointing at internal static
symbols. (GCC/binutils point at the .text section just as LLVM does
after this change, MSVC points at special label type symbols with the
type IMAGE_SYM_CLASS_LABEL and names like '$LN4'.)

This fixes unwinding through an overridden "operator new" with a
statically linked C++ library in MinGW mode. (Building libc++ with
-ffunction-sections and linking with --gc-sections might avoid the
issue too.)

This makes the produced object files a little less user friendly
to debug, but with other recent improvements for llvm-readobj, the
unwind info debugging experience should be pretty much the same.

Differential Revision: https://reviews.llvm.org/D109651
llvm/lib/MC/MCWin64EH.cpp
llvm/test/MC/AArch64/seh.s
llvm/test/MC/COFF/seh-align1.s
llvm/test/MC/COFF/seh-align2.s
llvm/test/MC/COFF/seh-align3.s
llvm/test/MC/COFF/seh.s