[llvm] b6c06d1 - [ORC] Fix bug in source file name finding in DebuggerSupportPlugin.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 2 20:45:51 PST 2025
Author: Lang Hames
Date: 2025-01-03T15:45:43+11:00
New Revision: b6c06d1a8d9b359e7319312a2a7654f0e7c6690c
URL: https://github.com/llvm/llvm-project/commit/b6c06d1a8d9b359e7319312a2a7654f0e7c6690c
DIFF: https://github.com/llvm/llvm-project/commit/b6c06d1a8d9b359e7319312a2a7654f0e7c6690c.diff
LOG: [ORC] Fix bug in source file name finding in DebuggerSupportPlugin.
The debug section map was using MachO section names (with the "__" prefix), but
DWARFContext expects section names with the object format prefix stripped off.
This was preventing DWARFContext from accessing the debug_str section,
resulting in bogus source name strings.
Added:
llvm/test/ExecutionEngine/JITLink/x86-64/MachO-check-dwarf-filename.s
Modified:
llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.cpp b/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.cpp
index c08e52e943c924..0d9a912e25606c 100644
--- a/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.cpp
@@ -148,7 +148,7 @@ class MachODebugObjectSynthesizer : public MachODebugObjectSynthesizerBase {
DSec.BuilderSec->align = Log2_64(SR.getFirstBlock()->getAlignment());
StringRef SectionData(SR.getFirstBlock()->getContent().data(),
SR.getFirstBlock()->getSize());
- DebugSectionMap[SecName] =
+ DebugSectionMap[SecName.drop_front(2)] = // drop "__" prefix.
MemoryBuffer::getMemBuffer(SectionData, G.getName(), false);
if (SecName == "__debug_line")
DebugLineSectionData = SectionData;
@@ -167,11 +167,10 @@ class MachODebugObjectSynthesizer : public MachODebugObjectSynthesizerBase {
DebugLineSectionData, G.getEndianness() == llvm::endianness::little,
G.getPointerSize());
uint64_t Offset = 0;
- DWARFDebugLine::LineTable LineTable;
+ DWARFDebugLine::Prologue P;
// Try to parse line data. Consume error on failure.
- if (auto Err = LineTable.parse(DebugLineData, &Offset, *DWARFCtx, nullptr,
- consumeError)) {
+ if (auto Err = P.parse(DebugLineData, &Offset, consumeError, *DWARFCtx)) {
handleAllErrors(std::move(Err), [&](ErrorInfoBase &EIB) {
LLVM_DEBUG({
dbgs() << "Cannot parse line table for \"" << G.getName() << "\": ";
@@ -180,15 +179,26 @@ class MachODebugObjectSynthesizer : public MachODebugObjectSynthesizerBase {
});
});
} else {
- if (!LineTable.Prologue.FileNames.empty())
- FileName = *dwarf::toString(LineTable.Prologue.FileNames[0].Name);
+ for (auto &FN : P.FileNames)
+ if ((FileName = dwarf::toString(FN.Name))) {
+ LLVM_DEBUG({
+ dbgs() << "Using FileName = \"" << *FileName
+ << "\" from DWARF line table\n";
+ });
+ break;
+ }
}
}
// If no line table (or unable to use) then use graph name.
// FIXME: There are probably other debug sections we should look in first.
- if (!FileName)
- FileName = StringRef(G.getName());
+ if (!FileName) {
+ LLVM_DEBUG({
+ dbgs() << "Could not find source name from DWARF line table. "
+ "Using FileName = \"\"\n";
+ });
+ FileName = "";
+ }
Builder.addSymbol("", MachO::N_SO, 0, 0, 0);
Builder.addSymbol(*FileName, MachO::N_SO, 0, 0, 0);
diff --git a/llvm/test/ExecutionEngine/JITLink/x86-64/MachO-check-dwarf-filename.s b/llvm/test/ExecutionEngine/JITLink/x86-64/MachO-check-dwarf-filename.s
new file mode 100644
index 00000000000000..058ef55fd1e3c1
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/x86-64/MachO-check-dwarf-filename.s
@@ -0,0 +1,315 @@
+# RUN: llvm-mc -triple=x86_64-apple-macosx10.9 -filetype=obj -o %t.o %s
+# RUN: llvm-jitlink -debug-only=orc -noexec -debugger-support %t.o 2>&1 | \
+# RUN: FileCheck %s
+#
+# Test that source file names can be indentified from DWARF line tables.
+
+# CHECK: Using FileName = "check-dwarf-filename.c" from DWARF line table
+
+ .section __TEXT,__text,regular,pure_instructions
+ .build_version macos, 15, 0 sdk_version 15, 0
+ .globl _main ## -- Begin function main
+ .p2align 4, 0x90
+_main: ## @main
+Lfunc_begin0:
+ .file 0 "/Users/lhames/Projects/scratch" "check-dwarf-filename.c" md5 0x331a6c7ae0cfcd2896eca60ac6f5703e
+ .loc 0 1 0 ## check-dwarf-filename.c:1:0
+ .cfi_startproc
+## %bb.0:
+ ##DEBUG_VALUE: main:argc <- $edi
+ ##DEBUG_VALUE: main:argv <- $rsi
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ .cfi_offset %rbp, -16
+ movq %rsp, %rbp
+ .cfi_def_cfa_register %rbp
+Ltmp0:
+ .loc 0 2 3 prologue_end ## check-dwarf-filename.c:2:3
+ xorl %eax, %eax
+ .loc 0 2 3 epilogue_begin is_stmt 0 ## check-dwarf-filename.c:2:3
+ popq %rbp
+ retq
+Ltmp1:
+Lfunc_end0:
+ .cfi_endproc
+ ## -- End function
+ .section __DWARF,__debug_abbrev,regular,debug
+Lsection_abbrev:
+ .byte 1 ## Abbreviation Code
+ .byte 17 ## DW_TAG_compile_unit
+ .byte 1 ## DW_CHILDREN_yes
+ .byte 37 ## DW_AT_producer
+ .byte 37 ## DW_FORM_strx1
+ .byte 19 ## DW_AT_language
+ .byte 5 ## DW_FORM_data2
+ .byte 3 ## DW_AT_name
+ .byte 37 ## DW_FORM_strx1
+ .ascii "\202|" ## DW_AT_LLVM_sysroot
+ .byte 37 ## DW_FORM_strx1
+ .ascii "\357\177" ## DW_AT_APPLE_sdk
+ .byte 37 ## DW_FORM_strx1
+ .byte 114 ## DW_AT_str_offsets_base
+ .byte 23 ## DW_FORM_sec_offset
+ .byte 16 ## DW_AT_stmt_list
+ .byte 23 ## DW_FORM_sec_offset
+ .byte 27 ## DW_AT_comp_dir
+ .byte 37 ## DW_FORM_strx1
+ .ascii "\341\177" ## DW_AT_APPLE_optimized
+ .byte 25 ## DW_FORM_flag_present
+ .byte 17 ## DW_AT_low_pc
+ .byte 27 ## DW_FORM_addrx
+ .byte 18 ## DW_AT_high_pc
+ .byte 6 ## DW_FORM_data4
+ .byte 115 ## DW_AT_addr_base
+ .byte 23 ## DW_FORM_sec_offset
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 2 ## Abbreviation Code
+ .byte 46 ## DW_TAG_subprogram
+ .byte 1 ## DW_CHILDREN_yes
+ .byte 17 ## DW_AT_low_pc
+ .byte 27 ## DW_FORM_addrx
+ .byte 18 ## DW_AT_high_pc
+ .byte 6 ## DW_FORM_data4
+ .byte 64 ## DW_AT_frame_base
+ .byte 24 ## DW_FORM_exprloc
+ .byte 122 ## DW_AT_call_all_calls
+ .byte 25 ## DW_FORM_flag_present
+ .byte 3 ## DW_AT_name
+ .byte 37 ## DW_FORM_strx1
+ .byte 58 ## DW_AT_decl_file
+ .byte 11 ## DW_FORM_data1
+ .byte 59 ## DW_AT_decl_line
+ .byte 11 ## DW_FORM_data1
+ .byte 39 ## DW_AT_prototyped
+ .byte 25 ## DW_FORM_flag_present
+ .byte 73 ## DW_AT_type
+ .byte 19 ## DW_FORM_ref4
+ .byte 63 ## DW_AT_external
+ .byte 25 ## DW_FORM_flag_present
+ .ascii "\341\177" ## DW_AT_APPLE_optimized
+ .byte 25 ## DW_FORM_flag_present
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 3 ## Abbreviation Code
+ .byte 5 ## DW_TAG_formal_parameter
+ .byte 0 ## DW_CHILDREN_no
+ .byte 2 ## DW_AT_location
+ .byte 24 ## DW_FORM_exprloc
+ .byte 3 ## DW_AT_name
+ .byte 37 ## DW_FORM_strx1
+ .byte 58 ## DW_AT_decl_file
+ .byte 11 ## DW_FORM_data1
+ .byte 59 ## DW_AT_decl_line
+ .byte 11 ## DW_FORM_data1
+ .byte 73 ## DW_AT_type
+ .byte 19 ## DW_FORM_ref4
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 4 ## Abbreviation Code
+ .byte 36 ## DW_TAG_base_type
+ .byte 0 ## DW_CHILDREN_no
+ .byte 3 ## DW_AT_name
+ .byte 37 ## DW_FORM_strx1
+ .byte 62 ## DW_AT_encoding
+ .byte 11 ## DW_FORM_data1
+ .byte 11 ## DW_AT_byte_size
+ .byte 11 ## DW_FORM_data1
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 5 ## Abbreviation Code
+ .byte 15 ## DW_TAG_pointer_type
+ .byte 0 ## DW_CHILDREN_no
+ .byte 73 ## DW_AT_type
+ .byte 19 ## DW_FORM_ref4
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 0 ## EOM(3)
+ .section __DWARF,__debug_info,regular,debug
+Lsection_info:
+Lcu_begin0:
+.set Lset0, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit
+ .long Lset0
+Ldebug_info_start0:
+ .short 5 ## DWARF version number
+ .byte 1 ## DWARF Unit Type
+ .byte 8 ## Address Size (in bytes)
+.set Lset1, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
+ .long Lset1
+ .byte 1 ## Abbrev [1] 0xc:0x50 DW_TAG_compile_unit
+ .byte 0 ## DW_AT_producer
+ .short 29 ## DW_AT_language
+ .byte 1 ## DW_AT_name
+ .byte 2 ## DW_AT_LLVM_sysroot
+ .byte 3 ## DW_AT_APPLE_sdk
+.set Lset2, Lstr_offsets_base0-Lsection_str_off ## DW_AT_str_offsets_base
+ .long Lset2
+.set Lset3, Lline_table_start0-Lsection_line ## DW_AT_stmt_list
+ .long Lset3
+ .byte 4 ## DW_AT_comp_dir
+ ## DW_AT_APPLE_optimized
+ .byte 0 ## DW_AT_low_pc
+.set Lset4, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
+ .long Lset4
+.set Lset5, Laddr_table_base0-Lsection_info0 ## DW_AT_addr_base
+ .long Lset5
+ .byte 2 ## Abbrev [2] 0x25:0x24 DW_TAG_subprogram
+ .byte 0 ## DW_AT_low_pc
+.set Lset6, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
+ .long Lset6
+ .byte 1 ## DW_AT_frame_base
+ .byte 86
+ ## DW_AT_call_all_calls
+ .byte 5 ## DW_AT_name
+ .byte 0 ## DW_AT_decl_file
+ .byte 1 ## DW_AT_decl_line
+ ## DW_AT_prototyped
+ .long 73 ## DW_AT_type
+ ## DW_AT_external
+ ## DW_AT_APPLE_optimized
+ .byte 3 ## Abbrev [3] 0x34:0xa DW_TAG_formal_parameter
+ .byte 1 ## DW_AT_location
+ .byte 85
+ .byte 7 ## DW_AT_name
+ .byte 0 ## DW_AT_decl_file
+ .byte 1 ## DW_AT_decl_line
+ .long 73 ## DW_AT_type
+ .byte 3 ## Abbrev [3] 0x3e:0xa DW_TAG_formal_parameter
+ .byte 1 ## DW_AT_location
+ .byte 84
+ .byte 8 ## DW_AT_name
+ .byte 0 ## DW_AT_decl_file
+ .byte 1 ## DW_AT_decl_line
+ .long 77 ## DW_AT_type
+ .byte 0 ## End Of Children Mark
+ .byte 4 ## Abbrev [4] 0x49:0x4 DW_TAG_base_type
+ .byte 6 ## DW_AT_name
+ .byte 5 ## DW_AT_encoding
+ .byte 4 ## DW_AT_byte_size
+ .byte 5 ## Abbrev [5] 0x4d:0x5 DW_TAG_pointer_type
+ .long 82 ## DW_AT_type
+ .byte 5 ## Abbrev [5] 0x52:0x5 DW_TAG_pointer_type
+ .long 87 ## DW_AT_type
+ .byte 4 ## Abbrev [4] 0x57:0x4 DW_TAG_base_type
+ .byte 9 ## DW_AT_name
+ .byte 6 ## DW_AT_encoding
+ .byte 1 ## DW_AT_byte_size
+ .byte 0 ## End Of Children Mark
+Ldebug_info_end0:
+ .section __DWARF,__debug_str_offs,regular,debug
+Lsection_str_off:
+ .long 44 ## Length of String Offsets Set
+ .short 5
+ .short 0
+Lstr_offsets_base0:
+ .section __DWARF,__debug_str,regular,debug
+Linfo_string:
+ .asciz "Apple clang version 16.0.0 (clang-1600.0.26.3)" ## string offset=0
+ .asciz "check-dwarf-filename.c" ## string offset=47
+ .asciz "/Library/Developer/CommandLineTools/SDKs/MacOSX15.0.sdk" ## string offset=70
+ .asciz "MacOSX15.0.sdk" ## string offset=126
+ .asciz "/Users/lhames/Projects/scratch" ## string offset=141
+ .asciz "main" ## string offset=172
+ .asciz "int" ## string offset=177
+ .asciz "argc" ## string offset=181
+ .asciz "argv" ## string offset=186
+ .asciz "char" ## string offset=191
+ .section __DWARF,__debug_str_offs,regular,debug
+ .long 0
+ .long 47
+ .long 70
+ .long 126
+ .long 141
+ .long 172
+ .long 177
+ .long 181
+ .long 186
+ .long 191
+ .section __DWARF,__debug_addr,regular,debug
+Lsection_info0:
+.set Lset7, Ldebug_addr_end0-Ldebug_addr_start0 ## Length of contribution
+ .long Lset7
+Ldebug_addr_start0:
+ .short 5 ## DWARF version number
+ .byte 8 ## Address size
+ .byte 0 ## Segment selector size
+Laddr_table_base0:
+ .quad Lfunc_begin0
+Ldebug_addr_end0:
+ .section __DWARF,__debug_names,regular,debug
+Ldebug_names_begin:
+.set Lset8, Lnames_end0-Lnames_start0 ## Header: unit length
+ .long Lset8
+Lnames_start0:
+ .short 5 ## Header: version
+ .short 0 ## Header: padding
+ .long 1 ## Header: compilation unit count
+ .long 0 ## Header: local type unit count
+ .long 0 ## Header: foreign type unit count
+ .long 3 ## Header: bucket count
+ .long 3 ## Header: name count
+.set Lset9, Lnames_abbrev_end0-Lnames_abbrev_start0 ## Header: abbreviation table size
+ .long Lset9
+ .long 8 ## Header: augmentation string size
+ .ascii "LLVM0700" ## Header: augmentation string
+.set Lset10, Lcu_begin0-Lsection_info ## Compilation unit 0
+ .long Lset10
+ .long 0 ## Bucket 0
+ .long 1 ## Bucket 1
+ .long 2 ## Bucket 2
+ .long 2090499946 ## Hash in Bucket 1
+ .long 193495088 ## Hash in Bucket 2
+ .long 2090147939 ## Hash in Bucket 2
+ .long 172 ## String in Bucket 1: main
+ .long 177 ## String in Bucket 2: int
+ .long 191 ## String in Bucket 2: char
+.set Lset11, Lnames0-Lnames_entries0 ## Offset in Bucket 1
+ .long Lset11
+.set Lset12, Lnames1-Lnames_entries0 ## Offset in Bucket 2
+ .long Lset12
+.set Lset13, Lnames2-Lnames_entries0 ## Offset in Bucket 2
+ .long Lset13
+Lnames_abbrev_start0:
+ .ascii "\230." ## Abbrev code
+ .byte 46 ## DW_TAG_subprogram
+ .byte 3 ## DW_IDX_die_offset
+ .byte 19 ## DW_FORM_ref4
+ .byte 4 ## DW_IDX_parent
+ .byte 25 ## DW_FORM_flag_present
+ .byte 0 ## End of abbrev
+ .byte 0 ## End of abbrev
+ .ascii "\230$" ## Abbrev code
+ .byte 36 ## DW_TAG_base_type
+ .byte 3 ## DW_IDX_die_offset
+ .byte 19 ## DW_FORM_ref4
+ .byte 4 ## DW_IDX_parent
+ .byte 25 ## DW_FORM_flag_present
+ .byte 0 ## End of abbrev
+ .byte 0 ## End of abbrev
+ .byte 0 ## End of abbrev list
+Lnames_abbrev_end0:
+Lnames_entries0:
+Lnames0:
+L1:
+ .ascii "\230." ## Abbreviation code
+ .long 37 ## DW_IDX_die_offset
+ .byte 0 ## DW_IDX_parent
+ ## End of list: main
+Lnames1:
+L0:
+ .ascii "\230$" ## Abbreviation code
+ .long 73 ## DW_IDX_die_offset
+ .byte 0 ## DW_IDX_parent
+ ## End of list: int
+Lnames2:
+L2:
+ .ascii "\230$" ## Abbreviation code
+ .long 87 ## DW_IDX_die_offset
+ .byte 0 ## DW_IDX_parent
+ ## End of list: char
+ .p2align 2, 0x0
+Lnames_end0:
+.subsections_via_symbols
+ .section __DWARF,__debug_line,regular,debug
+Lsection_line:
+Lline_table_start0:
More information about the llvm-commits
mailing list