llvm/test/DebugInfo/COFF/inlining-padding.ll
Reid Kleckner d9b93cd3fe Modify emitTypeInformation to use MemoryTypeTableBuilder, take 2
This effectively revers commit r270389 and re-lands r270106, but it's
almost a rewrite.

The behavior change in r270106 was that we could no longer assume that
each LF_FUNC_ID record got its own type index. This patch adds a map
from DINode* to TypeIndex, so we can stop making that assumption.

This change also emits padding bytes between type records similar to the
way MSVC does. The size of the type record includes the padding bytes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@270485 91177308-0d34-0410-b5e6-96231b3b80d8
2016-05-23 20:23:46 +00:00

102 lines
4.2 KiB
LLVM

; RUN: llc < %s -filetype=obj -o - | llvm-readobj -codeview -codeview-subsection-bytes | FileCheck %s
; Check how we pad out the LF_FUNC_ID records. The 00F3F2F1 bytes in LeafData are
; what's interesting here.
; CHECK: FuncId (0x1002) {
; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
; CHECK: Name: a
; CHECK: LeafData (
; CHECK: 0000: {{.*}} 6100F2F1 |........a...|
; CHECK: )
; CHECK: }
; CHECK: FuncId (0x1003) {
; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
; CHECK: Name: ab
; CHECK: LeafData (
; CHECK: 0000: {{.*}} 616200F1 |........ab..|
; CHECK: )
; CHECK: }
; CHECK: FuncId (0x1004) {
; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
; CHECK: Name: abc
; CHECK: LeafData (
; CHECK: 0000: {{.*}} 61626300 |........abc.|
; CHECK: )
; CHECK: }
; CHECK: FuncId (0x1005) {
; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
; CHECK: Name: abcd
; CHECK: LeafData (
; CHECK: 0000: {{.*}} 61626364 00F3F2F1 |........abcd....|
; CHECK: )
; CHECK: }
; C++ source used to generate the IR:
;
; extern volatile int x;
; static void a() { x++; }
; static void ab() { x++; }
; static void abc() { x++; }
; static void abcd() { x++; }
; int main() {
; a();
; ab();
; abc();
; abcd();
; }
; ModuleID = 't.cpp'
source_filename = "t.cpp"
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
@x = external global i32, align 4
; Function Attrs: norecurse nounwind
define i32 @main() #0 !dbg !6 {
entry:
store volatile i32 0, i32* @x, align 4, !dbg !11, !tbaa !16
store volatile i32 0, i32* @x, align 4, !dbg !20, !tbaa !16
store volatile i32 0, i32* @x, align 4, !dbg !23, !tbaa !16
store volatile i32 0, i32* @x, align 4, !dbg !26, !tbaa !16
ret i32 0, !dbg !29
}
attributes #0 = { norecurse nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4}
!llvm.ident = !{!5}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.9.0 (trunk 270461) (llvm/trunk 270469)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
!1 = !DIFile(filename: "<stdin>", directory: "D:\5Csrc\5Cllvm\5Cbuild")
!2 = !{}
!3 = !{i32 2, !"CodeView", i32 1}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{!"clang version 3.9.0 (trunk 270461) (llvm/trunk 270469)"}
!6 = distinct !DISubprogram(name: "main", scope: !7, file: !7, line: 6, type: !8, isLocal: false, isDefinition: true, scopeLine: 6, isOptimized: true, unit: !0, variables: !2)
!7 = !DIFile(filename: "t.cpp", directory: "D:\5Csrc\5Cllvm\5Cbuild")
!8 = !DISubroutineType(types: !9)
!9 = !{!10}
!10 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
!11 = !DILocation(line: 2, scope: !12, inlinedAt: !15)
!12 = distinct !DISubprogram(name: "a", scope: !7, file: !7, line: 2, type: !13, isLocal: true, isDefinition: true, scopeLine: 2, isOptimized: true, unit: !0, variables: !2)
!13 = !DISubroutineType(types: !14)
!14 = !{null}
!15 = distinct !DILocation(line: 7, scope: !6)
!16 = !{!17, !17, i64 0}
!17 = !{!"int", !18, i64 0}
!18 = !{!"omnipotent char", !19, i64 0}
!19 = !{!"Simple C/C++ TBAA"}
!20 = !DILocation(line: 3, scope: !21, inlinedAt: !22)
!21 = distinct !DISubprogram(name: "ab", scope: !7, file: !7, line: 3, type: !13, isLocal: true, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0, variables: !2)
!22 = distinct !DILocation(line: 8, scope: !6)
!23 = !DILocation(line: 4, scope: !24, inlinedAt: !25)
!24 = distinct !DISubprogram(name: "abc", scope: !7, file: !7, line: 4, type: !13, isLocal: true, isDefinition: true, scopeLine: 4, isOptimized: true, unit: !0, variables: !2)
!25 = distinct !DILocation(line: 9, scope: !6)
!26 = !DILocation(line: 5, scope: !27, inlinedAt: !28)
!27 = distinct !DISubprogram(name: "abcd", scope: !7, file: !7, line: 5, type: !13, isLocal: true, isDefinition: true, scopeLine: 5, isOptimized: true, unit: !0, variables: !2)
!28 = distinct !DILocation(line: 10, scope: !6)
!29 = !DILocation(line: 11, scope: !6)