[cfe-commits] r101757 - in /cfe/trunk: lib/CodeGen/CGVTables.h lib/CodeGen/CodeGenModule.cpp test/CodeGenCXX/PR6747.cpp

Daniel Dunbar daniel at zuster.org
Mon Apr 19 08:47:40 PDT 2010


Hi Rafael,

On Sun, Apr 18, 2010 at 5:44 PM, Rafael Espindola
<rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Sun Apr 18 19:44:22 2010
> New Revision: 101757
>
> URL: http://llvm.org/viewvc/llvm-project?rev=101757&view=rev
> Log:
> If a method is virtual and the class key function is in another file, emit the method as available_externally.
> Fixes PR6747
>
> Added:
>    cfe/trunk/test/CodeGenCXX/PR6747.cpp
> Modified:
>    cfe/trunk/lib/CodeGen/CGVTables.h
>    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGVTables.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVTables.h?rev=101757&r1=101756&r2=101757&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGVTables.h (original)
> +++ cfe/trunk/lib/CodeGen/CGVTables.h Sun Apr 18 19:44:22 2010
> @@ -295,6 +295,15 @@
>   CodeGenVTables(CodeGenModule &CGM)
>     : CGM(CGM) { }
>
> +  // isKeyFunctionInAnotherTU - True if this record has a key function and it is
> +  // in another translation unit.
> +  static bool isKeyFunctionInAnotherTU(ASTContext &Context,
> +                                      const CXXRecordDecl *RD) {
> +    assert (RD->isDynamicClass() && "Non dynamic classes have no key.");
> +    const CXXMethodDecl *KeyFunction = Context.getKeyFunction(RD);
> +    return KeyFunction && !KeyFunction->getBody();
> +  }
> +
>   /// needsVTTParameter - Return whether the given global decl needs a VTT
>   /// parameter, which it does if it's a base constructor or destructor with
>   /// virtual bases.
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=101757&r1=101756&r2=101757&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sun Apr 18 19:44:22 2010
> @@ -314,7 +314,14 @@
>   if (FD->getTemplateSpecializationKind()
>                                        == TSK_ExplicitInstantiationDeclaration)
>     return CodeGenModule::GVA_C99Inline;
> -
> +
> +  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
> +    const CXXRecordDecl *RD = MD->getParent();
> +    if (MD->isVirtual() &&
> +       CodeGenVTables::isKeyFunctionInAnotherTU(Context, RD))
> +      return CodeGenModule::GVA_C99Inline;
> +  }

At a minimum, this should have a comment, maybe even a different GVA_
define. As read, it is confusing to return C99Inline for a C++ decl.

 - Daniel

> +
>   return CodeGenModule::GVA_CXXInline;
>  }
>
>
> Added: cfe/trunk/test/CodeGenCXX/PR6747.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/PR6747.cpp?rev=101757&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/PR6747.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/PR6747.cpp Sun Apr 18 19:44:22 2010
> @@ -0,0 +1,11 @@
> +// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
> +
> +struct foo {
> +  virtual void bar();
> +// CHECK: define available_externally void @_ZN3foo3bazEv
> +  virtual void baz() {}
> +};
> +void zed() {
> +  foo b;
> +  b.baz();
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list