/
redgpu
/
clspv
Обзор
Документация
Войти
/
redgpu
/
clspv
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lib/SPIRVOp.cpp
68 строк
2 KB
Marco Antognini
Fix compilation for 32-bit systems (#717)
15 мар 2021, 15:48
Не верифицирован
15 мар 2021, 15:48
7e33840
Код
Авторство
О чём код?
// Copyright 2019 The Clspv Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SPIRVOp.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" #include "Builtins.h" #include "Constants.h" namespace clspv { using namespace llvm; Instruction *InsertSPIRVOp(Instruction *Insert, spv::Op Opcode, ArrayRef<Attribute::AttrKind> Attributes, Type *RetType, ArrayRef<Value *> Args) { // Prepare mangled name std::string MangledName = clspv::SPIRVOpIntrinsicFunction(); MangledName += "."; MangledName += std::to_string(Opcode); MangledName += "."; for (auto Arg : Args) { MangledName += Builtins::GetMangledTypeName(Arg->getType()); } auto M = Insert->getModule(); auto Int32Ty = Type::getInt32Ty(M->getContext()); Function *func = M->getFunction(MangledName); if (!func) { // Create a function in the module SmallVector<Type *, 8> ArgTypes = {Int32Ty}; for (auto Arg : Args) { ArgTypes.push_back(Arg->getType()); } auto NewFType = FunctionType::get(RetType, ArgTypes, false); auto NewFTyC = M->getOrInsertFunction(MangledName, NewFType); func = cast<Function>(NewFTyC.getCallee()); for (auto A : Attributes) { func->addFnAttr(A); } } // Now call it with the values we were passed SmallVector<Value *, 8> ArgValues = {ConstantInt::get(Int32Ty, Opcode)}; for (auto Arg : Args) { ArgValues.push_back(Arg); } return CallInst::Create(func, ArgValues, "", Insert); } } // namespace clspv