mlirModule(mlirModule), llvmModule(std::move(llvmModule)),
iface(mlirModule->getContext()),
typeTranslator(*mlirModule->getContext()),
- debugImporter(std::make_unique<DebugImporter>(mlirModule->getContext())) {
+ debugImporter(std::make_unique<DebugImporter>(mlirModule)) {
builder.setInsertionPointToStart(mlirModule.getBody());
}
globalVar.getName() == getGlobalDtorsVarName()) {
if (failed(convertGlobalCtorsAndDtors(&globalVar))) {
return emitError(mlirModule.getLoc())
- << "unhandled global variable " << diag(globalVar);
+ << "unhandled global variable: " << diag(globalVar);
}
continue;
}
if (failed(convertGlobal(&globalVar))) {
return emitError(mlirModule.getLoc())
- << "unhandled global variable " << diag(globalVar);
+ << "unhandled global variable: " << diag(globalVar);
}
}
return success();
continue;
if (failed(iface.setMetadataAttrs(builder, kind, node, op, *this))) {
Location loc = debugImporter->translateLoc(inst->getDebugLoc());
- emitWarning(loc) << "unhandled metadata (" << kind << ") " << diag(*inst);
+ emitWarning(loc) << "unhandled metadata: "
+ << diagMD(node, llvmModule.get()) << " on "
+ << diag(*inst);
}
}
}
}
FailureOr<Value> ModuleImport::convertConstant(llvm::Constant *constant) {
- // Constants have no location attached.
- Location loc = UnknownLoc::get(context);
+ Location loc = mlirModule.getLoc();
// Convert constants that can be represented as attributes.
if (Attribute attr = getConstantAsAttr(constant)) {
return root;
}
- return emitError(loc) << "unhandled constant " << diag(*constant);
+ return emitError(loc) << "unhandled constant: " << diag(*constant);
}
FailureOr<Value> ModuleImport::convertConstantExpr(llvm::Constant *constant) {
if (auto *constant = dyn_cast<llvm::Constant>(value))
return convertConstantExpr(constant);
- Location loc = UnknownLoc::get(context);
+ Location loc = mlirModule.getLoc();
if (auto *inst = dyn_cast<llvm::Instruction>(value))
loc = translateLoc(inst->getDebugLoc());
- return emitError(loc) << "unhandled value " << diag(*value);
+ return emitError(loc) << "unhandled value: " << diag(*value);
}
FailureOr<SmallVector<Value>>
return success();
Location loc = translateLoc(inst->getDebugLoc());
- return emitError(loc) << "unhandled intrinsic " << diag(*inst);
+ return emitError(loc) << "unhandled intrinsic: " << diag(*inst);
}
LogicalResult ModuleImport::convertInstruction(llvm::Instruction *inst) {
if (succeeded(convertInstructionImpl(builder, inst, *this)))
return success();
- return emitError(loc) << "unhandled instruction " << diag(*inst);
+ return emitError(loc) << "unhandled instruction: " << diag(*inst);
}
LogicalResult ModuleImport::processInstruction(llvm::Instruction *inst) {
builder.setInsertionPoint(mlirModule.getBody(), mlirModule.getBody()->end());
LLVMFuncOp funcOp = builder.create<LLVMFuncOp>(
- UnknownLoc::get(context), func->getName(), functionType,
+ mlirModule.getLoc(), func->getName(), functionType,
convertLinkageFromLLVM(func->getLinkage()), dsoLocal, cconv);
// Set the function debug information if available.
if (FlatSymbolRefAttr personality = getPersonalityAsAttr(func))
funcOp.setPersonalityAttr(personality);
else if (func->hasPersonalityFn())
- emitWarning(UnknownLoc::get(context),
- "could not deduce personality, skipping it");
+ emitWarning(funcOp.getLoc(), "could not deduce personality, skipping it");
if (func->hasGC())
funcOp.setGarbageCollector(StringRef(func->getGC()));
if (!iface.isConvertibleMetadata(kind))
continue;
if (failed(iface.setMetadataAttrs(builder, kind, node, funcOp, *this))) {
- emitWarning(funcOp->getLoc())
- << "unhandled function metadata (" << kind << ") " << diag(*func);
+ emitWarning(funcOp.getLoc())
+ << "unhandled function metadata: " << diagMD(node, llvmModule.get())
+ << " on " << diag(*func);
}
}
setNonDebugMetadataAttrs(&inst, op);
} else if (inst.getOpcode() != llvm::Instruction::PHI) {
Location loc = debugImporter->translateLoc(inst.getDebugLoc());
- emitWarning(loc) << "dropped instruction " << diag(inst);
+ emitWarning(loc) << "dropped instruction: " << diag(inst);
}
}
return success();
; RUN: mlir-translate -import-llvm %s | FileCheck %s
; RUN: mlir-translate -import-llvm -mlir-print-debuginfo %s | FileCheck %s --check-prefix=CHECK-DBG
-; CHECK-DBG: #[[UNKNOWNLOC:.+]] = loc(unknown)
+; CHECK-DBG: #[[MODULELOC:.+]] = loc({{.*}}basic.ll{{.*}}:0:0)
@global = external global double, align 8
; FIXME: function attributes.
; CHECK-LABEL: llvm.func internal @f1(%arg0: i64) -> i32 attributes {dso_local} {
-; CHECK-DBG: llvm.func internal @f1(%arg0: i64 loc(unknown)) -> i32 attributes {dso_local} {
+; CHECK-DBG: llvm.func internal @f1(%arg0: i64 loc({{.*}}basic.ll{{.*}}:0:0)) -> i32 attributes {dso_local} {
; CHECK: %[[c2:[0-9]+]] = llvm.mlir.constant(2 : i32) : i32
; CHECK: %[[c1:[0-9]+]] = llvm.mlir.constant(true) : i1
; CHECK: %[[c43:[0-9]+]] = llvm.mlir.constant(43 : i32) : i32
entry:
; CHECK: %{{[0-9]+}} = llvm.inttoptr %arg0 : i64 to !llvm.ptr<i64>
%aa = inttoptr i64 %a to i64*
-; CHECK-DBG: llvm.mlir.addressof @global : !llvm.ptr<f64> loc(#[[UNKNOWNLOC]])
+; CHECK-DBG: llvm.mlir.addressof @global : !llvm.ptr<f64> loc(#[[MODULELOC]])
; %[[addrof:[0-9]+]] = llvm.mlir.addressof @global : !llvm.ptr<f64>
; %[[addrof2:[0-9]+]] = llvm.mlir.addressof @global : !llvm.ptr<f64>
; %{{[0-9]+}} = llvm.inttoptr %arg0 : i64 to !llvm.ptr<i64>
%bb = ptrtoint double* @global to i64
%cc = getelementptr double, double* @global, i32 3
; CHECK: %[[b:[0-9]+]] = llvm.trunc %arg0 : i64 to i32
-; CHECK-DBG: llvm.trunc %arg0 : i64 to i32 loc(#[[UNKNOWNLOC]])
+; CHECK-DBG: llvm.trunc %arg0 : i64 to i32 loc(#[[MODULELOC]])
%b = trunc i64 %a to i32
; CHECK: %[[c:[0-9]+]] = llvm.call @fe(%[[b]]) : (i32) -> f32
%c = call float @fe(i32 %b)
; CHECK: llvm.return %[[c43]]
ret i32 43
}
-; CHECK-DBG: } loc(#[[UNKNOWNLOC]])
+; CHECK-DBG: } loc(#[[MODULELOC]])
@_ZTIi = external dso_local constant i8*
; RUN: not mlir-translate -import-llvm -split-input-file %s 2>&1 | FileCheck %s
-; CHECK: error: unhandled instruction indirectbr i8* %dst, [label %bb1, label %bb2]
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled instruction: indirectbr i8* %dst, [label %bb1, label %bb2]
define i32 @unhandled_instruction(i8* %dst) {
indirectbr i8* %dst, [label %bb1, label %bb2]
bb1:
; // -----
-; CHECK: unhandled value ptr asm "bswap $0", "=r,r"
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled value: ptr asm "bswap $0", "=r,r"
define i32 @unhandled_value(i32 %arg0) {
%1 = call i32 asm "bswap $0", "=r,r"(i32 %arg0)
ret i32 %1
; // -----
-; CHECK: error: unhandled constant i8* blockaddress(@unhandled_constant, %bb1)
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled constant: i8* blockaddress(@unhandled_constant, %bb1)
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled instruction: ret i8* blockaddress(@unhandled_constant, %bb1)
define i8* @unhandled_constant() {
bb1:
ret i8* blockaddress(@unhandled_constant, %bb1)
; // -----
-; CHECK: error: unhandled constant i8* blockaddress(@unhandled_global, %bb1)
-; CHECK: error: unhandled global variable @private = private global i8* blockaddress(@unhandled_global, %bb1)
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled constant: i8* blockaddress(@unhandled_global, %bb1)
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled global variable: @private = private global i8* blockaddress(@unhandled_global, %bb1)
@private = private global i8* blockaddress(@unhandled_global, %bb1)
define void @unhandled_global() {
declare void @llvm.gcroot(ptr %arg0, ptr %arg1)
-; CHECK: error: unhandled intrinsic call void @llvm.gcroot(ptr %arg0, ptr %arg1)
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled intrinsic: call void @llvm.gcroot(ptr %arg0, ptr %arg1)
define void @unhandled_intrinsic(ptr %arg0, ptr %arg1) {
call void @llvm.gcroot(ptr %arg0, ptr %arg1)
ret void
; // -----
-; CHECK: warning: unhandled metadata (2) br i1 %arg1, label %bb1, label %bb2, !prof !0
-define i64 @cond_br(i1 %arg1, i64 %arg2) {
+; CHECK: import-failure.ll
+; CHECK-SAME: warning: unhandled metadata: !0 = !{!"unknown metadata"} on br i1 %arg1, label %bb1, label %bb2, !prof !0
+define i64 @unhandled_metadata(i1 %arg1, i64 %arg2) {
entry:
br i1 %arg1, label %bb1, label %bb2, !prof !0
bb1:
; // -----
+; CHECK: import-failure.ll
+; CHECK-SAME: warning: unhandled function metadata: !0 = !{!"unknown metadata"} on define void @unhandled_func_metadata(i1 %arg1, i64 %arg2) !prof !0
+define void @unhandled_func_metadata(i1 %arg1, i64 %arg2) !prof !0 {
+ ret void
+}
+
+!0 = !{!"unknown metadata"}
+
+; // -----
+
declare void @llvm.dbg.value(metadata, metadata, metadata)
-; CHECK: warning: dropped instruction call void @llvm.dbg.value(metadata i64 %arg1, metadata !3, metadata !DIExpression(DW_OP_plus_uconst, 42, DW_OP_stack_value)), !dbg !5
+; CHECK: import-failure.ll
+; CHECK-SAME: warning: dropped instruction: call void @llvm.dbg.value(metadata i64 %arg1, metadata !3, metadata !DIExpression(DW_OP_plus_uconst, 42, DW_OP_stack_value)), !dbg !5
define void @dropped_instruction(i64 %arg1) {
call void @llvm.dbg.value(metadata i64 %arg1, metadata !3, metadata !DIExpression(DW_OP_plus_uconst, 42, DW_OP_stack_value)), !dbg !5
ret void
; // -----
; global_ctors requires the appending linkage type.
-; CHECK: error: unhandled global variable @llvm.global_ctors
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled global variable: @llvm.global_ctors
@llvm.global_ctors = global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @foo, ptr null }]
define void @foo() {
; // -----
; global_dtors with non-null data fields cannot be represented in MLIR.
-; CHECK: error: unhandled global variable @llvm.global_dtors
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled global variable: @llvm.global_dtors
@llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @foo, ptr @foo }]
define void @foo() {
; // -----
; global_ctors without a data field should not be imported.
-; CHECK: error: unhandled global variable @llvm.global_ctors
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled global variable: @llvm.global_ctors
@llvm.global_ctors = appending global [1 x { i32, ptr }] [{ i32, ptr } { i32 0, ptr @foo }]
define void @foo() {
; // -----
; global_dtors with a wrong argument order should not be imported.
-; CHECK: error: unhandled global variable @llvm.global_dtors
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unhandled global variable: @llvm.global_dtors
@llvm.global_dtors = appending global [1 x { ptr, i32, ptr }] [{ ptr, i32, ptr } { ptr @foo, i32 0, ptr null }]
define void @foo() {
; // -----
-; CHECK: error: TBAA root node must have non-empty identity: !2 = !{!""}
+; CHECK: import-failure.ll
+; CHECK-SAME: error: TBAA root node must have non-empty identity: !2 = !{!""}
define dso_local void @tbaa(ptr %0) {
store i8 1, ptr %0, align 4, !tbaa !2
ret void
; // -----
-; CHECK: error: unsupported TBAA node format: !0 = !{!1, i64 0, i64 0}
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unsupported TBAA node format: !0 = !{!1, i64 0, i64 0}
define dso_local void @tbaa(ptr %0) {
store i8 1, ptr %0, align 4, !tbaa !2
ret void
; // -----
-; CHECK: error: operand '1' must be MDNode: !1 = !{!"omnipotent char", i64 0, i64 0}
+; CHECK: import-failure.ll
+; CHECK-SAME: error: operand '1' must be MDNode: !1 = !{!"omnipotent char", i64 0, i64 0}
define dso_local void @tbaa(ptr %0) {
store i8 1, ptr %0, align 4, !tbaa !2
ret void
; // -----
-; CHECK: error: missing member offset: !1 = !{!"agg_t", !2, i64 0, !2}
+; CHECK: import-failure.ll
+; CHECK-SAME: error: missing member offset: !1 = !{!"agg_t", !2, i64 0, !2}
define dso_local void @tbaa(ptr %0) {
store i8 1, ptr %0, align 4, !tbaa !3
ret void
; // -----
-; CHECK: error: operand '4' must be ConstantInt: !1 = !{!"agg_t", !2, i64 0, !2, double 1.000000e+00}
+; CHECK: import-failure.ll
+; CHECK-SAME: error: operand '4' must be ConstantInt: !1 = !{!"agg_t", !2, i64 0, !2, double 1.000000e+00}
define dso_local void @tbaa(ptr %0) {
store i8 1, ptr %0, align 4, !tbaa !3
ret void
; // -----
-; CHECK: error: operand '3' must be ConstantInt: !0 = !{!1, !1, i64 0, double 1.000000e+00}
+; CHECK: import-failure.ll
+; CHECK-SAME: error: operand '3' must be ConstantInt: !0 = !{!1, !1, i64 0, double 1.000000e+00}
define dso_local void @tbaa(ptr %0) {
store i8 1, ptr %0, align 4, !tbaa !2
ret void
; // -----
-; CHECK: error: unsupported TBAA node format: !0 = !{!1, !1, i64 0, i64 4}
+; CHECK: import-failure.ll
+; CHECK-SAME: error: unsupported TBAA node format: !0 = !{!1, !1, i64 0, i64 4}
define dso_local void @tbaa(ptr %0) {
store i32 1, ptr %0, align 4, !tbaa !2
ret void