OSDN Git Service

Linker: Drop function pointers for overridden subprograms
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 25 Mar 2015 02:26:32 +0000 (02:26 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 25 Mar 2015 02:26:32 +0000 (02:26 +0000)
commitc89369a941da3823f956a10b2a0471fd98804d63
tree1597bca18e1e3b847485c3cc33eab06f2ecf5746
parentef81f7c2550b9802acdb68912c92bb7619bcce15
Linker: Drop function pointers for overridden subprograms

Instead of dropping subprograms that have been overridden, just set
their function pointers to `nullptr`.  This is a minor adjustment to the
stop-gap fix for PR21910 committed in r224487, and fixes the crasher
from PR22792.

The problem that r224487 put a band-aid on: how do we find the canonical
subprogram for a `Function`?  Since the backend currently relies on
`DebugInfoFinder` (which does a naive in-order traversal of compile
units and picks the first subprogram) for this, r224487 tried dropping
non-canonical subprograms.

Dropping subprograms fails because the backend *also* builds up a map
from subprogram to compile unit (`DwarfDebug::SPMap`) based on the
subprogram lists.  A missing subprogram causes segfaults later when an
inlined reference (such as in this testcase) is created.

Instead, just drop the `Function` pointer to `nullptr`, which nicely
mirrors what happens when an already-inlined `Function` is optimized
out.  We can't really be sure that it's the same definition anyway, as
the testcase demonstrates.

This still isn't completely satisfactory.  Two flaws at least that I can
think of:

  - I still haven't found a straightforward way to make this symmetric
    in the IR.  (Interestingly, the DWARF output is already symmetric,
    and I've tested for that to be sure we don't regress.)
  - Using `DebugInfoFinder` to find the canonical subprogram for a
    function is kind of crazy.  We should just attach metadata to the
    function, like this:

        define weak i32 @foo(i32, i32) !dbg !MDSubprogram(...) {

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233164 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Linker/LinkModules.cpp
test/Linker/Inputs/subprogram-linkonce-weak.ll [new file with mode: 0644]
test/Linker/replaced-function-matches-first-subprogram.ll
test/Linker/subprogram-linkonce-weak.ll [new file with mode: 0644]