Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "Plugins/ExpressionParser/Clang/ClangUtil.h"
#include "Plugins/Language/CPlusPlus/MSVCUndecoratedNameParser.h"
#include "Plugins/ObjectFile/PDB/ObjectFilePDB.h"
#include "Plugins/SymbolFile/PDB/SymbolFilePDB.h"
#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/PluginManager.h"
Expand Down Expand Up @@ -298,6 +299,9 @@ llvm::StringRef SymbolFileNativePDB::GetPluginDescriptionStatic() {
}

SymbolFile *SymbolFileNativePDB::CreateInstance(ObjectFileSP objfile_sp) {
if (!SymbolFilePDB::UseNativePDB())
return nullptr;

return new SymbolFileNativePDB(std::move(objfile_sp));
}

Expand Down
12 changes: 12 additions & 0 deletions lldb/source/Plugins/SymbolFile/PDB/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
lldb_tablegen(SymbolFilePDBProperties.inc -gen-lldb-property-defs
SOURCE SymbolFilePDBProperties.td
TARGET LLDBPluginSymbolFilePDBPropertiesGen)

lldb_tablegen(SymbolFilePDBPropertiesEnum.inc -gen-lldb-property-enum-defs
SOURCE SymbolFilePDBProperties.td
TARGET LLDBPluginSymbolFilePDBPropertiesEnumGen)

add_lldb_library(lldbPluginSymbolFilePDB PLUGIN
PDBASTParser.cpp
PDBLocationToDWARFExpression.cpp
Expand All @@ -16,3 +24,7 @@ add_lldb_library(lldbPluginSymbolFilePDB PLUGIN
clangAST
clangLex
)

add_dependencies(lldbPluginSymbolFilePDB
LLDBPluginSymbolFilePDBPropertiesGen
LLDBPluginSymbolFilePDBPropertiesEnumGen)
138 changes: 111 additions & 27 deletions lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,93 @@ LLDB_PLUGIN_DEFINE(SymbolFilePDB)
char SymbolFilePDB::ID;

namespace {

enum UseNativePDBReader {
eUseNativePDBReaderDefault,
eUseNativePDBReaderOn,
eUseNativePDBReaderOff,
};

constexpr OptionEnumValueElement g_native_pdb_reader_enums[] = {
{
eUseNativePDBReaderDefault,
"default",
"Use DIA PDB reader unless LLDB_USE_NATIVE_PDB_READER environment "
"variable is set",
},
{
eUseNativePDBReaderOn,
"on",
"Use native PDB reader",
},
{
eUseNativePDBReaderOff,
"off",
"Use DIA PDB reader",
},
};

#define LLDB_PROPERTIES_symbolfilepdb
#include "SymbolFilePDBProperties.inc"

enum {
#define LLDB_PROPERTIES_symbolfilepdb
#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;
}
#endif

class PluginProperties : public Properties {
public:
static llvm::StringRef GetSettingName() {
return SymbolFilePDB::GetPluginNameStatic();
}

PluginProperties() {
m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
m_collection_sp->Initialize(g_symbolfilepdb_properties);
}

bool UseNativeReader() const {
#if LLVM_ENABLE_DIA_SDK && defined(_WIN32)
auto value = GetPropertyAtIndexAs<UseNativePDBReader>(
ePropertyUseNativeReader, eUseNativePDBReaderDefault);
switch (value) {
case eUseNativePDBReaderOn:
return true;
case eUseNativePDBReaderOff:
return false;
default:
case eUseNativePDBReaderDefault:
return ShouldUseNativeReaderByDefault();
}
#else
return true;
#endif
}
};

PluginProperties &GetGlobalPluginProperties() {
static PluginProperties g_settings;
return g_settings;
}

lldb::LanguageType TranslateLanguage(PDB_Lang lang) {
switch (lang) {
case PDB_Lang::Cpp:
Expand All @@ -97,46 +184,43 @@ bool ShouldAddLine(uint32_t requested_line, uint32_t actual_line,
}
} // namespace

static bool ShouldUseNativeReader() {
#if defined(_WIN32)
#if LLVM_ENABLE_DIA_SDK
llvm::StringRef use_native = ::getenv("LLDB_USE_NATIVE_PDB_READER");
if (!use_native.equals_insensitive("on") &&
!use_native.equals_insensitive("yes") &&
!use_native.equals_insensitive("1") &&
!use_native.equals_insensitive("true"))
return false;
#endif
#endif
return true;
}

void SymbolFilePDB::Initialize() {
if (ShouldUseNativeReader()) {
npdb::SymbolFileNativePDB::Initialize();
} else {
PluginManager::RegisterPlugin(GetPluginNameStatic(),
GetPluginDescriptionStatic(), CreateInstance,
DebuggerInitialize);
}
// Initialize both but check in CreateInstance for the desired plugin
npdb::SymbolFileNativePDB::Initialize();

PluginManager::RegisterPlugin(GetPluginNameStatic(),
GetPluginDescriptionStatic(), CreateInstance,
DebuggerInitialize);
}

void SymbolFilePDB::Terminate() {
if (ShouldUseNativeReader()) {
npdb::SymbolFileNativePDB::Terminate();
} else {
PluginManager::UnregisterPlugin(CreateInstance);
}
npdb::SymbolFileNativePDB::Terminate();

PluginManager::UnregisterPlugin(CreateInstance);
}

bool SymbolFilePDB::UseNativePDB() {
return GetGlobalPluginProperties().UseNativeReader();
}

void SymbolFilePDB::DebuggerInitialize(lldb_private::Debugger &debugger) {}
void SymbolFilePDB::DebuggerInitialize(lldb_private::Debugger &debugger) {
if (!PluginManager::GetSettingForSymbolFilePlugin(
debugger, PluginProperties::GetSettingName())) {
PluginManager::CreateSettingForSymbolFilePlugin(
debugger, GetGlobalPluginProperties().GetValueProperties(),
"Properties for the PDB symbol-file plug-in.", true);
}
}

llvm::StringRef SymbolFilePDB::GetPluginDescriptionStatic() {
return "Microsoft PDB debug symbol file reader.";
}

lldb_private::SymbolFile *
SymbolFilePDB::CreateInstance(ObjectFileSP objfile_sp) {
if (UseNativePDB())
return nullptr;

return new SymbolFilePDB(std::move(objfile_sp));
}

Expand Down
2 changes: 2 additions & 0 deletions lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ class SymbolFilePDB : public lldb_private::SymbolFileCommon {
static lldb_private::SymbolFile *
CreateInstance(lldb::ObjectFileSP objfile_sp);

static bool UseNativePDB();

// Constructors and Destructors
SymbolFilePDB(lldb::ObjectFileSP objfile_sp);

Expand Down
13 changes: 13 additions & 0 deletions lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDBProperties.td
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
include "../../../../include/lldb/Core/PropertiesBase.td"

let Definition = "symbolfilepdb" in {
def UseNativeReader: Property<"use-native-reader", "Enum">,
Global,
DefaultEnumValue<"eUseNativePDBReaderDefault">,
EnumValues<"OptionEnumValues(g_native_pdb_reader_enums)">,
Desc<"When 'on', use the native PDB reader based on LLVM's PDB support as opposed to the reader using Microsoft's DIA SDK. "
"On Windows, the default is controlled by the LLDB_USE_NATIVE_PDB_READER environment variable. "
"If this is set, then the native reader is used. "
"Note that the setting value will always have priority and that it needs to be set before a target is created. "
"On other platforms, the native reader is always used.">;
}
52 changes: 52 additions & 0 deletions lldb/test/Shell/SymbolFile/PDB/native-setting.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// REQUIRES: target-windows

// Test plugin.symbol-file.pdb.use-native-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 LLDB_USE_NATIVE_PDB_READER=0 %lldb \
// RUN: -o 'settings set plugin.symbol-file.pdb.use-native-reader off' \
// RUN: -o 'target create %t.exe' \
// RUN: -o 'target modules dump symfile' \
// RUN: | FileCheck --check-prefix=ENV0-SET0 %s
// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb \
// RUN: -o 'settings set plugin.symbol-file.pdb.use-native-reader off' \
// RUN: -o 'target create %t.exe' \
// RUN: -o 'target modules dump symfile' \
// RUN: | FileCheck --check-prefix=ENV1-SET0 %s
// RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb \
// RUN: -o 'settings set plugin.symbol-file.pdb.use-native-reader on' \
// RUN: -o 'target create %t.exe' \
// RUN: -o 'target modules dump symfile' \
// RUN: | FileCheck --check-prefix=ENV0-SET1 %s
// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb \
// RUN: -o 'settings set plugin.symbol-file.pdb.use-native-reader on' \
// RUN: -o 'target create %t.exe' \
// RUN: -o 'target modules dump symfile' \
// RUN: | FileCheck --check-prefix=ENV1-SET1 %s

// ENV0: (lldb) target modules dump symfile
// ENV0: Dumping debug symbols for 1 modules.
// ENV0: SymbolFile pdb

// ENV1: (lldb) target modules dump symfile
// ENV1: Dumping debug symbols for 1 modules.
// ENV1: SymbolFile native-pdb

// ENV0-SET0: (lldb) target modules dump symfile
// ENV0-SET0: Dumping debug symbols for 1 modules.
// ENV0-SET0: SymbolFile pdb

// ENV1-SET0: (lldb) target modules dump symfile
// ENV1-SET0: Dumping debug symbols for 1 modules.
// ENV1-SET0: SymbolFile pdb

// ENV0-SET1: (lldb) target modules dump symfile
// ENV0-SET1: Dumping debug symbols for 1 modules.
// ENV0-SET1: SymbolFile native-pdb

// ENV1-SET1: (lldb) target modules dump symfile
// ENV1-SET1: Dumping debug symbols for 1 modules.
// ENV1-SET1: SymbolFile native-pdb

int main() {}
Loading