blob: 846d4748532c276bfab18a2f3b60889ae2ccd1cf [file] [log] [blame]
Alexey Bataev9959db52014-05-06 10:08:46 +00001//===--- CGStmtOpenMP.cpp - Emit LLVM Code from Statements ----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This contains code to emit OpenMP nodes as LLVM code.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CGOpenMPRuntime.h"
15#include "CodeGenFunction.h"
16#include "CodeGenModule.h"
17#include "clang/AST/Stmt.h"
18#include "clang/AST/StmtOpenMP.h"
19using namespace clang;
20using namespace CodeGen;
21
22//===----------------------------------------------------------------------===//
23// OpenMP Directive Emission
24//===----------------------------------------------------------------------===//
25
26void CodeGenFunction::EmitOMPParallelDirective(const OMPParallelDirective &S) {
27 const CapturedStmt *CS = cast<CapturedStmt>(S.getAssociatedStmt());
28 llvm::Value *CapturedStruct = GenerateCapturedStmtArgument(*CS);
29
30 llvm::Value *OutlinedFn;
31 {
32 CodeGenFunction CGF(CGM, true);
33 CGCapturedStmtInfo CGInfo(*CS, CS->getCapturedRegionKind());
34 CGF.CapturedStmtInfo = &CGInfo;
35 OutlinedFn = CGF.GenerateCapturedStmtFunction(
36 CS->getCapturedDecl(), CS->getCapturedRecordDecl(), CS->getLocStart());
37 }
38
39 // Build call __kmpc_fork_call(loc, 1, microtask, captured_struct/*context*/)
40 llvm::Value *Args[] = {
41 CGM.getOpenMPRuntime().EmitOpenMPUpdateLocation(*this, S.getLocStart()),
42 Builder.getInt32(1), // Number of arguments after 'microtask' argument
43 // (there is only one additional argument - 'context')
44 Builder.CreateBitCast(OutlinedFn,
45 CGM.getOpenMPRuntime().getKmpc_MicroPointerTy()),
46 EmitCastToVoidPtr(CapturedStruct)
47 };
48 llvm::Constant *RTLFn = CGM.getOpenMPRuntime().CreateRuntimeFunction(
49 CGOpenMPRuntime::OMPRTL__kmpc_fork_call);
50 EmitRuntimeCall(RTLFn, Args);
51}