[OPENMP] Fix PR38823: Do not emit vtable if it is not used in target

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.

llvm-svn: 341570
This commit is contained in:
Alexey Bataev 2018-09-06 17:56:28 +00:00
parent c239482207
commit d2c1dd5902
2 changed files with 24 additions and 2 deletions

View 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();

View 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]+}}}