[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 12:46:33 PDT 2018


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;
 




More information about the lldb-commits mailing list