compute-runtime/shared/source/device_binary_format/ar/ar_decoder.h

87 lines
2.2 KiB
C++

/*
* Copyright (C) 2020 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "compiler_interface/intermediate_representations.h"
#include "device_binary_format/ar/ar.h"
#include "utilities/arrayref.h"
#include "utilities/stackvec.h"
namespace NEO {
namespace Ar {
struct ArFileEntryHeaderAndData {
ConstStringRef fileName;
ArrayRef<const uint8_t> fileData;
const ArFileEntryHeader *fullHeader = nullptr;
};
struct Ar {
const char *magic = nullptr;
StackVec<ArFileEntryHeaderAndData, 32> files;
ArFileEntryHeaderAndData longFileNamesEntry;
};
inline bool isAr(const ArrayRef<const uint8_t> binary) {
return NEO::hasSameMagic(arMagic, binary);
}
template <uint32_t MaxLength>
inline uint64_t readDecimal(const char *decimalAsString) {
uint64_t ret = 0U;
for (uint32_t i = 0; i < MaxLength; ++i) {
if (('\0' == decimalAsString[i]) || (' ' == decimalAsString[i])) {
break;
}
ret = ret * 10 + (decimalAsString[i] - '0');
}
return ret;
}
inline bool isStringPadding(char character) {
switch (character) {
default:
return false;
case ' ':
return true;
case '\0':
return true;
case '/':
return true;
}
}
template <uint32_t MaxLength>
inline ConstStringRef readUnpaddedString(const char *paddedString) {
uint32_t unpaddedSize = MaxLength - 1;
for (; unpaddedSize > 0U; --unpaddedSize) {
if (false == isStringPadding(paddedString[unpaddedSize])) {
break;
}
}
if (false == isStringPadding(paddedString[unpaddedSize])) {
++unpaddedSize;
}
return ConstStringRef(paddedString, unpaddedSize);
}
inline ConstStringRef readLongFileName(ConstStringRef longFileNamesSection, size_t offset) {
size_t end = offset;
while ((end < longFileNamesSection.size()) && (longFileNamesSection[end] != SpecialFileNames::fileNameTerminator)) {
++end;
}
return ConstStringRef(longFileNamesSection.begin() + offset, end - offset);
}
Ar decodeAr(const ArrayRef<const uint8_t> binary, std::string &outErrReason, std::string &outWarnings);
} // namespace Ar
} // namespace NEO