diff options
author | Adrian Prantl <aprantl@apple.com> | 2017-04-26 22:56:44 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2017-04-26 22:56:44 +0000 |
commit | 1d12b885b09a92d268356292c2829a2a6b4aca1d (patch) | |
tree | 0760cd6360c18db743eec53ff0ae6d3c0739796d /llvm/test | |
parent | 330e52b0187c6700d3761f4f704c44fc3c785acb (diff) | |
download | bcm5719-llvm-1d12b885b09a92d268356292c2829a2a6b4aca1d.tar.gz bcm5719-llvm-1d12b885b09a92d268356292c2829a2a6b4aca1d.zip |
Add support for DW_TAG_thrown_type.
For Swift we would like to be able to encode the error types that a
function may throw, so the debugger can display them alongside the
function's return value when finish-ing a function.
DWARF defines DW_TAG_thrown_type (intended to be used for C++ throw()
declarations) that is a perfect fit for this purpose. This patch wires
up support for DW_TAG_thrown_type in LLVM by adding a list of thrown
types to DISubprogram.
To offset the cost of the extra pointer, there is a follow-up patch
that turns DISubprogram into a variable-length node.
rdar://problem/29481673
Differential Revision: https://reviews.llvm.org/D32559
llvm-svn: 301489
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/Assembler/disubprogram.ll | 16 | ||||
-rw-r--r-- | llvm/test/DebugInfo/Generic/thrownTypes.ll | 38 | ||||
-rw-r--r-- | llvm/test/Verifier/DISubprogram.ll | 22 |
3 files changed, 72 insertions, 4 deletions
diff --git a/llvm/test/Assembler/disubprogram.ll b/llvm/test/Assembler/disubprogram.ll index f6352a5e82c..8a3a60aa079 100644 --- a/llvm/test/Assembler/disubprogram.ll +++ b/llvm/test/Assembler/disubprogram.ll @@ -6,8 +6,8 @@ define void @_Z3foov() !dbg !9 { ret void } -; CHECK: !named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12} -!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12} +; CHECK: !named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14} +!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14} !0 = !{null} !1 = distinct !DICompositeType(tag: DW_TAG_structure_type) @@ -61,6 +61,14 @@ define void @_Z3foov() !dbg !9 { unit: !8, templateParams: !5, declaration: !9, variables: !6) -!13 = !{i32 1, !"Debug Info Version", i32 3} -!llvm.module.flags = !{!13} +!13 = !{!4} +; CHECK: !13 = !{!4} +; CHECK: !14 = distinct !DISubprogram(name: "foo", scope: !1, file: !2, line: 1, type: !3, isLocal: true, isDefinition: true, scopeLine: 2, isOptimized: false, unit: !8, thrownTypes: !13) +!14 = distinct !DISubprogram(name: "foo", scope: !1, + file: !2, line: 1, type: !3, isLocal: true, + isDefinition: true, scopeLine: 2, isOptimized: false, + unit: !8, thrownTypes: !13) + +!15 = !{i32 1, !"Debug Info Version", i32 3} +!llvm.module.flags = !{!15} !llvm.dbg.cu = !{!8} diff --git a/llvm/test/DebugInfo/Generic/thrownTypes.ll b/llvm/test/DebugInfo/Generic/thrownTypes.ll new file mode 100644 index 00000000000..8e84e7bf2bf --- /dev/null +++ b/llvm/test/DebugInfo/Generic/thrownTypes.ll @@ -0,0 +1,38 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_name {{.*}} "f" +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_thrown_type +; CHECK-NEXT: DW_AT_type {{.*}} {[[ERROR:.*]]} +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_thrown_type +; CHECK-NEXT: DW_AT_type {{.*}} {[[ERROR2:.*]]} +; CHECK: [[ERROR]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}} "Error" +; CHECK: [[ERROR2]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}} "DifferentError" + +; Function Attrs: nounwind uwtable +define void @f() #0 !dbg !5 { +entry: + ret void, !dbg !11 +} + +attributes #0 = { nounwind uwtable } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} + +!0 = distinct !DICompileUnit(language: DW_LANG_Swift, producer: "swiftc", isOptimized: false, emissionKind: FullDebug, file: !1) +!1 = !DIFile(filename: "f.swift", directory: "/") +!3 = !DICompositeType(tag: DW_TAG_structure_type, name: "Error") +!4 = !DICompositeType(tag: DW_TAG_structure_type, name: "DifferentError") +!5 = distinct !DISubprogram(name: "f", line: 2, isLocal: false, isDefinition: true, unit: !0, scopeLine: 2, file: !1, scope: !1, type: !6, thrownTypes: !{!3, !4}) +!6 = !DISubroutineType(types: !7) +!7 = !{null} +!8 = !{i32 2, !"Dwarf Version", i32 4} +!9 = !{i32 1, !"Debug Info Version", i32 3} +!11 = !DILocation(line: 3, scope: !5) diff --git a/llvm/test/Verifier/DISubprogram.ll b/llvm/test/Verifier/DISubprogram.ll new file mode 100644 index 00000000000..e78220c8bd7 --- /dev/null +++ b/llvm/test/Verifier/DISubprogram.ll @@ -0,0 +1,22 @@ +; RUN: not opt -S <%s 2>&1| FileCheck %s + +define void @f() !dbg !14 { + ret void +} + +!0 = !{null} +!1 = distinct !DICompositeType(tag: DW_TAG_structure_type) +!2 = !DIFile(filename: "path/to/file", directory: "/path/to/dir") +!3 = !DISubroutineType(types: !0) +!4 = distinct !DICompositeType(tag: DW_TAG_structure_type) +!8 = distinct !DICompileUnit(language: DW_LANG_Swift, producer: "clang", + file: !2, emissionKind: 2) +; CHECK: invalid thrown type +!13 = !{!14} +!14 = distinct !DISubprogram(name: "f", scope: !1, + file: !2, line: 1, type: !3, isLocal: true, + isDefinition: true, scopeLine: 2, + unit: !8, thrownTypes: !13) +!15 = !{i32 1, !"Debug Info Version", i32 3} +!llvm.module.flags = !{!15} +!llvm.dbg.cu = !{!8} |