1*b5d847b1SAlex Zinenko //===- StructBuilder.cpp - Helper for building LLVM structs --------------===//
2*b5d847b1SAlex Zinenko //
3*b5d847b1SAlex Zinenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*b5d847b1SAlex Zinenko // See https://llvm.org/LICENSE.txt for license information.
5*b5d847b1SAlex Zinenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*b5d847b1SAlex Zinenko //
7*b5d847b1SAlex Zinenko //===----------------------------------------------------------------------===//
8*b5d847b1SAlex Zinenko
9*b5d847b1SAlex Zinenko #include "mlir/Conversion/LLVMCommon/StructBuilder.h"
10*b5d847b1SAlex Zinenko #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
11*b5d847b1SAlex Zinenko #include "mlir/Dialect/LLVMIR/LLVMTypes.h"
12*b5d847b1SAlex Zinenko #include "mlir/IR/Builders.h"
13*b5d847b1SAlex Zinenko
14*b5d847b1SAlex Zinenko using namespace mlir;
15*b5d847b1SAlex Zinenko
16*b5d847b1SAlex Zinenko //===----------------------------------------------------------------------===//
17*b5d847b1SAlex Zinenko // StructBuilder implementation
18*b5d847b1SAlex Zinenko //===----------------------------------------------------------------------===//
19*b5d847b1SAlex Zinenko
StructBuilder(Value v)20*b5d847b1SAlex Zinenko StructBuilder::StructBuilder(Value v) : value(v), structType(v.getType()) {
21*b5d847b1SAlex Zinenko assert(value != nullptr && "value cannot be null");
22*b5d847b1SAlex Zinenko assert(LLVM::isCompatibleType(structType) && "expected llvm type");
23*b5d847b1SAlex Zinenko }
24*b5d847b1SAlex Zinenko
extractPtr(OpBuilder & builder,Location loc,unsigned pos)25*b5d847b1SAlex Zinenko Value StructBuilder::extractPtr(OpBuilder &builder, Location loc,
26*b5d847b1SAlex Zinenko unsigned pos) {
27*b5d847b1SAlex Zinenko Type type = structType.cast<LLVM::LLVMStructType>().getBody()[pos];
28*b5d847b1SAlex Zinenko return builder.create<LLVM::ExtractValueOp>(loc, type, value,
29*b5d847b1SAlex Zinenko builder.getI64ArrayAttr(pos));
30*b5d847b1SAlex Zinenko }
31*b5d847b1SAlex Zinenko
setPtr(OpBuilder & builder,Location loc,unsigned pos,Value ptr)32*b5d847b1SAlex Zinenko void StructBuilder::setPtr(OpBuilder &builder, Location loc, unsigned pos,
33*b5d847b1SAlex Zinenko Value ptr) {
34*b5d847b1SAlex Zinenko value = builder.create<LLVM::InsertValueOp>(loc, structType, value, ptr,
35*b5d847b1SAlex Zinenko builder.getI64ArrayAttr(pos));
36*b5d847b1SAlex Zinenko }
37