diff --git a/llvm/lib/ObjectYAML/DWARFEmitter.cpp b/llvm/lib/ObjectYAML/DWARFEmitter.cpp --- a/llvm/lib/ObjectYAML/DWARFEmitter.cpp +++ b/llvm/lib/ObjectYAML/DWARFEmitter.cpp @@ -470,14 +470,15 @@ writeInteger((uint8_t)Op.SubOpcode, OS, DI.IsLittleEndian); switch (Op.SubOpcode) { case dwarf::DW_LNE_set_address: - case dwarf::DW_LNE_set_discriminator: - // FIXME: The operand of set_discriminator is not an address. cantFail(writeVariableSizedInteger(Op.Data, AddrSize, OS, DI.IsLittleEndian)); break; case dwarf::DW_LNE_define_file: emitFileEntry(OS, Op.FileEntry); break; + case dwarf::DW_LNE_set_discriminator: + encodeULEB128(Op.Data, OS); + break; case dwarf::DW_LNE_end_sequence: break; default: diff --git a/llvm/test/tools/yaml2obj/ELF/DWARF/debug-line.yaml b/llvm/test/tools/yaml2obj/ELF/DWARF/debug-line.yaml --- a/llvm/test/tools/yaml2obj/ELF/DWARF/debug-line.yaml +++ b/llvm/test/tools/yaml2obj/ELF/DWARF/debug-line.yaml @@ -370,3 +370,121 @@ ExtLen: 9 SubOpcode: DW_LNE_set_address Data: [[ADDR]] + +## i) Test that yaml2obj is able to emit correct opcodes. + +# RUN: yaml2obj --docnum=9 %s -o %t9.o +# RUN: llvm-readelf --hex-dump=.debug_line %t9.o | FileCheck %s --check-prefix=OPCODES + +# OPCODES: Hex dump of section '.debug_line': +# OPCODES-NEXT: 0x00000000 34120000 04003412 00000101 01010e0d 4.....4......... +## ^------- unit_length (4-byte) +## ^--- version (2-byte) +## ^-------- header_length (4-byte) +## ^- minimum_instruction_length (1-byte) +## ^- maximum_operations_per_instruction (1-byte) +## ^- default_is_stmt (1-byte) +## ^- line_base (1-byte) +## ^- line_range (1-byte) +## ^- opcode_base (1-byte) +# OPCODES-NEXT: 0x00000010 00000102 b42403b4 2404b424 05b42406 .....$..$..$..$. +## ^- null byte for terminating include_directories +## ^- null byte for terminating file_names +## ^- DW_LNS_copy (1-byte) +## ^- DW_LNS_advance_pc +## ^--- operands[0] (ULEB128) 0x1234 +## ^- DW_LNS_advance_line +## ^---- operands[0] (SLEB128) 0x1234 +## ^- DW_LNS_set_file +## ^--- operands[0] (ULEB128) 0x1234 +## ^- DW_LNS_set_column +## ^--- operands[0] (ULEB128) 0x1234 +## ^- DW_LNS_negate_stmt +# OPCODES-NEXT: 0x00000020 07080934 120a0b0c b4240009 01000902 ...4.....$...... +## ^- DW_LNS_set_basic_block +## ^- DW_LNS_const_add_pc +## ^- DW_LNS_fixed_advance_pc +## ^---- operands[0] (uhalf, 2-byte) +## ^- DW_LNS_set_prologue_end +## ^- DW_LNS_set_epilogue_begin +## ^- DW_LNS_set_isa +## ^--- operands[0] (ULEB128) 0x1234 +## ^- DW_LNS_extended_op +## ^- extended op length (ULEB128) 0x09 +## ^- DW_LNE_end_sequence +## ^- DW_LNS_extended_op +## ^- extended op length (ULEB128) 0x09 +## ^- DW_LNE_set_address +# OPCODES-NEXT: 0x00000030 34120000 00000000 00090361 62636400 4..........abcd. +## ^---------------- operands[0] (8-byte) +## ^- DW_LNS_extended_op +## ^- extended op length (ULEB128) 0x09 +## ^- DW_LNE_define_file +## ^---------- operands[0] "abcd\0" +# OPCODES-NEXT: 0x00000040 b424b424 b4240009 04b424 .$.$.$....$ +## ^--- operands[1] (ULEB128) 0x1234 +## ^--- operands[2] (ULEB128) 0x1234 +## ^--- operands[3] (ULEB128) 0x1234 +## ^- DW_LNS_extended_op +## ^- extended op length (ULEB128) 0x09 +## ^- DW_LNE_set_discriminator +## ^--- operands[0] (ULEB128) 0x1234 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +DWARF: + debug_line: + - Length: 0x1234 + Version: 4 + PrologueLength: 0x1234 + MinInstLength: 1 + MaxOpsPerInst: 1 + DefaultIsStmt: 1 + LineBase: 1 + LineRange: 14 + OpcodeBase: 13 + StandardOpcodeLengths: [] + IncludeDirs: [] + Files: [] + Opcodes: + - Opcode: DW_LNS_copy + - Opcode: DW_LNS_advance_pc + Data: 0x1234 + - Opcode: DW_LNS_advance_line + SData: 0x1234 + - Opcode: DW_LNS_set_file + Data: 0x1234 + - Opcode: DW_LNS_set_column + Data: 0x1234 + - Opcode: DW_LNS_negate_stmt + - Opcode: DW_LNS_set_basic_block + - Opcode: DW_LNS_const_add_pc + - Opcode: DW_LNS_fixed_advance_pc + Data: 0x1234 + - Opcode: DW_LNS_set_prologue_end + - Opcode: DW_LNS_set_epilogue_begin + - Opcode: DW_LNS_set_isa + Data: 0x1234 + - Opcode: DW_LNS_extended_op + ExtLen: 0x09 + SubOpcode: DW_LNE_end_sequence + - Opcode: DW_LNS_extended_op + ExtLen: 0x09 + SubOpcode: DW_LNE_set_address + Data: 0x1234 + - Opcode: DW_LNS_extended_op + ExtLen: 0x09 + SubOpcode: DW_LNE_define_file + FileEntry: + Name: abcd + DirIdx: 0x1234 + ModTime: 0x1234 + Length: 0x1234 + - Opcode: DW_LNS_extended_op + ExtLen: 0x09 + SubOpcode: DW_LNE_set_discriminator + Data: 0x1234