<div dir="ltr">Seems like an awful lot of DWARF assembly given the short description of the conditions necessary to tickle the bug - does the test case need to have apple names sections in it, for example?</div><br><div class="gmail_quote"><div dir="ltr">On Sat, Feb 17, 2018 at 5:08 AM Jonas Devlieghere via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jdevlieghere<br>
Date: Sat Feb 17 05:06:37 2018<br>
New Revision: 325430<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=325430&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=325430&view=rev</a><br>
Log:<br>
[dwarfdump] Fix spurious verification errors for DW_AT_location attributes<br>
<br>
Verifying any DWARF file that is optimized and contains at least one tag<br>
with a DW_AT_location with a location list offset as a<br>
DW_AT_form_dataXXX results in dwarfdump spuriously claiming that the<br>
location list is invalid.<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D40199" rel="noreferrer" target="_blank">https://reviews.llvm.org/D40199</a><br>
<br>
Added:<br>
llvm/trunk/test/tools/dsymutil/Inputs/invalid.o (with props)<br>
llvm/trunk/test/tools/dsymutil/Inputs/invalid.s<br>
Modified:<br>
llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp<br>
llvm/trunk/test/tools/dsymutil/X86/verify.test<br>
llvm/trunk/test/tools/llvm-dwarfdump/X86/debugloc.s<br>
<br>
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=325430&r1=325429&r2=325430&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=325430&r1=325429&r2=325430&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp (original)<br>
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp Sat Feb 17 05:06:37 2018<br>
@@ -410,22 +410,27 @@ unsigned DWARFVerifier::verifyDebugInfoA<br>
ReportError("DIE has invalid DW_AT_stmt_list encoding:");<br>
break;<br>
case DW_AT_location: {<br>
- Optional<ArrayRef<uint8_t>> Expr = AttrValue.Value.getAsBlock();<br>
- if (!Expr) {<br>
- ReportError("DIE has invalid DW_AT_location encoding:");<br>
- break;<br>
+ auto VerifyLocation = [&](StringRef D) {<br>
+ DWARFUnit *U = Die.getDwarfUnit();<br>
+ DataExtractor Data(D, DCtx.isLittleEndian(), 0);<br>
+ DWARFExpression Expression(Data, U->getVersion(),<br>
+ U->getAddressByteSize());<br>
+ bool Error = llvm::any_of(Expression, [](DWARFExpression::Operation &Op) {<br>
+ return Op.isError();<br>
+ });<br>
+ if (Error)<br>
+ ReportError("DIE contains invalid DWARF expression:");<br>
+ };<br>
+ if (Optional<ArrayRef<uint8_t>> Expr = AttrValue.Value.getAsBlock()) {<br>
+ // Verify inlined location.<br>
+ VerifyLocation(llvm::toStringRef(*Expr));<br>
+ } else if (auto LocOffset = AttrValue.Value.getAsUnsignedConstant()) {<br>
+ // Verify location list.<br>
+ if (auto DebugLoc = DCtx.getDebugLoc())<br>
+ if (auto LocList = DebugLoc->getLocationListAtOffset(*LocOffset))<br>
+ for (const auto &Entry : LocList->Entries)<br>
+ VerifyLocation({Entry.Loc.data(), Entry.Loc.size()});<br>
}<br>
-<br>
- DWARFUnit *U = Die.getDwarfUnit();<br>
- DataExtractor Data(<br>
- StringRef(reinterpret_cast<const char *>(Expr->data()), Expr->size()),<br>
- DCtx.isLittleEndian(), 0);<br>
- DWARFExpression Expression(Data, U->getVersion(), U->getAddressByteSize());<br>
- bool Error = llvm::any_of(Expression, [](DWARFExpression::Operation &Op) {<br>
- return Op.isError();<br>
- });<br>
- if (Error)<br>
- ReportError("DIE contains invalid DWARF expression:");<br>
break;<br>
}<br>
<br>
<br>
Added: llvm/trunk/test/tools/dsymutil/Inputs/invalid.o<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/invalid.o?rev=325430&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/invalid.o?rev=325430&view=auto</a><br>
==============================================================================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/dsymutil/Inputs/invalid.o<br>
------------------------------------------------------------------------------<br>
svn:executable = *<br>
<br>
Propchange: llvm/trunk/test/tools/dsymutil/Inputs/invalid.o<br>
------------------------------------------------------------------------------<br>
svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/dsymutil/Inputs/invalid.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/invalid.s?rev=325430&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/invalid.s?rev=325430&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/dsymutil/Inputs/invalid.s (added)<br>
+++ llvm/trunk/test/tools/dsymutil/Inputs/invalid.s Sat Feb 17 05:06:37 2018<br>
@@ -0,0 +1,262 @@<br>
+# The DW_AT_low_pc was modified to be greater than the DW_AT_high_pc.<br>
+<br>
+ .section __TEXT,__text,regular,pure_instructions<br>
+ .macosx_version_min 10, 13<br>
+ .globl _g ## -- Begin function g<br>
+ .p2align 4, 0x90<br>
+_g: ## @g<br>
+Lfunc_begin0:<br>
+ .file 1 "inlined.c"<br>
+ .loc 1 1 0 ## inlined.c:1:0<br>
+ .cfi_startproc<br>
+## %bb.0: ## %entry<br>
+ pushq %rbp<br>
+ .cfi_def_cfa_offset 16<br>
+ .cfi_offset %rbp, -16<br>
+ movq %rsp, %rbp<br>
+ .cfi_def_cfa_register %rbp<br>
+Ltmp0:<br>
+ .loc 1 2 1 prologue_end ## inlined.c:2:1<br>
+ popq %rbp<br>
+ retq<br>
+Ltmp1:<br>
+Lfunc_end0:<br>
+ .cfi_endproc<br>
+ ## -- End function<br>
+ .globl _main ## -- Begin function main<br>
+ .p2align 4, 0x90<br>
+_main: ## @main<br>
+Lfunc_begin1:<br>
+ .loc 1 3 0 ## inlined.c:3:0<br>
+ .cfi_startproc<br>
+## %bb.0: ## %entry<br>
+ pushq %rbp<br>
+ .cfi_def_cfa_offset 16<br>
+ .cfi_offset %rbp, -16<br>
+ movq %rsp, %rbp<br>
+ .cfi_def_cfa_register %rbp<br>
+ xorl %eax, %eax<br>
+Ltmp2:<br>
+ .loc 1 5 1 prologue_end ## inlined.c:5:1<br>
+ popq %rbp<br>
+ retq<br>
+Ltmp3:<br>
+Lfunc_end1:<br>
+ .cfi_endproc<br>
+ ## -- End function<br>
+ .section __DWARF,__debug_str,regular,debug<br>
+Linfo_string:<br>
+ .asciz "clang version 7.0.0 " ## string offset=0<br>
+ .asciz "inlined.c" ## string offset=21<br>
+ .asciz "/private/tmp" ## string offset=31<br>
+ .asciz "g" ## string offset=44<br>
+ .asciz "main" ## string offset=46<br>
+ .asciz "int" ## string offset=51<br>
+ .section __DWARF,__debug_abbrev,regular,debug<br>
+Lsection_abbrev:<br>
+ .byte 1 ## Abbreviation Code<br>
+ .byte 17 ## DW_TAG_compile_unit<br>
+ .byte 1 ## DW_CHILDREN_yes<br>
+ .byte 37 ## DW_AT_producer<br>
+ .byte 14 ## DW_FORM_strp<br>
+ .byte 19 ## DW_AT_language<br>
+ .byte 5 ## DW_FORM_data2<br>
+ .byte 3 ## DW_AT_name<br>
+ .byte 14 ## DW_FORM_strp<br>
+ .byte 16 ## DW_AT_stmt_list<br>
+ .byte 23 ## DW_FORM_sec_offset<br>
+ .byte 27 ## DW_AT_comp_dir<br>
+ .byte 14 ## DW_FORM_strp<br>
+ .byte 19 ## DW_AT_low_pc <- LOW PC > HIGH PC<br>
+ .byte 1 ## DW_FORM_addr<br>
+ .byte 18 ## DW_AT_high_pc<br>
+ .byte 6 ## DW_FORM_data4<br>
+ .byte 0 ## EOM(1)<br>
+ .byte 0 ## EOM(2)<br>
+ .byte 2 ## Abbreviation Code<br>
+ .byte 46 ## DW_TAG_subprogram<br>
+ .byte 0 ## DW_CHILDREN_no<br>
+ .byte 17 ## DW_AT_low_pc<br>
+ .byte 1 ## DW_FORM_addr<br>
+ .byte 18 ## DW_AT_high_pc<br>
+ .byte 6 ## DW_FORM_data4<br>
+ .byte 64 ## DW_AT_frame_base<br>
+ .byte 24 ## DW_FORM_exprloc<br>
+ .byte 3 ## DW_AT_name<br>
+ .byte 14 ## DW_FORM_strp<br>
+ .byte 58 ## DW_AT_decl_file<br>
+ .byte 11 ## DW_FORM_data1<br>
+ .byte 59 ## DW_AT_decl_line<br>
+ .byte 11 ## DW_FORM_data1<br>
+ .byte 63 ## DW_AT_external<br>
+ .byte 25 ## DW_FORM_flag_present<br>
+ .byte 0 ## EOM(1)<br>
+ .byte 0 ## EOM(2)<br>
+ .byte 3 ## Abbreviation Code<br>
+ .byte 46 ## DW_TAG_subprogram<br>
+ .byte 0 ## DW_CHILDREN_no<br>
+ .byte 17 ## DW_AT_low_pc<br>
+ .byte 1 ## DW_FORM_addr<br>
+ .byte 18 ## DW_AT_high_pc<br>
+ .byte 6 ## DW_FORM_data4<br>
+ .byte 64 ## DW_AT_frame_base<br>
+ .byte 24 ## DW_FORM_exprloc<br>
+ .byte 3 ## DW_AT_name<br>
+ .byte 14 ## DW_FORM_strp<br>
+ .byte 58 ## DW_AT_decl_file<br>
+ .byte 11 ## DW_FORM_data1<br>
+ .byte 59 ## DW_AT_decl_line<br>
+ .byte 11 ## DW_FORM_data1<br>
+ .byte 73 ## DW_AT_type<br>
+ .byte 19 ## DW_FORM_ref4<br>
+ .byte 63 ## DW_AT_external<br>
+ .byte 25 ## DW_FORM_flag_present<br>
+ .byte 0 ## EOM(1)<br>
+ .byte 0 ## EOM(2)<br>
+ .byte 4 ## Abbreviation Code<br>
+ .byte 36 ## DW_TAG_base_type<br>
+ .byte 0 ## DW_CHILDREN_no<br>
+ .byte 3 ## DW_AT_name<br>
+ .byte 14 ## DW_FORM_strp<br>
+ .byte 62 ## DW_AT_encoding<br>
+ .byte 11 ## DW_FORM_data1<br>
+ .byte 11 ## DW_AT_byte_size<br>
+ .byte 11 ## DW_FORM_data1<br>
+ .byte 0 ## EOM(1)<br>
+ .byte 0 ## EOM(2)<br>
+ .byte 0 ## EOM(3)<br>
+ .section __DWARF,__debug_info,regular,debug<br>
+Lsection_info:<br>
+Lcu_begin0:<br>
+ .long 92 ## Length of Unit<br>
+ .short 4 ## DWARF version number<br>
+Lset0 = Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section<br>
+ .long Lset0<br>
+ .byte 8 ## Address Size (in bytes)<br>
+ .byte 1 ## Abbrev [1] 0xb:0x55 DW_TAG_compile_unit<br>
+ .long 0 ## DW_AT_producer<br>
+ .short 12 ## DW_AT_language<br>
+ .long 21 ## DW_AT_name<br>
+Lset1 = Lline_table_start0-Lsection_line ## DW_AT_stmt_list<br>
+ .long Lset1<br>
+ .long 31 ## DW_AT_comp_dir<br>
+ .quad Lfunc_begin0 ## DW_AT_low_pc<br>
+Lset2 = Lfunc_end1-Lfunc_begin0 ## DW_AT_high_pc<br>
+ .long Lset2<br>
+ .byte 2 ## Abbrev [2] 0x2a:0x15 DW_TAG_subprogram<br>
+ .quad Lfunc_begin0 ## DW_AT_low_pc<br>
+Lset3 = Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc<br>
+ .long Lset3<br>
+ .byte 1 ## DW_AT_frame_base<br>
+ .byte 86<br>
+ .long 44 ## DW_AT_name<br>
+ .byte 1 ## DW_AT_decl_file<br>
+ .byte 1 ## DW_AT_decl_line<br>
+ ## DW_AT_external<br>
+ .byte 3 ## Abbrev [3] 0x3f:0x19 DW_TAG_subprogram<br>
+ .quad Lfunc_begin1 ## DW_AT_low_pc<br>
+Lset4 = Lfunc_end1-Lfunc_begin1 ## DW_AT_high_pc<br>
+ .long Lset4<br>
+ .byte 1 ## DW_AT_frame_base<br>
+ .byte 86<br>
+ .long 46 ## DW_AT_name<br>
+ .byte 1 ## DW_AT_decl_file<br>
+ .byte 3 ## DW_AT_decl_line<br>
+ .long 88 ## DW_AT_type<br>
+ ## DW_AT_external<br>
+ .byte 4 ## Abbrev [4] 0x58:0x7 DW_TAG_base_type<br>
+ .long 51 ## DW_AT_name<br>
+ .byte 5 ## DW_AT_encoding<br>
+ .byte 4 ## DW_AT_byte_size<br>
+ .byte 0 ## End Of Children Mark<br>
+ .section __DWARF,__debug_ranges,regular,debug<br>
+Ldebug_range:<br>
+ .section __DWARF,__debug_macinfo,regular,debug<br>
+Ldebug_macinfo:<br>
+Lcu_macro_begin0:<br>
+ .byte 0 ## End Of Macro List Mark<br>
+ .section __DWARF,__apple_names,regular,debug<br>
+Lnames_begin:<br>
+ .long 1212240712 ## Header Magic<br>
+ .short 1 ## Header Version<br>
+ .short 0 ## Header Hash Function<br>
+ .long 2 ## Header Bucket Count<br>
+ .long 2 ## Header Hash Count<br>
+ .long 12 ## Header Data Length<br>
+ .long 0 ## HeaderData Die Offset Base<br>
+ .long 1 ## HeaderData Atom Count<br>
+ .short 1 ## DW_ATOM_die_offset<br>
+ .short 6 ## DW_FORM_data4<br>
+ .long 0 ## Bucket 0<br>
+ .long -1 ## Bucket 1<br>
+ .long 177676 ## Hash in Bucket 0<br>
+ .long 2090499946 ## Hash in Bucket 0<br>
+ .long LNames1-Lnames_begin ## Offset in Bucket 0<br>
+ .long LNames0-Lnames_begin ## Offset in Bucket 0<br>
+LNames1:<br>
+ .long 44 ## g<br>
+ .long 1 ## Num DIEs<br>
+ .long 42<br>
+ .long 0<br>
+LNames0:<br>
+ .long 46 ## main<br>
+ .long 1 ## Num DIEs<br>
+ .long 63<br>
+ .long 0<br>
+ .section __DWARF,__apple_objc,regular,debug<br>
+Lobjc_begin:<br>
+ .long 1212240712 ## Header Magic<br>
+ .short 1 ## Header Version<br>
+ .short 0 ## Header Hash Function<br>
+ .long 1 ## Header Bucket Count<br>
+ .long 0 ## Header Hash Count<br>
+ .long 12 ## Header Data Length<br>
+ .long 0 ## HeaderData Die Offset Base<br>
+ .long 1 ## HeaderData Atom Count<br>
+ .short 1 ## DW_ATOM_die_offset<br>
+ .short 6 ## DW_FORM_data4<br>
+ .long -1 ## Bucket 0<br>
+ .section __DWARF,__apple_namespac,regular,debug<br>
+Lnamespac_begin:<br>
+ .long 1212240712 ## Header Magic<br>
+ .short 1 ## Header Version<br>
+ .short 0 ## Header Hash Function<br>
+ .long 1 ## Header Bucket Count<br>
+ .long 0 ## Header Hash Count<br>
+ .long 12 ## Header Data Length<br>
+ .long 0 ## HeaderData Die Offset Base<br>
+ .long 1 ## HeaderData Atom Count<br>
+ .short 1 ## DW_ATOM_die_offset<br>
+ .short 6 ## DW_FORM_data4<br>
+ .long -1 ## Bucket 0<br>
+ .section __DWARF,__apple_types,regular,debug<br>
+Ltypes_begin:<br>
+ .long 1212240712 ## Header Magic<br>
+ .short 1 ## Header Version<br>
+ .short 0 ## Header Hash Function<br>
+ .long 1 ## Header Bucket Count<br>
+ .long 1 ## Header Hash Count<br>
+ .long 20 ## Header Data Length<br>
+ .long 0 ## HeaderData Die Offset Base<br>
+ .long 3 ## HeaderData Atom Count<br>
+ .short 1 ## DW_ATOM_die_offset<br>
+ .short 6 ## DW_FORM_data4<br>
+ .short 3 ## DW_ATOM_die_tag<br>
+ .short 5 ## DW_FORM_data2<br>
+ .short 4 ## DW_ATOM_type_flags<br>
+ .short 11 ## DW_FORM_data1<br>
+ .long 0 ## Bucket 0<br>
+ .long 193495088 ## Hash in Bucket 0<br>
+ .long Ltypes0-Ltypes_begin ## Offset in Bucket 0<br>
+Ltypes0:<br>
+ .long 51 ## int<br>
+ .long 1 ## Num DIEs<br>
+ .long 88<br>
+ .short 36<br>
+ .byte 0<br>
+ .long 0<br>
+<br>
+.subsections_via_symbols<br>
+ .section __DWARF,__debug_line,regular,debug<br>
+Lsection_line:<br>
+Lline_table_start0:<br>
<br>
Modified: llvm/trunk/test/tools/dsymutil/X86/verify.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/X86/verify.test?rev=325430&r1=325429&r2=325430&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/X86/verify.test?rev=325430&r1=325429&r2=325430&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/dsymutil/X86/verify.test (original)<br>
+++ llvm/trunk/test/tools/dsymutil/X86/verify.test Sat Feb 17 05:06:37 2018<br>
@@ -1,8 +1,23 @@<br>
-# Multiple inputs in flat mode<br>
-RUN: not llvm-dsymutil -verify -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_64 %p/../Inputs/basic-archive.macho.x86_64 %p/../Inputs/basic-lto.macho.x86_64 %p/../Inputs/basic-lto-dw4.macho.x86_64 -o %t 2>&1 | FileCheck %s --check-prefix=QUIET<br>
-RUN: not llvm-dsymutil -verify -verbose -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_64 %p/../Inputs/basic-archive.macho.x86_64 %p/../Inputs/basic-lto.macho.x86_64 %p/../Inputs/basic-lto-dw4.macho.x86_64 -o %t 2>&1 | FileCheck %s --check-prefix=QUIET --check-prefix=VERBOSE<br>
+# Positive tests in regular and verbose mode.<br>
+# RUN: llvm-dsymutil -verify -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_64 %p/../Inputs/basic-archive.macho.x86_64 %p/../Inputs/basic-lto.macho.x86_64 %p/../Inputs/basic-lto-dw4.macho.x86_64 -o %t 2>&1 | FileCheck %s --allow-empty --check-prefix=QUIET-SUCCESS<br>
+# RUN: llvm-dsymutil -verify -verbose -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_64 %p/../Inputs/basic-archive.macho.x86_64 %p/../Inputs/basic-lto.macho.x86_64 %p/../Inputs/basic-lto-dw4.macho.x86_64 -o %t 2>&1 | FileCheck %s --check-prefix=QUIET-SUCCESS --check-prefix=VERBOSE<br>
<br>
-VERBOSE: Verifying DWARF for architecture: x86_64<br>
-VERBOSE: error: DIE has invalid DW_AT_location encoding:<br>
-VERBOSE: error: DIE has invalid DW_AT_location encoding:<br>
-QUIET: error: verification failed<br>
+# VERBOSE: Verifying DWARF for architecture: x86_64<br>
+# QUIET-SUCCESS-NOT: error: verification failed<br>
+<br>
+# Negative tests in regular and verbose mode.<br>
+# (Invalid object generated from ../Inputs/invalid.s by modified the low PC.)<br>
+# RUN: not llvm-dsymutil -verify -oso-prepend-path=%p/../Inputs -y %s -o %t 2>&1 | FileCheck %s --check-prefix=QUIET-FAIL<br>
+# RUN: not llvm-dsymutil -verify -verbose -oso-prepend-path=%p/../Inputs -y %s -o %t 2>&1 | FileCheck %s --check-prefix=QUIET-FAIL --check-prefix=VERBOSE<br>
+<br>
+# QUIET-FAIL: error: verification failed<br>
+<br>
+---<br>
+triple: 'x86_64-apple-darwin'<br>
+objects:<br>
+ - filename: invalid.o<br>
+ timestamp: 1518197670<br>
+ symbols:<br>
+ - { sym: _main, objAddr: 0x0000000000000010, binAddr: 0x0000000100000FB0, size: 0x00000008 }<br>
+ - { sym: _g, objAddr: 0x0000000000000000, binAddr: 0x0000000100000FA0, size: 0x00000010 }<br>
+...<br>
<br>
Modified: llvm/trunk/test/tools/llvm-dwarfdump/X86/debugloc.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/debugloc.s?rev=325430&r1=325429&r2=325430&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/debugloc.s?rev=325430&r1=325429&r2=325430&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-dwarfdump/X86/debugloc.s (original)<br>
+++ llvm/trunk/test/tools/llvm-dwarfdump/X86/debugloc.s Sat Feb 17 05:06:37 2018<br>
@@ -2,6 +2,10 @@<br>
# RUN: | llvm-dwarfdump --debug-loc - \<br>
# RUN: | FileCheck %s<br>
<br>
+# RUN: llvm-mc %s -filetype obj -triple x86_64-linux-elf -o - \<br>
+# RUN: | llvm-dwarfdump --verify - \<br>
+# RUN: | FileCheck %s --check-prefix VERIFY<br>
+<br>
# CHECK: .debug_loc contents:<br>
<br>
# CHECK: 0x00000000:<br>
@@ -12,6 +16,9 @@<br>
# CHECK-NEXT: [0x0000000000000010, 0x0000000000000013): DW_OP_reg5 RDI<br>
# CHECK-NEXT: [0x0000000000000013, 0x0000000000000014): DW_OP_reg0 RAX<br>
<br>
+# VERIFY: Verifying .debug_info Unit Header Chain<br>
+# VERIFY-NOT: DIE has invalid DW_AT_location encoding<br>
+<br>
# Source:<br>
# int* foo(int* i) { return i; }<br>
# int* bar(int* i) { return i; }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>