[clang] [CIR] Initial implementation of CIR-to-LLVM IR lowering pass (PR #125260)
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 3 09:15:29 PST 2025
================
@@ -22,16 +35,164 @@ using namespace llvm;
namespace cir {
namespace direct {
+// This pass requires the CIR to be in a "flat" state. All blocks in each
+// function must belong to the parent region. Once scopes and control flow
+// are implemented in CIR, a pass will be run before this one to flatten
+// the CIR and get it into the state that this pass requires.
+struct ConvertCIRToLLVMPass
+ : public mlir::PassWrapper<ConvertCIRToLLVMPass,
+ mlir::OperationPass<mlir::ModuleOp>> {
+ void getDependentDialects(mlir::DialectRegistry ®istry) const override {
+ registry.insert<mlir::BuiltinDialect, mlir::DLTIDialect,
+ mlir::LLVM::LLVMDialect, mlir::func::FuncDialect>();
+ }
+ void runOnOperation() final;
+
+ StringRef getDescription() const override {
+ return "Convert the prepared CIR dialect module to LLVM dialect";
+ }
+
+ StringRef getArgument() const override { return "cir-flat-to-llvm"; }
+};
+
+mlir::LogicalResult CIRToLLVMGlobalOpLowering::matchAndRewrite(
+ cir::GlobalOp op, OpAdaptor adaptor,
+ mlir::ConversionPatternRewriter &rewriter) const {
+
+ // Fetch required values to create LLVM op.
+ const mlir::Type cirSymType = op.getSymType();
+
+ // This is the LLVM dialect type.
+ const mlir::Type llvmType = getTypeConverter()->convertType(cirSymType);
+ // FIXME: These default values are placeholders until the the equivalent
+ // attributes are available on cir.global ops.
+ assert(!cir::MissingFeatures::opGlobalConstant());
+ const bool isConst = false;
+ assert(!cir::MissingFeatures::addressSpace());
+ const unsigned addrSpace = 0;
+ assert(!cir::MissingFeatures::opGlobalDSOLocal());
+ const bool isDsoLocal = true;
+ assert(!cir::MissingFeatures::opGlobalThreadLocal());
+ const bool isThreadLocal = false;
+ assert(!cir::MissingFeatures::opGlobalAlignment());
+ const uint64_t alignment = 0;
+ assert(!cir::MissingFeatures::opGlobalLinkage());
+ const mlir::LLVM::Linkage linkage = mlir::LLVM::Linkage::External;
+ const StringRef symbol = op.getSymName();
+ std::optional<mlir::Attribute> init = op.getInitialValue();
+
+ SmallVector<mlir::NamedAttribute> attributes;
+
+ if (init.has_value()) {
+ if (const auto fltAttr = mlir::dyn_cast<cir::FPAttr>(init.value())) {
----------------
erichkeane wrote:
Note, I THINK these need to be `const auto *` (assuming they are pointers).
https://github.com/llvm/llvm-project/pull/125260
More information about the cfe-commits
mailing list