@@ -60,6 +60,34 @@ using namespace llvm;
6060namespace cir {
6161namespace direct {
6262
63+ mlir::LLVM::Linkage convertLinkage (mlir::cir::GlobalLinkageKind linkage) {
64+ using CIR = mlir::cir::GlobalLinkageKind;
65+ using LLVM = mlir::LLVM::Linkage;
66+
67+ switch (linkage) {
68+ case CIR::AvailableExternallyLinkage:
69+ return LLVM::AvailableExternally;
70+ case CIR::CommonLinkage:
71+ return LLVM::Common;
72+ case CIR::ExternalLinkage:
73+ return LLVM::External;
74+ case CIR::ExternalWeakLinkage:
75+ return LLVM::ExternWeak;
76+ case CIR::InternalLinkage:
77+ return LLVM::Internal;
78+ case CIR::LinkOnceAnyLinkage:
79+ return LLVM::Linkonce;
80+ case CIR::LinkOnceODRLinkage:
81+ return LLVM::LinkonceODR;
82+ case CIR::PrivateLinkage:
83+ return LLVM::Private;
84+ case CIR::WeakAnyLinkage:
85+ return LLVM::Weak;
86+ case CIR::WeakODRLinkage:
87+ return LLVM::WeakODR;
88+ };
89+ }
90+
6391class CIRPtrStrideOpLowering
6492 : public mlir::OpConversionPattern<mlir::cir::PtrStrideOp> {
6593public:
@@ -276,12 +304,12 @@ class CIRCastOpLowering : public mlir::OpConversionPattern<mlir::cir::CastOp> {
276304 auto llvmSrcVal = adaptor.getOperands ().front ();
277305 auto llvmDstTy = getTypeConverter ()->convertType (dstTy);
278306 auto kind = mlir::LLVM::FCmpPredicate::une;
279-
307+
280308 // Check if float is not equal to zero.
281309 auto zeroFloat = rewriter.create <mlir::LLVM::ConstantOp>(
282310 castOp.getLoc (), llvmSrcVal.getType (),
283311 mlir::FloatAttr::get (llvmSrcVal.getType (), 0.0 ));
284-
312+
285313 // Extend comparison result to either bool (C++) or int (C).
286314 mlir::Value cmpResult = rewriter.create <mlir::LLVM::FCmpOp>(
287315 castOp.getLoc (), kind, llvmSrcVal, zeroFloat);
@@ -662,8 +690,9 @@ class CIRFuncLowering : public mlir::OpConversionPattern<mlir::cir::FuncOp> {
662690 Loc = FusedLoc.getLocations ()[0 ];
663691 }
664692 assert (Loc.isa <mlir::FileLineColLoc>() && " expected single location here" );
665- auto fn =
666- rewriter.create <mlir::LLVM::LLVMFuncOp>(Loc, op.getName (), llvmFnTy);
693+ auto linkage = convertLinkage (op.getLinkage ());
694+ auto fn = rewriter.create <mlir::LLVM::LLVMFuncOp>(Loc, op.getName (),
695+ llvmFnTy, linkage);
667696
668697 rewriter.inlineRegionBefore (op.getBody (), fn.getBody (), fn.end ());
669698 if (failed (rewriter.convertRegionTypes (&fn.getBody (), *typeConverter,
@@ -709,34 +738,6 @@ lowerConstArrayAttr(mlir::cir::ConstArrayAttr constArr,
709738 return std::nullopt ;
710739}
711740
712- mlir::LLVM::Linkage convertLinkage (mlir::cir::GlobalLinkageKind linkage) {
713- using CIR = mlir::cir::GlobalLinkageKind;
714- using LLVM = mlir::LLVM::Linkage;
715-
716- switch (linkage) {
717- case CIR::AvailableExternallyLinkage:
718- return LLVM::AvailableExternally;
719- case CIR::CommonLinkage:
720- return LLVM::Common;
721- case CIR::ExternalLinkage:
722- return LLVM::External;
723- case CIR::ExternalWeakLinkage:
724- return LLVM::ExternWeak;
725- case CIR::InternalLinkage:
726- return LLVM::Internal;
727- case CIR::LinkOnceAnyLinkage:
728- return LLVM::Linkonce;
729- case CIR::LinkOnceODRLinkage:
730- return LLVM::LinkonceODR;
731- case CIR::PrivateLinkage:
732- return LLVM::Private;
733- case CIR::WeakAnyLinkage:
734- return LLVM::Weak;
735- case CIR::WeakODRLinkage:
736- return LLVM::WeakODR;
737- };
738- }
739-
740741class CIRGetGlobalOpLowering
741742 : public mlir::OpConversionPattern<mlir::cir::GetGlobalOp> {
742743public:
0 commit comments