Re: [Lldb-commits] [PATCH] D23883: Remove MIUtilParse (no longer used)
krytarowski added a comment. In https://reviews.llvm.org/D23883#539471, @mgorny wrote: > In https://reviews.llvm.org/D23883#539442, @krytarowski wrote: > > > It looks good. Remaining TODO for standalone builds: > > > > - sanitize six.py usage (it's installed into system-wide directory, where > > standard py-six lands) > > > How would you prefer handling it? Can we just kill it and rely on user > installing it system-wide or via pip? 1. Patch scripts/Python/finishSwigPythonLLDB.py and install six into lldb subdir with a custom name (`lldb_six.py`). 2. Patch the Python sources to make use of `lldb_six`. Unfortunately there is resistance to grab system-wide (provided by a user) six module. > > - bump cmake_minimum_required(VERSION 2.8.12.2) to 3.4.3 in > > cmake/modules/LLDBStandalone.cmake Final bits for Windows: > > > - eliminate the usage of ../lib/Support/regex_impl.h in RegularExpression.h > > > Wouldn't it be actually better to kill that regex implementation as well, and > use the class provided by LLVMSupport everywhere? I started with the other > since it caused direct build issues on Linux but I think I could try to kill > this one as well. It makes sense. https://reviews.llvm.org/D23883 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D24331: Fix about a dozen compile warnings
ki.stfu updated this revision to Diff 70973. ki.stfu added a comment. Rebase against ToT https://reviews.llvm.org/D24331 Files: source/Core/Log.cpp source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp source/Plugins/Process/elf-core/ProcessElfCore.cpp source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp source/Plugins/Process/minidump/MinidumpParser.cpp source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp source/Target/StackFrame.cpp Index: source/Target/StackFrame.cpp === --- source/Target/StackFrame.cpp +++ source/Target/StackFrame.cpp @@ -1278,6 +1278,8 @@ return std::make_pair(nullptr, 0); } } + default: +return std::make_pair(nullptr, 0); } } @@ -1291,7 +1293,7 @@ } return std::make_pair(nullptr, 0); } -}; +} lldb::ValueObjectSP StackFrame::GuessValueForAddress(lldb::addr_t addr) { TargetSP target_sp = CalculateTarget(); @@ -1420,7 +1422,7 @@ Error error; ValueObjectSP pointee = base->Dereference(error); - if (offset >= pointee->GetByteSize()) { + if (offset >= 0 && uint64_t(offset) >= pointee->GetByteSize()) { int64_t index = offset / pointee->GetByteSize(); offset = offset % pointee->GetByteSize(); const bool can_create = true; @@ -1586,17 +1588,16 @@ continue; } -Instruction::Operand *register_operand = nullptr; Instruction::Operand *origin_operand = nullptr; if (operands[0].m_type == Instruction::Operand::Type::Register && operands[0].m_clobbered == true && operands[0].m_register == reg) { - register_operand = &operands[0]; + // operands[0] is a register operand origin_operand = &operands[1]; } else if (operands[1].m_type == Instruction::Operand::Type::Register && operands[1].m_clobbered == true && operands[1].m_register == reg) { - register_operand = &operands[1]; origin_operand = &operands[0]; + // operands[1] is a register operand } else { continue; } Index: source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp === --- source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp +++ source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp @@ -518,7 +518,7 @@ // 0x. If we use the unsigned long long // it will work as expected. const uint64_t uval = PyLong_AsUnsignedLongLong(m_py_obj); - result = *((int64_t *)&uval); + result = static_cast(uval); } return result; } Index: source/Plugins/Process/minidump/MinidumpParser.cpp === --- source/Plugins/Process/minidump/MinidumpParser.cpp +++ source/Plugins/Process/minidump/MinidumpParser.cpp @@ -138,6 +138,8 @@ case MinidumpCPUArchitecture::ARM64: arch_spec.GetTriple().setArch(llvm::Triple::ArchType::aarch64); break; + default: +break; } return arch_spec; Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp === --- source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -3653,7 +3653,7 @@ error.SetErrorStringWithFormat("configuring StructuredData feature %s " "failed when sending packet: " "PacketResult=%d", - type_name.AsCString(), result); + type_name.AsCString(), (int)result); } return error; } Index: source/Plugins/Process/elf-core/ProcessElfCore.cpp === --- source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -139,9 +139,9 @@ // Keep a separate map of permissions that that isn't coalesced so all ranges // are maintained. const uint32_t permissions = - ((header->p_flags & llvm::ELF::PF_R) ? lldb::ePermissionsReadable : 0) | - ((header->p_flags & llvm::ELF::PF_W) ? lldb::ePermissionsWritable : 0) | - ((header->p_flags & llvm::ELF::PF_X) ? lldb::ePermissionsExecutable : 0); + ((header->p_flags & llvm::ELF::PF_R) ? lldb::ePermissionsReadable : 0u) | + ((header->p_flags & llvm::ELF::PF_W) ? lldb::ePermissionsWritable : 0u) | + ((header->p_flags & llvm::ELF::PF_X) ? lldb::ePermissionsExecutable : 0u); m_core_range_infos.Append( VMRangeToPermissions::Entry(addr, header->p_memsz, permissions)); Index: source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp === --- source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ source/Plugins/ObjectFile/Mach-O
Re: [Lldb-commits] [PATCH] D24331: Fix about a dozen compile warnings
ki.stfu updated this revision to Diff 70976. ki.stfu added a comment. Apply clang-format https://reviews.llvm.org/D24331 Files: source/Core/Log.cpp source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp source/Plugins/Process/elf-core/ProcessElfCore.cpp source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp source/Plugins/Process/minidump/MinidumpParser.cpp source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp source/Target/StackFrame.cpp Index: source/Target/StackFrame.cpp === --- source/Target/StackFrame.cpp +++ source/Target/StackFrame.cpp @@ -1278,6 +1278,8 @@ return std::make_pair(nullptr, 0); } } + default: +return std::make_pair(nullptr, 0); } } @@ -1291,7 +1293,7 @@ } return std::make_pair(nullptr, 0); } -}; +} lldb::ValueObjectSP StackFrame::GuessValueForAddress(lldb::addr_t addr) { TargetSP target_sp = CalculateTarget(); @@ -1420,7 +1422,7 @@ Error error; ValueObjectSP pointee = base->Dereference(error); - if (offset >= pointee->GetByteSize()) { + if (offset >= 0 && uint64_t(offset) >= pointee->GetByteSize()) { int64_t index = offset / pointee->GetByteSize(); offset = offset % pointee->GetByteSize(); const bool can_create = true; @@ -1586,17 +1588,16 @@ continue; } -Instruction::Operand *register_operand = nullptr; Instruction::Operand *origin_operand = nullptr; if (operands[0].m_type == Instruction::Operand::Type::Register && operands[0].m_clobbered == true && operands[0].m_register == reg) { - register_operand = &operands[0]; + // operands[0] is a register operand origin_operand = &operands[1]; } else if (operands[1].m_type == Instruction::Operand::Type::Register && operands[1].m_clobbered == true && operands[1].m_register == reg) { - register_operand = &operands[1]; origin_operand = &operands[0]; + // operands[1] is a register operand } else { continue; } Index: source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp === --- source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp +++ source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp @@ -518,7 +518,7 @@ // 0x. If we use the unsigned long long // it will work as expected. const uint64_t uval = PyLong_AsUnsignedLongLong(m_py_obj); - result = *((int64_t *)&uval); + result = static_cast(uval); } return result; } Index: source/Plugins/Process/minidump/MinidumpParser.cpp === --- source/Plugins/Process/minidump/MinidumpParser.cpp +++ source/Plugins/Process/minidump/MinidumpParser.cpp @@ -138,6 +138,8 @@ case MinidumpCPUArchitecture::ARM64: arch_spec.GetTriple().setArch(llvm::Triple::ArchType::aarch64); break; + default: +break; } return arch_spec; Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp === --- source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -3653,7 +3653,7 @@ error.SetErrorStringWithFormat("configuring StructuredData feature %s " "failed when sending packet: " "PacketResult=%d", - type_name.AsCString(), result); + type_name.AsCString(), (int)result); } return error; } Index: source/Plugins/Process/elf-core/ProcessElfCore.cpp === --- source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -139,9 +139,9 @@ // Keep a separate map of permissions that that isn't coalesced so all ranges // are maintained. const uint32_t permissions = - ((header->p_flags & llvm::ELF::PF_R) ? lldb::ePermissionsReadable : 0) | - ((header->p_flags & llvm::ELF::PF_W) ? lldb::ePermissionsWritable : 0) | - ((header->p_flags & llvm::ELF::PF_X) ? lldb::ePermissionsExecutable : 0); + ((header->p_flags & llvm::ELF::PF_R) ? lldb::ePermissionsReadable : 0u) | + ((header->p_flags & llvm::ELF::PF_W) ? lldb::ePermissionsWritable : 0u) | + ((header->p_flags & llvm::ELF::PF_X) ? lldb::ePermissionsExecutable : 0u); m_core_range_infos.Append( VMRangeToPermissions::Entry(addr, header->p_memsz, permissions)); Index: source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp === --- source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ source/Plugins/ObjectFile/Mach-O
[Lldb-commits] [lldb] r281191 - Fix about a dozen compile warnings
Author: ki.stfu Date: Mon Sep 12 00:25:33 2016 New Revision: 281191 URL: http://llvm.org/viewvc/llvm-project?rev=281191&view=rev Log: Fix about a dozen compile warnings Summary: It fixes the following compile warnings: 1. '0' flag ignored with precision and ‘%d’ gnu_printf format 2. enumeral and non-enumeral type in conditional expression 3. format ‘%d’ expects argument of type ‘int’, but argument 4 has type ... 4. enumeration value ‘...’ not handled in switch 5. cast from type ‘const uint64_t* {aka ...}’ to type ‘int64_t* {aka ...}’ casts away qualifiers 6. extra ‘;’ 7. comparison between signed and unsigned integer expressions 8. variable ‘register_operand’ set but not used 9. control reaches end of non-void function Reviewers: jingham, emaste, zturner, clayborg Subscribers: lldb-commits Differential Revision: https://reviews.llvm.org/D24331 Modified: lldb/trunk/source/Core/Log.cpp lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp lldb/trunk/source/Target/StackFrame.cpp Modified: lldb/trunk/source/Core/Log.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Log.cpp?rev=281191&r1=281190&r2=281191&view=diff == --- lldb/trunk/source/Core/Log.cpp (original) +++ lldb/trunk/source/Core/Log.cpp Mon Sep 12 00:25:33 2016 @@ -82,7 +82,7 @@ void Log::VAPrintf(const char *format, v // Timestamp if requested if (m_options.Test(LLDB_LOG_OPTION_PREPEND_TIMESTAMP)) { TimeValue now = TimeValue::Now(); - header.Printf("%9d.%09.9d ", now.seconds(), now.nanoseconds()); + header.Printf("%9d.%9.9d ", now.seconds(), now.nanoseconds()); } // Add the process and thread if requested Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp?rev=281191&r1=281190&r2=281191&view=diff == --- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original) +++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Mon Sep 12 00:25:33 2016 @@ -1938,9 +1938,9 @@ void ObjectFileELF::CreateSections(Secti sect_type = eSectionTypeGoSymtab; const uint32_t permissions = - ((header.sh_flags & SHF_ALLOC) ? ePermissionsReadable : 0) | - ((header.sh_flags & SHF_WRITE) ? ePermissionsWritable : 0) | - ((header.sh_flags & SHF_EXECINSTR) ? ePermissionsExecutable : 0); + ((header.sh_flags & SHF_ALLOC) ? ePermissionsReadable : 0u) | + ((header.sh_flags & SHF_WRITE) ? ePermissionsWritable : 0u) | + ((header.sh_flags & SHF_EXECINSTR) ? ePermissionsExecutable : 0u); switch (header.sh_type) { case SHT_SYMTAB: assert(sect_type == eSectionTypeOther); Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=281191&r1=281190&r2=281191&view=diff == --- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original) +++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Mon Sep 12 00:25:33 2016 @@ -1458,13 +1458,13 @@ void ObjectFileMachO::CreateSections(Sec } } if (m_data.GetU32(&offset, &load_cmd.maxprot, 4)) { -const uint32_t segment_permissions = -((load_cmd.initprot & VM_PROT_READ) ? ePermissionsReadable -: 0) | -((load_cmd.initprot & VM_PROT_WRITE) ? ePermissionsWritable - : 0) | -((load_cmd.initprot & VM_PROT_EXECUTE) ? ePermissionsExecutable - : 0); +uint32_t segment_permissions = 0; +if (load_cmd.initprot & VM_PROT_READ) + segment_permissions |= ePermissionsReadable; +if (load_cmd.initprot & VM_PROT_WRITE) + segment_permissions |= ePermissionsWritable; +if (load_cmd.initprot & VM_PROT_EXECUTE) + segment_permissions |= ePermissionsExecutable; const bool segment_is_encrypted = (load_cmd.flags & SG_PROTECTED_VERSION_1) != 0; @@ -2621,8 +2621,7 @@ size_t ObjectFileMachO::ParseSymtab() { "/System/Library/Caches/com.apple.dyld/", /* IPHONE_DYLD_SHARED_CACHE_DI
Re: [Lldb-commits] [PATCH] D23883: Remove MIUtilParse (no longer used)
ki.stfu requested changes to this revision. ki.stfu added a reviewer: ki.stfu. ki.stfu added a comment. This revision now requires changes to proceed. You forgot to remove its header file https://reviews.llvm.org/D23883 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D23026: [LLDB-MI] removing requirement of a parameter for -break-insert's -f flag
ki.stfu requested changes to this revision. ki.stfu added a comment. This revision now requires changes to proceed. Hi @pieandcakes! I'm sorry for the delay, have a lot of work. Please folllow my inline comments, rebase against ToT and update CL's summary. Comment at: tools/lldb-mi/MICmdCmdBreak.cpp:156-163 @@ -156,8 +155,10 @@ m_bBrkPtIsPending = pArgPendingBrkPt->GetFound(); if (pArgLocation->GetFound()) m_brkName = pArgLocation->GetValue(); -else if (m_bBrkPtIsPending) +else { -pArgPendingBrkPt->GetExpectedOption(m_brkName); +SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_BAD_LOCATION), m_cmdData.strMiCmd.c_str())); +return MIstatus::failure; } + if (pArgIgnoreCnt->GetFound()) I think we can remove these lines and make pArgLocation mandatory. For this, please specify it during registration of m_constStrArgNamedLocation in CMICmdCmdBreakInsert::ParseArgs, and then replaces the highlighted lines with: ``` m_brkName = pArgLocation->GetValue(); ``` Comment at: tools/lldb-mi/MICmnResources.cpp:222 @@ -221,2 +221,3 @@ {IDS_CMD_ERR_BRKPT_CNT_EXCEEDED, "Command '%s'. Number of valid breakpoint exceeded %d. Cannot create new breakpoint '%s'"}, +{IDS_CMD_ERR_BRKPT_BAD_LOCATION, "Command '%s'. Unable to parse breakpoint location."}, {IDS_CMD_ERR_SOME_ERROR, "Command '%s'. Error: %s"}, revert this Comment at: tools/lldb-mi/MICmnResources.h:239 @@ -238,2 +238,3 @@ IDS_CMD_ERR_BRKPT_CNT_EXCEEDED, +IDS_CMD_ERR_BRKPT_BAD_LOCATION, IDS_CMD_ERR_SOME_ERROR, revert this Repository: rL LLVM https://reviews.llvm.org/D23026 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D23026: [LLDB-MI] removing requirement of a parameter for -break-insert's -f flag
ki.stfu added a comment. PS: I think it will look like: Index: tools/lldb-mi/MICmdCmdBreak.cpp === --- tools/lldb-mi/MICmdCmdBreak.cpp (revision 281191) +++ tools/lldb-mi/MICmdCmdBreak.cpp (working copy) @@ -84,8 +84,7 @@ // Not implemented m_setCmdArgs.Add(new CMICmdArgValOptionShort( // m_constStrArgNamedHWBrkPt, false, false)); m_setCmdArgs.Add(new CMICmdArgValOptionShort( - m_constStrArgNamedPendinfBrkPt, false, true, - CMICmdArgValListBase::eArgValType_StringQuotedNumberPath, 1)); + m_constStrArgNamedPendinfBrkPt, false, true)); m_setCmdArgs.Add(new CMICmdArgValOptionShort(m_constStrArgNamedDisableBrkPt, false, false)); // Not implemented m_setCmdArgs.Add(new CMICmdArgValOptionShort( @@ -99,7 +98,7 @@ m_setCmdArgs.Add(new CMICmdArgValOptionShort( m_constStrArgNamedRestrictBrkPtToThreadId, false, true, CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgNamedLocation, false, + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgNamedLocation, true, true, false, false, true)); return ParseValidateCmdOptions(); } @@ -158,12 +157,7 @@ m_strArgOptionThreadGrp = CMIUtilString::Format("i%d", nThreadGrp); } m_bBrkPtIsPending = pArgPendingBrkPt->GetFound(); - if (pArgLocation->GetFound()) -m_brkName = pArgLocation->GetValue(); - else if (m_bBrkPtIsPending) { -pArgPendingBrkPt->GetExpectedOption( -m_brkName); - } + m_brkName = pArgLocation->GetValue(); if (pArgIgnoreCnt->GetFound()) { pArgIgnoreCnt->GetExpectedOption( m_nBrkPtIgnoreCount); Repository: rL LLVM https://reviews.llvm.org/D23026 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D24202: [lldb-mi] Fix parsing expressions to evaluate with spaces and optional args
ki.stfu accepted this revision. ki.stfu added a comment. This revision is now accepted and ready to land. lgtm @edmunoz, good job. Thank you! Would you like me to commit? Repository: rL LLVM https://reviews.llvm.org/D24202 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D9740: Add MiSyntaxTestCase.test_lldbmi_output_grammar test (MI)
ki.stfu updated this revision to Diff 70977. ki.stfu added a comment. Herald added a subscriber: ki.stfu. Rebase against ToT https://reviews.llvm.org/D9740 Files: packages/Python/lldbsuite/test/tools/lldb-mi/syntax/TestMiSyntax.py tools/lldb-mi/MIDriver.cpp Index: tools/lldb-mi/MIDriver.cpp === --- tools/lldb-mi/MIDriver.cpp +++ tools/lldb-mi/MIDriver.cpp @@ -602,9 +602,6 @@ // Close and wait for the workers to stop StopWorkerThreads(); - // Ensure that a new line is sent as the last act of the dying driver - m_rStdOut.WriteMIResponse("\n", false); - return MIstatus::success; } Index: packages/Python/lldbsuite/test/tools/lldb-mi/syntax/TestMiSyntax.py === --- packages/Python/lldbsuite/test/tools/lldb-mi/syntax/TestMiSyntax.py +++ packages/Python/lldbsuite/test/tools/lldb-mi/syntax/TestMiSyntax.py @@ -84,3 +84,79 @@ # Test that a process output is wrapped correctly self.expect("\@\"'rn\"") self.expect("\@\"` - it's nx12\"\"") + +@skipIfWindows # llvm.org/pr24452: Get lldb-mi tests working on Windows +@skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races +def test_lldbmi_output_grammar(self): +"""Test that 'lldb-mi --interpreter' uses standard output syntax.""" + +self.spawnLldbMi(args = None) +self.child.setecho(False) + +# Run all commands simultaneously +self.runCmd("-unknown-command") +self.runCmd("-file-exec-and-symbols %s" % self.myexe) +self.runCmd("-break-insert -f main") +self.runCmd("-gdb-set target-async off") +self.runCmd("-exec-run") +self.runCmd("-gdb-set target-async on") +self.runCmd("-exec-continue") +self.runCmd("-gdb-exit") + +# Test that the program's output matches to the following pattern: +# ( async-record | stream-record )* [ result-record ] "(gdb)" nl +async_record = "^[0-9]*(\*|\+|=).+?\n" # 1 +stream_record = "^(~|@|&).+?\n" # 2 +result_record = "^[0-9]*\^.+?\n"# 3 +prompt= "^\(gdb\)\r\n" # 4 +command = "^\r\n" # 5 (it looks like empty line for pexpect) +error = "^.+?\n"# 6 +import pexpect # 7 (EOF) +all_patterns = [ async_record, stream_record, result_record, prompt, command, error, pexpect.EOF ] +def get_bit(pattern): return all_patterns.index(pattern) +def get_mask(pattern): return 1 << get_bit(pattern) +def or_op(x, y): return x | y +def get_state(*args): return reduce(or_op, map(get_mask, args)) + +next_state = get_state(command) +while True: +it = self.expect(all_patterns) +matched_pattern = all_patterns[it] + +# Check that state is acceptable +if not (next_state & get_mask(matched_pattern)): +self.fail("error: inconsistent pattern '%s' for state %#x (matched string: %s)" % (repr(matched_pattern), next_state, self.child.after)) +elif matched_pattern == async_record or matched_pattern == stream_record: +next_state = get_state(async_record, stream_record, result_record, prompt) +elif matched_pattern == result_record: +# FIXME lldb-mi prints the async-record out of turn +# ``` +# ^done +# (gdb) +# ^running +# =thread-group-started,id="i1",pid="13875" +# (gdb) +# ``` +# Therefore to pass that test I changed the grammar's rule: +# next_state = get_state(prompt) +# to: +next_state = get_state(async_record, prompt) +elif matched_pattern == prompt: +# FIXME lldb-mi prints the prompt out of turn +# ``` +# ^done +# (gdb) +# ^running +# (gdb) +# (gdb) +# ``` +# Therefore to pass that test I changed the grammar's rule: +# next_state = get_state(async_record, stream_record, result_record, command, pexpect.EOF) +# to: +next_state = get_state(async_record, stream_record, result_record, prompt, command, pexpect.EOF) +elif matched_pattern == command: +next_state = get_state(async_record, stream_record, result_record) +elif matched_pattern == pexpect.EOF: +break +else: +self.fail("error: pexpect returned an unknown state") Index: tools/lldb-mi/MIDriver.cpp =