Skip to content

Commit 28646d0

Browse files
authored
[MC] Add .loc_label instruction (#99710)
As discussed in [the RFC](https://discourse.llvm.org/t/rfc-extending-llvm-mc-loc-directive-with-labeling-support/79608) we need a way to create labels in the assembler-generated line section in order to support the future addition of the [DW_AT_LLVM_stmt_sequence](https://discourse.llvm.org/t/rfc-new-dwarf-attribute-for-symbolication-of-merged-functions/79434) attribute. We have a similar precedent for such behavior with the [.cfi_label](#97922) instruction - so we add the `.loc_label THE_LABEL_NAME` instruction which: - Terminates the current line sequence in the line section - Creates a new label with the specified label name in the `.debug_line` section
1 parent 42b696d commit 28646d0

File tree

9 files changed

+206
-16
lines changed

9 files changed

+206
-16
lines changed

llvm/include/llvm/MC/MCDwarf.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,23 @@ class MCDwarfLineEntry : public MCDwarfLoc {
194194

195195
public:
196196
// Constructor to create an MCDwarfLineEntry given a symbol and the dwarf loc.
197-
MCDwarfLineEntry(MCSymbol *label, const MCDwarfLoc loc)
198-
: MCDwarfLoc(loc), Label(label) {}
197+
MCDwarfLineEntry(MCSymbol *label, const MCDwarfLoc loc,
198+
MCSymbol *lineStreamLabel = nullptr,
199+
SMLoc streamLabelDefLoc = {})
200+
: MCDwarfLoc(loc), Label(label), LineStreamLabel(lineStreamLabel),
201+
StreamLabelDefLoc(streamLabelDefLoc) {}
199202

200203
MCSymbol *getLabel() const { return Label; }
201204

205+
// This is the label that is to be emitted into the line stream. If this is
206+
// non-null and we need to emit a label, also make sure to restart the current
207+
// line sequence.
208+
MCSymbol *LineStreamLabel;
209+
210+
// Location where LineStreamLabel was defined. If there is an error emitting
211+
// LineStreamLabel, we can use the SMLoc to report an error.
212+
SMLoc StreamLabelDefLoc;
213+
202214
// This indicates the line entry is synthesized for an end entry.
203215
bool IsEndEntry = false;
204216

@@ -365,6 +377,9 @@ class MCDwarfLineTable {
365377
emitOne(MCStreamer *MCOS, MCSection *Section,
366378
const MCLineSection::MCDwarfLineEntryCollection &LineEntries);
367379

380+
void endCurrentSeqAndEmitLineStreamLabel(MCStreamer *MCOS, SMLoc DefLoc,
381+
StringRef Name);
382+
368383
Expected<unsigned> tryGetFile(StringRef &Directory, StringRef &FileName,
369384
std::optional<MD5::MD5Result> Checksum,
370385
std::optional<StringRef> Source,

llvm/include/llvm/MC/MCObjectStreamer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ class MCObjectStreamer : public MCStreamer {
146146
void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel,
147147
const MCSymbol *Label,
148148
unsigned PointerSize) override;
149-
void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel) override;
149+
void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
150+
MCSymbol *EndLabel = nullptr) override;
150151
void emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
151152
const MCSymbol *Label, SMLoc Loc);
152153
void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line,

llvm/include/llvm/MC/MCStreamer.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,9 @@ class MCStreamer {
912912
unsigned Isa, unsigned Discriminator,
913913
StringRef FileName);
914914

915+
/// This implements the '.loc_label Name' directive.
916+
virtual void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name);
917+
915918
/// Associate a filename with a specified logical file number, and also
916919
/// specify that file's checksum information. This implements the '.cv_file 4
917920
/// "foo.c"' assembler directive. Returns true on success.
@@ -1119,7 +1122,8 @@ class MCStreamer {
11191122
virtual void emitDwarfLineStartLabel(MCSymbol *StartSym);
11201123

11211124
/// Emit the debug line end entry.
1122-
virtual void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel) {}
1125+
virtual void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
1126+
MCSymbol *EndLabel = nullptr) {}
11231127

11241128
/// If targets does not support representing debug line section by .loc/.file
11251129
/// directives in assembly output, we need to populate debug line section with

llvm/lib/MC/MCAsmStreamer.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,8 @@ class MCAsmStreamer final : public MCStreamer {
301301
unsigned Flags, unsigned Isa,
302302
unsigned Discriminator,
303303
StringRef FileName) override;
304+
virtual void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name) override;
305+
304306
MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override;
305307

306308
bool emitCVFileDirective(unsigned FileNo, StringRef Filename,
@@ -429,7 +431,8 @@ class MCAsmStreamer final : public MCStreamer {
429431

430432
void emitDwarfLineStartLabel(MCSymbol *StartSym) override;
431433

432-
void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel) override;
434+
void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
435+
MCSymbol *EndLabel = nullptr) override;
433436

434437
void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel,
435438
const MCSymbol *Label,
@@ -1767,6 +1770,12 @@ void MCAsmStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
17671770
Discriminator, FileName);
17681771
}
17691772

1773+
void MCAsmStreamer::emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name) {
1774+
MCStreamer::emitDwarfLocLabelDirective(Loc, Name);
1775+
OS << ".loc_label\t" << Name;
1776+
EmitEOL();
1777+
}
1778+
17701779
MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(unsigned CUID) {
17711780
// Always use the zeroth line table, since asm syntax only supports one line
17721781
// table for now.
@@ -2579,7 +2588,8 @@ void MCAsmStreamer::emitDwarfLineStartLabel(MCSymbol *StartSym) {
25792588
}
25802589

25812590
void MCAsmStreamer::emitDwarfLineEndEntry(MCSection *Section,
2582-
MCSymbol *LastLabel) {
2591+
MCSymbol *LastLabel,
2592+
MCSymbol *EndLabel) {
25832593
// If the targets write the raw debug line data for assembly output (We can
25842594
// not switch to Section and add the end symbol there for assembly output)
25852595
// we currently use the .text end label as any section end. This will not
@@ -2596,9 +2606,10 @@ void MCAsmStreamer::emitDwarfLineEndEntry(MCSection *Section,
25962606
MCSection *TextSection = Ctx.getObjectFileInfo()->getTextSection();
25972607
assert(TextSection->hasEnded() && ".text section is not end!");
25982608

2599-
MCSymbol *SectionEnd = TextSection->getEndSymbol(Ctx);
2609+
if (!EndLabel)
2610+
EndLabel = TextSection->getEndSymbol(Ctx);
26002611
const MCAsmInfo *AsmInfo = Ctx.getAsmInfo();
2601-
emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd,
2612+
emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, EndLabel,
26022613
AsmInfo->getCodePointerSize());
26032614
}
26042615

llvm/lib/MC/MCDwarf.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ void MCDwarfLineTable::emitOne(
172172
const MCLineSection::MCDwarfLineEntryCollection &LineEntries) {
173173

174174
unsigned FileNum, LastLine, Column, Flags, Isa, Discriminator;
175+
bool IsAtStartSeq;
175176
MCSymbol *LastLabel;
176177
auto init = [&]() {
177178
FileNum = 1;
@@ -181,6 +182,7 @@ void MCDwarfLineTable::emitOne(
181182
Isa = 0;
182183
Discriminator = 0;
183184
LastLabel = nullptr;
185+
IsAtStartSeq = true;
184186
};
185187
init();
186188

@@ -189,6 +191,17 @@ void MCDwarfLineTable::emitOne(
189191
for (const MCDwarfLineEntry &LineEntry : LineEntries) {
190192
MCSymbol *Label = LineEntry.getLabel();
191193
const MCAsmInfo *asmInfo = MCOS->getContext().getAsmInfo();
194+
195+
if (LineEntry.LineStreamLabel) {
196+
if (!IsAtStartSeq) {
197+
MCOS->emitDwarfLineEndEntry(Section, LastLabel,
198+
/*EndLabel =*/LastLabel);
199+
init();
200+
}
201+
MCOS->emitLabel(LineEntry.LineStreamLabel, LineEntry.StreamLabelDefLoc);
202+
continue;
203+
}
204+
192205
if (LineEntry.IsEndEntry) {
193206
MCOS->emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, Label,
194207
asmInfo->getCodePointerSize());
@@ -243,17 +256,34 @@ void MCDwarfLineTable::emitOne(
243256
Discriminator = 0;
244257
LastLine = LineEntry.getLine();
245258
LastLabel = Label;
259+
IsAtStartSeq = false;
246260
}
247261

248262
// Generate DWARF line end entry.
249263
// We do not need this for DwarfDebug that explicitly terminates the line
250264
// table using ranges whenever CU or section changes. However, the MC path
251265
// does not track ranges nor terminate the line table. In that case,
252266
// conservatively use the section end symbol to end the line table.
253-
if (!EndEntryEmitted)
267+
if (!EndEntryEmitted && !IsAtStartSeq)
254268
MCOS->emitDwarfLineEndEntry(Section, LastLabel);
255269
}
256270

271+
void MCDwarfLineTable::endCurrentSeqAndEmitLineStreamLabel(MCStreamer *MCOS,
272+
SMLoc DefLoc,
273+
StringRef Name) {
274+
auto &ctx = MCOS->getContext();
275+
auto *LineStreamLabel = ctx.getOrCreateSymbol(Name);
276+
auto *LineSym = ctx.createTempSymbol();
277+
MCOS->emitLabel(LineSym);
278+
const MCDwarfLoc &DwarfLoc = ctx.getCurrentDwarfLoc();
279+
280+
// Create a 'fake' line entry by having LineStreamLabel be non-null. This
281+
// won't actually emit any line information, it will reset the line table
282+
// sequence and emit a label at the start of the new line table sequence.
283+
MCDwarfLineEntry LineEntry(LineSym, DwarfLoc, LineStreamLabel, DefLoc);
284+
getMCLineSections().addLineEntry(LineEntry, MCOS->getCurrentSectionOnly());
285+
}
286+
257287
//
258288
// This emits the Dwarf file and the line tables.
259289
//

llvm/lib/MC/MCObjectStreamer.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -467,20 +467,24 @@ void MCObjectStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
467467
}
468468

469469
void MCObjectStreamer::emitDwarfLineEndEntry(MCSection *Section,
470-
MCSymbol *LastLabel) {
471-
// Emit a DW_LNE_end_sequence for the end of the section.
472-
// Use the section end label to compute the address delta and use INT64_MAX
473-
// as the line delta which is the signal that this is actually a
470+
MCSymbol *LastLabel,
471+
MCSymbol *EndLabel) {
472+
// Emit a DW_LNE_end_sequence into the line table. When EndLabel is null, it
473+
// means we should emit the entry for the end of the section and therefore we
474+
// use the section end label for the reference label. After having the
475+
// appropriate reference label, we emit the address delta and use INT64_MAX as
476+
// the line delta which is the signal that this is actually a
474477
// DW_LNE_end_sequence.
475-
MCSymbol *SectionEnd = endSection(Section);
478+
if (!EndLabel)
479+
EndLabel = endSection(Section);
476480

477481
// Switch back the dwarf line section, in case endSection had to switch the
478482
// section.
479483
MCContext &Ctx = getContext();
480484
switchSection(Ctx.getObjectFileInfo()->getDwarfLineSection());
481485

482486
const MCAsmInfo *AsmInfo = Ctx.getAsmInfo();
483-
emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd,
487+
emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, EndLabel,
484488
AsmInfo->getCodePointerSize());
485489
}
486490

llvm/lib/MC/MCParser/AsmParser.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ class AsmParser : public MCAsmParser {
485485
DK_FILE,
486486
DK_LINE,
487487
DK_LOC,
488+
DK_LOC_LABEL,
488489
DK_STABS,
489490
DK_CV_FILE,
490491
DK_CV_FUNC_ID,
@@ -580,10 +581,11 @@ class AsmParser : public MCAsmParser {
580581
// ".align{,32}", ".p2align{,w,l}"
581582
bool parseDirectiveAlign(bool IsPow2, unsigned ValueSize);
582583

583-
// ".file", ".line", ".loc", ".stabs"
584+
// ".file", ".line", ".loc", ".loc_label", ".stabs"
584585
bool parseDirectiveFile(SMLoc DirectiveLoc);
585586
bool parseDirectiveLine();
586587
bool parseDirectiveLoc();
588+
bool parseDirectiveLocLabel(SMLoc DirectiveLoc);
587589
bool parseDirectiveStabs();
588590

589591
// ".cv_file", ".cv_func_id", ".cv_inline_site_id", ".cv_loc", ".cv_linetable",
@@ -2156,6 +2158,8 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
21562158
return parseDirectiveLine();
21572159
case DK_LOC:
21582160
return parseDirectiveLoc();
2161+
case DK_LOC_LABEL:
2162+
return parseDirectiveLocLabel(IDLoc);
21592163
case DK_STABS:
21602164
return parseDirectiveStabs();
21612165
case DK_CV_FILE:
@@ -3733,6 +3737,19 @@ bool AsmParser::parseDirectiveLoc() {
37333737
return false;
37343738
}
37353739

3740+
/// parseDirectiveLoc
3741+
/// ::= .loc_label label
3742+
bool AsmParser::parseDirectiveLocLabel(SMLoc DirectiveLoc) {
3743+
StringRef Name;
3744+
DirectiveLoc = Lexer.getLoc();
3745+
if (parseIdentifier(Name))
3746+
return TokError("expected identifier");
3747+
if (parseEOL())
3748+
return true;
3749+
getStreamer().emitDwarfLocLabelDirective(DirectiveLoc, Name);
3750+
return false;
3751+
}
3752+
37363753
/// parseDirectiveStabs
37373754
/// ::= .stabs string, number, number, number
37383755
bool AsmParser::parseDirectiveStabs() {
@@ -5541,6 +5558,7 @@ void AsmParser::initializeDirectiveKindMap() {
55415558
DirectiveKindMap[".file"] = DK_FILE;
55425559
DirectiveKindMap[".line"] = DK_LINE;
55435560
DirectiveKindMap[".loc"] = DK_LOC;
5561+
DirectiveKindMap[".loc_label"] = DK_LOC_LABEL;
55445562
DirectiveKindMap[".stabs"] = DK_STABS;
55455563
DirectiveKindMap[".cv_file"] = DK_CV_FILE;
55465564
DirectiveKindMap[".cv_func_id"] = DK_CV_FUNC_ID;

llvm/lib/MC/MCStreamer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,12 @@ void MCStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
267267
Discriminator);
268268
}
269269

270+
void MCStreamer::emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name) {
271+
getContext()
272+
.getMCDwarfLineTable(getContext().getDwarfCompileUnitID())
273+
.endCurrentSeqAndEmitLineStreamLabel(this, Loc, Name);
274+
}
275+
270276
MCSymbol *MCStreamer::getDwarfLineTableSymbol(unsigned CUID) {
271277
MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
272278
if (!Table.getLabel()) {

llvm/test/MC/ELF/debug-loc-label.s

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Verify that the .loc_label instruction resets the line sequence and generates
2+
// the requested label at the correct position in the line stream
3+
4+
// RUN: llvm-mc -filetype obj -triple x86_64 %s -o %t.o
5+
// RUN: llvm-dwarfdump -v --debug-line %t.o | FileCheck %s --check-prefix=CHECK-LINE-TABLE
6+
// RUN: llvm-readelf -s %t.o | FileCheck %s --check-prefix=CHECK-SYM
7+
// RUN: llvm-objdump -s -j .offsets %t.o | FileCheck %s --check-prefix=CHECK-OFFSETS
8+
9+
// RUN: not llvm-mc -filetype obj -triple x86_64 --defsym ERR=1 %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR --implicit-check-not=error:
10+
// RUN: not llvm-mc -filetype obj -triple x86_64 --defsym ERR2=1 %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR2 --implicit-check-not=error:
11+
12+
13+
14+
# CHECK-LINE-TABLE: Address Line Column File ISA Discriminator OpIndex Flags
15+
# CHECK-LINE-TABLE-NEXT: ------------------ ------ ------ ------ --- ------------- ------- -------------
16+
# CHECK-LINE-TABLE-NEXT: 0x00000028: 05 DW_LNS_set_column (1)
17+
# CHECK-LINE-TABLE-NEXT: 0x0000002a: 00 DW_LNE_set_address (0x0000000000000000)
18+
# CHECK-LINE-TABLE-NEXT: 0x00000035: 01 DW_LNS_copy
19+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000000 1 1 1 0 0 0 is_stmt
20+
# CHECK-LINE-TABLE-NEXT: 0x00000036: 00 DW_LNE_end_sequence
21+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000000 1 1 1 0 0 0 is_stmt end_sequence
22+
# CHECK-LINE-TABLE-NEXT: 0x00000039: 05 DW_LNS_set_column (2)
23+
# CHECK-LINE-TABLE-NEXT: 0x0000003b: 00 DW_LNE_set_address (0x0000000000000008)
24+
# CHECK-LINE-TABLE-NEXT: 0x00000046: 01 DW_LNS_copy
25+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000008 1 2 1 0 0 0 is_stmt
26+
# CHECK-LINE-TABLE-NEXT: 0x00000047: 00 DW_LNE_end_sequence
27+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000008 1 2 1 0 0 0 is_stmt end_sequence
28+
# CHECK-LINE-TABLE-NEXT: 0x0000004a: 05 DW_LNS_set_column (3)
29+
# CHECK-LINE-TABLE-NEXT: 0x0000004c: 00 DW_LNE_set_address (0x0000000000000010)
30+
# CHECK-LINE-TABLE-NEXT: 0x00000057: 01 DW_LNS_copy
31+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000010 1 3 1 0 0 0 is_stmt
32+
# CHECK-LINE-TABLE-NEXT: 0x00000058: 00 DW_LNE_end_sequence
33+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000010 1 3 1 0 0 0 is_stmt end_sequence
34+
# CHECK-LINE-TABLE-NEXT: 0x0000005b: 05 DW_LNS_set_column (4)
35+
# CHECK-LINE-TABLE-NEXT: 0x0000005d: 00 DW_LNE_set_address (0x0000000000000018)
36+
# CHECK-LINE-TABLE-NEXT: 0x00000068: 01 DW_LNS_copy
37+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000018 1 4 1 0 0 0 is_stmt
38+
# CHECK-LINE-TABLE-NEXT: 0x00000069: 05 DW_LNS_set_column (5)
39+
# CHECK-LINE-TABLE-NEXT: 0x0000006b: 01 DW_LNS_copy
40+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000018 1 5 1 0 0 0 is_stmt
41+
# CHECK-LINE-TABLE-NEXT: 0x0000006c: 00 DW_LNE_end_sequence
42+
# CHECK-LINE-TABLE-NEXT: 0x0000000000000018 1 5 1 0 0 0 is_stmt end_sequence
43+
44+
# CHECK-SYM: Symbol table '.symtab' contains 9 entries:
45+
# CHECK-SYM-NEXT: Num: Value Size Type Bind Vis Ndx Name
46+
# CHECK-SYM-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
47+
# CHECK-SYM-NEXT: 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.c
48+
# CHECK-SYM-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 2 .text
49+
# CHECK-SYM-NEXT: 3: 0000000000000039 0 NOTYPE LOCAL DEFAULT 3 my_label_02
50+
# CHECK-SYM-NEXT: 4: 000000000000004a 0 NOTYPE LOCAL DEFAULT 3 my_label_03
51+
# CHECK-SYM-NEXT: 5: 000000000000005b 0 NOTYPE LOCAL DEFAULT 3 my_label_04
52+
# CHECK-SYM-NEXT: 6: 000000000000004a 0 NOTYPE LOCAL DEFAULT 3 my_label_03.1
53+
# CHECK-SYM-NEXT: 7: 000000000000006f 0 NOTYPE LOCAL DEFAULT 3 my_label_05
54+
# CHECK-SYM-NEXT: 8: 0000000000000000 0 FUNC GLOBAL DEFAULT 2 foo
55+
56+
# CHECK-OFFSETS: 0000 39000000 4a000000 5b000000
57+
58+
.text
59+
.file "test.c"
60+
.globl foo
61+
.align 16, 0x90
62+
.type foo,@function
63+
foo:
64+
.Lfunc_begin0:
65+
.file 1 "test.c"
66+
.cfi_startproc
67+
.loc 1 1 1
68+
mov %rax, 0x01
69+
.loc_label my_label_02
70+
.loc 1 1 2
71+
mov %rax, 0x02
72+
.loc 1 1 3
73+
.loc_label my_label_03
74+
.loc_label my_label_03.1
75+
mov %rax, 0x03
76+
.loc 1 1 4
77+
.loc_label my_label_04
78+
.loc 1 1 5
79+
.ifdef ERR
80+
.loc_label my_label_04
81+
# ERR: [[#@LINE+1]]:13: error: expected identifier
82+
.loc_label
83+
# ERR: [[#@LINE+1]]:19: error: expected newline
84+
.loc_label aaaa bbbb
85+
.endif
86+
.ifdef ERR2
87+
# ERR2: [[#@LINE+1]]:14: error: symbol 'my_label_04' is already defined
88+
.loc_label my_label_04
89+
.endif
90+
mov %rax, 0x04
91+
.loc_label my_label_05
92+
ret
93+
.cfi_endproc
94+
95+
.section .debug_line,"",@progbits
96+
.Lline_table_start0:
97+
98+
.section .offsets,"",@progbits
99+
.long my_label_02-.Lline_table_start0
100+
.long my_label_03-.Lline_table_start0
101+
.long my_label_04-.Lline_table_start0

0 commit comments

Comments
 (0)