[llvm] r335861 - [DEBUG_INFO, NVPTX] Add test for .debug_loc section, NFC.

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 2 15:10:08 PDT 2018


Your second statement is not quite correct, especially for tests for opt tool. If you check, there is a special python script that is recommended to be used when writing the tests for optimization passes. This script produces full output for the transformed IR code and emits checks for all lines if code.
There are only 5 tests for NVPTX target, for me it takes up to 30 minutes to update them. I don't expect much more tests to be added, maybe, maybe 1 or 2 more, but most probably not.

Best regards,
Alexey Bataev

2 июля 2018 г., в 17:54, David Blaikie <dblaikie at gmail.com<mailto:dblaikie at gmail.com>> написал(а):



On Mon, Jul 2, 2018 at 2:46 PM Alexey Bataev <a.bataev at hotmail.com<mailto:a.bataev at hotmail.com>> wrote:
1.  David, I rather doubt that a lot of features can be added, that can be supported by the NVPTX.

It's not uncommon to add/remove attributes, or reorder attributes in LLVM's debug info output and tests like this break even when they don't need to due to benign changes.

Adding an extra attribute about, say, the linkage of a function, or an extra string (like changing the logic around when the linkage name is provided in addition to the user-visible name) is likely not relevant to this test, I would think.

It is very simple, does not allow many complex features and it can almost cannot be extended. I would make these tests even more strict, using CHECK-NEXT directive. The list of supported features is very limited and, most probably,  the new one will be incompatible. The small number of compatible features won't require much time to update these tests.
2. What if somebody will add some unexpected feature, which is allowed by the relaxed test checks? It will lead to the problems with the final product. Strict tests work better and won't allow to miss the bug.

The same is true of most/every test in LLVM - it's certainly possible that an optimization pass could arbitrarily add another function to its output, or a few extra instructions in a completely unexpected way - but the chance of that happening accidentally & the value the test provides in validating that (& thus if it becomes overly sensitive to benign changes to unrelated instructions - like LLVM tests that hardcode register numbers/names) is generally considered not a worthwhile tradeoff, so we trade missing some bugs (true positives)  for increased developer velocity by avoiding some burdensome test maintenance due to false positive results from tests.


Best regards,
Alexey Bataev

2 июля 2018 г., в 17:29, David Blaikie <dblaikie at gmail.com<mailto:dblaikie at gmail.com>> написал(а):

That still seems a bit too over-constrained. There are reasonable and specific constraints that NVPTX output has & that require specific support (no labels, no strp, etc) that could be tested for probably with FileCheck's --implicit-not (I think that's what it's called), but testing /every/ attribute specifically seems too much to me. There are many harmless changes that could happen that would require updating this test even though nothing broke NVPTX. It'd be really good to adjust the test to reduce the number of instances of that sort of thing by testing for the specific features that are desired (or disallowed).

- Dave

On Mon, Jul 2, 2018 at 1:51 PM Alexey Bataev <a.bataev at hotmail.com<mailto:a.bataev at hotmail.com>> wrote:
That's the main intention. If somebody adds something to the debug info, it may break debug info for NVPTX. These tests will allow to understand that somebody is trying to break it because, generally speaking, these tests should not be changed. Most probably, feature that causes the changes in the NVPTX debug info will break it.

Best regards,
Alexey Bataev

2 июля 2018 г., в 16:25, David Blaikie <dblaikie at gmail.com<mailto:dblaikie at gmail.com>> написал(а):

OK.

1) Emission of the debug sections.
When you say you want to test that, what properties do you want to test? That each section is present? Testing for ".section .debug_foo/bar/etc" should suffice there? (though, again, some of that behavior is already tested by other debug info tests - may be doesn't need to be retested for NVPTX?)

2) Emission of the labels
Maybe some CHECK-NOT style tests for that?

3) Emission of the strings (as in can't use strp?)
Maybe a CHECK-NOT for strp & check one example string uses FORM_string?

4) No other debug data
Some CHECK-NOT for ".section .debug_", perhaps?

Testing every line of the debug section output makes the test rather brittle to any changes in debug info representation (eg: maybe new attributes are added, or existing ones removed, different forms, etc) - generally best to avoid tests that are so specific because they create a maintenance burden.

 - Dave

On Mon, Jul 2, 2018 at 11:36 AM Alexey Bataev <a.bataev at outlook.com<mailto:a.bataev at outlook.com>> wrote:

I'm checking for the different things:
1. Emission of the debug sections.
2. Emission of the labels (lables are not allowed, all references must be emitted as section+offset).
3. Eission of the strings (must be emitted as the bytes sequence)
4. No other debug data (unsupported sections, labels inside sections, unsupported expressions) are emitted in the debug info for NVPTX target
-------------
Best regards,
Alexey Bataev

02.07.2018 14:24, David Blaikie пишет:
OK, so the assembly has to be tested because there's no way to get an object file to dwarfdump during LLVM testing (due to the lack of ptxas)

But is it possible to test something less than every line of the assembly output? What features are you interested in checking for (assuming that LLVM's dwarf output is already fairly well tested)?

On Mon, Jul 2, 2018 at 11:00 AM Alexey Bataev <a.bataev at outlook.com<mailto:a.bataev at outlook.com>> wrote:

The main roblem with the debug info for NVPTX is that it has its own limitations and we need to be sure that we emit the debug info that can be processed by the ptxas tool. I don't know how to check that the debug info is correct without actual checks of the debug info in the original form.
-------------
Best regards,
Alexey Bataev

02.07.2018 13:53, Alexey Bataev пишет:

I checked one more time and seems to me I won't be able to rework these tests to use llvm_dwarfdump even after full suport of the debug info. The problem is that ддс is unable to generate an object file for NVPTX target, it requires an external tool called ptxas which is part of the cuda toolchain.
-------------
Best regards,
Alexey Bataev

02.07.2018 13:20, David Blaikie пишет:
Would it make sense to have a default-off/experimental flag to enable this to be actual code generation rather than comments & use that flag for testing?

& I'm still not sure, even if it can't be done as anything other than comments right now, whether a full golden-file style test for every piece of the output is the best choice here (since a lot of the debug info output is already well tested elsewhere - it seems like this extra testing here would make this test brittle - when it could use FileCheck more sparsely to test only particular features that are relevant to this test/to the NVIDIA-specific handling/defaults?)?

On Mon, Jul 2, 2018 at 9:59 AM Alexey Bataev <a.bataev at outlook.com<mailto:a.bataev at outlook.com>> wrote:

Currently, debug info for NVPTX is disabled. It is emitted, but commented out in the PTX file. I can try to generate the object file, but it will generated without the debug info.

It tests, that debug info for the NVPTX target is correct, there are no any extra lables in the output, that may break the compilation of the resulting PTX file and we do not miss anything in the output (emission of not supported sections, data etc., which, again, can break the resulting PTX file). Unless the debug info is uncommented and , thus, enabled, I can't update these tests to use llvm-darfdump.

-------------
Best regards,
Alexey Bataev

02.07.2018 12:47, David Blaikie пишет:
What is it that prevents these being able to be dumped with llvm-dwarfdump?

In any case - what's this test testing for? Even without dwarfdump, could it be more specialized/narrowed down so it isn't so constrained (looks more like a golden file test at this point, which are prone to break due to unrelated changes, etc)?

On Mon, Jul 2, 2018 at 9:43 AM Alexey Bataev <a.bataev at outlook.com<mailto:a.bataev at outlook.com>> wrote:

Hi David, unfortunately not, at least at this moment. Later, when we'll have full support of debug info for NVPTX target I would be able to rework these tests to use  llvm-dwarfdump tool

-------------
Best regards,
Alexey Bataev

02.07.2018 12:36, David Blaikie пишет:
Testing all that raw assembly output seems like that might make this test overly sensitive to other changes?

Could this test use llvm-dwarfdump like other DWARF tests? & only test the particularly relevant parts (what is it that needs to be tested in debug_loc?)

On Thu, Jun 28, 2018 at 8:19 AM Alexey Bataev via llvm-commits <llvm-commits at lists.llvm.org<mailto:llvm-commits at lists.llvm.org>> wrote:
Author: abataev
Date: Thu Jun 28 08:14:58 2018
New Revision: 335861

URL: http://llvm.org/viewvc/llvm-project?rev=335861&view=rev
Log:
[DEBUG_INFO, NVPTX] Add test for .debug_loc section, NFC.

Added:
    llvm/trunk/test/DebugInfo/NVPTX/debug-loc-offset.ll

Added: llvm/trunk/test/DebugInfo/NVPTX/debug-loc-offset.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/NVPTX/debug-loc-offset.ll?rev=335861&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/NVPTX/debug-loc-offset.ll (added)
+++ llvm/trunk/test/DebugInfo/NVPTX/debug-loc-offset.ll Thu Jun 28 08:14:58 2018
@@ -0,0 +1,506 @@
+; RUN: llc -mtriple=nvptx64-nvidia-cuda < %s | FileCheck %s
+
+; CHECK: .target sm_{{[0-9]+}}//, debug
+
+; CHECK: .extern .func  (.param .b32 func_retval0) _ZN1A3fooEv
+; CHECK: (
+; CHECK: .param .b64 _ZN1A3fooEv_param_0
+; CHECK: )
+
+%struct.A = type { i32 (...)**, i32 }
+
+; CHECK: .visible .func  (.param .b32 func_retval0) _Z3bari(
+; CHECK: {
+; CHECK: Lfunc_begin0:
+; CHECK: .loc [[CU1:[0-9]+]] 1 0
+
+; CHECK: //DEBUG_VALUE: bar:b <- {{[0-9]+}}
+; CHECK: //DEBUG_VALUE: bar:b <- {{[0-9]+}}
+; CHECK: .loc [[CU1]] 2 0
+; CHECK: ret;
+; CHECK: }
+
+; Function Attrs: nounwind
+define i32 @_Z3bari(i32 %b) #0 !dbg !4 {
+entry:
+  %b.addr = alloca i32, align 4
+  store i32 %b, i32* %b.addr, align 4
+  call void @llvm.dbg.value(metadata i32 0, metadata !21, metadata !DIExpression()), !dbg !22
+  %0 = load i32, i32* %b.addr, align 4, !dbg !23
+  call void @llvm.dbg.value(metadata i32 1, metadata !21, metadata !DIExpression()), !dbg !22
+  %add = add nsw i32 %0, 4, !dbg !23
+  ret i32 %add, !dbg !23
+}
+
+; Function Attrs: nounwind readnone
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
+
+declare void @llvm.dbg.value(metadata, metadata, metadata) #1
+
+; CHECK: .visible .func _Z3baz1A(
+; CHECK: {
+; CHECK: Lfunc_begin1:
+; CHECK: .loc [[CU2:[0-9]+]] 6 0
+; CHECK: //DEBUG_VALUE: baz:z <- {{[0-9]+}}
+; CHECK: //DEBUG_VALUE: baz:z <- {{[0-9]+}}
+; CHECK: .loc [[CU2]] 10 0
+; CHECK: ret;
+; CHECK: }
+
+define void @_Z3baz1A(%struct.A* %a) #2 !dbg !14 {
+entry:
+  %z = alloca i32, align 4
+  call void @llvm.dbg.declare(metadata %struct.A* %a, metadata !24, metadata !DIExpression(DW_OP_deref)), !dbg !25
+  call void @llvm.dbg.declare(metadata i32* %z, metadata !26, metadata !DIExpression()), !dbg !27
+  store i32 2, i32* %z, align 4, !dbg !27
+  %var = getelementptr inbounds %struct.A, %struct.A* %a, i32 0, i32 1, !dbg !28
+  %0 = load i32, i32* %var, align 4, !dbg !28
+  %cmp = icmp sgt i32 %0, 2, !dbg !28
+  br i1 %cmp, label %if.then, label %if.end, !dbg !28
+
+if.then:                                          ; preds = %entry
+  %1 = load i32, i32* %z, align 4, !dbg !30
+  %inc = add nsw i32 %1, 1, !dbg !30
+  store i32 %inc, i32* %z, align 4, !dbg !30
+  br label %if.end, !dbg !30
+
+if.end:                                           ; preds = %if.then, %entry
+  %call = call signext i8 @_ZN1A3fooEv(%struct.A* %a), !dbg !31
+  %conv = sext i8 %call to i32, !dbg !31
+  %cmp1 = icmp eq i32 %conv, 97, !dbg !31
+  br i1 %cmp1, label %if.then2, label %if.end4, !dbg !31
+
+if.then2:                                         ; preds = %if.end
+  %2 = load i32, i32* %z, align 4, !dbg !33
+  %inc3 = add nsw i32 %2, 1, !dbg !33
+  store i32 %inc3, i32* %z, align 4, !dbg !33
+  br label %if.end4, !dbg !33
+
+if.end4:                                          ; preds = %if.then2, %if.end
+  ret void, !dbg !34
+}
+
+; CHECK-DAG: .file [[CU1]] "/llvm_cmake_gcc{{/|\\\\}}debug-loc-offset1.cc<http://debug-loc-offset1.cc>"
+; CHECK-DAG: .file [[CU2]] "/llvm_cmake_gcc{{/|\\\\}}debug-loc-offset2.cc<http://debug-loc-offset2.cc>"
+
+declare signext i8 @_ZN1A3fooEv(%struct.A*) #2
+
+attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind readnone }
+attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu<http://llvm.dbg.cu> = !{!0, !9}
+!llvm.module.flags = !{!18, !19}
+!llvm.ident = !{!20, !20}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 (210479)", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
+!1 = !DIFile(filename: "debug-loc-offset1.cc<http://debug-loc-offset1.cc>", directory: "/llvm_cmake_gcc")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "bar", linkageName: "_Z3bari", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 1, file: !1, scope: !5, type: !6, retainedNodes: !2)
+!5 = !DIFile(filename: "debug-loc-offset1.cc<http://debug-loc-offset1.cc>", directory: "/llvm_cmake_gcc")
+!6 = !DISubroutineType(types: !7)
+!7 = !{!8, !8}
+!8 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!9 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 (210479)", isOptimized: false, emissionKind: FullDebug, file: !10, enums: !2, retainedTypes: !11, globals: !2, imports: !2)
+!10 = !DIFile(filename: "debug-loc-offset2.cc<http://debug-loc-offset2.cc>", directory: "/llvm_cmake_gcc")
+!11 = !{!12}
+!12 = !DICompositeType(tag: DW_TAG_structure_type, name: "A", line: 1, flags: DIFlagFwdDecl, file: !10, identifier: "_ZTS1A")
+!14 = distinct !DISubprogram(name: "baz", linkageName: "_Z3baz1A", line: 6, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !9, scopeLine: 6, file: !10, scope: !15, type: !16, retainedNodes: !2)
+!15 = !DIFile(filename: "debug-loc-offset2.cc<http://debug-loc-offset2.cc>", directory: "/llvm_cmake_gcc")
+!16 = !DISubroutineType(types: !17)
+!17 = !{null, !12}
+!18 = !{i32 2, !"Dwarf Version", i32 4}
+!19 = !{i32 2, !"Debug Info Version", i32 3}
+!20 = !{!"clang version 3.5.0 (210479)"}
+!21 = !DILocalVariable(name: "b", line: 1, arg: 1, scope: !4, file: !5, type: !8)
+!22 = !DILocation(line: 1, scope: !4)
+!23 = !DILocation(line: 2, scope: !4)
+!24 = !DILocalVariable(name: "a", line: 6, arg: 1, scope: !14, file: !15, type: !12)
+!25 = !DILocation(line: 6, scope: !14)
+!26 = !DILocalVariable(name: "z", line: 7, scope: !14, file: !15, type: !8)
+!27 = !DILocation(line: 7, scope: !14)
+!28 = !DILocation(line: 8, scope: !29)
+!29 = distinct !DILexicalBlock(line: 8, column: 0, file: !10, scope: !14)
+!30 = !DILocation(line: 9, scope: !29)
+!31 = !DILocation(line: 10, scope: !32)
+!32 = distinct !DILexicalBlock(line: 10, column: 0, file: !10, scope: !14)
+!33 = !DILocation(line: 11, scope: !32)
+!34 = !DILocation(line: 12, scope: !14)
+
+
+; CHECK: // .section .debug_loc
+; CHECK: // {
+; CHECK: Ldebug_loc0:
+; CHECK: // .b64 Lfunc_begin0-Lfunc_begin0
+; CHECK: // .b64 Ltmp0-Lfunc_begin0
+; CHECK: // .b8 2                                // Loc expr size
+; CHECK: // .b8 0
+; CHECK: // .b8 17                               // DW_OP_consts
+; CHECK: // .b8 0                                // 0
+; CHECK: // .b64 Ltmp0-Lfunc_begin0
+; CHECK: // .b64 Lfunc_end0-Lfunc_begin0
+; CHECK: // .b8 2                                // Loc expr size
+; CHECK: // .b8 0
+; CHECK: // .b8 17                               // DW_OP_consts
+; CHECK: // .b8 1                                // 1
+; CHECK: // .b64 0
+; CHECK: // .b64 0
+; CHECK: Ldebug_loc1:
+; CHECK: // .b64 Ltmp2-Lfunc_begin1
+; CHECK: // .b64 Ltmp2-Lfunc_begin1
+; CHECK: // .b8 2                                // Loc expr size
+; CHECK: // .b8 0
+; CHECK: // .b8 17                               // DW_OP_consts
+; CHECK: // .b8 2                                // 2
+; CHECK: // .b64 Ltmp2-Lfunc_begin1
+; CHECK: // .b64 Lfunc_end1-Lfunc_begin1
+; CHECK: // .b8 2                                // Loc expr size
+; CHECK: // .b8 0
+; CHECK: // .b8 17                               // DW_OP_consts
+; CHECK: // .b8 3                                // 3
+; CHECK: // .b64 0
+; CHECK: // .b64 0
+; CHECK: // }
+; CHECK: // .section .debug_abbrev
+; CHECK: // {
+; CHECK: // .b8 1                                // Abbreviation Code
+; CHECK: // .b8 17                               // DW_TAG_compile_unit
+; CHECK: // .b8 1                                // DW_CHILDREN_yes
+; CHECK: // .b8 37                               // DW_AT_producer
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 19                               // DW_AT_language
+; CHECK: // .b8 5                                // DW_FORM_data2
+; CHECK: // .b8 3                                // DW_AT_name
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 16                               // DW_AT_stmt_list
+; CHECK: // .b8 6                                // DW_FORM_data4
+; CHECK: // .b8 27                               // DW_AT_comp_dir
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 17                               // DW_AT_low_pc
+; CHECK: // .b8 1                                // DW_FORM_addr
+; CHECK: // .b8 18                               // DW_AT_high_pc
+; CHECK: // .b8 1                                // DW_FORM_addr
+; CHECK: // .b8 0                                // EOM(1)
+; CHECK: // .b8 0                                // EOM(2)
+; CHECK: // .b8 2                                // Abbreviation Code
+; CHECK: // .b8 19                               // DW_TAG_structure_type
+; CHECK: // .b8 0                                // DW_CHILDREN_no
+; CHECK: // .b8 3                                // DW_AT_name
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 60                               // DW_AT_declaration
+; CHECK: // .b8 12                               // DW_FORM_flag
+; CHECK: // .b8 0                                // EOM(1)
+; CHECK: // .b8 0                                // EOM(2)
+; CHECK: // .b8 3                                // Abbreviation Code
+; CHECK: // .b8 46                               // DW_TAG_subprogram
+; CHECK: // .b8 1                                // DW_CHILDREN_yes
+; CHECK: // .b8 17                               // DW_AT_low_pc
+; CHECK: // .b8 1                                // DW_FORM_addr
+; CHECK: // .b8 18                               // DW_AT_high_pc
+; CHECK: // .b8 1                                // DW_FORM_addr
+; CHECK: // .b8 135                              // DW_AT_MIPS_linkage_name
+; CHECK: // .b8 64
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 3                                // DW_AT_name
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 58                               // DW_AT_decl_file
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 59                               // DW_AT_decl_line
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 63                               // DW_AT_external
+; CHECK: // .b8 12                               // DW_FORM_flag
+; CHECK: // .b8 0                                // EOM(1)
+; CHECK: // .b8 0                                // EOM(2)
+; CHECK: // .b8 4                                // Abbreviation Code
+; CHECK: // .b8 52                               // DW_TAG_variable
+; CHECK: // .b8 0                                // DW_CHILDREN_no
+; CHECK: // .b8 2                                // DW_AT_location
+; CHECK: // .b8 6                                // DW_FORM_data4
+; CHECK: // .b8 3                                // DW_AT_name
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 58                               // DW_AT_decl_file
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 59                               // DW_AT_decl_line
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 73                               // DW_AT_type
+; CHECK: // .b8 16                               // DW_FORM_ref_addr
+; CHECK: // .b8 0                                // EOM(1)
+; CHECK: // .b8 0                                // EOM(2)
+; CHECK: // .b8 5                                // Abbreviation Code
+; CHECK: // .b8 46                               // DW_TAG_subprogram
+; CHECK: // .b8 1                                // DW_CHILDREN_yes
+; CHECK: // .b8 17                               // DW_AT_low_pc
+; CHECK: // .b8 1                                // DW_FORM_addr
+; CHECK: // .b8 18                               // DW_AT_high_pc
+; CHECK: // .b8 1                                // DW_FORM_addr
+; CHECK: // .b8 135                              // DW_AT_MIPS_linkage_name
+; CHECK: // .b8 64
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 3                                // DW_AT_name
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 58                               // DW_AT_decl_file
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 59                               // DW_AT_decl_line
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 73                               // DW_AT_type
+; CHECK: // .b8 19                               // DW_FORM_ref4
+; CHECK: // .b8 63                               // DW_AT_external
+; CHECK: // .b8 12                               // DW_FORM_flag
+; CHECK: // .b8 0                                // EOM(1)
+; CHECK: // .b8 0                                // EOM(2)
+; CHECK: // .b8 6                                // Abbreviation Code
+; CHECK: // .b8 5                                // DW_TAG_formal_parameter
+; CHECK: // .b8 0                                // DW_CHILDREN_no
+; CHECK: // .b8 2                                // DW_AT_location
+; CHECK: // .b8 6                                // DW_FORM_data4
+; CHECK: // .b8 3                                // DW_AT_name
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 58                               // DW_AT_decl_file
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 59                               // DW_AT_decl_line
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 73                               // DW_AT_type
+; CHECK: // .b8 19                               // DW_FORM_ref4
+; CHECK: // .b8 0                                // EOM(1)
+; CHECK: // .b8 0                                // EOM(2)
+; CHECK: // .b8 7                                // Abbreviation Code
+; CHECK: // .b8 36                               // DW_TAG_base_type
+; CHECK: // .b8 0                                // DW_CHILDREN_no
+; CHECK: // .b8 3                                // DW_AT_name
+; CHECK: // .b8 8                                // DW_FORM_string
+; CHECK: // .b8 62                               // DW_AT_encoding
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 11                               // DW_AT_byte_size
+; CHECK: // .b8 11                               // DW_FORM_data1
+; CHECK: // .b8 0                                // EOM(1)
+; CHECK: // .b8 0                                // EOM(2)
+; CHECK: // .b8 0                                // EOM(3)
+; CHECK: // }
+; CHECK: // .section .debug_info
+; CHECK: // {
+; CHECK: // .b32 152                             // Length of Unit
+; CHECK: // .b8 2                                // DWARF version number
+; CHECK: // .b8 0
+; CHECK: // .b32 .debug_abbrev                   // Offset Into Abbrev. Section
+; CHECK: // .b8 8                                // Address Size (in bytes)
+; CHECK: // .b8 1                                // Abbrev [1] 0xb:0x91 DW_TAG_compile_unit
+; CHECK: // .b8 99                               // DW_AT_producer
+; CHECK: // .b8 108
+; CHECK: // .b8 97
+; CHECK: // .b8 110
+; CHECK: // .b8 103
+; CHECK: // .b8 32
+; CHECK: // .b8 118
+; CHECK: // .b8 101
+; CHECK: // .b8 114
+; CHECK: // .b8 115
+; CHECK: // .b8 105
+; CHECK: // .b8 111
+; CHECK: // .b8 110
+; CHECK: // .b8 32
+; CHECK: // .b8 51
+; CHECK: // .b8 46
+; CHECK: // .b8 53
+; CHECK: // .b8 46
+; CHECK: // .b8 48
+; CHECK: // .b8 32
+; CHECK: // .b8 40
+; CHECK: // .b8 50
+; CHECK: // .b8 49
+; CHECK: // .b8 48
+; CHECK: // .b8 52
+; CHECK: // .b8 55
+; CHECK: // .b8 57
+; CHECK: // .b8 41
+; CHECK: // .b8 0
+; CHECK: // .b8 4                                // DW_AT_language
+; CHECK: // .b8 0
+; CHECK: // .b8 100                              // DW_AT_name
+; CHECK: // .b8 101
+; CHECK: // .b8 98
+; CHECK: // .b8 117
+; CHECK: // .b8 103
+; CHECK: // .b8 45
+; CHECK: // .b8 108
+; CHECK: // .b8 111
+; CHECK: // .b8 99
+; CHECK: // .b8 45
+; CHECK: // .b8 111
+; CHECK: // .b8 102
+; CHECK: // .b8 102
+; CHECK: // .b8 115
+; CHECK: // .b8 101
+; CHECK: // .b8 116
+; CHECK: // .b8 50
+; CHECK: // .b8 46
+; CHECK: // .b8 99
+; CHECK: // .b8 99
+; CHECK: // .b8 0
+; CHECK: // .b32 .debug_line                     // DW_AT_stmt_list
+; CHECK: // .b8 47                               // DW_AT_comp_dir
+; CHECK: // .b8 108
+; CHECK: // .b8 108
+; CHECK: // .b8 118
+; CHECK: // .b8 109
+; CHECK: // .b8 95
+; CHECK: // .b8 99
+; CHECK: // .b8 109
+; CHECK: // .b8 97
+; CHECK: // .b8 107
+; CHECK: // .b8 101
+; CHECK: // .b8 95
+; CHECK: // .b8 103
+; CHECK: // .b8 99
+; CHECK: // .b8 99
+; CHECK: // .b8 0
+; CHECK: // .b64 Lfunc_begin1                    // DW_AT_low_pc
+; CHECK: // .b64 Lfunc_end1                      // DW_AT_high_pc
+; CHECK: // .b8 2                                // Abbrev [2] 0x64:0x4 DW_TAG_structure_type
+; CHECK: // .b8 65                               // DW_AT_name
+; CHECK: // .b8 0
+; CHECK: // .b8 1                                // DW_AT_declaration
+; CHECK: // .b8 3                                // Abbrev [3] 0x68:0x33 DW_TAG_subprogram
+; CHECK: // .b64 Lfunc_begin1                    // DW_AT_low_pc
+; CHECK: // .b64 Lfunc_end1                      // DW_AT_high_pc
+; CHECK: // .b8 95                               // DW_AT_MIPS_linkage_name
+; CHECK: // .b8 90
+; CHECK: // .b8 51
+; CHECK: // .b8 98
+; CHECK: // .b8 97
+; CHECK: // .b8 122
+; CHECK: // .b8 49
+; CHECK: // .b8 65
+; CHECK: // .b8 0
+; CHECK: // .b8 98                               // DW_AT_name
+; CHECK: // .b8 97
+; CHECK: // .b8 122
+; CHECK: // .b8 0
+; CHECK: // .b8 2                                // DW_AT_decl_file
+; CHECK: // .b8 6                                // DW_AT_decl_line
+; CHECK: // .b8 1                                // DW_AT_external
+; CHECK: // .b8 4                                // Abbrev [4] 0x89:0x11 DW_TAG_variable
+; CHECK: // .b32 Ldebug_loc1                     // DW_AT_location
+; CHECK: // .b8 122                              // DW_AT_name
+; CHECK: // .b8 0
+; CHECK: // .b8 2                                // DW_AT_decl_file
+; CHECK: // .b8 7                                // DW_AT_decl_line
+; CHECK: // .b64 .debug_info+306                 // DW_AT_type
+; CHECK: // .b8 0                                // End Of Children Mark
+; CHECK: // .b8 0                                // End Of Children Mark
+; CHECK: // .b32 154                             // Length of Unit
+; CHECK: // .b8 2                                // DWARF version number
+; CHECK: // .b8 0
+; CHECK: // .b32 .debug_abbrev                   // Offset Into Abbrev. Section
+; CHECK: // .b8 8                                // Address Size (in bytes)
+; CHECK: // .b8 1                                // Abbrev [1] 0xb:0x93 DW_TAG_compile_unit
+; CHECK: // .b8 99                               // DW_AT_producer
+; CHECK: // .b8 108
+; CHECK: // .b8 97
+; CHECK: // .b8 110
+; CHECK: // .b8 103
+; CHECK: // .b8 32
+; CHECK: // .b8 118
+; CHECK: // .b8 101
+; CHECK: // .b8 114
+; CHECK: // .b8 115
+; CHECK: // .b8 105
+; CHECK: // .b8 111
+; CHECK: // .b8 110
+; CHECK: // .b8 32
+; CHECK: // .b8 51
+; CHECK: // .b8 46
+; CHECK: // .b8 53
+; CHECK: // .b8 46
+; CHECK: // .b8 48
+; CHECK: // .b8 32
+; CHECK: // .b8 40
+; CHECK: // .b8 50
+; CHECK: // .b8 49
+; CHECK: // .b8 48
+; CHECK: // .b8 52
+; CHECK: // .b8 55
+; CHECK: // .b8 57
+; CHECK: // .b8 41
+; CHECK: // .b8 0
+; CHECK: // .b8 4                                // DW_AT_language
+; CHECK: // .b8 0
+; CHECK: // .b8 100                              // DW_AT_name
+; CHECK: // .b8 101
+; CHECK: // .b8 98
+; CHECK: // .b8 117
+; CHECK: // .b8 103
+; CHECK: // .b8 45
+; CHECK: // .b8 108
+; CHECK: // .b8 111
+; CHECK: // .b8 99
+; CHECK: // .b8 45
+; CHECK: // .b8 111
+; CHECK: // .b8 102
+; CHECK: // .b8 102
+; CHECK: // .b8 115
+; CHECK: // .b8 101
+; CHECK: // .b8 116
+; CHECK: // .b8 49
+; CHECK: // .b8 46
+; CHECK: // .b8 99
+; CHECK: // .b8 99
+; CHECK: // .b8 0
+; CHECK: // .b32 .debug_line                     // DW_AT_stmt_list
+; CHECK: // .b8 47                               // DW_AT_comp_dir
+; CHECK: // .b8 108
+; CHECK: // .b8 108
+; CHECK: // .b8 118
+; CHECK: // .b8 109
+; CHECK: // .b8 95
+; CHECK: // .b8 99
+; CHECK: // .b8 109
+; CHECK: // .b8 97
+; CHECK: // .b8 107
+; CHECK: // .b8 101
+; CHECK: // .b8 95
+; CHECK: // .b8 103
+; CHECK: // .b8 99
+; CHECK: // .b8 99
+; CHECK: // .b8 0
+; CHECK: // .b64 Lfunc_begin0                    // DW_AT_low_pc
+; CHECK: // .b64 Lfunc_end0                      // DW_AT_high_pc
+; CHECK: // .b8 5                                // Abbrev [5] 0x64:0x32 DW_TAG_subprogram
+; CHECK: // .b64 Lfunc_begin0                    // DW_AT_low_pc
+; CHECK: // .b64 Lfunc_end0                      // DW_AT_high_pc
+; CHECK: // .b8 95                               // DW_AT_MIPS_linkage_name
+; CHECK: // .b8 90
+; CHECK: // .b8 51
+; CHECK: // .b8 98
+; CHECK: // .b8 97
+; CHECK: // .b8 114
+; CHECK: // .b8 105
+; CHECK: // .b8 0
+; CHECK: // .b8 98                               // DW_AT_name
+; CHECK: // .b8 97
+; CHECK: // .b8 114
+; CHECK: // .b8 0
+; CHECK: // .b8 1                                // DW_AT_decl_file
+; CHECK: // .b8 1                                // DW_AT_decl_line
+; CHECK: // .b32 150                             // DW_AT_type
+; CHECK: // .b8 1                                // DW_AT_external
+; CHECK: // .b8 6                                // Abbrev [6] 0x88:0xd DW_TAG_formal_parameter
+; CHECK: // .b32 Ldebug_loc0                     // DW_AT_location
+; CHECK: // .b8 98                               // DW_AT_name
+; CHECK: // .b8 0
+; CHECK: // .b8 1                                // DW_AT_decl_file
+; CHECK: // .b8 1                                // DW_AT_decl_line
+; CHECK: // .b32 150                             // DW_AT_type
+; CHECK: // .b8 0                                // End Of Children Mark
+; CHECK: // .b8 7                                // Abbrev [7] 0x96:0x7 DW_TAG_base_type
+; CHECK: // .b8 105                              // DW_AT_name
+; CHECK: // .b8 110
+; CHECK: // .b8 116
+; CHECK: // .b8 0
+; CHECK: // .b8 5                                // DW_AT_encoding
+; CHECK: // .b8 4                                // DW_AT_byte_size
+; CHECK: // .b8 0                                // End Of Children Mark
+; CHECK: // }
+; CHECK: // .section .debug_macinfo
+; CHECK: // {
+; CHECK: // .b8 0                                // End Of Macro List Mark
+; CHECK: // }


_______________________________________________
llvm-commits mailing list
llvm-commits at lists.llvm.org<mailto:llvm-commits at lists.llvm.org>
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits





-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180702/f2a2bf36/attachment.html>


More information about the llvm-commits mailing list