Skip to content

Commit 2a7abb0

Browse files
author
Kevin Frei
authored
[LLDB] DebugInfoD tests: attempt to fix Fuchsia build (llvm#96802)
This is the same diff I've put up at many times before. I've been trying to add some brand new functionality to the LLDB test infrastucture (create split-dwarf files!), and we all know that no good deed goes unpunished. The last attempt was reverted because it didn't work on the Fuchsia build. There are no code differences between this and [the](llvm#90622) [previous](llvm#87676) [four](llvm#86812) [diffs](llvm#85693) landed & reverted (due to testing infra failures). The only change in this one is the way `dwp` is being identified in `Makefile.rules`. Thanks to @petrhosek for helping me figure out how the fuchsia builders are configured. I now prefer to use llvm-dwp and fall back to gnu's dwp if the former isn't found. Hopefully this will work everywhere it needs to.
1 parent 4f3c9da commit 2a7abb0

File tree

13 files changed

+545
-22
lines changed

13 files changed

+545
-22
lines changed

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

+2
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

+4
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

+35-1
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
#----------------------------------------------------------------------
@@ -210,6 +210,12 @@ else
210210
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
211211
DSYM = $(EXE).debug
212212
endif
213+
214+
ifeq "$(MAKE_DWP)" "YES"
215+
MAKE_DWO := YES
216+
DWP_NAME = $(EXE).dwp
217+
DYLIB_DWP_NAME = $(DYLIB_NAME).dwp
218+
endif
213219
endif
214220

215221
LIMIT_DEBUG_INFO_FLAGS =
@@ -358,6 +364,17 @@ ifneq "$(OS)" "Darwin"
358364

359365
OBJCOPY ?= $(call replace_cc_with,objcopy)
360366
ARCHIVER ?= $(call replace_cc_with,ar)
367+
# Look for llvm-dwp or gnu dwp
368+
DWP ?= $(call replace_cc_with,llvm-dwp)
369+
ifeq ($(wildcard $(DWP)),)
370+
DWP = $(call replace_cc_with,dwp)
371+
ifeq ($(wildcard $(DWP)),)
372+
DWP = $(shell command -v llvm-dwp 2> /dev/null)
373+
ifeq ($(wildcard $(DWP)),)
374+
DWP = $(shell command -v dwp 2> /dev/null)
375+
endif
376+
endif
377+
endif
361378
override AR = $(ARCHIVER)
362379
endif
363380

@@ -528,6 +545,10 @@ ifneq "$(CXX)" ""
528545
endif
529546
endif
530547

548+
ifeq "$(GEN_GNU_BUILD_ID)" "YES"
549+
LDFLAGS += -Wl,--build-id
550+
endif
551+
531552
#----------------------------------------------------------------------
532553
# DYLIB_ONLY variable can be used to skip the building of a.out.
533554
# See the sections below regarding dSYM file as well as the building of
@@ -566,11 +587,18 @@ else
566587
endif
567588
else
568589
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
590+
ifeq "$(SAVE_FULL_DEBUG_BINARY)" "YES"
591+
cp "$(EXE)" "$(EXE).unstripped"
592+
endif
569593
$(OBJCOPY) --only-keep-debug "$(EXE)" "$(DSYM)"
570594
$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DSYM)" "$(EXE)" "$(EXE)"
571595
endif
596+
ifeq "$(MAKE_DWP)" "YES"
597+
$(DWP) -o "$(DWP_NAME)" $(DWOS)
598+
endif
572599
endif
573600

601+
574602
#----------------------------------------------------------------------
575603
# Make the dylib
576604
#----------------------------------------------------------------------
@@ -611,9 +639,15 @@ endif
611639
else
612640
$(LD) $(DYLIB_OBJECTS) $(LDFLAGS) -shared -o "$(DYLIB_FILENAME)"
613641
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
642+
ifeq "$(SAVE_FULL_DEBUG_BINARY)" "YES"
643+
cp "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME).unstripped"
644+
endif
614645
$(OBJCOPY) --only-keep-debug "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME).debug"
615646
$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DYLIB_FILENAME).debug" "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME)"
616647
endif
648+
ifeq "$(MAKE_DWP)" "YES"
649+
$(DWP) -o $(DYLIB_DWP_FILE) $(DYLIB_DWOS)
650+
endif
617651
endif
618652

619653
#----------------------------------------------------------------------

lldb/source/API/SBDebugger.cpp

+8-5
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

+25-13
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

+6-1
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

+27-2
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;
+19
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)