diff --git a/flang/test/Transforms/debug-local-var-2.f90 b/flang/test/Integration/debug-local-var-2.f90 similarity index 100% rename from flang/test/Transforms/debug-local-var-2.f90 rename to flang/test/Integration/debug-local-var-2.f90 diff --git a/flang/test/Transforms/debug-fn-info.f90 b/flang/test/Transforms/debug-fn-info.f90 deleted file mode 100644 index 97a34e8676de7..0000000000000 --- a/flang/test/Transforms/debug-fn-info.f90 +++ /dev/null @@ -1,45 +0,0 @@ -! RUN: %flang_fc1 -emit-fir -debug-info-kind=standalone -mmlir --mlir-print-debuginfo %s -o - | fir-opt --add-debug-info --mlir-print-debuginfo | FileCheck %s - - -! CHECK-DAG: #[[INT8:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[INT4:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[REAL8:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[LOG1:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[REAL4:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[LOG4:.*]] = #llvm.di_basic_type -! CHECK: #[[TY0:.*]] = #llvm.di_subroutine_type -! CHECK: #[[TY1:.*]] = #llvm.di_subroutine_type -! CHECK: #[[TY2:.*]] = #llvm.di_subroutine_type - -! CHECK: #di_subprogram1 = #llvm.di_subprogram -program mn - integer(kind=4) :: i4 - integer(kind=8) :: i8 - real(kind=4) :: r4 - real(kind=8) :: r8 - logical(kind=1) :: l1 - logical(kind=4) :: l4 - i8 = fn1(i4, r8, l1) - i4 = fn2(i8, r4, l4) -contains - ! CHECK: #di_subprogram2 = #llvm.di_subprogram - function fn1(a, b, c) result (res) - implicit none - integer(kind=4), intent(in) :: a - real(kind=8), intent(in) :: b - logical(kind=1), intent(in) :: c - integer(kind=8) :: res - res = a + b - end function - -! CHECK: #di_subprogram3 = #llvm.di_subprogram - function fn2(a, b, c) result (res) - implicit none - integer(kind=8), intent(in) :: a - real(kind=4), intent(in) :: b - logical(kind=4), intent(in) :: c - integer(kind=4) :: res - res = a + b - end function -end program - diff --git a/flang/test/Transforms/debug-fn-info.fir b/flang/test/Transforms/debug-fn-info.fir new file mode 100644 index 0000000000000..f456e35d3dd70 --- /dev/null +++ b/flang/test/Transforms/debug-fn-info.fir @@ -0,0 +1,75 @@ +// RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s + +module attributes {dlti.dl_spec = #dlti.dl_spec<>} { + func.func @_QQmain() attributes {fir.bindc_name = "mn"} { + %0 = fir.alloca i32 {bindc_name = "i4", uniq_name = "_QFEi4"} + %1 = fircg.ext_declare %0 {uniq_name = "_QFEi4"} : (!fir.ref) -> !fir.ref + %2 = fir.alloca i64 {bindc_name = "i8", uniq_name = "_QFEi8"} + %3 = fircg.ext_declare %2 {uniq_name = "_QFEi8"} : (!fir.ref) -> !fir.ref + %4 = fir.alloca !fir.logical<1> {bindc_name = "l1", uniq_name = "_QFEl1"} + %5 = fircg.ext_declare %4 {uniq_name = "_QFEl1"} : (!fir.ref>) -> !fir.ref> + %6 = fir.alloca !fir.logical<4> {bindc_name = "l4", uniq_name = "_QFEl4"} + %7 = fircg.ext_declare %6 {uniq_name = "_QFEl4"} : (!fir.ref>) -> !fir.ref> + %8 = fir.alloca f32 {bindc_name = "r4", uniq_name = "_QFEr4"} + %9 = fircg.ext_declare %8 {uniq_name = "_QFEr4"} : (!fir.ref) -> !fir.ref + %10 = fir.alloca f64 {bindc_name = "r8", uniq_name = "_QFEr8"} + %11 = fircg.ext_declare %10 {uniq_name = "_QFEr8"} : (!fir.ref) -> !fir.ref + %12 = fir.call @_QFPfn1(%1, %11, %5) fastmath : (!fir.ref, !fir.ref, !fir.ref>) -> i64 + fir.store %12 to %3 : !fir.ref + %13 = fir.call @_QFPfn2(%3, %9, %7) fastmath : (!fir.ref, !fir.ref, !fir.ref>) -> i32 + fir.store %13 to %1 : !fir.ref + return + } loc(#loc1) + func.func private @_QFPfn1(%arg0: !fir.ref {fir.bindc_name = "a"} , %arg1: !fir.ref {fir.bindc_name = "b"}, %arg2: !fir.ref> {fir.bindc_name = "c"}) -> i64 attributes {fir.host_symbol = @_QQmain, llvm.linkage = #llvm.linkage} { + %0 = fir.undefined !fir.dscope + %1 = fircg.ext_declare %arg0 dummy_scope %0 {uniq_name = "_QFFfn1Ea"} : (!fir.ref, !fir.dscope) -> !fir.ref + %2 = fircg.ext_declare %arg1 dummy_scope %0 {uniq_name = "_QFFfn1Eb"} : (!fir.ref, !fir.dscope) -> !fir.ref + %3 = fircg.ext_declare %arg2 dummy_scope %0 {uniq_name = "_QFFfn1Ec"} : (!fir.ref>, !fir.dscope) -> !fir.ref> + %4 = fir.alloca i64 {bindc_name = "res", uniq_name = "_QFFfn1Eres"} + %5 = fircg.ext_declare %4 {uniq_name = "_QFFfn1Eres"} : (!fir.ref) -> !fir.ref + %6 = fir.load %1 : !fir.ref + %7 = fir.convert %6 : (i32) -> f64 + %8 = fir.load %2 : !fir.ref + %9 = arith.addf %7, %8 fastmath : f64 + %10 = fir.convert %9 : (f64) -> i64 + fir.store %10 to %5 : !fir.ref + %11 = fir.load %5 : !fir.ref + return %11 : i64 + } loc(#loc2) + func.func private @_QFPfn2(%arg0: !fir.ref {fir.bindc_name = "a"}, %arg1: !fir.ref {fir.bindc_name = "b"}, %arg2: !fir.ref> {fir.bindc_name = "c"}) -> i32 attributes {fir.host_symbol = @_QQmain, llvm.linkage = #llvm.linkage} { + %0 = fir.undefined !fir.dscope + %1 = fircg.ext_declare %arg0 dummy_scope %0 {uniq_name = "_QFFfn2Ea"} : (!fir.ref, !fir.dscope) -> !fir.ref + %2 = fircg.ext_declare %arg1 dummy_scope %0 {uniq_name = "_QFFfn2Eb"} : (!fir.ref, !fir.dscope) -> !fir.ref + %3 = fircg.ext_declare %arg2 dummy_scope %0 {uniq_name = "_QFFfn2Ec"} : (!fir.ref>, !fir.dscope) -> !fir.ref> + %4 = fir.alloca i32 {bindc_name = "res", uniq_name = "_QFFfn2Eres"} + %5 = fircg.ext_declare %4 {uniq_name = "_QFFfn2Eres"} : (!fir.ref) -> !fir.ref + %6 = fir.load %1 : !fir.ref + %7 = fir.convert %6 : (i64) -> f32 + %8 = fir.load %2 : !fir.ref + %9 = arith.addf %7, %8 fastmath : f32 + %10 = fir.convert %9 : (f32) -> i32 + fir.store %10 to %5 : !fir.ref + %11 = fir.load %5 : !fir.ref + return %11 : i32 + } loc(#loc3) +} +#loc1 = loc("test.f90":15:1) +#loc2 = loc("test.f90":26:22) +#loc3 = loc("test2.f90":43:22) + + +// CHECK-DAG: #[[INT8:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[INT4:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[REAL8:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[LOG1:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[REAL4:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[LOG4:.*]] = #llvm.di_basic_type +// CHECK: #[[TY0:.*]] = #llvm.di_subroutine_type +// CHECK: #[[TY1:.*]] = #llvm.di_subroutine_type +// CHECK: #[[TY2:.*]] = #llvm.di_subroutine_type + +// Line numbers should match the number in corresponding loc entry. +// CHECK: #llvm.di_subprogram +// CHECK: #llvm.di_subprogram +// CHECK: #llvm.di_subprogram + diff --git a/flang/test/Transforms/debug-local-var.f90 b/flang/test/Transforms/debug-local-var.f90 deleted file mode 100644 index 96dc111ad308e..0000000000000 --- a/flang/test/Transforms/debug-local-var.f90 +++ /dev/null @@ -1,54 +0,0 @@ -! RUN: %flang_fc1 -emit-fir -debug-info-kind=standalone -mmlir --mlir-print-debuginfo %s -o - | \ -! RUN: fir-opt --cg-rewrite="preserve-declare=true" --mlir-print-debuginfo | fir-opt --add-debug-info --mlir-print-debuginfo | FileCheck %s - -! CHECK-DAG: #[[INT8:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[INT4:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[REAL8:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[LOG1:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[REAL4:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[LOG4:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[MAIN:.*]] = #llvm.di_subprogram<{{.*}}name = "_QQmain"{{.*}}> -! CHECK-DAG: #[[FN1:.*]] = #llvm.di_subprogram<{{.*}}name = "fn1"{{.*}}> -! CHECK-DAG: #[[FN2:.*]] = #llvm.di_subprogram<{{.*}}name = "fn2"{{.*}}> - -program mn -! CHECK-DAG: #[[I4:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[I8:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[R4:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[R8:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[L1:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[L4:.*]] = #llvm.di_local_variable - integer(kind=4) :: i4 - integer(kind=8) :: i8 - real(kind=4) :: r4 - real(kind=8) :: r8 - logical(kind=1) :: l1 - logical(kind=4) :: l4 - i8 = fn1(i4, r8, l1) - i4 = fn2(i8, r4, l4) -contains - function fn1(a1, b1, c1) result (res1) -! CHECK-DAG: #[[A1:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[B1:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[C1:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[RES1:.*]] = #llvm.di_local_variable - integer(kind=4), intent(in) :: a1 - real(kind=8), intent(in) :: b1 - logical(kind=1), intent(in) :: c1 - integer(kind=8) :: res1 - res1 = a1 + b1 - end function - - function fn2(a2, b2, c2) result (res2) - implicit none -! CHECK-DAG: #[[A2:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[B2:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[C2:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[RES2:.*]] = #llvm.di_local_variable - integer(kind=8), intent(in) :: a2 - real(kind=4), intent(in) :: b2 - logical(kind=4), intent(in) :: c2 - integer(kind=4) :: res2 - res2 = a2 + b2 - end function -end program diff --git a/flang/test/Transforms/debug-local-var.fir b/flang/test/Transforms/debug-local-var.fir new file mode 100644 index 0000000000000..762f5ed269efc --- /dev/null +++ b/flang/test/Transforms/debug-local-var.fir @@ -0,0 +1,100 @@ +// RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s + +module attributes {dlti.dl_spec = #dlti.dl_spec<>} { + func.func @_QQmain() attributes {fir.bindc_name = "mn"} { + %0 = fir.alloca i32 {bindc_name = "i4", uniq_name = "_QFEi4"} + %1 = fircg.ext_declare %0 {uniq_name = "_QFEi4"} : (!fir.ref) -> !fir.ref loc(#loc1) + %2 = fir.alloca i64 {bindc_name = "i8", uniq_name = "_QFEi8"} + %3 = fircg.ext_declare %2 {uniq_name = "_QFEi8"} : (!fir.ref) -> !fir.ref loc(#loc2) + %4 = fir.alloca !fir.logical<1> {bindc_name = "l1", uniq_name = "_QFEl1"} + %5 = fircg.ext_declare %4 {uniq_name = "_QFEl1"} : (!fir.ref>) -> !fir.ref> loc(#loc3) + %6 = fir.alloca !fir.logical<4> {bindc_name = "l4", uniq_name = "_QFEl4"} + %7 = fircg.ext_declare %6 {uniq_name = "_QFEl4"} : (!fir.ref>) -> !fir.ref> loc(#loc4) + %8 = fir.alloca f32 {bindc_name = "r4", uniq_name = "_QFEr4"} + %9 = fircg.ext_declare %8 {uniq_name = "_QFEr4"} : (!fir.ref) -> !fir.ref loc(#loc5) + %10 = fir.alloca f64 {bindc_name = "r8", uniq_name = "_QFEr8"} + %11 = fircg.ext_declare %10 {uniq_name = "_QFEr8"} : (!fir.ref) -> !fir.ref loc(#loc6) + %12 = fir.call @_QFPfn1(%1, %11, %5) fastmath : (!fir.ref, !fir.ref, !fir.ref>) -> i64 + fir.store %12 to %3 : !fir.ref + %13 = fir.call @_QFPfn2(%3, %9, %7) fastmath : (!fir.ref, !fir.ref, !fir.ref>) -> i32 + fir.store %13 to %1 : !fir.ref + return + } loc(#loc7) + func.func private @_QFPfn1(%arg0: !fir.ref {fir.bindc_name = "a1"}, %arg1: !fir.ref {fir.bindc_name = "b1"}, %arg2: !fir.ref> {fir.bindc_name = "c1"}) -> i64 attributes {fir.host_symbol = @_QQmain, llvm.linkage = #llvm.linkage} { + %0 = fir.undefined !fir.dscope loc(#loc11) + %1 = fircg.ext_declare %arg0 dummy_scope %0 {uniq_name = "_QFFfn1Ea1"} : (!fir.ref, !fir.dscope) -> !fir.ref loc(#loc8) + %2 = fircg.ext_declare %arg1 dummy_scope %0 {uniq_name = "_QFFfn1Eb1"} : (!fir.ref, !fir.dscope) -> !fir.ref loc(#loc9) + %3 = fircg.ext_declare %arg2 dummy_scope %0 {uniq_name = "_QFFfn1Ec1"} : (!fir.ref>, !fir.dscope) -> !fir.ref> loc(#loc10) + %4 = fir.alloca i64 {bindc_name = "res1", uniq_name = "_QFFfn1Eres1"} loc(#loc15) + %5 = fircg.ext_declare %4 {uniq_name = "_QFFfn1Eres1"} : (!fir.ref) -> !fir.ref loc(#loc11) + %6 = fir.load %1 : !fir.ref + %7 = fir.convert %6 : (i32) -> f64 + %8 = fir.load %2 : !fir.ref + %9 = arith.addf %7, %8 fastmath : f64 + %10 = fir.convert %9 : (f64) -> i64 + fir.store %10 to %5 : !fir.ref + %11 = fir.load %5 : !fir.ref + return %11 : i64 + } loc(#loc12) + func.func private @_QFPfn2(%arg0: !fir.ref {fir.bindc_name = "a2"}, %arg1: !fir.ref {fir.bindc_name = "b2"}, %arg2: !fir.ref> {fir.bindc_name = "c2"}) -> i32 attributes {fir.host_symbol = @_QQmain, llvm.linkage = #llvm.linkage} { + %0 = fir.undefined !fir.dscope + %1 = fircg.ext_declare %arg0 dummy_scope %0 {uniq_name = "_QFFfn2Ea2"} : (!fir.ref, !fir.dscope) -> !fir.ref loc(#loc13) + %2 = fircg.ext_declare %arg1 dummy_scope %0 {uniq_name = "_QFFfn2Eb2"} : (!fir.ref, !fir.dscope) -> !fir.ref loc(#loc14) + %3 = fircg.ext_declare %arg2 dummy_scope %0 {uniq_name = "_QFFfn2Ec2"} : (!fir.ref>, !fir.dscope) -> !fir.ref> loc(#loc15) + %4 = fir.alloca i32 {bindc_name = "res2", uniq_name = "_QFFfn2Eres2"} + %5 = fircg.ext_declare %4 {uniq_name = "_QFFfn2Eres2"} : (!fir.ref) -> !fir.ref loc(#loc16) + %6 = fir.load %1 : !fir.ref + %7 = fir.convert %6 : (i64) -> f32 + %8 = fir.load %2 : !fir.ref + %9 = arith.addf %7, %8 fastmath : f32 + %10 = fir.convert %9 : (f32) -> i32 + fir.store %10 to %5 : !fir.ref + %11 = fir.load %5 : !fir.ref + return %11 : i32 + } loc(#loc17) +} +#loc7 = loc("test.f90":4:19) +#loc1 = loc("test.f90":5:1) +#loc2 = loc("test.f90":6:22) +#loc3 = loc("test.f90":7:22) +#loc4 = loc("test.f90":8:22) +#loc5 = loc("test.f90":9:22) +#loc6 = loc("test.f90":10:19) +#loc12 = loc("test.f90":12:36) +#loc8 = loc("test.f90":13:3) +#loc9 = loc("test.f90":14:3) +#loc10 = loc("test.f90":15:1) +#loc11 = loc("test.f90":16:1) +#loc17 = loc("test.f90":18:33) +#loc13 = loc("test.f90":19:33) +#loc14 = loc("test.f90":20:36) +#loc15 = loc("test.f90":21:24) +#loc16 = loc("test.f90":22:5) + +// CHECK-DAG: #[[INT8:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[INT4:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[REAL8:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[LOG1:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[REAL4:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[LOG4:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[MAIN:.*]] = #llvm.di_subprogram<{{.*}}name = "_QQmain"{{.*}}> +// CHECK-DAG: #[[FN1:.*]] = #llvm.di_subprogram<{{.*}}name = "fn1"{{.*}}> +// CHECK-DAG: #[[FN2:.*]] = #llvm.di_subprogram<{{.*}}name = "fn2"{{.*}}> + +// Line numbers should match the number in corresponding loc entry. +// CHECK-DAG: #[[I4:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[I8:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[R4:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[R8:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[L1:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[L4:.*]] = #llvm.di_local_variable + +// CHECK-DAG: #[[A1:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[B1:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[C1:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[RES1:.*]] = #llvm.di_local_variable + +// CHECK-DAG: #[[A2:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[B2:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[C2:.*]] = #llvm.di_local_variable +// CHECK-DAG: #[[RES2:.*]] = #llvm.di_local_variable