1 //===- StructBuilder.cpp - Helper for building LLVM structs --------------===// 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 9 #include "mlir/Conversion/LLVMCommon/StructBuilder.h" 10 #include "mlir/Dialect/LLVMIR/LLVMDialect.h" 11 #include "mlir/Dialect/LLVMIR/LLVMTypes.h" 12 #include "mlir/IR/Builders.h" 13 14 using namespace mlir; 15 16 //===----------------------------------------------------------------------===// 17 // StructBuilder implementation 18 //===----------------------------------------------------------------------===// 19 20 StructBuilder::StructBuilder(Value v) : value(v), structType(v.getType()) { 21 assert(value != nullptr && "value cannot be null"); 22 assert(LLVM::isCompatibleType(structType) && "expected llvm type"); 23 } 24 25 Value StructBuilder::extractPtr(OpBuilder &builder, Location loc, 26 unsigned pos) { 27 Type type = structType.cast<LLVM::LLVMStructType>().getBody()[pos]; 28 return builder.create<LLVM::ExtractValueOp>(loc, type, value, 29 builder.getI64ArrayAttr(pos)); 30 } 31 32 void StructBuilder::setPtr(OpBuilder &builder, Location loc, unsigned pos, 33 Value ptr) { 34 value = builder.create<LLVM::InsertValueOp>(loc, structType, value, ptr, 35 builder.getI64ArrayAttr(pos)); 36 } 37