[Lldb-commits] [PATCH] D65932: [lldb] Fix dynamic_cast by no longer failing on variable without metadata

2019-08-10 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor updated this revision to Diff 214517.
teemperor marked an inline comment as done.
teemperor retitled this revision from "[lldb] Fix dynamic_cast by not treating 
type info pointers as variables." to "[lldb] Fix dynamic_cast by no longer 
failing on variable without metadata".
teemperor edited the summary of this revision.
teemperor added a comment.

- Rebased patch.
- Updated title/description.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D65932/new/

https://reviews.llvm.org/D65932

Files:
  lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
  lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
  lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile
  lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
  lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
  lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp

Index: lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp
===
--- lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp
+++ lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp
@@ -1265,16 +1265,10 @@
 clang::NamedDecl *named_decl = DeclForGlobal(global_variable);
 
 if (!named_decl) {
-  if (IsObjCSelectorRef(llvm_value_ptr))
-return true;
-
-  if (!global_variable->hasExternalLinkage())
-return true;
-
   LLDB_LOG(log, "Found global variable \"{0}\" without metadata",
global_variable->getName());
 
-  return false;
+  return true;
 }
 
 llvm::StringRef name(named_decl->getName());
Index: lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
===
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
@@ -0,0 +1,51 @@
+#include "ExtBase.h"
+
+class Base {
+public:
+  virtual char foo() {
+return 'b';
+  }
+};
+
+class Derived : public Base {
+public:
+  char foo() override {
+return 'd';
+  }
+};
+
+class NonOverrideDerived : public Base {
+};
+
+class ExtDerived : public ExtBase {
+public:
+  char bar() override {
+return 'y';
+  }
+};
+
+int main() {
+  Derived d;
+  NonOverrideDerived d2;
+  Base *b = &d;
+  Base *real_base = new Base();
+  char c = dynamic_cast(b)->foo();
+
+  ExtDerived ext_d;
+  ExtBase *ext_b = &ext_d;
+  ExtBase *ext_real_base = new ExtBase();
+  c = dynamic_cast(ext_b)->bar();
+
+
+  return 0; //% self.expect("expression dynamic_cast(b) == (Derived*)b", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(b) == (Base*)b", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(real_base) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(&d) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(real_base) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(&d2) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(&d2) == (NonOverrideDerived *)&d2", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(&ext_d) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(ext_b) == (class ExtDerived*)ext_b", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(ext_real_base) == (class ExtBase*)ext_real_base", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(ext_real_base) == nullptr", substrs = ["bool", " = true"])
+}
Index: lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
===
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
@@ -0,0 +1,3 @@
+from lldbsuite.test import lldbinline
+
+lldbinline.MakeInlineTest(__file__, globals(), [])
Index: lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile
===
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile
@@ -0,0 +1,3 @@
+LEVEL = ../../../make
+CXX_SOURCES := main.cpp ExtBase.cpp
+include $(LEVEL)/Makefile.rules
Index: lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
===
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
@@ -0,0 +1,3 @@
+class ExtBase {
+  virtual char bar();
+};
Index: lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
===
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
@@ -0,0 +1,5 @@
+#inc

[Lldb-commits] [lldb] r368511 - [lldb] Fix dynamic_cast by no longer failing on variable without metadata

2019-08-10 Thread Raphael Isemann via lldb-commits
Author: teemperor
Date: Sat Aug 10 03:56:17 2019
New Revision: 368511

URL: http://llvm.org/viewvc/llvm-project?rev=368511&view=rev
Log:
[lldb] Fix dynamic_cast by no longer failing on variable without metadata

Summary:
Our IR rewriting infrastructure currently fails when it encounters a variable 
which has no metadata associated.
This causes dynamic_cast to fail as in this case IRForTarget considers the type 
info pointers ('@_ZTI...') to be
variables without associated metadata. As there are no variables for these 
internal variables, this is actually
not an error and dynamic_cast would work fine if we didn't throw this error.

This patch fixes this by removing this diagnostics code. In case we would 
actually hit a variable that has no
metadata (but is supposed to have), we still have the error in the expression 
log so this shouldn't make it
harder to diagnose any missing metadata errors.

This patch should fix dynamic_cast and also adds a bunch of test coverage to 
that language feature.

Fixes rdar://10813639

Reviewers: davide, labath

Reviewed By: labath

Subscribers: friss, labath, abidh, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D65932

Added:
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile

lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
Modified:
lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp

Added: 
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp?rev=368511&view=auto
==
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp 
(added)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp 
Sat Aug 10 03:56:17 2019
@@ -0,0 +1,5 @@
+#include "ExtBase.h"
+
+char ExtBase::bar() {
+  return 'x';
+}

Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h?rev=368511&view=auto
==
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h 
(added)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h 
Sat Aug 10 03:56:17 2019
@@ -0,0 +1,3 @@
+class ExtBase {
+  virtual char bar();
+};

Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile?rev=368511&view=auto
==
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile 
(added)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile 
Sat Aug 10 03:56:17 2019
@@ -0,0 +1,3 @@
+LEVEL = ../../../make
+CXX_SOURCES := main.cpp ExtBase.cpp
+include $(LEVEL)/Makefile.rules

Added: 
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py?rev=368511&view=auto
==
--- 
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
 (added)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
 Sat Aug 10 03:56:17 2019
@@ -0,0 +1,3 @@
+from lldbsuite.test import lldbinline
+
+lldbinline.MakeInlineTest(__file__, globals(), [])

Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp?rev=368511&view=auto
==
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp 
(added)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp 
Sat Aug 10 03:56:17 2019
@@ -0,0 +1,51 @@
+#include "ExtBase.h"
+
+class Base {
+public:
+  virtual char foo() {
+return 'b';
+  }
+};
+
+class Derived : public Base {
+public:
+  char foo() override {
+return 'd';
+  }
+};
+
+class NonOverrideDerived : public Base {
+};
+
+class ExtDerived : public ExtBase {
+public:
+  char bar() override {
+return 'y';
+  }
+};
+
+int main() {
+  Derived d;
+  NonOverrideDer

[Lldb-commits] [PATCH] D65932: [lldb] Fix dynamic_cast by no longer failing on variable without metadata

2019-08-10 Thread Raphael Isemann via Phabricator via lldb-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL368511: [lldb] Fix dynamic_cast by no longer failing on 
variable without metadata (authored by teemperor, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D65932?vs=214517&id=214519#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D65932/new/

https://reviews.llvm.org/D65932

Files:
  lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
  lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
  lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile
  
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
  lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
  lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp

Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
===
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py
@@ -0,0 +1,3 @@
+from lldbsuite.test import lldbinline
+
+lldbinline.MakeInlineTest(__file__, globals(), [])
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
===
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp
@@ -0,0 +1,51 @@
+#include "ExtBase.h"
+
+class Base {
+public:
+  virtual char foo() {
+return 'b';
+  }
+};
+
+class Derived : public Base {
+public:
+  char foo() override {
+return 'd';
+  }
+};
+
+class NonOverrideDerived : public Base {
+};
+
+class ExtDerived : public ExtBase {
+public:
+  char bar() override {
+return 'y';
+  }
+};
+
+int main() {
+  Derived d;
+  NonOverrideDerived d2;
+  Base *b = &d;
+  Base *real_base = new Base();
+  char c = dynamic_cast(b)->foo();
+
+  ExtDerived ext_d;
+  ExtBase *ext_b = &ext_d;
+  ExtBase *ext_real_base = new ExtBase();
+  c = dynamic_cast(ext_b)->bar();
+
+
+  return 0; //% self.expect("expression dynamic_cast(b) == (Derived*)b", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(b) == (Base*)b", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(real_base) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(&d) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(real_base) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(&d2) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(&d2) == (NonOverrideDerived *)&d2", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(&ext_d) == nullptr", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(ext_b) == (class ExtDerived*)ext_b", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(ext_real_base) == (class ExtBase*)ext_real_base", substrs = ["bool", " = true"])
+//% self.expect("expression dynamic_cast(ext_real_base) == nullptr", substrs = ["bool", " = true"])
+}
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
===
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h
@@ -0,0 +1,3 @@
+class ExtBase {
+  virtual char bar();
+};
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile
===
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile
@@ -0,0 +1,3 @@
+LEVEL = ../../../make
+CXX_SOURCES := main.cpp ExtBase.cpp
+include $(LEVEL)/Makefile.rules
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
===
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp
@@ -0,0 +1,5 @@
+#include "ExtBase.h"
+
+char ExtBase::bar() {
+  return 'x';
+}
Index: lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp
===
--- lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp
+++ lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTar