diff options
| author | Alexey Bataev <a.bataev@hotmail.com> | 2015-04-10 07:48:12 +0000 |
|---|---|---|
| committer | Alexey Bataev <a.bataev@hotmail.com> | 2015-04-10 07:48:12 +0000 |
| commit | 3e6124bc4da595e25824041a9f9018f1892353a2 (patch) | |
| tree | 85d91ad9acb186db00d803670cda9817705226d3 /clang/lib/CodeGen | |
| parent | b9489a696e2fc029bcd6c9980a26a29a3ddfd29d (diff) | |
| download | bcm5719-llvm-3e6124bc4da595e25824041a9f9018f1892353a2.tar.gz bcm5719-llvm-3e6124bc4da595e25824041a9f9018f1892353a2.zip | |
[OPENMP] Fixed cleanup of OpenMP code.
llvm-svn: 234575
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGOpenMPRuntime.cpp | 43 |
1 files changed, 15 insertions, 28 deletions
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index f3a575f117d..2b9fbd66613 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -970,12 +970,18 @@ llvm::Value *CGOpenMPRuntime::getCriticalRegionLock(StringRef CriticalName) { namespace { class CallEndCleanup : public EHScopeStack::Cleanup { +public: + typedef ArrayRef<llvm::Value *> CleanupValuesTy; private: - const RegionCodeGenTy CodeGen; + llvm::Value *Callee; + llvm::SmallVector<llvm::Value *, 8> Args; public: - CallEndCleanup(const RegionCodeGenTy &CodeGen) : CodeGen(CodeGen) {} - void Emit(CodeGenFunction &CGF, Flags /*flags*/) override { CodeGen(CGF); } + CallEndCleanup(llvm::Value *Callee, CleanupValuesTy Args) + : Callee(Callee), Args(Args.begin(), Args.end()) {} + void Emit(CodeGenFunction &CGF, Flags /*flags*/) override { + CGF.EmitRuntimeCall(Callee, Args); + } }; } // namespace @@ -995,15 +1001,8 @@ void CGOpenMPRuntime::emitCriticalRegion(CodeGenFunction &CGF, emitInlinedDirective(CGF, CriticalOpGen); // Build a call to __kmpc_end_critical CGF.EHStack.pushCleanup<CallEndCleanup>( - NormalAndEHCleanup, [Loc, CriticalName](CodeGenFunction &CGF) { - llvm::Value *Args[] = { - CGF.CGM.getOpenMPRuntime().emitUpdateLocation(CGF, Loc), - CGF.CGM.getOpenMPRuntime().getThreadID(CGF, Loc), - CGF.CGM.getOpenMPRuntime().getCriticalRegionLock(CriticalName)}; - CGF.EmitRuntimeCall(CGF.CGM.getOpenMPRuntime().createRuntimeFunction( - OMPRTL__kmpc_end_critical), - Args); - }); + NormalAndEHCleanup, createRuntimeFunction(OMPRTL__kmpc_end_critical), + llvm::makeArrayRef(Args)); } } @@ -1056,14 +1055,8 @@ void CGOpenMPRuntime::emitMasterRegion(CodeGenFunction &CGF, // fallthrough rather than pushing a normal cleanup for it. // Build a call to __kmpc_end_critical CGF.EHStack.pushCleanup<CallEndCleanup>( - NormalAndEHCleanup, [Loc](CodeGenFunction &CGF) { - llvm::Value *Args[] = { - CGF.CGM.getOpenMPRuntime().emitUpdateLocation(CGF, Loc), - CGF.CGM.getOpenMPRuntime().getThreadID(CGF, Loc)}; - CGF.EmitRuntimeCall(CGF.CGM.getOpenMPRuntime().createRuntimeFunction( - OMPRTL__kmpc_end_master), - Args); - }); + NormalAndEHCleanup, createRuntimeFunction(OMPRTL__kmpc_end_master), + llvm::makeArrayRef(Args)); }); } @@ -1195,14 +1188,8 @@ void CGOpenMPRuntime::emitSingleRegion(CodeGenFunction &CGF, // It is analyzed in Sema, so we can just call __kmpc_end_single() on // fallthrough rather than pushing a normal cleanup for it. CGF.EHStack.pushCleanup<CallEndCleanup>( - NormalAndEHCleanup, [Loc](CodeGenFunction &CGF) { - llvm::Value *Args[] = { - CGF.CGM.getOpenMPRuntime().emitUpdateLocation(CGF, Loc), - CGF.CGM.getOpenMPRuntime().getThreadID(CGF, Loc)}; - CGF.EmitRuntimeCall(CGF.CGM.getOpenMPRuntime().createRuntimeFunction( - OMPRTL__kmpc_end_single), - Args); - }); + NormalAndEHCleanup, createRuntimeFunction(OMPRTL__kmpc_end_single), + llvm::makeArrayRef(Args)); }); // call __kmpc_copyprivate(ident_t *, gtid, <buf_size>, <copyprivate list>, // <copy_func>, did_it); |

