[Lldb-commits] [lldb] r328025 - [ExpressionParser] Re-implement r327356 in a less disruptive way.
Davide Italiano via lldb-commits
lldb-commits at lists.llvm.org
Tue Mar 20 15:23:34 PDT 2018
This apparently uncovered a crash in the linux build, looking now.
http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-14.04-cmake
Thanks,
--
Davide
On Tue, Mar 20, 2018 at 12:46 PM, Davide Italiano via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
> Author: davide
> Date: Tue Mar 20 12:46:32 2018
> New Revision: 328025
>
> URL: http://llvm.org/viewvc/llvm-project?rev=328025&view=rev
> Log:
> [ExpressionParser] Re-implement r327356 in a less disruptive way.
>
> Instead of applying the sledgehammer of refusing to insert any
> C++ symbol in the ASTContext, try to validate the decl if what
> we have is an operator. There was other code in lldb which was
> responsible for this, just not really exposed (or used) in this
> codepath. Also, add a better/more comprehensive test.
>
> <rdar://problem/35645893>
>
> Added:
> lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/
> lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/Makefile
> lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/TestOperatorOverload.py
> lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/a.cpp
> lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/b.cpp
> Removed:
> lldb/trunk/lit/Expr/Inputs/basic.cpp
> lldb/trunk/lit/Expr/TestCallCppSym.test
> Modified:
> lldb/trunk/include/lldb/Symbol/ClangASTContext.h
> lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
> lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
> lldb/trunk/source/Symbol/ClangASTContext.cpp
>
> Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=328025&r1=328024&r2=328025&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original)
> +++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Tue Mar 20 12:46:32 2018
> @@ -253,6 +253,9 @@ public:
> &type_fields,
> bool packed = false);
>
> + static bool IsOperator(const char *name,
> + clang::OverloadedOperatorKind &op_kind);
> +
> //------------------------------------------------------------------
> // Structure, Unions, Classes
> //------------------------------------------------------------------
>
> Removed: lldb/trunk/lit/Expr/Inputs/basic.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Expr/Inputs/basic.cpp?rev=328024&view=auto
> ==============================================================================
> --- lldb/trunk/lit/Expr/Inputs/basic.cpp (original)
> +++ lldb/trunk/lit/Expr/Inputs/basic.cpp (removed)
> @@ -1,12 +0,0 @@
> -class Patatino {
> -private:
> - long tinky;
> -
> -public:
> - Patatino(long tinky) { this->tinky = tinky; }
> -};
> -
> -int main(void) {
> - Patatino *a = new Patatino(26);
> - return 0;
> -}
>
> Removed: lldb/trunk/lit/Expr/TestCallCppSym.test
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Expr/TestCallCppSym.test?rev=328024&view=auto
> ==============================================================================
> --- lldb/trunk/lit/Expr/TestCallCppSym.test (original)
> +++ lldb/trunk/lit/Expr/TestCallCppSym.test (removed)
> @@ -1,6 +0,0 @@
> -# RUN: %cxx %p/Inputs/basic.cpp -g -o %t && %lldb -b -s %s -- %t 2>&1 | FileCheck %s
> -
> -breakpoint set --file basic.cpp --line 12
> -run
> -call (int)_Znwm(23)
> -# CHECK: error: use of undeclared identifier '_Znwm'
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/Makefile
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/Makefile?rev=328025&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/Makefile (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/Makefile Tue Mar 20 12:46:32 2018
> @@ -0,0 +1,20 @@
> +LEVEL = ../../../make
> +
> +CXX_SOURCES = a.cpp b.cpp
> +CXXFLAGS_NO_DEBUGINFO = -c
> +CXXFLAGS_DEBUGINFO = -c -g
> +
> +all: main
> +
> +main: a.o b.o
> + $(CXX) a.o b.o -o main $(LDFLAGS)
> +
> +a.o: a.cpp
> + $(CXX) $(SRCDIR)/a.cpp $(CXXFLAGS_NO_DEBUGINFO) -o a.o
> +
> +b.o: b.cpp
> + $(CXX) $(SRCDIR)/b.cpp $(CXXFLAGS_DEBUGINFO) -o b.o
> +
> +clean: OBJECTS += a.o b.o main
> +
> +include $(LEVEL)/Makefile.rules
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/TestOperatorOverload.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/TestOperatorOverload.py?rev=328025&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/TestOperatorOverload.py (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/TestOperatorOverload.py Tue Mar 20 12:46:32 2018
> @@ -0,0 +1,22 @@
> +import lldb
> +from lldbsuite.test.decorators import *
> +from lldbsuite.test.lldbtest import *
> +from lldbsuite.test import lldbutil
> +
> +class TestOperatorOverload(TestBase):
> + mydir = TestBase.compute_mydir(__file__)
> +
> + def test_overload(self):
> + self.build()
> + (target, process, thread,
> + main_breakpoint) = lldbutil.run_to_source_breakpoint(self,
> + "break here", lldb.SBFileSpec("b.cpp"), exe_name = "main")
> + frame = thread.GetSelectedFrame()
> + value = frame.EvaluateExpression("x == nil")
> + self.assertTrue(str(value.GetError())
> + .find("comparison between NULL and non-pointer ('Tinky' and NULL)")
> + != -1)
> + self.assertTrue(str(value.GetError())
> + .find("invalid operands to binary expression ('Tinky' and 'long')")
> + != -1)
> + self.assertFalse(value.GetError().Success())
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/a.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/a.cpp?rev=328025&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/a.cpp (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/a.cpp Tue Mar 20 12:46:32 2018
> @@ -0,0 +1,9 @@
> +class Patatino {
> +public:
> + double _blah;
> + Patatino(int blah) : _blah(blah) {}
> +};
> +
> +bool operator==(const Patatino& a, const Patatino& b) {
> + return a._blah < b._blah;
> +}
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/b.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/b.cpp?rev=328025&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/b.cpp (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/b.cpp Tue Mar 20 12:46:32 2018
> @@ -0,0 +1,10 @@
> +class Tinky {
> +public:
> + int _meh;
> + Tinky(int meh) : _meh(meh) {}
> +};
> +
> +int main(void) {
> + Tinky x(12);
> + return 0; // break here
> +}
>
> Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp?rev=328025&r1=328024&r2=328025&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp (original)
> +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp Tue Mar 20 12:46:32 2018
> @@ -2156,6 +2156,18 @@ clang::NamedDecl *NameSearchContext::Add
> log->Printf("Function type wasn't a FunctionProtoType");
> }
>
> + // If this is an operator (e.g. operator new or operator==), only insert
> + // the declaration we inferred from the symbol if we can provide the correct
> + // number of arguments. We shouldn't really inject random decl(s) for
> + // functions that are analyzed semantically in a special way, otherwise we
> + // will crash in clang.
> + clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
> + if (func_proto_type &&
> + ClangASTContext::IsOperator(decl_name.getAsString().c_str(), op_kind)) {
> + if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount(
> + false, op_kind, func_proto_type->getNumParams()))
> + return NULL;
> + }
> m_decls.push_back(func_decl);
>
> return func_decl;
>
> Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp?rev=328025&r1=328024&r2=328025&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp (original)
> +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp Tue Mar 20 12:46:32 2018
> @@ -2072,15 +2072,6 @@ void ClangExpressionDeclMap::AddOneFunct
> return;
> }
> } else if (symbol) {
> - // Don't insert a generic function decl for C++ symbol names.
> - // Creating a generic function decl is almost surely going to cause troubles
> - // as it breaks Clang/Sema invariants and causes crashes in clang while
> - // we're trying to evaluate the expression.
> - // This means users can't call C++ functions by mangled name when there
> - // are no debug info (as it happens for C symbol, e.g. printf()).
> - if (CPlusPlusLanguage::IsCPPMangledName(
> - symbol->GetMangled().GetMangledName().GetCString()))
> - return;
> fun_address = symbol->GetAddress();
> function_decl = context.AddGenericFunDecl();
> is_indirect_function = symbol->IsIndirect();
>
> Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=328025&r1=328024&r2=328025&view=diff
> ==============================================================================
> --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
> +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Tue Mar 20 12:46:32 2018
> @@ -138,8 +138,8 @@ static ClangASTMap &GetASTMap() {
> return *g_map_ptr;
> }
>
> -static bool IsOperator(const char *name,
> - clang::OverloadedOperatorKind &op_kind) {
> +bool ClangASTContext::IsOperator(const char *name,
> + clang::OverloadedOperatorKind &op_kind) {
> if (name == nullptr || name[0] == '\0')
> return false;
>
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list