Skip to content

Commit e60037a

Browse files
committed
[CIR][Lowering] Set linkage type for LLVM functions.
1 parent 04ab79b commit e60037a

File tree

2 files changed

+52
-32
lines changed

2 files changed

+52
-32
lines changed

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,34 @@ using namespace llvm;
6060
namespace cir {
6161
namespace 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+
6391
class CIRPtrStrideOpLowering
6492
: public mlir::OpConversionPattern<mlir::cir::PtrStrideOp> {
6593
public:
@@ -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-
740741
class CIRGetGlobalOpLowering
741742
: public mlir::OpConversionPattern<mlir::cir::GetGlobalOp> {
742743
public:

clang/test/CIR/CodeGen/linkage.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir-enable -emit-cir %s -o %t.cir
2+
// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR
3+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir-enable -emit-llvm %s -o %t.ll
4+
// RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM
5+
6+
7+
static int bar(int i) {
8+
return i;
9+
}
10+
11+
int foo() {
12+
return bar(5);
13+
}
14+
15+
// CIR: cir.func internal private @bar(
16+
// CIR: cir.func @foo(
17+
18+
// LLVM: define internal i32 @bar(
19+
// LLVM: define i32 @foo(

0 commit comments

Comments
 (0)