]> granicus.if.org Git - clang/commitdiff
[OPENMP] Fix PR38823: Do not emit vtable if it is not used in target
authorAlexey Bataev <a.bataev@hotmail.com>
Thu, 6 Sep 2018 17:56:28 +0000 (17:56 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Thu, 6 Sep 2018 17:56:28 +0000 (17:56 +0000)
context.

If the explicit template instantiation definition defined outside of the
target context, its vtable should not be marked as used. This is true
for other situations where the compiler want to emit vtables
unconditionally.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@341570 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/OpenMP/declare_target_codegen.cpp

index d3f7af25295a535af217ba1194cbb4eb553b8ca3..dbca30aa43ba3cddb9bb1519df7c337166c59717 100644 (file)
@@ -14903,6 +14903,11 @@ void Sema::MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class,
   if (!Class->isDynamicClass() || Class->isDependentContext() ||
       CurContext->isDependentContext() || isUnevaluatedContext())
     return;
+  // Do not mark as used if compiling for the device outside of the target
+  // region.
+  if (LangOpts.OpenMP && LangOpts.OpenMPIsDevice &&
+      !isInOpenMPDeclareTargetContext() && !getCurFunctionDecl())
+    return;
 
   // Try to insert this class into the map.
   LoadExternalVTableUses();
index 1694ec6072ca17a5b56009ce3933a746228f145f..2475c49d3decf718ed81a806498556efea2ecc4b 100644 (file)
@@ -12,7 +12,8 @@
 
 // SIMD-ONLY-NOT: {{__kmpc|__tgt}}
 
-// CHECK-NOT: define {{.*}}{{baz1|baz4|maini1}}
+// CHECK-NOT: define {{.*}}{{baz1|baz4|maini1|Base}}
+// CHECK-DAG: Bake
 // CHECK-NOT: @{{hhh|ggg|fff|eee}} =
 // CHECK-DAG: @aaa = external global i32,
 // CHECK-DAG: @bbb = global i32 0,
@@ -140,9 +141,25 @@ int baz5() {
   return a;
 }
 
+template <typename T>
+struct Base {
+  virtual ~Base() {}
+};
+
+template class Base<int>;
+
+template <typename T>
+struct Bake {
+  virtual ~Bake() {}
+};
+
+#pragma omp declare target
+template class Bake<int>;
+#pragma omp end declare target
+
 // CHECK-DAG: declare extern_weak signext i32 @__create()
 
-// CHECK-NOT: define {{.*}}{{baz1|baz4|maini1}}
+// CHECK-NOT: define {{.*}}{{baz1|baz4|maini1|Base}}
 
 // CHECK-DAG: !{i32 1, !"aaa", i32 0, i32 {{[0-9]+}}}
 // CHECK-DAG: !{i32 1, !"ccc", i32 0, i32 {{[0-9]+}}}