mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
4a1b9faea8
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. llvm-svn: 270485
102 lines
4.2 KiB
LLVM
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)
|