blob: 3bb1743adf6fc9c66e31de1e92b3fb5004f1da0c [file] [edit]
! RUN: %flang_fc1 -emit-llvm -debug-info-kind=standalone %s -o - | FileCheck %s
! RUN: %flang_fc1 -emit-llvm -O2 -debug-info-kind=standalone %s -o - | FileCheck %s --check-prefix=OPT
! RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s --check-prefix=NOSLOT
! RUN: %flang_fc1 -emit-llvm -debug-info-kind=line-tables-only %s -o - | FileCheck %s --check-prefix=NOSLOT
subroutine array(a, lb, n)
integer :: lb, n
real :: a(lb:n)
a(lb) = 0.0
end subroutine
subroutine char_len(c)
character(*) :: c
c(1:1) = 'x'
end subroutine
! CHECK-LABEL: define void @array_(
! CHECK: %[[LB_SLOT:[0-9]+]] = alloca
! CHECK: %[[COUNT_SLOT:[0-9]+]] = alloca
! CHECK: store i64 %{{[0-9]+}}, ptr %[[LB_SLOT]]
! CHECK-NEXT: #dbg_declare(ptr %[[LB_SLOT]], ![[LB:[0-9]+]], !DIExpression(),
! CHECK-NEXT: store i64 %{{[0-9]+}}, ptr %[[COUNT_SLOT]]
! CHECK-NEXT: #dbg_declare(ptr %[[COUNT_SLOT]], ![[COUNT:[0-9]+]], !DIExpression(),
! CHECK-NOT: #dbg_value
! Test that no fake.use is generated with an integer type i{{[0-9]+}}.
! CHECK-NOT: @llvm.fake.use(i{{[0-9]+}} %
! CHECK: ret void
! CHECK-LABEL: define void @char_len_(
! CHECK: %[[LEN_SLOT:[0-9]+]] = alloca
! CHECK: store i64 %{{[0-9]+}}, ptr %[[LEN_SLOT]]
! CHECK-NEXT: #dbg_declare(ptr %[[LEN_SLOT]], ![[LEN:[0-9]+]], !DIExpression(),
! CHECK-NOT: #dbg_value
! CHECK-NOT: @llvm.fake.use(i{{[0-9]+}} %
! CHECK: ret void
! CHECK-DAG: ![[LB]] = !DILocalVariable(name: "._QFarrayEa2"{{.*}}flags: DIFlagArtificial)
! CHECK-DAG: ![[COUNT]] = !DILocalVariable(name: "._QFarrayEa1"{{.*}}flags: DIFlagArtificial)
! CHECK-DAG: !DILocalVariable(name: "a"{{.*}}type: ![[ATY:[0-9]+]])
! CHECK-DAG: ![[ATY]] = !DICompositeType(tag: DW_TAG_array_type{{.*}}elements: ![[ELEMS:[0-9]+]])
! CHECK-DAG: ![[ELEMS]] = !{![[SUBRANGE:[0-9]+]]}
! CHECK-DAG: ![[SUBRANGE]] = !DISubrange(count: ![[COUNT]], lowerBound: ![[LB]])
! CHECK-DAG: ![[LEN]] = !DILocalVariable(name: "._QFchar_lenEc1"{{.*}}flags: DIFlagArtificial)
! CHECK-DAG: !DILocalVariable(name: "c"{{.*}}type: ![[CTY:[0-9]+]])
! CHECK-DAG: ![[CTY]] = !DIStringType(stringLength: ![[LEN]], encoding: DW_ATE_ASCII)
! The slots are only made at -O0. Above it a bound is described by its value,
! as it was before, so a debugger has to find that value in a register.
! OPT-LABEL: define void @array_(
! OPT: #dbg_value({{.*}}![[OPT_LB:[0-9]+]], !DIExpression
! OPT: #dbg_value({{.*}}![[OPT_COUNT:[0-9]+]], !DIExpression
! OPT-LABEL: define void @char_len_(
! OPT: #dbg_value({{.*}}![[OPT_LEN:[0-9]+]], !DIExpression
! OPT-DAG: ![[OPT_LB]] = !DILocalVariable(name: "._QFarrayEa2"{{.*}}flags: DIFlagArtificial)
! OPT-DAG: ![[OPT_COUNT]] = !DILocalVariable(name: "._QFarrayEa1"{{.*}}flags: DIFlagArtificial)
! OPT-DAG: ![[OPT_LEN]] = !DILocalVariable(name: "._QFchar_lenEc1"{{.*}}flags: DIFlagArtificial)
! A slot exists only to describe a variable, so neither is made when no
! variables are asked for.
! NOSLOT-NOT: #dbg_declare
! NOSLOT-NOT: #dbg_value