|
| 1 | +! RUN: %flang_fc1 -emit-llvm -debug-info-kind=standalone %s -o - | FileCheck %s |
| 2 | + |
| 3 | +! This tests checks the debug information for local variables in llvm IR. |
| 4 | + |
| 5 | +! CHECK-LABEL: define void @_QQmain |
| 6 | +! CHECK-DAG: %[[AL11:.*]] = alloca i32 |
| 7 | +! CHECK-DAG: %[[AL12:.*]] = alloca i64 |
| 8 | +! CHECK-DAG: %[[AL13:.*]] = alloca i8 |
| 9 | +! CHECK-DAG: %[[AL14:.*]] = alloca i32 |
| 10 | +! CHECK-DAG: %[[AL15:.*]] = alloca float |
| 11 | +! CHECK-DAG: %[[AL16:.*]] = alloca double |
| 12 | +! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL11]], metadata ![[I4:.*]], metadata !DIExpression()) |
| 13 | +! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL12]], metadata ![[I8:.*]], metadata !DIExpression()) |
| 14 | +! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL13]], metadata ![[L1:.*]], metadata !DIExpression()) |
| 15 | +! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL14]], metadata ![[L4:.*]], metadata !DIExpression()) |
| 16 | +! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL15]], metadata ![[R4:.*]], metadata !DIExpression()) |
| 17 | +! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL16]], metadata ![[R8:.*]], metadata !DIExpression()) |
| 18 | +! CHECK-LABEL: } |
| 19 | + |
| 20 | +! CHECK-LABEL: define {{.*}}i64 @_QFPfn1 |
| 21 | +! CHECK-SAME: (ptr %[[ARG1:.*]], ptr %[[ARG2:.*]], ptr %[[ARG3:.*]]) |
| 22 | +! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[ARG1]], metadata ![[A1:.*]], metadata !DIExpression()) |
| 23 | +! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[ARG2]], metadata ![[B1:.*]], metadata !DIExpression()) |
| 24 | +! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[ARG3]], metadata ![[C1:.*]], metadata !DIExpression()) |
| 25 | +! CHECK-DAG: %[[AL2:.*]] = alloca i64 |
| 26 | +! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[AL2]], metadata ![[RES1:.*]], metadata !DIExpression()) |
| 27 | +! CHECK-LABEL: } |
| 28 | + |
| 29 | +! CHECK-LABEL: define {{.*}}i32 @_QFPfn2 |
| 30 | +! CHECK-SAME: (ptr %[[FN2ARG1:.*]], ptr %[[FN2ARG2:.*]], ptr %[[FN2ARG3:.*]]) |
| 31 | +! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[FN2ARG1]], metadata ![[A2:.*]], metadata !DIExpression()) |
| 32 | +! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[FN2ARG2]], metadata ![[B2:.*]], metadata !DIExpression()) |
| 33 | +! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[FN2ARG3]], metadata ![[C2:.*]], metadata !DIExpression()) |
| 34 | +! CHECK-DAG: %[[AL3:.*]] = alloca i32 |
| 35 | +! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[AL3]], metadata ![[RES2:.*]], metadata !DIExpression()) |
| 36 | +! CHECK-LABEL: } |
| 37 | + |
| 38 | +program mn |
| 39 | +! CHECK-DAG: ![[MAIN:.*]] = distinct !DISubprogram(name: "_QQmain", {{.*}}) |
| 40 | + |
| 41 | +! CHECK-DAG: ![[TYI32:.*]] = !DIBasicType(name: "integer", size: 32, encoding: DW_ATE_signed) |
| 42 | +! CHECK-DAG: ![[TYI64:.*]] = !DIBasicType(name: "integer", size: 64, encoding: DW_ATE_signed) |
| 43 | +! CHECK-DAG: ![[TYL8:.*]] = !DIBasicType(name: "logical", size: 8, encoding: DW_ATE_boolean) |
| 44 | +! CHECK-DAG: ![[TYL32:.*]] = !DIBasicType(name: "logical", size: 32, encoding: DW_ATE_boolean) |
| 45 | +! CHECK-DAG: ![[TYR32:.*]] = !DIBasicType(name: "real", size: 32, encoding: DW_ATE_float) |
| 46 | +! CHECK-DAG: ![[TYR64:.*]] = !DIBasicType(name: "real", size: 64, encoding: DW_ATE_float) |
| 47 | + |
| 48 | +! CHECK-DAG: ![[I4]] = !DILocalVariable(name: "i4", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYI32]]) |
| 49 | +! CHECK-DAG: ![[I8]] = !DILocalVariable(name: "i8", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYI64]]) |
| 50 | +! CHECK-DAG: ![[R4]] = !DILocalVariable(name: "r4", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYR32]]) |
| 51 | +! CHECK-DAG: ![[R8]] = !DILocalVariable(name: "r8", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYR64]]) |
| 52 | +! CHECK-DAG: ![[L1]] = !DILocalVariable(name: "l1", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYL8]]) |
| 53 | +! CHECK-DAG: ![[L4]] = !DILocalVariable(name: "l4", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYL32]]) |
| 54 | + integer(kind=4) :: i4 |
| 55 | + integer(kind=8) :: i8 |
| 56 | + real(kind=4) :: r4 |
| 57 | + real(kind=8) :: r8 |
| 58 | + logical(kind=1) :: l1 |
| 59 | + logical(kind=4) :: l4 |
| 60 | + |
| 61 | + i8 = fn1(i4, r8, l1) |
| 62 | + i4 = fn2(i8, r4, l4) |
| 63 | +contains |
| 64 | +! CHECK-DAG: ![[FN1:.*]] = distinct !DISubprogram(name: "fn1", {{.*}}) |
| 65 | +! CHECK-DAG: ![[A1]] = !DILocalVariable(name: "a1", arg: 1, scope: ![[FN1]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYI32]]) |
| 66 | +! CHECK-DAG: ![[B1]] = !DILocalVariable(name: "b1", arg: 2, scope: ![[FN1]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYR64]]) |
| 67 | +! CHECK-DAG: ![[C1]] = !DILocalVariable(name: "c1", arg: 3, scope: ![[FN1]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYL8]]) |
| 68 | +! CHECK-DAG: ![[RES1]] = !DILocalVariable(name: "res1", scope: ![[FN1]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYI64]]) |
| 69 | + function fn1(a1, b1, c1) result (res1) |
| 70 | + integer(kind=4), intent(in) :: a1 |
| 71 | + real(kind=8), intent(in) :: b1 |
| 72 | + logical(kind=1), intent(in) :: c1 |
| 73 | + integer(kind=8) :: res1 |
| 74 | + |
| 75 | + res1 = a1 + b1 |
| 76 | + end function |
| 77 | + |
| 78 | +! CHECK-DAG: ![[FN2:.*]] = distinct !DISubprogram(name: "fn2", {{.*}}) |
| 79 | +! CHECK-DAG: ![[A2]] = !DILocalVariable(name: "a2", arg: 1, scope: ![[FN2]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYI64]]) |
| 80 | +! CHECK-DAG: ![[B2]] = !DILocalVariable(name: "b2", arg: 2, scope: ![[FN2]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYR32]]) |
| 81 | +! CHECK-DAG: ![[C2]] = !DILocalVariable(name: "c2", arg: 3, scope: ![[FN2]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYL32]]) |
| 82 | +! CHECK-DAG: ![[RES2]] = !DILocalVariable(name: "res2", scope: ![[FN2]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYI32]]) |
| 83 | + function fn2(a2, b2, c2) result (res2) |
| 84 | + integer(kind=8), intent(in) :: a2 |
| 85 | + real(kind=4), intent(in) :: b2 |
| 86 | + logical(kind=4), intent(in) :: c2 |
| 87 | + integer(kind=4) :: res2 |
| 88 | + |
| 89 | + res2 = a2 + b2 |
| 90 | + end function |
| 91 | +end program |
0 commit comments