diff options
8 files changed, 120 insertions, 9 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/Makefile b/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/Makefile new file mode 100644 index 00000000000..52a92c0b61a --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/Makefile @@ -0,0 +1,8 @@ +LEVEL = ../../../make +CXX_SOURCES := main.cpp +CXXFLAGS += -std=c++11 +include $(LEVEL)/Makefile.rules + +cleanup: + rm -f Makefile *.d + diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/TestConstThis.py b/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/TestConstThis.py new file mode 100644 index 00000000000..2249a8c9b16 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/TestConstThis.py @@ -0,0 +1,4 @@ +from lldbsuite.test import lldbinline +from lldbsuite.test import decorators + +lldbinline.MakeInlineTest(__file__, globals(), [decorators.expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")] ) diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/main.cpp b/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/main.cpp new file mode 100644 index 00000000000..7614977b245 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/const_this/main.cpp @@ -0,0 +1,23 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <stdio.h> + +class foo { +public: + template <class T> T func(T x) const { + return x+2; //% self.expect("expr 2+3", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["5"]) + } +}; + +int i; + +int main() { + return foo().func(i); +} diff --git a/lldb/source/Core/Scalar.cpp b/lldb/source/Core/Scalar.cpp index a45424d0b1f..04970a69b84 100644 --- a/lldb/source/Core/Scalar.cpp +++ b/lldb/source/Core/Scalar.cpp @@ -78,6 +78,74 @@ PromoteToMaxType return Scalar::e_void; } +llvm::APInt +Scalar::APIntWithTypeAndValue(Scalar::Type type, uint64_t raw_value) +{ + // APInt(unsigned numBits, uint64_t val, bool isSigned = false) + unsigned num_bits = 1; + bool is_signed = false; + + switch (type) + { + case Scalar::e_void: + break; + case Scalar::e_sint: + is_signed = true; + num_bits = sizeof(sint_t) * 8; + break; + case Scalar::e_uint: + is_signed = false; + num_bits = sizeof(uint_t) * 8; + break; + case Scalar::e_slong: + is_signed = true; + num_bits = sizeof(slong_t) * 8; + break; + case Scalar::e_ulong: + is_signed = false; + num_bits = sizeof(ulong_t) * 8; + break; + case Scalar::e_slonglong: + is_signed = true; + num_bits = sizeof(slonglong_t) * 8; + break; + case Scalar::e_ulonglong: + is_signed = false; + num_bits = sizeof(ulonglong_t) * 8; + break; + case Scalar::e_sint128: + is_signed = true; + num_bits = 128; + break; + case Scalar::e_uint128: + is_signed = false; + num_bits = 128; + break; + case Scalar::e_sint256: + is_signed = true; + num_bits = 256; + break; + case Scalar::e_uint256: + is_signed = false; + num_bits = 256; + break; + case Scalar::e_float: + is_signed = false; + num_bits = sizeof(float_t) * 8; + break; + case Scalar::e_double: + is_signed = false; + num_bits = sizeof(double_t) * 8; + break; + case Scalar::e_long_double: + is_signed = false; + num_bits = sizeof(long_double_t) * 8; + break; + } + + return llvm::APInt(num_bits, raw_value, is_signed); +} + Scalar::Scalar() : m_type(e_void), m_float((float)0) diff --git a/lldb/source/Expression/ExpressionSourceCode.cpp b/lldb/source/Expression/ExpressionSourceCode.cpp index 14e98105b8a..d82ed608407 100644 --- a/lldb/source/Expression/ExpressionSourceCode.cpp +++ b/lldb/source/Expression/ExpressionSourceCode.cpp @@ -195,7 +195,7 @@ AddLocalVariableDecls(const lldb::VariableListSP &var_list_sp, StreamString &str } } -bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool const_object, bool static_method, ExecutionContext &exe_ctx) const +bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool static_method, ExecutionContext &exe_ctx) const { const char *target_specific_defines = "typedef signed char BOOL;\n"; std::string module_macros; @@ -337,13 +337,12 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi break; case lldb::eLanguageTypeC_plus_plus: wrap_stream.Printf("void \n" - "$__lldb_class::%s(void *$__lldb_arg) %s\n" + "$__lldb_class::%s(void *$__lldb_arg) \n" "{ \n" " %s; \n" "%s" "} \n", m_name.c_str(), - (const_object ? "const" : ""), lldb_local_var_decls.GetData(), tagged_body.c_str()); break; diff --git a/lldb/source/Expression/LLVMUserExpression.cpp b/lldb/source/Expression/LLVMUserExpression.cpp index 60f68b129d3..0b969806280 100644 --- a/lldb/source/Expression/LLVMUserExpression.cpp +++ b/lldb/source/Expression/LLVMUserExpression.cpp @@ -59,7 +59,6 @@ LLVMUserExpression::LLVMUserExpression(ExecutionContextScope &exe_scope, m_in_objectivec_method(false), m_in_static_method(false), m_needs_object_ptr(false), - m_const_object(false), m_target(NULL), m_can_interpret(false), m_materialized_address(LLDB_INVALID_ADDRESS) diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp index b40fe3b311f..556b27348e5 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -2212,10 +2212,10 @@ ClangExpressionDeclMap::AddThisType(NameSearchContext &context, { CompilerType copied_clang_type = GuardedCopyType(ut); + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); + if (!copied_clang_type) { - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); - if (log) log->Printf("ClangExpressionDeclMap::AddThisType - Couldn't import the type"); @@ -2232,7 +2232,7 @@ ClangExpressionDeclMap::AddThisType(NameSearchContext &context, &void_ptr_clang_type, 1, false, - copied_clang_type.GetTypeQualifiers()); + 0); const bool is_virtual = false; const bool is_static = false; @@ -2241,7 +2241,7 @@ ClangExpressionDeclMap::AddThisType(NameSearchContext &context, const bool is_attr_used = true; const bool is_artificial = false; - ClangASTContext::GetASTContext(m_ast_context)-> + CXXMethodDecl *method_decl = ClangASTContext::GetASTContext(m_ast_context)-> AddMethodToCXXRecordType (copied_clang_type.GetOpaqueQualType(), "$__lldb_expr", method_type, @@ -2252,6 +2252,16 @@ ClangExpressionDeclMap::AddThisType(NameSearchContext &context, is_explicit, is_attr_used, is_artificial); + + if (log) + { + ASTDumper method_ast_dumper((clang::Decl*)method_decl); + ASTDumper type_ast_dumper(copied_clang_type); + + log->Printf(" CEDM::AddThisType Added function $__lldb_expr (description %s) for this type %s", + method_ast_dumper.GetCString(), + type_ast_dumper.GetCString()); + } } if (!copied_clang_type.IsValid()) diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp index 50669bd4e3c..53b6fe1b4c7 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp @@ -417,7 +417,7 @@ ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager, ExecutionConte else lang_type = lldb::eLanguageTypeC; - if (!source_code->GetText(m_transformed_text, lang_type, m_const_object, m_in_static_method, exe_ctx)) + if (!source_code->GetText(m_transformed_text, lang_type, m_in_static_method, exe_ctx)) { diagnostic_manager.PutCString(eDiagnosticSeverityError, "couldn't construct expression body"); return false; |