mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 10:46:06 +00:00

Rather than shepherding a type name all the way to the backend as a string and attempting to parse it, get the element type out of the AST and store that in the resource annotation metadata directly. Pull Request: https://github.com/llvm/llvm-project/pull/75674
67 lines
2.4 KiB
C++
67 lines
2.4 KiB
C++
//===- HLSLResource.cpp - HLSL Resource helper objects --------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file This file contains helper objects for working with HLSL Resources.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Frontend/HLSL/HLSLResource.h"
|
|
#include "llvm/IR/IRBuilder.h"
|
|
#include "llvm/IR/Metadata.h"
|
|
#include "llvm/IR/Module.h"
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::hlsl;
|
|
|
|
GlobalVariable *FrontendResource::getGlobalVariable() {
|
|
return cast<GlobalVariable>(
|
|
cast<ConstantAsMetadata>(Entry->getOperand(0))->getValue());
|
|
}
|
|
|
|
ResourceKind FrontendResource::getResourceKind() {
|
|
return static_cast<ResourceKind>(
|
|
cast<ConstantInt>(
|
|
cast<ConstantAsMetadata>(Entry->getOperand(1))->getValue())
|
|
->getLimitedValue());
|
|
}
|
|
ElementType FrontendResource::getElementType() {
|
|
return static_cast<ElementType>(
|
|
cast<ConstantInt>(
|
|
cast<ConstantAsMetadata>(Entry->getOperand(2))->getValue())
|
|
->getLimitedValue());
|
|
}
|
|
bool FrontendResource::getIsROV() {
|
|
return cast<ConstantInt>(
|
|
cast<ConstantAsMetadata>(Entry->getOperand(3))->getValue())
|
|
->getLimitedValue();
|
|
}
|
|
uint32_t FrontendResource::getResourceIndex() {
|
|
return cast<ConstantInt>(
|
|
cast<ConstantAsMetadata>(Entry->getOperand(4))->getValue())
|
|
->getLimitedValue();
|
|
}
|
|
uint32_t FrontendResource::getSpace() {
|
|
return cast<ConstantInt>(
|
|
cast<ConstantAsMetadata>(Entry->getOperand(5))->getValue())
|
|
->getLimitedValue();
|
|
}
|
|
|
|
FrontendResource::FrontendResource(GlobalVariable *GV, ResourceKind RK,
|
|
ElementType ElTy, bool IsROV,
|
|
uint32_t ResIndex, uint32_t Space) {
|
|
auto &Ctx = GV->getContext();
|
|
IRBuilder<> B(Ctx);
|
|
Entry = MDNode::get(
|
|
Ctx, {ValueAsMetadata::get(GV),
|
|
ConstantAsMetadata::get(B.getInt32(static_cast<int>(RK))),
|
|
ConstantAsMetadata::get(B.getInt32(static_cast<int>(ElTy))),
|
|
ConstantAsMetadata::get(B.getInt1(IsROV)),
|
|
ConstantAsMetadata::get(B.getInt32(ResIndex)),
|
|
ConstantAsMetadata::get(B.getInt32(Space))});
|
|
}
|