1 //===- LoweringOptions.h - Common config for lowering to LLVM ---*- C++ -*-===// 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 // Provides a configuration shared by several conversions targeting the LLVM 10 // dialect. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef MLIR_CONVERSION_LLVMCOMMON_LOWERINGOPTIONS_H 15 #define MLIR_CONVERSION_LLVMCOMMON_LOWERINGOPTIONS_H 16 17 #include "llvm/IR/DataLayout.h" 18 19 namespace mlir { 20 21 class DataLayout; 22 class MLIRContext; 23 24 /// Value to pass as bitwidth for the index type when the converter is expected 25 /// to derive the bitwidth from the LLVM data layout. 26 static constexpr unsigned kDeriveIndexBitwidthFromDataLayout = 0; 27 28 /// Options to control the LLVM lowering. The struct is used to share lowering 29 /// options between passes, patterns, and type converter. 30 class LowerToLLVMOptions { 31 public: 32 explicit LowerToLLVMOptions(MLIRContext *ctx); 33 LowerToLLVMOptions(MLIRContext *ctx, const DataLayout &dl); 34 35 bool useBarePtrCallConv = false; 36 37 enum class AllocLowering { 38 /// Use malloc for heap allocations. 39 Malloc, 40 41 /// Use aligned_alloc for heap allocations. 42 AlignedAlloc, 43 44 /// Do not lower heap allocations. Users must provide their own patterns for 45 /// AllocOp and DeallocOp lowering. 46 None 47 }; 48 49 AllocLowering allocLowering = AllocLowering::Malloc; 50 51 bool useGenericFunctions = false; 52 53 /// The data layout of the module to produce. This must be consistent with the 54 /// data layout used in the upper levels of the lowering pipeline. 55 // TODO: this should be replaced by MLIR data layout when one exists. 56 llvm::DataLayout dataLayout = llvm::DataLayout(""); 57 58 /// Set the index bitwidth to the given value. overrideIndexBitwidth(unsigned bitwidth)59 void overrideIndexBitwidth(unsigned bitwidth) { 60 assert(bitwidth != kDeriveIndexBitwidthFromDataLayout && 61 "can only override to a concrete bitwidth"); 62 indexBitwidth = bitwidth; 63 } 64 65 /// Get the index bitwidth. getIndexBitwidth()66 unsigned getIndexBitwidth() const { return indexBitwidth; } 67 68 private: 69 unsigned indexBitwidth; 70 }; 71 72 } // namespace mlir 73 74 #endif // MLIR_CONVERSION_LLVMCOMMON_LOWERINGOPTIONS_H 75