]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/CodeGen/CGOpenMPRuntime.h
Vendor import of stripped clang trunk r375505, the last commit before
[FreeBSD/FreeBSD.git] / lib / CodeGen / CGOpenMPRuntime.h
1 //===----- CGOpenMPRuntime.h - Interface to OpenMP Runtimes -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This provides a class for OpenMP runtime code generation.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #ifndef LLVM_CLANG_LIB_CODEGEN_CGOPENMPRUNTIME_H
14 #define LLVM_CLANG_LIB_CODEGEN_CGOPENMPRUNTIME_H
15
16 #include "CGValue.h"
17 #include "clang/AST/DeclOpenMP.h"
18 #include "clang/AST/GlobalDecl.h"
19 #include "clang/AST/Type.h"
20 #include "clang/Basic/OpenMPKinds.h"
21 #include "clang/Basic/SourceLocation.h"
22 #include "llvm/ADT/DenseMap.h"
23 #include "llvm/ADT/StringMap.h"
24 #include "llvm/ADT/StringSet.h"
25 #include "llvm/IR/Function.h"
26 #include "llvm/IR/ValueHandle.h"
27
28 namespace llvm {
29 class ArrayType;
30 class Constant;
31 class FunctionType;
32 class GlobalVariable;
33 class StructType;
34 class Type;
35 class Value;
36 } // namespace llvm
37
38 namespace clang {
39 class Expr;
40 class OMPDependClause;
41 class OMPExecutableDirective;
42 class OMPLoopDirective;
43 class VarDecl;
44 class OMPDeclareReductionDecl;
45 class IdentifierInfo;
46
47 namespace CodeGen {
48 class Address;
49 class CodeGenFunction;
50 class CodeGenModule;
51
52 /// A basic class for pre|post-action for advanced codegen sequence for OpenMP
53 /// region.
54 class PrePostActionTy {
55 public:
56   explicit PrePostActionTy() {}
57   virtual void Enter(CodeGenFunction &CGF) {}
58   virtual void Exit(CodeGenFunction &CGF) {}
59   virtual ~PrePostActionTy() {}
60 };
61
62 /// Class provides a way to call simple version of codegen for OpenMP region, or
63 /// an advanced with possible pre|post-actions in codegen.
64 class RegionCodeGenTy final {
65   intptr_t CodeGen;
66   typedef void (*CodeGenTy)(intptr_t, CodeGenFunction &, PrePostActionTy &);
67   CodeGenTy Callback;
68   mutable PrePostActionTy *PrePostAction;
69   RegionCodeGenTy() = delete;
70   RegionCodeGenTy &operator=(const RegionCodeGenTy &) = delete;
71   template <typename Callable>
72   static void CallbackFn(intptr_t CodeGen, CodeGenFunction &CGF,
73                          PrePostActionTy &Action) {
74     return (*reinterpret_cast<Callable *>(CodeGen))(CGF, Action);
75   }
76
77 public:
78   template <typename Callable>
79   RegionCodeGenTy(
80       Callable &&CodeGen,
81       typename std::enable_if<
82           !std::is_same<typename std::remove_reference<Callable>::type,
83                         RegionCodeGenTy>::value>::type * = nullptr)
84       : CodeGen(reinterpret_cast<intptr_t>(&CodeGen)),
85         Callback(CallbackFn<typename std::remove_reference<Callable>::type>),
86         PrePostAction(nullptr) {}
87   void setAction(PrePostActionTy &Action) const { PrePostAction = &Action; }
88   void operator()(CodeGenFunction &CGF) const;
89 };
90
91 struct OMPTaskDataTy final {
92   SmallVector<const Expr *, 4> PrivateVars;
93   SmallVector<const Expr *, 4> PrivateCopies;
94   SmallVector<const Expr *, 4> FirstprivateVars;
95   SmallVector<const Expr *, 4> FirstprivateCopies;
96   SmallVector<const Expr *, 4> FirstprivateInits;
97   SmallVector<const Expr *, 4> LastprivateVars;
98   SmallVector<const Expr *, 4> LastprivateCopies;
99   SmallVector<const Expr *, 4> ReductionVars;
100   SmallVector<const Expr *, 4> ReductionCopies;
101   SmallVector<const Expr *, 4> ReductionOps;
102   SmallVector<std::pair<OpenMPDependClauseKind, const Expr *>, 4> Dependences;
103   llvm::PointerIntPair<llvm::Value *, 1, bool> Final;
104   llvm::PointerIntPair<llvm::Value *, 1, bool> Schedule;
105   llvm::PointerIntPair<llvm::Value *, 1, bool> Priority;
106   llvm::Value *Reductions = nullptr;
107   unsigned NumberOfParts = 0;
108   bool Tied = true;
109   bool Nogroup = false;
110 };
111
112 /// Class intended to support codegen of all kind of the reduction clauses.
113 class ReductionCodeGen {
114 private:
115   /// Data required for codegen of reduction clauses.
116   struct ReductionData {
117     /// Reference to the original shared item.
118     const Expr *Ref = nullptr;
119     /// Helper expression for generation of private copy.
120     const Expr *Private = nullptr;
121     /// Helper expression for generation reduction operation.
122     const Expr *ReductionOp = nullptr;
123     ReductionData(const Expr *Ref, const Expr *Private, const Expr *ReductionOp)
124         : Ref(Ref), Private(Private), ReductionOp(ReductionOp) {}
125   };
126   /// List of reduction-based clauses.
127   SmallVector<ReductionData, 4> ClausesData;
128
129   /// List of addresses of original shared variables/expressions.
130   SmallVector<std::pair<LValue, LValue>, 4> SharedAddresses;
131   /// Sizes of the reduction items in chars.
132   SmallVector<std::pair<llvm::Value *, llvm::Value *>, 4> Sizes;
133   /// Base declarations for the reduction items.
134   SmallVector<const VarDecl *, 4> BaseDecls;
135
136   /// Emits lvalue for shared expression.
137   LValue emitSharedLValue(CodeGenFunction &CGF, const Expr *E);
138   /// Emits upper bound for shared expression (if array section).
139   LValue emitSharedLValueUB(CodeGenFunction &CGF, const Expr *E);
140   /// Performs aggregate initialization.
141   /// \param N Number of reduction item in the common list.
142   /// \param PrivateAddr Address of the corresponding private item.
143   /// \param SharedLVal Address of the original shared variable.
144   /// \param DRD Declare reduction construct used for reduction item.
145   void emitAggregateInitialization(CodeGenFunction &CGF, unsigned N,
146                                    Address PrivateAddr, LValue SharedLVal,
147                                    const OMPDeclareReductionDecl *DRD);
148
149 public:
150   ReductionCodeGen(ArrayRef<const Expr *> Shareds,
151                    ArrayRef<const Expr *> Privates,
152                    ArrayRef<const Expr *> ReductionOps);
153   /// Emits lvalue for a reduction item.
154   /// \param N Number of the reduction item.
155   void emitSharedLValue(CodeGenFunction &CGF, unsigned N);
156   /// Emits the code for the variable-modified type, if required.
157   /// \param N Number of the reduction item.
158   void emitAggregateType(CodeGenFunction &CGF, unsigned N);
159   /// Emits the code for the variable-modified type, if required.
160   /// \param N Number of the reduction item.
161   /// \param Size Size of the type in chars.
162   void emitAggregateType(CodeGenFunction &CGF, unsigned N, llvm::Value *Size);
163   /// Performs initialization of the private copy for the reduction item.
164   /// \param N Number of the reduction item.
165   /// \param PrivateAddr Address of the corresponding private item.
166   /// \param DefaultInit Default initialization sequence that should be
167   /// performed if no reduction specific initialization is found.
168   /// \param SharedLVal Address of the original shared variable.
169   void
170   emitInitialization(CodeGenFunction &CGF, unsigned N, Address PrivateAddr,
171                      LValue SharedLVal,
172                      llvm::function_ref<bool(CodeGenFunction &)> DefaultInit);
173   /// Returns true if the private copy requires cleanups.
174   bool needCleanups(unsigned N);
175   /// Emits cleanup code for the reduction item.
176   /// \param N Number of the reduction item.
177   /// \param PrivateAddr Address of the corresponding private item.
178   void emitCleanups(CodeGenFunction &CGF, unsigned N, Address PrivateAddr);
179   /// Adjusts \p PrivatedAddr for using instead of the original variable
180   /// address in normal operations.
181   /// \param N Number of the reduction item.
182   /// \param PrivateAddr Address of the corresponding private item.
183   Address adjustPrivateAddress(CodeGenFunction &CGF, unsigned N,
184                                Address PrivateAddr);
185   /// Returns LValue for the reduction item.
186   LValue getSharedLValue(unsigned N) const { return SharedAddresses[N].first; }
187   /// Returns the size of the reduction item (in chars and total number of
188   /// elements in the item), or nullptr, if the size is a constant.
189   std::pair<llvm::Value *, llvm::Value *> getSizes(unsigned N) const {
190     return Sizes[N];
191   }
192   /// Returns the base declaration of the reduction item.
193   const VarDecl *getBaseDecl(unsigned N) const { return BaseDecls[N]; }
194   /// Returns the base declaration of the reduction item.
195   const Expr *getRefExpr(unsigned N) const { return ClausesData[N].Ref; }
196   /// Returns true if the initialization of the reduction item uses initializer
197   /// from declare reduction construct.
198   bool usesReductionInitializer(unsigned N) const;
199 };
200
201 class CGOpenMPRuntime {
202 public:
203   /// Allows to disable automatic handling of functions used in target regions
204   /// as those marked as `omp declare target`.
205   class DisableAutoDeclareTargetRAII {
206     CodeGenModule &CGM;
207     bool SavedShouldMarkAsGlobal;
208
209   public:
210     DisableAutoDeclareTargetRAII(CodeGenModule &CGM);
211     ~DisableAutoDeclareTargetRAII();
212   };
213
214 protected:
215   CodeGenModule &CGM;
216   StringRef FirstSeparator, Separator;
217
218   /// Constructor allowing to redefine the name separator for the variables.
219   explicit CGOpenMPRuntime(CodeGenModule &CGM, StringRef FirstSeparator,
220                            StringRef Separator);
221
222   /// Creates offloading entry for the provided entry ID \a ID,
223   /// address \a Addr, size \a Size, and flags \a Flags.
224   virtual void createOffloadEntry(llvm::Constant *ID, llvm::Constant *Addr,
225                                   uint64_t Size, int32_t Flags,
226                                   llvm::GlobalValue::LinkageTypes Linkage);
227
228   /// Helper to emit outlined function for 'target' directive.
229   /// \param D Directive to emit.
230   /// \param ParentName Name of the function that encloses the target region.
231   /// \param OutlinedFn Outlined function value to be defined by this call.
232   /// \param OutlinedFnID Outlined function ID value to be defined by this call.
233   /// \param IsOffloadEntry True if the outlined function is an offload entry.
234   /// \param CodeGen Lambda codegen specific to an accelerator device.
235   /// An outlined function may not be an entry if, e.g. the if clause always
236   /// evaluates to false.
237   virtual void emitTargetOutlinedFunctionHelper(const OMPExecutableDirective &D,
238                                                 StringRef ParentName,
239                                                 llvm::Function *&OutlinedFn,
240                                                 llvm::Constant *&OutlinedFnID,
241                                                 bool IsOffloadEntry,
242                                                 const RegionCodeGenTy &CodeGen);
243
244   /// Emits code for OpenMP 'if' clause using specified \a CodeGen
245   /// function. Here is the logic:
246   /// if (Cond) {
247   ///   ThenGen();
248   /// } else {
249   ///   ElseGen();
250   /// }
251   void emitOMPIfClause(CodeGenFunction &CGF, const Expr *Cond,
252                        const RegionCodeGenTy &ThenGen,
253                        const RegionCodeGenTy &ElseGen);
254
255   /// Emits object of ident_t type with info for source location.
256   /// \param Flags Flags for OpenMP location.
257   ///
258   llvm::Value *emitUpdateLocation(CodeGenFunction &CGF, SourceLocation Loc,
259                                   unsigned Flags = 0);
260
261   /// Returns pointer to ident_t type.
262   llvm::Type *getIdentTyPointerTy();
263
264   /// Gets thread id value for the current thread.
265   ///
266   llvm::Value *getThreadID(CodeGenFunction &CGF, SourceLocation Loc);
267
268   /// Get the function name of an outlined region.
269   //  The name can be customized depending on the target.
270   //
271   virtual StringRef getOutlinedHelperName() const { return ".omp_outlined."; }
272
273   /// Emits \p Callee function call with arguments \p Args with location \p Loc.
274   void emitCall(CodeGenFunction &CGF, SourceLocation Loc,
275                 llvm::FunctionCallee Callee,
276                 ArrayRef<llvm::Value *> Args = llvm::None) const;
277
278   /// Emits address of the word in a memory where current thread id is
279   /// stored.
280   virtual Address emitThreadIDAddress(CodeGenFunction &CGF, SourceLocation Loc);
281
282   void setLocThreadIdInsertPt(CodeGenFunction &CGF,
283                               bool AtCurrentPoint = false);
284   void clearLocThreadIdInsertPt(CodeGenFunction &CGF);
285
286   /// Check if the default location must be constant.
287   /// Default is false to support OMPT/OMPD.
288   virtual bool isDefaultLocationConstant() const { return false; }
289
290   /// Returns additional flags that can be stored in reserved_2 field of the
291   /// default location.
292   virtual unsigned getDefaultLocationReserved2Flags() const { return 0; }
293
294   /// Tries to emit declare variant function for \p OldGD from \p NewGD.
295   /// \param OrigAddr LLVM IR value for \p OldGD.
296   /// \param IsForDefinition true, if requested emission for the definition of
297   /// \p OldGD.
298   /// \returns true, was able to emit a definition function for \p OldGD, which
299   /// points to \p NewGD.
300   virtual bool tryEmitDeclareVariant(const GlobalDecl &NewGD,
301                                      const GlobalDecl &OldGD,
302                                      llvm::GlobalValue *OrigAddr,
303                                      bool IsForDefinition);
304
305   /// Returns default flags for the barriers depending on the directive, for
306   /// which this barier is going to be emitted.
307   static unsigned getDefaultFlagsForBarriers(OpenMPDirectiveKind Kind);
308
309   /// Get the LLVM type for the critical name.
310   llvm::ArrayType *getKmpCriticalNameTy() const {return KmpCriticalNameTy;}
311
312   /// Returns corresponding lock object for the specified critical region
313   /// name. If the lock object does not exist it is created, otherwise the
314   /// reference to the existing copy is returned.
315   /// \param CriticalName Name of the critical region.
316   ///
317   llvm::Value *getCriticalRegionLock(StringRef CriticalName);
318
319 private:
320   /// Default const ident_t object used for initialization of all other
321   /// ident_t objects.
322   llvm::Constant *DefaultOpenMPPSource = nullptr;
323   using FlagsTy = std::pair<unsigned, unsigned>;
324   /// Map of flags and corresponding default locations.
325   using OpenMPDefaultLocMapTy = llvm::DenseMap<FlagsTy, llvm::Value *>;
326   OpenMPDefaultLocMapTy OpenMPDefaultLocMap;
327   Address getOrCreateDefaultLocation(unsigned Flags);
328
329   QualType IdentQTy;
330   llvm::StructType *IdentTy = nullptr;
331   /// Map for SourceLocation and OpenMP runtime library debug locations.
332   typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDebugLocMapTy;
333   OpenMPDebugLocMapTy OpenMPDebugLocMap;
334   /// The type for a microtask which gets passed to __kmpc_fork_call().
335   /// Original representation is:
336   /// typedef void (kmpc_micro)(kmp_int32 global_tid, kmp_int32 bound_tid,...);
337   llvm::FunctionType *Kmpc_MicroTy = nullptr;
338   /// Stores debug location and ThreadID for the function.
339   struct DebugLocThreadIdTy {
340     llvm::Value *DebugLoc;
341     llvm::Value *ThreadID;
342     /// Insert point for the service instructions.
343     llvm::AssertingVH<llvm::Instruction> ServiceInsertPt = nullptr;
344   };
345   /// Map of local debug location, ThreadId and functions.
346   typedef llvm::DenseMap<llvm::Function *, DebugLocThreadIdTy>
347       OpenMPLocThreadIDMapTy;
348   OpenMPLocThreadIDMapTy OpenMPLocThreadIDMap;
349   /// Map of UDRs and corresponding combiner/initializer.
350   typedef llvm::DenseMap<const OMPDeclareReductionDecl *,
351                          std::pair<llvm::Function *, llvm::Function *>>
352       UDRMapTy;
353   UDRMapTy UDRMap;
354   /// Map of functions and locally defined UDRs.
355   typedef llvm::DenseMap<llvm::Function *,
356                          SmallVector<const OMPDeclareReductionDecl *, 4>>
357       FunctionUDRMapTy;
358   FunctionUDRMapTy FunctionUDRMap;
359   /// Map from the user-defined mapper declaration to its corresponding
360   /// functions.
361   llvm::DenseMap<const OMPDeclareMapperDecl *, llvm::Function *> UDMMap;
362   /// Map of functions and their local user-defined mappers.
363   using FunctionUDMMapTy =
364       llvm::DenseMap<llvm::Function *,
365                      SmallVector<const OMPDeclareMapperDecl *, 4>>;
366   FunctionUDMMapTy FunctionUDMMap;
367   /// Type kmp_critical_name, originally defined as typedef kmp_int32
368   /// kmp_critical_name[8];
369   llvm::ArrayType *KmpCriticalNameTy;
370   /// An ordered map of auto-generated variables to their unique names.
371   /// It stores variables with the following names: 1) ".gomp_critical_user_" +
372   /// <critical_section_name> + ".var" for "omp critical" directives; 2)
373   /// <mangled_name_for_global_var> + ".cache." for cache for threadprivate
374   /// variables.
375   llvm::StringMap<llvm::AssertingVH<llvm::Constant>, llvm::BumpPtrAllocator>
376       InternalVars;
377   /// Type typedef kmp_int32 (* kmp_routine_entry_t)(kmp_int32, void *);
378   llvm::Type *KmpRoutineEntryPtrTy = nullptr;
379   QualType KmpRoutineEntryPtrQTy;
380   /// Type typedef struct kmp_task {
381   ///    void *              shareds; /**< pointer to block of pointers to
382   ///    shared vars   */
383   ///    kmp_routine_entry_t routine; /**< pointer to routine to call for
384   ///    executing task */
385   ///    kmp_int32           part_id; /**< part id for the task */
386   ///    kmp_routine_entry_t destructors; /* pointer to function to invoke
387   ///    deconstructors of firstprivate C++ objects */
388   /// } kmp_task_t;
389   QualType KmpTaskTQTy;
390   /// Saved kmp_task_t for task directive.
391   QualType SavedKmpTaskTQTy;
392   /// Saved kmp_task_t for taskloop-based directive.
393   QualType SavedKmpTaskloopTQTy;
394   /// Type typedef struct kmp_depend_info {
395   ///    kmp_intptr_t               base_addr;
396   ///    size_t                     len;
397   ///    struct {
398   ///             bool                   in:1;
399   ///             bool                   out:1;
400   ///    } flags;
401   /// } kmp_depend_info_t;
402   QualType KmpDependInfoTy;
403   /// struct kmp_dim {  // loop bounds info casted to kmp_int64
404   ///  kmp_int64 lo; // lower
405   ///  kmp_int64 up; // upper
406   ///  kmp_int64 st; // stride
407   /// };
408   QualType KmpDimTy;
409   /// Type struct __tgt_offload_entry{
410   ///   void      *addr;       // Pointer to the offload entry info.
411   ///                          // (function or global)
412   ///   char      *name;       // Name of the function or global.
413   ///   size_t     size;       // Size of the entry info (0 if it a function).
414   /// };
415   QualType TgtOffloadEntryQTy;
416   /// struct __tgt_device_image{
417   /// void   *ImageStart;       // Pointer to the target code start.
418   /// void   *ImageEnd;         // Pointer to the target code end.
419   /// // We also add the host entries to the device image, as it may be useful
420   /// // for the target runtime to have access to that information.
421   /// __tgt_offload_entry  *EntriesBegin;   // Begin of the table with all
422   ///                                       // the entries.
423   /// __tgt_offload_entry  *EntriesEnd;     // End of the table with all the
424   ///                                       // entries (non inclusive).
425   /// };
426   QualType TgtDeviceImageQTy;
427   /// struct __tgt_bin_desc{
428   ///   int32_t              NumDevices;      // Number of devices supported.
429   ///   __tgt_device_image   *DeviceImages;   // Arrays of device images
430   ///                                         // (one per device).
431   ///   __tgt_offload_entry  *EntriesBegin;   // Begin of the table with all the
432   ///                                         // entries.
433   ///   __tgt_offload_entry  *EntriesEnd;     // End of the table with all the
434   ///                                         // entries (non inclusive).
435   /// };
436   QualType TgtBinaryDescriptorQTy;
437   /// Entity that registers the offloading constants that were emitted so
438   /// far.
439   class OffloadEntriesInfoManagerTy {
440     CodeGenModule &CGM;
441
442     /// Number of entries registered so far.
443     unsigned OffloadingEntriesNum = 0;
444
445   public:
446     /// Base class of the entries info.
447     class OffloadEntryInfo {
448     public:
449       /// Kind of a given entry.
450       enum OffloadingEntryInfoKinds : unsigned {
451         /// Entry is a target region.
452         OffloadingEntryInfoTargetRegion = 0,
453         /// Entry is a declare target variable.
454         OffloadingEntryInfoDeviceGlobalVar = 1,
455         /// Invalid entry info.
456         OffloadingEntryInfoInvalid = ~0u
457       };
458
459     protected:
460       OffloadEntryInfo() = delete;
461       explicit OffloadEntryInfo(OffloadingEntryInfoKinds Kind) : Kind(Kind) {}
462       explicit OffloadEntryInfo(OffloadingEntryInfoKinds Kind, unsigned Order,
463                                 uint32_t Flags)
464           : Flags(Flags), Order(Order), Kind(Kind) {}
465       ~OffloadEntryInfo() = default;
466
467     public:
468       bool isValid() const { return Order != ~0u; }
469       unsigned getOrder() const { return Order; }
470       OffloadingEntryInfoKinds getKind() const { return Kind; }
471       uint32_t getFlags() const { return Flags; }
472       void setFlags(uint32_t NewFlags) { Flags = NewFlags; }
473       llvm::Constant *getAddress() const {
474         return cast_or_null<llvm::Constant>(Addr);
475       }
476       void setAddress(llvm::Constant *V) {
477         assert(!Addr.pointsToAliveValue() && "Address has been set before!");
478         Addr = V;
479       }
480       static bool classof(const OffloadEntryInfo *Info) { return true; }
481
482     private:
483       /// Address of the entity that has to be mapped for offloading.
484       llvm::WeakTrackingVH Addr;
485
486       /// Flags associated with the device global.
487       uint32_t Flags = 0u;
488
489       /// Order this entry was emitted.
490       unsigned Order = ~0u;
491
492       OffloadingEntryInfoKinds Kind = OffloadingEntryInfoInvalid;
493     };
494
495     /// Return true if a there are no entries defined.
496     bool empty() const;
497     /// Return number of entries defined so far.
498     unsigned size() const { return OffloadingEntriesNum; }
499     OffloadEntriesInfoManagerTy(CodeGenModule &CGM) : CGM(CGM) {}
500
501     //
502     // Target region entries related.
503     //
504
505     /// Kind of the target registry entry.
506     enum OMPTargetRegionEntryKind : uint32_t {
507       /// Mark the entry as target region.
508       OMPTargetRegionEntryTargetRegion = 0x0,
509       /// Mark the entry as a global constructor.
510       OMPTargetRegionEntryCtor = 0x02,
511       /// Mark the entry as a global destructor.
512       OMPTargetRegionEntryDtor = 0x04,
513     };
514
515     /// Target region entries info.
516     class OffloadEntryInfoTargetRegion final : public OffloadEntryInfo {
517       /// Address that can be used as the ID of the entry.
518       llvm::Constant *ID = nullptr;
519
520     public:
521       OffloadEntryInfoTargetRegion()
522           : OffloadEntryInfo(OffloadingEntryInfoTargetRegion) {}
523       explicit OffloadEntryInfoTargetRegion(unsigned Order,
524                                             llvm::Constant *Addr,
525                                             llvm::Constant *ID,
526                                             OMPTargetRegionEntryKind Flags)
527           : OffloadEntryInfo(OffloadingEntryInfoTargetRegion, Order, Flags),
528             ID(ID) {
529         setAddress(Addr);
530       }
531
532       llvm::Constant *getID() const { return ID; }
533       void setID(llvm::Constant *V) {
534         assert(!ID && "ID has been set before!");
535         ID = V;
536       }
537       static bool classof(const OffloadEntryInfo *Info) {
538         return Info->getKind() == OffloadingEntryInfoTargetRegion;
539       }
540     };
541
542     /// Initialize target region entry.
543     void initializeTargetRegionEntryInfo(unsigned DeviceID, unsigned FileID,
544                                          StringRef ParentName, unsigned LineNum,
545                                          unsigned Order);
546     /// Register target region entry.
547     void registerTargetRegionEntryInfo(unsigned DeviceID, unsigned FileID,
548                                        StringRef ParentName, unsigned LineNum,
549                                        llvm::Constant *Addr, llvm::Constant *ID,
550                                        OMPTargetRegionEntryKind Flags);
551     /// Return true if a target region entry with the provided information
552     /// exists.
553     bool hasTargetRegionEntryInfo(unsigned DeviceID, unsigned FileID,
554                                   StringRef ParentName, unsigned LineNum) const;
555     /// brief Applies action \a Action on all registered entries.
556     typedef llvm::function_ref<void(unsigned, unsigned, StringRef, unsigned,
557                                     const OffloadEntryInfoTargetRegion &)>
558         OffloadTargetRegionEntryInfoActTy;
559     void actOnTargetRegionEntriesInfo(
560         const OffloadTargetRegionEntryInfoActTy &Action);
561
562     //
563     // Device global variable entries related.
564     //
565
566     /// Kind of the global variable entry..
567     enum OMPTargetGlobalVarEntryKind : uint32_t {
568       /// Mark the entry as a to declare target.
569       OMPTargetGlobalVarEntryTo = 0x0,
570       /// Mark the entry as a to declare target link.
571       OMPTargetGlobalVarEntryLink = 0x1,
572     };
573
574     /// Device global variable entries info.
575     class OffloadEntryInfoDeviceGlobalVar final : public OffloadEntryInfo {
576       /// Type of the global variable.
577      CharUnits VarSize;
578      llvm::GlobalValue::LinkageTypes Linkage;
579
580    public:
581      OffloadEntryInfoDeviceGlobalVar()
582          : OffloadEntryInfo(OffloadingEntryInfoDeviceGlobalVar) {}
583      explicit OffloadEntryInfoDeviceGlobalVar(unsigned Order,
584                                               OMPTargetGlobalVarEntryKind Flags)
585          : OffloadEntryInfo(OffloadingEntryInfoDeviceGlobalVar, Order, Flags) {}
586      explicit OffloadEntryInfoDeviceGlobalVar(
587          unsigned Order, llvm::Constant *Addr, CharUnits VarSize,
588          OMPTargetGlobalVarEntryKind Flags,
589          llvm::GlobalValue::LinkageTypes Linkage)
590          : OffloadEntryInfo(OffloadingEntryInfoDeviceGlobalVar, Order, Flags),
591            VarSize(VarSize), Linkage(Linkage) {
592        setAddress(Addr);
593       }
594
595       CharUnits getVarSize() const { return VarSize; }
596       void setVarSize(CharUnits Size) { VarSize = Size; }
597       llvm::GlobalValue::LinkageTypes getLinkage() const { return Linkage; }
598       void setLinkage(llvm::GlobalValue::LinkageTypes LT) { Linkage = LT; }
599       static bool classof(const OffloadEntryInfo *Info) {
600         return Info->getKind() == OffloadingEntryInfoDeviceGlobalVar;
601       }
602     };
603
604     /// Initialize device global variable entry.
605     void initializeDeviceGlobalVarEntryInfo(StringRef Name,
606                                             OMPTargetGlobalVarEntryKind Flags,
607                                             unsigned Order);
608
609     /// Register device global variable entry.
610     void
611     registerDeviceGlobalVarEntryInfo(StringRef VarName, llvm::Constant *Addr,
612                                      CharUnits VarSize,
613                                      OMPTargetGlobalVarEntryKind Flags,
614                                      llvm::GlobalValue::LinkageTypes Linkage);
615     /// Checks if the variable with the given name has been registered already.
616     bool hasDeviceGlobalVarEntryInfo(StringRef VarName) const {
617       return OffloadEntriesDeviceGlobalVar.count(VarName) > 0;
618     }
619     /// Applies action \a Action on all registered entries.
620     typedef llvm::function_ref<void(StringRef,
621                                     const OffloadEntryInfoDeviceGlobalVar &)>
622         OffloadDeviceGlobalVarEntryInfoActTy;
623     void actOnDeviceGlobalVarEntriesInfo(
624         const OffloadDeviceGlobalVarEntryInfoActTy &Action);
625
626   private:
627     // Storage for target region entries kind. The storage is to be indexed by
628     // file ID, device ID, parent function name and line number.
629     typedef llvm::DenseMap<unsigned, OffloadEntryInfoTargetRegion>
630         OffloadEntriesTargetRegionPerLine;
631     typedef llvm::StringMap<OffloadEntriesTargetRegionPerLine>
632         OffloadEntriesTargetRegionPerParentName;
633     typedef llvm::DenseMap<unsigned, OffloadEntriesTargetRegionPerParentName>
634         OffloadEntriesTargetRegionPerFile;
635     typedef llvm::DenseMap<unsigned, OffloadEntriesTargetRegionPerFile>
636         OffloadEntriesTargetRegionPerDevice;
637     typedef OffloadEntriesTargetRegionPerDevice OffloadEntriesTargetRegionTy;
638     OffloadEntriesTargetRegionTy OffloadEntriesTargetRegion;
639     /// Storage for device global variable entries kind. The storage is to be
640     /// indexed by mangled name.
641     typedef llvm::StringMap<OffloadEntryInfoDeviceGlobalVar>
642         OffloadEntriesDeviceGlobalVarTy;
643     OffloadEntriesDeviceGlobalVarTy OffloadEntriesDeviceGlobalVar;
644   };
645   OffloadEntriesInfoManagerTy OffloadEntriesInfoManager;
646
647   bool ShouldMarkAsGlobal = true;
648   /// List of the emitted functions.
649   llvm::StringSet<> AlreadyEmittedTargetFunctions;
650   /// List of the global variables with their addresses that should not be
651   /// emitted for the target.
652   llvm::StringMap<llvm::WeakTrackingVH> EmittedNonTargetVariables;
653
654   /// List of variables that can become declare target implicitly and, thus,
655   /// must be emitted.
656   llvm::SmallDenseSet<const VarDecl *> DeferredGlobalVariables;
657
658   /// Mapping of the original functions to their variants and original global
659   /// decl.
660   llvm::MapVector<CanonicalDeclPtr<const FunctionDecl>,
661                   std::pair<GlobalDecl, GlobalDecl>>
662       DeferredVariantFunction;
663
664   /// Flag for keeping track of weather a requires unified_shared_memory
665   /// directive is present.
666   bool HasRequiresUnifiedSharedMemory = false;
667
668   /// Flag for keeping track of weather a target region has been emitted.
669   bool HasEmittedTargetRegion = false;
670
671   /// Flag for keeping track of weather a device routine has been emitted.
672   /// Device routines are specific to the
673   bool HasEmittedDeclareTargetRegion = false;
674
675   /// Loads all the offload entries information from the host IR
676   /// metadata.
677   void loadOffloadInfoMetadata();
678
679   /// Returns __tgt_offload_entry type.
680   QualType getTgtOffloadEntryQTy();
681
682   /// Returns __tgt_device_image type.
683   QualType getTgtDeviceImageQTy();
684
685   /// Returns __tgt_bin_desc type.
686   QualType getTgtBinaryDescriptorQTy();
687
688   /// Start scanning from statement \a S and and emit all target regions
689   /// found along the way.
690   /// \param S Starting statement.
691   /// \param ParentName Name of the function declaration that is being scanned.
692   void scanForTargetRegionsFunctions(const Stmt *S, StringRef ParentName);
693
694   /// Build type kmp_routine_entry_t (if not built yet).
695   void emitKmpRoutineEntryT(QualType KmpInt32Ty);
696
697   /// Returns pointer to kmpc_micro type.
698   llvm::Type *getKmpc_MicroPointerTy();
699
700   /// Returns specified OpenMP runtime function.
701   /// \param Function OpenMP runtime function.
702   /// \return Specified function.
703   llvm::FunctionCallee createRuntimeFunction(unsigned Function);
704
705   /// Returns __kmpc_for_static_init_* runtime function for the specified
706   /// size \a IVSize and sign \a IVSigned.
707   llvm::FunctionCallee createForStaticInitFunction(unsigned IVSize,
708                                                    bool IVSigned);
709
710   /// Returns __kmpc_dispatch_init_* runtime function for the specified
711   /// size \a IVSize and sign \a IVSigned.
712   llvm::FunctionCallee createDispatchInitFunction(unsigned IVSize,
713                                                   bool IVSigned);
714
715   /// Returns __kmpc_dispatch_next_* runtime function for the specified
716   /// size \a IVSize and sign \a IVSigned.
717   llvm::FunctionCallee createDispatchNextFunction(unsigned IVSize,
718                                                   bool IVSigned);
719
720   /// Returns __kmpc_dispatch_fini_* runtime function for the specified
721   /// size \a IVSize and sign \a IVSigned.
722   llvm::FunctionCallee createDispatchFiniFunction(unsigned IVSize,
723                                                   bool IVSigned);
724
725   /// If the specified mangled name is not in the module, create and
726   /// return threadprivate cache object. This object is a pointer's worth of
727   /// storage that's reserved for use by the OpenMP runtime.
728   /// \param VD Threadprivate variable.
729   /// \return Cache variable for the specified threadprivate.
730   llvm::Constant *getOrCreateThreadPrivateCache(const VarDecl *VD);
731
732   /// Gets (if variable with the given name already exist) or creates
733   /// internal global variable with the specified Name. The created variable has
734   /// linkage CommonLinkage by default and is initialized by null value.
735   /// \param Ty Type of the global variable. If it is exist already the type
736   /// must be the same.
737   /// \param Name Name of the variable.
738   llvm::Constant *getOrCreateInternalVariable(llvm::Type *Ty,
739                                               const llvm::Twine &Name,
740                                               unsigned AddressSpace = 0);
741
742   /// Set of threadprivate variables with the generated initializer.
743   llvm::StringSet<> ThreadPrivateWithDefinition;
744
745   /// Set of declare target variables with the generated initializer.
746   llvm::StringSet<> DeclareTargetWithDefinition;
747
748   /// Emits initialization code for the threadprivate variables.
749   /// \param VDAddr Address of the global variable \a VD.
750   /// \param Ctor Pointer to a global init function for \a VD.
751   /// \param CopyCtor Pointer to a global copy function for \a VD.
752   /// \param Dtor Pointer to a global destructor function for \a VD.
753   /// \param Loc Location of threadprivate declaration.
754   void emitThreadPrivateVarInit(CodeGenFunction &CGF, Address VDAddr,
755                                 llvm::Value *Ctor, llvm::Value *CopyCtor,
756                                 llvm::Value *Dtor, SourceLocation Loc);
757
758   /// Emit the array initialization or deletion portion for user-defined mapper
759   /// code generation.
760   void emitUDMapperArrayInitOrDel(CodeGenFunction &MapperCGF,
761                                   llvm::Value *Handle, llvm::Value *BasePtr,
762                                   llvm::Value *Ptr, llvm::Value *Size,
763                                   llvm::Value *MapType, CharUnits ElementSize,
764                                   llvm::BasicBlock *ExitBB, bool IsInit);
765
766   struct TaskResultTy {
767     llvm::Value *NewTask = nullptr;
768     llvm::Function *TaskEntry = nullptr;
769     llvm::Value *NewTaskNewTaskTTy = nullptr;
770     LValue TDBase;
771     const RecordDecl *KmpTaskTQTyRD = nullptr;
772     llvm::Value *TaskDupFn = nullptr;
773   };
774   /// Emit task region for the task directive. The task region is emitted in
775   /// several steps:
776   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
777   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
778   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
779   /// function:
780   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
781   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
782   ///   return 0;
783   /// }
784   /// 2. Copy a list of shared variables to field shareds of the resulting
785   /// structure kmp_task_t returned by the previous call (if any).
786   /// 3. Copy a pointer to destructions function to field destructions of the
787   /// resulting structure kmp_task_t.
788   /// \param D Current task directive.
789   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
790   /// /*part_id*/, captured_struct */*__context*/);
791   /// \param SharedsTy A type which contains references the shared variables.
792   /// \param Shareds Context with the list of shared variables from the \p
793   /// TaskFunction.
794   /// \param Data Additional data for task generation like tiednsee, final
795   /// state, list of privates etc.
796   TaskResultTy emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc,
797                             const OMPExecutableDirective &D,
798                             llvm::Function *TaskFunction, QualType SharedsTy,
799                             Address Shareds, const OMPTaskDataTy &Data);
800
801   /// Returns default address space for the constant firstprivates, 0 by
802   /// default.
803   virtual unsigned getDefaultFirstprivateAddressSpace() const { return 0; }
804
805   /// Emit code that pushes the trip count of loops associated with constructs
806   /// 'target teams distribute' and 'teams distribute parallel for'.
807   /// \param SizeEmitter Emits the int64 value for the number of iterations of
808   /// the associated loop.
809   void emitTargetNumIterationsCall(
810       CodeGenFunction &CGF, const OMPExecutableDirective &D,
811       llvm::Value *DeviceID,
812       llvm::function_ref<llvm::Value *(CodeGenFunction &CGF,
813                                        const OMPLoopDirective &D)>
814           SizeEmitter);
815
816 public:
817   explicit CGOpenMPRuntime(CodeGenModule &CGM)
818       : CGOpenMPRuntime(CGM, ".", ".") {}
819   virtual ~CGOpenMPRuntime() {}
820   virtual void clear();
821
822   /// Checks if the \p Body is the \a CompoundStmt and returns its child
823   /// statement iff there is only one that is not evaluatable at the compile
824   /// time.
825   static const Stmt *getSingleCompoundChild(ASTContext &Ctx, const Stmt *Body);
826
827   /// Get the platform-specific name separator.
828   std::string getName(ArrayRef<StringRef> Parts) const;
829
830   /// Emit code for the specified user defined reduction construct.
831   virtual void emitUserDefinedReduction(CodeGenFunction *CGF,
832                                         const OMPDeclareReductionDecl *D);
833   /// Get combiner/initializer for the specified user-defined reduction, if any.
834   virtual std::pair<llvm::Function *, llvm::Function *>
835   getUserDefinedReduction(const OMPDeclareReductionDecl *D);
836
837   /// Emit the function for the user defined mapper construct.
838   void emitUserDefinedMapper(const OMPDeclareMapperDecl *D,
839                              CodeGenFunction *CGF = nullptr);
840
841   /// Emits outlined function for the specified OpenMP parallel directive
842   /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
843   /// kmp_int32 BoundID, struct context_vars*).
844   /// \param D OpenMP directive.
845   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
846   /// \param InnermostKind Kind of innermost directive (for simple directives it
847   /// is a directive itself, for combined - its innermost directive).
848   /// \param CodeGen Code generation sequence for the \a D directive.
849   virtual llvm::Function *emitParallelOutlinedFunction(
850       const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
851       OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen);
852
853   /// Emits outlined function for the specified OpenMP teams directive
854   /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
855   /// kmp_int32 BoundID, struct context_vars*).
856   /// \param D OpenMP directive.
857   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
858   /// \param InnermostKind Kind of innermost directive (for simple directives it
859   /// is a directive itself, for combined - its innermost directive).
860   /// \param CodeGen Code generation sequence for the \a D directive.
861   virtual llvm::Function *emitTeamsOutlinedFunction(
862       const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
863       OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen);
864
865   /// Emits outlined function for the OpenMP task directive \a D. This
866   /// outlined function has type void(*)(kmp_int32 ThreadID, struct task_t*
867   /// TaskT).
868   /// \param D OpenMP directive.
869   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
870   /// \param PartIDVar Variable for partition id in the current OpenMP untied
871   /// task region.
872   /// \param TaskTVar Variable for task_t argument.
873   /// \param InnermostKind Kind of innermost directive (for simple directives it
874   /// is a directive itself, for combined - its innermost directive).
875   /// \param CodeGen Code generation sequence for the \a D directive.
876   /// \param Tied true if task is generated for tied task, false otherwise.
877   /// \param NumberOfParts Number of parts in untied task. Ignored for tied
878   /// tasks.
879   ///
880   virtual llvm::Function *emitTaskOutlinedFunction(
881       const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
882       const VarDecl *PartIDVar, const VarDecl *TaskTVar,
883       OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen,
884       bool Tied, unsigned &NumberOfParts);
885
886   /// Cleans up references to the objects in finished function.
887   ///
888   virtual void functionFinished(CodeGenFunction &CGF);
889
890   /// Emits code for parallel or serial call of the \a OutlinedFn with
891   /// variables captured in a record which address is stored in \a
892   /// CapturedStruct.
893   /// \param OutlinedFn Outlined function to be run in parallel threads. Type of
894   /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
895   /// \param CapturedVars A pointer to the record with the references to
896   /// variables used in \a OutlinedFn function.
897   /// \param IfCond Condition in the associated 'if' clause, if it was
898   /// specified, nullptr otherwise.
899   ///
900   virtual void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
901                                 llvm::Function *OutlinedFn,
902                                 ArrayRef<llvm::Value *> CapturedVars,
903                                 const Expr *IfCond);
904
905   /// Emits a critical region.
906   /// \param CriticalName Name of the critical region.
907   /// \param CriticalOpGen Generator for the statement associated with the given
908   /// critical region.
909   /// \param Hint Value of the 'hint' clause (optional).
910   virtual void emitCriticalRegion(CodeGenFunction &CGF, StringRef CriticalName,
911                                   const RegionCodeGenTy &CriticalOpGen,
912                                   SourceLocation Loc,
913                                   const Expr *Hint = nullptr);
914
915   /// Emits a master region.
916   /// \param MasterOpGen Generator for the statement associated with the given
917   /// master region.
918   virtual void emitMasterRegion(CodeGenFunction &CGF,
919                                 const RegionCodeGenTy &MasterOpGen,
920                                 SourceLocation Loc);
921
922   /// Emits code for a taskyield directive.
923   virtual void emitTaskyieldCall(CodeGenFunction &CGF, SourceLocation Loc);
924
925   /// Emit a taskgroup region.
926   /// \param TaskgroupOpGen Generator for the statement associated with the
927   /// given taskgroup region.
928   virtual void emitTaskgroupRegion(CodeGenFunction &CGF,
929                                    const RegionCodeGenTy &TaskgroupOpGen,
930                                    SourceLocation Loc);
931
932   /// Emits a single region.
933   /// \param SingleOpGen Generator for the statement associated with the given
934   /// single region.
935   virtual void emitSingleRegion(CodeGenFunction &CGF,
936                                 const RegionCodeGenTy &SingleOpGen,
937                                 SourceLocation Loc,
938                                 ArrayRef<const Expr *> CopyprivateVars,
939                                 ArrayRef<const Expr *> DestExprs,
940                                 ArrayRef<const Expr *> SrcExprs,
941                                 ArrayRef<const Expr *> AssignmentOps);
942
943   /// Emit an ordered region.
944   /// \param OrderedOpGen Generator for the statement associated with the given
945   /// ordered region.
946   virtual void emitOrderedRegion(CodeGenFunction &CGF,
947                                  const RegionCodeGenTy &OrderedOpGen,
948                                  SourceLocation Loc, bool IsThreads);
949
950   /// Emit an implicit/explicit barrier for OpenMP threads.
951   /// \param Kind Directive for which this implicit barrier call must be
952   /// generated. Must be OMPD_barrier for explicit barrier generation.
953   /// \param EmitChecks true if need to emit checks for cancellation barriers.
954   /// \param ForceSimpleCall true simple barrier call must be emitted, false if
955   /// runtime class decides which one to emit (simple or with cancellation
956   /// checks).
957   ///
958   virtual void emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
959                                OpenMPDirectiveKind Kind,
960                                bool EmitChecks = true,
961                                bool ForceSimpleCall = false);
962
963   /// Check if the specified \a ScheduleKind is static non-chunked.
964   /// This kind of worksharing directive is emitted without outer loop.
965   /// \param ScheduleKind Schedule kind specified in the 'schedule' clause.
966   /// \param Chunked True if chunk is specified in the clause.
967   ///
968   virtual bool isStaticNonchunked(OpenMPScheduleClauseKind ScheduleKind,
969                                   bool Chunked) const;
970
971   /// Check if the specified \a ScheduleKind is static non-chunked.
972   /// This kind of distribute directive is emitted without outer loop.
973   /// \param ScheduleKind Schedule kind specified in the 'dist_schedule' clause.
974   /// \param Chunked True if chunk is specified in the clause.
975   ///
976   virtual bool isStaticNonchunked(OpenMPDistScheduleClauseKind ScheduleKind,
977                                   bool Chunked) const;
978
979   /// Check if the specified \a ScheduleKind is static chunked.
980   /// \param ScheduleKind Schedule kind specified in the 'schedule' clause.
981   /// \param Chunked True if chunk is specified in the clause.
982   ///
983   virtual bool isStaticChunked(OpenMPScheduleClauseKind ScheduleKind,
984                                bool Chunked) const;
985
986   /// Check if the specified \a ScheduleKind is static non-chunked.
987   /// \param ScheduleKind Schedule kind specified in the 'dist_schedule' clause.
988   /// \param Chunked True if chunk is specified in the clause.
989   ///
990   virtual bool isStaticChunked(OpenMPDistScheduleClauseKind ScheduleKind,
991                                bool Chunked) const;
992
993   /// Check if the specified \a ScheduleKind is dynamic.
994   /// This kind of worksharing directive is emitted without outer loop.
995   /// \param ScheduleKind Schedule Kind specified in the 'schedule' clause.
996   ///
997   virtual bool isDynamic(OpenMPScheduleClauseKind ScheduleKind) const;
998
999   /// struct with the values to be passed to the dispatch runtime function
1000   struct DispatchRTInput {
1001     /// Loop lower bound
1002     llvm::Value *LB = nullptr;
1003     /// Loop upper bound
1004     llvm::Value *UB = nullptr;
1005     /// Chunk size specified using 'schedule' clause (nullptr if chunk
1006     /// was not specified)
1007     llvm::Value *Chunk = nullptr;
1008     DispatchRTInput() = default;
1009     DispatchRTInput(llvm::Value *LB, llvm::Value *UB, llvm::Value *Chunk)
1010         : LB(LB), UB(UB), Chunk(Chunk) {}
1011   };
1012
1013   /// Call the appropriate runtime routine to initialize it before start
1014   /// of loop.
1015
1016   /// This is used for non static scheduled types and when the ordered
1017   /// clause is present on the loop construct.
1018   /// Depending on the loop schedule, it is necessary to call some runtime
1019   /// routine before start of the OpenMP loop to get the loop upper / lower
1020   /// bounds \a LB and \a UB and stride \a ST.
1021   ///
1022   /// \param CGF Reference to current CodeGenFunction.
1023   /// \param Loc Clang source location.
1024   /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
1025   /// \param IVSize Size of the iteration variable in bits.
1026   /// \param IVSigned Sign of the iteration variable.
1027   /// \param Ordered true if loop is ordered, false otherwise.
1028   /// \param DispatchValues struct containing llvm values for lower bound, upper
1029   /// bound, and chunk expression.
1030   /// For the default (nullptr) value, the chunk 1 will be used.
1031   ///
1032   virtual void emitForDispatchInit(CodeGenFunction &CGF, SourceLocation Loc,
1033                                    const OpenMPScheduleTy &ScheduleKind,
1034                                    unsigned IVSize, bool IVSigned, bool Ordered,
1035                                    const DispatchRTInput &DispatchValues);
1036
1037   /// Struct with the values to be passed to the static runtime function
1038   struct StaticRTInput {
1039     /// Size of the iteration variable in bits.
1040     unsigned IVSize = 0;
1041     /// Sign of the iteration variable.
1042     bool IVSigned = false;
1043     /// true if loop is ordered, false otherwise.
1044     bool Ordered = false;
1045     /// Address of the output variable in which the flag of the last iteration
1046     /// is returned.
1047     Address IL = Address::invalid();
1048     /// Address of the output variable in which the lower iteration number is
1049     /// returned.
1050     Address LB = Address::invalid();
1051     /// Address of the output variable in which the upper iteration number is
1052     /// returned.
1053     Address UB = Address::invalid();
1054     /// Address of the output variable in which the stride value is returned
1055     /// necessary to generated the static_chunked scheduled loop.
1056     Address ST = Address::invalid();
1057     /// Value of the chunk for the static_chunked scheduled loop. For the
1058     /// default (nullptr) value, the chunk 1 will be used.
1059     llvm::Value *Chunk = nullptr;
1060     StaticRTInput(unsigned IVSize, bool IVSigned, bool Ordered, Address IL,
1061                   Address LB, Address UB, Address ST,
1062                   llvm::Value *Chunk = nullptr)
1063         : IVSize(IVSize), IVSigned(IVSigned), Ordered(Ordered), IL(IL), LB(LB),
1064           UB(UB), ST(ST), Chunk(Chunk) {}
1065   };
1066   /// Call the appropriate runtime routine to initialize it before start
1067   /// of loop.
1068   ///
1069   /// This is used only in case of static schedule, when the user did not
1070   /// specify a ordered clause on the loop construct.
1071   /// Depending on the loop schedule, it is necessary to call some runtime
1072   /// routine before start of the OpenMP loop to get the loop upper / lower
1073   /// bounds LB and UB and stride ST.
1074   ///
1075   /// \param CGF Reference to current CodeGenFunction.
1076   /// \param Loc Clang source location.
1077   /// \param DKind Kind of the directive.
1078   /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
1079   /// \param Values Input arguments for the construct.
1080   ///
1081   virtual void emitForStaticInit(CodeGenFunction &CGF, SourceLocation Loc,
1082                                  OpenMPDirectiveKind DKind,
1083                                  const OpenMPScheduleTy &ScheduleKind,
1084                                  const StaticRTInput &Values);
1085
1086   ///
1087   /// \param CGF Reference to current CodeGenFunction.
1088   /// \param Loc Clang source location.
1089   /// \param SchedKind Schedule kind, specified by the 'dist_schedule' clause.
1090   /// \param Values Input arguments for the construct.
1091   ///
1092   virtual void emitDistributeStaticInit(CodeGenFunction &CGF,
1093                                         SourceLocation Loc,
1094                                         OpenMPDistScheduleClauseKind SchedKind,
1095                                         const StaticRTInput &Values);
1096
1097   /// Call the appropriate runtime routine to notify that we finished
1098   /// iteration of the ordered loop with the dynamic scheduling.
1099   ///
1100   /// \param CGF Reference to current CodeGenFunction.
1101   /// \param Loc Clang source location.
1102   /// \param IVSize Size of the iteration variable in bits.
1103   /// \param IVSigned Sign of the iteration variable.
1104   ///
1105   virtual void emitForOrderedIterationEnd(CodeGenFunction &CGF,
1106                                           SourceLocation Loc, unsigned IVSize,
1107                                           bool IVSigned);
1108
1109   /// Call the appropriate runtime routine to notify that we finished
1110   /// all the work with current loop.
1111   ///
1112   /// \param CGF Reference to current CodeGenFunction.
1113   /// \param Loc Clang source location.
1114   /// \param DKind Kind of the directive for which the static finish is emitted.
1115   ///
1116   virtual void emitForStaticFinish(CodeGenFunction &CGF, SourceLocation Loc,
1117                                    OpenMPDirectiveKind DKind);
1118
1119   /// Call __kmpc_dispatch_next(
1120   ///          ident_t *loc, kmp_int32 tid, kmp_int32 *p_lastiter,
1121   ///          kmp_int[32|64] *p_lower, kmp_int[32|64] *p_upper,
1122   ///          kmp_int[32|64] *p_stride);
1123   /// \param IVSize Size of the iteration variable in bits.
1124   /// \param IVSigned Sign of the iteration variable.
1125   /// \param IL Address of the output variable in which the flag of the
1126   /// last iteration is returned.
1127   /// \param LB Address of the output variable in which the lower iteration
1128   /// number is returned.
1129   /// \param UB Address of the output variable in which the upper iteration
1130   /// number is returned.
1131   /// \param ST Address of the output variable in which the stride value is
1132   /// returned.
1133   virtual llvm::Value *emitForNext(CodeGenFunction &CGF, SourceLocation Loc,
1134                                    unsigned IVSize, bool IVSigned,
1135                                    Address IL, Address LB,
1136                                    Address UB, Address ST);
1137
1138   /// Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32
1139   /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads'
1140   /// clause.
1141   /// \param NumThreads An integer value of threads.
1142   virtual void emitNumThreadsClause(CodeGenFunction &CGF,
1143                                     llvm::Value *NumThreads,
1144                                     SourceLocation Loc);
1145
1146   /// Emit call to void __kmpc_push_proc_bind(ident_t *loc, kmp_int32
1147   /// global_tid, int proc_bind) to generate code for 'proc_bind' clause.
1148   virtual void emitProcBindClause(CodeGenFunction &CGF,
1149                                   OpenMPProcBindClauseKind ProcBind,
1150                                   SourceLocation Loc);
1151
1152   /// Returns address of the threadprivate variable for the current
1153   /// thread.
1154   /// \param VD Threadprivate variable.
1155   /// \param VDAddr Address of the global variable \a VD.
1156   /// \param Loc Location of the reference to threadprivate var.
1157   /// \return Address of the threadprivate variable for the current thread.
1158   virtual Address getAddrOfThreadPrivate(CodeGenFunction &CGF,
1159                                          const VarDecl *VD,
1160                                          Address VDAddr,
1161                                          SourceLocation Loc);
1162
1163   /// Returns the address of the variable marked as declare target with link
1164   /// clause OR as declare target with to clause and unified memory.
1165   virtual Address getAddrOfDeclareTargetVar(const VarDecl *VD);
1166
1167   /// Emit a code for initialization of threadprivate variable. It emits
1168   /// a call to runtime library which adds initial value to the newly created
1169   /// threadprivate variable (if it is not constant) and registers destructor
1170   /// for the variable (if any).
1171   /// \param VD Threadprivate variable.
1172   /// \param VDAddr Address of the global variable \a VD.
1173   /// \param Loc Location of threadprivate declaration.
1174   /// \param PerformInit true if initialization expression is not constant.
1175   virtual llvm::Function *
1176   emitThreadPrivateVarDefinition(const VarDecl *VD, Address VDAddr,
1177                                  SourceLocation Loc, bool PerformInit,
1178                                  CodeGenFunction *CGF = nullptr);
1179
1180   /// Emit a code for initialization of declare target variable.
1181   /// \param VD Declare target variable.
1182   /// \param Addr Address of the global variable \a VD.
1183   /// \param PerformInit true if initialization expression is not constant.
1184   virtual bool emitDeclareTargetVarDefinition(const VarDecl *VD,
1185                                               llvm::GlobalVariable *Addr,
1186                                               bool PerformInit);
1187
1188   /// Creates artificial threadprivate variable with name \p Name and type \p
1189   /// VarType.
1190   /// \param VarType Type of the artificial threadprivate variable.
1191   /// \param Name Name of the artificial threadprivate variable.
1192   virtual Address getAddrOfArtificialThreadPrivate(CodeGenFunction &CGF,
1193                                                    QualType VarType,
1194                                                    StringRef Name);
1195
1196   /// Emit flush of the variables specified in 'omp flush' directive.
1197   /// \param Vars List of variables to flush.
1198   virtual void emitFlush(CodeGenFunction &CGF, ArrayRef<const Expr *> Vars,
1199                          SourceLocation Loc);
1200
1201   /// Emit task region for the task directive. The task region is
1202   /// emitted in several steps:
1203   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
1204   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
1205   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
1206   /// function:
1207   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
1208   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
1209   ///   return 0;
1210   /// }
1211   /// 2. Copy a list of shared variables to field shareds of the resulting
1212   /// structure kmp_task_t returned by the previous call (if any).
1213   /// 3. Copy a pointer to destructions function to field destructions of the
1214   /// resulting structure kmp_task_t.
1215   /// 4. Emit a call to kmp_int32 __kmpc_omp_task(ident_t *, kmp_int32 gtid,
1216   /// kmp_task_t *new_task), where new_task is a resulting structure from
1217   /// previous items.
1218   /// \param D Current task directive.
1219   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
1220   /// /*part_id*/, captured_struct */*__context*/);
1221   /// \param SharedsTy A type which contains references the shared variables.
1222   /// \param Shareds Context with the list of shared variables from the \p
1223   /// TaskFunction.
1224   /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
1225   /// otherwise.
1226   /// \param Data Additional data for task generation like tiednsee, final
1227   /// state, list of privates etc.
1228   virtual void emitTaskCall(CodeGenFunction &CGF, SourceLocation Loc,
1229                             const OMPExecutableDirective &D,
1230                             llvm::Function *TaskFunction, QualType SharedsTy,
1231                             Address Shareds, const Expr *IfCond,
1232                             const OMPTaskDataTy &Data);
1233
1234   /// Emit task region for the taskloop directive. The taskloop region is
1235   /// emitted in several steps:
1236   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
1237   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
1238   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
1239   /// function:
1240   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
1241   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
1242   ///   return 0;
1243   /// }
1244   /// 2. Copy a list of shared variables to field shareds of the resulting
1245   /// structure kmp_task_t returned by the previous call (if any).
1246   /// 3. Copy a pointer to destructions function to field destructions of the
1247   /// resulting structure kmp_task_t.
1248   /// 4. Emit a call to void __kmpc_taskloop(ident_t *loc, int gtid, kmp_task_t
1249   /// *task, int if_val, kmp_uint64 *lb, kmp_uint64 *ub, kmp_int64 st, int
1250   /// nogroup, int sched, kmp_uint64 grainsize, void *task_dup ), where new_task
1251   /// is a resulting structure from
1252   /// previous items.
1253   /// \param D Current task directive.
1254   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
1255   /// /*part_id*/, captured_struct */*__context*/);
1256   /// \param SharedsTy A type which contains references the shared variables.
1257   /// \param Shareds Context with the list of shared variables from the \p
1258   /// TaskFunction.
1259   /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
1260   /// otherwise.
1261   /// \param Data Additional data for task generation like tiednsee, final
1262   /// state, list of privates etc.
1263   virtual void emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
1264                                 const OMPLoopDirective &D,
1265                                 llvm::Function *TaskFunction,
1266                                 QualType SharedsTy, Address Shareds,
1267                                 const Expr *IfCond, const OMPTaskDataTy &Data);
1268
1269   /// Emit code for the directive that does not require outlining.
1270   ///
1271   /// \param InnermostKind Kind of innermost directive (for simple directives it
1272   /// is a directive itself, for combined - its innermost directive).
1273   /// \param CodeGen Code generation sequence for the \a D directive.
1274   /// \param HasCancel true if region has inner cancel directive, false
1275   /// otherwise.
1276   virtual void emitInlinedDirective(CodeGenFunction &CGF,
1277                                     OpenMPDirectiveKind InnermostKind,
1278                                     const RegionCodeGenTy &CodeGen,
1279                                     bool HasCancel = false);
1280
1281   /// Emits reduction function.
1282   /// \param ArgsType Array type containing pointers to reduction variables.
1283   /// \param Privates List of private copies for original reduction arguments.
1284   /// \param LHSExprs List of LHS in \a ReductionOps reduction operations.
1285   /// \param RHSExprs List of RHS in \a ReductionOps reduction operations.
1286   /// \param ReductionOps List of reduction operations in form 'LHS binop RHS'
1287   /// or 'operator binop(LHS, RHS)'.
1288   llvm::Function *emitReductionFunction(SourceLocation Loc,
1289                                         llvm::Type *ArgsType,
1290                                         ArrayRef<const Expr *> Privates,
1291                                         ArrayRef<const Expr *> LHSExprs,
1292                                         ArrayRef<const Expr *> RHSExprs,
1293                                         ArrayRef<const Expr *> ReductionOps);
1294
1295   /// Emits single reduction combiner
1296   void emitSingleReductionCombiner(CodeGenFunction &CGF,
1297                                    const Expr *ReductionOp,
1298                                    const Expr *PrivateRef,
1299                                    const DeclRefExpr *LHS,
1300                                    const DeclRefExpr *RHS);
1301
1302   struct ReductionOptionsTy {
1303     bool WithNowait;
1304     bool SimpleReduction;
1305     OpenMPDirectiveKind ReductionKind;
1306   };
1307   /// Emit a code for reduction clause. Next code should be emitted for
1308   /// reduction:
1309   /// \code
1310   ///
1311   /// static kmp_critical_name lock = { 0 };
1312   ///
1313   /// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
1314   ///  ...
1315   ///  *(Type<i>*)lhs[i] = RedOp<i>(*(Type<i>*)lhs[i], *(Type<i>*)rhs[i]);
1316   ///  ...
1317   /// }
1318   ///
1319   /// ...
1320   /// void *RedList[<n>] = {&<RHSExprs>[0], ..., &<RHSExprs>[<n>-1]};
1321   /// switch (__kmpc_reduce{_nowait}(<loc>, <gtid>, <n>, sizeof(RedList),
1322   /// RedList, reduce_func, &<lock>)) {
1323   /// case 1:
1324   ///  ...
1325   ///  <LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]);
1326   ///  ...
1327   /// __kmpc_end_reduce{_nowait}(<loc>, <gtid>, &<lock>);
1328   /// break;
1329   /// case 2:
1330   ///  ...
1331   ///  Atomic(<LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]));
1332   ///  ...
1333   /// break;
1334   /// default:;
1335   /// }
1336   /// \endcode
1337   ///
1338   /// \param Privates List of private copies for original reduction arguments.
1339   /// \param LHSExprs List of LHS in \a ReductionOps reduction operations.
1340   /// \param RHSExprs List of RHS in \a ReductionOps reduction operations.
1341   /// \param ReductionOps List of reduction operations in form 'LHS binop RHS'
1342   /// or 'operator binop(LHS, RHS)'.
1343   /// \param Options List of options for reduction codegen:
1344   ///     WithNowait true if parent directive has also nowait clause, false
1345   ///     otherwise.
1346   ///     SimpleReduction Emit reduction operation only. Used for omp simd
1347   ///     directive on the host.
1348   ///     ReductionKind The kind of reduction to perform.
1349   virtual void emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
1350                              ArrayRef<const Expr *> Privates,
1351                              ArrayRef<const Expr *> LHSExprs,
1352                              ArrayRef<const Expr *> RHSExprs,
1353                              ArrayRef<const Expr *> ReductionOps,
1354                              ReductionOptionsTy Options);
1355
1356   /// Emit a code for initialization of task reduction clause. Next code
1357   /// should be emitted for reduction:
1358   /// \code
1359   ///
1360   /// _task_red_item_t red_data[n];
1361   /// ...
1362   /// red_data[i].shar = &origs[i];
1363   /// red_data[i].size = sizeof(origs[i]);
1364   /// red_data[i].f_init = (void*)RedInit<i>;
1365   /// red_data[i].f_fini = (void*)RedDest<i>;
1366   /// red_data[i].f_comb = (void*)RedOp<i>;
1367   /// red_data[i].flags = <Flag_i>;
1368   /// ...
1369   /// void* tg1 = __kmpc_task_reduction_init(gtid, n, red_data);
1370   /// \endcode
1371   ///
1372   /// \param LHSExprs List of LHS in \a Data.ReductionOps reduction operations.
1373   /// \param RHSExprs List of RHS in \a Data.ReductionOps reduction operations.
1374   /// \param Data Additional data for task generation like tiedness, final
1375   /// state, list of privates, reductions etc.
1376   virtual llvm::Value *emitTaskReductionInit(CodeGenFunction &CGF,
1377                                              SourceLocation Loc,
1378                                              ArrayRef<const Expr *> LHSExprs,
1379                                              ArrayRef<const Expr *> RHSExprs,
1380                                              const OMPTaskDataTy &Data);
1381
1382   /// Required to resolve existing problems in the runtime. Emits threadprivate
1383   /// variables to store the size of the VLAs/array sections for
1384   /// initializer/combiner/finalizer functions + emits threadprivate variable to
1385   /// store the pointer to the original reduction item for the custom
1386   /// initializer defined by declare reduction construct.
1387   /// \param RCG Allows to reuse an existing data for the reductions.
1388   /// \param N Reduction item for which fixups must be emitted.
1389   virtual void emitTaskReductionFixups(CodeGenFunction &CGF, SourceLocation Loc,
1390                                        ReductionCodeGen &RCG, unsigned N);
1391
1392   /// Get the address of `void *` type of the privatue copy of the reduction
1393   /// item specified by the \p SharedLVal.
1394   /// \param ReductionsPtr Pointer to the reduction data returned by the
1395   /// emitTaskReductionInit function.
1396   /// \param SharedLVal Address of the original reduction item.
1397   virtual Address getTaskReductionItem(CodeGenFunction &CGF, SourceLocation Loc,
1398                                        llvm::Value *ReductionsPtr,
1399                                        LValue SharedLVal);
1400
1401   /// Emit code for 'taskwait' directive.
1402   virtual void emitTaskwaitCall(CodeGenFunction &CGF, SourceLocation Loc);
1403
1404   /// Emit code for 'cancellation point' construct.
1405   /// \param CancelRegion Region kind for which the cancellation point must be
1406   /// emitted.
1407   ///
1408   virtual void emitCancellationPointCall(CodeGenFunction &CGF,
1409                                          SourceLocation Loc,
1410                                          OpenMPDirectiveKind CancelRegion);
1411
1412   /// Emit code for 'cancel' construct.
1413   /// \param IfCond Condition in the associated 'if' clause, if it was
1414   /// specified, nullptr otherwise.
1415   /// \param CancelRegion Region kind for which the cancel must be emitted.
1416   ///
1417   virtual void emitCancelCall(CodeGenFunction &CGF, SourceLocation Loc,
1418                               const Expr *IfCond,
1419                               OpenMPDirectiveKind CancelRegion);
1420
1421   /// Emit outilined function for 'target' directive.
1422   /// \param D Directive to emit.
1423   /// \param ParentName Name of the function that encloses the target region.
1424   /// \param OutlinedFn Outlined function value to be defined by this call.
1425   /// \param OutlinedFnID Outlined function ID value to be defined by this call.
1426   /// \param IsOffloadEntry True if the outlined function is an offload entry.
1427   /// \param CodeGen Code generation sequence for the \a D directive.
1428   /// An outlined function may not be an entry if, e.g. the if clause always
1429   /// evaluates to false.
1430   virtual void emitTargetOutlinedFunction(const OMPExecutableDirective &D,
1431                                           StringRef ParentName,
1432                                           llvm::Function *&OutlinedFn,
1433                                           llvm::Constant *&OutlinedFnID,
1434                                           bool IsOffloadEntry,
1435                                           const RegionCodeGenTy &CodeGen);
1436
1437   /// Emit the target offloading code associated with \a D. The emitted
1438   /// code attempts offloading the execution to the device, an the event of
1439   /// a failure it executes the host version outlined in \a OutlinedFn.
1440   /// \param D Directive to emit.
1441   /// \param OutlinedFn Host version of the code to be offloaded.
1442   /// \param OutlinedFnID ID of host version of the code to be offloaded.
1443   /// \param IfCond Expression evaluated in if clause associated with the target
1444   /// directive, or null if no if clause is used.
1445   /// \param Device Expression evaluated in device clause associated with the
1446   /// target directive, or null if no device clause is used.
1447   /// \param SizeEmitter Callback to emit number of iterations for loop-based
1448   /// directives.
1449   virtual void
1450   emitTargetCall(CodeGenFunction &CGF, const OMPExecutableDirective &D,
1451                  llvm::Function *OutlinedFn, llvm::Value *OutlinedFnID,
1452                  const Expr *IfCond, const Expr *Device,
1453                  llvm::function_ref<llvm::Value *(CodeGenFunction &CGF,
1454                                                   const OMPLoopDirective &D)>
1455                      SizeEmitter);
1456
1457   /// Emit the target regions enclosed in \a GD function definition or
1458   /// the function itself in case it is a valid device function. Returns true if
1459   /// \a GD was dealt with successfully.
1460   /// \param GD Function to scan.
1461   virtual bool emitTargetFunctions(GlobalDecl GD);
1462
1463   /// Emit the global variable if it is a valid device global variable.
1464   /// Returns true if \a GD was dealt with successfully.
1465   /// \param GD Variable declaration to emit.
1466   virtual bool emitTargetGlobalVariable(GlobalDecl GD);
1467
1468   /// Checks if the provided global decl \a GD is a declare target variable and
1469   /// registers it when emitting code for the host.
1470   virtual void registerTargetGlobalVariable(const VarDecl *VD,
1471                                             llvm::Constant *Addr);
1472
1473   /// Registers provided target firstprivate variable as global on the
1474   /// target.
1475   llvm::Constant *registerTargetFirstprivateCopy(CodeGenFunction &CGF,
1476                                                  const VarDecl *VD);
1477
1478   /// Emit the global \a GD if it is meaningful for the target. Returns
1479   /// if it was emitted successfully.
1480   /// \param GD Global to scan.
1481   virtual bool emitTargetGlobal(GlobalDecl GD);
1482
1483   /// Creates and returns a registration function for when at least one
1484   /// requires directives was used in the current module.
1485   llvm::Function *emitRequiresDirectiveRegFun();
1486
1487   /// Creates all the offload entries in the current compilation unit
1488   /// along with the associated metadata.
1489   void createOffloadEntriesAndInfoMetadata();
1490
1491   /// Emits code for teams call of the \a OutlinedFn with
1492   /// variables captured in a record which address is stored in \a
1493   /// CapturedStruct.
1494   /// \param OutlinedFn Outlined function to be run by team masters. Type of
1495   /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
1496   /// \param CapturedVars A pointer to the record with the references to
1497   /// variables used in \a OutlinedFn function.
1498   ///
1499   virtual void emitTeamsCall(CodeGenFunction &CGF,
1500                              const OMPExecutableDirective &D,
1501                              SourceLocation Loc, llvm::Function *OutlinedFn,
1502                              ArrayRef<llvm::Value *> CapturedVars);
1503
1504   /// Emits call to void __kmpc_push_num_teams(ident_t *loc, kmp_int32
1505   /// global_tid, kmp_int32 num_teams, kmp_int32 thread_limit) to generate code
1506   /// for num_teams clause.
1507   /// \param NumTeams An integer expression of teams.
1508   /// \param ThreadLimit An integer expression of threads.
1509   virtual void emitNumTeamsClause(CodeGenFunction &CGF, const Expr *NumTeams,
1510                                   const Expr *ThreadLimit, SourceLocation Loc);
1511
1512   /// Struct that keeps all the relevant information that should be kept
1513   /// throughout a 'target data' region.
1514   class TargetDataInfo {
1515     /// Set to true if device pointer information have to be obtained.
1516     bool RequiresDevicePointerInfo = false;
1517
1518   public:
1519     /// The array of base pointer passed to the runtime library.
1520     llvm::Value *BasePointersArray = nullptr;
1521     /// The array of section pointers passed to the runtime library.
1522     llvm::Value *PointersArray = nullptr;
1523     /// The array of sizes passed to the runtime library.
1524     llvm::Value *SizesArray = nullptr;
1525     /// The array of map types passed to the runtime library.
1526     llvm::Value *MapTypesArray = nullptr;
1527     /// The total number of pointers passed to the runtime library.
1528     unsigned NumberOfPtrs = 0u;
1529     /// Map between the a declaration of a capture and the corresponding base
1530     /// pointer address where the runtime returns the device pointers.
1531     llvm::DenseMap<const ValueDecl *, Address> CaptureDeviceAddrMap;
1532
1533     explicit TargetDataInfo() {}
1534     explicit TargetDataInfo(bool RequiresDevicePointerInfo)
1535         : RequiresDevicePointerInfo(RequiresDevicePointerInfo) {}
1536     /// Clear information about the data arrays.
1537     void clearArrayInfo() {
1538       BasePointersArray = nullptr;
1539       PointersArray = nullptr;
1540       SizesArray = nullptr;
1541       MapTypesArray = nullptr;
1542       NumberOfPtrs = 0u;
1543     }
1544     /// Return true if the current target data information has valid arrays.
1545     bool isValid() {
1546       return BasePointersArray && PointersArray && SizesArray &&
1547              MapTypesArray && NumberOfPtrs;
1548     }
1549     bool requiresDevicePointerInfo() { return RequiresDevicePointerInfo; }
1550   };
1551
1552   /// Emit the target data mapping code associated with \a D.
1553   /// \param D Directive to emit.
1554   /// \param IfCond Expression evaluated in if clause associated with the
1555   /// target directive, or null if no device clause is used.
1556   /// \param Device Expression evaluated in device clause associated with the
1557   /// target directive, or null if no device clause is used.
1558   /// \param Info A record used to store information that needs to be preserved
1559   /// until the region is closed.
1560   virtual void emitTargetDataCalls(CodeGenFunction &CGF,
1561                                    const OMPExecutableDirective &D,
1562                                    const Expr *IfCond, const Expr *Device,
1563                                    const RegionCodeGenTy &CodeGen,
1564                                    TargetDataInfo &Info);
1565
1566   /// Emit the data mapping/movement code associated with the directive
1567   /// \a D that should be of the form 'target [{enter|exit} data | update]'.
1568   /// \param D Directive to emit.
1569   /// \param IfCond Expression evaluated in if clause associated with the target
1570   /// directive, or null if no if clause is used.
1571   /// \param Device Expression evaluated in device clause associated with the
1572   /// target directive, or null if no device clause is used.
1573   virtual void emitTargetDataStandAloneCall(CodeGenFunction &CGF,
1574                                             const OMPExecutableDirective &D,
1575                                             const Expr *IfCond,
1576                                             const Expr *Device);
1577
1578   /// Marks function \a Fn with properly mangled versions of vector functions.
1579   /// \param FD Function marked as 'declare simd'.
1580   /// \param Fn LLVM function that must be marked with 'declare simd'
1581   /// attributes.
1582   virtual void emitDeclareSimdFunction(const FunctionDecl *FD,
1583                                        llvm::Function *Fn);
1584
1585   /// Emit initialization for doacross loop nesting support.
1586   /// \param D Loop-based construct used in doacross nesting construct.
1587   virtual void emitDoacrossInit(CodeGenFunction &CGF, const OMPLoopDirective &D,
1588                                 ArrayRef<Expr *> NumIterations);
1589
1590   /// Emit code for doacross ordered directive with 'depend' clause.
1591   /// \param C 'depend' clause with 'sink|source' dependency kind.
1592   virtual void emitDoacrossOrdered(CodeGenFunction &CGF,
1593                                    const OMPDependClause *C);
1594
1595   /// Translates the native parameter of outlined function if this is required
1596   /// for target.
1597   /// \param FD Field decl from captured record for the parameter.
1598   /// \param NativeParam Parameter itself.
1599   virtual const VarDecl *translateParameter(const FieldDecl *FD,
1600                                             const VarDecl *NativeParam) const {
1601     return NativeParam;
1602   }
1603
1604   /// Gets the address of the native argument basing on the address of the
1605   /// target-specific parameter.
1606   /// \param NativeParam Parameter itself.
1607   /// \param TargetParam Corresponding target-specific parameter.
1608   virtual Address getParameterAddress(CodeGenFunction &CGF,
1609                                       const VarDecl *NativeParam,
1610                                       const VarDecl *TargetParam) const;
1611
1612   /// Choose default schedule type and chunk value for the
1613   /// dist_schedule clause.
1614   virtual void getDefaultDistScheduleAndChunk(CodeGenFunction &CGF,
1615       const OMPLoopDirective &S, OpenMPDistScheduleClauseKind &ScheduleKind,
1616       llvm::Value *&Chunk) const {}
1617
1618   /// Choose default schedule type and chunk value for the
1619   /// schedule clause.
1620   virtual void getDefaultScheduleAndChunk(CodeGenFunction &CGF,
1621       const OMPLoopDirective &S, OpenMPScheduleClauseKind &ScheduleKind,
1622       const Expr *&ChunkExpr) const;
1623
1624   /// Emits call of the outlined function with the provided arguments,
1625   /// translating these arguments to correct target-specific arguments.
1626   virtual void
1627   emitOutlinedFunctionCall(CodeGenFunction &CGF, SourceLocation Loc,
1628                            llvm::FunctionCallee OutlinedFn,
1629                            ArrayRef<llvm::Value *> Args = llvm::None) const;
1630
1631   /// Emits OpenMP-specific function prolog.
1632   /// Required for device constructs.
1633   virtual void emitFunctionProlog(CodeGenFunction &CGF, const Decl *D);
1634
1635   /// Gets the OpenMP-specific address of the local variable.
1636   virtual Address getAddressOfLocalVariable(CodeGenFunction &CGF,
1637                                             const VarDecl *VD);
1638
1639   /// Marks the declaration as already emitted for the device code and returns
1640   /// true, if it was marked already, and false, otherwise.
1641   bool markAsGlobalTarget(GlobalDecl GD);
1642
1643   /// Emit deferred declare target variables marked for deferred emission.
1644   void emitDeferredTargetDecls() const;
1645
1646   /// Adjust some parameters for the target-based directives, like addresses of
1647   /// the variables captured by reference in lambdas.
1648   virtual void
1649   adjustTargetSpecificDataForLambdas(CodeGenFunction &CGF,
1650                                      const OMPExecutableDirective &D) const;
1651
1652   /// Perform check on requires decl to ensure that target architecture
1653   /// supports unified addressing
1654   virtual void checkArchForUnifiedAddressing(const OMPRequiresDecl *D);
1655
1656   /// Checks if the variable has associated OMPAllocateDeclAttr attribute with
1657   /// the predefined allocator and translates it into the corresponding address
1658   /// space.
1659   virtual bool hasAllocateAttributeForGlobalVar(const VarDecl *VD, LangAS &AS);
1660
1661   /// Return whether the unified_shared_memory has been specified.
1662   bool hasRequiresUnifiedSharedMemory() const;
1663
1664   /// Emits the definition of the declare variant function.
1665   virtual bool emitDeclareVariant(GlobalDecl GD, bool IsForDefinition);
1666 };
1667
1668 /// Class supports emissionof SIMD-only code.
1669 class CGOpenMPSIMDRuntime final : public CGOpenMPRuntime {
1670 public:
1671   explicit CGOpenMPSIMDRuntime(CodeGenModule &CGM) : CGOpenMPRuntime(CGM) {}
1672   ~CGOpenMPSIMDRuntime() override {}
1673
1674   /// Emits outlined function for the specified OpenMP parallel directive
1675   /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
1676   /// kmp_int32 BoundID, struct context_vars*).
1677   /// \param D OpenMP directive.
1678   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
1679   /// \param InnermostKind Kind of innermost directive (for simple directives it
1680   /// is a directive itself, for combined - its innermost directive).
1681   /// \param CodeGen Code generation sequence for the \a D directive.
1682   llvm::Function *
1683   emitParallelOutlinedFunction(const OMPExecutableDirective &D,
1684                                const VarDecl *ThreadIDVar,
1685                                OpenMPDirectiveKind InnermostKind,
1686                                const RegionCodeGenTy &CodeGen) override;
1687
1688   /// Emits outlined function for the specified OpenMP teams directive
1689   /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
1690   /// kmp_int32 BoundID, struct context_vars*).
1691   /// \param D OpenMP directive.
1692   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
1693   /// \param InnermostKind Kind of innermost directive (for simple directives it
1694   /// is a directive itself, for combined - its innermost directive).
1695   /// \param CodeGen Code generation sequence for the \a D directive.
1696   llvm::Function *
1697   emitTeamsOutlinedFunction(const OMPExecutableDirective &D,
1698                             const VarDecl *ThreadIDVar,
1699                             OpenMPDirectiveKind InnermostKind,
1700                             const RegionCodeGenTy &CodeGen) override;
1701
1702   /// Emits outlined function for the OpenMP task directive \a D. This
1703   /// outlined function has type void(*)(kmp_int32 ThreadID, struct task_t*
1704   /// TaskT).
1705   /// \param D OpenMP directive.
1706   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
1707   /// \param PartIDVar Variable for partition id in the current OpenMP untied
1708   /// task region.
1709   /// \param TaskTVar Variable for task_t argument.
1710   /// \param InnermostKind Kind of innermost directive (for simple directives it
1711   /// is a directive itself, for combined - its innermost directive).
1712   /// \param CodeGen Code generation sequence for the \a D directive.
1713   /// \param Tied true if task is generated for tied task, false otherwise.
1714   /// \param NumberOfParts Number of parts in untied task. Ignored for tied
1715   /// tasks.
1716   ///
1717   llvm::Function *emitTaskOutlinedFunction(
1718       const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
1719       const VarDecl *PartIDVar, const VarDecl *TaskTVar,
1720       OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen,
1721       bool Tied, unsigned &NumberOfParts) override;
1722
1723   /// Emits code for parallel or serial call of the \a OutlinedFn with
1724   /// variables captured in a record which address is stored in \a
1725   /// CapturedStruct.
1726   /// \param OutlinedFn Outlined function to be run in parallel threads. Type of
1727   /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
1728   /// \param CapturedVars A pointer to the record with the references to
1729   /// variables used in \a OutlinedFn function.
1730   /// \param IfCond Condition in the associated 'if' clause, if it was
1731   /// specified, nullptr otherwise.
1732   ///
1733   void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
1734                         llvm::Function *OutlinedFn,
1735                         ArrayRef<llvm::Value *> CapturedVars,
1736                         const Expr *IfCond) override;
1737
1738   /// Emits a critical region.
1739   /// \param CriticalName Name of the critical region.
1740   /// \param CriticalOpGen Generator for the statement associated with the given
1741   /// critical region.
1742   /// \param Hint Value of the 'hint' clause (optional).
1743   void emitCriticalRegion(CodeGenFunction &CGF, StringRef CriticalName,
1744                           const RegionCodeGenTy &CriticalOpGen,
1745                           SourceLocation Loc,
1746                           const Expr *Hint = nullptr) override;
1747
1748   /// Emits a master region.
1749   /// \param MasterOpGen Generator for the statement associated with the given
1750   /// master region.
1751   void emitMasterRegion(CodeGenFunction &CGF,
1752                         const RegionCodeGenTy &MasterOpGen,
1753                         SourceLocation Loc) override;
1754
1755   /// Emits code for a taskyield directive.
1756   void emitTaskyieldCall(CodeGenFunction &CGF, SourceLocation Loc) override;
1757
1758   /// Emit a taskgroup region.
1759   /// \param TaskgroupOpGen Generator for the statement associated with the
1760   /// given taskgroup region.
1761   void emitTaskgroupRegion(CodeGenFunction &CGF,
1762                            const RegionCodeGenTy &TaskgroupOpGen,
1763                            SourceLocation Loc) override;
1764
1765   /// Emits a single region.
1766   /// \param SingleOpGen Generator for the statement associated with the given
1767   /// single region.
1768   void emitSingleRegion(CodeGenFunction &CGF,
1769                         const RegionCodeGenTy &SingleOpGen, SourceLocation Loc,
1770                         ArrayRef<const Expr *> CopyprivateVars,
1771                         ArrayRef<const Expr *> DestExprs,
1772                         ArrayRef<const Expr *> SrcExprs,
1773                         ArrayRef<const Expr *> AssignmentOps) override;
1774
1775   /// Emit an ordered region.
1776   /// \param OrderedOpGen Generator for the statement associated with the given
1777   /// ordered region.
1778   void emitOrderedRegion(CodeGenFunction &CGF,
1779                          const RegionCodeGenTy &OrderedOpGen,
1780                          SourceLocation Loc, bool IsThreads) override;
1781
1782   /// Emit an implicit/explicit barrier for OpenMP threads.
1783   /// \param Kind Directive for which this implicit barrier call must be
1784   /// generated. Must be OMPD_barrier for explicit barrier generation.
1785   /// \param EmitChecks true if need to emit checks for cancellation barriers.
1786   /// \param ForceSimpleCall true simple barrier call must be emitted, false if
1787   /// runtime class decides which one to emit (simple or with cancellation
1788   /// checks).
1789   ///
1790   void emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
1791                        OpenMPDirectiveKind Kind, bool EmitChecks = true,
1792                        bool ForceSimpleCall = false) override;
1793
1794   /// This is used for non static scheduled types and when the ordered
1795   /// clause is present on the loop construct.
1796   /// Depending on the loop schedule, it is necessary to call some runtime
1797   /// routine before start of the OpenMP loop to get the loop upper / lower
1798   /// bounds \a LB and \a UB and stride \a ST.
1799   ///
1800   /// \param CGF Reference to current CodeGenFunction.
1801   /// \param Loc Clang source location.
1802   /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
1803   /// \param IVSize Size of the iteration variable in bits.
1804   /// \param IVSigned Sign of the iteration variable.
1805   /// \param Ordered true if loop is ordered, false otherwise.
1806   /// \param DispatchValues struct containing llvm values for lower bound, upper
1807   /// bound, and chunk expression.
1808   /// For the default (nullptr) value, the chunk 1 will be used.
1809   ///
1810   void emitForDispatchInit(CodeGenFunction &CGF, SourceLocation Loc,
1811                            const OpenMPScheduleTy &ScheduleKind,
1812                            unsigned IVSize, bool IVSigned, bool Ordered,
1813                            const DispatchRTInput &DispatchValues) override;
1814
1815   /// Call the appropriate runtime routine to initialize it before start
1816   /// of loop.
1817   ///
1818   /// This is used only in case of static schedule, when the user did not
1819   /// specify a ordered clause on the loop construct.
1820   /// Depending on the loop schedule, it is necessary to call some runtime
1821   /// routine before start of the OpenMP loop to get the loop upper / lower
1822   /// bounds LB and UB and stride ST.
1823   ///
1824   /// \param CGF Reference to current CodeGenFunction.
1825   /// \param Loc Clang source location.
1826   /// \param DKind Kind of the directive.
1827   /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
1828   /// \param Values Input arguments for the construct.
1829   ///
1830   void emitForStaticInit(CodeGenFunction &CGF, SourceLocation Loc,
1831                          OpenMPDirectiveKind DKind,
1832                          const OpenMPScheduleTy &ScheduleKind,
1833                          const StaticRTInput &Values) override;
1834
1835   ///
1836   /// \param CGF Reference to current CodeGenFunction.
1837   /// \param Loc Clang source location.
1838   /// \param SchedKind Schedule kind, specified by the 'dist_schedule' clause.
1839   /// \param Values Input arguments for the construct.
1840   ///
1841   void emitDistributeStaticInit(CodeGenFunction &CGF, SourceLocation Loc,
1842                                 OpenMPDistScheduleClauseKind SchedKind,
1843                                 const StaticRTInput &Values) override;
1844
1845   /// Call the appropriate runtime routine to notify that we finished
1846   /// iteration of the ordered loop with the dynamic scheduling.
1847   ///
1848   /// \param CGF Reference to current CodeGenFunction.
1849   /// \param Loc Clang source location.
1850   /// \param IVSize Size of the iteration variable in bits.
1851   /// \param IVSigned Sign of the iteration variable.
1852   ///
1853   void emitForOrderedIterationEnd(CodeGenFunction &CGF, SourceLocation Loc,
1854                                   unsigned IVSize, bool IVSigned) override;
1855
1856   /// Call the appropriate runtime routine to notify that we finished
1857   /// all the work with current loop.
1858   ///
1859   /// \param CGF Reference to current CodeGenFunction.
1860   /// \param Loc Clang source location.
1861   /// \param DKind Kind of the directive for which the static finish is emitted.
1862   ///
1863   void emitForStaticFinish(CodeGenFunction &CGF, SourceLocation Loc,
1864                            OpenMPDirectiveKind DKind) override;
1865
1866   /// Call __kmpc_dispatch_next(
1867   ///          ident_t *loc, kmp_int32 tid, kmp_int32 *p_lastiter,
1868   ///          kmp_int[32|64] *p_lower, kmp_int[32|64] *p_upper,
1869   ///          kmp_int[32|64] *p_stride);
1870   /// \param IVSize Size of the iteration variable in bits.
1871   /// \param IVSigned Sign of the iteration variable.
1872   /// \param IL Address of the output variable in which the flag of the
1873   /// last iteration is returned.
1874   /// \param LB Address of the output variable in which the lower iteration
1875   /// number is returned.
1876   /// \param UB Address of the output variable in which the upper iteration
1877   /// number is returned.
1878   /// \param ST Address of the output variable in which the stride value is
1879   /// returned.
1880   llvm::Value *emitForNext(CodeGenFunction &CGF, SourceLocation Loc,
1881                            unsigned IVSize, bool IVSigned, Address IL,
1882                            Address LB, Address UB, Address ST) override;
1883
1884   /// Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32
1885   /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads'
1886   /// clause.
1887   /// \param NumThreads An integer value of threads.
1888   void emitNumThreadsClause(CodeGenFunction &CGF, llvm::Value *NumThreads,
1889                             SourceLocation Loc) override;
1890
1891   /// Emit call to void __kmpc_push_proc_bind(ident_t *loc, kmp_int32
1892   /// global_tid, int proc_bind) to generate code for 'proc_bind' clause.
1893   void emitProcBindClause(CodeGenFunction &CGF,
1894                           OpenMPProcBindClauseKind ProcBind,
1895                           SourceLocation Loc) override;
1896
1897   /// Returns address of the threadprivate variable for the current
1898   /// thread.
1899   /// \param VD Threadprivate variable.
1900   /// \param VDAddr Address of the global variable \a VD.
1901   /// \param Loc Location of the reference to threadprivate var.
1902   /// \return Address of the threadprivate variable for the current thread.
1903   Address getAddrOfThreadPrivate(CodeGenFunction &CGF, const VarDecl *VD,
1904                                  Address VDAddr, SourceLocation Loc) override;
1905
1906   /// Emit a code for initialization of threadprivate variable. It emits
1907   /// a call to runtime library which adds initial value to the newly created
1908   /// threadprivate variable (if it is not constant) and registers destructor
1909   /// for the variable (if any).
1910   /// \param VD Threadprivate variable.
1911   /// \param VDAddr Address of the global variable \a VD.
1912   /// \param Loc Location of threadprivate declaration.
1913   /// \param PerformInit true if initialization expression is not constant.
1914   llvm::Function *
1915   emitThreadPrivateVarDefinition(const VarDecl *VD, Address VDAddr,
1916                                  SourceLocation Loc, bool PerformInit,
1917                                  CodeGenFunction *CGF = nullptr) override;
1918
1919   /// Creates artificial threadprivate variable with name \p Name and type \p
1920   /// VarType.
1921   /// \param VarType Type of the artificial threadprivate variable.
1922   /// \param Name Name of the artificial threadprivate variable.
1923   Address getAddrOfArtificialThreadPrivate(CodeGenFunction &CGF,
1924                                            QualType VarType,
1925                                            StringRef Name) override;
1926
1927   /// Emit flush of the variables specified in 'omp flush' directive.
1928   /// \param Vars List of variables to flush.
1929   void emitFlush(CodeGenFunction &CGF, ArrayRef<const Expr *> Vars,
1930                  SourceLocation Loc) override;
1931
1932   /// Emit task region for the task directive. The task region is
1933   /// emitted in several steps:
1934   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
1935   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
1936   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
1937   /// function:
1938   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
1939   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
1940   ///   return 0;
1941   /// }
1942   /// 2. Copy a list of shared variables to field shareds of the resulting
1943   /// structure kmp_task_t returned by the previous call (if any).
1944   /// 3. Copy a pointer to destructions function to field destructions of the
1945   /// resulting structure kmp_task_t.
1946   /// 4. Emit a call to kmp_int32 __kmpc_omp_task(ident_t *, kmp_int32 gtid,
1947   /// kmp_task_t *new_task), where new_task is a resulting structure from
1948   /// previous items.
1949   /// \param D Current task directive.
1950   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
1951   /// /*part_id*/, captured_struct */*__context*/);
1952   /// \param SharedsTy A type which contains references the shared variables.
1953   /// \param Shareds Context with the list of shared variables from the \p
1954   /// TaskFunction.
1955   /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
1956   /// otherwise.
1957   /// \param Data Additional data for task generation like tiednsee, final
1958   /// state, list of privates etc.
1959   void emitTaskCall(CodeGenFunction &CGF, SourceLocation Loc,
1960                     const OMPExecutableDirective &D,
1961                     llvm::Function *TaskFunction, QualType SharedsTy,
1962                     Address Shareds, const Expr *IfCond,
1963                     const OMPTaskDataTy &Data) override;
1964
1965   /// Emit task region for the taskloop directive. The taskloop region is
1966   /// emitted in several steps:
1967   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
1968   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
1969   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
1970   /// function:
1971   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
1972   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
1973   ///   return 0;
1974   /// }
1975   /// 2. Copy a list of shared variables to field shareds of the resulting
1976   /// structure kmp_task_t returned by the previous call (if any).
1977   /// 3. Copy a pointer to destructions function to field destructions of the
1978   /// resulting structure kmp_task_t.
1979   /// 4. Emit a call to void __kmpc_taskloop(ident_t *loc, int gtid, kmp_task_t
1980   /// *task, int if_val, kmp_uint64 *lb, kmp_uint64 *ub, kmp_int64 st, int
1981   /// nogroup, int sched, kmp_uint64 grainsize, void *task_dup ), where new_task
1982   /// is a resulting structure from
1983   /// previous items.
1984   /// \param D Current task directive.
1985   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
1986   /// /*part_id*/, captured_struct */*__context*/);
1987   /// \param SharedsTy A type which contains references the shared variables.
1988   /// \param Shareds Context with the list of shared variables from the \p
1989   /// TaskFunction.
1990   /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
1991   /// otherwise.
1992   /// \param Data Additional data for task generation like tiednsee, final
1993   /// state, list of privates etc.
1994   void emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
1995                         const OMPLoopDirective &D, llvm::Function *TaskFunction,
1996                         QualType SharedsTy, Address Shareds, const Expr *IfCond,
1997                         const OMPTaskDataTy &Data) override;
1998
1999   /// Emit a code for reduction clause. Next code should be emitted for
2000   /// reduction:
2001   /// \code
2002   ///
2003   /// static kmp_critical_name lock = { 0 };
2004   ///
2005   /// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
2006   ///  ...
2007   ///  *(Type<i>*)lhs[i] = RedOp<i>(*(Type<i>*)lhs[i], *(Type<i>*)rhs[i]);
2008   ///  ...
2009   /// }
2010   ///
2011   /// ...
2012   /// void *RedList[<n>] = {&<RHSExprs>[0], ..., &<RHSExprs>[<n>-1]};
2013   /// switch (__kmpc_reduce{_nowait}(<loc>, <gtid>, <n>, sizeof(RedList),
2014   /// RedList, reduce_func, &<lock>)) {
2015   /// case 1:
2016   ///  ...
2017   ///  <LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]);
2018   ///  ...
2019   /// __kmpc_end_reduce{_nowait}(<loc>, <gtid>, &<lock>);
2020   /// break;
2021   /// case 2:
2022   ///  ...
2023   ///  Atomic(<LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]));
2024   ///  ...
2025   /// break;
2026   /// default:;
2027   /// }
2028   /// \endcode
2029   ///
2030   /// \param Privates List of private copies for original reduction arguments.
2031   /// \param LHSExprs List of LHS in \a ReductionOps reduction operations.
2032   /// \param RHSExprs List of RHS in \a ReductionOps reduction operations.
2033   /// \param ReductionOps List of reduction operations in form 'LHS binop RHS'
2034   /// or 'operator binop(LHS, RHS)'.
2035   /// \param Options List of options for reduction codegen:
2036   ///     WithNowait true if parent directive has also nowait clause, false
2037   ///     otherwise.
2038   ///     SimpleReduction Emit reduction operation only. Used for omp simd
2039   ///     directive on the host.
2040   ///     ReductionKind The kind of reduction to perform.
2041   void emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
2042                      ArrayRef<const Expr *> Privates,
2043                      ArrayRef<const Expr *> LHSExprs,
2044                      ArrayRef<const Expr *> RHSExprs,
2045                      ArrayRef<const Expr *> ReductionOps,
2046                      ReductionOptionsTy Options) override;
2047
2048   /// Emit a code for initialization of task reduction clause. Next code
2049   /// should be emitted for reduction:
2050   /// \code
2051   ///
2052   /// _task_red_item_t red_data[n];
2053   /// ...
2054   /// red_data[i].shar = &origs[i];
2055   /// red_data[i].size = sizeof(origs[i]);
2056   /// red_data[i].f_init = (void*)RedInit<i>;
2057   /// red_data[i].f_fini = (void*)RedDest<i>;
2058   /// red_data[i].f_comb = (void*)RedOp<i>;
2059   /// red_data[i].flags = <Flag_i>;
2060   /// ...
2061   /// void* tg1 = __kmpc_task_reduction_init(gtid, n, red_data);
2062   /// \endcode
2063   ///
2064   /// \param LHSExprs List of LHS in \a Data.ReductionOps reduction operations.
2065   /// \param RHSExprs List of RHS in \a Data.ReductionOps reduction operations.
2066   /// \param Data Additional data for task generation like tiedness, final
2067   /// state, list of privates, reductions etc.
2068   llvm::Value *emitTaskReductionInit(CodeGenFunction &CGF, SourceLocation Loc,
2069                                      ArrayRef<const Expr *> LHSExprs,
2070                                      ArrayRef<const Expr *> RHSExprs,
2071                                      const OMPTaskDataTy &Data) override;
2072
2073   /// Required to resolve existing problems in the runtime. Emits threadprivate
2074   /// variables to store the size of the VLAs/array sections for
2075   /// initializer/combiner/finalizer functions + emits threadprivate variable to
2076   /// store the pointer to the original reduction item for the custom
2077   /// initializer defined by declare reduction construct.
2078   /// \param RCG Allows to reuse an existing data for the reductions.
2079   /// \param N Reduction item for which fixups must be emitted.
2080   void emitTaskReductionFixups(CodeGenFunction &CGF, SourceLocation Loc,
2081                                ReductionCodeGen &RCG, unsigned N) override;
2082
2083   /// Get the address of `void *` type of the privatue copy of the reduction
2084   /// item specified by the \p SharedLVal.
2085   /// \param ReductionsPtr Pointer to the reduction data returned by the
2086   /// emitTaskReductionInit function.
2087   /// \param SharedLVal Address of the original reduction item.
2088   Address getTaskReductionItem(CodeGenFunction &CGF, SourceLocation Loc,
2089                                llvm::Value *ReductionsPtr,
2090                                LValue SharedLVal) override;
2091
2092   /// Emit code for 'taskwait' directive.
2093   void emitTaskwaitCall(CodeGenFunction &CGF, SourceLocation Loc) override;
2094
2095   /// Emit code for 'cancellation point' construct.
2096   /// \param CancelRegion Region kind for which the cancellation point must be
2097   /// emitted.
2098   ///
2099   void emitCancellationPointCall(CodeGenFunction &CGF, SourceLocation Loc,
2100                                  OpenMPDirectiveKind CancelRegion) override;
2101
2102   /// Emit code for 'cancel' construct.
2103   /// \param IfCond Condition in the associated 'if' clause, if it was
2104   /// specified, nullptr otherwise.
2105   /// \param CancelRegion Region kind for which the cancel must be emitted.
2106   ///
2107   void emitCancelCall(CodeGenFunction &CGF, SourceLocation Loc,
2108                       const Expr *IfCond,
2109                       OpenMPDirectiveKind CancelRegion) override;
2110
2111   /// Emit outilined function for 'target' directive.
2112   /// \param D Directive to emit.
2113   /// \param ParentName Name of the function that encloses the target region.
2114   /// \param OutlinedFn Outlined function value to be defined by this call.
2115   /// \param OutlinedFnID Outlined function ID value to be defined by this call.
2116   /// \param IsOffloadEntry True if the outlined function is an offload entry.
2117   /// \param CodeGen Code generation sequence for the \a D directive.
2118   /// An outlined function may not be an entry if, e.g. the if clause always
2119   /// evaluates to false.
2120   void emitTargetOutlinedFunction(const OMPExecutableDirective &D,
2121                                   StringRef ParentName,
2122                                   llvm::Function *&OutlinedFn,
2123                                   llvm::Constant *&OutlinedFnID,
2124                                   bool IsOffloadEntry,
2125                                   const RegionCodeGenTy &CodeGen) override;
2126
2127   /// Emit the target offloading code associated with \a D. The emitted
2128   /// code attempts offloading the execution to the device, an the event of
2129   /// a failure it executes the host version outlined in \a OutlinedFn.
2130   /// \param D Directive to emit.
2131   /// \param OutlinedFn Host version of the code to be offloaded.
2132   /// \param OutlinedFnID ID of host version of the code to be offloaded.
2133   /// \param IfCond Expression evaluated in if clause associated with the target
2134   /// directive, or null if no if clause is used.
2135   /// \param Device Expression evaluated in device clause associated with the
2136   /// target directive, or null if no device clause is used.
2137   void
2138   emitTargetCall(CodeGenFunction &CGF, const OMPExecutableDirective &D,
2139                  llvm::Function *OutlinedFn, llvm::Value *OutlinedFnID,
2140                  const Expr *IfCond, const Expr *Device,
2141                  llvm::function_ref<llvm::Value *(CodeGenFunction &CGF,
2142                                                   const OMPLoopDirective &D)>
2143                      SizeEmitter) override;
2144
2145   /// Emit the target regions enclosed in \a GD function definition or
2146   /// the function itself in case it is a valid device function. Returns true if
2147   /// \a GD was dealt with successfully.
2148   /// \param GD Function to scan.
2149   bool emitTargetFunctions(GlobalDecl GD) override;
2150
2151   /// Emit the global variable if it is a valid device global variable.
2152   /// Returns true if \a GD was dealt with successfully.
2153   /// \param GD Variable declaration to emit.
2154   bool emitTargetGlobalVariable(GlobalDecl GD) override;
2155
2156   /// Emit the global \a GD if it is meaningful for the target. Returns
2157   /// if it was emitted successfully.
2158   /// \param GD Global to scan.
2159   bool emitTargetGlobal(GlobalDecl GD) override;
2160
2161   /// Emits code for teams call of the \a OutlinedFn with
2162   /// variables captured in a record which address is stored in \a
2163   /// CapturedStruct.
2164   /// \param OutlinedFn Outlined function to be run by team masters. Type of
2165   /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
2166   /// \param CapturedVars A pointer to the record with the references to
2167   /// variables used in \a OutlinedFn function.
2168   ///
2169   void emitTeamsCall(CodeGenFunction &CGF, const OMPExecutableDirective &D,
2170                      SourceLocation Loc, llvm::Function *OutlinedFn,
2171                      ArrayRef<llvm::Value *> CapturedVars) override;
2172
2173   /// Emits call to void __kmpc_push_num_teams(ident_t *loc, kmp_int32
2174   /// global_tid, kmp_int32 num_teams, kmp_int32 thread_limit) to generate code
2175   /// for num_teams clause.
2176   /// \param NumTeams An integer expression of teams.
2177   /// \param ThreadLimit An integer expression of threads.
2178   void emitNumTeamsClause(CodeGenFunction &CGF, const Expr *NumTeams,
2179                           const Expr *ThreadLimit, SourceLocation Loc) override;
2180
2181   /// Emit the target data mapping code associated with \a D.
2182   /// \param D Directive to emit.
2183   /// \param IfCond Expression evaluated in if clause associated with the
2184   /// target directive, or null if no device clause is used.
2185   /// \param Device Expression evaluated in device clause associated with the
2186   /// target directive, or null if no device clause is used.
2187   /// \param Info A record used to store information that needs to be preserved
2188   /// until the region is closed.
2189   void emitTargetDataCalls(CodeGenFunction &CGF,
2190                            const OMPExecutableDirective &D, const Expr *IfCond,
2191                            const Expr *Device, const RegionCodeGenTy &CodeGen,
2192                            TargetDataInfo &Info) override;
2193
2194   /// Emit the data mapping/movement code associated with the directive
2195   /// \a D that should be of the form 'target [{enter|exit} data | update]'.
2196   /// \param D Directive to emit.
2197   /// \param IfCond Expression evaluated in if clause associated with the target
2198   /// directive, or null if no if clause is used.
2199   /// \param Device Expression evaluated in device clause associated with the
2200   /// target directive, or null if no device clause is used.
2201   void emitTargetDataStandAloneCall(CodeGenFunction &CGF,
2202                                     const OMPExecutableDirective &D,
2203                                     const Expr *IfCond,
2204                                     const Expr *Device) override;
2205
2206   /// Emit initialization for doacross loop nesting support.
2207   /// \param D Loop-based construct used in doacross nesting construct.
2208   void emitDoacrossInit(CodeGenFunction &CGF, const OMPLoopDirective &D,
2209                         ArrayRef<Expr *> NumIterations) override;
2210
2211   /// Emit code for doacross ordered directive with 'depend' clause.
2212   /// \param C 'depend' clause with 'sink|source' dependency kind.
2213   void emitDoacrossOrdered(CodeGenFunction &CGF,
2214                            const OMPDependClause *C) override;
2215
2216   /// Translates the native parameter of outlined function if this is required
2217   /// for target.
2218   /// \param FD Field decl from captured record for the parameter.
2219   /// \param NativeParam Parameter itself.
2220   const VarDecl *translateParameter(const FieldDecl *FD,
2221                                     const VarDecl *NativeParam) const override;
2222
2223   /// Gets the address of the native argument basing on the address of the
2224   /// target-specific parameter.
2225   /// \param NativeParam Parameter itself.
2226   /// \param TargetParam Corresponding target-specific parameter.
2227   Address getParameterAddress(CodeGenFunction &CGF, const VarDecl *NativeParam,
2228                               const VarDecl *TargetParam) const override;
2229
2230   /// Gets the OpenMP-specific address of the local variable.
2231   Address getAddressOfLocalVariable(CodeGenFunction &CGF,
2232                                     const VarDecl *VD) override {
2233     return Address::invalid();
2234   }
2235 };
2236
2237 } // namespace CodeGen
2238 } // namespace clang
2239
2240 #endif