Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions llvm/lib/MC/MCDwarf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,37 +181,47 @@ void MCDwarfLineTable::emitOne(

unsigned FileNum, LastLine, Column, Flags, Isa, Discriminator;
bool IsAtStartSeq;
MCSymbol *LastLabel;
MCSymbol *PrevLabel;
auto init = [&]() {
FileNum = 1;
LastLine = 1;
Column = 0;
Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
Isa = 0;
Discriminator = 0;
LastLabel = nullptr;
PrevLabel = nullptr;
IsAtStartSeq = true;
};
init();

// Loop through each MCDwarfLineEntry and encode the dwarf line number table.
bool EndEntryEmitted = false;
for (const MCDwarfLineEntry &LineEntry : LineEntries) {
MCSymbol *Label = LineEntry.getLabel();
for (auto It = LineEntries.begin(); It != LineEntries.end(); ++It) {
auto LineEntry = *It;
MCSymbol *CurrLabel = LineEntry.getLabel();
const MCAsmInfo *asmInfo = MCOS->getContext().getAsmInfo();

if (LineEntry.LineStreamLabel) {
if (!IsAtStartSeq) {
MCOS->emitDwarfLineEndEntry(Section, LastLabel,
/*EndLabel =*/LastLabel);
auto *Label = CurrLabel;
auto NextIt = It + 1;
// LineEntry with a null Label is probably a fake LineEntry we added
// when `-emit-func-debug-line-table-offsets` in order to terminate the
// sequence. Look for the next Label if possible, otherwise we will set
// the PC to the end of the section.
if (!Label && NextIt != LineEntries.end()) {
Label = NextIt->getLabel();
}
MCOS->emitDwarfLineEndEntry(Section, PrevLabel,
/*EndLabel =*/Label);
init();
}
MCOS->emitLabel(LineEntry.LineStreamLabel, LineEntry.StreamLabelDefLoc);
continue;
}

if (LineEntry.IsEndEntry) {
MCOS->emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, Label,
MCOS->emitDwarfAdvanceLineAddr(INT64_MAX, PrevLabel, CurrLabel,
asmInfo->getCodePointerSize());
init();
EndEntryEmitted = true;
Expand Down Expand Up @@ -258,12 +268,12 @@ void MCDwarfLineTable::emitOne(
// At this point we want to emit/create the sequence to encode the delta in
// line numbers and the increment of the address from the previous Label
// and the current Label.
MCOS->emitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label,
MCOS->emitDwarfAdvanceLineAddr(LineDelta, PrevLabel, CurrLabel,
asmInfo->getCodePointerSize());

Discriminator = 0;
LastLine = LineEntry.getLine();
LastLabel = Label;
PrevLabel = CurrLabel;
IsAtStartSeq = false;
}

Expand All @@ -273,7 +283,7 @@ void MCDwarfLineTable::emitOne(
// does not track ranges nor terminate the line table. In that case,
// conservatively use the section end symbol to end the line table.
if (!EndEntryEmitted && !IsAtStartSeq)
MCOS->emitDwarfLineEndEntry(Section, LastLabel);
MCOS->emitDwarfLineEndEntry(Section, PrevLabel);
}

void MCDwarfLineTable::endCurrentSeqAndEmitLineStreamLabel(MCStreamer *MCOS,
Expand Down
98 changes: 98 additions & 0 deletions llvm/test/DebugInfo/ARM/stmt_seq_macho.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// RUN: split-file %s %t

// RUN: clang++ --target=arm64-apple-macos11 \
// RUN: %t/stmt_seq_macho.cpp -o %t/stmt_seq_macho.o \
// RUN: -g -Oz -gdwarf-4 -c -mno-outline \
// RUN: -mllvm -emit-func-debug-line-table-offsets \
// RUN: -fdebug-compilation-dir=/private/tmp/stmt_seq \
// RUN: -fno-unwind-tables -fno-exceptions

// RUN: llvm-dwarfdump -all %t/stmt_seq_macho.o | FileCheck %s

// CHECK: Address Line Column File ISA Discriminator OpIndex Flags
// CHECK-NEXT: ------------------ ------ ------ ------ --- ------------- ------- -------------
// CHECK-NEXT: 0x0000000000000000 2 33 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x0000000000000004 2 33 1 0 0 0 is_stmt end_sequence
// CHECK-NEXT: 0x0000000000000004 3 33 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x0000000000000008 3 33 1 0 0 0 is_stmt end_sequence
// CHECK-NEXT: 0x0000000000000008 4 33 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x000000000000000c 4 33 1 0 0 0 is_stmt end_sequence
// CHECK-NEXT: 0x000000000000000c 7 10 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x0000000000000010 7 3 1 0 0 0
// CHECK-NEXT: 0x0000000000000014 7 3 1 0 0 0 end_sequence
// CHECK-NEXT: 0x0000000000000014 12 14 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x0000000000000018 12 5 1 0 0 0
// CHECK-NEXT: 0x000000000000001c 12 5 1 0 0 0 end_sequence
// CHECK-NEXT: 0x000000000000001c 16 14 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x0000000000000020 16 5 1 0 0 0
// CHECK-NEXT: 0x0000000000000024 16 5 1 0 0 0 end_sequence
// CHECK-NEXT: 0x0000000000000024 21 14 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x0000000000000028 21 5 1 0 0 0
// CHECK-NEXT: 0x000000000000002c 21 5 1 0 0 0 end_sequence
// CHECK-NEXT: 0x000000000000002c 25 20 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x0000000000000030 26 5 1 0 0 0 is_stmt
// CHECK-NEXT: 0x0000000000000034 26 5 1 0 0 0 is_stmt end_sequence
// CHECK-NEXT: 0x0000000000000034 37 0 1 0 0 0 is_stmt
// CHECK-NEXT: 0x0000000000000044 39 12 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x0000000000000050 40 12 1 0 0 0 is_stmt
// CHECK-NEXT: 0x0000000000000058 40 9 1 0 0 0 is_stmt
// CHECK-NEXT: 0x000000000000005c 41 12 1 0 0 0 is_stmt
// CHECK-NEXT: 0x0000000000000068 42 12 1 0 0 0 is_stmt
// CHECK-NEXT: 0x0000000000000070 41 9 1 0 0 0 is_stmt
// CHECK-NEXT: 0x0000000000000074 46 18 1 0 0 0 is_stmt
// CHECK-NEXT: 0x0000000000000084 42 9 1 0 0 0 is_stmt
// CHECK-NEXT: 0x0000000000000088 47 5 1 0 0 0 is_stmt epilogue_begin
// CHECK-NEXT: 0x0000000000000098 47 5 1 0 0 0 is_stmt end_sequence
// CHECK-NEXT: 0x0000000000000098 34 85 1 0 0 0 is_stmt prologue_end
// CHECK-NEXT: 0x000000000000009c 34 85 1 0 0 0 is_stmt end_sequence
// CHECK-NEXT: 0x000000000000009c 34 86 1 0 0 0 is_stmt prologue_end

#--- stmt_seq_macho.cpp
#define ATTRIB extern "C" __attribute__((noinline))
ATTRIB void function_empty_1() {}
ATTRIB void function_empty_2() {}
ATTRIB void function_empty_3() {}

ATTRIB int function1_copy1(int a) {
return ++a;
}

ATTRIB int function3_copy1(int a) {
int b = a + 3;
return b + 1;
}

ATTRIB int function2_copy1(int a) {
return a - 22;
}

ATTRIB int function3_copy2(int a) {
int b = a + 3;
return b + 1;
}

ATTRIB int function2_copy2(int a) {
int result = a - 22;
return result;
}

struct logic_error {
logic_error(const char* s) {}
};

struct length_error : public logic_error {
__attribute__((noinline)) explicit length_error(const char* s) : logic_error(s) {}
};

int main() {
int sum = 0;
sum += function2_copy2(3);
sum += function3_copy2(41);
sum += function2_copy1(11);
sum += function1_copy1(42);
function_empty_1();
function_empty_2();
function_empty_3();
length_error e("test");
return sum;
}
29 changes: 15 additions & 14 deletions llvm/test/DebugInfo/X86/DW_AT_LLVM_stmt_seq_sec_offset.ll
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
; STMT_SEQ: DW_AT_LLVM_stmt_sequence [DW_FORM_sec_offset] (0x00000043)
; STMT_SEQ: DW_AT_name {{.*}}func01
; STMT_SEQ: DW_TAG_subprogram [[[ABBREV_CODE2]]]
; STMT_SEQ: DW_AT_LLVM_stmt_sequence [DW_FORM_sec_offset] (0x00000056)
; STMT_SEQ: DW_AT_LLVM_stmt_sequence [DW_FORM_sec_offset] (0x00000058)
; STMT_SEQ: DW_AT_name {{.*}}main

;; Check the entire line sequence to see that it's correct
Expand All @@ -29,22 +29,23 @@
; STMT_SEQ-NEXT: 0x00000050: 05 DW_LNS_set_column (3)
; STMT_SEQ-NEXT: 0x00000052: 67 address += 6, line += 1, op-index += 0
; STMT_SEQ-NEXT: 0x0000000000000006 6 3 0 0 0 0 is_stmt
; STMT_SEQ-NEXT: 0x00000053: 00 DW_LNE_end_sequence
; STMT_SEQ-NEXT: 0x0000000000000006 6 3 0 0 0 0 is_stmt end_sequence
; STMT_SEQ-NEXT: 0x00000056: 04 DW_LNS_set_file (0)
; STMT_SEQ-NEXT: 0x00000058: 00 DW_LNE_set_address (0x00000008)
; STMT_SEQ-NEXT: 0x0000005f: 03 DW_LNS_advance_line (10)
; STMT_SEQ-NEXT: 0x00000061: 01 DW_LNS_copy
; STMT_SEQ-NEXT: 0x00000053: 02 DW_LNS_advance_pc (addr += 2, op-index += 0)
; STMT_SEQ-NEXT: 0x00000055: 00 DW_LNE_end_sequence
; STMT_SEQ-NEXT: 0x0000000000000008 6 3 0 0 0 0 is_stmt end_sequence
; STMT_SEQ-NEXT: 0x00000058: 04 DW_LNS_set_file (0)
; STMT_SEQ-NEXT: 0x0000005a: 00 DW_LNE_set_address (0x00000008)
; STMT_SEQ-NEXT: 0x00000061: 03 DW_LNS_advance_line (10)
; STMT_SEQ-NEXT: 0x00000063: 01 DW_LNS_copy
; STMT_SEQ-NEXT: 0x0000000000000008 10 0 0 0 0 0 is_stmt
; STMT_SEQ-NEXT: 0x00000062: 05 DW_LNS_set_column (10)
; STMT_SEQ-NEXT: 0x00000064: 0a DW_LNS_set_prologue_end
; STMT_SEQ-NEXT: 0x00000065: 83 address += 8, line += 1, op-index += 0
; STMT_SEQ-NEXT: 0x00000064: 05 DW_LNS_set_column (10)
; STMT_SEQ-NEXT: 0x00000066: 0a DW_LNS_set_prologue_end
; STMT_SEQ-NEXT: 0x00000067: 83 address += 8, line += 1, op-index += 0
; STMT_SEQ-NEXT: 0x0000000000000010 11 10 0 0 0 0 is_stmt prologue_end
; STMT_SEQ-NEXT: 0x00000066: 05 DW_LNS_set_column (3)
; STMT_SEQ-NEXT: 0x00000068: 9f address += 10, line += 1, op-index += 0
; STMT_SEQ-NEXT: 0x00000068: 05 DW_LNS_set_column (3)
; STMT_SEQ-NEXT: 0x0000006a: 9f address += 10, line += 1, op-index += 0
; STMT_SEQ-NEXT: 0x000000000000001a 12 3 0 0 0 0 is_stmt
; STMT_SEQ-NEXT: 0x00000069: 02 DW_LNS_advance_pc (addr += 5, op-index += 0)
; STMT_SEQ-NEXT: 0x0000006b: 00 DW_LNE_end_sequence
; STMT_SEQ-NEXT: 0x0000006b: 02 DW_LNS_advance_pc (addr += 5, op-index += 0)
; STMT_SEQ-NEXT: 0x0000006d: 00 DW_LNE_end_sequence
; STMT_SEQ-NEXT: 0x000000000000001f 12 3 0 0 0 0 is_stmt end_sequence

; generated from:
Expand Down
54 changes: 29 additions & 25 deletions llvm/test/MC/ELF/debug-loc-label.s
Original file line number Diff line number Diff line change
Expand Up @@ -17,43 +17,47 @@
# CHECK-LINE-TABLE-NEXT: 0x0000002a: 00 DW_LNE_set_address (0x0000000000000000)
# CHECK-LINE-TABLE-NEXT: 0x00000035: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x0000000000000000 1 1 1 0 0 0 is_stmt
# CHECK-LINE-TABLE-NEXT: 0x00000036: 00 DW_LNE_end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000000000000000 1 1 1 0 0 0 is_stmt end_sequence
# CHECK-LINE-TABLE-NEXT: 0x00000039: 05 DW_LNS_set_column (2)
# CHECK-LINE-TABLE-NEXT: 0x0000003b: 00 DW_LNE_set_address (0x0000000000000008)
# CHECK-LINE-TABLE-NEXT: 0x00000046: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x00000036: 02 DW_LNS_advance_pc (addr += 8, op-index += 0)
# CHECK-LINE-TABLE-NEXT: 0x00000038: 00 DW_LNE_end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000000000000008 1 1 1 0 0 0 is_stmt end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000003b: 05 DW_LNS_set_column (2)
# CHECK-LINE-TABLE-NEXT: 0x0000003d: 00 DW_LNE_set_address (0x0000000000000008)
# CHECK-LINE-TABLE-NEXT: 0x00000048: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x0000000000000008 1 2 1 0 0 0 is_stmt
# CHECK-LINE-TABLE-NEXT: 0x00000047: 00 DW_LNE_end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000000000000008 1 2 1 0 0 0 is_stmt end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000004a: 05 DW_LNS_set_column (3)
# CHECK-LINE-TABLE-NEXT: 0x0000004c: 00 DW_LNE_set_address (0x0000000000000010)
# CHECK-LINE-TABLE-NEXT: 0x00000057: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x00000049: 02 DW_LNS_advance_pc (addr += 8, op-index += 0)
# CHECK-LINE-TABLE-NEXT: 0x0000004b: 00 DW_LNE_end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000000000000010 1 2 1 0 0 0 is_stmt end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000004e: 05 DW_LNS_set_column (3)
# CHECK-LINE-TABLE-NEXT: 0x00000050: 00 DW_LNE_set_address (0x0000000000000010)
# CHECK-LINE-TABLE-NEXT: 0x0000005b: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x0000000000000010 1 3 1 0 0 0 is_stmt
# CHECK-LINE-TABLE-NEXT: 0x00000058: 00 DW_LNE_end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000000000000010 1 3 1 0 0 0 is_stmt end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000005b: 05 DW_LNS_set_column (4)
# CHECK-LINE-TABLE-NEXT: 0x0000005d: 00 DW_LNE_set_address (0x0000000000000018)
# CHECK-LINE-TABLE-NEXT: 0x00000068: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x0000005c: 02 DW_LNS_advance_pc (addr += 8, op-index += 0)
# CHECK-LINE-TABLE-NEXT: 0x0000005e: 00 DW_LNE_end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000000000000018 1 3 1 0 0 0 is_stmt end_sequence
# CHECK-LINE-TABLE-NEXT: 0x00000061: 05 DW_LNS_set_column (4)
# CHECK-LINE-TABLE-NEXT: 0x00000063: 00 DW_LNE_set_address (0x0000000000000018)
# CHECK-LINE-TABLE-NEXT: 0x0000006e: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x0000000000000018 1 4 1 0 0 0 is_stmt
# CHECK-LINE-TABLE-NEXT: 0x00000069: 05 DW_LNS_set_column (5)
# CHECK-LINE-TABLE-NEXT: 0x0000006b: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x0000006f: 05 DW_LNS_set_column (5)
# CHECK-LINE-TABLE-NEXT: 0x00000071: 01 DW_LNS_copy
# CHECK-LINE-TABLE-NEXT: 0x0000000000000018 1 5 1 0 0 0 is_stmt
# CHECK-LINE-TABLE-NEXT: 0x0000006c: 00 DW_LNE_end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000000000000018 1 5 1 0 0 0 is_stmt end_sequence
# CHECK-LINE-TABLE-NEXT: 0x00000072: 02 DW_LNS_advance_pc (addr += 8, op-index += 0)
# CHECK-LINE-TABLE-NEXT: 0x00000074: 00 DW_LNE_end_sequence
# CHECK-LINE-TABLE-NEXT: 0x0000000000000020 1 5 1 0 0 0 is_stmt end_sequence

# CHECK-SYM: Symbol table '.symtab' contains 9 entries:
# CHECK-SYM-NEXT: Num: Value Size Type Bind Vis Ndx Name
# CHECK-SYM-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
# CHECK-SYM-NEXT: 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.c
# CHECK-SYM-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 2 .text
# CHECK-SYM-NEXT: 3: 0000000000000039 0 NOTYPE LOCAL DEFAULT 3 my_label_02
# CHECK-SYM-NEXT: 4: 000000000000004a 0 NOTYPE LOCAL DEFAULT 3 my_label_03
# CHECK-SYM-NEXT: 5: 000000000000005b 0 NOTYPE LOCAL DEFAULT 3 my_label_04
# CHECK-SYM-NEXT: 6: 000000000000004a 0 NOTYPE LOCAL DEFAULT 3 my_label_03.1
# CHECK-SYM-NEXT: 7: 000000000000006f 0 NOTYPE LOCAL DEFAULT 3 my_label_05
# CHECK-SYM-NEXT: 3: 000000000000003b 0 NOTYPE LOCAL DEFAULT 3 my_label_02
# CHECK-SYM-NEXT: 4: 000000000000004e 0 NOTYPE LOCAL DEFAULT 3 my_label_03
# CHECK-SYM-NEXT: 5: 0000000000000061 0 NOTYPE LOCAL DEFAULT 3 my_label_04
# CHECK-SYM-NEXT: 6: 000000000000004e 0 NOTYPE LOCAL DEFAULT 3 my_label_03.1
# CHECK-SYM-NEXT: 7: 0000000000000077 0 NOTYPE LOCAL DEFAULT 3 my_label_05
# CHECK-SYM-NEXT: 8: 0000000000000000 0 FUNC GLOBAL DEFAULT 2 foo

# CHECK-OFFSETS: 0000 39000000 4a000000 5b000000
# CHECK-OFFSETS: 0000 3b000000 4e000000 61000000

.text
.file "test.c"
Expand Down