alok created this revision. alok added reviewers: aprantl, djtodoro, jmorse, dblaikie, jini.susan, jini.susan.george. alok added a project: debug-info. Herald added subscribers: guansong, yaxunl. alok requested review of this revision. Herald added a reviewer: jdoerfert. Herald added subscribers: cfe-commits, sstefan1. Herald added a project: clang.
The OpenMP generates many functions which are not in user program. Example: "__captured_stmt_debug_", "__captured_stmt", ".omp_outlined._debug__", ".omp_task_entry.", ".omp_outlined.", ".omp_outlined..1" Current patch marks these all as artificial. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D111521 Files: clang/lib/CodeGen/CGDebugInfo.cpp clang/test/OpenMP/outlined_artificial.c Index: clang/test/OpenMP/outlined_artificial.c =================================================================== --- /dev/null +++ clang/test/OpenMP/outlined_artificial.c @@ -0,0 +1,63 @@ +// This testcase checks emission of DIFlagArtificial flag for outlined +// subroutines generated by compiler. + +// REQUIRES: x86_64-linux + +// RUN: %clang_cc1 -debug-info-kind=constructor -x c -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s +// expected-no-diagnostics + +#if defined(_WIN32) +#define __KAI_KMPC_CONVENTION __cdecl +#else +#define __KAI_KMPC_CONVENTION +#endif + +extern int printf(const char *, ...); +extern void __KAI_KMPC_CONVENTION omp_set_num_threads(int); +extern int __KAI_KMPC_CONVENTION omp_get_thread_num(void); + +#define N 10 + +float f[10]; +void foo_simd(int low, int up) { + for (int i = low; i < up; ++i) { + f[i] = 0.0; +#pragma omp ordered simd + f[i] = 1.0; + } +} + +int main() { + int arr[10]; + int i; + omp_set_num_threads(2); +#pragma omp parallel +#pragma omp single +#pragma omp taskloop num_tasks(10) + for (i = 0; i < N; i++) { + arr[i] = i * i; + } + + for (int j = 0; j < N; j++) { + printf("%d\n", arr[j]); + } + return 0; +} + +// CHECK: !DISubprogram(name: "__captured_stmt_debug__" +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(name: "__captured_stmt" +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(name: ".omp_outlined._debug__" +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(linkageName: ".omp_task_entry." +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(name: ".omp_outlined." +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(name: ".omp_outlined..1" +// CHECK-SAME: DIFlagArtificial Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -4020,7 +4020,8 @@ Name = Name.substr(1); if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>() || - (isa<VarDecl>(D) && GD.getDynamicInitKind() != DynamicInitKind::NoStub)) { + (isa<VarDecl>(D) && GD.getDynamicInitKind() != DynamicInitKind::NoStub) || + isa<CapturedDecl>(D)) { Flags |= llvm::DINode::FlagArtificial; // Artificial functions should not silently reuse CurLoc. CurLoc = SourceLocation();
Index: clang/test/OpenMP/outlined_artificial.c =================================================================== --- /dev/null +++ clang/test/OpenMP/outlined_artificial.c @@ -0,0 +1,63 @@ +// This testcase checks emission of DIFlagArtificial flag for outlined +// subroutines generated by compiler. + +// REQUIRES: x86_64-linux + +// RUN: %clang_cc1 -debug-info-kind=constructor -x c -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s +// expected-no-diagnostics + +#if defined(_WIN32) +#define __KAI_KMPC_CONVENTION __cdecl +#else +#define __KAI_KMPC_CONVENTION +#endif + +extern int printf(const char *, ...); +extern void __KAI_KMPC_CONVENTION omp_set_num_threads(int); +extern int __KAI_KMPC_CONVENTION omp_get_thread_num(void); + +#define N 10 + +float f[10]; +void foo_simd(int low, int up) { + for (int i = low; i < up; ++i) { + f[i] = 0.0; +#pragma omp ordered simd + f[i] = 1.0; + } +} + +int main() { + int arr[10]; + int i; + omp_set_num_threads(2); +#pragma omp parallel +#pragma omp single +#pragma omp taskloop num_tasks(10) + for (i = 0; i < N; i++) { + arr[i] = i * i; + } + + for (int j = 0; j < N; j++) { + printf("%d\n", arr[j]); + } + return 0; +} + +// CHECK: !DISubprogram(name: "__captured_stmt_debug__" +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(name: "__captured_stmt" +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(name: ".omp_outlined._debug__" +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(linkageName: ".omp_task_entry." +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(name: ".omp_outlined." +// CHECK-SAME: DIFlagArtificial + +// CHECK: !DISubprogram(name: ".omp_outlined..1" +// CHECK-SAME: DIFlagArtificial Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -4020,7 +4020,8 @@ Name = Name.substr(1); if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>() || - (isa<VarDecl>(D) && GD.getDynamicInitKind() != DynamicInitKind::NoStub)) { + (isa<VarDecl>(D) && GD.getDynamicInitKind() != DynamicInitKind::NoStub) || + isa<CapturedDecl>(D)) { Flags |= llvm::DINode::FlagArtificial; // Artificial functions should not silently reuse CurLoc. CurLoc = SourceLocation();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits