1 //===----- CGOpenMPRuntime.h - Interface to OpenMP Runtimes -----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This provides a class for OpenMP runtime code generation. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_LIB_CODEGEN_CGOPENMPRUNTIME_H 15 #define LLVM_CLANG_LIB_CODEGEN_CGOPENMPRUNTIME_H 16 17 #include "clang/AST/Type.h" 18 #include "clang/Basic/OpenMPKinds.h" 19 #include "clang/Basic/SourceLocation.h" 20 #include "llvm/ADT/DenseMap.h" 21 #include "llvm/ADT/DenseSet.h" 22 #include "llvm/ADT/StringMap.h" 23 #include "llvm/IR/ValueHandle.h" 24 25 namespace llvm { 26 class ArrayType; 27 class Constant; 28 class Function; 29 class FunctionType; 30 class GlobalVariable; 31 class StructType; 32 class Type; 33 class Value; 34 } // namespace llvm 35 36 namespace clang { 37 class Expr; 38 class OMPExecutableDirective; 39 class VarDecl; 40 41 namespace CodeGen { 42 43 class CodeGenFunction; 44 class CodeGenModule; 45 46 typedef llvm::function_ref<void(CodeGenFunction &)> RegionCodeGenTy; 47 48 class CGOpenMPRuntime { 49 private: 50 enum OpenMPRTLFunction { 51 /// \brief Call to void __kmpc_fork_call(ident_t *loc, kmp_int32 argc, 52 /// kmpc_micro microtask, ...); 53 OMPRTL__kmpc_fork_call, 54 /// \brief Call to void *__kmpc_threadprivate_cached(ident_t *loc, 55 /// kmp_int32 global_tid, void *data, size_t size, void ***cache); 56 OMPRTL__kmpc_threadprivate_cached, 57 /// \brief Call to void __kmpc_threadprivate_register( ident_t *, 58 /// void *data, kmpc_ctor ctor, kmpc_cctor cctor, kmpc_dtor dtor); 59 OMPRTL__kmpc_threadprivate_register, 60 // Call to __kmpc_int32 kmpc_global_thread_num(ident_t *loc); 61 OMPRTL__kmpc_global_thread_num, 62 // Call to void __kmpc_critical(ident_t *loc, kmp_int32 global_tid, 63 // kmp_critical_name *crit); 64 OMPRTL__kmpc_critical, 65 // Call to void __kmpc_end_critical(ident_t *loc, kmp_int32 global_tid, 66 // kmp_critical_name *crit); 67 OMPRTL__kmpc_end_critical, 68 // Call to kmp_int32 __kmpc_cancel_barrier(ident_t *loc, kmp_int32 69 // global_tid); 70 OMPRTL__kmpc_cancel_barrier, 71 // Call to void __kmpc_for_static_fini(ident_t *loc, kmp_int32 global_tid); 72 OMPRTL__kmpc_for_static_fini, 73 // Call to void __kmpc_serialized_parallel(ident_t *loc, kmp_int32 74 // global_tid); 75 OMPRTL__kmpc_serialized_parallel, 76 // Call to void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 77 // global_tid); 78 OMPRTL__kmpc_end_serialized_parallel, 79 // Call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32 global_tid, 80 // kmp_int32 num_threads); 81 OMPRTL__kmpc_push_num_threads, 82 // Call to void __kmpc_flush(ident_t *loc); 83 OMPRTL__kmpc_flush, 84 // Call to kmp_int32 __kmpc_master(ident_t *, kmp_int32 global_tid); 85 OMPRTL__kmpc_master, 86 // Call to void __kmpc_end_master(ident_t *, kmp_int32 global_tid); 87 OMPRTL__kmpc_end_master, 88 // Call to kmp_int32 __kmpc_omp_taskyield(ident_t *, kmp_int32 global_tid, 89 // int end_part); 90 OMPRTL__kmpc_omp_taskyield, 91 // Call to kmp_int32 __kmpc_single(ident_t *, kmp_int32 global_tid); 92 OMPRTL__kmpc_single, 93 // Call to void __kmpc_end_single(ident_t *, kmp_int32 global_tid); 94 OMPRTL__kmpc_end_single, 95 // Call to kmp_task_t * __kmpc_omp_task_alloc(ident_t *, kmp_int32 gtid, 96 // kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds, 97 // kmp_routine_entry_t *task_entry); 98 OMPRTL__kmpc_omp_task_alloc, 99 // Call to kmp_int32 __kmpc_omp_task(ident_t *, kmp_int32 gtid, kmp_task_t * 100 // new_task); 101 OMPRTL__kmpc_omp_task, 102 // Call to void __kmpc_copyprivate(ident_t *loc, kmp_int32 global_tid, 103 // kmp_int32 cpy_size, void *cpy_data, void(*cpy_func)(void *, void *), 104 // kmp_int32 didit); 105 OMPRTL__kmpc_copyprivate, 106 // Call to kmp_int32 __kmpc_reduce(ident_t *loc, kmp_int32 global_tid, 107 // kmp_int32 num_vars, size_t reduce_size, void *reduce_data, void 108 // (*reduce_func)(void *lhs_data, void *rhs_data), kmp_critical_name *lck); 109 OMPRTL__kmpc_reduce, 110 // Call to kmp_int32 __kmpc_reduce_nowait(ident_t *loc, kmp_int32 111 // global_tid, kmp_int32 num_vars, size_t reduce_size, void *reduce_data, 112 // void (*reduce_func)(void *lhs_data, void *rhs_data), kmp_critical_name 113 // *lck); 114 OMPRTL__kmpc_reduce_nowait, 115 // Call to void __kmpc_end_reduce(ident_t *loc, kmp_int32 global_tid, 116 // kmp_critical_name *lck); 117 OMPRTL__kmpc_end_reduce, 118 // Call to void __kmpc_end_reduce_nowait(ident_t *loc, kmp_int32 global_tid, 119 // kmp_critical_name *lck); 120 OMPRTL__kmpc_end_reduce_nowait, 121 }; 122 123 /// \brief Values for bit flags used in the ident_t to describe the fields. 124 /// All enumeric elements are named and described in accordance with the code 125 /// from http://llvm.org/svn/llvm-project/openmp/trunk/runtime/src/kmp.h 126 enum OpenMPLocationFlags { 127 /// \brief Use trampoline for internal microtask. 128 OMP_IDENT_IMD = 0x01, 129 /// \brief Use c-style ident structure. 130 OMP_IDENT_KMPC = 0x02, 131 /// \brief Atomic reduction option for kmpc_reduce. 132 OMP_ATOMIC_REDUCE = 0x10, 133 /// \brief Explicit 'barrier' directive. 134 OMP_IDENT_BARRIER_EXPL = 0x20, 135 /// \brief Implicit barrier in code. 136 OMP_IDENT_BARRIER_IMPL = 0x40, 137 /// \brief Implicit barrier in 'for' directive. 138 OMP_IDENT_BARRIER_IMPL_FOR = 0x40, 139 /// \brief Implicit barrier in 'sections' directive. 140 OMP_IDENT_BARRIER_IMPL_SECTIONS = 0xC0, 141 /// \brief Implicit barrier in 'single' directive. 142 OMP_IDENT_BARRIER_IMPL_SINGLE = 0x140 143 }; 144 CodeGenModule &CGM; 145 /// \brief Default const ident_t object used for initialization of all other 146 /// ident_t objects. 147 llvm::Constant *DefaultOpenMPPSource; 148 /// \brief Map of flags and corresponding default locations. 149 typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDefaultLocMapTy; 150 OpenMPDefaultLocMapTy OpenMPDefaultLocMap; 151 llvm::Value *getOrCreateDefaultLocation(OpenMPLocationFlags Flags); 152 /// \brief Describes ident structure that describes a source location. 153 /// All descriptions are taken from 154 /// http://llvm.org/svn/llvm-project/openmp/trunk/runtime/src/kmp.h 155 /// Original structure: 156 /// typedef struct ident { 157 /// kmp_int32 reserved_1; /**< might be used in Fortran; 158 /// see above */ 159 /// kmp_int32 flags; /**< also f.flags; KMP_IDENT_xxx flags; 160 /// KMP_IDENT_KMPC identifies this union 161 /// member */ 162 /// kmp_int32 reserved_2; /**< not really used in Fortran any more; 163 /// see above */ 164 ///#if USE_ITT_BUILD 165 /// /* but currently used for storing 166 /// region-specific ITT */ 167 /// /* contextual information. */ 168 ///#endif /* USE_ITT_BUILD */ 169 /// kmp_int32 reserved_3; /**< source[4] in Fortran, do not use for 170 /// C++ */ 171 /// char const *psource; /**< String describing the source location. 172 /// The string is composed of semi-colon separated 173 // fields which describe the source file, 174 /// the function and a pair of line numbers that 175 /// delimit the construct. 176 /// */ 177 /// } ident_t; 178 enum IdentFieldIndex { 179 /// \brief might be used in Fortran 180 IdentField_Reserved_1, 181 /// \brief OMP_IDENT_xxx flags; OMP_IDENT_KMPC identifies this union member. 182 IdentField_Flags, 183 /// \brief Not really used in Fortran any more 184 IdentField_Reserved_2, 185 /// \brief Source[4] in Fortran, do not use for C++ 186 IdentField_Reserved_3, 187 /// \brief String describing the source location. The string is composed of 188 /// semi-colon separated fields which describe the source file, the function 189 /// and a pair of line numbers that delimit the construct. 190 IdentField_PSource 191 }; 192 llvm::StructType *IdentTy; 193 /// \brief Map for SourceLocation and OpenMP runtime library debug locations. 194 typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDebugLocMapTy; 195 OpenMPDebugLocMapTy OpenMPDebugLocMap; 196 /// \brief The type for a microtask which gets passed to __kmpc_fork_call(). 197 /// Original representation is: 198 /// typedef void (kmpc_micro)(kmp_int32 global_tid, kmp_int32 bound_tid,...); 199 llvm::FunctionType *Kmpc_MicroTy; 200 /// \brief Stores debug location and ThreadID for the function. 201 struct DebugLocThreadIdTy { 202 llvm::Value *DebugLoc; 203 llvm::Value *ThreadID; 204 }; 205 /// \brief Map of local debug location, ThreadId and functions. 206 typedef llvm::DenseMap<llvm::Function *, DebugLocThreadIdTy> 207 OpenMPLocThreadIDMapTy; 208 OpenMPLocThreadIDMapTy OpenMPLocThreadIDMap; 209 /// \brief Type kmp_critical_name, originally defined as typedef kmp_int32 210 /// kmp_critical_name[8]; 211 llvm::ArrayType *KmpCriticalNameTy; 212 /// \brief An ordered map of auto-generated variables to their unique names. 213 /// It stores variables with the following names: 1) ".gomp_critical_user_" + 214 /// <critical_section_name> + ".var" for "omp critical" directives; 2) 215 /// <mangled_name_for_global_var> + ".cache." for cache for threadprivate 216 /// variables. 217 llvm::StringMap<llvm::AssertingVH<llvm::Constant>, llvm::BumpPtrAllocator> 218 InternalVars; 219 /// \brief Type typedef kmp_int32 (* kmp_routine_entry_t)(kmp_int32, void *); 220 llvm::Type *KmpRoutineEntryPtrTy; 221 QualType KmpRoutineEntryPtrQTy; 222 223 /// \brief Build type kmp_routine_entry_t (if not built yet). 224 void emitKmpRoutineEntryT(QualType KmpInt32Ty); 225 226 /// \brief Emits object of ident_t type with info for source location. 227 /// \param Flags Flags for OpenMP location. 228 /// 229 llvm::Value *emitUpdateLocation(CodeGenFunction &CGF, SourceLocation Loc, 230 OpenMPLocationFlags Flags = OMP_IDENT_KMPC); 231 232 /// \brief Returns pointer to ident_t type. 233 llvm::Type *getIdentTyPointerTy(); 234 235 /// \brief Returns pointer to kmpc_micro type. 236 llvm::Type *getKmpc_MicroPointerTy(); 237 238 /// \brief Returns specified OpenMP runtime function. 239 /// \param Function OpenMP runtime function. 240 /// \return Specified function. 241 llvm::Constant *createRuntimeFunction(OpenMPRTLFunction Function); 242 243 /// \brief Returns __kmpc_for_static_init_* runtime function for the specified 244 /// size \a IVSize and sign \a IVSigned. 245 llvm::Constant *createForStaticInitFunction(unsigned IVSize, bool IVSigned); 246 247 /// \brief Returns __kmpc_dispatch_init_* runtime function for the specified 248 /// size \a IVSize and sign \a IVSigned. 249 llvm::Constant *createDispatchInitFunction(unsigned IVSize, bool IVSigned); 250 251 /// \brief Returns __kmpc_dispatch_next_* runtime function for the specified 252 /// size \a IVSize and sign \a IVSigned. 253 llvm::Constant *createDispatchNextFunction(unsigned IVSize, bool IVSigned); 254 255 /// \brief If the specified mangled name is not in the module, create and 256 /// return threadprivate cache object. This object is a pointer's worth of 257 /// storage that's reserved for use by the OpenMP runtime. 258 /// \param VD Threadprivate variable. 259 /// \return Cache variable for the specified threadprivate. 260 llvm::Constant *getOrCreateThreadPrivateCache(const VarDecl *VD); 261 262 /// \brief Emits address of the word in a memory where current thread id is 263 /// stored. 264 virtual llvm::Value *emitThreadIDAddress(CodeGenFunction &CGF, 265 SourceLocation Loc); 266 267 /// \brief Gets thread id value for the current thread. 268 /// 269 llvm::Value *getThreadID(CodeGenFunction &CGF, SourceLocation Loc); 270 271 /// \brief Gets (if variable with the given name already exist) or creates 272 /// internal global variable with the specified Name. The created variable has 273 /// linkage CommonLinkage by default and is initialized by null value. 274 /// \param Ty Type of the global variable. If it is exist already the type 275 /// must be the same. 276 /// \param Name Name of the variable. 277 llvm::Constant *getOrCreateInternalVariable(llvm::Type *Ty, 278 const llvm::Twine &Name); 279 280 /// \brief Set of threadprivate variables with the generated initializer. 281 llvm::DenseSet<const VarDecl *> ThreadPrivateWithDefinition; 282 283 /// \brief Emits initialization code for the threadprivate variables. 284 /// \param VDAddr Address of the global variable \a VD. 285 /// \param Ctor Pointer to a global init function for \a VD. 286 /// \param CopyCtor Pointer to a global copy function for \a VD. 287 /// \param Dtor Pointer to a global destructor function for \a VD. 288 /// \param Loc Location of threadprivate declaration. 289 void emitThreadPrivateVarInit(CodeGenFunction &CGF, llvm::Value *VDAddr, 290 llvm::Value *Ctor, llvm::Value *CopyCtor, 291 llvm::Value *Dtor, SourceLocation Loc); 292 293 /// \brief Returns corresponding lock object for the specified critical region 294 /// name. If the lock object does not exist it is created, otherwise the 295 /// reference to the existing copy is returned. 296 /// \param CriticalName Name of the critical region. 297 /// 298 llvm::Value *getCriticalRegionLock(StringRef CriticalName); 299 300 public: 301 explicit CGOpenMPRuntime(CodeGenModule &CGM); ~CGOpenMPRuntime()302 virtual ~CGOpenMPRuntime() {} 303 virtual void clear(); 304 305 /// \brief Emits outlined function for the specified OpenMP parallel directive 306 /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID, 307 /// kmp_int32 BoundID, struct context_vars*). 308 /// \param D OpenMP directive. 309 /// \param ThreadIDVar Variable for thread id in the current OpenMP region. 310 /// \param CodeGen Code generation sequence for the \a D directive. 311 virtual llvm::Value * 312 emitParallelOutlinedFunction(const OMPExecutableDirective &D, 313 const VarDecl *ThreadIDVar, 314 const RegionCodeGenTy &CodeGen); 315 316 /// \brief Emits outlined function for the OpenMP task directive \a D. This 317 /// outlined function has type void(*)(kmp_int32 ThreadID, kmp_int32 318 /// PartID, struct context_vars*). 319 /// \param D OpenMP directive. 320 /// \param ThreadIDVar Variable for thread id in the current OpenMP region. 321 /// \param CodeGen Code generation sequence for the \a D directive. 322 /// 323 virtual llvm::Value *emitTaskOutlinedFunction(const OMPExecutableDirective &D, 324 const VarDecl *ThreadIDVar, 325 const RegionCodeGenTy &CodeGen); 326 327 /// \brief Cleans up references to the objects in finished function. 328 /// 329 void functionFinished(CodeGenFunction &CGF); 330 331 /// \brief Emits code for parallel call of the \a OutlinedFn with variables 332 /// captured in a record which address is stored in \a CapturedStruct. 333 /// \param OutlinedFn Outlined function to be run in parallel threads. Type of 334 /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*). 335 /// \param CapturedStruct A pointer to the record with the references to 336 /// variables used in \a OutlinedFn function. 337 /// 338 virtual void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, 339 llvm::Value *OutlinedFn, 340 llvm::Value *CapturedStruct); 341 342 /// \brief Emits code for serial call of the \a OutlinedFn with variables 343 /// captured in a record which address is stored in \a CapturedStruct. 344 /// \param OutlinedFn Outlined function to be run in serial mode. 345 /// \param CapturedStruct A pointer to the record with the references to 346 /// variables used in \a OutlinedFn function. 347 /// 348 virtual void emitSerialCall(CodeGenFunction &CGF, SourceLocation Loc, 349 llvm::Value *OutlinedFn, 350 llvm::Value *CapturedStruct); 351 352 /// \brief Emits a critical region. 353 /// \param CriticalName Name of the critical region. 354 /// \param CriticalOpGen Generator for the statement associated with the given 355 /// critical region. 356 virtual void emitCriticalRegion(CodeGenFunction &CGF, StringRef CriticalName, 357 const RegionCodeGenTy &CriticalOpGen, 358 SourceLocation Loc); 359 360 /// \brief Emits a master region. 361 /// \param MasterOpGen Generator for the statement associated with the given 362 /// master region. 363 virtual void emitMasterRegion(CodeGenFunction &CGF, 364 const RegionCodeGenTy &MasterOpGen, 365 SourceLocation Loc); 366 367 /// \brief Emits code for a taskyield directive. 368 virtual void emitTaskyieldCall(CodeGenFunction &CGF, SourceLocation Loc); 369 370 /// \brief Emits a single region. 371 /// \param SingleOpGen Generator for the statement associated with the given 372 /// single region. 373 virtual void emitSingleRegion(CodeGenFunction &CGF, 374 const RegionCodeGenTy &SingleOpGen, 375 SourceLocation Loc, 376 ArrayRef<const Expr *> CopyprivateVars, 377 ArrayRef<const Expr *> DestExprs, 378 ArrayRef<const Expr *> SrcExprs, 379 ArrayRef<const Expr *> AssignmentOps); 380 381 /// \brief Emit an implicit/explicit barrier for OpenMP threads. 382 /// \param Kind Directive for which this implicit barrier call must be 383 /// generated. Must be OMPD_barrier for explicit barrier generation. 384 /// 385 virtual void emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc, 386 OpenMPDirectiveKind Kind); 387 388 /// \brief Check if the specified \a ScheduleKind is static non-chunked. 389 /// This kind of worksharing directive is emitted without outer loop. 390 /// \param ScheduleKind Schedule kind specified in the 'schedule' clause. 391 /// \param Chunked True if chunk is specified in the clause. 392 /// 393 virtual bool isStaticNonchunked(OpenMPScheduleClauseKind ScheduleKind, 394 bool Chunked) const; 395 396 /// \brief Check if the specified \a ScheduleKind is dynamic. 397 /// This kind of worksharing directive is emitted without outer loop. 398 /// \param ScheduleKind Schedule Kind specified in the 'schedule' clause. 399 /// 400 virtual bool isDynamic(OpenMPScheduleClauseKind ScheduleKind) const; 401 402 /// \brief Call the appropriate runtime routine to initialize it before start 403 /// of loop. 404 /// 405 /// Depending on the loop schedule, it is nesessary to call some runtime 406 /// routine before start of the OpenMP loop to get the loop upper / lower 407 /// bounds \a LB and \a UB and stride \a ST. 408 /// 409 /// \param CGF Reference to current CodeGenFunction. 410 /// \param Loc Clang source location. 411 /// \param SchedKind Schedule kind, specified by the 'schedule' clause. 412 /// \param IVSize Size of the iteration variable in bits. 413 /// \param IVSigned Sign of the interation variable. 414 /// \param IL Address of the output variable in which the flag of the 415 /// last iteration is returned. 416 /// \param LB Address of the output variable in which the lower iteration 417 /// number is returned. 418 /// \param UB Address of the output variable in which the upper iteration 419 /// number is returned. 420 /// \param ST Address of the output variable in which the stride value is 421 /// returned nesessary to generated the static_chunked scheduled loop. 422 /// \param Chunk Value of the chunk for the static_chunked scheduled loop. 423 /// For the default (nullptr) value, the chunk 1 will be used. 424 /// 425 virtual void emitForInit(CodeGenFunction &CGF, SourceLocation Loc, 426 OpenMPScheduleClauseKind SchedKind, unsigned IVSize, 427 bool IVSigned, llvm::Value *IL, llvm::Value *LB, 428 llvm::Value *UB, llvm::Value *ST, 429 llvm::Value *Chunk = nullptr); 430 431 /// \brief Call the appropriate runtime routine to notify that we finished 432 /// all the work with current loop. 433 /// 434 /// \param CGF Reference to current CodeGenFunction. 435 /// \param Loc Clang source location. 436 /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause. 437 /// 438 virtual void emitForFinish(CodeGenFunction &CGF, SourceLocation Loc, 439 OpenMPScheduleClauseKind ScheduleKind); 440 441 /// Call __kmpc_dispatch_next( 442 /// ident_t *loc, kmp_int32 tid, kmp_int32 *p_lastiter, 443 /// kmp_int[32|64] *p_lower, kmp_int[32|64] *p_upper, 444 /// kmp_int[32|64] *p_stride); 445 /// \param IVSize Size of the iteration variable in bits. 446 /// \param IVSigned Sign of the interation variable. 447 /// \param IL Address of the output variable in which the flag of the 448 /// last iteration is returned. 449 /// \param LB Address of the output variable in which the lower iteration 450 /// number is returned. 451 /// \param UB Address of the output variable in which the upper iteration 452 /// number is returned. 453 /// \param ST Address of the output variable in which the stride value is 454 /// returned. 455 virtual llvm::Value *emitForNext(CodeGenFunction &CGF, SourceLocation Loc, 456 unsigned IVSize, bool IVSigned, 457 llvm::Value *IL, llvm::Value *LB, 458 llvm::Value *UB, llvm::Value *ST); 459 460 /// \brief Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32 461 /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads' 462 /// clause. 463 /// \param NumThreads An integer value of threads. 464 virtual void emitNumThreadsClause(CodeGenFunction &CGF, 465 llvm::Value *NumThreads, 466 SourceLocation Loc); 467 468 /// \brief Returns address of the threadprivate variable for the current 469 /// thread. 470 /// \param VD Threadprivate variable. 471 /// \param VDAddr Address of the global variable \a VD. 472 /// \param Loc Location of the reference to threadprivate var. 473 /// \return Address of the threadprivate variable for the current thread. 474 virtual llvm::Value *getAddrOfThreadPrivate(CodeGenFunction &CGF, 475 const VarDecl *VD, 476 llvm::Value *VDAddr, 477 SourceLocation Loc); 478 479 /// \brief Emit a code for initialization of threadprivate variable. It emits 480 /// a call to runtime library which adds initial value to the newly created 481 /// threadprivate variable (if it is not constant) and registers destructor 482 /// for the variable (if any). 483 /// \param VD Threadprivate variable. 484 /// \param VDAddr Address of the global variable \a VD. 485 /// \param Loc Location of threadprivate declaration. 486 /// \param PerformInit true if initialization expression is not constant. 487 virtual llvm::Function * 488 emitThreadPrivateVarDefinition(const VarDecl *VD, llvm::Value *VDAddr, 489 SourceLocation Loc, bool PerformInit, 490 CodeGenFunction *CGF = nullptr); 491 492 /// \brief Emit flush of the variables specified in 'omp flush' directive. 493 /// \param Vars List of variables to flush. 494 virtual void emitFlush(CodeGenFunction &CGF, ArrayRef<const Expr *> Vars, 495 SourceLocation Loc); 496 497 /// \brief Emit task region for the task directive. The task region is 498 /// emmitted in several steps: 499 /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32 500 /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds, 501 /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the 502 /// function: 503 /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) { 504 /// TaskFunction(gtid, tt->part_id, tt->shareds); 505 /// return 0; 506 /// } 507 /// 2. Copy a list of shared variables to field shareds of the resulting 508 /// structure kmp_task_t returned by the previous call (if any). 509 /// 3. Copy a pointer to destructions function to field destructions of the 510 /// resulting structure kmp_task_t. 511 /// 4. Emit a call to kmp_int32 __kmpc_omp_task(ident_t *, kmp_int32 gtid, 512 /// kmp_task_t *new_task), where new_task is a resulting structure from 513 /// previous items. 514 /// \param Tied true if the task is tied (the task is tied to the thread that 515 /// can suspend its task region), false - untied (the task is not tied to any 516 /// thread). 517 /// \param Final Contains either constant bool value, or llvm::Value * of i1 518 /// type for final clause. If the value is true, the task forces all of its 519 /// child tasks to become final and included tasks. 520 /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32 521 /// /*part_id*/, captured_struct */*__context*/); 522 /// \param SharedsTy A type which contains references the shared variables. 523 /// \param Shareds Context with the list of shared variables from the \a 524 /// TaskFunction. 525 virtual void emitTaskCall(CodeGenFunction &CGF, SourceLocation Loc, bool Tied, 526 llvm::PointerIntPair<llvm::Value *, 1, bool> Final, 527 llvm::Value *TaskFunction, QualType SharedsTy, 528 llvm::Value *Shareds); 529 530 /// \brief Emit code for the directive that does not require outlining. 531 /// 532 /// \param CodeGen Code generation sequence for the \a D directive. 533 virtual void emitInlinedDirective(CodeGenFunction &CGF, 534 const RegionCodeGenTy &CodeGen); 535 /// \brief Emit a code for reduction clause. Next code should be emitted for 536 /// reduction: 537 /// \code 538 /// 539 /// static kmp_critical_name lock = { 0 }; 540 /// 541 /// void reduce_func(void *lhs[<n>], void *rhs[<n>]) { 542 /// ... 543 /// *(Type<i>*)lhs[i] = RedOp<i>(*(Type<i>*)lhs[i], *(Type<i>*)rhs[i]); 544 /// ... 545 /// } 546 /// 547 /// ... 548 /// void *RedList[<n>] = {&<RHSExprs>[0], ..., &<RHSExprs>[<n>-1]}; 549 /// switch (__kmpc_reduce{_nowait}(<loc>, <gtid>, <n>, sizeof(RedList), 550 /// RedList, reduce_func, &<lock>)) { 551 /// case 1: 552 /// ... 553 /// <LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]); 554 /// ... 555 /// __kmpc_end_reduce{_nowait}(<loc>, <gtid>, &<lock>); 556 /// break; 557 /// case 2: 558 /// ... 559 /// Atomic(<LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i])); 560 /// ... 561 /// break; 562 /// default:; 563 /// } 564 /// \endcode 565 /// 566 /// \param LHSExprs List of LHS in \a ReductionOps reduction operations. 567 /// \param RHSExprs List of RHS in \a ReductionOps reduction operations. 568 /// \param ReductionOps List of reduction operations in form 'LHS binop RHS' 569 /// or 'operator binop(LHS, RHS)'. 570 /// \param WithNowait true if parent directive has also nowait clause, false 571 /// otherwise. 572 virtual void emitReduction(CodeGenFunction &CGF, SourceLocation Loc, 573 ArrayRef<const Expr *> LHSExprs, 574 ArrayRef<const Expr *> RHSExprs, 575 ArrayRef<const Expr *> ReductionOps, 576 bool WithNowait); 577 }; 578 579 } // namespace CodeGen 580 } // namespace clang 581 582 #endif 583