12#ifndef CLANG_CIR_LOWERTOLLVM_H
13#define CLANG_CIR_LOWERTOLLVM_H
17#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
18#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
19#include "mlir/Transforms/DialectConversion.h"
29 mlir::ConversionPatternRewriter &rewriter,
30 const mlir::TypeConverter *converter);
35 cir::SideEffect sideEffect,
36 mlir::LLVM::MemoryEffectsAttr &memoryEffect,
37 bool &noUnwind,
bool &willReturn);
43 void mapBlockTag(cir::BlockAddrInfoAttr info, mlir::LLVM::BlockTagOp tagOp) {
44 auto result = blockInfoToTagOp.try_emplace(info, tagOp);
45 assert(result.second &&
46 "attempting to map a BlockTag operation that is already mapped");
51 return blockInfoToTagOp.lookup(info);
56 cir::BlockAddrInfoAttr info) {
57 unresolvedBlockAddressOp.try_emplace(op, info);
62 llvm::DenseMap<mlir::LLVM::BlockAddressOp, cir::BlockAddrInfoAttr> &
64 return unresolvedBlockAddressOp;
70 llvm::DenseMap<cir::BlockAddrInfoAttr, mlir::LLVM::BlockTagOp>
76 llvm::DenseMap<mlir::LLVM::BlockAddressOp, cir::BlockAddrInfoAttr>
77 unresolvedBlockAddressOp;
78 int32_t blockTagOpIndex;
81#define GET_LLVM_LOWERING_PATTERNS
82#include "clang/CIR/Dialect/IR/CIRLowering.inc"
83#undef GET_LLVM_LOWERING_PATTERNS
void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow, cir::SideEffect sideEffect, mlir::LLVM::MemoryEffectsAttr &memoryEffect, bool &noUnwind, bool &willReturn, bool &noReturn)
mlir::Value lowerCirAttrAsValue(mlir::Operation *parentOp, const mlir::Attribute attr, mlir::ConversionPatternRewriter &rewriter, const mlir::TypeConverter *converter, cir::LowerModule *lowerMod)
Switches on the type of attribute and calls the appropriate conversion.
mlir::LLVM::Linkage convertLinkage(cir::GlobalLinkageKind linkage)
mlir::LLVM::BlockTagOp lookupBlockTag(cir::BlockAddrInfoAttr info) const
void clearUnresolvedMap()
llvm::DenseMap< mlir::LLVM::BlockAddressOp, cir::BlockAddrInfoAttr > & getUnresolvedBlockAddress()
void mapBlockTag(cir::BlockAddrInfoAttr info, mlir::LLVM::BlockTagOp tagOp)
void addUnresolvedBlockAddress(mlir::LLVM::BlockAddressOp op, cir::BlockAddrInfoAttr info)