[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
This revision was automatically updated to reflect the committed changes. Closed by commit rG48c3ae5cc3d4: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and… (authored by agozillon). Changed prior to commit: https://reviews.llvm.org/D148370?vs=519050=522671#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 Files: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CGOpenMPRuntime.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/CMakeLists.txt llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/lib/Target/LLVMIR/ModuleTranslation.cpp Index: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp === --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1274,19 +1274,23 @@ llvm::OpenMPIRBuilder *ModuleTranslation::getOpenMPBuilder() { if (!ompBuilder) { ompBuilder = std::make_unique(*llvmModule); -ompBuilder->initialize(); bool isDevice = false; +llvm::StringRef hostIRFilePath = ""; if (auto offloadMod = -dyn_cast(mlirModule)) +dyn_cast(mlirModule)) { isDevice = offloadMod.getIsDevice(); + hostIRFilePath = offloadMod.getHostIRFilePath(); +} + +ompBuilder->initialize(hostIRFilePath); // TODO: set the flags when available -llvm::OpenMPIRBuilderConfig Config( +llvm::OpenMPIRBuilderConfig config( isDevice, /* IsTargetCodegen */ false, /* HasRequiresUnifiedSharedMemory */ false, /* OpenMPOffloadMandatory */ false); -ompBuilder->setConfig(Config); +ompBuilder->setConfig(config); } return ompBuilder.get(); } Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -445,7 +446,31 @@ return Fn; } -void OpenMPIRBuilder::initialize() { initializeTypes(M); } +void OpenMPIRBuilder::initialize(StringRef HostFilePath) { + initializeTypes(M); + + if (HostFilePath.empty()) +return; + + auto Buf = MemoryBuffer::getFile(HostFilePath); + if (std::error_code Err = Buf.getError()) { +report_fatal_error(("error opening host file from host file path inside of " +"OpenMPIRBuilder: " + +Err.message()) + .c_str()); + } + + LLVMContext Ctx; + auto M = expectedToErrorOrAndEmitErrors( + Ctx, parseBitcodeFile(Buf.get()->getMemBufferRef(), Ctx)); + if (std::error_code Err = M.getError()) { +report_fatal_error( +("error parsing host file inside of OpenMPIRBuilder: " + Err.message()) +.c_str()); + } + + loadOffloadInfoMetadata(*M.get()); +} void OpenMPIRBuilder::finalize(Function *Fn) { SmallPtrSet ParallelRegionBlockSet; @@ -534,6 +559,17 @@ // Remove work items that have been completed. OutlineInfos = std::move(DeferredOutlines); + + EmitMetadataErrorReportFunctionTy & = + [](EmitMetadataErrorKind Kind, + const TargetRegionEntryInfo ) -> void { +errs() << "Error of kind: " << Kind + << " when emitting offload entries and metadata during " + "OMPIRBuilder finalization \n"; + }; + + if (!OffloadInfoManager.empty()) +createOffloadEntriesAndInfoMetadata(ErrorReportFn); } OpenMPIRBuilder::~OpenMPIRBuilder() { Index: llvm/lib/Frontend/OpenMP/CMakeLists.txt === --- llvm/lib/Frontend/OpenMP/CMakeLists.txt +++ llvm/lib/Frontend/OpenMP/CMakeLists.txt @@ -19,4 +19,5 @@ Analysis MC Scalar + BitReader ) Index: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h === --- llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -418,8 +418,14 @@ /// Initialize the internal state, this will put structures types and /// potentially other helpers into the underlying module. Must be called - /// before any other method and only once! - void initialize(); + /// before any other method and only once! This internal state includes + /// Types used in the OpenMPIRBuilder generated from OMPKinds.def as well + /// as loading offload metadata for device from the OpenMP host IR file + /// passed in as the HostFilePath argument. + /// \param HostFilePath The path to the host IR file, used to load in + /// offload metadata for the device, allowing host and device to +
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. I am going to upstream this within the next hour, unless anyone has some final comments they wish to make Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. Thank you very much @kiranchandramohan! More than happy to wait a day incase anyone else wishes to do a final review. I'll add the Nits where possible when I commit the patch upstream and it should hopefully update the review with the alterations! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
kiranchandramohan accepted this revision. kiranchandramohan added a comment. This revision is now accepted and ready to land. LG. Please wait a day before submitting. Comment at: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp:455-468 + auto Buf = MemoryBuffer::getFile(HostFilePath); + if (auto Err = Buf.getError()) +report_fatal_error(("error opening host file from host file path inside of " +"OpenMPIRBuilder: " + +Err.message()) + .c_str()); + Nit: Might be good to spell the types and use braces for multi-line code inside `if`. Comment at: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h:18 #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/IR/Operation.h" Nit: Is this required here? Can it be in the CPP File? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. If it would be possible to get some poor reviewers precious time on this I would greatly appreciate it! Thank you very much ahead of time. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. Hey @jdoerfert sorry to bother you, would it be possible to have this signed off on if there is no further issues with the current patch? Thank you for your time! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. Updated to fix the style issues that were present and pointed out by @jdoerfert thank you! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon updated this revision to Diff 519050. agozillon marked an inline comment as done. agozillon added a comment. - Remove unneccessary OMPIRBuilder scope as well Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 Files: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CGOpenMPRuntime.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/CMakeLists.txt llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h mlir/lib/Target/LLVMIR/ModuleTranslation.cpp Index: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp === --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1259,19 +1259,23 @@ llvm::OpenMPIRBuilder *ModuleTranslation::getOpenMPBuilder() { if (!ompBuilder) { ompBuilder = std::make_unique(*llvmModule); -ompBuilder->initialize(); bool isDevice = false; +llvm::StringRef hostIRFilePath = ""; if (auto offloadMod = -dyn_cast(mlirModule)) +dyn_cast(mlirModule)) { isDevice = offloadMod.getIsDevice(); + hostIRFilePath = offloadMod.getHostIRFilePath(); +} + +ompBuilder->initialize(hostIRFilePath); // TODO: set the flags when available -llvm::OpenMPIRBuilderConfig Config( +llvm::OpenMPIRBuilderConfig config( isDevice, /* IsTargetCodegen */ false, /* HasRequiresUnifiedSharedMemory */ false, /* OpenMPOffloadMandatory */ false); -ompBuilder->setConfig(Config); +ompBuilder->setConfig(config); } return ompBuilder.get(); } Index: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h === --- mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -15,6 +15,7 @@ #define MLIR_TARGET_LLVMIR_MODULETRANSLATION_H #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/IR/Operation.h" #include "mlir/IR/SymbolTable.h" #include "mlir/IR/Value.h" Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -445,7 +446,29 @@ return Fn; } -void OpenMPIRBuilder::initialize() { initializeTypes(M); } +void OpenMPIRBuilder::initialize(StringRef HostFilePath) { + initializeTypes(M); + + if (HostFilePath.empty()) +return; + + auto Buf = MemoryBuffer::getFile(HostFilePath); + if (auto Err = Buf.getError()) +report_fatal_error(("error opening host file from host file path inside of " +"OpenMPIRBuilder: " + +Err.message()) + .c_str()); + + LLVMContext Ctx; + auto M = expectedToErrorOrAndEmitErrors( + Ctx, parseBitcodeFile(Buf.get()->getMemBufferRef(), Ctx)); + if (auto Err = M.getError()) +report_fatal_error( +("error parsing host file inside of OpenMPIRBuilder: " + Err.message()) +.c_str()); + + loadOffloadInfoMetadata(*M.get()); +} void OpenMPIRBuilder::finalize(Function *Fn) { SmallPtrSet ParallelRegionBlockSet; @@ -534,6 +557,17 @@ // Remove work items that have been completed. OutlineInfos = std::move(DeferredOutlines); + + EmitMetadataErrorReportFunctionTy & = + [](EmitMetadataErrorKind Kind, + const TargetRegionEntryInfo ) -> void { +errs() << "Error of kind: " << Kind + << " when emitting offload entries and metadata during " + "OMPIRBuilder finalization \n"; + }; + + if (!OffloadInfoManager.empty()) +createOffloadEntriesAndInfoMetadata(ErrorReportFn); } OpenMPIRBuilder::~OpenMPIRBuilder() { Index: llvm/lib/Frontend/OpenMP/CMakeLists.txt === --- llvm/lib/Frontend/OpenMP/CMakeLists.txt +++ llvm/lib/Frontend/OpenMP/CMakeLists.txt @@ -19,4 +19,5 @@ Analysis MC Scalar + BitReader ) Index: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h === --- llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -418,8 +418,14 @@ /// Initialize the internal state, this will put structures types and /// potentially other helpers into the underlying module. Must be called - /// before any other method and only once! - void initialize(); +
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon updated this revision to Diff 519048. agozillon added a comment. - Move hostIRFilePath initialize invocation to ModuleTranslation.cpp to respect TargetOp patch - Apply reviewer feedback - Tidy up missed style guidelines i sillily forgot about Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 Files: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CGOpenMPRuntime.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/CMakeLists.txt llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h mlir/lib/Target/LLVMIR/ModuleTranslation.cpp Index: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp === --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1259,19 +1259,23 @@ llvm::OpenMPIRBuilder *ModuleTranslation::getOpenMPBuilder() { if (!ompBuilder) { ompBuilder = std::make_unique(*llvmModule); -ompBuilder->initialize(); bool isDevice = false; +llvm::StringRef hostIRFilePath = ""; if (auto offloadMod = -dyn_cast(mlirModule)) +dyn_cast(mlirModule)) { isDevice = offloadMod.getIsDevice(); + hostIRFilePath = offloadMod.getHostIRFilePath(); +} + +ompBuilder->initialize(hostIRFilePath); // TODO: set the flags when available -llvm::OpenMPIRBuilderConfig Config( +llvm::OpenMPIRBuilderConfig config( isDevice, /* IsTargetCodegen */ false, /* HasRequiresUnifiedSharedMemory */ false, /* OpenMPOffloadMandatory */ false); -ompBuilder->setConfig(Config); +ompBuilder->setConfig(config); } return ompBuilder.get(); } Index: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h === --- mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -15,6 +15,7 @@ #define MLIR_TARGET_LLVMIR_MODULETRANSLATION_H #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/IR/Operation.h" #include "mlir/IR/SymbolTable.h" #include "mlir/IR/Value.h" Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -445,7 +446,29 @@ return Fn; } -void OpenMPIRBuilder::initialize() { initializeTypes(M); } +void OpenMPIRBuilder::initialize(StringRef HostFilePath) { + initializeTypes(M); + + if (HostFilePath.empty()) +return; + + auto Buf = MemoryBuffer::getFile(HostFilePath); + if (auto Err = Buf.getError()) +report_fatal_error(("error opening host file from host file path inside of " +"OpenMPIRBuilder: " + +Err.message()) + .c_str()); + + LLVMContext Ctx; + auto M = expectedToErrorOrAndEmitErrors( + Ctx, parseBitcodeFile(Buf.get()->getMemBufferRef(), Ctx)); + if (auto Err = M.getError()) +report_fatal_error( +("error parsing host file inside of OpenMPIRBuilder: " + Err.message()) +.c_str()); + + loadOffloadInfoMetadata(*M.get()); +} void OpenMPIRBuilder::finalize(Function *Fn) { SmallPtrSet ParallelRegionBlockSet; @@ -534,6 +557,17 @@ // Remove work items that have been completed. OutlineInfos = std::move(DeferredOutlines); + + OpenMPIRBuilder::EmitMetadataErrorReportFunctionTy & = + [](OpenMPIRBuilder::EmitMetadataErrorKind Kind, + const TargetRegionEntryInfo ) -> void { +errs() << "Error of kind: " << Kind + << " when emitting offload entries and metadata during " + "OMPIRBuilder finalization \n"; + }; + + if (!OffloadInfoManager.empty()) +createOffloadEntriesAndInfoMetadata(ErrorReportFn); } OpenMPIRBuilder::~OpenMPIRBuilder() { Index: llvm/lib/Frontend/OpenMP/CMakeLists.txt === --- llvm/lib/Frontend/OpenMP/CMakeLists.txt +++ llvm/lib/Frontend/OpenMP/CMakeLists.txt @@ -19,4 +19,5 @@ Analysis MC Scalar + BitReader ) Index: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h === --- llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -418,8 +418,14 @@ /// Initialize the internal state, this will put structures types and /// potentially other
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
jdoerfert added inline comments. Comment at: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp:561 + + llvm::OpenMPIRBuilder::EmitMetadataErrorReportFunctionTy & = + [](llvm::OpenMPIRBuilder::EmitMetadataErrorKind kind, no llvm:: style: ErrorReportFn similarly elsewhere. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. Thank you very much for the quick response time on the review and the review @jdoerfert! I believe I have applied all of your current feedback in the last update. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon updated this revision to Diff 518875. agozillon marked 4 inline comments as done. agozillon added a comment. - Move hostIRFilePath initialize invocation to ModuleTranslation.cpp to respect TargetOp patch - Apply reviewer feedback Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 Files: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CGOpenMPRuntime.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/CMakeLists.txt llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h mlir/lib/Target/LLVMIR/ModuleTranslation.cpp Index: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp === --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1259,19 +1259,23 @@ llvm::OpenMPIRBuilder *ModuleTranslation::getOpenMPBuilder() { if (!ompBuilder) { ompBuilder = std::make_unique(*llvmModule); -ompBuilder->initialize(); bool isDevice = false; +llvm::StringRef hostIRFilePath = ""; if (auto offloadMod = -dyn_cast(mlirModule)) +dyn_cast(mlirModule)) { isDevice = offloadMod.getIsDevice(); + hostIRFilePath = offloadMod.getHostIRFilePath(); +} + +ompBuilder->initialize(hostIRFilePath); // TODO: set the flags when available -llvm::OpenMPIRBuilderConfig Config( +llvm::OpenMPIRBuilderConfig config( isDevice, /* IsTargetCodegen */ false, /* HasRequiresUnifiedSharedMemory */ false, /* OpenMPOffloadMandatory */ false); -ompBuilder->setConfig(Config); +ompBuilder->setConfig(config); } return ompBuilder.get(); } Index: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h === --- mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -15,6 +15,7 @@ #define MLIR_TARGET_LLVMIR_MODULETRANSLATION_H #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/IR/Operation.h" #include "mlir/IR/SymbolTable.h" #include "mlir/IR/Value.h" Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -445,7 +446,29 @@ return Fn; } -void OpenMPIRBuilder::initialize() { initializeTypes(M); } +void OpenMPIRBuilder::initialize(StringRef HostFilePath) { + initializeTypes(M); + + if (HostFilePath.empty()) +return; + + auto Buf = MemoryBuffer::getFile(HostFilePath); + if (auto Err = Buf.getError()) +report_fatal_error(("error opening host file from host file path inside of " +"OpenMPIRBuilder: " + +Err.message()) + .c_str()); + + LLVMContext Ctx; + auto M = expectedToErrorOrAndEmitErrors( + Ctx, parseBitcodeFile(Buf.get()->getMemBufferRef(), Ctx)); + if (auto Err = M.getError()) +report_fatal_error( +("error parsing host file inside of OpenMPIRBuilder: " + Err.message()) +.c_str()); + + loadOffloadInfoMetadata(*M.get()); +} void OpenMPIRBuilder::finalize(Function *Fn) { SmallPtrSet ParallelRegionBlockSet; @@ -534,6 +557,17 @@ // Remove work items that have been completed. OutlineInfos = std::move(DeferredOutlines); + + llvm::OpenMPIRBuilder::EmitMetadataErrorReportFunctionTy & = + [](llvm::OpenMPIRBuilder::EmitMetadataErrorKind kind, + const llvm::TargetRegionEntryInfo ) -> void { +llvm::errs() << "Error of kind: " << kind + << " when emitting offload entries and metadata during " +"OMPIRBuilder finalization \n"; + }; + + if (!OffloadInfoManager.empty()) +createOffloadEntriesAndInfoMetadata(errorReportFn); } OpenMPIRBuilder::~OpenMPIRBuilder() { Index: llvm/lib/Frontend/OpenMP/CMakeLists.txt === --- llvm/lib/Frontend/OpenMP/CMakeLists.txt +++ llvm/lib/Frontend/OpenMP/CMakeLists.txt @@ -19,4 +19,5 @@ Analysis MC Scalar + BitReader ) Index: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h === --- llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -418,8 +418,14 @@ /// Initialize the internal state, this will put structures types and
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
jdoerfert added inline comments. Comment at: clang/lib/CodeGen/CGOpenMPRuntime.cpp:1063 + // Initialize Types used in OpenMPIRBuilder from OMPKinds.def as well as load + // offload metadata for device from an OpenMP host IR file. + OMPBuilder.initialize(CGM.getLangOpts().OpenMPIsDevice Move the additional comment to the initialize function instead to explain what the argument is for. Comment at: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp:452 + + if (!HostFilePath.empty()) { +auto Buf = llvm::MemoryBuffer::getFile(HostFilePath); early exit plz. Comment at: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp:453 + if (!HostFilePath.empty()) { +auto Buf = llvm::MemoryBuffer::getFile(HostFilePath); +if (auto Err = Buf.getError()) No llvm:: Comment at: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp:455 +if (auto Err = Buf.getError()) + assert(false && ("error opening host file from host file path inside of " + "OpenMPIRBuilder" + no assert false please. Use unreachable or report fatal error. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. Small ping to ask for some reviewer attention on this patch if at all possible! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. rebase to see if it clears up the buildbot issue (currently the failing test appears to be unrelated and passes on my machine after a rebase) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon updated this revision to Diff 517968. agozillon added a comment. - Move hostIRFilePath initialize invocation to ModuleTranslation.cpp to respect TargetOp patch Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 Files: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CGOpenMPRuntime.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/CMakeLists.txt llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h mlir/lib/Target/LLVMIR/ModuleTranslation.cpp Index: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp === --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1259,19 +1259,23 @@ llvm::OpenMPIRBuilder *ModuleTranslation::getOpenMPBuilder() { if (!ompBuilder) { ompBuilder = std::make_unique(*llvmModule); -ompBuilder->initialize(); bool isDevice = false; +llvm::StringRef hostIRFilePath = ""; if (auto offloadMod = -dyn_cast(mlirModule)) +dyn_cast(mlirModule)) { isDevice = offloadMod.getIsDevice(); + hostIRFilePath = offloadMod.getHostIRFilePath(); +} + +ompBuilder->initialize(hostIRFilePath); // TODO: set the flags when available -llvm::OpenMPIRBuilderConfig Config( +llvm::OpenMPIRBuilderConfig config( isDevice, /* IsTargetCodegen */ false, /* HasRequiresUnifiedSharedMemory */ false, /* OpenMPOffloadMandatory */ false); -ompBuilder->setConfig(Config); +ompBuilder->setConfig(config); } return ompBuilder.get(); } Index: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h === --- mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -15,6 +15,7 @@ #define MLIR_TARGET_LLVMIR_MODULETRANSLATION_H #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/IR/Operation.h" #include "mlir/IR/SymbolTable.h" #include "mlir/IR/Value.h" Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -445,7 +446,28 @@ return Fn; } -void OpenMPIRBuilder::initialize() { initializeTypes(M); } +void OpenMPIRBuilder::initialize(StringRef HostFilePath) { + initializeTypes(M); + + if (!HostFilePath.empty()) { +auto Buf = llvm::MemoryBuffer::getFile(HostFilePath); +if (auto Err = Buf.getError()) + assert(false && ("error opening host file from host file path inside of " + "OpenMPIRBuilder" + + Err.message()) + .c_str()); + +llvm::LLVMContext Ctx; +auto M = llvm::expectedToErrorOrAndEmitErrors( +Ctx, llvm::parseBitcodeFile(Buf.get()->getMemBufferRef(), Ctx)); +if (auto Err = M.getError()) + assert(false && ("error parsing host file inside of OpenMPIRBuilder " + + Err.message()) + .c_str()); + +loadOffloadInfoMetadata(*M.get()); + } +} void OpenMPIRBuilder::finalize(Function *Fn) { SmallPtrSet ParallelRegionBlockSet; @@ -534,6 +556,17 @@ // Remove work items that have been completed. OutlineInfos = std::move(DeferredOutlines); + + llvm::OpenMPIRBuilder::EmitMetadataErrorReportFunctionTy & = + [](llvm::OpenMPIRBuilder::EmitMetadataErrorKind kind, + const llvm::TargetRegionEntryInfo ) -> void { +llvm::errs() << "Error of kind: " << kind + << " when emitting offload entries and metadata during " +"OMPIRBuilder finalization \n"; + }; + + if (!OffloadInfoManager.empty()) +createOffloadEntriesAndInfoMetadata(errorReportFn); } OpenMPIRBuilder::~OpenMPIRBuilder() { Index: llvm/lib/Frontend/OpenMP/CMakeLists.txt === --- llvm/lib/Frontend/OpenMP/CMakeLists.txt +++ llvm/lib/Frontend/OpenMP/CMakeLists.txt @@ -19,4 +19,5 @@ Analysis MC Scalar + BitReader ) Index: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h === --- llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -419,7 +419,7 @@ /// Initialize the internal state, this will put structures types and /// potentially other
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon updated this revision to Diff 517682. agozillon added a comment. - Move hostIRFilePath initialize invocation to ModuleTranslation.cpp to respect TargetOp patch Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 Files: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CGOpenMPRuntime.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/CMakeLists.txt llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h mlir/lib/Target/LLVMIR/ModuleTranslation.cpp Index: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp === --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1255,19 +1255,23 @@ llvm::OpenMPIRBuilder *ModuleTranslation::getOpenMPBuilder() { if (!ompBuilder) { ompBuilder = std::make_unique(*llvmModule); -ompBuilder->initialize(); bool isDevice = false; +llvm::StringRef hostIRFilePath = ""; if (auto offloadMod = -dyn_cast(mlirModule)) +dyn_cast(mlirModule)) { isDevice = offloadMod.getIsDevice(); + hostIRFilePath = offloadMod.getHostIRFilePath(); +} + +ompBuilder->initialize(hostIRFilePath); // TODO: set the flags when available -llvm::OpenMPIRBuilderConfig Config( +llvm::OpenMPIRBuilderConfig config( isDevice, /* IsTargetCodegen */ false, /* HasRequiresUnifiedSharedMemory */ false, /* OpenMPOffloadMandatory */ false); -ompBuilder->setConfig(Config); +ompBuilder->setConfig(config); } return ompBuilder.get(); } Index: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h === --- mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -15,6 +15,7 @@ #define MLIR_TARGET_LLVMIR_MODULETRANSLATION_H #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/IR/Operation.h" #include "mlir/IR/SymbolTable.h" #include "mlir/IR/Value.h" Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -445,7 +446,28 @@ return Fn; } -void OpenMPIRBuilder::initialize() { initializeTypes(M); } +void OpenMPIRBuilder::initialize(StringRef HostFilePath) { + initializeTypes(M); + + if (!HostFilePath.empty()) { +auto Buf = llvm::MemoryBuffer::getFile(HostFilePath); +if (auto Err = Buf.getError()) + assert(false && ("error opening host file from host file path inside of " + "OpenMPIRBuilder" + + Err.message()) + .c_str()); + +llvm::LLVMContext Ctx; +auto M = llvm::expectedToErrorOrAndEmitErrors( +Ctx, llvm::parseBitcodeFile(Buf.get()->getMemBufferRef(), Ctx)); +if (auto Err = M.getError()) + assert(false && ("error parsing host file inside of OpenMPIRBuilder " + + Err.message()) + .c_str()); + +loadOffloadInfoMetadata(*M.get()); + } +} void OpenMPIRBuilder::finalize(Function *Fn) { SmallPtrSet ParallelRegionBlockSet; @@ -534,6 +556,17 @@ // Remove work items that have been completed. OutlineInfos = std::move(DeferredOutlines); + + llvm::OpenMPIRBuilder::EmitMetadataErrorReportFunctionTy & = + [](llvm::OpenMPIRBuilder::EmitMetadataErrorKind kind, + const llvm::TargetRegionEntryInfo ) -> void { +llvm::errs() << "Error of kind: " << kind + << " when emitting offload entries and metadata during " +"OMPIRBuilder finalization \n"; + }; + + if (!OffloadInfoManager.empty()) +createOffloadEntriesAndInfoMetadata(errorReportFn); } OpenMPIRBuilder::~OpenMPIRBuilder() { Index: llvm/lib/Frontend/OpenMP/CMakeLists.txt === --- llvm/lib/Frontend/OpenMP/CMakeLists.txt +++ llvm/lib/Frontend/OpenMP/CMakeLists.txt @@ -19,4 +19,5 @@ Analysis MC Scalar + BitReader ) Index: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h === --- llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -419,7 +419,7 @@ /// Initialize the internal state, this will put structures types and /// potentially other
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. The patch this is dependent on has now been accepted and landed, so this should be ready for review now if anyone is available! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
jsjodin added inline comments. Comment at: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h:174 +if (offloadMod.getIsDevice()) { + hostIRFilePath = offloadMod.getHostIRFilePath(); +} agozillon wrote: > This will break the patch buildbot unfortunately until the patch this patch > is dependent on is accepted and upstreamed > This will break the patch buildbot unfortunately until the patch this patch > is dependent on is accepted and upstreamed You can always skip this part and add it in a separate patch, or add it in a patch where it is needed. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added inline comments. Comment at: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h:174 +if (offloadMod.getIsDevice()) { + hostIRFilePath = offloadMod.getHostIRFilePath(); +} This will break the patch buildbot unfortunately until the patch this patch is dependent on is accepted and upstreamed Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon added a comment. A little unsure how to test this change on its own for Flang-new + OpenMP, as there currently isn't anything that utilises it upstream at the moment. It's part of the declare target work that I'm beginning to upstream, so eventually it'll be tested on the Flang side through it, and the Target region work will also eventually utilise it. As for Clang OpenMP, it currently doesn't break any existing tests on my machine for OpenMP on AMDGPU or host tests, however, I can't speak for other targets but I expect they will pass happily as well. If there is additional tests I can add that might contribute to the patch please do ask away! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148370/new/ https://reviews.llvm.org/D148370 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D148370: [Clang][Flang][OpenMP] Add loadOffloadInfoMetadata and createOffloadEntriesAndInfoMetadata into OMPIRBuilder's finalize and initialize
agozillon created this revision. Herald added subscribers: bviyer, sunshaoce, Moerafaat, zero9178, bzcheeseman, awarzynski, sdasgup3, wenzhicui, wrengr, cota, teijeong, rdzhabarov, tatianashp, msifontes, jurahul, Kayjukh, grosul1, Joonsoo, liufengdb, aartbik, mgester, arpith-jacob, antiagainst, shauheen, rriddle, mehdi_amini, thopre, guansong, hiraditya, yaxunl. Herald added a reviewer: ftynse. Herald added a project: All. agozillon requested review of this revision. Herald added a reviewer: jdoerfert. Herald added subscribers: llvm-commits, cfe-commits, jplehr, sstefan1, stephenneuendorffer, nicolasvasilache. Herald added projects: clang, MLIR, LLVM. This allows the generation of OpenMP offload metadata for the OpenMP dialect when lowering to LLVM-IR and moves some of the shared logic between the OpenMP Dialect and Clang into the IRBuilder. This patch has a dependency on: https://reviews.llvm.org/D148038 As it requires the host ir file during lowering. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D148370 Files: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CGOpenMPRuntime.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/CMakeLists.txt llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h Index: mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h === --- mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -15,6 +15,7 @@ #define MLIR_TARGET_LLVMIR_MODULETRANSLATION_H #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/IR/Operation.h" #include "mlir/IR/SymbolTable.h" #include "mlir/IR/Value.h" @@ -165,7 +166,15 @@ llvm::OpenMPIRBuilder *getOpenMPBuilder() { if (!ompBuilder) { ompBuilder = std::make_unique(*llvmModule); - ompBuilder->initialize(); + + std::string hostIRFilePath{}; + if (auto offloadMod = + dyn_cast(mlirModule)) { +if (offloadMod.getIsDevice()) { + hostIRFilePath = offloadMod.getHostIRFilePath(); +} + } + ompBuilder->initialize(hostIRFilePath); } return ompBuilder.get(); } Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -445,7 +446,28 @@ return Fn; } -void OpenMPIRBuilder::initialize() { initializeTypes(M); } +void OpenMPIRBuilder::initialize(StringRef HostFilePath) { + initializeTypes(M); + + if (!HostFilePath.empty()) { +auto Buf = llvm::MemoryBuffer::getFile(HostFilePath); +if (auto Err = Buf.getError()) + assert(false && ("error opening host file from host file path inside of " + "OpenMPIRBuilder" + + Err.message()) + .c_str()); + +llvm::LLVMContext Ctx; +auto M = llvm::expectedToErrorOrAndEmitErrors( +Ctx, llvm::parseBitcodeFile(Buf.get()->getMemBufferRef(), Ctx)); +if (auto Err = M.getError()) + assert(false && ("error parsing host file inside of OpenMPIRBuilder " + + Err.message()) + .c_str()); + +loadOffloadInfoMetadata(*M.get()); + } +} void OpenMPIRBuilder::finalize(Function *Fn) { SmallPtrSet ParallelRegionBlockSet; @@ -534,6 +556,17 @@ // Remove work items that have been completed. OutlineInfos = std::move(DeferredOutlines); + + llvm::OpenMPIRBuilder::EmitMetadataErrorReportFunctionTy & = + [](llvm::OpenMPIRBuilder::EmitMetadataErrorKind kind, + const llvm::TargetRegionEntryInfo ) -> void { +llvm::errs() << "Error of kind: " << kind + << " when emitting offload entries and metadata during " +"OMPIRBuilder finalization \n"; + }; + + if (!OffloadInfoManager.empty()) +createOffloadEntriesAndInfoMetadata(errorReportFn); } OpenMPIRBuilder::~OpenMPIRBuilder() { Index: llvm/lib/Frontend/OpenMP/CMakeLists.txt === --- llvm/lib/Frontend/OpenMP/CMakeLists.txt +++ llvm/lib/Frontend/OpenMP/CMakeLists.txt @@ -19,4 +19,5 @@ Analysis MC Scalar + BitReader ) Index: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h === --- llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -420,7 +420,7 @@ /// Initialize the