Author: nerix Date: 2025-09-23T12:14:59+02:00 New Revision: 5b3dd43bd20d9c4e1cd05e39d2e022b368b0fbdc
URL: https://github.com/llvm/llvm-project/commit/5b3dd43bd20d9c4e1cd05e39d2e022b368b0fbdc DIFF: https://github.com/llvm/llvm-project/commit/5b3dd43bd20d9c4e1cd05e39d2e022b368b0fbdc.diff LOG: [LLDB][PDB] Warn if DIA plugin is requested but not available (#160067) If LLDB was built without the DIA SDK and the DIA reader is explicitly requested (through `LLDB_USE_NATIVE_PDB_READER=0` or `settings set plugin.symbol-file.pdb.reader dia`), LLDB should print a warning, because it will use the native reader in any case (https://github.com/llvm/llvm-project/pull/159769#discussion_r2367316980). This PR adds the warning and a test when LLDB is not built with the SDK on Windows. I don't think any builder runs this configuration, as there are still five failing tests. I tested this locally with and without the SDK. Added: lldb/test/Shell/SymbolFile/NativePDB/native-setting.cpp Modified: lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp lldb/test/Shell/SymbolFile/PDB/native-setting.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index 0e2ca1784e7e9..9f4eb1c21711d 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -14,6 +14,7 @@ #include "clang/Lex/Lexer.h" #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" +#include "lldb/Core/Debugger.h" #include "lldb/Core/Mangled.h" #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" @@ -105,24 +106,21 @@ enum { #include "SymbolFilePDBPropertiesEnum.inc" }; -#if LLVM_ENABLE_DIA_SDK && defined(_WIN32) -bool ShouldUseNativeReaderByDefault() { - static bool g_use_native_by_default = true; - - static llvm::once_flag g_initialize; - llvm::call_once(g_initialize, [] { - llvm::StringRef env_value = ::getenv("LLDB_USE_NATIVE_PDB_READER"); - if (!env_value.equals_insensitive("on") && - !env_value.equals_insensitive("yes") && - !env_value.equals_insensitive("1") && - !env_value.equals_insensitive("true")) - g_use_native_by_default = false; - }); - - return g_use_native_by_default; -} +static const bool g_should_use_native_reader_by_default = [] { + llvm::StringRef env_value = ::getenv("LLDB_USE_NATIVE_PDB_READER"); + +#if !LLVM_ENABLE_DIA_SDK || !defined(_WIN32) + // if the environment value is unset, the native reader is requested + if (env_value.empty()) + return true; #endif + return env_value.equals_insensitive("on") || + env_value.equals_insensitive("yes") || + env_value.equals_insensitive("1") || + env_value.equals_insensitive("true"); +}(); + class PluginProperties : public Properties { public: static llvm::StringRef GetSettingName() { @@ -136,6 +134,21 @@ class PluginProperties : public Properties { bool UseNativeReader() const { #if LLVM_ENABLE_DIA_SDK && defined(_WIN32) + return IsNativeReaderRequested(); +#else + if (!IsNativeReaderRequested()) { + static std::once_flag g_warning_shown; + Debugger::ReportWarning( + "The DIA PDB reader was explicitly requested, but LLDB was built " + "without the DIA SDK. The native reader will be used instead.", + {}, &g_warning_shown); + } + return true; +#endif + } + +private: + bool IsNativeReaderRequested() const { auto value = GetPropertyAtIndexAs<PDBReader>(ePropertyReader, ePDBReaderDefault); switch (value) { @@ -144,12 +157,8 @@ class PluginProperties : public Properties { case ePDBReaderDIA: return false; default: - case ePDBReaderDefault: - return ShouldUseNativeReaderByDefault(); + return g_should_use_native_reader_by_default; } -#else - return true; -#endif } }; diff --git a/lldb/test/Shell/SymbolFile/NativePDB/native-setting.cpp b/lldb/test/Shell/SymbolFile/NativePDB/native-setting.cpp new file mode 100644 index 0000000000000..41ddba746b4ac --- /dev/null +++ b/lldb/test/Shell/SymbolFile/NativePDB/native-setting.cpp @@ -0,0 +1,71 @@ +// REQUIRES: !diasdk, target-windows + +// Test plugin.symbol-file.pdb.reader setting without the DIA SDK +// RUN: %build -o %t.exe -- %s +// RUN: env -u LLDB_USE_NATIVE_PDB_READER %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=NO-ENV %s +// RUN: env LLDB_USE_NATIVE_PDB_READER= %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=NO-ENV %s + +// RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV0 %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV1 %s + +// RUN: env LLDB_USE_NATIVE_PDB_READER=foo %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV0 %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=42 %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV0 %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=-1 %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV0 %s + +// RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb \ +// RUN: -o 'settings set plugin.symbol-file.pdb.reader dia' \ +// RUN: -o 'target create %t.exe' \ +// RUN: -o 'target modules dump symfile' \ +// RUN: 2>&1 | FileCheck --check-prefix=ENV0-SET-DIA %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb \ +// RUN: -o 'settings set plugin.symbol-file.pdb.reader dia' \ +// RUN: -o 'target create %t.exe' \ +// RUN: -o 'target modules dump symfile' \ +// RUN: 2>&1 | FileCheck --check-prefix=ENV1-SET-DIA %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb \ +// RUN: -o 'settings set plugin.symbol-file.pdb.reader native' \ +// RUN: -o 'target create %t.exe' \ +// RUN: -o 'target modules dump symfile' \ +// RUN: 2>&1 | FileCheck --check-prefix=ENV0-SET-NATIVE %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb \ +// RUN: -o 'settings set plugin.symbol-file.pdb.reader native' \ +// RUN: -o 'target create %t.exe' \ +// RUN: -o 'target modules dump symfile' \ +// RUN: 2>&1 | FileCheck --check-prefix=ENV1-SET-NATIVE %s + +// NO-ENV-NOT: warning: +// NO-ENV: (lldb) target modules dump symfile +// NO-ENV: Dumping debug symbols for 1 modules. +// NO-ENV: SymbolFile native-pdb + +// ENV0: warning: The DIA PDB reader was explicitly requested, but LLDB was built without the DIA SDK. The native reader will be used instead. +// ENV0: (lldb) target modules dump symfile +// ENV0: Dumping debug symbols for 1 modules. +// ENV0: SymbolFile native-pdb + +// ENV1-NOT: warning: +// ENV1: (lldb) target modules dump symfile +// ENV1: Dumping debug symbols for 1 modules. +// ENV1: SymbolFile native-pdb + +// ENV0-SET-DIA: warning: The DIA PDB reader was explicitly requested, but LLDB was built without the DIA SDK. The native reader will be used instead. +// ENV0-SET-DIA: (lldb) target modules dump symfile +// ENV0-SET-DIA: Dumping debug symbols for 1 modules. +// ENV0-SET-DIA: SymbolFile native-pdb + +// ENV1-SET-DIA: warning: The DIA PDB reader was explicitly requested, but LLDB was built without the DIA SDK. The native reader will be used instead. +// ENV1-SET-DIA: (lldb) target modules dump symfile +// ENV1-SET-DIA: Dumping debug symbols for 1 modules. +// ENV1-SET-DIA: SymbolFile native-pdb + +// ENV1-SET-NATIVE-NOT: warning: +// ENV0-SET-NATIVE: (lldb) target modules dump symfile +// ENV0-SET-NATIVE: Dumping debug symbols for 1 modules. +// ENV0-SET-NATIVE: SymbolFile native-pdb + +// ENV1-SET-NATIVE-NOT: warning: +// ENV1-SET-NATIVE: (lldb) target modules dump symfile +// ENV1-SET-NATIVE: Dumping debug symbols for 1 modules. +// ENV1-SET-NATIVE: SymbolFile native-pdb + +int main() {} diff --git a/lldb/test/Shell/SymbolFile/PDB/native-setting.cpp b/lldb/test/Shell/SymbolFile/PDB/native-setting.cpp index a3077252f08f1..f5e54592b0b31 100644 --- a/lldb/test/Shell/SymbolFile/PDB/native-setting.cpp +++ b/lldb/test/Shell/SymbolFile/PDB/native-setting.cpp @@ -2,49 +2,68 @@ // Test plugin.symbol-file.pdb.reader setting // RUN: %build -o %t.exe -- %s -// RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb %t.exe -o 'target modules dump symfile' | FileCheck --check-prefix=ENV0 %s -// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb %t.exe -o 'target modules dump symfile' | FileCheck --check-prefix=ENV1 %s +// RUN: env -u LLDB_USE_NATIVE_PDB_READER %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=NO-ENV %s +// RUN: env LLDB_USE_NATIVE_PDB_READER= %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=NO-ENV %s + +// RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV0 %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV1 %s + +// RUN: env LLDB_USE_NATIVE_PDB_READER=foo %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV0 %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=42 %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV0 %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=-1 %lldb %t.exe -o 'target modules dump symfile' 2>&1 | FileCheck --check-prefix=ENV0 %s + // RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb \ // RUN: -o 'settings set plugin.symbol-file.pdb.reader dia' \ // RUN: -o 'target create %t.exe' \ // RUN: -o 'target modules dump symfile' \ -// RUN: | FileCheck --check-prefix=ENV0-SET-DIA %s +// RUN: 2>&1 | FileCheck --check-prefix=ENV0-SET-DIA %s // RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb \ // RUN: -o 'settings set plugin.symbol-file.pdb.reader dia' \ // RUN: -o 'target create %t.exe' \ // RUN: -o 'target modules dump symfile' \ -// RUN: | FileCheck --check-prefix=ENV1-SET-DIA %s +// RUN: 2>&1 | FileCheck --check-prefix=ENV1-SET-DIA %s // RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb \ // RUN: -o 'settings set plugin.symbol-file.pdb.reader native' \ // RUN: -o 'target create %t.exe' \ // RUN: -o 'target modules dump symfile' \ -// RUN: | FileCheck --check-prefix=ENV0-SET-NATIVE %s +// RUN: 2>&1 | FileCheck --check-prefix=ENV0-SET-NATIVE %s // RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb \ // RUN: -o 'settings set plugin.symbol-file.pdb.reader native' \ // RUN: -o 'target create %t.exe' \ // RUN: -o 'target modules dump symfile' \ -// RUN: | FileCheck --check-prefix=ENV1-SET-NATIVE %s +// RUN: 2>&1 | FileCheck --check-prefix=ENV1-SET-NATIVE %s + +// NO-ENV-NOT: warning: +// NO-ENV: (lldb) target modules dump symfile +// NO-ENV: Dumping debug symbols for 1 modules. +// NO-ENV: SymbolFile pdb +// ENV0-NOT: warning: // ENV0: (lldb) target modules dump symfile // ENV0: Dumping debug symbols for 1 modules. // ENV0: SymbolFile pdb +// ENV1-NOT: warning: // ENV1: (lldb) target modules dump symfile // ENV1: Dumping debug symbols for 1 modules. // ENV1: SymbolFile native-pdb +// ENV0-SET-DIA-NOT: warning: // ENV0-SET-DIA: (lldb) target modules dump symfile // ENV0-SET-DIA: Dumping debug symbols for 1 modules. // ENV0-SET-DIA: SymbolFile pdb +// ENV1-SET-DIA-NOT: warning: // ENV1-SET-DIA: (lldb) target modules dump symfile // ENV1-SET-DIA: Dumping debug symbols for 1 modules. // ENV1-SET-DIA: SymbolFile pdb +// ENV0-SET-NATIVE-NOT: warning: // ENV0-SET-NATIVE: (lldb) target modules dump symfile // ENV0-SET-NATIVE: Dumping debug symbols for 1 modules. // ENV0-SET-NATIVE: SymbolFile native-pdb +// ENV1-SET-NATIVE-NOT: warning: // ENV1-SET-NATIVE: (lldb) target modules dump symfile // ENV1-SET-NATIVE: Dumping debug symbols for 1 modules. // ENV1-SET-NATIVE: SymbolFile native-pdb _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
