[Lldb-commits] [llvm] [lldb] LLDB Debuginfod usage tests (with fixes) (PR #79181)

Kevin Frei via lldb-commits lldb-commits at lists.llvm.org
Tue Jan 23 10:03:09 PST 2024


https://github.com/kevinfrei updated https://github.com/llvm/llvm-project/pull/79181

>From 4e30a8bf6a93729b6fb367814c95becf16201057 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Thu, 18 Jan 2024 09:09:50 -0800
Subject: [PATCH 01/10] Added settings for cache location and timeout

---
 llvm/lib/Debuginfod/Debuginfod.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp b/llvm/lib/Debuginfod/Debuginfod.cpp
index 4928fcb3b3f8791..0dd8a7de1245b31 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -159,6 +159,10 @@ Expected<std::string> getCachedOrDownloadDebuginfo(BuildIDRef ID) {
   return getCachedOrDownloadArtifact(getDebuginfodCacheKey(UrlPath), UrlPath);
 }
 
+Expected<std::string> getCachedOrDownloadDebuginfo(BuildIDRef ID) {
+  std::string UrlPath = getDebuginfodDebuginfoUrlPath(ID);
+  return getCachedOrDownloadArtifact(getDebuginfodCacheKey(UrlPath), UrlPath);
+}
 // General fetching function.
 Expected<std::string> getCachedOrDownloadArtifact(StringRef UniqueKey,
                                                   StringRef UrlPath) {

>From a1ee878e150c7ff3f3638bfbf10846c3f2cf16ac Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Fri, 19 Jan 2024 07:11:17 -0800
Subject: [PATCH 02/10] Continuing to pick my changes apart a little bit

---
 .../SymbolFile/DWARF/SymbolFileDWARF.cpp      |  18 ++
 .../SymbolFile/DWARF/SymbolFileDWARF.h        |   3 +
 .../Plugins/SymbolLocator/CMakeLists.txt      |   7 +-
 .../Debuginfod/SymbolLocatorDebuginfod.cpp    |   6 +-
 .../SymbolVendor/ELF/SymbolVendorELF.cpp      |  13 +-
 .../Shell/Debuginfod/Inputs/main-dbg.yaml     | 211 +++++++++++++++++
 .../Shell/Debuginfod/Inputs/main-dwp.yaml     |  50 ++++
 .../Shell/Debuginfod/Inputs/main-full.yaml    | 212 +++++++++++++++++
 .../Shell/Debuginfod/Inputs/main-nodbg.yaml   | 146 ++++++++++++
 .../Debuginfod/Inputs/main-split-dbg.yaml     | 216 +++++++++++++++++
 .../Debuginfod/Inputs/main-split-nodbg.yaml   | 146 ++++++++++++
 .../Shell/Debuginfod/Inputs/main-split.yaml   | 217 ++++++++++++++++++
 .../Debuginfod/Inputs/main-stripped.yaml      | 146 ++++++++++++
 lldb/test/Shell/Debuginfod/Inputs/main.c      |  82 +++++++
 lldb/test/Shell/Debuginfod/Inputs/mk          |  51 ++++
 .../Shell/Debuginfod/okd-split-negative.test  |  31 +++
 .../Shell/Debuginfod/okd-split-positive.test  |  40 ++++
 .../Debuginfod/okd-stripped-negative.test     |  32 +++
 .../Debuginfod/okd-stripped-positive.test     |  35 +++
 .../Shell/Debuginfod/simple-dwp-negative.test |  32 +++
 .../Shell/Debuginfod/simple-dwp-positive.test |  37 +++
 .../Debuginfod/simple-stripped-negative.test  |  32 +++
 .../Debuginfod/simple-stripped-positive.test  |  38 +++
 lldb/test/Shell/Debuginfod/tests.md           |  61 +++++
 llvm/lib/Debuginfod/Debuginfod.cpp            |  41 +++-
 .../gn/build/write_library_dependencies.py    |   1 +
 llvm/utils/lldbDataFormatters.py              |   2 +
 27 files changed, 1893 insertions(+), 13 deletions(-)
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-dbg.yaml
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-dwp.yaml
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-full.yaml
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-nodbg.yaml
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-split-dbg.yaml
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-split-nodbg.yaml
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-split.yaml
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-stripped.yaml
 create mode 100644 lldb/test/Shell/Debuginfod/Inputs/main.c
 create mode 100755 lldb/test/Shell/Debuginfod/Inputs/mk
 create mode 100644 lldb/test/Shell/Debuginfod/okd-split-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/okd-split-positive.test
 create mode 100644 lldb/test/Shell/Debuginfod/okd-stripped-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/okd-stripped-positive.test
 create mode 100644 lldb/test/Shell/Debuginfod/simple-dwp-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/simple-dwp-positive.test
 create mode 100644 lldb/test/Shell/Debuginfod/simple-stripped-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/simple-stripped-positive.test
 create mode 100644 lldb/test/Shell/Debuginfod/tests.md

diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index fed97858c83f8e2..e25a0dcd640b2ad 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -39,6 +39,7 @@
 #include "lldb/Interpreter/OptionValueProperties.h"
 
 #include "Plugins/ExpressionParser/Clang/ClangUtil.h"
+#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
 #include "Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/Symbol/Block.h"
@@ -4320,6 +4321,23 @@ SymbolFileDWARFDebugMap *SymbolFileDWARF::GetDebugMapSymfile() {
   return m_debug_map_symfile;
 }
 
+bool SymbolFileDWARF::IsDwpSymbolFile(const lldb::ModuleSP &module_sp,
+                                      const FileSpec &file_spec) {
+  DataBufferSP dwp_file_data_sp;
+  lldb::offset_t dwp_file_data_offset = 0;
+  // Try to create an ObjectFileELF frorm the filespace
+  ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
+      module_sp, &file_spec, 0, FileSystem::Instance().GetByteSize(file_spec),
+      dwp_file_data_sp, dwp_file_data_offset);
+  if (!ObjectFileELF::classof(dwp_obj_file.get()))
+    return false;
+  static ConstString sect_name_debug_cu_index(".debug_cu_index");
+  if (!dwp_obj_file || !dwp_obj_file->GetSectionList()->FindSectionByName(
+                           sect_name_debug_cu_index))
+    return false;
+  return true;
+}
+
 const std::shared_ptr<SymbolFileDWARFDwo> &SymbolFileDWARF::GetDwpSymbolFile() {
   llvm::call_once(m_dwp_symfile_once_flag, [this]() {
     ModuleSpec module_spec;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 26a9502f90aa006..1419604238d86c6 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -267,6 +267,9 @@ class SymbolFileDWARF : public SymbolFileCommon {
 
   DWARFContext &GetDWARFContext() { return m_context; }
 
+  static bool IsDwpSymbolFile(const lldb::ModuleSP &module_sp,
+                              const FileSpec &file_spec);
+
   const std::shared_ptr<SymbolFileDWARFDwo> &GetDwpSymbolFile();
 
   FileSpec GetFile(DWARFUnit &unit, size_t file_idx);
diff --git a/lldb/source/Plugins/SymbolLocator/CMakeLists.txt b/lldb/source/Plugins/SymbolLocator/CMakeLists.txt
index ca969626f4ffc4a..f536760d8feb0e8 100644
--- a/lldb/source/Plugins/SymbolLocator/CMakeLists.txt
+++ b/lldb/source/Plugins/SymbolLocator/CMakeLists.txt
@@ -1,5 +1,10 @@
+# Order matters here, as the first symbol locator will prevent further
+# searching. For DWARF binaries that are both stripped & split, the Default
+# plugin will return the stripped binary when asked for the ObjectFile,
+# preventing an unstripped binary from being requested from the Debuginfod
+# provider
+add_subdirectory(Debuginfod)
 add_subdirectory(Default)
 if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
   add_subdirectory(DebugSymbols)
 endif()
-add_subdirectory(Debuginfod)
diff --git a/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp b/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
index 2cd7bbbb2449028..81406654092b3c4 100644
--- a/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
+++ b/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
@@ -96,13 +96,13 @@ class PluginProperties : public Properties {
   Args m_server_urls;
 };
 
-} // namespace
-
-static PluginProperties &GetGlobalPluginProperties() {
+PluginProperties &GetGlobalPluginProperties() {
   static PluginProperties g_settings;
   return g_settings;
 }
 
+} // namespace
+
 SymbolLocatorDebuginfod::SymbolLocatorDebuginfod() : SymbolLocator() {}
 
 void SymbolLocatorDebuginfod::Initialize() {
diff --git a/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp b/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
index b5fe35d71032a86..aeacf9c78ea70fd 100644
--- a/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
+++ b/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
@@ -11,6 +11,7 @@
 #include <cstring>
 
 #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
+#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
 #include "lldb/Core/Module.h"
 #include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/PluginManager.h"
@@ -87,8 +88,16 @@ SymbolVendorELF::CreateInstance(const lldb::ModuleSP &module_sp,
   FileSpecList search_paths = Target::GetDefaultDebugFileSearchPaths();
   FileSpec dsym_fspec =
       PluginManager::LocateExecutableSymbolFile(module_spec, search_paths);
-  if (!dsym_fspec)
-    return nullptr;
+  if (!dsym_fspec ||
+      plugin::dwarf::SymbolFileDWARF::IsDwpSymbolFile(module_sp, dsym_fspec)) {
+    // If we have a stripped binary or if we got a DWP file, we should prefer
+    // symbols in the executable acquired through a plugin.
+    ModuleSpec unstripped_spec =
+        PluginManager::LocateExecutableObjectFile(module_spec);
+    if (!unstripped_spec)
+      return nullptr;
+    dsym_fspec = unstripped_spec.GetFileSpec();
+  }
 
   DataBufferSP dsym_file_data_sp;
   lldb::offset_t dsym_file_data_offset = 0;
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-dbg.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-dbg.yaml
new file mode 100644
index 000000000000000..1cc8bffc59ce3a8
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main-dbg.yaml
@@ -0,0 +1,211 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+  Entry:           0x401030
+ProgramHeaders:
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x400000
+    Align:           0x1000
+    Offset:          0x0
+  - Type:            PT_LOAD
+    Flags:           [ PF_X, PF_R ]
+    FirstSec:        .text
+    LastSec:         .text
+    VAddr:           0x401000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .rodata
+    LastSec:         .eh_frame
+    VAddr:           0x402000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_W, PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Align:           0x1000
+    Offset:          0x1FF8
+  - Type:            PT_NOTE
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x4001C8
+    Align:           0x4
+    Offset:          0x1C8
+  - Type:            PT_GNU_STACK
+    Flags:           [ PF_W, PF_R ]
+    Align:           0x10
+    Offset:          0x0
+  - Type:            PT_GNU_RELRO
+    Flags:           [ PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Offset:          0x1FF8
+Sections:
+  - Name:            .note.gnu.build-id
+    Type:            SHT_NOTE
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x4001C8
+    AddressAlign:    0x4
+    Notes:
+      - Name:            GNU
+        Desc:            B4927EA09A08EE63313299CF347043010D03CC5E
+        Type:            NT_PRPSINFO
+  - Name:            .text
+    Type:            SHT_NOBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x401000
+    AddressAlign:    0x10
+    Offset:          0x1000
+    Size:            0x64
+  - Name:            .rodata
+    Type:            SHT_NOBITS
+    Flags:           [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+    Address:         0x402000
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Size:            0x1
+  - Name:            .eh_frame
+    Type:            SHT_NOBITS
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x402008
+    AddressAlign:    0x8
+    Size:            0x54
+  - Name:            .data.rel.ro
+    Type:            SHT_NOBITS
+    Flags:           [ SHF_WRITE, SHF_ALLOC ]
+    Address:         0x403FF8
+    AddressAlign:    0x8
+    Offset:          0x1FF8
+    Size:            0x8
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+  - Name:            .debug_info
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         9A000000050001080000000001001D0001080000000000000002016400000008000000022D000000004C02A1000339000000043D0000000100050306010604080707012800000001560500447E0000000802917C0800447E00000008029170090044820000000009023400000001560700480A02770809004C9100000000050605040B870000000B8C0000000C390000000387000000043D000000010000
+  - Name:            .debug_abbrev
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         011101252513050325721710171B25111B12067317000002340049133A0B3B0B02180000030101491300000421004913370B000005240003253E0B0B0B000006240003250B0B3E0B0000072E01111B1206401803253A0B3B0B271949133F190000080500021803253A0B3B0B49130000092E01111B1206401803253A0B3B0B27193F1900000A3400021803253A0B3B0B491300000B0F00491300000C26004913000000
+  - Name:            .debug_line
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000004F0B089C0626CBD8AB443134CFE6DD950400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+  - Name:            .debug_line_str
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         2F686F6D652F667265696B2F6C6C766D2D73616E642F6C6C766D2F6C6C64622F746573742F5368656C6C2F4465627567696E666F642F496E70757473006D61696E2E6300
+  - Name:            .debug_str_offsets
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         2C00000005000000000000006B00000072000000AF000000B4000000C8000000CD000000D1000000D8000000DD000000
+Symbols:
+  - Name:            .note.gnu.build-id
+    Type:            STT_SECTION
+    Section:         .note.gnu.build-id
+    Value:           0x4001C8
+  - Name:            .text
+    Type:            STT_SECTION
+    Section:         .text
+    Value:           0x401000
+  - Name:            .rodata
+    Type:            STT_SECTION
+    Section:         .rodata
+    Value:           0x402000
+  - Name:            .eh_frame
+    Type:            STT_SECTION
+    Section:         .eh_frame
+    Value:           0x402008
+  - Name:            .data.rel.ro
+    Type:            STT_SECTION
+    Section:         .data.rel.ro
+    Value:           0x403FF8
+  - Name:            .comment
+    Type:            STT_SECTION
+    Section:         .comment
+  - Name:            .debug_info
+    Type:            STT_SECTION
+    Section:         .debug_info
+  - Name:            .debug_abbrev
+    Type:            STT_SECTION
+    Section:         .debug_abbrev
+  - Name:            .debug_line
+    Type:            STT_SECTION
+    Section:         .debug_line
+  - Name:            .debug_str
+    Type:            STT_SECTION
+    Section:         .debug_str
+  - Name:            .debug_addr
+    Type:            STT_SECTION
+    Section:         .debug_addr
+  - Name:            .debug_line_str
+    Type:            STT_SECTION
+    Section:         .debug_line_str
+  - Name:            .debug_str_offsets
+    Type:            STT_SECTION
+    Section:         .debug_str_offsets
+  - Name:            main.c
+    Type:            STT_FILE
+    Index:           SHN_ABS
+  - Name:            _start
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401030
+    Size:            0x34
+  - Name:            __bss_start
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            func
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401000
+    Size:            0x28
+  - Name:            _edata
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            _end
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+DWARF:
+  debug_str:
+    - 'Facebook clang version 15.0.0 (git at github.com:kevinfrei/llvm.git 936cbb55363f8cc626d0a036fa840e87713572d9)'
+    - main.c
+    - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
+    - char
+    - __ARRAY_SIZE_TYPE__
+    - func
+    - int
+    - _start
+    - argc
+    - argv
+  debug_addr:
+    - Length:          0x1C
+      Version:         0x5
+      AddressSize:     0x8
+      Entries:
+        - Address:         0x402000
+        - Address:         0x401000
+        - Address:         0x401030
+...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-dwp.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-dwp.yaml
new file mode 100644
index 000000000000000..60b086adf1d633f
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main-dwp.yaml
@@ -0,0 +1,50 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+  SectionHeaderStringTable: .strtab
+Sections:
+  - Name:            .debug_abbrev.dwo
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_EXCLUDE ]
+    AddressAlign:    0x1
+    Content:         0111012525130503257625000002340049133A0B3B0B02180000030101491300000421004913370B000005240003253E0B0B0B000006240003250B0B3E0B0000072E01111B1206401803253A0B3B0B271949133F190000080500021803253A0B3B0B49130000092E015523401803253A0B3B0B27193F1900000A3400021803253A0B3B0B491300000B0F00491300000C26004913000000
+  - Name:            .debug_rnglists.dwo
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_EXCLUDE ]
+    AddressAlign:    0x1
+    Content:         '1000000005000800010000000400000004306400'
+  - Name:            .debug_str.dwo
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_EXCLUDE, SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         63686172005F5F41525241595F53495A455F545950455F5F0066756E6300696E74005F7374617274006172676300617267760046616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E676974203933366362623535333633663863633632366430613033366661383430653837373133353732643929006D61696E2E630067656E2F6D61696E2D73706C69742E64776F00
+  - Name:            .debug_str_offsets.dwo
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_EXCLUDE ]
+    AddressAlign:    0x1
+    Content:         2C000000050000000000000005000000190000001E00000022000000290000002E000000330000009E000000A5000000
+  - Name:            .debug_info.dwo
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_EXCLUDE ]
+    AddressAlign:    0x1
+    Content:         8D00000005000508000000008094E89A08DB62C101071D0008090224000000004C02A10003300000000434000000010005000601060108070701280000000156020044710000000802917C05004471000000080291700600447500000000090001560400480A02770806004C8400000000050305040B7A0000000B7F0000000C30000000037A0000000434000000010000
+  - Name:            .debug_cu_index
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         050000000400000001000000020000008094E89A08DB62C100000000000000000100000000000000010000000300000006000000080000000000000000000000000000000000000091000000970000003000000014000000
+  - Type:            SectionHeaderTable
+    Sections:
+      - Name:            .strtab
+      - Name:            .debug_abbrev.dwo
+      - Name:            .debug_rnglists.dwo
+      - Name:            .debug_str.dwo
+      - Name:            .debug_str_offsets.dwo
+      - Name:            .debug_info.dwo
+      - Name:            .debug_cu_index
+      - Name:            .symtab
+Symbols:         []
+...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-full.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-full.yaml
new file mode 100644
index 000000000000000..bcaa75028954268
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main-full.yaml
@@ -0,0 +1,212 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+  Entry:           0x401030
+ProgramHeaders:
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x400000
+    Align:           0x1000
+    Offset:          0x0
+  - Type:            PT_LOAD
+    Flags:           [ PF_X, PF_R ]
+    FirstSec:        .text
+    LastSec:         .text
+    VAddr:           0x401000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .rodata
+    LastSec:         .eh_frame
+    VAddr:           0x402000
+    Align:           0x1000
+    Offset:          0x2000
+  - Type:            PT_LOAD
+    Flags:           [ PF_W, PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Align:           0x1000
+    Offset:          0x2FF8
+  - Type:            PT_NOTE
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x4001C8
+    Align:           0x4
+    Offset:          0x1C8
+  - Type:            PT_GNU_STACK
+    Flags:           [ PF_W, PF_R ]
+    Align:           0x10
+    Offset:          0x0
+  - Type:            PT_GNU_RELRO
+    Flags:           [ PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Offset:          0x2FF8
+Sections:
+  - Name:            .note.gnu.build-id
+    Type:            SHT_NOTE
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x4001C8
+    AddressAlign:    0x4
+    Notes:
+      - Name:            GNU
+        Desc:            B4927EA09A08EE63313299CF347043010D03CC5E
+        Type:            NT_PRPSINFO
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x401000
+    AddressAlign:    0x10
+    Offset:          0x1000
+    Content:         554889E5897DFC488975F08B45FC83C001488B4DF0486355FC488B0CD10FBE0983C1020FAFC15DC30F1F840000000000554889E54883E4F04883EC10488B05B52F00004889442408488D74240831FFE8ACFFFFFF48C7C03C00000048C7C7000000000F05
+  - Name:            .rodata
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+    Address:         0x402000
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Offset:          0x2000
+    Content:         '00'
+  - Name:            .eh_frame
+    Type:            SHT_X86_64_UNWIND
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x402008
+    AddressAlign:    0x8
+    Content:         1400000000000000017A5200017810011B0C0708900100001C0000001C000000D8EFFFFF2800000000410E108602430D06630C0708000000180000003C000000E8EFFFFF3400000000410E108602430D06000000
+  - Name:            .data.rel.ro
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_WRITE, SHF_ALLOC ]
+    Address:         0x403FF8
+    AddressAlign:    0x8
+    Offset:          0x2FF8
+    Content:         '0020400000000000'
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+  - Name:            .debug_info
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         9A000000050001080000000001001D0001080000000000000002016400000008000000022D000000004C02A1000339000000043D0000000100050306010604080707012800000001560500447E0000000802917C0800447E00000008029170090044820000000009023400000001560700480A02770809004C9100000000050605040B870000000B8C0000000C390000000387000000043D000000010000
+  - Name:            .debug_abbrev
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         011101252513050325721710171B25111B12067317000002340049133A0B3B0B02180000030101491300000421004913370B000005240003253E0B0B0B000006240003250B0B3E0B0000072E01111B1206401803253A0B3B0B271949133F190000080500021803253A0B3B0B49130000092E01111B1206401803253A0B3B0B27193F1900000A3400021803253A0B3B0B491300000B0F00491300000C26004913000000
+  - Name:            .debug_line
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000004F0B089C0626CBD8AB443134CFE6DD950400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+  - Name:            .debug_line_str
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         2F686F6D652F667265696B2F6C6C766D2D73616E642F6C6C766D2F6C6C64622F746573742F5368656C6C2F4465627567696E666F642F496E70757473006D61696E2E6300
+  - Name:            .debug_str_offsets
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         2C00000005000000000000006B00000072000000AF000000B4000000C8000000CD000000D1000000D8000000DD000000
+Symbols:
+  - Name:            .note.gnu.build-id
+    Type:            STT_SECTION
+    Section:         .note.gnu.build-id
+    Value:           0x4001C8
+  - Name:            .text
+    Type:            STT_SECTION
+    Section:         .text
+    Value:           0x401000
+  - Name:            .rodata
+    Type:            STT_SECTION
+    Section:         .rodata
+    Value:           0x402000
+  - Name:            .eh_frame
+    Type:            STT_SECTION
+    Section:         .eh_frame
+    Value:           0x402008
+  - Name:            .data.rel.ro
+    Type:            STT_SECTION
+    Section:         .data.rel.ro
+    Value:           0x403FF8
+  - Name:            .comment
+    Type:            STT_SECTION
+    Section:         .comment
+  - Name:            .debug_info
+    Type:            STT_SECTION
+    Section:         .debug_info
+  - Name:            .debug_abbrev
+    Type:            STT_SECTION
+    Section:         .debug_abbrev
+  - Name:            .debug_line
+    Type:            STT_SECTION
+    Section:         .debug_line
+  - Name:            .debug_str
+    Type:            STT_SECTION
+    Section:         .debug_str
+  - Name:            .debug_addr
+    Type:            STT_SECTION
+    Section:         .debug_addr
+  - Name:            .debug_line_str
+    Type:            STT_SECTION
+    Section:         .debug_line_str
+  - Name:            .debug_str_offsets
+    Type:            STT_SECTION
+    Section:         .debug_str_offsets
+  - Name:            main.c
+    Type:            STT_FILE
+    Index:           SHN_ABS
+  - Name:            _start
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401030
+    Size:            0x34
+  - Name:            __bss_start
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            func
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401000
+    Size:            0x28
+  - Name:            _edata
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            _end
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+DWARF:
+  debug_str:
+    - 'Facebook clang version 15.0.0 (git at github.com:kevinfrei/llvm.git 936cbb55363f8cc626d0a036fa840e87713572d9)'
+    - main.c
+    - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
+    - char
+    - __ARRAY_SIZE_TYPE__
+    - func
+    - int
+    - _start
+    - argc
+    - argv
+  debug_addr:
+    - Length:          0x1C
+      Version:         0x5
+      AddressSize:     0x8
+      Entries:
+        - Address:         0x402000
+        - Address:         0x401000
+        - Address:         0x401030
+...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-nodbg.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-nodbg.yaml
new file mode 100644
index 000000000000000..a4465d75fa6dafa
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main-nodbg.yaml
@@ -0,0 +1,146 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+  Entry:           0x401030
+ProgramHeaders:
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x400000
+    Align:           0x1000
+    Offset:          0x0
+  - Type:            PT_LOAD
+    Flags:           [ PF_X, PF_R ]
+    FirstSec:        .text
+    LastSec:         .text
+    VAddr:           0x401000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .rodata
+    LastSec:         .eh_frame
+    VAddr:           0x402000
+    Align:           0x1000
+    Offset:          0x2000
+  - Type:            PT_LOAD
+    Flags:           [ PF_W, PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Align:           0x1000
+    Offset:          0x2FF8
+  - Type:            PT_NOTE
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x4001C8
+    Align:           0x4
+    Offset:          0x1C8
+  - Type:            PT_GNU_STACK
+    Flags:           [ PF_W, PF_R ]
+    Align:           0x10
+    Offset:          0x0
+  - Type:            PT_GNU_RELRO
+    Flags:           [ PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Offset:          0x2FF8
+Sections:
+  - Name:            .note.gnu.build-id
+    Type:            SHT_NOTE
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x4001C8
+    AddressAlign:    0x4
+    Notes:
+      - Name:            GNU
+        Desc:            B4927EA09A08EE63313299CF347043010D03CC5E
+        Type:            NT_PRPSINFO
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x401000
+    AddressAlign:    0x10
+    Offset:          0x1000
+    Content:         554889E5897DFC488975F08B45FC83C001488B4DF0486355FC488B0CD10FBE0983C1020FAFC15DC30F1F840000000000554889E54883E4F04883EC10488B05B52F00004889442408488D74240831FFE8ACFFFFFF48C7C03C00000048C7C7000000000F05
+  - Name:            .rodata
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+    Address:         0x402000
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Offset:          0x2000
+    Content:         '00'
+  - Name:            .eh_frame
+    Type:            SHT_X86_64_UNWIND
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x402008
+    AddressAlign:    0x8
+    Content:         1400000000000000017A5200017810011B0C0708900100001C0000001C000000D8EFFFFF2800000000410E108602430D06630C0708000000180000003C000000E8EFFFFF3400000000410E108602430D06000000
+  - Name:            .data.rel.ro
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_WRITE, SHF_ALLOC ]
+    Address:         0x403FF8
+    AddressAlign:    0x8
+    Offset:          0x2FF8
+    Content:         '0020400000000000'
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+Symbols:
+  - Name:            .note.gnu.build-id
+    Type:            STT_SECTION
+    Section:         .note.gnu.build-id
+    Value:           0x4001C8
+  - Name:            .text
+    Type:            STT_SECTION
+    Section:         .text
+    Value:           0x401000
+  - Name:            .rodata
+    Type:            STT_SECTION
+    Section:         .rodata
+    Value:           0x402000
+  - Name:            .eh_frame
+    Type:            STT_SECTION
+    Section:         .eh_frame
+    Value:           0x402008
+  - Name:            .data.rel.ro
+    Type:            STT_SECTION
+    Section:         .data.rel.ro
+    Value:           0x403FF8
+  - Name:            .comment
+    Type:            STT_SECTION
+    Section:         .comment
+  - Name:            _start
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401030
+    Size:            0x34
+  - Name:            __bss_start
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            func
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401000
+    Size:            0x28
+  - Name:            _edata
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            _end
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-split-dbg.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-split-dbg.yaml
new file mode 100644
index 000000000000000..34d157b66c6b79a
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main-split-dbg.yaml
@@ -0,0 +1,216 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+  Entry:           0x401030
+ProgramHeaders:
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x400000
+    Align:           0x1000
+    Offset:          0x0
+  - Type:            PT_LOAD
+    Flags:           [ PF_X, PF_R ]
+    FirstSec:        .text
+    LastSec:         .text
+    VAddr:           0x401000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .rodata
+    LastSec:         .eh_frame
+    VAddr:           0x402000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_W, PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Align:           0x1000
+    Offset:          0x1FF8
+  - Type:            PT_NOTE
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x4001C8
+    Align:           0x4
+    Offset:          0x1C8
+  - Type:            PT_GNU_STACK
+    Flags:           [ PF_W, PF_R ]
+    Align:           0x10
+    Offset:          0x0
+  - Type:            PT_GNU_RELRO
+    Flags:           [ PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Offset:          0x1FF8
+Sections:
+  - Name:            .note.gnu.build-id
+    Type:            SHT_NOTE
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x4001C8
+    AddressAlign:    0x4
+    Notes:
+      - Name:            GNU
+        Desc:            8B5B6416F61ADC140AE457E208F1699F89BFDA86
+        Type:            NT_PRPSINFO
+  - Name:            .text
+    Type:            SHT_NOBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x401000
+    AddressAlign:    0x10
+    Offset:          0x1000
+    Size:            0x64
+  - Name:            .rodata
+    Type:            SHT_NOBITS
+    Flags:           [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+    Address:         0x402000
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Size:            0x1
+  - Name:            .eh_frame
+    Type:            SHT_NOBITS
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x402008
+    AddressAlign:    0x8
+    Size:            0x54
+  - Name:            .data.rel.ro
+    Type:            SHT_NOBITS
+    Flags:           [ SHF_WRITE, SHF_ALLOC ]
+    Address:         0x403FF8
+    AddressAlign:    0x8
+    Offset:          0x1FF8
+    Size:            0x8
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+  - Name:            .debug_info
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         2400000005000408000000008094E89A08DB62C10100000000080000000001016400000008000000
+  - Name:            .debug_abbrev
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         014A00101772171B25B442197625111B12067317000000
+  - Name:            .debug_line
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000004F0B089C0626CBD8AB443134CFE6DD950400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+  - Name:            .debug_line_str
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         2F686F6D652F667265696B2F6C6C766D2D73616E642F6C6C766D2F6C6C64622F746573742F5368656C6C2F4465627567696E666F642F496E70757473006D61696E2E6300
+  - Name:            .debug_str_offsets
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         0C00000005000000000000003D000000
+  - Name:            .debug_gnu_pubnames
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         2A000000020000000000280000001A000000A000380000003066756E63005E000000305F73746172740000000000
+  - Name:            .debug_gnu_pubtypes
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         '2100000002000000000028000000300000009063686172007100000090696E740000000000'
+Symbols:
+  - Name:            .note.gnu.build-id
+    Type:            STT_SECTION
+    Section:         .note.gnu.build-id
+    Value:           0x4001C8
+  - Name:            .text
+    Type:            STT_SECTION
+    Section:         .text
+    Value:           0x401000
+  - Name:            .rodata
+    Type:            STT_SECTION
+    Section:         .rodata
+    Value:           0x402000
+  - Name:            .eh_frame
+    Type:            STT_SECTION
+    Section:         .eh_frame
+    Value:           0x402008
+  - Name:            .data.rel.ro
+    Type:            STT_SECTION
+    Section:         .data.rel.ro
+    Value:           0x403FF8
+  - Name:            .comment
+    Type:            STT_SECTION
+    Section:         .comment
+  - Name:            .debug_info
+    Type:            STT_SECTION
+    Section:         .debug_info
+  - Name:            .debug_abbrev
+    Type:            STT_SECTION
+    Section:         .debug_abbrev
+  - Name:            .debug_line
+    Type:            STT_SECTION
+    Section:         .debug_line
+  - Name:            .debug_str
+    Type:            STT_SECTION
+    Section:         .debug_str
+  - Name:            .debug_addr
+    Type:            STT_SECTION
+    Section:         .debug_addr
+  - Name:            .debug_line_str
+    Type:            STT_SECTION
+    Section:         .debug_line_str
+  - Name:            .debug_str_offsets
+    Type:            STT_SECTION
+    Section:         .debug_str_offsets
+  - Name:            .debug_gnu_pubnames
+    Type:            STT_SECTION
+    Section:         .debug_gnu_pubnames
+  - Name:            .debug_gnu_pubtypes
+    Type:            STT_SECTION
+    Section:         .debug_gnu_pubtypes
+  - Name:            main.c
+    Type:            STT_FILE
+    Index:           SHN_ABS
+  - Name:            _start
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401030
+    Size:            0x34
+  - Name:            __bss_start
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            func
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401000
+    Size:            0x28
+  - Name:            _edata
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            _end
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+DWARF:
+  debug_str:
+    - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
+    - 'gen/main-split.dwo'
+  debug_addr:
+    - Length:          0x14
+      Version:         0x5
+      AddressSize:     0x8
+      Entries:
+        - Address:         0x402000
+        - Address:         0x401000
+...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-split-nodbg.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-split-nodbg.yaml
new file mode 100644
index 000000000000000..11798976f5c15ab
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main-split-nodbg.yaml
@@ -0,0 +1,146 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+  Entry:           0x401030
+ProgramHeaders:
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x400000
+    Align:           0x1000
+    Offset:          0x0
+  - Type:            PT_LOAD
+    Flags:           [ PF_X, PF_R ]
+    FirstSec:        .text
+    LastSec:         .text
+    VAddr:           0x401000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .rodata
+    LastSec:         .eh_frame
+    VAddr:           0x402000
+    Align:           0x1000
+    Offset:          0x2000
+  - Type:            PT_LOAD
+    Flags:           [ PF_W, PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Align:           0x1000
+    Offset:          0x2FF8
+  - Type:            PT_NOTE
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x4001C8
+    Align:           0x4
+    Offset:          0x1C8
+  - Type:            PT_GNU_STACK
+    Flags:           [ PF_W, PF_R ]
+    Align:           0x10
+    Offset:          0x0
+  - Type:            PT_GNU_RELRO
+    Flags:           [ PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Offset:          0x2FF8
+Sections:
+  - Name:            .note.gnu.build-id
+    Type:            SHT_NOTE
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x4001C8
+    AddressAlign:    0x4
+    Notes:
+      - Name:            GNU
+        Desc:            8B5B6416F61ADC140AE457E208F1699F89BFDA86
+        Type:            NT_PRPSINFO
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x401000
+    AddressAlign:    0x10
+    Offset:          0x1000
+    Content:         554889E5897DFC488975F08B45FC83C001488B4DF0486355FC488B0CD10FBE0983C1020FAFC15DC30F1F840000000000554889E54883E4F04883EC10488B05B52F00004889442408488D74240831FFE8ACFFFFFF48C7C03C00000048C7C7000000000F05
+  - Name:            .rodata
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+    Address:         0x402000
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Offset:          0x2000
+    Content:         '00'
+  - Name:            .eh_frame
+    Type:            SHT_X86_64_UNWIND
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x402008
+    AddressAlign:    0x8
+    Content:         1400000000000000017A5200017810011B0C0708900100001C0000001C000000D8EFFFFF2800000000410E108602430D06630C0708000000180000003C000000E8EFFFFF3400000000410E108602430D06000000
+  - Name:            .data.rel.ro
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_WRITE, SHF_ALLOC ]
+    Address:         0x403FF8
+    AddressAlign:    0x8
+    Offset:          0x2FF8
+    Content:         '0020400000000000'
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+Symbols:
+  - Name:            .note.gnu.build-id
+    Type:            STT_SECTION
+    Section:         .note.gnu.build-id
+    Value:           0x4001C8
+  - Name:            .text
+    Type:            STT_SECTION
+    Section:         .text
+    Value:           0x401000
+  - Name:            .rodata
+    Type:            STT_SECTION
+    Section:         .rodata
+    Value:           0x402000
+  - Name:            .eh_frame
+    Type:            STT_SECTION
+    Section:         .eh_frame
+    Value:           0x402008
+  - Name:            .data.rel.ro
+    Type:            STT_SECTION
+    Section:         .data.rel.ro
+    Value:           0x403FF8
+  - Name:            .comment
+    Type:            STT_SECTION
+    Section:         .comment
+  - Name:            _start
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401030
+    Size:            0x34
+  - Name:            __bss_start
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            func
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401000
+    Size:            0x28
+  - Name:            _edata
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            _end
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-split.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-split.yaml
new file mode 100644
index 000000000000000..e03ff90187f40dd
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main-split.yaml
@@ -0,0 +1,217 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+  Entry:           0x401030
+ProgramHeaders:
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x400000
+    Align:           0x1000
+    Offset:          0x0
+  - Type:            PT_LOAD
+    Flags:           [ PF_X, PF_R ]
+    FirstSec:        .text
+    LastSec:         .text
+    VAddr:           0x401000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .rodata
+    LastSec:         .eh_frame
+    VAddr:           0x402000
+    Align:           0x1000
+    Offset:          0x2000
+  - Type:            PT_LOAD
+    Flags:           [ PF_W, PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Align:           0x1000
+    Offset:          0x2FF8
+  - Type:            PT_NOTE
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x4001C8
+    Align:           0x4
+    Offset:          0x1C8
+  - Type:            PT_GNU_STACK
+    Flags:           [ PF_W, PF_R ]
+    Align:           0x10
+    Offset:          0x0
+  - Type:            PT_GNU_RELRO
+    Flags:           [ PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Offset:          0x2FF8
+Sections:
+  - Name:            .note.gnu.build-id
+    Type:            SHT_NOTE
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x4001C8
+    AddressAlign:    0x4
+    Notes:
+      - Name:            GNU
+        Desc:            8B5B6416F61ADC140AE457E208F1699F89BFDA86
+        Type:            NT_PRPSINFO
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x401000
+    AddressAlign:    0x10
+    Offset:          0x1000
+    Content:         554889E5897DFC488975F08B45FC83C001488B4DF0486355FC488B0CD10FBE0983C1020FAFC15DC30F1F840000000000554889E54883E4F04883EC10488B05B52F00004889442408488D74240831FFE8ACFFFFFF48C7C03C00000048C7C7000000000F05
+  - Name:            .rodata
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+    Address:         0x402000
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Offset:          0x2000
+    Content:         '00'
+  - Name:            .eh_frame
+    Type:            SHT_X86_64_UNWIND
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x402008
+    AddressAlign:    0x8
+    Content:         1400000000000000017A5200017810011B0C0708900100001C0000001C000000D8EFFFFF2800000000410E108602430D06630C0708000000180000003C000000E8EFFFFF3400000000410E108602430D06000000
+  - Name:            .data.rel.ro
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_WRITE, SHF_ALLOC ]
+    Address:         0x403FF8
+    AddressAlign:    0x8
+    Offset:          0x2FF8
+    Content:         '0020400000000000'
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+  - Name:            .debug_info
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         2400000005000408000000008094E89A08DB62C10100000000080000000001016400000008000000
+  - Name:            .debug_abbrev
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         014A00101772171B25B442197625111B12067317000000
+  - Name:            .debug_line
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000004F0B089C0626CBD8AB443134CFE6DD950400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+  - Name:            .debug_line_str
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         2F686F6D652F667265696B2F6C6C766D2D73616E642F6C6C766D2F6C6C64622F746573742F5368656C6C2F4465627567696E666F642F496E70757473006D61696E2E6300
+  - Name:            .debug_str_offsets
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         0C00000005000000000000003D000000
+  - Name:            .debug_gnu_pubnames
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         2A000000020000000000280000001A000000A000380000003066756E63005E000000305F73746172740000000000
+  - Name:            .debug_gnu_pubtypes
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         '2100000002000000000028000000300000009063686172007100000090696E740000000000'
+Symbols:
+  - Name:            .note.gnu.build-id
+    Type:            STT_SECTION
+    Section:         .note.gnu.build-id
+    Value:           0x4001C8
+  - Name:            .text
+    Type:            STT_SECTION
+    Section:         .text
+    Value:           0x401000
+  - Name:            .rodata
+    Type:            STT_SECTION
+    Section:         .rodata
+    Value:           0x402000
+  - Name:            .eh_frame
+    Type:            STT_SECTION
+    Section:         .eh_frame
+    Value:           0x402008
+  - Name:            .data.rel.ro
+    Type:            STT_SECTION
+    Section:         .data.rel.ro
+    Value:           0x403FF8
+  - Name:            .comment
+    Type:            STT_SECTION
+    Section:         .comment
+  - Name:            .debug_info
+    Type:            STT_SECTION
+    Section:         .debug_info
+  - Name:            .debug_abbrev
+    Type:            STT_SECTION
+    Section:         .debug_abbrev
+  - Name:            .debug_line
+    Type:            STT_SECTION
+    Section:         .debug_line
+  - Name:            .debug_str
+    Type:            STT_SECTION
+    Section:         .debug_str
+  - Name:            .debug_addr
+    Type:            STT_SECTION
+    Section:         .debug_addr
+  - Name:            .debug_line_str
+    Type:            STT_SECTION
+    Section:         .debug_line_str
+  - Name:            .debug_str_offsets
+    Type:            STT_SECTION
+    Section:         .debug_str_offsets
+  - Name:            .debug_gnu_pubnames
+    Type:            STT_SECTION
+    Section:         .debug_gnu_pubnames
+  - Name:            .debug_gnu_pubtypes
+    Type:            STT_SECTION
+    Section:         .debug_gnu_pubtypes
+  - Name:            main.c
+    Type:            STT_FILE
+    Index:           SHN_ABS
+  - Name:            _start
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401030
+    Size:            0x34
+  - Name:            __bss_start
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            func
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401000
+    Size:            0x28
+  - Name:            _edata
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            _end
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+DWARF:
+  debug_str:
+    - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
+    - 'gen/main-split.dwo'
+  debug_addr:
+    - Length:          0x14
+      Version:         0x5
+      AddressSize:     0x8
+      Entries:
+        - Address:         0x402000
+        - Address:         0x401000
+...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-stripped.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-stripped.yaml
new file mode 100644
index 000000000000000..a4465d75fa6dafa
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main-stripped.yaml
@@ -0,0 +1,146 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+  Entry:           0x401030
+ProgramHeaders:
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x400000
+    Align:           0x1000
+    Offset:          0x0
+  - Type:            PT_LOAD
+    Flags:           [ PF_X, PF_R ]
+    FirstSec:        .text
+    LastSec:         .text
+    VAddr:           0x401000
+    Align:           0x1000
+    Offset:          0x1000
+  - Type:            PT_LOAD
+    Flags:           [ PF_R ]
+    FirstSec:        .rodata
+    LastSec:         .eh_frame
+    VAddr:           0x402000
+    Align:           0x1000
+    Offset:          0x2000
+  - Type:            PT_LOAD
+    Flags:           [ PF_W, PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Align:           0x1000
+    Offset:          0x2FF8
+  - Type:            PT_NOTE
+    Flags:           [ PF_R ]
+    FirstSec:        .note.gnu.build-id
+    LastSec:         .note.gnu.build-id
+    VAddr:           0x4001C8
+    Align:           0x4
+    Offset:          0x1C8
+  - Type:            PT_GNU_STACK
+    Flags:           [ PF_W, PF_R ]
+    Align:           0x10
+    Offset:          0x0
+  - Type:            PT_GNU_RELRO
+    Flags:           [ PF_R ]
+    FirstSec:        .data.rel.ro
+    LastSec:         .data.rel.ro
+    VAddr:           0x403FF8
+    Offset:          0x2FF8
+Sections:
+  - Name:            .note.gnu.build-id
+    Type:            SHT_NOTE
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x4001C8
+    AddressAlign:    0x4
+    Notes:
+      - Name:            GNU
+        Desc:            B4927EA09A08EE63313299CF347043010D03CC5E
+        Type:            NT_PRPSINFO
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x401000
+    AddressAlign:    0x10
+    Offset:          0x1000
+    Content:         554889E5897DFC488975F08B45FC83C001488B4DF0486355FC488B0CD10FBE0983C1020FAFC15DC30F1F840000000000554889E54883E4F04883EC10488B05B52F00004889442408488D74240831FFE8ACFFFFFF48C7C03C00000048C7C7000000000F05
+  - Name:            .rodata
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+    Address:         0x402000
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Offset:          0x2000
+    Content:         '00'
+  - Name:            .eh_frame
+    Type:            SHT_X86_64_UNWIND
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x402008
+    AddressAlign:    0x8
+    Content:         1400000000000000017A5200017810011B0C0708900100001C0000001C000000D8EFFFFF2800000000410E108602430D06630C0708000000180000003C000000E8EFFFFF3400000000410E108602430D06000000
+  - Name:            .data.rel.ro
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_WRITE, SHF_ALLOC ]
+    Address:         0x403FF8
+    AddressAlign:    0x8
+    Offset:          0x2FF8
+    Content:         '0020400000000000'
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+Symbols:
+  - Name:            .note.gnu.build-id
+    Type:            STT_SECTION
+    Section:         .note.gnu.build-id
+    Value:           0x4001C8
+  - Name:            .text
+    Type:            STT_SECTION
+    Section:         .text
+    Value:           0x401000
+  - Name:            .rodata
+    Type:            STT_SECTION
+    Section:         .rodata
+    Value:           0x402000
+  - Name:            .eh_frame
+    Type:            STT_SECTION
+    Section:         .eh_frame
+    Value:           0x402008
+  - Name:            .data.rel.ro
+    Type:            STT_SECTION
+    Section:         .data.rel.ro
+    Value:           0x403FF8
+  - Name:            .comment
+    Type:            STT_SECTION
+    Section:         .comment
+  - Name:            _start
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401030
+    Size:            0x34
+  - Name:            __bss_start
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            func
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x401000
+    Size:            0x28
+  - Name:            _edata
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+  - Name:            _end
+    Section:         .data.rel.ro
+    Binding:         STB_GLOBAL
+    Value:           0x404000
+...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main.c b/lldb/test/Shell/Debuginfod/Inputs/main.c
new file mode 100644
index 000000000000000..661e5771fcbeeb7
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/main.c
@@ -0,0 +1,82 @@
+/*
+
+script to (re)create the .yaml files:
+---------------------------------------------------------------------------
+#!/bin/sh
+
+# I need 4 different scenarios:
+# 1 - A stripped binary with it's corresponding unstripped binary:
+# 2 - A stripped binary with a corresponding -only-keep-debug symbols file
+# 3 - A split binary with it's corresponding DWP file
+# 4 - A stripped, split binary with an unstripped binary and a DWP file
+
+# Note: gnu-debuglink has to be added from the yaml2obj output,
+# as the CRC's are slightly different from the original binary
+
+mkdir -p gen
+mkdir -p run
+
+# First, compile & link the binary itself
+${builddir}/bin/clang -g -o gen/main-full.o -O0 -c main.c
+ld -nostdlib gen/main-full.o --build-id=sha1 -o gen/main-full
+${builddir}/bin/clang -g -gsplit-dwarf -o gen/main-split.o -O0 -c main.c
+ld -nostdlib gen/main-split.o --build-id=sha1 -o gen/main-split
+${builddir}/bin/llvm-dwp -e gen/main-split -o gen/main-split.dwp
+
+# Scenario 1: main-strip -> main-full (both executable and debuginfo)
+${builddir}/bin/llvm-objcopy --strip-debug gen/main-full gen/main-stripped
+${builddir}/bin/obj2yaml gen/main-full > main-full.yaml
+${builddir}/bin/obj2yaml gen/main-stripped > main-stripped.yaml
+${builddir}/bin/yaml2obj main-full.yaml > run/main-full
+${builddir}/bin/yaml2obj main-stripped.yaml > run/main-stripped
+
+# Scenario 2: main-nodbg -> main-dbg (debuginfo)
+${builddir}/bin/llvm-objcopy --only-keep-debug gen/main-full gen/main-dbg
+${builddir}/bin/llvm-objcopy --strip-debug gen/main-full gen/main-nodbg
+${builddir}/bin/obj2yaml gen/main-nodbg > main-nodbg.yaml
+${builddir}/bin/obj2yaml gen/main-dbg > main-dbg.yaml
+${builddir}/bin/yaml2obj main-nodbg.yaml > gen/main-nodbg.tmp
+${builddir}/bin/yaml2obj main-dbg.yaml > run/main-dbg
+${builddir}/bin/llvm-objcopy gen/main-nodbg.tmp --add-gnu-debuglink=run/main-dbg run/main-nodbg
+
+# Scenario 3: main-split, main-split.dwp (debuginfo)
+${builddir}/bin/obj2yaml gen/main-split > main-split.yaml
+${builddir}/bin/obj2yaml gen/main-split.dwp > main-dwp.yaml
+${builddir}/bin/yaml2obj main-split.yaml > run/main-split
+${builddir}/bin/yaml2obj main-dwp.yaml > run/main-split.dwp
+
+# Scenario 4: main-split-nodbg, main-split-dbg (executable), main-split.dwp (debuginfo)
+${builddir}/bin/llvm-objcopy --only-keep-debug gen/main-split gen/main-split-dbg
+${builddir}/bin/llvm-objcopy --strip-debug gen/main-split gen/main-split-nodbg
+${builddir}/bin/obj2yaml gen/main-split-nodbg > main-split-nodbg.yaml
+${builddir}/bin/obj2yaml gen/main-split-dbg > main-split-dbg.yaml
+${builddir}/bin/yaml2obj main-split-nodbg.yaml > gen/main-split-nodbg.tmp
+${builddir}/bin/yaml2obj main-split-dbg.yaml > run/main-split-dbg
+${builddir}/bin/llvm-objcopy gen/main-split-nodbg.tmp --add-gnu-debuglink=run/main-split-dbg run/main-split-nodbg
+# the main-dwp.yaml should be the same for both Scenario 3 and 4
+
+chmod a+x 'run/'*
+
+---------------------------------------------------------------------------
+You need to re-generate the gnu-debuglinks after the yaml2obj step (in the test)
+
+You can find the build id's in the yaml files under "NT_PRPSINFO" from the YAML files
+(grep for 'Desc')
+
+*/
+
+int func(int argc, const char **argv) {
+  return (argc + 1) * (argv[argc][0] + 2);
+}
+
+__attribute__((force_align_arg_pointer)) void _start(void) {
+
+  /* main body of program: call main(), etc */
+
+  const char *argv[] = {""};
+  func(0, argv);
+
+  /* exit system call */
+  asm("mov $60,%rax; mov $0,%rdi; syscall");
+  __builtin_unreachable(); // tell the compiler to make sure side effects are done before the asm statement
+}
diff --git a/lldb/test/Shell/Debuginfod/Inputs/mk b/lldb/test/Shell/Debuginfod/Inputs/mk
new file mode 100755
index 000000000000000..a66f4a641b42752
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/Inputs/mk
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+# I need 4 different scenarios:
+# 1 - A stripped binary with it's corresponding unstripped binary:
+# 2 - A stripped binary with a corresponding -only-keep-debug symbols file
+# 3 - A split binary with it's corresponding DWP file
+# 4 - A stripped, split binary with an unstripped binary and a DWP file
+
+mkdir -p gen
+mkdir -p run
+
+# First, compile & link the binary itself
+${builddir}/bin/clang -g -o gen/main-full.o -O0 -c main.c
+ld -nostdlib gen/main-full.o --build-id=sha1 -o gen/main-full
+${builddir}/bin/clang -g -gsplit-dwarf -o gen/main-split.o -O0 -c main.c
+ld -nostdlib gen/main-split.o --build-id=sha1 -o gen/main-split
+${builddir}/bin/llvm-dwp -e gen/main-split -o gen/main-split.dwp
+
+# Scenario 1: main-strip -> main-full (both executable and debuginfo)
+${builddir}/bin/llvm-objcopy --strip-debug gen/main-full gen/main-stripped
+${builddir}/bin/obj2yaml gen/main-full > main-full.yaml
+${builddir}/bin/obj2yaml gen/main-stripped > main-stripped.yaml
+# MAKE: ${builddir}/bin/yaml2obj main-full.yaml > run/main-full
+# MAKE: ${builddir}/bin/yaml2obj main-stripped.yaml > run/main-stripped
+
+# Scenario 2: main-nodbg -> main-dbg (debuginfo)
+${builddir}/bin/llvm-objcopy --only-keep-debug gen/main-full gen/main-dbg
+${builddir}/bin/llvm-objcopy --strip-debug gen/main-full gen/main-nodbg
+${builddir}/bin/obj2yaml gen/main-nodbg > main-nodbg.yaml
+${builddir}/bin/obj2yaml gen/main-dbg > main-dbg.yaml
+# MAKE: ${builddir}/bin/yaml2obj main-nodbg.yaml > gen/main-nodbg.tmp
+# MAKE: ${builddir}/bin/yaml2obj main-dbg.yaml > run/main-dbg
+# MAKE: ${builddir}/bin/llvm-objcopy gen/main-nodbg.tmp --add-gnu-debuglink=run/main-dbg run/main-nodbg
+
+# Scenario 3: main-split, main-split.dwp (debuginfo)
+${builddir}/bin/obj2yaml gen/main-split > main-split.yaml
+${builddir}/bin/obj2yaml gen/main-split.dwp > main-dwp.yaml
+# MAKE: ${builddir}/bin/yaml2obj main-split.yaml > run/main-split
+# MAKE: ${builddir}/bin/yaml2obj main-dwp.yaml > run/main-split.dwp
+
+# Scenario 4: main-split-nodbg, main-split-dbg (executable), main-split.dwp (debuginfo)
+${builddir}/bin/llvm-objcopy --only-keep-debug gen/main-split gen/main-split-dbg
+${builddir}/bin/llvm-objcopy --strip-debug gen/main-split gen/main-split-nodbg
+${builddir}/bin/obj2yaml gen/main-split-nodbg > main-split-nodbg.yaml
+${builddir}/bin/obj2yaml gen/main-split-dbg > main-split-dbg.yaml
+# MAKE: ${builddir}/bin/yaml2obj main-split-nodbg.yaml > gen/main-split-nodbg.tmp
+# MAKE: ${builddir}/bin/yaml2obj main-split-dbg.yaml > run/main-split-dbg
+# MAKE: ${builddir}/bin/llvm-objcopy gen/main-split-nodbg.tmp --add-gnu-debuglink=run/main-split-dbg run/main-split-nodbg
+# the main-dwp.yaml should be the same, I believe
+
+# MAKE: chmod a+x run/*
diff --git a/lldb/test/Shell/Debuginfod/okd-split-negative.test b/lldb/test/Shell/Debuginfod/okd-split-negative.test
new file mode 100644
index 000000000000000..5d5ed250c4cc1d3
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/okd-split-negative.test
@@ -0,0 +1,31 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/tmpstuff
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86
+
+# Scenario 4
+#  A stripped binary/split-dwarf combination
+# LLDB should ask Debuginfod for both it's executable AND it's symbols
+
+# RUN: yaml2obj %p/Inputs/main-split-nodbg.yaml -o %t/tmpstuff/main-split-nodbg.tmp
+# RUN: yaml2obj %p/Inputs/main-split-dbg.yaml -o %t/tmpstuff/main-split-dbg
+# RUN: yaml2obj %p/Inputs/main-dwp.yaml -o %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/debuginfo
+# RUN: llvm-objcopy %t/tmpstuff/main-split-nodbg.tmp --add-gnu-debuglink=%t/tmpstuff/main-split-dbg %t/output/main-split-nodbg
+# RUN: mv %t/tmpstuff/main-split-dbg %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/executable
+# RUN: chmod a+x %t/output/main-split-nodbg
+
+# Verify that we -don't- find symbols when not using the Debuginfod service
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/main-split-nodbg" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should NOT have source file information:
+# CHECK: Breakpoint 1: where = main-split-nodbg`func, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okd-split-positive.test b/lldb/test/Shell/Debuginfod/okd-split-positive.test
new file mode 100644
index 000000000000000..3a3f20a5c82c4b1
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/okd-split-positive.test
@@ -0,0 +1,40 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/tmpstuff
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86
+
+# Scenario 4
+#  A stripped binary/split-dwarf combination
+# LLDB should ask Debuginfod for both it's executable AND it's symbols
+
+# RUN: yaml2obj %p/Inputs/main-split-nodbg.yaml -o %t/tmpstuff/main-split-nodbg.tmp
+# RUN: yaml2obj %p/Inputs/main-split-dbg.yaml -o %t/tmpstuff/main-split-dbg
+# RUN: yaml2obj %p/Inputs/main-dwp.yaml -o %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/debuginfo
+# RUN: llvm-objcopy %t/tmpstuff/main-split-nodbg.tmp --add-gnu-debuglink=%t/tmpstuff/main-split-dbg %t/output/main-split-nodbg
+# RUN: mv %t/tmpstuff/main-split-dbg %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/executable
+# RUN: chmod a+x %t/output/main-split-nodbg
+
+# Verify that we find symbols from the Debuginfod service
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/main-split-nodbg" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "b main.c:69" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should have source file information:
+# CHECK: Symbol file: {{.*}}/main-split-nodbg
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK-NEXT: {{^[- ]+$}}
+# CHECK-NEXT: 0x{{[0-9a-f]+.*}} {{.*}}/cache/llvmcache-9657596136574283768
+# CHECK: Breakpoint 1: address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okd-stripped-negative.test b/lldb/test/Shell/Debuginfod/okd-stripped-negative.test
new file mode 100644
index 000000000000000..f110db39c11ae75
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/okd-stripped-negative.test
@@ -0,0 +1,32 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/tmpstuff
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e
+
+# Scenario 2
+#  A stripped binary, with an "-only-keep-debug" symbols file
+#  Debuginfo has the 'okd' file as the 'debuginfo' item
+# LLDB should ask Debuginfod for it's symbols
+
+# RUN: yaml2obj %p/Inputs/main-nodbg.yaml -o %t/tmpstuff/main-nodbg.tmp
+# RUN: yaml2obj %p/Inputs/main-dbg.yaml -o %t/tmpstuff/main-dbg
+# RUN: llvm-objcopy %t/tmpstuff/main-nodbg.tmp --add-gnu-debuglink=%t/tmpstuff/main-dbg %t/output/main-nodbg
+# RUN: mv %t/tmpstuff/main-dbg %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e/debuginfo
+# RUN: chmod a+x %t/output/main-nodbg
+
+# Negative test (We don't find symbols without the Debuginfod service)
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/main-nodbg" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should NOT have source file information:
+
+# CHECK: Breakpoint 1: where = main-nodbg`func, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okd-stripped-positive.test b/lldb/test/Shell/Debuginfod/okd-stripped-positive.test
new file mode 100644
index 000000000000000..67d55a16041d341
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/okd-stripped-positive.test
@@ -0,0 +1,35 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/tmpstuff
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e
+
+# Scenario 2
+#  A stripped binary, with an "-only-keep-debug" symbols file
+#  Debuginfo has the 'okd' file as the 'debuginfo' item
+# LLDB should ask Debuginfod for it's symbols
+
+# RUN: yaml2obj %p/Inputs/main-nodbg.yaml -o %t/tmpstuff/main-nodbg.tmp
+# RUN: yaml2obj %p/Inputs/main-dbg.yaml -o %t/tmpstuff/main-dbg
+# RUN: llvm-objcopy %t/tmpstuff/main-nodbg.tmp --add-gnu-debuglink=%t/tmpstuff/main-dbg %t/output/main-nodbg
+# RUN: mv %t/tmpstuff/main-dbg %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e/debuginfo
+# RUN: chmod a+x %t/output/main-nodbg
+
+# Verify that we find symbols from the Debuginfod service
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/main-nodbg" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should have source file information:
+
+# CHECK: Breakpoint 1: where = main-nodbg`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/simple-dwp-negative.test b/lldb/test/Shell/Debuginfod/simple-dwp-negative.test
new file mode 100644
index 000000000000000..e1018a1181c2412
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/simple-dwp-negative.test
@@ -0,0 +1,32 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/tmpstuff
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86
+
+# Scenario 2
+#  A stripped binary, with an "-only-keep-debug" symbols file
+#  Debuginfo has the 'okd' file as the 'debuginfo' item
+# LLDB should ask Debuginfod for it's symbols
+
+# RUN: yaml2obj %p/Inputs/main-split.yaml -o %t/output/main-split
+# RUN: yaml2obj %p/Inputs/main-dwp.yaml -o %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/debuginfo
+# RUN: chmod a+x %t/output/main-split
+
+# Negative test (We don't find symbols without the Debuginfod service)
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/main-split" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Symbol file: {{.*}}/main-split
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK-NEXT: {{^[- ]+$}}
+# CHECK-NEXT: 0x{{[0-9a-f]+.*}} unable to locate .dwo debug file {{.*}}main-split.dwo{{.*}} for skeleton DIE 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/simple-dwp-positive.test b/lldb/test/Shell/Debuginfod/simple-dwp-positive.test
new file mode 100644
index 000000000000000..acb647e83e008fb
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/simple-dwp-positive.test
@@ -0,0 +1,37 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/tmpstuff
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86
+
+# Scenario 2
+#  A stripped binary, with an "-only-keep-debug" symbols file
+#  Debuginfo has the 'okd' file as the 'debuginfo' item
+# LLDB should ask Debuginfod for it's symbols
+
+# RUN: yaml2obj %p/Inputs/main-split.yaml -o %t/output/main-split
+# RUN: yaml2obj %p/Inputs/main-dwp.yaml -o %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/debuginfo
+# RUN: chmod a+x %t/output/main-split
+
+# Positive test: We find the DWP file with the Debuginfod service
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/main-split" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Symbol file: {{.*}}/main-split
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK-NEXT: {{^[- ]+$}}
+# The cache key is stable, so we can mandate that we discover this thing from the cache
+# It's an implementation detail, so it could potentially change, but the ensures that
+# CHECK-NEXT: 0x{{[0-9a-f]+.*}} {{.*}}/cache/llvmcache-9657596136574283768
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-negative.test b/lldb/test/Shell/Debuginfod/simple-stripped-negative.test
new file mode 100644
index 000000000000000..62c7832da8fb36f
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/simple-stripped-negative.test
@@ -0,0 +1,32 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/tmpstuff
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e
+
+# Scenario 1
+#  A simple stripped binary
+#  Debuginfod has the unstripped binary as the 'executable'
+# LLDB should ask Debuginfod for it's unstripped binary
+
+# Put the unstripped binary in the Debuginfod server as 'executable'
+
+# RUN: yaml2obj %p/Inputs/main-full.yaml -o %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e/executable
+# RUN: yaml2obj %p/Inputs/main-stripped.yaml -o %t/output/main-stripped
+# RUN: chmod a+x %t/output/main-stripped
+
+# Run a negative test (make sure we don't have symbols)
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/main-stripped" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should NOT have source file information:
+
+# CHECK: Breakpoint 1: where = main-stripped`func, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-positive.test b/lldb/test/Shell/Debuginfod/simple-stripped-positive.test
new file mode 100644
index 000000000000000..78671b6eb463aa3
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/simple-stripped-positive.test
@@ -0,0 +1,38 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/tmpstuff
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e
+
+# Scenario 1
+#  A simple stripped binary
+#  Debuginfod has the unstripped binary as the 'executable'
+# LLDB should ask Debuginfod for it's unstripped binary
+
+# Put the unstripped binary in the Debuginfod server as 'executable'
+
+# RUN: yaml2obj %p/Inputs/main-full.yaml -o %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e/executable
+# RUN: yaml2obj %p/Inputs/main-stripped.yaml -o %t/output/main-stripped
+# RUN: chmod a+x %t/output/main-stripped
+
+# First, run a negative test (make sure we don't have symbols)
+
+# Scenario 1, postive test: Can we pull the executable
+# from Debuginfod and get a breakpoint set properly?
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/main-stripped" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should have source file info:
+
+# CHECK: Breakpoint 1: where = main-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/tests.md b/lldb/test/Shell/Debuginfod/tests.md
new file mode 100644
index 000000000000000..7fe3e9e68d4ed32
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/tests.md
@@ -0,0 +1,61 @@
+# Tests for basic Debuginfod functionality
+
+Because the Debuginfod protocol is a simple HTTP path-based system, one can
+mimic a Debuginfod server by setting up a directory structure to reflect the
+protocol properly. That's how all these tests operate. We override the default
+`DEBUGINFOD_URLS` property with a `file://` URL and populate it with the symbol
+files we need for testing.
+
+## Baseline capabilities
+
+Things to test:
+
+- Just for sanity, the `-no-locator` tests validate that lldb works as the test
+  expects if the files that Debuginfod _should_ provide are already there.
+- Validate that symbols _aren't_ found without Debuginfod, to ensure they
+  weren't cached from previous runs (`-negative` tests).
+- Validate that the Debuginfod symbol locator is providing the expected symbols
+  when the debugger doesn't already have them available.
+
+## Symbol "Configurations" to test
+
+There are 2 top level configurations, each of which then get some post-processing.
+- The 'normal' build: a simple binary built with debug information (`-g`)
+- The 'split' build: A binary built with `-gsplit-dwarf` that produces `.dwo` and `.dwp` files
+
+For the normal build there are 2 post-processing steps where Debuginfod may be used.
+- Strip the binary while hosting the full, unstripped binary on a Debuginfod server.
+- Strip the binary and produce a corresponding 'only-keep-debug' version of the binary to host on a Debuginfod server.
+
+For the split build, there are *3* post-processing outcomes where Debuginfod usage makes sense:
+- Stripped binary, hosting the full unstripped binary on a Debuginfod server, along with it's `.dwp` file.
+- Stripped binary, hosting the 'only-keep-debug' version of the binary *and* it's `.dwp` file.
+- Unstripped binary, hosting only the `.dwp` file on the Debuginfod server.
+
+For both normal and split builds, when using an 'only-keep-debug' symbol file, the original file
+also requires the addition of the `.gnu.debuglink` section (which can be added using `objcopy`)
+
+### Troubles
+
+The Debuginfod protocol is somewhat underspecified regarding what the 2 different callbacks actually return. The protocol itself is quite simple: query an HTTP server with the path `buildid/{.note.gnu.build-id hash}/debuginfo` and `buildid/{.note.gnu.build-id hash}/executable`. A keen reader may note that there's one configuration (split, only-keep-debug) where you need two different files to properly symbolicate, but the API only supports a single debuginfo file. For that scenario, I've chosen to simply treat the `.dwp` file as "debuginfo" and the "only-keep-debug" stripped binary as "executable". This scenario doesn't actually work at all in GDB. It seems more straightforward than trying to extend the protocol.
+
+### Stripped:
+
+- Should ask for symbols from the service; can be registered as 'executable' and
+  they should work!
+
+### Stripped "only-keep-debug":
+
+- Should get them from the debuginfo, not from the executable query
+
+### split-dwarf:
+
+- Should get dwp file from debuginfo
+
+### split-dwarf + stripped:
+
+- Should get dwp from debuginfo, and the unstripped binary from executable
+
+
+image
+lldb.target.ResolveLoadAddress
diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp b/llvm/lib/Debuginfod/Debuginfod.cpp
index 0dd8a7de1245b31..1244793dff20d87 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -252,27 +252,54 @@ static SmallVector<std::string, 0> getHeaders() {
   return Headers;
 }
 
-Expected<std::string> getCachedOrDownloadArtifact(
-    StringRef UniqueKey, StringRef UrlPath, StringRef CacheDirectoryPath,
-    ArrayRef<StringRef> DebuginfodUrls, std::chrono::milliseconds Timeout) {
+static SmallString<64> getCachedArtifactPath(StringRef UniqueKey,
+                                             StringRef CacheDirectoryPath) {
   SmallString<64> AbsCachedArtifactPath;
   sys::path::append(AbsCachedArtifactPath, CacheDirectoryPath,
                     "llvmcache-" + UniqueKey);
+  return AbsCachedArtifactPath;
+}
+
+static Expected<AddStreamFn>
+getCachedArtifactHelper(StringRef UniqueKey, StringRef CacheDirectoryPath,
+                        unsigned &Task) {
+  SmallString<64> AbsCachedArtifactPath =
+      getCachedArtifactPath(UniqueKey, CacheDirectoryPath);
 
   Expected<FileCache> CacheOrErr =
       localCache("Debuginfod-client", ".debuginfod-client", CacheDirectoryPath);
   if (!CacheOrErr)
     return CacheOrErr.takeError();
+  return (*CacheOrErr)(Task, UniqueKey, "");
+}
+
+Expected<std::string> getCachedArtifact(StringRef UniqueKey,
+                                        StringRef CacheDirectoryPath) {
+  // We choose an arbitrary Task parameter as we do not make use of it.
+  unsigned Task = 0;
+  Expected<AddStreamFn> CacheAddStreamOrErr =
+      getCachedArtifactHelper(UniqueKey, CacheDirectoryPath, Task);
+  if (!CacheAddStreamOrErr)
+    return CacheAddStreamOrErr.takeError();
+  if (!*CacheAddStreamOrErr)
+    return std::string(getCachedArtifactPath(UniqueKey, CacheDirectoryPath));
+  return createStringError(errc::argument_out_of_domain,
+                           "build id not found in cache");
+}
 
-  FileCache Cache = *CacheOrErr;
+Expected<std::string> getCachedOrDownloadArtifact(
+    StringRef UniqueKey, StringRef UrlPath, StringRef CacheDirectoryPath,
+    ArrayRef<StringRef> DebuginfodUrls, std::chrono::milliseconds Timeout) {
   // We choose an arbitrary Task parameter as we do not make use of it.
   unsigned Task = 0;
-  Expected<AddStreamFn> CacheAddStreamOrErr = Cache(Task, UniqueKey, "");
+  Expected<AddStreamFn> CacheAddStreamOrErr =
+      getCachedArtifactHelper(UniqueKey, CacheDirectoryPath, Task);
   if (!CacheAddStreamOrErr)
     return CacheAddStreamOrErr.takeError();
   AddStreamFn &CacheAddStream = *CacheAddStreamOrErr;
   if (!CacheAddStream)
-    return std::string(AbsCachedArtifactPath);
+    return std::string(getCachedArtifactPath(UniqueKey, CacheDirectoryPath));
+
   // The artifact was not found in the local cache, query the debuginfod
   // servers.
   if (!HTTPClient::isAvailable())
@@ -315,7 +342,7 @@ Expected<std::string> getCachedOrDownloadArtifact(
     pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
 
     // Return the path to the artifact on disk.
-    return std::string(AbsCachedArtifactPath);
+    return std::string(getCachedArtifactPath(UniqueKey, CacheDirectoryPath));
   }
 
   return createStringError(errc::argument_out_of_domain, "build id not found");
diff --git a/llvm/utils/gn/build/write_library_dependencies.py b/llvm/utils/gn/build/write_library_dependencies.py
index ba1a8a0157314df..e88ed8d6411ec79 100644
--- a/llvm/utils/gn/build/write_library_dependencies.py
+++ b/llvm/utils/gn/build/write_library_dependencies.py
@@ -37,6 +37,7 @@
 { "coverage", "LLVMCoverage", true, {"core", "object", "profiledata", "support"} },
 { "debuginfocodeview", "LLVMDebugInfoCodeView", true, {"support", "debuginfomsf"} },
 { "debuginfodwarf", "LLVMDebugInfoDWARF", true, {"binaryformat", "object", "mc", "support"} },
+{ "debuginfod", "LLVMDebuginfod", true, {} },
 { "debuginfogsym", "LLVMDebugInfoGSYM", true, {"mc", "object", "support", "debuginfodwarf"} },
 { "debuginfomsf", "LLVMDebugInfoMSF", true, {"support"} },
 { "debuginfopdb", "LLVMDebugInfoPDB", true, {"binaryformat", "object", "support", "debuginfocodeview", "debuginfomsf"} },
diff --git a/llvm/utils/lldbDataFormatters.py b/llvm/utils/lldbDataFormatters.py
index de101abdabc8ecd..5acc02c9c8e8f4a 100644
--- a/llvm/utils/lldbDataFormatters.py
+++ b/llvm/utils/lldbDataFormatters.py
@@ -373,6 +373,7 @@ def DenseMapSummary(valobj: lldb.SBValue, _) -> str:
     return summary
 
 
+"""
 class DenseMapSynthetic:
     valobj: lldb.SBValue
 
@@ -431,3 +432,4 @@ def update(self):
         for indexes in key_buckets.values():
             if len(indexes) == 1:
                 self.child_buckets.append(indexes[0])
+"""

>From aa30eefe3d4570d6ef5a677e5ae156ba3a12e85c Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Mon, 22 Jan 2024 08:23:42 -0800
Subject: [PATCH 03/10] Getting all 5 variations documented and tests

---
 .../{main-full.yaml => bin-normal.yaml}       |   8 +-
 .../{main-dwp.yaml => bin-split-dwp.yaml}     |   2 +-
 ...lit-nodbg.yaml => bin-split-stripped.yaml} |   4 +-
 .../{main-split.yaml => bin-split.yaml}       |   8 +-
 .../{main-stripped.yaml => bin-stripped.yaml} |   4 +-
 .../Shell/Debuginfod/Inputs/main-nodbg.yaml   | 146 ------------------
 lldb/test/Shell/Debuginfod/Inputs/mk          | 119 +++++++++-----
 .../{main-split-dbg.yaml => sym-split.yaml}   |   8 +-
 .../{main-dbg.yaml => sym-stripped.yaml}      |   8 +-
 .../Debuginfod/simple-stripped-negative.test  |  21 +--
 .../simple-stripped-no-locator.test           |  24 +++
 .../simple-stripped-positive-a.test           |  35 +++++
 ...e.test => simple-stripped-positive-b.test} |  17 +-
 lldb/test/Shell/Debuginfod/tests.md           | 109 ++++++-------
 14 files changed, 226 insertions(+), 287 deletions(-)
 rename lldb/test/Shell/Debuginfod/Inputs/{main-full.yaml => bin-normal.yaml} (95%)
 rename lldb/test/Shell/Debuginfod/Inputs/{main-dwp.yaml => bin-split-dwp.yaml} (92%)
 rename lldb/test/Shell/Debuginfod/Inputs/{main-split-nodbg.yaml => bin-split-stripped.yaml} (96%)
 rename lldb/test/Shell/Debuginfod/Inputs/{main-split.yaml => bin-split.yaml} (95%)
 rename lldb/test/Shell/Debuginfod/Inputs/{main-stripped.yaml => bin-stripped.yaml} (96%)
 delete mode 100644 lldb/test/Shell/Debuginfod/Inputs/main-nodbg.yaml
 rename lldb/test/Shell/Debuginfod/Inputs/{main-split-dbg.yaml => sym-split.yaml} (95%)
 rename lldb/test/Shell/Debuginfod/Inputs/{main-dbg.yaml => sym-stripped.yaml} (95%)
 create mode 100644 lldb/test/Shell/Debuginfod/simple-stripped-no-locator.test
 create mode 100644 lldb/test/Shell/Debuginfod/simple-stripped-positive-a.test
 rename lldb/test/Shell/Debuginfod/{simple-stripped-positive.test => simple-stripped-positive-b.test} (62%)

diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-full.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-normal.yaml
similarity index 95%
rename from lldb/test/Shell/Debuginfod/Inputs/main-full.yaml
rename to lldb/test/Shell/Debuginfod/Inputs/bin-normal.yaml
index bcaa75028954268..1e8b8ffeee25e09 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main-full.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-normal.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            B4927EA09A08EE63313299CF347043010D03CC5E
+        Desc:            725D47B7EE964F615C841A04712D6F43175F9D8D
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_PROGBITS
@@ -94,7 +94,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
@@ -106,7 +106,7 @@ Sections:
   - Name:            .debug_line
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000004F0B089C0626CBD8AB443134CFE6DD950400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D00000000AA7BC59AF617547916B47B73E78D55160400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
   - Name:            .debug_line_str
     Type:            SHT_PROGBITS
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
@@ -191,7 +191,7 @@ Symbols:
     Value:           0x404000
 DWARF:
   debug_str:
-    - 'Facebook clang version 15.0.0 (git at github.com:kevinfrei/llvm.git 936cbb55363f8cc626d0a036fa840e87713572d9)'
+    - 'Facebook clang version 15.0.0 (git at github.com:kevinfrei/llvm.git f2b81cb569d0632a0eb0fd51722d725ab191af72)'
     - main.c
     - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
     - char
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-dwp.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-split-dwp.yaml
similarity index 92%
rename from lldb/test/Shell/Debuginfod/Inputs/main-dwp.yaml
rename to lldb/test/Shell/Debuginfod/Inputs/bin-split-dwp.yaml
index 60b086adf1d633f..1f18c04a4415add 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main-dwp.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-split-dwp.yaml
@@ -21,7 +21,7 @@ Sections:
     Flags:           [ SHF_EXCLUDE, SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         63686172005F5F41525241595F53495A455F545950455F5F0066756E6300696E74005F7374617274006172676300617267760046616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E676974203933366362623535333633663863633632366430613033366661383430653837373133353732643929006D61696E2E630067656E2F6D61696E2D73706C69742E64776F00
+    Content:         63686172005F5F41525241595F53495A455F545950455F5F0066756E6300696E74005F7374617274006172676300617267760046616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E676974206632623831636235363964303633326130656230666435313732326437323561623139316166373229006D61696E2E630067656E2F62696E2D73706C69742E64776F00
   - Name:            .debug_str_offsets.dwo
     Type:            SHT_PROGBITS
     Flags:           [ SHF_EXCLUDE ]
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-split-nodbg.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-split-stripped.yaml
similarity index 96%
rename from lldb/test/Shell/Debuginfod/Inputs/main-split-nodbg.yaml
rename to lldb/test/Shell/Debuginfod/Inputs/bin-split-stripped.yaml
index 11798976f5c15ab..6501cda4a4f7e69 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main-split-nodbg.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-split-stripped.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            8B5B6416F61ADC140AE457E208F1699F89BFDA86
+        Desc:            82B2C35129DAB19AD58F3DD0F426BDB0CC8AA094
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_PROGBITS
@@ -94,7 +94,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
 Symbols:
   - Name:            .note.gnu.build-id
     Type:            STT_SECTION
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-split.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-split.yaml
similarity index 95%
rename from lldb/test/Shell/Debuginfod/Inputs/main-split.yaml
rename to lldb/test/Shell/Debuginfod/Inputs/bin-split.yaml
index e03ff90187f40dd..b99d0ede47c21db 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main-split.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-split.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            8B5B6416F61ADC140AE457E208F1699F89BFDA86
+        Desc:            82B2C35129DAB19AD58F3DD0F426BDB0CC8AA094
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_PROGBITS
@@ -94,7 +94,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
@@ -106,7 +106,7 @@ Sections:
   - Name:            .debug_line
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000004F0B089C0626CBD8AB443134CFE6DD950400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D00000000AA7BC59AF617547916B47B73E78D55160400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
   - Name:            .debug_line_str
     Type:            SHT_PROGBITS
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
@@ -206,7 +206,7 @@ Symbols:
 DWARF:
   debug_str:
     - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
-    - 'gen/main-split.dwo'
+    - 'gen/bin-split.dwo'
   debug_addr:
     - Length:          0x14
       Version:         0x5
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-stripped.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-stripped.yaml
similarity index 96%
rename from lldb/test/Shell/Debuginfod/Inputs/main-stripped.yaml
rename to lldb/test/Shell/Debuginfod/Inputs/bin-stripped.yaml
index a4465d75fa6dafa..6c8045e9a2068b4 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main-stripped.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-stripped.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            B4927EA09A08EE63313299CF347043010D03CC5E
+        Desc:            725D47B7EE964F615C841A04712D6F43175F9D8D
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_PROGBITS
@@ -94,7 +94,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
 Symbols:
   - Name:            .note.gnu.build-id
     Type:            STT_SECTION
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-nodbg.yaml b/lldb/test/Shell/Debuginfod/Inputs/main-nodbg.yaml
deleted file mode 100644
index a4465d75fa6dafa..000000000000000
--- a/lldb/test/Shell/Debuginfod/Inputs/main-nodbg.yaml
+++ /dev/null
@@ -1,146 +0,0 @@
---- !ELF
-FileHeader:
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_EXEC
-  Machine:         EM_X86_64
-  Entry:           0x401030
-ProgramHeaders:
-  - Type:            PT_LOAD
-    Flags:           [ PF_R ]
-    FirstSec:        .note.gnu.build-id
-    LastSec:         .note.gnu.build-id
-    VAddr:           0x400000
-    Align:           0x1000
-    Offset:          0x0
-  - Type:            PT_LOAD
-    Flags:           [ PF_X, PF_R ]
-    FirstSec:        .text
-    LastSec:         .text
-    VAddr:           0x401000
-    Align:           0x1000
-    Offset:          0x1000
-  - Type:            PT_LOAD
-    Flags:           [ PF_R ]
-    FirstSec:        .rodata
-    LastSec:         .eh_frame
-    VAddr:           0x402000
-    Align:           0x1000
-    Offset:          0x2000
-  - Type:            PT_LOAD
-    Flags:           [ PF_W, PF_R ]
-    FirstSec:        .data.rel.ro
-    LastSec:         .data.rel.ro
-    VAddr:           0x403FF8
-    Align:           0x1000
-    Offset:          0x2FF8
-  - Type:            PT_NOTE
-    Flags:           [ PF_R ]
-    FirstSec:        .note.gnu.build-id
-    LastSec:         .note.gnu.build-id
-    VAddr:           0x4001C8
-    Align:           0x4
-    Offset:          0x1C8
-  - Type:            PT_GNU_STACK
-    Flags:           [ PF_W, PF_R ]
-    Align:           0x10
-    Offset:          0x0
-  - Type:            PT_GNU_RELRO
-    Flags:           [ PF_R ]
-    FirstSec:        .data.rel.ro
-    LastSec:         .data.rel.ro
-    VAddr:           0x403FF8
-    Offset:          0x2FF8
-Sections:
-  - Name:            .note.gnu.build-id
-    Type:            SHT_NOTE
-    Flags:           [ SHF_ALLOC ]
-    Address:         0x4001C8
-    AddressAlign:    0x4
-    Notes:
-      - Name:            GNU
-        Desc:            B4927EA09A08EE63313299CF347043010D03CC5E
-        Type:            NT_PRPSINFO
-  - Name:            .text
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
-    Address:         0x401000
-    AddressAlign:    0x10
-    Offset:          0x1000
-    Content:         554889E5897DFC488975F08B45FC83C001488B4DF0486355FC488B0CD10FBE0983C1020FAFC15DC30F1F840000000000554889E54883E4F04883EC10488B05B52F00004889442408488D74240831FFE8ACFFFFFF48C7C03C00000048C7C7000000000F05
-  - Name:            .rodata
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
-    Address:         0x402000
-    AddressAlign:    0x1
-    EntSize:         0x1
-    Offset:          0x2000
-    Content:         '00'
-  - Name:            .eh_frame
-    Type:            SHT_X86_64_UNWIND
-    Flags:           [ SHF_ALLOC ]
-    Address:         0x402008
-    AddressAlign:    0x8
-    Content:         1400000000000000017A5200017810011B0C0708900100001C0000001C000000D8EFFFFF2800000000410E108602430D06630C0708000000180000003C000000E8EFFFFF3400000000410E108602430D06000000
-  - Name:            .data.rel.ro
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_WRITE, SHF_ALLOC ]
-    Address:         0x403FF8
-    AddressAlign:    0x8
-    Offset:          0x2FF8
-    Content:         '0020400000000000'
-  - Name:            .comment
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_MERGE, SHF_STRINGS ]
-    AddressAlign:    0x1
-    EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
-Symbols:
-  - Name:            .note.gnu.build-id
-    Type:            STT_SECTION
-    Section:         .note.gnu.build-id
-    Value:           0x4001C8
-  - Name:            .text
-    Type:            STT_SECTION
-    Section:         .text
-    Value:           0x401000
-  - Name:            .rodata
-    Type:            STT_SECTION
-    Section:         .rodata
-    Value:           0x402000
-  - Name:            .eh_frame
-    Type:            STT_SECTION
-    Section:         .eh_frame
-    Value:           0x402008
-  - Name:            .data.rel.ro
-    Type:            STT_SECTION
-    Section:         .data.rel.ro
-    Value:           0x403FF8
-  - Name:            .comment
-    Type:            STT_SECTION
-    Section:         .comment
-  - Name:            _start
-    Type:            STT_FUNC
-    Section:         .text
-    Binding:         STB_GLOBAL
-    Value:           0x401030
-    Size:            0x34
-  - Name:            __bss_start
-    Section:         .data.rel.ro
-    Binding:         STB_GLOBAL
-    Value:           0x404000
-  - Name:            func
-    Type:            STT_FUNC
-    Section:         .text
-    Binding:         STB_GLOBAL
-    Value:           0x401000
-    Size:            0x28
-  - Name:            _edata
-    Section:         .data.rel.ro
-    Binding:         STB_GLOBAL
-    Value:           0x404000
-  - Name:            _end
-    Section:         .data.rel.ro
-    Binding:         STB_GLOBAL
-    Value:           0x404000
-...
diff --git a/lldb/test/Shell/Debuginfod/Inputs/mk b/lldb/test/Shell/Debuginfod/Inputs/mk
index a66f4a641b42752..b222b5c028a2a2e 100755
--- a/lldb/test/Shell/Debuginfod/Inputs/mk
+++ b/lldb/test/Shell/Debuginfod/Inputs/mk
@@ -1,51 +1,86 @@
 #!/bin/sh
 
-# I need 4 different scenarios:
+# I need 5 different scenarios:
 # 1 - A stripped binary with it's corresponding unstripped binary:
-# 2 - A stripped binary with a corresponding -only-keep-debug symbols file
+# 2 - A stripped binary with a corresponding --only-keep-debug symbols file
 # 3 - A split binary with it's corresponding DWP file
 # 4 - A stripped, split binary with an unstripped binary and a DWP file
+# 5 - A stripped, split binary with an --only-keep-debug symbols file and a DWP file
 
 mkdir -p gen
 mkdir -p run
 
-# First, compile & link the binary itself
-${builddir}/bin/clang -g -o gen/main-full.o -O0 -c main.c
-ld -nostdlib gen/main-full.o --build-id=sha1 -o gen/main-full
-${builddir}/bin/clang -g -gsplit-dwarf -o gen/main-split.o -O0 -c main.c
-ld -nostdlib gen/main-split.o --build-id=sha1 -o gen/main-split
-${builddir}/bin/llvm-dwp -e gen/main-split -o gen/main-split.dwp
-
-# Scenario 1: main-strip -> main-full (both executable and debuginfo)
-${builddir}/bin/llvm-objcopy --strip-debug gen/main-full gen/main-stripped
-${builddir}/bin/obj2yaml gen/main-full > main-full.yaml
-${builddir}/bin/obj2yaml gen/main-stripped > main-stripped.yaml
-# MAKE: ${builddir}/bin/yaml2obj main-full.yaml > run/main-full
-# MAKE: ${builddir}/bin/yaml2obj main-stripped.yaml > run/main-stripped
-
-# Scenario 2: main-nodbg -> main-dbg (debuginfo)
-${builddir}/bin/llvm-objcopy --only-keep-debug gen/main-full gen/main-dbg
-${builddir}/bin/llvm-objcopy --strip-debug gen/main-full gen/main-nodbg
-${builddir}/bin/obj2yaml gen/main-nodbg > main-nodbg.yaml
-${builddir}/bin/obj2yaml gen/main-dbg > main-dbg.yaml
-# MAKE: ${builddir}/bin/yaml2obj main-nodbg.yaml > gen/main-nodbg.tmp
-# MAKE: ${builddir}/bin/yaml2obj main-dbg.yaml > run/main-dbg
-# MAKE: ${builddir}/bin/llvm-objcopy gen/main-nodbg.tmp --add-gnu-debuglink=run/main-dbg run/main-nodbg
-
-# Scenario 3: main-split, main-split.dwp (debuginfo)
-${builddir}/bin/obj2yaml gen/main-split > main-split.yaml
-${builddir}/bin/obj2yaml gen/main-split.dwp > main-dwp.yaml
-# MAKE: ${builddir}/bin/yaml2obj main-split.yaml > run/main-split
-# MAKE: ${builddir}/bin/yaml2obj main-dwp.yaml > run/main-split.dwp
-
-# Scenario 4: main-split-nodbg, main-split-dbg (executable), main-split.dwp (debuginfo)
-${builddir}/bin/llvm-objcopy --only-keep-debug gen/main-split gen/main-split-dbg
-${builddir}/bin/llvm-objcopy --strip-debug gen/main-split gen/main-split-nodbg
-${builddir}/bin/obj2yaml gen/main-split-nodbg > main-split-nodbg.yaml
-${builddir}/bin/obj2yaml gen/main-split-dbg > main-split-dbg.yaml
-# MAKE: ${builddir}/bin/yaml2obj main-split-nodbg.yaml > gen/main-split-nodbg.tmp
-# MAKE: ${builddir}/bin/yaml2obj main-split-dbg.yaml > run/main-split-dbg
-# MAKE: ${builddir}/bin/llvm-objcopy gen/main-split-nodbg.tmp --add-gnu-debuglink=run/main-split-dbg run/main-split-nodbg
-# the main-dwp.yaml should be the same, I believe
-
-# MAKE: chmod a+x run/*
+# First, compile & link the binaries (normal and split)
+
+${builddir}/bin/clang -g -o gen/bin-normal.o -O0 -c main.c
+ld -nostdlib gen/bin-normal.o --build-id=sha1 -o gen/bin-normal
+${builddir}/bin/clang -g -gsplit-dwarf -o gen/bin-split.o -O0 -c main.c
+ld -nostdlib gen/bin-split.o --build-id=sha1 -o gen/bin-split
+
+# Next, create the file variations we need
+
+# Variation 1: -g, stripped
+${builddir}/bin/llvm-objcopy --strip-debug gen/bin-normal gen/bin-stripped
+# Variation 2: -g, stripped, --only-keep-debug symbols
+${builddir}/bin/llvm-objcopy --only-keep-debug gen/bin-normal gen/sym-stripped
+# Variation 3: -gsplit-dwarf: .dwp
+${builddir}/bin/llvm-dwp -e gen/bin-split -o gen/bin-split.dwp
+# Variation 4: -gsplit-dwarf: stripped, .dwp
+${builddir}/bin/llvm-objcopy --strip-debug gen/bin-split gen/bin-split-stripped
+# Variation 5: -gsplit-dwarf: stripped, --only-keep-debug + .dwp
+${builddir}/bin/llvm-objcopy --only-keep-debug gen/bin-split gen/sym-split
+
+# Finally, produce the .yaml files for testing
+
+# Scenario 1:
+# target:  bin-stripped
+# Scenario 1a:
+# symbols: bin-normal (hosted as debuginfo)
+# Scenario 1b:
+# symbols: bin-normal (hosted as executable)
+${builddir}/bin/obj2yaml gen/bin-stripped -o bin-stripped.yaml
+${builddir}/bin/obj2yaml gen/bin-normal -o bin-normal.yaml
+# @ testing time: yaml2obj bin-stripped.yaml -o ${out}/bin-stripped
+# @ testing time: yaml2obj bin-normal.yaml -o ${out}/bin-normal
+
+
+# Scenario 2:
+# target:  bin-stripped-okd
+# Scenario 2a:
+# symbols: sym-stripped (hosted as debuginfo)
+# Scenario 2b:
+# symbols: sym-stripped (hosted as executable)
+${builddir}/bin/obj2yaml gen/sym-stripped -o sym-stripped.yaml
+# To produce a correct .gnu.debuglink, you have to do it at test generation time.
+# The section includes a CRC that yaml2obj doesn't properly produce.
+# @ testing time: yaml2obj sym-stripped.yaml -o ${out}/sym-stripped
+# @ testing time: llvm-objcopy bin-stripped --add-gnu-debuglink=${out}/sym-stripped ${out}/bin-stripped-okd
+
+# Scenario 3:
+# target: bin-split
+# DWP:    bin-split.dwp (hosted as debuginfo)
+${builddir}/bin/obj2yaml gen/bin-split -o bin-split.yaml
+${builddir}/bin/obj2yaml gen/bin-split.dwp -o bin-split-dwp.yaml
+# @ testing time: yaml2obj bin-split.yaml -o ${out}/bin-split
+# @ testing time: yaml2obj bin-split-dwp.yaml -o ${out}/bin-split.dwp
+
+# Scenario 4:
+# target:  bin-split-stripped
+# symbols: bin-split (hosted as executable)
+# DWP      bin-split.dwp (hosted as debuginfo)
+# This doesn't work from a file system "as is".
+# I believe you can set the symbol file manually to the bin-split file.
+# TODO: Need to check for the -no-locator test to see what the name of
+# the .dwp is expected to be.
+${builddir}/bin/obj2yaml gen/bin-split-stripped -o bin-split-stripped.yaml
+# bin-split and bin-split.dwp already generated in Scenario 3
+# @ testing time: yaml2obj bin-split-stripped.yaml -o ${out}/bin-split-stripped
+
+# Scenario 5:
+# target:  bin-split-stripped-okd
+# symbols: sym-split (hosted as executable)
+# DWP:     bin-split.dwp (hosted as debuginfo)
+${builddir}/bin/obj2yaml gen/sym-split -o sym-split.yaml
+# @ testing time: yaml2obj main-split-nodbg.yaml -o gen/main-split-nodbg.tmp
+# @ testing time: yaml2obj main-split-dbg.yaml -o run/main-split-dbg
+# @ testing time: llvm-objcopy gen/main-split-nodbg.tmp --add-gnu-debuglink=run/main-split-dbg run/main-split-nodbg
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-split-dbg.yaml b/lldb/test/Shell/Debuginfod/Inputs/sym-split.yaml
similarity index 95%
rename from lldb/test/Shell/Debuginfod/Inputs/main-split-dbg.yaml
rename to lldb/test/Shell/Debuginfod/Inputs/sym-split.yaml
index 34d157b66c6b79a..f25e4c4abf5c24a 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main-split-dbg.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/sym-split.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            8B5B6416F61ADC140AE457E208F1699F89BFDA86
+        Desc:            82B2C35129DAB19AD58F3DD0F426BDB0CC8AA094
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_NOBITS
@@ -93,7 +93,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
@@ -105,7 +105,7 @@ Sections:
   - Name:            .debug_line
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000004F0B089C0626CBD8AB443134CFE6DD950400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D00000000AA7BC59AF617547916B47B73E78D55160400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
   - Name:            .debug_line_str
     Type:            SHT_PROGBITS
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
@@ -205,7 +205,7 @@ Symbols:
 DWARF:
   debug_str:
     - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
-    - 'gen/main-split.dwo'
+    - 'gen/bin-split.dwo'
   debug_addr:
     - Length:          0x14
       Version:         0x5
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main-dbg.yaml b/lldb/test/Shell/Debuginfod/Inputs/sym-stripped.yaml
similarity index 95%
rename from lldb/test/Shell/Debuginfod/Inputs/main-dbg.yaml
rename to lldb/test/Shell/Debuginfod/Inputs/sym-stripped.yaml
index 1cc8bffc59ce3a8..608e9d04b2ebf29 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main-dbg.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/sym-stripped.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            B4927EA09A08EE63313299CF347043010D03CC5E
+        Desc:            725D47B7EE964F615C841A04712D6F43175F9D8D
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_NOBITS
@@ -93,7 +93,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420393336636262353533363366386363363236643061303336666138343065383737313335373264392900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
@@ -105,7 +105,7 @@ Sections:
   - Name:            .debug_line
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000004F0B089C0626CBD8AB443134CFE6DD950400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D00000000AA7BC59AF617547916B47B73E78D55160400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
   - Name:            .debug_line_str
     Type:            SHT_PROGBITS
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
@@ -190,7 +190,7 @@ Symbols:
     Value:           0x404000
 DWARF:
   debug_str:
-    - 'Facebook clang version 15.0.0 (git at github.com:kevinfrei/llvm.git 936cbb55363f8cc626d0a036fa840e87713572d9)'
+    - 'Facebook clang version 15.0.0 (git at github.com:kevinfrei/llvm.git f2b81cb569d0632a0eb0fd51722d725ab191af72)'
     - main.c
     - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
     - char
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-negative.test b/lldb/test/Shell/Debuginfod/simple-stripped-negative.test
index 62c7832da8fb36f..2c4128e0d04b680 100644
--- a/lldb/test/Shell/Debuginfod/simple-stripped-negative.test
+++ b/lldb/test/Shell/Debuginfod/simple-stripped-negative.test
@@ -1,32 +1,23 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# This is paranoia to make sure there's not a cached symbol file laying around
 
-# RUN: rm -rf %t || echo ok
 # RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/tmpstuff
-# RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e
 
 # Scenario 1
-#  A simple stripped binary
-#  Debuginfod has the unstripped binary as the 'executable'
-# LLDB should ask Debuginfod for it's unstripped binary
+#  A simple stripped binary, no symbols (negative test: nothing's been cached, right?)
 
-# Put the unstripped binary in the Debuginfod server as 'executable'
-
-# RUN: yaml2obj %p/Inputs/main-full.yaml -o %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e/executable
-# RUN: yaml2obj %p/Inputs/main-stripped.yaml -o %t/output/main-stripped
-# RUN: chmod a+x %t/output/main-stripped
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped
+# RUN: chmod a+x %t/output/bin-stripped
 
 # Run a negative test (make sure we don't have symbols)
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/main-stripped" \
+# RUN:       -o "target create %t/output/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
 # Should NOT have source file information:
 
-# CHECK: Breakpoint 1: where = main-stripped`func, address = 0x{{[0-9a-f]+}}
+# CHECK: Breakpoint 1: where = bin-stripped`func, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-no-locator.test b/lldb/test/Shell/Debuginfod/simple-stripped-no-locator.test
new file mode 100644
index 000000000000000..5ae9691d4939862
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/simple-stripped-no-locator.test
@@ -0,0 +1,24 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# RUN: mkdir -p %t/output
+
+# Scenario 1
+#  A simple stripped binary, add the unstripped binary as a symbol file
+#  (Sanity for comparison with Debuginfod-provided symbols)
+
+# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/output/bin-normal
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped
+# RUN: chmod a+x %t/output/bin-stripped
+
+# Run a negative test (make sure we don't have symbols)
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "target symbols add %t/output/bin-normal" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should NOT have source file information:
+
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-positive-a.test b/lldb/test/Shell/Debuginfod/simple-stripped-positive-a.test
new file mode 100644
index 000000000000000..98df28b5c3232ba
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/simple-stripped-positive-a.test
@@ -0,0 +1,35 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
+
+# Scenario 1a
+#  A simple stripped binary
+#  Debuginfod has the unstripped binary as the 'debuginfo'
+
+# Put the unstripped binary in the Debuginfod server as 'debuginfo'
+
+# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/debuginfo
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped
+# RUN: chmod a+x %t/output/bin-stripped
+
+# First, run a negative test (make sure we don't have symbols)
+
+# Scenario 1, postive test: Can we pull the executable
+# from Debuginfod and get a breakpoint set properly?
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should have source file info:
+
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-positive.test b/lldb/test/Shell/Debuginfod/simple-stripped-positive-b.test
similarity index 62%
rename from lldb/test/Shell/Debuginfod/simple-stripped-positive.test
rename to lldb/test/Shell/Debuginfod/simple-stripped-positive-b.test
index 78671b6eb463aa3..cc9aaee072b0f82 100644
--- a/lldb/test/Shell/Debuginfod/simple-stripped-positive.test
+++ b/lldb/test/Shell/Debuginfod/simple-stripped-positive-b.test
@@ -2,22 +2,19 @@
 
 # We set up a file-system 'hosted' Debuginfod server
 
-# RUN: rm -rf %t || echo ok
 # RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/tmpstuff
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e
+# RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
 
-# Scenario 1
+# Scenario 1a
 #  A simple stripped binary
 #  Debuginfod has the unstripped binary as the 'executable'
-# LLDB should ask Debuginfod for it's unstripped binary
 
 # Put the unstripped binary in the Debuginfod server as 'executable'
 
-# RUN: yaml2obj %p/Inputs/main-full.yaml -o %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e/executable
-# RUN: yaml2obj %p/Inputs/main-stripped.yaml -o %t/output/main-stripped
-# RUN: chmod a+x %t/output/main-stripped
+# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/executable
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped
+# RUN: chmod a+x %t/output/bin-stripped
 
 # First, run a negative test (make sure we don't have symbols)
 
@@ -28,11 +25,11 @@
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/main-stripped" \
+# RUN:       -o "target create %t/output/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
 # Should have source file info:
 
-# CHECK: Breakpoint 1: where = main-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/tests.md b/lldb/test/Shell/Debuginfod/tests.md
index 7fe3e9e68d4ed32..62cca92355b03ba 100644
--- a/lldb/test/Shell/Debuginfod/tests.md
+++ b/lldb/test/Shell/Debuginfod/tests.md
@@ -6,56 +6,59 @@ protocol properly. That's how all these tests operate. We override the default
 `DEBUGINFOD_URLS` property with a `file://` URL and populate it with the symbol
 files we need for testing.
 
-## Baseline capabilities
-
-Things to test:
-
-- Just for sanity, the `-no-locator` tests validate that lldb works as the test
-  expects if the files that Debuginfod _should_ provide are already there.
-- Validate that symbols _aren't_ found without Debuginfod, to ensure they
-  weren't cached from previous runs (`-negative` tests).
-- Validate that the Debuginfod symbol locator is providing the expected symbols
-  when the debugger doesn't already have them available.
-
-## Symbol "Configurations" to test
-
-There are 2 top level configurations, each of which then get some post-processing.
-- The 'normal' build: a simple binary built with debug information (`-g`)
-- The 'split' build: A binary built with `-gsplit-dwarf` that produces `.dwo` and `.dwp` files
-
-For the normal build there are 2 post-processing steps where Debuginfod may be used.
-- Strip the binary while hosting the full, unstripped binary on a Debuginfod server.
-- Strip the binary and produce a corresponding 'only-keep-debug' version of the binary to host on a Debuginfod server.
-
-For the split build, there are *3* post-processing outcomes where Debuginfod usage makes sense:
-- Stripped binary, hosting the full unstripped binary on a Debuginfod server, along with it's `.dwp` file.
-- Stripped binary, hosting the 'only-keep-debug' version of the binary *and* it's `.dwp` file.
-- Unstripped binary, hosting only the `.dwp` file on the Debuginfod server.
-
-For both normal and split builds, when using an 'only-keep-debug' symbol file, the original file
-also requires the addition of the `.gnu.debuglink` section (which can be added using `objcopy`)
-
-### Troubles
-
-The Debuginfod protocol is somewhat underspecified regarding what the 2 different callbacks actually return. The protocol itself is quite simple: query an HTTP server with the path `buildid/{.note.gnu.build-id hash}/debuginfo` and `buildid/{.note.gnu.build-id hash}/executable`. A keen reader may note that there's one configuration (split, only-keep-debug) where you need two different files to properly symbolicate, but the API only supports a single debuginfo file. For that scenario, I've chosen to simply treat the `.dwp` file as "debuginfo" and the "only-keep-debug" stripped binary as "executable". This scenario doesn't actually work at all in GDB. It seems more straightforward than trying to extend the protocol.
-
-### Stripped:
-
-- Should ask for symbols from the service; can be registered as 'executable' and
-  they should work!
-
-### Stripped "only-keep-debug":
-
-- Should get them from the debuginfo, not from the executable query
-
-### split-dwarf:
-
-- Should get dwp file from debuginfo
-
-### split-dwarf + stripped:
-
-- Should get dwp from debuginfo, and the unstripped binary from executable
-
-
-image
-lldb.target.ResolveLoadAddress
+## What's being tested
+
+- For assumption validation, the `*-no-locator` tests verify that lldb works as
+  the test expects when files that Debuginfod should provide (`.dwp` files,
+  `.gnu.debuglink`'ed files) are _already_ there.
+- The `*-negative` tests validate that symbols _aren't_ found without
+  Debuginfod, to ensure they haven't been cached from previous runs.
+- The `*-positive` tests check that the Debuginfod symbol locator is providing
+  the expected symbols when the debugger doesn't already have them available.
+
+### Symbol file variations tested
+
+There are 5 variations of symbol data where Debuginfod can provide value:
+
+1. The 'simple-stripped' build variation is a binary built with debug
+   information (`-g`), but stripped for deployment. A Debuginfod service can
+   then host the unstripped binary (as either `executable` or `debuginfo`).
+2. The 'okd-stripped' build variation is a binary build with `-g`, stripped for
+   deployment, where the Debuginfod service is hosting the output of
+   `objcopy --only-keep-debug` (which should also be linked to the stripped file
+   using `--add-gnu-debuglink`). Again, the file could be hosted as either
+   `executable` or `debuginfo`.
+3. The 'simple-split' build variation is a binary built with `-gsplit-dwarf`
+   that produces `.dwo` which are subsequently linked together (using
+   `llvm-dwp`) into a single `.dwp` file. The Debuginfod service should host the
+   `.dwp` file as `debuginfo`.
+4. The 'stripped-split' build variation is a binary built with `-gsplit-dwarf`,
+   then stripped in the same manner as variation #1. For this variation,
+   Debuginfod should host the unstripped binary as `executable` and the `.dwp`
+   file as `debuginfo`.
+5. The 'okd-stripped-split' build variation is the combination of variations 2
+   and 3, where Debuginfod hosts the `.gnu.debuglink`'ed file as `executable`
+   and the `.dwp` again as `debuginfo`.
+
+### Lack of clarity/messy capabilities from Debuginfod
+
+The [debuginfod protocol](https://sourceware.org/elfutils/Debuginfod.html) is
+underspecified for some variations of symbol file deployment. The protocol
+itself is quite simple: query an HTTP server with the path
+`buildid/{.note.gnu.build-id hash}/debuginfo` or
+`buildid/{.note.gnu.build-id hash}/executable` to acquire "symbol data" or "the
+executable". Where there is lack of clarity, I prefer requesting `debuginfo`
+first, then falling back to `executable` (Scenarios #1 & #2). For Scenario #5,
+I've chosen to expect the stripped (i.e. not full) executable, which contains a
+number of sections necessary to correctly symbolicate will be hosted from the
+`executable` API. Depending upon how Debuginfod hosting services choose to
+support `.dwp` paired with stripped files, these assumptions may need to be
+revisited.
+
+I've also chosen to simply treat the `.dwp` file as `debuginfo` and the
+"only-keep-debug" stripped binary as `executable`. This scenario doesn't appear
+to work at all in GDB. Supporting it how I did seems more straight forward than
+trying to extend the protocol. The protocol _does_ support querying for section
+contents by name for a given build ID, but adding support for that in LLDB
+looks...well beyond my current capability (and LLVM's Debuginfod library doesn't
+support it at this writing, anyway).

>From 67a9da227ca46af7bd3a6ec7993cb72ece5a385e Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Mon, 22 Jan 2024 17:17:07 -0800
Subject: [PATCH 04/10] One failling test that looks like a real bug...for
 tomorrow

---
 .../Shell/Debuginfod/okd-split-negative.test  | 31 --------------
 .../Shell/Debuginfod/okd-split-positive.test  | 40 -------------------
 .../Debuginfod/okd-stripped-negative.test     | 32 ---------------
 .../Debuginfod/okd-stripped-positive.test     | 35 ----------------
 .../Shell/Debuginfod/okdstrip-negative.test   | 28 +++++++++++++
 .../Shell/Debuginfod/okdstrip-no-locator.test | 26 ++++++++++++
 .../Shell/Debuginfod/okdstrip-positive-a.test | 33 +++++++++++++++
 .../Shell/Debuginfod/okdstrip-positive-b.test | 33 +++++++++++++++
 .../Shell/Debuginfod/simple-dwp-negative.test | 32 ---------------
 .../test/Shell/Debuginfod/split-negative.test | 25 ++++++++++++
 .../Shell/Debuginfod/split-no-locator.test    | 26 ++++++++++++
 .../Debuginfod/split-okdstrip-negative.test   | 24 +++++++++++
 .../Debuginfod/split-okdstrip-no-locator.test | 25 ++++++++++++
 .../Debuginfod/split-okdstrip-positive.test   | 31 ++++++++++++++
 ...-dwp-positive.test => split-positive.test} | 20 +++++-----
 .../Debuginfod/split-strip-negative.test      | 20 ++++++++++
 .../Debuginfod/split-strip-no-locator.test    | 26 ++++++++++++
 .../Debuginfod/split-strip-positive.test      | 31 ++++++++++++++
 ...pped-negative.test => strip-negative.test} |  0
 ...-no-locator.test => strip-no-locator.test} |  0
 ...-positive-a.test => strip-positive-a.test} |  0
 ...-positive-b.test => strip-positive-b.test} |  0
 lldb/test/Shell/Debuginfod/tests.md           |  4 +-
 23 files changed, 339 insertions(+), 183 deletions(-)
 delete mode 100644 lldb/test/Shell/Debuginfod/okd-split-negative.test
 delete mode 100644 lldb/test/Shell/Debuginfod/okd-split-positive.test
 delete mode 100644 lldb/test/Shell/Debuginfod/okd-stripped-negative.test
 delete mode 100644 lldb/test/Shell/Debuginfod/okd-stripped-positive.test
 create mode 100644 lldb/test/Shell/Debuginfod/okdstrip-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
 create mode 100644 lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
 create mode 100644 lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
 delete mode 100644 lldb/test/Shell/Debuginfod/simple-dwp-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/split-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/split-no-locator.test
 create mode 100644 lldb/test/Shell/Debuginfod/split-okdstrip-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/split-okdstrip-no-locator.test
 create mode 100644 lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
 rename lldb/test/Shell/Debuginfod/{simple-dwp-positive.test => split-positive.test} (61%)
 create mode 100644 lldb/test/Shell/Debuginfod/split-strip-negative.test
 create mode 100644 lldb/test/Shell/Debuginfod/split-strip-no-locator.test
 create mode 100644 lldb/test/Shell/Debuginfod/split-strip-positive.test
 rename lldb/test/Shell/Debuginfod/{simple-stripped-negative.test => strip-negative.test} (100%)
 rename lldb/test/Shell/Debuginfod/{simple-stripped-no-locator.test => strip-no-locator.test} (100%)
 rename lldb/test/Shell/Debuginfod/{simple-stripped-positive-a.test => strip-positive-a.test} (100%)
 rename lldb/test/Shell/Debuginfod/{simple-stripped-positive-b.test => strip-positive-b.test} (100%)

diff --git a/lldb/test/Shell/Debuginfod/okd-split-negative.test b/lldb/test/Shell/Debuginfod/okd-split-negative.test
deleted file mode 100644
index 5d5ed250c4cc1d3..000000000000000
--- a/lldb/test/Shell/Debuginfod/okd-split-negative.test
+++ /dev/null
@@ -1,31 +0,0 @@
-# REQUIRES: system-linux && native && target-x86_64
-
-# We set up a file-system 'hosted' Debuginfod server
-
-# RUN: rm -rf %t || echo ok
-# RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/tmpstuff
-# RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86
-
-# Scenario 4
-#  A stripped binary/split-dwarf combination
-# LLDB should ask Debuginfod for both it's executable AND it's symbols
-
-# RUN: yaml2obj %p/Inputs/main-split-nodbg.yaml -o %t/tmpstuff/main-split-nodbg.tmp
-# RUN: yaml2obj %p/Inputs/main-split-dbg.yaml -o %t/tmpstuff/main-split-dbg
-# RUN: yaml2obj %p/Inputs/main-dwp.yaml -o %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/debuginfo
-# RUN: llvm-objcopy %t/tmpstuff/main-split-nodbg.tmp --add-gnu-debuglink=%t/tmpstuff/main-split-dbg %t/output/main-split-nodbg
-# RUN: mv %t/tmpstuff/main-split-dbg %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/executable
-# RUN: chmod a+x %t/output/main-split-nodbg
-
-# Verify that we -don't- find symbols when not using the Debuginfod service
-
-# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/main-split-nodbg" \
-# RUN:       -o "b func" \
-# RUN:       -o "quit" \
-# RUN:        2>&1 | FileCheck %s
-
-# Should NOT have source file information:
-# CHECK: Breakpoint 1: where = main-split-nodbg`func, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okd-split-positive.test b/lldb/test/Shell/Debuginfod/okd-split-positive.test
deleted file mode 100644
index 3a3f20a5c82c4b1..000000000000000
--- a/lldb/test/Shell/Debuginfod/okd-split-positive.test
+++ /dev/null
@@ -1,40 +0,0 @@
-# REQUIRES: system-linux && native && target-x86_64
-
-# We set up a file-system 'hosted' Debuginfod server
-
-# RUN: rm -rf %t || echo ok
-# RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/tmpstuff
-# RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86
-
-# Scenario 4
-#  A stripped binary/split-dwarf combination
-# LLDB should ask Debuginfod for both it's executable AND it's symbols
-
-# RUN: yaml2obj %p/Inputs/main-split-nodbg.yaml -o %t/tmpstuff/main-split-nodbg.tmp
-# RUN: yaml2obj %p/Inputs/main-split-dbg.yaml -o %t/tmpstuff/main-split-dbg
-# RUN: yaml2obj %p/Inputs/main-dwp.yaml -o %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/debuginfo
-# RUN: llvm-objcopy %t/tmpstuff/main-split-nodbg.tmp --add-gnu-debuglink=%t/tmpstuff/main-split-dbg %t/output/main-split-nodbg
-# RUN: mv %t/tmpstuff/main-split-dbg %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/executable
-# RUN: chmod a+x %t/output/main-split-nodbg
-
-# Verify that we find symbols from the Debuginfod service
-
-# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
-# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
-# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
-# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/main-split-nodbg" \
-# RUN:       -o "target modules dump separate-debug-info" \
-# RUN:       -o "b main.c:69" \
-# RUN:       -o "quit" \
-# RUN:        2>&1 | FileCheck %s
-
-# Should have source file information:
-# CHECK: Symbol file: {{.*}}/main-split-nodbg
-# CHECK-NEXT: Type: "dwo"
-# CHECK-NEXT: Dwo ID{{.*}}
-# CHECK-NEXT: {{^[- ]+$}}
-# CHECK-NEXT: 0x{{[0-9a-f]+.*}} {{.*}}/cache/llvmcache-9657596136574283768
-# CHECK: Breakpoint 1: address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okd-stripped-negative.test b/lldb/test/Shell/Debuginfod/okd-stripped-negative.test
deleted file mode 100644
index f110db39c11ae75..000000000000000
--- a/lldb/test/Shell/Debuginfod/okd-stripped-negative.test
+++ /dev/null
@@ -1,32 +0,0 @@
-# REQUIRES: system-linux && native && target-x86_64
-
-# We set up a file-system 'hosted' Debuginfod server
-
-# RUN: rm -rf %t || echo ok
-# RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/tmpstuff
-# RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e
-
-# Scenario 2
-#  A stripped binary, with an "-only-keep-debug" symbols file
-#  Debuginfo has the 'okd' file as the 'debuginfo' item
-# LLDB should ask Debuginfod for it's symbols
-
-# RUN: yaml2obj %p/Inputs/main-nodbg.yaml -o %t/tmpstuff/main-nodbg.tmp
-# RUN: yaml2obj %p/Inputs/main-dbg.yaml -o %t/tmpstuff/main-dbg
-# RUN: llvm-objcopy %t/tmpstuff/main-nodbg.tmp --add-gnu-debuglink=%t/tmpstuff/main-dbg %t/output/main-nodbg
-# RUN: mv %t/tmpstuff/main-dbg %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e/debuginfo
-# RUN: chmod a+x %t/output/main-nodbg
-
-# Negative test (We don't find symbols without the Debuginfod service)
-
-# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/main-nodbg" \
-# RUN:       -o "b func" \
-# RUN:       -o "quit" \
-# RUN:        2>&1 | FileCheck %s
-
-# Should NOT have source file information:
-
-# CHECK: Breakpoint 1: where = main-nodbg`func, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okd-stripped-positive.test b/lldb/test/Shell/Debuginfod/okd-stripped-positive.test
deleted file mode 100644
index 67d55a16041d341..000000000000000
--- a/lldb/test/Shell/Debuginfod/okd-stripped-positive.test
+++ /dev/null
@@ -1,35 +0,0 @@
-# REQUIRES: system-linux && native && target-x86_64
-
-# We set up a file-system 'hosted' Debuginfod server
-
-# RUN: rm -rf %t || echo ok
-# RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/tmpstuff
-# RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e
-
-# Scenario 2
-#  A stripped binary, with an "-only-keep-debug" symbols file
-#  Debuginfo has the 'okd' file as the 'debuginfo' item
-# LLDB should ask Debuginfod for it's symbols
-
-# RUN: yaml2obj %p/Inputs/main-nodbg.yaml -o %t/tmpstuff/main-nodbg.tmp
-# RUN: yaml2obj %p/Inputs/main-dbg.yaml -o %t/tmpstuff/main-dbg
-# RUN: llvm-objcopy %t/tmpstuff/main-nodbg.tmp --add-gnu-debuglink=%t/tmpstuff/main-dbg %t/output/main-nodbg
-# RUN: mv %t/tmpstuff/main-dbg %t/buildid/b4927ea09a08ee63313299cf347043010d03cc5e/debuginfo
-# RUN: chmod a+x %t/output/main-nodbg
-
-# Verify that we find symbols from the Debuginfod service
-
-# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
-# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
-# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
-# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/main-nodbg" \
-# RUN:       -o "b func" \
-# RUN:       -o "quit" \
-# RUN:        2>&1 | FileCheck %s
-
-# Should have source file information:
-
-# CHECK: Breakpoint 1: where = main-nodbg`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-negative.test b/lldb/test/Shell/Debuginfod/okdstrip-negative.test
new file mode 100644
index 000000000000000..a63beccd249b1f0
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/okdstrip-negative.test
@@ -0,0 +1,28 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+
+# Scenario 2
+#  A stripped binary, with an "-only-keep-debug" symbols which is *not* there.
+#  LLDB should fail to find the OKD file automatically using .gnu.debuglink
+
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/output/bin-stripped.dbg
+# RUN: llvm-objcopy %t/output/bin-stripped.tmp --add-gnu-debuglink=%t/output/bin-stripped.dbg %t/output/bin-stripped
+# Don't leave the stripped .dbg file laying around for the debugger to discover
+# RUN: rm %t/output/bin-stripped.dbg
+# RUN: chmod a+x %t/output/bin-stripped
+
+# Verify that we find symbols from the Debuginfod service
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should NOT have source file information:
+
+# CHECK: Breakpoint 1: where = bin-stripped`func, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test b/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
new file mode 100644
index 000000000000000..f45477a8f037c0d
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
@@ -0,0 +1,26 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+
+# Scenario 2
+#  A stripped binary, with an "-only-keep-debug" symbols
+#  LLDB should find the OKD file automatically using .gnu.debuglink
+
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/output/bin-stripped.dbg
+# RUN: llvm-objcopy %t/output/bin-stripped.tmp --add-gnu-debuglink=%t/output/bin-stripped.dbg %t/output/bin-stripped
+# RUN: chmod a+x %t/output/bin-stripped
+
+# Verify that we find symbols from the Debuginfod service
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should have source file information:
+
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test b/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
new file mode 100644
index 000000000000000..12cb9cf0282dda0
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
@@ -0,0 +1,33 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
+
+# Scenario 2a
+#  A stripped binary, with an "-only-keep-debug" symbols file
+#  LLDB should request the symbols from Debuginfod as 'debuginfo'
+
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/output/bin-stripped.dbg
+# RUN: llvm-objcopy %t/output/bin-stripped.tmp --add-gnu-debuglink=%t/output/bin-stripped.dbg %t/output/bin-stripped
+# Move the stripped .dbg into the file:// hosted Debuginfod location
+# RUN: mv %t/output/bin-stripped.dbg %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/debuginfo
+# RUN: chmod a+x %t/output/bin-stripped
+
+# Verify that we find symbols from the Debuginfod service
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should have source file information:
+
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test b/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
new file mode 100644
index 000000000000000..ace1cfc58e07177
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
@@ -0,0 +1,33 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
+
+# Scenario 2b
+#  A stripped binary, with an "-only-keep-debug" symbols file
+#  LLDB should request the symbols from Debuginfod as 'executable'
+
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/output/bin-stripped.dbg
+# RUN: llvm-objcopy %t/output/bin-stripped.tmp --add-gnu-debuglink=%t/output/bin-stripped.dbg %t/output/bin-stripped
+# Move the stripped .dbg into the file:// hosted Debuginfod location
+# RUN: mv %t/output/bin-stripped.dbg %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/executable
+# RUN: chmod a+x %t/output/bin-stripped
+
+# Verify that we find symbols from the Debuginfod service
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "b func" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# Should have source file information:
+
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/simple-dwp-negative.test b/lldb/test/Shell/Debuginfod/simple-dwp-negative.test
deleted file mode 100644
index e1018a1181c2412..000000000000000
--- a/lldb/test/Shell/Debuginfod/simple-dwp-negative.test
+++ /dev/null
@@ -1,32 +0,0 @@
-# REQUIRES: system-linux && native && target-x86_64
-
-# We set up a file-system 'hosted' Debuginfod server
-
-# RUN: rm -rf %t || echo ok
-# RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/tmpstuff
-# RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86
-
-# Scenario 2
-#  A stripped binary, with an "-only-keep-debug" symbols file
-#  Debuginfo has the 'okd' file as the 'debuginfo' item
-# LLDB should ask Debuginfod for it's symbols
-
-# RUN: yaml2obj %p/Inputs/main-split.yaml -o %t/output/main-split
-# RUN: yaml2obj %p/Inputs/main-dwp.yaml -o %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/debuginfo
-# RUN: chmod a+x %t/output/main-split
-
-# Negative test (We don't find symbols without the Debuginfod service)
-
-# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/main-split" \
-# RUN:       -o "target modules dump separate-debug-info" \
-# RUN:       -o "quit" \
-# RUN:        2>&1 | FileCheck %s
-
-# CHECK: Symbol file: {{.*}}/main-split
-# CHECK-NEXT: Type: "dwo"
-# CHECK-NEXT: Dwo ID{{.*}}
-# CHECK-NEXT: {{^[- ]+$}}
-# CHECK-NEXT: 0x{{[0-9a-f]+.*}} unable to locate .dwo debug file {{.*}}main-split.dwo{{.*}} for skeleton DIE 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/split-negative.test b/lldb/test/Shell/Debuginfod/split-negative.test
new file mode 100644
index 000000000000000..351bb0b3c44be92
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/split-negative.test
@@ -0,0 +1,25 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+
+# Scenario 3: No locator
+#  A split binary, with a *missing* .dwp file
+
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/output/bin-split
+# RUN: chmod a+x %t/output/bin-split
+
+# Negative test (We don't find symbols without the Debuginfod service)
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-split" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Symbol file: {{.*}}/bin-split
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK-NEXT: {{^[- ]+$}}
+# CHECK-NEXT: 0x{{[0-9a-f]+.*}} unable to locate .dwo debug file {{.*}}bin-split.dwo{{.*}} for skeleton DIE 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/split-no-locator.test b/lldb/test/Shell/Debuginfod/split-no-locator.test
new file mode 100644
index 000000000000000..bb60100b0e05478
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/split-no-locator.test
@@ -0,0 +1,26 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: rm -rf %t || echo ok
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
+
+# Scenario 3: No locator
+#  A split binary, with a .dwp file right next to the binary
+
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/output/bin-split
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/output/bin-split.dwp
+# RUN: chmod a+x %t/output/bin-split
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-split" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Symbol file: {{.*}}/bin-split
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK-NEXT: {{^[- ]+$}}
diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-negative.test b/lldb/test/Shell/Debuginfod/split-okdstrip-negative.test
new file mode 100644
index 000000000000000..4bca2113d73ddb1
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-negative.test
@@ -0,0 +1,24 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+
+# Scenario 4: No locator
+#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
+
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/output/sym-split
+# RUN: llvm-objcopy %t/output/bin-split-stripped.tmp --add-gnu-debuglink=%t/output/sym-split %t/output/bin-split-stripped
+# RUN: rm %t/output/sym-split
+# RUN: chmod a+x %t/output/bin-split-stripped
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Current executable set to {{.*}}.tmp/output/bin-split-stripped' (x86_64).
+# CHECK-NEXT: target modules dump separate-debug-info
+# CHECK-NEXT: error: no matching executable images found
diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-no-locator.test b/lldb/test/Shell/Debuginfod/split-okdstrip-no-locator.test
new file mode 100644
index 000000000000000..d210a1a7dd54b00
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-no-locator.test
@@ -0,0 +1,25 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+
+# Scenario 4: No locator
+#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
+
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/output/sym-split
+# RUN: llvm-objcopy %t/output/bin-split-stripped.tmp --add-gnu-debuglink=%t/output/sym-split %t/output/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/output/bin-split-stripped.dwp
+# RUN: chmod a+x %t/output/bin-split-stripped
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Symbol file: {{.*}}/bin-split
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK: {{0x[0-9a-f]+.* +.*}}/output/bin-split-stripped.dwp(gen/bin-split.dwo){{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
new file mode 100644
index 000000000000000..a60c1139a646046
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
@@ -0,0 +1,31 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
+
+# Scenario 4: No locator
+#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
+
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/output/sym-split
+# RUN: llvm-objcopy %t/output/bin-split-stripped.tmp --add-gnu-debuglink=%t/output/sym-split %t/output/bin-split-stripped
+# RUN: mv %t/output/sym-split %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/executable
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/debuginfod
+# RUN: chmod a+x %t/output/bin-split-stripped
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Symbol file: {{.*}}/bin-split-stripped
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK: {{0x[0-9a-f]+.* +.*}}/output/bin-split-stripped.dwp(gen/bin-split.dwo){{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/simple-dwp-positive.test b/lldb/test/Shell/Debuginfod/split-positive.test
similarity index 61%
rename from lldb/test/Shell/Debuginfod/simple-dwp-positive.test
rename to lldb/test/Shell/Debuginfod/split-positive.test
index acb647e83e008fb..50b7082aac43c0f 100644
--- a/lldb/test/Shell/Debuginfod/simple-dwp-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-positive.test
@@ -2,20 +2,18 @@
 
 # We set up a file-system 'hosted' Debuginfod server
 
-# RUN: rm -rf %t || echo ok
 # RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/tmpstuff
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86
+# RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
 
 # Scenario 2
 #  A stripped binary, with an "-only-keep-debug" symbols file
 #  Debuginfo has the 'okd' file as the 'debuginfo' item
 # LLDB should ask Debuginfod for it's symbols
 
-# RUN: yaml2obj %p/Inputs/main-split.yaml -o %t/output/main-split
-# RUN: yaml2obj %p/Inputs/main-dwp.yaml -o %t/buildid/8b5b6416f61adc140ae457e208f1699f89bfda86/debuginfo
-# RUN: chmod a+x %t/output/main-split
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/output/bin-split
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/debuginfo
+# RUN: chmod a+x %t/output/bin-split
 
 # Positive test: We find the DWP file with the Debuginfod service
 
@@ -23,15 +21,15 @@
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/main-split" \
+# RUN:       -o "target create %t/output/bin-split" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# CHECK: Symbol file: {{.*}}/main-split
+# CHECK: Symbol file: {{.*}}/output/bin-split
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
-# CHECK-NEXT: {{^[- ]+$}}
+# CHECK: {{[- ]+}}
 # The cache key is stable, so we can mandate that we discover this thing from the cache
-# It's an implementation detail, so it could potentially change, but the ensures that
-# CHECK-NEXT: 0x{{[0-9a-f]+.*}} {{.*}}/cache/llvmcache-9657596136574283768
+# The '.tmp' (sort of) ensures the cache is our private cache, not the system cache
+# CHECK: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-strip-negative.test b/lldb/test/Shell/Debuginfod/split-strip-negative.test
new file mode 100644
index 000000000000000..163714cb20b77e4
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/split-strip-negative.test
@@ -0,0 +1,20 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+
+# Scenario 4: Negative
+#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
+
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped
+# RUN: chmod a+x %t/output/bin-split-stripped
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Current executable set to '{{.*}}/output/bin-split-stripped'
+# CHECK: error: no matching executable images found
diff --git a/lldb/test/Shell/Debuginfod/split-strip-no-locator.test b/lldb/test/Shell/Debuginfod/split-strip-no-locator.test
new file mode 100644
index 000000000000000..710313e84439857
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/split-strip-no-locator.test
@@ -0,0 +1,26 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+
+# Scenario 4: No locator
+#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
+
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/output/bin-split
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/output/bin-split-stripped.dwp
+# RUN: chmod a+x %t/output/bin-split-stripped
+# RUN: chmod a+x %t/output/bin-split
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target symbols add %t/output/bin-split" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Symbol file: {{.*}}/bin-split
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK: {{0x[0-9a-f]+.* +.*}}/output/bin-split-stripped.dwp(gen/bin-split.dwo){{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-strip-positive.test b/lldb/test/Shell/Debuginfod/split-strip-positive.test
new file mode 100644
index 000000000000000..9ebc74cb5bd3621
--- /dev/null
+++ b/lldb/test/Shell/Debuginfod/split-strip-positive.test
@@ -0,0 +1,31 @@
+# REQUIRES: system-linux && native && target-x86_64
+
+# We set up a file-system 'hosted' Debuginfod server
+
+# RUN: mkdir -p %t/output
+# RUN: mkdir -p %t/cache
+# RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
+
+# Scenario 4:
+#  A stripped, split binary, symbols manually added and a .dwp file
+#  The unstripped binary should be picked up from /82...94/executable
+#  The .dwp file should be picke dup from /82...94/debuginfo
+
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/executable
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/debuginfo
+# RUN: chmod a+x %t/output/bin-split-stripped
+
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
+# RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
+# RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
+# RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
+# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target modules dump separate-debug-info" \
+# RUN:       -o "quit" \
+# RUN:        2>&1 | FileCheck %s
+
+# CHECK: Symbol file: {{.*}}/bin-split
+# CHECK-NEXT: Type: "dwo"
+# CHECK-NEXT: Dwo ID{{.*}}
+# CHECK: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-negative.test b/lldb/test/Shell/Debuginfod/strip-negative.test
similarity index 100%
rename from lldb/test/Shell/Debuginfod/simple-stripped-negative.test
rename to lldb/test/Shell/Debuginfod/strip-negative.test
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-no-locator.test b/lldb/test/Shell/Debuginfod/strip-no-locator.test
similarity index 100%
rename from lldb/test/Shell/Debuginfod/simple-stripped-no-locator.test
rename to lldb/test/Shell/Debuginfod/strip-no-locator.test
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-positive-a.test b/lldb/test/Shell/Debuginfod/strip-positive-a.test
similarity index 100%
rename from lldb/test/Shell/Debuginfod/simple-stripped-positive-a.test
rename to lldb/test/Shell/Debuginfod/strip-positive-a.test
diff --git a/lldb/test/Shell/Debuginfod/simple-stripped-positive-b.test b/lldb/test/Shell/Debuginfod/strip-positive-b.test
similarity index 100%
rename from lldb/test/Shell/Debuginfod/simple-stripped-positive-b.test
rename to lldb/test/Shell/Debuginfod/strip-positive-b.test
diff --git a/lldb/test/Shell/Debuginfod/tests.md b/lldb/test/Shell/Debuginfod/tests.md
index 62cca92355b03ba..cbde54d75af7a86 100644
--- a/lldb/test/Shell/Debuginfod/tests.md
+++ b/lldb/test/Shell/Debuginfod/tests.md
@@ -32,10 +32,10 @@ There are 5 variations of symbol data where Debuginfod can provide value:
    that produces `.dwo` which are subsequently linked together (using
    `llvm-dwp`) into a single `.dwp` file. The Debuginfod service should host the
    `.dwp` file as `debuginfo`.
-4. The 'stripped-split' build variation is a binary built with `-gsplit-dwarf`,
+4. **The 'stripped-split' build variation is a binary built with `-gsplit-dwarf`,
    then stripped in the same manner as variation #1. For this variation,
    Debuginfod should host the unstripped binary as `executable` and the `.dwp`
-   file as `debuginfo`.
+   file as `debuginfo`.**
 5. The 'okd-stripped-split' build variation is the combination of variations 2
    and 3, where Debuginfod hosts the `.gnu.debuglink`'ed file as `executable`
    and the `.dwp` again as `debuginfo`.

>From 148c7d7bad751d7c1ec69375b6de4b9fe4291cc5 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Mon, 22 Jan 2024 22:34:01 -0800
Subject: [PATCH 05/10] Fixed the last test. Looks like everything works.

---
 lldb/test/Shell/Debuginfod/split-okdstrip-positive.test | 6 +++---
 llvm/lib/Debuginfod/Debuginfod.cpp                      | 5 -----
 llvm/utils/gn/build/write_library_dependencies.py       | 1 -
 llvm/utils/lldbDataFormatters.py                        | 2 --
 4 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
index a60c1139a646046..3261a78b22bb221 100644
--- a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
@@ -13,10 +13,10 @@
 # RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/output/sym-split
 # RUN: llvm-objcopy %t/output/bin-split-stripped.tmp --add-gnu-debuglink=%t/output/sym-split %t/output/bin-split-stripped
 # RUN: mv %t/output/sym-split %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/executable
-# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/debuginfod
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/debuginfo
 # RUN: chmod a+x %t/output/bin-split-stripped
 
-# RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
+# RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
@@ -28,4 +28,4 @@
 # CHECK: Symbol file: {{.*}}/bin-split-stripped
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
-# CHECK: {{0x[0-9a-f]+.* +.*}}/output/bin-split-stripped.dwp(gen/bin-split.dwo){{ *$}}
+# CHECK: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp b/llvm/lib/Debuginfod/Debuginfod.cpp
index 1244793dff20d87..ba1a3daebd2632f 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -154,11 +154,6 @@ std::string getDebuginfodDebuginfoUrlPath(BuildIDRef ID) {
   return std::string(UrlPath);
 }
 
-Expected<std::string> getCachedOrDownloadDebuginfo(BuildIDRef ID) {
-  std::string UrlPath = getDebuginfodDebuginfoUrlPath(ID);
-  return getCachedOrDownloadArtifact(getDebuginfodCacheKey(UrlPath), UrlPath);
-}
-
 Expected<std::string> getCachedOrDownloadDebuginfo(BuildIDRef ID) {
   std::string UrlPath = getDebuginfodDebuginfoUrlPath(ID);
   return getCachedOrDownloadArtifact(getDebuginfodCacheKey(UrlPath), UrlPath);
diff --git a/llvm/utils/gn/build/write_library_dependencies.py b/llvm/utils/gn/build/write_library_dependencies.py
index e88ed8d6411ec79..ba1a8a0157314df 100644
--- a/llvm/utils/gn/build/write_library_dependencies.py
+++ b/llvm/utils/gn/build/write_library_dependencies.py
@@ -37,7 +37,6 @@
 { "coverage", "LLVMCoverage", true, {"core", "object", "profiledata", "support"} },
 { "debuginfocodeview", "LLVMDebugInfoCodeView", true, {"support", "debuginfomsf"} },
 { "debuginfodwarf", "LLVMDebugInfoDWARF", true, {"binaryformat", "object", "mc", "support"} },
-{ "debuginfod", "LLVMDebuginfod", true, {} },
 { "debuginfogsym", "LLVMDebugInfoGSYM", true, {"mc", "object", "support", "debuginfodwarf"} },
 { "debuginfomsf", "LLVMDebugInfoMSF", true, {"support"} },
 { "debuginfopdb", "LLVMDebugInfoPDB", true, {"binaryformat", "object", "support", "debuginfocodeview", "debuginfomsf"} },
diff --git a/llvm/utils/lldbDataFormatters.py b/llvm/utils/lldbDataFormatters.py
index 5acc02c9c8e8f4a..de101abdabc8ecd 100644
--- a/llvm/utils/lldbDataFormatters.py
+++ b/llvm/utils/lldbDataFormatters.py
@@ -373,7 +373,6 @@ def DenseMapSummary(valobj: lldb.SBValue, _) -> str:
     return summary
 
 
-"""
 class DenseMapSynthetic:
     valobj: lldb.SBValue
 
@@ -432,4 +431,3 @@ def update(self):
         for indexes in key_buckets.values():
             if len(indexes) == 1:
                 self.child_buckets.append(indexes[0])
-"""

>From f39796f66e7d62db268872ddf484b0b3abe24c41 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Mon, 22 Jan 2024 22:43:16 -0800
Subject: [PATCH 06/10] Moved IsDwp to a local function for now

---
 .../SymbolFile/DWARF/SymbolFileDWARF.cpp      | 18 ---------------
 .../SymbolFile/DWARF/SymbolFileDWARF.h        |  3 ---
 .../Debuginfod/SymbolLocatorDebuginfod.cpp    |  6 ++---
 .../SymbolVendor/ELF/SymbolVendorELF.cpp      | 22 ++++++++++++++++---
 .../Debuginfod/Inputs/{mk => make-inputs}     |  0
 5 files changed, 22 insertions(+), 27 deletions(-)
 rename lldb/test/Shell/Debuginfod/Inputs/{mk => make-inputs} (100%)

diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index e25a0dcd640b2ad..fed97858c83f8e2 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -39,7 +39,6 @@
 #include "lldb/Interpreter/OptionValueProperties.h"
 
 #include "Plugins/ExpressionParser/Clang/ClangUtil.h"
-#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
 #include "Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/Symbol/Block.h"
@@ -4321,23 +4320,6 @@ SymbolFileDWARFDebugMap *SymbolFileDWARF::GetDebugMapSymfile() {
   return m_debug_map_symfile;
 }
 
-bool SymbolFileDWARF::IsDwpSymbolFile(const lldb::ModuleSP &module_sp,
-                                      const FileSpec &file_spec) {
-  DataBufferSP dwp_file_data_sp;
-  lldb::offset_t dwp_file_data_offset = 0;
-  // Try to create an ObjectFileELF frorm the filespace
-  ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
-      module_sp, &file_spec, 0, FileSystem::Instance().GetByteSize(file_spec),
-      dwp_file_data_sp, dwp_file_data_offset);
-  if (!ObjectFileELF::classof(dwp_obj_file.get()))
-    return false;
-  static ConstString sect_name_debug_cu_index(".debug_cu_index");
-  if (!dwp_obj_file || !dwp_obj_file->GetSectionList()->FindSectionByName(
-                           sect_name_debug_cu_index))
-    return false;
-  return true;
-}
-
 const std::shared_ptr<SymbolFileDWARFDwo> &SymbolFileDWARF::GetDwpSymbolFile() {
   llvm::call_once(m_dwp_symfile_once_flag, [this]() {
     ModuleSpec module_spec;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 1419604238d86c6..26a9502f90aa006 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -267,9 +267,6 @@ class SymbolFileDWARF : public SymbolFileCommon {
 
   DWARFContext &GetDWARFContext() { return m_context; }
 
-  static bool IsDwpSymbolFile(const lldb::ModuleSP &module_sp,
-                              const FileSpec &file_spec);
-
   const std::shared_ptr<SymbolFileDWARFDwo> &GetDwpSymbolFile();
 
   FileSpec GetFile(DWARFUnit &unit, size_t file_idx);
diff --git a/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp b/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
index 81406654092b3c4..2cd7bbbb2449028 100644
--- a/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
+++ b/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
@@ -96,13 +96,13 @@ class PluginProperties : public Properties {
   Args m_server_urls;
 };
 
-PluginProperties &GetGlobalPluginProperties() {
+} // namespace
+
+static PluginProperties &GetGlobalPluginProperties() {
   static PluginProperties g_settings;
   return g_settings;
 }
 
-} // namespace
-
 SymbolLocatorDebuginfod::SymbolLocatorDebuginfod() : SymbolLocator() {}
 
 void SymbolLocatorDebuginfod::Initialize() {
diff --git a/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp b/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
index aeacf9c78ea70fd..5f66de1ff67eeef 100644
--- a/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
+++ b/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
@@ -11,7 +11,6 @@
 #include <cstring>
 
 #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
-#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
 #include "lldb/Core/Module.h"
 #include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/PluginManager.h"
@@ -45,6 +44,24 @@ llvm::StringRef SymbolVendorELF::GetPluginDescriptionStatic() {
          "executables.";
 }
 
+// If this is needed elsewhere, it can be exported/moved.
+static bool IsDwpSymbolFile(const lldb::ModuleSP &module_sp,
+                            const FileSpec &file_spec) {
+  DataBufferSP dwp_file_data_sp;
+  lldb::offset_t dwp_file_data_offset = 0;
+  // Try to create an ObjectFileELF frorm the filespace
+  ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
+      module_sp, &file_spec, 0, FileSystem::Instance().GetByteSize(file_spec),
+      dwp_file_data_sp, dwp_file_data_offset);
+  if (!ObjectFileELF::classof(dwp_obj_file.get()))
+    return false;
+  static ConstString sect_name_debug_cu_index(".debug_cu_index");
+  if (!dwp_obj_file || !dwp_obj_file->GetSectionList()->FindSectionByName(
+                           sect_name_debug_cu_index))
+    return false;
+  return true;
+}
+
 // CreateInstance
 //
 // Platforms can register a callback to use when creating symbol vendors to
@@ -88,8 +105,7 @@ SymbolVendorELF::CreateInstance(const lldb::ModuleSP &module_sp,
   FileSpecList search_paths = Target::GetDefaultDebugFileSearchPaths();
   FileSpec dsym_fspec =
       PluginManager::LocateExecutableSymbolFile(module_spec, search_paths);
-  if (!dsym_fspec ||
-      plugin::dwarf::SymbolFileDWARF::IsDwpSymbolFile(module_sp, dsym_fspec)) {
+  if (!dsym_fspec || IsDwpSymbolFile(module_sp, dsym_fspec)) {
     // If we have a stripped binary or if we got a DWP file, we should prefer
     // symbols in the executable acquired through a plugin.
     ModuleSpec unstripped_spec =
diff --git a/lldb/test/Shell/Debuginfod/Inputs/mk b/lldb/test/Shell/Debuginfod/Inputs/make-inputs
similarity index 100%
rename from lldb/test/Shell/Debuginfod/Inputs/mk
rename to lldb/test/Shell/Debuginfod/Inputs/make-inputs

>From bd02797017886f175019245c1b61a9affe847e32 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Tue, 23 Jan 2024 08:38:59 -0800
Subject: [PATCH 07/10] Switched to identifying DWP files by type instead of
 name.

---
 lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp b/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
index 5f66de1ff67eeef..ec734b8bb64f871 100644
--- a/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
+++ b/lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
@@ -49,15 +49,16 @@ static bool IsDwpSymbolFile(const lldb::ModuleSP &module_sp,
                             const FileSpec &file_spec) {
   DataBufferSP dwp_file_data_sp;
   lldb::offset_t dwp_file_data_offset = 0;
-  // Try to create an ObjectFileELF frorm the filespace
+  // Try to create an ObjectFile from the file_spec.
   ObjectFileSP dwp_obj_file = ObjectFile::FindPlugin(
       module_sp, &file_spec, 0, FileSystem::Instance().GetByteSize(file_spec),
       dwp_file_data_sp, dwp_file_data_offset);
   if (!ObjectFileELF::classof(dwp_obj_file.get()))
     return false;
-  static ConstString sect_name_debug_cu_index(".debug_cu_index");
-  if (!dwp_obj_file || !dwp_obj_file->GetSectionList()->FindSectionByName(
-                           sect_name_debug_cu_index))
+  // The presence of a debug_cu_index section is the key identifying feature of
+  // a DWP file.
+  if (!dwp_obj_file || !dwp_obj_file->GetSectionList()->FindSectionByType(
+                           eSectionTypeDWARFDebugCuIndex, false))
     return false;
   return true;
 }

>From c240e4904407d0d937863fe30c2ebe77dc693225 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Tue, 23 Jan 2024 09:36:07 -0800
Subject: [PATCH 08/10] Cleaned up tests comments-n-stuff

---
 .../{tests.md => Debuginfod-testing.md}       | 37 ++++++++++---------
 .../Shell/Debuginfod/okdstrip-negative.test   | 26 ++++++-------
 .../Shell/Debuginfod/okdstrip-no-locator.test | 26 ++++++-------
 .../Shell/Debuginfod/okdstrip-positive-a.test | 29 ++++++---------
 .../Shell/Debuginfod/okdstrip-positive-b.test | 29 ++++++---------
 .../test/Shell/Debuginfod/split-negative.test | 18 ++++-----
 .../Shell/Debuginfod/split-no-locator.test    | 22 +++++------
 .../Debuginfod/split-okdstrip-negative.test   | 24 ++++++------
 .../Debuginfod/split-okdstrip-no-locator.test | 28 +++++++-------
 .../Debuginfod/split-okdstrip-positive.test   | 25 +++++++------
 .../test/Shell/Debuginfod/split-positive.test | 27 ++++++--------
 .../Debuginfod/split-strip-negative.test      | 17 ++++-----
 .../Debuginfod/split-strip-no-locator.test    | 29 ++++++++-------
 .../Debuginfod/split-strip-positive.test      | 25 +++++++------
 .../test/Shell/Debuginfod/strip-negative.test | 19 ++++------
 .../Shell/Debuginfod/strip-no-locator.test    | 24 ++++++------
 .../Shell/Debuginfod/strip-positive-a.test    | 27 +++++---------
 .../Shell/Debuginfod/strip-positive-b.test    | 27 +++++---------
 18 files changed, 207 insertions(+), 252 deletions(-)
 rename lldb/test/Shell/Debuginfod/{tests.md => Debuginfod-testing.md} (68%)

diff --git a/lldb/test/Shell/Debuginfod/tests.md b/lldb/test/Shell/Debuginfod/Debuginfod-testing.md
similarity index 68%
rename from lldb/test/Shell/Debuginfod/tests.md
rename to lldb/test/Shell/Debuginfod/Debuginfod-testing.md
index cbde54d75af7a86..df335ca11ffa42e 100644
--- a/lldb/test/Shell/Debuginfod/tests.md
+++ b/lldb/test/Shell/Debuginfod/Debuginfod-testing.md
@@ -10,35 +10,36 @@ files we need for testing.
 
 - For assumption validation, the `*-no-locator` tests verify that lldb works as
   the test expects when files that Debuginfod should provide (`.dwp` files,
-  `.gnu.debuglink`'ed files) are _already_ there.
+  `.gnu.debuglink`'ed files, etc...) are _already_ there.
 - The `*-negative` tests validate that symbols _aren't_ found without
-  Debuginfod, to ensure they haven't been cached from previous runs.
-- The `*-positive` tests check that the Debuginfod symbol locator is providing
+  Debuginfod, to ensure they haven't been cached from previous runs (in the
+  hopes of preventing false positive testing).
+- The `*-positive*` tests check that the Debuginfod symbol locator is providing
   the expected symbols when the debugger doesn't already have them available.
 
 ### Symbol file variations tested
 
-There are 5 variations of symbol data where Debuginfod can provide value:
+There are 5 variations of symbol data where Debuginfod provides value:
 
-1. The 'simple-stripped' build variation is a binary built with debug
-   information (`-g`), but stripped for deployment. A Debuginfod service can
-   then host the unstripped binary (as either `executable` or `debuginfo`).
-2. The 'okd-stripped' build variation is a binary build with `-g`, stripped for
+1. The `strip` build variation is a binary built with debug information (`-g`),
+   but stripped for deployment. The Debuginfod service can then host the
+   unstripped binary (as either `executable` or `debuginfo`).
+2. The `okdstrip` build variation is a binary build with `-g`, stripped for
    deployment, where the Debuginfod service is hosting the output of
    `objcopy --only-keep-debug` (which should also be linked to the stripped file
    using `--add-gnu-debuglink`). Again, the file could be hosted as either
    `executable` or `debuginfo`.
-3. The 'simple-split' build variation is a binary built with `-gsplit-dwarf`
-   that produces `.dwo` which are subsequently linked together (using
-   `llvm-dwp`) into a single `.dwp` file. The Debuginfod service should host the
-   `.dwp` file as `debuginfo`.
-4. **The 'stripped-split' build variation is a binary built with `-gsplit-dwarf`,
+3. The `split` build variation is a binary built with `-gsplit-dwarf` that
+   produces `.dwo` which are subsequently linked together (using `llvm-dwp`)
+   into a single `.dwp` file. The Debuginfod service hosts the `.dwp` file as
+   `debuginfo`.
+4. The `split-strip` build variation is a binary built with `-gsplit-dwarf`,
    then stripped in the same manner as variation #1. For this variation,
-   Debuginfod should host the unstripped binary as `executable` and the `.dwp`
-   file as `debuginfo`.**
-5. The 'okd-stripped-split' build variation is the combination of variations 2
-   and 3, where Debuginfod hosts the `.gnu.debuglink`'ed file as `executable`
-   and the `.dwp` again as `debuginfo`.
+   Debuginfod hosts the unstripped binary as `executable` and the `.dwp` file as
+   `debuginfo`.
+5. The `split-okdstrip` build variation is the combination of variations 2 and
+   3, where Debuginfod hosts the `.gnu.debuglink`'ed file as `executable` and
+   the `.dwp` as `debuginfo`.
 
 ### Lack of clarity/messy capabilities from Debuginfod
 
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-negative.test b/lldb/test/Shell/Debuginfod/okdstrip-negative.test
index a63beccd249b1f0..8b0603e6f5860d5 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-negative.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-negative.test
@@ -1,24 +1,20 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 2 negative:
+# * A stripped binary, with an "-only-keep-debug" symbols which is *not* there.
+# * LLDB should fail to find the OKD file automatically using .gnu.debuglink.
 
-# RUN: mkdir -p %t/output
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 2
-#  A stripped binary, with an "-only-keep-debug" symbols which is *not* there.
-#  LLDB should fail to find the OKD file automatically using .gnu.debuglink
-
-# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped.tmp
-# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/output/bin-stripped.dbg
-# RUN: llvm-objcopy %t/output/bin-stripped.tmp --add-gnu-debuglink=%t/output/bin-stripped.dbg %t/output/bin-stripped
-# Don't leave the stripped .dbg file laying around for the debugger to discover
-# RUN: rm %t/output/bin-stripped.dbg
-# RUN: chmod a+x %t/output/bin-stripped
-
-# Verify that we find symbols from the Debuginfod service
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/bin-stripped.dbg
+# RUN: llvm-objcopy %t/bin-stripped.tmp --add-gnu-debuglink=%t/bin-stripped.dbg %t/bin-stripped
+# RUN: rm %t/bin-stripped.dbg
+# RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "target create %t/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test b/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
index f45477a8f037c0d..943ab100437c6c3 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
@@ -1,26 +1,22 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 2 baseline:
+# * A stripped binary, with an "-only-keep-debug" symbols file.
+# * LLDB should find the OKD file automatically using .gnu.debuglink.
 
-# RUN: mkdir -p %t/output
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 2
-#  A stripped binary, with an "-only-keep-debug" symbols
-#  LLDB should find the OKD file automatically using .gnu.debuglink
-
-# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped.tmp
-# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/output/bin-stripped.dbg
-# RUN: llvm-objcopy %t/output/bin-stripped.tmp --add-gnu-debuglink=%t/output/bin-stripped.dbg %t/output/bin-stripped
-# RUN: chmod a+x %t/output/bin-stripped
-
-# Verify that we find symbols from the Debuginfod service
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/bin-stripped.dbg
+# RUN: llvm-objcopy %t/bin-stripped.tmp --add-gnu-debuglink=%t/bin-stripped.dbg %t/bin-stripped
+# RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "target create %t/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# Should have source file information:
-
+# Should have source file and line information:
 # CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test b/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
index 12cb9cf0282dda0..77abcc7ca9d665b 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
@@ -1,33 +1,28 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 2a:
+#  A stripped binary, with an "-only-keep-debug" symbols file.
+#  LLDB should request the symbols from Debuginfod as 'debuginfo'.
 
-# RUN: mkdir -p %t/output
+# Set up a file-system 'hosted' Debuginfod server.
+# RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
 # RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
 
-# Scenario 2a
-#  A stripped binary, with an "-only-keep-debug" symbols file
-#  LLDB should request the symbols from Debuginfod as 'debuginfo'
-
-# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped.tmp
-# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/output/bin-stripped.dbg
-# RUN: llvm-objcopy %t/output/bin-stripped.tmp --add-gnu-debuglink=%t/output/bin-stripped.dbg %t/output/bin-stripped
-# Move the stripped .dbg into the file:// hosted Debuginfod location
-# RUN: mv %t/output/bin-stripped.dbg %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/debuginfo
-# RUN: chmod a+x %t/output/bin-stripped
-
-# Verify that we find symbols from the Debuginfod service
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/bin-stripped.dbg
+# RUN: llvm-objcopy %t/bin-stripped.tmp --add-gnu-debuglink=%t/bin-stripped.dbg %t/bin-stripped
+# RUN: mv %t/bin-stripped.dbg %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/debuginfo
+# RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "target create %t/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# Should have source file information:
-
+# Should have source file and line information:
 # CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test b/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
index ace1cfc58e07177..3555d4c2fc2874c 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
@@ -1,33 +1,28 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 2b:
+#  A stripped binary, with an "-only-keep-debug" symbols file.
+#  LLDB should request the symbols from Debuginfod as 'executable'.
 
-# RUN: mkdir -p %t/output
+# Set up a file-system 'hosted' Debuginfod server.
+# RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
 # RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
 
-# Scenario 2b
-#  A stripped binary, with an "-only-keep-debug" symbols file
-#  LLDB should request the symbols from Debuginfod as 'executable'
-
-# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped.tmp
-# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/output/bin-stripped.dbg
-# RUN: llvm-objcopy %t/output/bin-stripped.tmp --add-gnu-debuglink=%t/output/bin-stripped.dbg %t/output/bin-stripped
-# Move the stripped .dbg into the file:// hosted Debuginfod location
-# RUN: mv %t/output/bin-stripped.dbg %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/executable
-# RUN: chmod a+x %t/output/bin-stripped
-
-# Verify that we find symbols from the Debuginfod service
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-stripped.yaml -o %t/bin-stripped.dbg
+# RUN: llvm-objcopy %t/bin-stripped.tmp --add-gnu-debuglink=%t/bin-stripped.dbg %t/bin-stripped
+# RUN: mv %t/bin-stripped.dbg %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/executable
+# RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "target create %t/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# Should have source file information:
-
+# Should have source file and line information:
 # CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/split-negative.test b/lldb/test/Shell/Debuginfod/split-negative.test
index 351bb0b3c44be92..6458abd4485df65 100644
--- a/lldb/test/Shell/Debuginfod/split-negative.test
+++ b/lldb/test/Shell/Debuginfod/split-negative.test
@@ -1,19 +1,16 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 3 negative:
+# * A split-dwarf binary with a *missing* .dwp file (validate nothing's cached).
 
-# RUN: mkdir -p %t/output
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 3: No locator
-#  A split binary, with a *missing* .dwp file
-
-# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/output/bin-split
-# RUN: chmod a+x %t/output/bin-split
-
-# Negative test (We don't find symbols without the Debuginfod service)
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/bin-split
+# RUN: chmod a+x %t/bin-split
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-split" \
+# RUN:       -o "target create %t/bin-split" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
@@ -22,4 +19,5 @@
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
 # CHECK-NEXT: {{^[- ]+$}}
+# Verify it's missing the DWP file (and DWOs)
 # CHECK-NEXT: 0x{{[0-9a-f]+.*}} unable to locate .dwo debug file {{.*}}bin-split.dwo{{.*}} for skeleton DIE 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/split-no-locator.test b/lldb/test/Shell/Debuginfod/split-no-locator.test
index bb60100b0e05478..11ac3c60d5b87af 100644
--- a/lldb/test/Shell/Debuginfod/split-no-locator.test
+++ b/lldb/test/Shell/Debuginfod/split-no-locator.test
@@ -1,21 +1,17 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 3 baseline:
+# * A split-dwarf binary with the .dwp file right next to the binary.
 
-# RUN: rm -rf %t || echo ok
-# RUN: mkdir -p %t/output
-# RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 3: No locator
-#  A split binary, with a .dwp file right next to the binary
-
-# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/output/bin-split
-# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/output/bin-split.dwp
-# RUN: chmod a+x %t/output/bin-split
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/bin-split
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/bin-split.dwp
+# RUN: chmod a+x %t/bin-split
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-split" \
+# RUN:       -o "target create %t/bin-split" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
@@ -24,3 +20,5 @@
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
 # CHECK-NEXT: {{^[- ]+$}}
+# Verify it found the DWP file properly:
+# CHECK-NEXT: 0x{{[0-9a-f]+.* +}}/{{.*}}/bin-split.dwp({{.*}}bin-split.dwo){{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-negative.test b/lldb/test/Shell/Debuginfod/split-okdstrip-negative.test
index 4bca2113d73ddb1..0b2267329650a52 100644
--- a/lldb/test/Shell/Debuginfod/split-okdstrip-negative.test
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-negative.test
@@ -1,24 +1,24 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 5 negative:
+# * An "only-keep-debug" stripped, split binary with a _missing_
+# * --add-gnu-debuglink symbol file.
 
-# RUN: mkdir -p %t/output
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 4: No locator
-#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
-
-# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped.tmp
-# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/output/sym-split
-# RUN: llvm-objcopy %t/output/bin-split-stripped.tmp --add-gnu-debuglink=%t/output/sym-split %t/output/bin-split-stripped
-# RUN: rm %t/output/sym-split
-# RUN: chmod a+x %t/output/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/bin-split-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/sym-split
+# RUN: llvm-objcopy %t/bin-split-stripped.tmp --add-gnu-debuglink=%t/sym-split %t/bin-split-stripped
+# RUN: rm %t/sym-split
+# RUN: chmod a+x %t/bin-split-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target create %t/bin-split-stripped" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# CHECK: Current executable set to {{.*}}.tmp/output/bin-split-stripped' (x86_64).
+# CHECK: Current executable set to {{.*}}/bin-split-stripped' (x86_64).
 # CHECK-NEXT: target modules dump separate-debug-info
 # CHECK-NEXT: error: no matching executable images found
diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-no-locator.test b/lldb/test/Shell/Debuginfod/split-okdstrip-no-locator.test
index d210a1a7dd54b00..c4574257b5d07ce 100644
--- a/lldb/test/Shell/Debuginfod/split-okdstrip-no-locator.test
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-no-locator.test
@@ -1,25 +1,27 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 5 baseline:
+# * A stripped, split binary, with --add-gnu-debuglink symbols automatically
+# * found, with a .dwp file located next to the binary.
 
-# RUN: mkdir -p %t/output
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 4: No locator
-#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
-
-# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped.tmp
-# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/output/sym-split
-# RUN: llvm-objcopy %t/output/bin-split-stripped.tmp --add-gnu-debuglink=%t/output/sym-split %t/output/bin-split-stripped
-# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/output/bin-split-stripped.dwp
-# RUN: chmod a+x %t/output/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/bin-split-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/sym-split
+# RUN: llvm-objcopy %t/bin-split-stripped.tmp --add-gnu-debuglink=%t/sym-split %t/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/bin-split-stripped.dwp
+# RUN: chmod a+x %t/bin-split-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target create %t/bin-split-stripped" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# CHECK: Symbol file: {{.*}}/bin-split
+# CHECK: Symbol file: {{.*}}/bin-split-stripped
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
-# CHECK: {{0x[0-9a-f]+.* +.*}}/output/bin-split-stripped.dwp(gen/bin-split.dwo){{ *$}}
+# CHECK-NEXT: {{[- ]+}}
+# Verify it found the DWP file properly
+# CHECK-NEXT: 0x{{[0-9a-f]+.* +}}/{{.*}}/bin-split-stripped.dwp({{.*}}bin-split.dwo){{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
index 3261a78b22bb221..9d141b0f87abe4b 100644
--- a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
@@ -1,26 +1,26 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 5:
+# * A stripped, split binary, with --add-gnu-debuglink symbol file where
+# * both files are *only* available through Debuginfod.
 
-# RUN: mkdir -p %t/output
+# Set up a file-system 'hosted' Debuginfod server
+# RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
 # RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
 
-# Scenario 4: No locator
-#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
-
-# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped.tmp
-# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/output/sym-split
-# RUN: llvm-objcopy %t/output/bin-split-stripped.tmp --add-gnu-debuglink=%t/output/sym-split %t/output/bin-split-stripped
-# RUN: mv %t/output/sym-split %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/executable
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/bin-split-stripped.tmp
+# RUN: yaml2obj %p/Inputs/sym-split.yaml -o %t/sym-split
+# RUN: llvm-objcopy %t/bin-split-stripped.tmp --add-gnu-debuglink=%t/sym-split %t/bin-split-stripped
+# RUN: mv %t/sym-split %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/executable
 # RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/debuginfo
-# RUN: chmod a+x %t/output/bin-split-stripped
+# RUN: chmod a+x %t/bin-split-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target create %t/bin-split-stripped" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
@@ -28,4 +28,5 @@
 # CHECK: Symbol file: {{.*}}/bin-split-stripped
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
-# CHECK: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
+# CHECK-NEXT: {{[- ]+}}
+# CHECK-NEXT: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-positive.test b/lldb/test/Shell/Debuginfod/split-positive.test
index 50b7082aac43c0f..572b36f505c1b9f 100644
--- a/lldb/test/Shell/Debuginfod/split-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-positive.test
@@ -1,35 +1,30 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 3:
+# * A split-dwarf binary with a Debuginfod-hosted .dwp file.
 
-# RUN: mkdir -p %t/output
+# Set up a file-system 'hosted' Debuginfod server
+# RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
 # RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
 
-# Scenario 2
-#  A stripped binary, with an "-only-keep-debug" symbols file
-#  Debuginfo has the 'okd' file as the 'debuginfo' item
-# LLDB should ask Debuginfod for it's symbols
-
-# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/output/bin-split
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/bin-split
 # RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/debuginfo
-# RUN: chmod a+x %t/output/bin-split
-
-# Positive test: We find the DWP file with the Debuginfod service
+# RUN: chmod a+x %t/bin-split
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/bin-split" \
+# RUN:       -o "target create %t/bin-split" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# CHECK: Symbol file: {{.*}}/output/bin-split
+# CHECK: Symbol file: {{.*}}/bin-split
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
-# CHECK: {{[- ]+}}
-# The cache key is stable, so we can mandate that we discover this thing from the cache
+# CHECK-NEXT: {{[- ]+}}
+# The cache key is stable, so mandating it's location verifies it was cached
 # The '.tmp' (sort of) ensures the cache is our private cache, not the system cache
-# CHECK: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
+# CHECK-NEXT: {{0x[0-9a-f]+.* +}}/{{.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-strip-negative.test b/lldb/test/Shell/Debuginfod/split-strip-negative.test
index 163714cb20b77e4..0359fdb0cfb7d45 100644
--- a/lldb/test/Shell/Debuginfod/split-strip-negative.test
+++ b/lldb/test/Shell/Debuginfod/split-strip-negative.test
@@ -1,20 +1,19 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 4 negative:
+# * A stripped, split binary with missing symbols and missing .dwp file.
 
-# RUN: mkdir -p %t/output
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 4: Negative
-#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
-
-# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped
-# RUN: chmod a+x %t/output/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/bin-split-stripped
+# RUN: chmod a+x %t/bin-split-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target create %t/bin-split-stripped" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# CHECK: Current executable set to '{{.*}}/output/bin-split-stripped'
+# CHECK: Current executable set to '{{.*}}/bin-split-stripped'
 # CHECK: error: no matching executable images found
diff --git a/lldb/test/Shell/Debuginfod/split-strip-no-locator.test b/lldb/test/Shell/Debuginfod/split-strip-no-locator.test
index 710313e84439857..a7638f918811dd5 100644
--- a/lldb/test/Shell/Debuginfod/split-strip-no-locator.test
+++ b/lldb/test/Shell/Debuginfod/split-strip-no-locator.test
@@ -1,26 +1,27 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 4 baseline:
+# * A stripped, split binary, with symbols manually added and the
+# * .dwp file located (automatically) sitting next to the binary.
 
-# RUN: mkdir -p %t/output
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 4: No locator
-#  A stripped, split binary, symbols manually added and a .dwp file right next to the binary
-
-# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped
-# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/output/bin-split
-# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/output/bin-split-stripped.dwp
-# RUN: chmod a+x %t/output/bin-split-stripped
-# RUN: chmod a+x %t/output/bin-split
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/bin-split
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/bin-split-stripped.dwp
+# RUN: chmod a+x %t/bin-split-stripped
+# RUN: chmod a+x %t/bin-split
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-split-stripped" \
-# RUN:       -o "target symbols add %t/output/bin-split" \
+# RUN:       -o "target create %t/bin-split-stripped" \
+# RUN:       -o "target symbols add %t/bin-split" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# CHECK: Symbol file: {{.*}}/bin-split
+# CHECK: Symbol file: {{.*}}/bin-split-stripped
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
-# CHECK: {{0x[0-9a-f]+.* +.*}}/output/bin-split-stripped.dwp(gen/bin-split.dwo){{ *$}}
+# CHECK-NEXT: {{^[- ]+$}}
+# CHECK-NEXT: {{0x[0-9a-f]+.* +.*}}/bin-split-stripped.dwp({{.*}}/bin-split.dwo){{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-strip-positive.test b/lldb/test/Shell/Debuginfod/split-strip-positive.test
index 9ebc74cb5bd3621..261319919bc94fd 100644
--- a/lldb/test/Shell/Debuginfod/split-strip-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-strip-positive.test
@@ -1,31 +1,32 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 4:
+# * A stripped, split binary, with the unstripped binary and .dwp file
+# * hosted by Debuginfod.
 
-# RUN: mkdir -p %t/output
+# Set up a file-system 'hosted' Debuginfod server.
+# RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
 # RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
 
-# Scenario 4:
-#  A stripped, split binary, symbols manually added and a .dwp file
-#  The unstripped binary should be picked up from /82...94/executable
-#  The .dwp file should be picke dup from /82...94/debuginfo
-
-# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/output/bin-split-stripped
+# RUN: yaml2obj %p/Inputs/bin-split-stripped.yaml -o %t/bin-split-stripped
 # RUN: yaml2obj %p/Inputs/bin-split.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/executable
 # RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094/debuginfo
-# RUN: chmod a+x %t/output/bin-split-stripped
+# RUN: chmod a+x %t/bin-split-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/bin-split-stripped" \
+# RUN:       -o "target create %t/bin-split-stripped" \
 # RUN:       -o "target modules dump separate-debug-info" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# CHECK: Symbol file: {{.*}}/bin-split
+# CHECK: Symbol file: {{.*}}/bin-split-stripped
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
-# CHECK: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
+# CHECK-NEXT: {{^[- ]+$}}
+# The cache key is stable, so mandating it's location verifies it was cached.
+# The '.tmp' (sort of) ensures the cache is our private cache, not the system cache.
+# CHECK-NEXT: {{0x[0-9a-f]+.* +}}/{{.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/strip-negative.test b/lldb/test/Shell/Debuginfod/strip-negative.test
index 2c4128e0d04b680..5aae7189678a114 100644
--- a/lldb/test/Shell/Debuginfod/strip-negative.test
+++ b/lldb/test/Shell/Debuginfod/strip-negative.test
@@ -1,23 +1,20 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# This is paranoia to make sure there's not a cached symbol file laying around
+# Scenario 1 negative:
+# * A plain stripped binary, no symbols available
+# * Negative test: make sure nothing's been cached
 
-# RUN: mkdir -p %t/output
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# Scenario 1
-#  A simple stripped binary, no symbols (negative test: nothing's been cached, right?)
-
-# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped
-# RUN: chmod a+x %t/output/bin-stripped
-
-# Run a negative test (make sure we don't have symbols)
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped
+# RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "target create %t/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
 # Should NOT have source file information:
-
 # CHECK: Breakpoint 1: where = bin-stripped`func, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/strip-no-locator.test b/lldb/test/Shell/Debuginfod/strip-no-locator.test
index 5ae9691d4939862..ea4bb47648ecbdc 100644
--- a/lldb/test/Shell/Debuginfod/strip-no-locator.test
+++ b/lldb/test/Shell/Debuginfod/strip-no-locator.test
@@ -1,24 +1,22 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# RUN: mkdir -p %t/output
+# Scenario 1 baseline:
+# * A plain stripped binary, add the unstripped binary as a symbol file
+# * Sanity for functional parity with Debuginfod-provided symbols
 
-# Scenario 1
-#  A simple stripped binary, add the unstripped binary as a symbol file
-#  (Sanity for comparison with Debuginfod-provided symbols)
+# RUN: rm -rf %t
+# RUN: mkdir -p %t
 
-# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/output/bin-normal
-# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped
-# RUN: chmod a+x %t/output/bin-stripped
-
-# Run a negative test (make sure we don't have symbols)
+# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/bin-normal
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped
+# RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup false" \
-# RUN:       -o "target create %t/output/bin-stripped" \
-# RUN:       -o "target symbols add %t/output/bin-normal" \
+# RUN:       -o "target create %t/bin-stripped" \
+# RUN:       -o "target symbols add %t/bin-normal" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# Should NOT have source file information:
-
+# Should have correct source file and line information:
 # CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/strip-positive-a.test b/lldb/test/Shell/Debuginfod/strip-positive-a.test
index 98df28b5c3232ba..baa63f068bbff8e 100644
--- a/lldb/test/Shell/Debuginfod/strip-positive-a.test
+++ b/lldb/test/Shell/Debuginfod/strip-positive-a.test
@@ -1,35 +1,26 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 1a:
+# * A plain stripped binary
+# * Debuginfod has the unstripped binary as the 'debuginfo'
 
-# RUN: mkdir -p %t/output
+# Set up a file-system 'hosted' Debuginfod server:
+# RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
 # RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
 
-# Scenario 1a
-#  A simple stripped binary
-#  Debuginfod has the unstripped binary as the 'debuginfo'
-
-# Put the unstripped binary in the Debuginfod server as 'debuginfo'
-
 # RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/debuginfo
-# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped
-# RUN: chmod a+x %t/output/bin-stripped
-
-# First, run a negative test (make sure we don't have symbols)
-
-# Scenario 1, postive test: Can we pull the executable
-# from Debuginfod and get a breakpoint set properly?
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped
+# RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "target create %t/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# Should have source file info:
-
+# Should have source file and line info:
 # CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/strip-positive-b.test b/lldb/test/Shell/Debuginfod/strip-positive-b.test
index cc9aaee072b0f82..f1046bb8448f15c 100644
--- a/lldb/test/Shell/Debuginfod/strip-positive-b.test
+++ b/lldb/test/Shell/Debuginfod/strip-positive-b.test
@@ -1,35 +1,26 @@
 # REQUIRES: system-linux && native && target-x86_64
 
-# We set up a file-system 'hosted' Debuginfod server
+# Scenario 1b:
+# * A plain stripped binary
+# * Debuginfod has the unstripped binary as the 'executable'
 
-# RUN: mkdir -p %t/output
+# Set up a file-system 'hosted' Debuginfod server:
+# RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
 # RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
 
-# Scenario 1a
-#  A simple stripped binary
-#  Debuginfod has the unstripped binary as the 'executable'
-
-# Put the unstripped binary in the Debuginfod server as 'executable'
-
 # RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/executable
-# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/output/bin-stripped
-# RUN: chmod a+x %t/output/bin-stripped
-
-# First, run a negative test (make sure we don't have symbols)
-
-# Scenario 1, postive test: Can we pull the executable
-# from Debuginfod and get a breakpoint set properly?
+# RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped
+# RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
 # RUN:       -o "settings set plugin.symbol-locator.debuginfod.cache-path %t/cache" \
 # RUN:       -o "settings clear plugin.symbol-locator.debuginfod.server-urls" \
 # RUN:       -o "settings insert-before plugin.symbol-locator.debuginfod.server-urls 0 file://%t" \
-# RUN:       -o "target create %t/output/bin-stripped" \
+# RUN:       -o "target create %t/bin-stripped" \
 # RUN:       -o "b func" \
 # RUN:       -o "quit" \
 # RUN:        2>&1 | FileCheck %s
 
-# Should have source file info:
-
+# Should have source file and line info:
 # CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:69:11, address = 0x{{[0-9a-f]+}}

>From 2e2494f8d7d1f84c6a19537d24b88b3021be4456 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Tue, 23 Jan 2024 09:52:50 -0800
Subject: [PATCH 09/10] Positive tests only run if we have libcurl

---
 lldb/test/Shell/Debuginfod/okdstrip-positive-a.test     | 2 +-
 lldb/test/Shell/Debuginfod/okdstrip-positive-b.test     | 2 +-
 lldb/test/Shell/Debuginfod/split-okdstrip-positive.test | 2 +-
 lldb/test/Shell/Debuginfod/split-positive.test          | 6 +++---
 lldb/test/Shell/Debuginfod/split-strip-positive.test    | 2 +-
 lldb/test/Shell/Debuginfod/strip-positive-a.test        | 2 +-
 lldb/test/Shell/Debuginfod/strip-positive-b.test        | 2 +-
 lldb/test/Shell/lit.cfg.py                              | 3 +++
 lldb/test/Shell/lit.site.cfg.py.in                      | 1 +
 llvm/lib/Debuginfod/Debuginfod.cpp                      | 1 +
 10 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test b/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
index 77abcc7ca9d665b..930a64e85187010 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
@@ -1,4 +1,4 @@
-# REQUIRES: system-linux && native && target-x86_64
+# REQUIRES: curl && system-linux && native && target-x86_64
 
 # Scenario 2a:
 #  A stripped binary, with an "-only-keep-debug" symbols file.
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test b/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
index 3555d4c2fc2874c..05d9fa1ebbf36e9 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
@@ -1,4 +1,4 @@
-# REQUIRES: system-linux && native && target-x86_64
+# REQUIRES: curl && system-linux && native && target-x86_64
 
 # Scenario 2b:
 #  A stripped binary, with an "-only-keep-debug" symbols file.
diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
index 9d141b0f87abe4b..5f1eb18e21c7c50 100644
--- a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
@@ -1,4 +1,4 @@
-# REQUIRES: system-linux && native && target-x86_64
+# REQUIRES: curl && system-linux && native && target-x86_64
 
 # Scenario 5:
 # * A stripped, split binary, with --add-gnu-debuglink symbol file where
diff --git a/lldb/test/Shell/Debuginfod/split-positive.test b/lldb/test/Shell/Debuginfod/split-positive.test
index 572b36f505c1b9f..445b6b7eef96f6a 100644
--- a/lldb/test/Shell/Debuginfod/split-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-positive.test
@@ -1,4 +1,4 @@
-# REQUIRES: system-linux && native && target-x86_64
+# REQUIRES: curl && system-linux && native && target-x86_64
 
 # Scenario 3:
 # * A split-dwarf binary with a Debuginfod-hosted .dwp file.
@@ -25,6 +25,6 @@
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
 # CHECK-NEXT: {{[- ]+}}
-# The cache key is stable, so mandating it's location verifies it was cached
-# The '.tmp' (sort of) ensures the cache is our private cache, not the system cache
+# The cache key is stable, so mandating it's location verifies it was cached.
+# The '.tmp' (sort of) ensures the cache is our private cache, not the system cache.
 # CHECK-NEXT: {{0x[0-9a-f]+.* +}}/{{.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-strip-positive.test b/lldb/test/Shell/Debuginfod/split-strip-positive.test
index 261319919bc94fd..3c19382d2f6df61 100644
--- a/lldb/test/Shell/Debuginfod/split-strip-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-strip-positive.test
@@ -1,4 +1,4 @@
-# REQUIRES: system-linux && native && target-x86_64
+# REQUIRES: curl && system-linux && native && target-x86_64
 
 # Scenario 4:
 # * A stripped, split binary, with the unstripped binary and .dwp file
diff --git a/lldb/test/Shell/Debuginfod/strip-positive-a.test b/lldb/test/Shell/Debuginfod/strip-positive-a.test
index baa63f068bbff8e..e8ca8584c2fbc49 100644
--- a/lldb/test/Shell/Debuginfod/strip-positive-a.test
+++ b/lldb/test/Shell/Debuginfod/strip-positive-a.test
@@ -1,4 +1,4 @@
-# REQUIRES: system-linux && native && target-x86_64
+# REQUIRES: curl && system-linux && native && target-x86_64
 
 # Scenario 1a:
 # * A plain stripped binary
diff --git a/lldb/test/Shell/Debuginfod/strip-positive-b.test b/lldb/test/Shell/Debuginfod/strip-positive-b.test
index f1046bb8448f15c..a7af5bdbdfcf1ea 100644
--- a/lldb/test/Shell/Debuginfod/strip-positive-b.test
+++ b/lldb/test/Shell/Debuginfod/strip-positive-b.test
@@ -1,4 +1,4 @@
-# REQUIRES: system-linux && native && target-x86_64
+# REQUIRES: curl && system-linux && native && target-x86_64
 
 # Scenario 1b:
 # * A plain stripped binary
diff --git a/lldb/test/Shell/lit.cfg.py b/lldb/test/Shell/lit.cfg.py
index d75c1f532e147f6..9a596a40b29664e 100644
--- a/lldb/test/Shell/lit.cfg.py
+++ b/lldb/test/Shell/lit.cfg.py
@@ -144,6 +144,9 @@ def calculate_arch_features(arch_string):
 if config.lldb_system_debugserver:
     config.available_features.add("system-debugserver")
 
+if config.llvm_enable_curl:
+    config.available_features.add("curl")
+
 if config.have_lldb_server:
     config.available_features.add("lldb-server")
 
diff --git a/lldb/test/Shell/lit.site.cfg.py.in b/lldb/test/Shell/lit.site.cfg.py.in
index 736dfc335732b5a..5428691c129a1c8 100644
--- a/lldb/test/Shell/lit.site.cfg.py.in
+++ b/lldb/test/Shell/lit.site.cfg.py.in
@@ -19,6 +19,7 @@ config.python_executable = "@Python3_EXECUTABLE@"
 config.have_zlib = @LLVM_ENABLE_ZLIB@
 config.objc_gnustep_dir = "@LLDB_TEST_OBJC_GNUSTEP_DIR@"
 config.lldb_enable_lzma = @LLDB_ENABLE_LZMA@
+config.llvm_enable_curl = @LLVM_ENABLE_CURL@
 config.host_triple = "@LLVM_HOST_TRIPLE@"
 config.lldb_bitness = 64 if @LLDB_IS_64_BITS@ else 32
 config.lldb_enable_python = @LLDB_ENABLE_PYTHON@
diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp b/llvm/lib/Debuginfod/Debuginfod.cpp
index ba1a3daebd2632f..16368cb5d5c6b6e 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -158,6 +158,7 @@ Expected<std::string> getCachedOrDownloadDebuginfo(BuildIDRef ID) {
   std::string UrlPath = getDebuginfodDebuginfoUrlPath(ID);
   return getCachedOrDownloadArtifact(getDebuginfodCacheKey(UrlPath), UrlPath);
 }
+
 // General fetching function.
 Expected<std::string> getCachedOrDownloadArtifact(StringRef UniqueKey,
                                                   StringRef UrlPath) {

>From 0045111a4ea172c543dd10d72f4615791ba9cd61 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Tue, 23 Jan 2024 10:02:50 -0800
Subject: [PATCH 10/10] Cleaned up comment in the SymLocator cmake file

---
 lldb/source/Plugins/SymbolLocator/CMakeLists.txt | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lldb/source/Plugins/SymbolLocator/CMakeLists.txt b/lldb/source/Plugins/SymbolLocator/CMakeLists.txt
index f536760d8feb0e8..3367022639ab85f 100644
--- a/lldb/source/Plugins/SymbolLocator/CMakeLists.txt
+++ b/lldb/source/Plugins/SymbolLocator/CMakeLists.txt
@@ -1,8 +1,8 @@
-# Order matters here, as the first symbol locator will prevent further
-# searching. For DWARF binaries that are both stripped & split, the Default
-# plugin will return the stripped binary when asked for the ObjectFile,
-# preventing an unstripped binary from being requested from the Debuginfod
-# provider
+# Order matters here: the first symbol locator prevents further searching.
+# For DWARF binaries that are both stripped and split, the Default plugin
+# will return the stripped binary when asked for the ObjectFile, which then
+# prevents an unstripped binary from being requested from the Debuginfod
+# provider.
 add_subdirectory(Debuginfod)
 add_subdirectory(Default)
 if (CMAKE_SYSTEM_NAME MATCHES "Darwin")



More information about the lldb-commits mailing list