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

Kevin Frei via lldb-commits lldb-commits at lists.llvm.org
Mon Mar 4 15:48:50 PST 2024


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

>From 1d547214df856c3ed34fa715313c7a33c990ee76 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/15] 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 1cf550721000eb..066f0c27bb9ffb 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 dedfc28219d83d4e5cdd2edee5081b51f6166495 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/15] 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 84ff4c2565a050..12541e929a12da 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"
@@ -4347,6 +4348,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]() {
     // Create a list of files to try and append .dwp to.
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 2f8f80f8765cb8..7c59252f9cdbea 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -280,6 +280,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 ca969626f4ffc4..f536760d8feb0e 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 2cd7bbbb244902..81406654092b3c 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 b5fe35d71032a8..aeacf9c78ea70f 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 00000000000000..1cc8bffc59ce3a
--- /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 00000000000000..60b086adf1d633
--- /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 00000000000000..bcaa7502895426
--- /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 00000000000000..a4465d75fa6daf
--- /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 00000000000000..34d157b66c6b79
--- /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 00000000000000..11798976f5c15a
--- /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 00000000000000..e03ff90187f40d
--- /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 00000000000000..a4465d75fa6daf
--- /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 00000000000000..661e5771fcbeeb
--- /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 00000000000000..a66f4a641b4275
--- /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 00000000000000..5d5ed250c4cc1d
--- /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 00000000000000..3a3f20a5c82c4b
--- /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 00000000000000..f110db39c11ae7
--- /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 00000000000000..67d55a16041d34
--- /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 00000000000000..e1018a1181c241
--- /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 00000000000000..acb647e83e008f
--- /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 00000000000000..62c7832da8fb36
--- /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 00000000000000..78671b6eb463aa
--- /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 00000000000000..7fe3e9e68d4ed3
--- /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 066f0c27bb9ffb..1dee5f343cf6ba 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 ba1a8a0157314d..e88ed8d6411ec7 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 4a34ad2a87c331..46aa15113d2b80 100644
--- a/llvm/utils/lldbDataFormatters.py
+++ b/llvm/utils/lldbDataFormatters.py
@@ -374,6 +374,7 @@ def DenseMapSummary(valobj: lldb.SBValue, _) -> str:
     return summary
 
 
+"""
 class DenseMapSynthetic:
     valobj: lldb.SBValue
 
@@ -432,3 +433,4 @@ def update(self):
         for indexes in key_buckets.values():
             if len(indexes) == 1:
                 self.child_buckets.append(indexes[0])
+"""

>From 3a018baa743585ffc6eebf796a9841b183ca3afd 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/15] 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 bcaa7502895426..1e8b8ffeee25e0 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 60b086adf1d633..1f18c04a4415ad 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 11798976f5c15a..6501cda4a4f7e6 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 e03ff90187f40d..b99d0ede47c21d 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 a4465d75fa6daf..6c8045e9a2068b 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 a4465d75fa6daf..00000000000000
--- 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 a66f4a641b4275..b222b5c028a2a2 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 34d157b66c6b79..f25e4c4abf5c24 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 1cc8bffc59ce3a..608e9d04b2ebf2 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 62c7832da8fb36..2c4128e0d04b68 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 00000000000000..5ae9691d493986
--- /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 00000000000000..98df28b5c3232b
--- /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 78671b6eb463aa..cc9aaee072b0f8 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 7fe3e9e68d4ed3..62cca92355b03b 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 3956f31e6f237da2f391173418f31af58a5bb200 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/15] 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 5d5ed250c4cc1d..00000000000000
--- 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 3a3f20a5c82c4b..00000000000000
--- 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 f110db39c11ae7..00000000000000
--- 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 67d55a16041d34..00000000000000
--- 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 00000000000000..a63beccd249b1f
--- /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 00000000000000..f45477a8f037c0
--- /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 00000000000000..12cb9cf0282dda
--- /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 00000000000000..ace1cfc58e0717
--- /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 e1018a1181c241..00000000000000
--- 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 00000000000000..351bb0b3c44be9
--- /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 00000000000000..bb60100b0e0547
--- /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 00000000000000..4bca2113d73ddb
--- /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 00000000000000..d210a1a7dd54b0
--- /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 00000000000000..a60c1139a64604
--- /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 acb647e83e008f..50b7082aac43c0 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 00000000000000..163714cb20b77e
--- /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 00000000000000..710313e8443985
--- /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 00000000000000..9ebc74cb5bd362
--- /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 62cca92355b03b..cbde54d75af7a8 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 905411ff93ddf416d605a74c16d4d2b9c7157e56 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/15] 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 a60c1139a64604..3261a78b22bb22 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 1dee5f343cf6ba..abea0d831e0ca8 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 e88ed8d6411ec7..ba1a8a0157314d 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 46aa15113d2b80..4a34ad2a87c331 100644
--- a/llvm/utils/lldbDataFormatters.py
+++ b/llvm/utils/lldbDataFormatters.py
@@ -374,7 +374,6 @@ def DenseMapSummary(valobj: lldb.SBValue, _) -> str:
     return summary
 
 
-"""
 class DenseMapSynthetic:
     valobj: lldb.SBValue
 
@@ -433,4 +432,3 @@ def update(self):
         for indexes in key_buckets.values():
             if len(indexes) == 1:
                 self.child_buckets.append(indexes[0])
-"""

>From dcd5eb1fdb37ef758f1f6737ffbc72d7f9f421d0 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/15] 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 12541e929a12da..84ff4c2565a050 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"
@@ -4348,23 +4347,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]() {
     // Create a list of files to try and append .dwp to.
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 7c59252f9cdbea..2f8f80f8765cb8 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -280,9 +280,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 81406654092b3c..2cd7bbbb244902 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 aeacf9c78ea70f..5f66de1ff67eee 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 11a0691e2eefb87dbb4c355b193a249aab9576c2 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/15] 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 5f66de1ff67eee..ec734b8bb64f87 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 3e17283056ef336e8fce766d920bc39b0c4f38b6 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/15] 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 cbde54d75af7a8..df335ca11ffa42 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 a63beccd249b1f..8b0603e6f5860d 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 f45477a8f037c0..943ab100437c6c 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 12cb9cf0282dda..77abcc7ca9d665 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 ace1cfc58e0717..3555d4c2fc2874 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 351bb0b3c44be9..6458abd4485df6 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 bb60100b0e0547..11ac3c60d5b87a 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 4bca2113d73ddb..0b2267329650a5 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 d210a1a7dd54b0..c4574257b5d07c 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 3261a78b22bb22..9d141b0f87abe4 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 50b7082aac43c0..572b36f505c1b9 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 163714cb20b77e..0359fdb0cfb7d4 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 710313e8443985..a7638f918811dd 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 9ebc74cb5bd362..261319919bc94f 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 2c4128e0d04b68..5aae7189678a11 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 5ae9691d493986..ea4bb47648ecbd 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 98df28b5c3232b..baa63f068bbff8 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 cc9aaee072b0f8..f1046bb8448f15 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 7c0a595107865a493e1fa366668b3bb401c21e9f 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/15] 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 77abcc7ca9d665..930a64e8518701 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 3555d4c2fc2874..05d9fa1ebbf36e 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 9d141b0f87abe4..5f1eb18e21c7c5 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 572b36f505c1b9..445b6b7eef96f6 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 261319919bc94f..3c19382d2f6df6 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 baa63f068bbff8..e8ca8584c2fbc4 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 f1046bb8448f15..a7af5bdbdfcf1e 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 d75c1f532e147f..9a596a40b29664 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 736dfc335732b5..5428691c129a1c 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 abea0d831e0ca8..2927ba21323885 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 2eb8493e27d23cbd9671c26d3b73e7a8dba06f74 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/15] 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 f536760d8feb0e..3367022639ab85 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")

>From 79ac3bee249a45c473261137f13a25ee3d11f291 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Tue, 23 Jan 2024 13:00:57 -0800
Subject: [PATCH 11/15] Updated tests for smaller main.c

---
 .../Shell/Debuginfod/Inputs/bin-normal.yaml   | 10 +--
 .../Debuginfod/Inputs/bin-split-dwp.yaml      |  4 +-
 .../Debuginfod/Inputs/bin-split-stripped.yaml |  4 +-
 .../Shell/Debuginfod/Inputs/bin-split.yaml    |  6 +-
 .../Shell/Debuginfod/Inputs/bin-stripped.yaml |  4 +-
 lldb/test/Shell/Debuginfod/Inputs/main.c      | 72 +------------------
 lldb/test/Shell/Debuginfod/Inputs/make-inputs |  2 +-
 .../Shell/Debuginfod/Inputs/sym-split.yaml    |  6 +-
 .../Shell/Debuginfod/Inputs/sym-stripped.yaml | 10 +--
 .../Shell/Debuginfod/okdstrip-no-locator.test |  2 +-
 .../Shell/Debuginfod/okdstrip-positive-a.test |  6 +-
 .../Shell/Debuginfod/okdstrip-positive-b.test |  6 +-
 .../Debuginfod/split-okdstrip-positive.test   |  8 +--
 .../test/Shell/Debuginfod/split-positive.test |  6 +-
 .../Debuginfod/split-strip-positive.test      |  8 +--
 .../Shell/Debuginfod/strip-no-locator.test    |  2 +-
 .../Shell/Debuginfod/strip-positive-a.test    |  6 +-
 .../Shell/Debuginfod/strip-positive-b.test    |  6 +-
 llvm/lib/Debuginfod/Debuginfod.cpp            | 41 ++---------
 19 files changed, 58 insertions(+), 151 deletions(-)

diff --git a/lldb/test/Shell/Debuginfod/Inputs/bin-normal.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-normal.yaml
index 1e8b8ffeee25e0..ed3fd4d949ea6c 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/bin-normal.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-normal.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            725D47B7EE964F615C841A04712D6F43175F9D8D
+        Desc:            6E10CF17A4D84D5622C67A2FD38282BF121C67D5
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_PROGBITS
@@ -94,11 +94,11 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420633234306534393034343037643064393337383633666533306332656265373764633639333232352900
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         9A000000050001080000000001001D0001080000000000000002016400000008000000022D000000004C02A1000339000000043D0000000100050306010604080707012800000001560500447E0000000802917C0800447E00000008029170090044820000000009023400000001560700480A02770809004C9100000000050605040B870000000B8C0000000C390000000387000000043D000000010000
+    Content:         9A000000050001080000000001001D0001080000000000000002016400000008000000022D000000000B02A1000339000000043D0000000100050306010604080707012800000001560500037E0000000802917C0800037E00000008029170090003820000000009023400000001560700070A02770809000B9100000000050605040B870000000B8C0000000C390000000387000000043D000000010000
   - Name:            .debug_abbrev
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
@@ -106,7 +106,7 @@ Sections:
   - Name:            .debug_line
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D00000000AA7BC59AF617547916B47B73E78D55160400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+    Content:         780000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000002F0CB321CF64CEDC7E77B5861A0075A20400000902001040000000000014050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
   - 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 f2b81cb569d0632a0eb0fd51722d725ab191af72)'
+    - 'Facebook clang version 15.0.0 (git at github.com:kevinfrei/llvm.git c240e4904407d0d937863fe30c2ebe77dc693225)'
     - main.c
     - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
     - char
diff --git a/lldb/test/Shell/Debuginfod/Inputs/bin-split-dwp.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-split-dwp.yaml
index 1f18c04a4415ad..b3bbff01a3689f 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/bin-split-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:         63686172005F5F41525241595F53495A455F545950455F5F0066756E6300696E74005F7374617274006172676300617267760046616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E676974206632623831636235363964303633326130656230666435313732326437323561623139316166373229006D61696E2E630067656E2F62696E2D73706C69742E64776F00
+    Content:         63686172005F5F41525241595F53495A455F545950455F5F0066756E6300696E74005F7374617274006172676300617267760046616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E676974206332343065343930343430376430643933373836336665333063326562653737646336393332323529006D61696E2E630067656E2F62696E2D73706C69742E64776F00
   - Name:            .debug_str_offsets.dwo
     Type:            SHT_PROGBITS
     Flags:           [ SHF_EXCLUDE ]
@@ -31,7 +31,7 @@ Sections:
     Type:            SHT_PROGBITS
     Flags:           [ SHF_EXCLUDE ]
     AddressAlign:    0x1
-    Content:         8D00000005000508000000008094E89A08DB62C101071D0008090224000000004C02A10003300000000434000000010005000601060108070701280000000156020044710000000802917C05004471000000080291700600447500000000090001560400480A02770806004C8400000000050305040B7A0000000B7F0000000C30000000037A0000000434000000010000
+    Content:         8D00000005000508000000008094E89A08DB62C101071D0008090224000000000B02A10003300000000434000000010005000601060108070701280000000156020003710000000802917C05000371000000080291700600037500000000090001560400070A02770806000B8400000000050305040B7A0000000B7F0000000C30000000037A0000000434000000010000
   - Name:            .debug_cu_index
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
diff --git a/lldb/test/Shell/Debuginfod/Inputs/bin-split-stripped.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-split-stripped.yaml
index 6501cda4a4f7e6..7c0c95d4d7bace 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/bin-split-stripped.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-split-stripped.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            82B2C35129DAB19AD58F3DD0F426BDB0CC8AA094
+        Desc:            14FE1776C0055EA25EFD58D934BB305FBBACDAC3
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_PROGBITS
@@ -94,7 +94,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420633234306534393034343037643064393337383633666533306332656265373764633639333232352900
 Symbols:
   - Name:            .note.gnu.build-id
     Type:            STT_SECTION
diff --git a/lldb/test/Shell/Debuginfod/Inputs/bin-split.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-split.yaml
index b99d0ede47c21d..e3679b3ca5b635 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/bin-split.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-split.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            82B2C35129DAB19AD58F3DD0F426BDB0CC8AA094
+        Desc:            14FE1776C0055EA25EFD58D934BB305FBBACDAC3
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_PROGBITS
@@ -94,7 +94,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420633234306534393034343037643064393337383633666533306332656265373764633639333232352900
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
@@ -106,7 +106,7 @@ Sections:
   - Name:            .debug_line
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D00000000AA7BC59AF617547916B47B73E78D55160400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+    Content:         780000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000002F0CB321CF64CEDC7E77B5861A0075A20400000902001040000000000014050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
   - Name:            .debug_line_str
     Type:            SHT_PROGBITS
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
diff --git a/lldb/test/Shell/Debuginfod/Inputs/bin-stripped.yaml b/lldb/test/Shell/Debuginfod/Inputs/bin-stripped.yaml
index 6c8045e9a2068b..f81ce51e4de1bf 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/bin-stripped.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/bin-stripped.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            725D47B7EE964F615C841A04712D6F43175F9D8D
+        Desc:            6E10CF17A4D84D5622C67A2FD38282BF121C67D5
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_PROGBITS
@@ -94,7 +94,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420633234306534393034343037643064393337383633666533306332656265373764633639333232352900
 Symbols:
   - Name:            .note.gnu.build-id
     Type:            STT_SECTION
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main.c b/lldb/test/Shell/Debuginfod/Inputs/main.c
index 661e5771fcbeeb..6f2106034f45ab 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main.c
+++ b/lldb/test/Shell/Debuginfod/Inputs/main.c
@@ -1,73 +1,7 @@
-/*
+// A script to (re)create the .yaml files is in 'make-inputs'. If you make changes
+// you'll need to update the .note.gnu.buildid values in the tests, as the cache names
 
-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);
-}
+int func(int argc, const char **argv) { return (argc + 1) * (argv[argc][0] + 2); }
 
 __attribute__((force_align_arg_pointer)) void _start(void) {
 
diff --git a/lldb/test/Shell/Debuginfod/Inputs/make-inputs b/lldb/test/Shell/Debuginfod/Inputs/make-inputs
index b222b5c028a2a2..c1ec233d10d0b7 100755
--- a/lldb/test/Shell/Debuginfod/Inputs/make-inputs
+++ b/lldb/test/Shell/Debuginfod/Inputs/make-inputs
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# I need 5 different scenarios:
+# Testing 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
 # 3 - A split binary with it's corresponding DWP file
diff --git a/lldb/test/Shell/Debuginfod/Inputs/sym-split.yaml b/lldb/test/Shell/Debuginfod/Inputs/sym-split.yaml
index f25e4c4abf5c24..9cebffacac7478 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/sym-split.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/sym-split.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            82B2C35129DAB19AD58F3DD0F426BDB0CC8AA094
+        Desc:            14FE1776C0055EA25EFD58D934BB305FBBACDAC3
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_NOBITS
@@ -93,7 +93,7 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420633234306534393034343037643064393337383633666533306332656265373764633639333232352900
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
@@ -105,7 +105,7 @@ Sections:
   - Name:            .debug_line
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D00000000AA7BC59AF617547916B47B73E78D55160400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+    Content:         780000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000002F0CB321CF64CEDC7E77B5861A0075A20400000902001040000000000014050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
   - Name:            .debug_line_str
     Type:            SHT_PROGBITS
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
diff --git a/lldb/test/Shell/Debuginfod/Inputs/sym-stripped.yaml b/lldb/test/Shell/Debuginfod/Inputs/sym-stripped.yaml
index 608e9d04b2ebf2..b9118d1a1820a0 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/sym-stripped.yaml
+++ b/lldb/test/Shell/Debuginfod/Inputs/sym-stripped.yaml
@@ -59,7 +59,7 @@ Sections:
     AddressAlign:    0x4
     Notes:
       - Name:            GNU
-        Desc:            725D47B7EE964F615C841A04712D6F43175F9D8D
+        Desc:            6E10CF17A4D84D5622C67A2FD38282BF121C67D5
         Type:            NT_PRPSINFO
   - Name:            .text
     Type:            SHT_NOBITS
@@ -93,11 +93,11 @@ Sections:
     Flags:           [ SHF_MERGE, SHF_STRINGS ]
     AddressAlign:    0x1
     EntSize:         0x1
-    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420663262383163623536396430363332613065623066643531373232643732356162313931616637322900
+    Content:         46616365626F6F6B20636C616E672076657273696F6E2031352E302E302028676974406769746875622E636F6D3A6B6576696E667265692F6C6C766D2E67697420633234306534393034343037643064393337383633666533306332656265373764633639333232352900
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         9A000000050001080000000001001D0001080000000000000002016400000008000000022D000000004C02A1000339000000043D0000000100050306010604080707012800000001560500447E0000000802917C0800447E00000008029170090044820000000009023400000001560700480A02770809004C9100000000050605040B870000000B8C0000000C390000000387000000043D000000010000
+    Content:         9A000000050001080000000001001D0001080000000000000002016400000008000000022D000000000B02A1000339000000043D0000000100050306010604080707012800000001560500037E0000000802917C0800037E00000008029170090003820000000009023400000001560700070A02770809000B9100000000050605040B870000000B8C0000000C390000000387000000043D000000010000
   - Name:            .debug_abbrev
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
@@ -105,7 +105,7 @@ Sections:
   - Name:            .debug_line
     Type:            SHT_PROGBITS
     AddressAlign:    0x1
-    Content:         7B0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D00000000AA7BC59AF617547916B47B73E78D55160400000902001040000000000003C30001050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
+    Content:         780000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E013D000000002F0CB321CF64CEDC7E77B5861A0075A20400000902001040000000000014050B0AAD0510063C05183C0526E405153C05030B3C050006A1050F0ABE050BBB0503065806770210000101
   - 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 f2b81cb569d0632a0eb0fd51722d725ab191af72)'
+    - 'Facebook clang version 15.0.0 (git at github.com:kevinfrei/llvm.git c240e4904407d0d937863fe30c2ebe77dc693225)'
     - main.c
     - '/home/freik/llvm-sand/llvm/lldb/test/Shell/Debuginfod/Inputs'
     - char
diff --git a/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test b/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
index 943ab100437c6c..4fd8463744d2cf 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-no-locator.test
@@ -19,4 +19,4 @@
 # RUN:        2>&1 | FileCheck %s
 
 # 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]+}}
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:4: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 930a64e8518701..00e1b7c5bc72c2 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-positive-a.test
@@ -7,12 +7,12 @@
 # Set up a file-system 'hosted' Debuginfod server.
 # RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
+# RUN: mkdir -p %t/buildid/6e10cf17a4d84d5622c67a2fd38282bf121c67d5
 
 # 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: mv %t/bin-stripped.dbg %t/buildid/6e10cf17a4d84d5622c67a2fd38282bf121c67d5/debuginfo
 # RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
@@ -25,4 +25,4 @@
 # RUN:        2>&1 | FileCheck %s
 
 # 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]+}}
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:4: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 05d9fa1ebbf36e..c4444ce166811c 100644
--- a/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
+++ b/lldb/test/Shell/Debuginfod/okdstrip-positive-b.test
@@ -7,12 +7,12 @@
 # Set up a file-system 'hosted' Debuginfod server.
 # RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
+# RUN: mkdir -p %t/buildid/6e10cf17a4d84d5622c67a2fd38282bf121c67d5
 
 # 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: mv %t/bin-stripped.dbg %t/buildid/6e10cf17a4d84d5622c67a2fd38282bf121c67d5/executable
 # RUN: chmod a+x %t/bin-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
@@ -25,4 +25,4 @@
 # RUN:        2>&1 | FileCheck %s
 
 # 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]+}}
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:4:11, address = 0x{{[0-9a-f]+}}
diff --git a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
index 5f1eb18e21c7c5..0197b0b5e4101d 100644
--- a/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-okdstrip-positive.test
@@ -7,13 +7,13 @@
 # Set up a file-system 'hosted' Debuginfod server
 # RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
+# RUN: mkdir -p %t/buildid/14fe1776c0055ea25efd58d934bb305fbbacdac3
 
 # 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: mv %t/sym-split %t/buildid/14fe1776c0055ea25efd58d934bb305fbbacdac3/executable
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/14fe1776c0055ea25efd58d934bb305fbbacdac3/debuginfo
 # RUN: chmod a+x %t/bin-split-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
@@ -29,4 +29,4 @@
 # CHECK-NEXT: Type: "dwo"
 # CHECK-NEXT: Dwo ID{{.*}}
 # CHECK-NEXT: {{[- ]+}}
-# CHECK-NEXT: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-6559017670391320133{{ *$}}
+# CHECK-NEXT: {{0x[0-9a-f]+.* +.*}}.tmp/cache/llvmcache-14969591668314937758{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-positive.test b/lldb/test/Shell/Debuginfod/split-positive.test
index 445b6b7eef96f6..3621b3f8d21135 100644
--- a/lldb/test/Shell/Debuginfod/split-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-positive.test
@@ -6,10 +6,10 @@
 # Set up a file-system 'hosted' Debuginfod server
 # RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
+# RUN: mkdir -p %t/buildid/14fe1776c0055ea25efd58d934bb305fbbacdac3
 
 # 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: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/14fe1776c0055ea25efd58d934bb305fbbacdac3/debuginfo
 # RUN: chmod a+x %t/bin-split
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
@@ -27,4 +27,4 @@
 # 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{{ *$}}
+# CHECK-NEXT: {{0x[0-9a-f]+.* +}}/{{.*}}.tmp/cache/llvmcache-14969591668314937758{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/split-strip-positive.test b/lldb/test/Shell/Debuginfod/split-strip-positive.test
index 3c19382d2f6df6..4c6510986913ff 100644
--- a/lldb/test/Shell/Debuginfod/split-strip-positive.test
+++ b/lldb/test/Shell/Debuginfod/split-strip-positive.test
@@ -7,11 +7,11 @@
 # Set up a file-system 'hosted' Debuginfod server.
 # RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/82b2c35129dab19ad58f3dd0f426bdb0cc8aa094
+# RUN: mkdir -p %t/buildid/14fe1776c0055ea25efd58d934bb305fbbacdac3
 
 # 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: yaml2obj %p/Inputs/bin-split.yaml -o %t/buildid/14fe1776c0055ea25efd58d934bb305fbbacdac3/executable
+# RUN: yaml2obj %p/Inputs/bin-split-dwp.yaml -o %t/buildid/14fe1776c0055ea25efd58d934bb305fbbacdac3/debuginfo
 # RUN: chmod a+x %t/bin-split-stripped
 
 # RUN: %lldb -o "settings set symbols.enable-external-lookup true" \
@@ -29,4 +29,4 @@
 # 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{{ *$}}
+# CHECK-NEXT: {{0x[0-9a-f]+.* +}}/{{.*}}.tmp/cache/llvmcache-14969591668314937758{{ *$}}
diff --git a/lldb/test/Shell/Debuginfod/strip-no-locator.test b/lldb/test/Shell/Debuginfod/strip-no-locator.test
index ea4bb47648ecbd..562c8d8e620b41 100644
--- a/lldb/test/Shell/Debuginfod/strip-no-locator.test
+++ b/lldb/test/Shell/Debuginfod/strip-no-locator.test
@@ -19,4 +19,4 @@
 # RUN:        2>&1 | FileCheck %s
 
 # 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]+}}
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:4: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 e8ca8584c2fbc4..72e3c8801d7495 100644
--- a/lldb/test/Shell/Debuginfod/strip-positive-a.test
+++ b/lldb/test/Shell/Debuginfod/strip-positive-a.test
@@ -7,9 +7,9 @@
 # Set up a file-system 'hosted' Debuginfod server:
 # RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
+# RUN: mkdir -p %t/buildid/6e10cf17a4d84d5622c67a2fd38282bf121c67d5
 
-# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/debuginfo
+# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/buildid/6e10cf17a4d84d5622c67a2fd38282bf121c67d5/debuginfo
 # RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped
 # RUN: chmod a+x %t/bin-stripped
 
@@ -23,4 +23,4 @@
 # RUN:        2>&1 | FileCheck %s
 
 # 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]+}}
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:4: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 a7af5bdbdfcf1e..b3344228bcbb01 100644
--- a/lldb/test/Shell/Debuginfod/strip-positive-b.test
+++ b/lldb/test/Shell/Debuginfod/strip-positive-b.test
@@ -7,9 +7,9 @@
 # Set up a file-system 'hosted' Debuginfod server:
 # RUN: rm -rf %t
 # RUN: mkdir -p %t/cache
-# RUN: mkdir -p %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d
+# RUN: mkdir -p %t/buildid/6e10cf17a4d84d5622c67a2fd38282bf121c67d5
 
-# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/buildid/725d47b7ee964f615c841a04712d6f43175f9d8d/executable
+# RUN: yaml2obj %p/Inputs/bin-normal.yaml -o %t/buildid/6e10cf17a4d84d5622c67a2fd38282bf121c67d5/executable
 # RUN: yaml2obj %p/Inputs/bin-stripped.yaml -o %t/bin-stripped
 # RUN: chmod a+x %t/bin-stripped
 
@@ -23,4 +23,4 @@
 # RUN:        2>&1 | FileCheck %s
 
 # 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]+}}
+# CHECK: Breakpoint 1: where = bin-stripped`func + 11 at main.c:4:11, address = 0x{{[0-9a-f]+}}
diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp b/llvm/lib/Debuginfod/Debuginfod.cpp
index 2927ba21323885..1cf550721000eb 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -248,54 +248,27 @@ static SmallVector<std::string, 0> getHeaders() {
   return Headers;
 }
 
-static SmallString<64> getCachedArtifactPath(StringRef UniqueKey,
-                                             StringRef CacheDirectoryPath) {
+Expected<std::string> getCachedOrDownloadArtifact(
+    StringRef UniqueKey, StringRef UrlPath, StringRef CacheDirectoryPath,
+    ArrayRef<StringRef> DebuginfodUrls, std::chrono::milliseconds Timeout) {
   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");
-}
 
-Expected<std::string> getCachedOrDownloadArtifact(
-    StringRef UniqueKey, StringRef UrlPath, StringRef CacheDirectoryPath,
-    ArrayRef<StringRef> DebuginfodUrls, std::chrono::milliseconds Timeout) {
+  FileCache Cache = *CacheOrErr;
   // We choose an arbitrary Task parameter as we do not make use of it.
   unsigned Task = 0;
-  Expected<AddStreamFn> CacheAddStreamOrErr =
-      getCachedArtifactHelper(UniqueKey, CacheDirectoryPath, Task);
+  Expected<AddStreamFn> CacheAddStreamOrErr = Cache(Task, UniqueKey, "");
   if (!CacheAddStreamOrErr)
     return CacheAddStreamOrErr.takeError();
   AddStreamFn &CacheAddStream = *CacheAddStreamOrErr;
   if (!CacheAddStream)
-    return std::string(getCachedArtifactPath(UniqueKey, CacheDirectoryPath));
-
+    return std::string(AbsCachedArtifactPath);
   // The artifact was not found in the local cache, query the debuginfod
   // servers.
   if (!HTTPClient::isAvailable())
@@ -338,7 +311,7 @@ Expected<std::string> getCachedOrDownloadArtifact(
     pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
 
     // Return the path to the artifact on disk.
-    return std::string(getCachedArtifactPath(UniqueKey, CacheDirectoryPath));
+    return std::string(AbsCachedArtifactPath);
   }
 
   return createStringError(errc::argument_out_of_domain, "build id not found");

>From 526ee41d36d010e5bc39059c88bfdfc973abe35b Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Fri, 26 Jan 2024 09:37:37 -0800
Subject: [PATCH 12/15] Changed to consistent voice in testing markdown doc

---
 .../Shell/Debuginfod/Debuginfod-testing.md    | 27 +++++++++----------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/lldb/test/Shell/Debuginfod/Debuginfod-testing.md b/lldb/test/Shell/Debuginfod/Debuginfod-testing.md
index df335ca11ffa42..116bcc5c0ed7a0 100644
--- a/lldb/test/Shell/Debuginfod/Debuginfod-testing.md
+++ b/lldb/test/Shell/Debuginfod/Debuginfod-testing.md
@@ -48,18 +48,17 @@ 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.
+executable". Where there is lack of clarity, `debuginfo` is requested first,
+falling back to `executable` (Scenarios #1 & #2). For Scenario #5, the stripped
+(i.e. not full) executable, which contains a number of sections necessary to
+correctly symbolicate, is 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).
+The `.dwp` file is treated as `debuginfo`, and the "only-keep-debug" stripped
+binary is treated as `executable`. This scenario does not appear to work at all
+in GDB. It seems more straightforward to support it in this manner, rather than
+attempting to extend the protocol. While the protocol does support querying for
+section contents by name for a given build ID, support for that capability in
+LLDB is not implemented (and LLVM's Debuginfod library does not support it at
+this time).

>From 26c30ec9b86c7035c9105bd8a1e69184b59a2aae Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Wed, 28 Feb 2024 15:08:05 -0800
Subject: [PATCH 13/15] Working on API test migration

---
 .../Python/lldbsuite/test/make/Makefile.rules |  23 +++-
 lldb/test/API/debuginfod/Makefile             | 105 ++++++++++++++++++
 lldb/test/API/debuginfod/TestSampleTest.py    |  51 +++++++++
 lldb/test/API/debuginfod/main.c               |   9 ++
 lldb/test/Shell/Debuginfod/Inputs/main.c      |  16 +--
 5 files changed, 192 insertions(+), 12 deletions(-)
 create mode 100644 lldb/test/API/debuginfod/Makefile
 create mode 100644 lldb/test/API/debuginfod/TestSampleTest.py
 create mode 100644 lldb/test/API/debuginfod/main.c

diff --git a/lldb/packages/Python/lldbsuite/test/make/Makefile.rules b/lldb/packages/Python/lldbsuite/test/make/Makefile.rules
index bfd249ccd43f2e..365db7958c2589 100644
--- a/lldb/packages/Python/lldbsuite/test/make/Makefile.rules
+++ b/lldb/packages/Python/lldbsuite/test/make/Makefile.rules
@@ -51,7 +51,7 @@ LLDB_BASE_DIR := $(THIS_FILE_DIR)/../../../../../
 #
 # GNUWin32 uname gives "windows32" or "server version windows32" while
 # some versions of MSYS uname return "MSYS_NT*", but most environments
-# standardize on "Windows_NT", so we'll make it consistent here. 
+# standardize on "Windows_NT", so we'll make it consistent here.
 # When running tests from Visual Studio, the environment variable isn't
 # inherited all the way down to the process spawned for make.
 #----------------------------------------------------------------------
@@ -210,6 +210,12 @@ else
 	ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
 		DSYM = $(EXE).debug
 	endif
+
+	ifeq "$(MERGE_DWOS)" "YES"
+		MAKE_DWO := YES
+		DWP_NAME = $(EXE).dwp
+		DYLIB_DWP_NAME = $(DYLIB_NAME).dwp
+	endif
 endif
 
 LIMIT_DEBUG_INFO_FLAGS =
@@ -357,6 +363,7 @@ ifneq "$(OS)" "Darwin"
 
 	OBJCOPY ?= $(call replace_cc_with,objcopy)
 	ARCHIVER ?= $(call replace_cc_with,ar)
+	DWP ?= $(call reaplce_cc_with,dwp)
 	override AR = $(ARCHIVER)
 endif
 
@@ -565,9 +572,16 @@ else
 endif
 else
 ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
+	ifneq "$(KEEP_FULL_DEBUG_BINARY)" "YES"
 	$(OBJCOPY) --only-keep-debug "$(EXE)" "$(DSYM)"
+	else
+	cp "$(EXE)" "$(DSYM)"
+	endif
 	$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DSYM)" "$(EXE)" "$(EXE)"
 endif
+ifeq "$(MERGE_DWOS)" "YES"
+	$(DWP) -o "$(DWP_FILE)" $(DWOS)
+endif
 endif
 
 #----------------------------------------------------------------------
@@ -610,9 +624,16 @@ endif
 else
 	$(LD) $(DYLIB_OBJECTS) $(LDFLAGS) -shared -o "$(DYLIB_FILENAME)"
 ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
+	ifneq "$(KEEP_FULL_DEBUG_BINARY)" "YES"
+	cp "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME).debug"
+	else
 	$(OBJCOPY) --only-keep-debug "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME).debug"
+	endif
 	$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DYLIB_FILENAME).debug" "$(DYLIB_FILENAME)" "$(DYLIB_FILENAME)"
 endif
+ifeq "$(MERGE_DWOS)" "YES"
+	$(DWP) -o $(DYLIB_DWP_FILE) $(DYLIB_DWOS)
+endif
 endif
 
 #----------------------------------------------------------------------
diff --git a/lldb/test/API/debuginfod/Makefile b/lldb/test/API/debuginfod/Makefile
new file mode 100644
index 00000000000000..abe40bdeaf70b2
--- /dev/null
+++ b/lldb/test/API/debuginfod/Makefile
@@ -0,0 +1,105 @@
+C_SOURCES := main.c
+CFLAGS_EXTRAS := -std=c99
+
+MAKE_DWO := YES
+SPLIT_DEBUG_SYMBOLS := YES
+KEEP_FULL_DEBUG_BINARY := YES
+MERGE_DWOS := YES
+
+# From shell, I can do this stuff pretty easily:
+# OBJCOPY --dump-section .note.gnu.build-id=<output.36.bytes.bin> <input.bin>
+# hexdump -s 16 -e '"%02x"' output.bin
+# Or this in a single command:
+# objcopy --dump-section=.note.gnu.build-id=/dev/stdout adfinder.stripped | xxd -s 16 -g 0 -p
+# I think I need to add capabilities in the Makefile.rules to strip the binary (not an -OKD binary)
+# and to create a DWP file
+
+include Makefile.rules
+
+
+#!/bin/sh
+
+# Testing 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
+# 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 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/API/debuginfod/TestSampleTest.py b/lldb/test/API/debuginfod/TestSampleTest.py
new file mode 100644
index 00000000000000..494b3298c9733a
--- /dev/null
+++ b/lldb/test/API/debuginfod/TestSampleTest.py
@@ -0,0 +1,51 @@
+"""
+Describe the purpose of the test class here.
+"""
+
+
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+
+class RenameThisSampleTestTestCase(TestBase):
+    # If your test case doesn't stress debug info, then
+    # set this to true.  That way it won't be run once for
+    # each debug info format.
+    NO_DEBUG_INFO_TESTCASE = True
+
+    def test_sample_rename_this(self):
+        """There can be many tests in a test case - describe this test here."""
+        self.build()
+        self.main_source_file = lldb.SBFileSpec("main.c")
+        self.sample_test()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+        # Set up your test case here. If your test doesn't need any set up then
+        # remove this method from your TestCase class.
+        # I need to setup the file-system-hosted Debuginfod server
+
+    def sample_test(self):
+        """You might use the test implementation in several ways, say so here."""
+
+        # This function starts a process, "a.out" by default, sets a source
+        # breakpoint, runs to it, and returns the thread, process & target.
+        # It optionally takes an SBLaunchOption argument if you want to pass
+        # arguments or environment variables.
+        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
+            self, "Set a breakpoint here", self.main_source_file
+        )
+
+        frame = thread.GetFrameAtIndex(0)
+        test_var = frame.FindVariable("test_var")
+        self.assertSuccess(test_var.GetError(), "Failed to fetch test_var")
+        test_value = test_var.GetValueAsUnsigned()
+        self.assertEqual(test_value, 10, "Got the right value for test_var")
+
+    def sample_test_no_launch(self):
+        """Same as above but doesn't launch a process."""
+
+        target = self.createTestTarget()
+        self.expect_expr("global_test_var", result_value="10")
diff --git a/lldb/test/API/debuginfod/main.c b/lldb/test/API/debuginfod/main.c
new file mode 100644
index 00000000000000..2cc7e1557f40c0
--- /dev/null
+++ b/lldb/test/API/debuginfod/main.c
@@ -0,0 +1,9 @@
+// This is a dump little pair of test files
+
+int func(int argc, const char *argv[]) {
+  return (argc + 1) * (argv[argc][0] + 2);
+}
+
+int main(int argc, const char *argv[]) {
+  return func(0, argv);
+}
diff --git a/lldb/test/Shell/Debuginfod/Inputs/main.c b/lldb/test/Shell/Debuginfod/Inputs/main.c
index 6f2106034f45ab..584eb11072953e 100644
--- a/lldb/test/Shell/Debuginfod/Inputs/main.c
+++ b/lldb/test/Shell/Debuginfod/Inputs/main.c
@@ -1,16 +1,10 @@
 // A script to (re)create the .yaml files is in 'make-inputs'. If you make changes
 // you'll need to update the .note.gnu.buildid values in the tests, as the cache names
 
-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);
+int func(int argc, const char **argv) {
+  return (argc + 1) * (argv[argc][0] + 2);
+}
 
-  /* 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
+int main(int argc, const char *argv[]) {
+  return func(0, argv);
 }

>From 1692488c8cedf4db3b7c04239979243281a04238 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Thu, 29 Feb 2024 09:36:56 -0800
Subject: [PATCH 14/15] Revert "[lldb] Migrate distutils.version.LooseVersion
 to packaging (#82066)"

This reverts commit 0c02329ff375100ddcf2cb104aebe97bb3c9126f.
---
 .../Python/lldbsuite/test/decorators.py       | 12 +++----
 .../Python/lldbsuite/test/lldbplatformutil.py | 25 +++++++--------
 lldb/test/API/sanity/TestSettingSkipping.py   | 31 ++++++++++---------
 .../lldb-server/TestAppleSimulatorOSType.py   |  4 +--
 lldb/test/Shell/helper/build.py               |  4 +--
 5 files changed, 36 insertions(+), 40 deletions(-)

diff --git a/lldb/packages/Python/lldbsuite/test/decorators.py b/lldb/packages/Python/lldbsuite/test/decorators.py
index b691f82b90652c..a5d7a7a25879df 100644
--- a/lldb/packages/Python/lldbsuite/test/decorators.py
+++ b/lldb/packages/Python/lldbsuite/test/decorators.py
@@ -1,6 +1,6 @@
 # System modules
+from distutils.version import LooseVersion
 from functools import wraps
-from pkg_resources import packaging
 import ctypes
 import locale
 import os
@@ -65,10 +65,10 @@ def fn_neq(x, y):
         ">=": fn_geq,
         "<=": fn_leq,
     }
+    expected_str = ".".join([str(x) for x in expected])
+    actual_str = ".".join([str(x) for x in actual])
 
-    return op_lookup[comparison](
-        packaging.version.parse(actual), packaging.version.parse(expected)
-    )
+    return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
 
 
 def _match_decorator_property(expected, actual):
@@ -238,9 +238,7 @@ def fn(actual_debug_info=None):
             )
         )
         skip_for_py_version = (py_version is None) or _check_expected_version(
-            py_version[0],
-            py_version[1],
-            "{}.{}".format(sys.version_info.major, sys.version_info.minor),
+            py_version[0], py_version[1], sys.version_info
         )
         skip_for_macos_version = (macos_version is None) or (
             (platform.mac_ver()[0] != "")
diff --git a/lldb/packages/Python/lldbsuite/test/lldbplatformutil.py b/lldb/packages/Python/lldbsuite/test/lldbplatformutil.py
index c4d063d3cc77ef..bd92d03e0e2212 100644
--- a/lldb/packages/Python/lldbsuite/test/lldbplatformutil.py
+++ b/lldb/packages/Python/lldbsuite/test/lldbplatformutil.py
@@ -7,8 +7,8 @@
 import subprocess
 import sys
 import os
+from distutils.version import LooseVersion
 from urllib.parse import urlparse
-from pkg_resources import packaging
 
 # LLDB modules
 import lldb
@@ -297,30 +297,27 @@ def expectedCompilerVersion(compiler_version):
     if compiler_version is None:
         return True
     operator = str(compiler_version[0])
-    version_str = str(compiler_version[1])
+    version = compiler_version[1]
 
-    if not version_str:
+    if version is None:
         return True
 
-    test_compiler_version_str = getCompilerVersion()
-    if test_compiler_version_str == "unknown":
+    test_compiler_version = getCompilerVersion()
+    if test_compiler_version == "unknown":
         # Assume the compiler version is at or near the top of trunk.
         return operator in [">", ">=", "!", "!=", "not"]
 
-    version = packaging.version.parse(version_str)
-    test_compiler_version = packaging.version.parse(test_compiler_version_str)
-
     if operator == ">":
-        return test_compiler_version > version
+        return LooseVersion(test_compiler_version) > LooseVersion(version)
     if operator == ">=" or operator == "=>":
-        return test_compiler_version >= version
+        return LooseVersion(test_compiler_version) >= LooseVersion(version)
     if operator == "<":
-        return test_compiler_version < version
+        return LooseVersion(test_compiler_version) < LooseVersion(version)
     if operator == "<=" or operator == "=<":
-        return test_compiler_version <= version
+        return LooseVersion(test_compiler_version) <= LooseVersion(version)
     if operator == "!=" or operator == "!" or operator == "not":
-        return version_str not in test_compiler_version_str
-    return version_str in test_compiler_version_str
+        return str(version) not in str(test_compiler_version)
+    return str(version) in str(test_compiler_version)
 
 
 def expectedCompiler(compilers):
diff --git a/lldb/test/API/sanity/TestSettingSkipping.py b/lldb/test/API/sanity/TestSettingSkipping.py
index f0d4d266073e03..5f58ec2638456d 100644
--- a/lldb/test/API/sanity/TestSettingSkipping.py
+++ b/lldb/test/API/sanity/TestSettingSkipping.py
@@ -1,7 +1,8 @@
 """
-This is a sanity check that verifies that test can be skipped based on settings.
+This is a sanity check that verifies that test can be sklipped based on settings.
 """
 
+
 import lldb
 from lldbsuite.test.lldbtest import *
 from lldbsuite.test.decorators import *
@@ -9,24 +10,24 @@
 
 class SettingSkipSanityTestCase(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
-    CURRENT_PYTHON_VERSION = "3.0"
 
-    @skipIf(py_version=(">=", CURRENT_PYTHON_VERSION))
+    @skipIf(py_version=(">=", (3, 0)))
     def testSkip(self):
-        self.assertTrue(False, "This test should not run and fail (SKIPPED)")
-
-    @skipIf(py_version=("<", CURRENT_PYTHON_VERSION))
-    def testNoSKip(self):
-        self.assertTrue(True, "This test should run and pass(PASS)")
+        """This setting is on by default"""
+        self.assertTrue(False, "This test should not run!")
 
-    @expectedFailureAll(py_version=(">=", CURRENT_PYTHON_VERSION))
-    def testXFAIL(self):
-        self.assertTrue(False, "This test should expectedly fail (XFAIL)")
-
-    @expectedFailureAll(py_version=("<", CURRENT_PYTHON_VERSION))
-    def testNotXFAIL(self):
-        self.assertTrue(True, "This test should pass (PASS)")
+    @skipIf(py_version=("<", (3, 0)))
+    def testNoMatch(self):
+        self.assertTrue(True, "This test should run!")
 
     @skipIf(setting=("target.i-made-this-one-up", "true"))
     def testNotExisting(self):
         self.assertTrue(True, "This test should run!")
+
+    @expectedFailureAll(py_version=(">=", (3, 0)))
+    def testXFAIL(self):
+        self.assertTrue(False, "This test should run and fail!")
+
+    @expectedFailureAll(py_version=("<", (3, 0)))
+    def testNotXFAIL(self):
+        self.assertTrue(True, "This test should run and succeed!")
diff --git a/lldb/test/API/tools/lldb-server/TestAppleSimulatorOSType.py b/lldb/test/API/tools/lldb-server/TestAppleSimulatorOSType.py
index d770447f0771cd..ffac8de6f596ac 100644
--- a/lldb/test/API/tools/lldb-server/TestAppleSimulatorOSType.py
+++ b/lldb/test/API/tools/lldb-server/TestAppleSimulatorOSType.py
@@ -61,9 +61,9 @@ def check_simulator_ostype(self, sdk, platform_name, arch=platform.machine()):
 
         # Older versions of watchOS (<7.0) only support i386
         if platform_name == "watchos":
-            from pkg_resources import packaging
+            from distutils.version import LooseVersion
 
-            if packaging.version.parse(vers) < packaging.version.parse("7.0"):
+            if LooseVersion(vers) < LooseVersion("7.0"):
                 arch = "i386"
 
         triple = "-".join([arch, "apple", platform_name + vers, "simulator"])
diff --git a/lldb/test/Shell/helper/build.py b/lldb/test/Shell/helper/build.py
index d3c25bd944e983..073198a6df2df3 100755
--- a/lldb/test/Shell/helper/build.py
+++ b/lldb/test/Shell/helper/build.py
@@ -519,9 +519,9 @@ def _find_windows_sdk_in_registry_view(self, view):
 
             # Windows SDK version numbers consist of 4 dotted components, so we
             # have to use LooseVersion, as StrictVersion supports 3 or fewer.
-            from pkg_resources import packaging
+            from distutils.version import LooseVersion
 
-            sdk_versions.sort(key=lambda x: packaging.version.parse(x), reverse=True)
+            sdk_versions.sort(key=lambda x: LooseVersion(x), reverse=True)
             option_value_name = "OptionId.DesktopCPP" + self.msvc_arch_str
             for v in sdk_versions:
                 try:

>From a54dd84ac9c91d7315990c817abb388fcbea5ba1 Mon Sep 17 00:00:00 2001
From: Kevin Frei <freik at meta.com>
Date: Fri, 1 Mar 2024 15:06:46 -0800
Subject: [PATCH 15/15] Got the 'maximal stuff' building properly

---
 .../Python/lldbsuite/test/make/Makefile.rules         | 10 +++++-----
 lldb/test/API/debuginfod/Makefile                     |  2 +-
 .../{TestSampleTest.py => TestDebuginfod.py}          | 11 ++++++-----
 3 files changed, 12 insertions(+), 11 deletions(-)
 rename lldb/test/API/debuginfod/{TestSampleTest.py => TestDebuginfod.py} (87%)

diff --git a/lldb/packages/Python/lldbsuite/test/make/Makefile.rules b/lldb/packages/Python/lldbsuite/test/make/Makefile.rules
index 365db7958c2589..0120daccc12cfa 100644
--- a/lldb/packages/Python/lldbsuite/test/make/Makefile.rules
+++ b/lldb/packages/Python/lldbsuite/test/make/Makefile.rules
@@ -363,7 +363,7 @@ ifneq "$(OS)" "Darwin"
 
 	OBJCOPY ?= $(call replace_cc_with,objcopy)
 	ARCHIVER ?= $(call replace_cc_with,ar)
-	DWP ?= $(call reaplce_cc_with,dwp)
+	DWP ?= $(call replace_cc_with,dwp)
 	override AR = $(ARCHIVER)
 endif
 
@@ -572,15 +572,15 @@ else
 endif
 else
 ifeq "$(SPLIT_DEBUG_SYMBOLS)" "YES"
-	ifneq "$(KEEP_FULL_DEBUG_BINARY)" "YES"
+  ifneq "$(KEEP_FULL_DEBUG_BINARY)" "YES"
 	$(OBJCOPY) --only-keep-debug "$(EXE)" "$(DSYM)"
-	else
+  else
 	cp "$(EXE)" "$(DSYM)"
-	endif
+  endif
 	$(OBJCOPY) --strip-debug --add-gnu-debuglink="$(DSYM)" "$(EXE)" "$(EXE)"
 endif
 ifeq "$(MERGE_DWOS)" "YES"
-	$(DWP) -o "$(DWP_FILE)" $(DWOS)
+	$(DWP) -o "$(DWP_NAME)" $(DWOS)
 endif
 endif
 
diff --git a/lldb/test/API/debuginfod/Makefile b/lldb/test/API/debuginfod/Makefile
index abe40bdeaf70b2..e0d5f5e8ecf43b 100644
--- a/lldb/test/API/debuginfod/Makefile
+++ b/lldb/test/API/debuginfod/Makefile
@@ -1,5 +1,5 @@
 C_SOURCES := main.c
-CFLAGS_EXTRAS := -std=c99
+LDFLAGS := -Wl,--build-id
 
 MAKE_DWO := YES
 SPLIT_DEBUG_SYMBOLS := YES
diff --git a/lldb/test/API/debuginfod/TestSampleTest.py b/lldb/test/API/debuginfod/TestDebuginfod.py
similarity index 87%
rename from lldb/test/API/debuginfod/TestSampleTest.py
rename to lldb/test/API/debuginfod/TestDebuginfod.py
index 494b3298c9733a..2b72e0b423fe2e 100644
--- a/lldb/test/API/debuginfod/TestSampleTest.py
+++ b/lldb/test/API/debuginfod/TestDebuginfod.py
@@ -1,5 +1,5 @@
 """
-Describe the purpose of the test class here.
+Test support for the DebugInfoD network symbol acquisition protocol.
 """
 
 
@@ -8,14 +8,14 @@
 from lldbsuite.test.lldbtest import *
 
 
-class RenameThisSampleTestTestCase(TestBase):
+class DebugInfodTests(TestBase):
     # If your test case doesn't stress debug info, then
     # set this to true.  That way it won't be run once for
     # each debug info format.
     NO_DEBUG_INFO_TESTCASE = True
 
-    def test_sample_rename_this(self):
-        """There can be many tests in a test case - describe this test here."""
+    def test_stuff(self):
+        """This should test stuff."""
         self.build()
         self.main_source_file = lldb.SBFileSpec("main.c")
         self.sample_test()
@@ -25,7 +25,8 @@ def setUp(self):
         TestBase.setUp(self)
         # Set up your test case here. If your test doesn't need any set up then
         # remove this method from your TestCase class.
-        # I need to setup the file-system-hosted Debuginfod server
+        # I need to setup the file-system-hosted Debuginfod server 'root'.
+        # The files it should host can be generated per-test
 
     def sample_test(self):
         """You might use the test implementation in several ways, say so here."""



More information about the lldb-commits mailing list