From f002acae9d6fbb5d20f571b19f8d00d5bb1465a3 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Fri, 30 May 2014 05:48:40 +0000 Subject: [PATCH] [OPENMP] Improve debug location codegen for OpenMP runtime library. llvm-svn: 209876 --- clang/lib/CodeGen/CGOpenMPRuntime.cpp | 34 ++++++++++++++++++++-------------- clang/lib/CodeGen/CGOpenMPRuntime.h | 3 +++ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index da86e2b..8ff4c3c 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -57,9 +57,10 @@ CGOpenMPRuntime::GetOrCreateDefaultOpenMPLocation(OpenMPLocationFlags Flags) { DefaultOpenMPLocation->setLinkage(llvm::GlobalValue::PrivateLinkage); llvm::Constant *Zero = llvm::ConstantInt::get(CGM.Int32Ty, 0, true); - llvm::Constant *Values[] = { Zero, - llvm::ConstantInt::get(CGM.Int32Ty, Flags), - Zero, Zero, DefaultOpenMPPSource }; + llvm::Constant *Values[] = { + Zero, llvm::ConstantInt::get(CGM.Int32Ty, Flags), Zero, + Zero, DefaultOpenMPPSource + }; llvm::Constant *Init = llvm::ConstantStruct::get(IdentTy, Values); DefaultOpenMPLocation->setInitializer(Init); return DefaultOpenMPLocation; @@ -98,19 +99,24 @@ llvm::Value *CGOpenMPRuntime::EmitOpenMPUpdateLocation( llvm::Value *PSource = CGF.Builder.CreateConstInBoundsGEP2_32(LocValue, 0, IdentField_PSource); - SmallString<128> Buffer2; - llvm::raw_svector_ostream OS2(Buffer2); - // Build debug location - PresumedLoc PLoc = CGF.getContext().getSourceManager().getPresumedLoc(Loc); - OS2 << ";" << PLoc.getFilename() << ";"; - if (const FunctionDecl *FD = - dyn_cast_or_null(CGF.CurFuncDecl)) { - OS2 << FD->getQualifiedNameAsString(); + auto OMPDebugLoc = OpenMPDebugLocMap.lookup(Loc.getRawEncoding()); + if (OMPDebugLoc == nullptr) { + SmallString<128> Buffer2; + llvm::raw_svector_ostream OS2(Buffer2); + // Build debug location + PresumedLoc PLoc = CGF.getContext().getSourceManager().getPresumedLoc(Loc); + OS2 << ";" << PLoc.getFilename() << ";"; + if (const FunctionDecl *FD = + dyn_cast_or_null(CGF.CurFuncDecl)) { + OS2 << FD->getQualifiedNameAsString(); + } + OS2 << ";" << PLoc.getLine() << ";" << PLoc.getColumn() << ";;"; + OMPDebugLoc = CGF.Builder.CreateGlobalStringPtr(OS2.str()); + OpenMPDebugLocMap[Loc.getRawEncoding()] = OMPDebugLoc; } - OS2 << ";" << PLoc.getLine() << ";" << PLoc.getColumn() << ";;"; // *psource = ";;;;;;"; - CGF.Builder.CreateStore(CGF.Builder.CreateGlobalStringPtr(OS2.str()), - PSource); + CGF.Builder.CreateStore(OMPDebugLoc, PSource); + return LocValue; } diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.h b/clang/lib/CodeGen/CGOpenMPRuntime.h index 06103cf..368c2d8 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.h +++ b/clang/lib/CodeGen/CGOpenMPRuntime.h @@ -121,6 +121,9 @@ private: IdentField_PSource }; llvm::StructType *IdentTy; + /// \brief Map for Sourcelocation and OpenMP runtime library debug locations. + typedef llvm::DenseMap OpenMPDebugLocMapTy; + OpenMPDebugLocMapTy OpenMPDebugLocMap; /// \brief The type for a microtask which gets passed to __kmpc_fork_call(). /// Original representation is: /// typedef void (kmpc_micro)(kmp_int32 global_tid, kmp_int32 bound_tid,...); -- 2.7.4