-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Verifier] Sanity check alloca size against DILocalVariable fragment …
…size Add a check that the DILocalVariable fragment size in dbg.declare does not exceed the size of the alloca. This would have caught the invalid debuginfo regenerated by rustc in #64149. Differential Revision: https://reviews.llvm.org/D158743
- Loading branch information
Showing
10 changed files
with
208 additions
and
55 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
; Test remark output for stack-frame-layout | ||
|
||
; ensure basic output works | ||
; RUN: llc -mcpu=corei7 -O1 -pass-remarks-analysis=stack-frame-layout < %s 2>&1 >/dev/null | FileCheck %s | ||
|
||
; check additional slots are displayed when stack is not optimized | ||
; RUN: llc -mcpu=corei7 -O0 -pass-remarks-analysis=stack-frame-layout < %s 2>&1 >/dev/null | FileCheck %s --check-prefix=NO_COLORING | ||
|
||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
@.str = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 | ||
declare i32 @printf(ptr, ...) | ||
|
||
; CHECK: Function: stackSizeWarning | ||
; CHECK: Offset: [SP-88], Type: Variable, Align: 16, Size: 80 | ||
; CHECK: buffer @ frame-diags.c:30 | ||
; NO_COLORING: Offset: [SP-168], Type: Variable, Align: 16, Size: 80 | ||
; CHECK: buffer2 @ frame-diags.c:33 | ||
define void @stackSizeWarning() { | ||
entry: | ||
%buffer = alloca [80 x i8], align 16 | ||
%buffer2 = alloca [80 x i8], align 16 | ||
call void @llvm.dbg.declare(metadata ptr %buffer, metadata !25, metadata !DIExpression()), !dbg !39 | ||
call void @llvm.dbg.declare(metadata ptr %buffer2, metadata !31, metadata !DIExpression()), !dbg !40 | ||
ret void | ||
} | ||
|
||
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) | ||
declare void @llvm.dbg.declare(metadata, metadata, metadata) #0 | ||
|
||
attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } | ||
|
||
!llvm.dbg.cu = !{!0, !2} | ||
!llvm.module.flags = !{!18, !19, !20, !21, !22, !23, !24} | ||
|
||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) | ||
!1 = !DIFile(filename: "frame-diags.c", directory: "") | ||
!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, retainedTypes: !4, splitDebugInlining: false, nameTableKind: None) | ||
!3 = !DIFile(filename: "dot.c", directory: "") | ||
!4 = !{!5, !6, !10, !13} | ||
!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64) | ||
!6 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64) | ||
!7 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Array", file: !3, line: 3, size: 128, elements: !8) | ||
!8 = !{!9, !12} | ||
!9 = !DIDerivedType(tag: DW_TAG_member, name: "data", scope: !7, file: !3, line: 4, baseType: !10, size: 64) | ||
!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64) | ||
!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) | ||
!12 = !DIDerivedType(tag: DW_TAG_member, name: "size", scope: !7, file: !3, line: 5, baseType: !11, size: 32, offset: 64) | ||
!13 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !14, size: 64) | ||
!14 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Result", file: !3, line: 8, size: 128, elements: !15) | ||
!15 = !{!16, !17} | ||
!16 = !DIDerivedType(tag: DW_TAG_member, name: "data", scope: !14, file: !3, line: 9, baseType: !6, size: 64) | ||
!17 = !DIDerivedType(tag: DW_TAG_member, name: "sum", scope: !14, file: !3, line: 10, baseType: !11, size: 32, offset: 64) | ||
!18 = !{i32 7, !"Dwarf Version", i32 5} | ||
!19 = !{i32 2, !"Debug Info Version", i32 3} | ||
!20 = !{i32 1, !"wchar_size", i32 4} | ||
!21 = !{i32 8, !"PIC Level", i32 2} | ||
!22 = !{i32 7, !"PIE Level", i32 2} | ||
!23 = !{i32 7, !"uwtable", i32 2} | ||
!24 = !{i32 7, !"frame-pointer", i32 2} | ||
!25 = !DILocalVariable(name: "buffer", scope: !26, file: !1, line: 30, type: !32) | ||
!26 = distinct !DILexicalBlock(scope: !27, file: !1, line: 29, column: 3) | ||
!27 = distinct !DISubprogram(name: "stackSizeWarning", scope: !1, file: !1, line: 28, type: !28, scopeLine: 28, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !30) | ||
!28 = !DISubroutineType(types: !29) | ||
!29 = !{null} | ||
!30 = !{!25, !31, !36, !37} | ||
!31 = !DILocalVariable(name: "buffer2", scope: !27, file: !1, line: 33, type: !32) | ||
!32 = !DICompositeType(tag: DW_TAG_array_type, baseType: !33, size: 640, elements: !34) | ||
!33 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char) | ||
!34 = !{!35} | ||
!35 = !DISubrange(count: 80) | ||
!36 = !DILocalVariable(name: "a", scope: !27, file: !1, line: 34, type: !11) | ||
!37 = !DILocalVariable(name: "b", scope: !27, file: !1, line: 35, type: !38) | ||
!38 = !DIBasicType(name: "long", size: 64, encoding: DW_ATE_signed) | ||
!39 = !DILocation(line: 30, column: 10, scope: !26) | ||
!40 = !DILocation(line: 33, column: 8, scope: !27) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
; RUN: llvm-as -disable-output < %s 2>&1 | FileCheck %s | ||
|
||
; CHECK: llvm.dbg.declare has larger fragment size than alloca size | ||
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr %slice.dbg.spill, metadata !23, metadata !DIExpression()) | ||
; CHECK: llvm.dbg.declare has larger fragment size than alloca size | ||
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr %slice.dbg.spill1, metadata !23, metadata !DIExpression()) | ||
|
||
%"EndianSlice<'_>" = type { { ptr, i64 }, i32, [1 x i32] } | ||
|
||
; example::test | ||
; Function Attrs: nonlazybind uwtable | ||
define void @_ZN7example4test17h64a501af0fe536ddE(ptr align 1 %s.0, i64 %s.1) unnamed_addr #0 !dbg !7 { | ||
start: | ||
%slice.dbg.spill1 = alloca i32, align 4 | ||
%slice.dbg.spill = alloca { ptr, i64 }, align 8 | ||
%s.dbg.spill = alloca { ptr, i64 }, align 8 | ||
%_2 = alloca %"EndianSlice<'_>", align 8 | ||
%0 = getelementptr inbounds { ptr, i64 }, ptr %s.dbg.spill, i32 0, i32 0 | ||
store ptr %s.0, ptr %0, align 8 | ||
%1 = getelementptr inbounds { ptr, i64 }, ptr %s.dbg.spill, i32 0, i32 1 | ||
store i64 %s.1, ptr %1, align 8 | ||
call void @llvm.dbg.declare(metadata ptr %s.dbg.spill, metadata !22, metadata !DIExpression()), !dbg !33 | ||
%2 = getelementptr inbounds { ptr, i64 }, ptr %slice.dbg.spill, i32 0, i32 0, !dbg !34 | ||
store ptr %s.0, ptr %2, align 8, !dbg !34 | ||
%3 = getelementptr inbounds { ptr, i64 }, ptr %slice.dbg.spill, i32 0, i32 1, !dbg !34 | ||
store i64 %s.1, ptr %3, align 8, !dbg !34 | ||
call void @llvm.dbg.declare(metadata ptr %slice.dbg.spill, metadata !23, metadata !DIExpression()), !dbg !35 | ||
store i32 1, ptr %slice.dbg.spill1, align 4, !dbg !34 | ||
call void @llvm.dbg.declare(metadata ptr %slice.dbg.spill1, metadata !23, metadata !DIExpression()), !dbg !35 | ||
ret void, !dbg !36 | ||
} | ||
|
||
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) | ||
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 | ||
|
||
attributes #0 = { nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } | ||
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } | ||
|
||
!llvm.module.flags = !{!0, !1, !2, !3} | ||
!llvm.ident = !{!4} | ||
!llvm.dbg.cu = !{!5} | ||
|
||
!0 = !{i32 8, !"PIC Level", i32 2} | ||
!1 = !{i32 2, !"RtLibUseGOT", i32 1} | ||
!2 = !{i32 2, !"Dwarf Version", i32 4} | ||
!3 = !{i32 2, !"Debug Info Version", i32 3} | ||
!4 = !{!"rustc version 1.74.0-nightly (5c6a7e71c 2023-08-20)"} | ||
!5 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !6, producer: "clang LLVM (rustc version 1.74.0-nightly (5c6a7e71c 2023-08-20))", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false) | ||
!6 = !DIFile(filename: "/app/example.rs/@/example.a6c375ed18e8f6d3-cgu.0", directory: "/app") | ||
!7 = distinct !DISubprogram(name: "test", linkageName: "_ZN7example4test17h64a501af0fe536ddE", scope: !9, file: !8, line: 9, type: !10, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !5, templateParams: !20, retainedNodes: !21) | ||
!8 = !DIFile(filename: "example.rs", directory: "/app", checksumkind: CSK_MD5, checksum: "bd53c9e80c244adbeae5aa0d57de599d") | ||
!9 = !DINamespace(name: "example", scope: null) | ||
!10 = !DISubroutineType(types: !11) | ||
!11 = !{null, !12} | ||
!12 = !DICompositeType(tag: DW_TAG_structure_type, name: "&[u8]", file: !13, size: 128, align: 64, elements: !14, templateParams: !20, identifier: "4f7d759e2003ffb713a77bd933fd0146") | ||
!13 = !DIFile(filename: "<unknown>", directory: "") | ||
!14 = !{!15, !18} | ||
!15 = !DIDerivedType(tag: DW_TAG_member, name: "data_ptr", scope: !12, file: !13, baseType: !16, size: 64, align: 64) | ||
!16 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !17, size: 64, align: 64, dwarfAddressSpace: 0) | ||
!17 = !DIBasicType(name: "u8", size: 8, encoding: DW_ATE_unsigned) | ||
!18 = !DIDerivedType(tag: DW_TAG_member, name: "length", scope: !12, file: !13, baseType: !19, size: 64, align: 64, offset: 64) | ||
!19 = !DIBasicType(name: "usize", size: 64, encoding: DW_ATE_unsigned) | ||
!20 = !{} | ||
!21 = !{!22, !23} | ||
!22 = !DILocalVariable(name: "s", arg: 1, scope: !7, file: !8, line: 9, type: !12) | ||
!23 = !DILocalVariable(name: "slice", scope: !24, file: !8, line: 10, type: !25, align: 8) | ||
!24 = distinct !DILexicalBlock(scope: !7, file: !8, line: 10, column: 5) | ||
!25 = !DICompositeType(tag: DW_TAG_structure_type, name: "EndianSlice", scope: !9, file: !13, size: 192, align: 64, elements: !26, templateParams: !20, identifier: "f1b6e593370159e9df4228aa26ace4b5") | ||
!26 = !{!27, !28} | ||
!27 = !DIDerivedType(tag: DW_TAG_member, name: "slice", scope: !25, file: !13, baseType: !12, size: 128, align: 64) | ||
!28 = !DIDerivedType(tag: DW_TAG_member, name: "endian", scope: !25, file: !13, baseType: !29, size: 32, align: 32, offset: 128) | ||
!29 = !DICompositeType(tag: DW_TAG_structure_type, name: "Endian", scope: !9, file: !13, size: 32, align: 32, elements: !30, templateParams: !20, identifier: "a76092aada82685a5b963f3da7ae1bd9") | ||
!30 = !{!31} | ||
!31 = !DIDerivedType(tag: DW_TAG_member, name: "__0", scope: !29, file: !13, baseType: !32, size: 32, align: 32) | ||
!32 = !DIBasicType(name: "i32", size: 32, encoding: DW_ATE_signed) | ||
!33 = !DILocation(line: 9, column: 13, scope: !7) | ||
!34 = !DILocation(line: 10, column: 17, scope: !7) | ||
!35 = !DILocation(line: 10, column: 9, scope: !24) | ||
!36 = !DILocation(line: 11, column: 2, scope: !37) | ||
!37 = !DILexicalBlockFile(scope: !7, file: !8, discriminator: 0) |
Oops, something went wrong.