text: //===- StructBuilder.h - Helper for building LLVM structs -------*- C++ -*-===//
  //
  // 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
  //
  //===----------------------------------------------------------------------===//
  //
  // Provides a convenience API for emitting IR that inspects or constructs values
  // of LLVM dialect structure types.
  //
  //===----------------------------------------------------------------------===//
  
  #ifndef MLIR_CONVERSION_LLVMCOMMON_STRUCTBUILDER_H
  #define MLIR_CONVERSION_LLVMCOMMON_STRUCTBUILDER_H
  
  #include "mlir/IR/Types.h"
  #include "mlir/IR/Value.h"
  
  namespace mlir {
  
  class OpBuilder;
  
  /// Helper class to produce LLVM dialect operations extracting or inserting
  /// values to a struct.
  class StructBuilder {
  public:
    /// Construct a helper for the given value.
    explicit StructBuilder(Value v);
    /// Builds IR creating an `undef` value of the descriptor type.
    static StructBuilder undef(OpBuilder &builder, Location loc,
                               Type descriptorType);
  
    /*implicit*/ operator Value() { return value; }
  
  protected:
    // LLVM value
    Value value;
    // Cached struct type.
    Type structType;
  
  protected:
    /// Builds IR to extract a value from the struct at position pos
    Value extractPtr(OpBuilder &builder, Location loc, unsigned pos);
    /// Builds IR to set a value in the struct at position pos
    void setPtr(OpBuilder &builder, Location loc, unsigned pos, Value ptr);
  };
  
  } // namespace mlir
  
  #endif // MLIR_CONVERSION_LLVMCOMMON_STRUCTBUILDER_H
  