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