This commit adds an optional distinct attribute parameter to the DISubprogramAttr. This enables modeling of distinct subprograms, as required for LLVM IR. This change is required to avoid accidential uniquing of subprograms on functions that would lead to invalid LLVM IR post export.
84 lines
4.1 KiB
MLIR
84 lines
4.1 KiB
MLIR
// RUN: mlir-opt %s --pass-pipeline="builtin.module(ensure-debug-info-scope-on-llvm-func)" --split-input-file --mlir-print-debuginfo | FileCheck %s
|
|
|
|
// CHECK-LABEL: llvm.func @func_no_debug()
|
|
// CHECK: llvm.return loc(#loc
|
|
// CHECK: loc(#loc[[LOC:[0-9]+]])
|
|
// CHECK: #di_file = #llvm.di_file<"<unknown>" in "">
|
|
// CHECK: #di_subprogram = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #di_compile_unit, scope = #di_file, name = "func_no_debug", linkageName = "func_no_debug", file = #di_file, line = 1, scopeLine = 1, subprogramFlags = "Definition|Optimized", type = #di_subroutine_type>
|
|
// CHECK: #loc[[LOC]] = loc(fused<#di_subprogram>
|
|
module {
|
|
llvm.func @func_no_debug() {
|
|
llvm.return loc(unknown)
|
|
} loc(unknown)
|
|
} loc(unknown)
|
|
|
|
// -----
|
|
|
|
// Test that the declarations subprogram is not made distinct.
|
|
// CHECK-LABEL: llvm.func @func_decl_no_debug()
|
|
// CHECK: #di_subprogram = #llvm.di_subprogram<
|
|
// CHECK-NOT: id = distinct
|
|
module {
|
|
llvm.func @func_decl_no_debug() loc(unknown)
|
|
} loc(unknown)
|
|
|
|
// -----
|
|
|
|
// Test that existing debug info is not overwritten.
|
|
// CHECK-LABEL: llvm.func @func_with_debug()
|
|
// CHECK: llvm.return loc(#loc
|
|
// CHECK: loc(#loc[[LOC:[0-9]+]])
|
|
// CHECK: #di_file = #llvm.di_file<"<unknown>" in "">
|
|
// CHECK: #di_subprogram = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #di_compile_unit, scope = #di_file, name = "func_with_debug", linkageName = "func_with_debug", file = #di_file, line = 42, scopeLine = 42, subprogramFlags = "Definition|Optimized", type = #di_subroutine_type>
|
|
// CHECK: #loc[[LOC]] = loc(fused<#di_subprogram>
|
|
module {
|
|
llvm.func @func_with_debug() {
|
|
llvm.return loc(#loc1)
|
|
} loc(#loc2)
|
|
} loc(#loc)
|
|
#di_file = #llvm.di_file<"<unknown>" in "">
|
|
#di_subroutine_type = #llvm.di_subroutine_type<callingConvention = DW_CC_normal>
|
|
#loc = loc("foo":0:0)
|
|
#loc1 = loc(unknown)
|
|
#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file, producer = "MLIR", isOptimized = true, emissionKind = LineTablesOnly>
|
|
#di_subprogram = #llvm.di_subprogram<id = distinct[1]<>, compileUnit = #di_compile_unit, scope = #di_file, name = "func_with_debug", linkageName = "func_with_debug", file = #di_file, line = 42, scopeLine = 42, subprogramFlags = "Definition|Optimized", type = #di_subroutine_type>
|
|
#loc2 = loc(fused<#di_subprogram>[#loc1])
|
|
|
|
// -----
|
|
|
|
// Test that a compile unit present on a module op is used for the function.
|
|
// CHECK-LABEL: llvm.func @propagate_compile_unit()
|
|
// CHECK: llvm.return loc(#loc
|
|
// CHECK: loc(#loc[[FUNCLOC:[0-9]+]])
|
|
// CHECK: loc(#loc[[MODULELOC:[0-9]+]])
|
|
// CHECK-DAG: #[[DI_FILE_MODULE:.+]] = #llvm.di_file<"bar.mlir" in "baz">
|
|
// CHECK-DAG: #[[DI_FILE_FUNC:.+]] = #llvm.di_file<"file.mlir" in "">
|
|
// CHECK-DAG: #loc[[FUNCFILELOC:[0-9]+]] = loc("file.mlir":9:8)
|
|
// CHECK-DAG: #di_compile_unit = #llvm.di_compile_unit<id = distinct[{{.*}}]<>, sourceLanguage = DW_LANG_C, file = #[[DI_FILE_MODULE]], producer = "MLIR", isOptimized = true, emissionKind = LineTablesOnly>
|
|
// CHECK-DAG: #di_subprogram = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #di_compile_unit, scope = #[[DI_FILE_FUNC]], name = "propagate_compile_unit", linkageName = "propagate_compile_unit", file = #[[DI_FILE_FUNC]], line = 9, scopeLine = 8, subprogramFlags = "Definition|Optimized", type = #di_subroutine_type>
|
|
// CHECK-DAG: #loc[[MODULELOC]] = loc(fused<#di_compile_unit>[#loc])
|
|
// CHECK-DAG: #loc[[FUNCLOC]] = loc(fused<#di_subprogram>[#loc[[FUNCFILELOC]]
|
|
module {
|
|
llvm.func @propagate_compile_unit() {
|
|
llvm.return loc(unknown)
|
|
} loc("file.mlir":9:8)
|
|
} loc(#loc)
|
|
#di_file = #llvm.di_file<"bar.mlir" in "baz">
|
|
#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file, producer = "MLIR", isOptimized = true, emissionKind = LineTablesOnly>
|
|
#loc = loc(fused<#di_compile_unit>["foo.mlir":2:1])
|
|
|
|
// -----
|
|
|
|
// Test that only one compile unit is created.
|
|
// CHECK-LABEL: module @multiple_funcs
|
|
// CHECK: llvm.di_compile_unit
|
|
// CHECK-NOT: llvm.di_compile_unit
|
|
module @multiple_funcs {
|
|
llvm.func @func0() {
|
|
llvm.return loc(unknown)
|
|
} loc(unknown)
|
|
llvm.func @func1() {
|
|
llvm.return loc(unknown)
|
|
} loc(unknown)
|
|
} loc(unknown)
|