Skip to content

Commit

Permalink
Add tests to verify behavior of .cfi_sections .debug_frame intrinsic.
Browse files Browse the repository at this point in the history
There was some lacking test coverage for checking when the
.cfi_sections .debug_frame intrinsic is emitted. On x86_64,
with -fno-exceptions there is no .cfi_sections .debug_frame intrinsic
emitted because there is an unwind table attribute.

On AArch64, with -fno-exceptions, there is no unwind table attribute, so
the .cfi_sections .debug_frame intrinsic is emitted correctly.

Alternatively, with -fexceptions, both AArch64 and x86_64 emit an unwind
table and therefore do not emit a .cfi_sections .debug_frame intrinsic

All this work was done in addition to https://reviews.llvm.org/D139663
patch.

Differential Revision: https://reviews.llvm.org/D147747
  • Loading branch information
rastogishubham committed Apr 26, 2023
1 parent 1533478 commit fe8eab4
Show file tree
Hide file tree
Showing 5 changed files with 194 additions and 0 deletions.
26 changes: 26 additions & 0 deletions clang/test/Driver/test-uwtable.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// This test is added to provide test coverage for the uwtable attribute. It
// aims to make sure that for an X86_64 output compiled with -fexceptions or
// -fno-exceptions, a uwtable attribute is emitted. However, for an AArch64
// output with -fexceptions a uwtable attribute is emitted, but with
// -fno-exceptions a uwtable attribute is not emitted.

// RUN: %clang -g -fexceptions --target=x86_64-apple-darwin %s -S -emit-llvm -o - | FileCheck %s --check-prefix=X86_64_UWTABLE_EXCEPTIONS
// X86_64_UWTABLE_EXCEPTIONS: attributes #0 = { {{.*}} uwtable
// X86_64_UWTABLE_EXCEPTIONS: !{{[0-9]+}} = !{i32 7, !"uwtable", i32 2}

// RUN: %clang -g -fno-exceptions --target=x86_64-apple-darwin %s -S -emit-llvm -o - | FileCheck %s --check-prefix=X86_64_UWTABLE
// X86_64_UWTABLE: attributes #0 = { {{.*}} uwtable
// X86_64_UWTABLE: !{{[0-9]+}} = !{i32 7, !"uwtable", i32 2}

// RUN: %clang -g -fexceptions --target=arm64-apple-darwin %s -S -emit-llvm -o - | FileCheck %s --check-prefix=ARM64_UWTABLE_EXCEPTIONS
// ARM64_UWTABLE_EXCEPTIONS: attributes #0 = { {{.*}} uwtable
// ARM64_UWTABLE_EXCEPTIONS: !{{[0-9]+}} = !{i32 7, !"uwtable", i32 1}

// RUN: %clang -g -fno-exceptions --target=arm64-apple-darwin %s -S -emit-llvm -o - | FileCheck %s --check-prefix=ARM64_UWTABLE
// ARM64_UWTABLE-NOT: attributes #0 = { {{.*}} uwtable
// ARM64_UWTABLE-NOT: !{{[0-9]+}} = !{i32 7, !"uwtable", i32 2}
// ARM64_UWTABLE: attributes #0 =

int main() {
return 1;
}
43 changes: 43 additions & 0 deletions llvm/test/DebugInfo/AArch64/test-fexceptions-debug-frame.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
; This test is added to provide test coverage for the
; .cfi_sections .debug_frame intrinsic. It aims to make sure that for a AArch64
; output compiled with -fexceptions, no .cfi_sections .debug_frame is emitted.

; RUN: llc --filetype=asm %s -o - | FileCheck %s
; CHECK-NOT: .cfi_sections .debug_frame
; CHECK: .cfi_startproc


; ModuleID = 'test.cpp'
source_filename = "test.cpp"
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
target triple = "arm64-apple-macosx13.0.0"

; Function Attrs: noinline norecurse nounwind optnone ssp uwtable(sync)
define i32 @main() #0 !dbg !10 {
%1 = alloca i32, align 4
store i32 0, ptr %1, align 4
ret i32 1, !dbg !15
}

attributes #0 = { noinline norecurse nounwind optnone ssp uwtable(sync)}

!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6}
!llvm.dbg.cu = !{!7}
!llvm.ident = !{!9}

!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 14, i32 0]}
!1 = !{i32 7, !"Dwarf Version", i32 4}
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !{i32 1, !"wchar_size", i32 4}
!4 = !{i32 8, !"PIC Level", i32 2}
!5 = !{i32 7, !"uwtable", i32 1}
!6 = !{i32 7, !"frame-pointer", i32 1}
!7 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !8, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None, sysroot: "/Applications/Xcode.app", sdk: "MacOSX.sdk")
!8 = !DIFile(filename: "test.cpp", directory: "/Users/shubham/Development")
!9 = !{!"clang"}
!10 = distinct !DISubprogram(name: "main", scope: !8, file: !8, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !7, retainedNodes: !14)
!11 = !DISubroutineType(types: !12)
!12 = !{!13}
!13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!14 = !{}
!15 = !DILocation(line: 2, column: 5, scope: !10)
40 changes: 40 additions & 0 deletions llvm/test/DebugInfo/AArch64/test-fno-exceptions-debug-frame.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
; This test is added to provide test coverage for the
; .cfi_sections .debug_frame intrinsic. It aims to make sure that for a AArch64
; output compiled with -fno-exceptions, a .cfi_sections .debug_frame is emitted.

; RUN: llc --filetype=asm %s -o - | FileCheck %s
; CHECK: .cfi_sections .debug_frame

; ModuleID = 'test.cpp'
source_filename = "test.cpp"
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
target triple = "arm64-apple-macosx13.0.0"

; Function Attrs: noinline norecurse nounwind optnone ssp
define i32 @main() #0 !dbg !9 {
%1 = alloca i32, align 4
store i32 0, ptr %1, align 4
ret i32 1, !dbg !14
}

attributes #0 = { noinline norecurse nounwind optnone ssp }

!llvm.module.flags = !{!0, !1, !2, !3, !4, !5}
!llvm.dbg.cu = !{!6}
!llvm.ident = !{!8}

!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 14, i32 0]}
!1 = !{i32 7, !"Dwarf Version", i32 4}
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !{i32 1, !"wchar_size", i32 4}
!4 = !{i32 8, !"PIC Level", i32 2}
!5 = !{i32 7, !"frame-pointer", i32 1}
!6 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !7, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None, sysroot: "/Applications/Xcode.app", sdk: "MacOSX.sdk")
!7 = !DIFile(filename: "test.cpp", directory: "/Users/shubham/Development")
!8 = !{!"clang"}
!9 = distinct !DISubprogram(name: "main", scope: !7, file: !7, line: 1, type: !10, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !6, retainedNodes: !13)
!10 = !DISubroutineType(types: !11)
!11 = !{!12}
!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!13 = !{}
!14 = !DILocation(line: 2, column: 5, scope: !9)
42 changes: 42 additions & 0 deletions llvm/test/DebugInfo/X86/test-fexceptions-debug-frame.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
; This test is added to provide test coverage for the
; .cfi_sections .debug_frame intrinsic. It aims to make sure that for an X86_64
; output compiled with -fexceptions, no .cfi_sections .debug_frame is emitted.

; RUN: llc --filetype=asm %s -o - | FileCheck %s
; CHECK-NOT: .cfi_sections .debug_frame
; CHECK: .cfi_startproc

; ModuleID = 'test.cpp'
source_filename = "test.cpp"
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx13.0.0"

; Function Attrs: noinline norecurse nounwind optnone ssp uwtable
define i32 @main() #0 !dbg !10 {
%1 = alloca i32, align 4
store i32 0, ptr %1, align 4
ret i32 1, !dbg !15
}

attributes #0 = { noinline norecurse nounwind optnone ssp uwtable }

!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6}
!llvm.dbg.cu = !{!7}
!llvm.ident = !{!9}

!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 14, i32 0]}
!1 = !{i32 7, !"Dwarf Version", i32 4}
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !{i32 1, !"wchar_size", i32 4}
!4 = !{i32 8, !"PIC Level", i32 2}
!5 = !{i32 7, !"uwtable", i32 2}
!6 = !{i32 7, !"frame-pointer", i32 2}
!7 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !8, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None, sysroot: "/Applications/Xcode.app", sdk: "MacOSX.sdk")
!8 = !DIFile(filename: "test.cpp", directory: "/Users/shubham/Development")
!9 = !{!"clang"}
!10 = distinct !DISubprogram(name: "main", scope: !8, file: !8, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !7, retainedNodes: !14)
!11 = !DISubroutineType(types: !12)
!12 = !{!13}
!13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!14 = !{}
!15 = !DILocation(line: 2, column: 5, scope: !10)
43 changes: 43 additions & 0 deletions llvm/test/DebugInfo/X86/test-fno-exceptions-debug-frame.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
; This test is added to provide test coverage for the
; .cfi_sections .debug_frame intrinsic. It aims to make sure that for an X86_64
; output compiled with -fno-exceptions, no .cfi_sections .debug_frame is
; emitted.

; RUN: llc --filetype=asm %s -o - | FileCheck %s
; CHECK-NOT: .cfi_sections .debug_frame
; CHECK: .cfi_startproc

; ModuleID = 'test.cpp'
source_filename = "test.cpp"
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx13.0.0"

; Function Attrs: noinline norecurse nounwind optnone ssp uwtable
define i32 @main() #0 !dbg !10 {
%1 = alloca i32, align 4
store i32 0, ptr %1, align 4
ret i32 1, !dbg !15
}

attributes #0 = { noinline norecurse nounwind optnone ssp uwtable }

!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6}
!llvm.dbg.cu = !{!7}
!llvm.ident = !{!9}

!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 14, i32 0]}
!1 = !{i32 7, !"Dwarf Version", i32 4}
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !{i32 1, !"wchar_size", i32 4}
!4 = !{i32 8, !"PIC Level", i32 2}
!5 = !{i32 7, !"uwtable", i32 2}
!6 = !{i32 7, !"frame-pointer", i32 2}
!7 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !8, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None, sysroot: "/Applications/Xcode.app", sdk: "MacOSX.sdk")
!8 = !DIFile(filename: "test.cpp", directory: "/Users/shubham/Development")
!9 = !{!"clang"}
!10 = distinct !DISubprogram(name: "main", scope: !8, file: !8, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !7, retainedNodes: !14)
!11 = !DISubroutineType(types: !12)
!12 = !{!13}
!13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!14 = !{}
!15 = !DILocation(line: 2, column: 5, scope: !10)

0 comments on commit fe8eab4

Please sign in to comment.