Skip to content

Commit c57b86b

Browse files
authored
[CIR][LowerToLLVM] Support for LinkerOptions lowering (#1532)
- Part of #70.
1 parent ba4d718 commit c57b86b

File tree

5 files changed

+72
-0
lines changed

5 files changed

+72
-0
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5691,6 +5691,36 @@ def SignBitOp : CIR_Op<"signbit", [Pure]> {
56915691
}];
56925692
}
56935693

5694+
//===----------------------------------------------------------------------===//
5695+
// LinkerOptionsOp
5696+
//===----------------------------------------------------------------------===//
5697+
5698+
def LinkerOptionsOp : CIR_Op<"linker_options"> {
5699+
let summary = "Options to pass to the linker when the object file is linked";
5700+
let description = [{
5701+
Pass the given options to the linker when the resulting object file
5702+
is linked.
5703+
This is used extensively on Windows to determine the C runtime that the
5704+
object files should link against.
5705+
5706+
Examples:
5707+
```mlir
5708+
// Link against the MSVC static threaded CRT.
5709+
cir.linker_options ["/DEFAULTLIB:", "libcmt"]
5710+
5711+
// Link against aarch64 compiler-rt builtins
5712+
cir.linker_options ["-l", "clang_rt.builtins-aarch64"]
5713+
}];
5714+
5715+
let arguments = (ins StrArrayAttr:$options);
5716+
5717+
let assemblyFormat = [{
5718+
$options attr-dict
5719+
}];
5720+
5721+
let hasVerifier = 1;
5722+
}
5723+
56945724
//===----------------------------------------------------------------------===//
56955725
// Standard library function calls
56965726
//===----------------------------------------------------------------------===//

clang/lib/CIR/Dialect/IR/CIRDialect.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4017,6 +4017,18 @@ LogicalResult cir::CatchParamOp::verify() {
40174017
return success();
40184018
}
40194019

4020+
//===----------------------------------------------------------------------===//
4021+
// LinkerOptionsOp
4022+
//===----------------------------------------------------------------------===//
4023+
4024+
LogicalResult cir::LinkerOptionsOp::verify() {
4025+
if (mlir::Operation *parentOp = (*this)->getParentOp();
4026+
parentOp && !isa<mlir::ModuleOp>(parentOp))
4027+
return emitOpError("must appear at the module level");
4028+
4029+
return success();
4030+
}
4031+
40204032
//===----------------------------------------------------------------------===//
40214033
// TableGen'd op method definitions
40224034
//===----------------------------------------------------------------------===//

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4230,6 +4230,15 @@ mlir::LogicalResult CIRToLLVMSignBitOpLowering::matchAndRewrite(
42304230
return mlir::success();
42314231
}
42324232

4233+
mlir::LogicalResult CIRToLLVMLinkerOptionsOpLowering::matchAndRewrite(
4234+
cir::LinkerOptionsOp op, OpAdaptor adaptor,
4235+
mlir::ConversionPatternRewriter &rewriter) const {
4236+
auto newOp = rewriter.create<mlir::LLVM::LinkerOptionsOp>(
4237+
op.getLoc(), op.getOptionsAttr());
4238+
rewriter.replaceOp(op, newOp);
4239+
return mlir::success();
4240+
}
4241+
42334242
void populateCIRToLLVMConversionPatterns(
42344243
mlir::RewritePatternSet &patterns, mlir::TypeConverter &converter,
42354244
mlir::DataLayout &dataLayout, cir::LowerModule *lowerModule,
@@ -4314,6 +4323,7 @@ void populateCIRToLLVMConversionPatterns(
43144323
CIRToLLVMInsertMemberOpLowering,
43154324
CIRToLLVMIsConstantOpLowering,
43164325
CIRToLLVMIsFPClassOpLowering,
4326+
CIRToLLVMLinkerOptionsOpLowering,
43174327
CIRToLLVMLLVMIntrinsicCallOpLowering,
43184328
CIRToLLVMMemChrOpLowering,
43194329
CIRToLLVMMemCpyInlineOpLowering,

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,6 +1246,17 @@ class CIRToLLVMSignBitOpLowering
12461246
matchAndRewrite(cir::SignBitOp op, OpAdaptor adaptor,
12471247
mlir::ConversionPatternRewriter &rewriter) const override;
12481248
};
1249+
1250+
class CIRToLLVMLinkerOptionsOpLowering
1251+
: public mlir::OpConversionPattern<cir::LinkerOptionsOp> {
1252+
public:
1253+
using OpConversionPattern<cir::LinkerOptionsOp>::OpConversionPattern;
1254+
1255+
mlir::LogicalResult
1256+
matchAndRewrite(cir::LinkerOptionsOp op, OpAdaptor adaptor,
1257+
mlir::ConversionPatternRewriter &rewriter) const override;
1258+
};
1259+
12491260
mlir::ArrayAttr lowerCIRTBAAAttr(mlir::Attribute tbaa,
12501261
mlir::ConversionPatternRewriter &rewriter,
12511262
cir::LowerModule *lowerMod);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: cir-opt -cir-to-llvm %s | FileCheck %s
2+
3+
module {
4+
cir.linker_options ["/DEFAULTLIB:", "libcmt"]
5+
}
6+
7+
// CHECK: module {
8+
// CHECK-NEXT: llvm.linker_options ["/DEFAULTLIB:", "libcmt"]
9+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)