Skip to content

Commit b3fe995

Browse files
author
Kevin Frei
committed
Trying to deal with Linux AArch64 test failures :/
Reapply "DebugInfoD tests + fixing issues exposed by tests (#85693)" This reverts commit 7fc2fbb. Switched to using LLDB to get UUID at @clayborg's suggestion Disable tests on non-x86 Linux platforms, as they appear to fail on AArch64/Arm buildbots Moved the @skipIf to each test, off of the class itself Added CURL dependency to lit configuration 'stuff' Fixed comments in the tests Fix stupid formatter issue Updated to respond to (very late) code review feedback Fixed the script to acquire the UUID without creating a target Updated tests to not run on Mac/Windows Added LLVM_ENABLE_CURL to the config.h.cmake to work in test's @skipIf thing Attempting to prefer llvm-dwp over gnu's dwp Disabled the DWP tests Missed disabling the baseline test for DWP stuff
1 parent 2f8b64d commit b3fe995

File tree

13 files changed

+544
-21
lines changed

13 files changed

+544
-21
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: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,12 @@ else
190190
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
191191
DSYM = $(EXE).debug
192192
endif
193+
194+
ifeq "$(MAKE_DWP)" "YES"
195+
MAKE_DWO := YES
196+
DWP_NAME = $(EXE).dwp
197+
DYLIB_DWP_NAME = $(DYLIB_NAME).dwp
198+
endif
193199
endif
194200

195201
LIMIT_DEBUG_INFO_FLAGS =
@@ -338,6 +344,17 @@ ifneq "$(OS)" "Darwin"
338344

339345
OBJCOPY ?= $(call replace_cc_with,objcopy)
340346
ARCHIVER ?= $(call replace_cc_with,ar)
347+
# Look for llvm-dwp or gnu dwp
348+
DWP ?= $(call replace_cc_with,llvm-dwp)
349+
ifeq ($(wildcard $(DWP)),)
350+
DWP = $(call replace_cc_with,dwp)
351+
ifeq ($(wildcard $(DWP)),)
352+
DWP = $(shell command -v llvm-dwp 2> /dev/null)
353+
ifeq ($(wildcard $(DWP)),)
354+
DWP = $(shell command -v dwp 2> /dev/null)
355+
endif
356+
endif
357+
endif
341358
override AR = $(ARCHIVER)
342359
endif
343360

@@ -508,6 +525,10 @@ ifneq "$(CXX)" ""
508525
endif
509526
endif
510527

528+
ifeq "$(GEN_GNU_BUILD_ID)" "YES"
529+
LDFLAGS += -Wl,--build-id
530+
endif
531+
511532
#----------------------------------------------------------------------
512533
# DYLIB_ONLY variable can be used to skip the building of a.out.
513534
# See the sections below regarding dSYM file as well as the building of
@@ -546,11 +567,18 @@ else
546567
endif
547568
else
548569
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
570+
ifeq "$(SAVE_FULL_DEBUG_BINARY)" "YES"
571+
cp "$(EXE)" "$(EXE).unstripped"
572+
endif
549573
$(OBJCOPY) --only-keep-debug "$(EXE)" "$(DSYM)"
550574
$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DSYM)" "$(EXE)" "$(EXE)"
551575
endif
576+
ifeq "$(MAKE_DWP)" "YES"
577+
$(DWP) -o "$(DWP_NAME)" $(DWOS)
578+
endif
552579
endif
553580

581+
554582
#----------------------------------------------------------------------
555583
# Make the dylib
556584
#----------------------------------------------------------------------
@@ -591,9 +619,15 @@ endif
591619
else
592620
$(LD) $(DYLIB_OBJECTS) $(LDFLAGS) -shared -o "$(DYLIB_FILENAME)"
593621
ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
622+
ifeq "$(SAVE_FULL_DEBUG_BINARY)" "YES"
623+
cp "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME).unstripped"
624+
endif
594625
$(OBJCOPY) --only-keep-debug "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME).debug"
595626
$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DYLIB_FILENAME).debug" "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME)"
596627
endif
628+
ifeq "$(MAKE_DWP)" "YES"
629+
$(DWP) -o $(DYLIB_DWP_FILE) $(DYLIB_DWOS)
630+
endif
597631
endif
598632

599633
#----------------------------------------------------------------------

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
@@ -4331,26 +4331,38 @@ const std::shared_ptr<SymbolFileDWARFDwo> &SymbolFileDWARF::GetDwpSymbolFile() {
43314331
FileSpecList search_paths = Target::GetDefaultDebugFileSearchPaths();
43324332
ModuleSpec module_spec;
43334333
module_spec.GetFileSpec() = m_objfile_sp->GetFileSpec();
4334+
FileSpec dwp_filespec;
43344335
for (const auto &symfile : symfiles.files()) {
43354336
module_spec.GetSymbolFileSpec() =
43364337
FileSpec(symfile.GetPath() + ".dwp", symfile.GetPathStyle());
43374338
LLDB_LOG(log, "Searching for DWP using: \"{0}\"",
43384339
module_spec.GetSymbolFileSpec());
4339-
FileSpec dwp_filespec =
4340+
dwp_filespec =
43404341
PluginManager::LocateExecutableSymbolFile(module_spec, search_paths);
43414342
if (FileSystem::Instance().Exists(dwp_filespec)) {
4342-
LLDB_LOG(log, "Found DWP file: \"{0}\"", dwp_filespec);
4343-
DataBufferSP dwp_file_data_sp;
4344-
lldb::offset_t dwp_file_data_offset = 0;
4345-
ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
4346-
GetObjectFile()->GetModule(), &dwp_filespec, 0,
4347-
FileSystem::Instance().GetByteSize(dwp_filespec), dwp_file_data_sp,
4348-
dwp_file_data_offset);
4349-
if (dwp_obj_file) {
4350-
m_dwp_symfile = std::make_shared<SymbolFileDWARFDwo>(
4351-
*this, dwp_obj_file, DIERef::k_file_index_mask);
4352-
break;
4353-
}
4343+
break;
4344+
}
4345+
}
4346+
if (!FileSystem::Instance().Exists(dwp_filespec)) {
4347+
LLDB_LOG(log, "No DWP file found locally");
4348+
// Fill in the UUID for the module we're trying to match for, so we can
4349+
// find the correct DWP file, as the Debuginfod plugin uses *only* this
4350+
// data to correctly match the DWP file with the binary.
4351+
module_spec.GetUUID() = m_objfile_sp->GetUUID();
4352+
dwp_filespec =
4353+
PluginManager::LocateExecutableSymbolFile(module_spec, search_paths);
4354+
}
4355+
if (FileSystem::Instance().Exists(dwp_filespec)) {
4356+
LLDB_LOG(log, "Found DWP file: \"{0}\"", dwp_filespec);
4357+
DataBufferSP dwp_file_data_sp;
4358+
lldb::offset_t dwp_file_data_offset = 0;
4359+
ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
4360+
GetObjectFile()->GetModule(), &dwp_filespec, 0,
4361+
FileSystem::Instance().GetByteSize(dwp_filespec), dwp_file_data_sp,
4362+
dwp_file_data_offset);
4363+
if (dwp_obj_file) {
4364+
m_dwp_symfile = std::make_shared<SymbolFileDWARFDwo>(
4365+
*this, dwp_obj_file, DIERef::k_file_index_mask);
43544366
}
43554367
}
43564368
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)