16bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----- CGOpenMPRuntime.h - Interface to OpenMP Runtimes -----*- C++ -*-===// 26bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// 36bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// The LLVM Compiler Infrastructure 46bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// 56bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// This file is distributed under the University of Illinois Open Source 66bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// License. See LICENSE.TXT for details. 76bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// 86bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 96bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// 106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// This provides a class for OpenMP runtime code generation. 116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// 126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#ifndef CLANG_CODEGEN_OPENMPRUNTIME_H 156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define CLANG_CODEGEN_OPENMPRUNTIME_H 166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/AST/Type.h" 186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "llvm/ADT/DenseMap.h" 196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "llvm/IR/Type.h" 206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "llvm/IR/Value.h" 216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace llvm { 236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass AllocaInst; 246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass CallInst; 256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass GlobalVariable; 266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass Constant; 276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass Function; 286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass Module; 296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass StructLayout; 306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass FunctionType; 316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass StructType; 326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass Type; 336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass Value; 34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} // namespace llvm 356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace clang { 376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace CodeGen { 396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass CodeGenFunction; 416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass CodeGenModule; 426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass CGOpenMPRuntime { 446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinespublic: 456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Values for bit flags used in the ident_t to describe the fields. 466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// All enumeric elements are named and described in accordance with the code 476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// from http://llvm.org/svn/llvm-project/openmp/trunk/runtime/src/kmp.h 486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines enum OpenMPLocationFlags { 496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Use trampoline for internal microtask. 506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMP_IDENT_IMD = 0x01, 516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Use c-style ident structure. 526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMP_IDENT_KMPC = 0x02, 536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Atomic reduction option for kmpc_reduce. 546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMP_ATOMIC_REDUCE = 0x10, 556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Explicit 'barrier' directive. 566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMP_IDENT_BARRIER_EXPL = 0x20, 576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Implicit barrier in code. 586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMP_IDENT_BARRIER_IMPL = 0x40, 596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Implicit barrier in 'for' directive. 606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMP_IDENT_BARRIER_IMPL_FOR = 0x40, 616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Implicit barrier in 'sections' directive. 626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMP_IDENT_BARRIER_IMPL_SECTIONS = 0xC0, 636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Implicit barrier in 'single' directive. 646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMP_IDENT_BARRIER_IMPL_SINGLE = 0x140 656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines enum OpenMPRTLFunction { 676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Call to void __kmpc_fork_call(ident_t *loc, kmp_int32 argc, kmpc_micro 686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // microtask, ...); 696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMPRTL__kmpc_fork_call, 706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Call to kmp_int32 kmpc_global_thread_num(ident_t *loc); 716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OMPRTL__kmpc_global_thread_num 726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesprivate: 756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CodeGenModule &CGM; 766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Default const ident_t object used for initialization of all other 776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// ident_t objects. 786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Constant *DefaultOpenMPPSource; 796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Map of flags and corrsponding default locations. 806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDefaultLocMapTy; 816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OpenMPDefaultLocMapTy OpenMPDefaultLocMap; 826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Value *GetOrCreateDefaultOpenMPLocation(OpenMPLocationFlags Flags); 836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Describes ident structure that describes a source location. 846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// All descriptions are taken from 856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// http://llvm.org/svn/llvm-project/openmp/trunk/runtime/src/kmp.h 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// Original structure: 876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// typedef struct ident { 886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// kmp_int32 reserved_1; /**< might be used in Fortran; 896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// see above */ 906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// kmp_int32 flags; /**< also f.flags; KMP_IDENT_xxx flags; 916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// KMP_IDENT_KMPC identifies this union 926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// member */ 936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// kmp_int32 reserved_2; /**< not really used in Fortran any more; 946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// see above */ 956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ///#if USE_ITT_BUILD 966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// /* but currently used for storing 976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// region-specific ITT */ 986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// /* contextual information. */ 996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ///#endif /* USE_ITT_BUILD */ 1006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// kmp_int32 reserved_3; /**< source[4] in Fortran, do not use for 1016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// C++ */ 1026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// char const *psource; /**< String describing the source location. 1036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// The string is composed of semi-colon separated 1046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // fields which describe the source file, 1056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// the function and a pair of line numbers that 1066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// delimit the construct. 1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// */ 1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// } ident_t; 1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines enum IdentFieldIndex { 1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief might be used in Fortran 1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentField_Reserved_1, 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief OMP_IDENT_xxx flags; OMP_IDENT_KMPC identifies this union member. 1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentField_Flags, 1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Not really used in Fortran any more 1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentField_Reserved_2, 1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Source[4] in Fortran, do not use for C++ 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentField_Reserved_3, 1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief String describing the source location. The string is composed of 1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// semi-colon separated fields which describe the source file, the function 1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// and a pair of line numbers that delimit the construct. 1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentField_PSource 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::StructType *IdentTy; 124ef8225444452a1486bd721f3285301fe84643b00Stephen Hines /// \brief Map for Sourcelocation and OpenMP runtime library debug locations. 125ef8225444452a1486bd721f3285301fe84643b00Stephen Hines typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDebugLocMapTy; 126ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OpenMPDebugLocMapTy OpenMPDebugLocMap; 1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief The type for a microtask which gets passed to __kmpc_fork_call(). 1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// Original representation is: 1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// typedef void (kmpc_micro)(kmp_int32 global_tid, kmp_int32 bound_tid,...); 1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::FunctionType *Kmpc_MicroTy; 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Map of local debug location and functions. 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef llvm::DenseMap<llvm::Function *, llvm::Value *> OpenMPLocMapTy; 1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OpenMPLocMapTy OpenMPLocMap; 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Map of local gtid and functions. 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef llvm::DenseMap<llvm::Function *, llvm::Value *> OpenMPGtidMapTy; 1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OpenMPGtidMapTy OpenMPGtidMap; 1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinespublic: 139ef8225444452a1486bd721f3285301fe84643b00Stephen Hines explicit CGOpenMPRuntime(CodeGenModule &CGM); 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ~CGOpenMPRuntime() {} 1416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Cleans up references to the objects in finished function. 1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \param CGF Reference to finished CodeGenFunction. 1446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// 1456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void FunctionFinished(CodeGenFunction &CGF); 1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Emits object of ident_t type with info for source location. 1486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \param CGF Reference to current CodeGenFunction. 1496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \param Loc Clang source location. 1506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \param Flags Flags for OpenMP location. 1516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// 1526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Value * 1536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines EmitOpenMPUpdateLocation(CodeGenFunction &CGF, SourceLocation Loc, 1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OpenMPLocationFlags Flags = OMP_IDENT_KMPC); 1556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Generates global thread number value. 1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \param CGF Reference to current CodeGenFunction. 1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \param Loc Clang source location. 1596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// 1606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Value *GetOpenMPGlobalThreadNum(CodeGenFunction &CGF, 1616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation Loc); 1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Returns pointer to ident_t type; 1646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Type *getIdentTyPointerTy(); 1656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Returns pointer to kmpc_micro type; 1676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Type *getKmpc_MicroPointerTy(); 1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Returns specified OpenMP runtime function. 1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \param Function OpenMP runtime function. 1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \return Specified function. 1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Constant *CreateRuntimeFunction(OpenMPRTLFunction Function); 1736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} // namespace CodeGen 175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} // namespace clang 1766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 178