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