Index: include/lldb/Expression/ExpressionVariable.h =================================================================== --- include/lldb/Expression/ExpressionVariable.h +++ include/lldb/Expression/ExpressionVariable.h @@ -239,7 +239,12 @@ lldb::ByteOrder byte_order, uint32_t addr_byte_size) = 0; - virtual ConstString GetNextPersistentVariableName(Target &target) = 0; + /// Return a new persistent variable name with the specified prefix. + ConstString GetNextPersistentVariableName(Target &target, + llvm::StringRef prefix); + + virtual llvm::StringRef + GetPersistentVariablePrefix(bool is_error = false) const = 0; virtual void RemovePersistentVariable(lldb::ExpressionVariableSP variable) = 0; Index: source/Core/ValueObject.cpp =================================================================== --- source/Core/ValueObject.cpp +++ source/Core/ValueObject.cpp @@ -3311,7 +3311,9 @@ if (!persistent_state) return nullptr; - ConstString name(persistent_state->GetNextPersistentVariableName(*target_sp)); + auto prefix = persistent_state->GetPersistentVariablePrefix(); + ConstString name = + persistent_state->GetNextPersistentVariableName(*target_sp, prefix); ValueObjectSP const_result_sp = ValueObjectConstResult::Create(target_sp.get(), GetValue(), name); Index: source/Expression/ExpressionVariable.cpp =================================================================== --- source/Expression/ExpressionVariable.cpp +++ source/Expression/ExpressionVariable.cpp @@ -9,6 +9,7 @@ #include "lldb/Expression/ExpressionVariable.h" #include "lldb/Expression/IRExecutionUnit.h" +#include "lldb/Target/Target.h" #include "lldb/Utility/Log.h" using namespace lldb_private; @@ -80,3 +81,13 @@ } } } + +ConstString PersistentExpressionState::GetNextPersistentVariableName( + Target &target, llvm::StringRef Prefix) { + llvm::SmallString<64> name; + { + llvm::raw_svector_ostream os(name); + os << Prefix << target.GetNextPersistentVariableIndex(); + } + return ConstString(name); +} Index: source/Expression/Materializer.cpp =================================================================== --- source/Expression/Materializer.cpp +++ source/Expression/Materializer.cpp @@ -891,7 +891,8 @@ ConstString name = m_delegate ? m_delegate->GetName() - : persistent_state->GetNextPersistentVariableName(*target_sp); + : persistent_state->GetNextPersistentVariableName( + *target_sp, persistent_state->GetPersistentVariablePrefix()); lldb::ExpressionVariableSP ret = persistent_state->CreatePersistentVariable( exe_scope, name, m_type, map.GetByteOrder(), map.GetAddressByteSize()); Index: source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h +++ source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h @@ -54,16 +54,11 @@ const CompilerType &compiler_type, lldb::ByteOrder byte_order, uint32_t addr_byte_size) override; - //---------------------------------------------------------------------- - /// Return the next entry in the sequence of strings "$0", "$1", ... for - /// use naming persistent expression convenience variables. - /// - /// @return - /// A string that contains the next persistent variable name. - //---------------------------------------------------------------------- - ConstString GetNextPersistentVariableName(Target &target) override; - void RemovePersistentVariable(lldb::ExpressionVariableSP variable) override; + llvm::StringRef + GetPersistentVariablePrefix(bool is_error) const override { + return "$"; + } void RegisterPersistentDecl(const ConstString &name, clang::NamedDecl *decl); Index: source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp +++ source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp @@ -53,15 +53,6 @@ m_next_persistent_variable_id--; } -ConstString -ClangPersistentVariables::GetNextPersistentVariableName(Target &target) { - char name_cstr[256]; - ::snprintf(name_cstr, sizeof(name_cstr), "$%u", - target.GetNextPersistentVariableIndex()); - ConstString name(name_cstr); - return name; -} - void ClangPersistentVariables::RegisterPersistentDecl(const ConstString &name, clang::NamedDecl *decl) { m_persistent_decls.insert( Index: source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp +++ source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp @@ -665,7 +665,9 @@ } ConstString ClangUserExpression::ResultDelegate::GetName() { - return m_persistent_state->GetNextPersistentVariableName(*m_target_sp); + auto prefix = m_persistent_state->GetPersistentVariablePrefix(); + return m_persistent_state->GetNextPersistentVariableName(*m_target_sp, + prefix); } void ClangUserExpression::ResultDelegate::DidDematerialize( Index: source/Plugins/ExpressionParser/Go/GoUserExpression.h =================================================================== --- source/Plugins/ExpressionParser/Go/GoUserExpression.h +++ source/Plugins/ExpressionParser/Go/GoUserExpression.h @@ -29,8 +29,10 @@ public: GoPersistentExpressionState(); - ConstString GetNextPersistentVariableName(Target &target) override; - + llvm::StringRef + GetPersistentVariablePrefix(bool is_error) const override { + return "$go"; + } void RemovePersistentVariable(lldb::ExpressionVariableSP variable) override; lldb::addr_t LookupSymbol(const ConstString &name) override { Index: source/Plugins/ExpressionParser/Go/GoUserExpression.cpp =================================================================== --- source/Plugins/ExpressionParser/Go/GoUserExpression.cpp +++ source/Plugins/ExpressionParser/Go/GoUserExpression.cpp @@ -272,7 +272,8 @@ PersistentExpressionState *pv = target->GetPersistentExpressionStateForLanguage(eLanguageTypeGo); if (pv != nullptr) { - result->SetName(pv->GetNextPersistentVariableName(*target)); + result->SetName(pv->GetNextPersistentVariableName( + *target, pv->GetPersistentVariablePrefix())); pv->AddVariable(result); } return lldb::eExpressionCompleted; @@ -650,16 +651,6 @@ GoPersistentExpressionState::GoPersistentExpressionState() : PersistentExpressionState(eKindGo) {} -ConstString -GoPersistentExpressionState::GetNextPersistentVariableName(Target &target) { - char name_cstr[256]; - // We can't use the same variable format as clang. - ::snprintf(name_cstr, sizeof(name_cstr), "$go%u", - target.GetNextPersistentVariableIndex()); - ConstString name(name_cstr); - return name; -} - void GoPersistentExpressionState::RemovePersistentVariable( lldb::ExpressionVariableSP variable) { RemoveVariable(variable); Index: source/Target/ABI.cpp =================================================================== --- source/Target/ABI.cpp +++ source/Target/ABI.cpp @@ -110,8 +110,10 @@ if (!persistent_expression_state) return ValueObjectSP(); - ConstString persistent_variable_name( - persistent_expression_state->GetNextPersistentVariableName(target)); + auto prefix = persistent_expression_state->GetPersistentVariablePrefix(); + ConstString persistent_variable_name = + persistent_expression_state->GetNextPersistentVariableName(target, + prefix); lldb::ValueObjectSP const_valobj_sp;