Debug info failing in assembler.


I just updated from r190763 to r191137 and started getting failures in generated assembly language when debug info is enabled. Here is the test case:

// Compile and run for every target.
// RUN: %ecc -g -o %t %s && %t
// FAIL: %armecc -g -o %t %s && %armrun %t
// FAIL: %armebecc -g -o %t %s && %armebrun %t
// RUN: %i386ecc -g -o %t %s && %i386run %t
// FAIL: %microblazeecc -g -o %t %s && %microblazerun %t
// FAIL: %mipsecc -g -o %t %s && %mipsrun %t
// FAIL: %mipselecc -g -o %t %s && %mipselrun %t
// FAIL: %ppcecc -g -o %t %s && %ppcrun %t
// FAIL: %ppc64ecc -g -o %t %s && %ppc64run %t
// RUN: %x86_64ecc -g -o %t %s && %x86_64run %t

int comm;
int main()
     comm = 6;

This fails on all but the x86 processors. The typical failure looks like this:
         .type comm,@object # @comm
         .comm comm,4,4
         .cfi_sections .debug_frame
         .section .debug_aranges,"",@progbits
         .long 36 # Length of ARange Set
         .short 2 # DWARF Arange version number
         .long .L.debug_info_begin0 # Offset Into Debug Info Section
         .byte 4 # Address Size (in bytes)
         .byte 0 # Segment Size (in bytes)
         .byte 255
         .long comm
.Lset0 = .L.bss_end-comm
         .long .Lset0

The typical error message is:
/tmp/debug-8ecf9d.s: Assembler messages:
/tmp/debug-8ecf9d.s: Error: invalid operands (.bss and *COM* sections) for `-' when setting `.Lset0'

Is it legal to mix .comm symbols and .bss symbols in assembly? Is the x86 success a bug or a feature?


Interesting. File please? Thanks.

If it thinks the symbol is in the BSS section, then it should never have tried to use .comm to emit it I think.

On x86 it does not try to mix and match, which is why it works. AFAIK comm symbols are regarded as having no section, rather than being bss, so I think it’s a bug in whatever code printed that .comm statement.

I’ll look into this tomorrow.


I filed PR 17321 for this.
The problem code is in llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp around line 2844. Apparently Span.End is set for the .comm symbol in this case.