From: Alexey Bataev Date: Wed, 22 Nov 2017 16:02:03 +0000 (+0000) Subject: [OPENMP] Do not mark captured variables as artificial in debug info. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c87c796e20f25787f0c04d20fd5dc5a841a01584;p=clang [OPENMP] Do not mark captured variables as artificial in debug info. Captured variables should not be marked as artificial parameters in outlined functions in debug info. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@318843 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp b/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp index c8767bde26..bc769f4f49 100644 --- a/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp +++ b/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp @@ -2323,9 +2323,17 @@ CGOpenMPRuntimeNVPTX::translateParameter(const FieldDecl *FD, enum { NVPTX_local_addr = 5 }; QC.addAddressSpace(getLangASFromTargetAS(NVPTX_local_addr)); ArgType = QC.apply(CGM.getContext(), ArgType); - return ImplicitParamDecl::Create( - CGM.getContext(), /*DC=*/nullptr, NativeParam->getLocation(), - NativeParam->getIdentifier(), ArgType, ImplicitParamDecl::Other); + if (isa(NativeParam)) { + return ImplicitParamDecl::Create( + CGM.getContext(), /*DC=*/nullptr, NativeParam->getLocation(), + NativeParam->getIdentifier(), ArgType, ImplicitParamDecl::Other); + } + return ParmVarDecl::Create( + CGM.getContext(), + const_cast(NativeParam->getDeclContext()), + NativeParam->getLocStart(), NativeParam->getLocation(), + NativeParam->getIdentifier(), ArgType, + /*TInfo=*/nullptr, SC_None, /*DefArg=*/nullptr); } Address diff --git a/lib/CodeGen/CGStmtOpenMP.cpp b/lib/CodeGen/CGStmtOpenMP.cpp index 0863cc83ab..697367f793 100644 --- a/lib/CodeGen/CGStmtOpenMP.cpp +++ b/lib/CodeGen/CGStmtOpenMP.cpp @@ -311,6 +311,16 @@ static llvm::Function *emitOutlinedFunctionPrologue( CD->param_begin(), std::next(CD->param_begin(), CD->getContextParamPosition())); auto I = FO.S->captures().begin(); + FunctionDecl *DebugFunctionDecl = nullptr; + if (!FO.UIntPtrCastRequired) { + FunctionProtoType::ExtProtoInfo EPI; + DebugFunctionDecl = FunctionDecl::Create( + Ctx, Ctx.getTranslationUnitDecl(), FO.S->getLocStart(), + SourceLocation(), DeclarationName(), Ctx.VoidTy, + Ctx.getTrivialTypeSourceInfo( + Ctx.getFunctionType(Ctx.VoidTy, llvm::None, EPI)), + SC_Static, /*isInlineSpecified=*/false, /*hasWrittenPrototype=*/false); + } for (auto *FD : RD->fields()) { QualType ArgType = FD->getType(); IdentifierInfo *II = nullptr; @@ -338,9 +348,17 @@ static llvm::Function *emitOutlinedFunctionPrologue( } if (ArgType->isVariablyModifiedType()) ArgType = getCanonicalParamType(Ctx, ArgType); - auto *Arg = - ImplicitParamDecl::Create(Ctx, /*DC=*/nullptr, FD->getLocation(), II, - ArgType, ImplicitParamDecl::Other); + VarDecl *Arg; + if (DebugFunctionDecl && (CapVar || I->capturesThis())) { + Arg = ParmVarDecl::Create( + Ctx, DebugFunctionDecl, + CapVar ? CapVar->getLocStart() : FD->getLocStart(), + CapVar ? CapVar->getLocation() : FD->getLocation(), II, ArgType, + /*TInfo=*/nullptr, SC_None, /*DefArg=*/nullptr); + } else { + Arg = ImplicitParamDecl::Create(Ctx, /*DC=*/nullptr, FD->getLocation(), + II, ArgType, ImplicitParamDecl::Other); + } Args.emplace_back(Arg); // Do not cast arguments if we emit function with non-original types. TargetArgs.emplace_back( diff --git a/test/OpenMP/target_parallel_debug_codegen.cpp b/test/OpenMP/target_parallel_debug_codegen.cpp index cd19a8fdbc..385f7a29cb 100644 --- a/test/OpenMP/target_parallel_debug_codegen.cpp +++ b/test/OpenMP/target_parallel_debug_codegen.cpp @@ -111,3 +111,13 @@ int main() { // CHECK: addrspacecast [10 x [10 x i32]]* %{{.+}} to [10 x [10 x i32]] addrspace(1)* // CHECK: call void @__omp_offloading_{{[^(]+}}([10 x [10 x [10 x i32]]] addrspace(1)* {{[^,]+}}, i32 addrspace(1)* {{[^,]+}}, [10 x [10 x i32]] addrspace(1)* {{[^,]+}}, i8 addrspace(1)* {{[^)]+}}) +// CHECK: !DILocalVariable(name: ".global_tid.", +// CHECK-SAME: DIFlagArtificial +// CHECK: !DILocalVariable(name: ".bound_tid.", +// CHECK-SAME: DIFlagArtificial +// CHECK: !DILocalVariable(name: "c", +// CHECK-SAMEi-NOT: DIFlagArtificial +// CHECK: !DILocalVariable(name: "a", +// CHECK-SAMEi-NOT: DIFlagArtificial +// CHECK: !DILocalVariable(name: "b", +// CHECK-SAMEi-NOT: DIFlagArtificial