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
14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_LIB_CODEGEN_CGOPENMPRUNTIME_H
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_LIB_CODEGEN_CGOPENMPRUNTIME_H
166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "CGValue.h"
183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#include "clang/AST/Type.h"
190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/Basic/OpenMPKinds.h"
20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Basic/SourceLocation.h"
216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "llvm/ADT/DenseMap.h"
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/ADT/SmallPtrSet.h"
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/ADT/StringMap.h"
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/IR/Function.h"
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/IR/ValueHandle.h"
266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace llvm {
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass ArrayType;
296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass Constant;
306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass FunctionType;
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass GlobalVariable;
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass StructType;
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass Type;
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass Value;
35c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} // namespace llvm
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace clang {
38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass Expr;
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass GlobalDecl;
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPDependClause;
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPExecutableDirective;
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPLoopDirective;
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass VarDecl;
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPDeclareReductionDecl;
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass IdentifierInfo;
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace CodeGen {
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass Address;
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass CodeGenFunction;
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass CodeGenModule;
516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// A basic class for pre|post-action for advanced codegen sequence for OpenMP
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// region.
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass PrePostActionTy {
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit PrePostActionTy() {}
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void Enter(CodeGenFunction &CGF) {}
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void Exit(CodeGenFunction &CGF) {}
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual ~PrePostActionTy() {}
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
6158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Class provides a way to call simple version of codegen for OpenMP region, or
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// an advanced with possible pre|post-actions in codegen.
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass RegionCodeGenTy final {
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  intptr_t CodeGen;
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef void (*CodeGenTy)(intptr_t, CodeGenFunction &, PrePostActionTy &);
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CodeGenTy Callback;
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  mutable PrePostActionTy *PrePostAction;
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  RegionCodeGenTy() = delete;
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  RegionCodeGenTy &operator=(const RegionCodeGenTy &) = delete;
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <typename Callable>
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static void CallbackFn(intptr_t CodeGen, CodeGenFunction &CGF,
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         PrePostActionTy &Action) {
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return (*reinterpret_cast<Callable *>(CodeGen))(CGF, Action);
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <typename Callable>
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  RegionCodeGenTy(
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Callable &&CodeGen,
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      typename std::enable_if<
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          !std::is_same<typename std::remove_reference<Callable>::type,
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        RegionCodeGenTy>::value>::type * = nullptr)
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : CodeGen(reinterpret_cast<intptr_t>(&CodeGen)),
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Callback(CallbackFn<typename std::remove_reference<Callable>::type>),
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        PrePostAction(nullptr) {}
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setAction(PrePostActionTy &Action) const { PrePostAction = &Action; }
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void operator()(CodeGenFunction &CGF) const;
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct OMPTaskDataTy final {
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<const Expr *, 4> PrivateVars;
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<const Expr *, 4> PrivateCopies;
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<const Expr *, 4> FirstprivateVars;
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<const Expr *, 4> FirstprivateCopies;
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<const Expr *, 4> FirstprivateInits;
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<const Expr *, 4> LastprivateVars;
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<const Expr *, 4> LastprivateCopies;
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<std::pair<OpenMPDependClauseKind, const Expr *>, 4> Dependences;
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::PointerIntPair<llvm::Value *, 1, bool> Final;
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::PointerIntPair<llvm::Value *, 1, bool> Schedule;
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::PointerIntPair<llvm::Value *, 1, bool> Priority;
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned NumberOfParts = 0;
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool Tied = true;
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool Nogroup = false;
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CGOpenMPRuntime {
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprotected:
1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  CodeGenModule &CGM;
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates offloading entry for the provided entry ID \a ID,
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// address \a Addr and size \a Size.
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void createOffloadEntry(llvm::Constant *ID, llvm::Constant *Addr,
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  uint64_t Size);
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Helper to emit outlined function for 'target' directive.
1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param D Directive to emit.
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ParentName Name of the function that encloses the target region.
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param OutlinedFn Outlined function value to be defined by this call.
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param OutlinedFnID Outlined function ID value to be defined by this call.
1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param IsOffloadEntry True if the outlined function is an offload entry.
1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param CodeGen Lambda codegen specific to an accelerator device.
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// An oulined function may not be an entry if, e.g. the if clause always
1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// evaluates to false.
1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitTargetOutlinedFunctionHelper(const OMPExecutableDirective &D,
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                StringRef ParentName,
1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                llvm::Function *&OutlinedFn,
1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                llvm::Constant *&OutlinedFnID,
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                bool IsOffloadEntry,
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                const RegionCodeGenTy &CodeGen);
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprivate:
1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Default const ident_t object used for initialization of all other
1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// ident_t objects.
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::Constant *DefaultOpenMPPSource = nullptr;
137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Map of flags and corresponding default locations.
1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDefaultLocMapTy;
1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OpenMPDefaultLocMapTy OpenMPDefaultLocMap;
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Address getOrCreateDefaultLocation(unsigned Flags);
14187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::StructType *IdentTy = nullptr;
143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Map for SourceLocation and OpenMP runtime library debug locations.
144c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDebugLocMapTy;
145c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OpenMPDebugLocMapTy OpenMPDebugLocMap;
1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief The type for a microtask which gets passed to __kmpc_fork_call().
1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// Original representation is:
1486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// typedef void (kmpc_micro)(kmp_int32 global_tid, kmp_int32 bound_tid,...);
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::FunctionType *Kmpc_MicroTy = nullptr;
150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Stores debug location and ThreadID for the function.
151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct DebugLocThreadIdTy {
152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    llvm::Value *DebugLoc;
153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    llvm::Value *ThreadID;
154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Map of local debug location, ThreadId and functions.
156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef llvm::DenseMap<llvm::Function *, DebugLocThreadIdTy>
157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OpenMPLocThreadIDMapTy;
158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OpenMPLocThreadIDMapTy OpenMPLocThreadIDMap;
1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Map of UDRs and corresponding combiner/initializer.
1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef llvm::DenseMap<const OMPDeclareReductionDecl *,
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         std::pair<llvm::Function *, llvm::Function *>>
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      UDRMapTy;
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  UDRMapTy UDRMap;
1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Map of functions and locally defined UDRs.
1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef llvm::DenseMap<llvm::Function *,
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         SmallVector<const OMPDeclareReductionDecl *, 4>>
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      FunctionUDRMapTy;
1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FunctionUDRMapTy FunctionUDRMap;
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  IdentifierInfo *In = nullptr;
1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  IdentifierInfo *Out = nullptr;
1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  IdentifierInfo *Priv = nullptr;
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  IdentifierInfo *Orig = nullptr;
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Type kmp_critical_name, originally defined as typedef kmp_int32
174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// kmp_critical_name[8];
175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  llvm::ArrayType *KmpCriticalNameTy;
176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief An ordered map of auto-generated variables to their unique names.
177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// It stores variables with the following names: 1) ".gomp_critical_user_" +
178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// <critical_section_name> + ".var" for "omp critical" directives; 2)
179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// <mangled_name_for_global_var> + ".cache." for cache for threadprivate
180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// variables.
181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  llvm::StringMap<llvm::AssertingVH<llvm::Constant>, llvm::BumpPtrAllocator>
182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      InternalVars;
1833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Type typedef kmp_int32 (* kmp_routine_entry_t)(kmp_int32, void *);
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::Type *KmpRoutineEntryPtrTy = nullptr;
1853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  QualType KmpRoutineEntryPtrQTy;
186b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \brief Type typedef struct kmp_task {
187b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///    void *              shareds; /**< pointer to block of pointers to
188b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///    shared vars   */
189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///    kmp_routine_entry_t routine; /**< pointer to routine to call for
190b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///    executing task */
191b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///    kmp_int32           part_id; /**< part id for the task */
192b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///    kmp_routine_entry_t destructors; /* pointer to function to invoke
193b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///    deconstructors of firstprivate C++ objects */
194b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// } kmp_task_t;
195b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  QualType KmpTaskTQTy;
19687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Type typedef struct kmp_depend_info {
19787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///    kmp_intptr_t               base_addr;
19887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///    size_t                     len;
19987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///    struct {
20087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///             bool                   in:1;
20187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///             bool                   out:1;
20287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///    } flags;
20387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// } kmp_depend_info_t;
20487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  QualType KmpDependInfoTy;
2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// struct kmp_dim {  // loop bounds info casted to kmp_int64
2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///  kmp_int64 lo; // lower
2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///  kmp_int64 up; // upper
2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///  kmp_int64 st; // stride
2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// };
2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualType KmpDimTy;
2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Type struct __tgt_offload_entry{
2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   void      *addr;       // Pointer to the offload entry info.
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///                          // (function or global)
2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   char      *name;       // Name of the function or global.
2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   size_t     size;       // Size of the entry info (0 if it a function).
2164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// };
2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualType TgtOffloadEntryQTy;
2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// struct __tgt_device_image{
2194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// void   *ImageStart;       // Pointer to the target code start.
2204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// void   *ImageEnd;         // Pointer to the target code end.
2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// // We also add the host entries to the device image, as it may be useful
2224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// // for the target runtime to have access to that information.
2234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// __tgt_offload_entry  *EntriesBegin;   // Begin of the table with all
2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///                                       // the entries.
2254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// __tgt_offload_entry  *EntriesEnd;     // End of the table with all the
2264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///                                       // entries (non inclusive).
2274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// };
2284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualType TgtDeviceImageQTy;
2294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// struct __tgt_bin_desc{
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   int32_t              NumDevices;      // Number of devices supported.
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   __tgt_device_image   *DeviceImages;   // Arrays of device images
2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///                                         // (one per device).
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   __tgt_offload_entry  *EntriesBegin;   // Begin of the table with all the
2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///                                         // entries.
2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   __tgt_offload_entry  *EntriesEnd;     // End of the table with all the
2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///                                         // entries (non inclusive).
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// };
2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualType TgtBinaryDescriptorQTy;
2394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Entity that registers the offloading constants that were emitted so
2404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// far.
2414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class OffloadEntriesInfoManagerTy {
2424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    CodeGenModule &CGM;
2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Number of entries registered so far.
2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    unsigned OffloadingEntriesNum;
2464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  public:
2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Base class of the entries info.
2494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    class OffloadEntryInfo {
2504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    public:
2514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      /// \brief Kind of a given entry. Currently, only target regions are
2524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      /// supported.
2534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      enum OffloadingEntryInfoKinds : unsigned {
2544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // Entry is a target region.
2554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OFFLOAD_ENTRY_INFO_TARGET_REGION = 0,
2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // Invalid entry info.
2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OFFLOAD_ENTRY_INFO_INVALID = ~0u
2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      };
2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      OffloadEntryInfo() : Order(~0u), Kind(OFFLOAD_ENTRY_INFO_INVALID) {}
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      explicit OffloadEntryInfo(OffloadingEntryInfoKinds Kind, unsigned Order)
2624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          : Order(Order), Kind(Kind) {}
2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      bool isValid() const { return Order != ~0u; }
2654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      unsigned getOrder() const { return Order; }
2664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      OffloadingEntryInfoKinds getKind() const { return Kind; }
2674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      static bool classof(const OffloadEntryInfo *Info) { return true; }
2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    protected:
2704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // \brief Order this entry was emitted.
2714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      unsigned Order;
2724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      OffloadingEntryInfoKinds Kind;
2744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    };
2754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Return true if a there are no entries defined.
2774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool empty() const;
2784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Return number of entries defined so far.
2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    unsigned size() const { return OffloadingEntriesNum; }
2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OffloadEntriesInfoManagerTy(CodeGenModule &CGM)
2814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        : CGM(CGM), OffloadingEntriesNum(0) {}
2824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ///
2844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// Target region entries related.
2854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ///
2864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Target region entries info.
2874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    class OffloadEntryInfoTargetRegion : public OffloadEntryInfo {
2884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // \brief Address of the entity that has to be mapped for offloading.
2894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::Constant *Addr;
2904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // \brief Address that can be used as the ID of the entry.
2914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::Constant *ID;
2924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    public:
2944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      OffloadEntryInfoTargetRegion()
2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          : OffloadEntryInfo(OFFLOAD_ENTRY_INFO_TARGET_REGION, ~0u),
2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            Addr(nullptr), ID(nullptr) {}
2974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      explicit OffloadEntryInfoTargetRegion(unsigned Order,
2984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                            llvm::Constant *Addr,
2994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                            llvm::Constant *ID)
3004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          : OffloadEntryInfo(OFFLOAD_ENTRY_INFO_TARGET_REGION, Order),
3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            Addr(Addr), ID(ID) {}
3024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::Constant *getAddress() const { return Addr; }
3044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::Constant *getID() const { return ID; }
3054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      void setAddress(llvm::Constant *V) {
3064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        assert(!Addr && "Address as been set before!");
3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Addr = V;
3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      void setID(llvm::Constant *V) {
3104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        assert(!ID && "ID as been set before!");
3114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ID = V;
3124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      static bool classof(const OffloadEntryInfo *Info) {
3144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return Info->getKind() == OFFLOAD_ENTRY_INFO_TARGET_REGION;
3154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
3164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    };
3174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Initialize target region entry.
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void initializeTargetRegionEntryInfo(unsigned DeviceID, unsigned FileID,
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                         StringRef ParentName, unsigned LineNum,
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                         unsigned Order);
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Register target region entry.
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void registerTargetRegionEntryInfo(unsigned DeviceID, unsigned FileID,
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       StringRef ParentName, unsigned LineNum,
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       llvm::Constant *Addr,
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       llvm::Constant *ID);
3264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Return true if a target region entry with the provided
3274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// information exists.
3284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool hasTargetRegionEntryInfo(unsigned DeviceID, unsigned FileID,
3294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  StringRef ParentName, unsigned LineNum) const;
3304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// brief Applies action \a Action on all registered entries.
3314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    typedef llvm::function_ref<void(unsigned, unsigned, StringRef, unsigned,
3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    OffloadEntryInfoTargetRegion &)>
3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OffloadTargetRegionEntryInfoActTy;
3344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void actOnTargetRegionEntriesInfo(
3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        const OffloadTargetRegionEntryInfoActTy &Action);
3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  private:
3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Storage for target region entries kind. The storage is to be indexed by
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // file ID, device ID, parent function name and line number.
3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    typedef llvm::DenseMap<unsigned, OffloadEntryInfoTargetRegion>
3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OffloadEntriesTargetRegionPerLine;
3424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    typedef llvm::StringMap<OffloadEntriesTargetRegionPerLine>
3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OffloadEntriesTargetRegionPerParentName;
3444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    typedef llvm::DenseMap<unsigned, OffloadEntriesTargetRegionPerParentName>
3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OffloadEntriesTargetRegionPerFile;
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    typedef llvm::DenseMap<unsigned, OffloadEntriesTargetRegionPerFile>
3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OffloadEntriesTargetRegionPerDevice;
3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    typedef OffloadEntriesTargetRegionPerDevice OffloadEntriesTargetRegionTy;
3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OffloadEntriesTargetRegionTy OffloadEntriesTargetRegion;
3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OffloadEntriesInfoManagerTy OffloadEntriesInfoManager;
3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates and registers offloading binary descriptor for the current
3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// compilation unit. The function that does the registration is returned.
3554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::Function *createOffloadingBinaryDescriptorRegistration();
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates all the offload entries in the current compilation unit
3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// along with the associated metadata.
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void createOffloadEntriesAndInfoMetadata();
36087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Loads all the offload entries information from the host IR
3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// metadata.
3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void loadOffloadInfoMetadata();
3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Returns __tgt_offload_entry type.
3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualType getTgtOffloadEntryQTy();
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Returns __tgt_device_image type.
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualType getTgtDeviceImageQTy();
3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Returns __tgt_bin_desc type.
3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualType getTgtBinaryDescriptorQTy();
3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Start scanning from statement \a S and and emit all target regions
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// found along the way.
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param S Starting statement.
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ParentName Name of the function declaration that is being scanned.
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void scanForTargetRegionsFunctions(const Stmt *S, StringRef ParentName);
3793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
3803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Build type kmp_routine_entry_t (if not built yet).
3813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void emitKmpRoutineEntryT(QualType KmpInt32Ty);
3826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Emits object of ident_t type with info for source location.
3846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param Flags Flags for OpenMP location.
3856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
3860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  llvm::Value *emitUpdateLocation(CodeGenFunction &CGF, SourceLocation Loc,
3874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  unsigned Flags = 0);
3886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
389176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Returns pointer to ident_t type.
3906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  llvm::Type *getIdentTyPointerTy();
3916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
392176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Returns pointer to kmpc_micro type.
3936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  llvm::Type *getKmpc_MicroPointerTy();
3946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Returns specified OpenMP runtime function.
3966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param Function OpenMP runtime function.
3976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \return Specified function.
3984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::Constant *createRuntimeFunction(unsigned Function);
399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
4003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Returns __kmpc_for_static_init_* runtime function for the specified
4013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// size \a IVSize and sign \a IVSigned.
4023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  llvm::Constant *createForStaticInitFunction(unsigned IVSize, bool IVSigned);
4033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
4043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Returns __kmpc_dispatch_init_* runtime function for the specified
4053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// size \a IVSize and sign \a IVSigned.
4063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  llvm::Constant *createDispatchInitFunction(unsigned IVSize, bool IVSigned);
4073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
4083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Returns __kmpc_dispatch_next_* runtime function for the specified
4093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// size \a IVSize and sign \a IVSigned.
4103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  llvm::Constant *createDispatchNextFunction(unsigned IVSize, bool IVSigned);
4113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
412b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \brief Returns __kmpc_dispatch_fini_* runtime function for the specified
413b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// size \a IVSize and sign \a IVSigned.
414b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  llvm::Constant *createDispatchFiniFunction(unsigned IVSize, bool IVSigned);
415b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
416176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief If the specified mangled name is not in the module, create and
417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// return threadprivate cache object. This object is a pointer's worth of
418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// storage that's reserved for use by the OpenMP runtime.
419176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VD Threadprivate variable.
420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \return Cache variable for the specified threadprivate.
421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  llvm::Constant *getOrCreateThreadPrivateCache(const VarDecl *VD);
422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Emits address of the word in a memory where current thread id is
424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// stored.
42587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual Address emitThreadIDAddress(CodeGenFunction &CGF, SourceLocation Loc);
426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
427176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Gets thread id value for the current thread.
428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
4290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  llvm::Value *getThreadID(CodeGenFunction &CGF, SourceLocation Loc);
430176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Gets (if variable with the given name already exist) or creates
432176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// internal global variable with the specified Name. The created variable has
433176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// linkage CommonLinkage by default and is initialized by null value.
434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Ty Type of the global variable. If it is exist already the type
435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// must be the same.
436176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Name Name of the variable.
4370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  llvm::Constant *getOrCreateInternalVariable(llvm::Type *Ty,
438176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                              const llvm::Twine &Name);
439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Set of threadprivate variables with the generated initializer.
4414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::SmallPtrSet<const VarDecl *, 4> ThreadPrivateWithDefinition;
442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Emits initialization code for the threadprivate variables.
444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VDAddr Address of the global variable \a VD.
445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Ctor Pointer to a global init function for \a VD.
446176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param CopyCtor Pointer to a global copy function for \a VD.
447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Dtor Pointer to a global destructor function for \a VD.
448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Loc Location of threadprivate declaration.
44987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void emitThreadPrivateVarInit(CodeGenFunction &CGF, Address VDAddr,
4500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                llvm::Value *Ctor, llvm::Value *CopyCtor,
4510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                llvm::Value *Dtor, SourceLocation Loc);
4520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
4530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Returns corresponding lock object for the specified critical region
4540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// name. If the lock object does not exist it is created, otherwise the
4550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// reference to the existing copy is returned.
4560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param CriticalName Name of the critical region.
4570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ///
4580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  llvm::Value *getCriticalRegionLock(StringRef CriticalName);
459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
4604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  struct TaskResultTy {
4614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::Value *NewTask = nullptr;
4624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::Value *TaskEntry = nullptr;
4634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::Value *NewTaskNewTaskTTy = nullptr;
4644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    LValue TDBase;
4654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    RecordDecl *KmpTaskTQTyRD = nullptr;
4664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::Value *TaskDupFn = nullptr;
4674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
4684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Emit task region for the task directive. The task region is emitted in
4694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// several steps:
4704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
4714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
4724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
4734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// function:
4744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
4754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   TaskFunction(gtid, tt->part_id, tt->shareds);
4764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   return 0;
4774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// }
4784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// 2. Copy a list of shared variables to field shareds of the resulting
4794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// structure kmp_task_t returned by the previous call (if any).
4804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// 3. Copy a pointer to destructions function to field destructions of the
4814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// resulting structure kmp_task_t.
4824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param D Current task directive.
4834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
4844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// /*part_id*/, captured_struct */*__context*/);
4854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param SharedsTy A type which contains references the shared variables.
4864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Shareds Context with the list of shared variables from the \p
4874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// TaskFunction.
4884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Data Additional data for task generation like tiednsee, final
4894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// state, list of privates etc.
4904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TaskResultTy emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc,
4914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            const OMPExecutableDirective &D,
4924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            llvm::Value *TaskFunction, QualType SharedsTy,
4934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            Address Shareds, const OMPTaskDataTy &Data);
4944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
495176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
496176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  explicit CGOpenMPRuntime(CodeGenModule &CGM);
497176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  virtual ~CGOpenMPRuntime() {}
4983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  virtual void clear();
499176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
5004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Emit code for the specified user defined reduction construct.
5014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitUserDefinedReduction(CodeGenFunction *CGF,
5024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                        const OMPDeclareReductionDecl *D);
5034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Get combiner/initializer for the specified user-defined reduction, if any.
5044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual std::pair<llvm::Function *, llvm::Function *>
5054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  getUserDefinedReduction(const OMPDeclareReductionDecl *D);
50658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Emits outlined function for the specified OpenMP parallel directive
50758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
50858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// kmp_int32 BoundID, struct context_vars*).
509176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param D OpenMP directive.
510176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
51187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param InnermostKind Kind of innermost directive (for simple directives it
51287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// is a directive itself, for combined - its innermost directive).
51358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param CodeGen Code generation sequence for the \a D directive.
5144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual llvm::Value *emitParallelOrTeamsOutlinedFunction(
51587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
51687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen);
517176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
5183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Emits outlined function for the OpenMP task directive \a D. This
5194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// outlined function has type void(*)(kmp_int32 ThreadID, struct task_t*
5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// TaskT).
5213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param D OpenMP directive.
5223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
5234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param PartIDVar Variable for partition id in the current OpenMP untied
5244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// task region.
5254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param TaskTVar Variable for task_t argument.
52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param InnermostKind Kind of innermost directive (for simple directives it
52787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// is a directive itself, for combined - its innermost directive).
52858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param CodeGen Code generation sequence for the \a D directive.
5294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Tied true if task is generated for tied task, false otherwise.
5304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumberOfParts Number of parts in untied task. Ignored for tied
5314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// tasks.
5323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///
53387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual llvm::Value *emitTaskOutlinedFunction(
53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
5354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const VarDecl *PartIDVar, const VarDecl *TaskTVar,
5364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen,
5374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      bool Tied, unsigned &NumberOfParts);
5383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
539176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Cleans up references to the objects in finished function.
540176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
5410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  void functionFinished(CodeGenFunction &CGF);
542176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
543b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \brief Emits code for parallel or serial call of the \a OutlinedFn with
544b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// variables captured in a record which address is stored in \a
545b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// CapturedStruct.
546176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param OutlinedFn Outlined function to be run in parallel threads. Type of
5473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
54887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param CapturedVars A pointer to the record with the references to
549176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// variables used in \a OutlinedFn function.
550b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param IfCond Condition in the associated 'if' clause, if it was
551b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// specified, nullptr otherwise.
552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
5530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
5540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                llvm::Value *OutlinedFn,
55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                ArrayRef<llvm::Value *> CapturedVars,
556b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                const Expr *IfCond);
557176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
5580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Emits a critical region.
559176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param CriticalName Name of the critical region.
5600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param CriticalOpGen Generator for the statement associated with the given
5610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// critical region.
56287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Hint Value of the 'hint' clause (optional).
5630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual void emitCriticalRegion(CodeGenFunction &CGF, StringRef CriticalName,
56458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                  const RegionCodeGenTy &CriticalOpGen,
56587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  SourceLocation Loc,
56687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  const Expr *Hint = nullptr);
5670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
5680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Emits a master region.
5690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param MasterOpGen Generator for the statement associated with the given
5700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// master region.
5710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual void emitMasterRegion(CodeGenFunction &CGF,
57258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                const RegionCodeGenTy &MasterOpGen,
5730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                SourceLocation Loc);
5740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
5750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Emits code for a taskyield directive.
5760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual void emitTaskyieldCall(CodeGenFunction &CGF, SourceLocation Loc);
5770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
57887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Emit a taskgroup region.
57987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param TaskgroupOpGen Generator for the statement associated with the
58087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// given taskgroup region.
58187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual void emitTaskgroupRegion(CodeGenFunction &CGF,
58287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                   const RegionCodeGenTy &TaskgroupOpGen,
58387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                   SourceLocation Loc);
58487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Emits a single region.
5860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param SingleOpGen Generator for the statement associated with the given
5870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// single region.
5880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual void emitSingleRegion(CodeGenFunction &CGF,
58958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                const RegionCodeGenTy &SingleOpGen,
5903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                                SourceLocation Loc,
5913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                                ArrayRef<const Expr *> CopyprivateVars,
59258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                ArrayRef<const Expr *> DestExprs,
5933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                                ArrayRef<const Expr *> SrcExprs,
5943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                                ArrayRef<const Expr *> AssignmentOps);
5950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
596b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \brief Emit an ordered region.
597b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param OrderedOpGen Generator for the statement associated with the given
59887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// ordered region.
599b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  virtual void emitOrderedRegion(CodeGenFunction &CGF,
600b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                 const RegionCodeGenTy &OrderedOpGen,
60187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 SourceLocation Loc, bool IsThreads);
602b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
60358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Emit an implicit/explicit barrier for OpenMP threads.
60458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param Kind Directive for which this implicit barrier call must be
60558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// generated. Must be OMPD_barrier for explicit barrier generation.
60687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EmitChecks true if need to emit checks for cancellation barriers.
60787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param ForceSimpleCall true simple barrier call must be emitted, false if
60887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// runtime class decides which one to emit (simple or with cancellation
60987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// checks).
6100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ///
6110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual void emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
61287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                               OpenMPDirectiveKind Kind,
61387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                               bool EmitChecks = true,
61487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                               bool ForceSimpleCall = false);
6150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
6160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Check if the specified \a ScheduleKind is static non-chunked.
6170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// This kind of worksharing directive is emitted without outer loop.
6180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param ScheduleKind Schedule kind specified in the 'schedule' clause.
6190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param Chunked True if chunk is specified in the clause.
6200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ///
6210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual bool isStaticNonchunked(OpenMPScheduleClauseKind ScheduleKind,
6220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                  bool Chunked) const;
6230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
6244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Check if the specified \a ScheduleKind is static non-chunked.
6254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// This kind of distribute directive is emitted without outer loop.
6264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ScheduleKind Schedule kind specified in the 'dist_schedule' clause.
6274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Chunked True if chunk is specified in the clause.
6284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
6294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual bool isStaticNonchunked(OpenMPDistScheduleClauseKind ScheduleKind,
6304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  bool Chunked) const;
6314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Check if the specified \a ScheduleKind is dynamic.
6330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// This kind of worksharing directive is emitted without outer loop.
6340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param ScheduleKind Schedule Kind specified in the 'schedule' clause.
6350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ///
6360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual bool isDynamic(OpenMPScheduleClauseKind ScheduleKind) const;
6370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
63887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual void emitForDispatchInit(CodeGenFunction &CGF, SourceLocation Loc,
6394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   const OpenMPScheduleTy &ScheduleKind,
6404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   unsigned IVSize, bool IVSigned, bool Ordered,
6414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   llvm::Value *UB,
64287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                   llvm::Value *Chunk = nullptr);
64387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Call the appropriate runtime routine to initialize it before start
6450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// of loop.
6460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ///
6470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// Depending on the loop schedule, it is nesessary to call some runtime
6480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// routine before start of the OpenMP loop to get the loop upper / lower
6490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// bounds \a LB and \a UB and stride \a ST.
6500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ///
6510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param CGF Reference to current CodeGenFunction.
6520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param Loc Clang source location.
6534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
6540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param IVSize Size of the iteration variable in bits.
6550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param IVSigned Sign of the interation variable.
656b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param Ordered true if loop is ordered, false otherwise.
6570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param IL Address of the output variable in which the flag of the
6580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// last iteration is returned.
6590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param LB Address of the output variable in which the lower iteration
6600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// number is returned.
6610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param UB Address of the output variable in which the upper iteration
6620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// number is returned.
6630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param ST Address of the output variable in which the stride value is
6640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// returned nesessary to generated the static_chunked scheduled loop.
6650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param Chunk Value of the chunk for the static_chunked scheduled loop.
6660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// For the default (nullptr) value, the chunk 1 will be used.
6670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ///
66887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual void emitForStaticInit(CodeGenFunction &CGF, SourceLocation Loc,
6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 const OpenMPScheduleTy &ScheduleKind,
67087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 unsigned IVSize, bool IVSigned, bool Ordered,
6714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 Address IL, Address LB, Address UB, Address ST,
67287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 llvm::Value *Chunk = nullptr);
6730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
6754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param CGF Reference to current CodeGenFunction.
6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Loc Clang source location.
6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param SchedKind Schedule kind, specified by the 'dist_schedule' clause.
6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param IVSize Size of the iteration variable in bits.
6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param IVSigned Sign of the interation variable.
6804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Ordered true if loop is ordered, false otherwise.
6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param IL Address of the output variable in which the flag of the
6824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// last iteration is returned.
6834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param LB Address of the output variable in which the lower iteration
6844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// number is returned.
6854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param UB Address of the output variable in which the upper iteration
6864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// number is returned.
6874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ST Address of the output variable in which the stride value is
6884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// returned nesessary to generated the static_chunked scheduled loop.
6894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Chunk Value of the chunk for the static_chunked scheduled loop.
6904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// For the default (nullptr) value, the chunk 1 will be used.
6914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
6924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitDistributeStaticInit(CodeGenFunction &CGF, SourceLocation Loc,
6934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                        OpenMPDistScheduleClauseKind SchedKind,
6944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                        unsigned IVSize, bool IVSigned,
6954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                        bool Ordered, Address IL, Address LB,
6964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                        Address UB, Address ST,
6974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                        llvm::Value *Chunk = nullptr);
6984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief Call the appropriate runtime routine to notify that we finished
700b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// iteration of the ordered loop with the dynamic scheduling.
701b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///
702b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param CGF Reference to current CodeGenFunction.
703b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param Loc Clang source location.
704b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param IVSize Size of the iteration variable in bits.
705b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param IVSigned Sign of the interation variable.
706b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///
707b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  virtual void emitForOrderedIterationEnd(CodeGenFunction &CGF,
708b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                          SourceLocation Loc, unsigned IVSize,
709b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                          bool IVSigned);
710b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
711b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \brief Call the appropriate runtime routine to notify that we finished
7120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// all the work with current loop.
713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
7140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param CGF Reference to current CodeGenFunction.
7150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \param Loc Clang source location.
716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
717b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  virtual void emitForStaticFinish(CodeGenFunction &CGF, SourceLocation Loc);
718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
7193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// Call __kmpc_dispatch_next(
7203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///          ident_t *loc, kmp_int32 tid, kmp_int32 *p_lastiter,
7213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///          kmp_int[32|64] *p_lower, kmp_int[32|64] *p_upper,
7223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///          kmp_int[32|64] *p_stride);
7233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param IVSize Size of the iteration variable in bits.
7243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param IVSigned Sign of the interation variable.
7253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param IL Address of the output variable in which the flag of the
7263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// last iteration is returned.
7273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param LB Address of the output variable in which the lower iteration
7283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// number is returned.
7293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param UB Address of the output variable in which the upper iteration
7303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// number is returned.
7313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param ST Address of the output variable in which the stride value is
7323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// returned.
7333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  virtual llvm::Value *emitForNext(CodeGenFunction &CGF, SourceLocation Loc,
7343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                                   unsigned IVSize, bool IVSigned,
73587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                   Address IL, Address LB,
73687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                   Address UB, Address ST);
7373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
738176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32
739176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads'
740176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// clause.
741176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param NumThreads An integer value of threads.
7420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual void emitNumThreadsClause(CodeGenFunction &CGF,
7430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                    llvm::Value *NumThreads,
7440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                    SourceLocation Loc);
745176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
74687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Emit call to void __kmpc_push_proc_bind(ident_t *loc, kmp_int32
74787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// global_tid, int proc_bind) to generate code for 'proc_bind' clause.
74887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual void emitProcBindClause(CodeGenFunction &CGF,
74987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  OpenMPProcBindClauseKind ProcBind,
75087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  SourceLocation Loc);
75187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Returns address of the threadprivate variable for the current
753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// thread.
754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VD Threadprivate variable.
755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VDAddr Address of the global variable \a VD.
756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Loc Location of the reference to threadprivate var.
757176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \return Address of the threadprivate variable for the current thread.
75887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual Address getAddrOfThreadPrivate(CodeGenFunction &CGF,
75987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         const VarDecl *VD,
76087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         Address VDAddr,
76187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         SourceLocation Loc);
762176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
763176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Emit a code for initialization of threadprivate variable. It emits
764176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// a call to runtime library which adds initial value to the newly created
765176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// threadprivate variable (if it is not constant) and registers destructor
766176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// for the variable (if any).
767176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VD Threadprivate variable.
768176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VDAddr Address of the global variable \a VD.
769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Loc Location of threadprivate declaration.
770176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param PerformInit true if initialization expression is not constant.
771176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  virtual llvm::Function *
77287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  emitThreadPrivateVarDefinition(const VarDecl *VD, Address VDAddr,
7730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                 SourceLocation Loc, bool PerformInit,
7740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                 CodeGenFunction *CGF = nullptr);
775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
776176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Emit flush of the variables specified in 'omp flush' directive.
777176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Vars List of variables to flush.
7780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  virtual void emitFlush(CodeGenFunction &CGF, ArrayRef<const Expr *> Vars,
7790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                         SourceLocation Loc);
7803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
7813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Emit task region for the task directive. The task region is
782b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// emitted in several steps:
7833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
7843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
7853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
7863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// function:
7873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
7883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///   TaskFunction(gtid, tt->part_id, tt->shareds);
7893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///   return 0;
7903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// }
7913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// 2. Copy a list of shared variables to field shareds of the resulting
7923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// structure kmp_task_t returned by the previous call (if any).
7933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// 3. Copy a pointer to destructions function to field destructions of the
7943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// resulting structure kmp_task_t.
7953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// 4. Emit a call to kmp_int32 __kmpc_omp_task(ident_t *, kmp_int32 gtid,
7963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// kmp_task_t *new_task), where new_task is a resulting structure from
7973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// previous items.
798b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param D Current task directive.
7993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
8003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// /*part_id*/, captured_struct */*__context*/);
8013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param SharedsTy A type which contains references the shared variables.
80287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Shareds Context with the list of shared variables from the \p
8033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// TaskFunction.
804b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
805b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// otherwise.
8064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Data Additional data for task generation like tiednsee, final
8074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// state, list of privates etc.
8084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitTaskCall(CodeGenFunction &CGF, SourceLocation Loc,
8094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            const OMPExecutableDirective &D,
8104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            llvm::Value *TaskFunction, QualType SharedsTy,
8114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            Address Shareds, const Expr *IfCond,
8124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            const OMPTaskDataTy &Data);
8134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Emit task region for the taskloop directive. The taskloop region is
8154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// emitted in several steps:
8164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
8174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
8184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
8194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// function:
8204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
8214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   TaskFunction(gtid, tt->part_id, tt->shareds);
8224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///   return 0;
8234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// }
8244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// 2. Copy a list of shared variables to field shareds of the resulting
8254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// structure kmp_task_t returned by the previous call (if any).
8264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// 3. Copy a pointer to destructions function to field destructions of the
8274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// resulting structure kmp_task_t.
8284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// 4. Emit a call to void __kmpc_taskloop(ident_t *loc, int gtid, kmp_task_t
8294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// *task, int if_val, kmp_uint64 *lb, kmp_uint64 *ub, kmp_int64 st, int
8304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// nogroup, int sched, kmp_uint64 grainsize, void *task_dup ), where new_task
8314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// is a resulting structure from
8324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// previous items.
8334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param D Current task directive.
8344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
8354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// /*part_id*/, captured_struct */*__context*/);
8364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param SharedsTy A type which contains references the shared variables.
8374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Shareds Context with the list of shared variables from the \p
8384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// TaskFunction.
8394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
8404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// otherwise.
8414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Data Additional data for task generation like tiednsee, final
8424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// state, list of privates etc.
8434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitTaskLoopCall(
8444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      CodeGenFunction &CGF, SourceLocation Loc, const OMPLoopDirective &D,
84587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      llvm::Value *TaskFunction, QualType SharedsTy, Address Shareds,
8464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const Expr *IfCond, const OMPTaskDataTy &Data);
8470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
84858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Emit code for the directive that does not require outlining.
84958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///
85087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param InnermostKind Kind of innermost directive (for simple directives it
85187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// is a directive itself, for combined - its innermost directive).
85258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param CodeGen Code generation sequence for the \a D directive.
85387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param HasCancel true if region has inner cancel directive, false
85487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// otherwise.
85558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  virtual void emitInlinedDirective(CodeGenFunction &CGF,
85687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                    OpenMPDirectiveKind InnermostKind,
85787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                    const RegionCodeGenTy &CodeGen,
85887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                    bool HasCancel = false);
85958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Emit a code for reduction clause. Next code should be emitted for
86058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// reduction:
86158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \code
86258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///
86358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// static kmp_critical_name lock = { 0 };
86458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///
86558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
86658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  ...
86758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  *(Type<i>*)lhs[i] = RedOp<i>(*(Type<i>*)lhs[i], *(Type<i>*)rhs[i]);
86858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  ...
86958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// }
87058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///
87158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// ...
87258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// void *RedList[<n>] = {&<RHSExprs>[0], ..., &<RHSExprs>[<n>-1]};
87358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// switch (__kmpc_reduce{_nowait}(<loc>, <gtid>, <n>, sizeof(RedList),
87458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// RedList, reduce_func, &<lock>)) {
87558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// case 1:
87658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  ...
87758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  <LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]);
87858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  ...
87958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// __kmpc_end_reduce{_nowait}(<loc>, <gtid>, &<lock>);
88058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// break;
88158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// case 2:
88258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  ...
88358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  Atomic(<LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]));
88458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///  ...
88558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// break;
88658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// default:;
88758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// }
88858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \endcode
88958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///
89087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Privates List of private copies for original reduction arguments.
89158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param LHSExprs List of LHS in \a ReductionOps reduction operations.
89258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param RHSExprs List of RHS in \a ReductionOps reduction operations.
89358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param ReductionOps List of reduction operations in form 'LHS binop RHS'
89458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// or 'operator binop(LHS, RHS)'.
89558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param WithNowait true if parent directive has also nowait clause, false
89658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// otherwise.
89758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  virtual void emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
89887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                             ArrayRef<const Expr *> Privates,
89958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             ArrayRef<const Expr *> LHSExprs,
90058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             ArrayRef<const Expr *> RHSExprs,
90158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             ArrayRef<const Expr *> ReductionOps,
90287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                             bool WithNowait, bool SimpleReduction);
903b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
904b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \brief Emit code for 'taskwait' directive.
905b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  virtual void emitTaskwaitCall(CodeGenFunction &CGF, SourceLocation Loc);
90687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
90787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Emit code for 'cancellation point' construct.
90887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param CancelRegion Region kind for which the cancellation point must be
90987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// emitted.
91087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
91187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual void emitCancellationPointCall(CodeGenFunction &CGF,
91287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         SourceLocation Loc,
91387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         OpenMPDirectiveKind CancelRegion);
91487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
91587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Emit code for 'cancel' construct.
91687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param IfCond Condition in the associated 'if' clause, if it was
91787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// specified, nullptr otherwise.
91887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param CancelRegion Region kind for which the cancel must be emitted.
91987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
92087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual void emitCancelCall(CodeGenFunction &CGF, SourceLocation Loc,
92187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              const Expr *IfCond,
92287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              OpenMPDirectiveKind CancelRegion);
92387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
92487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Emit outilined function for 'target' directive.
92587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param D Directive to emit.
9264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ParentName Name of the function that encloses the target region.
9274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param OutlinedFn Outlined function value to be defined by this call.
9284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param OutlinedFnID Outlined function ID value to be defined by this call.
9294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param IsOffloadEntry True if the outlined function is an offload entry.
93087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param CodeGen Code generation sequence for the \a D directive.
9314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// An oulined function may not be an entry if, e.g. the if clause always
9324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// evaluates to false.
9334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitTargetOutlinedFunction(const OMPExecutableDirective &D,
9344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                          StringRef ParentName,
9354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                          llvm::Function *&OutlinedFn,
9364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                          llvm::Constant *&OutlinedFnID,
9374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                          bool IsOffloadEntry,
9384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                          const RegionCodeGenTy &CodeGen);
93987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
94087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Emit the target offloading code associated with \a D. The emitted
94187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// code attempts offloading the execution to the device, an the event of
94287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// a failure it executes the host version outlined in \a OutlinedFn.
94387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param D Directive to emit.
94487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param OutlinedFn Host version of the code to be offloaded.
9454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param OutlinedFnID ID of host version of the code to be offloaded.
94687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param IfCond Expression evaluated in if clause associated with the target
94787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// directive, or null if no if clause is used.
94887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Device Expression evaluated in device clause associated with the
94987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// target directive, or null if no device clause is used.
95087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param CapturedVars Values captured in the current region.
95187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual void emitTargetCall(CodeGenFunction &CGF,
95287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              const OMPExecutableDirective &D,
9534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              llvm::Value *OutlinedFn,
9544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              llvm::Value *OutlinedFnID, const Expr *IfCond,
95587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              const Expr *Device,
95687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              ArrayRef<llvm::Value *> CapturedVars);
9574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Emit the target regions enclosed in \a GD function definition or
9594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// the function itself in case it is a valid device function. Returns true if
9604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \a GD was dealt with successfully.
9614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param GD Function to scan.
9624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual bool emitTargetFunctions(GlobalDecl GD);
9634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Emit the global variable if it is a valid device global variable.
9654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Returns true if \a GD was dealt with successfully.
9664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param GD Variable declaration to emit.
9674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual bool emitTargetGlobalVariable(GlobalDecl GD);
9684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Emit the global \a GD if it is meaningful for the target. Returns
9704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// if it was emitted succesfully.
9714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param GD Global to scan.
9724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual bool emitTargetGlobal(GlobalDecl GD);
9734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates the offloading descriptor in the event any target region
9754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// was emitted in the current module and return the function that registers
9764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// it.
9774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual llvm::Function *emitRegistrationFunction();
9784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Emits code for teams call of the \a OutlinedFn with
9804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// variables captured in a record which address is stored in \a
9814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// CapturedStruct.
9824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param OutlinedFn Outlined function to be run by team masters. Type of
9834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
9844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param CapturedVars A pointer to the record with the references to
9854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// variables used in \a OutlinedFn function.
9864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
9874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitTeamsCall(CodeGenFunction &CGF,
9884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             const OMPExecutableDirective &D,
9894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             SourceLocation Loc, llvm::Value *OutlinedFn,
9904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             ArrayRef<llvm::Value *> CapturedVars);
9914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Emits call to void __kmpc_push_num_teams(ident_t *loc, kmp_int32
9934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// global_tid, kmp_int32 num_teams, kmp_int32 thread_limit) to generate code
9944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// for num_teams clause.
9954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumTeams An integer expression of teams.
9964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ThreadLimit An integer expression of threads.
9974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitNumTeamsClause(CodeGenFunction &CGF, const Expr *NumTeams,
9984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  const Expr *ThreadLimit, SourceLocation Loc);
9994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Emit the target data mapping code associated with \a D.
10014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param D Directive to emit.
10024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param IfCond Expression evaluated in if clause associated with the target
10034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// directive, or null if no if clause is used.
10044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Device Expression evaluated in device clause associated with the
10054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// target directive, or null if no device clause is used.
10064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param CodeGen Function that emits the enclosed region.
10074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitTargetDataCalls(CodeGenFunction &CGF,
10084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   const OMPExecutableDirective &D,
10094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   const Expr *IfCond, const Expr *Device,
10104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   const RegionCodeGenTy &CodeGen);
10114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Emit the data mapping/movement code associated with the directive
10134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \a D that should be of the form 'target [{enter|exit} data | update]'.
10144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param D Directive to emit.
10154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param IfCond Expression evaluated in if clause associated with the target
10164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// directive, or null if no if clause is used.
10174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Device Expression evaluated in device clause associated with the
10184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// target directive, or null if no device clause is used.
10194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitTargetDataStandAloneCall(CodeGenFunction &CGF,
10204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                            const OMPExecutableDirective &D,
10214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                            const Expr *IfCond,
10224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                            const Expr *Device);
10234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Marks function \a Fn with properly mangled versions of vector functions.
10254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param FD Function marked as 'declare simd'.
10264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Fn LLVM function that must be marked with 'declare simd'
10274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// attributes.
10284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitDeclareSimdFunction(const FunctionDecl *FD,
10294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       llvm::Function *Fn);
10304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Emit initialization for doacross loop nesting support.
10324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param D Loop-based construct used in doacross nesting construct.
10334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitDoacrossInit(CodeGenFunction &CGF,
10344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                const OMPLoopDirective &D);
10354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Emit code for doacross ordered directive with 'depend' clause.
10374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C 'depend' clause with 'sink|source' dependency kind.
10384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  virtual void emitDoacrossOrdered(CodeGenFunction &CGF,
10394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   const OMPDependClause *C);
10406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
104158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
1042c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} // namespace CodeGen
1043c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} // namespace clang
10446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
10456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
1046