Path: blob/main/contrib/llvm-project/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
213845 views
//====- LowerToLLVM.h- Lowering from CIR to LLVM --------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file declares an interface for converting CIR modules to LLVM IR.9//10//===----------------------------------------------------------------------===//11#ifndef CLANG_CIR_LOWERTOLLVM_H12#define CLANG_CIR_LOWERTOLLVM_H1314#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"15#include "mlir/Dialect/LLVMIR/LLVMDialect.h"16#include "mlir/Transforms/DialectConversion.h"17#include "clang/CIR/Dialect/IR/CIRDialect.h"1819namespace cir {2021namespace direct {2223/// Convert a CIR attribute to an LLVM attribute. May use the datalayout for24/// lowering attributes to-be-stored in memory.25mlir::Value lowerCirAttrAsValue(mlir::Operation *parentOp, mlir::Attribute attr,26mlir::ConversionPatternRewriter &rewriter,27const mlir::TypeConverter *converter);2829mlir::LLVM::Linkage convertLinkage(cir::GlobalLinkageKind linkage);3031void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow,32cir::SideEffect sideEffect,33mlir::LLVM::MemoryEffectsAttr &memoryEffect,34bool &noUnwind, bool &willReturn);3536class CIRToLLVMAssumeOpLowering37: public mlir::OpConversionPattern<cir::AssumeOp> {38public:39using mlir::OpConversionPattern<cir::AssumeOp>::OpConversionPattern;4041mlir::LogicalResult42matchAndRewrite(cir::AssumeOp op, OpAdaptor,43mlir::ConversionPatternRewriter &) const override;44};4546class CIRToLLVMBitClrsbOpLowering47: public mlir::OpConversionPattern<cir::BitClrsbOp> {48public:49using mlir::OpConversionPattern<cir::BitClrsbOp>::OpConversionPattern;5051mlir::LogicalResult52matchAndRewrite(cir::BitClrsbOp op, OpAdaptor,53mlir::ConversionPatternRewriter &) const override;54};5556class CIRToLLVMBitClzOpLowering57: public mlir::OpConversionPattern<cir::BitClzOp> {58public:59using mlir::OpConversionPattern<cir::BitClzOp>::OpConversionPattern;6061mlir::LogicalResult62matchAndRewrite(cir::BitClzOp op, OpAdaptor,63mlir::ConversionPatternRewriter &) const override;64};6566class CIRToLLVMBitCtzOpLowering67: public mlir::OpConversionPattern<cir::BitCtzOp> {68public:69using mlir::OpConversionPattern<cir::BitCtzOp>::OpConversionPattern;7071mlir::LogicalResult72matchAndRewrite(cir::BitCtzOp op, OpAdaptor,73mlir::ConversionPatternRewriter &) const override;74};7576class CIRToLLVMBitParityOpLowering77: public mlir::OpConversionPattern<cir::BitParityOp> {78public:79using mlir::OpConversionPattern<cir::BitParityOp>::OpConversionPattern;8081mlir::LogicalResult82matchAndRewrite(cir::BitParityOp op, OpAdaptor,83mlir::ConversionPatternRewriter &) const override;84};8586class CIRToLLVMBitPopcountOpLowering87: public mlir::OpConversionPattern<cir::BitPopcountOp> {88public:89using mlir::OpConversionPattern<cir::BitPopcountOp>::OpConversionPattern;9091mlir::LogicalResult92matchAndRewrite(cir::BitPopcountOp op, OpAdaptor,93mlir::ConversionPatternRewriter &) const override;94};9596class CIRToLLVMBitReverseOpLowering97: public mlir::OpConversionPattern<cir::BitReverseOp> {98public:99using mlir::OpConversionPattern<cir::BitReverseOp>::OpConversionPattern;100101mlir::LogicalResult102matchAndRewrite(cir::BitReverseOp op, OpAdaptor,103mlir::ConversionPatternRewriter &) const override;104};105106class CIRToLLVMBrCondOpLowering107: public mlir::OpConversionPattern<cir::BrCondOp> {108public:109using mlir::OpConversionPattern<cir::BrCondOp>::OpConversionPattern;110111mlir::LogicalResult112matchAndRewrite(cir::BrCondOp op, OpAdaptor,113mlir::ConversionPatternRewriter &) const override;114};115116class CIRToLLVMByteSwapOpLowering117: public mlir::OpConversionPattern<cir::ByteSwapOp> {118public:119using mlir::OpConversionPattern<cir::ByteSwapOp>::OpConversionPattern;120121mlir::LogicalResult122matchAndRewrite(cir::ByteSwapOp op, OpAdaptor,123mlir::ConversionPatternRewriter &) const override;124};125126class CIRToLLVMCastOpLowering : public mlir::OpConversionPattern<cir::CastOp> {127mlir::DataLayout const &dataLayout;128129mlir::Type convertTy(mlir::Type ty) const;130131public:132CIRToLLVMCastOpLowering(const mlir::TypeConverter &typeConverter,133mlir::MLIRContext *context,134mlir::DataLayout const &dataLayout)135: OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}136137mlir::LogicalResult138matchAndRewrite(cir::CastOp op, OpAdaptor,139mlir::ConversionPatternRewriter &) const override;140};141142class CIRToLLVMExpectOpLowering143: public mlir::OpConversionPattern<cir::ExpectOp> {144public:145using mlir::OpConversionPattern<cir::ExpectOp>::OpConversionPattern;146147mlir::LogicalResult148matchAndRewrite(cir::ExpectOp op, OpAdaptor,149mlir::ConversionPatternRewriter &) const override;150};151152class CIRToLLVMReturnOpLowering153: public mlir::OpConversionPattern<cir::ReturnOp> {154public:155using mlir::OpConversionPattern<cir::ReturnOp>::OpConversionPattern;156157mlir::LogicalResult158matchAndRewrite(cir::ReturnOp op, OpAdaptor,159mlir::ConversionPatternRewriter &) const override;160};161162class CIRToLLVMCallOpLowering : public mlir::OpConversionPattern<cir::CallOp> {163public:164using mlir::OpConversionPattern<cir::CallOp>::OpConversionPattern;165166mlir::LogicalResult167matchAndRewrite(cir::CallOp op, OpAdaptor adaptor,168mlir::ConversionPatternRewriter &rewriter) const override;169};170171class CIRToLLVMAllocaOpLowering172: public mlir::OpConversionPattern<cir::AllocaOp> {173mlir::DataLayout const &dataLayout;174175public:176CIRToLLVMAllocaOpLowering(mlir::TypeConverter const &typeConverter,177mlir::MLIRContext *context,178mlir::DataLayout const &dataLayout)179: OpConversionPattern<cir::AllocaOp>(typeConverter, context),180dataLayout(dataLayout) {}181182using mlir::OpConversionPattern<cir::AllocaOp>::OpConversionPattern;183184mlir::LogicalResult185matchAndRewrite(cir::AllocaOp op, OpAdaptor,186mlir::ConversionPatternRewriter &) const override;187};188189class CIRToLLVMLoadOpLowering : public mlir::OpConversionPattern<cir::LoadOp> {190mlir::DataLayout const &dataLayout;191192public:193CIRToLLVMLoadOpLowering(const mlir::TypeConverter &typeConverter,194mlir::MLIRContext *context,195mlir::DataLayout const &dataLayout)196: OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}197198mlir::LogicalResult199matchAndRewrite(cir::LoadOp op, OpAdaptor,200mlir::ConversionPatternRewriter &) const override;201};202203class CIRToLLVMStoreOpLowering204: public mlir::OpConversionPattern<cir::StoreOp> {205mlir::DataLayout const &dataLayout;206207public:208CIRToLLVMStoreOpLowering(const mlir::TypeConverter &typeConverter,209mlir::MLIRContext *context,210mlir::DataLayout const &dataLayout)211: OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}212213mlir::LogicalResult214matchAndRewrite(cir::StoreOp op, OpAdaptor,215mlir::ConversionPatternRewriter &) const override;216};217218class CIRToLLVMConstantOpLowering219: public mlir::OpConversionPattern<cir::ConstantOp> {220public:221CIRToLLVMConstantOpLowering(const mlir::TypeConverter &typeConverter,222mlir::MLIRContext *context)223: OpConversionPattern(typeConverter, context) {224setHasBoundedRewriteRecursion();225}226227mlir::LogicalResult228matchAndRewrite(cir::ConstantOp op, OpAdaptor,229mlir::ConversionPatternRewriter &) const override;230};231232class CIRToLLVMFuncOpLowering : public mlir::OpConversionPattern<cir::FuncOp> {233static mlir::StringRef getLinkageAttrNameString() { return "linkage"; }234235void lowerFuncAttributes(236cir::FuncOp func, bool filterArgAndResAttrs,237mlir::SmallVectorImpl<mlir::NamedAttribute> &result) const;238239public:240using mlir::OpConversionPattern<cir::FuncOp>::OpConversionPattern;241242mlir::LogicalResult243matchAndRewrite(cir::FuncOp op, OpAdaptor,244mlir::ConversionPatternRewriter &) const override;245};246247class CIRToLLVMSwitchFlatOpLowering248: public mlir::OpConversionPattern<cir::SwitchFlatOp> {249public:250using mlir::OpConversionPattern<cir::SwitchFlatOp>::OpConversionPattern;251252mlir::LogicalResult253matchAndRewrite(cir::SwitchFlatOp op, OpAdaptor,254mlir::ConversionPatternRewriter &) const override;255};256257class CIRToLLVMGetGlobalOpLowering258: public mlir::OpConversionPattern<cir::GetGlobalOp> {259public:260using mlir::OpConversionPattern<cir::GetGlobalOp>::OpConversionPattern;261262mlir::LogicalResult263matchAndRewrite(cir::GetGlobalOp op, OpAdaptor,264mlir::ConversionPatternRewriter &) const override;265};266267class CIRToLLVMGlobalOpLowering268: public mlir::OpConversionPattern<cir::GlobalOp> {269const mlir::DataLayout &dataLayout;270271public:272CIRToLLVMGlobalOpLowering(const mlir::TypeConverter &typeConverter,273mlir::MLIRContext *context,274const mlir::DataLayout &dataLayout)275: OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {276setHasBoundedRewriteRecursion();277}278279mlir::LogicalResult280matchAndRewrite(cir::GlobalOp op, OpAdaptor adaptor,281mlir::ConversionPatternRewriter &rewriter) const override;282283private:284mlir::LogicalResult matchAndRewriteRegionInitializedGlobal(285cir::GlobalOp op, mlir::Attribute init,286mlir::ConversionPatternRewriter &rewriter) const;287288void setupRegionInitializedLLVMGlobalOp(289cir::GlobalOp op, mlir::ConversionPatternRewriter &rewriter) const;290291mutable mlir::LLVM::ComdatOp comdatOp = nullptr;292mlir::SymbolRefAttr getComdatAttr(cir::GlobalOp &op,293mlir::OpBuilder &builder) const;294};295296class CIRToLLVMUnaryOpLowering297: public mlir::OpConversionPattern<cir::UnaryOp> {298public:299using mlir::OpConversionPattern<cir::UnaryOp>::OpConversionPattern;300301mlir::LogicalResult302matchAndRewrite(cir::UnaryOp op, OpAdaptor,303mlir::ConversionPatternRewriter &) const override;304};305306class CIRToLLVMBinOpLowering : public mlir::OpConversionPattern<cir::BinOp> {307mlir::LLVM::IntegerOverflowFlags getIntOverflowFlag(cir::BinOp op) const;308309public:310using mlir::OpConversionPattern<cir::BinOp>::OpConversionPattern;311312mlir::LogicalResult313matchAndRewrite(cir::BinOp op, OpAdaptor,314mlir::ConversionPatternRewriter &) const override;315};316317class CIRToLLVMCmpOpLowering : public mlir::OpConversionPattern<cir::CmpOp> {318public:319CIRToLLVMCmpOpLowering(const mlir::TypeConverter &typeConverter,320mlir::MLIRContext *context)321: OpConversionPattern(typeConverter, context) {322setHasBoundedRewriteRecursion();323}324325mlir::LogicalResult326matchAndRewrite(cir::CmpOp op, OpAdaptor,327mlir::ConversionPatternRewriter &) const override;328};329330class CIRToLLVMShiftOpLowering331: public mlir::OpConversionPattern<cir::ShiftOp> {332public:333using mlir::OpConversionPattern<cir::ShiftOp>::OpConversionPattern;334335mlir::LogicalResult336matchAndRewrite(cir::ShiftOp op, OpAdaptor,337mlir::ConversionPatternRewriter &) const override;338};339340class CIRToLLVMSelectOpLowering341: public mlir::OpConversionPattern<cir::SelectOp> {342public:343using mlir::OpConversionPattern<cir::SelectOp>::OpConversionPattern;344345mlir::LogicalResult346matchAndRewrite(cir::SelectOp op, OpAdaptor,347mlir::ConversionPatternRewriter &) const override;348};349350class CIRToLLVMBrOpLowering : public mlir::OpConversionPattern<cir::BrOp> {351public:352using mlir::OpConversionPattern<cir::BrOp>::OpConversionPattern;353354mlir::LogicalResult355matchAndRewrite(cir::BrOp op, OpAdaptor,356mlir::ConversionPatternRewriter &) const override;357};358359class CIRToLLVMGetMemberOpLowering360: public mlir::OpConversionPattern<cir::GetMemberOp> {361public:362using mlir::OpConversionPattern<cir::GetMemberOp>::OpConversionPattern;363364mlir::LogicalResult365matchAndRewrite(cir::GetMemberOp op, OpAdaptor,366mlir::ConversionPatternRewriter &) const override;367};368369class CIRToLLVMTrapOpLowering : public mlir::OpConversionPattern<cir::TrapOp> {370public:371using mlir::OpConversionPattern<cir::TrapOp>::OpConversionPattern;372373mlir::LogicalResult374matchAndRewrite(cir::TrapOp op, OpAdaptor,375mlir::ConversionPatternRewriter &) const override;376};377378class CIRToLLVMPtrStrideOpLowering379: public mlir::OpConversionPattern<cir::PtrStrideOp> {380mlir::DataLayout const &dataLayout;381382public:383CIRToLLVMPtrStrideOpLowering(const mlir::TypeConverter &typeConverter,384mlir::MLIRContext *context,385mlir::DataLayout const &dataLayout)386: OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}387using mlir::OpConversionPattern<cir::PtrStrideOp>::OpConversionPattern;388389mlir::LogicalResult390matchAndRewrite(cir::PtrStrideOp op, OpAdaptor,391mlir::ConversionPatternRewriter &) const override;392};393394class CIRToLLVMBaseClassAddrOpLowering395: public mlir::OpConversionPattern<cir::BaseClassAddrOp> {396public:397using mlir::OpConversionPattern<cir::BaseClassAddrOp>::OpConversionPattern;398399mlir::LogicalResult400matchAndRewrite(cir::BaseClassAddrOp op, OpAdaptor,401mlir::ConversionPatternRewriter &) const override;402};403404class CIRToLLVMStackSaveOpLowering405: public mlir::OpConversionPattern<cir::StackSaveOp> {406public:407using mlir::OpConversionPattern<cir::StackSaveOp>::OpConversionPattern;408409mlir::LogicalResult410matchAndRewrite(cir::StackSaveOp op, OpAdaptor,411mlir::ConversionPatternRewriter &) const override;412};413414class CIRToLLVMStackRestoreOpLowering415: public mlir::OpConversionPattern<cir::StackRestoreOp> {416public:417using OpConversionPattern<cir::StackRestoreOp>::OpConversionPattern;418419mlir::LogicalResult420matchAndRewrite(cir::StackRestoreOp op, OpAdaptor adaptor,421mlir::ConversionPatternRewriter &rewriter) const override;422};423424class CIRToLLVMVecCreateOpLowering425: public mlir::OpConversionPattern<cir::VecCreateOp> {426public:427using mlir::OpConversionPattern<cir::VecCreateOp>::OpConversionPattern;428429mlir::LogicalResult430matchAndRewrite(cir::VecCreateOp op, OpAdaptor,431mlir::ConversionPatternRewriter &) const override;432};433434class CIRToLLVMVecExtractOpLowering435: public mlir::OpConversionPattern<cir::VecExtractOp> {436public:437using mlir::OpConversionPattern<cir::VecExtractOp>::OpConversionPattern;438439mlir::LogicalResult440matchAndRewrite(cir::VecExtractOp op, OpAdaptor,441mlir::ConversionPatternRewriter &) const override;442};443444class CIRToLLVMVecInsertOpLowering445: public mlir::OpConversionPattern<cir::VecInsertOp> {446public:447using mlir::OpConversionPattern<cir::VecInsertOp>::OpConversionPattern;448449mlir::LogicalResult450matchAndRewrite(cir::VecInsertOp op, OpAdaptor,451mlir::ConversionPatternRewriter &) const override;452};453454class CIRToLLVMVecCmpOpLowering455: public mlir::OpConversionPattern<cir::VecCmpOp> {456public:457using mlir::OpConversionPattern<cir::VecCmpOp>::OpConversionPattern;458459mlir::LogicalResult460matchAndRewrite(cir::VecCmpOp op, OpAdaptor,461mlir::ConversionPatternRewriter &) const override;462};463464class CIRToLLVMVecSplatOpLowering465: public mlir::OpConversionPattern<cir::VecSplatOp> {466public:467using mlir::OpConversionPattern<cir::VecSplatOp>::OpConversionPattern;468469mlir::LogicalResult470matchAndRewrite(cir::VecSplatOp op, OpAdaptor,471mlir::ConversionPatternRewriter &) const override;472};473474class CIRToLLVMVecShuffleOpLowering475: public mlir::OpConversionPattern<cir::VecShuffleOp> {476public:477using mlir::OpConversionPattern<cir::VecShuffleOp>::OpConversionPattern;478479mlir::LogicalResult480matchAndRewrite(cir::VecShuffleOp op, OpAdaptor,481mlir::ConversionPatternRewriter &) const override;482};483484class CIRToLLVMVecShuffleDynamicOpLowering485: public mlir::OpConversionPattern<cir::VecShuffleDynamicOp> {486public:487using mlir::OpConversionPattern<488cir::VecShuffleDynamicOp>::OpConversionPattern;489490mlir::LogicalResult491matchAndRewrite(cir::VecShuffleDynamicOp op, OpAdaptor,492mlir::ConversionPatternRewriter &) const override;493};494495class CIRToLLVMVecTernaryOpLowering496: public mlir::OpConversionPattern<cir::VecTernaryOp> {497public:498using mlir::OpConversionPattern<cir::VecTernaryOp>::OpConversionPattern;499500mlir::LogicalResult501matchAndRewrite(cir::VecTernaryOp op, OpAdaptor,502mlir::ConversionPatternRewriter &) const override;503};504505class CIRToLLVMComplexCreateOpLowering506: public mlir::OpConversionPattern<cir::ComplexCreateOp> {507public:508using mlir::OpConversionPattern<cir::ComplexCreateOp>::OpConversionPattern;509510mlir::LogicalResult511matchAndRewrite(cir::ComplexCreateOp op, OpAdaptor,512mlir::ConversionPatternRewriter &) const override;513};514515class CIRToLLVMComplexRealOpLowering516: public mlir::OpConversionPattern<cir::ComplexRealOp> {517public:518using mlir::OpConversionPattern<cir::ComplexRealOp>::OpConversionPattern;519520mlir::LogicalResult521matchAndRewrite(cir::ComplexRealOp op, OpAdaptor,522mlir::ConversionPatternRewriter &) const override;523};524525class CIRToLLVMComplexImagOpLowering526: public mlir::OpConversionPattern<cir::ComplexImagOp> {527public:528using mlir::OpConversionPattern<cir::ComplexImagOp>::OpConversionPattern;529530mlir::LogicalResult531matchAndRewrite(cir::ComplexImagOp op, OpAdaptor,532mlir::ConversionPatternRewriter &) const override;533};534535class CIRToLLVMComplexImagPtrOpLowering536: public mlir::OpConversionPattern<cir::ComplexImagPtrOp> {537public:538using mlir::OpConversionPattern<cir::ComplexImagPtrOp>::OpConversionPattern;539540mlir::LogicalResult541matchAndRewrite(cir::ComplexImagPtrOp op, OpAdaptor,542mlir::ConversionPatternRewriter &) const override;543};544545class CIRToLLVMComplexRealPtrOpLowering546: public mlir::OpConversionPattern<cir::ComplexRealPtrOp> {547public:548using mlir::OpConversionPattern<cir::ComplexRealPtrOp>::OpConversionPattern;549550mlir::LogicalResult551matchAndRewrite(cir::ComplexRealPtrOp op, OpAdaptor,552mlir::ConversionPatternRewriter &) const override;553};554555class CIRToLLVMComplexAddOpLowering556: public mlir::OpConversionPattern<cir::ComplexAddOp> {557public:558using mlir::OpConversionPattern<cir::ComplexAddOp>::OpConversionPattern;559560mlir::LogicalResult561matchAndRewrite(cir::ComplexAddOp op, OpAdaptor,562mlir::ConversionPatternRewriter &) const override;563};564565class CIRToLLVMComplexSubOpLowering566: public mlir::OpConversionPattern<cir::ComplexSubOp> {567public:568using mlir::OpConversionPattern<cir::ComplexSubOp>::OpConversionPattern;569570mlir::LogicalResult571matchAndRewrite(cir::ComplexSubOp op, OpAdaptor,572mlir::ConversionPatternRewriter &) const override;573};574575class CIRToLLVMSetBitfieldOpLowering576: public mlir::OpConversionPattern<cir::SetBitfieldOp> {577public:578using mlir::OpConversionPattern<cir::SetBitfieldOp>::OpConversionPattern;579580mlir::LogicalResult581matchAndRewrite(cir::SetBitfieldOp op, OpAdaptor,582mlir::ConversionPatternRewriter &) const override;583};584585class CIRToLLVMGetBitfieldOpLowering586: public mlir::OpConversionPattern<cir::GetBitfieldOp> {587public:588using mlir::OpConversionPattern<cir::GetBitfieldOp>::OpConversionPattern;589590mlir::LogicalResult591matchAndRewrite(cir::GetBitfieldOp op, OpAdaptor,592mlir::ConversionPatternRewriter &) const override;593};594595} // namespace direct596} // namespace cir597598#endif // CLANG_CIR_LOWERTOLLVM_H599600601