1//===----------------------------------------------------------------------===//
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// This file implements lowering of CIR attributes and operations directly to
10// LLVMIR.
11//
12//===----------------------------------------------------------------------===//
13
14#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
15#include "mlir/IR/DialectRegistry.h"
16#include "mlir/Target/LLVMIR/LLVMTranslationInterface.h"
17#include "mlir/Target/LLVMIR/ModuleTranslation.h"
18#include "clang/CIR/Dialect/IR/CIRAttrs.h"
19#include "clang/CIR/Dialect/IR/CIRDialect.h"
20#include "clang/CIR/MissingFeatures.h"
21#include "llvm/ADT/ArrayRef.h"
22#include "llvm/IR/Constant.h"
23#include "llvm/IR/GlobalVariable.h"
24
25using namespace llvm;
26
27namespace cir {
28namespace direct {
29
30/// Implementation of the dialect interface that converts CIR attributes to LLVM
31/// IR metadata.
32class CIRDialectLLVMIRTranslationInterface
33 : public mlir::LLVMTranslationDialectInterface {
34public:
35 using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface;
36
37 /// Translates the given operation to LLVM IR using the provided IR builder
38 /// and saving the state in `moduleTranslation`.
39 mlir::LogicalResult convertOperation(
40 mlir::Operation *op, llvm::IRBuilderBase &builder,
41 mlir::LLVM::ModuleTranslation &moduleTranslation) const final {
42
43 if (auto cirOp = llvm::dyn_cast<mlir::LLVM::ZeroOp>(op))
44 moduleTranslation.mapValue(cirOp.getResult()) =
45 llvm::Constant::getNullValue(
46 Ty: moduleTranslation.convertType(cirOp.getType()));
47
48 return mlir::success();
49 }
50};
51
52void registerCIRDialectTranslation(mlir::DialectRegistry &registry) {
53 registry.insert<cir::CIRDialect>();
54 registry.addExtension(+[](mlir::MLIRContext *ctx, cir::CIRDialect *dialect) {
55 dialect->addInterfaces<CIRDialectLLVMIRTranslationInterface>();
56 });
57}
58
59} // namespace direct
60} // namespace cir
61
62namespace mlir {
63void registerCIRDialectTranslation(mlir::MLIRContext &context) {
64 mlir::DialectRegistry registry;
65 cir::direct::registerCIRDialectTranslation(registry);
66 context.appendDialectRegistry(registry);
67}
68} // namespace mlir
69

source code of clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVMIR.cpp