llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Aditya Sinha (AdityaSinha149) <details> <summary>Changes</summary> This PR adds code generation to the `IncrementalHIPDeviceParser`. It takes the last PTU's device module and converts it into an AMDGPU device object in the memory. `GenerateOffloadBinary()` is updated to call it and after that it returns the same error as before. --- Full diff: https://github.com/llvm/llvm-project/pull/234498.diff 2 Files Affected: - (modified) clang/lib/Interpreter/DeviceOffload.cpp (+30-2) - (modified) clang/lib/Interpreter/DeviceOffload.h (+7) ``````````diff diff --git a/clang/lib/Interpreter/DeviceOffload.cpp b/clang/lib/Interpreter/DeviceOffload.cpp index 31fa20fff450d..94fec23b1c0b2 100644 --- a/clang/lib/Interpreter/DeviceOffload.cpp +++ b/clang/lib/Interpreter/DeviceOffload.cpp @@ -14,6 +14,7 @@ #include "DeviceOffload.h" #include "clang/Basic/TargetOptions.h" +#include "clang/CodeGen/BackendUtil.h" #include "clang/CodeGen/ModuleBuilder.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Interpreter/PartialTranslationUnit.h" @@ -43,7 +44,8 @@ IncrementalHIPDeviceParser::IncrementalHIPDeviceParser( llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> FS, llvm::Error &Err, std::list<PartialTranslationUnit> &PTUs) : IncrementalDeviceParser(DeviceInstance, HostInstance, DeviceAct, FS, Err, - PTUs) { + PTUs), + DeviceCI(DeviceInstance) { if (Err) return; if (!llvm::Triple(TargetOpts.Triple).isAMDGCN()) { @@ -56,8 +58,34 @@ IncrementalHIPDeviceParser::IncrementalHIPDeviceParser( } } +llvm::Expected<llvm::StringRef> +IncrementalHIPDeviceParser::GenerateDeviceObject() { + auto &PTU = PTUs.back(); + + CodeGenOptions CodeGenOptsForObj = DeviceCI.getCodeGenOpts(); + CodeGenOptsForObj.DisableLLVMPasses = true; + + ObjectContent.clear(); + auto ObjOS = std::make_unique<llvm::raw_svector_ostream>(ObjectContent); + emitBackendOutput(DeviceCI, CodeGenOptsForObj, PTU.TheModule.get(), + Backend_EmitObj, DeviceCI.getVirtualFileSystemPtr(), + std::move(ObjOS)); + + if (DeviceCI.getDiagnostics().hasErrorOccurred()) + return llvm::make_error<llvm::StringError>( + "Backend code generation failed for HIP device code.", + llvm::inconvertibleErrorCode()); + + return llvm::StringRef(ObjectContent.data(), ObjectContent.size()); +} + llvm::Error IncrementalHIPDeviceParser::GenerateOffloadBinary() { - // FIXME: Generate the HSACO and bundle it for the host compilation. + llvm::Expected<llvm::StringRef> Object = GenerateDeviceObject(); + if (!Object) + return Object.takeError(); + + // FIXME: Link the object into an HSACO and bundle it for the host + // compilation. return llvm::make_error<llvm::StringError>( "HIP offload binary generation is not supported yet.", llvm::inconvertibleErrorCode()); diff --git a/clang/lib/Interpreter/DeviceOffload.h b/clang/lib/Interpreter/DeviceOffload.h index 0275c0e10cda8..1b0f3e3d4bd59 100644 --- a/clang/lib/Interpreter/DeviceOffload.h +++ b/clang/lib/Interpreter/DeviceOffload.h @@ -56,6 +56,13 @@ class IncrementalHIPDeviceParser : public IncrementalDeviceParser { llvm::Error GenerateOffloadBinary() override; ~IncrementalHIPDeviceParser() override; + +private: + // Generate the AMDGPU object file for the last PTU. + llvm::Expected<llvm::StringRef> GenerateDeviceObject(); + + CompilerInstance &DeviceCI; + llvm::SmallVector<char, 0> ObjectContent; }; class IncrementalCUDADeviceParser : public IncrementalDeviceParser { `````````` </details> https://github.com/llvm/llvm-project/pull/234498 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
