forked from OSchip/llvm-project
Revert "[PDB] Support PDB-backed expressions evaluation"
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
This commit is contained in:
parent
e47b366900
commit
9a3686b208
|
@ -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;
|
||||
}
|
|
@ -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)
|
|
@ -1 +0,0 @@
|
|||
print sum(buf0, 1)
|
|
@ -1,2 +0,0 @@
|
|||
print sum(buf0, result - 28)
|
||||
print sum(buf1 + 3, 3)
|
|
@ -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'
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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())
|
||||
if (!parent)
|
||||
parent = m_ast.GetTranslationUnitDecl();
|
||||
|
||||
auto it = m_parent_to_namespaces.find(parent);
|
||||
if (it == m_parent_to_namespaces.end())
|
||||
return nullptr;
|
||||
|
||||
set = &pit->second;
|
||||
} else {
|
||||
set = &m_namespaces;
|
||||
}
|
||||
assert(set);
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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 (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());
|
||||
|
|
Loading…
Reference in New Issue