1 /* 2 * Copyright (C) 2020-2021 Intel Corporation 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 */ 7 8 #pragma once 9 10 #include "shared/source/utilities/arrayref.h" 11 #include "shared/source/utilities/const_stringref.h" 12 13 #include <algorithm> 14 #include <cstdint> 15 16 namespace NEO { 17 18 static constexpr ConstStringRef llvmBcMagic = "BC\xc0\xde"; 19 static constexpr ConstStringRef spirvMagic = "\x07\x23\x02\x03"; 20 static constexpr ConstStringRef spirvMagicInv = "\x03\x02\x23\x07"; 21 hasSameMagic(ConstStringRef expectedMagic,ArrayRef<const uint8_t> binary)22inline bool hasSameMagic(ConstStringRef expectedMagic, ArrayRef<const uint8_t> binary) { 23 auto binaryMagicLen = std::min(expectedMagic.size(), binary.size()); 24 ConstStringRef binaryMagic(reinterpret_cast<const char *>(binary.begin()), binaryMagicLen); 25 return expectedMagic == binaryMagic; 26 } 27 isLlvmBitcode(ArrayRef<const uint8_t> binary)28inline bool isLlvmBitcode(ArrayRef<const uint8_t> binary) { 29 return hasSameMagic(llvmBcMagic, binary); 30 } 31 isSpirVBitcode(ArrayRef<const uint8_t> binary)32inline bool isSpirVBitcode(ArrayRef<const uint8_t> binary) { 33 return hasSameMagic(spirvMagic, binary) || hasSameMagic(spirvMagicInv, binary); 34 } 35 36 } // namespace NEO 37