Revert "[PDB] Support PDB-backed expressions evaluation"
authorStella Stamenova <stilis@microsoft.com>
Fri, 30 Nov 2018 17:29:54 +0000 (17:29 +0000)
committerStella Stamenova <stilis@microsoft.com>
Fri, 30 Nov 2018 17:29:54 +0000 (17:29 +0000)
This reverts commit dec87759523b2f22fcff3325bc2cd543e4cda0e7.

This commit caused the tests on Windows to run forever rather than complete.
Reverting until the commit can be fixed to not stall.

llvm-svn: 348009

12 files changed:
lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest.cpp [deleted file]
lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest0.script [deleted file]
lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest1.script [deleted file]
lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest2.script [deleted file]
lldb/lit/SymbolFile/PDB/expressions.test [deleted file]
lldb/source/Expression/IRExecutionUnit.cpp
lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
lldb/source/Plugins/Process/Windows/Common/RegisterContextWindows.cpp
lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp
lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.h
lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp

diff --git a/lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest.cpp b/lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest.cpp
deleted file mode 100644 (file)
index 3785cd3..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-namespace N0 {
-namespace N1 {
-
-char *buf0 = nullptr;
-char buf1[] = {0, 1, 2, 3, 4, 5, 6, 7};
-
-char sum(char *buf, int size) {
-  char result = 0;
-  for (int i = 0; i < size; i++)
-    result += buf[i];
-  return result;
-}
-
-} // namespace N1
-} // namespace N0
-
-int main() {
-  char result = N0::N1::sum(N0::N1::buf1, sizeof(N0::N1::buf1));
-  return 0;
-}
diff --git a/lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest0.script b/lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest0.script
deleted file mode 100644 (file)
index d31a2ab..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-breakpoint set --file ExpressionsTest.cpp --line 19
-run
-print result
-print N0::N1::sum(N0::N1::buf1, sizeof(N0::N1::buf1))
-print N1::sum(N1::buf1, sizeof(N1::buf1))
-print sum(buf1, sizeof(buf1))
-print sum(buf1, 1000000000)
diff --git a/lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest1.script b/lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest1.script
deleted file mode 100644 (file)
index dac887f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-print sum(buf0, 1)
diff --git a/lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest2.script b/lldb/lit/SymbolFile/PDB/Inputs/ExpressionsTest2.script
deleted file mode 100644 (file)
index b19240b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-print sum(buf0, result - 28)
-print sum(buf1 + 3, 3)
diff --git a/lldb/lit/SymbolFile/PDB/expressions.test b/lldb/lit/SymbolFile/PDB/expressions.test
deleted file mode 100644 (file)
index 76cb334..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-REQUIRES: system-windows, msvc
-RUN: %msvc_cl /Zi /GS- /c %S/Inputs/ExpressionsTest.cpp /Fo%t.obj
-RUN: %msvc_link /debug:full /nodefaultlib /entry:main %t.obj /out:%t.exe
-RUN: %lldb -b -s %S/Inputs/ExpressionsTest0.script -s %S/Inputs/ExpressionsTest1.script -s %S/Inputs/ExpressionsTest2.script -- %t.exe 2>&1 | FileCheck %s
-
-// Check the variable value through `print`
-CHECK: (lldb) print result
-CHECK: (char) $0 = '\x1c'
-
-// Call the function just like in the code
-CHECK: (lldb) print N0::N1::sum(N0::N1::buf1, sizeof(N0::N1::buf1))
-CHECK: (char) $1 = '\x1c'
-
-// Try the relaxed namespaces search
-CHECK: (lldb) print N1::sum(N1::buf1, sizeof(N1::buf1))
-CHECK: (char) $2 = '\x1c'
-
-// Try the relaxed variables and functions search
-CHECK: (lldb) print sum(buf1, sizeof(buf1))
-CHECK: (char) $3 = '\x1c'
-
-// Make a crash during expression calculation
-CHECK: (lldb) print sum(buf1, 1000000000)
-CHECK: The process has been returned to the state before expression evaluation.
-
-// Make one more crash
-CHECK: (lldb) print sum(buf0, 1)
-CHECK: The process has been returned to the state before expression evaluation.
-
-// Check if the process state was restored succesfully
-CHECK: (lldb) print sum(buf0, result - 28)
-CHECK: (char) $4 = '\0'
-
-// Call the function with arbitrary parameters
-CHECK: (lldb) print sum(buf1 + 3, 3)
-CHECK: (char) $5 = '\f'
index 68f9add..efa1497 100644 (file)
@@ -1013,7 +1013,7 @@ IRExecutionUnit::MemoryManager::getSymbolAddress(const std::string &Name) {
           Name.c_str());
 
     m_parent.ReportSymbolLookupError(name_cs);
-    return 0;
+    return 0xbad0bad0;
   } else {
     if (log)
       log->Printf("IRExecutionUnit::getSymbolAddress(Name=\"%s\") = %" PRIx64,
index e792165..78d03e2 100644 (file)
@@ -817,12 +817,12 @@ lldb_private::Address ObjectFilePECOFF::GetEntryPointAddress() {
     return m_entry_point_address;
 
   SectionList *section_list = GetSectionList();
-  addr_t file_addr = m_coff_header_opt.entry + m_coff_header_opt.image_base;
+  addr_t offset = m_coff_header_opt.entry;
 
   if (!section_list)
-    m_entry_point_address.SetOffset(file_addr);
+    m_entry_point_address.SetOffset(offset);
   else
-    m_entry_point_address.ResolveAddressUsingFileSections(file_addr, section_list);
+    m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
   return m_entry_point_address;
 }
 
index a121f8d..b6ba702 100644 (file)
@@ -957,9 +957,8 @@ ProcessWindows::OnDebugException(bool first_chance,
   }
 
   if (!first_chance) {
-    // Not any second chance exception is an application crash by definition.
-    // It may be an expression evaluation crash.
-    SetPrivateState(eStateStopped);
+    // Any second chance exception is an application crash by definition.
+    SetPrivateState(eStateCrashed);
   }
 
   ExceptionResult result = ExceptionResult::SendToApplication;
index cd4f3f6..b3f5071 100644 (file)
@@ -42,7 +42,7 @@ bool RegisterContextWindows::ReadAllRegisterValues(
     lldb::DataBufferSP &data_sp) {
   if (!CacheAllRegisterValues())
     return false;
-  if (!data_sp || data_sp->GetByteSize() < sizeof(m_context)) {
+  if (data_sp->GetByteSize() < sizeof(m_context)) {
     data_sp.reset(new DataBufferHeap(sizeof(CONTEXT), 0));
   }
   memcpy(data_sp->GetBytes(), &m_context, sizeof(m_context));
index 2c7a1a0..145587a 100644 (file)
@@ -921,26 +921,6 @@ PDBASTParser::GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol) {
         decl_context, name.c_str(), type->GetForwardCompilerType(), storage,
         func->hasInlineAttribute());
 
-    std::vector<clang::ParmVarDecl *> params;
-    if (std::unique_ptr<PDBSymbolTypeFunctionSig> sig = func->getSignature()) {
-      if (std::unique_ptr<ConcreteSymbolEnumerator<PDBSymbolTypeFunctionArg>>
-              arg_enum = sig->findAllChildren<PDBSymbolTypeFunctionArg>()) {
-        while (std::unique_ptr<PDBSymbolTypeFunctionArg> arg =
-                   arg_enum->getNext()) {
-          Type *arg_type = symbol_file->ResolveTypeUID(arg->getTypeId());
-          if (!arg_type)
-            continue;
-
-          clang::ParmVarDecl *param = m_ast.CreateParameterDeclaration(
-              nullptr, arg_type->GetForwardCompilerType(), clang::SC_None);
-          if (param)
-            params.push_back(param);
-        }
-      }
-    }
-    if (params.size())
-      m_ast.SetFunctionParameters(decl, params.data(), params.size());
-
     m_uid_to_decl[sym_id] = decl;
 
     return decl;
@@ -1050,7 +1030,6 @@ clang::DeclContext *PDBASTParser::GetDeclContextContainingSymbol(
                                               curr_context);
 
       m_parent_to_namespaces[curr_context].insert(namespace_decl);
-      m_namespaces.insert(namespace_decl);
 
       curr_context = namespace_decl;
     }
@@ -1086,23 +1065,18 @@ void PDBASTParser::ParseDeclsForDeclContext(
 clang::NamespaceDecl *
 PDBASTParser::FindNamespaceDecl(const clang::DeclContext *parent,
                                 llvm::StringRef name) {
-  NamespacesSet *set;
-  if (parent) {
-    auto pit = m_parent_to_namespaces.find(parent);
-    if (pit == m_parent_to_namespaces.end())
-      return nullptr;
+  if (!parent)
+    parent = m_ast.GetTranslationUnitDecl();
 
-    set = &pit->second;
-  } else {
-    set = &m_namespaces;
-  }
-  assert(set);
+  auto it = m_parent_to_namespaces.find(parent);
+  if (it == m_parent_to_namespaces.end())
+    return nullptr;
 
-  for (clang::NamespaceDecl *namespace_decl : *set)
+  for (auto namespace_decl : it->second)
     if (namespace_decl->getName().equals(name))
       return namespace_decl;
 
-  for (clang::NamespaceDecl *namespace_decl : *set)
+  for (auto namespace_decl : it->second)
     if (namespace_decl->isAnonymousNamespace())
       return FindNamespaceDecl(namespace_decl, name);
 
index 0235387..28de07f 100644 (file)
@@ -69,8 +69,7 @@ private:
   typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t>
       CXXRecordDeclToUidMap;
   typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap;
-  typedef std::set<clang::NamespaceDecl *> NamespacesSet;
-  typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet>
+  typedef llvm::DenseMap<clang::DeclContext *, std::set<clang::NamespaceDecl *>>
       ParentToNamespacesMap;
   typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t>
       DeclContextToUidMap;
@@ -110,7 +109,6 @@ private:
   CXXRecordDeclToUidMap m_forward_decl_to_uid;
   UidToDeclMap m_uid_to_decl;
   ParentToNamespacesMap m_parent_to_namespaces;
-  NamespacesSet m_namespaces;
   DeclContextToUidMap m_decl_context_to_uid;
 };
 
index bdb5436..da878a9 100644 (file)
@@ -286,10 +286,6 @@ lldb_private::Function *SymbolFilePDB::ParseCompileUnitFunctionForPDBFunc(
     const PDBSymbolFunc &pdb_func, const lldb_private::SymbolContext &sc) {
   lldbassert(sc.comp_unit && sc.module_sp.get());
 
-  if (FunctionSP result =
-          sc.comp_unit->FindFunctionByUID(pdb_func.getSymIndexId()))
-    return result.get();
-
   auto file_vm_addr = pdb_func.getVirtualAddress();
   if (file_vm_addr == LLDB_INVALID_ADDRESS || file_vm_addr == 0)
     return nullptr;
@@ -1051,6 +1047,8 @@ uint32_t SymbolFilePDB::FindGlobalVariables(
     const lldb_private::ConstString &name,
     const lldb_private::CompilerDeclContext *parent_decl_ctx,
     uint32_t max_matches, lldb_private::VariableList &variables) {
+  if (!parent_decl_ctx)
+    parent_decl_ctx = m_tu_decl_ctx_up.get();
   if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
     return 0;
   if (name.IsEmpty())
@@ -1080,8 +1078,9 @@ uint32_t SymbolFilePDB::FindGlobalVariables(
     if (sc.comp_unit == nullptr)
       continue;
 
-    if (parent_decl_ctx && GetDeclContextContainingUID(
-                               result->getSymIndexId()) != *parent_decl_ctx)
+    auto actual_parent_decl_ctx =
+        GetDeclContextContainingUID(result->getSymIndexId());
+    if (actual_parent_decl_ctx != *parent_decl_ctx)
       continue;
 
     ParseVariables(sc, *pdb_data, &variables);
@@ -1270,28 +1269,20 @@ uint32_t SymbolFilePDB::FindFunctions(
     CacheFunctionNames();
 
     std::set<uint32_t> resolved_ids;
-    auto ResolveFn = [this, &name, parent_decl_ctx, include_inlines, &sc_list,
-                      &resolved_ids](UniqueCStringMap<uint32_t> &Names) {
+    auto ResolveFn = [include_inlines, &name, &sc_list, &resolved_ids,
+                      this](UniqueCStringMap<uint32_t> &Names) {
       std::vector<uint32_t> ids;
-      if (!Names.GetValues(name, ids))
-        return;
-
-      for (uint32_t id : ids) {
-        if (resolved_ids.find(id) != resolved_ids.end())
-          continue;
-
-        if (parent_decl_ctx &&
-            GetDeclContextContainingUID(id) != *parent_decl_ctx)
-          continue;
-
-        if (ResolveFunction(id, include_inlines, sc_list))
-          resolved_ids.insert(id);
+      if (Names.GetValues(name, ids)) {
+        for (auto id : ids) {
+          if (resolved_ids.find(id) == resolved_ids.end()) {
+            if (ResolveFunction(id, include_inlines, sc_list))
+              resolved_ids.insert(id);
+          }
+        }
       }
     };
     if (name_type_mask & eFunctionNameTypeFull) {
       ResolveFn(m_func_full_names);
-      ResolveFn(m_func_base_names);
-      ResolveFn(m_func_method_names);
     }
     if (name_type_mask & eFunctionNameTypeBase) {
       ResolveFn(m_func_base_names);
@@ -1479,6 +1470,8 @@ void SymbolFilePDB::FindTypesByName(
     llvm::StringRef name,
     const lldb_private::CompilerDeclContext *parent_decl_ctx,
     uint32_t max_matches, lldb_private::TypeMap &types) {
+  if (!parent_decl_ctx)
+    parent_decl_ctx = m_tu_decl_ctx_up.get();
   std::unique_ptr<IPDBEnumSymbols> results;
   if (name.empty())
     return;
@@ -1512,8 +1505,9 @@ void SymbolFilePDB::FindTypesByName(
     if (!ResolveTypeUID(result->getSymIndexId()))
       continue;
 
-    if (parent_decl_ctx && GetDeclContextContainingUID(
-                               result->getSymIndexId()) != *parent_decl_ctx)
+    auto actual_parent_decl_ctx =
+        GetDeclContextContainingUID(result->getSymIndexId());
+    if (actual_parent_decl_ctx != *parent_decl_ctx)
       continue;
 
     auto iter = m_types.find(result->getSymIndexId());