[lld] r349969 - key method -> key function

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 21 15:00:55 PST 2018


Sorry... Fixed

On 2018-12-21, Rui Ueyama wrote:
>You also need to change the filename, the URL and the error message.
>
>On Fri, Dec 21, 2018 at 2:43 PM Fangrui Song via llvm-commits <
>llvm-commits at lists.llvm.org> wrote:
>
>    Author: maskray
>    Date: Fri Dec 21 14:40:10 2018
>    New Revision: 349969
>
>    URL: http://llvm.org/viewvc/llvm-project?rev=349969&view=rev
>    Log:
>    key method -> key function
>
>    The latter is what is actually called in the ABI http://
>    itanium-cxx-abi.github.io/cxx-abi/abi.html#vague-vtable
>
>    Pointed out by rsmith
>
>    Modified:
>        lld/trunk/docs/Readers.rst
>        lld/trunk/docs/missingkeymethod.rst
>
>    Modified: lld/trunk/docs/Readers.rst
>    URL: http://llvm.org/viewvc/llvm-project/lld/trunk/docs/Readers.rst?rev=
>    349969&r1=349968&r2=349969&view=diff
>    ===========================================================================
>    ===
>    --- lld/trunk/docs/Readers.rst (original)
>    +++ lld/trunk/docs/Readers.rst Fri Dec 21 14:40:10 2018
>    @@ -74,7 +74,7 @@ files in parallel. Therefore, there shou
>     object.  Any parsing state should be in ivars of your File subclass or in
>     some temporary object.
>
>    -The key method to implement in a reader is::
>    +The key function to implement in a reader is::
>
>       virtual error_code loadFile(LinkerInput &input,
>                                   std::vector<std::unique_ptr<File>> &result);
>
>    Modified: lld/trunk/docs/missingkeymethod.rst
>    URL: http://llvm.org/viewvc/llvm-project/lld/trunk/docs/
>    missingkeymethod.rst?rev=349969&r1=349968&r2=349969&view=diff
>    ===========================================================================
>    ===
>    --- lld/trunk/docs/missingkeymethod.rst (original)
>    +++ lld/trunk/docs/missingkeymethod.rst Fri Dec 21 14:40:10 2018
>    @@ -6,12 +6,12 @@ If your build failed with a linker error
>       foo.cc:28: error: undefined reference to 'vtable for C'
>       the vtable symbol may be undefined because the class is missing its key
>    function (see https://lld.llvm.org/missingkeymethod)
>
>    -it's likely that your class C has a key method (defined by the ABI as the
>    first
>    +it's likely that your class C has a key function (defined by the ABI as
>    the first
>     non-pure, non-inline, virtual method), but you haven't actually defined
>    it.
>
>    -When a class has a key method, the compiler emits the vtable (and some
>    other
>    -things as well) only in the translation unit that defines that key method.
>    Thus,
>    -if you're missing the key method, you'll also be missing the vtable. If no
>    other
>    +When a class has a key function, the compiler emits the vtable (and some
>    other
>    +things as well) only in the translation unit that defines that key
>    function. Thus,
>    +if you're missing the key function, you'll also be missing the vtable. If
>    no other
>     function calls your missing method, you won't see any undefined reference
>    errors
>     for it, but you will see undefined references to the vtable symbol.
>
>    @@ -20,7 +20,7 @@ method, and the compiler is forced to em
>     that references the class. In this case, it is emitted in a COMDAT
>    section,
>     which allows the linker to eliminate all duplicate copies. This is still
>     wasteful in terms of object file size and link time, so it's always
>    advisable to
>    -ensure there is at least one eligible method that can serve as the key
>    method.
>    +ensure there is at least one eligible method that can serve as the key
>    function.
>
>     Here are the most common mistakes that lead to this error:
>
>    @@ -42,8 +42,8 @@ not emit the vtable for ``B``, and you'l
>     for B".
>
>     This is just an example of the more general mistake of forgetting to
>    define the
>    -key method, but it's quite common because virtual destructors are likely
>    to be
>    -the first eligible key method and it's easy to forget to implement them.
>    It's
>    +key function, but it's quite common because virtual destructors are likely
>    to be
>    +the first eligible key function and it's easy to forget to implement them.
>    It's
>     also more likely that you won't have any direct references to the
>    destructor, so
>     you won't see any undefined reference errors that point directly to the
>    problem.
>
>    @@ -65,7 +65,7 @@ Say you have an abstract base class decl
>       };
>
>     This base class is intended to be abstract, but you forgot to mark one of
>    the
>    -methods pure. Here, ``A::bar``, being non-pure, is nominated as the key
>    method,
>    +methods pure. Here, ``A::bar``, being non-pure, is nominated as the key
>    function,
>     and as a result, the vtable for ``A`` is not emitted, because the compiler
>    is
>     waiting for a translation unit that defines ``A::bar``.
>
>    @@ -75,10 +75,10 @@ The solution in this case is to add the
>     Key method is defined, but the linker doesn't see it
>     ----------------------------------------------------
>
>    -It's also possible that you have defined the key method somewhere, but the
>    +It's also possible that you have defined the key function somewhere, but
>    the
>     object file containing the definition of that method isn't being linked
>    into
>     your application.
>
>     The solution in this case is to check your dependencies to make sure that
>    -the object file or the library file containing the key method is given to
>    +the object file or the library file containing the key function is given
>    to
>     the linker.
>
>    _______________________________________________
>    llvm-commits mailing list
>    llvm-commits at lists.llvm.org
>    http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>

-- 
宋方睿


More information about the llvm-commits mailing list