Re: [Lldb-commits] [PATCH] D23883: Remove MIUtilParse (no longer used)

2016-09-11 Thread Kamil Rytarowski via lldb-commits
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

2016-09-11 Thread Ilia K via lldb-commits
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

2016-09-11 Thread Ilia K via lldb-commits
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

2016-09-11 Thread Ilia K via lldb-commits
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)

2016-09-11 Thread Ilia K via lldb-commits
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

2016-09-11 Thread Ilia K via lldb-commits
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

2016-09-11 Thread Ilia K via lldb-commits
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

2016-09-11 Thread Ilia K via lldb-commits
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)

2016-09-11 Thread Ilia K via lldb-commits
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
=