clang 24.0.0git
LowerToLLVMMetadata.cpp
Go to the documentation of this file.
1//===- LowerToLLVMMetadata.cpp - CIR metadata lowering -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
11
12#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
13#include "mlir/IR/OperationSupport.h"
15#include "llvm/ADT/TypeSwitch.h"
16
17namespace cir {
18namespace direct {
19
21 : ctx(ctx) {}
22
23bool FunctionMetadataLowering::lower(mlir::NamedAttribute attr,
24 bool includeFunctionOnlyAttrs) {
25 return llvm::TypeSwitch<mlir::Attribute, bool>(attr.getValue())
26 .Case<cir::OpenCLKernelArgMetadataAttr>(
27 [&](cir::OpenCLKernelArgMetadataAttr clArgMetadata) {
28 if (includeFunctionOnlyAttrs)
29 lowerOpenCLKernelArgMetadata(clArgMetadata, functionMetadata);
30 return true;
31 })
32 .Case<cir::MaxWorkGroupSizeAttr>(
33 [&](cir::MaxWorkGroupSizeAttr maxWGSize) {
34 if (includeFunctionOnlyAttrs)
35 lower(maxWGSize);
36 return true;
37 })
38 .Default(false);
39}
40
43 if (!functionMetadata.empty()) {
44 result.push_back(mlir::NamedAttribute(
45 mlir::LLVM::LLVMFuncOp::getFunctionMetadataAttrName(mlir::OperationName(
46 mlir::LLVM::LLVMFuncOp::getOperationName(), ctx)),
47 mlir::ArrayAttr::get(ctx, functionMetadata)));
48 }
49}
50
51void FunctionMetadataLowering::lower(cir::MaxWorkGroupSizeAttr maxWGSize) {
52 LLVMMetadataNodeBuilder metadataBuilder(ctx);
53 unsigned sizes[] = {maxWGSize.getX(), maxWGSize.getY(), maxWGSize.getZ()};
54 functionMetadata.push_back(mlir::LLVM::FunctionMetadataAttr::get(
55 ctx, mlir::StringAttr::get(ctx, "max_work_group_size"),
56 metadataBuilder.getI32Node(sizes)));
57}
58
59} // namespace direct
60} // namespace cir
void appendAttrs(llvm::SmallVectorImpl< mlir::NamedAttribute > &result) const
bool lower(mlir::NamedAttribute attr, bool includeFunctionOnlyAttrs)
void lowerOpenCLKernelArgMetadata(cir::OpenCLKernelArgMetadataAttr clArgMetadata, llvm::SmallVectorImpl< mlir::Attribute > &entries)