Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/basic/TestImportStdModule.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/basic/TestImportStdModule.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/basic/TestImportStdModule.py @@ -15,7 +15,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() @@ -38,7 +38,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test_non_cpp_language(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/conflicts/TestStdModuleWithConflicts.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/conflicts/TestStdModuleWithConflicts.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/conflicts/TestStdModuleWithConflicts.py @@ -20,7 +20,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/TestBasicDeque.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/TestBasicDeque.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/TestBasicDeque.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/TestDbgInfoContentDeque.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/TestDbgInfoContentDeque.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/TestDbgInfoContentDeque.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/TestBasicForwardList.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/TestBasicForwardList.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/TestBasicForwardList.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/TestDbgInfoContentForwardList.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/TestDbgInfoContentForwardList.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/TestDbgInfoContentForwardList.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/TestBasicList.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/TestBasicList.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/TestBasicList.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/TestDbgInfoContentList.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/TestDbgInfoContentList.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/TestDbgInfoContentList.py @@ -15,7 +15,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/no-std-module/TestMissingStdModule.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/no-std-module/TestMissingStdModule.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/no-std-module/TestMissingStdModule.py @@ -21,7 +21,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/queue/TestQueue.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/queue/TestQueue.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/queue/TestQueue.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/TestSharedPtrDbgInfoContent.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/TestSharedPtrDbgInfoContent.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/TestSharedPtrDbgInfoContent.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/TestSharedPtr.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/TestSharedPtr.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/TestSharedPtr.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/stack/TestStack.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/stack/TestStack.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/stack/TestStack.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/TestUniquePtrDbgInfoContent.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/TestUniquePtrDbgInfoContent.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/TestUniquePtrDbgInfoContent.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/TestUniquePtr.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/TestUniquePtr.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/TestUniquePtr.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/TestBasicVector.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/TestBasicVector.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/TestBasicVector.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/TestBoolVector.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/TestBoolVector.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/TestBoolVector.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/TestDbgInfoContentVector.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/TestDbgInfoContentVector.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/TestDbgInfoContentVector.py @@ -15,7 +15,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/TestVectorOfVectors.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/TestVectorOfVectors.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/TestVectorOfVectors.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/TestDbgInfoContentWeakPtr.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/TestDbgInfoContentWeakPtr.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/TestDbgInfoContentWeakPtr.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/TestWeakPtr.py =================================================================== --- lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/TestWeakPtr.py +++ lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/TestWeakPtr.py @@ -14,7 +14,7 @@ # skipIf's in the future. @add_test_categories(["libc++"]) @skipIf(compiler=no_match("clang")) - @skipIf(oslist=no_match(["linux"])) + @skipIf(oslist=no_match(["linux", "macosx"])) @skipIf(debug_info=no_match(["dwarf"])) def test(self): self.build() Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -51,6 +51,7 @@ #include "ClangDiagnostic.h" #include "ClangExpressionParser.h" +#include "ClangExpressionSourceCode.h" #include "ClangUserExpression.h" #include "ASTUtils.h" @@ -106,14 +107,41 @@ ClangPersistentVariables &m_persistent_vars; StreamString m_error_stream; bool m_has_errors = false; + // True iff the parser has entered or passed the actual user expression. + // False means the parser is still parsing the wrapper code generated by LLDB. + bool m_entered_expr = false; public: LLDBPreprocessorCallbacks(ClangModulesDeclVendor &decl_vendor, ClangPersistentVariables &persistent_vars) : m_decl_vendor(decl_vendor), m_persistent_vars(persistent_vars) {} + virtual void MacroDefined(const Token &MacroNameTok, + const MacroDirective *MD) override { + // We track the macro in the source code that is directly before the user + // expression. If that macro is defined, then we have entered the + // user expression. + + if (!MacroNameTok.is(tok::TokenKind::identifier)) + return; + + auto *II = MacroNameTok.getIdentifierInfo(); + if (!II) + return; + + if (II->getName() == ClangExpressionSourceCode::GetExprStartMacroName()) + m_entered_expr = true; + } + void moduleImport(SourceLocation import_location, clang::ModuleIdPath path, const clang::Module * /*null*/) override { + // If we imported a module before we have started parsing the user + // expression, then the import was generated by LLDB and is not actually + // loaded by the user. We can stop here as we only care about user-loaded + // modules. + if (!m_entered_expr) + return; + SourceModule module; for (const std::pair &component : path) Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.h =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.h +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.h @@ -60,6 +60,11 @@ lldb::LanguageType wrapping_language, size_t &start_loc, size_t &end_loc); + /// Returns the name of the macro that we placed directly before the + /// user expression in the source code. Used to signal the parser that it + /// is has started to parse the actual user expression. + static const char *GetExprStartMacroName() { return "__LLDB_EXPR_START"; } + protected: ClangExpressionSourceCode(const char *name, const char *prefix, const char *body, bool wrap) : Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp @@ -363,10 +363,12 @@ "void \n" "%s(void *$__lldb_arg) \n" "{ \n" + "#define %s \n" " %s; \n" "%s" "} \n", module_imports.c_str(), m_name.c_str(), + GetExprStartMacroName(), lldb_local_var_decls.GetData(), tagged_body.c_str()); break; case lldb::eLanguageTypeC_plus_plus: @@ -374,10 +376,12 @@ "void \n" "$__lldb_class::%s(void *$__lldb_arg) \n" "{ \n" + "#define %s \n" " %s; \n" "%s" "} \n", module_imports.c_str(), m_name.c_str(), + GetExprStartMacroName(), lldb_local_var_decls.GetData(), tagged_body.c_str()); break; case lldb::eLanguageTypeObjC: @@ -390,12 +394,14 @@ "@implementation $__lldb_objc_class ($__lldb_category) \n" "+(void)%s:(void *)$__lldb_arg \n" "{ \n" + "#define %s \n" " %s; \n" "%s" "} \n" "@end \n", module_imports.c_str(), m_name.c_str(), m_name.c_str(), - lldb_local_var_decls.GetData(), tagged_body.c_str()); + GetExprStartMacroName(), lldb_local_var_decls.GetData(), + tagged_body.c_str()); } else { wrap_stream.Printf( "%s" @@ -405,12 +411,14 @@ "@implementation $__lldb_objc_class ($__lldb_category) \n" "-(void)%s:(void *)$__lldb_arg \n" "{ \n" + "#define %s \n" " %s; \n" "%s" "} \n" "@end \n", module_imports.c_str(), m_name.c_str(), m_name.c_str(), - lldb_local_var_decls.GetData(), tagged_body.c_str()); + GetExprStartMacroName(), lldb_local_var_decls.GetData(), + tagged_body.c_str()); } break; }