1330d8983SJohannes Doerfert //===-- DeviceImage.cpp - Representation of the device code/image ---------===// 2330d8983SJohannes Doerfert // 3330d8983SJohannes Doerfert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4330d8983SJohannes Doerfert // See https://llvm.org/LICENSE.txt for license information. 5330d8983SJohannes Doerfert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6330d8983SJohannes Doerfert // 7330d8983SJohannes Doerfert //===----------------------------------------------------------------------===// 8330d8983SJohannes Doerfert // 9330d8983SJohannes Doerfert //===----------------------------------------------------------------------===// 10330d8983SJohannes Doerfert 11330d8983SJohannes Doerfert #include "DeviceImage.h" 12330d8983SJohannes Doerfert 13330d8983SJohannes Doerfert #include "OffloadEntry.h" 14330d8983SJohannes Doerfert #include "Shared/APITypes.h" 15330d8983SJohannes Doerfert #include "Shared/Debug.h" 16330d8983SJohannes Doerfert #include "Shared/Utils.h" 17330d8983SJohannes Doerfert 18330d8983SJohannes Doerfert #include "llvm/ADT/iterator_range.h" 19330d8983SJohannes Doerfert #include "llvm/Support/Error.h" 20330d8983SJohannes Doerfert #include <memory> 21330d8983SJohannes Doerfert 22330d8983SJohannes Doerfert __tgt_bin_desc *OffloadEntryTy::getBinaryDescription() const { 23330d8983SJohannes Doerfert return &DeviceImage.getBinaryDesc(); 24330d8983SJohannes Doerfert } 25330d8983SJohannes Doerfert 26330d8983SJohannes Doerfert DeviceImageTy::DeviceImageTy(__tgt_bin_desc &BinaryDesc, 27330d8983SJohannes Doerfert __tgt_device_image &TgtDeviceImage) 28330d8983SJohannes Doerfert : BinaryDesc(&BinaryDesc), Image(TgtDeviceImage) { 29330d8983SJohannes Doerfert 30*08533a3eSJohannes Doerfert llvm::StringRef ImageStr(static_cast<char *>(Image.ImageStart), 31*08533a3eSJohannes Doerfert utils::getPtrDiff(Image.ImageEnd, Image.ImageStart)); 32330d8983SJohannes Doerfert 33330d8983SJohannes Doerfert auto BinaryOrErr = 34330d8983SJohannes Doerfert llvm::object::OffloadBinary::create(llvm::MemoryBufferRef(ImageStr, "")); 35330d8983SJohannes Doerfert 36330d8983SJohannes Doerfert if (!BinaryOrErr) { 37330d8983SJohannes Doerfert consumeError(BinaryOrErr.takeError()); 38330d8983SJohannes Doerfert return; 39330d8983SJohannes Doerfert } 40330d8983SJohannes Doerfert 41330d8983SJohannes Doerfert Binary = std::move(*BinaryOrErr); 42330d8983SJohannes Doerfert void *Begin = const_cast<void *>( 43330d8983SJohannes Doerfert static_cast<const void *>(Binary->getImage().bytes_begin())); 44330d8983SJohannes Doerfert void *End = const_cast<void *>( 45330d8983SJohannes Doerfert static_cast<const void *>(Binary->getImage().bytes_end())); 46330d8983SJohannes Doerfert 47330d8983SJohannes Doerfert Image = __tgt_device_image{Begin, End, Image.EntriesBegin, Image.EntriesEnd}; 48330d8983SJohannes Doerfert } 49