1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2021-2023 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#include <cm-cl/vector.h>
#include <opencl_def.h>
#include <vc/BiF/PrintfIface.h>
#include "common.h"
using namespace vc::bif::printf;
using namespace cm;
static constexpr int StringAnnotationSize = sizeof(uintptr_t);
// StringAnnotationSize but in DWords.
static constexpr int StringDWordSize = StringAnnotationSize / 4;
// Format string handling. Just writing format string pointer to buffer and
// promoting the pointer to buffer.
template <typename T>
vector<BufferElementTy, TransferDataSize>
printf_fmt_impl(vector<BufferElementTy, TransferDataSize> TransferData,
T *FormatString) {
if (TransferData[TransferDataLayout::ReturnValue])
// Just skip.
return TransferData;
__global BufferElementTy *CurAddress = getCurAddress(TransferData);
auto StrAddress = castPointerToVector(FormatString);
for (int Idx = 0; Idx != StringDWordSize; ++Idx)
CurAddress = writeElementToBuffer(CurAddress, StrAddress[Idx]);
setCurAddress(TransferData, CurAddress);
return TransferData;
}
// String must be handled separately in order ocl printf to work.
// It can be treated as any other argument in zebin case.
template <typename T>
vector<BufferElementTy, TransferDataSize>
printf_arg_str_impl(vector<BufferElementTy, TransferDataSize> TransferData,
T *String) {
return printf_arg_impl<StringDWordSize>(TransferData, ArgKind::String,
castPointerToVector(String));
}
extern "C" cl_vector<BufferElementTy, TransferDataSize>
__vc_assert_init(cl_vector<int, ArgsInfoVector::Size> ArgsInfo) {
return printf_init_impl<StringAnnotationSize, true>(ArgsInfo).cl_vector();
}
extern "C" cl_vector<BufferElementTy, TransferDataSize>
__vc_printf_init(cl_vector<int, ArgsInfoVector::Size> ArgsInfo) {
return printf_init_impl<StringAnnotationSize>(ArgsInfo).cl_vector();
}
extern "C" cl_vector<BufferElementTy, TransferDataSize>
__vc_printf_fmt(cl_vector<BufferElementTy, TransferDataSize> TransferData,
__constant char *FormatString) {
return printf_fmt_impl(TransferData, FormatString).cl_vector();
}
extern "C" cl_vector<BufferElementTy, TransferDataSize> __vc_printf_fmt_global(
cl_vector<BufferElementTy, TransferDataSize> TransferData,
__global char *FormatString) {
return printf_fmt_impl(TransferData, FormatString).cl_vector();
}
// legacy VC IR has no address spaces, so every pointer is "private".
extern "C" cl_vector<BufferElementTy, TransferDataSize> __vc_printf_fmt_legacy(
cl_vector<BufferElementTy, TransferDataSize> TransferData,
__private char *FormatString) {
return printf_fmt_impl(TransferData, FormatString).cl_vector();
}
extern "C" cl_vector<BufferElementTy, TransferDataSize>
__vc_printf_arg(cl_vector<BufferElementTy, TransferDataSize> TransferData,
ArgKind::Enum Kind,
cl_vector<BufferElementTy, ArgData::Size> Arg) {
return printf_arg_impl<StringDWordSize>(TransferData, Kind, Arg).cl_vector();
}
extern "C" cl_vector<BufferElementTy, TransferDataSize>
__vc_printf_arg_str(cl_vector<BufferElementTy, TransferDataSize> TransferData,
__constant char *String) {
return printf_arg_str_impl(TransferData, String).cl_vector();
}
extern "C" cl_vector<BufferElementTy, TransferDataSize>
__vc_printf_arg_str_global(
cl_vector<BufferElementTy, TransferDataSize> TransferData,
__global char *String) {
return printf_arg_str_impl(TransferData, String).cl_vector();
}
// legacy VC IR has no address spaces, so every pointer is "private".
extern "C" cl_vector<BufferElementTy, TransferDataSize>
__vc_printf_arg_str_legacy(
cl_vector<BufferElementTy, TransferDataSize> TransferData,
__private char *String) {
return printf_arg_str_impl(TransferData, String).cl_vector();
}
extern "C" int
__vc_printf_ret(cl_vector<BufferElementTy, TransferDataSize> TransferData) {
return printf_ret_impl(TransferData);
}
|