Skip to content

Commit b9496a7

Browse files
author
Kevin Frei
authored
[lldb] DebugInfoD tests & fixes (but with dwp testing disabled) (llvm#98344)
This is all the tests and fixes I've had percolating since my first attempt at this in January. After 6 months of trying, I've given up on adding the ability to test DWP files in LLDB API tests. I've left both the tests (disabled) and the changes to Makefile.rules in place, in the hopes that someone who can configure the build bots will be able to enable the tests once a non-borked dwp tool is widely available. Other than disabling the DWP tests, this continues to be the same diff that I've tried to land and [not](llvm#90622) [revert](llvm#87676) [five](llvm#86812) [times](llvm#85693) [before](llvm#96802). There are a couple of fixes that the testing exposed, and I've abandoned the DWP tests because I want to get those fixes finally upstreamed, as without them DebugInfoD is less useful.
1 parent 77ec20c commit b9496a7

File tree

13 files changed

+545
-22
lines changed

13 files changed

+545
-22
lines changed

lldb/include/lldb/Host/Config.h.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333

3434
#cmakedefine01 LLDB_ENABLE_LZMA
3535

36+
#cmakedefine01 LLVM_ENABLE_CURL
37+
3638
#cmakedefine01 LLDB_ENABLE_CURSES
3739

3840
#cmakedefine01 CURSES_HAVE_NCURSES_CURSES_H

lldb/packages/Python/lldbsuite/test/decorators.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,6 +1053,10 @@ def _get_bool_config_skip_if_decorator(key):
10531053
return unittest.skipIf(not have, "requires " + key)
10541054

10551055

1056+
def skipIfCurlSupportMissing(func):
1057+
return _get_bool_config_skip_if_decorator("curl")(func)
1058+
1059+
10561060
def skipIfCursesSupportMissing(func):
10571061
return _get_bool_config_skip_if_decorator("curses")(func)
10581062

lldb/packages/Python/lldbsuite/test/make/Makefile.rules

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ LLDB_BASE_DIR := $(THIS_FILE_DIR)/../../../../../
5151
#
5252
# GNUWin32 uname gives "windows32" or "server version windows32" while
5353
# some versions of MSYS uname return "MSYS_NT*", but most environments
54-
# standardize on "Windows_NT", so we'll make it consistent here.
54+
# standardize on "Windows_NT", so we'll make it consistent here.
5555
# When running tests from Visual Studio, the environment variable isn't
5656
# inherited all the way down to the process spawned for make.
5757
#----------------------------------------------------------------------
@@ -213,6 +213,12 @@ else
213213
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
214214
DSYM = $(EXE).debug
215215
endif
216+
217+
ifeq "$(MAKE_DWP)" "YES"
218+
MAKE_DWO := YES
219+
DWP_NAME = $(EXE).dwp
220+
DYLIB_DWP_NAME = $(DYLIB_NAME).dwp
221+
endif
216222
endif
217223

218224
LIMIT_DEBUG_INFO_FLAGS =
@@ -361,6 +367,17 @@ ifneq "$(OS)" "Darwin"
361367

362368
OBJCOPY ?= $(call replace_cc_with,objcopy)
363369
ARCHIVER ?= $(call replace_cc_with,ar)
370+
# Look for llvm-dwp or gnu dwp
371+
DWP ?= $(call replace_cc_with,llvm-dwp)
372+
ifeq ($(wildcard $(DWP)),)
373+
DWP = $(call replace_cc_with,dwp)
374+
ifeq ($(wildcard $(DWP)),)
375+
DWP = $(shell command -v llvm-dwp 2> /dev/null)
376+
ifeq ($(wildcard $(DWP)),)
377+
DWP = $(shell command -v dwp 2> /dev/null)
378+
endif
379+
endif
380+
endif
364381
override AR = $(ARCHIVER)
365382
endif
366383

@@ -531,6 +548,10 @@ ifneq "$(CXX)" ""
531548
endif
532549
endif
533550

551+
ifeq "$(GEN_GNU_BUILD_ID)" "YES"
552+
LDFLAGS += -Wl,--build-id
553+
endif
554+
534555
#----------------------------------------------------------------------
535556
# DYLIB_ONLY variable can be used to skip the building of a.out.
536557
# See the sections below regarding dSYM file as well as the building of
@@ -569,11 +590,18 @@ else
569590
endif
570591
else
571592
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
593+
ifeq "$(SAVE_FULL_DEBUG_BINARY)" "YES"
594+
cp "$(EXE)" "$(EXE).unstripped"
595+
endif
572596
$(OBJCOPY) --only-keep-debug "$(EXE)" "$(DSYM)"
573597
$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DSYM)" "$(EXE)" "$(EXE)"
574598
endif
599+
ifeq "$(MAKE_DWP)" "YES"
600+
$(DWP) -o "$(DWP_NAME)" $(DWOS)
601+
endif
575602
endif
576603

604+
577605
#----------------------------------------------------------------------
578606
# Make the dylib
579607
#----------------------------------------------------------------------
@@ -614,9 +642,15 @@ endif
614642
else
615643
$(LD) $(DYLIB_OBJECTS) $(LDFLAGS) -shared -o "$(DYLIB_FILENAME)"
616644
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
645+
ifeq "$(SAVE_FULL_DEBUG_BINARY)" "YES"
646+
cp "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME).unstripped"
647+
endif
617648
$(OBJCOPY) --only-keep-debug "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME).debug"
618649
$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DYLIB_FILENAME).debug" "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME)"
619650
endif
651+
ifeq "$(MAKE_DWP)" "YES"
652+
$(DWP) -o $(DYLIB_DWP_FILE) $(DYLIB_DWOS)
653+
endif
620654
endif
621655

622656
#----------------------------------------------------------------------

lldb/source/API/SBDebugger.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,9 @@ SBStructuredData SBDebugger::GetBuildConfiguration() {
775775
AddBoolConfigEntry(
776776
*config_up, "xml", XMLDocument::XMLEnabled(),
777777
"A boolean value that indicates if XML support is enabled in LLDB");
778+
AddBoolConfigEntry(
779+
*config_up, "curl", LLVM_ENABLE_CURL,
780+
"A boolean value that indicates if CURL support is enabled in LLDB");
778781
AddBoolConfigEntry(
779782
*config_up, "curses", LLDB_ENABLE_CURSES,
780783
"A boolean value that indicates if curses support is enabled in LLDB");
@@ -1724,20 +1727,20 @@ SBDebugger::LoadTraceFromFile(SBError &error,
17241727

17251728
void SBDebugger::RequestInterrupt() {
17261729
LLDB_INSTRUMENT_VA(this);
1727-
1730+
17281731
if (m_opaque_sp)
1729-
m_opaque_sp->RequestInterrupt();
1732+
m_opaque_sp->RequestInterrupt();
17301733
}
17311734
void SBDebugger::CancelInterruptRequest() {
17321735
LLDB_INSTRUMENT_VA(this);
1733-
1736+
17341737
if (m_opaque_sp)
1735-
m_opaque_sp->CancelInterruptRequest();
1738+
m_opaque_sp->CancelInterruptRequest();
17361739
}
17371740

17381741
bool SBDebugger::InterruptRequested() {
17391742
LLDB_INSTRUMENT_VA(this);
1740-
1743+
17411744
if (m_opaque_sp)
17421745
return m_opaque_sp->InterruptRequested();
17431746
return false;

lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4299,26 +4299,38 @@ const std::shared_ptr<SymbolFileDWARFDwo> &SymbolFileDWARF::GetDwpSymbolFile() {
42994299
FileSpecList search_paths = Target::GetDefaultDebugFileSearchPaths();
43004300
ModuleSpec module_spec;
43014301
module_spec.GetFileSpec() = m_objfile_sp->GetFileSpec();
4302+
FileSpec dwp_filespec;
43024303
for (const auto &symfile : symfiles.files()) {
43034304
module_spec.GetSymbolFileSpec() =
43044305
FileSpec(symfile.GetPath() + ".dwp", symfile.GetPathStyle());
43054306
LLDB_LOG(log, "Searching for DWP using: \"{0}\"",
43064307
module_spec.GetSymbolFileSpec());
4307-
FileSpec dwp_filespec =
4308+
dwp_filespec =
43084309
PluginManager::LocateExecutableSymbolFile(module_spec, search_paths);
43094310
if (FileSystem::Instance().Exists(dwp_filespec)) {
4310-
LLDB_LOG(log, "Found DWP file: \"{0}\"", dwp_filespec);
4311-
DataBufferSP dwp_file_data_sp;
4312-
lldb::offset_t dwp_file_data_offset = 0;
4313-
ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
4314-
GetObjectFile()->GetModule(), &dwp_filespec, 0,
4315-
FileSystem::Instance().GetByteSize(dwp_filespec), dwp_file_data_sp,
4316-
dwp_file_data_offset);
4317-
if (dwp_obj_file) {
4318-
m_dwp_symfile = std::make_shared<SymbolFileDWARFDwo>(
4319-
*this, dwp_obj_file, DIERef::k_file_index_mask);
4320-
break;
4321-
}
4311+
break;
4312+
}
4313+
}
4314+
if (!FileSystem::Instance().Exists(dwp_filespec)) {
4315+
LLDB_LOG(log, "No DWP file found locally");
4316+
// Fill in the UUID for the module we're trying to match for, so we can
4317+
// find the correct DWP file, as the Debuginfod plugin uses *only* this
4318+
// data to correctly match the DWP file with the binary.
4319+
module_spec.GetUUID() = m_objfile_sp->GetUUID();
4320+
dwp_filespec =
4321+
PluginManager::LocateExecutableSymbolFile(module_spec, search_paths);
4322+
}
4323+
if (FileSystem::Instance().Exists(dwp_filespec)) {
4324+
LLDB_LOG(log, "Found DWP file: \"{0}\"", dwp_filespec);
4325+
DataBufferSP dwp_file_data_sp;
4326+
lldb::offset_t dwp_file_data_offset = 0;
4327+
ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
4328+
GetObjectFile()->GetModule(), &dwp_filespec, 0,
4329+
FileSystem::Instance().GetByteSize(dwp_filespec), dwp_file_data_sp,
4330+
dwp_file_data_offset);
4331+
if (dwp_obj_file) {
4332+
m_dwp_symfile = std::make_shared<SymbolFileDWARFDwo>(
4333+
*this, dwp_obj_file, DIERef::k_file_index_mask);
43224334
}
43234335
}
43244336
if (!m_dwp_symfile) {

lldb/source/Plugins/SymbolLocator/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
# Order matters here: the first symbol locator prevents further searching.
2+
# For DWARF binaries that are both stripped and split, the Default plugin
3+
# will return the stripped binary when asked for the ObjectFile, which then
4+
# prevents an unstripped binary from being requested from the Debuginfod
5+
# provider.
6+
add_subdirectory(Debuginfod)
17
add_subdirectory(Default)
28
if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
39
add_subdirectory(DebugSymbols)
410
endif()
5-
add_subdirectory(Debuginfod)

lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,24 @@ llvm::StringRef SymbolVendorELF::GetPluginDescriptionStatic() {
4444
"executables.";
4545
}
4646

47+
// If this is needed elsewhere, it can be exported/moved.
48+
static bool IsDwpSymbolFile(const lldb::ModuleSP &module_sp,
49+
const FileSpec &file_spec) {
50+
DataBufferSP dwp_file_data_sp;
51+
lldb::offset_t dwp_file_data_offset = 0;
52+
// Try to create an ObjectFile from the file_spec.
53+
ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
54+
module_sp, &file_spec, 0, FileSystem::Instance().GetByteSize(file_spec),
55+
dwp_file_data_sp, dwp_file_data_offset);
56+
// The presence of a debug_cu_index section is the key identifying feature of
57+
// a DWP file. Make sure we don't fill in the section list on dwp_obj_file
58+
// (by calling GetSectionList(false)) as this function could be called before
59+
// we may have all the symbol files collected and available.
60+
return dwp_obj_file && ObjectFileELF::classof(dwp_obj_file.get()) &&
61+
dwp_obj_file->GetSectionList(false)->FindSectionByType(
62+
eSectionTypeDWARFDebugCuIndex, false);
63+
}
64+
4765
// CreateInstance
4866
//
4967
// Platforms can register a callback to use when creating symbol vendors to
@@ -87,8 +105,15 @@ SymbolVendorELF::CreateInstance(const lldb::ModuleSP &module_sp,
87105
FileSpecList search_paths = Target::GetDefaultDebugFileSearchPaths();
88106
FileSpec dsym_fspec =
89107
PluginManager::LocateExecutableSymbolFile(module_spec, search_paths);
90-
if (!dsym_fspec)
91-
return nullptr;
108+
if (!dsym_fspec || IsDwpSymbolFile(module_sp, dsym_fspec)) {
109+
// If we have a stripped binary or if we got a DWP file, we should prefer
110+
// symbols in the executable acquired through a plugin.
111+
ModuleSpec unstripped_spec =
112+
PluginManager::LocateExecutableObjectFile(module_spec);
113+
if (!unstripped_spec)
114+
return nullptr;
115+
dsym_fspec = unstripped_spec.GetFileSpec();
116+
}
92117

93118
DataBufferSP dsym_file_data_sp;
94119
lldb::offset_t dsym_file_data_offset = 0;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
C_SOURCES := main.c
2+
3+
# For normal (non DWP) Debuginfod tests, we need:
4+
5+
# * The full binary: a.out.unstripped
6+
# Produced by Makefile.rules with SAVE_FULL_DEBUG_BINARY set to YES and
7+
# SPLIT_DEBUG_SYMBOLS set to YES
8+
9+
# * The stripped binary (a.out)
10+
# Produced by Makefile.rules with SPLIT_DEBUG_SYMBOLS set to YES
11+
12+
# * The 'only-keep-debug' binary (a.out.debug)
13+
# Produced below
14+
15+
SPLIT_DEBUG_SYMBOLS := YES
16+
SAVE_FULL_DEBUG_BINARY := YES
17+
GEN_GNU_BUILD_ID := YES
18+
19+
include Makefile.rules

0 commit comments

Comments
 (0)