2015-03-11 20:48:24 +08:00
; RUN: llc -mtriple mips-linux-gnu -O2 %s -o - | FileCheck %s
; Check struct X for dead variable xyz from inlined function foo.
; CHECK: section_info
; CHECK: DW_TAG_structure_type
; CHECK-NEXT: info_string
@i = common global i32 0 ; <i32*> [#uses=2]
declare void @llvm.dbg.declare ( metadata , metadata , metadata ) nounwind readnone
declare void @llvm.dbg.value ( metadata , i64 , metadata , metadata ) nounwind readnone
2015-11-06 06:03:56 +08:00
define i32 @bar ( ) nounwind ssp !dbg !6 {
2015-03-11 20:48:24 +08:00
entry:
%0 = load i32 , i32 * @i , align 4 , !dbg !17 ; <i32> [#uses=2]
2015-04-30 00:38:44 +08:00
tail call void @llvm.dbg.value ( metadata i32 %0 , i64 0 , metadata !59 , metadata !DIExpression ( ) ) , !dbg !19
tail call void @llvm.dbg.declare ( metadata !29 , metadata !60 , metadata !DIExpression ( ) ) , !dbg !21
2015-03-11 20:48:24 +08:00
%1 = mul nsw i32 %0 , %0 , !dbg !22 ; <i32> [#uses=2]
store i32 %1 , i32 * @i , align 4 , !dbg !17
ret i32 %1 , !dbg !23
}
!llvm.dbg.cu = ! { !2 }
!llvm.module.flags = ! { !28 }
2015-08-29 04:26:49 +08:00
!0 = distinct !DISubprogram ( name: "foo" , line: 9 , isLocal: true , isDefinition: true , virtualIndex: 6 , isOptimized: true , scopeLine: 9 , file: !27 , scope: !1 , type: !3 , variables: !24 )
2015-04-30 00:38:44 +08:00
!1 = !DIFile ( filename: "bar.c" , directory: "/tmp/" )
2015-08-04 01:26:41 +08:00
!2 = distinct !DICompileUnit ( language: D W _ L A N G _ C 89 , producer: "4.2.1 (Based on Apple Inc. build 5658) (LLVM build)" , isOptimized: true , emissionKind: 0 , file: !27 , enums: !20 , retainedTypes: !20 , subprograms: !25 , globals: !26 , imports: !20 )
2015-04-30 00:38:44 +08:00
!3 = !DISubroutineType ( types: !4 )
2015-03-11 20:48:24 +08:00
!4 = ! { !5 , !5 }
2015-04-30 00:38:44 +08:00
!5 = !DIBasicType ( tag: D W _ T A G _ b a s e _ type , name: "int" , size: 32 , align: 32 , encoding: D W _ A T E _ s i g n e d )
2015-11-06 06:03:56 +08:00
!6 = distinct !DISubprogram ( name: "bar" , linkageName: "bar" , line: 14 , isLocal: false , isDefinition: true , virtualIndex: 6 , isOptimized: true , file: !27 , scope: !1 , type: !7 )
2015-04-30 00:38:44 +08:00
!7 = !DISubroutineType ( types: !8 )
2015-03-11 20:48:24 +08:00
!8 = ! { !5 }
2015-08-01 02:58:39 +08:00
!9 = !DILocalVariable ( name: "j" , line: 9 , arg: 1 , scope: !0 , file: !1 , type: !5 )
!10 = !DILocalVariable ( name: "xyz" , line: 10 , scope: !11 , file: !1 , type: !12 )
Verifier: Check that inlined-at locations agree
Check that the `MDLocalVariable::getInlinedAt()` in a debug info
intrinsic's variable always matches the `MDLocation::getInlinedAt()` of
its `!dbg` attachment.
The goal here is to get rid of `MDLocalVariable::getInlinedAt()`
entirely (PR22778), since it's expensive and unnecessary, but I'll let
this verifier check bake for a while (a week maybe?) first. I've
updated the testcases that had the wrong value for `inlinedAt:`.
This checks that things are sane in the IR, but currently things go out
of whack in a few places in the backend. I'll follow shortly with
assertions in the backend (with code fixes).
If you have out-of-tree testcases that just started failing, here's how
I updated these ones:
1. The verifier check gives you the basic block, function, instruction,
and relevant metadata arguments (metadata numbering doesn't
necessarily match the source file, unfortunately).
2. Look at the `@llvm.dbg.*()` instruction, and compare the
`inlinedAt:` fields of the variable argument (second `metadata`
argument) and the `!dbg` attachment.
3. Figure out based on the variable `scope:` chain and the functions in
the file whether the variable has been inlined (and into what), so
you can determine which `inlinedAt:` is actually correct. In all of
the in-tree testcases, the `!MDLocation()` was correct and the
`!MDLocalVariable()` was wrong, but YMMV.
4. Duplicate the metadata that you're going to change, and add/drop the
`inlinedAt:` field from one of them. Be careful that the other
references to the same metadata node point at the correct one.
llvm-svn: 234021
2015-04-04 00:54:30 +08:00
2015-08-01 02:58:39 +08:00
!59 = !DILocalVariable ( name: "j" , line: 9 , arg: 1 , scope: !0 , file: !1 , type: !5 )
!60 = !DILocalVariable ( name: "xyz" , line: 10 , scope: !11 , file: !1 , type: !12 )
Verifier: Check that inlined-at locations agree
Check that the `MDLocalVariable::getInlinedAt()` in a debug info
intrinsic's variable always matches the `MDLocation::getInlinedAt()` of
its `!dbg` attachment.
The goal here is to get rid of `MDLocalVariable::getInlinedAt()`
entirely (PR22778), since it's expensive and unnecessary, but I'll let
this verifier check bake for a while (a week maybe?) first. I've
updated the testcases that had the wrong value for `inlinedAt:`.
This checks that things are sane in the IR, but currently things go out
of whack in a few places in the backend. I'll follow shortly with
assertions in the backend (with code fixes).
If you have out-of-tree testcases that just started failing, here's how
I updated these ones:
1. The verifier check gives you the basic block, function, instruction,
and relevant metadata arguments (metadata numbering doesn't
necessarily match the source file, unfortunately).
2. Look at the `@llvm.dbg.*()` instruction, and compare the
`inlinedAt:` fields of the variable argument (second `metadata`
argument) and the `!dbg` attachment.
3. Figure out based on the variable `scope:` chain and the functions in
the file whether the variable has been inlined (and into what), so
you can determine which `inlinedAt:` is actually correct. In all of
the in-tree testcases, the `!MDLocation()` was correct and the
`!MDLocalVariable()` was wrong, but YMMV.
4. Duplicate the metadata that you're going to change, and add/drop the
`inlinedAt:` field from one of them. Be careful that the other
references to the same metadata node point at the correct one.
llvm-svn: 234021
2015-04-04 00:54:30 +08:00
2015-04-30 00:38:44 +08:00
!11 = distinct !DILexicalBlock ( line: 9 , column: 0 , file: !1 , scope: !0 )
!12 = !DICompositeType ( tag: D W _ T A G _ s t r u c t u r e _ type , name: "X" , line: 10 , size: 64 , align: 32 , file: !27 , scope: !0 , elements: !13 )
2015-03-11 20:48:24 +08:00
!13 = ! { !14 , !15 }
2015-04-30 00:38:44 +08:00
!14 = !DIDerivedType ( tag: D W _ T A G _ m e m b e r , name: "a" , line: 10 , size: 32 , align: 32 , file: !27 , scope: !12 , baseType: !5 )
!15 = !DIDerivedType ( tag: D W _ T A G _ m e m b e r , name: "b" , line: 10 , size: 32 , align: 32 , offset: 32 , file: !27 , scope: !12 , baseType: !5 )
!16 = !DIGlobalVariable ( name: "i" , line: 5 , isLocal: false , isDefinition: true , scope: !1 , file: !1 , type: !5 , variable: i32 * @i )
!17 = !DILocation ( line: 15 , scope: !18 )
!18 = distinct !DILexicalBlock ( line: 14 , column: 0 , file: !1 , scope: !6 )
!19 = !DILocation ( line: 9 , scope: !0 , inlinedAt: !17 )
2015-03-11 20:48:24 +08:00
!20 = ! { }
2015-04-30 00:38:44 +08:00
!21 = !DILocation ( line: 9 , scope: !11 , inlinedAt: !17 )
!22 = !DILocation ( line: 11 , scope: !11 , inlinedAt: !17 )
!23 = !DILocation ( line: 16 , scope: !18 )
2015-03-11 20:48:24 +08:00
!24 = ! { !9 , !10 }
!25 = ! { !0 , !6 }
!26 = ! { !16 }
2015-04-30 00:38:44 +08:00
!27 = !DIFile ( filename: "bar.c" , directory: "/tmp/" )
2015-03-11 20:48:24 +08:00
!28 = ! { i32 1 , !"Debug Info Version" , i32 3 }
!29 = ! { null }