[lld] r349974 - keymethod -> keyfunction

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 21 14:57:12 PST 2018


Author: maskray
Date: Fri Dec 21 14:57:11 2018
New Revision: 349974

URL: http://llvm.org/viewvc/llvm-project?rev=349974&view=rev
Log:
keymethod -> keyfunction

Pointed out by ruiu in rLLD349969

Added:
    lld/trunk/docs/missingkeyfunction.rst
      - copied, changed from r349969, lld/trunk/docs/missingkeymethod.rst
Removed:
    lld/trunk/docs/missingkeymethod.rst
Modified:
    lld/trunk/ELF/Relocations.cpp
    lld/trunk/test/ELF/undef.s

Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=349974&r1=349973&r2=349974&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Fri Dec 21 14:57:11 2018
@@ -665,7 +665,7 @@ static bool maybeReportUndefined(Symbol
 
   if (Sym.getName().startswith("_ZTV"))
     Msg += "\nthe vtable symbol may be undefined because the class is missing "
-           "its key function (see https://lld.llvm.org/missingkeymethod)";
+           "its key function (see https://lld.llvm.org/missingkeyfunction)";
 
   if ((Config->UnresolvedSymbols == UnresolvedPolicy::Warn && CanBeExternal) ||
       Config->NoinhibitExec) {

Copied: lld/trunk/docs/missingkeyfunction.rst (from r349969, lld/trunk/docs/missingkeymethod.rst)
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/docs/missingkeyfunction.rst?p2=lld/trunk/docs/missingkeyfunction.rst&p1=lld/trunk/docs/missingkeymethod.rst&r1=349969&r2=349974&rev=349974&view=diff
==============================================================================
--- lld/trunk/docs/missingkeymethod.rst (original)
+++ lld/trunk/docs/missingkeyfunction.rst Fri Dec 21 14:57:11 2018
@@ -4,7 +4,7 @@ Missing Key Method
 If your build failed with a linker error something like this::
 
   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)
+  the vtable symbol may be undefined because the class is missing its key function (see https://lld.llvm.org/missingkeyfunction)
 
 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.

Removed: lld/trunk/docs/missingkeymethod.rst
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/docs/missingkeymethod.rst?rev=349973&view=auto
==============================================================================
--- lld/trunk/docs/missingkeymethod.rst (original)
+++ lld/trunk/docs/missingkeymethod.rst (removed)
@@ -1,84 +0,0 @@
-Missing Key Method
-==================
-
-If your build failed with a linker error something like this::
-
-  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 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 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.
-
-When a class has no non-pure, non-inline, virtual methods, there is no key
-method, and the compiler is forced to emit the vtable in every translation unit
-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 function.
-
-Here are the most common mistakes that lead to this error:
-
-Failing to define a virtual destructor
---------------------------------------
-
-Say you have a base class declared in a header file::
-
-  class B {
-  public:
-    B();
-    virtual ~B();
-    ...
-  };
-
-Here, ``~B`` is the first non-pure, non-inline, virtual method, so it is the key
-method. If you forget to define ``B::~B`` in your source file, the compiler will
-not emit the vtable for ``B``, and you'll get an undefined reference to "vtable
-for B".
-
-This is just an example of the more general mistake of forgetting to define the
-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.
-
-The solution in this case is to implement the missing method.
-
-Forgetting to declare a virtual method in an abstract class as pure
--------------------------------------------------------------------
-
-Say you have an abstract base class declared in a header file::
-
-  class A {
-  public:
-    A();
-    virtual ~A() {}
-    virtual int foo() = 0;
-    ...
-    virtual int bar();
-    ...
-  };
-
-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 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``.
-
-The solution in this case is to add the missing ``= 0`` to the declaration of
-``A::bar``.
-
-Key method is defined, but the linker doesn't see it
-----------------------------------------------------
-
-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 function is given to
-the linker.

Modified: lld/trunk/test/ELF/undef.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/undef.s?rev=349974&r1=349973&r2=349974&view=diff
==============================================================================
--- lld/trunk/test/ELF/undef.s (original)
+++ lld/trunk/test/ELF/undef.s Fri Dec 21 14:57:11 2018
@@ -21,7 +21,7 @@
 # CHECK: >>>               {{.*}}:(.text+0x10)
 
 # CHECK: error: undefined symbol: vtable for Foo
-# CHECK: the vtable symbol may be undefined because the class is missing its key function (see https://lld.llvm.org/missingkeymethod)
+# CHECK: the vtable symbol may be undefined because the class is missing its key function (see https://lld.llvm.org/missingkeyfunction)
 
 # CHECK: error: undefined symbol: zed2
 # CHECK: >>> referenced by {{.*}}.o:(.text+0x0) in archive {{.*}}2.a




More information about the llvm-commits mailing list