Files
clang-p2996/offload/src/DeviceImage.cpp
Johannes Doerfert 08533a3ee8 [Offload][NFC] Reorganize utils:: and make Device/Host/Shared clearer (#100280)
We had three `utils::` namespaces, all with different "meaning" (host,
device, hsa_utils). We should, when we can, keep "include/Shared"
accessible from host and device, thus RefCountTy has been moved to a
separate header. `hsa_utils` was introduced to make `utils::` less
overloaded. And common functionality was de-duplicated, e.g.,
`utils::advance` and `utils::advanceVoidPtr` -> `utils:advancePtr`. Type
punning now checks for the size of the result to make sure it matches
the source type.

No functional change was intended.
2024-09-05 13:36:26 -07:00

49 lines
1.6 KiB
C++

//===-- DeviceImage.cpp - Representation of the device code/image ---------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
//===----------------------------------------------------------------------===//
#include "DeviceImage.h"
#include "OffloadEntry.h"
#include "Shared/APITypes.h"
#include "Shared/Debug.h"
#include "Shared/Utils.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Support/Error.h"
#include <memory>
__tgt_bin_desc *OffloadEntryTy::getBinaryDescription() const {
return &DeviceImage.getBinaryDesc();
}
DeviceImageTy::DeviceImageTy(__tgt_bin_desc &BinaryDesc,
__tgt_device_image &TgtDeviceImage)
: BinaryDesc(&BinaryDesc), Image(TgtDeviceImage) {
llvm::StringRef ImageStr(static_cast<char *>(Image.ImageStart),
utils::getPtrDiff(Image.ImageEnd, Image.ImageStart));
auto BinaryOrErr =
llvm::object::OffloadBinary::create(llvm::MemoryBufferRef(ImageStr, ""));
if (!BinaryOrErr) {
consumeError(BinaryOrErr.takeError());
return;
}
Binary = std::move(*BinaryOrErr);
void *Begin = const_cast<void *>(
static_cast<const void *>(Binary->getImage().bytes_begin()));
void *End = const_cast<void *>(
static_cast<const void *>(Binary->getImage().bytes_end()));
Image = __tgt_device_image{Begin, End, Image.EntriesBegin, Image.EntriesEnd};
}