Skip to content

Commit 6ebb491

Browse files
el-evlanza
authored andcommitted
[CIR][LowerToLLVM] Support for LinkerOptions lowering (llvm#1532)
- Part of llvm#70.
1 parent 09639a2 commit 6ebb491

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
@@ -4038,6 +4038,18 @@ LogicalResult cir::CatchParamOp::verify() {
40384038
return success();
40394039
}
40404040

4041+
//===----------------------------------------------------------------------===//
4042+
// LinkerOptionsOp
4043+
//===----------------------------------------------------------------------===//
4044+
4045+
LogicalResult cir::LinkerOptionsOp::verify() {
4046+
if (mlir::Operation *parentOp = (*this)->getParentOp();
4047+
parentOp && !isa<mlir::ModuleOp>(parentOp))
4048+
return emitOpError("must appear at the module level");
4049+
4050+
return success();
4051+
}
4052+
40414053
//===----------------------------------------------------------------------===//
40424054
// TableGen'd op method definitions
40434055
//===----------------------------------------------------------------------===//

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

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

4234+
mlir::LogicalResult CIRToLLVMLinkerOptionsOpLowering::matchAndRewrite(
4235+
cir::LinkerOptionsOp op, OpAdaptor adaptor,
4236+
mlir::ConversionPatternRewriter &rewriter) const {
4237+
auto newOp = rewriter.create<mlir::LLVM::LinkerOptionsOp>(
4238+
op.getLoc(), op.getOptionsAttr());
4239+
rewriter.replaceOp(op, newOp);
4240+
return mlir::success();
4241+
}
4242+
42344243
void populateCIRToLLVMConversionPatterns(
42354244
mlir::RewritePatternSet &patterns, mlir::TypeConverter &converter,
42364245
mlir::DataLayout &dataLayout, cir::LowerModule *lowerModule,
@@ -4315,6 +4324,7 @@ void populateCIRToLLVMConversionPatterns(
43154324
CIRToLLVMInsertMemberOpLowering,
43164325
CIRToLLVMIsConstantOpLowering,
43174326
CIRToLLVMIsFPClassOpLowering,
4327+
CIRToLLVMLinkerOptionsOpLowering,
43184328
CIRToLLVMLLVMIntrinsicCallOpLowering,
43194329
CIRToLLVMMemChrOpLowering,
43204330
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)