================ @@ -1730,6 +1730,119 @@ buildDependData(std::optional<ArrayAttr> dependKinds, OperandRange dependVars, } } +namespace { +/// TaskContextStructManager takes care of creating and freeing a structure +/// containing information needed by the task body to execute. +class TaskContextStructManager { +public: + TaskContextStructManager(llvm::IRBuilderBase &builder, + LLVM::ModuleTranslation &moduleTranslation, + MutableArrayRef<omp::PrivateClauseOp> privateDecls) + : builder{builder}, moduleTranslation{moduleTranslation}, + privateDecls{privateDecls} {} + + /// Creates a heap allocated struct containing space for each private + /// variable. Invariant: privateVarTypes, privateDecls, and the elements of + /// the structure should all have the same order (although privateDecls which + /// do not read from the mold argument are skipped). + void generateTaskContextStruct(); + + /// Create GEPs to access each member of the structure representing a private + /// variable, adding them to llvmPrivateVars. Null values are added where + /// private decls were skipped so that the ordering continues to match the + /// private decls. + void createGEPsToPrivateVars(); + + /// De-allocate the task context structure. + void freeStructPtr(); + + MutableArrayRef<llvm::Value *> getLLVMPrivateVars() { + return llvmPrivateVars; + } + + llvm::Value *getStructPtr() { return structPtr; } + +private: + llvm::IRBuilderBase &builder; + LLVM::ModuleTranslation &moduleTranslation; + MutableArrayRef<omp::PrivateClauseOp> privateDecls; + + /// The type of each member of the structure, in order. + SmallVector<llvm::Type *> privateVarTypes; + + /// LLVM values for each private variable, or null if that private variable is + /// not included in the task context structure + SmallVector<llvm::Value *> llvmPrivateVars; ---------------- bhandarkar-pranav wrote:
nit: Wouldn't `llvmPrivateVarGEPs` be more descriptive? For context, I felt the need on line 1926 below ``` for (auto [privDecl, mlirPrivVar, blockArg, llvmPrivateVarAlloc] : llvm::zip_equal(privateDecls, mlirPrivateVars, privateBlockArgs, taskStructMgr.getLLVMPrivateVars())) { ``` https://github.com/llvm/llvm-project/pull/125307 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits